elsiocb->cmd_cmpl = lpfc_cmpl_els_rrq;
 
        elsiocb->ndlp = lpfc_nlp_get(ndlp);
-       if (!elsiocb->ndlp) {
-               lpfc_els_free_iocb(phba, elsiocb);
-               return 1;
-       }
+       if (!elsiocb->ndlp)
+               goto io_err;
 
        ret = lpfc_sli_issue_iocb(phba, LPFC_ELS_RING, elsiocb, 0);
-       if (ret == IOCB_ERROR)
+       if (ret == IOCB_ERROR) {
+               lpfc_nlp_put(ndlp);
                goto io_err;
+       }
        return 0;
 
  io_err:
        lpfc_els_free_iocb(phba, elsiocb);
-       lpfc_nlp_put(ndlp);
        return 1;
 }
 
 
                        lpfc_config_link(phba, link_mbox);
                        link_mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
                        link_mbox->vport = vport;
+
+                       /* The default completion handling for CONFIG_LINK
+                        * does not require the ndlp so no reference is needed.
+                        */
                        link_mbox->ctx_ndlp = ndlp;
 
                        rc = lpfc_sli_issue_mbox(phba, link_mbox, MBX_NOWAIT);
         */
        login_mbox->mbox_cmpl = lpfc_defer_plogi_acc;
        login_mbox->ctx_ndlp = lpfc_nlp_get(ndlp);
+       if (!login_mbox->ctx_ndlp)
+               goto out;
+
        login_mbox->context3 = save_iocb; /* For PLOGI ACC */
 
        spin_lock_irq(&ndlp->lock);
 
        /* Start the ball rolling by issuing REG_LOGIN here */
        rc = lpfc_sli_issue_mbox(phba, login_mbox, MBX_NOWAIT);
-       if (rc == MBX_NOT_FINISHED)
+       if (rc == MBX_NOT_FINISHED) {
+               lpfc_nlp_put(ndlp);
                goto out;
+       }
        lpfc_nlp_set_state(vport, ndlp, NLP_STE_REG_LOGIN_ISSUE);
 
        return 1;
                                 ndlp->nlp_rpi, ndlp->nlp_DID, ndlp->nlp_flag);
 
                rc = lpfc_sli_issue_mbox(phba, pmb, MBX_NOWAIT);
-               if (rc == MBX_NOT_FINISHED)
+               if (rc == MBX_NOT_FINISHED) {
+                       lpfc_nlp_put(ndlp);
                        mempool_free(pmb, phba->mbox_mem_pool);
+               }
        }
 }
 
 
                rpinfo.dev_loss_tmo = vport->cfg_devloss_tmo;
 
        spin_lock_irq(&ndlp->lock);
+
+       /* If an oldrport exists, so does the ndlp reference.  If not
+        * a new reference is needed because either the node has never
+        * been registered or it's been unregistered and getting deleted.
+        */
        oldrport = lpfc_ndlp_get_nrport(ndlp);
        if (oldrport) {
                prev_ndlp = oldrport->ndlp;
 
                        mb->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
                if (mb->u.mb.mbxCommand == MBX_REG_LOGIN64) {
                        act_mbx_ndlp = (struct lpfc_nodelist *)mb->ctx_ndlp;
-                       /* Put reference count for delayed processing */
+
+                       /* This reference is local to this routine.  The
+                        * reference is removed at routine exit.
+                        */
                        act_mbx_ndlp = lpfc_nlp_get(act_mbx_ndlp);
+
                        /* Unregister the RPI when mailbox complete */
                        mb->mbox_flag |= LPFC_MBX_IMED_UNREG;
                }