@@ -743,7 +743,8 @@ static int get_phy_c45_ids(struct mii_bus *bus, int addr, u32 *phy_id,
bool valid_id = false;
/* Find first non-zero Devices In package. Device zero is reserved
- * for 802.3 c45 complied PHYs, so don't probe it at first.
+ * for 802.3 c45 complied PHYs, We will ask it for a devices list,
+ * but later we won't ask for identification from it.
*/
for (i = 0; i < num_ids && *devs == 0; i++) {
ret = get_phy_c45_devs_in_pkg(bus, addr, i, devs);
@@ -756,10 +757,7 @@ static int get_phy_c45_ids(struct mii_bus *bus, int addr, u32 *phy_id,
* 10G PHYs have zero Devices In package,
* e.g. Cortina CS4315/CS4340 PHY.
*/
- phy_reg = get_phy_c45_devs_in_pkg(bus, addr, 0, devs);
- if (phy_reg < 0)
- return -EIO;
- break;
+ *devs = 0;
}
}
@@ -346,7 +346,7 @@ enum phy_state {
*/
struct phy_c45_device_ids {
u32 devices_in_package;
- u32 device_ids[8];
+ u32 device_ids[32];
};
struct macsec_context;
The spec identifies devices in the top of the 32-bit device space. Some phys are actually responding that high. Lets try and capture their information as well. Starting at the reserved address 0, lets scan every single possible MMD address. The spec seems to indicate that every MMD should respond with the same devices list. But it seems this is being interpreted that only implemented MMDs need respond. Since it doesn't appear to hurt to scan reserved addresses, and the spec says that access to unimplemented registers should return 0 (despite this some devices appear to be returning 0xFFFFFFFF) we are just going to ignore anything that doesn't look like a valid return. Signed-off-by: Jeremy Linton <jeremy.linton@arm.com> --- drivers/net/phy/phy_device.c | 8 +++----- include/linux/phy.h | 2 +- 2 files changed, 4 insertions(+), 6 deletions(-)