• Heiner Kallweit's avatar
    net: phy: fix WoL handling when suspending the PHY · e0511f6c
    Heiner Kallweit authored
    Actually there's nothing wrong with the two changes marked as "Fixes",
    they just revealed a problem which has been existing before.
    After having switched r8169 to phylib it was reported that WoL from
    shutdown doesn't work any longer (WoL from suspend isn't affected).
    Reason is that during shutdown phy_disconnect()->phy_detach()->
    phy_suspend() is called.
    A similar issue occurs when the phylib state machine calls
    phy_suspend() when handling state PHY_HALTED.
    
    Core of the problem is that phy_suspend() suspends the PHY when it
    should not due to WoL. phy_suspend() checks for WoL already, but this
    works only if the PHY driver handles WoL (what is rarely the case).
    Typically WoL is handled by the MAC driver.
    
    phylib knows about this and handles it in mdio_bus_phy_may_suspend(),
    but that's used only when suspending the system, not in other cases
    like shutdown.
    
    Therefore factor out the relevant check from
    mdio_bus_phy_may_suspend() to a new function phy_may_suspend() and
    use it in phy_suspend().
    
    Last but not least change phy_detach() to call phy_suspend() before
    attached_dev is set to NULL. phy_suspend() accesses attached_dev
    when checking whether the MAC driver activated WoL.
    
    Fixes: f1e911d5 ("r8169: add basic phylib support")
    Fixes: e8cfd9d6 ("net: phy: call state machine synchronously in phy_stop")
    Signed-off-by: default avatarHeiner Kallweit <hkallweit1@gmail.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    e0511f6c
phy_device.c 50.4 KB