lpfc_device_rm_plogi_issue(struct lpfc_hba * phba,
                           struct lpfc_nodelist * ndlp, void *arg, uint32_t evt)
 {
-       /* software abort outstanding PLOGI */
-       lpfc_els_abort(phba, ndlp, 1);
+       if(ndlp->nlp_flag & NLP_NPR_2B_DISC) {
+               ndlp->nlp_flag |= NLP_NODEV_REMOVE;
+               return ndlp->nlp_state;
+       }
+       else {
+               /* software abort outstanding PLOGI */
+               lpfc_els_abort(phba, ndlp, 1);
 
-       lpfc_nlp_list(phba, ndlp, NLP_NO_LIST);
-       return NLP_STE_FREED_NODE;
+               lpfc_nlp_list(phba, ndlp, NLP_NO_LIST);
+               return NLP_STE_FREED_NODE;
+       }
 }
 
 static uint32_t
        ndlp->nlp_state = NLP_STE_NPR_NODE;
        lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST);
        spin_lock_irq(phba->host->host_lock);
-       ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
+       ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC);
        spin_unlock_irq(phba->host->host_lock);
 
        return ndlp->nlp_state;
                            struct lpfc_nodelist * ndlp, void *arg,
                            uint32_t evt)
 {
-       /* software abort outstanding ADISC */
-       lpfc_els_abort(phba, ndlp, 1);
+       if(ndlp->nlp_flag & NLP_NPR_2B_DISC) {
+               ndlp->nlp_flag |= NLP_NODEV_REMOVE;
+               return ndlp->nlp_state;
+       }
+       else {
+               /* software abort outstanding ADISC */
+               lpfc_els_abort(phba, ndlp, 1);
 
-       lpfc_nlp_list(phba, ndlp, NLP_NO_LIST);
-       return NLP_STE_FREED_NODE;
+               lpfc_nlp_list(phba, ndlp, NLP_NO_LIST);
+               return NLP_STE_FREED_NODE;
+       }
 }
 
 static uint32_t
        ndlp->nlp_state = NLP_STE_NPR_NODE;
        lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST);
        spin_lock_irq(phba->host->host_lock);
-       ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
+       ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC);
        ndlp->nlp_flag |= NLP_NPR_ADISC;
        spin_unlock_irq(phba->host->host_lock);
 
                              struct lpfc_nodelist * ndlp, void *arg,
                              uint32_t evt)
 {
-       lpfc_nlp_list(phba, ndlp, NLP_NO_LIST);
-       return NLP_STE_FREED_NODE;
+       if(ndlp->nlp_flag & NLP_NPR_2B_DISC) {
+               ndlp->nlp_flag |= NLP_NODEV_REMOVE;
+               return ndlp->nlp_state;
+       }
+       else {
+               lpfc_nlp_list(phba, ndlp, NLP_NO_LIST);
+               return NLP_STE_FREED_NODE;
+       }
 }
 
 static uint32_t
        ndlp->nlp_state = NLP_STE_NPR_NODE;
        lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST);
        spin_lock_irq(phba->host->host_lock);
-       ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
+       ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC);
        spin_unlock_irq(phba->host->host_lock);
        return ndlp->nlp_state;
 }
 lpfc_device_rm_prli_issue(struct lpfc_hba * phba,
                          struct lpfc_nodelist * ndlp, void *arg, uint32_t evt)
 {
-       /* software abort outstanding PRLI */
-       lpfc_els_abort(phba, ndlp, 1);
+       if(ndlp->nlp_flag & NLP_NPR_2B_DISC) {
+               ndlp->nlp_flag |= NLP_NODEV_REMOVE;
+               return ndlp->nlp_state;
+       }
+       else {
+               /* software abort outstanding PLOGI */
+               lpfc_els_abort(phba, ndlp, 1);
 
-       lpfc_nlp_list(phba, ndlp, NLP_NO_LIST);
-       return NLP_STE_FREED_NODE;
+               lpfc_nlp_list(phba, ndlp, NLP_NO_LIST);
+               return NLP_STE_FREED_NODE;
+       }
 }
 
 
        ndlp->nlp_state = NLP_STE_NPR_NODE;
        lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST);
        spin_lock_irq(phba->host->host_lock);
