Skip to content

Commit 58989d7

Browse files
committed
Merge branch 'net-phy-add-device-managed-devm_mdiobus_register'
Heiner Kallweit says: ==================== net: phy: add device-managed devm_mdiobus_register If there's no special ordering requirement for mdiobus_unregister(), then driver code can be simplified by using a device-managed version of mdiobus_register(). Prerequisite is that bus allocation has been done device-managed too. Else mdiobus_free() may be called whilst bus is still registered, resulting in a BUG_ON(). Therefore let devm_mdiobus_register() return -EPERM if bus was allocated non-managed. First user of the new functionality is r8169 driver. ==================== Signed-off-by: David S. Miller <[email protected]>
2 parents 4406d36 + 0785dad commit 58989d7

File tree

3 files changed

+26
-9
lines changed

3 files changed

+26
-9
lines changed

drivers/net/ethernet/realtek/r8169_main.c

Lines changed: 2 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -5185,20 +5185,18 @@ static int r8169_mdio_register(struct rtl8169_private *tp)
51855185
new_bus->read = r8169_mdio_read_reg;
51865186
new_bus->write = r8169_mdio_write_reg;
51875187

5188-
ret = mdiobus_register(new_bus);
5188+
ret = devm_mdiobus_register(new_bus);
51895189
if (ret)
51905190
return ret;
51915191

51925192
tp->phydev = mdiobus_get_phy(new_bus, 0);
51935193
if (!tp->phydev) {
5194-
mdiobus_unregister(new_bus);
51955194
return -ENODEV;
51965195
} else if (!tp->phydev->drv) {
51975196
/* Most chip versions fail with the genphy driver.
51985197
* Therefore ensure that the dedicated PHY driver is loaded.
51995198
*/
52005199
dev_err(&pdev->dev, "realtek.ko not loaded, maybe it needs to be added to initramfs?\n");
5201-
mdiobus_unregister(new_bus);
52025200
return -EUNATCH;
52035201
}
52045202

@@ -5523,7 +5521,7 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
55235521

55245522
rc = register_netdev(dev);
55255523
if (rc)
5526-
goto err_mdio_unregister;
5524+
return rc;
55275525

55285526
netif_info(tp, probe, dev, "%s, %pM, XID %03x, IRQ %d\n",
55295527
rtl_chip_infos[chipset].name, dev->dev_addr, xid,
@@ -5542,10 +5540,6 @@ static int rtl_init_one(struct pci_dev *pdev, const struct pci_device_id *ent)
55425540
pm_runtime_put_sync(&pdev->dev);
55435541

55445542
return 0;
5545-
5546-
err_mdio_unregister:
5547-
mdiobus_unregister(tp->phydev->mdio.bus);
5548-
return rc;
55495543
}
55505544

55515545
static struct pci_driver rtl8169_pci_driver = {

drivers/net/phy/mdio_bus.c

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -170,7 +170,12 @@ EXPORT_SYMBOL(mdiobus_alloc_size);
170170

171171
static void _devm_mdiobus_free(struct device *dev, void *res)
172172
{
173-
mdiobus_free(*(struct mii_bus **)res);
173+
struct mii_bus *bus = *(struct mii_bus **)res;
174+
175+
if (bus->is_managed_registered && bus->state == MDIOBUS_REGISTERED)
176+
mdiobus_unregister(bus);
177+
178+
mdiobus_free(bus);
174179
}
175180

176181
static int devm_mdiobus_match(struct device *dev, void *res, void *data)
@@ -210,6 +215,7 @@ struct mii_bus *devm_mdiobus_alloc_size(struct device *dev, int sizeof_priv)
210215
if (bus) {
211216
*ptr = bus;
212217
devres_add(dev, ptr);
218+
bus->is_managed = 1;
213219
} else {
214220
devres_free(ptr);
215221
}

include/linux/phy.h

Lines changed: 17 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,9 @@ struct mii_bus {
241241
int (*reset)(struct mii_bus *bus);
242242
struct mdio_bus_stats stats[PHY_MAX_ADDR];
243243

244+
unsigned int is_managed:1; /* is device-managed */
245+
unsigned int is_managed_registered:1;
246+
244247
/*
245248
* A lock to ensure that only one thing can read/write
246249
* the MDIO bus at a time
@@ -286,6 +289,20 @@ static inline struct mii_bus *mdiobus_alloc(void)
286289

287290
int __mdiobus_register(struct mii_bus *bus, struct module *owner);
288291
#define mdiobus_register(bus) __mdiobus_register(bus, THIS_MODULE)
292+
static inline int devm_mdiobus_register(struct mii_bus *bus)
293+
{
294+
int ret;
295+
296+
if (!bus->is_managed)
297+
return -EPERM;
298+
299+
ret = mdiobus_register(bus);
300+
if (!ret)
301+
bus->is_managed_registered = 1;
302+
303+
return ret;
304+
}
305+
289306
void mdiobus_unregister(struct mii_bus *bus);
290307
void mdiobus_free(struct mii_bus *bus);
291308
struct mii_bus *devm_mdiobus_alloc_size(struct device *dev, int sizeof_priv);

0 commit comments

Comments
 (0)