[SCSI] qla2xxx: Don't consider the drivers knocked out of IDC participation for futur...
authorSaurav Kashyap <saurav.kashyap@qlogic.com>
Wed, 30 Oct 2013 07:38:13 +0000 (03:38 -0400)
committerJames Bottomley <JBottomley@Parallels.com>
Thu, 19 Dec 2013 15:38:57 +0000 (07:38 -0800)
Signed-off-by: Giridhar Malavali <giridhar.malavali@qlogic.com>
Signed-off-by: Saurav Kashyap <saurav.kashyap@qlogic.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
drivers/scsi/qla2xxx/qla_nx2.c

index 8164cc9..6f509f8 100644 (file)
@@ -1555,6 +1555,15 @@ qla8044_need_reset_handler(struct scsi_qla_host *vha)
                qla8044_idc_lock(ha);
        }
 
+       drv_state = qla8044_rd_direct(vha,
+           QLA8044_CRB_DRV_STATE_INDEX);
+       drv_active = qla8044_rd_direct(vha,
+           QLA8044_CRB_DRV_ACTIVE_INDEX);
+
+       ql_log(ql_log_info, vha, 0xb0c5,
+           "%s(%ld): drv_state = 0x%x, drv_active = 0x%x\n",
+           __func__, vha->host_no, drv_state, drv_active);
+
        if (!ha->flags.nic_core_reset_owner) {
                ql_dbg(ql_dbg_p3p, vha, 0xb0c3,
                    "%s(%ld): reset acknowledged\n",
@@ -1580,23 +1589,15 @@ qla8044_need_reset_handler(struct scsi_qla_host *vha)
 
                        dev_state = qla8044_rd_direct(vha,
                                        QLA8044_CRB_DEV_STATE_INDEX);
-               } while (dev_state == QLA8XXX_DEV_NEED_RESET);
+               } while (((drv_state & drv_active) != drv_active) &&
+                   (dev_state == QLA8XXX_DEV_NEED_RESET));
        } else {
                qla8044_set_rst_ready(vha);
 
                /* wait for 10 seconds for reset ack from all functions */
                reset_timeout = jiffies + (ha->fcoe_reset_timeout * HZ);
 
-               drv_state = qla8044_rd_direct(vha,
-                   QLA8044_CRB_DRV_STATE_INDEX);
-               drv_active = qla8044_rd_direct(vha,
-                   QLA8044_CRB_DRV_ACTIVE_INDEX);
-
-               ql_log(ql_log_info, vha, 0xb0c5,
-                   "%s(%ld): drv_state = 0x%x, drv_active = 0x%x\n",
-                   __func__, vha->host_no, drv_state, drv_active);
-
-               while (drv_state != drv_active) {
+               while ((drv_state & drv_active) != drv_active) {
                        if (time_after_eq(jiffies, reset_timeout)) {
                                ql_log(ql_log_info, vha, 0xb0c6,
                                    "%s: RESET TIMEOUT!"