*/
 int phy_ethtool_set_eee(struct phy_device *phydev, struct ethtool_eee *data)
 {
-       int cap, adv;
+       int cap, old_adv, adv, ret;
 
        if (!phydev->drv)
                return -EIO;
        if (cap < 0)
                return cap;
 
+       old_adv = phy_read_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV);
+       if (old_adv < 0)
+               return old_adv;
+
        adv = ethtool_adv_to_mmd_eee_adv_t(data->advertised) & cap;
 
        /* Mask prohibited EEE modes */
        adv &= ~phydev->eee_broken_modes;
 
-       return phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, adv);
+       if (old_adv != adv) {
+               ret = phy_write_mmd(phydev, MDIO_MMD_AN, MDIO_AN_EEE_ADV, adv);
+               if (ret < 0)
+                       return ret;
+
+               /* Restart autonegotiation so the new modes get sent to the
+                * link partner.
+                */
+               ret = genphy_restart_aneg(phydev);
+               if (ret < 0)
+                       return ret;
+       }
+
+       return 0;
 }
 EXPORT_SYMBOL(phy_ethtool_set_eee);