aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/smsc/smsc911x.c
diff options
context:
space:
mode:
authorPavel Fedin <p.fedin@samsung.com>2015-10-29 09:45:22 +0300
committerDavid S. Miller <davem@davemloft.net>2015-11-01 12:05:24 -0500
commitb43c142f22236b37aa68faf23ac1bbd75f94c5b5 (patch)
treeaa946f48003031fd07602ad6e5a54bccfe2271af /drivers/net/ethernet/smsc/smsc911x.c
parenttipc: linearize arriving NAME_DISTR and LINK_PROTO buffers (diff)
downloadlinux-dev-b43c142f22236b37aa68faf23ac1bbd75f94c5b5.tar.xz
linux-dev-b43c142f22236b37aa68faf23ac1bbd75f94c5b5.zip
net: smsc911x: Fix crash if loopback test fails
On certain hardware in certain situations loopback test fails and the driver gets removed. During mdiobus_unregister() instance of PHY driver gets disposed. But by this time it has already been started using phy_connect_direct(). PHY driver uses DELAYED_WORK in order to maintain its state. Attempting to dispose the driver without calling phy_disconnect() causes deallocation of DELAYED_WORK being active. This shortly causes a bad crash in timer code. The problem can be discovered by enabling CONFIG_DEBUG_OBJECTS_TIMERS and CONFIG_DEBUG_OBJECTS_FREE Signed-off-by: Pavel Fedin <p.fedin@samsung.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/smsc/smsc911x.c')
-rw-r--r--drivers/net/ethernet/smsc/smsc911x.c1
1 files changed, 1 insertions, 0 deletions
diff --git a/drivers/net/ethernet/smsc/smsc911x.c b/drivers/net/ethernet/smsc/smsc911x.c
index 3b4cd8a263de..c860c9007e49 100644
--- a/drivers/net/ethernet/smsc/smsc911x.c
+++ b/drivers/net/ethernet/smsc/smsc911x.c
@@ -1052,6 +1052,7 @@ static int smsc911x_mii_probe(struct net_device *dev)
#ifdef USE_PHY_WORK_AROUND
if (smsc911x_phy_loopbacktest(dev) < 0) {
SMSC_WARN(pdata, hw, "Failed Loop Back Test");
+ phy_disconnect(phydev);
return -ENODEV;
}
SMSC_TRACE(pdata, hw, "Passed Loop Back Test");