MLK-19952 net: phy: tja110x: avoid PHY driver resume methods to take phydev->lock...
authorAndy Duan <fugang.duan@nxp.com>
Tue, 16 Oct 2018 09:46:59 +0000 (17:46 +0800)
committerLeonard Crestez <leonard.crestez@nxp.com>
Wed, 17 Apr 2019 23:51:34 +0000 (02:51 +0300)
commit f5e64032a799 ("net: phy: fix resume handling") and commit 6bccf8962b78
(net: phy: Restore phy_resume() locking assumption) make phy_resume() take
phydev->lock mutex, not PHY driver resume callback take that lock.
(The two commits enter kernel tree after v4.9, so v4.9 has no such issue)

To avoid dead lock, fix it by ensuring that the PHY driver resume methods
do not take the phydev->lock mutex themselves, but phy_resume() only take
that lock.

Reviewed-by: Richard Zhu <hongxing.zhu@nxp.com>
Signed-off-by: Fugang Duan <fugang.duan@nxp.com>
Signed-off-by: Arulpandiyan Vadivel <arulpandiyan_vadivel@mentor.com>
drivers/net/phy/tja110x.c

index bf680ec..58c2618 100644 (file)
@@ -946,7 +946,6 @@ static int nxp_resume(struct phy_device *phydev)
        if (verbosity > 0)
                dev_alert(&phydev->mdio.dev, "resuming PHY %x\n", phydev->mdio.addr);
 
-       mutex_lock(&phydev->lock);
        /* clear BMCR_PDOWN bit in MII_BMCR register */
        err = phy_configure_bit(phydev, MII_BMCR, BMCR_PDOWN, 0);
        if (err < 0)
@@ -974,23 +973,19 @@ static int nxp_resume(struct phy_device *phydev)
 
        /* reenable link control */
        set_link_control(phydev, 1);
-       mutex_unlock(&phydev->lock);
 
        return 0;
 
 /* error handling */
 phy_configure_error:
-       mutex_unlock(&phydev->lock);
        dev_err(&phydev->mdio.dev, "phy r/w error: resume failed\n");
        return err;
 
 phy_transition_error:
-       mutex_unlock(&phydev->lock);
        dev_err(&phydev->mdio.dev, "power mode transition failed\n");
        return err;
 
 phy_pll_error:
-       mutex_unlock(&phydev->lock);
        dev_err(&phydev->mdio.dev, "Error: PLL is unstable and not locked\n");
        return err;
 }