Merge git://git.kernel.org/pub/scm/linux/kernel/git/netdev/net
[linux-2.6-microblaze.git] / drivers / net / ethernet / stmicro / stmmac / stmmac_ethtool.c
index 5cfc942..9e54f95 100644 (file)
@@ -692,6 +692,7 @@ static int stmmac_ethtool_op_get_eee(struct net_device *dev,
        edata->eee_enabled = priv->eee_enabled;
        edata->eee_active = priv->eee_active;
        edata->tx_lpi_timer = priv->tx_lpi_timer;
+       edata->tx_lpi_enabled = priv->tx_lpi_enabled;
 
        return phylink_ethtool_get_eee(priv->phylink, edata);
 }
@@ -702,24 +703,26 @@ static int stmmac_ethtool_op_set_eee(struct net_device *dev,
        struct stmmac_priv *priv = netdev_priv(dev);
        int ret;
 
-       if (!edata->eee_enabled) {
+       if (!priv->dma_cap.eee)
+               return -EOPNOTSUPP;
+
+       if (priv->tx_lpi_enabled != edata->tx_lpi_enabled)
+               netdev_warn(priv->dev,
+                           "Setting EEE tx-lpi is not supported\n");
+
+       if (!edata->eee_enabled)
                stmmac_disable_eee_mode(priv);
-       } else {
-               /* We are asking for enabling the EEE but it is safe
-                * to verify all by invoking the eee_init function.
-                * In case of failure it will return an error.
-                */
-               edata->eee_enabled = stmmac_eee_init(priv);
-               if (!edata->eee_enabled)
-                       return -EOPNOTSUPP;
-       }
 
        ret = phylink_ethtool_set_eee(priv->phylink, edata);
        if (ret)
                return ret;
 
-       priv->eee_enabled = edata->eee_enabled;
-       priv->tx_lpi_timer = edata->tx_lpi_timer;
+       if (edata->eee_enabled &&
+           priv->tx_lpi_timer != edata->tx_lpi_timer) {
+               priv->tx_lpi_timer = edata->tx_lpi_timer;
+               stmmac_eee_init(priv);
+       }
+
        return 0;
 }