aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/scsi/qla2xxx
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/scsi/qla2xxx')
-rw-r--r--drivers/scsi/qla2xxx/qla_dbg.c4
-rw-r--r--drivers/scsi/qla2xxx/qla_def.h20
-rw-r--r--drivers/scsi/qla2xxx/qla_gs.c52
-rw-r--r--drivers/scsi/qla2xxx/qla_init.c11
-rw-r--r--drivers/scsi/qla2xxx/qla_inline.h6
-rw-r--r--drivers/scsi/qla2xxx/qla_mid.c2
-rw-r--r--drivers/scsi/qla2xxx/qla_os.c30
7 files changed, 77 insertions, 48 deletions
diff --git a/drivers/scsi/qla2xxx/qla_dbg.c b/drivers/scsi/qla2xxx/qla_dbg.c
index d16b1c04512b..897731b93df2 100644
--- a/drivers/scsi/qla2xxx/qla_dbg.c
+++ b/drivers/scsi/qla2xxx/qla_dbg.c
@@ -89,7 +89,7 @@ qla24xx_dump_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram,
89 WRT_REG_WORD(&reg->mailbox0, MBC_DUMP_RISC_RAM_EXTENDED); 89 WRT_REG_WORD(&reg->mailbox0, MBC_DUMP_RISC_RAM_EXTENDED);
90 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); 90 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
91 91
92 dwords = GID_LIST_SIZE / 4; 92 dwords = qla2x00_gid_list_size(ha) / 4;
93 for (cnt = 0; cnt < ram_dwords && rval == QLA_SUCCESS; 93 for (cnt = 0; cnt < ram_dwords && rval == QLA_SUCCESS;
94 cnt += dwords, addr += dwords) { 94 cnt += dwords, addr += dwords) {
95 if (cnt + dwords > ram_dwords) 95 if (cnt + dwords > ram_dwords)
@@ -264,7 +264,7 @@ qla2xxx_dump_ram(struct qla_hw_data *ha, uint32_t addr, uint16_t *ram,
264 WRT_MAILBOX_REG(ha, reg, 0, MBC_DUMP_RISC_RAM_EXTENDED); 264 WRT_MAILBOX_REG(ha, reg, 0, MBC_DUMP_RISC_RAM_EXTENDED);
265 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags); 265 clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
266 266
267 words = GID_LIST_SIZE / 2; 267 words = qla2x00_gid_list_size(ha) / 2;
268 for (cnt = 0; cnt < ram_words && rval == QLA_SUCCESS; 268 for (cnt = 0; cnt < ram_words && rval == QLA_SUCCESS;
269 cnt += words, addr += words) { 269 cnt += words, addr += words) {
270 if (cnt + words > ram_words) 270 if (cnt + words > ram_words)
diff --git a/drivers/scsi/qla2xxx/qla_def.h b/drivers/scsi/qla2xxx/qla_def.h
index 649748ffbe79..a2443031dbe7 100644
--- a/drivers/scsi/qla2xxx/qla_def.h
+++ b/drivers/scsi/qla2xxx/qla_def.h
@@ -125,7 +125,10 @@
125 * Fibre Channel device definitions. 125 * Fibre Channel device definitions.
126 */ 126 */
127#define WWN_SIZE 8 /* Size of WWPN, WWN & WWNN */ 127#define WWN_SIZE 8 /* Size of WWPN, WWN & WWNN */
128#define MAX_FIBRE_DEVICES 512 128#define MAX_FIBRE_DEVICES_2100 512
129#define MAX_FIBRE_DEVICES_2400 2048
130#define MAX_FIBRE_DEVICES_LOOP 128
131#define MAX_FIBRE_DEVICES_MAX MAX_FIBRE_DEVICES_2400
129#define MAX_FIBRE_LUNS 0xFFFF 132#define MAX_FIBRE_LUNS 0xFFFF
130#define MAX_HOST_COUNT 16 133#define MAX_HOST_COUNT 16
131 134
@@ -133,8 +136,6 @@
133 * Host adapter default definitions. 136 * Host adapter default definitions.
134 */ 137 */
135#define MAX_BUSES 1 /* We only have one bus today */ 138#define MAX_BUSES 1 /* We only have one bus today */
136#define MAX_TARGETS_2100 MAX_FIBRE_DEVICES
137#define MAX_TARGETS_2200 MAX_FIBRE_DEVICES
138#define MIN_LUNS 8 139#define MIN_LUNS 8
139#define MAX_LUNS MAX_FIBRE_LUNS 140#define MAX_LUNS MAX_FIBRE_LUNS
140#define MAX_CMDS_PER_LUN 255 141#define MAX_CMDS_PER_LUN 255
@@ -1773,7 +1774,6 @@ static const char * const port_state_str[] = {
1773 1774
1774#define GID_PT_CMD 0x1A1 1775#define GID_PT_CMD 0x1A1
1775#define GID_PT_REQ_SIZE (16 + 4) 1776#define GID_PT_REQ_SIZE (16 + 4)
1776#define GID_PT_RSP_SIZE (16 + (MAX_FIBRE_DEVICES * 4))
1777 1777
1778#define GPN_ID_CMD 0x112 1778#define GPN_ID_CMD 0x112
1779#define GPN_ID_REQ_SIZE (16 + 4) 1779#define GPN_ID_REQ_SIZE (16 + 4)
@@ -2063,7 +2063,9 @@ struct ct_sns_rsp {
2063 } ga_nxt; 2063 } ga_nxt;
2064 2064
2065 struct { 2065 struct {
2066 struct ct_sns_gid_pt_data entries[MAX_FIBRE_DEVICES]; 2066 /* Assume the largest number of targets for the union */
2067 struct ct_sns_gid_pt_data
2068 entries[MAX_FIBRE_DEVICES_MAX];
2067 } gid_pt; 2069 } gid_pt;
2068 2070
2069 struct { 2071 struct {
@@ -2124,7 +2126,11 @@ struct ct_sns_pkt {
2124 2126
2125#define GID_PT_SNS_SCMD_LEN 6 2127#define GID_PT_SNS_SCMD_LEN 6
2126#define GID_PT_SNS_CMD_SIZE 28 2128#define GID_PT_SNS_CMD_SIZE 28
2127#define GID_PT_SNS_DATA_SIZE (MAX_FIBRE_DEVICES * 4 + 16) 2129/*
2130 * Assume MAX_FIBRE_DEVICES_2100 as these defines are only used with older
2131 * adapters.
2132 */
2133#define GID_PT_SNS_DATA_SIZE (MAX_FIBRE_DEVICES_2100 * 4 + 16)
2128 2134
2129#define GPN_ID_SNS_SCMD_LEN 6 2135#define GPN_ID_SNS_SCMD_LEN 6
2130#define GPN_ID_SNS_CMD_SIZE 28 2136#define GPN_ID_SNS_CMD_SIZE 28
@@ -2172,7 +2178,6 @@ struct gid_list_info {
2172 uint16_t loop_id; /* ISP23XX -- 6 bytes. */ 2178 uint16_t loop_id; /* ISP23XX -- 6 bytes. */
2173 uint16_t reserved_1; /* ISP24XX -- 8 bytes. */ 2179 uint16_t reserved_1; /* ISP24XX -- 8 bytes. */
2174}; 2180};
2175#define GID_LIST_SIZE (sizeof(struct gid_list_info) * MAX_FIBRE_DEVICES)
2176 2181
2177/* NPIV */ 2182/* NPIV */
2178typedef struct vport_info { 2183typedef struct vport_info {
@@ -2499,6 +2504,7 @@ struct qla_hw_data {
2499 atomic_t loop_down_timer; /* loop down timer */ 2504 atomic_t loop_down_timer; /* loop down timer */
2500 uint8_t link_down_timeout; /* link down timeout */ 2505 uint8_t link_down_timeout; /* link down timeout */
2501 uint16_t max_loop_id; 2506 uint16_t max_loop_id;
2507 uint16_t max_fibre_devices; /* Maximum number of targets */
2502 2508
2503 uint16_t fb_rev; 2509 uint16_t fb_rev;
2504 uint16_t min_external_loopid; /* First external loop Id */ 2510 uint16_t min_external_loopid; /* First external loop Id */
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;
diff --git a/drivers/scsi/qla2xxx/qla_init.c b/drivers/scsi/qla2xxx/qla_init.c
index 24b2d1118593..2627c87a4a34 100644
--- a/drivers/scsi/qla2xxx/qla_init.c
+++ b/drivers/scsi/qla2xxx/qla_init.c
@@ -2567,8 +2567,7 @@ qla2x00_configure_loop(scsi_qla_host_t *vha)
2567 ql_dbg(ql_dbg_disc, vha, 0x2015, 2567 ql_dbg(ql_dbg_disc, vha, 0x2015,
2568 "Loop resync needed, failing.\n"); 2568 "Loop resync needed, failing.\n");
2569 rval = QLA_FUNCTION_FAILED; 2569 rval = QLA_FUNCTION_FAILED;
2570 } 2570 } else
2571 else
2572 rval = qla2x00_configure_local_loop(vha); 2571 rval = qla2x00_configure_local_loop(vha);
2573 } 2572 }
2574 2573
@@ -2642,7 +2641,7 @@ qla2x00_configure_local_loop(scsi_qla_host_t *vha)
2642 2641
2643 found_devs = 0; 2642 found_devs = 0;
2644 new_fcport = NULL; 2643 new_fcport = NULL;
2645 entries = MAX_FIBRE_DEVICES; 2644 entries = MAX_FIBRE_DEVICES_LOOP;
2646 2645
2647 ql_dbg(ql_dbg_disc, vha, 0x2016, 2646 ql_dbg(ql_dbg_disc, vha, 0x2016,
2648 "Getting FCAL position map.\n"); 2647 "Getting FCAL position map.\n");
@@ -2650,7 +2649,7 @@ qla2x00_configure_local_loop(scsi_qla_host_t *vha)
2650 qla2x00_get_fcal_position_map(vha, NULL); 2649 qla2x00_get_fcal_position_map(vha, NULL);
2651 2650
2652 /* Get list of logged in devices. */ 2651 /* Get list of logged in devices. */
2653 memset(ha->gid_list, 0, GID_LIST_SIZE); 2652 memset(ha->gid_list, 0, qla2x00_gid_list_size(ha));
2654 rval = qla2x00_get_id_list(vha, ha->gid_list, ha->gid_list_dma, 2653 rval = qla2x00_get_id_list(vha, ha->gid_list, ha->gid_list_dma,
2655 &entries); 2654 &entries);
2656 if (rval != QLA_SUCCESS) 2655 if (rval != QLA_SUCCESS)
@@ -3134,7 +3133,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
3134 3133
3135 /* Try GID_PT to get device list, else GAN. */ 3134 /* Try GID_PT to get device list, else GAN. */
3136 if (!ha->swl) 3135 if (!ha->swl)
3137 ha->swl = kcalloc(MAX_FIBRE_DEVICES, sizeof(sw_info_t), 3136 ha->swl = kcalloc(ha->max_fibre_devices, sizeof(sw_info_t),
3138 GFP_KERNEL); 3137 GFP_KERNEL);
3139 swl = ha->swl; 3138 swl = ha->swl;
3140 if (!swl) { 3139 if (!swl) {
@@ -3142,7 +3141,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
3142 ql_dbg(ql_dbg_disc, vha, 0x2054, 3141 ql_dbg(ql_dbg_disc, vha, 0x2054,
3143 "GID_PT allocations failed, fallback on GA_NXT.\n"); 3142 "GID_PT allocations failed, fallback on GA_NXT.\n");
3144 } else { 3143 } else {
3145 memset(swl, 0, MAX_FIBRE_DEVICES * sizeof(sw_info_t)); 3144 memset(swl, 0, ha->max_fibre_devices * sizeof(sw_info_t));
3146 if (qla2x00_gid_pt(vha, swl) != QLA_SUCCESS) { 3145 if (qla2x00_gid_pt(vha, swl) != QLA_SUCCESS) {
3147 swl = NULL; 3146 swl = NULL;
3148 } else if (qla2x00_gpn_id(vha, swl) != QLA_SUCCESS) { 3147 } else if (qla2x00_gpn_id(vha, swl) != QLA_SUCCESS) {
diff --git a/drivers/scsi/qla2xxx/qla_inline.h b/drivers/scsi/qla2xxx/qla_inline.h
index 3ea0cedc6e77..6e457643c639 100644
--- a/drivers/scsi/qla2xxx/qla_inline.h
+++ b/drivers/scsi/qla2xxx/qla_inline.h
@@ -181,3 +181,9 @@ qla2x00_init_timer(srb_t *sp, unsigned long tmo)
181 add_timer(&sp->u.iocb_cmd.timer); 181 add_timer(&sp->u.iocb_cmd.timer);
182 sp->free = qla2x00_sp_free; 182 sp->free = qla2x00_sp_free;
183} 183}
184
185static inline int
186qla2x00_gid_list_size(struct qla_hw_data *ha)
187{
188 return sizeof(struct gid_list_info) * ha->max_fibre_devices;
189}
diff --git a/drivers/scsi/qla2xxx/qla_mid.c b/drivers/scsi/qla2xxx/qla_mid.c
index f488cc69fc79..aa062a1b0ca4 100644
--- a/drivers/scsi/qla2xxx/qla_mid.c
+++ b/drivers/scsi/qla2xxx/qla_mid.c
@@ -479,7 +479,7 @@ qla24xx_create_vhost(struct fc_vport *fc_vport)
479 host->max_channel = MAX_BUSES - 1; 479 host->max_channel = MAX_BUSES - 1;
480 host->max_lun = ql2xmaxlun; 480 host->max_lun = ql2xmaxlun;
481 host->unique_id = host->host_no; 481 host->unique_id = host->host_no;
482 host->max_id = MAX_TARGETS_2200; 482 host->max_id = ha->max_fibre_devices;
483 host->transportt = qla2xxx_transport_vport_template; 483 host->transportt = qla2xxx_transport_vport_template;
484 484
485 ql_dbg(ql_dbg_vport, vha, 0xa007, 485 ql_dbg(ql_dbg_vport, vha, 0xa007,
diff --git a/drivers/scsi/qla2xxx/qla_os.c b/drivers/scsi/qla2xxx/qla_os.c
index 94ff3a591471..094af74989d6 100644
--- a/drivers/scsi/qla2xxx/qla_os.c
+++ b/drivers/scsi/qla2xxx/qla_os.c
@@ -2135,7 +2135,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2135 char pci_info[30]; 2135 char pci_info[30];
2136 char fw_str[30]; 2136 char fw_str[30];
2137 struct scsi_host_template *sht; 2137 struct scsi_host_template *sht;
2138 int bars, max_id, mem_only = 0; 2138 int bars, mem_only = 0;
2139 uint16_t req_length = 0, rsp_length = 0; 2139 uint16_t req_length = 0, rsp_length = 0;
2140 struct req_que *req = NULL; 2140 struct req_que *req = NULL;
2141 struct rsp_que *rsp = NULL; 2141 struct rsp_que *rsp = NULL;
@@ -2200,9 +2200,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2200 ha->optrom_size = OPTROM_SIZE_2300; 2200 ha->optrom_size = OPTROM_SIZE_2300;
2201 2201
2202 /* Assign ISP specific operations. */ 2202 /* Assign ISP specific operations. */
2203 max_id = MAX_TARGETS_2200;
2204 if (IS_QLA2100(ha)) { 2203 if (IS_QLA2100(ha)) {
2205 max_id = MAX_TARGETS_2100; 2204 ha->max_fibre_devices = MAX_FIBRE_DEVICES_2100;
2206 ha->mbx_count = MAILBOX_REGISTER_COUNT_2100; 2205 ha->mbx_count = MAILBOX_REGISTER_COUNT_2100;
2207 req_length = REQUEST_ENTRY_CNT_2100; 2206 req_length = REQUEST_ENTRY_CNT_2100;
2208 rsp_length = RESPONSE_ENTRY_CNT_2100; 2207 rsp_length = RESPONSE_ENTRY_CNT_2100;
@@ -2214,6 +2213,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2214 ha->nvram_data_off = ~0; 2213 ha->nvram_data_off = ~0;
2215 ha->isp_ops = &qla2100_isp_ops; 2214 ha->isp_ops = &qla2100_isp_ops;
2216 } else if (IS_QLA2200(ha)) { 2215 } else if (IS_QLA2200(ha)) {
2216 ha->max_fibre_devices = MAX_FIBRE_DEVICES_2100;
2217 ha->mbx_count = MAILBOX_REGISTER_COUNT_2200; 2217 ha->mbx_count = MAILBOX_REGISTER_COUNT_2200;
2218 req_length = REQUEST_ENTRY_CNT_2200; 2218 req_length = REQUEST_ENTRY_CNT_2200;
2219 rsp_length = RESPONSE_ENTRY_CNT_2100; 2219 rsp_length = RESPONSE_ENTRY_CNT_2100;
@@ -2225,6 +2225,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2225 ha->nvram_data_off = ~0; 2225 ha->nvram_data_off = ~0;
2226 ha->isp_ops = &qla2100_isp_ops; 2226 ha->isp_ops = &qla2100_isp_ops;
2227 } else if (IS_QLA23XX(ha)) { 2227 } else if (IS_QLA23XX(ha)) {
2228 ha->max_fibre_devices = MAX_FIBRE_DEVICES_2100;
2228 ha->mbx_count = MAILBOX_REGISTER_COUNT; 2229 ha->mbx_count = MAILBOX_REGISTER_COUNT;
2229 req_length = REQUEST_ENTRY_CNT_2200; 2230 req_length = REQUEST_ENTRY_CNT_2200;
2230 rsp_length = RESPONSE_ENTRY_CNT_2300; 2231 rsp_length = RESPONSE_ENTRY_CNT_2300;
@@ -2238,6 +2239,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2238 ha->nvram_data_off = ~0; 2239 ha->nvram_data_off = ~0;
2239 ha->isp_ops = &qla2300_isp_ops; 2240 ha->isp_ops = &qla2300_isp_ops;
2240 } else if (IS_QLA24XX_TYPE(ha)) { 2241 } else if (IS_QLA24XX_TYPE(ha)) {
2242 ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400;
2241 ha->mbx_count = MAILBOX_REGISTER_COUNT; 2243 ha->mbx_count = MAILBOX_REGISTER_COUNT;
2242 req_length = REQUEST_ENTRY_CNT_24XX; 2244 req_length = REQUEST_ENTRY_CNT_24XX;
2243 rsp_length = RESPONSE_ENTRY_CNT_2300; 2245 rsp_length = RESPONSE_ENTRY_CNT_2300;
@@ -2252,6 +2254,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2252 ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF; 2254 ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF;
2253 ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA; 2255 ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA;
2254 } else if (IS_QLA25XX(ha)) { 2256 } else if (IS_QLA25XX(ha)) {
2257 ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400;
2255 ha->mbx_count = MAILBOX_REGISTER_COUNT; 2258 ha->mbx_count = MAILBOX_REGISTER_COUNT;
2256 req_length = REQUEST_ENTRY_CNT_24XX; 2259 req_length = REQUEST_ENTRY_CNT_24XX;
2257 rsp_length = RESPONSE_ENTRY_CNT_2300; 2260 rsp_length = RESPONSE_ENTRY_CNT_2300;
@@ -2266,6 +2269,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2266 ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF; 2269 ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF;
2267 ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA; 2270 ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA;
2268 } else if (IS_QLA81XX(ha)) { 2271 } else if (IS_QLA81XX(ha)) {
2272 ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400;
2269 ha->mbx_count = MAILBOX_REGISTER_COUNT; 2273 ha->mbx_count = MAILBOX_REGISTER_COUNT;
2270 req_length = REQUEST_ENTRY_CNT_24XX; 2274 req_length = REQUEST_ENTRY_CNT_24XX;
2271 rsp_length = RESPONSE_ENTRY_CNT_2300; 2275 rsp_length = RESPONSE_ENTRY_CNT_2300;
@@ -2280,6 +2284,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2280 ha->nvram_conf_off = ~0; 2284 ha->nvram_conf_off = ~0;
2281 ha->nvram_data_off = ~0; 2285 ha->nvram_data_off = ~0;
2282 } else if (IS_QLA82XX(ha)) { 2286 } else if (IS_QLA82XX(ha)) {
2287 ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400;
2283 ha->mbx_count = MAILBOX_REGISTER_COUNT; 2288 ha->mbx_count = MAILBOX_REGISTER_COUNT;
2284 req_length = REQUEST_ENTRY_CNT_82XX; 2289 req_length = REQUEST_ENTRY_CNT_82XX;
2285 rsp_length = RESPONSE_ENTRY_CNT_82XX; 2290 rsp_length = RESPONSE_ENTRY_CNT_82XX;
@@ -2294,6 +2299,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2294 ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF; 2299 ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF;
2295 ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA; 2300 ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA;
2296 } else if (IS_QLA83XX(ha)) { 2301 } else if (IS_QLA83XX(ha)) {
2302 ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400;
2297 ha->mbx_count = MAILBOX_REGISTER_COUNT; 2303 ha->mbx_count = MAILBOX_REGISTER_COUNT;
2298 req_length = REQUEST_ENTRY_CNT_24XX; 2304 req_length = REQUEST_ENTRY_CNT_24XX;
2299 rsp_length = RESPONSE_ENTRY_CNT_2300; 2305 rsp_length = RESPONSE_ENTRY_CNT_2300;
@@ -2312,10 +2318,11 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2312 ql_dbg_pci(ql_dbg_init, pdev, 0x001e, 2318 ql_dbg_pci(ql_dbg_init, pdev, 0x001e,
2313 "mbx_count=%d, req_length=%d, " 2319 "mbx_count=%d, req_length=%d, "
2314 "rsp_length=%d, max_loop_id=%d, init_cb_size=%d, " 2320 "rsp_length=%d, max_loop_id=%d, init_cb_size=%d, "
2315 "gid_list_info_size=%d, optrom_size=%d, nvram_npiv_size=%d, .\n", 2321 "gid_list_info_size=%d, optrom_size=%d, nvram_npiv_size=%d, "
2322 "max_fibre_devices=%d.\n",
2316 ha->mbx_count, req_length, rsp_length, ha->max_loop_id, 2323 ha->mbx_count, req_length, rsp_length, ha->max_loop_id,
2317 ha->init_cb_size, ha->gid_list_info_size, ha->optrom_size, 2324 ha->init_cb_size, ha->gid_list_info_size, ha->optrom_size,
2318 ha->nvram_npiv_size); 2325 ha->nvram_npiv_size, ha->max_fibre_devices);
2319 ql_dbg_pci(ql_dbg_init, pdev, 0x001f, 2326 ql_dbg_pci(ql_dbg_init, pdev, 0x001f,
2320 "isp_ops=%p, flash_conf_off=%d, " 2327 "isp_ops=%p, flash_conf_off=%d, "
2321 "flash_data_off=%d, nvram_conf_off=%d, nvram_data_off=%d.\n", 2328 "flash_data_off=%d, nvram_conf_off=%d, nvram_data_off=%d.\n",
@@ -2389,7 +2396,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
2389 "mgmt_svr_loop_id=%d, sg_tablesize=%d.\n", 2396 "mgmt_svr_loop_id=%d, sg_tablesize=%d.\n",
2390 host->can_queue, base_vha->req, 2397 host->can_queue, base_vha->req,
2391 base_vha->mgmt_svr_loop_id, host->sg_tablesize); 2398 base_vha->mgmt_svr_loop_id, host->sg_tablesize);
2392 host->max_id = max_id; 2399 host->max_id = ha->max_fibre_devices;
2393 host->this_id = 255; 2400 host->this_id = 255;
2394 host->cmd_per_lun = 3; 2401 host->cmd_per_lun = 3;
2395 host->unique_id = host->host_no; 2402 host->unique_id = host->host_no;
@@ -2939,8 +2946,8 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len,
2939 if (!ha->init_cb) 2946 if (!ha->init_cb)
2940 goto fail; 2947 goto fail;
2941 2948
2942 ha->gid_list = dma_alloc_coherent(&ha->pdev->dev, GID_LIST_SIZE, 2949 ha->gid_list = dma_alloc_coherent(&ha->pdev->dev,
2943 &ha->gid_list_dma, GFP_KERNEL); 2950 qla2x00_gid_list_size(ha), &ha->gid_list_dma, GFP_KERNEL);
2944 if (!ha->gid_list) 2951 if (!ha->gid_list)
2945 goto fail_free_init_cb; 2952 goto fail_free_init_cb;
2946 2953
@@ -3155,7 +3162,8 @@ fail_free_srb_mempool:
3155 mempool_destroy(ha->srb_mempool); 3162 mempool_destroy(ha->srb_mempool);
3156 ha->srb_mempool = NULL; 3163 ha->srb_mempool = NULL;
3157fail_free_gid_list: 3164fail_free_gid_list:
3158 dma_free_coherent(&ha->pdev->dev, GID_LIST_SIZE, ha->gid_list, 3165 dma_free_coherent(&ha->pdev->dev, qla2x00_gid_list_size(ha),
3166 ha->gid_list,
3159 ha->gid_list_dma); 3167 ha->gid_list_dma);
3160 ha->gid_list = NULL; 3168 ha->gid_list = NULL;
3161 ha->gid_list_dma = 0; 3169 ha->gid_list_dma = 0;
@@ -3247,8 +3255,8 @@ qla2x00_mem_free(struct qla_hw_data *ha)
3247 dma_pool_destroy(ha->s_dma_pool); 3255 dma_pool_destroy(ha->s_dma_pool);
3248 3256
3249 if (ha->gid_list) 3257 if (ha->gid_list)
3250 dma_free_coherent(&ha->pdev->dev, GID_LIST_SIZE, ha->gid_list, 3258 dma_free_coherent(&ha->pdev->dev, qla2x00_gid_list_size(ha),
3251 ha->gid_list_dma); 3259 ha->gid_list, ha->gid_list_dma);
3252 3260
3253 if (IS_QLA82XX(ha)) { 3261 if (IS_QLA82XX(ha)) {
3254 if (!list_empty(&ha->gbl_dsd_list)) { 3262 if (!list_empty(&ha->gbl_dsd_list)) {