[SCSI] qla2xxx: Add check in qla82xx_watchdog for failed hardware state.

Signed-off-by: Giridhar Malavali <giridhar.malavali@qlogic.com>
Signed-off-by: Chad Dupuis <chad.dupuis@qlogic.com>
Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
Chad Dupuis 2012-08-22 14:20:57 -04:00 committed by James Bottomley
parent 9ebb5d9c69
commit 7916bb90e2
2 changed files with 13 additions and 5 deletions

View file

@ -30,7 +30,7 @@
* | | | 0x800b,0x8039 | * | | | 0x800b,0x8039 |
* | AER/EEH | 0x9011 | | * | AER/EEH | 0x9011 | |
* | Virtual Port | 0xa007 | | * | Virtual Port | 0xa007 | |
* | ISP82XX Specific | 0xb054 | 0xb024 | * | ISP82XX Specific | 0xb055 | 0xb024 |
* | MultiQ | 0xc00c | | * | MultiQ | 0xc00c | |
* | Misc | 0xd010 | | * | Misc | 0xd010 | |
* | Target Mode | 0xe06f | | * | Target Mode | 0xe06f | |

View file

@ -3027,7 +3027,6 @@ qla82xx_dev_failed_handler(scsi_qla_host_t *vha)
ql_log(ql_log_fatal, vha, 0x00b8, ql_log(ql_log_fatal, vha, 0x00b8,
"Disabling the board.\n"); "Disabling the board.\n");
qla82xx_idc_lock(ha);
qla82xx_clear_drv_active(ha); qla82xx_clear_drv_active(ha);
qla82xx_idc_unlock(ha); qla82xx_idc_unlock(ha);
@ -3267,7 +3266,7 @@ qla82xx_device_state_handler(scsi_qla_host_t *vha)
switch (dev_state) { switch (dev_state) {
case QLA82XX_DEV_READY: case QLA82XX_DEV_READY:
ha->flags.isp82xx_reset_owner = 0; ha->flags.isp82xx_reset_owner = 0;
goto exit; goto rel_lock;
case QLA82XX_DEV_COLD: case QLA82XX_DEV_COLD:
rval = qla82xx_device_bootstrap(vha); rval = qla82xx_device_bootstrap(vha);
break; break;
@ -3298,7 +3297,7 @@ qla82xx_device_state_handler(scsi_qla_host_t *vha)
* to get changed * to get changed
*/ */
if (ha->flags.quiesce_owner) if (ha->flags.quiesce_owner)
goto exit; goto rel_lock;
qla82xx_idc_unlock(ha); qla82xx_idc_unlock(ha);
msleep(1000); msleep(1000);
@ -3319,8 +3318,9 @@ qla82xx_device_state_handler(scsi_qla_host_t *vha)
} }
loopcount++; loopcount++;
} }
exit: rel_lock:
qla82xx_idc_unlock(ha); qla82xx_idc_unlock(ha);
exit:
return rval; return rval;
} }
@ -3384,6 +3384,14 @@ void qla82xx_watchdog(scsi_qla_host_t *vha)
ql_log(ql_log_warn, vha, 0x6002, ql_log(ql_log_warn, vha, 0x6002,
"Quiescent needed.\n"); "Quiescent needed.\n");
set_bit(ISP_QUIESCE_NEEDED, &vha->dpc_flags); 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 { } else {
if (qla82xx_check_fw_alive(vha)) { if (qla82xx_check_fw_alive(vha)) {
ql_dbg(ql_dbg_timer, vha, 0x6011, ql_dbg(ql_dbg_timer, vha, 0x6011,