diff options
author | Russell King <rmk+kernel@armlinux.org.uk> | 2017-12-12 10:45:36 +0000 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2017-12-13 15:00:10 -0500 |
commit | f5e64032a799d4f54decc7eb6aafcdffb67f9ad9 (patch) | |
tree | c3bac205223f88e42ad6c7e0f5fbde9c6ca1a553 /drivers/net/phy/at803x.c | |
parent | cd8165c3d5fb07667328434835f2968a87caee67 (diff) | |
download | blackbird-op-linux-f5e64032a799d4f54decc7eb6aafcdffb67f9ad9.tar.gz blackbird-op-linux-f5e64032a799d4f54decc7eb6aafcdffb67f9ad9.zip |
net: phy: fix resume handling
When a PHY has the BMCR_PDOWN bit set, it may decide to ignore writes
to other registers, or reset the registers to power-on defaults.
Micrel PHYs do this for their interrupt registers.
The current structure of phylib tries to enable interrupts before
resuming (and releasing) the BMCR_PDOWN bit. This fails, causing
Micrel PHYs to stop working after a suspend/resume sequence if they
are using interrupts.
Fix this by ensuring that the PHY driver resume methods do not take
the phydev->lock mutex themselves, but the callers of phy_resume()
take that lock. This then allows us to move the call to phy_resume()
before we enable interrupts in phy_start().
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/phy/at803x.c')
-rw-r--r-- | drivers/net/phy/at803x.c | 4 |
1 files changed, 0 insertions, 4 deletions
diff --git a/drivers/net/phy/at803x.c b/drivers/net/phy/at803x.c index 5f93e6add563..e911e4990b20 100644 --- a/drivers/net/phy/at803x.c +++ b/drivers/net/phy/at803x.c @@ -239,14 +239,10 @@ static int at803x_resume(struct phy_device *phydev) { int value; - mutex_lock(&phydev->lock); - value = phy_read(phydev, MII_BMCR); value &= ~(BMCR_PDOWN | BMCR_ISOLATE); phy_write(phydev, MII_BMCR, value); - mutex_unlock(&phydev->lock); - return 0; } |