forked from Openwrt/openwrt
6bac820c0f
Refresh backport patches with make target/linux/refresh. Signed-off-by: Weijie Gao <hackpascal@gmail.com>
117 lines
3.7 KiB
Diff
117 lines
3.7 KiB
Diff
From 028672bd1d73cf65249a420c1de75e8d2acd2f6a Mon Sep 17 00:00:00 2001
|
|
From: Christian Marangi <ansuelsmth@gmail.com>
|
|
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 <ansuelsmth@gmail.com>
|
|
Reviewed-by: Russell King (Oracle) <rmk+kernel@armlinux.org.uk>
|
|
Signed-off-by: David S. Miller <davem@davemloft.net>
|
|
---
|
|
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
|
|
@@ -540,6 +540,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.
|
|
@@ -551,26 +573,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);
|
|
|
|
@@ -607,28 +617,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);
|
|
|