lkml.org 
[lkml]   [2022]   [Aug]   [16]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 5.19 0785/1157] scsi: lpfc: Revert RSCN_MEMENTO workaround for misbehaved configuration
    Date
    From: James Smart <jsmart2021@gmail.com>

    [ Upstream commit ffc566411aded3c12c63e1310fb23830e9608c59 ]

    The RSCN_MEMENTO logic was to workaround a target that does not register
    both FCP and NVMe FC4 types at the same time. This caused the
    configuration to not produce a second RSCN for the NVMe FC4 type
    registration in a timely manner. The intention of the RSCN_MEMENTO flag
    was to always signal to try NVMe PRLI.

    However, there are other FCP-only target arrays in correctly behaved
    configurations that reject the NVMe PRLI followed by a LOGO leading to
    never rediscovering the target after an issue_lip (as LOGO causes a repeat
    of PLOGI/PRLIs).

    Revert the RSCN_MEMENTO patch as it is causing correctly behaved configs to
    fail while it exists only to succeed on a misbehaved config.

    Link: https://lore.kernel.org/r/20220701211425.2708-9-jsmart2021@gmail.com
    Fixes: 1045592fc968 ("scsi: lpfc: Introduce FC_RSCN_MEMENTO flag for tracking post RSCN completion")
    Co-developed-by: Justin Tee <justin.tee@broadcom.com>
    Signed-off-by: Justin Tee <justin.tee@broadcom.com>
    Signed-off-by: James Smart <jsmart2021@gmail.com>
    Signed-off-by: Martin K. Petersen <martin.petersen@oracle.com>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    drivers/scsi/lpfc/lpfc.h | 1 -
    drivers/scsi/lpfc/lpfc_els.c | 8 ++------
    drivers/scsi/lpfc/lpfc_hbadisc.c | 3 +--
    3 files changed, 3 insertions(+), 9 deletions(-)

    diff --git a/drivers/scsi/lpfc/lpfc.h b/drivers/scsi/lpfc/lpfc.h
    index da9070cdad91..212f9b962187 100644
    --- a/drivers/scsi/lpfc/lpfc.h
    +++ b/drivers/scsi/lpfc/lpfc.h
    @@ -604,7 +604,6 @@ struct lpfc_vport {
    #define FC_VFI_REGISTERED 0x800000 /* VFI is registered */
    #define FC_FDISC_COMPLETED 0x1000000/* FDISC completed */
    #define FC_DISC_DELAYED 0x2000000/* Delay NPort discovery */
    -#define FC_RSCN_MEMENTO 0x4000000/* RSCN cmd processed */

    uint32_t ct_flags;
    #define FC_CT_RFF_ID 0x1 /* RFF_ID accepted by switch */
    diff --git a/drivers/scsi/lpfc/lpfc_els.c b/drivers/scsi/lpfc/lpfc_els.c
    index 3fababb7c181..c904e9486b92 100644
    --- a/drivers/scsi/lpfc/lpfc_els.c
    +++ b/drivers/scsi/lpfc/lpfc_els.c
    @@ -1886,7 +1886,6 @@ lpfc_end_rscn(struct lpfc_vport *vport)
    else {
    spin_lock_irq(shost->host_lock);
    vport->fc_flag &= ~FC_RSCN_MODE;
    - vport->fc_flag |= FC_RSCN_MEMENTO;
    spin_unlock_irq(shost->host_lock);
    }
    }
    @@ -2434,14 +2433,13 @@ lpfc_issue_els_prli(struct lpfc_vport *vport, struct lpfc_nodelist *ndlp,
    u32 local_nlp_type, elscmd;

    /*
    - * If discovery was kicked off from RSCN mode,
    - * the FC4 types supported from a
    + * If we are in RSCN mode, the FC4 types supported from a
    * previous GFT_ID command may not be accurate. So, if we
    * are a NVME Initiator, always look for the possibility of
    * the remote NPort beng a NVME Target.
    */
    if (phba->sli_rev == LPFC_SLI_REV4 &&
    - vport->fc_flag & (FC_RSCN_MODE | FC_RSCN_MEMENTO) &&
    + vport->fc_flag & FC_RSCN_MODE &&
    vport->nvmei_support)
    ndlp->nlp_fc4_type |= NLP_FC4_NVME;
    local_nlp_type = ndlp->nlp_fc4_type;
    @@ -7915,7 +7913,6 @@ lpfc_els_rcv_rscn(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,
    if ((rscn_cnt < FC_MAX_HOLD_RSCN) &&
    !(vport->fc_flag & FC_RSCN_DISCOVERY)) {
    vport->fc_flag |= FC_RSCN_MODE;
    - vport->fc_flag &= ~FC_RSCN_MEMENTO;
    spin_unlock_irq(shost->host_lock);
    if (rscn_cnt) {
    cmd = vport->fc_rscn_id_list[rscn_cnt-1]->virt;
    @@ -7965,7 +7962,6 @@ lpfc_els_rcv_rscn(struct lpfc_vport *vport, struct lpfc_iocbq *cmdiocb,

    spin_lock_irq(shost->host_lock);
    vport->fc_flag |= FC_RSCN_MODE;
    - vport->fc_flag &= ~FC_RSCN_MEMENTO;
    spin_unlock_irq(shost->host_lock);
    vport->fc_rscn_id_list[vport->fc_rscn_id_cnt++] = pcmd;
    /* Indicate we are done walking fc_rscn_id_list on this vport */
    diff --git a/drivers/scsi/lpfc/lpfc_hbadisc.c b/drivers/scsi/lpfc/lpfc_hbadisc.c
    index fb36f26170e4..5cd838eac455 100644
    --- a/drivers/scsi/lpfc/lpfc_hbadisc.c
    +++ b/drivers/scsi/lpfc/lpfc_hbadisc.c
    @@ -1354,8 +1354,7 @@ lpfc_linkup_port(struct lpfc_vport *vport)

    spin_lock_irq(shost->host_lock);
    vport->fc_flag &= ~(FC_PT2PT | FC_PT2PT_PLOGI | FC_ABORT_DISCOVERY |
    - FC_RSCN_MEMENTO | FC_RSCN_MODE |
    - FC_NLP_MORE | FC_RSCN_DISCOVERY);
    + FC_RSCN_MODE | FC_NLP_MORE | FC_RSCN_DISCOVERY);
    vport->fc_flag |= FC_NDISC_ACTIVE;
    vport->fc_ns_retry = 0;
    spin_unlock_irq(shost->host_lock);
    --
    2.35.1


    \
     
     \ /
      Last update: 2022-08-16 06:43    [W:2.937 / U:0.124 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site