forked from Openwrt/openwrt
e430815f5a
Backport PHY package MMD patch merged upstream that add support for writing MMD regs for the PHY package and support for writing to PHY package at an offset. All affected patches automatically refreshed. Signed-off-by: Christian Marangi <ansuelsmth@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
|
|
@@ -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);
|
|
|