ramips: mt7530 swconfig: fix race condition in register access
[openwrt/staging/pepe2k.git] / target / linux / ramips / files-4.14 / drivers / net / ethernet / mediatek / mt7530.c
index 5216cb5c6618d018c4075791037cf91bb0398795..7fb76fca81c58ce0c2169b942fef9d1ffd415d45 100644 (file)
@@ -310,9 +310,11 @@ mt7530_r32(struct mt7530_priv *priv, u32 reg)
        if (priv->bus) {
                u16 high, low;
 
-               mdiobus_write(priv->bus, 0x1f, 0x1f, (reg >> 6) & 0x3ff);
-               low = mdiobus_read(priv->bus, 0x1f, (reg >> 2) & 0xf);
-               high = mdiobus_read(priv->bus, 0x1f, 0x10);
+               mutex_lock(&priv->bus->mdio_lock);
+               __mdiobus_write(priv->bus, 0x1f, 0x1f, (reg >> 6) & 0x3ff);
+               low = __mdiobus_read(priv->bus, 0x1f, (reg >> 2) & 0xf);
+               high = __mdiobus_read(priv->bus, 0x1f, 0x10);
+               mutex_unlock(&priv->bus->mdio_lock);
 
                return (high << 16) | (low & 0xffff);
        }
@@ -327,9 +329,11 @@ static void
 mt7530_w32(struct mt7530_priv *priv, u32 reg, u32 val)
 {
        if (priv->bus) {
-               mdiobus_write(priv->bus, 0x1f, 0x1f, (reg >> 6) & 0x3ff);
-               mdiobus_write(priv->bus, 0x1f, (reg >> 2) & 0xf,  val & 0xffff);
-               mdiobus_write(priv->bus, 0x1f, 0x10, val >> 16);
+               mutex_lock(&priv->bus->mdio_lock);
+               __mdiobus_write(priv->bus, 0x1f, 0x1f, (reg >> 6) & 0x3ff);
+               __mdiobus_write(priv->bus, 0x1f, (reg >> 2) & 0xf,  val & 0xffff);
+               __mdiobus_write(priv->bus, 0x1f, 0x10, val >> 16);
+               mutex_unlock(&priv->bus->mdio_lock);
                return;
        }