Commit 40859ae5 authored by Anirban Chakraborty's avatar Anirban Chakraborty Committed by James Bottomley

[SCSI] qla2xxx: Correct queue-creation bug when driver loaded in QoS mode.

Signed-off-by: default avatarAnirban Chakraborty <anirban.chakraborty@qlogic.com>
Signed-off-by: default avatarAndrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@HansenPartnership.com>
parent 1b91a2e6
...@@ -1651,13 +1651,13 @@ qla24xx_vport_create(struct fc_vport *fc_vport, bool disable) ...@@ -1651,13 +1651,13 @@ qla24xx_vport_create(struct fc_vport *fc_vport, bool disable)
qla24xx_vport_disable(fc_vport, disable); qla24xx_vport_disable(fc_vport, disable);
ret = 0; ret = 0;
if (ha->cur_vport_count <= ha->flex_port_count || ql2xmultique_tag if (ql2xmaxqueues == 1 || ql2xmultique_tag || !ha->npiv_info)
|| ha->max_req_queues == 1 || !ha->npiv_info)
goto vport_queue; goto vport_queue;
/* Create a request queue in QoS mode for the vport */ /* Create a request queue in QoS mode for the vport */
for (cnt = ha->flex_port_count; cnt < ha->nvram_npiv_size; cnt++) { for (cnt = 0; cnt < ha->nvram_npiv_size; cnt++) {
if (ha->npiv_info[cnt].port_name == vha->port_name && if (memcmp(ha->npiv_info[cnt].port_name, vha->port_name, 8) == 0
ha->npiv_info[cnt].node_name == vha->node_name) { && memcmp(ha->npiv_info[cnt].node_name, vha->node_name,
8) == 0) {
qos = ha->npiv_info[cnt].q_qos; qos = ha->npiv_info[cnt].q_qos;
break; break;
} }
...@@ -1671,8 +1671,8 @@ qla24xx_vport_create(struct fc_vport *fc_vport, bool disable) ...@@ -1671,8 +1671,8 @@ qla24xx_vport_create(struct fc_vport *fc_vport, bool disable)
vha->vp_idx); vha->vp_idx);
else else
DEBUG2(qla_printk(KERN_INFO, ha, DEBUG2(qla_printk(KERN_INFO, ha,
"Request Que:%d created for vp_idx:%d\n", "Request Que:%d (QoS: %d) created for vp_idx:%d\n",
ret, vha->vp_idx)); ret, qos, vha->vp_idx));
} }
vport_queue: vport_queue:
......
...@@ -2545,7 +2545,6 @@ struct qla_hw_data { ...@@ -2545,7 +2545,6 @@ struct qla_hw_data {
uint16_t num_vsans; /* number of vsan created */ uint16_t num_vsans; /* number of vsan created */
uint16_t max_npiv_vports; /* 63 or 125 per topoloty */ uint16_t max_npiv_vports; /* 63 or 125 per topoloty */
int cur_vport_count; int cur_vport_count;
uint16_t flex_port_count;
struct qla_chip_state_84xx *cs84xx; struct qla_chip_state_84xx *cs84xx;
struct qla_statistics qla_stats; struct qla_statistics qla_stats;
......
...@@ -1853,6 +1853,7 @@ qla2x00_probe_one(struct pci_dev *pdev, const struct pci_device_id *id) ...@@ -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->init_cb_size = sizeof(struct mid_init_cb_81xx);
ha->gid_list_info_size = 8; ha->gid_list_info_size = 8;
ha->optrom_size = OPTROM_SIZE_81XX; ha->optrom_size = OPTROM_SIZE_81XX;
ha->nvram_npiv_size = QLA_MAX_VPORTS_QLA25XX;
ha->isp_ops = &qla81xx_isp_ops; ha->isp_ops = &qla81xx_isp_ops;
ha->flash_conf_off = FARX_ACCESS_FLASH_CONF_81XX; ha->flash_conf_off = FARX_ACCESS_FLASH_CONF_81XX;
ha->flash_data_off = FARX_ACCESS_FLASH_DATA_81XX; ha->flash_data_off = FARX_ACCESS_FLASH_DATA_81XX;
......
...@@ -920,12 +920,13 @@ qla2xxx_flash_npiv_conf(scsi_qla_host_t *vha) ...@@ -920,12 +920,13 @@ qla2xxx_flash_npiv_conf(scsi_qla_host_t *vha)
entry = data + sizeof(struct qla_npiv_header); entry = data + sizeof(struct qla_npiv_header);
cnt = le16_to_cpu(hdr.entries); cnt = le16_to_cpu(hdr.entries);
ha->flex_port_count = cnt;
for (i = 0; cnt; cnt--, entry++, i++) { for (i = 0; cnt; cnt--, entry++, i++) {
uint16_t flags; uint16_t flags;
struct fc_vport_identifiers vid; struct fc_vport_identifiers vid;
struct fc_vport *vport; struct fc_vport *vport;
memcpy(&ha->npiv_info[i], entry, sizeof(struct qla_npiv_entry));
flags = le16_to_cpu(entry->flags); flags = le16_to_cpu(entry->flags);
if (flags == 0xffff) if (flags == 0xffff)
continue; continue;
...@@ -939,9 +940,7 @@ qla2xxx_flash_npiv_conf(scsi_qla_host_t *vha) ...@@ -939,9 +940,7 @@ qla2xxx_flash_npiv_conf(scsi_qla_host_t *vha)
vid.port_name = wwn_to_u64(entry->port_name); vid.port_name = wwn_to_u64(entry->port_name);
vid.node_name = wwn_to_u64(entry->node_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_INFO, ha, "NPIV[%02x]: wwpn=%llx "
DEBUG2(qla_printk(KERN_DEBUG, ha, "NPIV[%02x]: wwpn=%llx "
"wwnn=%llx vf_id=0x%x Q_qos=0x%x F_qos=0x%x.\n", cnt, "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), vid.port_name, vid.node_name, le16_to_cpu(entry->vf_id),
entry->q_qos, entry->f_qos)); entry->q_qos, entry->f_qos));
...@@ -957,7 +956,6 @@ qla2xxx_flash_npiv_conf(scsi_qla_host_t *vha) ...@@ -957,7 +956,6 @@ qla2xxx_flash_npiv_conf(scsi_qla_host_t *vha)
} }
done: done:
kfree(data); kfree(data);
ha->npiv_info = NULL;
} }
static int static int
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment