In cases where more than a single PHY is found on the MDIO bus, the kernel will print a warning that this method is missing for each PHY device that has not been attached to a networking device. --- drivers/net/phy/mdio_bus.c | 19 ++++++++++++++++++- 1 files changed, 18 insertions(+), 1 deletions(-)
diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c index fc2f0e6..cb7fb47 100644 --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c @@ -36,6 +36,23 @@ #include <asm/uaccess.h> /** + * phy_device_release - free a phy_device structure when all users of it are + * finished. + * + * @dev: device that's been removed + * + * Will be called only by the device core when all users of this phy_device + * are done. + */ +static void phy_device_release(struct device *dev) +{ + struct phy_device *phy; + + phy = to_phy_device(dev); + kfree(phy); +} + +/** * mdiobus_register - bring up all the PHYs on a given bus and attach them to bus * @bus: target mii_bus * @@ -83,6 +100,7 @@ int mdiobus_register(struct mii_bus *bus) if (phydev) { phydev->irq = bus->irq[i]; + phydev->dev.release = phy_device_release; phydev->dev.parent = bus->dev; phydev->dev.bus = &mdio_bus_type; snprintf(phydev->dev.bus_id, BUS_ID_SIZE, PHY_ID_FMT, bus->id, i); @@ -112,7 +130,6 @@ void mdiobus_unregister(struct mii_bus *bus) for (i = 0; i < PHY_MAX_ADDR; i++) { if (bus->phy_map[i]) { device_unregister(&bus->phy_map[i]->dev); - kfree(bus->phy_map[i]); } } } -- 1.5.3.5
signature.asc
Description: Digital signature