• Joakim Zhang's avatar
    net: stmmac: fix MAC not working when system resume back with WoL active · 90702dcd
    Joakim Zhang authored
    We can reproduce this issue with below steps:
    1) enable WoL on the host
    2) host system suspended
    3) remote client send out wakeup packets
    We can see that host system resume back, but can't work, such as ping failed.
    
    After a bit digging, this issue is introduced by the commit 46f69ded
    ("net: stmmac: Use resolved link config in mac_link_up()"), which use
    the finalised link parameters in mac_link_up() rather than the
    parameters in mac_config().
    
    There are two scenarios for MAC suspend/resume in STMMAC driver:
    
    1) MAC suspend with WoL inactive, stmmac_suspend() call
    phylink_mac_change() to notify phylink machine that a change in MAC
    state, then .mac_link_down callback would be invoked. Further, it will
    call phylink_stop() to stop the phylink instance. When MAC resume back,
    firstly phylink_start() is called to start the phylink instance, then
    call phylink_mac_change() which will finally trigger phylink machine to
    invoke .mac_config and .mac_link_up callback. All is fine since
    configuration in these two callbacks will be initialized, that means MAC
    can restore the state.
    
    2) MAC suspend with WoL active, phylink_mac_change() will put link
    down, but there is no phylink_stop() to stop the phylink instance, so it
    will link up again, that means .mac_config and .mac_link_up would be
    invoked before system suspended. After system resume back, it will do
    DMA initialization and SW reset which let MAC lost the hardware setting
    (i.e MAC_Configuration register(offset 0x0) is reset). Since link is up
    before system suspended, so .mac_link_up would not be invoked after
    system resume back, lead to there is no chance to initialize the
    configuration in .mac_link_up callback, as a result, MAC can't work any
    longer.
    
    After discussed with Russell King [1], we confirm that phylink framework
    have not take WoL into consideration yet. This patch calls
    phylink_suspend()/phylink_resume() functions which is newly introduced
    by Russell King to fix this issue.
    
    [1] https://lore.kernel.org/netdev/20210901090228.11308-1-qiangqing.zhang@nxp.com/
    
    Fixes: 46f69ded ("net: stmmac: Use resolved link config in mac_link_up()")
    Signed-off-by: default avatarJoakim Zhang <qiangqing.zhang@nxp.com>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    90702dcd
stmmac_main.c 196 KB