123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116 |
- From 028672bd1d73cf65249a420c1de75e8d2acd2f6a Mon Sep 17 00:00:00 2001
- From: Christian Marangi <[email protected]>
- Date: Fri, 15 Dec 2023 14:15:33 +0100
- Subject: [PATCH 3/4] net: phy: restructure __phy_write/read_mmd to helper and
- phydev user
- Restructure phy_write_mmd and phy_read_mmd to implement generic helper
- for direct mdiobus access for mmd and use these helper for phydev user.
- This is needed in preparation of PHY package API that requires generic
- access to the mdiobus and are deatched from phydev struct but instead
- access them based on PHY package base_addr and offsets.
- Signed-off-by: Christian Marangi <[email protected]>
- Reviewed-by: Russell King (Oracle) <[email protected]>
- Signed-off-by: David S. Miller <[email protected]>
- ---
- drivers/net/phy/phy-core.c | 64 ++++++++++++++++++--------------------
- 1 file changed, 30 insertions(+), 34 deletions(-)
- --- a/drivers/net/phy/phy-core.c
- +++ b/drivers/net/phy/phy-core.c
- @@ -528,6 +528,28 @@ static void mmd_phy_indirect(struct mii_
- devad | MII_MMD_CTRL_NOINCR);
- }
-
- +static int mmd_phy_read(struct mii_bus *bus, int phy_addr, bool is_c45,
- + int devad, u32 regnum)
- +{
- + if (is_c45)
- + return __mdiobus_c45_read(bus, phy_addr, devad, regnum);
- +
- + mmd_phy_indirect(bus, phy_addr, devad, regnum);
- + /* Read the content of the MMD's selected register */
- + return __mdiobus_read(bus, phy_addr, MII_MMD_DATA);
- +}
- +
- +static int mmd_phy_write(struct mii_bus *bus, int phy_addr, bool is_c45,
- + int devad, u32 regnum, u16 val)
- +{
- + if (is_c45)
- + return __mdiobus_c45_write(bus, phy_addr, devad, regnum, val);
- +
- + mmd_phy_indirect(bus, phy_addr, devad, regnum);
- + /* Write the data into MMD's selected register */
- + return __mdiobus_write(bus, phy_addr, MII_MMD_DATA, val);
- +}
- +
- /**
- * __phy_read_mmd - Convenience function for reading a register
- * from an MMD on a given PHY.
- @@ -539,26 +561,14 @@ static void mmd_phy_indirect(struct mii_
- */
- int __phy_read_mmd(struct phy_device *phydev, int devad, u32 regnum)
- {
- - int val;
- -
- if (regnum > (u16)~0 || devad > 32)
- return -EINVAL;
-
- - if (phydev->drv && phydev->drv->read_mmd) {
- - val = phydev->drv->read_mmd(phydev, devad, regnum);
- - } else if (phydev->is_c45) {
- - val = __mdiobus_c45_read(phydev->mdio.bus, phydev->mdio.addr,
- - devad, regnum);
- - } else {
- - struct mii_bus *bus = phydev->mdio.bus;
- - int phy_addr = phydev->mdio.addr;
- -
- - mmd_phy_indirect(bus, phy_addr, devad, regnum);
- -
- - /* Read the content of the MMD's selected register */
- - val = __mdiobus_read(bus, phy_addr, MII_MMD_DATA);
- - }
- - return val;
- + if (phydev->drv && phydev->drv->read_mmd)
- + return phydev->drv->read_mmd(phydev, devad, regnum);
- +
- + return mmd_phy_read(phydev->mdio.bus, phydev->mdio.addr,
- + phydev->is_c45, devad, regnum);
- }
- EXPORT_SYMBOL(__phy_read_mmd);
-
- @@ -595,28 +605,14 @@ EXPORT_SYMBOL(phy_read_mmd);
- */
- int __phy_write_mmd(struct phy_device *phydev, int devad, u32 regnum, u16 val)
- {
- - int ret;
- -
- if (regnum > (u16)~0 || devad > 32)
- return -EINVAL;
-
- - if (phydev->drv && phydev->drv->write_mmd) {
- - ret = phydev->drv->write_mmd(phydev, devad, regnum, val);
- - } else if (phydev->is_c45) {
- - ret = __mdiobus_c45_write(phydev->mdio.bus, phydev->mdio.addr,
- - devad, regnum, val);
- - } else {
- - struct mii_bus *bus = phydev->mdio.bus;
- - int phy_addr = phydev->mdio.addr;
- + if (phydev->drv && phydev->drv->write_mmd)
- + return phydev->drv->write_mmd(phydev, devad, regnum, val);
-
- - mmd_phy_indirect(bus, phy_addr, devad, regnum);
- -
- - /* Write the data into MMD's selected register */
- - __mdiobus_write(bus, phy_addr, MII_MMD_DATA, val);
- -
- - ret = 0;
- - }
- - return ret;
- + return mmd_phy_write(phydev->mdio.bus, phydev->mdio.addr,
- + phydev->is_c45, devad, regnum, val);
- }
- EXPORT_SYMBOL(__phy_write_mmd);
-
|