[SCSI] qla2xxx: Perform FCoE context reset before trying adapter reset for ISP82xx.
authorGiridhar Malavali <giridhar.malavali@qlogic.com>
Wed, 30 Mar 2011 18:46:26 +0000 (11:46 -0700)
committerJames Bottomley <James.Bottomley@suse.de>
Sun, 1 May 2011 15:10:23 +0000 (10:10 -0500)
For certain failures, try to recover first by doing FCoE context reset before
attempting big hammer approach(adpater reset).

Signed-off-by: Giridhar Malavali <giridhar.malavali@qlogic.com>
Signed-off-by: Madhuranath Iyengar <Madhu.Iyengar@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@suse.de>
drivers/scsi/qla2xxx/qla_isr.c
drivers/scsi/qla2xxx/qla_os.c

index b614c8d..9c0f0e3 100644 (file)
@@ -843,7 +843,10 @@ qla2x00_process_completed_request(struct scsi_qla_host *vha,
                qla_printk(KERN_WARNING, ha,
                    "Invalid SCSI completion handle %d.\n", index);
 
-               set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
+               if (IS_QLA82XX(ha))
+                       set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
+               else
+                       set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
                return;
        }
 
@@ -861,7 +864,10 @@ qla2x00_process_completed_request(struct scsi_qla_host *vha,
                qla_printk(KERN_WARNING, ha,
                    "Invalid ISP SCSI completion handle\n");
 
-               set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
+               if (IS_QLA82XX(ha))
+                       set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
+               else
+                       set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
        }
 }
 
@@ -878,7 +884,10 @@ qla2x00_get_sp_from_handle(scsi_qla_host_t *vha, const char *func,
        if (index >= MAX_OUTSTANDING_COMMANDS) {
                qla_printk(KERN_WARNING, ha,
                    "%s: Invalid completion handle (%x).\n", func, index);
-               set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
+               if (IS_QLA82XX(ha))
+                       set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
+               else
+                       set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
                goto done;
        }
        sp = req->outstanding_cmds[index];
@@ -1564,7 +1573,10 @@ qla2x00_status_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, void *pkt)
                    "scsi(%ld): Invalid status handle (0x%x).\n", vha->host_no,
                    sts->handle);
 
-               set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
+               if (IS_QLA82XX(ha))
+                       set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
+               else
+                       set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
                qla2xxx_wake_dpc(vha);
                return;
        }
@@ -1909,13 +1921,17 @@ qla2x00_error_entry(scsi_qla_host_t *vha, struct rsp_que *rsp, sts_entry_t *pkt)
                qla2x00_sp_compl(ha, sp);
 
        } else if (pkt->entry_type == COMMAND_A64_TYPE || pkt->entry_type ==
-           COMMAND_TYPE || pkt->entry_type == COMMAND_TYPE_7) {
+               COMMAND_TYPE || pkt->entry_type == COMMAND_TYPE_7
+               || pkt->entry_type == COMMAND_TYPE_6) {
                DEBUG2(printk("scsi(%ld): Error entry - invalid handle\n",
-                   vha->host_no));
+                       vha->host_no));
                qla_printk(KERN_WARNING, ha,
-                   "Error entry - invalid handle\n");
+                       "Error entry - invalid handle\n");
 
-               set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
+               if (IS_QLA82XX(ha))
+                       set_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags);
+               else
+                       set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
                qla2xxx_wake_dpc(vha);
        }
 }
index f040a2a..2f039e0 100644 (file)
@@ -3612,7 +3612,8 @@ qla2x00_timer(scsi_qla_host_t *vha)
 
        /* Loop down handler. */
        if (atomic_read(&vha->loop_down_timer) > 0 &&
-           !(test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags))
+           !(test_bit(ABORT_ISP_ACTIVE, &vha->dpc_flags)) &&
+           !(test_bit(FCOE_CTX_RESET_NEEDED, &vha->dpc_flags))
                && vha->flags.online) {
 
                if (atomic_read(&vha->loop_down_timer) ==
@@ -3648,7 +3649,11 @@ qla2x00_timer(scsi_qla_host_t *vha)
                                        if (!(sfcp->flags & FCF_FCP2_DEVICE))
                                                continue;
 
-                                       set_bit(ISP_ABORT_NEEDED,
+                                       if (IS_QLA82XX(ha))
+                                               set_bit(FCOE_CTX_RESET_NEEDED,
+                                                       &vha->dpc_flags);
+                                       else
+                                               set_bit(ISP_ABORT_NEEDED,
                                                        &vha->dpc_flags);
                                        break;
                                }
@@ -3667,7 +3672,12 @@ qla2x00_timer(scsi_qla_host_t *vha)
                                qla_printk(KERN_WARNING, ha,
                                    "Loop down - aborting ISP.\n");
 
-                               set_bit(ISP_ABORT_NEEDED, &vha->dpc_flags);
+                               if (IS_QLA82XX(ha))
+                                       set_bit(FCOE_CTX_RESET_NEEDED,
+                                               &vha->dpc_flags);
+                               else
+                                       set_bit(ISP_ABORT_NEEDED,
+                                               &vha->dpc_flags);
                        }
                }
                DEBUG3(printk("scsi(%ld): Loop Down - seconds remaining %d\n",