phy_stop(fep->phy_dev);
 
-       napi_disable(&fep->napi);
-       netif_tx_disable(ndev);
-       if (netif_device_present(ndev))
+       if (netif_device_present(ndev)) {
+               napi_disable(&fep->napi);
+               netif_tx_disable(ndev);
                fec_stop(ndev);
+       }
 
        phy_disconnect(fep->phy_dev);
        fep->phy_dev = NULL;
        rtnl_lock();
        if (netif_running(ndev)) {
                phy_stop(fep->phy_dev);
-               fec_stop(ndev);
+               napi_disable(&fep->napi);
+               netif_tx_lock_bh(ndev);
                netif_device_detach(ndev);
+               netif_tx_unlock_bh(ndev);
+               fec_stop(ndev);
        }
        rtnl_unlock();
 
 
        rtnl_lock();
        if (netif_running(ndev)) {
-               napi_disable(&fep->napi);
-               netif_tx_lock_bh(ndev);
                fec_restart(ndev, fep->full_duplex);
+               netif_tx_lock_bh(ndev);
                netif_device_attach(ndev);
                netif_tx_unlock_bh(ndev);
-               netif_device_attach(ndev);
                napi_enable(&fep->napi);
                phy_start(fep->phy_dev);
        }