diff options
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_mbx.c')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_mbx.c | 244 |
1 files changed, 212 insertions, 32 deletions
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index e67c1660bf46..451ece0760b0 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c | |||
@@ -408,7 +408,7 @@ qla2x00_execute_fw(scsi_qla_host_t *vha, uint32_t risc_addr) | |||
408 | * Context: | 408 | * Context: |
409 | * Kernel context. | 409 | * Kernel context. |
410 | */ | 410 | */ |
411 | void | 411 | int |
412 | qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor, | 412 | qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor, |
413 | uint16_t *subminor, uint16_t *attributes, uint32_t *memory, uint8_t *mpi, | 413 | uint16_t *subminor, uint16_t *attributes, uint32_t *memory, uint8_t *mpi, |
414 | uint32_t *mpi_caps, uint8_t *phy) | 414 | uint32_t *mpi_caps, uint8_t *phy) |
@@ -427,6 +427,8 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor, | |||
427 | mcp->flags = 0; | 427 | mcp->flags = 0; |
428 | mcp->tov = MBX_TOV_SECONDS; | 428 | mcp->tov = MBX_TOV_SECONDS; |
429 | rval = qla2x00_mailbox_command(vha, mcp); | 429 | rval = qla2x00_mailbox_command(vha, mcp); |
430 | if (rval != QLA_SUCCESS) | ||
431 | goto failed; | ||
430 | 432 | ||
431 | /* Return mailbox data. */ | 433 | /* Return mailbox data. */ |
432 | *major = mcp->mb[1]; | 434 | *major = mcp->mb[1]; |
@@ -446,7 +448,7 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor, | |||
446 | phy[1] = mcp->mb[9] >> 8; | 448 | phy[1] = mcp->mb[9] >> 8; |
447 | phy[2] = mcp->mb[9] & 0xff; | 449 | phy[2] = mcp->mb[9] & 0xff; |
448 | } | 450 | } |
449 | 451 | failed: | |
450 | if (rval != QLA_SUCCESS) { | 452 | if (rval != QLA_SUCCESS) { |
451 | /*EMPTY*/ | 453 | /*EMPTY*/ |
452 | DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, | 454 | DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, |
@@ -455,6 +457,7 @@ qla2x00_get_fw_version(scsi_qla_host_t *vha, uint16_t *major, uint16_t *minor, | |||
455 | /*EMPTY*/ | 457 | /*EMPTY*/ |
456 | DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); | 458 | DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); |
457 | } | 459 | } |
460 | return rval; | ||
458 | } | 461 | } |
459 | 462 | ||
460 | /* | 463 | /* |
@@ -748,20 +751,20 @@ qla2x00_issue_iocb(scsi_qla_host_t *vha, void *buffer, dma_addr_t phys_addr, | |||
748 | * Kernel context. | 751 | * Kernel context. |
749 | */ | 752 | */ |
750 | int | 753 | int |
751 | qla2x00_abort_command(scsi_qla_host_t *vha, srb_t *sp, struct req_que *req) | 754 | qla2x00_abort_command(srb_t *sp) |
752 | { | 755 | { |
753 | unsigned long flags = 0; | 756 | unsigned long flags = 0; |
754 | fc_port_t *fcport; | ||
755 | int rval; | 757 | int rval; |
756 | uint32_t handle = 0; | 758 | uint32_t handle = 0; |
757 | mbx_cmd_t mc; | 759 | mbx_cmd_t mc; |
758 | mbx_cmd_t *mcp = &mc; | 760 | mbx_cmd_t *mcp = &mc; |
761 | fc_port_t *fcport = sp->fcport; | ||
762 | scsi_qla_host_t *vha = fcport->vha; | ||
759 | struct qla_hw_data *ha = vha->hw; | 763 | struct qla_hw_data *ha = vha->hw; |
764 | struct req_que *req = vha->req; | ||
760 | 765 | ||
761 | DEBUG11(printk("qla2x00_abort_command(%ld): entered.\n", vha->host_no)); | 766 | DEBUG11(printk("qla2x00_abort_command(%ld): entered.\n", vha->host_no)); |
762 | 767 | ||
763 | fcport = sp->fcport; | ||
764 | |||
765 | spin_lock_irqsave(&ha->hardware_lock, flags); | 768 | spin_lock_irqsave(&ha->hardware_lock, flags); |
766 | for (handle = 1; handle < MAX_OUTSTANDING_COMMANDS; handle++) { | 769 | for (handle = 1; handle < MAX_OUTSTANDING_COMMANDS; handle++) { |
767 | if (req->outstanding_cmds[handle] == sp) | 770 | if (req->outstanding_cmds[handle] == sp) |
@@ -800,7 +803,7 @@ qla2x00_abort_command(scsi_qla_host_t *vha, srb_t *sp, struct req_que *req) | |||
800 | } | 803 | } |
801 | 804 | ||
802 | int | 805 | int |
803 | qla2x00_abort_target(struct fc_port *fcport, unsigned int l) | 806 | qla2x00_abort_target(struct fc_port *fcport, unsigned int l, int tag) |
804 | { | 807 | { |
805 | int rval, rval2; | 808 | int rval, rval2; |
806 | mbx_cmd_t mc; | 809 | mbx_cmd_t mc; |
@@ -813,8 +816,8 @@ qla2x00_abort_target(struct fc_port *fcport, unsigned int l) | |||
813 | 816 | ||
814 | l = l; | 817 | l = l; |
815 | vha = fcport->vha; | 818 | vha = fcport->vha; |
816 | req = vha->hw->req_q_map[0]; | 819 | req = vha->hw->req_q_map[tag]; |
817 | rsp = vha->hw->rsp_q_map[0]; | 820 | rsp = vha->hw->rsp_q_map[tag]; |
818 | mcp->mb[0] = MBC_ABORT_TARGET; | 821 | mcp->mb[0] = MBC_ABORT_TARGET; |
819 | mcp->out_mb = MBX_9|MBX_2|MBX_1|MBX_0; | 822 | mcp->out_mb = MBX_9|MBX_2|MBX_1|MBX_0; |
820 | if (HAS_EXTENDED_IDS(vha->hw)) { | 823 | if (HAS_EXTENDED_IDS(vha->hw)) { |
@@ -850,7 +853,7 @@ qla2x00_abort_target(struct fc_port *fcport, unsigned int l) | |||
850 | } | 853 | } |
851 | 854 | ||
852 | int | 855 | int |
853 | qla2x00_lun_reset(struct fc_port *fcport, unsigned int l) | 856 | qla2x00_lun_reset(struct fc_port *fcport, unsigned int l, int tag) |
854 | { | 857 | { |
855 | int rval, rval2; | 858 | int rval, rval2; |
856 | mbx_cmd_t mc; | 859 | mbx_cmd_t mc; |
@@ -862,8 +865,8 @@ qla2x00_lun_reset(struct fc_port *fcport, unsigned int l) | |||
862 | DEBUG11(printk("%s(%ld): entered.\n", __func__, fcport->vha->host_no)); | 865 | DEBUG11(printk("%s(%ld): entered.\n", __func__, fcport->vha->host_no)); |
863 | 866 | ||
864 | vha = fcport->vha; | 867 | vha = fcport->vha; |
865 | req = vha->hw->req_q_map[0]; | 868 | req = vha->hw->req_q_map[tag]; |
866 | rsp = vha->hw->rsp_q_map[0]; | 869 | rsp = vha->hw->rsp_q_map[tag]; |
867 | mcp->mb[0] = MBC_LUN_RESET; | 870 | mcp->mb[0] = MBC_LUN_RESET; |
868 | mcp->out_mb = MBX_9|MBX_3|MBX_2|MBX_1|MBX_0; | 871 | mcp->out_mb = MBX_9|MBX_3|MBX_2|MBX_1|MBX_0; |
869 | if (HAS_EXTENDED_IDS(vha->hw)) | 872 | if (HAS_EXTENDED_IDS(vha->hw)) |
@@ -931,6 +934,8 @@ qla2x00_get_adapter_id(scsi_qla_host_t *vha, uint16_t *id, uint8_t *al_pa, | |||
931 | mcp->mb[9] = vha->vp_idx; | 934 | mcp->mb[9] = vha->vp_idx; |
932 | mcp->out_mb = MBX_9|MBX_0; | 935 | mcp->out_mb = MBX_9|MBX_0; |
933 | mcp->in_mb = MBX_9|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; | 936 | mcp->in_mb = MBX_9|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; |
937 | if (IS_QLA81XX(vha->hw)) | ||
938 | mcp->in_mb |= MBX_13|MBX_12|MBX_11|MBX_10; | ||
934 | mcp->tov = MBX_TOV_SECONDS; | 939 | mcp->tov = MBX_TOV_SECONDS; |
935 | mcp->flags = 0; | 940 | mcp->flags = 0; |
936 | rval = qla2x00_mailbox_command(vha, mcp); | 941 | rval = qla2x00_mailbox_command(vha, mcp); |
@@ -952,9 +957,19 @@ qla2x00_get_adapter_id(scsi_qla_host_t *vha, uint16_t *id, uint8_t *al_pa, | |||
952 | DEBUG2_3_11(printk("qla2x00_get_adapter_id(%ld): failed=%x.\n", | 957 | DEBUG2_3_11(printk("qla2x00_get_adapter_id(%ld): failed=%x.\n", |
953 | vha->host_no, rval)); | 958 | vha->host_no, rval)); |
954 | } else { | 959 | } else { |
955 | /*EMPTY*/ | ||
956 | DEBUG11(printk("qla2x00_get_adapter_id(%ld): done.\n", | 960 | DEBUG11(printk("qla2x00_get_adapter_id(%ld): done.\n", |
957 | vha->host_no)); | 961 | vha->host_no)); |
962 | |||
963 | if (IS_QLA81XX(vha->hw)) { | ||
964 | vha->fcoe_vlan_id = mcp->mb[9] & 0xfff; | ||
965 | vha->fcoe_fcf_idx = mcp->mb[10]; | ||
966 | vha->fcoe_vn_port_mac[5] = mcp->mb[11] >> 8; | ||
967 | vha->fcoe_vn_port_mac[4] = mcp->mb[11] & 0xff; | ||
968 | vha->fcoe_vn_port_mac[3] = mcp->mb[12] >> 8; | ||
969 | vha->fcoe_vn_port_mac[2] = mcp->mb[12] & 0xff; | ||
970 | vha->fcoe_vn_port_mac[1] = mcp->mb[13] >> 8; | ||
971 | vha->fcoe_vn_port_mac[0] = mcp->mb[13] & 0xff; | ||
972 | } | ||
958 | } | 973 | } |
959 | 974 | ||
960 | return rval; | 975 | return rval; |
@@ -1252,7 +1267,7 @@ qla2x00_get_firmware_state(scsi_qla_host_t *vha, uint16_t *states) | |||
1252 | 1267 | ||
1253 | mcp->mb[0] = MBC_GET_FIRMWARE_STATE; | 1268 | mcp->mb[0] = MBC_GET_FIRMWARE_STATE; |
1254 | mcp->out_mb = MBX_0; | 1269 | mcp->out_mb = MBX_0; |
1255 | mcp->in_mb = MBX_3|MBX_2|MBX_1|MBX_0; | 1270 | mcp->in_mb = MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; |
1256 | mcp->tov = MBX_TOV_SECONDS; | 1271 | mcp->tov = MBX_TOV_SECONDS; |
1257 | mcp->flags = 0; | 1272 | mcp->flags = 0; |
1258 | rval = qla2x00_mailbox_command(vha, mcp); | 1273 | rval = qla2x00_mailbox_command(vha, mcp); |
@@ -1261,6 +1276,8 @@ qla2x00_get_firmware_state(scsi_qla_host_t *vha, uint16_t *states) | |||
1261 | states[0] = mcp->mb[1]; | 1276 | states[0] = mcp->mb[1]; |
1262 | states[1] = mcp->mb[2]; | 1277 | states[1] = mcp->mb[2]; |
1263 | states[2] = mcp->mb[3]; | 1278 | states[2] = mcp->mb[3]; |
1279 | states[3] = mcp->mb[4]; | ||
1280 | states[4] = mcp->mb[5]; | ||
1264 | 1281 | ||
1265 | if (rval != QLA_SUCCESS) { | 1282 | if (rval != QLA_SUCCESS) { |
1266 | /*EMPTY*/ | 1283 | /*EMPTY*/ |
@@ -1480,9 +1497,17 @@ qla24xx_login_fabric(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t domain, | |||
1480 | dma_addr_t lg_dma; | 1497 | dma_addr_t lg_dma; |
1481 | uint32_t iop[2]; | 1498 | uint32_t iop[2]; |
1482 | struct qla_hw_data *ha = vha->hw; | 1499 | struct qla_hw_data *ha = vha->hw; |
1500 | struct req_que *req; | ||
1501 | struct rsp_que *rsp; | ||
1483 | 1502 | ||
1484 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); | 1503 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); |
1485 | 1504 | ||
1505 | if (ql2xmultique_tag) | ||
1506 | req = ha->req_q_map[0]; | ||
1507 | else | ||
1508 | req = vha->req; | ||
1509 | rsp = req->rsp; | ||
1510 | |||
1486 | lg = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &lg_dma); | 1511 | lg = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &lg_dma); |
1487 | if (lg == NULL) { | 1512 | if (lg == NULL) { |
1488 | DEBUG2_3(printk("%s(%ld): failed to allocate Login IOCB.\n", | 1513 | DEBUG2_3(printk("%s(%ld): failed to allocate Login IOCB.\n", |
@@ -1493,6 +1518,7 @@ qla24xx_login_fabric(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t domain, | |||
1493 | 1518 | ||
1494 | lg->entry_type = LOGINOUT_PORT_IOCB_TYPE; | 1519 | lg->entry_type = LOGINOUT_PORT_IOCB_TYPE; |
1495 | lg->entry_count = 1; | 1520 | lg->entry_count = 1; |
1521 | lg->handle = MAKE_HANDLE(req->id, lg->handle); | ||
1496 | lg->nport_handle = cpu_to_le16(loop_id); | 1522 | lg->nport_handle = cpu_to_le16(loop_id); |
1497 | lg->control_flags = __constant_cpu_to_le16(LCF_COMMAND_PLOGI); | 1523 | lg->control_flags = __constant_cpu_to_le16(LCF_COMMAND_PLOGI); |
1498 | if (opt & BIT_0) | 1524 | if (opt & BIT_0) |
@@ -1741,6 +1767,8 @@ qla24xx_fabric_logout(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t domain, | |||
1741 | struct logio_entry_24xx *lg; | 1767 | struct logio_entry_24xx *lg; |
1742 | dma_addr_t lg_dma; | 1768 | dma_addr_t lg_dma; |
1743 | struct qla_hw_data *ha = vha->hw; | 1769 | struct qla_hw_data *ha = vha->hw; |
1770 | struct req_que *req; | ||
1771 | struct rsp_que *rsp; | ||
1744 | 1772 | ||
1745 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); | 1773 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); |
1746 | 1774 | ||
@@ -1752,8 +1780,14 @@ qla24xx_fabric_logout(scsi_qla_host_t *vha, uint16_t loop_id, uint8_t domain, | |||
1752 | } | 1780 | } |
1753 | memset(lg, 0, sizeof(struct logio_entry_24xx)); | 1781 | memset(lg, 0, sizeof(struct logio_entry_24xx)); |
1754 | 1782 | ||
1783 | if (ql2xmaxqueues > 1) | ||
1784 | req = ha->req_q_map[0]; | ||
1785 | else | ||
1786 | req = vha->req; | ||
1787 | rsp = req->rsp; | ||
1755 | lg->entry_type = LOGINOUT_PORT_IOCB_TYPE; | 1788 | lg->entry_type = LOGINOUT_PORT_IOCB_TYPE; |
1756 | lg->entry_count = 1; | 1789 | lg->entry_count = 1; |
1790 | lg->handle = MAKE_HANDLE(req->id, lg->handle); | ||
1757 | lg->nport_handle = cpu_to_le16(loop_id); | 1791 | lg->nport_handle = cpu_to_le16(loop_id); |
1758 | lg->control_flags = | 1792 | lg->control_flags = |
1759 | __constant_cpu_to_le16(LCF_COMMAND_LOGO|LCF_IMPL_LOGO); | 1793 | __constant_cpu_to_le16(LCF_COMMAND_LOGO|LCF_IMPL_LOGO); |
@@ -1864,9 +1898,6 @@ qla2x00_full_login_lip(scsi_qla_host_t *vha) | |||
1864 | mbx_cmd_t mc; | 1898 | mbx_cmd_t mc; |
1865 | mbx_cmd_t *mcp = &mc; | 1899 | mbx_cmd_t *mcp = &mc; |
1866 | 1900 | ||
1867 | if (IS_QLA81XX(vha->hw)) | ||
1868 | return QLA_SUCCESS; | ||
1869 | |||
1870 | DEBUG11(printk("qla2x00_full_login_lip(%ld): entered.\n", | 1901 | DEBUG11(printk("qla2x00_full_login_lip(%ld): entered.\n", |
1871 | vha->host_no)); | 1902 | vha->host_no)); |
1872 | 1903 | ||
@@ -2195,21 +2226,21 @@ qla24xx_get_isp_stats(scsi_qla_host_t *vha, struct link_statistics *stats, | |||
2195 | } | 2226 | } |
2196 | 2227 | ||
2197 | int | 2228 | int |
2198 | qla24xx_abort_command(scsi_qla_host_t *vha, srb_t *sp, struct req_que *req) | 2229 | qla24xx_abort_command(srb_t *sp) |
2199 | { | 2230 | { |
2200 | int rval; | 2231 | int rval; |
2201 | fc_port_t *fcport; | ||
2202 | unsigned long flags = 0; | 2232 | unsigned long flags = 0; |
2203 | 2233 | ||
2204 | struct abort_entry_24xx *abt; | 2234 | struct abort_entry_24xx *abt; |
2205 | dma_addr_t abt_dma; | 2235 | dma_addr_t abt_dma; |
2206 | uint32_t handle; | 2236 | uint32_t handle; |
2237 | fc_port_t *fcport = sp->fcport; | ||
2238 | struct scsi_qla_host *vha = fcport->vha; | ||
2207 | struct qla_hw_data *ha = vha->hw; | 2239 | struct qla_hw_data *ha = vha->hw; |
2240 | struct req_que *req = vha->req; | ||
2208 | 2241 | ||
2209 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); | 2242 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); |
2210 | 2243 | ||
2211 | fcport = sp->fcport; | ||
2212 | |||
2213 | spin_lock_irqsave(&ha->hardware_lock, flags); | 2244 | spin_lock_irqsave(&ha->hardware_lock, flags); |
2214 | for (handle = 1; handle < MAX_OUTSTANDING_COMMANDS; handle++) { | 2245 | for (handle = 1; handle < MAX_OUTSTANDING_COMMANDS; handle++) { |
2215 | if (req->outstanding_cmds[handle] == sp) | 2246 | if (req->outstanding_cmds[handle] == sp) |
@@ -2231,6 +2262,7 @@ qla24xx_abort_command(scsi_qla_host_t *vha, srb_t *sp, struct req_que *req) | |||
2231 | 2262 | ||
2232 | abt->entry_type = ABORT_IOCB_TYPE; | 2263 | abt->entry_type = ABORT_IOCB_TYPE; |
2233 | abt->entry_count = 1; | 2264 | abt->entry_count = 1; |
2265 | abt->handle = MAKE_HANDLE(req->id, abt->handle); | ||
2234 | abt->nport_handle = cpu_to_le16(fcport->loop_id); | 2266 | abt->nport_handle = cpu_to_le16(fcport->loop_id); |
2235 | abt->handle_to_abort = handle; | 2267 | abt->handle_to_abort = handle; |
2236 | abt->port_id[0] = fcport->d_id.b.al_pa; | 2268 | abt->port_id[0] = fcport->d_id.b.al_pa; |
@@ -2272,7 +2304,7 @@ struct tsk_mgmt_cmd { | |||
2272 | 2304 | ||
2273 | static int | 2305 | static int |
2274 | __qla24xx_issue_tmf(char *name, uint32_t type, struct fc_port *fcport, | 2306 | __qla24xx_issue_tmf(char *name, uint32_t type, struct fc_port *fcport, |
2275 | unsigned int l) | 2307 | unsigned int l, int tag) |
2276 | { | 2308 | { |
2277 | int rval, rval2; | 2309 | int rval, rval2; |
2278 | struct tsk_mgmt_cmd *tsk; | 2310 | struct tsk_mgmt_cmd *tsk; |
@@ -2286,8 +2318,11 @@ __qla24xx_issue_tmf(char *name, uint32_t type, struct fc_port *fcport, | |||
2286 | 2318 | ||
2287 | vha = fcport->vha; | 2319 | vha = fcport->vha; |
2288 | ha = vha->hw; | 2320 | ha = vha->hw; |
2289 | req = ha->req_q_map[0]; | 2321 | req = vha->req; |
2290 | rsp = ha->rsp_q_map[0]; | 2322 | if (ql2xmultique_tag) |
2323 | rsp = ha->rsp_q_map[tag + 1]; | ||
2324 | else | ||
2325 | rsp = req->rsp; | ||
2291 | tsk = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &tsk_dma); | 2326 | tsk = dma_pool_alloc(ha->s_dma_pool, GFP_KERNEL, &tsk_dma); |
2292 | if (tsk == NULL) { | 2327 | if (tsk == NULL) { |
2293 | DEBUG2_3(printk("%s(%ld): failed to allocate Task Management " | 2328 | DEBUG2_3(printk("%s(%ld): failed to allocate Task Management " |
@@ -2298,6 +2333,7 @@ __qla24xx_issue_tmf(char *name, uint32_t type, struct fc_port *fcport, | |||
2298 | 2333 | ||
2299 | tsk->p.tsk.entry_type = TSK_MGMT_IOCB_TYPE; | 2334 | tsk->p.tsk.entry_type = TSK_MGMT_IOCB_TYPE; |
2300 | tsk->p.tsk.entry_count = 1; | 2335 | tsk->p.tsk.entry_count = 1; |
2336 | tsk->p.tsk.handle = MAKE_HANDLE(req->id, tsk->p.tsk.handle); | ||
2301 | tsk->p.tsk.nport_handle = cpu_to_le16(fcport->loop_id); | 2337 | tsk->p.tsk.nport_handle = cpu_to_le16(fcport->loop_id); |
2302 | tsk->p.tsk.timeout = cpu_to_le16(ha->r_a_tov / 10 * 2); | 2338 | tsk->p.tsk.timeout = cpu_to_le16(ha->r_a_tov / 10 * 2); |
2303 | tsk->p.tsk.control_flags = cpu_to_le32(type); | 2339 | tsk->p.tsk.control_flags = cpu_to_le32(type); |
@@ -2344,15 +2380,15 @@ __qla24xx_issue_tmf(char *name, uint32_t type, struct fc_port *fcport, | |||
2344 | } | 2380 | } |
2345 | 2381 | ||
2346 | int | 2382 | int |
2347 | qla24xx_abort_target(struct fc_port *fcport, unsigned int l) | 2383 | qla24xx_abort_target(struct fc_port *fcport, unsigned int l, int tag) |
2348 | { | 2384 | { |
2349 | return __qla24xx_issue_tmf("Target", TCF_TARGET_RESET, fcport, l); | 2385 | return __qla24xx_issue_tmf("Target", TCF_TARGET_RESET, fcport, l, tag); |
2350 | } | 2386 | } |
2351 | 2387 | ||
2352 | int | 2388 | int |
2353 | qla24xx_lun_reset(struct fc_port *fcport, unsigned int l) | 2389 | qla24xx_lun_reset(struct fc_port *fcport, unsigned int l, int tag) |
2354 | { | 2390 | { |
2355 | return __qla24xx_issue_tmf("Lun", TCF_LUN_RESET, fcport, l); | 2391 | return __qla24xx_issue_tmf("Lun", TCF_LUN_RESET, fcport, l, tag); |
2356 | } | 2392 | } |
2357 | 2393 | ||
2358 | int | 2394 | int |
@@ -2446,6 +2482,8 @@ qla2x00_stop_firmware(scsi_qla_host_t *vha) | |||
2446 | if (rval != QLA_SUCCESS) { | 2482 | if (rval != QLA_SUCCESS) { |
2447 | DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, | 2483 | DEBUG2_3_11(printk("%s(%ld): failed=%x.\n", __func__, |
2448 | vha->host_no, rval)); | 2484 | vha->host_no, rval)); |
2485 | if (mcp->mb[0] == MBS_INVALID_COMMAND) | ||
2486 | rval = QLA_INVALID_COMMAND; | ||
2449 | } else { | 2487 | } else { |
2450 | DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); | 2488 | DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); |
2451 | } | 2489 | } |
@@ -2717,8 +2755,11 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha, | |||
2717 | if (vp_idx == 0) | 2755 | if (vp_idx == 0) |
2718 | return; | 2756 | return; |
2719 | 2757 | ||
2720 | if (MSB(stat) == 1) | 2758 | if (MSB(stat) == 1) { |
2759 | DEBUG2(printk("scsi(%ld): Could not acquire ID for " | ||
2760 | "VP[%d].\n", vha->host_no, vp_idx)); | ||
2721 | return; | 2761 | return; |
2762 | } | ||
2722 | 2763 | ||
2723 | list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) | 2764 | list_for_each_entry_safe(vp, tvp, &ha->vp_list, list) |
2724 | if (vp_idx == vp->vp_idx) | 2765 | if (vp_idx == vp->vp_idx) |
@@ -3141,6 +3182,8 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req) | |||
3141 | WRT_REG_DWORD(®->req_q_in, 0); | 3182 | WRT_REG_DWORD(®->req_q_in, 0); |
3142 | WRT_REG_DWORD(®->req_q_out, 0); | 3183 | WRT_REG_DWORD(®->req_q_out, 0); |
3143 | } | 3184 | } |
3185 | req->req_q_in = ®->req_q_in; | ||
3186 | req->req_q_out = ®->req_q_out; | ||
3144 | spin_unlock_irqrestore(&ha->hardware_lock, flags); | 3187 | spin_unlock_irqrestore(&ha->hardware_lock, flags); |
3145 | 3188 | ||
3146 | rval = qla2x00_mailbox_command(vha, mcp); | 3189 | rval = qla2x00_mailbox_command(vha, mcp); |
@@ -3167,7 +3210,6 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp) | |||
3167 | mcp->mb[6] = MSW(MSD(rsp->dma)); | 3210 | mcp->mb[6] = MSW(MSD(rsp->dma)); |
3168 | mcp->mb[7] = LSW(MSD(rsp->dma)); | 3211 | mcp->mb[7] = LSW(MSD(rsp->dma)); |
3169 | mcp->mb[5] = rsp->length; | 3212 | mcp->mb[5] = rsp->length; |
3170 | mcp->mb[11] = rsp->vp_idx; | ||
3171 | mcp->mb[14] = rsp->msix->entry; | 3213 | mcp->mb[14] = rsp->msix->entry; |
3172 | mcp->mb[13] = rsp->rid; | 3214 | mcp->mb[13] = rsp->rid; |
3173 | 3215 | ||
@@ -3179,7 +3221,7 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp) | |||
3179 | mcp->mb[8] = 0; | 3221 | mcp->mb[8] = 0; |
3180 | /* que out ptr index */ | 3222 | /* que out ptr index */ |
3181 | mcp->mb[9] = 0; | 3223 | mcp->mb[9] = 0; |
3182 | mcp->out_mb = MBX_14|MBX_13|MBX_12|MBX_11|MBX_10|MBX_9|MBX_8|MBX_7 | 3224 | mcp->out_mb = MBX_14|MBX_13|MBX_9|MBX_8|MBX_7 |
3183 | |MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; | 3225 | |MBX_6|MBX_5|MBX_4|MBX_3|MBX_2|MBX_1|MBX_0; |
3184 | mcp->in_mb = MBX_0; | 3226 | mcp->in_mb = MBX_0; |
3185 | mcp->flags = MBX_DMA_OUT; | 3227 | mcp->flags = MBX_DMA_OUT; |
@@ -3384,7 +3426,7 @@ qla2x00_read_edc(scsi_qla_host_t *vha, uint16_t dev, uint16_t adr, | |||
3384 | DEBUG2_3_11(printk("%s(%ld): failed=%x (%x).\n", __func__, | 3426 | DEBUG2_3_11(printk("%s(%ld): failed=%x (%x).\n", __func__, |
3385 | vha->host_no, rval, mcp->mb[0])); | 3427 | vha->host_no, rval, mcp->mb[0])); |
3386 | } else { | 3428 | } else { |
3387 | DEBUG11(printk("%s(%ld): done.\n", __func__, ha->host_no)); | 3429 | DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); |
3388 | } | 3430 | } |
3389 | 3431 | ||
3390 | return rval; | 3432 | return rval; |
@@ -3428,3 +3470,141 @@ qla2x00_write_edc(scsi_qla_host_t *vha, uint16_t dev, uint16_t adr, | |||
3428 | 3470 | ||
3429 | return rval; | 3471 | return rval; |
3430 | } | 3472 | } |
3473 | |||
3474 | int | ||
3475 | qla2x00_get_xgmac_stats(scsi_qla_host_t *vha, dma_addr_t stats_dma, | ||
3476 | uint16_t size_in_bytes, uint16_t *actual_size) | ||
3477 | { | ||
3478 | int rval; | ||
3479 | mbx_cmd_t mc; | ||
3480 | mbx_cmd_t *mcp = &mc; | ||
3481 | |||
3482 | if (!IS_QLA81XX(vha->hw)) | ||
3483 | return QLA_FUNCTION_FAILED; | ||
3484 | |||
3485 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); | ||
3486 | |||
3487 | mcp->mb[0] = MBC_GET_XGMAC_STATS; | ||
3488 | mcp->mb[2] = MSW(stats_dma); | ||
3489 | mcp->mb[3] = LSW(stats_dma); | ||
3490 | mcp->mb[6] = MSW(MSD(stats_dma)); | ||
3491 | mcp->mb[7] = LSW(MSD(stats_dma)); | ||
3492 | mcp->mb[8] = size_in_bytes >> 2; | ||
3493 | mcp->out_mb = MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_0; | ||
3494 | mcp->in_mb = MBX_2|MBX_1|MBX_0; | ||
3495 | mcp->tov = MBX_TOV_SECONDS; | ||
3496 | mcp->flags = 0; | ||
3497 | rval = qla2x00_mailbox_command(vha, mcp); | ||
3498 | |||
3499 | if (rval != QLA_SUCCESS) { | ||
3500 | DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=0x%x " | ||
3501 | "mb[1]=0x%x mb[2]=0x%x.\n", __func__, vha->host_no, rval, | ||
3502 | mcp->mb[0], mcp->mb[1], mcp->mb[2])); | ||
3503 | } else { | ||
3504 | DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); | ||
3505 | |||
3506 | *actual_size = mcp->mb[2] << 2; | ||
3507 | } | ||
3508 | |||
3509 | return rval; | ||
3510 | } | ||
3511 | |||
3512 | int | ||
3513 | qla2x00_get_dcbx_params(scsi_qla_host_t *vha, dma_addr_t tlv_dma, | ||
3514 | uint16_t size) | ||
3515 | { | ||
3516 | int rval; | ||
3517 | mbx_cmd_t mc; | ||
3518 | mbx_cmd_t *mcp = &mc; | ||
3519 | |||
3520 | if (!IS_QLA81XX(vha->hw)) | ||
3521 | return QLA_FUNCTION_FAILED; | ||
3522 | |||
3523 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); | ||
3524 | |||
3525 | mcp->mb[0] = MBC_GET_DCBX_PARAMS; | ||
3526 | mcp->mb[1] = 0; | ||
3527 | mcp->mb[2] = MSW(tlv_dma); | ||
3528 | mcp->mb[3] = LSW(tlv_dma); | ||
3529 | mcp->mb[6] = MSW(MSD(tlv_dma)); | ||
3530 | mcp->mb[7] = LSW(MSD(tlv_dma)); | ||
3531 | mcp->mb[8] = size; | ||
3532 | mcp->out_mb = MBX_8|MBX_7|MBX_6|MBX_3|MBX_2|MBX_1|MBX_0; | ||
3533 | mcp->in_mb = MBX_2|MBX_1|MBX_0; | ||
3534 | mcp->tov = MBX_TOV_SECONDS; | ||
3535 | mcp->flags = 0; | ||
3536 | rval = qla2x00_mailbox_command(vha, mcp); | ||
3537 | |||
3538 | if (rval != QLA_SUCCESS) { | ||
3539 | DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=0x%x " | ||
3540 | "mb[1]=0x%x mb[2]=0x%x.\n", __func__, vha->host_no, rval, | ||
3541 | mcp->mb[0], mcp->mb[1], mcp->mb[2])); | ||
3542 | } else { | ||
3543 | DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); | ||
3544 | } | ||
3545 | |||
3546 | return rval; | ||
3547 | } | ||
3548 | |||
3549 | int | ||
3550 | qla2x00_read_ram_word(scsi_qla_host_t *vha, uint32_t risc_addr, uint32_t *data) | ||
3551 | { | ||
3552 | int rval; | ||
3553 | mbx_cmd_t mc; | ||
3554 | mbx_cmd_t *mcp = &mc; | ||
3555 | |||
3556 | if (!IS_FWI2_CAPABLE(vha->hw)) | ||
3557 | return QLA_FUNCTION_FAILED; | ||
3558 | |||
3559 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); | ||
3560 | |||
3561 | mcp->mb[0] = MBC_READ_RAM_EXTENDED; | ||
3562 | mcp->mb[1] = LSW(risc_addr); | ||
3563 | mcp->mb[8] = MSW(risc_addr); | ||
3564 | mcp->out_mb = MBX_8|MBX_1|MBX_0; | ||
3565 | mcp->in_mb = MBX_3|MBX_2|MBX_0; | ||
3566 | mcp->tov = 30; | ||
3567 | mcp->flags = 0; | ||
3568 | rval = qla2x00_mailbox_command(vha, mcp); | ||
3569 | if (rval != QLA_SUCCESS) { | ||
3570 | DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n", __func__, | ||
3571 | vha->host_no, rval, mcp->mb[0])); | ||
3572 | } else { | ||
3573 | DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); | ||
3574 | *data = mcp->mb[3] << 16 | mcp->mb[2]; | ||
3575 | } | ||
3576 | |||
3577 | return rval; | ||
3578 | } | ||
3579 | |||
3580 | int | ||
3581 | qla2x00_write_ram_word(scsi_qla_host_t *vha, uint32_t risc_addr, uint32_t data) | ||
3582 | { | ||
3583 | int rval; | ||
3584 | mbx_cmd_t mc; | ||
3585 | mbx_cmd_t *mcp = &mc; | ||
3586 | |||
3587 | if (!IS_FWI2_CAPABLE(vha->hw)) | ||
3588 | return QLA_FUNCTION_FAILED; | ||
3589 | |||
3590 | DEBUG11(printk("%s(%ld): entered.\n", __func__, vha->host_no)); | ||
3591 | |||
3592 | mcp->mb[0] = MBC_WRITE_RAM_WORD_EXTENDED; | ||
3593 | mcp->mb[1] = LSW(risc_addr); | ||
3594 | mcp->mb[2] = LSW(data); | ||
3595 | mcp->mb[3] = MSW(data); | ||
3596 | mcp->mb[8] = MSW(risc_addr); | ||
3597 | mcp->out_mb = MBX_8|MBX_3|MBX_2|MBX_1|MBX_0; | ||
3598 | mcp->in_mb = MBX_0; | ||
3599 | mcp->tov = 30; | ||
3600 | mcp->flags = 0; | ||
3601 | rval = qla2x00_mailbox_command(vha, mcp); | ||
3602 | if (rval != QLA_SUCCESS) { | ||
3603 | DEBUG2_3_11(printk("%s(%ld): failed=%x mb[0]=%x.\n", __func__, | ||
3604 | vha->host_no, rval, mcp->mb[0])); | ||
3605 | } else { | ||
3606 | DEBUG11(printk("%s(%ld): done.\n", __func__, vha->host_no)); | ||
3607 | } | ||
3608 | |||
3609 | return rval; | ||
3610 | } | ||