Since the referenced commit, changing the MTU on a running interface no longer disconnects and reconnects the PHY; __stmmac_release() merely stops phylink, which also suspends the PHY (BMCR power-down) when WoL is not enabled. __stmmac_open() then performs the DMA software reset in stmmac_hw_setup() before phylink_start() resumes the PHY again. IEEE 802.3 22.2.4.1.5 allows a PHY to stop its receive clock while powered down, and stmmac requires a running receive clock for the DMA software reset to complete (the phylink config sets mac_requires_rxc). On such setups, e.g. the RK3566-based Home Assistant Green with an RTL8211F-VD PHY in RGMII mode, any runtime MTU change now times out and leaves the interface dead: rk_gmac-dwmac fe010000.ethernet end0: Failed to reset the dma rk_gmac-dwmac fe010000.ethernet end0: stmmac_hw_setup: DMA engine initialization failed rk_gmac-dwmac fe010000.ethernet end0: __stmmac_open: Hw setup failed rk_gmac-dwmac fe010000.ethernet end0: failed reopening the interface after MTU change In the field this is triggered by NetworkManager applying an MTU while activating the connection, breaking networking entirely. Resume the PHY before reopening the interface, like stmmac_resume() does, to ensure the receive clock is running for the DMA software reset. Fixes: db299a0c09e9 ("net: stmmac: move PHY handling out of __stmmac_open()/release()") Link: https://github.com/home-assistant/operating-system/issues/4858 Assisted-by: Claude:claude-fable-5 Tested-by: Stefan Agner Signed-off-by: Stefan Agner --- Note: phylink_prepare_resume()'s kernel-doc says it is to be called prior to phylink_resume(); here it is paired with phylink_start() (called from __stmmac_open()) instead, which phylink_resume() itself uses to restart the machinery. If preferred, I can extend the kernel-doc or introduce a more generically named helper. drivers/net/ethernet/stmicro/stmmac/stmmac_main.c | 9 +++++++++ 1 file changed, 9 insertions(+) diff --git a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c --- a/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c +++ b/drivers/net/ethernet/stmicro/stmmac/stmmac_main.c @@ -5884,6 +5884,15 @@ __stmmac_release(dev); + /* phylink_stop() in __stmmac_release() suspends the PHY. + * IEEE 802.3 allows PHYs to stop their receive clock while + * powered down, but the DMA software reset performed by + * stmmac_hw_setup() requires a running receive clock. + * Resume the PHY, as on system resume, to ensure its clocks + * are running before reopening the interface. + */ + phylink_prepare_resume(priv->phylink); + ret = __stmmac_open(dev, dma_conf); if (ret) { free_dma_desc_resources(priv, dma_conf); -- 2.49.0