diff options
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_gs.c')
-rw-r--r-- | drivers/scsi/qla2xxx/qla_gs.c | 52 |
1 files changed, 31 insertions, 21 deletions
diff --git a/drivers/scsi/qla2xxx/qla_gs.c b/drivers/scsi/qla2xxx/qla_gs.c index 692430365297..bf89e6c22a32 100644 --- a/drivers/scsi/qla2xxx/qla_gs.c +++ b/drivers/scsi/qla2xxx/qla_gs.c | |||
@@ -240,6 +240,12 @@ qla2x00_ga_nxt(scsi_qla_host_t *vha, fc_port_t *fcport) | |||
240 | return (rval); | 240 | return (rval); |
241 | } | 241 | } |
242 | 242 | ||
243 | static inline int | ||
244 | qla2x00_gid_pt_rsp_size(scsi_qla_host_t *vha) | ||
245 | { | ||
246 | return vha->hw->max_fibre_devices * 4 + 16; | ||
247 | } | ||
248 | |||
243 | /** | 249 | /** |
244 | * qla2x00_gid_pt() - SNS scan for fabric devices via GID_PT command. | 250 | * qla2x00_gid_pt() - SNS scan for fabric devices via GID_PT command. |
245 | * @ha: HA context | 251 | * @ha: HA context |
@@ -261,20 +267,21 @@ qla2x00_gid_pt(scsi_qla_host_t *vha, sw_info_t *list) | |||
261 | 267 | ||
262 | struct ct_sns_gid_pt_data *gid_data; | 268 | struct ct_sns_gid_pt_data *gid_data; |
263 | struct qla_hw_data *ha = vha->hw; | 269 | struct qla_hw_data *ha = vha->hw; |
270 | uint16_t gid_pt_rsp_size; | ||
264 | 271 | ||
265 | if (IS_QLA2100(ha) || IS_QLA2200(ha)) | 272 | if (IS_QLA2100(ha) || IS_QLA2200(ha)) |
266 | return qla2x00_sns_gid_pt(vha, list); | 273 | return qla2x00_sns_gid_pt(vha, list); |
267 | 274 | ||
268 | gid_data = NULL; | 275 | gid_data = NULL; |
269 | 276 | gid_pt_rsp_size = qla2x00_gid_pt_rsp_size(vha); | |
270 | /* Issue GID_PT */ | 277 | /* Issue GID_PT */ |
271 | /* Prepare common MS IOCB */ | 278 | /* Prepare common MS IOCB */ |
272 | ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GID_PT_REQ_SIZE, | 279 | ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GID_PT_REQ_SIZE, |
273 | GID_PT_RSP_SIZE); | 280 | gid_pt_rsp_size); |
274 | 281 | ||
275 | /* Prepare CT request */ | 282 | /* Prepare CT request */ |
276 | ct_req = qla2x00_prep_ct_req(&ha->ct_sns->p.req, GID_PT_CMD, | 283 | ct_req = qla2x00_prep_ct_req(&ha->ct_sns->p.req, GID_PT_CMD, |
277 | GID_PT_RSP_SIZE); | 284 | gid_pt_rsp_size); |
278 | ct_rsp = &ha->ct_sns->p.rsp; | 285 | ct_rsp = &ha->ct_sns->p.rsp; |
279 | 286 | ||
280 | /* Prepare CT arguments -- port_type */ | 287 | /* Prepare CT arguments -- port_type */ |
@@ -292,7 +299,7 @@ qla2x00_gid_pt(scsi_qla_host_t *vha, sw_info_t *list) | |||
292 | rval = QLA_FUNCTION_FAILED; | 299 | rval = QLA_FUNCTION_FAILED; |
293 | } else { | 300 | } else { |
294 | /* Set port IDs in switch info list. */ | 301 | /* Set port IDs in switch info list. */ |
295 | for (i = 0; i < MAX_FIBRE_DEVICES; i++) { | 302 | for (i = 0; i < ha->max_fibre_devices; i++) { |
296 | gid_data = &ct_rsp->rsp.gid_pt.entries[i]; | 303 | gid_data = &ct_rsp->rsp.gid_pt.entries[i]; |
297 | list[i].d_id.b.domain = gid_data->port_id[0]; | 304 | list[i].d_id.b.domain = gid_data->port_id[0]; |
298 | list[i].d_id.b.area = gid_data->port_id[1]; | 305 | list[i].d_id.b.area = gid_data->port_id[1]; |
@@ -313,7 +320,7 @@ qla2x00_gid_pt(scsi_qla_host_t *vha, sw_info_t *list) | |||
313 | * single call. Return a failed status, and let GA_NXT handle | 320 | * single call. Return a failed status, and let GA_NXT handle |
314 | * the overload. | 321 | * the overload. |
315 | */ | 322 | */ |
316 | if (i == MAX_FIBRE_DEVICES) | 323 | if (i == ha->max_fibre_devices) |
317 | rval = QLA_FUNCTION_FAILED; | 324 | rval = QLA_FUNCTION_FAILED; |
318 | } | 325 | } |
319 | 326 | ||
@@ -330,7 +337,7 @@ qla2x00_gid_pt(scsi_qla_host_t *vha, sw_info_t *list) | |||
330 | int | 337 | int |
331 | qla2x00_gpn_id(scsi_qla_host_t *vha, sw_info_t *list) | 338 | qla2x00_gpn_id(scsi_qla_host_t *vha, sw_info_t *list) |
332 | { | 339 | { |
333 | int rval; | 340 | int rval = QLA_SUCCESS; |
334 | uint16_t i; | 341 | uint16_t i; |
335 | 342 | ||
336 | ms_iocb_entry_t *ms_pkt; | 343 | ms_iocb_entry_t *ms_pkt; |
@@ -341,7 +348,7 @@ qla2x00_gpn_id(scsi_qla_host_t *vha, sw_info_t *list) | |||
341 | if (IS_QLA2100(ha) || IS_QLA2200(ha)) | 348 | if (IS_QLA2100(ha) || IS_QLA2200(ha)) |
342 | return qla2x00_sns_gpn_id(vha, list); | 349 | return qla2x00_sns_gpn_id(vha, list); |
343 | 350 | ||
344 | for (i = 0; i < MAX_FIBRE_DEVICES; i++) { | 351 | for (i = 0; i < ha->max_fibre_devices; i++) { |
345 | /* Issue GPN_ID */ | 352 | /* Issue GPN_ID */ |
346 | /* Prepare common MS IOCB */ | 353 | /* Prepare common MS IOCB */ |
347 | ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GPN_ID_REQ_SIZE, | 354 | ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GPN_ID_REQ_SIZE, |
@@ -391,7 +398,7 @@ qla2x00_gpn_id(scsi_qla_host_t *vha, sw_info_t *list) | |||
391 | int | 398 | int |
392 | qla2x00_gnn_id(scsi_qla_host_t *vha, sw_info_t *list) | 399 | qla2x00_gnn_id(scsi_qla_host_t *vha, sw_info_t *list) |
393 | { | 400 | { |
394 | int rval; | 401 | int rval = QLA_SUCCESS; |
395 | uint16_t i; | 402 | uint16_t i; |
396 | struct qla_hw_data *ha = vha->hw; | 403 | struct qla_hw_data *ha = vha->hw; |
397 | ms_iocb_entry_t *ms_pkt; | 404 | ms_iocb_entry_t *ms_pkt; |
@@ -401,7 +408,7 @@ qla2x00_gnn_id(scsi_qla_host_t *vha, sw_info_t *list) | |||
401 | if (IS_QLA2100(ha) || IS_QLA2200(ha)) | 408 | if (IS_QLA2100(ha) || IS_QLA2200(ha)) |
402 | return qla2x00_sns_gnn_id(vha, list); | 409 | return qla2x00_sns_gnn_id(vha, list); |
403 | 410 | ||
404 | for (i = 0; i < MAX_FIBRE_DEVICES; i++) { | 411 | for (i = 0; i < ha->max_fibre_devices; i++) { |
405 | /* Issue GNN_ID */ | 412 | /* Issue GNN_ID */ |
406 | /* Prepare common MS IOCB */ | 413 | /* Prepare common MS IOCB */ |
407 | ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GNN_ID_REQ_SIZE, | 414 | ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GNN_ID_REQ_SIZE, |
@@ -735,7 +742,7 @@ qla2x00_prep_sns_cmd(scsi_qla_host_t *vha, uint16_t cmd, uint16_t scmd_len, | |||
735 | static int | 742 | static int |
736 | qla2x00_sns_ga_nxt(scsi_qla_host_t *vha, fc_port_t *fcport) | 743 | qla2x00_sns_ga_nxt(scsi_qla_host_t *vha, fc_port_t *fcport) |
737 | { | 744 | { |
738 | int rval; | 745 | int rval = QLA_SUCCESS; |
739 | struct qla_hw_data *ha = vha->hw; | 746 | struct qla_hw_data *ha = vha->hw; |
740 | struct sns_cmd_pkt *sns_cmd; | 747 | struct sns_cmd_pkt *sns_cmd; |
741 | 748 | ||
@@ -814,11 +821,14 @@ qla2x00_sns_gid_pt(scsi_qla_host_t *vha, sw_info_t *list) | |||
814 | uint16_t i; | 821 | uint16_t i; |
815 | uint8_t *entry; | 822 | uint8_t *entry; |
816 | struct sns_cmd_pkt *sns_cmd; | 823 | struct sns_cmd_pkt *sns_cmd; |
824 | uint16_t gid_pt_sns_data_size; | ||
825 | |||
826 | gid_pt_sns_data_size = qla2x00_gid_pt_rsp_size(vha); | ||
817 | 827 | ||
818 | /* Issue GID_PT. */ | 828 | /* Issue GID_PT. */ |
819 | /* Prepare SNS command request. */ | 829 | /* Prepare SNS command request. */ |
820 | sns_cmd = qla2x00_prep_sns_cmd(vha, GID_PT_CMD, GID_PT_SNS_SCMD_LEN, | 830 | sns_cmd = qla2x00_prep_sns_cmd(vha, GID_PT_CMD, GID_PT_SNS_SCMD_LEN, |
821 | GID_PT_SNS_DATA_SIZE); | 831 | gid_pt_sns_data_size); |
822 | 832 | ||
823 | /* Prepare SNS command arguments -- port_type. */ | 833 | /* Prepare SNS command arguments -- port_type. */ |
824 | sns_cmd->p.cmd.param[0] = NS_NX_PORT_TYPE; | 834 | sns_cmd->p.cmd.param[0] = NS_NX_PORT_TYPE; |
@@ -839,7 +849,7 @@ qla2x00_sns_gid_pt(scsi_qla_host_t *vha, sw_info_t *list) | |||
839 | rval = QLA_FUNCTION_FAILED; | 849 | rval = QLA_FUNCTION_FAILED; |
840 | } else { | 850 | } else { |
841 | /* Set port IDs in switch info list. */ | 851 | /* Set port IDs in switch info list. */ |
842 | for (i = 0; i < MAX_FIBRE_DEVICES; i++) { | 852 | for (i = 0; i < ha->max_fibre_devices; i++) { |
843 | entry = &sns_cmd->p.gid_data[(i * 4) + 16]; | 853 | entry = &sns_cmd->p.gid_data[(i * 4) + 16]; |
844 | list[i].d_id.b.domain = entry[1]; | 854 | list[i].d_id.b.domain = entry[1]; |
845 | list[i].d_id.b.area = entry[2]; | 855 | list[i].d_id.b.area = entry[2]; |
@@ -858,7 +868,7 @@ qla2x00_sns_gid_pt(scsi_qla_host_t *vha, sw_info_t *list) | |||
858 | * single call. Return a failed status, and let GA_NXT handle | 868 | * single call. Return a failed status, and let GA_NXT handle |
859 | * the overload. | 869 | * the overload. |
860 | */ | 870 | */ |
861 | if (i == MAX_FIBRE_DEVICES) | 871 | if (i == ha->max_fibre_devices) |
862 | rval = QLA_FUNCTION_FAILED; | 872 | rval = QLA_FUNCTION_FAILED; |
863 | } | 873 | } |
864 | 874 | ||
@@ -877,12 +887,12 @@ qla2x00_sns_gid_pt(scsi_qla_host_t *vha, sw_info_t *list) | |||
877 | static int | 887 | static int |
878 | qla2x00_sns_gpn_id(scsi_qla_host_t *vha, sw_info_t *list) | 888 | qla2x00_sns_gpn_id(scsi_qla_host_t *vha, sw_info_t *list) |
879 | { | 889 | { |
880 | int rval; | 890 | int rval = QLA_SUCCESS; |
881 | struct qla_hw_data *ha = vha->hw; | 891 | struct qla_hw_data *ha = vha->hw; |
882 | uint16_t i; | 892 | uint16_t i; |
883 | struct sns_cmd_pkt *sns_cmd; | 893 | struct sns_cmd_pkt *sns_cmd; |
884 | 894 | ||
885 | for (i = 0; i < MAX_FIBRE_DEVICES; i++) { | 895 | for (i = 0; i < ha->max_fibre_devices; i++) { |
886 | /* Issue GPN_ID */ | 896 | /* Issue GPN_ID */ |
887 | /* Prepare SNS command request. */ | 897 | /* Prepare SNS command request. */ |
888 | sns_cmd = qla2x00_prep_sns_cmd(vha, GPN_ID_CMD, | 898 | sns_cmd = qla2x00_prep_sns_cmd(vha, GPN_ID_CMD, |
@@ -933,12 +943,12 @@ qla2x00_sns_gpn_id(scsi_qla_host_t *vha, sw_info_t *list) | |||
933 | static int | 943 | static int |
934 | qla2x00_sns_gnn_id(scsi_qla_host_t *vha, sw_info_t *list) | 944 | qla2x00_sns_gnn_id(scsi_qla_host_t *vha, sw_info_t *list) |
935 | { | 945 | { |
936 | int rval; | 946 | int rval = QLA_SUCCESS; |
937 | struct qla_hw_data *ha = vha->hw; | 947 | struct qla_hw_data *ha = vha->hw; |
938 | uint16_t i; | 948 | uint16_t i; |
939 | struct sns_cmd_pkt *sns_cmd; | 949 | struct sns_cmd_pkt *sns_cmd; |
940 | 950 | ||
941 | for (i = 0; i < MAX_FIBRE_DEVICES; i++) { | 951 | for (i = 0; i < ha->max_fibre_devices; i++) { |
942 | /* Issue GNN_ID */ | 952 | /* Issue GNN_ID */ |
943 | /* Prepare SNS command request. */ | 953 | /* Prepare SNS command request. */ |
944 | sns_cmd = qla2x00_prep_sns_cmd(vha, GNN_ID_CMD, | 954 | sns_cmd = qla2x00_prep_sns_cmd(vha, GNN_ID_CMD, |
@@ -1734,7 +1744,7 @@ qla2x00_fdmi_register(scsi_qla_host_t *vha) | |||
1734 | int | 1744 | int |
1735 | qla2x00_gfpn_id(scsi_qla_host_t *vha, sw_info_t *list) | 1745 | qla2x00_gfpn_id(scsi_qla_host_t *vha, sw_info_t *list) |
1736 | { | 1746 | { |
1737 | int rval; | 1747 | int rval = QLA_SUCCESS; |
1738 | uint16_t i; | 1748 | uint16_t i; |
1739 | struct qla_hw_data *ha = vha->hw; | 1749 | struct qla_hw_data *ha = vha->hw; |
1740 | ms_iocb_entry_t *ms_pkt; | 1750 | ms_iocb_entry_t *ms_pkt; |
@@ -1744,7 +1754,7 @@ qla2x00_gfpn_id(scsi_qla_host_t *vha, sw_info_t *list) | |||
1744 | if (!IS_IIDMA_CAPABLE(ha)) | 1754 | if (!IS_IIDMA_CAPABLE(ha)) |
1745 | return QLA_FUNCTION_FAILED; | 1755 | return QLA_FUNCTION_FAILED; |
1746 | 1756 | ||
1747 | for (i = 0; i < MAX_FIBRE_DEVICES; i++) { | 1757 | for (i = 0; i < ha->max_fibre_devices; i++) { |
1748 | /* Issue GFPN_ID */ | 1758 | /* Issue GFPN_ID */ |
1749 | /* Prepare common MS IOCB */ | 1759 | /* Prepare common MS IOCB */ |
1750 | ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GFPN_ID_REQ_SIZE, | 1760 | ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GFPN_ID_REQ_SIZE, |
@@ -1856,7 +1866,7 @@ qla2x00_gpsc(scsi_qla_host_t *vha, sw_info_t *list) | |||
1856 | if (rval) | 1866 | if (rval) |
1857 | return rval; | 1867 | return rval; |
1858 | 1868 | ||
1859 | for (i = 0; i < MAX_FIBRE_DEVICES; i++) { | 1869 | for (i = 0; i < ha->max_fibre_devices; i++) { |
1860 | /* Issue GFPN_ID */ | 1870 | /* Issue GFPN_ID */ |
1861 | /* Prepare common MS IOCB */ | 1871 | /* Prepare common MS IOCB */ |
1862 | ms_pkt = qla24xx_prep_ms_fm_iocb(vha, GPSC_REQ_SIZE, | 1872 | ms_pkt = qla24xx_prep_ms_fm_iocb(vha, GPSC_REQ_SIZE, |
@@ -1957,7 +1967,7 @@ qla2x00_gff_id(scsi_qla_host_t *vha, sw_info_t *list) | |||
1957 | struct qla_hw_data *ha = vha->hw; | 1967 | struct qla_hw_data *ha = vha->hw; |
1958 | uint8_t fcp_scsi_features = 0; | 1968 | uint8_t fcp_scsi_features = 0; |
1959 | 1969 | ||
1960 | for (i = 0; i < MAX_FIBRE_DEVICES; i++) { | 1970 | for (i = 0; i < ha->max_fibre_devices; i++) { |
1961 | /* Set default FC4 Type as UNKNOWN so the default is to | 1971 | /* Set default FC4 Type as UNKNOWN so the default is to |
1962 | * Process this port */ | 1972 | * Process this port */ |
1963 | list[i].fc4_type = FC4_TYPE_UNKNOWN; | 1973 | list[i].fc4_type = FC4_TYPE_UNKNOWN; |