Hi, > From: Sasha Levin, Sent: Thursday, December 13, 2018 1:28 PM > > From: Yoshihiro Shimoda <yoshihiro.shimoda.uh@xxxxxxxxxxx> > > [ Upstream commit ef1b5bf506b1f0ee3edc98533e1f3ecb105eb46a ] This upstream commit is also reverted on mainline as I mentioned other email thread[1] [1] https://lore.kernel.org/lkml/OSAPR01MB2290FE36AF50B2F29170383DD8A00@xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx/T/#u Best regards, Yoshihiro Shimoda > This patch fixes an issue that mdio_bus_phy_resume() doesn't call > phy_resume() if the PHY is not attached. > > Fixes: 803dd9c77ac3 ("net: phy: avoid suspending twice a PHY") > Signed-off-by: Yoshihiro Shimoda <yoshihiro.shimoda.uh@xxxxxxxxxxx> > Signed-off-by: David S. Miller <davem@xxxxxxxxxxxxx> > Signed-off-by: Sasha Levin <sashal@xxxxxxxxxx> > --- > drivers/net/phy/phy_device.c | 11 ++++++----- > 1 file changed, 6 insertions(+), 5 deletions(-) > > diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c > index 20d1be2b070b..16a94f5b8073 100644 > --- a/drivers/net/phy/phy_device.c > +++ b/drivers/net/phy/phy_device.c > @@ -76,7 +76,7 @@ static LIST_HEAD(phy_fixup_list); > static DEFINE_MUTEX(phy_fixup_lock); > > #ifdef CONFIG_PM > -static bool mdio_bus_phy_may_suspend(struct phy_device *phydev) > +static bool mdio_bus_phy_may_suspend(struct phy_device *phydev, bool suspend) > { > struct device_driver *drv = phydev->mdio.dev.driver; > struct phy_driver *phydrv = to_phy_driver(drv); > @@ -88,10 +88,11 @@ static bool mdio_bus_phy_may_suspend(struct phy_device *phydev) > /* PHY not attached? May suspend if the PHY has not already been > * suspended as part of a prior call to phy_disconnect() -> > * phy_detach() -> phy_suspend() because the parent netdev might be the > - * MDIO bus driver and clock gated at this point. > + * MDIO bus driver and clock gated at this point. Also may resume if > + * PHY is not attached. > */ > if (!netdev) > - return !phydev->suspended; > + return suspend ? !phydev->suspended : phydev->suspended; > > if (netdev->wol_enabled) > return false; > @@ -126,7 +127,7 @@ static int mdio_bus_phy_suspend(struct device *dev) > if (phydev->attached_dev && phydev->adjust_link) > phy_stop_machine(phydev); > > - if (!mdio_bus_phy_may_suspend(phydev)) > + if (!mdio_bus_phy_may_suspend(phydev, true)) > return 0; > > return phy_suspend(phydev); > @@ -137,7 +138,7 @@ static int mdio_bus_phy_resume(struct device *dev) > struct phy_device *phydev = to_phy_device(dev); > int ret; > > - if (!mdio_bus_phy_may_suspend(phydev)) > + if (!mdio_bus_phy_may_suspend(phydev, false)) > goto no_resume; > > ret = phy_resume(phydev); > -- > 2.19.1