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

Commit 21090cbe authored by Madhuranath Iyengar's avatar Madhuranath Iyengar Committed by James Bottomley
Browse files

[SCSI] qla2xxx: Update FCP priority information to firmware before sending IOs



The FCP priority info was not being updated properly in certain situations.
Here are the changes that needs to be done to take care of this issue:
1. No need to check fcport->state for FCS_UNCONFIGURED in
qla24xx_update_fcport_fcp_prio(), since an invalid loop id check is
already performed which is sufficient.
2. Add the missing qla24xx_update_fcport_fcp_prio() function call
within qla2x00_update_fcport() function, so that the priority info
is updated on every port addition or change.
3. Perform proper adapter types checking.
4. Other changes, associated with DEBUG/printk's and parameter passing.

Signed-off-by: default avatarSaurav Kashyap <saurav.kashyap@qlogic.com>
Signed-off-by: default avatarAndrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: default avatarGiridhar Malavali <giridhar.malavali@qlogic.com>
Signed-off-by: default avatarMadhuranath Iyengar <Madhu.Iyengar@qlogic.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent 4052bd57
Loading
Loading
Loading
Loading
+1 −1
Original line number Diff line number Diff line
@@ -103,7 +103,7 @@ qla24xx_proc_fcp_prio_cfg_cmd(struct fc_bsg_job *bsg_job)

	bsg_job->reply->reply_payload_rcv_len = 0;

	if (!IS_QLA24XX_TYPE(ha) || !IS_QLA25XX(ha)) {
	if (!(IS_QLA24XX_TYPE(ha) || IS_QLA25XX(ha))) {
		ret = -EINVAL;
		goto exit_fcp_prio_cfg;
	}
+1 −0
Original line number Diff line number Diff line
@@ -70,6 +70,7 @@ extern void qla2x00_async_adisc_done(struct scsi_qla_host *, fc_port_t *,
extern void qla2x00_async_tm_cmd_done(struct scsi_qla_host *, fc_port_t *,
	struct srb_iocb *);
extern void *qla2x00_alloc_iocbs(struct scsi_qla_host *, srb_t *);
extern int qla24xx_update_fcport_fcp_prio(scsi_qla_host_t *, fc_port_t *);

extern fc_port_t *
qla2x00_alloc_fcport(scsi_qla_host_t *, gfp_t );
+9 −9
Original line number Diff line number Diff line
@@ -2928,6 +2928,7 @@ qla2x00_update_fcport(scsi_qla_host_t *vha, fc_port_t *fcport)
	fcport->flags &= ~(FCF_LOGIN_NEEDED | FCF_ASYNC_SENT);

	qla2x00_iidma_fcport(vha, fcport);
	qla24xx_update_fcport_fcp_prio(vha, fcport);
	qla2x00_reg_remote_port(vha, fcport);
	atomic_set(&fcport->state, FCS_ONLINE);
}
@@ -5473,7 +5474,7 @@ qla81xx_update_fw_options(scsi_qla_host_t *vha)
 *	the tag (priority) value is returned.
 *
 * Input:
 *	ha = adapter block po
 *	vha = scsi host structure pointer.
 *	fcport = port structure pointer.
 *
 * Return:
@@ -5567,7 +5568,7 @@ qla24xx_get_fcp_prio(scsi_qla_host_t *vha, fc_port_t *fcport)
 *	Activates fcp priority for the logged in fc port
 *
 * Input:
 *	ha = adapter block pointer.
 *	vha = scsi host structure pointer.
 *	fcp = port structure pointer.
 *
 * Return:
@@ -5577,25 +5578,24 @@ qla24xx_get_fcp_prio(scsi_qla_host_t *vha, fc_port_t *fcport)
 *	Kernel context.
 */
int
qla24xx_update_fcport_fcp_prio(scsi_qla_host_t *ha, fc_port_t *fcport)
qla24xx_update_fcport_fcp_prio(scsi_qla_host_t *vha, fc_port_t *fcport)
{
	int ret;
	uint8_t priority;
	uint16_t mb[5];

	if (atomic_read(&fcport->state) == FCS_UNCONFIGURED ||
		fcport->port_type != FCT_TARGET ||
	if (fcport->port_type != FCT_TARGET ||
	    fcport->loop_id == FC_NO_LOOP_ID)
		return QLA_FUNCTION_FAILED;

	priority = qla24xx_get_fcp_prio(ha, fcport);
	ret = qla24xx_set_fcp_prio(ha, fcport->loop_id, priority, mb);
	priority = qla24xx_get_fcp_prio(vha, fcport);
	ret = qla24xx_set_fcp_prio(vha, fcport->loop_id, priority, mb);
	if (ret == QLA_SUCCESS)
		fcport->fcp_prio = priority;
	else
		DEBUG2(printk(KERN_WARNING
			"scsi(%ld): Unable to activate fcp priority, "
			" ret=0x%x\n", ha->host_no, ret));
			" ret=0x%x\n", vha->host_no, ret));

	return  ret;
}
+1 −1
Original line number Diff line number Diff line
@@ -4125,7 +4125,7 @@ qla24xx_set_fcp_prio(scsi_qla_host_t *vha, uint16_t loop_id, uint16_t priority,
		return QLA_FUNCTION_FAILED;

	DEBUG11(printk(KERN_INFO
	    "%s(%ld): entered.\n", __func__, ha->host_no));
	    "%s(%ld): entered.\n", __func__, vha->host_no));

	mcp->mb[0] = MBC_PORT_PARAMS;
	mcp->mb[1] = loop_id;