|
@@ -3817,6 +3817,19 @@ exit:
|
|
|
return rval;
|
|
|
}
|
|
|
|
|
|
+void qla82xx_clear_pending_mbx(scsi_qla_host_t *vha)
|
|
|
+{
|
|
|
+ struct qla_hw_data *ha = vha->hw;
|
|
|
+
|
|
|
+ if (ha->flags.mbox_busy) {
|
|
|
+ ha->flags.mbox_int = 1;
|
|
|
+ ql_log(ql_log_warn, vha, 0x6010,
|
|
|
+ "Doing premature completion of mbx command.\n");
|
|
|
+ if (test_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags))
|
|
|
+ complete(&ha->mbx_intr_comp);
|
|
|
+ }
|
|
|
+}
|
|
|
+
|
|
|
void qla82xx_watchdog(scsi_qla_host_t *vha)
|
|
|
{
|
|
|
uint32_t dev_state, halt_status;
|
|
@@ -3874,16 +3887,8 @@ void qla82xx_watchdog(scsi_qla_host_t *vha)
|
|
|
}
|
|
|
qla2xxx_wake_dpc(vha);
|
|
|
ha->flags.isp82xx_fw_hung = 1;
|
|
|
- if (ha->flags.mbox_busy) {
|
|
|
- ha->flags.mbox_int = 1;
|
|
|
- ql_log(ql_log_warn, vha, 0x6007,
|
|
|
- "Due to FW hung, doing "
|
|
|
- "premature completion of mbx "
|
|
|
- "command.\n");
|
|
|
- if (test_bit(MBX_INTR_WAIT,
|
|
|
- &ha->mbx_cmd_flags))
|
|
|
- complete(&ha->mbx_intr_comp);
|
|
|
- }
|
|
|
+ ql_log(ql_log_warn, vha, 0x6007, "Firmware hung.\n");
|
|
|
+ qla82xx_clear_pending_mbx(vha);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
@@ -4078,13 +4083,7 @@ qla82xx_chip_reset_cleanup(scsi_qla_host_t *vha)
|
|
|
msleep(1000);
|
|
|
if (qla82xx_check_fw_alive(vha)) {
|
|
|
ha->flags.isp82xx_fw_hung = 1;
|
|
|
- if (ha->flags.mbox_busy) {
|
|
|
- ha->flags.mbox_int = 1;
|
|
|
- if (test_bit(MBX_INTR_WAIT,
|
|
|
- &ha->mbx_cmd_flags)) {
|
|
|
- complete(&ha->mbx_intr_comp);
|
|
|
- }
|
|
|
- }
|
|
|
+ qla82xx_clear_pending_mbx(vha);
|
|
|
break;
|
|
|
}
|
|
|
}
|