• Justin Tee's avatar
    scsi: lpfc: Defer issuing new PLOGI if received RSCN before completing REG_LOGIN · 1d0f9fea
    Justin Tee authored
    When mapped to a target with multiple virtual ports, a link bounce
    sometimes results in unsuccessful rediscovery of all of the target's
    virtual ports.  This is because a succession of repeat RSCNs for the
    virtual target ports leaves ndlps in the REG_LOGIN state with the
    NLP_REG_LOGIN_SEND flag set.  With NLP_REG_LOGIN_SEND set, during the next
    PLOGI, the driver will UNREG_RPI.  When UNREG_RPI is processed, the driver
    can be in the middle of PRLI_ISSUE or MAPPED state resulting in an illegal
    state transition by the discovery engine and stalling.
    
    Fix by calling the discovery state machine with DEVICE_RECOVERY event
    during RSCN processing.  This will set the NLP_IGNR_REG_CMPL bit and
    prevent the old REG_LOGIN state from advancing.  Then for the new PLOGI
    issue, add the check for the NLP_IGNR_REG_CMPL bit to delay issuing the new
    PLOGI until the queued REG_LOGIN and UNREG_LOGIN have been processed.
    Signed-off-by: default avatarJustin Tee <justin.tee@broadcom.com>
    Link: https://lore.kernel.org/r/20230301231626.9621-6-justintee8345@gmail.comSigned-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    1d0f9fea
lpfc_hbadisc.c 211 KB