MVNETA_CAUSE_LINK_CHANGE);
 
        phylink_start(pp->phylink);
+
+       /* We may have called phy_speed_down before */
+       phy_speed_up(pp->dev->phydev);
+
        netif_tx_start_all_queues(pp->dev);
 }
 
 {
        unsigned int cpu;
 
+       if (device_may_wakeup(&pp->dev->dev))
+               phy_speed_down(pp->dev->phydev, false);
+
        phylink_stop(pp->phylink);
 
        if (!pp->neta_armada3700) {
        phylink_ethtool_get_wol(pp->phylink, &wol);
        device_set_wakeup_capable(&pp->dev->dev, !!wol.supported);
 
+       /* PHY WoL may be enabled but device wakeup disabled */
+       if (wol.supported)
+               device_set_wakeup_enable(&pp->dev->dev, !!wol.wolopts);
+
        return err;
 }