[PATCH net] net: stmmac: dwmac-rk: keep the GMAC powered when the PHY wakes the system
Igor Velkov via B4 Relay
devnull+iav.iav.lv at kernel.org
Wed Sep 30 12:34:45 PDT 2026
From: Igor Velkov <iav at iav.lv>
Since commit 6911308d7d11 ("net: stmmac: convert to phylink-managed
Wake-on-Lan"), the MAC device gets its wakeup flag only when the MAC
handles Wake-on-LAN itself. When the PHY handles it, device_may_wakeup()
is false for the MAC, and rk_gmac_suspend() powers the GMAC down: its
clocks stop and phy-supply is released.
On Helios64 (RTL8211F, Wake-on-LAN in the PHY) the board then hangs on
the first or second suspend with a magic-packet wake.
Also keep the GMAC powered when phy_may_wakeup() is true, and remember
the decision for resume.
Fixes: 6911308d7d11 ("net: stmmac: convert to phylink-managed Wake-on-Lan")
Assisted-by: LLM
Signed-off-by: Igor Velkov <iav at iav.lv>
---
Tested on Helios64 with 7.3-rc5: 20 of 20 suspends woke on a magic
packet. The mainline Helios64 DT has no PHY node, so the test used a
DT that describes the PHY with its interrupt and wakeup-source (a DT
patch will follow), together with [1], which fixes an interrupt storm
on resume.
[1] https://lore.kernel.org/r/20260930-stmmac-irq-shut-v1-1-104d1a1dcb28@iav.lv
---
drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c | 11 +++++++----
1 file changed, 7 insertions(+), 4 deletions(-)
diff --git a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
index 72bdbcb5e863..06faeb156b97 100644
--- a/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
+++ b/drivers/net/ethernet/stmicro/stmmac/dwmac-rk.c
@@ -98,6 +98,7 @@ struct rk_priv_data {
bool integrated_phy;
bool supports_rgmii;
bool supports_rmii;
+ bool suspend_powerdown;
struct clk_bulk_data *clks;
int num_clks;
@@ -1530,10 +1531,13 @@ static int rk_set_clk_tx_rate(void *bsp_priv_, struct clk *clk_tx_i,
static int rk_gmac_suspend(struct device *dev, void *bsp_priv_)
{
+ struct net_device *ndev = dev_get_drvdata(dev);
struct rk_priv_data *bsp_priv = bsp_priv_;
- /* Keep the PHY up if we use Wake-on-Lan. */
- if (!device_may_wakeup(dev))
+ /* Keep the MAC and PHY powered if either of them wakes the system. */
+ bsp_priv->suspend_powerdown = !device_may_wakeup(dev) &&
+ !(ndev->phydev && phy_may_wakeup(ndev->phydev));
+ if (bsp_priv->suspend_powerdown)
rk_gmac_powerdown(bsp_priv);
return 0;
@@ -1543,8 +1547,7 @@ static int rk_gmac_resume(struct device *dev, void *bsp_priv_)
{
struct rk_priv_data *bsp_priv = bsp_priv_;
- /* The PHY was up for Wake-on-Lan. */
- if (!device_may_wakeup(dev))
+ if (bsp_priv->suspend_powerdown)
rk_gmac_powerup(bsp_priv);
return 0;
---
base-commit: 99b43ede9e355ba35244cc9470bf1819774ce39d
change-id: 20260930-dwmac-rk-phy-wol-be1ea6a6066b
Best regards,
--
Igor Velkov <iav at iav.lv>
More information about the Linux-rockchip
mailing list