• James Smart's avatar
    scsi: lpfc: Defer LS_ACC to FLOGI on point to point logins · 0a9e9687
    James Smart authored
    The current discovery state machine the driver treated FLOGI oddly.  When
    point to point, an FLOGI is to be exchanged by the two ports, with the port
    with the most significant WWN then proceeding with PLOGI.  The
    implementation in the driver was keyed to closely with "what have I sent",
    not with what has happened between the two endpoints. Thus, it blatantly
    would ACC an FLOGI, but reject PLOGI's until it had its FLOGI ACC'd. The
    problem is - the sending of FLOGI may be delayed for some reason, or the
    response to FLOGI held off by the other side. In the failing situation the
    other side sent an FLOGI, which was ACC'd, then sent PLOGIs which were then
    rjt'd until the retry count for the PLOGIs were exceeded and the port gave
    up. The FLOGI may have been very late in transmit, or the response held off
    until the PLOGIs failed. Given the other port had the higher WWN, no PLOGIs
    would occur and communication stopped.
    
    Correct the situation by changing the FLOGI handling. Defer any response to
    an FLOGI until the driver has sent its FLOGI as well. Then, upon either
    completion of the sent FLOGI, or upon sending an ACC to a received FLOGI
    (which may be received before or just after FLOGI was sent). the driver
    will act on who has the higher WWN. if the other port does, the driver will
    noop any handling of an FLOGI response (if outstanding) and wait for PLOGI.
    If the local port does, the driver will transition to sending PLOGI and
    will noop any action on responding to an FLOGI (if not yet received).
    
    Fortunately, to implement this, it only took another state flag and
    deferring any FLOGI response if the FLOGI has yet to be transmit. All
    subsequent actions were already in place.
    Signed-off-by: default avatarDick Kennedy <dick.kennedy@broadcom.com>
    Signed-off-by: default avatarJames Smart <jsmart2021@gmail.com>
    Signed-off-by: default avatarMartin K. Petersen <martin.petersen@oracle.com>
    0a9e9687
lpfc_els.c 308 KB