From: Biju Das lan937x_dsp_workaround() performs raw MDIO bus accesses and must therefore hold mdio_lock rather than phydev->lock. Using phydev->lock here is incorrect as it does not serialise access to the MDIO bus. Replace phydev->lock with bus->mdio_lock, and switch the phy_read()/ phy_write() calls to their unlocked __phy_read()/__phy_write() variants since mdio_lock is now held explicitly. Signed-off-by: Biju Das --- v3: * New patch. --- drivers/net/phy/microchip_t1.c | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/drivers/net/phy/microchip_t1.c b/drivers/net/phy/microchip_t1.c index 62b36a318100..afb4e8908b78 100644 --- a/drivers/net/phy/microchip_t1.c +++ b/drivers/net/phy/microchip_t1.c @@ -337,9 +337,9 @@ static int lan937x_dsp_workaround(struct phy_device *phydev, u16 ereg, u8 bank) int rc = 0; u16 val; - mutex_lock(&phydev->lock); + mutex_lock(&phydev->mdio.bus->mdio_lock); /* Read previous selected bank */ - rc = phy_read(phydev, LAN87XX_EXT_REG_CTL); + rc = __phy_read(phydev, LAN87XX_EXT_REG_CTL); if (rc < 0) goto out_unlock; @@ -353,11 +353,11 @@ static int lan937x_dsp_workaround(struct phy_device *phydev, u16 ereg, u8 bank) val |= LAN87XX_EXT_REG_CTL_RD_CTL; /* access twice for DSP bank change,dummy access */ - rc = phy_write(phydev, LAN87XX_EXT_REG_CTL, val); + rc = __phy_write(phydev, LAN87XX_EXT_REG_CTL, val); } out_unlock: - mutex_unlock(&phydev->lock); + mutex_unlock(&phydev->mdio.bus->mdio_lock); return rc; } -- 2.43.0