diff options
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_mbx.c')
| -rw-r--r-- | drivers/scsi/qla2xxx/qla_mbx.c | 64 |
1 files changed, 60 insertions, 4 deletions
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index 05d595d9a7ef..056e4d4505f3 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c | |||
| @@ -56,6 +56,12 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
| 56 | 56 | ||
| 57 | DEBUG11(printk("%s(%ld): entered.\n", __func__, base_vha->host_no)); | 57 | DEBUG11(printk("%s(%ld): entered.\n", __func__, base_vha->host_no)); |
| 58 | 58 | ||
| 59 | if (ha->flags.pci_channel_io_perm_failure) { | ||
| 60 | DEBUG(printk("%s(%ld): Perm failure on EEH, timeout MBX " | ||
| 61 | "Exiting.\n", __func__, vha->host_no)); | ||
| 62 | return QLA_FUNCTION_TIMEOUT; | ||
| 63 | } | ||
| 64 | |||
| 59 | /* | 65 | /* |
| 60 | * Wait for active mailbox commands to finish by waiting at most tov | 66 | * Wait for active mailbox commands to finish by waiting at most tov |
| 61 | * seconds. This is to serialize actual issuing of mailbox cmds during | 67 | * seconds. This is to serialize actual issuing of mailbox cmds during |
| @@ -154,10 +160,14 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
| 154 | /* Check for pending interrupts. */ | 160 | /* Check for pending interrupts. */ |
| 155 | qla2x00_poll(ha->rsp_q_map[0]); | 161 | qla2x00_poll(ha->rsp_q_map[0]); |
| 156 | 162 | ||
| 157 | if (command != MBC_LOAD_RISC_RAM_EXTENDED && | 163 | if (!ha->flags.mbox_int && |
| 158 | !ha->flags.mbox_int) | 164 | !(IS_QLA2200(ha) && |
| 165 | command == MBC_LOAD_RISC_RAM_EXTENDED)) | ||
| 159 | msleep(10); | 166 | msleep(10); |
| 160 | } /* while */ | 167 | } /* while */ |
| 168 | DEBUG17(qla_printk(KERN_WARNING, ha, | ||
| 169 | "Waited %d sec\n", | ||
| 170 | (uint)((jiffies - (wait_time - (mcp->tov * HZ)))/HZ))); | ||
| 161 | } | 171 | } |
| 162 | 172 | ||
| 163 | /* Check whether we timed out */ | 173 | /* Check whether we timed out */ |
| @@ -227,7 +237,8 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
| 227 | 237 | ||
| 228 | if (rval == QLA_FUNCTION_TIMEOUT && | 238 | if (rval == QLA_FUNCTION_TIMEOUT && |
| 229 | mcp->mb[0] != MBC_GEN_SYSTEM_ERROR) { | 239 | mcp->mb[0] != MBC_GEN_SYSTEM_ERROR) { |
| 230 | if (!io_lock_on || (mcp->flags & IOCTL_CMD)) { | 240 | if (!io_lock_on || (mcp->flags & IOCTL_CMD) || |
| 241 | ha->flags.eeh_busy) { | ||
| 231 | /* not in dpc. schedule it for dpc to take over. */ | 242 | /* not in dpc. schedule it for dpc to take over. */ |
| 232 | DEBUG(printk("%s(%ld): timeout schedule " | 243 | DEBUG(printk("%s(%ld): timeout schedule " |
| 233 | "isp_abort_needed.\n", __func__, | 244 | "isp_abort_needed.\n", __func__, |
| @@ -237,7 +248,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
| 237 | base_vha->host_no)); | 248 | base_vha->host_no)); |
| 238 | qla_printk(KERN_WARNING, ha, | 249 | qla_printk(KERN_WARNING, ha, |
| 239 | "Mailbox command timeout occurred. Scheduling ISP " | 250 | "Mailbox command timeout occurred. Scheduling ISP " |
| 240 | "abort.\n"); | 251 | "abort. eeh_busy: 0x%x\n", ha->flags.eeh_busy); |
| 241 | set_bit(ISP_ABORT_NEEDED, &base_vha->dpc_flags); | 252 | set_bit(ISP_ABORT_NEEDED, &base_vha->dpc_flags); |
| 242 | qla2xxx_wake_dpc(vha); | 253 | qla2xxx_wake_dpc(vha); |
| 243 | } else if (!abort_active) { | 254 | } else if (!abort_active) { |
| @@ -2530,6 +2541,9 @@ qla2x00_enable_eft_trace(scsi_qla_host_t *vha, dma_addr_t eft_dma, | |||
| 2530 | if (!IS_FWI2_CAPABLE(vha->hw)) | 2541 | if (!IS_FWI2_CAPABLE(vha->hw)) |
| 2531 | return QLA_FUNCTION_FAILED; | 2542 | return QLA_FUNCTION_FAILED; |
| 2532 | 2543 | ||
| 2544 | if (unlikely(pci_channel_offline(vha->hw->pdev))) | ||
| 2545 | return QLA_FUNCTION_FAILED; | ||
| 2546 | |||
| 2533 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); | 2547 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); |
| 2534 | 2548 | ||
| 2535 | mcp->mb[0] = MBC_TRACE_CONTROL; | 2549 | mcp->mb[0] = MBC_TRACE_CONTROL; |
| @@ -2565,6 +2579,9 @@ qla2x00_disable_eft_trace(scsi_qla_host_t *vha) | |||
| 2565 | if (!IS_FWI2_CAPABLE(vha->hw)) | 2579 | if (!IS_FWI2_CAPABLE(vha->hw)) |
| 2566 | return QLA_FUNCTION_FAILED; | 2580 | return QLA_FUNCTION_FAILED; |
| 2567 | 2581 | ||
| 2582 | if (unlikely(pci_channel_offline(vha->hw->pdev))) | ||
| 2583 | return QLA_FUNCTION_FAILED; | ||
| 2584 | |||
| 2568 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); | 2585 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); |
| 2569 | 2586 | ||
| 2570 | mcp->mb[0] = MBC_TRACE_CONTROL; | 2587 | mcp->mb[0] = MBC_TRACE_CONTROL; |
| @@ -2595,6 +2612,9 @@ qla2x00_enable_fce_trace(scsi_qla_host_t *vha, dma_addr_t fce_dma, | |||
| 2595 | if (!IS_QLA25XX(vha->hw) && !IS_QLA81XX(vha->hw)) | 2612 | if (!IS_QLA25XX(vha->hw) && !IS_QLA81XX(vha->hw)) |
| 2596 | return QLA_FUNCTION_FAILED; | 2613 | return QLA_FUNCTION_FAILED; |
| 2597 | 2614 | ||
| 2615 | if (unlikely(pci_channel_offline(vha->hw->pdev))) | ||
| 2616 | return QLA_FUNCTION_FAILED; | ||
| 2617 | |||
| 2598 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); | 2618 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); |
| 2599 | 2619 | ||
| 2600 | mcp->mb[0] = MBC_TRACE_CONTROL; | 2620 | mcp->mb[0] = MBC_TRACE_CONTROL; |
| @@ -2639,6 +2659,9 @@ qla2x00_disable_fce_trace(scsi_qla_host_t *vha, uint64_t *wr, uint64_t *rd) | |||
| 2639 | if (!IS_FWI2_CAPABLE(vha->hw)) | 2659 | if (!IS_FWI2_CAPABLE(vha->hw)) |
| 2640 | return QLA_FUNCTION_FAILED; | 2660 | return QLA_FUNCTION_FAILED; |
| 2641 | 2661 | ||
| 2662 | if (unlikely(pci_channel_offline(vha->hw->pdev))) | ||
| 2663 | return QLA_FUNCTION_FAILED; | ||
| 2664 | |||
| 2642 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); | 2665 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); |
| 2643 | 2666 | ||
| 2644 | mcp->mb[0] = MBC_TRACE_CONTROL; | 2667 | mcp->mb[0] = MBC_TRACE_CONTROL; |
| @@ -3643,3 +3666,36 @@ qla2x00_write_ram_word(scsi_qla_host_t *vha, uint32_t risc_addr, uint32_t data) | |||
| 3643 | 3666 | ||
| 3644 | return rval; | 3667 | return rval; |
| 3645 | } | 3668 | } |
| 3669 | |||
| 3670 | int | ||
| 3671 | qla2x00_get_data_rate(scsi_qla_host_t *vha) | ||
| 3672 | { | ||
| 3673 | int rval; | ||
| 3674 | mbx_cmd_t mc; | ||
| 3675 | mbx_cmd_t *mcp = &mc; | ||
| 3676 | struct qla_hw_data *ha = vha->hw; | ||
| 3677 | |||
| 3678 | if (!IS_FWI2_CAPABLE(ha)) | ||
| 3679 | return QLA_FUNCTION_FAILED; | ||
| 3680 | |||
| 3681 | DEBUG11(printk(KERN_INFO "%s(%ld): entered.\n", __func__, vha->host_no)); | ||
| 3682 | |||
| 3683 | mcp->mb[0] = MBC_DATA_RATE; | ||
| 3684 | mcp->mb[1] = 0; | ||
| 3685 | mcp->out_mb = MBX_1|MBX_0; | ||
| 3686 | mcp->in_mb = MBX_2|MBX_1|MBX_0; | ||
| 3687 | mcp->tov = MBX_TOV_SECONDS; | ||
| 3688 | mcp->flags = 0; | ||
| 3689 | rval = qla2x00_mailbox_command(vha, mcp); | ||
| 3690 | if (rval != QLA_SUCCESS) { | ||
| 3691 | DEBUG2_3_11(printk(KERN_INFO "%s(%ld): failed=%x mb[0]=%x.\n", | ||
| 3692 | __func__, vha->host_no, rval, mcp->mb[0])); | ||
| 3693 | } else { | ||
| 3694 | DEBUG11(printk(KERN_INFO | ||
| 3695 | "%s(%ld): done.\n", __func__, vha->host_no)); | ||
| 3696 | if (mcp->mb[1] != 0x7) | ||
| 3697 | ha->link_data_rate = mcp->mb[1]; | ||
| 3698 | } | ||
| 3699 | |||
| 3700 | return rval; | ||
| 3701 | } | ||
