aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorRussell King <rmk+kernel@armlinux.org.uk>2018-01-02 05:58:27 -0500
committerDavid S. Miller <davem@davemloft.net>2018-01-03 11:00:22 -0500
commit34dc08e4be208539b7c4aa8154a610e1736705e8 (patch)
treeceb0598c56a9cfd22404214bc48f42e8cbb01ad7
parentbe6e36d916b1f7e6b0aec42d49cb5d5ea9590dff (diff)
net: mdiobus: add unlocked accessors
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>
-rw-r--r--drivers/net/phy/mdio_bus.c65
-rw-r--r--include/linux/mdio.h3
2 files changed, 56 insertions, 12 deletions
diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c
index a0f34c385cad..e2419c792a44 100644
--- a/drivers/net/phy/mdio_bus.c
+++ b/drivers/net/phy/mdio_bus.c
@@ -515,6 +515,55 @@ struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr)
515EXPORT_SYMBOL(mdiobus_scan); 515EXPORT_SYMBOL(mdiobus_scan);
516 516
517/** 517/**
518 * __mdiobus_read - Unlocked version of the mdiobus_read function
519 * @bus: the mii_bus struct
520 * @addr: the phy address
521 * @regnum: register number to read
522 *
523 * Read a MDIO bus register. Caller must hold the mdio bus lock.
524 *
525 * NOTE: MUST NOT be called from interrupt context.
526 */
527int __mdiobus_read(struct mii_bus *bus, int addr, u32 regnum)
528{
529 int retval;
530
531 WARN_ON_ONCE(!mutex_is_locked(&bus->mdio_lock));
532
533 retval = bus->read(bus, addr, regnum);
534
535 trace_mdio_access(bus, 1, addr, regnum, retval, retval);
536
537 return retval;
538}
539EXPORT_SYMBOL(__mdiobus_read);
540
541/**
542 * __mdiobus_write - Unlocked version of the mdiobus_write function
543 * @bus: the mii_bus struct
544 * @addr: the phy address
545 * @regnum: register number to write
546 * @val: value to write to @regnum
547 *
548 * Write a MDIO bus register. Caller must hold the mdio bus lock.
549 *
550 * NOTE: MUST NOT be called from interrupt context.
551 */
552int __mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val)
553{
554 int err;
555
556 WARN_ON_ONCE(!mutex_is_locked(&bus->mdio_lock));
557
558 err = bus->write(bus, addr, regnum, val);
559
560 trace_mdio_access(bus, 0, addr, regnum, val, err);
561
562 return err;
563}
564EXPORT_SYMBOL(__mdiobus_write);
565
566/**
518 * mdiobus_read_nested - Nested version of the mdiobus_read function 567 * mdiobus_read_nested - Nested version of the mdiobus_read function
519 * @bus: the mii_bus struct 568 * @bus: the mii_bus struct
520 * @addr: the phy address 569 * @addr: the phy address
@@ -534,11 +583,9 @@ int mdiobus_read_nested(struct mii_bus *bus, int addr, u32 regnum)
534 BUG_ON(in_interrupt()); 583 BUG_ON(in_interrupt());
535 584
536 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); 585 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED);
537 retval = bus->read(bus, addr, regnum); 586 retval = __mdiobus_read(bus, addr, regnum);
538 mutex_unlock(&bus->mdio_lock); 587 mutex_unlock(&bus->mdio_lock);
539 588
540 trace_mdio_access(bus, 1, addr, regnum, retval, retval);
541
542 return retval; 589 return retval;
543} 590}
544EXPORT_SYMBOL(mdiobus_read_nested); 591EXPORT_SYMBOL(mdiobus_read_nested);
@@ -560,11 +607,9 @@ int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum)
560 BUG_ON(in_interrupt()); 607 BUG_ON(in_interrupt());
561 608
562 mutex_lock(&bus->mdio_lock); 609 mutex_lock(&bus->mdio_lock);
563 retval = bus->read(bus, addr, regnum); 610 retval = __mdiobus_read(bus, addr, regnum);
564 mutex_unlock(&bus->mdio_lock); 611 mutex_unlock(&bus->mdio_lock);
565 612
566 trace_mdio_access(bus, 1, addr, regnum, retval, retval);
567
568 return retval; 613 return retval;
569} 614}
570EXPORT_SYMBOL(mdiobus_read); 615EXPORT_SYMBOL(mdiobus_read);
@@ -590,11 +635,9 @@ int mdiobus_write_nested(struct mii_bus *bus, int addr, u32 regnum, u16 val)
590 BUG_ON(in_interrupt()); 635 BUG_ON(in_interrupt());
591 636
592 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED); 637 mutex_lock_nested(&bus->mdio_lock, MDIO_MUTEX_NESTED);
593 err = bus->write(bus, addr, regnum, val); 638 err = __mdiobus_write(bus, addr, regnum, val);
594 mutex_unlock(&bus->mdio_lock); 639 mutex_unlock(&bus->mdio_lock);
595 640
596 trace_mdio_access(bus, 0, addr, regnum, val, err);
597
598 return err; 641 return err;
599} 642}
600EXPORT_SYMBOL(mdiobus_write_nested); 643EXPORT_SYMBOL(mdiobus_write_nested);
@@ -617,11 +660,9 @@ int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val)
617 BUG_ON(in_interrupt()); 660 BUG_ON(in_interrupt());
618 661
619 mutex_lock(&bus->mdio_lock); 662 mutex_lock(&bus->mdio_lock);
620 err = bus->write(bus, addr, regnum, val); 663 err = __mdiobus_write(bus, addr, regnum, val);
621 mutex_unlock(&bus->mdio_lock); 664 mutex_unlock(&bus->mdio_lock);
622 665
623 trace_mdio_access(bus, 0, addr, regnum, val, err);
624
625 return err; 666 return err;
626} 667}
627EXPORT_SYMBOL(mdiobus_write); 668EXPORT_SYMBOL(mdiobus_write);
diff --git a/include/linux/mdio.h b/include/linux/mdio.h
index 268aad47ecd3..2cfffe586885 100644
--- a/include/linux/mdio.h
+++ b/include/linux/mdio.h
@@ -262,6 +262,9 @@ static inline u16 ethtool_adv_to_mmd_eee_adv_t(u32 adv)
262 return reg; 262 return reg;
263} 263}
264 264
265int __mdiobus_read(struct mii_bus *bus, int addr, u32 regnum);
266int __mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val);
267
265int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum); 268int mdiobus_read(struct mii_bus *bus, int addr, u32 regnum);
266int mdiobus_read_nested(struct mii_bus *bus, int addr, u32 regnum); 269int mdiobus_read_nested(struct mii_bus *bus, int addr, u32 regnum);
267int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val); 270int mdiobus_write(struct mii_bus *bus, int addr, u32 regnum, u16 val);