diff options
Diffstat (limited to 'drivers/net/phy/mdio_bus.c')
-rw-r--r-- | drivers/net/phy/mdio_bus.c | 22 |
1 files changed, 15 insertions, 7 deletions
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); | |||
63 | static void mdiobus_release(struct device *d) | 63 | static void mdiobus_release(struct device *d) |
64 | { | 64 | { |
65 | struct mii_bus *bus = to_mii_bus(d); | 65 | struct mii_bus *bus = to_mii_bus(d); |
66 | BUG_ON(bus->state != MDIOBUS_RELEASED); | 66 | BUG_ON(bus->state != MDIOBUS_RELEASED && |
67 | /* for compatibility with error handling in drivers */ | ||
68 | bus->state != MDIOBUS_ALLOCATED); | ||
67 | kfree(bus); | 69 | kfree(bus); |
68 | } | 70 | } |
69 | 71 | ||
@@ -83,8 +85,7 @@ static struct class mdio_bus_class = { | |||
83 | */ | 85 | */ |
84 | int mdiobus_register(struct mii_bus *bus) | 86 | int mdiobus_register(struct mii_bus *bus) |
85 | { | 87 | { |
86 | int i; | 88 | int i, err; |
87 | int err = 0; | ||
88 | 89 | ||
89 | if (NULL == bus || NULL == bus->name || | 90 | if (NULL == bus || NULL == bus->name || |
90 | NULL == bus->read || | 91 | NULL == bus->read || |
@@ -116,16 +117,23 @@ int mdiobus_register(struct mii_bus *bus) | |||
116 | struct phy_device *phydev; | 117 | struct phy_device *phydev; |
117 | 118 | ||
118 | phydev = mdiobus_scan(bus, i); | 119 | phydev = mdiobus_scan(bus, i); |
119 | if (IS_ERR(phydev)) | 120 | if (IS_ERR(phydev)) { |
120 | err = PTR_ERR(phydev); | 121 | err = PTR_ERR(phydev); |
122 | goto error; | ||
123 | } | ||
121 | } | 124 | } |
122 | } | 125 | } |
123 | 126 | ||
124 | if (!err) | 127 | bus->state = MDIOBUS_REGISTERED; |
125 | bus->state = MDIOBUS_REGISTERED; | ||
126 | |||
127 | pr_info("%s: probed\n", bus->name); | 128 | pr_info("%s: probed\n", bus->name); |
129 | return 0; | ||
128 | 130 | ||
131 | error: | ||
132 | while (--i >= 0) { | ||
133 | if (bus->phy_map[i]) | ||
134 | device_unregister(&bus->phy_map[i]->dev); | ||
135 | } | ||
136 | device_del(&bus->dev); | ||
129 | return err; | 137 | return err; |
130 | } | 138 | } |
131 | EXPORT_SYMBOL(mdiobus_register); | 139 | EXPORT_SYMBOL(mdiobus_register); |