Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b3565f27 authored by Ezequiel Garcia's avatar Ezequiel Garcia Committed by David S. Miller
Browse files

net: phy: Ensure the MDIO bus module is held



This commit adds proper module_{get,put} to prevent the MDIO bus module
from being unloaded while the phydev is connected. By doing so, we fix
a kernel panic produced when a MDIO driver is removed, but the phydev
that relies on it is attached and running.

Signed-off-by: default avatarEzequiel Garcia <ezequiel.garcia@free-electrons.com>
Reviewed-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Tested-by: default avatarFlorian Fainelli <f.fainelli@gmail.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent a71e3c37
Loading
Loading
Loading
Loading
+13 −0
Original line number Diff line number Diff line
@@ -575,6 +575,7 @@ int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
		      u32 flags, phy_interface_t interface)
{
	struct device *d = &phydev->dev;
	struct module *bus_module;
	int err;

	/* Assume that if there is no driver, that it doesn't
@@ -599,6 +600,14 @@ int phy_attach_direct(struct net_device *dev, struct phy_device *phydev,
		return -EBUSY;
	}

	/* Increment the bus module reference count */
	bus_module = phydev->bus->dev.driver ?
		     phydev->bus->dev.driver->owner : NULL;
	if (!try_module_get(bus_module)) {
		dev_err(&dev->dev, "failed to get the bus module\n");
		return -EIO;
	}

	phydev->attached_dev = dev;
	dev->phydev = phydev;

@@ -664,6 +673,10 @@ EXPORT_SYMBOL(phy_attach);
void phy_detach(struct phy_device *phydev)
{
	int i;

	if (phydev->bus->dev.driver)
		module_put(phydev->bus->dev.driver->owner);

	phydev->attached_dev->phydev = NULL;
	phydev->attached_dev = NULL;
	phy_suspend(phydev);