[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)) &&
|
if ((is_aer_supported(ha)) &&
|
||||||
(test_bit(AF_PCI_CHANNEL_IO_PERM_FAILURE, &ha->flags))) {
|
(test_bit(AF_PCI_CHANNEL_IO_PERM_FAILURE, &ha->flags))) {
|
||||||
DEBUG2(printk(KERN_WARNING "scsi%ld: %s: Perm failure on EEH, "
|
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);
|
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);
|
spin_lock_irqsave(&ha->hardware_lock, flags);
|
||||||
|
|
||||||
ha->mbox_status_count = outCount;
|
ha->mbox_status_count = outCount;
|
||||||
|
Loading…
Reference in New Issue
Block a user