scsi: qla2xxx: edif: Send LOGO for unexpected IKE message
authorQuinn Tran <qutran@marvell.com>
Wed, 8 Jun 2022 11:58:41 +0000 (04:58 -0700)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Wed, 17 Aug 2022 12:23:42 +0000 (14:23 +0200)
[ Upstream commit 2b659ed67a12f39f56d8dcad9b5d5a74d67c01b3 ]

If the session is down and the local port continues to receive AUTH ELS
messages, the driver needs to send back LOGO so that the remote device
knows to tear down its session. Terminate and clean up the AUTH ELS
exchange followed by a passthrough LOGO.

Link: https://lore.kernel.org/r/20220608115849.16693-3-njavali@marvell.com
Fixes: 225479296c4f ("scsi: qla2xxx: edif: Reject AUTH ELS on session down")
Reviewed-by: Himanshu Madhani <himanshu.madhani@oracle.com>
Signed-off-by: Quinn Tran <qutran@marvell.com>
Signed-off-by: Nilesh Javali <njavali@marvell.com>
Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
Signed-off-by: Sasha Levin <sashal@kernel.org>
drivers/scsi/qla2xxx/qla_edif.c
drivers/scsi/qla2xxx/qla_fw.h

index 8be282339fddc6f91d6df4974d9cc54fa3faa6fc..69f8d16effa6f5bc2a2d949db1eac5954f28f1e2 100644 (file)
@@ -2496,8 +2496,7 @@ void qla24xx_auth_els(scsi_qla_host_t *vha, void **pkt, struct rsp_que **rsp)
 
        fcport = qla2x00_find_fcport_by_pid(host, &purex->pur_info.pur_sid);
 
-       if (DBELL_INACTIVE(vha) ||
-           (fcport && EDIF_SESSION_DOWN(fcport))) {
+       if (DBELL_INACTIVE(vha)) {
                ql_dbg(ql_dbg_edif, host, 0x0910c, "%s e_dbell.db_flags =%x %06x\n",
                    __func__, host->e_dbell.db_flags,
                    fcport ? fcport->d_id.b24 : 0);
@@ -2507,6 +2506,22 @@ void qla24xx_auth_els(scsi_qla_host_t *vha, void **pkt, struct rsp_que **rsp)
                return;
        }
 
+       if (fcport && EDIF_SESSION_DOWN(fcport)) {
+               ql_dbg(ql_dbg_edif, host, 0x13b6,
+                   "%s terminate exchange. Send logo to 0x%x\n",
+                   __func__, a.did.b24);
+
+               a.tx_byte_count = a.tx_len = 0;
+               a.tx_addr = 0;
+               a.control_flags = EPD_RX_XCHG;  /* EPD_RX_XCHG = terminate cmd */
+               qla_els_reject_iocb(host, (*rsp)->qpair, &a);
+               qla_enode_free(host, ptr);
+               /* send logo to let remote port knows to tear down session */
+               fcport->send_els_logo = 1;
+               qlt_schedule_sess_for_deletion(fcport);
+               return;
+       }
+
        /* add the local enode to the list */
        qla_enode_add(host, ptr);
 
index 073d06e88c58963626b4d88fe4cbaf53525ca99f..6faf7533958f150934db0516a855304ded3d49c6 100644 (file)
@@ -807,7 +807,7 @@ struct els_entry_24xx {
 #define EPD_ELS_COMMAND                (0 << 13)
 #define EPD_ELS_ACC            (1 << 13)
 #define EPD_ELS_RJT            (2 << 13)
-#define EPD_RX_XCHG            (3 << 13)
+#define EPD_RX_XCHG            (3 << 13)  /* terminate exchange */
 #define ECF_CLR_PASSTHRU_PEND  BIT_12
 #define ECF_INCL_FRAME_HDR     BIT_11
 #define ECF_SEC_LOGIN          BIT_3