From 161c8d2f50109b44b664eaf23831ea1587979a61 Mon Sep 17 00:00:00 2001 From: Krzysztof Halasa Date: Thu, 25 Dec 2008 16:50:41 -0800 Subject: net: PHYLIB mdio fixes #2 The PHYLIB mdio code has more problems in error paths: - mdiobus_release can be called before bus->state is set to MDIOBUS_REGISTERED - mdiobus_scan allocates resources which need to be freed - the comment is wrong, the resistors used are actually pull-ups. Signed-off-by: Krzysztof Halasa Signed-off-by: David S. Miller --- drivers/net/phy/mdio_bus.c | 22 +++++++++++++++------- drivers/net/phy/phy_device.c | 2 +- 2 files changed, 16 insertions(+), 8 deletions(-) (limited to 'drivers/net') diff --git a/drivers/net/phy/mdio_bus.c b/drivers/net/phy/mdio_bus.c index 7a333601fbe8..11adf6ed4628 100644 --- a/drivers/net/phy/mdio_bus.c +++ b/drivers/net/phy/mdio_bus.c @@ -63,7 +63,9 @@ EXPORT_SYMBOL(mdiobus_alloc); static void mdiobus_release(struct device *d) { struct mii_bus *bus = to_mii_bus(d); - BUG_ON(bus->state != MDIOBUS_RELEASED); + BUG_ON(bus->state != MDIOBUS_RELEASED && + /* for compatibility with error handling in drivers */ + bus->state != MDIOBUS_ALLOCATED); kfree(bus); } @@ -83,8 +85,7 @@ static struct class mdio_bus_class = { */ int mdiobus_register(struct mii_bus *bus) { - int i; - int err = 0; + int i, err; if (NULL == bus || NULL == bus->name || NULL == bus->read || @@ -116,16 +117,23 @@ int mdiobus_register(struct mii_bus *bus) struct phy_device *phydev; phydev = mdiobus_scan(bus, i); - if (IS_ERR(phydev)) + if (IS_ERR(phydev)) { err = PTR_ERR(phydev); + goto error; + } } } - if (!err) - bus->state = MDIOBUS_REGISTERED; - + bus->state = MDIOBUS_REGISTERED; pr_info("%s: probed\n", bus->name); + return 0; +error: + while (--i >= 0) { + if (bus->phy_map[i]) + device_unregister(&bus->phy_map[i]->dev); + } + device_del(&bus->dev); return err; } EXPORT_SYMBOL(mdiobus_register); diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c index f84f6a1b530c..e35460165bf7 100644 --- a/drivers/net/phy/phy_device.c +++ b/drivers/net/phy/phy_device.c @@ -232,7 +232,7 @@ struct phy_device * get_phy_device(struct mii_bus *bus, int addr) return NULL; /* - * Broken hardware is sometimes missing the pull down resistor on the + * Broken hardware is sometimes missing the pull-up resistor on the * MDIO line, which results in reads to non-existent devices returning * 0 rather than 0xffff. Catch this here and treat 0 as a non-existent * device as well. -- cgit v1.2.3