From: Biju Das 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, move the phy_init_hw() call into phy_resume() itself, before invoking the driver's resume callback. This ensures PHY soft reset and re-initialization happen unconditionally, regardless of whether PM is managed by the MAC or the MDIO bus. As a result, drop the redundant phy_init_hw() call in mdio_bus_phy_resume(). Additionally, in phy_attach_direct(), replace the separate phy_init_hw() and phy_resume() calls with a single phy_resume() call, since phy_init_hw() is now handled inside phy_resume(). Signed-off-by: Ovidiu Panait Signed-off-by: Biju Das --- v2->v3: * No change, v1->v2: * Updated commit description. * phy_init_hw() is moved from __phy_resume() -> phy_resume() to make it lock-free. * Dropped redundant phy_init_hw() call from mdio_bus_phy_resume() and phy_attach_direct(). --- drivers/net/phy/phy_device.c | 14 ++++++-------- 1 file changed, 6 insertions(+), 8 deletions(-) diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index 0edff47478c2..4a2b19d39373 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -396,10 +396,6 @@ static __maybe_unused int mdio_bus_phy_resume(struct device *dev) WARN_ON(phydev->state != PHY_HALTED && phydev->state != PHY_READY && phydev->state != PHY_UP); - ret = phy_init_hw(phydev); - if (ret < 0) - return ret; - ret = phy_resume(phydev); if (ret < 0) return ret; @@ -1857,16 +1853,14 @@ int phy_attach_direct(struct net_device *dev, struct phy_device *phydev, if (dev) netif_carrier_off(phydev->attached_dev); - /* Do initial configuration here, now that + /* Do initial configuration inside phy_init_hw(), now that * we have certain key parameters * (dev_flags and interface) */ - err = phy_init_hw(phydev); + err = phy_resume(phydev); if (err) goto error; - phy_resume(phydev); - /** * If the external phy used by current mac interface is managed by * another mac interface, so we should create a device link between @@ -2020,6 +2014,10 @@ int phy_resume(struct phy_device *phydev) { int ret; + ret = phy_init_hw(phydev); + if (ret) + return ret; + mutex_lock(&phydev->lock); ret = __phy_resume(phydev); mutex_unlock(&phydev->lock); -- 2.43.0