lan78xx: Avoid spurious kevent 4 "error"
[sfrench/cifs-2.6.git] / drivers / net / usb / lan78xx.c
index 55a78eb96961ef35c5dfccf94bca45ccda13aa09..bdb696612e11f066d37b506bbc164e155d80d469 100644 (file)
@@ -928,7 +928,8 @@ static int lan78xx_read_otp(struct lan78xx_net *dev, u32 offset,
                        offset += 0x100;
                else
                        ret = -EINVAL;
-               ret = lan78xx_read_raw_otp(dev, offset, length, data);
+               if (!ret)
+                       ret = lan78xx_read_raw_otp(dev, offset, length, data);
        }
 
        return ret;
@@ -2082,10 +2083,6 @@ static int lan78xx_phy_init(struct lan78xx_net *dev)
 
        dev->fc_autoneg = phydev->autoneg;
 
-       phy_start(phydev);
-
-       netif_dbg(dev, ifup, dev->net, "phy initialised successfully");
-
        return 0;
 
 error:
@@ -2506,7 +2503,7 @@ static void lan78xx_init_stats(struct lan78xx_net *dev)
        dev->stats.rollover_max.eee_tx_lpi_transitions = 0xFFFFFFFF;
        dev->stats.rollover_max.eee_tx_lpi_time = 0xFFFFFFFF;
 
-       lan78xx_defer_kevent(dev, EVENT_STAT_UPDATE);
+       set_bit(EVENT_STAT_UPDATE, &dev->flags);
 }
 
 static int lan78xx_open(struct net_device *net)
@@ -2522,9 +2519,9 @@ static int lan78xx_open(struct net_device *net)
        if (ret < 0)
                goto done;
 
-       ret = lan78xx_phy_init(dev);
-       if (ret < 0)
-               goto done;
+       phy_start(net->phydev);
+
+       netif_dbg(dev, ifup, dev->net, "phy initialised successfully");
 
        /* for Link Check */
        if (dev->urb_intr) {
@@ -2585,13 +2582,8 @@ static int lan78xx_stop(struct net_device *net)
        if (timer_pending(&dev->stat_monitor))
                del_timer_sync(&dev->stat_monitor);
 
-       phy_unregister_fixup_for_uid(PHY_KSZ9031RNX, 0xfffffff0);
-       phy_unregister_fixup_for_uid(PHY_LAN8835, 0xfffffff0);
-
-       phy_stop(net->phydev);
-       phy_disconnect(net->phydev);
-
-       net->phydev = NULL;
+       if (net->phydev)
+               phy_stop(net->phydev);
 
        clear_bit(EVENT_DEV_OPEN, &dev->flags);
        netif_stop_queue(net);
@@ -3506,8 +3498,13 @@ static void lan78xx_disconnect(struct usb_interface *intf)
                return;
 
        udev = interface_to_usbdev(intf);
-
        net = dev->net;
+
+       phy_unregister_fixup_for_uid(PHY_KSZ9031RNX, 0xfffffff0);
+       phy_unregister_fixup_for_uid(PHY_LAN8835, 0xfffffff0);
+
+       phy_disconnect(net->phydev);
+
        unregister_netdev(net);
 
        cancel_delayed_work_sync(&dev->wq);
@@ -3663,8 +3660,14 @@ static int lan78xx_probe(struct usb_interface *intf,
        pm_runtime_set_autosuspend_delay(&udev->dev,
                                         DEFAULT_AUTOSUSPEND_DELAY);
 
+       ret = lan78xx_phy_init(dev);
+       if (ret < 0)
+               goto out4;
+
        return 0;
 
+out4:
+       unregister_netdev(netdev);
 out3:
        lan78xx_unbind(dev, intf);
 out2:
@@ -4012,7 +4015,7 @@ static int lan78xx_reset_resume(struct usb_interface *intf)
 
        lan78xx_reset(dev);
 
-       lan78xx_phy_init(dev);
+       phy_start(dev->net->phydev);
 
        return lan78xx_resume(intf);
 }