Daniel Wagner b86793
From: Quinn Tran <qutran@marvell.com>
Daniel Wagner b86793
Date: Tue, 26 Oct 2021 04:54:04 -0700
Daniel Wagner b86793
Subject: scsi: qla2xxx: edif: Fix app start delay
Daniel Wagner b86793
Patch-mainline: v5.16-rc1
Daniel Wagner b86793
Git-commit: b492d6a4880fddce098472dec5086d37802c68d3
Daniel Wagner b86793
References: git-fixes
Daniel Wagner b86793
Daniel Wagner b86793
Current driver does unnecessary pause for each session to get to certain
Daniel Wagner b86793
state before allowing the app start call to return. In larger environment,
Daniel Wagner b86793
this introduces a long delay.  Originally the delay was meant to
Daniel Wagner b86793
synchronize app and driver. However, the with current implementation the
Daniel Wagner b86793
two sides use various events to synchronize their state.
Daniel Wagner b86793
Daniel Wagner b86793
The same is applied to the authentication failure call.
Daniel Wagner b86793
Daniel Wagner b86793
Link: https://lore.kernel.org/r/20211026115412.27691-6-njavali@marvell.com
Daniel Wagner b86793
Fixes: 4de067e5df12 ("scsi: qla2xxx: edif: Add N2N support for EDIF")
Daniel Wagner b86793
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Daniel Wagner b86793
Signed-off-by: Quinn Tran <qutran@marvell.com>
Daniel Wagner b86793
Signed-off-by: Nilesh Javali <njavali@marvell.com>
Daniel Wagner b86793
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Daniel Wagner b86793
Acked-by: Daniel Wagner <dwagner@suse.de>
Daniel Wagner b86793
---
Daniel Wagner b86793
 drivers/scsi/qla2xxx/qla_edif.c |   64 +---------------------------------------
Daniel Wagner b86793
 1 file changed, 3 insertions(+), 61 deletions(-)
Daniel Wagner b86793
Daniel Wagner b86793
--- a/drivers/scsi/qla2xxx/qla_edif.c
Daniel Wagner b86793
+++ b/drivers/scsi/qla2xxx/qla_edif.c
Daniel Wagner b86793
@@ -290,63 +290,6 @@ qla_edif_app_check(scsi_qla_host_t *vha,
Daniel Wagner b86793
 	return false;
Daniel Wagner b86793
 }
Daniel Wagner b86793
 
Daniel Wagner b86793
-static void qla_edif_reset_auth_wait(struct fc_port *fcport, int state,
Daniel Wagner b86793
-		int waitonly)
Daniel Wagner b86793
-{
Daniel Wagner b86793
-	int cnt, max_cnt = 200;
Daniel Wagner b86793
-	bool traced = false;
Daniel Wagner b86793
-
Daniel Wagner b86793
-	fcport->keep_nport_handle = 1;
Daniel Wagner b86793
-
Daniel Wagner b86793
-	if (!waitonly) {
Daniel Wagner b86793
-		qla2x00_set_fcport_disc_state(fcport, state);
Daniel Wagner b86793
-		qlt_schedule_sess_for_deletion(fcport);
Daniel Wagner b86793
-	} else {
Daniel Wagner b86793
-		qla2x00_set_fcport_disc_state(fcport, state);
Daniel Wagner b86793
-	}
Daniel Wagner b86793
-
Daniel Wagner b86793
-	ql_dbg(ql_dbg_edif, fcport->vha, 0xf086,
Daniel Wagner b86793
-		"%s: waiting for session, max_cnt=%u\n",
Daniel Wagner b86793
-		__func__, max_cnt);
Daniel Wagner b86793
-
Daniel Wagner b86793
-	cnt = 0;
Daniel Wagner b86793
-
Daniel Wagner b86793
-	if (waitonly) {
Daniel Wagner b86793
-		/* Marker wait min 10 msecs. */
Daniel Wagner b86793
-		msleep(50);
Daniel Wagner b86793
-		cnt += 50;
Daniel Wagner b86793
-	}
Daniel Wagner b86793
-	while (1) {
Daniel Wagner b86793
-		if (!traced) {
Daniel Wagner b86793
-			ql_dbg(ql_dbg_edif, fcport->vha, 0xf086,
Daniel Wagner b86793
-			    "%s: session sleep.\n",
Daniel Wagner b86793
-			    __func__);
Daniel Wagner b86793
-			traced = true;
Daniel Wagner b86793
-		}
Daniel Wagner b86793
-		msleep(20);
Daniel Wagner b86793
-		cnt++;
Daniel Wagner b86793
-		if (waitonly && (fcport->disc_state == state ||
Daniel Wagner b86793
-			fcport->disc_state == DSC_LOGIN_COMPLETE))
Daniel Wagner b86793
-			break;
Daniel Wagner b86793
-		if (fcport->disc_state == DSC_LOGIN_AUTH_PEND)
Daniel Wagner b86793
-			break;
Daniel Wagner b86793
-		if (cnt > max_cnt)
Daniel Wagner b86793
-			break;
Daniel Wagner b86793
-	}
Daniel Wagner b86793
-
Daniel Wagner b86793
-	if (!waitonly) {
Daniel Wagner b86793
-		ql_dbg(ql_dbg_edif, fcport->vha, 0xf086,
Daniel Wagner b86793
-		    "%s: waited for session - %8phC, loopid=%x portid=%06x fcport=%p state=%u, cnt=%u\n",
Daniel Wagner b86793
-		    __func__, fcport->port_name, fcport->loop_id,
Daniel Wagner b86793
-		    fcport->d_id.b24, fcport, fcport->disc_state, cnt);
Daniel Wagner b86793
-	} else {
Daniel Wagner b86793
-		ql_dbg(ql_dbg_edif, fcport->vha, 0xf086,
Daniel Wagner b86793
-		    "%s: waited ONLY for session - %8phC, loopid=%x portid=%06x fcport=%p state=%u, cnt=%u\n",
Daniel Wagner b86793
-		    __func__, fcport->port_name, fcport->loop_id,
Daniel Wagner b86793
-		    fcport->d_id.b24, fcport, fcport->disc_state, cnt);
Daniel Wagner b86793
-	}
Daniel Wagner b86793
-}
Daniel Wagner b86793
-
Daniel Wagner b86793
 static void