-       ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
+       ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC);
        spin_unlock_irq(phba->host->host_lock);
        return ndlp->nlp_state;
 }
        ndlp->nlp_prev_state = NLP_STE_UNMAPPED_NODE;
        ndlp->nlp_state = NLP_STE_NPR_NODE;
        lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST);
-       ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
+       ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC);
        lpfc_disc_set_adisc(phba, ndlp);
 
        return ndlp->nlp_state;
        ndlp->nlp_state = NLP_STE_NPR_NODE;
        lpfc_nlp_list(phba, ndlp, NLP_NPR_LIST);
        spin_lock_irq(phba->host->host_lock);
-       ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
+       ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC);
        spin_unlock_irq(phba->host->host_lock);
        lpfc_disc_set_adisc(phba, ndlp);
        return ndlp->nlp_state;
                          struct lpfc_nodelist * ndlp, void *arg, uint32_t evt)
 {
        struct lpfc_iocbq *cmdiocb, *rspiocb;
+       IOCB_t *irsp;
 
        cmdiocb = (struct lpfc_iocbq *) arg;
        rspiocb = cmdiocb->context_un.rsp_iocb;
+
+       irsp = &rspiocb->iocb;
+       if (irsp->ulpStatus) {
+               lpfc_nlp_list(phba, ndlp, NLP_NO_LIST);
+               return NLP_STE_FREED_NODE;
+       }
        return ndlp->nlp_state;
 }
 
                          struct lpfc_nodelist * ndlp, void *arg, uint32_t evt)
 {
        struct lpfc_iocbq *cmdiocb, *rspiocb;
+       IOCB_t *irsp;
 
        cmdiocb = (struct lpfc_iocbq *) arg;
        rspiocb = cmdiocb->context_un.rsp_iocb;
+
+       irsp = &rspiocb->iocb;
+       if (irsp->ulpStatus && (ndlp->nlp_flag & NLP_NODEV_REMOVE)) {
+               lpfc_nlp_list(phba, ndlp, NLP_NO_LIST);
+               return NLP_STE_FREED_NODE;
+       }
        return ndlp->nlp_state;
 }
 
                            uint32_t evt)
 {
        struct lpfc_iocbq *cmdiocb, *rspiocb;
+       IOCB_t *irsp;
 
        cmdiocb = (struct lpfc_iocbq *) arg;
        rspiocb = cmdiocb->context_un.rsp_iocb;
+
+       irsp = &rspiocb->iocb;
+       if (irsp->ulpStatus && (ndlp->nlp_flag & NLP_NODEV_REMOVE)) {
+               lpfc_nlp_list(phba, ndlp, NLP_NO_LIST);
+               return NLP_STE_FREED_NODE;
+       }
        return ndlp->nlp_state;
 }
 
 
        if (!mb->mbxStatus)
                ndlp->nlp_rpi = mb->un.varWords[0];
-
+       else {
+               if (ndlp->nlp_flag & NLP_NODEV_REMOVE) {
+                       lpfc_nlp_list(phba, ndlp, NLP_NO_LIST);
+                       return NLP_STE_FREED_NODE;
+               }
+       }
        return ndlp->nlp_state;
 }
 
                            struct lpfc_nodelist * ndlp, void *arg,
                            uint32_t evt)
 {
+       if (ndlp->nlp_flag & NLP_NPR_2B_DISC) {
+               ndlp->nlp_flag |= NLP_NODEV_REMOVE;
+               return ndlp->nlp_state;
+       }
        lpfc_nlp_list(phba, ndlp, NLP_NO_LIST);
        return NLP_STE_FREED_NODE;
 }
                            uint32_t evt)
 {
        spin_lock_irq(phba->host->host_lock);
-       ndlp->nlp_flag &= ~NLP_NPR_2B_DISC;
+       ndlp->nlp_flag &= ~(NLP_NODEV_REMOVE | NLP_NPR_2B_DISC);
        spin_unlock_irq(phba->host->host_lock);
        if (ndlp->nlp_flag & NLP_DELAY_TMO) {
                lpfc_cancel_retry_delay_tmo(phba, ndlp);