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;
        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)
        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);
        struct usbnet *dev = netdev_priv(net);
 
        phy_print_status(net->phydev);
+       smsc95xx_mac_update_fullduplex(dev);
        usbnet_defer_kevent(dev, EVENT_LINK_CHANGE);
 }
 
        .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,