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. Reviewed-by: Andrew Lunn <andrew@lunn.ch> 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>
This commit is contained in:

committed by
David S. Miller

parent
9860118b58
commit
1ee6b9bc62
@@ -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;
|
||||
|
||||
regnum = MII_ADDR_C45 | ((devad & 0x1f) << 16) | (regnum & 0xffff);
|
||||
if (phydev->drv->read_mmd)
|
||||
return phydev->drv->write_mmd(phydev, devad, regnum, val);
|
||||
|
||||
return mdiobus_write(phydev->mdio.bus, phydev->mdio.addr, 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);
|
||||
}
|
||||
|
||||
phy_write_mmd_indirect(phydev, regnum, devad, val);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(phy_write_mmd);
|
||||
|
Reference in New Issue
Block a user