[SCSI] qla2xxx: Correct queue-creation bug when driver loaded in QoS mode.
authorAnirban Chakraborty <anirban.chakraborty@qlogic.com>
Wed, 3 Jun 2009 16:55:16 +0000 (09:55 -0700)
committerJames Bottomley <James.Bottomley@HansenPartnership.com>
Mon, 8 Jun 2009 19:46:39 +0000 (14:46 -0500)
Signed-off-by: Anirban Chakraborty <anirban.chakraborty@qlogic.com>
Signed-off-by: Andrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: James Bottomley <James.Bottomley@HansenPartnership.com>
drivers/scsi/qla2xxx/qla_attr.c
drivers/scsi/qla2xxx/qla_def.h
drivers/scsi/qla2xxx/qla_os.c
drivers/scsi/qla2xxx/qla_sup.c

index 9aa00f25aa6a6f918b09a303a73729a4306ed178..2bd017ffb084472c4d73bd06f6acf705b4a96055 100644 (file)
@@ -1651,13 +1651,13 @@ qla24xx_vport_create(struct fc_vport *fc_vport, bool disable)
        qla24xx_vport_disable(fc_vport, disable);
 
        ret = 0;
-       if (ha->cur_vport_count <= ha->flex_port_count || ql2xmultique_tag
-               || ha->max_req_queues == 1 || !ha->npiv_info)
+       if (ql2xmaxqueues == 1 || ql2xmultique_tag || !ha->npiv_info)
                goto vport_queue;
        /* Create a request queue in QoS mode for the vport */
-       for (cnt = ha->flex_port_count; cnt < ha->nvram_npiv_size; cnt++) {
-               if (ha->npiv_info[cnt].port_name == vha->port_name &&
-                       ha->npiv_info[cnt].node_name == vha->node_name) {
+       for (cnt = 0; cnt < ha->nvram_npiv_size; cnt++) {
+               if (memcmp(ha->npiv_info[cnt].port_name, vha->port_name, 8) == 0
+                       && memcmp(ha->npiv_info[cnt].node_name, vha->node_name,
+                       8) == 0) {
                        qos = ha->npiv_info[cnt].q_qos;
                        break;
                }
@@ -1671,8 +1671,8 @@ qla24xx_vport_create(struct fc_vport *fc_vport, bool disable)
                        vha->vp_idx);
                else
                        DEBUG2(qla_printk(KERN_INFO, ha,
-                       "Request Que:%d created for vp_idx:%d\n",
-                       ret, vha->vp_idx));
+                       "Request Que:%d (QoS: %d) created for vp_idx:%d\n",
+                       ret, qos, vha->vp_idx));
        }
 
 vport_queue:
index bb6bfd7b35f366926ec555a1b87eea528d778f96..4e846ae928aa70726a12943c13af58497402d48d 100644 (file)
@@ -2545,7 +2545,6 @@ struct qla_hw_data {
        uint16_t        num_vsans;      /* number of vsan created */
        uint16_t        max_npiv_vports;        /* 63 or 125 per topoloty */
        int             cur_vport_count;
-       uint16_t        flex_port_count;
 
        struct qla_chip_state_84xx *cs84xx;
        struct qla_statistics qla_stats;
index 7415ead92154101bf389103404b301c995bd0eae..181ed971a2ffd48019068daa18bdc31ee6789fa9 100644 (file)
@@ -1853,6 +1853,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id)
                ha->init_cb_size = sizeof(struct mid_init_cb_81xx);
                ha->gid_list_info_size = 8;
                ha->optrom_size = OPTROM_SIZE_81XX;
+               ha->nvram_npiv_size = QLA_MAX_VPORTS_QLA25XX;
                ha->isp_ops = &qla81xx_isp_ops;
                ha->flash_conf_off = FARX_ACCESS_FLASH_CONF_81XX;
                ha->flash_data_off = FARX_ACCESS_FLASH_DATA_81XX;
index 22f97eb50cf9f01b54c2bd580ba9842db88743c3..e239203f19f79081f1d89ed5b10b5640a24aa5c8 100644 (file)
@@ -920,12 +920,13 @@ qla2xxx_flash_npiv_conf(scsi_qla_host_t *vha)
 
        entry = data + sizeof(struct qla_npiv_header);
        cnt = le16_to_cpu(hdr.entries);
-       ha->flex_port_count = cnt;
        for (i = 0; cnt; cnt--, entry++, i++) {
                uint16_t flags;
                struct fc_vport_identifiers vid;
                struct fc_vport *vport;
 
+               memcpy(&ha->npiv_info[i], entry, sizeof(struct qla_npiv_entry));
+
                flags = le16_to_cpu(entry->flags);
                if (flags == 0xffff)
                        continue;
@@ -939,9 +940,7 @@ qla2xxx_flash_npiv_conf(scsi_qla_host_t *vha)
                vid.port_name = wwn_to_u64(entry->port_name);
                vid.node_name = wwn_to_u64(entry->node_name);
 
-               memcpy(&ha->npiv_info[i], entry, sizeof(struct qla_npiv_entry));
-
-               DEBUG2(qla_printk(KERN_DEBUG, ha, "NPIV[%02x]: wwpn=%llx "
+               DEBUG2(qla_printk(KERN_INFO, ha, "NPIV[%02x]: wwpn=%llx "
                        "wwnn=%llx vf_id=0x%x Q_qos=0x%x F_qos=0x%x.\n", cnt,
                        vid.port_name, vid.node_name, le16_to_cpu(entry->vf_id),
                        entry->q_qos, entry->f_qos));
@@ -957,7 +956,6 @@ qla2xxx_flash_npiv_conf(scsi_qla_host_t *vha)
        }
 done:
        kfree(data);
-       ha->npiv_info = NULL;
 }
 
 static int