Skip to content
  • Florian Fainelli's avatar
    net: systemport: Fix wake-up interrupt race during resume · 45ec3185
    Florian Fainelli authored
    The AON_PM_L2 is normally used to trigger and identify the source of a
    wake-up event. Since the RX_SYS clock is no longer turned off, we also
    have an interrupt being sent to the SYSTEMPORT INTRL_2_0 controller, and
    that interrupt remains active up until the magic packet detector is
    disabled which happens much later during the driver resumption.
    
    The race happens if we have a CPU that is entering the SYSTEMPORT
    INTRL2_0 handler during resume, and another CPU has managed to clear the
    wake-up interrupt during bcm_sysport_resume_from_wol(). In that case, we
    have the first CPU stuck in the interrupt handler with an interrupt
    cause that has been cleared under its feet, and so we keep returning
    IRQ_NONE and we never make any progress.
    
    This was not a problem before because we would always turn off the
    RX_SYS clock during WoL, so the SYSTEMPORT INTRL2_0 would also be turned
    off as well, thus not latching the interrupt.
    
    The fix is to make sure we do not enable either the MPD or
    BRCM_TAG_MATCH interrupts since those are redundant with what the
    AON_PM_L2 interrupt controller already processes and they would cause
    such a race to occur.
    
    Fixes: bb9051a2 ("net: systemport: Add support for WAKE_FILTER")
    Fixes: 83e82f4c
    
     ("net: systemport: add Wake-on-LAN support")
    Signed-off-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    45ec3185