• James Smart's avatar
    scsi: lpfc: Fix mailbox hang on adapter init · e8869f5b
    James Smart authored
    The adapter initialization sequence enables interrupts, initializes the
    adapter link_state to LINK_DOWN, then issues commands to initialize the
    adapter. The interrupt handler on the adapter validates the link_state (has
    to be at least LINK_DOWN) and if invalid, will discard the interrupting
    event.
    
    In most cases, there is not a command completion, thus an interrupt until
    the initialization commands have been sent which is post the setting of
    state to LINK_DOWN.  However, in cases of firmware reset, the reset will
    modify the link_state to an invalid value (indicating a reset of the
    adapter) and there occasionally are cases where the adapter will generate
    an asynchronous event which shares the eq/cq used for mailbox commands. In
    the failure case, an interrupt is generated immediately after enabling them
    due to the async event.  As link_state is invalid, the eq is list and the
    CQ not serviced.  At this point link_state is initialized and the mailbox
    command sent.  As the CQ has not been serviced, it is not armed, so no
    interrupt event is generated when the mailbox command completes.
    
    Modify the initialization sequence so that interrupts are enabled after
    link_state is properly initialized, which avoids the race condition with
    the async event.
    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>
    e8869f5b
lpfc_sli.c 619 KB