Patch "net: stmmac: power up/down serdes in stmmac_open/release" has been added to the 5.15-stable tree

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



This is a note to let you know that I've just added the patch titled

    net: stmmac: power up/down serdes in stmmac_open/release

to the 5.15-stable tree which can be found at:
    http://www.kernel.org/git/?p=linux/kernel/git/stable/stable-queue.git;a=summary

The filename of the patch is:
     net-stmmac-power-up-down-serdes-in-stmmac_open-relea.patch
and it can be found in the queue-5.15 subdirectory.

If you, or anyone else, feels it should not be added to the stable tree,
please let <stable@xxxxxxxxxxxxxxx> know about it.



commit f9d5f9e8c7cef582d267f12b0c7e97b5e36d20ea
Author: Junxiao Chang <junxiao.chang@xxxxxxxxx>
Date:   Fri Sep 23 13:04:48 2022 +0800

    net: stmmac: power up/down serdes in stmmac_open/release
    
    [ Upstream commit 49725ffc15fc4e9fae68c55b691fd25168cbe5c1 ]
    
    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 b9663b7ca6ff78 ("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: b9663b7ca6ff78 ("net: stmmac: Enable SERDES power up/down sequence")
    Signed-off-by: Junxiao Chang <junxiao.chang@xxxxxxxxx>
    Reviewed-by: Voon Weifeng <weifeng.voon@xxxxxxxxx>
    Tested-by: Jimmy JS Chen <jimmyjs.chen@xxxxxxxxxxxxxx>
    Tested-by: Looi, Hong Aun <hong.aun.looi@xxxxxxxxx>
    Link: https://lore.kernel.org/r/20220923050448.1220250-1-junxiao.chang@xxxxxxxxx
    Signed-off-by: Paolo Abeni <pabeni@xxxxxxxxxx>
    Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx>

diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
index 2569673559df..6f579f498993 100644
--- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
+++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c
@@ -3757,6 +3757,15 @@ static int stmmac_open(struct net_device *dev)
 		goto init_error;
 	}
 
+	if (priv->plat->serdes_powerup) {
+		ret = priv->plat->serdes_powerup(dev, priv->plat->bsp_priv);
+		if (ret < 0) {
+			netdev_err(priv->dev, "%s: Serdes powerup failed\n",
+				   __func__);
+			goto init_error;
+		}
+	}
+
 	ret = stmmac_hw_setup(dev, true);
 	if (ret < 0) {
 		netdev_err(priv->dev, "%s: Hw setup failed\n", __func__);
@@ -3846,6 +3855,10 @@ static int stmmac_release(struct net_device *dev)
 	/* Disable the MAC Rx/Tx */
 	stmmac_mac_set(priv, priv->ioaddr, false);
 
+	/* Powerdown Serdes if there is */
+	if (priv->plat->serdes_powerdown)
+		priv->plat->serdes_powerdown(dev, priv->plat->bsp_priv);
+
 	netif_carrier_off(dev);
 
 	stmmac_release_ptp(priv);
@@ -7224,14 +7237,6 @@ int stmmac_dvr_probe(struct device *device,
 		goto error_netdev_register;
 	}
 
-	if (priv->plat->serdes_powerup) {
-		ret = priv->plat->serdes_powerup(ndev,
-						 priv->plat->bsp_priv);
-
-		if (ret < 0)
-			goto error_serdes_powerup;
-	}
-
 #ifdef CONFIG_DEBUG_FS
 	stmmac_init_fs(ndev);
 #endif
@@ -7246,8 +7251,6 @@ int stmmac_dvr_probe(struct device *device,
 
 	return ret;
 
-error_serdes_powerup:
-	unregister_netdev(ndev);
 error_netdev_register:
 	phylink_destroy(priv->phylink);
 error_xpcs_setup:



[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Index of Archives]     [Linux USB Devel]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]

  Powered by Linux