Commit 320ed3bf authored by Russell King's avatar Russell King Committed by David S. Miller

net: phy: split devices_in_package

We have two competing requirements for the devices_in_package field.
We want to use it as a bit array indicating which MMDs are present, but
we also want to know if the Clause 22 registers are present.

Since "devices in package" is a term used in the 802.3 specification,
keep this as the as-specified values read from the PHY, and introduce
a new member "mmds_present" to indicate which MMDs are actually
present in the PHY, derived from the "devices in package" value.
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarRussell King <rmk+kernel@armlinux.org.uk>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5ba33cf4
...@@ -219,7 +219,7 @@ int genphy_c45_read_link(struct phy_device *phydev) ...@@ -219,7 +219,7 @@ int genphy_c45_read_link(struct phy_device *phydev)
int val, devad; int val, devad;
bool link = true; bool link = true;
if (phydev->c45_ids.devices_in_package & MDIO_DEVS_AN) { if (phydev->c45_ids.mmds_present & MDIO_DEVS_AN) {
val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_CTRL1); val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_CTRL1);
if (val < 0) if (val < 0)
return val; return val;
...@@ -409,7 +409,7 @@ int genphy_c45_pma_read_abilities(struct phy_device *phydev) ...@@ -409,7 +409,7 @@ int genphy_c45_pma_read_abilities(struct phy_device *phydev)
int val; int val;
linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported); linkmode_clear_bit(ETHTOOL_LINK_MODE_Autoneg_BIT, phydev->supported);
if (phydev->c45_ids.devices_in_package & MDIO_DEVS_AN) { if (phydev->c45_ids.mmds_present & MDIO_DEVS_AN) {
val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_STAT1); val = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_STAT1);
if (val < 0) if (val < 0)
return val; return val;
......
...@@ -709,9 +709,6 @@ static int get_phy_c45_devs_in_pkg(struct mii_bus *bus, int addr, int dev_addr, ...@@ -709,9 +709,6 @@ static int get_phy_c45_devs_in_pkg(struct mii_bus *bus, int addr, int dev_addr,
return -EIO; return -EIO;
*devices_in_package |= phy_reg; *devices_in_package |= phy_reg;
/* Bit 0 doesn't represent a device, it indicates c22 regs presence */
*devices_in_package &= ~BIT(0);
return 0; return 0;
} }
...@@ -789,6 +786,8 @@ static int get_phy_c45_ids(struct mii_bus *bus, int addr, ...@@ -789,6 +786,8 @@ static int get_phy_c45_ids(struct mii_bus *bus, int addr,
} }
c45_ids->devices_in_package = devs_in_pkg; c45_ids->devices_in_package = devs_in_pkg;
/* Bit 0 doesn't represent a device, it indicates c22 regs presence */
c45_ids->mmds_present = devs_in_pkg & ~BIT(0);
return 0; return 0;
} }
...@@ -857,6 +856,7 @@ struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45) ...@@ -857,6 +856,7 @@ struct phy_device *get_phy_device(struct mii_bus *bus, int addr, bool is_c45)
int r; int r;
c45_ids.devices_in_package = 0; c45_ids.devices_in_package = 0;
c45_ids.mmds_present = 0;
memset(c45_ids.device_ids, 0xff, sizeof(c45_ids.device_ids)); memset(c45_ids.device_ids, 0xff, sizeof(c45_ids.device_ids));
if (is_c45) if (is_c45)
......
...@@ -1638,11 +1638,11 @@ static int phylink_phy_read(struct phylink *pl, unsigned int phy_id, ...@@ -1638,11 +1638,11 @@ static int phylink_phy_read(struct phylink *pl, unsigned int phy_id,
case MII_BMSR: case MII_BMSR:
case MII_PHYSID1: case MII_PHYSID1:
case MII_PHYSID2: case MII_PHYSID2:
devad = __ffs(phydev->c45_ids.devices_in_package); devad = __ffs(phydev->c45_ids.mmds_present);
break; break;
case MII_ADVERTISE: case MII_ADVERTISE:
case MII_LPA: case MII_LPA:
if (!(phydev->c45_ids.devices_in_package & MDIO_DEVS_AN)) if (!(phydev->c45_ids.mmds_present & MDIO_DEVS_AN))
return -EINVAL; return -EINVAL;
devad = MDIO_MMD_AN; devad = MDIO_MMD_AN;
if (reg == MII_ADVERTISE) if (reg == MII_ADVERTISE)
...@@ -1678,11 +1678,11 @@ static int phylink_phy_write(struct phylink *pl, unsigned int phy_id, ...@@ -1678,11 +1678,11 @@ static int phylink_phy_write(struct phylink *pl, unsigned int phy_id,
case MII_BMSR: case MII_BMSR:
case MII_PHYSID1: case MII_PHYSID1:
case MII_PHYSID2: case MII_PHYSID2:
devad = __ffs(phydev->c45_ids.devices_in_package); devad = __ffs(phydev->c45_ids.mmds_present);
break; break;
case MII_ADVERTISE: case MII_ADVERTISE:
case MII_LPA: case MII_LPA:
if (!(phydev->c45_ids.devices_in_package & MDIO_DEVS_AN)) if (!(phydev->c45_ids.mmds_present & MDIO_DEVS_AN))
return -EINVAL; return -EINVAL;
devad = MDIO_MMD_AN; devad = MDIO_MMD_AN;
if (reg == MII_ADVERTISE) if (reg == MII_ADVERTISE)
......
...@@ -392,11 +392,13 @@ enum phy_state { ...@@ -392,11 +392,13 @@ enum phy_state {
/** /**
* struct phy_c45_device_ids - 802.3-c45 Device Identifiers * struct phy_c45_device_ids - 802.3-c45 Device Identifiers
* @devices_in_package: Bit vector of devices present. * @devices_in_package: IEEE 802.3 devices in package register value.
* @mmds_present: bit vector of MMDs present.
* @device_ids: The device identifer for each present device. * @device_ids: The device identifer for each present device.
*/ */
struct phy_c45_device_ids { struct phy_c45_device_ids {
u32 devices_in_package; u32 devices_in_package;
u32 mmds_present;
u32 device_ids[8]; u32 device_ids[8];
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment