forked from Minki/linux
[SCSI] qla4xxx: Correct early completion of pending mbox.
Check for Firmware Hang (AF_FW_RECOVERY) after mailbox command has gained access to ensure that the mailbox command does not wait un-necessarily during a firmware recovery and prevent premature mailbox timeout which will lead to back to back reset's. Signed-off-by: Lalit Chandivade <lalit.chandivade@qlogic.com> Signed-off-by: Vikas Chaudhary <vikas.chaudhary@qlogic.com> Signed-off-by: James Bottomley <JBottomley@Parallels.com>
This commit is contained in:
parent
8d55e507d2
commit
5f50aa3ad5
@ -51,25 +51,6 @@ int qla4xxx_mailbox_command(struct scsi_qla_host *ha, uint8_t inCount,
|
||||
}
|
||||
}
|
||||
|
||||
if (is_qla8022(ha)) {
|
||||
if (test_bit(AF_FW_RECOVERY, &ha->flags)) {
|
||||
DEBUG2(ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: "
|
||||
"prematurely completing mbx cmd as firmware "
|
||||
"recovery detected\n", ha->host_no, __func__));
|
||||
return status;
|
||||
}
|
||||
/* Do not send any mbx cmd if h/w is in failed state*/
|
||||
qla4_8xxx_idc_lock(ha);
|
||||
dev_state = qla4_8xxx_rd_32(ha, QLA82XX_CRB_DEV_STATE);
|
||||
qla4_8xxx_idc_unlock(ha);
|
||||
if (dev_state == QLA82XX_DEV_FAILED) {
|
||||
ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: H/W is in "
|
||||
"failed state, do not send any mailbox commands\n",
|
||||
ha->host_no, __func__);
|
||||
return status;
|
||||
}
|
||||
}
|
||||
|
||||
if ((is_aer_supported(ha)) &&
|
||||
(test_bit(AF_PCI_CHANNEL_IO_PERM_FAILURE, &ha->flags))) {
|
||||
DEBUG2(printk(KERN_WARNING "scsi%ld: %s: Perm failure on EEH, "
|
||||
@ -96,6 +77,25 @@ int qla4xxx_mailbox_command(struct scsi_qla_host *ha, uint8_t inCount,
|
||||
msleep(10);
|
||||
}
|
||||
|
||||
if (is_qla8022(ha)) {
|
||||
if (test_bit(AF_FW_RECOVERY, &ha->flags)) {
|
||||
DEBUG2(ql4_printk(KERN_WARNING, ha,
|
||||
"scsi%ld: %s: prematurely completing mbx cmd as firmware recovery detected\n",
|
||||
ha->host_no, __func__));
|
||||
goto mbox_exit;
|
||||
}
|
||||
/* Do not send any mbx cmd if h/w is in failed state*/
|
||||
qla4_8xxx_idc_lock(ha);
|
||||
dev_state = qla4_8xxx_rd_32(ha, QLA82XX_CRB_DEV_STATE);
|
||||
qla4_8xxx_idc_unlock(ha);
|
||||
if (dev_state == QLA82XX_DEV_FAILED) {
|
||||
ql4_printk(KERN_WARNING, ha,
|
||||
"scsi%ld: %s: H/W is in failed state, do not send any mailbox commands\n",
|
||||
ha->host_no, __func__);
|
||||
goto mbox_exit;
|
||||
}
|
||||
}
|
||||
|
||||
spin_lock_irqsave(&ha->hardware_lock, flags);
|
||||
|
||||
ha->mbox_status_count = outCount;
|
||||
|
Loading…
Reference in New Issue
Block a user