| From 7b9a88a390dacb37b051a7b09b9a08f546edf5eb Mon Sep 17 00:00:00 2001 |
| From: Florian Fainelli <f.fainelli@gmail.com> |
| Date: Fri, 17 Feb 2017 16:07:33 -0800 |
| Subject: net: phy: Fix PHY unbind crash |
| |
| From: Florian Fainelli <f.fainelli@gmail.com> |
| |
| commit 7b9a88a390dacb37b051a7b09b9a08f546edf5eb upstream. |
| |
| The PHY library does not deal very well with bind and unbind events. The first |
| thing we would see is that we were not properly canceling the PHY state machine |
| workqueue, so we would be crashing while dereferencing phydev->drv since there |
| is no driver attached anymore. |
| |
| Suggested-by: Russell King <rmk+kernel@armlinux.org.uk> |
| Signed-off-by: Florian Fainelli <f.fainelli@gmail.com> |
| Signed-off-by: David S. Miller <davem@davemloft.net> |
| Cc: Guenter Roeck <linux@roeck-us.net> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/net/phy/phy_device.c | 2 ++ |
| 1 file changed, 2 insertions(+) |
| |
| --- a/drivers/net/phy/phy_device.c |
| +++ b/drivers/net/phy/phy_device.c |
| @@ -1368,6 +1368,8 @@ static int phy_remove(struct device *dev |
| { |
| struct phy_device *phydev = to_phy_device(dev); |
| |
| + cancel_delayed_work_sync(&phydev->state_queue); |
| + |
| mutex_lock(&phydev->lock); |
| phydev->state = PHY_DOWN; |
| mutex_unlock(&phydev->lock); |