• Russell King (Oracle)'s avatar
    net: phy: fix IRQ-based wake-on-lan over hibernate / power off · cc941e54
    Russell King (Oracle) authored
    Uwe reports:
    "Most PHYs signal WoL using an interrupt. So disabling interrupts [at
    shutdown] breaks WoL at least on PHYs covered by the marvell driver."
    
    Discussing with Ioana, the problem which was trying to be solved was:
    "The board in question is a LS1021ATSN which has two AR8031 PHYs that
    share an interrupt line. In case only one of the PHYs is probed and
    there are pending interrupts on the PHY#2 an IRQ storm will happen
    since there is no entity to clear the interrupt from PHY#2's registers.
    PHY#1's driver will get stuck in .handle_interrupt() indefinitely."
    
    Further confirmation that "the two AR8031 PHYs are on the same MDIO
    bus."
    
    With WoL using interrupts to wake the system, in such a case, the
    system will begin booting with an asserted interrupt. Thus, we need to
    cope with an interrupt asserted during boot.
    
    Solve this instead by disabling interrupts during PHY probe. This will
    ensure in Ioana's situation that both PHYs of the same type sharing an
    interrupt line on a common MDIO bus will have their interrupt outputs
    disabled when the driver probes the device, but before we hook in any
    interrupt handlers - thus avoiding the interrupt storm.
    
    A better fix would be for platform firmware to disable the interrupting
    devices at source during boot, before control is handed to the kernel.
    
    Fixes: e2f016cf ("net: phy: add a shutdown procedure")
    Link: 20230804071757.383971-1-u.kleine-koenig@pengutronix.de
    Reported-by: default avatarUwe Kleine-König <u.kleine-koenig@pengutronix.de>
    Signed-off-by: default avatarRussell King (Oracle) <rmk+kernel@armlinux.org.uk>
    Reviewed-by: default avatarAndrew Lunn <andrew@lunn.ch>
    Reviewed-by: default avatarFlorian Fainelli <florian.fainelli@broadcom.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    cc941e54
phy_device.c 91.7 KB