lkml.org 
[lkml]   [2020]   [Jan]   [24]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 076/639] net: phy: Fix not to call phy_resume() if PHY is not attached
    Date
    From: Yoshihiro Shimoda <yoshihiro.shimoda.uh@renesas.com>

    [ Upstream commit ef1b5bf506b1f0ee3edc98533e1f3ecb105eb46a ]

    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@renesas.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    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 43c4f358eeb8a..9c7e51443f6b6 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.20.1


    \
     
     \ /
      Last update: 2020-01-24 12:02    [W:4.131 / U:0.164 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site