diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c index 56cb9b2e9..b29a980e6 100644 --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c @@ -27,6 +27,36 @@ LIST_HEAD(mii_bus_list); +static int mdiobus_detect(struct device_d *dev) +{ + struct mii_bus *mii = to_mii_bus(dev); + int i, ret; + + for (i = 0; i < PHY_MAX_ADDR; i++) { + struct phy_device *phydev; + + phydev = mdiobus_scan(mii, i); + if (IS_ERR(phydev)) + continue; + if (phydev->registered) + continue; + ret = phy_register_device(phydev); + if (ret) + dev_err(dev, "failed to register phy: %s\n", strerror(-ret)); + dev_info(dev, "registered phy as /dev/%s\n", phydev->cdev.name); + } + + return 0; +} + +void mdiobus_detect_all(void) +{ + struct mii_bus *mii; + + for_each_mii_bus(mii) + mdiobus_detect(&mii->dev); +} + /** * mdiobus_register - bring up all the PHYs on a given bus and attach them to bus * @bus: target mii_bus @@ -49,6 +79,7 @@ int mdiobus_register(struct mii_bus *bus) bus->dev.id = DEVICE_ID_DYNAMIC; strcpy(bus->dev.name, "miibus"); bus->dev.parent = bus->parent; + bus->dev.detect = mdiobus_detect; err = register_device(&bus->dev); if (err) { diff --git a/drivers/net/phy/phy.c b/drivers/net/phy/phy.c index b05a31390..681fb5157 100644 --- a/drivers/net/phy/phy.c +++ b/drivers/net/phy/phy.c @@ -232,7 +232,7 @@ static void phy_config_aneg(struct phy_device *phydev) drv->config_aneg(phydev); } -static int phy_register_device(struct phy_device* dev) +int phy_register_device(struct phy_device* dev) { int ret; diff --git a/include/linux/phy.h b/include/linux/phy.h index 5f3b33f66..6c9d090f4 100644 --- a/include/linux/phy.h +++ b/include/linux/phy.h @@ -94,6 +94,8 @@ int mdiobus_register(struct mii_bus *bus); void mdiobus_unregister(struct mii_bus *bus); struct phy_device *mdiobus_scan(struct mii_bus *bus, int addr); +void mdiobus_detect_all(void); + extern struct list_head mii_bus_list; #define for_each_mii_bus(mii) \ @@ -251,6 +253,8 @@ struct phy_device *get_phy_device(struct mii_bus *bus, int addr); int phy_init(void); int phy_init_hw(struct phy_device *phydev); +int phy_register_device(struct phy_device* dev); + /** * phy_read - Convenience function for reading a given PHY register * @phydev: the phy_device struct