[PATCH 01/12] qla2xxx: edif: Fix stale session
From: Nilesh Javali <njavali@marvell.com>
Date: 2021-08-17 05:13:52
Subsystem:
qlogic qla2xxx fc-scsi driver, scsi subsystem, the rest · Maintainers:
Nilesh Javali, "James E.J. Bottomley", "Martin K. Petersen", Linus Torvalds
From: Quinn Tran <redacted> FW indicates session has been torn down via UPDATE SA IOCB or ELS Passthrough IOCB, driver need to also tear down the session. Signed-off-by: Quinn Tran <redacted> Signed-off-by: Nilesh Javali <njavali@marvell.com> --- drivers/scsi/qla2xxx/qla_edif.c | 8 ++++++++ drivers/scsi/qla2xxx/qla_edif.h | 2 ++ drivers/scsi/qla2xxx/qla_isr.c | 1 + 3 files changed, 11 insertions(+)
diff --git a/drivers/scsi/qla2xxx/qla_edif.c b/drivers/scsi/qla2xxx/qla_edif.c
index 2db954a7aaf1..7d16955383dd 100644
--- a/drivers/scsi/qla2xxx/qla_edif.c
+++ b/drivers/scsi/qla2xxx/qla_edif.c@@ -2674,6 +2674,14 @@ qla28xx_sa_update_iocb_entry(scsi_qla_host_t *v, struct req_que *req, __func__, pkt->sa_index, nport_handle); qla_edif_sadb_delete_sa_index(sp->fcport, nport_handle, le16_to_cpu(pkt->sa_index)); + switch (le16_to_cpu(pkt->u.comp_sts)) { + case CS_PORT_EDIF_UNAVAIL: + case CS_PORT_EDIF_LOGOUT: + qlt_schedule_sess_for_deletion(sp->fcport); + break; + default: + break; + } } sp->done(sp, 0);
diff --git a/drivers/scsi/qla2xxx/qla_edif.h b/drivers/scsi/qla2xxx/qla_edif.h
index 1cff02e5bd43..88495df9a3c2 100644
--- a/drivers/scsi/qla2xxx/qla_edif.h
+++ b/drivers/scsi/qla2xxx/qla_edif.h@@ -63,6 +63,8 @@ struct sa_update_28xx { union { __le16 nport_handle; /* in: N_PORT handle. */ __le16 comp_sts; /* out: completion status */ +#define CS_PORT_EDIF_UNAVAIL 0x28 +#define CS_PORT_EDIF_LOGOUT 0x29 #define CS_PORT_EDIF_SUPP_NOT_RDY 0x64 #define CS_PORT_EDIF_INV_REQ 0x66 } u;
diff --git a/drivers/scsi/qla2xxx/qla_isr.c b/drivers/scsi/qla2xxx/qla_isr.c
index cb02dade85f8..c2fc75a9ca61 100644
--- a/drivers/scsi/qla2xxx/qla_isr.c
+++ b/drivers/scsi/qla2xxx/qla_isr.c@@ -2235,6 +2235,7 @@ qla24xx_els_ct_entry(scsi_qla_host_t *v, struct req_que *req, } else if (comp_status == CS_PORT_LOGGED_OUT) { els->u.els_plogi.len = 0; res = DID_IMM_RETRY << 16; + qlt_schedule_sess_for_deletion(sp->fcport); } else { els->u.els_plogi.len = 0; res = DID_ERROR << 16;
--
2.23.1