Daniel Wagner 5b8a17
From: Quinn Tran <qutran@marvell.com>
Daniel Wagner 5b8a17
Date: Wed, 8 Jun 2022 04:58:41 -0700
Daniel Wagner 5b8a17
Subject: scsi: qla2xxx: edif: Send LOGO for unexpected IKE message
Denis Kirjanov 718367
Patch-mainline: v5.20-rc1
Daniel Wagner 5b8a17
Git-commit: 2b659ed67a12f39f56d8dcad9b5d5a74d67c01b3
Daniel Wagner 5b8a17
References: bsc#1201958
Daniel Wagner 5b8a17
Daniel Wagner 5b8a17
If the session is down and the local port continues to receive AUTH ELS
Daniel Wagner 5b8a17
messages, the driver needs to send back LOGO so that the remote device
Daniel Wagner 5b8a17
knows to tear down its session. Terminate and clean up the AUTH ELS
Daniel Wagner 5b8a17
exchange followed by a passthrough LOGO.
Daniel Wagner 5b8a17
Daniel Wagner 5b8a17
Link: https://lore.kernel.org/r/20220608115849.16693-3-njavali@marvell.com
Daniel Wagner 5b8a17
Fixes: 225479296c4f ("scsi: qla2xxx: edif: Reject AUTH ELS on session down")
Daniel Wagner 5b8a17
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Daniel Wagner 5b8a17
Signed-off-by: Quinn Tran <qutran@marvell.com>
Daniel Wagner 5b8a17
Signed-off-by: Nilesh Javali <njavali@marvell.com>
Daniel Wagner 5b8a17
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Daniel Wagner 5b8a17
Acked-by: Daniel Wagner <dwagner@suse.de>
Daniel Wagner 5b8a17
---
Daniel Wagner 5b8a17
 drivers/scsi/qla2xxx/qla_edif.c |   19 +++++++++++++++++--
Daniel Wagner 5b8a17
 drivers/scsi/qla2xxx/qla_fw.h   |    2 +-
Daniel Wagner 5b8a17
 2 files changed, 18 insertions(+), 3 deletions(-)
Daniel Wagner 5b8a17
Daniel Wagner 5b8a17
--- a/drivers/scsi/qla2xxx/qla_edif.c
Daniel Wagner 5b8a17
+++ b/drivers/scsi/qla2xxx/qla_edif.c
Daniel Wagner 5b8a17
@@ -2565,8 +2565,7 @@ void qla24xx_auth_els(scsi_qla_host_t *v
Daniel Wagner 5b8a17
 
Daniel Wagner 5b8a17
 	fcport = qla2x00_find_fcport_by_pid(host, &purex->pur_info.pur_sid);
Daniel Wagner 5b8a17
 
Daniel Wagner 5b8a17
-	if (DBELL_INACTIVE(vha) ||
Daniel Wagner 5b8a17
-	    (fcport && EDIF_SESSION_DOWN(fcport))) {
Daniel Wagner 5b8a17
+	if (DBELL_INACTIVE(vha)) {
Daniel Wagner 5b8a17
 		ql_dbg(ql_dbg_edif, host, 0x0910c, "%s e_dbell.db_flags =%x %06x\n",
Daniel Wagner 5b8a17
 		    __func__, host->e_dbell.db_flags,
Daniel Wagner 5b8a17
 		    fcport ? fcport->d_id.b24 : 0);
Daniel Wagner 5b8a17
@@ -2576,6 +2575,22 @@ void qla24xx_auth_els(scsi_qla_host_t *v
Daniel Wagner 5b8a17
 		return;
Daniel Wagner 5b8a17
 	}
Daniel Wagner 5b8a17
 
Daniel Wagner 5b8a17
+	if (fcport && EDIF_SESSION_DOWN(fcport)) {
Daniel Wagner 5b8a17
+		ql_dbg(ql_dbg_edif, host, 0x13b6,
Daniel Wagner 5b8a17
+		    "%s terminate exchange. Send logo to 0x%x\n",
Daniel Wagner 5b8a17
+		    __func__, a.did.b24);
Daniel Wagner 5b8a17
+
Daniel Wagner 5b8a17
+		a.tx_byte_count = a.tx_len = 0;
Daniel Wagner 5b8a17
+		a.tx_addr = 0;
Daniel Wagner 5b8a17
+		a.control_flags = EPD_RX_XCHG;  /* EPD_RX_XCHG = terminate cmd */
Daniel Wagner 5b8a17
+		qla_els_reject_iocb(host, (*rsp)->qpair, &a);
Daniel Wagner 5b8a17
+		qla_enode_free(host, ptr);
Daniel Wagner 5b8a17
+		/* send logo to let remote port knows to tear down session */
Daniel Wagner 5b8a17
+		fcport->send_els_logo = 1;
Daniel Wagner 5b8a17
+		qlt_schedule_sess_for_deletion(fcport);
Daniel Wagner 5b8a17
+		return;
Daniel Wagner 5b8a17
+	}
Daniel Wagner 5b8a17
+
Daniel Wagner 5b8a17
 	/* add the local enode to the list */
Daniel Wagner 5b8a17
 	qla_enode_add(host, ptr);
Daniel Wagner 5b8a17
 
Daniel Wagner 5b8a17
--- a/drivers/scsi/qla2xxx/qla_fw.h
Daniel Wagner 5b8a17
+++ b/drivers/scsi/qla2xxx/qla_fw.h
Daniel Wagner 5b8a17
@@ -808,7 +808,7 @@ struct els_entry_24xx {
Daniel Wagner 5b8a17
 #define EPD_ELS_COMMAND		(0 << 13)
Daniel Wagner 5b8a17
 #define EPD_ELS_ACC		(1 << 13)
Daniel Wagner 5b8a17
 #define EPD_ELS_RJT		(2 << 13)
Daniel Wagner 5b8a17
-#define EPD_RX_XCHG		(3 << 13)
Daniel Wagner 5b8a17
+#define EPD_RX_XCHG		(3 << 13)  /* terminate exchange */
Daniel Wagner 5b8a17
 #define ECF_CLR_PASSTHRU_PEND	BIT_12
Daniel Wagner 5b8a17
 #define ECF_INCL_FRAME_HDR	BIT_11
Daniel Wagner 5b8a17
 #define ECF_SEC_LOGIN		BIT_3