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

Commit f08b7251 authored by Andrew Vasquez's avatar Andrew Vasquez Committed by James Bottomley
Browse files

[SCSI] qla2xxx: Correct FCP2 recovery handling.



The driver did not account for non-tape devices needing to employ
proper FCP2 recovery.  Driver now checks the FCP2-capable flag
only, rather than using a midlayer-determined flag (TYPE_TAPE).

Signed-off-by: default avatarAndrew Vasquez <andrew.vasquez@qlogic.com>
Signed-off-by: default avatarGiridhar Malavali <giridhar.malavali@qlogic.com>
Signed-off-by: default avatarJames Bottomley <James.Bottomley@suse.de>
parent 63c43b0e
Loading
Loading
Loading
Loading
+1 −2
Original line number Original line Diff line number Diff line
@@ -1586,8 +1586,7 @@ typedef struct fc_port {
 */
 */
#define FCF_FABRIC_DEVICE	BIT_0
#define FCF_FABRIC_DEVICE	BIT_0
#define FCF_LOGIN_NEEDED	BIT_1
#define FCF_LOGIN_NEEDED	BIT_1
#define FCF_TAPE_PRESENT	BIT_2
#define FCF_FCP2_DEVICE		BIT_2
#define FCF_FCP2_DEVICE		BIT_3


/* No loop ID flag. */
/* No loop ID flag. */
#define FC_NO_LOOP_ID		0x1000
#define FC_NO_LOOP_ID		0x1000
+6 −6
Original line number Original line Diff line number Diff line
@@ -205,7 +205,7 @@ qla2x00_async_login_done(struct scsi_qla_host *vha, fc_port_t *fcport,


	switch (data[0]) {
	switch (data[0]) {
	case MBS_COMMAND_COMPLETE:
	case MBS_COMMAND_COMPLETE:
		if (fcport->flags & FCF_TAPE_PRESENT)
		if (fcport->flags & FCF_FCP2_DEVICE)
			opts |= BIT_1;
			opts |= BIT_1;
		rval = qla2x00_get_port_database(vha, fcport, opts);
		rval = qla2x00_get_port_database(vha, fcport, opts);
		if (rval != QLA_SUCCESS)
		if (rval != QLA_SUCCESS)
@@ -2726,7 +2726,7 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)


		/*
		/*
		 * Logout all previous fabric devices marked lost, except
		 * Logout all previous fabric devices marked lost, except
		 * tape devices.
		 * FCP2 devices.
		 */
		 */
		list_for_each_entry(fcport, &vha->vp_fcports, list) {
		list_for_each_entry(fcport, &vha->vp_fcports, list) {
			if (test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags))
			if (test_bit(LOOP_RESYNC_NEEDED, &vha->dpc_flags))
@@ -2739,7 +2739,7 @@ qla2x00_configure_fabric(scsi_qla_host_t *vha)
				qla2x00_mark_device_lost(vha, fcport,
				qla2x00_mark_device_lost(vha, fcport,
				    ql2xplogiabsentdevice, 0);
				    ql2xplogiabsentdevice, 0);
				if (fcport->loop_id != FC_NO_LOOP_ID &&
				if (fcport->loop_id != FC_NO_LOOP_ID &&
				    (fcport->flags & FCF_TAPE_PRESENT) == 0 &&
				    (fcport->flags & FCF_FCP2_DEVICE) == 0 &&
				    fcport->port_type != FCT_INITIATOR &&
				    fcport->port_type != FCT_INITIATOR &&
				    fcport->port_type != FCT_BROADCAST) {
				    fcport->port_type != FCT_BROADCAST) {
					ha->isp_ops->fabric_logout(vha,
					ha->isp_ops->fabric_logout(vha,
@@ -3018,7 +3018,7 @@ qla2x00_find_all_fabric_devs(scsi_qla_host_t *vha,
			fcport->d_id.b24 = new_fcport->d_id.b24;
			fcport->d_id.b24 = new_fcport->d_id.b24;
			fcport->flags |= FCF_LOGIN_NEEDED;
			fcport->flags |= FCF_LOGIN_NEEDED;
			if (fcport->loop_id != FC_NO_LOOP_ID &&
			if (fcport->loop_id != FC_NO_LOOP_ID &&
			    (fcport->flags & FCF_TAPE_PRESENT) == 0 &&
			    (fcport->flags & FCF_FCP2_DEVICE) == 0 &&
			    fcport->port_type != FCT_INITIATOR &&
			    fcport->port_type != FCT_INITIATOR &&
			    fcport->port_type != FCT_BROADCAST) {
			    fcport->port_type != FCT_BROADCAST) {
				ha->isp_ops->fabric_logout(vha, fcport->loop_id,
				ha->isp_ops->fabric_logout(vha, fcport->loop_id,
@@ -3272,9 +3272,9 @@ qla2x00_fabric_dev_login(scsi_qla_host_t *vha, fc_port_t *fcport,


	rval = qla2x00_fabric_login(vha, fcport, next_loopid);
	rval = qla2x00_fabric_login(vha, fcport, next_loopid);
	if (rval == QLA_SUCCESS) {
	if (rval == QLA_SUCCESS) {
		/* Send an ADISC to tape devices.*/
		/* Send an ADISC to FCP2 devices.*/
		opts = 0;
		opts = 0;
		if (fcport->flags & FCF_TAPE_PRESENT)
		if (fcport->flags & FCF_FCP2_DEVICE)
			opts |= BIT_1;
			opts |= BIT_1;
		rval = qla2x00_get_port_database(vha, fcport, opts);
		rval = qla2x00_get_port_database(vha, fcport, opts);
		if (rval != QLA_SUCCESS) {
		if (rval != QLA_SUCCESS) {
+6 −6
Original line number Original line Diff line number Diff line
@@ -1188,7 +1188,6 @@ qla2xxx_slave_configure(struct scsi_device *sdev)
	scsi_qla_host_t *vha = shost_priv(sdev->host);
	scsi_qla_host_t *vha = shost_priv(sdev->host);
	struct qla_hw_data *ha = vha->hw;
	struct qla_hw_data *ha = vha->hw;
	struct fc_rport *rport = starget_to_rport(sdev->sdev_target);
	struct fc_rport *rport = starget_to_rport(sdev->sdev_target);
	fc_port_t *fcport = *(fc_port_t **)rport->dd_data;
	struct req_que *req = vha->req;
	struct req_que *req = vha->req;


	if (sdev->tagged_supported)
	if (sdev->tagged_supported)
@@ -1197,8 +1196,6 @@ qla2xxx_slave_configure(struct scsi_device *sdev)
		scsi_deactivate_tcq(sdev, req->max_q_depth);
		scsi_deactivate_tcq(sdev, req->max_q_depth);


	rport->dev_loss_tmo = ha->port_down_retry_count;
	rport->dev_loss_tmo = ha->port_down_retry_count;
	if (sdev->type == TYPE_TAPE)
		fcport->flags |= FCF_TAPE_PRESENT;


	return 0;
	return 0;
}
}
@@ -2805,7 +2802,7 @@ void qla2x00_relogin(struct scsi_qla_host *vha)


			fcport->login_retry--;
			fcport->login_retry--;
			if (fcport->flags & FCF_FABRIC_DEVICE) {
			if (fcport->flags & FCF_FABRIC_DEVICE) {
				if (fcport->flags & FCF_TAPE_PRESENT)
				if (fcport->flags & FCF_FCP2_DEVICE)
					ha->isp_ops->fabric_logout(vha,
					ha->isp_ops->fabric_logout(vha,
							fcport->loop_id,
							fcport->loop_id,
							fcport->d_id.b.domain,
							fcport->d_id.b.domain,
@@ -3141,7 +3138,10 @@ qla2x00_timer(scsi_qla_host_t *vha)
			if (!IS_QLA2100(ha) && vha->link_down_timeout)
			if (!IS_QLA2100(ha) && vha->link_down_timeout)
				atomic_set(&vha->loop_state, LOOP_DEAD);
				atomic_set(&vha->loop_state, LOOP_DEAD);


			/* Schedule an ISP abort to return any tape commands. */
			/*
			 * Schedule an ISP abort to return any FCP2-device
			 * commands.
			 */
			/* NPIV - scan physical port only */
			/* NPIV - scan physical port only */
			if (!vha->vp_idx) {
			if (!vha->vp_idx) {
				spin_lock_irqsave(&ha->hardware_lock,
				spin_lock_irqsave(&ha->hardware_lock,
@@ -3158,7 +3158,7 @@ qla2x00_timer(scsi_qla_host_t *vha)
					if (sp->ctx)
					if (sp->ctx)
						continue;
						continue;
					sfcp = sp->fcport;
					sfcp = sp->fcport;
					if (!(sfcp->flags & FCF_TAPE_PRESENT))
					if (!(sfcp->flags & FCF_FCP2_DEVICE))
						continue;
						continue;


					set_bit(ISP_ABORT_NEEDED,
					set_bit(ISP_ABORT_NEEDED,