diff options
Diffstat (limited to 'target/linux/mvebu/patches-4.9/402-net-phy-make-phy_-read-write-_mmd-generic-MMD-access.patch')
-rw-r--r-- | target/linux/mvebu/patches-4.9/402-net-phy-make-phy_-read-write-_mmd-generic-MMD-access.patch | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/target/linux/mvebu/patches-4.9/402-net-phy-make-phy_-read-write-_mmd-generic-MMD-access.patch b/target/linux/mvebu/patches-4.9/402-net-phy-make-phy_-read-write-_mmd-generic-MMD-access.patch new file mode 100644 index 0000000..a37b0a7 --- /dev/null +++ b/target/linux/mvebu/patches-4.9/402-net-phy-make-phy_-read-write-_mmd-generic-MMD-access.patch @@ -0,0 +1,97 @@ +From: Russell King <rmk+kernel@armlinux.org.uk> +Date: Wed, 4 Jan 2017 19:20:21 +0000 +Subject: [PATCH] net: phy: make phy_(read|write)_mmd() generic MMD + accessors + +Make phy_(read|write)_mmd() generic 802.3 clause 45 register accessors +for both Clause 22 and Clause 45 PHYs, using either the direct register +reading for Clause 45, or the indirect method for Clause 22 PHYs. +Allow this behaviour to be overriden by PHY drivers where necessary. + +Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk> +--- + +--- a/drivers/net/phy/phy-core.c ++++ b/drivers/net/phy/phy-core.c +@@ -69,11 +69,18 @@ EXPORT_SYMBOL(phy_read_mmd_indirect); + */ + int phy_read_mmd(struct phy_device *phydev, int devad, u32 regnum) + { +- if (!phydev->is_c45) +- return -EOPNOTSUPP; ++ if (regnum > (u16)~0 || devad > 32) ++ return -EINVAL; + +- return mdiobus_read(phydev->mdio.bus, phydev->mdio.addr, +- MII_ADDR_C45 | (devad << 16) | (regnum & 0xffff)); ++ if (phydev->drv->read_mmd) ++ return phydev->drv->read_mmd(phydev, devad, regnum); ++ ++ if (phydev->is_c45) { ++ u32 addr = MII_ADDR_C45 | (devad << 16) | (regnum & 0xffff); ++ return mdiobus_read(phydev->mdio.bus, phydev->mdio.addr, addr); ++ } ++ ++ return phy_read_mmd_indirect(phydev, regnum, devad); + } + EXPORT_SYMBOL(phy_read_mmd); + +@@ -125,11 +132,21 @@ EXPORT_SYMBOL(phy_write_mmd_indirect); + */ + int phy_write_mmd(struct phy_device *phydev, int devad, u32 regnum, u16 val) + { +- if (!phydev->is_c45) +- return -EOPNOTSUPP; ++ if (regnum > (u16)~0 || devad > 32) ++ return -EINVAL; ++ ++ if (phydev->drv->read_mmd) ++ return phydev->drv->write_mmd(phydev, devad, regnum, val); ++ ++ if (phydev->is_c45) { ++ u32 addr = MII_ADDR_C45 | (devad << 16) | (regnum & 0xffff); ++ ++ return mdiobus_write(phydev->mdio.bus, phydev->mdio.addr, ++ addr, val); ++ } + +- regnum = MII_ADDR_C45 | ((devad & 0x1f) << 16) | (regnum & 0xffff); ++ phy_write_mmd_indirect(phydev, regnum, devad, val); + +- return mdiobus_write(phydev->mdio.bus, phydev->mdio.addr, regnum, val); ++ return 0; + } + EXPORT_SYMBOL(phy_write_mmd); +--- a/include/linux/phy.h ++++ b/include/linux/phy.h +@@ -570,6 +570,30 @@ struct phy_driver { + */ + void (*link_change_notify)(struct phy_device *dev); + ++ /* ++ * Phy specific driver override for reading a MMD register. ++ * This function is optional for PHY specific drivers. When ++ * not provided, the default MMD read function will be used ++ * by phy_read_mmd(), which will use either a direct read for ++ * Clause 45 PHYs or an indirect read for Clause 22 PHYs. ++ * devnum is the MMD device number within the PHY device, ++ * regnum is the register within the selected MMD device. ++ */ ++ int (*read_mmd)(struct phy_device *dev, int devnum, u16 regnum); ++ ++ /* ++ * Phy specific driver override for writing a MMD register. ++ * This function is optional for PHY specific drivers. When ++ * not provided, the default MMD write function will be used ++ * by phy_write_mmd(), which will use either a direct write for ++ * Clause 45 PHYs, or an indirect write for Clause 22 PHYs. ++ * devnum is the MMD device number within the PHY device, ++ * regnum is the register within the selected MMD device. ++ * val is the value to be written. ++ */ ++ int (*write_mmd)(struct phy_device *dev, int devnum, u16 regnum, ++ u16 val); ++ + /* A function provided by a phy specific driver to override the + * the PHY driver framework support for reading a MMD register + * from the PHY. If not supported, return -1. This function is |