static int lpfc_fcf_inuse(struct lpfc_hba *);
 static void lpfc_mbx_cmpl_read_sparam(struct lpfc_hba *, LPFC_MBOXQ_t *);
 
+static int
+lpfc_valid_xpt_node(struct lpfc_nodelist *ndlp)
+{
+       if (ndlp->nlp_fc4_type ||
+           ndlp->nlp_DID == Fabric_DID ||
+           ndlp->nlp_DID == NameServer_DID ||
+           ndlp->nlp_DID == FDMI_DID)
+               return 1;
+       return 0;
+}
 /* The source of a terminate rport I/O is either a dev_loss_tmo
  * event or a call to fc_remove_host.  While the rport should be
  * valid during these downcalls, the transport can call twice
        /* FCP and NVME Transport interface */
        if ((old_state == NLP_STE_MAPPED_NODE ||
             old_state == NLP_STE_UNMAPPED_NODE)) {
-               if (ndlp->rport) {
+               if (ndlp->rport &&
+                   lpfc_valid_xpt_node(ndlp)) {
                        vport->phba->nport_event_cnt++;
                        lpfc_unregister_remote_port(ndlp);
                }
 
        if (new_state ==  NLP_STE_MAPPED_NODE ||
            new_state == NLP_STE_UNMAPPED_NODE) {
-               if (ndlp->nlp_fc4_type ||
-                   ndlp->nlp_DID == Fabric_DID ||
-                   ndlp->nlp_DID == NameServer_DID ||
-                   ndlp->nlp_DID == FDMI_DID) {
+               if (lpfc_valid_xpt_node(ndlp)) {
                        vport->phba->nport_event_cnt++;
                        /*
                         * Tell the fc transport about the port, if we haven't
 
                        ndlp->nlp_fc4_type |= NLP_FC4_NVME;
                        lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
                }
-               if (npr->prliType == PRLI_FCP_TYPE)
+
+               /* Fabric Controllers send FCP PRLI as an initiator but should
+                * not get recognized as FCP type and registered with transport.
+                */
+               if (npr->prliType == PRLI_FCP_TYPE &&
+                   !(ndlp->nlp_type & NLP_FABRIC))
                        ndlp->nlp_fc4_type |= NLP_FC4_FCP;
        }
        if (rport) {
                 * must complete PRLI.
                 */
                if (ndlp->nlp_type & NLP_FABRIC) {
+                       ndlp->nlp_fc4_type &= ~NLP_FC4_FCP;
                        ndlp->nlp_prev_state = NLP_STE_REG_LOGIN_ISSUE;
                        lpfc_nlp_set_state(vport, ndlp, NLP_STE_UNMAPPED_NODE);
                }