struct fec_enet_private *fep = netdev_priv(ndev);
        struct ethtool_keee *p = &fep->eee;
        unsigned int sleep_cycle, wake_cycle;
-       int ret = 0;
 
        if (enable) {
-               ret = phy_init_eee(ndev->phydev, false);
-               if (ret)
-                       return ret;
-
                sleep_cycle = fec_enet_us_to_tx_cycle(ndev, p->tx_lpi_timer);
                wake_cycle = sleep_cycle;
        } else {
                wake_cycle = 0;
        }
 
-       p->tx_lpi_enabled = enable;
-
        writel(sleep_cycle, fep->hwp + FEC_LPI_SLEEP);
        writel(wake_cycle, fep->hwp + FEC_LPI_WAKE);
 
                        netif_tx_unlock_bh(ndev);
                        napi_enable(&fep->napi);
                }
+               if (fep->quirks & FEC_QUIRK_HAS_EEE)
+                       fec_enet_eee_mode_set(ndev, phy_dev->enable_tx_lpi);
        } else {
                if (fep->link) {
                        netif_stop_queue(ndev);
        else
                phy_set_max_speed(phy_dev, 100);
 
+       if (fep->quirks & FEC_QUIRK_HAS_EEE)
+               phy_support_eee(phy_dev);
+
        fep->link = 0;
        fep->full_duplex = 0;
 
                return -ENETDOWN;
 
        edata->tx_lpi_timer = p->tx_lpi_timer;
-       edata->tx_lpi_enabled = p->tx_lpi_enabled;
 
        return phy_ethtool_get_eee(ndev->phydev, edata);
 }
 {
        struct fec_enet_private *fep = netdev_priv(ndev);
        struct ethtool_keee *p = &fep->eee;
-       int ret = 0;
 
        if (!(fep->quirks & FEC_QUIRK_HAS_EEE))
                return -EOPNOTSUPP;
 
        p->tx_lpi_timer = edata->tx_lpi_timer;
 
-       if (!edata->eee_enabled || !edata->tx_lpi_enabled ||
-           !edata->tx_lpi_timer)
-               ret = fec_enet_eee_mode_set(ndev, false);
-       else
-               ret = fec_enet_eee_mode_set(ndev, true);
-
-       if (ret)
-               return ret;
-
        return phy_ethtool_set_eee(ndev->phydev, edata);
 }