Commit 07a5f692 authored by Quinn Tran's avatar Quinn Tran Committed by Martin K. Petersen
Browse files

scsi: qla2xxx: Fix N2N and NVMe connect retry failure

FC-NVMe target discovery failed when initiator wwpn < target wwpn in an N2N
(Direct Attach) config, where the driver was stuck on FCP PRLI mode and
failed to retry with NVMe PRLI.

Link: https://lore.kernel.org/r/20201202132312.19966-10-njavali@marvell.com


Fixes: 84ed362a ("scsi: qla2xxx: Dual FCP-NVMe target port support”)
Fixes: 983f1276 ("scsi: qla2xxx: Retry PLOGI on FC-NVMe PRLI failure”)
Signed-off-by: default avatarQuinn Tran <qutran@marvell.com>
Signed-off-by: default avatarNilesh Javali <njavali@marvell.com>
Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
parent 8a78dd6e
Loading
Loading
Loading
Loading
+52 −19
Original line number Diff line number Diff line
@@ -1268,9 +1268,10 @@ qla24xx_async_prli(struct scsi_qla_host *vha, fc_port_t *fcport)
		lio->u.logio.flags |= SRB_LOGIN_NVME_PRLI;

	ql_dbg(ql_dbg_disc, vha, 0x211b,
	    "Async-prli - %8phC hdl=%x, loopid=%x portid=%06x retries=%d %s.\n",
	    "Async-prli - %8phC hdl=%x, loopid=%x portid=%06x retries=%d fc4type %x priority %x %s.\n",
	    fcport->port_name, sp->handle, fcport->loop_id, fcport->d_id.b24,
	    fcport->login_retry, NVME_TARGET(vha->hw, fcport) ? "nvme" : "fc");
	    fcport->login_retry, fcport->fc4_type, vha->hw->fc4_type_priority,
	    NVME_TARGET(vha->hw, fcport) ? "nvme" : "fcp");

	rval = qla2x00_start_sp(sp);
	if (rval != QLA_SUCCESS) {
@@ -1932,16 +1933,47 @@ qla24xx_handle_prli_done_event(struct scsi_qla_host *vha, struct event_arg *ea)
			break;
		}

		ql_dbg(ql_dbg_disc, vha, 0x2118,
		       "%s %d %8phC priority %s, fc4type %x\n",
		       __func__, __LINE__, ea->fcport->port_name,
		       vha->hw->fc4_type_priority == FC4_PRIORITY_FCP ?
		       "FCP" : "NVMe", ea->fcport->fc4_type);

		if (N2N_TOPO(vha->hw)) {
			if (vha->hw->fc4_type_priority == FC4_PRIORITY_NVME) {
				ea->fcport->fc4_type &= ~FS_FC4TYPE_NVME;
				ea->fcport->fc4_type |= FS_FC4TYPE_FCP;
			} else {
				ea->fcport->fc4_type &= ~FS_FC4TYPE_FCP;
				ea->fcport->fc4_type |= FS_FC4TYPE_NVME;
			}

			if (ea->fcport->n2n_link_reset_cnt < 3) {
				ea->fcport->n2n_link_reset_cnt++;
				vha->relogin_jif = jiffies + 2 * HZ;
				/*
		 * Retry PRLI with other FC-4 type if failure occurred on dual
		 * FCP/NVMe port
				 * PRLI failed. Reset link to kick start
				 * state machine
				 */
				set_bit(N2N_LINK_RESET, &vha->dpc_flags);
			} else {
				ql_log(ql_log_warn, vha, 0x2119,
				       "%s %d %8phC Unable to reconnect\n",
				       __func__, __LINE__,
				       ea->fcport->port_name);
			}
		} else {
			/*
			 * switch connect. login failed. Take connection down
			 * and allow relogin to retrigger
			 */
			if (NVME_FCP_TARGET(ea->fcport)) {
				ql_dbg(ql_dbg_disc, vha, 0x2118,
				       "%s %d %8phC post %s prli\n",
				__func__, __LINE__, ea->fcport->port_name,
				(ea->fcport->fc4_type & FS_FC4TYPE_NVME) ?
				"NVMe" : "FCP");
				       __func__, __LINE__,
				       ea->fcport->port_name,
				       (ea->fcport->fc4_type & FS_FC4TYPE_NVME)
				       ? "NVMe" : "FCP");
				if (vha->hw->fc4_type_priority == FC4_PRIORITY_NVME)
					ea->fcport->fc4_type &= ~FS_FC4TYPE_NVME;
				else
@@ -1952,6 +1984,7 @@ qla24xx_handle_prli_done_event(struct scsi_qla_host *vha, struct event_arg *ea)
			ea->fcport->keep_nport_handle = 0;
			ea->fcport->logout_on_delete = 1;
			qlt_schedule_sess_for_deletion(ea->fcport);
		}
		break;
	}
}
+0 −3
Original line number Diff line number Diff line
@@ -3998,9 +3998,6 @@ qla24xx_report_id_acquisition(scsi_qla_host_t *vha,
				fcport->scan_state = QLA_FCPORT_FOUND;
				fcport->n2n_flag = 1;
				fcport->keep_nport_handle = 1;
				fcport->fc4_type = FS_FC4TYPE_FCP;
				if (vha->flags.nvme_enabled)
					fcport->fc4_type |= FS_FC4TYPE_NVME;

				if (wwn_to_u64(vha->port_name) >
				    wwn_to_u64(fcport->port_name)) {