]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
qla2xxx: Add check in qla82xx_watchdog for failed hardware state.
authorChad Dupuis <chad.dupuis@qlogic.com>
Thu, 19 Jul 2012 09:10:53 +0000 (14:40 +0530)
committerMaxim Uvarov <maxim.uvarov@oracle.com>
Mon, 23 Jul 2012 08:02:44 +0000 (01:02 -0700)
JIRA Key: V2632FC-117

Signed-off-by: Saurav Kashyap <saurav.kashyap@qlogic.com>
drivers/scsi/qla2xxx/qla_dbg.c
drivers/scsi/qla2xxx/qla_nx.c

index 3647f0162ec18311f93228613c7c13df3c0d83f2..ef553fcbdbbf4e73790e321d2029ea0778eaa85a 100644 (file)
@@ -28,7 +28,7 @@
  * |                             |                    | 0x800b,0x8039 |
  * | AER/EEH                      |       0x9011       |               |
  * | Virtual Port                 |       0xa008       |              |
- * | ISP82XX Specific             |       0xb054       | 0xb024         |
+ * | ISP82XX Specific             |       0xb055       | 0xb024         |
  * | MultiQ                       |       0xc00c       |              |
  * | Misc                         |       0xd010       |              |
  * ----------------------------------------------------------------------
index fc109a1a37c94369e44715402c3cb16bd67db25c..0a5a1c1bcf5f56cd25c6b924482bfb1256f3e50f 100644 (file)
@@ -3027,7 +3027,6 @@ qla82xx_dev_failed_handler(scsi_qla_host_t *vha)
        ql_log(ql_log_fatal, vha, 0x00b8,
            "Disabling the board.\n");
 
-       qla82xx_idc_lock(ha);
        qla82xx_clear_drv_active(ha);
        qla82xx_idc_unlock(ha);
 
@@ -3267,7 +3266,7 @@ qla82xx_device_state_handler(scsi_qla_host_t *vha)
                switch (dev_state) {
                case QLA82XX_DEV_READY:
                        ha->flags.isp82xx_reset_owner = 0;
-                       goto exit;
+                       goto rel_lock;
                case QLA82XX_DEV_COLD:
                        rval = qla82xx_device_bootstrap(vha);
                        break;
@@ -3298,7 +3297,7 @@ qla82xx_device_state_handler(scsi_qla_host_t *vha)
                         * to get changed
                         */
                        if (ha->flags.quiesce_owner)
-                               goto exit;
+                               goto rel_lock;
 
                        qla82xx_idc_unlock(ha);
                        msleep(1000);
@@ -3319,8 +3318,9 @@ qla82xx_device_state_handler(scsi_qla_host_t *vha)
                }
                loopcount++;
        }
-exit:
+rel_lock:
        qla82xx_idc_unlock(ha);
+exit:
        return rval;
 }
 
@@ -3383,6 +3383,14 @@ void qla82xx_watchdog(scsi_qla_host_t *vha)
                        ql_log(ql_log_warn, vha, 0x6002,
                            "Quiescent needed.\n");
                        set_bit(ISP_QUIESCE_NEEDED, &vha->dpc_flags);
+               } else if (dev_state == QLA82XX_DEV_FAILED &&
+                       !test_bit(ISP_UNRECOVERABLE, &vha->dpc_flags) &&
+                       vha->flags.online == 1) {
+                       ql_log(ql_log_warn, vha, 0xb055,
+                           "Adapter state is failed. Offlining.\n");
+                       set_bit(ISP_UNRECOVERABLE, &vha->dpc_flags);
+                       ha->flags.isp82xx_fw_hung = 1;
+                       qla82xx_clear_pending_mbx(vha);
                } else {
                        if (qla82xx_check_fw_alive(vha)) {
                                ql_dbg(ql_dbg_timer, vha, 0x6011,