Daniel Wagner b86793
 qla_edif_free_sa_ctl(fc_port_t *fcport, struct edif_sa_ctl *sa_ctl,
Daniel Wagner b86793
 	int index)
Daniel Wagner b86793
@@ -583,8 +526,8 @@ qla_edif_app_start(scsi_qla_host_t *vha,
Daniel Wagner b86793
 			ql_dbg(ql_dbg_edif, vha, 0x911e,
Daniel Wagner b86793
 			       "%s wwpn %8phC calling qla_edif_reset_auth_wait\n",
Daniel Wagner b86793
 			       __func__, fcport->port_name);
Daniel Wagner b86793
-			fcport->edif.app_sess_online = 1;
Daniel Wagner b86793
-			qla_edif_reset_auth_wait(fcport, DSC_LOGIN_PEND, 0);
Daniel Wagner b86793
+			fcport->edif.app_sess_online = 0;
Daniel Wagner b86793
+			qlt_schedule_sess_for_deletion(fcport);
Daniel Wagner b86793
 			qla_edif_sa_ctl_init(vha, fcport);
Daniel Wagner b86793
 		}
Daniel Wagner b86793
 	}
Daniel Wagner b86793
@@ -800,7 +743,6 @@ qla_edif_app_authok(scsi_qla_host_t *vha
Daniel Wagner b86793
 		ql_dbg(ql_dbg_edif, vha, 0x911e,
Daniel Wagner b86793
 		    "%s AUTH complete - RESUME with prli for wwpn %8phC\n",
Daniel Wagner b86793
 		    __func__, fcport->port_name);
Daniel Wagner b86793
-		qla_edif_reset_auth_wait(fcport, DSC_LOGIN_PEND, 1);
Daniel Wagner b86793
 		qla24xx_post_prli_work(vha, fcport);
Daniel Wagner b86793
 	}
Daniel Wagner b86793
 
Daniel Wagner b86793
@@ -873,7 +815,7 @@ qla_edif_app_authfail(scsi_qla_host_t *v
Daniel Wagner b86793
 
Daniel Wagner b86793
 		if (qla_ini_mode_enabled(fcport->vha)) {
Daniel Wagner b86793
 			fcport->send_els_logo = 1;
Daniel Wagner b86793
-			qla_edif_reset_auth_wait(fcport, DSC_LOGIN_PEND, 0);
Daniel Wagner b86793
+			qlt_schedule_sess_for_deletion(fcport);
Daniel Wagner b86793
 		}
Daniel Wagner b86793
 	}
Daniel Wagner b86793