}
 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
        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);
        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);
        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);
        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);