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);
                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);
 
 
 #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