[PATCH][v2] phylib: add module owner to the mii_bus structure
From: Ionut Nicu <hidden>
Date: 2007-12-28 18:37:11
Subsystem:
ethernet phy library, networking drivers, the rest · Maintainers:
Andrew Lunn, Heiner Kallweit, "David S. Miller", Eric Dumazet, Jakub Kicinski, Paolo Abeni, Linus Torvalds
Prevent unloading mii bus driver module when other modules have references to some phydevs on that bus. Added a new member (module owner) to struct mii_bus and added code to increment the mii bus owner module usage count on phy_connect and decrement it on phy_disconnect Set the module owner in the ucc_geth_mdio driver. Signed-off-by: Ionut Nicu <redacted> Tested-by: Emil Medve <redacted> --- drivers/net/phy/phy_device.c | 9 ++++++++- drivers/net/ucc_geth_mii.c | 3 +++ include/linux/phy.h | 4 ++++ 3 files changed, 15 insertions(+), 1 deletions(-)
diff --git a/drivers/net/phy/phy_device.c b/drivers/net/phy/phy_device.c
index 5b9e175..ca617ec 100644
--- a/drivers/net/phy/phy_device.c
+++ b/drivers/net/phy/phy_device.c@@ -171,6 +171,10 @@ struct phy_device * phy_connect(struct net_device *dev, const char *phy_id, if (IS_ERR(phydev)) return phydev; + /* Increment the usage count of the mii bus owner */ + if (!try_module_get(phydev->bus->owner)) + return ERR_PTR(-EFAULT); + phy_prepare_link(phydev, handler); phy_start_machine(phydev, NULL);
@@ -192,9 +196,12 @@ void phy_disconnect(struct phy_device *phydev) phy_stop_interrupts(phydev); phy_stop_machine(phydev); - + phydev->adjust_link = NULL; + /* Decrement the reference count for the mii bus owner */ + module_put(phydev->bus->owner); + phy_detach(phydev); } EXPORT_SYMBOL(phy_disconnect);
diff --git a/drivers/net/ucc_geth_mii.c b/drivers/net/ucc_geth_mii.c
index a3af4ea..84c7295 100644
--- a/drivers/net/ucc_geth_mii.c
+++ b/drivers/net/ucc_geth_mii.c@@ -217,6 +217,9 @@ static int uec_mdio_probe(struct of_device *ofdev, const struct of_device_id *ma } } + /* register ourselves as the owner of this bus */ + new_bus->owner = THIS_MODULE; + err = mdiobus_register(new_bus); if (0 != err) { printk(KERN_ERR "%s: Cannot register as MDIO bus\n",
diff --git a/include/linux/phy.h b/include/linux/phy.h
index 554836e..04ff6a5 100644
--- a/include/linux/phy.h
+++ b/include/linux/phy.h@@ -82,6 +82,10 @@ struct mii_bus { const char *name; int id; void *priv; + + /* The module that owns this bus */ + struct module *owner; + int (*read)(struct mii_bus *bus, int phy_id, int regnum); int (*write)(struct mii_bus *bus, int phy_id, int regnum, u16 val); int (*reset)(struct mii_bus *bus);
--
1.5.4.rc1