srb_t *sp;
        struct srb_iocb *iocb;
        struct sts_entry_24xx *sts = (struct sts_entry_24xx *)tsk;
+       u16 comp_status;
 
        sp = qla2x00_get_sp_from_handle(vha, func, req, tsk);
        if (!sp)
                return;
 
+       comp_status = le16_to_cpu(sts->comp_status);
        iocb = &sp->u.iocb_cmd;
        type = sp->name;
        fcport = sp->fcport;
        } else if (sts->comp_status != cpu_to_le16(CS_COMPLETE)) {
                ql_log(ql_log_warn, fcport->vha, 0x5039,
                    "Async-%s error - hdl=%x completion status(%x).\n",
-                   type, sp->handle, sts->comp_status);
+                   type, sp->handle, comp_status);
                iocb->u.tmf.data = QLA_FUNCTION_FAILED;
        } else if ((le16_to_cpu(sts->scsi_status) &
            SS_RESPONSE_INFO_LEN_VALID)) {
                }
        }
 
+       switch (comp_status) {
+       case CS_PORT_LOGGED_OUT:
+       case CS_PORT_CONFIG_CHG:
+       case CS_PORT_BUSY:
+       case CS_INCOMPLETE:
+       case CS_PORT_UNAVAILABLE:
+       case CS_TIMEOUT:
+       case CS_RESET:
+               if (atomic_read(&fcport->state) == FCS_ONLINE) {
+                       ql_dbg(ql_dbg_disc, fcport->vha, 0x3021,
+                              "-Port to be marked lost on fcport=%02x%02x%02x, current port state= %s comp_status %x.\n",
+                              fcport->d_id.b.domain, fcport->d_id.b.area,
+                              fcport->d_id.b.al_pa,
+                              port_state_str[FCS_ONLINE],
+                              comp_status);
+
+                       qlt_schedule_sess_for_deletion(fcport);
+               }
+               break;
+
+       default:
+               break;
+       }
+
        if (iocb->u.tmf.data != QLA_SUCCESS)
                ql_dump_buffer(ql_dbg_async + ql_dbg_buffer, sp->vha, 0x5055,
                    sts, sizeof(*sts));