aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/qla2xxx/qla_gs.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/qla2xxx/qla_gs.c')
-rw-r--r--drivers/scsi/qla2xxx/qla_gs.c52
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
243static inline int
244qla2x00_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)
330int 337int
331qla2x00_gpn_id(scsi_qla_host_t *vha, sw_info_t *list) 338qla2x00_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)
391int 398int
392qla2x00_gnn_id(scsi_qla_host_t *vha, sw_info_t *list) 399qla2x00_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,
735static int 742static int
736qla2x00_sns_ga_nxt(scsi_qla_host_t *vha, fc_port_t *fcport) 743qla2x00_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)
877static int 887static int
878qla2x00_sns_gpn_id(scsi_qla_host_t *vha, sw_info_t *list) 888qla2x00_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)
933static int 943static int
934qla2x00_sns_gnn_id(scsi_qla_host_t *vha, sw_info_t *list) 944qla2x00_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)
1734int 1744int
1735qla2x00_gfpn_id(scsi_qla_host_t *vha, sw_info_t *list) 1745qla2x00_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;