Commit eec3d312 authored by James Smart's avatar James Smart Committed by James Bottomley

lpfc: Fix for discovery failure in PT2PT when FLOGI's ELS ACC response gets aborted

Fix for discovery failure in PT2PT when FLOGI's ELS ACC response gets aborted

Change login state machine to:
- Restart FLOGI if prior is ABTS'd
- Reject incoming FLOGIs if we have one pending

The above ensures that we always finish FLOGI processing, regardless
of who initated FLOGI, before processing PLOGI's.
Signed-off-by: default avatarDick Kennedy <dick.kennedy@avagotech.com>
Signed-off-by: default avatarJames Smart <james.smart@avagotech.com>
Reviewed-by: default avatarHannes Reinecke <hare@suse.com>
Signed-off-by: default avatarJames Bottomley <JBottomley@Odin.com>
parent d38dd52c
...@@ -5850,6 +5850,13 @@ lpfc_els_rcv_flogi(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb, ...@@ -5850,6 +5850,13 @@ lpfc_els_rcv_flogi(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
return 1; return 1;
} }
/* send our FLOGI first */
if (vport->port_state < LPFC_FLOGI) {
vport->fc_myDID = 0;
lpfc_initial_flogi(vport);
vport->fc_myDID = Fabric_DID;
}
/* Send back ACC */ /* Send back ACC */
lpfc_els_rsp_acc(vport, ELS_CMD_PLOGI, cmdiocb, ndlp, NULL); lpfc_els_rsp_acc(vport, ELS_CMD_PLOGI, cmdiocb, ndlp, NULL);
...@@ -7324,6 +7331,15 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, ...@@ -7324,6 +7331,15 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
"Data: x%x x%x x%x x%x\n", "Data: x%x x%x x%x x%x\n",
cmd, did, vport->port_state, vport->fc_flag, cmd, did, vport->port_state, vport->fc_flag,
vport->fc_myDID, vport->fc_prevDID); vport->fc_myDID, vport->fc_prevDID);
/* reject till our FLOGI completes */
if ((vport->port_state < LPFC_FABRIC_CFG_LINK) &&
(cmd != ELS_CMD_FLOGI)) {
rjt_err = LSRJT_UNABLE_TPC;
rjt_exp = LSEXP_NOTHING_MORE;
goto lsrjt;
}
switch (cmd) { switch (cmd) {
case ELS_CMD_PLOGI: case ELS_CMD_PLOGI:
lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL, lpfc_debugfs_disc_trc(vport, LPFC_DISC_TRC_ELS_UNSOL,
...@@ -7361,20 +7377,6 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, ...@@ -7361,20 +7377,6 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
rjt_exp = LSEXP_NOTHING_MORE; rjt_exp = LSEXP_NOTHING_MORE;
break; break;
} }
/* We get here, and drop thru, if we are PT2PT with
* another NPort and the other side has initiated
* the PLOGI before responding to our FLOGI.
*/
if (phba->sli_rev == LPFC_SLI_REV4 &&
(phba->fc_topology_changed ||
vport->fc_myDID != vport->fc_prevDID)) {
lpfc_unregister_fcf_prep(phba);
spin_lock_irq(shost->host_lock);
vport->fc_flag &= ~FC_VFI_REGISTERED;
spin_unlock_irq(shost->host_lock);
phba->fc_topology_changed = 0;
lpfc_issue_reg_vfi(vport);
}
} }
spin_lock_irq(shost->host_lock); spin_lock_irq(shost->host_lock);
...@@ -7605,6 +7607,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring, ...@@ -7605,6 +7607,7 @@ lpfc_els_unsol_buffer(struct lpfc_hba *phba, struct lpfc_sli_ring *pring,
break; break;
} }
lsrjt:
/* check if need to LS_RJT received ELS cmd */ /* check if need to LS_RJT received ELS cmd */
if (rjt_err) { if (rjt_err) {
memset(&stat, 0, sizeof(stat)); memset(&stat, 0, sizeof(stat));
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment