fep->delay_work.timeout = false;
                rtnl_lock();
                if (netif_device_present(ndev) || netif_running(ndev)) {
-                       netif_device_detach(ndev);
                        napi_disable(&fep->napi);
-                       netif_tx_disable(ndev);
                        netif_tx_lock_bh(ndev);
                        fec_restart(ndev, fep->full_duplex);
-                       netif_tx_unlock_bh(ndev);
                        netif_wake_queue(ndev);
+                       netif_tx_unlock_bh(ndev);
                        napi_enable(&fep->napi);
-                       netif_device_attach(ndev);
                }
                rtnl_unlock();
        }
 
                /* if any of the above changed restart the FEC */
                if (status_change) {
-                       netif_device_detach(ndev);
                        napi_disable(&fep->napi);
-                       netif_tx_disable(ndev);
                        netif_tx_lock_bh(ndev);
                        fec_restart(ndev, phy_dev->duplex);
-                       netif_tx_unlock_bh(ndev);
                        netif_wake_queue(ndev);
+                       netif_tx_unlock_bh(ndev);
                        napi_enable(&fep->napi);
-                       netif_device_attach(ndev);
                }
        } else {
                if (fep->link) {
                phy_start_aneg(fep->phy_dev);
        }
        if (netif_running(ndev)) {
-               netif_device_detach(ndev);
                napi_disable(&fep->napi);
-               netif_tx_disable(ndev);
                netif_tx_lock_bh(ndev);
                fec_restart(ndev, fep->full_duplex);
-               netif_tx_unlock_bh(ndev);
                netif_wake_queue(ndev);
+               netif_tx_unlock_bh(ndev);
                napi_enable(&fep->napi);
-               netif_device_attach(ndev);
        }
 
        return 0;
 
                if (netif_running(netdev)) {
                        fec_stop(netdev);
-                       netif_device_detach(netdev);
                        napi_disable(&fep->napi);
-                       netif_tx_disable(netdev);
                        netif_tx_lock_bh(netdev);
                        fec_restart(netdev, fep->phy_dev->duplex);
-                       netif_tx_unlock_bh(netdev);
                        netif_wake_queue(netdev);
+                       netif_tx_unlock_bh(netdev);
                        napi_enable(&fep->napi);
-                       netif_device_attach(netdev);
                }
        }
 
 
        rtnl_lock();
        if (netif_running(ndev)) {
-               netif_device_detach(ndev);
                napi_disable(&fep->napi);
-               netif_tx_disable(ndev);
                netif_tx_lock_bh(ndev);
                fec_restart(ndev, fep->full_duplex);
+               netif_device_attach(ndev);
                netif_tx_unlock_bh(ndev);
-               netif_wake_queue(ndev);
-               napi_enable(&fep->napi);
                netif_device_attach(ndev);
+               napi_enable(&fep->napi);
                phy_start(fep->phy_dev);
        }
        rtnl_unlock();