if (fep->delay_work.timeout) {
                fep->delay_work.timeout = false;
+               rtnl_lock();
                fec_restart(fep->netdev, fep->full_duplex);
                netif_wake_queue(fep->netdev);
+               rtnl_unlock();
        }
 
        if (fep->delay_work.trig_tx) {
        struct net_device *ndev = dev_get_drvdata(dev);
        struct fec_enet_private *fep = netdev_priv(ndev);
 
+       rtnl_lock();
        if (netif_running(ndev)) {
                phy_stop(fep->phy_dev);
                fec_stop(ndev);
                netif_device_detach(ndev);
        }
+       rtnl_unlock();
+
        fec_enet_clk_enable(ndev, false);
        pinctrl_pm_select_sleep_state(&fep->pdev->dev);
 
        if (ret)
                goto failed_clk;
 
+       rtnl_lock();
        if (netif_running(ndev)) {
                fec_restart(ndev, fep->full_duplex);
                netif_device_attach(ndev);
                phy_start(fep->phy_dev);
        }
+       rtnl_unlock();
 
        return 0;