diff options
Diffstat (limited to 'drivers/scsi/qla4xxx/ql4_mbx.c')
| -rw-r--r-- | drivers/scsi/qla4xxx/ql4_mbx.c | 48 |
1 files changed, 47 insertions, 1 deletions
diff --git a/drivers/scsi/qla4xxx/ql4_mbx.c b/drivers/scsi/qla4xxx/ql4_mbx.c index 940ee561ee0a..90021704d8ca 100644 --- a/drivers/scsi/qla4xxx/ql4_mbx.c +++ b/drivers/scsi/qla4xxx/ql4_mbx.c | |||
| @@ -39,6 +39,22 @@ int qla4xxx_mailbox_command(struct scsi_qla_host *ha, uint8_t inCount, | |||
| 39 | "pointer\n", ha->host_no, __func__)); | 39 | "pointer\n", ha->host_no, __func__)); |
| 40 | return status; | 40 | return status; |
| 41 | } | 41 | } |
| 42 | |||
| 43 | if (is_qla8022(ha) && | ||
| 44 | test_bit(AF_FW_RECOVERY, &ha->flags)) { | ||
| 45 | DEBUG2(ql4_printk(KERN_WARNING, ha, "scsi%ld: %s: prematurely " | ||
| 46 | "completing mbx cmd as firmware recovery detected\n", | ||
| 47 | ha->host_no, __func__)); | ||
| 48 | return status; | ||
| 49 | } | ||
| 50 | |||
| 51 | if ((is_aer_supported(ha)) && | ||
| 52 | (test_bit(AF_PCI_CHANNEL_IO_PERM_FAILURE, &ha->flags))) { | ||
| 53 | DEBUG2(printk(KERN_WARNING "scsi%ld: %s: Perm failure on EEH, " | ||
| 54 | "timeout MBX Exiting.\n", ha->host_no, __func__)); | ||
| 55 | return status; | ||
| 56 | } | ||
| 57 | |||
| 42 | /* Mailbox code active */ | 58 | /* Mailbox code active */ |
| 43 | wait_count = MBOX_TOV * 100; | 59 | wait_count = MBOX_TOV * 100; |
| 44 | 60 | ||
| @@ -150,6 +166,7 @@ int qla4xxx_mailbox_command(struct scsi_qla_host *ha, uint8_t inCount, | |||
| 150 | while (test_bit(AF_MBOX_COMMAND_DONE, &ha->flags) == 0) { | 166 | while (test_bit(AF_MBOX_COMMAND_DONE, &ha->flags) == 0) { |
| 151 | if (time_after_eq(jiffies, wait_count)) | 167 | if (time_after_eq(jiffies, wait_count)) |
| 152 | break; | 168 | break; |
| 169 | |||
| 153 | /* | 170 | /* |
| 154 | * Service the interrupt. | 171 | * Service the interrupt. |
| 155 | * The ISR will save the mailbox status registers | 172 | * The ISR will save the mailbox status registers |
| @@ -196,6 +213,14 @@ int qla4xxx_mailbox_command(struct scsi_qla_host *ha, uint8_t inCount, | |||
| 196 | 213 | ||
| 197 | /* Check for mailbox timeout. */ | 214 | /* Check for mailbox timeout. */ |
| 198 | if (!test_bit(AF_MBOX_COMMAND_DONE, &ha->flags)) { | 215 | if (!test_bit(AF_MBOX_COMMAND_DONE, &ha->flags)) { |
| 216 | if (is_qla8022(ha) && | ||
| 217 | test_bit(AF_FW_RECOVERY, &ha->flags)) { | ||
| 218 | DEBUG2(ql4_printk(KERN_INFO, ha, | ||
| 219 | "scsi%ld: %s: prematurely completing mbx cmd as " | ||
| 220 | "firmware recovery detected\n", | ||
| 221 | ha->host_no, __func__)); | ||
| 222 | goto mbox_exit; | ||
| 223 | } | ||
| 199 | DEBUG2(printk("scsi%ld: Mailbox Cmd 0x%08X timed out ...," | 224 | DEBUG2(printk("scsi%ld: Mailbox Cmd 0x%08X timed out ...," |
| 200 | " Scheduling Adapter Reset\n", ha->host_no, | 225 | " Scheduling Adapter Reset\n", ha->host_no, |
| 201 | mbx_cmd[0])); | 226 | mbx_cmd[0])); |
| @@ -246,6 +271,28 @@ mbox_exit: | |||
| 246 | return status; | 271 | return status; |
| 247 | } | 272 | } |
| 248 | 273 | ||
| 274 | void qla4xxx_mailbox_premature_completion(struct scsi_qla_host *ha) | ||
| 275 | { | ||
| 276 | set_bit(AF_FW_RECOVERY, &ha->flags); | ||
| 277 | ql4_printk(KERN_INFO, ha, "scsi%ld: %s: set FW RECOVERY!\n", | ||
| 278 | ha->host_no, __func__); | ||
| 279 | |||
| 280 | if (test_bit(AF_MBOX_COMMAND, &ha->flags)) { | ||
| 281 | if (test_bit(AF_MBOX_COMMAND_NOPOLL, &ha->flags)) { | ||
| 282 | complete(&ha->mbx_intr_comp); | ||
| 283 | ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Due to fw " | ||
| 284 | "recovery, doing premature completion of " | ||
| 285 | "mbx cmd\n", ha->host_no, __func__); | ||
| 286 | |||
| 287 | } else { | ||
| 288 | set_bit(AF_MBOX_COMMAND_DONE, &ha->flags); | ||
| 289 | ql4_printk(KERN_INFO, ha, "scsi%ld: %s: Due to fw " | ||
| 290 | "recovery, doing premature completion of " | ||
| 291 | "polling mbx cmd\n", ha->host_no, __func__); | ||
| 292 | } | ||
| 293 | } | ||
| 294 | } | ||
| 295 | |||
| 249 | static uint8_t | 296 | static uint8_t |
| 250 | qla4xxx_set_ifcb(struct scsi_qla_host *ha, uint32_t *mbox_cmd, | 297 | qla4xxx_set_ifcb(struct scsi_qla_host *ha, uint32_t *mbox_cmd, |
| 251 | uint32_t *mbox_sts, dma_addr_t init_fw_cb_dma) | 298 | uint32_t *mbox_sts, dma_addr_t init_fw_cb_dma) |
| @@ -361,7 +408,6 @@ qla4xxx_update_local_ifcb(struct scsi_qla_host *ha, | |||
| 361 | min(sizeof(ha->alias), sizeof(init_fw_cb->Alias)));*/ | 408 | min(sizeof(ha->alias), sizeof(init_fw_cb->Alias)));*/ |
| 362 | 409 | ||
| 363 | /* Save Command Line Paramater info */ | 410 | /* Save Command Line Paramater info */ |
| 364 | ha->port_down_retry_count = le16_to_cpu(init_fw_cb->conn_ka_timeout); | ||
| 365 | ha->discovery_wait = ql4xdiscoverywait; | 411 | ha->discovery_wait = ql4xdiscoverywait; |
| 366 | 412 | ||
| 367 | if (ha->acb_version == ACB_SUPPORTED) { | 413 | if (ha->acb_version == ACB_SUPPORTED) { |
