Re: [PATCH net-next] net: phy: call phy_init_hw() in phy resume path

From: Florian Fainelli

Date: Fri Apr 10 2026 - 13:01:02 EST


On 4/10/26 07:51, Russell King (Oracle) wrote:
On Fri, Apr 10, 2026 at 03:29:01PM +0100, Biju wrote:
From: Ovidiu Panait <ovidiu.panait.rb@xxxxxxxxxxx>

When mac_managed_pm flag is set, mdio_bus_phy_resume() is skipped, so
phy_init_hw(), which performs soft_reset and config_init, is not called
during resume.

This is inconsistent with the non-mac_managed_pm path, where
mdio_bus_phy_resume() calls phy_init_hw() before phy_resume() on every
resume.

To align both paths, add a phy_init_hw() call at the top of
__phy_resume(), before invoking the driver's resume callback. This
guarantees the PHY undergoes soft reset and re-initialization regardless
of whether PM is managed by the MAC or the MDIO bus.

Signed-off-by: Ovidiu Panait <ovidiu.panait.rb@xxxxxxxxxxx>
Signed-off-by: Biju Das <biju.das.jz@xxxxxxxxxxxxxx>
---
drivers/net/phy/phy_device.c | 4 ++++
1 file changed, 4 insertions(+)

diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index 0edff47478c2..8255f4208d66 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c
@@ -2008,6 +2008,10 @@ int __phy_resume(struct phy_device *phydev)
if (!phydrv || !phydrv->resume)
return 0;
+ ret = phy_init_hw(phydev);
+ if (ret)
+ return ret;

Do we want to do this even when phydrv->resume is NULL?

Seems to me we would want that, but this gets into the territory of potentially creating many soft-reset of the PHYs, something that I regret having introduced years ago.


Apart from that, looks fine to me - it seems some paths call
phy_init_hw() can be called with or without phydev->lock held, and
this one will call it with the lock held which seems to be okay.


Agreed.
--
Florian