net: mdio: C22 is now optional, EOPNOTSUPP if not provided
authorAndrew Lunn <andrew@lunn.ch>
Mon, 9 Jan 2023 15:30:44 +0000 (16:30 +0100)
committerJakub Kicinski <kuba@kernel.org>
Tue, 10 Jan 2023 23:53:36 +0000 (15:53 -0800)
When performing a C22 operation, check that the bus driver actually
provides the methods, and return -EOPNOTSUPP if not. C45 only busses
do exist, and in future their C22 methods will be NULL.

Signed-off-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: Michael Walle <michael@walle.cc>
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/phy/mdio_bus.c

index c992a9f..f71ba6a 100644 (file)
@@ -766,7 +766,10 @@ int __mdiobus_read(struct mii_bus *bus, int addr, u32 regnum)
 
        lockdep_assert_held_once(&bus->mdio_lock);
 
-       retval = bus->read(bus, addr, regnum);
+       if (bus->read)
+               retval = bus->read(bus, addr, regnum);
+       else
+               retval = -EOPNOTSUPP;
 
        trace_mdio_access(bus, 1, addr, regnum, retval, retval);
        mdiobus_stats_acct(&bus->stats[addr], true, retval);
@@ -792,7 +795,10 @@ int __mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val)
 
        lockdep_assert_held_once(&bus->mdio_lock);
 
-       err = bus->write(bus, addr, regnum, val);
+       if (bus->write)
+               err = bus->write(bus, addr, regnum, val);
+       else
+               err = -EOPNOTSUPP;
 
        trace_mdio_access(bus, 0, addr, regnum, val, err);
        mdiobus_stats_acct(&bus->stats[addr], false, err);