usbnet: smsc95xx: Don't reset PHY behind PHY driver's back
authorLukas Wunner <lukas@wunner.de>
Thu, 12 May 2022 08:42:03 +0000 (10:42 +0200)
committerDavid S. Miller <davem@davemloft.net>
Fri, 13 May 2022 10:35:46 +0000 (11:35 +0100)
smsc95xx_reset() resets the PHY behind the PHY driver's back, which
seems like a bad idea generally.  Remove that portion of the function.

We're about to use PHY interrupts instead of polling to detect link
changes on SMSC LAN95xx chips.  Because smsc95xx_reset() is called from
usbnet_open(), PHY interrupt settings are lost whenever the net_device
is brought up.

There are two other callers of smsc95xx_reset(), namely smsc95xx_bind()
and smsc95xx_reset_resume(), and both may indeed benefit from a PHY
reset.  However they already perform one through their calls to
phy_connect_direct() and phy_init_hw().

Tested-by: Oleksij Rempel <o.rempel@pengutronix.de> # LAN9514/9512/9500
Tested-by: Ferry Toth <fntoth@gmail.com> # LAN9514
Signed-off-by: Lukas Wunner <lukas@wunner.de>
Cc: Martyn Welch <martyn.welch@collabora.com>
Cc: Gabriel Hojda <ghojda@yo2urs.ro>
Reviewed-by: Andrew Lunn <andrew@lunn.ch>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/usb/smsc95xx.c

index 2cb44d65bbc3cd21011a6bb16a0be59d545364ae..6c37c7adde1b8e37b509fac65e334e4f25d3275c 100644 (file)
@@ -887,24 +887,6 @@ static int smsc95xx_reset(struct usbnet *dev)
                return ret;
        }
 
-       ret = smsc95xx_write_reg(dev, PM_CTRL, PM_CTL_PHY_RST_);
-       if (ret < 0)
-               return ret;
-
-       timeout = 0;
-       do {
-               msleep(10);
-               ret = smsc95xx_read_reg(dev, PM_CTRL, &read_buf);
-               if (ret < 0)
-                       return ret;
-               timeout++;
-       } while ((read_buf & PM_CTL_PHY_RST_) && (timeout < 100));
-
-       if (timeout >= 100) {
-               netdev_warn(dev->net, "timeout waiting for PHY Reset\n");
-               return ret;
-       }
-
        ret = smsc95xx_set_mac_address(dev);
        if (ret < 0)
                return ret;