diff options
author | Lalit Chandivade <lalit.chandivade@qlogic.com> | 2012-04-24 01:32:32 -0400 |
---|---|---|
committer | James Bottomley <JBottomley@Parallels.com> | 2012-05-30 04:53:52 -0400 |
commit | 5f50aa3ad54f3d029026d437f43324ce336dd8f5 (patch) | |
tree | feb1187623af2ee09dff78182d07881e02b2c1b4 /drivers/scsi/qla4xxx/ql4_mbx.c | |
parent | 8d55e507d24c6db7eb012c379c62912e642eb75e (diff) |
[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>
Diffstat (limited to 'drivers/scsi/qla4xxx/ql4_mbx.c')
-rw-r--r-- | drivers/scsi/qla4xxx/ql4_mbx.c | 38 |
1 files changed, 19 insertions, 19 deletions
diff --git a/drivers/scsi/qla4xxx/ql4_mbx.c b/drivers/scsi/qla4xxx/ql4_mbx.c index 7ac21dabbf22..c7d101eee63c 100644 --- a/drivers/scsi/qla4xxx/ql4_mbx.c +++ b/drivers/scsi/qla4xxx/ql4_mbx.c | |||
@@ -51,25 +51,6 @@ int qla4xxx_mailbox_command(struct scsi_qla_host *ha, uint8_t inCount, | |||
51 | } | 51 | } |
52 | } | 52 | } |
53 | 53 | ||
54 | if (is_qla8022(ha)) { | ||
55 | if (test_bit(AF_FW_RECOVERY, &ha->flags)) { | ||
56 | DEBUG2(ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: " | ||
57 | "prematurely completing mbx cmd as firmware " | ||
58 | "recovery detected\n", ha->host_no, __func__)); | ||
59 | return status; | ||
60 | } | ||
61 | /* Do not send any mbx cmd if h/w is in failed state*/ | ||
62 | qla4_8xxx_idc_lock(ha); | ||
63 | dev_state = qla4_8xxx_rd_32(ha, QLA82XX_CRB_DEV_STATE); | ||
64 | qla4_8xxx_idc_unlock(ha); | ||
65 | if (dev_state == QLA82XX_DEV_FAILED) { | ||
66 | ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: H/W is in " | ||
67 | "failed state, do not send any mailbox commands\n", | ||
68 | ha->host_no, __func__); | ||
69 | return status; | ||
70 | } | ||
71 | } | ||
72 | |||
73 | if ((is_aer_supported(ha)) && | 54 | if ((is_aer_supported(ha)) && |
74 | (test_bit(AF_PCI_CHANNEL_IO_PERM_FAILURE, &ha->flags))) { | 55 | (test_bit(AF_PCI_CHANNEL_IO_PERM_FAILURE, &ha->flags))) { |
75 | DEBUG2(printk(KERN_WARNING "scsi%ld: %s: Perm failure on EEH, " | 56 | 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, | |||
96 | msleep(10); | 77 | msleep(10); |
97 | } | 78 | } |
98 | 79 | ||
80 | if (is_qla8022(ha)) { | ||
81 | if (test_bit(AF_FW_RECOVERY, &ha->flags)) { | ||
82 | DEBUG2(ql4_printk(KERN_WARNING, ha, | ||
83 | "scsi%ld: %s: prematurely completing mbx cmd as firmware recovery detected\n", | ||
84 | ha->host_no, __func__)); | ||
85 | goto mbox_exit; | ||
86 | } | ||
87 | /* Do not send any mbx cmd if h/w is in failed state*/ | ||
88 | qla4_8xxx_idc_lock(ha); | ||
89 | dev_state = qla4_8xxx_rd_32(ha, QLA82XX_CRB_DEV_STATE); | ||
90 | qla4_8xxx_idc_unlock(ha); | ||
91 | if (dev_state == QLA82XX_DEV_FAILED) { | ||
92 | ql4_printk(KERN_WARNING, ha, | ||
93 | "scsi%ld: %s: H/W is in failed state, do not send any mailbox commands\n", | ||
94 | ha->host_no, __func__); | ||
95 | goto mbox_exit; | ||
96 | } | ||
97 | } | ||
98 | |||
99 | spin_lock_irqsave(&ha->hardware_lock, flags); | 99 | spin_lock_irqsave(&ha->hardware_lock, flags); |
100 | 100 | ||
101 | ha->mbox_status_count = outCount; | 101 | ha->mbox_status_count = outCount; |