]> www.infradead.org Git - users/jedix/linux-maple.git/commitdiff
qla2xxx: Add ha->max_fibre_devices to keep track of the maximum number of targets.
authorChad Dupuis <chad.dupuis@qlogic.com>
Tue, 10 Apr 2012 11:54:05 +0000 (17:24 +0530)
committerMaxim Uvarov <maxim.uvarov@oracle.com>
Wed, 9 May 2012 00:40:58 +0000 (17:40 -0700)
Add a field to the qla_hw_data struct to allow us to set the maximum number of
fabric devices on a per adapter basis based on ISP type.

JIRA Key: V2632FC-125

Signed-off-by: Saurav Kashyap <saurav.kashyap@qlogic.com>
drivers/scsi/qla2xxx/qla_dbg.c
drivers/scsi/qla2xxx/qla_def.h
drivers/scsi/qla2xxx/qla_gs.c
drivers/scsi/qla2xxx/qla_init.c
drivers/scsi/qla2xxx/qla_inline.h
drivers/scsi/qla2xxx/qla_mid.c
drivers/scsi/qla2xxx/qla_os.c

index f8c8dff01108dcab0692fd06c9d5f13ee64ab6d8..f7e68df9ca1c314ee20615dcd11e7f1f0b145efe 100644 (file)
@@ -88,7 +88,7 @@ qla24xx_dump_ram(struct qla_hw_data *ha, uint32_t addr, uint32_t *ram,
        WRT_REG_WORD(&reg->mailbox0, MBC_DUMP_RISC_RAM_EXTENDED);
        clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
 
-       dwords = GID_LIST_SIZE / 4;
+       dwords = qla2x00_gid_list_size(ha) / 4;
        for (cnt = 0; cnt < ram_dwords && rval == QLA_SUCCESS;
            cnt += dwords, addr += dwords) {
                if (cnt + dwords > ram_dwords)
@@ -263,7 +263,7 @@ qla2xxx_dump_ram(struct qla_hw_data *ha, uint32_t addr, uint16_t *ram,
        WRT_MAILBOX_REG(ha, reg, 0, MBC_DUMP_RISC_RAM_EXTENDED);
        clear_bit(MBX_INTERRUPT, &ha->mbx_cmd_flags);
 
-       words = GID_LIST_SIZE / 2;
+       words = qla2x00_gid_list_size(ha) / 2;
        for (cnt = 0; cnt < ram_words && rval == QLA_SUCCESS;
            cnt += words, addr += words) {
                if (cnt + words > ram_words)
index e3e19ec5a55730d9b0bb84ff2c492e5c1bba4dd4..b047c44b7b4ba782bada8b128651de32877a7b08 100644 (file)
  * Fibre Channel device definitions.
  */
 #define WWN_SIZE               8       /* Size of WWPN, WWN & WWNN */
-#define MAX_FIBRE_DEVICES      512
+#define MAX_FIBRE_DEVICES_2100 512
+#define MAX_FIBRE_DEVICES_2400 2048
+#define MAX_FIBRE_DEVICES_LOOP 128
+#define MAX_FIBRE_DEVICES_MAX  MAX_FIBRE_DEVICES_2400
 #define MAX_FIBRE_LUNS         0xFFFF
 #define        MAX_HOST_COUNT          16
 
  * Host adapter default definitions.
  */
 #define MAX_BUSES              1  /* We only have one bus today */
-#define MAX_TARGETS_2100       MAX_FIBRE_DEVICES
-#define MAX_TARGETS_2200       MAX_FIBRE_DEVICES
 #define MIN_LUNS               8
 #define MAX_LUNS               MAX_FIBRE_LUNS
 #define MAX_CMDS_PER_LUN       255
@@ -1773,7 +1774,6 @@ static const char * const port_state_str[] = {
 
 #define        GID_PT_CMD      0x1A1
 #define        GID_PT_REQ_SIZE (16 + 4)
-#define        GID_PT_RSP_SIZE (16 + (MAX_FIBRE_DEVICES * 4))
 
 #define        GPN_ID_CMD      0x112
 #define        GPN_ID_REQ_SIZE (16 + 4)
@@ -2063,7 +2063,9 @@ struct ct_sns_rsp {
                } ga_nxt;
 
                struct {
-                       struct ct_sns_gid_pt_data entries[MAX_FIBRE_DEVICES];
+                       /* Assume the largest number of targets for the union */
+                       struct ct_sns_gid_pt_data
+                           entries[MAX_FIBRE_DEVICES_MAX];
                } gid_pt;
 
                struct {
@@ -2124,7 +2126,11 @@ struct ct_sns_pkt {
 
 #define        GID_PT_SNS_SCMD_LEN     6
 #define        GID_PT_SNS_CMD_SIZE     28
-#define        GID_PT_SNS_DATA_SIZE    (MAX_FIBRE_DEVICES * 4 + 16)
+/*
+ * Assume MAX_FIBRE_DEVICES_2100 as these defines are only used with older
+ * adapters.
+ */
+#define        GID_PT_SNS_DATA_SIZE    (MAX_FIBRE_DEVICES_2100 * 4 + 16)
 
 #define        GPN_ID_SNS_SCMD_LEN     6
 #define        GPN_ID_SNS_CMD_SIZE     28
@@ -2172,7 +2178,6 @@ struct gid_list_info {
        uint16_t loop_id;       /* ISP23XX         -- 6 bytes. */
        uint16_t reserved_1;    /* ISP24XX         -- 8 bytes. */
 };
-#define GID_LIST_SIZE (sizeof(struct gid_list_info) * MAX_FIBRE_DEVICES)
 
 /* NPIV */
 typedef struct vport_info {
@@ -2499,6 +2504,7 @@ struct qla_hw_data {
        atomic_t        loop_down_timer;         /* loop down timer */
        uint8_t         link_down_timeout;       /* link down timeout */
        uint16_t        max_loop_id;
+       uint16_t        max_fibre_devices;      /* Maximum number of targets */
 
        uint16_t        fb_rev;
        uint16_t        min_external_loopid;    /* First external loop Id */
index 69243036529749aa2545526547ba6b4f57a957e0..af2fcc0b15f8d733c7672a80eb7e6e47641b34a3 100644 (file)
@@ -240,6 +240,12 @@ qla2x00_ga_nxt(scsi_qla_host_t *vha, fc_port_t *fcport)
        return (rval);
 }
 
+static inline int
+qla2x00_gid_pt_rsp_size(scsi_qla_host_t *vha)
+{
+       return vha->hw->max_fibre_devices * 4 + 16;
+}
+
 /**
  * qla2x00_gid_pt() - SNS scan for fabric devices via GID_PT command.
  * @ha: HA context
@@ -261,20 +267,21 @@ qla2x00_gid_pt(scsi_qla_host_t *vha, sw_info_t *list)
 
        struct ct_sns_gid_pt_data *gid_data;
        struct qla_hw_data *ha = vha->hw;
+       uint16_t gid_pt_rsp_size;
 
        if (IS_QLA2100(ha) || IS_QLA2200(ha))
                return qla2x00_sns_gid_pt(vha, list);
 
        gid_data = NULL;
-
+       gid_pt_rsp_size = qla2x00_gid_pt_rsp_size(vha);
        /* Issue GID_PT */
        /* Prepare common MS IOCB */
        ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GID_PT_REQ_SIZE,
-           GID_PT_RSP_SIZE);
+           gid_pt_rsp_size);
 
        /* Prepare CT request */
        ct_req = qla2x00_prep_ct_req(&ha->ct_sns->p.req, GID_PT_CMD,
-           GID_PT_RSP_SIZE);
+           gid_pt_rsp_size);
        ct_rsp = &ha->ct_sns->p.rsp;
 
        /* Prepare CT arguments -- port_type */
@@ -292,7 +299,7 @@ qla2x00_gid_pt(scsi_qla_host_t *vha, sw_info_t *list)
                rval = QLA_FUNCTION_FAILED;
        } else {
                /* Set port IDs in switch info list. */
-               for (i = 0; i < MAX_FIBRE_DEVICES; i++) {
+               for (i = 0; i < ha->max_fibre_devices; i++) {
                        gid_data = &ct_rsp->rsp.gid_pt.entries[i];
                        list[i].d_id.b.domain = gid_data->port_id[0];
                        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)
                 * single call.  Return a failed status, and let GA_NXT handle
                 * the overload.
                 */
-               if (i == MAX_FIBRE_DEVICES)
+               if (i == ha->max_fibre_devices)
                        rval = QLA_FUNCTION_FAILED;
        }
 
@@ -330,7 +337,7 @@ qla2x00_gid_pt(scsi_qla_host_t *vha, sw_info_t *list)
 int
 qla2x00_gpn_id(scsi_qla_host_t *vha, sw_info_t *list)
 {
-       int             rval;
+       int             rval = QLA_SUCCESS;
        uint16_t        i;
 
        ms_iocb_entry_t *ms_pkt;
@@ -341,7 +348,7 @@ qla2x00_gpn_id(scsi_qla_host_t *vha, sw_info_t *list)
        if (IS_QLA2100(ha) || IS_QLA2200(ha))
                return qla2x00_sns_gpn_id(vha, list);
 
-       for (i = 0; i < MAX_FIBRE_DEVICES; i++) {
+       for (i = 0; i < ha->max_fibre_devices; i++) {
                /* Issue GPN_ID */
                /* Prepare common MS IOCB */
                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)
 int
 qla2x00_gnn_id(scsi_qla_host_t *vha, sw_info_t *list)
 {
-       int             rval;
+       int             rval = QLA_SUCCESS;
        uint16_t        i;
        struct qla_hw_data *ha = vha->hw;
        ms_iocb_entry_t *ms_pkt;
@@ -401,7 +408,7 @@ qla2x00_gnn_id(scsi_qla_host_t *vha, sw_info_t *list)
        if (IS_QLA2100(ha) || IS_QLA2200(ha))
                return qla2x00_sns_gnn_id(vha, list);
 
-       for (i = 0; i < MAX_FIBRE_DEVICES; i++) {
+       for (i = 0; i < ha->max_fibre_devices; i++) {
                /* Issue GNN_ID */
                /* Prepare common MS IOCB */
                ms_pkt = ha->isp_ops->prep_ms_iocb(vha, GNN_ID_REQ_SIZE,
@@ -814,11 +821,14 @@ qla2x00_sns_gid_pt(scsi_qla_host_t *vha, sw_info_t *list)
        uint16_t        i;
        uint8_t         *entry;
        struct sns_cmd_pkt      *sns_cmd;
+       uint16_t gid_pt_sns_data_size;
+
+       gid_pt_sns_data_size = qla2x00_gid_pt_rsp_size(vha);
 
        /* Issue GID_PT. */
        /* Prepare SNS command request. */
        sns_cmd = qla2x00_prep_sns_cmd(vha, GID_PT_CMD, GID_PT_SNS_SCMD_LEN,
-           GID_PT_SNS_DATA_SIZE);
+           gid_pt_sns_data_size);
 
        /* Prepare SNS command arguments -- port_type. */
        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)
                rval = QLA_FUNCTION_FAILED;
        } else {
                /* Set port IDs in switch info list. */
-               for (i = 0; i < MAX_FIBRE_DEVICES; i++) {
+               for (i = 0; i < ha->max_fibre_devices; i++) {
                        entry = &sns_cmd->p.gid_data[(i * 4) + 16];
                        list[i].d_id.b.domain = entry[1];
                        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)
                 * single call.  Return a failed status, and let GA_NXT handle
                 * the overload.
                 */
-               if (i == MAX_FIBRE_DEVICES)
+               if (i == ha->max_fibre_devices)
                        rval = QLA_FUNCTION_FAILED;
        }
 
@@ -877,12 +887,12 @@ qla2x00_sns_gid_pt(scsi_qla_host_t *vha, sw_info_t *list)
 static int
 qla2x00_sns_gpn_id(scsi_qla_host_t *vha, sw_info_t *list)
 {
-       int             rval;
+       int             rval = QLA_SUCCESS;
        struct qla_hw_data *ha = vha->hw;
        uint16_t        i;
        struct sns_cmd_pkt      *sns_cmd;
 
-       for (i = 0; i < MAX_FIBRE_DEVICES; i++) {
+       for (i = 0; i < ha->max_fibre_devices; i++) {
                /* Issue GPN_ID */
                /* Prepare SNS command request. */
                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)
 static int
 qla2x00_sns_gnn_id(scsi_qla_host_t *vha, sw_info_t *list)
 {
-       int             rval;
+       int             rval = QLA_SUCCESS;
        struct qla_hw_data *ha = vha->hw;
        uint16_t        i;
        struct sns_cmd_pkt      *sns_cmd;
 
-       for (i = 0; i < MAX_FIBRE_DEVICES; i++) {
+       for (i = 0; i < ha->max_fibre_devices; i++) {
                /* Issue GNN_ID */
                /* Prepare SNS command request. */
                sns_cmd = qla2x00_prep_sns_cmd(vha, GNN_ID_CMD,
@@ -1734,7 +1744,7 @@ qla2x00_fdmi_register(scsi_qla_host_t *vha)
 int
 qla2x00_gfpn_id(scsi_qla_host_t *vha, sw_info_t *list)
 {
-       int             rval;
+       int             rval = QLA_SUCCESS;
        uint16_t        i;
        struct qla_hw_data *ha = vha->hw;
        ms_iocb_entry_t *ms_pkt;
@@ -1744,7 +1754,7 @@ qla2x00_gfpn_id(scsi_qla_host_t *vha, sw_info_t *list)
        if (!IS_IIDMA_CAPABLE(ha))
                return QLA_FUNCTION_FAILED;
 
-       for (i = 0; i < MAX_FIBRE_DEVICES; i++) {
+       for (i = 0; i < ha->max_fibre_devices; i++) {
                /* Issue GFPN_ID */
                /* Prepare common MS IOCB */
                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)
        if (rval)
                return rval;
 
-       for (i = 0; i < MAX_FIBRE_DEVICES; i++) {
+       for (i = 0; i < ha->max_fibre_devices; i++) {
                /* Issue GFPN_ID */
                /* Prepare common MS IOCB */
                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)
        struct qla_hw_data *ha = vha->hw;
        uint8_t fcp_scsi_features = 0;
 
-       for (i = 0; i < MAX_FIBRE_DEVICES; i++) {
+       for (i = 0; i < ha->max_fibre_devices; i++) {
                /* Set default FC4 Type as UNKNOWN so the default is to
                 * Process this port */
                list[i].fc4_type = FC4_TYPE_UNKNOWN;
index 95c4c7ba629f36c4fa93f120a6d640b721df94bb..eef0e73eb4f8e487d66da5411858ee1e283ffdfe 100644 (file)
@@ -2598,9 +2598,15 @@ qla2x00_configure_loop(scsi_qla_host_t *vha)
                        ql_dbg(ql_dbg_disc, vha, 0x2015,
                            "Loop resync needed, failing.\n");
                        rval = QLA_FUNCTION_FAILED;
-               }
-               else
+               } else {
+                       /*
+                        * Set the maximum number of targets to
+                        * MAX_FIBRE_DEVICE_LOOP only if we are an NL_PORT
+                        */
+                       if (ha->current_topology == ISP_CFG_NL)
+                               ha->max_fibre_devices = MAX_FIBRE_DEVICES_LOOP;
                        rval = qla2x00_configure_local_loop(vha);
+               }
        }
 
        if (rval == QLA_SUCCESS && test_bit(RSCN_UPDATE, &flags)) {
@@ -2673,7 +2679,7 @@ qla2x00_configure_local_loop(scsi_qla_host_t *vha)
 
        found_devs = 0;
        new_fcport = NULL;
-       entries = MAX_FIBRE_DEVICES;
+       entries = ha->max_fibre_devices;
 
        ql_dbg(ql_dbg_disc, vha, 0x2016,
            "Getting FCAL position map.\n");
@@ -2681,7 +2687,7 @@ qla2x00_configure_local_loop(scsi_qla_host_t *vha)
                qla2x00_get_fcal_position_map(vha, NULL);
 
        /* Get list of logged in devices. */
-       memset(ha->gid_list, 0, GID_LIST_SIZE);
+       memset(ha->gid_list, 0, qla2x00_gid_list_size(ha));
        rval = qla2x00_get_id_list(vha, ha->gid_list, ha->gid_list_dma,
            &entries);
        if (rval != QLA_SUCCESS)
@@ -3165,7 +3171,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
 
        /* Try GID_PT to get device list, else GAN. */
        if (!ha->swl)
-               ha->swl = kcalloc(MAX_FIBRE_DEVICES, sizeof(sw_info_t),
+               ha->swl = kcalloc(ha->max_fibre_devices, sizeof(sw_info_t),
                    GFP_KERNEL);
        swl = ha->swl;
        if (!swl) {
@@ -3173,7 +3179,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
                ql_dbg(ql_dbg_disc, vha, 0x2054,
                    "GID_PT allocations failed, fallback on GA_NXT.\n");
        } else {
-               memset(swl, 0, MAX_FIBRE_DEVICES * sizeof(sw_info_t));
+               memset(swl, 0, ha->max_fibre_devices * sizeof(sw_info_t));
                if (qla2x00_gid_pt(vha, swl) != QLA_SUCCESS) {
                        swl = NULL;
                } else if (qla2x00_gpn_id(vha, swl) != QLA_SUCCESS) {
index 8a27e1277e79697d5c9a1c9cea7ab0c1e5c49dd9..ca4c92e8dabcf926f13fe379ca7370470a004895 100644 (file)
@@ -194,3 +194,10 @@ qla2x00_init_scmd(srb_t *sp, struct scsi_cmnd *cmd)
        sp->done = qla2x00_sp_compl;
        return QLA_SUCCESS;
 }
+
+static inline int
+qla2x00_gid_list_size(struct qla_hw_data *ha)
+{
+       return (sizeof(struct gid_list_info) * ha->max_fibre_devices);
+}
+
index f488cc69fc79fe552a7c1022a84bec1a0233ae63..aa062a1b0ca496f4a1bc4f10e85f795d0d5d17b3 100644 (file)
@@ -479,7 +479,7 @@ qla24xx_create_vhost(struct fc_vport *fc_vport)
        host->max_channel = MAX_BUSES - 1;
        host->max_lun = ql2xmaxlun;
        host->unique_id = host->host_no;
-       host->max_id = MAX_TARGETS_2200;
+       host->max_id = ha->max_fibre_devices;
        host->transportt = qla2xxx_transport_vport_template;
 
        ql_dbg(ql_dbg_vport, vha, 0xa007,
index aa4674f05b779d8a6df9e2fb8105263fd7863170..360ab7a9d4a0beb1f09ef121dc16d891c276183b 100644 (file)
@@ -2060,7 +2060,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
        char pci_info[30];
        char fw_str[30];
        struct scsi_host_template *sht;
-       int bars, max_id, mem_only = 0;
+       int bars, mem_only = 0;
        uint16_t req_length = 0, rsp_length = 0;
        struct req_que *req = NULL;
        struct rsp_que *rsp = NULL;
@@ -2125,9 +2125,8 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
        ha->optrom_size = OPTROM_SIZE_2300;
 
        /* Assign ISP specific operations. */
-       max_id = MAX_TARGETS_2200;
        if (IS_QLA2100(ha)) {
-               max_id = MAX_TARGETS_2100;
+               ha->max_fibre_devices = MAX_FIBRE_DEVICES_2100;
                ha->mbx_count = MAILBOX_REGISTER_COUNT_2100;
                req_length = REQUEST_ENTRY_CNT_2100;
                rsp_length = RESPONSE_ENTRY_CNT_2100;
@@ -2139,6 +2138,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
                ha->nvram_data_off = ~0;
                ha->isp_ops = &qla2100_isp_ops;
        } else if (IS_QLA2200(ha)) {
+               ha->max_fibre_devices = MAX_FIBRE_DEVICES_2100;
                ha->mbx_count = MAILBOX_REGISTER_COUNT_2200;
                req_length = REQUEST_ENTRY_CNT_2200;
                rsp_length = RESPONSE_ENTRY_CNT_2100;
@@ -2150,6 +2150,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
                ha->nvram_data_off = ~0;
                ha->isp_ops = &qla2100_isp_ops;
        } else if (IS_QLA23XX(ha)) {
+               ha->max_fibre_devices = MAX_FIBRE_DEVICES_2100;
                ha->mbx_count = MAILBOX_REGISTER_COUNT;
                req_length = REQUEST_ENTRY_CNT_2200;
                rsp_length = RESPONSE_ENTRY_CNT_2300;
@@ -2163,6 +2164,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
                ha->nvram_data_off = ~0;
                ha->isp_ops = &qla2300_isp_ops;
        } else if (IS_QLA24XX_TYPE(ha)) {
+               ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400;
                ha->mbx_count = MAILBOX_REGISTER_COUNT;
                req_length = REQUEST_ENTRY_CNT_24XX;
                rsp_length = RESPONSE_ENTRY_CNT_2300;
@@ -2177,6 +2179,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
                ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF;
                ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA;
        } else if (IS_QLA25XX(ha)) {
+               ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400;
                ha->mbx_count = MAILBOX_REGISTER_COUNT;
                req_length = REQUEST_ENTRY_CNT_24XX;
                rsp_length = RESPONSE_ENTRY_CNT_2300;
@@ -2191,6 +2194,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
                ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF;
                ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA;
        } else if (IS_QLA81XX(ha)) {
+               ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400;
                ha->mbx_count = MAILBOX_REGISTER_COUNT;
                req_length = REQUEST_ENTRY_CNT_24XX;
                rsp_length = RESPONSE_ENTRY_CNT_2300;
@@ -2205,6 +2209,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
                ha->nvram_conf_off = ~0;
                ha->nvram_data_off = ~0;
        } else if (IS_QLA82XX(ha)) {
+               ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400;
                ha->mbx_count = MAILBOX_REGISTER_COUNT;
                req_length = REQUEST_ENTRY_CNT_82XX;
                rsp_length = RESPONSE_ENTRY_CNT_82XX;
@@ -2219,6 +2224,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
                ha->nvram_conf_off = FARX_ACCESS_NVRAM_CONF;
                ha->nvram_data_off = FARX_ACCESS_NVRAM_DATA;
        } else if (IS_QLA83XX(ha)) {
+               ha->max_fibre_devices = MAX_FIBRE_DEVICES_2400;
                ha->mbx_count = MAILBOX_REGISTER_COUNT;
                req_length = REQUEST_ENTRY_CNT_24XX;
                rsp_length = RESPONSE_ENTRY_CNT_2300;
@@ -2237,10 +2243,11 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
        ql_dbg_pci(ql_dbg_init, pdev, 0x001e,
            "mbx_count=%d, req_length=%d, "
            "rsp_length=%d, max_loop_id=%d, init_cb_size=%d, "
-           "gid_list_info_size=%d, optrom_size=%d, nvram_npiv_size=%d, .\n",
+           "gid_list_info_size=%d, optrom_size=%d, nvram_npiv_size=%d, "
+           "max_fibre_devices=%d.\n",
            ha->mbx_count, req_length, rsp_length, ha->max_loop_id,
            ha->init_cb_size, ha->gid_list_info_size, ha->optrom_size,
-           ha->nvram_npiv_size);
+           ha->nvram_npiv_size, ha->max_fibre_devices);
        ql_dbg_pci(ql_dbg_init, pdev, 0x001f,
            "isp_ops=%p, flash_conf_off=%d, "
            "flash_data_off=%d, nvram_conf_off=%d, nvram_data_off=%d.\n",
@@ -2314,7 +2321,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
            "mgmt_svr_loop_id=%d, sg_tablesize=%d.\n",
            host->can_queue, base_vha->req,
            base_vha->mgmt_svr_loop_id, host->sg_tablesize);
-       host->max_id = max_id;
+       host->max_id = ha->max_fibre_devices;
        host->this_id = 255;
        host->cmd_per_lun = 3;
        host->unique_id = host->host_no;
@@ -2864,8 +2871,8 @@ qla2x00_mem_alloc(struct qla_hw_data *ha, uint16_t req_len, uint16_t rsp_len,
        if (!ha->init_cb)
                goto fail;
 
-       ha->gid_list = dma_alloc_coherent(&ha->pdev->dev, GID_LIST_SIZE,
-               &ha->gid_list_dma, GFP_KERNEL);
+       ha->gid_list = dma_alloc_coherent(&ha->pdev->dev,
+               qla2x00_gid_list_size(ha), &ha->gid_list_dma, GFP_KERNEL);
        if (!ha->gid_list)
                goto fail_free_init_cb;
 
@@ -3080,7 +3087,8 @@ fail_free_srb_mempool:
        mempool_destroy(ha->srb_mempool);
        ha->srb_mempool = NULL;
 fail_free_gid_list:
-       dma_free_coherent(&ha->pdev->dev, GID_LIST_SIZE, ha->gid_list,
+       dma_free_coherent(&ha->pdev->dev, qla2x00_gid_list_size(ha),
+       ha->gid_list,
        ha->gid_list_dma);
        ha->gid_list = NULL;
        ha->gid_list_dma = 0;
@@ -3172,8 +3180,8 @@ qla2x00_mem_free(struct qla_hw_data *ha)
                dma_pool_destroy(ha->s_dma_pool);
 
        if (ha->gid_list)
-               dma_free_coherent(&ha->pdev->dev, GID_LIST_SIZE, ha->gid_list,
-               ha->gid_list_dma);
+               dma_free_coherent(&ha->pdev->dev, qla2x00_gid_list_size(ha),
+               ha->gid_list, ha->gid_list_dma);
 
        if (IS_QLA82XX(ha)) {
                if (!list_empty(&ha->gbl_dsd_list)) {