ha->fw_options[2] &= ~BIT_11;
        }
 
+       if (IS_QLA25XX(ha) || IS_QLA83XX(ha) || IS_QLA27XX(ha)) {
+               /*
+                * Tell FW to track each exchange to prevent
+                * driver from using stale exchange.
+                */
+               if (qla_tgt_mode_enabled(vha) ||
+                   qla_dual_mode_enabled(vha))
+                       ha->fw_options[2] |= BIT_4;
+               else
+                       ha->fw_options[2] &= ~BIT_4;
+       }
+
        ql_dbg(ql_dbg_init, vha, 0x00e8,
            "%s, add FW options 1-3 = 0x%04x 0x%04x 0x%04x mode %x\n",
            __func__, ha->fw_options[1], ha->fw_options[2],
                        ha->fw_options[2] &= ~BIT_11;
        }
 
+       if (qla_tgt_mode_enabled(vha) ||
+           qla_dual_mode_enabled(vha))
+               ha->fw_options[2] |= BIT_4;
+       else
+               ha->fw_options[2] &= ~BIT_4;
+
        if (ql2xetsenable) {
                /* Enable ETS Burst. */
                memset(ha->fw_options, 0, sizeof(ha->fw_options));
 
        ctio->initiator_id[1] = atio->u.isp24.fcp_hdr.s_id[1];
        ctio->initiator_id[2] = atio->u.isp24.fcp_hdr.s_id[0];
        ctio->exchange_addr = atio->u.isp24.exchange_addr;
-       ctio->u.status1.flags = (atio->u.isp24.attr << 9) |
-           cpu_to_le16(CTIO7_FLAGS_STATUS_MODE_1 | CTIO7_FLAGS_SEND_STATUS);
+       temp = (atio->u.isp24.attr << 9)|
+               CTIO7_FLAGS_STATUS_MODE_1 | CTIO7_FLAGS_SEND_STATUS;
+       ctio->u.status1.flags = cpu_to_le16(temp);
        temp = be16_to_cpu(atio->u.isp24.fcp_hdr.ox_id);
        ctio->u.status1.ox_id = cpu_to_le16(temp);
        ctio->u.status1.scsi_status =
        ctio->initiator_id[1] = atio->u.isp24.fcp_hdr.s_id[1];
        ctio->initiator_id[2] = atio->u.isp24.fcp_hdr.s_id[0];
        ctio->exchange_addr = atio->u.isp24.exchange_addr;
-       ctio->u.status1.flags = (atio->u.isp24.attr << 9) |
-           cpu_to_le16(CTIO7_FLAGS_STATUS_MODE_1 | CTIO7_FLAGS_SEND_STATUS);
+       temp = (atio->u.isp24.attr << 9) |
+           CTIO7_FLAGS_STATUS_MODE_1 | CTIO7_FLAGS_SEND_STATUS;
+       ctio->u.status1.flags = cpu_to_le16(temp);
        temp = be16_to_cpu(atio->u.isp24.fcp_hdr.ox_id);
        ctio->u.status1.ox_id = cpu_to_le16(temp);
        ctio->u.status1.scsi_status =
        pkt->initiator_id[1] = atio->u.isp24.fcp_hdr.s_id[1];
        pkt->initiator_id[2] = atio->u.isp24.fcp_hdr.s_id[0];
        pkt->exchange_addr = atio->u.isp24.exchange_addr;
-       pkt->u.status0.flags |= (atio->u.isp24.attr << 9);
+       temp = atio->u.isp24.attr << 9;
+       pkt->u.status0.flags |= cpu_to_le16(temp);
        temp = be16_to_cpu(atio->u.isp24.fcp_hdr.ox_id);
        pkt->u.status0.ox_id = cpu_to_le16(temp);
        pkt->u.status0.relative_offset = cpu_to_le32(prm->cmd->offset);
        ctio24->initiator_id[1] = atio->u.isp24.fcp_hdr.s_id[1];
        ctio24->initiator_id[2] = atio->u.isp24.fcp_hdr.s_id[0];
        ctio24->exchange_addr = atio->u.isp24.exchange_addr;
-       ctio24->u.status1.flags = (atio->u.isp24.attr << 9) |
-           cpu_to_le16(CTIO7_FLAGS_STATUS_MODE_1 |
-               CTIO7_FLAGS_TERMINATE);
+       temp = (atio->u.isp24.attr << 9) | CTIO7_FLAGS_STATUS_MODE_1 |
+               CTIO7_FLAGS_TERMINATE;
+       ctio24->u.status1.flags = cpu_to_le16(temp);
        temp = be16_to_cpu(atio->u.isp24.fcp_hdr.ox_id);
        ctio24->u.status1.ox_id = cpu_to_le16(temp);
 
        request_t *pkt;
        struct fc_port *sess = NULL;
        unsigned long flags;
+       u16 temp;
 
        spin_lock_irqsave(&ha->tgt.sess_lock, flags);
        sess = ha->tgt.tgt_ops->find_sess_by_s_id(vha,
        ctio24->initiator_id[1] = atio->u.isp24.fcp_hdr.s_id[1];
        ctio24->initiator_id[2] = atio->u.isp24.fcp_hdr.s_id[0];
        ctio24->exchange_addr = atio->u.isp24.exchange_addr;
-       ctio24->u.status1.flags = (atio->u.isp24.attr << 9) |
-           cpu_to_le16(
+       temp = (atio->u.isp24.attr << 9) |
                CTIO7_FLAGS_STATUS_MODE_1 | CTIO7_FLAGS_SEND_STATUS |
-               CTIO7_FLAGS_DONT_RET_CTIO);
+               CTIO7_FLAGS_DONT_RET_CTIO;
+       ctio24->u.status1.flags = cpu_to_le16(temp);
        /*
         * CTIO from fw w/o se_cmd doesn't provide enough info to retry it,
         * if the explicit conformation is used.