goto flogifail;
 
                lpfc_printf_vlog(vport, KERN_WARNING, LOG_ELS,
-                                "0150 FLOGI failure Status:x%x/x%x TMO:x%x\n",
+                                "0150 FLOGI failure Status:x%x/x%x xri x%x TMO:x%x\n",
                                 irsp->ulpStatus, irsp->un.ulpWord[4],
-                                irsp->ulpTimeout);
+                                cmdiocb->sli4_xritag, irsp->ulpTimeout);
 
                /* FLOGI failed, so there is no fabric */
                spin_lock_irq(shost->host_lock);
        /* FLOGI completes successfully */
        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
                         "0101 FLOGI completes successfully, I/O tag:x%x, "
-                        "Data: x%x x%x x%x x%x x%x x%x\n", cmdiocb->iotag,
+                        "xri x%x Data: x%x x%x x%x x%x x%x %x\n",
+                        cmdiocb->iotag, cmdiocb->sli4_xritag,
                         irsp->un.ulpWord[4], sp->cmn.e_d_tov,
                         sp->cmn.w2.r_a_tov, sp->cmn.edtovResolution,
                         vport->port_state, vport->fc_flag);
        default:
                return 1;
        }
-       /* Xmit ELS ACC response tag <ulpIoTag> */
-       lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
-                        "0128 Xmit ELS ACC response tag x%x, XRI: x%x, "
-                        "DID: x%x, nlp_flag: x%x nlp_state: x%x RPI: x%x "
-                        "fc_flag x%x\n",
-                        elsiocb->iotag, elsiocb->iocb.ulpContext,
-                        ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
-                        ndlp->nlp_rpi, vport->fc_flag);
        if (ndlp->nlp_flag & NLP_LOGO_ACC) {
                spin_lock_irq(shost->host_lock);
                if (!(ndlp->nlp_flag & NLP_RPI_REGISTERED ||
                lpfc_els_free_iocb(phba, elsiocb);
                return 1;
        }
+
+       /* Xmit ELS ACC response tag <ulpIoTag> */
+       lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
+                        "0128 Xmit ELS ACC response Status: x%x, IoTag: x%x, "
+                        "XRI: x%x, DID: x%x, nlp_flag: x%x nlp_state: x%x "
+                        "RPI: x%x, fc_flag x%x\n",
+                        rc, elsiocb->iotag, elsiocb->sli4_xritag,
+                        ndlp->nlp_DID, ndlp->nlp_flag, ndlp->nlp_state,
+                        ndlp->nlp_rpi, vport->fc_flag);
        return 0;
 }
 
        port_state = vport->port_state;
        vport->fc_flag |= FC_PT2PT;
        vport->fc_flag &= ~(FC_FABRIC | FC_PUBLIC_LOOP);
+
+       /* Acking an unsol FLOGI.  Count 1 for link bounce
+        * work-around.
+        */
+       vport->rcv_flogi_cnt++;
        spin_unlock_irq(shost->host_lock);
        lpfc_printf_vlog(vport, KERN_INFO, LOG_ELS,
                         "3311 Rcv Flogi PS x%x new PS x%x "
        struct ls_rjt stat;
        uint32_t *payload;
        uint32_t cmd, did, newnode;
-       uint8_t rjt_exp, rjt_err = 0;
+       uint8_t rjt_exp, rjt_err = 0, init_link = 0;
        IOCB_t *icmd = &elsiocb->iocb;
+       LPFC_MBOXQ_t *mbox;
 
        if (!vport || !(elsiocb->context2))
                goto dropit;
                        did, vport->port_state, ndlp->nlp_flag);
 
                phba->fc_stat.elsRcvFLOGI++;
+
+               /* If the driver believes fabric discovery is done and is ready,
+                * bounce the link.  There is some descrepancy.
+                */
+               if (vport->port_state >= LPFC_LOCAL_CFG_LINK &&
+                   vport->fc_flag & FC_PT2PT &&
+                   vport->rcv_flogi_cnt >= 1) {
+                       rjt_err = LSRJT_LOGICAL_BSY;
+                       rjt_exp = LSEXP_NOTHING_MORE;
+                       init_link++;
+                       goto lsrjt;
+               }
+
                lpfc_els_rcv_flogi(vport, elsiocb, ndlp);
                if (newnode)
                        lpfc_nlp_put(ndlp);
 
        lpfc_nlp_put(elsiocb->context1);
        elsiocb->context1 = NULL;
+
+       /* Special case.  Driver received an unsolicited command that
+        * unsupportable given the driver's current state.  Reset the
+        * link and start over.
+        */
+       if (init_link) {
+               mbox = mempool_alloc(phba->mbox_mem_pool, GFP_KERNEL);
+               if (!mbox)
+                       return;
+               lpfc_linkdown(phba);
+               lpfc_init_link(phba, mbox,
+                              phba->cfg_topology,
+                              phba->cfg_link_speed);
+               mbox->u.mb.un.varInitLnk.lipsr_AL_PA = 0;
+               mbox->mbox_cmpl = lpfc_sli_def_mbox_cmpl;
+               mbox->vport = vport;
+               if (lpfc_sli_issue_mbox(phba, mbox, MBX_NOWAIT) ==
+                   MBX_NOT_FINISHED)
+                       mempool_free(mbox, phba->mbox_mem_pool);
+       }
+
        return;
 
 dropit: