diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index 2e0eabf591..16e965018e 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -611,7 +611,7 @@ static struct phy_driver *get_phy_driver(struct phy_device *phydev, } static struct phy_device *phy_device_create(struct mii_dev *bus, int addr, - u32 phy_id, + u32 phy_id, bool is_c45, phy_interface_t interface) { struct phy_device *dev; @@ -639,6 +639,7 @@ static struct phy_device *phy_device_create(struct mii_dev *bus, int addr, dev->addr = addr; dev->phy_id = phy_id; + dev->is_c45 = is_c45; dev->bus = bus; dev->drv = get_phy_driver(dev, interface); @@ -687,12 +688,17 @@ static struct phy_device *create_phy_by_mask(struct mii_dev *bus, unsigned phy_mask, int devad, phy_interface_t interface) { u32 phy_id = 0xffffffff; + bool is_c45; + while (phy_mask) { int addr = ffs(phy_mask) - 1; int r = get_phy_id(bus, addr, devad, &phy_id); /* If the PHY ID is mostly f's, we didn't find anything */ - if (r == 0 && (phy_id & 0x1fffffff) != 0x1fffffff) - return phy_device_create(bus, addr, phy_id, interface); + if (r == 0 && (phy_id & 0x1fffffff) != 0x1fffffff) { + is_c45 = (devad == MDIO_DEVAD_NONE) ? false : true; + return phy_device_create(bus, addr, phy_id, is_c45, + interface); + } phy_mask &= ~(1 << addr); } return NULL; @@ -870,9 +876,9 @@ struct phy_device *phy_connect(struct mii_dev *bus, int addr, sn = fdt_first_subnode(gd->fdt_blob, dev_of_offset(dev)); while (sn > 0) { name = fdt_get_name(gd->fdt_blob, sn, NULL); - if (name != NULL && strcmp(name, "fixed-link") == 0) { - phydev = phy_device_create(bus, - sn, PHY_FIXED_ID, interface); + if (name && strcmp(name, "fixed-link") == 0) { + phydev = phy_device_create(bus, sn, PHY_FIXED_ID, false, + interface); break; } sn = fdt_next_subnode(gd->fdt_blob, sn); diff --git a/include/phy.h b/include/phy.h index 2fa3c86154..e61aa1daca 100644 --- a/include/phy.h +++ b/include/phy.h @@ -139,6 +139,7 @@ struct phy_device { int pause; int asym_pause; u32 phy_id; + bool is_c45; u32 flags; };