Commit b43c142f authored by Pavel Fedin's avatar Pavel Fedin Committed by David S. Miller

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: default avatarPavel Fedin <p.fedin@samsung.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 5cbb28a4
...@@ -1052,6 +1052,7 @@ static int smsc911x_mii_probe(struct net_device *dev) ...@@ -1052,6 +1052,7 @@ static int smsc911x_mii_probe(struct net_device *dev)
#ifdef USE_PHY_WORK_AROUND #ifdef USE_PHY_WORK_AROUND
if (smsc911x_phy_loopbacktest(dev) < 0) { if (smsc911x_phy_loopbacktest(dev) < 0) {
SMSC_WARN(pdata, hw, "Failed Loop Back Test"); SMSC_WARN(pdata, hw, "Failed Loop Back Test");
phy_disconnect(phydev);
return -ENODEV; return -ENODEV;
} }
SMSC_TRACE(pdata, hw, "Passed Loop Back Test"); SMSC_TRACE(pdata, hw, "Passed Loop Back Test");
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment