diff options
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_mbx.c')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_mbx.c | 41 |
1 files changed, 25 insertions, 16 deletions
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index a99976f5fabd..db4df45234a5 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c | |||
@@ -123,8 +123,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
123 | 123 | ||
124 | /* Wait for mbx cmd completion until timeout */ | 124 | /* Wait for mbx cmd completion until timeout */ |
125 | 125 | ||
126 | if (!abort_active && io_lock_on) { | 126 | if ((!abort_active && io_lock_on) || IS_NOPOLLING_TYPE(ha)) { |
127 | |||
128 | set_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags); | 127 | set_bit(MBX_INTR_WAIT, &ha->mbx_cmd_flags); |
129 | 128 | ||
130 | if (IS_FWI2_CAPABLE(ha)) | 129 | if (IS_FWI2_CAPABLE(ha)) |
@@ -218,7 +217,7 @@ qla2x00_mailbox_command(scsi_qla_host_t *vha, mbx_cmd_t *mcp) | |||
218 | /* Clean up */ | 217 | /* Clean up */ |
219 | ha->mcp = NULL; | 218 | ha->mcp = NULL; |
220 | 219 | ||
221 | if (abort_active || !io_lock_on) { | 220 | if ((abort_active || !io_lock_on) && !IS_NOPOLLING_TYPE(ha)) { |
222 | DEBUG11(printk("%s(%ld): checking for additional resp " | 221 | DEBUG11(printk("%s(%ld): checking for additional resp " |
223 | "interrupt.\n", __func__, base_vha->host_no)); | 222 | "interrupt.\n", __func__, base_vha->host_no)); |
224 | 223 | ||
@@ -412,7 +411,8 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr) | |||
412 | */ | 411 | */ |
413 | void | 412 | void |
414 | qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor, | 413 | qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor, |
415 | uint16_t *subminor, uint16_t *attributes, uint32_t *memory) | 414 | uint16_t *subminor, uint16_t *attributes, uint32_t *memory, uint8_t *mpi, |
415 | uint32_t *mpi_caps) | ||
416 | { | 416 | { |
417 | int rval; | 417 | int rval; |
418 | mbx_cmd_t mc; | 418 | mbx_cmd_t mc; |
@@ -423,6 +423,8 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor, | |||
423 | mcp->mb[0] = MBC_GET_FIRMWARE_VERSION; | 423 | mcp->mb[0] = MBC_GET_FIRMWARE_VERSION; |
424 | mcp->out_mb = MBX_0; | 424 | mcp->out_mb = MBX_0; |
425 | mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; | 425 | mcp->in_mb = MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; |
426 | if (IS_QLA81XX(vha->hw)) | ||
427 | mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10; | ||
426 | mcp->flags = 0; | 428 | mcp->flags = 0; |
427 | mcp->tov = MBX_TOV_SECONDS; | 429 | mcp->tov = MBX_TOV_SECONDS; |
428 | rval = qla2x00_mailbox_command(vha, mcp); | 430 | rval = qla2x00_mailbox_command(vha, mcp); |
@@ -436,6 +438,13 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor, | |||
436 | *memory = 0x1FFFF; /* Defaults to 128KB. */ | 438 | *memory = 0x1FFFF; /* Defaults to 128KB. */ |
437 | else | 439 | else |
438 | *memory = (mcp->mb[5] << 16) | mcp->mb[4]; | 440 | *memory = (mcp->mb[5] << 16) | mcp->mb[4]; |
441 | if (IS_QLA81XX(vha->hw)) { | ||
442 | mpi[0] = mcp->mb[10] >> 8; | ||
443 | mpi[1] = mcp->mb[10] & 0xff; | ||
444 | mpi[2] = mcp->mb[11] >> 8; | ||
445 | mpi[3] = mcp->mb[11] & 0xff; | ||
446 | *mpi_caps = (mcp->mb[12] << 16) | mcp->mb[13]; | ||
447 | } | ||
439 | 448 | ||
440 | if (rval != QLA_SUCCESS) { | 449 | if (rval != QLA_SUCCESS) { |
441 | /*EMPTY*/ | 450 | /*EMPTY*/ |
@@ -568,7 +577,6 @@ int | |||
568 | qla2x00_mbx_reg_test(scsi_qla_host_t *vha) | 577 | qla2x00_mbx_reg_test(scsi_qla_host_t *vha) |
569 | { | 578 | { |
570 | int rval; | 579 | int rval; |
571 | struct qla_hw_data *ha = vha->hw; | ||
572 | mbx_cmd_t mc; | 580 | mbx_cmd_t mc; |
573 | mbx_cmd_t *mcp = &mc; | 581 | mbx_cmd_t *mcp = &mc; |
574 | 582 | ||
@@ -595,14 +603,6 @@ qla2x00_mbx_reg_test(scsi_qla_host_t *vha) | |||
595 | if (mcp->mb[5] != 0xA5A5 || mcp->mb[6] != 0x5A5A || | 603 | if (mcp->mb[5] != 0xA5A5 || mcp->mb[6] != 0x5A5A || |
596 | mcp->mb[7] != 0x2525) | 604 | mcp->mb[7] != 0x2525) |
597 | rval = QLA_FUNCTION_FAILED; | 605 | rval = QLA_FUNCTION_FAILED; |
598 | if (rval == QLA_FUNCTION_FAILED) { | ||
599 | struct device_reg_24xx __iomem *reg = | ||
600 | &ha->iobase->isp24; | ||
601 | |||
602 | qla2xxx_hw_event_log(vha, HW_EVENT_ISP_ERR, 0, | ||
603 | LSW(RD_REG_DWORD(®->hccr)), | ||
604 | LSW(RD_REG_DWORD(®->istatus))); | ||
605 | } | ||
606 | } | 606 | } |
607 | 607 | ||
608 | if (rval != QLA_SUCCESS) { | 608 | if (rval != QLA_SUCCESS) { |
@@ -1363,7 +1363,13 @@ qla2x00_lip_reset(scsi_qla_host_t *vha) | |||
1363 | 1363 | ||
1364 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); | 1364 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); |
1365 | 1365 | ||
1366 | if (IS_FWI2_CAPABLE(vha->hw)) { | 1366 | if (IS_QLA81XX(vha->hw)) { |
1367 | /* Logout across all FCFs. */ | ||
1368 | mcp->mb[0] = MBC_LIP_FULL_LOGIN; | ||
1369 | mcp->mb[1] = BIT_1; | ||
1370 | mcp->mb[2] = 0; | ||
1371 | mcp->out_mb = MBX_2|MBX_1|MBX_0; | ||
1372 | } else if (IS_FWI2_CAPABLE(vha->hw)) { | ||
1367 | mcp->mb[0] = MBC_LIP_FULL_LOGIN; | 1373 | mcp->mb[0] = MBC_LIP_FULL_LOGIN; |
1368 | mcp->mb[1] = BIT_6; | 1374 | mcp->mb[1] = BIT_6; |
1369 | mcp->mb[2] = 0; | 1375 | mcp->mb[2] = 0; |
@@ -1853,6 +1859,9 @@ qla2x00_full_login_lip(scsi_qla_host_t *vha) | |||
1853 | mbx_cmd_t mc; | 1859 | mbx_cmd_t mc; |
1854 | mbx_cmd_t *mcp = &mc; | 1860 | mbx_cmd_t *mcp = &mc; |
1855 | 1861 | ||
1862 | if (IS_QLA81XX(vha->hw)) | ||
1863 | return QLA_SUCCESS; | ||
1864 | |||
1856 | DEBUG11(printk("qla2x00_full_login_lip(%ld): entered.\n", | 1865 | DEBUG11(printk("qla2x00_full_login_lip(%ld): entered.\n", |
1857 | vha->host_no)); | 1866 | vha->host_no)); |
1858 | 1867 | ||
@@ -2512,7 +2521,7 @@ qla2x00_enable_fce_trace(scsi_qla_host_t *vha, dma_addr_t fce_dma, | |||
2512 | mbx_cmd_t mc; | 2521 | mbx_cmd_t mc; |
2513 | mbx_cmd_t *mcp = &mc; | 2522 | mbx_cmd_t *mcp = &mc; |
2514 | 2523 | ||
2515 | if (!IS_QLA25XX(vha->hw)) | 2524 | if (!IS_QLA25XX(vha->hw) && !IS_QLA81XX(vha->hw)) |
2516 | return QLA_FUNCTION_FAILED; | 2525 | return QLA_FUNCTION_FAILED; |
2517 | 2526 | ||
2518 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); | 2527 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); |
@@ -3155,7 +3164,7 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp, | |||
3155 | mcp->mb[7] = LSW(MSD(rsp->dma)); | 3164 | mcp->mb[7] = LSW(MSD(rsp->dma)); |
3156 | mcp->mb[5] = rsp->length; | 3165 | mcp->mb[5] = rsp->length; |
3157 | mcp->mb[11] = rsp->vp_idx; | 3166 | mcp->mb[11] = rsp->vp_idx; |
3158 | mcp->mb[14] = rsp->msix->vector; | 3167 | mcp->mb[14] = rsp->msix->entry; |
3159 | mcp->mb[13] = rsp->rid; | 3168 | mcp->mb[13] = rsp->rid; |
3160 | 3169 | ||
3161 | reg = (struct device_reg_25xxmq *)((void *)(ha->mqiobase) + | 3170 | reg = (struct device_reg_25xxmq *)((void *)(ha->mqiobase) + |