}
 
        /* Start discovery by sending a FLOGI. port_state is identically
-        * LPFC_FLOGI while waiting for FLOGI cmpl
+        * LPFC_FLOGI while waiting for FLOGI cmpl. Check if sending
+        * the FLOGI is being deferred till after MBX_READ_SPARAM completes.
         */
-       if (vport->port_state != LPFC_FLOGI)
-               lpfc_initial_flogi(vport);
-       else if (vport->fc_flag & FC_PT2PT)
-               lpfc_disc_start(vport);
-
+       if (vport->port_state != LPFC_FLOGI) {
+               if (!(phba->hba_flag & HBA_DEFER_FLOGI))
+                       lpfc_initial_flogi(vport);
+       } else {
+               if (vport->fc_flag & FC_PT2PT)
+                       lpfc_disc_start(vport);
+       }
        return;
 
 out:
        lpfc_mbuf_free(phba, mp->virt, mp->phys);
        kfree(mp);
        mempool_free(pmb, phba->mbox_mem_pool);
+
+       /* Check if sending the FLOGI is being deferred to after we get
+        * up to date CSPs from MBX_READ_SPARAM.
+        */
+       if (phba->hba_flag & HBA_DEFER_FLOGI) {
+               lpfc_initial_flogi(vport);
+               phba->hba_flag &= ~HBA_DEFER_FLOGI;
+       }
        return;
 
 out:
        }
 
        lpfc_linkup(phba);
+       sparam_mbox = NULL;
+
+       if (!(phba->hba_flag & HBA_FCOE_MODE)) {
+               cfglink_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
+               if (!cfglink_mbox)
+                       goto out;
+               vport->port_state = LPFC_LOCAL_CFG_LINK;
+               lpfc_config_link(phba, cfglink_mbox);
+               cfglink_mbox->vport = vport;
+               cfglink_mbox->mbox_cmpl = lpfc_mbx_cmpl_local_config_link;
+               rc = lpfc_sli_issue_mbox(phba, cfglink_mbox, MBX_NOWAIT);
+               if (rc == MBX_NOT_FINISHED) {
+                       mempool_free(cfglink_mbox, phba->mbox_mem_pool);
+                       goto out;
+               }
+       }
+
        sparam_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
        if (!sparam_mbox)
                goto out;
                goto out;
        }
 
-       if (!(phba->hba_flag & HBA_FCOE_MODE)) {
-               cfglink_mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
-               if (!cfglink_mbox)
-                       goto out;
-               vport->port_state = LPFC_LOCAL_CFG_LINK;
-               lpfc_config_link(phba, cfglink_mbox);
-               cfglink_mbox->vport = vport;
-               cfglink_mbox->mbox_cmpl = lpfc_mbx_cmpl_local_config_link;
-               rc = lpfc_sli_issue_mbox(phba, cfglink_mbox, MBX_NOWAIT);
-               if (rc == MBX_NOT_FINISHED) {
-                       mempool_free(cfglink_mbox, phba->mbox_mem_pool);
-                       goto out;
-               }
-       } else {
+       if (phba->hba_flag & HBA_FCOE_MODE) {
                vport->port_state = LPFC_VPORT_UNKNOWN;
                /*
                 * Add the driver's default FCF record at FCF index 0 now. This
                }
                /* Reset FCF roundrobin bmask for new discovery */
                lpfc_sli4_clear_fcf_rr_bmask(phba);
+       } else {
+               if (phba->bbcredit_support && phba->cfg_enable_bbcr &&
+                   !(phba->link_flag & LS_LOOPBACK_MODE))
+                       phba->hba_flag |= HBA_DEFER_FLOGI;
        }
 
        /* Prepare for LINK up registrations */