|
@@ -2646,9 +2646,14 @@ lpfc_init_vfi_cmpl(struct lpfc_hba *phba, LPFC_MBOXQ_t *mboxq)
|
|
|
{
|
|
|
struct lpfc_vport *vport = mboxq->vport;
|
|
|
|
|
|
- /* VFI not supported on interface type 0, just do the flogi */
|
|
|
- if (mboxq->u.mb.mbxStatus && (bf_get(lpfc_sli_intf_if_type,
|
|
|
- &phba->sli4_hba.sli_intf) != LPFC_SLI_INTF_IF_TYPE_0)) {
|
|
|
+ /*
|
|
|
+ * VFI not supported on interface type 0, just do the flogi
|
|
|
+ * Also continue if the VFI is in use - just use the same one.
|
|
|
+ */
|
|
|
+ if (mboxq->u.mb.mbxStatus &&
|
|
|
+ (bf_get(lpfc_sli_intf_if_type, &phba->sli4_hba.sli_intf) !=
|
|
|
+ LPFC_SLI_INTF_IF_TYPE_0) &&
|
|
|
+ mboxq->u.mb.mbxStatus != MBX_VFI_IN_USE) {
|
|
|
lpfc_printf_vlog(vport, KERN_ERR,
|
|
|
LOG_MBOX,
|
|
|
"2891 Init VFI mailbox failed 0x%x\n",
|
|
@@ -2922,6 +2927,7 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
|
|
|
{
|
|
|
struct lpfc_vport *vport = phba->pport;
|
|
|
LPFC_MBOXQ_t *sparam_mbox, *cfglink_mbox = NULL;
|
|
|
+ struct Scsi_Host *shost;
|
|
|
int i;
|
|
|
struct lpfc_dmabuf *mp;
|
|
|
int rc;
|
|
@@ -2945,6 +2951,7 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
|
|
|
phba->fc_topology = bf_get(lpfc_mbx_read_top_topology, la);
|
|
|
phba->link_flag &= ~LS_NPIV_FAB_SUPPORTED;
|
|
|
|
|
|
+ shost = lpfc_shost_from_vport(vport);
|
|
|
if (phba->fc_topology == LPFC_TOPOLOGY_LOOP) {
|
|
|
phba->sli3_options &= ~LPFC_SLI3_NPIV_ENABLED;
|
|
|
|
|
@@ -2956,8 +2963,11 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
|
|
|
"1309 Link Up Event npiv not supported in loop "
|
|
|
"topology\n");
|
|
|
/* Get Loop Map information */
|
|
|
- if (bf_get(lpfc_mbx_read_top_il, la))
|
|
|
+ if (bf_get(lpfc_mbx_read_top_il, la)) {
|
|
|
+ spin_lock_irq(shost->host_lock);
|
|
|
vport->fc_flag |= FC_LBIT;
|
|
|
+ spin_unlock_irq(shost->host_lock);
|
|
|
+ }
|
|
|
|
|
|
vport->fc_myDID = bf_get(lpfc_mbx_read_top_alpa_granted, la);
|
|
|
i = la->lilpBde64.tus.f.bdeSize;
|
|
@@ -3002,11 +3012,13 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
|
|
|
} else {
|
|
|
if (!(phba->sli3_options & LPFC_SLI3_NPIV_ENABLED)) {
|
|
|
if (phba->max_vpi && phba->cfg_enable_npiv &&
|
|
|
- (phba->sli_rev == 3))
|
|
|
+ (phba->sli_rev >= LPFC_SLI_REV3))
|
|
|
phba->sli3_options |= LPFC_SLI3_NPIV_ENABLED;
|
|
|
}
|
|
|
vport->fc_myDID = phba->fc_pref_DID;
|
|
|
+ spin_lock_irq(shost->host_lock);
|
|
|
vport->fc_flag |= FC_LBIT;
|
|
|
+ spin_unlock_irq(shost->host_lock);
|
|
|
}
|
|
|
spin_unlock_irq(&phba->hbalock);
|
|
|
|
|
@@ -3593,6 +3605,7 @@ lpfc_mbx_cmpl_fabric_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
|
|
MAILBOX_t *mb = &pmb->u.mb;
|
|
|
struct lpfc_dmabuf *mp = (struct lpfc_dmabuf *) (pmb->context1);
|
|
|
struct lpfc_nodelist *ndlp;
|
|
|
+ struct Scsi_Host *shost;
|
|
|
|
|
|
ndlp = (struct lpfc_nodelist *) pmb->context2;
|
|
|
pmb->context1 = NULL;
|
|
@@ -3638,8 +3651,12 @@ lpfc_mbx_cmpl_fabric_reg_login(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
|
|
* vport discovery */
|
|
|
if (!(vport->fc_flag & FC_LOGO_RCVD_DID_CHNG))
|
|
|
lpfc_start_fdiscs(phba);
|
|
|
- else
|
|
|
+ else {
|
|
|
+ shost = lpfc_shost_from_vport(vport);
|
|
|
+ spin_lock_irq(shost->host_lock);
|
|
|
vport->fc_flag &= ~FC_LOGO_RCVD_DID_CHNG ;
|
|
|
+ spin_unlock_irq(shost->host_lock);
|
|
|
+ }
|
|
|
lpfc_do_scr_ns_plogi(phba, vport);
|
|
|
}
|
|
|
|