struct lpfc_nvme_rport *rport;
        struct nvme_fc_remote_port *remote_port;
        struct nvme_fc_port_info rpinfo;
+       struct lpfc_nodelist *prev_ndlp;
 
        lpfc_printf_vlog(ndlp->vport, KERN_INFO, LOG_NVME_DISC,
                         "6006 Register NVME PORT. DID x%06x nlptype x%x\n",
                 * new rport.
                 */
                rport = remote_port->private;
-               if (ndlp->nrport == rport) {
+               if (ndlp->nrport) {
                        lpfc_printf_vlog(ndlp->vport, KERN_INFO,
                                         LOG_NVME_DISC,
                                         "6014 Rebinding lport to "
                                         remote_port->port_role,
                                         ndlp->nlp_type,
                                         ndlp->nlp_DID);
-               } else {
-                       /* New rport. */
-                       rport->remoteport = remote_port;
-                       rport->lport = lport;
-                       rport->ndlp = lpfc_nlp_get(ndlp);
-                       if (!rport->ndlp)
-                               return -1;
-                       ndlp->nrport = rport;
-                       lpfc_printf_vlog(vport, KERN_INFO,
-                                        LOG_NVME_DISC | LOG_NODE,
-                                        "6022 Binding new rport to "
-                                        "lport %p Rport WWNN 0x%llx, "
-                                        "Rport WWPN 0x%llx DID "
-                                        "x%06x Role x%x\n",
-                                        lport,
-                                        rpinfo.node_name, rpinfo.port_name,
-                                        rpinfo.port_id, rpinfo.port_role);
+                       prev_ndlp = rport->ndlp;
+
+                       /* Sever the ndlp<->rport connection before dropping
+                        * the ndlp ref from register.
+                        */
+                       ndlp->nrport = NULL;
+                       rport->ndlp = NULL;
+                       if (prev_ndlp)
+                               lpfc_nlp_put(ndlp);
                }
+
+               /* Clean bind the rport to the ndlp. */
+               rport->remoteport = remote_port;
+               rport->lport = lport;
+               rport->ndlp = lpfc_nlp_get(ndlp);
+               if (!rport->ndlp)
+                       return -1;
+               ndlp->nrport = rport;
+               lpfc_printf_vlog(vport, KERN_INFO,
+                                LOG_NVME_DISC | LOG_NODE,
+                                "6022 Binding new rport to "
+                                "lport %p Rport WWNN 0x%llx, "
+                                "Rport WWPN 0x%llx DID "
+                                "x%06x Role x%x\n",
+                                lport,
+                                rpinfo.node_name, rpinfo.port_name,
+                                rpinfo.port_id, rpinfo.port_role);
        } else {
                lpfc_printf_vlog(vport, KERN_ERR,
                                 LOG_NVME_DISC | LOG_NODE,