1 From b2b8b06f18281c637da274b18e330bc52351637e Mon Sep 17 00:00:00 2001
2 From: Russell King <rmk+kernel@armlinux.org.uk>
3 Date: Tue, 2 Jan 2018 10:58:27 +0000
4 Subject: [PATCH 292/454] net: mdiobus: add unlocked accessors
6 commit 34dc08e4be208539b7c4aa8154a610e1736705e8 upstream.
8 Add unlocked versions of the bus accessors, which allows access to the
9 bus with all the tracing. These accessors validate that the bus mutex
10 is held, which is a basic requirement for all mii bus accesses.
12 Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
13 Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
14 Signed-off-by: David S. Miller <davem@davemloft.net>
16 drivers/net/phy/mdio_bus.c | 65 +++++++++++++++++++++++++++++++-------
17 include/linux/mdio.h | 3 ++
18 2 files changed, 56 insertions(+), 12 deletions(-)
20 --- a/drivers/net/phy/mdio_bus.c
21 +++ b/drivers/net/phy/mdio_bus.c
22 @@ -494,6 +494,55 @@ struct phy_device *mdiobus_scan(struct m
23 EXPORT_SYMBOL(mdiobus_scan);
26 + * __mdiobus_read - Unlocked version of the mdiobus_read function
27 + * @bus: the mii_bus struct
28 + * @addr: the phy address
29 + * @regnum: register number to read
31 + * Read a MDIO bus register. Caller must hold the mdio bus lock.
33 + * NOTE: MUST NOT be called from interrupt context.
35 +int __mdiobus_read(struct mii_bus *bus, int addr, u32 regnum)
39 + WARN_ON_ONCE(!mutex_is_locked(&bus->mdio_lock));
41 + retval = bus->read(bus, addr, regnum);
43 + trace_mdio_access(bus, 1, addr, regnum, retval, retval);
47 +EXPORT_SYMBOL(__mdiobus_read);
50 + * __mdiobus_write - Unlocked version of the mdiobus_write function
51 + * @bus: the mii_bus struct
52 + * @addr: the phy address
53 + * @regnum: register number to write
54 + * @val: value to write to @regnum
56 + * Write a MDIO bus register. Caller must hold the mdio bus lock.
58 + * NOTE: MUST NOT be called from interrupt context.
60 +int __mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val)
64 + WARN_ON_ONCE(!mutex_is_locked(&bus->mdio_lock));
66 + err = bus->write(bus, addr, regnum, val);
68 + trace_mdio_access(bus, 0, addr, regnum, val, err);
72 +EXPORT_SYMBOL(__mdiobus_write);
75 * mdiobus_read_nested - Nested version of the mdiobus_read function
76 * @bus: the mii_bus struct
77 * @addr: the phy address
78 @@ -513,11 +562,9 @@ int mdiobus_read_nested(struct mii_bus *
79 BUG_ON(in_interrupt());
81 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED);
82 - retval = bus->read(bus, addr, regnum);
83 + retval = __mdiobus_read(bus, addr, regnum);
84 mutex_unlock(&bus->mdio_lock);
86 - trace_mdio_access(bus, 1, addr, regnum, retval, retval);
90 EXPORT_SYMBOL(mdiobus_read_nested);
91 @@ -539,11 +586,9 @@ int mdiobus_read(struct mii_bus *bus, in
92 BUG_ON(in_interrupt());
94 mutex_lock(&bus->mdio_lock);
95 - retval = bus->read(bus, addr, regnum);
96 + retval = __mdiobus_read(bus, addr, regnum);
97 mutex_unlock(&bus->mdio_lock);
99 - trace_mdio_access(bus, 1, addr, regnum, retval, retval);
103 EXPORT_SYMBOL(mdiobus_read);
104 @@ -569,11 +614,9 @@ int mdiobus_write_nested(struct mii_bus
105 BUG_ON(in_interrupt());
107 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED);
108 - err = bus->write(bus, addr, regnum, val);
109 + err = __mdiobus_write(bus, addr, regnum, val);
110 mutex_unlock(&bus->mdio_lock);
112 - trace_mdio_access(bus, 0, addr, regnum, val, err);
116 EXPORT_SYMBOL(mdiobus_write_nested);
117 @@ -596,11 +639,9 @@ int mdiobus_write(struct mii_bus *bus, i
118 BUG_ON(in_interrupt());
120 mutex_lock(&bus->mdio_lock);
121 - err = bus->write(bus, addr, regnum, val);
122 + err = __mdiobus_write(bus, addr, regnum, val);
123 mutex_unlock(&bus->mdio_lock);
125 - trace_mdio_access(bus, 0, addr, regnum, val, err);
129 EXPORT_SYMBOL(mdiobus_write);
130 --- a/include/linux/mdio.h
131 +++ b/include/linux/mdio.h
132 @@ -257,6 +257,9 @@ static inline u16 ethtool_adv_to_mmd_eee
136 +int __mdiobus_read(struct mii_bus *bus, int addr, u32 regnum);
137 +int __mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val);
139 int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum);
140 int mdiobus_read_nested(struct mii_bus *bus, int addr, u32 regnum);
141 int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val);