scsi: qla2xxx: edif: Fix stale session
authorQuinn Tran <qutran@marvell.com>
Tue, 17 Aug 2021 05:13:04 +0000 (22:13 -0700)
committerMartin K. Petersen <martin.petersen@oracle.com>
Tue, 24 Aug 2021 02:36:52 +0000 (22:36 -0400)
When firmware indicates session has been torn down via UPDATE SA IOCB or
ELS Passthrough IOCB, the driver needs to also tear down the session.

Link: https://lore.kernel.org/r/20210817051315.2477-2-njavali@marvell.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>
drivers/scsi/qla2xxx/qla_edif.c
drivers/scsi/qla2xxx/qla_edif.h
drivers/scsi/qla2xxx/qla_isr.c

index 2db954a..7d16955 100644 (file)
@@ -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);
index 1cff02e..88495df 100644 (file)
@@ -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;
index cb02dad..c2fc75a 100644 (file)
@@ -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;