Daniel Wagner 24651a
From: Quinn Tran <qutran@marvell.com>
Daniel Wagner 24651a
Date: Wed, 8 Jun 2022 04:58:45 -0700
Daniel Wagner 24651a
Subject: scsi: qla2xxx: edif: Fix session thrash
Denis Kirjanov 718367
Patch-mainline: v5.20-rc1
Daniel Wagner 24651a
Git-commit: a8fdfb0b39c2b31722c70bdf2272b949d5af4b7b
Daniel Wagner 24651a
References: bsc#1201958
Daniel Wagner 24651a
Daniel Wagner 24651a
Current code prematurely sends out PRLI before authentication application
Daniel Wagner 24651a
has given the OK to do so. This causes PRLI failure and session teardown.
Daniel Wagner 24651a
Daniel Wagner 24651a
Prevents PRLI from going out before authentication app gives the OK.
Daniel Wagner 24651a
Daniel Wagner 24651a
Link: https://lore.kernel.org/r/20220608115849.16693-7-njavali@marvell.com
Daniel Wagner 24651a
Fixes: 91f6f5fbe87b ("scsi: qla2xxx: edif: Reduce connection thrash")
Daniel Wagner 24651a
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Daniel Wagner 24651a
Signed-off-by: Quinn Tran <qutran@marvell.com>
Daniel Wagner 24651a
Signed-off-by: Nilesh Javali <njavali@marvell.com>
Daniel Wagner 24651a
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Daniel Wagner 24651a
Acked-by: Daniel Wagner <dwagner@suse.de>
Daniel Wagner 24651a
---
Daniel Wagner 24651a
 drivers/scsi/qla2xxx/qla_edif.c |    2 +-
Daniel Wagner 24651a
 drivers/scsi/qla2xxx/qla_edif.h |    4 ++++
Daniel Wagner 24651a
 drivers/scsi/qla2xxx/qla_init.c |   10 +++++++++-
Daniel Wagner 24651a
 3 files changed, 14 insertions(+), 2 deletions(-)
Daniel Wagner 24651a
Daniel Wagner 24651a
--- a/drivers/scsi/qla2xxx/qla_edif.c
Daniel Wagner 24651a
+++ b/drivers/scsi/qla2xxx/qla_edif.c
Daniel Wagner 24651a
@@ -3517,7 +3517,7 @@ int qla_edif_process_els(scsi_qla_host_t
Daniel Wagner 24651a
 	if (qla_bsg_check(vha, bsg_job, fcport))
Daniel Wagner 24651a
 		return 0;
Daniel Wagner 24651a
 
Daniel Wagner 24651a
-	if (fcport->loop_id == FC_NO_LOOP_ID) {
Daniel Wagner 24651a
+	if (EDIF_SESS_DELETE(fcport)) {
Daniel Wagner 24651a
 		ql_dbg(ql_dbg_edif, vha, 0x910d,
Daniel Wagner 24651a
 		    "%s ELS code %x, no loop id.\n", __func__,
Daniel Wagner 24651a
 		    bsg_request->rqst_data.r_els.els_code);
Daniel Wagner 24651a
--- a/drivers/scsi/qla2xxx/qla_edif.h
Daniel Wagner 24651a
+++ b/drivers/scsi/qla2xxx/qla_edif.h
Daniel Wagner 24651a
@@ -141,4 +141,8 @@ struct enode {
Daniel Wagner 24651a
 	(DBELL_ACTIVE(_fcport->vha) && \
Daniel Wagner 24651a
 	 (_fcport->disc_state == DSC_LOGIN_AUTH_PEND))
Daniel Wagner 24651a
 
Daniel Wagner 24651a
+#define EDIF_SESS_DELETE(_s) \
Daniel Wagner 24651a
+	(qla_ini_mode_enabled(_s->vha) && (_s->disc_state == DSC_DELETE_PEND || \
Daniel Wagner 24651a
+	 _s->disc_state == DSC_DELETED))
Daniel Wagner 24651a
+
Daniel Wagner 24651a
 #endif	/* __QLA_EDIF_H */
Daniel Wagner 24651a
--- a/drivers/scsi/qla2xxx/qla_init.c
Daniel Wagner 24651a
+++ b/drivers/scsi/qla2xxx/qla_init.c
Daniel Wagner 24651a
@@ -1765,8 +1765,16 @@ int qla24xx_fcport_handle_login(struct s
Daniel Wagner 24651a
 		break;
Daniel Wagner 24651a
 
Daniel Wagner 24651a
 	case DSC_LOGIN_PEND:
Daniel Wagner 24651a
-		if (fcport->fw_login_state == DSC_LS_PLOGI_COMP)
Daniel Wagner 24651a
+		if (vha->hw->flags.edif_enabled)
Daniel Wagner 24651a
+			break;
Daniel Wagner 24651a
+
Daniel Wagner 24651a
+		if (fcport->fw_login_state == DSC_LS_PLOGI_COMP) {
Daniel Wagner 24651a
+			ql_dbg(ql_dbg_disc, vha, 0x2118,
Daniel Wagner 24651a
+			       "%s %d %8phC post %s PRLI\n",
Daniel Wagner 24651a
+			       __func__, __LINE__, fcport->port_name,
Daniel Wagner 24651a
+			       NVME_TARGET(vha->hw, fcport) ? "NVME" : "FC");
Daniel Wagner 24651a
 			qla24xx_post_prli_work(vha, fcport);
Daniel Wagner 24651a
+		}
Daniel Wagner 24651a
 		break;
Daniel Wagner 24651a
 
Daniel Wagner 24651a
 	case DSC_UPD_FCPORT: