mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 02:39:48 +00:00
net: mdio: introduce a shutdown method to mdio device drivers
[ Upstream commitcf9579976f
] MDIO-attached devices might have interrupts and other things that might need quiesced when we kexec into a new kernel. Things are even more creepy when those interrupt lines are shared, and in that case it is absolutely mandatory to disable all interrupt sources. Moreover, MDIO devices might be DSA switches, and DSA needs its own shutdown method to unlink from the DSA master, which is a new requirement that appeared after commit2f1e8ea726
("net: dsa: link interfaces with the DSA master to get rid of lockdep warnings"). So introduce a ->shutdown method in the MDIO device driver structure. Signed-off-by: Vladimir Oltean <vladimir.oltean@nxp.com> Reviewed-by: Andrew Lunn <andrew@lunn.ch> Reviewed-by: Florian Fainelli <f.fainelli@gmail.com> Signed-off-by: David S. Miller <davem@davemloft.net> Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
63c89930d4
commit
a41938d072
2 changed files with 14 additions and 0 deletions
|
@ -179,6 +179,16 @@ static int mdio_remove(struct device *dev)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static void mdio_shutdown(struct device *dev)
|
||||||
|
{
|
||||||
|
struct mdio_device *mdiodev = to_mdio_device(dev);
|
||||||
|
struct device_driver *drv = mdiodev->dev.driver;
|
||||||
|
struct mdio_driver *mdiodrv = to_mdio_driver(drv);
|
||||||
|
|
||||||
|
if (mdiodrv->shutdown)
|
||||||
|
mdiodrv->shutdown(mdiodev);
|
||||||
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* mdio_driver_register - register an mdio_driver with the MDIO layer
|
* mdio_driver_register - register an mdio_driver with the MDIO layer
|
||||||
* @drv: new mdio_driver to register
|
* @drv: new mdio_driver to register
|
||||||
|
@ -193,6 +203,7 @@ int mdio_driver_register(struct mdio_driver *drv)
|
||||||
mdiodrv->driver.bus = &mdio_bus_type;
|
mdiodrv->driver.bus = &mdio_bus_type;
|
||||||
mdiodrv->driver.probe = mdio_probe;
|
mdiodrv->driver.probe = mdio_probe;
|
||||||
mdiodrv->driver.remove = mdio_remove;
|
mdiodrv->driver.remove = mdio_remove;
|
||||||
|
mdiodrv->driver.shutdown = mdio_shutdown;
|
||||||
|
|
||||||
retval = driver_register(&mdiodrv->driver);
|
retval = driver_register(&mdiodrv->driver);
|
||||||
if (retval) {
|
if (retval) {
|
||||||
|
|
|
@ -72,6 +72,9 @@ struct mdio_driver {
|
||||||
|
|
||||||
/* Clears up any memory if needed */
|
/* Clears up any memory if needed */
|
||||||
void (*remove)(struct mdio_device *mdiodev);
|
void (*remove)(struct mdio_device *mdiodev);
|
||||||
|
|
||||||
|
/* Quiesces the device on system shutdown, turns off interrupts etc */
|
||||||
|
void (*shutdown)(struct mdio_device *mdiodev);
|
||||||
};
|
};
|
||||||
#define to_mdio_driver(d) \
|
#define to_mdio_driver(d) \
|
||||||
container_of(to_mdio_common_driver(d), struct mdio_driver, mdiodrv)
|
container_of(to_mdio_common_driver(d), struct mdio_driver, mdiodrv)
|
||||||
|
|
Loading…
Reference in a new issue