Linux kernel mirror (for testing) git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel os linux

net: mdiobus: add clause 45 mdiobus accessors

There is a recurring pattern throughout some of the PHY code converting
a devad and regnum to our packed clause 45 representation. Rather than
having this scattered around the code, let's put a common translation
function in mdio.h, and provide some register accessors.

Convert the phylib core, phylink, bcm87xx and cortina to use these.

Signed-off-by: Russell King <rmk+kernel@armlinux.org.uk>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Reviewed-by: Florian Fainelli <f.fainelli@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>

authored by

Russell King and committed by
David S. Miller
90ce665c 8928e19a

+52 -36
+1 -1
drivers/net/phy/bcm87xx.c
··· 55 55 u16 mask = be32_to_cpup(paddr++); 56 56 u16 val_bits = be32_to_cpup(paddr++); 57 57 int val; 58 - u32 regnum = MII_ADDR_C45 | (devid << 16) | reg; 58 + u32 regnum = mdiobus_c45_addr(devid, reg); 59 59 val = 0; 60 60 if (mask) { 61 61 val = phy_read(phydev, regnum);
+1 -2
drivers/net/phy/cortina.c
··· 17 17 18 18 static int cortina_read_reg(struct phy_device *phydev, u16 regnum) 19 19 { 20 - return mdiobus_read(phydev->mdio.bus, phydev->mdio.addr, 21 - MII_ADDR_C45 | regnum); 20 + return mdiobus_c45_read(phydev->mdio.bus, phydev->mdio.addr, 0, regnum); 22 21 } 23 22 24 23 static int cortina_read_status(struct phy_device *phydev)
+4 -7
drivers/net/phy/phy-core.c
··· 428 428 if (phydev->drv && phydev->drv->read_mmd) { 429 429 val = phydev->drv->read_mmd(phydev, devad, regnum); 430 430 } else if (phydev->is_c45) { 431 - u32 addr = MII_ADDR_C45 | (devad << 16) | (regnum & 0xffff); 432 - 433 - val = __mdiobus_read(phydev->mdio.bus, phydev->mdio.addr, addr); 431 + val = __mdiobus_c45_read(phydev->mdio.bus, phydev->mdio.addr, 432 + devad, regnum); 434 433 } else { 435 434 struct mii_bus *bus = phydev->mdio.bus; 436 435 int phy_addr = phydev->mdio.addr; ··· 484 485 if (phydev->drv && phydev->drv->write_mmd) { 485 486 ret = phydev->drv->write_mmd(phydev, devad, regnum, val); 486 487 } else if (phydev->is_c45) { 487 - u32 addr = MII_ADDR_C45 | (devad << 16) | (regnum & 0xffff); 488 - 489 - ret = __mdiobus_write(phydev->mdio.bus, phydev->mdio.addr, 490 - addr, val); 488 + ret = __mdiobus_c45_write(phydev->mdio.bus, phydev->mdio.addr, 489 + devad, regnum, val); 491 490 } else { 492 491 struct mii_bus *bus = phydev->mdio.bus; 493 492 int phy_addr = phydev->mdio.addr;
+2 -2
drivers/net/phy/phy.c
··· 361 361 if (mdio_phy_id_is_c45(mii_data->phy_id)) { 362 362 prtad = mdio_phy_id_prtad(mii_data->phy_id); 363 363 devad = mdio_phy_id_devad(mii_data->phy_id); 364 - devad = MII_ADDR_C45 | devad << 16 | mii_data->reg_num; 364 + devad = mdiobus_c45_addr(devad, mii_data->reg_num); 365 365 } else { 366 366 prtad = mii_data->phy_id; 367 367 devad = mii_data->reg_num; ··· 374 374 if (mdio_phy_id_is_c45(mii_data->phy_id)) { 375 375 prtad = mdio_phy_id_prtad(mii_data->phy_id); 376 376 devad = mdio_phy_id_devad(mii_data->phy_id); 377 - devad = MII_ADDR_C45 | devad << 16 | mii_data->reg_num; 377 + devad = mdiobus_c45_addr(devad, mii_data->reg_num); 378 378 } else { 379 379 prtad = mii_data->phy_id; 380 380 devad = mii_data->reg_num;
+8 -12
drivers/net/phy/phy_device.c
··· 675 675 static int get_phy_c45_devs_in_pkg(struct mii_bus *bus, int addr, int dev_addr, 676 676 u32 *devices_in_package) 677 677 { 678 - int phy_reg, reg_addr; 678 + int phy_reg; 679 679 680 - reg_addr = MII_ADDR_C45 | dev_addr << 16 | MDIO_DEVS2; 681 - phy_reg = mdiobus_read(bus, addr, reg_addr); 680 + phy_reg = mdiobus_c45_read(bus, addr, dev_addr, MDIO_DEVS2); 682 681 if (phy_reg < 0) 683 682 return -EIO; 684 683 *devices_in_package = phy_reg << 16; 685 684 686 - reg_addr = MII_ADDR_C45 | dev_addr << 16 | MDIO_DEVS1; 687 - phy_reg = mdiobus_read(bus, addr, reg_addr); 685 + phy_reg = mdiobus_c45_read(bus, addr, dev_addr, MDIO_DEVS1); 688 686 if (phy_reg < 0) 689 687 return -EIO; 690 688 *devices_in_package |= phy_reg; ··· 707 709 * 708 710 */ 709 711 static int get_phy_c45_ids(struct mii_bus *bus, int addr, u32 *phy_id, 710 - struct phy_c45_device_ids *c45_ids) { 711 - int phy_reg; 712 - int i, reg_addr; 712 + struct phy_c45_device_ids *c45_ids) 713 + { 713 714 const int num_ids = ARRAY_SIZE(c45_ids->device_ids); 714 715 u32 *devs = &c45_ids->devices_in_package; 716 + int i, phy_reg; 715 717 716 718 /* Find first non-zero Devices In package. Device zero is reserved 717 719 * for 802.3 c45 complied PHYs, so don't probe it at first. ··· 745 747 if (!(c45_ids->devices_in_package & (1 << i))) 746 748 continue; 747 749 748 - reg_addr = MII_ADDR_C45 | i << 16 | MII_PHYSID1; 749 - phy_reg = mdiobus_read(bus, addr, reg_addr); 750 + phy_reg = mdiobus_c45_read(bus, addr, i, MII_PHYSID1); 750 751 if (phy_reg < 0) 751 752 return -EIO; 752 753 c45_ids->device_ids[i] = phy_reg << 16; 753 754 754 - reg_addr = MII_ADDR_C45 | i << 16 | MII_PHYSID2; 755 - phy_reg = mdiobus_read(bus, addr, reg_addr); 755 + phy_reg = mdiobus_c45_read(bus, addr, i, MII_PHYSID2); 756 756 if (phy_reg < 0) 757 757 return -EIO; 758 758 c45_ids->device_ids[i] |= phy_reg;
+5 -6
drivers/net/phy/phylink.c
··· 1631 1631 if (mdio_phy_id_is_c45(phy_id)) { 1632 1632 prtad = mdio_phy_id_prtad(phy_id); 1633 1633 devad = mdio_phy_id_devad(phy_id); 1634 - devad = MII_ADDR_C45 | devad << 16 | reg; 1634 + devad = mdiobus_c45_addr(devad, reg); 1635 1635 } else if (phydev->is_c45) { 1636 1636 switch (reg) { 1637 1637 case MII_BMCR: ··· 1654 1654 return -EINVAL; 1655 1655 } 1656 1656 prtad = phy_id; 1657 - devad = MII_ADDR_C45 | devad << 16 | reg; 1657 + devad = mdiobus_c45_addr(devad, reg); 1658 1658 } else { 1659 1659 prtad = phy_id; 1660 1660 devad = reg; ··· 1671 1671 if (mdio_phy_id_is_c45(phy_id)) { 1672 1672 prtad = mdio_phy_id_prtad(phy_id); 1673 1673 devad = mdio_phy_id_devad(phy_id); 1674 - devad = MII_ADDR_C45 | devad << 16 | reg; 1674 + devad = mdiobus_c45_addr(devad, reg); 1675 1675 } else if (phydev->is_c45) { 1676 1676 switch (reg) { 1677 1677 case MII_BMCR: ··· 1694 1694 return -EINVAL; 1695 1695 } 1696 1696 prtad = phy_id; 1697 - devad = MII_ADDR_C45 | devad << 16 | reg; 1697 + devad = mdiobus_c45_addr(devad, reg); 1698 1698 } else { 1699 1699 prtad = phy_id; 1700 1700 devad = reg; ··· 2292 2292 } 2293 2293 EXPORT_SYMBOL_GPL(phylink_mii_c22_pcs_an_restart); 2294 2294 2295 - #define C45_ADDR(d,a) (MII_ADDR_C45 | (d) << 16 | (a)) 2296 2295 void phylink_mii_c45_pcs_get_state(struct mdio_device *pcs, 2297 2296 struct phylink_link_state *state) 2298 2297 { ··· 2299 2300 int addr = pcs->addr; 2300 2301 int stat; 2301 2302 2302 - stat = mdiobus_read(bus, addr, C45_ADDR(MDIO_MMD_PCS, MDIO_STAT1)); 2303 + stat = mdiobus_c45_read(bus, addr, MDIO_MMD_PCS, MDIO_STAT1); 2303 2304 if (stat < 0) { 2304 2305 state->link = false; 2305 2306 return;
+31
include/linux/mdio.h
··· 9 9 #include <uapi/linux/mdio.h> 10 10 #include <linux/mod_devicetable.h> 11 11 12 + /* Or MII_ADDR_C45 into regnum for read/write on mii_bus to enable the 21 bit 13 + * IEEE 802.3ae clause 45 addressing mode used by 10GIGE phy chips. 14 + */ 15 + #define MII_ADDR_C45 (1<<30) 16 + #define MII_DEVADDR_C45_SHIFT 16 17 + #define MII_REGADDR_C45_MASK GENMASK(15, 0) 18 + 12 19 struct gpio_desc; 13 20 struct mii_bus; 14 21 ··· 332 325 int mdiobus_write_nested(struct mii_bus *bus, int addr, u32 regnum, u16 val); 333 326 int mdiobus_modify(struct mii_bus *bus, int addr, u32 regnum, u16 mask, 334 327 u16 set); 328 + 329 + static inline u32 mdiobus_c45_addr(int devad, u16 regnum) 330 + { 331 + return MII_ADDR_C45 | devad << MII_DEVADDR_C45_SHIFT | regnum; 332 + } 333 + 334 + static inline int __mdiobus_c45_read(struct mii_bus *bus, int prtad, int devad, 335 + u16 regnum) 336 + { 337 + return __mdiobus_read(bus, prtad, mdiobus_c45_addr(devad, regnum)); 338 + } 339 + 340 + static inline int __mdiobus_c45_write(struct mii_bus *bus, int prtad, int devad, 341 + u16 regnum, u16 val) 342 + { 343 + return __mdiobus_write(bus, prtad, mdiobus_c45_addr(devad, regnum), 344 + val); 345 + } 346 + 347 + static inline int mdiobus_c45_read(struct mii_bus *bus, int prtad, int devad, 348 + u16 regnum) 349 + { 350 + return mdiobus_read(bus, prtad, mdiobus_c45_addr(devad, regnum)); 351 + } 335 352 336 353 int mdiobus_register_device(struct mdio_device *mdiodev); 337 354 int mdiobus_unregister_device(struct mdio_device *mdiodev);
-6
include/linux/phy.h
··· 209 209 210 210 #define MII_BUS_ID_SIZE 61 211 211 212 - /* Or MII_ADDR_C45 into regnum for read/write on mii_bus to enable the 21 bit 213 - IEEE 802.3ae clause 45 addressing mode used by 10GIGE phy chips. */ 214 - #define MII_ADDR_C45 (1<<30) 215 - #define MII_DEVADDR_C45_SHIFT 16 216 - #define MII_REGADDR_C45_MASK GENMASK(15, 0) 217 - 218 212 struct device; 219 213 struct phylink; 220 214 struct sfp_bus;