scsi: lpfc: Fix initial FLOGI failure due to BBSCN not supported
commit 7f04839ec4483563f38062b4dd90253e45447198 upstream. Initial FLOGIs are failing with the following message: lpfc 0000:13:00.1: 1:(0):0820 FLOGI Failed (x300). BBCredit Not Supported In a prior patch, the READ_SPARAM command was re-ordered to post after CONFIG_LINK as the driver is expected to update the driver's copy of the service parameters for the FLOGI payload. If the bb-credit recovery feature is enabled, this is fine. But on adapters were bb-credit recovery isn't enabled, it would cause the FLOGI to fail. Fix by restoring the original command order (READ_SPARAM before CONFIG_LINK), and after issuing CONFIG_LINK, detect bb-credit recovery support and reissuing READ_SPARAM to obtain the updated service parameters (effectively adding in the fix command order). [mkp: corrected SHA] Link: https://lore.kernel.org/r/20200911200147.110826-1-james.smart@broadcom.com Fixes: 835214f5d5f5 ("scsi: lpfc: Fix broken Credit Recovery after driver load") CC: <stable@vger.kernel.org> # v5.7+ Co-developed-by: Dick Kennedy <dick.kennedy@broadcom.com> Signed-off-by: Dick Kennedy <dick.kennedy@broadcom.com> Signed-off-by: James Smart <james.smart@broadcom.com> Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com> Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
This commit is contained in:
committed by
Greg Kroah-Hartman
parent
6890a6f566
commit
4cb7f22982
@ -73,6 +73,7 @@ static void lpfc_disc_timeout_handler(struct lpfc_vport *);
|
||||
static void lpfc_disc_flush_list(struct lpfc_vport *vport);
|
||||
static void lpfc_unregister_fcfi_cmpl(struct lpfc_hba *, LPFC_MBOXQ_t *);
|
||||
static int lpfc_fcf_inuse(struct lpfc_hba *);
|
||||
static void lpfc_mbx_cmpl_read_sparam(struct lpfc_hba *, LPFC_MBOXQ_t *);
|
||||
|
||||
void
|
||||
lpfc_terminate_rport_io(struct fc_rport *rport)
|
||||
@ -1134,11 +1135,13 @@ out:
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
void
|
||||
lpfc_mbx_cmpl_local_config_link(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
{
|
||||
struct lpfc_vport *vport = pmb->vport;
|
||||
LPFC_MBOXQ_t *sparam_mb;
|
||||
struct lpfc_dmabuf *sparam_mp;
|
||||
int rc;
|
||||
|
||||
if (pmb->u.mb.mbxStatus)
|
||||
goto out;
|
||||
@ -1163,12 +1166,42 @@ lpfc_mbx_cmpl_local_config_link(struct lpfc_hba *phba, LPFC_MBOXQ_t *pmb)
|
||||
}
|
||||
|
||||
/* Start discovery by sending a FLOGI. port_state is identically
|
||||
* LPFC_FLOGI while waiting for FLOGI cmpl. Check if sending
|
||||
* the FLOGI is being deferred till after MBX_READ_SPARAM completes.
|
||||
* LPFC_FLOGI while waiting for FLOGI cmpl.
|
||||
*/
|
||||
if (vport->port_state != LPFC_FLOGI) {
|
||||
if (!(phba->hba_flag & HBA_DEFER_FLOGI))
|
||||
/* Issue MBX_READ_SPARAM to update CSPs before FLOGI if
|
||||
* bb-credit recovery is in place.
|
||||
*/
|
||||
if (phba->bbcredit_support && phba->cfg_enable_bbcr &&
|
||||
!(phba->link_flag & LS_LOOPBACK_MODE)) {
|
||||
sparam_mb = mempool_alloc(phba->mbox_mem_pool,
|
||||
GFP_KERNEL);
|
||||
if (!sparam_mb)
|
||||
goto sparam_out;
|
||||
|
||||
rc = lpfc_read_sparam(phba, sparam_mb, 0);
|
||||
if (rc) {
|
||||
mempool_free(sparam_mb, phba->mbox_mem_pool);
|
||||
goto sparam_out;
|
||||
}
|
||||
sparam_mb->vport = vport;
|
||||
sparam_mb->mbox_cmpl = lpfc_mbx_cmpl_read_sparam;
|
||||
rc = lpfc_sli_issue_mbox(phba, sparam_mb, MBX_NOWAIT);
|
||||
if (rc == MBX_NOT_FINISHED) {
|
||||
sparam_mp = (struct lpfc_dmabuf *)
|
||||
sparam_mb->ctx_buf;
|
||||
lpfc_mbuf_free(phba, sparam_mp->virt,
|
||||
sparam_mp->phys);
|
||||
kfree(sparam_mp);
|
||||
sparam_mb->ctx_buf = NULL;
|
||||
mempool_free(sparam_mb, phba->mbox_mem_pool);
|
||||
goto sparam_out;
|
||||
}
|
||||
|
||||
phba->hba_flag |= HBA_DEFER_FLOGI;
|
||||
} else {
|
||||
lpfc_initial_flogi(vport);
|
||||
}
|
||||
} else {
|
||||
if (vport->fc_flag & FC_PT2PT)
|
||||
lpfc_disc_start(vport);
|
||||
@ -1180,6 +1213,7 @@ out:
|
||||
"0306 CONFIG_LINK mbxStatus error x%x "
|
||||
"HBA state x%x\n",
|
||||
pmb->u.mb.mbxStatus, vport->port_state);
|
||||
sparam_out:
|
||||
mempool_free(pmb, phba->mbox_mem_pool);
|
||||
|
||||
lpfc_linkdown(phba);
|
||||
@ -3237,21 +3271,6 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
|
||||
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;
|
||||
@ -3272,7 +3291,20 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
|
||||
goto out;
|
||||
}
|
||||
|
||||
if (phba->hba_flag & HBA_FCOE_MODE) {
|
||||
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 {
|
||||
vport->port_state = LPFC_VPORT_UNKNOWN;
|
||||
/*
|
||||
* Add the driver's default FCF record at FCF index 0 now. This
|
||||
@ -3329,10 +3361,6 @@ lpfc_mbx_process_link_up(struct lpfc_hba *phba, struct lpfc_mbx_read_top *la)
|
||||
}
|
||||
/* 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 */
|
||||
|
Reference in New Issue
Block a user