diff options
Diffstat (limited to 'drivers/scsi/qla2xxx')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_attr.c | 3 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_bsg.c | 72 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_dbg.c | 8 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_def.h | 4 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_fw.h | 21 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_gbl.h | 3 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_gs.c | 6 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_init.c | 153 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_iocb.c | 15 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_isr.c | 38 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_mbx.c | 6 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_nx.c | 79 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_os.c | 57 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_target.c | 2 | ||||
-rw-r--r-- | drivers/scsi/qla2xxx/qla_version.h | 2 |
15 files changed, 243 insertions, 226 deletions
diff --git a/drivers/scsi/qla2xxx/qla_attr.c b/drivers/scsi/qla2xxx/qla_attr.c index 1c28215f8bed..83d798428c10 100644 --- a/drivers/scsi/qla2xxx/qla_attr.c +++ b/drivers/scsi/qla2xxx/qla_attr.c | |||
@@ -1615,8 +1615,7 @@ qla2x00_terminate_rport_io(struct fc_rport *rport) | |||
1615 | * At this point all fcport's software-states are cleared. Perform any | 1615 | * At this point all fcport's software-states are cleared. Perform any |
1616 | * final cleanup of firmware resources (PCBs and XCBs). | 1616 | * final cleanup of firmware resources (PCBs and XCBs). |
1617 | */ | 1617 | */ |
1618 | if (fcport->loop_id != FC_NO_LOOP_ID && | 1618 | if (fcport->loop_id != FC_NO_LOOP_ID) { |
1619 | !test_bit(UNLOADING, &fcport->vha->dpc_flags)) { | ||
1620 | if (IS_FWI2_CAPABLE(fcport->vha->hw)) | 1619 | if (IS_FWI2_CAPABLE(fcport->vha->hw)) |
1621 | fcport->vha->hw->isp_ops->fabric_logout(fcport->vha, | 1620 | fcport->vha->hw->isp_ops->fabric_logout(fcport->vha, |
1622 | fcport->loop_id, fcport->d_id.b.domain, | 1621 | fcport->loop_id, fcport->d_id.b.domain, |
diff --git a/drivers/scsi/qla2xxx/qla_bsg.c b/drivers/scsi/qla2xxx/qla_bsg.c index 2f9bddd3c616..9f34dedcdad7 100644 --- a/drivers/scsi/qla2xxx/qla_bsg.c +++ b/drivers/scsi/qla2xxx/qla_bsg.c | |||
@@ -219,7 +219,8 @@ qla24xx_proc_fcp_prio_cfg_cmd(struct fc_bsg_job *bsg_job) | |||
219 | break; | 219 | break; |
220 | } | 220 | } |
221 | exit_fcp_prio_cfg: | 221 | exit_fcp_prio_cfg: |
222 | bsg_job->job_done(bsg_job); | 222 | if (!ret) |
223 | bsg_job->job_done(bsg_job); | ||
223 | return ret; | 224 | return ret; |
224 | } | 225 | } |
225 | 226 | ||
@@ -741,9 +742,8 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job) | |||
741 | if (qla81xx_get_port_config(vha, config)) { | 742 | if (qla81xx_get_port_config(vha, config)) { |
742 | ql_log(ql_log_warn, vha, 0x701f, | 743 | ql_log(ql_log_warn, vha, 0x701f, |
743 | "Get port config failed.\n"); | 744 | "Get port config failed.\n"); |
744 | bsg_job->reply->result = (DID_ERROR << 16); | ||
745 | rval = -EPERM; | 745 | rval = -EPERM; |
746 | goto done_free_dma_req; | 746 | goto done_free_dma_rsp; |
747 | } | 747 | } |
748 | 748 | ||
749 | ql_dbg(ql_dbg_user, vha, 0x70c0, | 749 | ql_dbg(ql_dbg_user, vha, 0x70c0, |
@@ -761,9 +761,8 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job) | |||
761 | new_config, elreq.options); | 761 | new_config, elreq.options); |
762 | 762 | ||
763 | if (rval) { | 763 | if (rval) { |
764 | bsg_job->reply->result = (DID_ERROR << 16); | ||
765 | rval = -EPERM; | 764 | rval = -EPERM; |
766 | goto done_free_dma_req; | 765 | goto done_free_dma_rsp; |
767 | } | 766 | } |
768 | 767 | ||
769 | type = "FC_BSG_HST_VENDOR_LOOPBACK"; | 768 | type = "FC_BSG_HST_VENDOR_LOOPBACK"; |
@@ -795,9 +794,8 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job) | |||
795 | "MPI reset failed.\n"); | 794 | "MPI reset failed.\n"); |
796 | } | 795 | } |
797 | 796 | ||
798 | bsg_job->reply->result = (DID_ERROR << 16); | ||
799 | rval = -EIO; | 797 | rval = -EIO; |
800 | goto done_free_dma_req; | 798 | goto done_free_dma_rsp; |
801 | } | 799 | } |
802 | } else { | 800 | } else { |
803 | type = "FC_BSG_HST_VENDOR_LOOPBACK"; | 801 | type = "FC_BSG_HST_VENDOR_LOOPBACK"; |
@@ -812,34 +810,27 @@ qla2x00_process_loopback(struct fc_bsg_job *bsg_job) | |||
812 | ql_log(ql_log_warn, vha, 0x702c, | 810 | ql_log(ql_log_warn, vha, 0x702c, |
813 | "Vendor request %s failed.\n", type); | 811 | "Vendor request %s failed.\n", type); |
814 | 812 | ||
815 | fw_sts_ptr = ((uint8_t *)bsg_job->req->sense) + | ||
816 | sizeof(struct fc_bsg_reply); | ||
817 | |||
818 | memcpy(fw_sts_ptr, response, sizeof(response)); | ||
819 | fw_sts_ptr += sizeof(response); | ||
820 | *fw_sts_ptr = command_sent; | ||
821 | rval = 0; | 813 | rval = 0; |
822 | bsg_job->reply->result = (DID_ERROR << 16); | 814 | bsg_job->reply->result = (DID_ERROR << 16); |
815 | bsg_job->reply->reply_payload_rcv_len = 0; | ||
823 | } else { | 816 | } else { |
824 | ql_dbg(ql_dbg_user, vha, 0x702d, | 817 | ql_dbg(ql_dbg_user, vha, 0x702d, |
825 | "Vendor request %s completed.\n", type); | 818 | "Vendor request %s completed.\n", type); |
826 | 819 | bsg_job->reply->result = (DID_OK << 16); | |
827 | bsg_job->reply_len = sizeof(struct fc_bsg_reply) + | ||
828 | sizeof(response) + sizeof(uint8_t); | ||
829 | bsg_job->reply->reply_payload_rcv_len = | ||
830 | bsg_job->reply_payload.payload_len; | ||
831 | fw_sts_ptr = ((uint8_t *)bsg_job->req->sense) + | ||
832 | sizeof(struct fc_bsg_reply); | ||
833 | memcpy(fw_sts_ptr, response, sizeof(response)); | ||
834 | fw_sts_ptr += sizeof(response); | ||
835 | *fw_sts_ptr = command_sent; | ||
836 | bsg_job->reply->result = DID_OK; | ||
837 | sg_copy_from_buffer(bsg_job->reply_payload.sg_list, | 820 | sg_copy_from_buffer(bsg_job->reply_payload.sg_list, |
838 | bsg_job->reply_payload.sg_cnt, rsp_data, | 821 | bsg_job->reply_payload.sg_cnt, rsp_data, |
839 | rsp_data_len); | 822 | rsp_data_len); |
840 | } | 823 | } |
841 | bsg_job->job_done(bsg_job); | ||
842 | 824 | ||
825 | bsg_job->reply_len = sizeof(struct fc_bsg_reply) + | ||
826 | sizeof(response) + sizeof(uint8_t); | ||
827 | fw_sts_ptr = ((uint8_t *)bsg_job->req->sense) + | ||
828 | sizeof(struct fc_bsg_reply); | ||
829 | memcpy(fw_sts_ptr, response, sizeof(response)); | ||
830 | fw_sts_ptr += sizeof(response); | ||
831 | *fw_sts_ptr = command_sent; | ||
832 | |||
833 | done_free_dma_rsp: | ||
843 | dma_free_coherent(&ha->pdev->dev, rsp_data_len, | 834 | dma_free_coherent(&ha->pdev->dev, rsp_data_len, |
844 | rsp_data, rsp_data_dma); | 835 | rsp_data, rsp_data_dma); |
845 | done_free_dma_req: | 836 | done_free_dma_req: |
@@ -853,6 +844,8 @@ done_unmap_req_sg: | |||
853 | dma_unmap_sg(&ha->pdev->dev, | 844 | dma_unmap_sg(&ha->pdev->dev, |
854 | bsg_job->request_payload.sg_list, | 845 | bsg_job->request_payload.sg_list, |
855 | bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE); | 846 | bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE); |
847 | if (!rval) | ||
848 | bsg_job->job_done(bsg_job); | ||
856 | return rval; | 849 | return rval; |
857 | } | 850 | } |
858 | 851 | ||
@@ -877,16 +870,15 @@ qla84xx_reset(struct fc_bsg_job *bsg_job) | |||
877 | if (rval) { | 870 | if (rval) { |
878 | ql_log(ql_log_warn, vha, 0x7030, | 871 | ql_log(ql_log_warn, vha, 0x7030, |
879 | "Vendor request 84xx reset failed.\n"); | 872 | "Vendor request 84xx reset failed.\n"); |
880 | rval = 0; | 873 | rval = (DID_ERROR << 16); |
881 | bsg_job->reply->result = (DID_ERROR << 16); | ||
882 | 874 | ||
883 | } else { | 875 | } else { |
884 | ql_dbg(ql_dbg_user, vha, 0x7031, | 876 | ql_dbg(ql_dbg_user, vha, 0x7031, |
885 | "Vendor request 84xx reset completed.\n"); | 877 | "Vendor request 84xx reset completed.\n"); |
886 | bsg_job->reply->result = DID_OK; | 878 | bsg_job->reply->result = DID_OK; |
879 | bsg_job->job_done(bsg_job); | ||
887 | } | 880 | } |
888 | 881 | ||
889 | bsg_job->job_done(bsg_job); | ||
890 | return rval; | 882 | return rval; |
891 | } | 883 | } |
892 | 884 | ||
@@ -976,8 +968,7 @@ qla84xx_updatefw(struct fc_bsg_job *bsg_job) | |||
976 | ql_log(ql_log_warn, vha, 0x7037, | 968 | ql_log(ql_log_warn, vha, 0x7037, |
977 | "Vendor request 84xx updatefw failed.\n"); | 969 | "Vendor request 84xx updatefw failed.\n"); |
978 | 970 | ||
979 | rval = 0; | 971 | rval = (DID_ERROR << 16); |
980 | bsg_job->reply->result = (DID_ERROR << 16); | ||
981 | } else { | 972 | } else { |
982 | ql_dbg(ql_dbg_user, vha, 0x7038, | 973 | ql_dbg(ql_dbg_user, vha, 0x7038, |
983 | "Vendor request 84xx updatefw completed.\n"); | 974 | "Vendor request 84xx updatefw completed.\n"); |
@@ -986,7 +977,6 @@ qla84xx_updatefw(struct fc_bsg_job *bsg_job) | |||
986 | bsg_job->reply->result = DID_OK; | 977 | bsg_job->reply->result = DID_OK; |
987 | } | 978 | } |
988 | 979 | ||
989 | bsg_job->job_done(bsg_job); | ||
990 | dma_pool_free(ha->s_dma_pool, mn, mn_dma); | 980 | dma_pool_free(ha->s_dma_pool, mn, mn_dma); |
991 | 981 | ||
992 | done_free_fw_buf: | 982 | done_free_fw_buf: |
@@ -996,6 +986,8 @@ done_unmap_sg: | |||
996 | dma_unmap_sg(&ha->pdev->dev, bsg_job->request_payload.sg_list, | 986 | dma_unmap_sg(&ha->pdev->dev, bsg_job->request_payload.sg_list, |
997 | bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE); | 987 | bsg_job->request_payload.sg_cnt, DMA_TO_DEVICE); |
998 | 988 | ||
989 | if (!rval) | ||
990 | bsg_job->job_done(bsg_job); | ||
999 | return rval; | 991 | return rval; |
1000 | } | 992 | } |
1001 | 993 | ||
@@ -1163,8 +1155,7 @@ qla84xx_mgmt_cmd(struct fc_bsg_job *bsg_job) | |||
1163 | ql_log(ql_log_warn, vha, 0x7043, | 1155 | ql_log(ql_log_warn, vha, 0x7043, |
1164 | "Vendor request 84xx mgmt failed.\n"); | 1156 | "Vendor request 84xx mgmt failed.\n"); |
1165 | 1157 | ||
1166 | rval = 0; | 1158 | rval = (DID_ERROR << 16); |
1167 | bsg_job->reply->result = (DID_ERROR << 16); | ||
1168 | 1159 | ||
1169 | } else { | 1160 | } else { |
1170 | ql_dbg(ql_dbg_user, vha, 0x7044, | 1161 | ql_dbg(ql_dbg_user, vha, 0x7044, |
@@ -1184,8 +1175,6 @@ qla84xx_mgmt_cmd(struct fc_bsg_job *bsg_job) | |||
1184 | } | 1175 | } |
1185 | } | 1176 | } |
1186 | 1177 | ||
1187 | bsg_job->job_done(bsg_job); | ||
1188 | |||
1189 | done_unmap_sg: | 1178 | done_unmap_sg: |
1190 | if (mgmt_b) | 1179 | if (mgmt_b) |
1191 | dma_free_coherent(&ha->pdev->dev, data_len, mgmt_b, mgmt_dma); | 1180 | dma_free_coherent(&ha->pdev->dev, data_len, mgmt_b, mgmt_dma); |
@@ -1200,6 +1189,8 @@ done_unmap_sg: | |||
1200 | exit_mgmt: | 1189 | exit_mgmt: |
1201 | dma_pool_free(ha->s_dma_pool, mn, mn_dma); | 1190 | dma_pool_free(ha->s_dma_pool, mn, mn_dma); |
1202 | 1191 | ||
1192 | if (!rval) | ||
1193 | bsg_job->job_done(bsg_job); | ||
1203 | return rval; | 1194 | return rval; |
1204 | } | 1195 | } |
1205 | 1196 | ||
@@ -1276,9 +1267,7 @@ qla24xx_iidma(struct fc_bsg_job *bsg_job) | |||
1276 | fcport->port_name[3], fcport->port_name[4], | 1267 | fcport->port_name[3], fcport->port_name[4], |
1277 | fcport->port_name[5], fcport->port_name[6], | 1268 | fcport->port_name[5], fcport->port_name[6], |
1278 | fcport->port_name[7], rval, fcport->fp_speed, mb[0], mb[1]); | 1269 | fcport->port_name[7], rval, fcport->fp_speed, mb[0], mb[1]); |
1279 | rval = 0; | 1270 | rval = (DID_ERROR << 16); |
1280 | bsg_job->reply->result = (DID_ERROR << 16); | ||
1281 | |||
1282 | } else { | 1271 | } else { |
1283 | if (!port_param->mode) { | 1272 | if (!port_param->mode) { |
1284 | bsg_job->reply_len = sizeof(struct fc_bsg_reply) + | 1273 | bsg_job->reply_len = sizeof(struct fc_bsg_reply) + |
@@ -1292,9 +1281,9 @@ qla24xx_iidma(struct fc_bsg_job *bsg_job) | |||
1292 | } | 1281 | } |
1293 | 1282 | ||
1294 | bsg_job->reply->result = DID_OK; | 1283 | bsg_job->reply->result = DID_OK; |
1284 | bsg_job->job_done(bsg_job); | ||
1295 | } | 1285 | } |
1296 | 1286 | ||
1297 | bsg_job->job_done(bsg_job); | ||
1298 | return rval; | 1287 | return rval; |
1299 | } | 1288 | } |
1300 | 1289 | ||
@@ -1887,8 +1876,6 @@ qla2x00_process_vendor_specific(struct fc_bsg_job *bsg_job) | |||
1887 | return qla24xx_process_bidir_cmd(bsg_job); | 1876 | return qla24xx_process_bidir_cmd(bsg_job); |
1888 | 1877 | ||
1889 | default: | 1878 | default: |
1890 | bsg_job->reply->result = (DID_ERROR << 16); | ||
1891 | bsg_job->job_done(bsg_job); | ||
1892 | return -ENOSYS; | 1879 | return -ENOSYS; |
1893 | } | 1880 | } |
1894 | } | 1881 | } |
@@ -1919,8 +1906,6 @@ qla24xx_bsg_request(struct fc_bsg_job *bsg_job) | |||
1919 | ql_dbg(ql_dbg_user, vha, 0x709f, | 1906 | ql_dbg(ql_dbg_user, vha, 0x709f, |
1920 | "BSG: ISP abort active/needed -- cmd=%d.\n", | 1907 | "BSG: ISP abort active/needed -- cmd=%d.\n", |
1921 | bsg_job->request->msgcode); | 1908 | bsg_job->request->msgcode); |
1922 | bsg_job->reply->result = (DID_ERROR << 16); | ||
1923 | bsg_job->job_done(bsg_job); | ||
1924 | return -EBUSY; | 1909 | return -EBUSY; |
1925 | } | 1910 | } |
1926 | 1911 | ||
@@ -1943,7 +1928,6 @@ qla24xx_bsg_request(struct fc_bsg_job *bsg_job) | |||
1943 | case FC_BSG_RPT_CT: | 1928 | case FC_BSG_RPT_CT: |
1944 | default: | 1929 | default: |
1945 | ql_log(ql_log_warn, vha, 0x705a, "Unsupported BSG request.\n"); | 1930 | ql_log(ql_log_warn, vha, 0x705a, "Unsupported BSG request.\n"); |
1946 | bsg_job->reply->result = ret; | ||
1947 | break; | 1931 | break; |
1948 | } | 1932 | } |
1949 | return ret; | 1933 | return ret; |
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c index 44efe3cc79e6..53f9e492f9dc 100644 --- a/drivers/scsi/qla2xxx/qla_dbg.c +++ b/drivers/scsi/qla2xxx/qla_dbg.c | |||
@@ -11,7 +11,7 @@ | |||
11 | * ---------------------------------------------------------------------- | 11 | * ---------------------------------------------------------------------- |
12 | * | Level | Last Value Used | Holes | | 12 | * | Level | Last Value Used | Holes | |
13 | * ---------------------------------------------------------------------- | 13 | * ---------------------------------------------------------------------- |
14 | * | Module Init and Probe | 0x0124 | 0x4b,0xba,0xfa | | 14 | * | Module Init and Probe | 0x0125 | 0x4b,0xba,0xfa | |
15 | * | Mailbox commands | 0x114f | 0x111a-0x111b | | 15 | * | Mailbox commands | 0x114f | 0x111a-0x111b | |
16 | * | | | 0x112c-0x112e | | 16 | * | | | 0x112c-0x112e | |
17 | * | | | 0x113a | | 17 | * | | | 0x113a | |
@@ -526,8 +526,8 @@ qla25xx_copy_mq(struct qla_hw_data *ha, void *ptr, uint32_t **last_chain) | |||
526 | ha->max_req_queues : ha->max_rsp_queues; | 526 | ha->max_req_queues : ha->max_rsp_queues; |
527 | mq->count = htonl(que_cnt); | 527 | mq->count = htonl(que_cnt); |
528 | for (cnt = 0; cnt < que_cnt; cnt++) { | 528 | for (cnt = 0; cnt < que_cnt; cnt++) { |
529 | reg = (struct device_reg_25xxmq *) ((void *) | 529 | reg = (struct device_reg_25xxmq __iomem *) |
530 | ha->mqiobase + cnt * QLA_QUE_PAGE); | 530 | (ha->mqiobase + cnt * QLA_QUE_PAGE); |
531 | que_idx = cnt * 4; | 531 | que_idx = cnt * 4; |
532 | mq->qregs[que_idx] = htonl(RD_REG_DWORD(®->req_q_in)); | 532 | mq->qregs[que_idx] = htonl(RD_REG_DWORD(®->req_q_in)); |
533 | mq->qregs[que_idx+1] = htonl(RD_REG_DWORD(®->req_q_out)); | 533 | mq->qregs[que_idx+1] = htonl(RD_REG_DWORD(®->req_q_out)); |
@@ -2268,7 +2268,7 @@ qla83xx_fw_dump(scsi_qla_host_t *vha, int hardware_locked) | |||
2268 | 2268 | ||
2269 | if (!cnt) { | 2269 | if (!cnt) { |
2270 | nxt = fw->code_ram; | 2270 | nxt = fw->code_ram; |
2271 | nxt += sizeof(fw->code_ram), | 2271 | nxt += sizeof(fw->code_ram); |
2272 | nxt += (ha->fw_memory_size - 0x100000 + 1); | 2272 | nxt += (ha->fw_memory_size - 0x100000 + 1); |
2273 | goto copy_queue; | 2273 | goto copy_queue; |
2274 | } else | 2274 | } else |
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h index a9725bf5527b..6e7727f46d43 100644 --- a/drivers/scsi/qla2xxx/qla_def.h +++ b/drivers/scsi/qla2xxx/qla_def.h | |||
@@ -2486,9 +2486,9 @@ struct bidi_statistics { | |||
2486 | #define QLA_MAX_QUEUES 256 | 2486 | #define QLA_MAX_QUEUES 256 |
2487 | #define ISP_QUE_REG(ha, id) \ | 2487 | #define ISP_QUE_REG(ha, id) \ |
2488 | ((ha->mqenable || IS_QLA83XX(ha)) ? \ | 2488 | ((ha->mqenable || IS_QLA83XX(ha)) ? \ |
2489 | ((void *)(ha->mqiobase) +\ | 2489 | ((device_reg_t __iomem *)(ha->mqiobase) +\ |
2490 | (QLA_QUE_PAGE * id)) :\ | 2490 | (QLA_QUE_PAGE * id)) :\ |
2491 | ((void *)(ha->iobase))) | 2491 | ((device_reg_t __iomem *)(ha->iobase))) |
2492 | #define QLA_REQ_QUE_ID(tag) \ | 2492 | #define QLA_REQ_QUE_ID(tag) \ |
2493 | ((tag < QLA_MAX_QUEUES && tag > 0) ? tag : 0) | 2493 | ((tag < QLA_MAX_QUEUES && tag > 0) ? tag : 0) |
2494 | #define QLA_DEFAULT_QUE_QOS 5 | 2494 | #define QLA_DEFAULT_QUE_QOS 5 |
diff --git a/drivers/scsi/qla2xxx/qla_fw.h b/drivers/scsi/qla2xxx/qla_fw.h index 59524aa0ab32..be6d61a89edc 100644 --- a/drivers/scsi/qla2xxx/qla_fw.h +++ b/drivers/scsi/qla2xxx/qla_fw.h | |||
@@ -1092,6 +1092,27 @@ struct device_reg_24xx { | |||
1092 | uint32_t unused_6[2]; /* Gap. */ | 1092 | uint32_t unused_6[2]; /* Gap. */ |
1093 | uint32_t iobase_sdata; | 1093 | uint32_t iobase_sdata; |
1094 | }; | 1094 | }; |
1095 | /* RISC-RISC semaphore register PCI offet */ | ||
1096 | #define RISC_REGISTER_BASE_OFFSET 0x7010 | ||
1097 | #define RISC_REGISTER_WINDOW_OFFET 0x6 | ||
1098 | |||
1099 | /* RISC-RISC semaphore/flag register (risc address 0x7016) */ | ||
1100 | |||
1101 | #define RISC_SEMAPHORE 0x1UL | ||
1102 | #define RISC_SEMAPHORE_WE (RISC_SEMAPHORE << 16) | ||
1103 | #define RISC_SEMAPHORE_CLR (RISC_SEMAPHORE_WE | 0x0UL) | ||
1104 | #define RISC_SEMAPHORE_SET (RISC_SEMAPHORE_WE | RISC_SEMAPHORE) | ||
1105 | |||
1106 | #define RISC_SEMAPHORE_FORCE 0x8000UL | ||
1107 | #define RISC_SEMAPHORE_FORCE_WE (RISC_SEMAPHORE_FORCE << 16) | ||
1108 | #define RISC_SEMAPHORE_FORCE_CLR (RISC_SEMAPHORE_FORCE_WE | 0x0UL) | ||
1109 | #define RISC_SEMAPHORE_FORCE_SET \ | ||
1110 | (RISC_SEMAPHORE_FORCE_WE | RISC_SEMAPHORE_FORCE) | ||
1111 | |||
1112 | /* RISC semaphore timeouts (ms) */ | ||
1113 | #define TIMEOUT_SEMAPHORE 2500 | ||
1114 | #define TIMEOUT_SEMAPHORE_FORCE 2000 | ||
1115 | #define TIMEOUT_TOTAL_ELAPSED 4500 | ||
1095 | 1116 | ||
1096 | /* Trace Control *************************************************************/ | 1117 | /* Trace Control *************************************************************/ |
1097 | 1118 | ||
diff --git a/drivers/scsi/qla2xxx/qla_gbl.h b/drivers/scsi/qla2xxx/qla_gbl.h index 6acb39785a46..2411d1a12b26 100644 --- a/drivers/scsi/qla2xxx/qla_gbl.h +++ b/drivers/scsi/qla2xxx/qla_gbl.h | |||
@@ -416,7 +416,7 @@ extern int qla2x00_request_irqs(struct qla_hw_data *, struct rsp_que *); | |||
416 | extern void qla2x00_free_irqs(scsi_qla_host_t *); | 416 | extern void qla2x00_free_irqs(scsi_qla_host_t *); |
417 | 417 | ||
418 | extern int qla2x00_get_data_rate(scsi_qla_host_t *); | 418 | extern int qla2x00_get_data_rate(scsi_qla_host_t *); |
419 | extern char *qla2x00_get_link_speed_str(struct qla_hw_data *); | 419 | extern const char *qla2x00_get_link_speed_str(struct qla_hw_data *, uint16_t); |
420 | 420 | ||
421 | /* | 421 | /* |
422 | * Global Function Prototypes in qla_sup.c source file. | 422 | * Global Function Prototypes in qla_sup.c source file. |
@@ -598,7 +598,6 @@ extern void qla82xx_init_flags(struct qla_hw_data *); | |||
598 | 598 | ||
599 | /* ISP 8021 hardware related */ | 599 | /* ISP 8021 hardware related */ |
600 | extern void qla82xx_set_drv_active(scsi_qla_host_t *); | 600 | extern void qla82xx_set_drv_active(scsi_qla_host_t *); |
601 | extern void qla82xx_crb_win_unlock(struct qla_hw_data *); | ||
602 | extern int qla82xx_wr_32(struct qla_hw_data *, ulong, u32); | 601 | extern int qla82xx_wr_32(struct qla_hw_data *, ulong, u32); |
603 | extern int qla82xx_rd_32(struct qla_hw_data *, ulong); | 602 | extern int qla82xx_rd_32(struct qla_hw_data *, ulong); |
604 | extern int qla82xx_rdmem(struct qla_hw_data *, u64, void *, int); | 603 | extern int qla82xx_rdmem(struct qla_hw_data *, u64, void *, int); |
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c index f4e4bd7c3f4d..01efc0e9cc36 100644 --- a/drivers/scsi/qla2xxx/qla_gs.c +++ b/drivers/scsi/qla2xxx/qla_gs.c | |||
@@ -218,6 +218,9 @@ qla2x00_ga_nxt(scsi_qla_host_t *vha, fc_port_t *fcport) | |||
218 | memcpy(fcport->port_name, ct_rsp->rsp.ga_nxt.port_name, | 218 | memcpy(fcport->port_name, ct_rsp->rsp.ga_nxt.port_name, |
219 | WWN_SIZE); | 219 | WWN_SIZE); |
220 | 220 | ||
221 | fcport->fc4_type = (ct_rsp->rsp.ga_nxt.fc4_types[2] & BIT_0) ? | ||
222 | FC4_TYPE_FCP_SCSI : FC4_TYPE_OTHER; | ||
223 | |||
221 | if (ct_rsp->rsp.ga_nxt.port_type != NS_N_PORT_TYPE && | 224 | if (ct_rsp->rsp.ga_nxt.port_type != NS_N_PORT_TYPE && |
222 | ct_rsp->rsp.ga_nxt.port_type != NS_NL_PORT_TYPE) | 225 | ct_rsp->rsp.ga_nxt.port_type != NS_NL_PORT_TYPE) |
223 | fcport->d_id.b.domain = 0xf0; | 226 | fcport->d_id.b.domain = 0xf0; |
@@ -1930,6 +1933,9 @@ qla2x00_gpsc(scsi_qla_host_t *vha, sw_info_t *list) | |||
1930 | case BIT_11: | 1933 | case BIT_11: |
1931 | list[i].fp_speed = PORT_SPEED_8GB; | 1934 | list[i].fp_speed = PORT_SPEED_8GB; |
1932 | break; | 1935 | break; |
1936 | case BIT_10: | ||
1937 | list[i].fp_speed = PORT_SPEED_16GB; | ||
1938 | break; | ||
1933 | } | 1939 | } |
1934 | 1940 | ||
1935 | ql_dbg(ql_dbg_disc, vha, 0x205b, | 1941 | ql_dbg(ql_dbg_disc, vha, 0x205b, |
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c index 48fca47384b7..563eee3fa924 100644 --- a/drivers/scsi/qla2xxx/qla_init.c +++ b/drivers/scsi/qla2xxx/qla_init.c | |||
@@ -429,7 +429,7 @@ qla2x00_async_adisc_done(struct scsi_qla_host *vha, fc_port_t *fcport, | |||
429 | /* QLogic ISP2x00 Hardware Support Functions. */ | 429 | /* QLogic ISP2x00 Hardware Support Functions. */ |
430 | /****************************************************************************/ | 430 | /****************************************************************************/ |
431 | 431 | ||
432 | int | 432 | static int |
433 | qla83xx_nic_core_fw_load(scsi_qla_host_t *vha) | 433 | qla83xx_nic_core_fw_load(scsi_qla_host_t *vha) |
434 | { | 434 | { |
435 | int rval = QLA_SUCCESS; | 435 | int rval = QLA_SUCCESS; |
@@ -997,7 +997,7 @@ qla2x00_reset_chip(scsi_qla_host_t *vha) | |||
997 | * | 997 | * |
998 | * Returns 0 on success. | 998 | * Returns 0 on success. |
999 | */ | 999 | */ |
1000 | int | 1000 | static int |
1001 | qla81xx_reset_mpi(scsi_qla_host_t *vha) | 1001 | qla81xx_reset_mpi(scsi_qla_host_t *vha) |
1002 | { | 1002 | { |
1003 | uint16_t mb[4] = {0x1010, 0, 1, 0}; | 1003 | uint16_t mb[4] = {0x1010, 0, 1, 0}; |
@@ -1095,6 +1095,83 @@ qla24xx_reset_risc(scsi_qla_host_t *vha) | |||
1095 | ha->isp_ops->enable_intrs(ha); | 1095 | ha->isp_ops->enable_intrs(ha); |
1096 | } | 1096 | } |
1097 | 1097 | ||
1098 | static void | ||
1099 | qla25xx_read_risc_sema_reg(scsi_qla_host_t *vha, uint32_t *data) | ||
1100 | { | ||
1101 | struct device_reg_24xx __iomem *reg = &vha->hw->iobase->isp24; | ||
1102 | |||
1103 | WRT_REG_DWORD(®->iobase_addr, RISC_REGISTER_BASE_OFFSET); | ||
1104 | *data = RD_REG_DWORD(®->iobase_window + RISC_REGISTER_WINDOW_OFFET); | ||
1105 | |||
1106 | } | ||
1107 | |||
1108 | static void | ||
1109 | qla25xx_write_risc_sema_reg(scsi_qla_host_t *vha, uint32_t data) | ||
1110 | { | ||
1111 | struct device_reg_24xx __iomem *reg = &vha->hw->iobase->isp24; | ||
1112 | |||
1113 | WRT_REG_DWORD(®->iobase_addr, RISC_REGISTER_BASE_OFFSET); | ||
1114 | WRT_REG_DWORD(®->iobase_window + RISC_REGISTER_WINDOW_OFFET, data); | ||
1115 | } | ||
1116 | |||
1117 | static void | ||
1118 | qla25xx_manipulate_risc_semaphore(scsi_qla_host_t *vha) | ||
1119 | { | ||
1120 | struct qla_hw_data *ha = vha->hw; | ||
1121 | uint32_t wd32 = 0; | ||
1122 | uint delta_msec = 100; | ||
1123 | uint elapsed_msec = 0; | ||
1124 | uint timeout_msec; | ||
1125 | ulong n; | ||
1126 | |||
1127 | if (!IS_QLA25XX(ha) && !IS_QLA2031(ha)) | ||
1128 | return; | ||
1129 | |||
1130 | attempt: | ||
1131 | timeout_msec = TIMEOUT_SEMAPHORE; | ||
1132 | n = timeout_msec / delta_msec; | ||
1133 | while (n--) { | ||
1134 | qla25xx_write_risc_sema_reg(vha, RISC_SEMAPHORE_SET); | ||
1135 | qla25xx_read_risc_sema_reg(vha, &wd32); | ||
1136 | if (wd32 & RISC_SEMAPHORE) | ||
1137 | break; | ||
1138 | msleep(delta_msec); | ||
1139 | elapsed_msec += delta_msec; | ||
1140 | if (elapsed_msec > TIMEOUT_TOTAL_ELAPSED) | ||
1141 | goto force; | ||
1142 | } | ||
1143 | |||
1144 | if (!(wd32 & RISC_SEMAPHORE)) | ||
1145 | goto force; | ||
1146 | |||
1147 | if (!(wd32 & RISC_SEMAPHORE_FORCE)) | ||
1148 | goto acquired; | ||
1149 | |||
1150 | qla25xx_write_risc_sema_reg(vha, RISC_SEMAPHORE_CLR); | ||
1151 | timeout_msec = TIMEOUT_SEMAPHORE_FORCE; | ||
1152 | n = timeout_msec / delta_msec; | ||
1153 | while (n--) { | ||
1154 | qla25xx_read_risc_sema_reg(vha, &wd32); | ||
1155 | if (!(wd32 & RISC_SEMAPHORE_FORCE)) | ||
1156 | break; | ||
1157 | msleep(delta_msec); | ||
1158 | elapsed_msec += delta_msec; | ||
1159 | if (elapsed_msec > TIMEOUT_TOTAL_ELAPSED) | ||
1160 | goto force; | ||
1161 | } | ||
1162 | |||
1163 | if (wd32 & RISC_SEMAPHORE_FORCE) | ||
1164 | qla25xx_write_risc_sema_reg(vha, RISC_SEMAPHORE_FORCE_CLR); | ||
1165 | |||
1166 | goto attempt; | ||
1167 | |||
1168 | force: | ||
1169 | qla25xx_write_risc_sema_reg(vha, RISC_SEMAPHORE_FORCE_SET); | ||
1170 | |||
1171 | acquired: | ||
1172 | return; | ||
1173 | } | ||
1174 | |||
1098 | /** | 1175 | /** |
1099 | * qla24xx_reset_chip() - Reset ISP24xx chip. | 1176 | * qla24xx_reset_chip() - Reset ISP24xx chip. |
1100 | * @ha: HA context | 1177 | * @ha: HA context |
@@ -1113,6 +1190,8 @@ qla24xx_reset_chip(scsi_qla_host_t *vha) | |||
1113 | 1190 | ||
1114 | ha->isp_ops->disable_intrs(ha); | 1191 | ha->isp_ops->disable_intrs(ha); |
1115 | 1192 | ||
1193 | qla25xx_manipulate_risc_semaphore(vha); | ||
1194 | |||
1116 | /* Perform RISC reset. */ | 1195 | /* Perform RISC reset. */ |
1117 | qla24xx_reset_risc(vha); | 1196 | qla24xx_reset_risc(vha); |
1118 | } | 1197 | } |
@@ -1888,10 +1967,6 @@ qla2x00_init_rings(scsi_qla_host_t *vha) | |||
1888 | qla2x00_init_response_q_entries(rsp); | 1967 | qla2x00_init_response_q_entries(rsp); |
1889 | } | 1968 | } |
1890 | 1969 | ||
1891 | spin_lock(&ha->vport_slock); | ||
1892 | |||
1893 | spin_unlock(&ha->vport_slock); | ||
1894 | |||
1895 | ha->tgt.atio_ring_ptr = ha->tgt.atio_ring; | 1970 | ha->tgt.atio_ring_ptr = ha->tgt.atio_ring; |
1896 | ha->tgt.atio_ring_index = 0; | 1971 | ha->tgt.atio_ring_index = 0; |
1897 | /* Initialize ATIO queue entries */ | 1972 | /* Initialize ATIO queue entries */ |
@@ -1971,6 +2046,7 @@ qla2x00_fw_ready(scsi_qla_host_t *vha) | |||
1971 | "Waiting for LIP to complete.\n"); | 2046 | "Waiting for LIP to complete.\n"); |
1972 | 2047 | ||
1973 | do { | 2048 | do { |
2049 | memset(state, -1, sizeof(state)); | ||
1974 | rval = qla2x00_get_firmware_state(vha, state); | 2050 | rval = qla2x00_get_firmware_state(vha, state); |
1975 | if (rval == QLA_SUCCESS) { | 2051 | if (rval == QLA_SUCCESS) { |
1976 | if (state[0] < FSTATE_LOSS_OF_SYNC) { | 2052 | if (state[0] < FSTATE_LOSS_OF_SYNC) { |
@@ -2907,7 +2983,6 @@ cleanup_allocation: | |||
2907 | static void | 2983 | static void |
2908 | qla2x00_iidma_fcport(scsi_qla_host_t *vha, fc_port_t *fcport) | 2984 | qla2x00_iidma_fcport(scsi_qla_host_t *vha, fc_port_t *fcport) |
2909 | { | 2985 | { |
2910 | char *link_speed; | ||
2911 | int rval; | 2986 | int rval; |
2912 | uint16_t mb[4]; | 2987 | uint16_t mb[4]; |
2913 | struct qla_hw_data *ha = vha->hw; | 2988 | struct qla_hw_data *ha = vha->hw; |
@@ -2934,10 +3009,10 @@ qla2x00_iidma_fcport(scsi_qla_host_t *vha, fc_port_t *fcport) | |||
2934 | fcport->port_name[6], fcport->port_name[7], rval, | 3009 | fcport->port_name[6], fcport->port_name[7], rval, |
2935 | fcport->fp_speed, mb[0], mb[1]); | 3010 | fcport->fp_speed, mb[0], mb[1]); |
2936 | } else { | 3011 | } else { |
2937 | link_speed = qla2x00_get_link_speed_str(ha); | ||
2938 | ql_dbg(ql_dbg_disc, vha, 0x2005, | 3012 | ql_dbg(ql_dbg_disc, vha, 0x2005, |
2939 | "iIDMA adjusted to %s GB/s " | 3013 | "iIDMA adjusted to %s GB/s " |
2940 | "on %02x%02x%02x%02x%02x%02x%02x%02x.\n", link_speed, | 3014 | "on %02x%02x%02x%02x%02x%02x%02x%02x.\n", |
3015 | qla2x00_get_link_speed_str(ha, fcport->fp_speed), | ||
2941 | fcport->port_name[0], fcport->port_name[1], | 3016 | fcport->port_name[0], fcport->port_name[1], |
2942 | fcport->port_name[2], fcport->port_name[3], | 3017 | fcport->port_name[2], fcport->port_name[3], |
2943 | fcport->port_name[4], fcport->port_name[5], | 3018 | fcport->port_name[4], fcport->port_name[5], |
@@ -3007,10 +3082,10 @@ qla2x00_update_fcport(scsi_qla_host_t *vha, fc_port_t *fcport) | |||
3007 | fcport->login_retry = 0; | 3082 | fcport->login_retry = 0; |
3008 | fcport->flags &= ~(FCF_LOGIN_NEEDED | FCF_ASYNC_SENT); | 3083 | fcport->flags &= ~(FCF_LOGIN_NEEDED | FCF_ASYNC_SENT); |
3009 | 3084 | ||
3085 | qla2x00_set_fcport_state(fcport, FCS_ONLINE); | ||
3010 | qla2x00_iidma_fcport(vha, fcport); | 3086 | qla2x00_iidma_fcport(vha, fcport); |
3011 | qla24xx_update_fcport_fcp_prio(vha, fcport); | 3087 | qla24xx_update_fcport_fcp_prio(vha, fcport); |
3012 | qla2x00_reg_remote_port(vha, fcport); | 3088 | qla2x00_reg_remote_port(vha, fcport); |
3013 | qla2x00_set_fcport_state(fcport, FCS_ONLINE); | ||
3014 | } | 3089 | } |
3015 | 3090 | ||
3016 | /* | 3091 | /* |
@@ -3868,7 +3943,7 @@ qla83xx_reset_ownership(scsi_qla_host_t *vha) | |||
3868 | } | 3943 | } |
3869 | } | 3944 | } |
3870 | 3945 | ||
3871 | int | 3946 | static int |
3872 | __qla83xx_set_drv_ack(scsi_qla_host_t *vha) | 3947 | __qla83xx_set_drv_ack(scsi_qla_host_t *vha) |
3873 | { | 3948 | { |
3874 | int rval = QLA_SUCCESS; | 3949 | int rval = QLA_SUCCESS; |
@@ -3884,19 +3959,7 @@ __qla83xx_set_drv_ack(scsi_qla_host_t *vha) | |||
3884 | return rval; | 3959 | return rval; |
3885 | } | 3960 | } |
3886 | 3961 | ||
3887 | int | 3962 | static int |
3888 | qla83xx_set_drv_ack(scsi_qla_host_t *vha) | ||
3889 | { | ||
3890 | int rval = QLA_SUCCESS; | ||
3891 | |||
3892 | qla83xx_idc_lock(vha, 0); | ||
3893 | rval = __qla83xx_set_drv_ack(vha); | ||
3894 | qla83xx_idc_unlock(vha, 0); | ||
3895 | |||
3896 | return rval; | ||
3897 | } | ||
3898 | |||
3899 | int | ||
3900 | __qla83xx_clear_drv_ack(scsi_qla_host_t *vha) | 3963 | __qla83xx_clear_drv_ack(scsi_qla_host_t *vha) |
3901 | { | 3964 | { |
3902 | int rval = QLA_SUCCESS; | 3965 | int rval = QLA_SUCCESS; |
@@ -3912,19 +3975,7 @@ __qla83xx_clear_drv_ack(scsi_qla_host_t *vha) | |||
3912 | return rval; | 3975 | return rval; |
3913 | } | 3976 | } |
3914 | 3977 | ||
3915 | int | 3978 | static const char * |
3916 | qla83xx_clear_drv_ack(scsi_qla_host_t *vha) | ||
3917 | { | ||
3918 | int rval = QLA_SUCCESS; | ||
3919 | |||
3920 | qla83xx_idc_lock(vha, 0); | ||
3921 | rval = __qla83xx_clear_drv_ack(vha); | ||
3922 | qla83xx_idc_unlock(vha, 0); | ||
3923 | |||
3924 | return rval; | ||
3925 | } | ||
3926 | |||
3927 | const char * | ||
3928 | qla83xx_dev_state_to_string(uint32_t dev_state) | 3979 | qla83xx_dev_state_to_string(uint32_t dev_state) |
3929 | { | 3980 | { |
3930 | switch (dev_state) { | 3981 | switch (dev_state) { |
@@ -3978,7 +4029,7 @@ qla83xx_idc_audit(scsi_qla_host_t *vha, int audit_type) | |||
3978 | } | 4029 | } |
3979 | 4030 | ||
3980 | /* Assumes idc_lock always held on entry */ | 4031 | /* Assumes idc_lock always held on entry */ |
3981 | int | 4032 | static int |
3982 | qla83xx_initiating_reset(scsi_qla_host_t *vha) | 4033 | qla83xx_initiating_reset(scsi_qla_host_t *vha) |
3983 | { | 4034 | { |
3984 | struct qla_hw_data *ha = vha->hw; | 4035 | struct qla_hw_data *ha = vha->hw; |
@@ -4026,36 +4077,12 @@ __qla83xx_set_idc_control(scsi_qla_host_t *vha, uint32_t idc_control) | |||
4026 | } | 4077 | } |
4027 | 4078 | ||
4028 | int | 4079 | int |
4029 | qla83xx_set_idc_control(scsi_qla_host_t *vha, uint32_t idc_control) | ||
4030 | { | ||
4031 | int rval = QLA_SUCCESS; | ||
4032 | |||
4033 | qla83xx_idc_lock(vha, 0); | ||
4034 | rval = __qla83xx_set_idc_control(vha, idc_control); | ||
4035 | qla83xx_idc_unlock(vha, 0); | ||
4036 | |||
4037 | return rval; | ||
4038 | } | ||
4039 | |||
4040 | int | ||
4041 | __qla83xx_get_idc_control(scsi_qla_host_t *vha, uint32_t *idc_control) | 4080 | __qla83xx_get_idc_control(scsi_qla_host_t *vha, uint32_t *idc_control) |
4042 | { | 4081 | { |
4043 | return qla83xx_rd_reg(vha, QLA83XX_IDC_CONTROL, idc_control); | 4082 | return qla83xx_rd_reg(vha, QLA83XX_IDC_CONTROL, idc_control); |
4044 | } | 4083 | } |
4045 | 4084 | ||
4046 | int | 4085 | static int |
4047 | qla83xx_get_idc_control(scsi_qla_host_t *vha, uint32_t *idc_control) | ||
4048 | { | ||
4049 | int rval = QLA_SUCCESS; | ||
4050 | |||
4051 | qla83xx_idc_lock(vha, 0); | ||
4052 | rval = __qla83xx_get_idc_control(vha, idc_control); | ||
4053 | qla83xx_idc_unlock(vha, 0); | ||
4054 | |||
4055 | return rval; | ||
4056 | } | ||
4057 | |||
4058 | int | ||
4059 | qla83xx_check_driver_presence(scsi_qla_host_t *vha) | 4086 | qla83xx_check_driver_presence(scsi_qla_host_t *vha) |
4060 | { | 4087 | { |
4061 | uint32_t drv_presence = 0; | 4088 | uint32_t drv_presence = 0; |
diff --git a/drivers/scsi/qla2xxx/qla_iocb.c b/drivers/scsi/qla2xxx/qla_iocb.c index 03b752632839..a481684479c1 100644 --- a/drivers/scsi/qla2xxx/qla_iocb.c +++ b/drivers/scsi/qla2xxx/qla_iocb.c | |||
@@ -520,7 +520,7 @@ __qla2x00_marker(struct scsi_qla_host *vha, struct req_que *req, | |||
520 | 520 | ||
521 | mrk24 = NULL; | 521 | mrk24 = NULL; |
522 | req = ha->req_q_map[0]; | 522 | req = ha->req_q_map[0]; |
523 | mrk = (mrk_entry_t *)qla2x00_alloc_iocbs(vha, 0); | 523 | mrk = (mrk_entry_t *)qla2x00_alloc_iocbs(vha, NULL); |
524 | if (mrk == NULL) { | 524 | if (mrk == NULL) { |
525 | ql_log(ql_log_warn, base_vha, 0x3026, | 525 | ql_log(ql_log_warn, base_vha, 0x3026, |
526 | "Failed to allocate Marker IOCB.\n"); | 526 | "Failed to allocate Marker IOCB.\n"); |
@@ -2551,7 +2551,7 @@ sufficient_dsds: | |||
2551 | (unsigned long __iomem *)ha->nxdb_wr_ptr, | 2551 | (unsigned long __iomem *)ha->nxdb_wr_ptr, |
2552 | dbval); | 2552 | dbval); |
2553 | wmb(); | 2553 | wmb(); |
2554 | while (RD_REG_DWORD(ha->nxdb_rd_ptr) != dbval) { | 2554 | while (RD_REG_DWORD((void __iomem *)ha->nxdb_rd_ptr) != dbval) { |
2555 | WRT_REG_DWORD( | 2555 | WRT_REG_DWORD( |
2556 | (unsigned long __iomem *)ha->nxdb_wr_ptr, | 2556 | (unsigned long __iomem *)ha->nxdb_wr_ptr, |
2557 | dbval); | 2557 | dbval); |
@@ -2748,7 +2748,6 @@ qla2x00_start_bidir(srb_t *sp, struct scsi_qla_host *vha, uint32_t tot_dsds) | |||
2748 | struct rsp_que *rsp; | 2748 | struct rsp_que *rsp; |
2749 | struct req_que *req; | 2749 | struct req_que *req; |
2750 | int rval = EXT_STATUS_OK; | 2750 | int rval = EXT_STATUS_OK; |
2751 | device_reg_t __iomem *reg = ISP_QUE_REG(ha, vha->req->id); | ||
2752 | 2751 | ||
2753 | rval = QLA_SUCCESS; | 2752 | rval = QLA_SUCCESS; |
2754 | 2753 | ||
@@ -2786,15 +2785,7 @@ qla2x00_start_bidir(srb_t *sp, struct scsi_qla_host *vha, uint32_t tot_dsds) | |||
2786 | 2785 | ||
2787 | /* Check for room on request queue. */ | 2786 | /* Check for room on request queue. */ |
2788 | if (req->cnt < req_cnt + 2) { | 2787 | if (req->cnt < req_cnt + 2) { |
2789 | if (ha->mqenable) | 2788 | cnt = RD_REG_DWORD_RELAXED(req->req_q_out); |
2790 | cnt = RD_REG_DWORD(®->isp25mq.req_q_out); | ||
2791 | else if (IS_QLA82XX(ha)) | ||
2792 | cnt = RD_REG_DWORD(®->isp82.req_q_out); | ||
2793 | else if (IS_FWI2_CAPABLE(ha)) | ||
2794 | cnt = RD_REG_DWORD(®->isp24.req_q_out); | ||
2795 | else | ||
2796 | cnt = qla2x00_debounce_register( | ||
2797 | ISP_REQ_Q_OUT(ha, ®->isp)); | ||
2798 | 2789 | ||
2799 | if (req->ring_index < cnt) | 2790 | if (req->ring_index < cnt) |
2800 | req->cnt = cnt - req->ring_index; | 2791 | req->cnt = cnt - req->ring_index; |
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c index 9d1c7b56090a..873c82014b16 100644 --- a/drivers/scsi/qla2xxx/qla_isr.c +++ b/drivers/scsi/qla2xxx/qla_isr.c | |||
@@ -316,28 +316,24 @@ qla81xx_idc_event(scsi_qla_host_t *vha, uint16_t aen, uint16_t descr) | |||
316 | } | 316 | } |
317 | 317 | ||
318 | #define LS_UNKNOWN 2 | 318 | #define LS_UNKNOWN 2 |
319 | char * | 319 | const char * |
320 | qla2x00_get_link_speed_str(struct qla_hw_data *ha) | 320 | qla2x00_get_link_speed_str(struct qla_hw_data *ha, uint16_t speed) |
321 | { | 321 | { |
322 | static char *link_speeds[] = {"1", "2", "?", "4", "8", "16", "10"}; | 322 | static const char * const link_speeds[] = { |
323 | char *link_speed; | 323 | "1", "2", "?", "4", "8", "16", "10" |
324 | int fw_speed = ha->link_data_rate; | 324 | }; |
325 | 325 | ||
326 | if (IS_QLA2100(ha) || IS_QLA2200(ha)) | 326 | if (IS_QLA2100(ha) || IS_QLA2200(ha)) |
327 | link_speed = link_speeds[0]; | 327 | return link_speeds[0]; |
328 | else if (fw_speed == 0x13) | 328 | else if (speed == 0x13) |
329 | link_speed = link_speeds[6]; | 329 | return link_speeds[6]; |
330 | else { | 330 | else if (speed < 6) |
331 | link_speed = link_speeds[LS_UNKNOWN]; | 331 | return link_speeds[speed]; |
332 | if (fw_speed < 6) | 332 | else |
333 | link_speed = | 333 | return link_speeds[LS_UNKNOWN]; |
334 | link_speeds[fw_speed]; | ||
335 | } | ||
336 | |||
337 | return link_speed; | ||
338 | } | 334 | } |
339 | 335 | ||
340 | void | 336 | static void |
341 | qla83xx_handle_8200_aen(scsi_qla_host_t *vha, uint16_t *mb) | 337 | qla83xx_handle_8200_aen(scsi_qla_host_t *vha, uint16_t *mb) |
342 | { | 338 | { |
343 | struct qla_hw_data *ha = vha->hw; | 339 | struct qla_hw_data *ha = vha->hw; |
@@ -671,7 +667,7 @@ skip_rio: | |||
671 | 667 | ||
672 | ql_dbg(ql_dbg_async, vha, 0x500a, | 668 | ql_dbg(ql_dbg_async, vha, 0x500a, |
673 | "LOOP UP detected (%s Gbps).\n", | 669 | "LOOP UP detected (%s Gbps).\n", |
674 | qla2x00_get_link_speed_str(ha)); | 670 | qla2x00_get_link_speed_str(ha, ha->link_data_rate)); |
675 | 671 | ||
676 | vha->flags.management_server_logged_in = 0; | 672 | vha->flags.management_server_logged_in = 0; |
677 | qla2x00_post_aen_work(vha, FCH_EVT_LINKUP, ha->link_data_rate); | 673 | qla2x00_post_aen_work(vha, FCH_EVT_LINKUP, ha->link_data_rate); |
@@ -860,7 +856,7 @@ skip_rio: | |||
860 | mb[1], mb[2], mb[3]); | 856 | mb[1], mb[2], mb[3]); |
861 | ql_log(ql_log_warn, vha, 0x505f, | 857 | ql_log(ql_log_warn, vha, 0x505f, |
862 | "Link is operational (%s Gbps).\n", | 858 | "Link is operational (%s Gbps).\n", |
863 | qla2x00_get_link_speed_str(ha)); | 859 | qla2x00_get_link_speed_str(ha, ha->link_data_rate)); |
864 | 860 | ||
865 | /* | 861 | /* |
866 | * Mark all devices as missing so we will login again. | 862 | * Mark all devices as missing so we will login again. |
@@ -2944,7 +2940,9 @@ skip_msi: | |||
2944 | "Failed to reserve interrupt %d already in use.\n", | 2940 | "Failed to reserve interrupt %d already in use.\n", |
2945 | ha->pdev->irq); | 2941 | ha->pdev->irq); |
2946 | goto fail; | 2942 | goto fail; |
2947 | } | 2943 | } else if (!ha->flags.msi_enabled) |
2944 | ql_dbg(ql_dbg_init, vha, 0x0125, | ||
2945 | "INTa mode: Enabled.\n"); | ||
2948 | 2946 | ||
2949 | clear_risc_ints: | 2947 | clear_risc_ints: |
2950 | 2948 | ||
diff --git a/drivers/scsi/qla2xxx/qla_mbx.c b/drivers/scsi/qla2xxx/qla_mbx.c index 18c509fae555..68c55eaa318c 100644 --- a/drivers/scsi/qla2xxx/qla_mbx.c +++ b/drivers/scsi/qla2xxx/qla_mbx.c | |||
@@ -3122,7 +3122,7 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha, | |||
3122 | if (vp_idx == 0 && (MSB(stat) != 1)) | 3122 | if (vp_idx == 0 && (MSB(stat) != 1)) |
3123 | goto reg_needed; | 3123 | goto reg_needed; |
3124 | 3124 | ||
3125 | if (MSB(stat) != 0) { | 3125 | if (MSB(stat) != 0 && MSB(stat) != 2) { |
3126 | ql_dbg(ql_dbg_mbx, vha, 0x10ba, | 3126 | ql_dbg(ql_dbg_mbx, vha, 0x10ba, |
3127 | "Could not acquire ID for VP[%d].\n", vp_idx); | 3127 | "Could not acquire ID for VP[%d].\n", vp_idx); |
3128 | return; | 3128 | return; |
@@ -3536,7 +3536,7 @@ qla25xx_init_req_que(struct scsi_qla_host *vha, struct req_que *req) | |||
3536 | if (IS_QLA83XX(ha)) | 3536 | if (IS_QLA83XX(ha)) |
3537 | mcp->mb[15] = 0; | 3537 | mcp->mb[15] = 0; |
3538 | 3538 | ||
3539 | reg = (struct device_reg_25xxmq *)((void *)(ha->mqiobase) + | 3539 | reg = (struct device_reg_25xxmq __iomem *)((ha->mqiobase) + |
3540 | QLA_QUE_PAGE * req->id); | 3540 | QLA_QUE_PAGE * req->id); |
3541 | 3541 | ||
3542 | mcp->mb[4] = req->id; | 3542 | mcp->mb[4] = req->id; |
@@ -3605,7 +3605,7 @@ qla25xx_init_rsp_que(struct scsi_qla_host *vha, struct rsp_que *rsp) | |||
3605 | if (IS_QLA83XX(ha)) | 3605 | if (IS_QLA83XX(ha)) |
3606 | mcp->mb[15] = 0; | 3606 | mcp->mb[15] = 0; |
3607 | 3607 | ||
3608 | reg = (struct device_reg_25xxmq *)((void *)(ha->mqiobase) + | 3608 | reg = (struct device_reg_25xxmq __iomem *)((ha->mqiobase) + |
3609 | QLA_QUE_PAGE * rsp->id); | 3609 | QLA_QUE_PAGE * rsp->id); |
3610 | 3610 | ||
3611 | mcp->mb[4] = rsp->id; | 3611 | mcp->mb[4] = rsp->id; |
diff --git a/drivers/scsi/qla2xxx/qla_nx.c b/drivers/scsi/qla2xxx/qla_nx.c index f5e297c6b684..3e3f593bada3 100644 --- a/drivers/scsi/qla2xxx/qla_nx.c +++ b/drivers/scsi/qla2xxx/qla_nx.c | |||
@@ -36,7 +36,7 @@ | |||
36 | 36 | ||
37 | #define MAX_CRB_XFORM 60 | 37 | #define MAX_CRB_XFORM 60 |
38 | static unsigned long crb_addr_xform[MAX_CRB_XFORM]; | 38 | static unsigned long crb_addr_xform[MAX_CRB_XFORM]; |
39 | int qla82xx_crb_table_initialized; | 39 | static int qla82xx_crb_table_initialized; |
40 | 40 | ||
41 | #define qla82xx_crb_addr_transform(name) \ | 41 | #define qla82xx_crb_addr_transform(name) \ |
42 | (crb_addr_xform[QLA82XX_HW_PX_MAP_CRB_##name] = \ | 42 | (crb_addr_xform[QLA82XX_HW_PX_MAP_CRB_##name] = \ |
@@ -102,7 +102,7 @@ static void qla82xx_crb_addr_transform_setup(void) | |||
102 | qla82xx_crb_table_initialized = 1; | 102 | qla82xx_crb_table_initialized = 1; |
103 | } | 103 | } |
104 | 104 | ||
105 | struct crb_128M_2M_block_map crb_128M_2M_map[64] = { | 105 | static struct crb_128M_2M_block_map crb_128M_2M_map[64] = { |
106 | {{{0, 0, 0, 0} } }, | 106 | {{{0, 0, 0, 0} } }, |
107 | {{{1, 0x0100000, 0x0102000, 0x120000}, | 107 | {{{1, 0x0100000, 0x0102000, 0x120000}, |
108 | {1, 0x0110000, 0x0120000, 0x130000}, | 108 | {1, 0x0110000, 0x0120000, 0x130000}, |
@@ -262,7 +262,7 @@ struct crb_128M_2M_block_map crb_128M_2M_map[64] = { | |||
262 | /* | 262 | /* |
263 | * top 12 bits of crb internal address (hub, agent) | 263 | * top 12 bits of crb internal address (hub, agent) |
264 | */ | 264 | */ |
265 | unsigned qla82xx_crb_hub_agt[64] = { | 265 | static unsigned qla82xx_crb_hub_agt[64] = { |
266 | 0, | 266 | 0, |
267 | QLA82XX_HW_CRB_HUB_AGT_ADR_PS, | 267 | QLA82XX_HW_CRB_HUB_AGT_ADR_PS, |
268 | QLA82XX_HW_CRB_HUB_AGT_ADR_MN, | 268 | QLA82XX_HW_CRB_HUB_AGT_ADR_MN, |
@@ -330,7 +330,7 @@ unsigned qla82xx_crb_hub_agt[64] = { | |||
330 | }; | 330 | }; |
331 | 331 | ||
332 | /* Device states */ | 332 | /* Device states */ |
333 | char *q_dev_state[] = { | 333 | static char *q_dev_state[] = { |
334 | "Unknown", | 334 | "Unknown", |
335 | "Cold", | 335 | "Cold", |
336 | "Initializing", | 336 | "Initializing", |
@@ -359,12 +359,13 @@ qla82xx_pci_set_crbwindow_2M(struct qla_hw_data *ha, ulong *off) | |||
359 | 359 | ||
360 | ha->crb_win = CRB_HI(*off); | 360 | ha->crb_win = CRB_HI(*off); |
361 | writel(ha->crb_win, | 361 | writel(ha->crb_win, |
362 | (void *)(CRB_WINDOW_2M + ha->nx_pcibase)); | 362 | (void __iomem *)(CRB_WINDOW_2M + ha->nx_pcibase)); |
363 | 363 | ||
364 | /* Read back value to make sure write has gone through before trying | 364 | /* Read back value to make sure write has gone through before trying |
365 | * to use it. | 365 | * to use it. |
366 | */ | 366 | */ |
367 | win_read = RD_REG_DWORD((void *)(CRB_WINDOW_2M + ha->nx_pcibase)); | 367 | win_read = RD_REG_DWORD((void __iomem *) |
368 | (CRB_WINDOW_2M + ha->nx_pcibase)); | ||
368 | if (win_read != ha->crb_win) { | 369 | if (win_read != ha->crb_win) { |
369 | ql_dbg(ql_dbg_p3p, vha, 0xb000, | 370 | ql_dbg(ql_dbg_p3p, vha, 0xb000, |
370 | "%s: Written crbwin (0x%x) " | 371 | "%s: Written crbwin (0x%x) " |
@@ -567,7 +568,7 @@ qla82xx_pci_mem_bound_check(struct qla_hw_data *ha, | |||
567 | return 1; | 568 | return 1; |
568 | } | 569 | } |
569 | 570 | ||
570 | int qla82xx_pci_set_window_warning_count; | 571 | static int qla82xx_pci_set_window_warning_count; |
571 | 572 | ||
572 | static unsigned long | 573 | static unsigned long |
573 | qla82xx_pci_set_window(struct qla_hw_data *ha, unsigned long long addr) | 574 | qla82xx_pci_set_window(struct qla_hw_data *ha, unsigned long long addr) |
@@ -677,10 +678,10 @@ static int qla82xx_pci_mem_read_direct(struct qla_hw_data *ha, | |||
677 | u64 off, void *data, int size) | 678 | u64 off, void *data, int size) |
678 | { | 679 | { |
679 | unsigned long flags; | 680 | unsigned long flags; |
680 | void *addr = NULL; | 681 | void __iomem *addr = NULL; |
681 | int ret = 0; | 682 | int ret = 0; |
682 | u64 start; | 683 | u64 start; |
683 | uint8_t *mem_ptr = NULL; | 684 | uint8_t __iomem *mem_ptr = NULL; |
684 | unsigned long mem_base; | 685 | unsigned long mem_base; |
685 | unsigned long mem_page; | 686 | unsigned long mem_page; |
686 | scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); | 687 | scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); |
@@ -712,7 +713,7 @@ static int qla82xx_pci_mem_read_direct(struct qla_hw_data *ha, | |||
712 | mem_ptr = ioremap(mem_base + mem_page, PAGE_SIZE * 2); | 713 | mem_ptr = ioremap(mem_base + mem_page, PAGE_SIZE * 2); |
713 | else | 714 | else |
714 | mem_ptr = ioremap(mem_base + mem_page, PAGE_SIZE); | 715 | mem_ptr = ioremap(mem_base + mem_page, PAGE_SIZE); |
715 | if (mem_ptr == 0UL) { | 716 | if (mem_ptr == NULL) { |
716 | *(u8 *)data = 0; | 717 | *(u8 *)data = 0; |
717 | return -1; | 718 | return -1; |
718 | } | 719 | } |
@@ -749,10 +750,10 @@ qla82xx_pci_mem_write_direct(struct qla_hw_data *ha, | |||
749 | u64 off, void *data, int size) | 750 | u64 off, void *data, int size) |
750 | { | 751 | { |
751 | unsigned long flags; | 752 | unsigned long flags; |
752 | void *addr = NULL; | 753 | void __iomem *addr = NULL; |
753 | int ret = 0; | 754 | int ret = 0; |
754 | u64 start; | 755 | u64 start; |
755 | uint8_t *mem_ptr = NULL; | 756 | uint8_t __iomem *mem_ptr = NULL; |
756 | unsigned long mem_base; | 757 | unsigned long mem_base; |
757 | unsigned long mem_page; | 758 | unsigned long mem_page; |
758 | scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); | 759 | scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); |
@@ -784,7 +785,7 @@ qla82xx_pci_mem_write_direct(struct qla_hw_data *ha, | |||
784 | mem_ptr = ioremap(mem_base + mem_page, PAGE_SIZE*2); | 785 | mem_ptr = ioremap(mem_base + mem_page, PAGE_SIZE*2); |
785 | else | 786 | else |
786 | mem_ptr = ioremap(mem_base + mem_page, PAGE_SIZE); | 787 | mem_ptr = ioremap(mem_base + mem_page, PAGE_SIZE); |
787 | if (mem_ptr == 0UL) | 788 | if (mem_ptr == NULL) |
788 | return -1; | 789 | return -1; |
789 | 790 | ||
790 | addr = mem_ptr; | 791 | addr = mem_ptr; |
@@ -908,24 +909,24 @@ qla82xx_wait_rom_done(struct qla_hw_data *ha) | |||
908 | return 0; | 909 | return 0; |
909 | } | 910 | } |
910 | 911 | ||
911 | int | 912 | static int |
912 | qla82xx_md_rw_32(struct qla_hw_data *ha, uint32_t off, u32 data, uint8_t flag) | 913 | qla82xx_md_rw_32(struct qla_hw_data *ha, uint32_t off, u32 data, uint8_t flag) |
913 | { | 914 | { |
914 | uint32_t off_value, rval = 0; | 915 | uint32_t off_value, rval = 0; |
915 | 916 | ||
916 | WRT_REG_DWORD((void *)(CRB_WINDOW_2M + ha->nx_pcibase), | 917 | WRT_REG_DWORD((void __iomem *)(CRB_WINDOW_2M + ha->nx_pcibase), |
917 | (off & 0xFFFF0000)); | 918 | (off & 0xFFFF0000)); |
918 | 919 | ||
919 | /* Read back value to make sure write has gone through */ | 920 | /* Read back value to make sure write has gone through */ |
920 | RD_REG_DWORD((void *)(CRB_WINDOW_2M + ha->nx_pcibase)); | 921 | RD_REG_DWORD((void __iomem *)(CRB_WINDOW_2M + ha->nx_pcibase)); |
921 | off_value = (off & 0x0000FFFF); | 922 | off_value = (off & 0x0000FFFF); |
922 | 923 | ||
923 | if (flag) | 924 | if (flag) |
924 | WRT_REG_DWORD((void *) | 925 | WRT_REG_DWORD((void __iomem *) |
925 | (off_value + CRB_INDIRECT_2M + ha->nx_pcibase), | 926 | (off_value + CRB_INDIRECT_2M + ha->nx_pcibase), |
926 | data); | 927 | data); |
927 | else | 928 | else |
928 | rval = RD_REG_DWORD((void *) | 929 | rval = RD_REG_DWORD((void __iomem *) |
929 | (off_value + CRB_INDIRECT_2M + ha->nx_pcibase)); | 930 | (off_value + CRB_INDIRECT_2M + ha->nx_pcibase)); |
930 | 931 | ||
931 | return rval; | 932 | return rval; |
@@ -1654,7 +1655,6 @@ qla82xx_iospace_config(struct qla_hw_data *ha) | |||
1654 | if (!ha->nx_pcibase) { | 1655 | if (!ha->nx_pcibase) { |
1655 | ql_log_pci(ql_log_fatal, ha->pdev, 0x000e, | 1656 | ql_log_pci(ql_log_fatal, ha->pdev, 0x000e, |
1656 | "Cannot remap pcibase MMIO, aborting.\n"); | 1657 | "Cannot remap pcibase MMIO, aborting.\n"); |
1657 | pci_release_regions(ha->pdev); | ||
1658 | goto iospace_error_exit; | 1658 | goto iospace_error_exit; |
1659 | } | 1659 | } |
1660 | 1660 | ||
@@ -1669,7 +1669,6 @@ qla82xx_iospace_config(struct qla_hw_data *ha) | |||
1669 | if (!ha->nxdb_wr_ptr) { | 1669 | if (!ha->nxdb_wr_ptr) { |
1670 | ql_log_pci(ql_log_fatal, ha->pdev, 0x000f, | 1670 | ql_log_pci(ql_log_fatal, ha->pdev, 0x000f, |
1671 | "Cannot remap MMIO, aborting.\n"); | 1671 | "Cannot remap MMIO, aborting.\n"); |
1672 | pci_release_regions(ha->pdev); | ||
1673 | goto iospace_error_exit; | 1672 | goto iospace_error_exit; |
1674 | } | 1673 | } |
1675 | 1674 | ||
@@ -1764,14 +1763,6 @@ void qla82xx_config_rings(struct scsi_qla_host *vha) | |||
1764 | WRT_REG_DWORD((unsigned long __iomem *)®->rsp_q_out[0], 0); | 1763 | WRT_REG_DWORD((unsigned long __iomem *)®->rsp_q_out[0], 0); |
1765 | } | 1764 | } |
1766 | 1765 | ||
1767 | void qla82xx_reset_adapter(struct scsi_qla_host *vha) | ||
1768 | { | ||
1769 | struct qla_hw_data *ha = vha->hw; | ||
1770 | vha->flags.online = 0; | ||
1771 | qla2x00_try_to_stop_firmware(vha); | ||
1772 | ha->isp_ops->disable_intrs(ha); | ||
1773 | } | ||
1774 | |||
1775 | static int | 1766 | static int |
1776 | qla82xx_fw_load_from_blob(struct qla_hw_data *ha) | 1767 | qla82xx_fw_load_from_blob(struct qla_hw_data *ha) |
1777 | { | 1768 | { |
@@ -1856,7 +1847,7 @@ qla82xx_set_product_offset(struct qla_hw_data *ha) | |||
1856 | return -1; | 1847 | return -1; |
1857 | } | 1848 | } |
1858 | 1849 | ||
1859 | int | 1850 | static int |
1860 | qla82xx_validate_firmware_blob(scsi_qla_host_t *vha, uint8_t fw_type) | 1851 | qla82xx_validate_firmware_blob(scsi_qla_host_t *vha, uint8_t fw_type) |
1861 | { | 1852 | { |
1862 | __le32 val; | 1853 | __le32 val; |
@@ -1961,20 +1952,6 @@ qla82xx_check_rcvpeg_state(struct qla_hw_data *ha) | |||
1961 | } | 1952 | } |
1962 | 1953 | ||
1963 | /* ISR related functions */ | 1954 | /* ISR related functions */ |
1964 | uint32_t qla82xx_isr_int_target_mask_enable[8] = { | ||
1965 | ISR_INT_TARGET_MASK, ISR_INT_TARGET_MASK_F1, | ||
1966 | ISR_INT_TARGET_MASK_F2, ISR_INT_TARGET_MASK_F3, | ||
1967 | ISR_INT_TARGET_MASK_F4, ISR_INT_TARGET_MASK_F5, | ||
1968 | ISR_INT_TARGET_MASK_F7, ISR_INT_TARGET_MASK_F7 | ||
1969 | }; | ||
1970 | |||
1971 | uint32_t qla82xx_isr_int_target_status[8] = { | ||
1972 | ISR_INT_TARGET_STATUS, ISR_INT_TARGET_STATUS_F1, | ||
1973 | ISR_INT_TARGET_STATUS_F2, ISR_INT_TARGET_STATUS_F3, | ||
1974 | ISR_INT_TARGET_STATUS_F4, ISR_INT_TARGET_STATUS_F5, | ||
1975 | ISR_INT_TARGET_STATUS_F7, ISR_INT_TARGET_STATUS_F7 | ||
1976 | }; | ||
1977 | |||
1978 | static struct qla82xx_legacy_intr_set legacy_intr[] = \ | 1955 | static struct qla82xx_legacy_intr_set legacy_intr[] = \ |
1979 | QLA82XX_LEGACY_INTR_CONFIG; | 1956 | QLA82XX_LEGACY_INTR_CONFIG; |
1980 | 1957 | ||
@@ -2813,7 +2790,7 @@ qla82xx_start_iocbs(scsi_qla_host_t *vha) | |||
2813 | else { | 2790 | else { |
2814 | WRT_REG_DWORD((unsigned long __iomem *)ha->nxdb_wr_ptr, dbval); | 2791 | WRT_REG_DWORD((unsigned long __iomem *)ha->nxdb_wr_ptr, dbval); |
2815 | wmb(); | 2792 | wmb(); |
2816 | while (RD_REG_DWORD(ha->nxdb_rd_ptr) != dbval) { | 2793 | while (RD_REG_DWORD((void __iomem *)ha->nxdb_rd_ptr) != dbval) { |
2817 | WRT_REG_DWORD((unsigned long __iomem *)ha->nxdb_wr_ptr, | 2794 | WRT_REG_DWORD((unsigned long __iomem *)ha->nxdb_wr_ptr, |
2818 | dbval); | 2795 | dbval); |
2819 | wmb(); | 2796 | wmb(); |
@@ -2821,7 +2798,8 @@ qla82xx_start_iocbs(scsi_qla_host_t *vha) | |||
2821 | } | 2798 | } |
2822 | } | 2799 | } |
2823 | 2800 | ||
2824 | void qla82xx_rom_lock_recovery(struct qla_hw_data *ha) | 2801 | static void |
2802 | qla82xx_rom_lock_recovery(struct qla_hw_data *ha) | ||
2825 | { | 2803 | { |
2826 | scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); | 2804 | scsi_qla_host_t *vha = pci_get_drvdata(ha->pdev); |
2827 | 2805 | ||
@@ -3177,7 +3155,7 @@ qla82xx_check_md_needed(scsi_qla_host_t *vha) | |||
3177 | } | 3155 | } |
3178 | 3156 | ||
3179 | 3157 | ||
3180 | int | 3158 | static int |
3181 | qla82xx_check_fw_alive(scsi_qla_host_t *vha) | 3159 | qla82xx_check_fw_alive(scsi_qla_host_t *vha) |
3182 | { | 3160 | { |
3183 | uint32_t fw_heartbeat_counter; | 3161 | uint32_t fw_heartbeat_counter; |
@@ -3817,7 +3795,8 @@ qla82xx_minidump_process_rdocm(scsi_qla_host_t *vha, | |||
3817 | loop_cnt = ocm_hdr->op_count; | 3795 | loop_cnt = ocm_hdr->op_count; |
3818 | 3796 | ||
3819 | for (i = 0; i < loop_cnt; i++) { | 3797 | for (i = 0; i < loop_cnt; i++) { |
3820 | r_value = RD_REG_DWORD((void *)(r_addr + ha->nx_pcibase)); | 3798 | r_value = RD_REG_DWORD((void __iomem *) |
3799 | (r_addr + ha->nx_pcibase)); | ||
3821 | *data_ptr++ = cpu_to_le32(r_value); | 3800 | *data_ptr++ = cpu_to_le32(r_value); |
3822 | r_addr += r_stride; | 3801 | r_addr += r_stride; |
3823 | } | 3802 | } |
@@ -4376,7 +4355,7 @@ qla82xx_md_free(scsi_qla_host_t *vha) | |||
4376 | ha->md_tmplt_hdr, ha->md_template_size / 1024); | 4355 | ha->md_tmplt_hdr, ha->md_template_size / 1024); |
4377 | dma_free_coherent(&ha->pdev->dev, ha->md_template_size, | 4356 | dma_free_coherent(&ha->pdev->dev, ha->md_template_size, |
4378 | ha->md_tmplt_hdr, ha->md_tmplt_hdr_dma); | 4357 | ha->md_tmplt_hdr, ha->md_tmplt_hdr_dma); |
4379 | ha->md_tmplt_hdr = 0; | 4358 | ha->md_tmplt_hdr = NULL; |
4380 | } | 4359 | } |
4381 | 4360 | ||
4382 | /* Release the template data buffer allocated */ | 4361 | /* Release the template data buffer allocated */ |
@@ -4386,7 +4365,7 @@ qla82xx_md_free(scsi_qla_host_t *vha) | |||
4386 | ha->md_dump, ha->md_dump_size / 1024); | 4365 | ha->md_dump, ha->md_dump_size / 1024); |
4387 | vfree(ha->md_dump); | 4366 | vfree(ha->md_dump); |
4388 | ha->md_dump_size = 0; | 4367 | ha->md_dump_size = 0; |
4389 | ha->md_dump = 0; | 4368 | ha->md_dump = NULL; |
4390 | } | 4369 | } |
4391 | } | 4370 | } |
4392 | 4371 | ||
@@ -4423,7 +4402,7 @@ qla82xx_md_prep(scsi_qla_host_t *vha) | |||
4423 | dma_free_coherent(&ha->pdev->dev, | 4402 | dma_free_coherent(&ha->pdev->dev, |
4424 | ha->md_template_size, | 4403 | ha->md_template_size, |
4425 | ha->md_tmplt_hdr, ha->md_tmplt_hdr_dma); | 4404 | ha->md_tmplt_hdr, ha->md_tmplt_hdr_dma); |
4426 | ha->md_tmplt_hdr = 0; | 4405 | ha->md_tmplt_hdr = NULL; |
4427 | } | 4406 | } |
4428 | 4407 | ||
4429 | } | 4408 | } |
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c index d501bf5f806b..3a1661cf8c1e 100644 --- a/drivers/scsi/qla2xxx/qla_os.c +++ b/drivers/scsi/qla2xxx/qla_os.c | |||
@@ -41,7 +41,7 @@ static struct kmem_cache *ctx_cachep; | |||
41 | */ | 41 | */ |
42 | int ql_errlev = ql_log_all; | 42 | int ql_errlev = ql_log_all; |
43 | 43 | ||
44 | int ql2xenableclass2; | 44 | static int ql2xenableclass2; |
45 | module_param(ql2xenableclass2, int, S_IRUGO|S_IRUSR); | 45 | module_param(ql2xenableclass2, int, S_IRUGO|S_IRUSR); |
46 | MODULE_PARM_DESC(ql2xenableclass2, | 46 | MODULE_PARM_DESC(ql2xenableclass2, |
47 | "Specify if Class 2 operations are supported from the very " | 47 | "Specify if Class 2 operations are supported from the very " |
@@ -89,6 +89,8 @@ MODULE_PARM_DESC(ql2xextended_error_logging, | |||
89 | "\t\t0x00200000 - AER/EEH. 0x00100000 - Multi Q.\n" | 89 | "\t\t0x00200000 - AER/EEH. 0x00100000 - Multi Q.\n" |
90 | "\t\t0x00080000 - P3P Specific. 0x00040000 - Virtual Port.\n" | 90 | "\t\t0x00080000 - P3P Specific. 0x00040000 - Virtual Port.\n" |
91 | "\t\t0x00020000 - Buffer Dump. 0x00010000 - Misc.\n" | 91 | "\t\t0x00020000 - Buffer Dump. 0x00010000 - Misc.\n" |
92 | "\t\t0x00008000 - Verbose. 0x00004000 - Target.\n" | ||
93 | "\t\t0x00002000 - Target Mgmt. 0x00001000 - Target TMF.\n" | ||
92 | "\t\t0x7fffffff - For enabling all logs, can be too many logs.\n" | 94 | "\t\t0x7fffffff - For enabling all logs, can be too many logs.\n" |
93 | "\t\t0x1e400000 - Preferred value for capturing essential " | 95 | "\t\t0x1e400000 - Preferred value for capturing essential " |
94 | "debug information (equivalent to old " | 96 | "debug information (equivalent to old " |
@@ -494,12 +496,20 @@ qla24xx_pci_info_str(struct scsi_qla_host *vha, char *str) | |||
494 | (BIT_4 | BIT_5 | BIT_6 | BIT_7 | BIT_8 | BIT_9)) >> 4; | 496 | (BIT_4 | BIT_5 | BIT_6 | BIT_7 | BIT_8 | BIT_9)) >> 4; |
495 | 497 | ||
496 | strcpy(str, "PCIe ("); | 498 | strcpy(str, "PCIe ("); |
497 | if (lspeed == 1) | 499 | switch (lspeed) { |
500 | case 1: | ||
498 | strcat(str, "2.5GT/s "); | 501 | strcat(str, "2.5GT/s "); |
499 | else if (lspeed == 2) | 502 | break; |
503 | case 2: | ||
500 | strcat(str, "5.0GT/s "); | 504 | strcat(str, "5.0GT/s "); |
501 | else | 505 | break; |
506 | case 3: | ||
507 | strcat(str, "8.0GT/s "); | ||
508 | break; | ||
509 | default: | ||
502 | strcat(str, "<unknown> "); | 510 | strcat(str, "<unknown> "); |
511 | break; | ||
512 | } | ||
503 | snprintf(lwstr, sizeof(lwstr), "x%d)", lwidth); | 513 | snprintf(lwstr, sizeof(lwstr), "x%d)", lwidth); |
504 | strcat(str, lwstr); | 514 | strcat(str, lwstr); |
505 | 515 | ||
@@ -719,7 +729,7 @@ qla2xxx_queuecommand(struct Scsi_Host *host, struct scsi_cmnd *cmd) | |||
719 | 729 | ||
720 | rval = ha->isp_ops->start_scsi(sp); | 730 | rval = ha->isp_ops->start_scsi(sp); |
721 | if (rval != QLA_SUCCESS) { | 731 | if (rval != QLA_SUCCESS) { |
722 | ql_dbg(ql_dbg_io, vha, 0x3013, | 732 | ql_dbg(ql_dbg_io + ql_dbg_verbose, vha, 0x3013, |
723 | "Start scsi failed rval=%d for cmd=%p.\n", rval, cmd); | 733 | "Start scsi failed rval=%d for cmd=%p.\n", rval, cmd); |
724 | goto qc24_host_busy_free_sp; | 734 | goto qc24_host_busy_free_sp; |
725 | } | 735 | } |
@@ -2357,7 +2367,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) | |||
2357 | /* Configure PCI I/O space */ | 2367 | /* Configure PCI I/O space */ |
2358 | ret = ha->isp_ops->iospace_config(ha); | 2368 | ret = ha->isp_ops->iospace_config(ha); |
2359 | if (ret) | 2369 | if (ret) |
2360 | goto probe_hw_failed; | 2370 | goto iospace_config_failed; |
2361 | 2371 | ||
2362 | ql_log_pci(ql_log_info, pdev, 0x001d, | 2372 | ql_log_pci(ql_log_info, pdev, 0x001d, |
2363 | "Found an ISP%04X irq %d iobase 0x%p.\n", | 2373 | "Found an ISP%04X irq %d iobase 0x%p.\n", |
@@ -2668,7 +2678,11 @@ probe_hw_failed: | |||
2668 | qla82xx_idc_lock(ha); | 2678 | qla82xx_idc_lock(ha); |
2669 | qla82xx_clear_drv_active(ha); | 2679 | qla82xx_clear_drv_active(ha); |
2670 | qla82xx_idc_unlock(ha); | 2680 | qla82xx_idc_unlock(ha); |
2671 | iounmap((device_reg_t __iomem *)ha->nx_pcibase); | 2681 | } |
2682 | iospace_config_failed: | ||
2683 | if (IS_QLA82XX(ha)) { | ||
2684 | if (!ha->nx_pcibase) | ||
2685 | iounmap((device_reg_t __iomem *)ha->nx_pcibase); | ||
2672 | if (!ql2xdbwr) | 2686 | if (!ql2xdbwr) |
2673 | iounmap((device_reg_t __iomem *)ha->nxdb_wr_ptr); | 2687 | iounmap((device_reg_t __iomem *)ha->nxdb_wr_ptr); |
2674 | } else { | 2688 | } else { |
@@ -2755,6 +2769,7 @@ qla2x00_remove_one(struct pci_dev *pdev) | |||
2755 | 2769 | ||
2756 | ha->flags.host_shutting_down = 1; | 2770 | ha->flags.host_shutting_down = 1; |
2757 | 2771 | ||
2772 | set_bit(UNLOADING, &base_vha->dpc_flags); | ||
2758 | mutex_lock(&ha->vport_lock); | 2773 | mutex_lock(&ha->vport_lock); |
2759 | while (ha->cur_vport_count) { | 2774 | while (ha->cur_vport_count) { |
2760 | struct Scsi_Host *scsi_host; | 2775 | struct Scsi_Host *scsi_host; |
@@ -2784,8 +2799,6 @@ qla2x00_remove_one(struct pci_dev *pdev) | |||
2784 | "Error while clearing DRV-Presence.\n"); | 2799 | "Error while clearing DRV-Presence.\n"); |
2785 | } | 2800 | } |
2786 | 2801 | ||
2787 | set_bit(UNLOADING, &base_vha->dpc_flags); | ||
2788 | |||
2789 | qla2x00_abort_all_cmds(base_vha, DID_NO_CONNECT << 16); | 2802 | qla2x00_abort_all_cmds(base_vha, DID_NO_CONNECT << 16); |
2790 | 2803 | ||
2791 | qla2x00_dfs_remove(base_vha); | 2804 | qla2x00_dfs_remove(base_vha); |
@@ -3721,10 +3734,9 @@ void qla2x00_relogin(struct scsi_qla_host *vha) | |||
3721 | if (fcport->flags & | 3734 | if (fcport->flags & |
3722 | FCF_FCP2_DEVICE) | 3735 | FCF_FCP2_DEVICE) |
3723 | opts |= BIT_1; | 3736 | opts |= BIT_1; |
3724 | status2 = | 3737 | status2 = |
3725 | qla2x00_get_port_database( | 3738 | qla2x00_get_port_database( |
3726 | vha, fcport, | 3739 | vha, fcport, opts); |
3727 | opts); | ||
3728 | if (status2 != QLA_SUCCESS) | 3740 | if (status2 != QLA_SUCCESS) |
3729 | status = 1; | 3741 | status = 1; |
3730 | } | 3742 | } |
@@ -3836,7 +3848,7 @@ qla83xx_idc_state_handler_work(struct work_struct *work) | |||
3836 | qla83xx_idc_unlock(base_vha, 0); | 3848 | qla83xx_idc_unlock(base_vha, 0); |
3837 | } | 3849 | } |
3838 | 3850 | ||
3839 | int | 3851 | static int |
3840 | qla83xx_check_nic_core_fw_alive(scsi_qla_host_t *base_vha) | 3852 | qla83xx_check_nic_core_fw_alive(scsi_qla_host_t *base_vha) |
3841 | { | 3853 | { |
3842 | int rval = QLA_SUCCESS; | 3854 | int rval = QLA_SUCCESS; |
@@ -3954,7 +3966,7 @@ qla83xx_wait_logic(void) | |||
3954 | } | 3966 | } |
3955 | } | 3967 | } |
3956 | 3968 | ||
3957 | int | 3969 | static int |
3958 | qla83xx_force_lock_recovery(scsi_qla_host_t *base_vha) | 3970 | qla83xx_force_lock_recovery(scsi_qla_host_t *base_vha) |
3959 | { | 3971 | { |
3960 | int rval; | 3972 | int rval; |
@@ -4013,7 +4025,7 @@ qla83xx_force_lock_recovery(scsi_qla_host_t *base_vha) | |||
4013 | return rval; | 4025 | return rval; |
4014 | } | 4026 | } |
4015 | 4027 | ||
4016 | int | 4028 | static int |
4017 | qla83xx_idc_lock_recovery(scsi_qla_host_t *base_vha) | 4029 | qla83xx_idc_lock_recovery(scsi_qla_host_t *base_vha) |
4018 | { | 4030 | { |
4019 | int rval = QLA_SUCCESS; | 4031 | int rval = QLA_SUCCESS; |
@@ -4212,7 +4224,7 @@ qla83xx_clear_drv_presence(scsi_qla_host_t *vha) | |||
4212 | return rval; | 4224 | return rval; |
4213 | } | 4225 | } |
4214 | 4226 | ||
4215 | void | 4227 | static void |
4216 | qla83xx_need_reset_handler(scsi_qla_host_t *vha) | 4228 | qla83xx_need_reset_handler(scsi_qla_host_t *vha) |
4217 | { | 4229 | { |
4218 | struct qla_hw_data *ha = vha->hw; | 4230 | struct qla_hw_data *ha = vha->hw; |
@@ -4224,7 +4236,7 @@ qla83xx_need_reset_handler(scsi_qla_host_t *vha) | |||
4224 | while (1) { | 4236 | while (1) { |
4225 | qla83xx_rd_reg(vha, QLA83XX_IDC_DRIVER_ACK, &drv_ack); | 4237 | qla83xx_rd_reg(vha, QLA83XX_IDC_DRIVER_ACK, &drv_ack); |
4226 | qla83xx_rd_reg(vha, QLA83XX_IDC_DRV_PRESENCE, &drv_presence); | 4238 | qla83xx_rd_reg(vha, QLA83XX_IDC_DRV_PRESENCE, &drv_presence); |
4227 | if (drv_ack == drv_presence) | 4239 | if ((drv_ack & drv_presence) == drv_presence) |
4228 | break; | 4240 | break; |
4229 | 4241 | ||
4230 | if (time_after_eq(jiffies, ack_timeout)) { | 4242 | if (time_after_eq(jiffies, ack_timeout)) { |
@@ -4251,7 +4263,7 @@ qla83xx_need_reset_handler(scsi_qla_host_t *vha) | |||
4251 | ql_log(ql_log_info, vha, 0xb068, "HW State: COLD/RE-INIT.\n"); | 4263 | ql_log(ql_log_info, vha, 0xb068, "HW State: COLD/RE-INIT.\n"); |
4252 | } | 4264 | } |
4253 | 4265 | ||
4254 | int | 4266 | static int |
4255 | qla83xx_device_bootstrap(scsi_qla_host_t *vha) | 4267 | qla83xx_device_bootstrap(scsi_qla_host_t *vha) |
4256 | { | 4268 | { |
4257 | int rval = QLA_SUCCESS; | 4269 | int rval = QLA_SUCCESS; |
@@ -4505,9 +4517,9 @@ qla2x00_do_dpc(void *data) | |||
4505 | "ISP abort end.\n"); | 4517 | "ISP abort end.\n"); |
4506 | } | 4518 | } |
4507 | 4519 | ||
4508 | if (test_bit(FCPORT_UPDATE_NEEDED, &base_vha->dpc_flags)) { | 4520 | if (test_and_clear_bit(FCPORT_UPDATE_NEEDED, |
4521 | &base_vha->dpc_flags)) { | ||
4509 | qla2x00_update_fcports(base_vha); | 4522 | qla2x00_update_fcports(base_vha); |
4510 | clear_bit(FCPORT_UPDATE_NEEDED, &base_vha->dpc_flags); | ||
4511 | } | 4523 | } |
4512 | 4524 | ||
4513 | if (test_bit(SCR_PENDING, &base_vha->dpc_flags)) { | 4525 | if (test_bit(SCR_PENDING, &base_vha->dpc_flags)) { |
@@ -4987,7 +4999,8 @@ qla2xxx_pci_mmio_enabled(struct pci_dev *pdev) | |||
4987 | return PCI_ERS_RESULT_RECOVERED; | 4999 | return PCI_ERS_RESULT_RECOVERED; |
4988 | } | 5000 | } |
4989 | 5001 | ||
4990 | uint32_t qla82xx_error_recovery(scsi_qla_host_t *base_vha) | 5002 | static uint32_t |
5003 | qla82xx_error_recovery(scsi_qla_host_t *base_vha) | ||
4991 | { | 5004 | { |
4992 | uint32_t rval = QLA_FUNCTION_FAILED; | 5005 | uint32_t rval = QLA_FUNCTION_FAILED; |
4993 | uint32_t drv_active = 0; | 5006 | uint32_t drv_active = 0; |
diff --git a/drivers/scsi/qla2xxx/qla_target.c b/drivers/scsi/qla2xxx/qla_target.c index b49d21779a24..ad1dc14bacce 100644 --- a/drivers/scsi/qla2xxx/qla_target.c +++ b/drivers/scsi/qla2xxx/qla_target.c | |||
@@ -1029,7 +1029,7 @@ void qlt_stop_phase2(struct qla_tgt *tgt) | |||
1029 | EXPORT_SYMBOL(qlt_stop_phase2); | 1029 | EXPORT_SYMBOL(qlt_stop_phase2); |
1030 | 1030 | ||
1031 | /* Called from qlt_remove_target() -> qla2x00_remove_one() */ | 1031 | /* Called from qlt_remove_target() -> qla2x00_remove_one() */ |
1032 | void qlt_release(struct qla_tgt *tgt) | 1032 | static void qlt_release(struct qla_tgt *tgt) |
1033 | { | 1033 | { |
1034 | struct qla_hw_data *ha = tgt->ha; | 1034 | struct qla_hw_data *ha = tgt->ha; |
1035 | 1035 | ||
diff --git a/drivers/scsi/qla2xxx/qla_version.h b/drivers/scsi/qla2xxx/qla_version.h index cfe934e1af42..49697ca41e78 100644 --- a/drivers/scsi/qla2xxx/qla_version.h +++ b/drivers/scsi/qla2xxx/qla_version.h | |||
@@ -7,7 +7,7 @@ | |||
7 | /* | 7 | /* |
8 | * Driver version | 8 | * Driver version |
9 | */ | 9 | */ |
10 | #define QLA2XXX_VERSION "8.04.00.07-k" | 10 | #define QLA2XXX_VERSION "8.04.00.08-k" |
11 | 11 | ||
12 | #define QLA_DRIVER_MAJOR_VER 8 | 12 | #define QLA_DRIVER_MAJOR_VER 8 |
13 | #define QLA_DRIVER_MINOR_VER 4 | 13 | #define QLA_DRIVER_MINOR_VER 4 |