Commit c8f6544e authored by Chad Dupuis's avatar Chad Dupuis Committed by James Bottomley

[SCSI] qla2xxx: Encapsulate prematurely completing mailbox commands during ISP82xx firmware hang.

Signed-off-by: default avatarGiridhar Malavali <giridhar.malavali@qlogic.com>
Signed-off-by: default avatarChad Dupuis <chad.dupuis@qlogic.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Parallels.com>
parent 10a340e6
...@@ -17,12 +17,12 @@ ...@@ -17,12 +17,12 @@
* | Queue Command and IO tracing | 0x302e | 0x3008 | * | Queue Command and IO tracing | 0x302e | 0x3008 |
* | DPC Thread | 0x401c | | * | DPC Thread | 0x401c | |
* | Async Events | 0x5059 | | * | Async Events | 0x5059 | |
* | Timer Routines | 0x600d | | * | Timer Routines | 0x6010 | 0x600e,0x600f |
* | User Space Interactions | 0x709d | | * | User Space Interactions | 0x709d | |
* | Task Management | 0x8041 | | * | Task Management | 0x8041 | 0x800b |
* | AER/EEH | 0x900f | | * | AER/EEH | 0x900f | |
* | Virtual Port | 0xa007 | | * | Virtual Port | 0xa007 | |
* | ISP82XX Specific | 0xb051 | | * | ISP82XX Specific | 0xb052 | |
* | MultiQ | 0xc00b | | * | MultiQ | 0xc00b | |
* | Misc | 0xd00b | | * | Misc | 0xd00b | |
* ---------------------------------------------------------------------- * ----------------------------------------------------------------------
......
...@@ -578,6 +578,7 @@ extern int qla82xx_check_md_needed(scsi_qla_host_t *); ...@@ -578,6 +578,7 @@ extern int qla82xx_check_md_needed(scsi_qla_host_t *);
extern void qla82xx_chip_reset_cleanup(scsi_qla_host_t *); extern void qla82xx_chip_reset_cleanup(scsi_qla_host_t *);
extern int qla82xx_mbx_beacon_ctl(scsi_qla_host_t *, int); extern int qla82xx_mbx_beacon_ctl(scsi_qla_host_t *, int);
extern char *qdev_state(uint32_t); extern char *qdev_state(uint32_t);
extern void qla82xx_clear_pending_mbx(scsi_qla_host_t *);
/* BSG related functions */ /* BSG related functions */
extern int qla24xx_bsg_request(struct fc_bsg_job *); extern int qla24xx_bsg_request(struct fc_bsg_job *);
......
...@@ -3817,6 +3817,19 @@ qla82xx_device_state_handler(scsi_qla_host_t *vha) ...@@ -3817,6 +3817,19 @@ qla82xx_device_state_handler(scsi_qla_host_t *vha)
return rval; 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) void qla82xx_watchdog(scsi_qla_host_t *vha)
{ {
uint32_t dev_state, halt_status; uint32_t dev_state, halt_status;
...@@ -3874,16 +3887,8 @@ void qla82xx_watchdog(scsi_qla_host_t *vha) ...@@ -3874,16 +3887,8 @@ void qla82xx_watchdog(scsi_qla_host_t *vha)
} }
qla2xxx_wake_dpc(vha); qla2xxx_wake_dpc(vha);
ha->flags.isp82xx_fw_hung = 1; ha->flags.isp82xx_fw_hung = 1;
if (ha->flags.mbox_busy) { ql_log(ql_log_warn, vha, 0x6007, "Firmware hung.\n");
ha->flags.mbox_int = 1; qla82xx_clear_pending_mbx(vha);
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);
}
} }
} }
} }
...@@ -4078,13 +4083,7 @@ qla82xx_chip_reset_cleanup(scsi_qla_host_t *vha) ...@@ -4078,13 +4083,7 @@ qla82xx_chip_reset_cleanup(scsi_qla_host_t *vha)
msleep(1000); msleep(1000);
if (qla82xx_check_fw_alive(vha)) { if (qla82xx_check_fw_alive(vha)) {
ha->flags.isp82xx_fw_hung = 1; ha->flags.isp82xx_fw_hung = 1;
if (ha->flags.mbox_busy) { qla82xx_clear_pending_mbx(vha);
ha->flags.mbox_int = 1;
if (test_bit(MBX_INTR_WAIT,
&ha->mbx_cmd_flags)) {
complete(&ha->mbx_intr_comp);
}
}
break; break;
} }
} }
......
...@@ -4009,16 +4009,8 @@ qla2xxx_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state) ...@@ -4009,16 +4009,8 @@ qla2xxx_pci_error_detected(struct pci_dev *pdev, pci_channel_state_t state)
/* For ISP82XX complete any pending mailbox cmd */ /* For ISP82XX complete any pending mailbox cmd */
if (IS_QLA82XX(ha)) { if (IS_QLA82XX(ha)) {
ha->flags.isp82xx_fw_hung = 1; ha->flags.isp82xx_fw_hung = 1;
if (ha->flags.mbox_busy) { ql_dbg(ql_dbg_aer, vha, 0x9001, "Pci channel io frozen\n");
ha->flags.mbox_int = 1; qla82xx_clear_pending_mbx(vha);
ql_dbg(ql_dbg_aer, vha, 0x9001,
"Due to pci channel io frozen, doing premature "
"completion of mbx command.\n");
if (test_bit(MBX_INTR_WAIT,
&ha->mbx_cmd_flags)) {
complete(&ha->mbx_intr_comp);
}
}
} }
qla2x00_free_irqs(vha); qla2x00_free_irqs(vha);
pci_disable_device(pdev); pci_disable_device(pdev);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment