cpsw: ethtool: add support for getting/setting EEE registers
authorYegor Yefremov <yegorslists@googlemail.com>
Mon, 28 Nov 2016 08:41:33 +0000 (09:41 +0100)
committerDavid S. Miller <davem@davemloft.net>
Wed, 30 Nov 2016 15:04:10 +0000 (10:04 -0500)
Add the ability to query and set Energy Efficient Ethernet parameters
via ethtool for applicable devices.

This patch doesn't activate full EEE support in cpsw driver, but it
enables reading and writing EEE advertising settings. This way one
can disable advertising EEE for certain speeds.

Signed-off-by: Yegor Yefremov <yegorslists@googlemail.com>
Acked-by: Rami Rosen <roszenrami@gmail.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/ti/cpsw.c

index da40ea57705734e9632e2acb6cc3c06aa9b6403a..df87bfff04f8c3b84832b739e3980322725a8539 100644 (file)
@@ -2237,6 +2237,30 @@ err:
        return ret;
 }
 
+static int cpsw_get_eee(struct net_device *ndev, struct ethtool_eee *edata)
+{
+       struct cpsw_priv *priv = netdev_priv(ndev);
+       struct cpsw_common *cpsw = priv->cpsw;
+       int slave_no = cpsw_slave_index(cpsw, priv);
+
+       if (cpsw->slaves[slave_no].phy)
+               return phy_ethtool_get_eee(cpsw->slaves[slave_no].phy, edata);
+       else
+               return -EOPNOTSUPP;
+}
+
+static int cpsw_set_eee(struct net_device *ndev, struct ethtool_eee *edata)
+{
+       struct cpsw_priv *priv = netdev_priv(ndev);
+       struct cpsw_common *cpsw = priv->cpsw;
+       int slave_no = cpsw_slave_index(cpsw, priv);
+
+       if (cpsw->slaves[slave_no].phy)
+               return phy_ethtool_set_eee(cpsw->slaves[slave_no].phy, edata);
+       else
+               return -EOPNOTSUPP;
+}
+
 static const struct ethtool_ops cpsw_ethtool_ops = {
        .get_drvinfo    = cpsw_get_drvinfo,
        .get_msglevel   = cpsw_get_msglevel,
@@ -2260,6 +2284,8 @@ static const struct ethtool_ops cpsw_ethtool_ops = {
        .set_channels   = cpsw_set_channels,
        .get_link_ksettings     = cpsw_get_link_ksettings,
        .set_link_ksettings     = cpsw_set_link_ksettings,
+       .get_eee        = cpsw_get_eee,
+       .set_eee        = cpsw_set_eee,
 };
 
 static void cpsw_slave_init(struct cpsw_slave *slave, struct cpsw_common *cpsw,