net: smsc911x: Fix crash if loopback test fails
authorPavel Fedin <p.fedin@samsung.com>
Thu, 29 Oct 2015 06:45:22 +0000 (09:45 +0300)
committerDavid S. Miller <davem@davemloft.net>
Sun, 1 Nov 2015 17:05:24 +0000 (12:05 -0500)
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>
drivers/net/ethernet/smsc/smsc911x.c

index 3b4cd8a263deb4ae93e6487bdba0d717b009f329..c860c9007e49afda02165733ede46780da58abf3 100644 (file)
@@ -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");