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.faine...@gmail.com>
Signed-off-by: Russell King <rmk+ker...@armlinux.org.uk>
---
 drivers/net/phy/mdio_bus.c | 65 +++++++++++++++++++++++++++++++++++++---------
 include/linux/mdio.h       |  3 +++
 2 files changed, 56 insertions(+), 12 deletions(-)

diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c
index 54d00a1d2bef..75be8be0d169 100644
--- a/drivers/net/phy/mdio_bus.c
+++ b/drivers/net/phy/mdio_bus.c
@@ -494,6 +494,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
@@ -513,11 +562,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);
@@ -539,11 +586,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);
@@ -569,11 +614,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);
@@ -596,11 +639,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);
diff --git a/include/linux/mdio.h b/include/linux/mdio.h
index ca08ab16ecdc..34796e29c90c 100644
--- a/include/linux/mdio.h
+++ b/include/linux/mdio.h
@@ -257,6 +257,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);
-- 
2.7.4

Reply via email to