Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

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

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

parent 1b91a2e6
Loading
Loading
Loading
Loading
+7 −7
Original line number Original line Diff line number Diff line
@@ -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)
			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:
+0 −1
Original line number Original line Diff line number Diff line
@@ -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;
+1 −0
Original line number Original line Diff line number Diff line
@@ -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;
+3 −5
Original line number Original line Diff line number Diff line
@@ -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)
		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)
	}
	}
done:
done:
	kfree(data);
	kfree(data);
	ha->npiv_info = NULL;
}
}


static int
static int