• Junxiao Chang's avatar
    net: stmmac: power up/down serdes in stmmac_open/release · 49725ffc
    Junxiao Chang authored
    This commit fixes DMA engine reset timeout issue in suspend/resume
    with ADLink I-Pi SMARC Plus board which dmesg shows:
    ...
    [   54.678271] PM: suspend exit
    [   54.754066] intel-eth-pci 0000:00:1d.2 enp0s29f2: PHY [stmmac-3:01] driver [Maxlinear Ethernet GPY215B] (irq=POLL)
    [   54.755808] intel-eth-pci 0000:00:1d.2 enp0s29f2: Register MEM_TYPE_PAGE_POOL RxQ-0
    ...
    [   54.780482] intel-eth-pci 0000:00:1d.2 enp0s29f2: Register MEM_TYPE_PAGE_POOL RxQ-7
    [   55.784098] intel-eth-pci 0000:00:1d.2: Failed to reset the dma
    [   55.784111] intel-eth-pci 0000:00:1d.2 enp0s29f2: stmmac_hw_setup: DMA engine initialization failed
    [   55.784115] intel-eth-pci 0000:00:1d.2 enp0s29f2: stmmac_open: Hw setup failed
    ...
    
    The issue is related with serdes which impacts clock.  There is
    serdes in ADLink I-Pi SMARC board ethernet controller. Please refer to
    commit b9663b7c ("net: stmmac: Enable SERDES power up/down sequence")
    for detial. When issue is reproduced, DMA engine clock is not ready
    because serdes is not powered up.
    
    To reproduce DMA engine reset timeout issue with hardware which has
    serdes in GBE controller, install Ubuntu. In Ubuntu GUI, click
    "Power Off/Log Out" -> "Suspend" menu, it disables network interface,
    then goes to sleep mode. When it wakes up, it enables network
    interface again. Stmmac driver is called in this way:
    
    1. stmmac_release: Stop network interface. In this function, it
       disables DMA engine and network interface;
    2. stmmac_suspend: It is called in kernel suspend flow. But because
       network interface has been disabled(netif_running(ndev) is
       false), it does nothing and returns directly;
    3. System goes into S3 or S0ix state. Some time later, system is
       waken up by keyboard or mouse;
    4. stmmac_resume: It does nothing because network interface has
       been disabled;
    5. stmmac_open: It is called to enable network interace again. DMA
       engine is initialized in this API, but serdes is not power on so
       there will be DMA engine reset timeout issue.
    
    Similarly, serdes powerdown should be added in stmmac_release.
    Network interface might be disabled by cmd "ifconfig eth0 down",
    DMA engine, phy and mac have been disabled in ndo_stop callback,
    serdes should be powered down as well. It doesn't make sense that
    serdes is on while other components have been turned off.
    
    If ethernet interface is in enabled state(netif_running(ndev) is true)
    before suspend/resume, the issue couldn't be reproduced  because serdes
    could be powered up in stmmac_resume.
    
    Because serdes_powerup is added in stmmac_open, it doesn't need to be
    called in probe function.
    
    Fixes: b9663b7c ("net: stmmac: Enable SERDES power up/down sequence")
    Signed-off-by: default avatarJunxiao Chang <junxiao.chang@intel.com>
    Reviewed-by: default avatarVoon Weifeng <weifeng.voon@intel.com>
    Tested-by: default avatarJimmy JS Chen <jimmyjs.chen@adlinktech.com>
    Tested-by: default avatarLooi, Hong Aun <hong.aun.looi@intel.com>
    Link: https://lore.kernel.org/r/20220923050448.1220250-1-junxiao.chang@intel.comSigned-off-by: default avatarPaolo Abeni <pabeni@redhat.com>
    49725ffc
stmmac_main.c 205 KB