dev->fc_autoneg = phydev->autoneg;
 
-       phy_start(phydev);
-
-       netif_dbg(dev, ifup, dev->net, "phy initialised successfully");
-
        return 0;
 
 error:
        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) {
        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);
                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);
        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:
 
        lan78xx_reset(dev);
 
-       lan78xx_phy_init(dev);
+       phy_start(dev->net->phydev);
 
        return lan78xx_resume(intf);
 }