Revert "Revert "usbnet: smsc95xx: Avoid link settings race on interrupt reception""
authorDom Cobley <popcornmix@gmail.com>
Mon, 5 Sep 2022 11:45:07 +0000 (12:45 +0100)
committerDom Cobley <popcornmix@gmail.com>
Mon, 5 Sep 2022 11:45:07 +0000 (12:45 +0100)
This reverts commit c7cbb86f4763c5d9b52698e6f58b6d1719ade011.

drivers/net/usb/smsc95xx.c

index 220026c..7b0d7dc 100644 (file)
@@ -577,7 +577,7 @@ static int smsc95xx_phy_update_flowcontrol(struct usbnet *dev)
        return smsc95xx_write_reg(dev, AFC_CFG, afc_cfg);
 }
 
-static int smsc95xx_link_reset(struct usbnet *dev)
+static void smsc95xx_mac_update_fullduplex(struct usbnet *dev)
 {
        struct smsc95xx_priv *pdata = dev->driver_priv;
        unsigned long flags;
@@ -594,14 +594,16 @@ static int smsc95xx_link_reset(struct usbnet *dev)
        spin_unlock_irqrestore(&pdata->mac_cr_lock, flags);
 
        ret = smsc95xx_write_reg(dev, MAC_CR, pdata->mac_cr);
-       if (ret < 0)
-               return ret;
+       if (ret < 0) {
+               if (ret != -ENODEV)
+                       netdev_warn(dev->net,
+                                   "Error updating MAC full duplex mode\n");
+               return;
+       }
 
        ret = smsc95xx_phy_update_flowcontrol(dev);
        if (ret < 0)
                netdev_warn(dev->net, "Error updating PHY flow control\n");
-
-       return ret;
 }
 
 static void smsc95xx_status(struct usbnet *dev, struct urb *urb)
@@ -618,7 +620,7 @@ static void smsc95xx_status(struct usbnet *dev, struct urb *urb)
        netif_dbg(dev, link, dev->net, "intdata: 0x%08X\n", intdata);
 
        if (intdata & INT_ENP_PHY_INT_)
-               usbnet_defer_kevent(dev, EVENT_LINK_RESET);
+               ;
        else
                netdev_warn(dev->net, "unexpected interrupt, intdata=0x%08X\n",
                            intdata);
@@ -1126,6 +1128,7 @@ static void smsc95xx_handle_link_change(struct net_device *net)
        struct usbnet *dev = netdev_priv(net);
 
        phy_print_status(net->phydev);
+       smsc95xx_mac_update_fullduplex(dev);
        usbnet_defer_kevent(dev, EVENT_LINK_CHANGE);
 }
 
@@ -2033,7 +2036,6 @@ static const struct driver_info smsc95xx_info = {
        .description    = "smsc95xx USB 2.0 Ethernet",
        .bind           = smsc95xx_bind,
        .unbind         = smsc95xx_unbind,
-       .link_reset     = smsc95xx_link_reset,
        .reset          = smsc95xx_reset,
        .check_connect  = smsc95xx_start_phy,
        .stop           = smsc95xx_stop,