net: mdiobus: add unlocked accessors
authorRussell King <rmk+kernel@armlinux.org.uk>
Tue, 2 Jan 2018 10:58:27 +0000 (10:58 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 3 Jan 2018 16:00:22 +0000 (11:00 -0500)
Add unlocked versions of the bus accessors, which allows access to the
bus with all the tracing. These accessors validate that the bus mutex
is held, which is a basic requirement for all mii bus accesses.

Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/phy/mdio_bus.c
include/linux/mdio.h

index a0f34c3..e2419c7 100644 (file)
@@ -515,6 +515,55 @@ struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr)
 EXPORT_SYMBOL(mdiobus_scan);
 
 /**
+ * __mdiobus_read - Unlocked version of the mdiobus_read function
+ * @bus: the mii_bus struct
+ * @addr: the phy address
+ * @regnum: register number to read
+ *
+ * Read a MDIO bus register. Caller must hold the mdio bus lock.
+ *
+ * NOTE: MUST NOT be called from interrupt context.
+ */
+int __mdiobus_read(struct mii_bus *bus, int addr, u32 regnum)
+{
+       int retval;
+
+       WARN_ON_ONCE(!mutex_is_locked(&bus->mdio_lock));
+
+       retval = bus->read(bus, addr, regnum);
+
+       trace_mdio_access(bus, 1, addr, regnum, retval, retval);
+
+       return retval;
+}
+EXPORT_SYMBOL(__mdiobus_read);
+
+/**
+ * __mdiobus_write - Unlocked version of the mdiobus_write function
+ * @bus: the mii_bus struct
+ * @addr: the phy address
+ * @regnum: register number to write
+ * @val: value to write to @regnum
+ *
+ * Write a MDIO bus register. Caller must hold the mdio bus lock.
+ *
+ * NOTE: MUST NOT be called from interrupt context.
+ */
+int __mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val)
+{
+       int err;
+
+       WARN_ON_ONCE(!mutex_is_locked(&bus->mdio_lock));
+
+       err = bus->write(bus, addr, regnum, val);
+
+       trace_mdio_access(bus, 0, addr, regnum, val, err);
+
+       return err;
+}
+EXPORT_SYMBOL(__mdiobus_write);
+
+/**
  * mdiobus_read_nested - Nested version of the mdiobus_read function
  * @bus: the mii_bus struct
  * @addr: the phy address
@@ -534,11 +583,9 @@ int mdiobus_read_nested(struct mii_bus *bus, int addr, u32 regnum)
        BUG_ON(in_interrupt());
 
        mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED);
-       retval = bus->read(bus, addr, regnum);
+       retval = __mdiobus_read(bus, addr, regnum);
        mutex_unlock(&bus->mdio_lock);
 
-       trace_mdio_access(bus, 1, addr, regnum, retval, retval);
-
        return retval;
 }
 EXPORT_SYMBOL(mdiobus_read_nested);
@@ -560,11 +607,9 @@ int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum)
        BUG_ON(in_interrupt());
 
        mutex_lock(&bus->mdio_lock);
-       retval = bus->read(bus, addr, regnum);
+       retval = __mdiobus_read(bus, addr, regnum);
        mutex_unlock(&bus->mdio_lock);
 
-       trace_mdio_access(bus, 1, addr, regnum, retval, retval);
-
        return retval;
 }
 EXPORT_SYMBOL(mdiobus_read);
@@ -590,11 +635,9 @@ int mdiobus_write_nested(struct mii_bus *bus, int addr, u32 regnum, u16 val)
        BUG_ON(in_interrupt());
 
        mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED);
-       err = bus->write(bus, addr, regnum, val);
+       err = __mdiobus_write(bus, addr, regnum, val);
        mutex_unlock(&bus->mdio_lock);
 
-       trace_mdio_access(bus, 0, addr, regnum, val, err);
-
        return err;
 }
 EXPORT_SYMBOL(mdiobus_write_nested);
@@ -617,11 +660,9 @@ int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val)
        BUG_ON(in_interrupt());
 
        mutex_lock(&bus->mdio_lock);
-       err = bus->write(bus, addr, regnum, val);
+       err = __mdiobus_write(bus, addr, regnum, val);
        mutex_unlock(&bus->mdio_lock);
 
-       trace_mdio_access(bus, 0, addr, regnum, val, err);
-
        return err;
 }
 EXPORT_SYMBOL(mdiobus_write);
index 268aad4..2cfffe5 100644 (file)
@@ -262,6 +262,9 @@ static inline u16 ethtool_adv_to_mmd_eee_adv_t(u32 adv)
        return reg;
 }
 
+int __mdiobus_read(struct mii_bus *bus, int addr, u32 regnum);
+int __mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val);
+
 int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum);
 int mdiobus_read_nested(struct mii_bus *bus, int addr, u32 regnum);
 int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val);