aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/ethernet/broadcom/tg3.c
diff options
context:
space:
mode:
authorNithin Sujir <nsujir@broadcom.com>2013-05-18 02:26:55 -0400
committerDavid S. Miller <davem@davemloft.net>2013-05-20 03:13:48 -0400
commit1cbf9eb85a6601b58f01a71ff10299d2bf5d3365 (patch)
tree8383157b52d79cb6b44d7be54c3645e31d302988 /drivers/net/ethernet/broadcom/tg3.c
parent5b6c273ad6c3886f30c7c5df7009e489043c59f3 (diff)
tg3: Implement set/get_eee handlers
Reviewed-by: Ben Li <benli@broadcom.com> Signed-off-by: Michael Chan <mchan@broadcom.com> Signed-off-by: Nithin Nayak Sujir <nsujir@broadcom.com> Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'drivers/net/ethernet/broadcom/tg3.c')
-rw-r--r--drivers/net/ethernet/broadcom/tg3.c53
1 files changed, 53 insertions, 0 deletions
diff --git a/drivers/net/ethernet/broadcom/tg3.c b/drivers/net/ethernet/broadcom/tg3.c
index 2e4974823853..fb06aa120293 100644
--- a/drivers/net/ethernet/broadcom/tg3.c
+++ b/drivers/net/ethernet/broadcom/tg3.c
@@ -13618,6 +13618,57 @@ static int tg3_set_coalesce(struct net_device *dev, struct ethtool_coalesce *ec)
13618 return 0; 13618 return 0;
13619} 13619}
13620 13620
13621static int tg3_set_eee(struct net_device *dev, struct ethtool_eee *edata)
13622{
13623 struct tg3 *tp = netdev_priv(dev);
13624
13625 if (!(tp->phy_flags & TG3_PHYFLG_EEE_CAP)) {
13626 netdev_warn(tp->dev, "Board does not support EEE!\n");
13627 return -EOPNOTSUPP;
13628 }
13629
13630 if (edata->advertised != tp->eee.advertised) {
13631 netdev_warn(tp->dev,
13632 "Direct manipulation of EEE advertisement is not supported\n");
13633 return -EINVAL;
13634 }
13635
13636 if (edata->tx_lpi_timer > TG3_CPMU_DBTMR1_LNKIDLE_MAX) {
13637 netdev_warn(tp->dev,
13638 "Maximal Tx Lpi timer supported is %#x(u)\n",
13639 TG3_CPMU_DBTMR1_LNKIDLE_MAX);
13640 return -EINVAL;
13641 }
13642
13643 tp->eee = *edata;
13644
13645 tp->phy_flags |= TG3_PHYFLG_USER_CONFIGURED;
13646 tg3_warn_mgmt_link_flap(tp);
13647
13648 if (netif_running(tp->dev)) {
13649 tg3_full_lock(tp, 0);
13650 tg3_setup_eee(tp);
13651 tg3_phy_reset(tp);
13652 tg3_full_unlock(tp);
13653 }
13654
13655 return 0;
13656}
13657
13658static int tg3_get_eee(struct net_device *dev, struct ethtool_eee *edata)
13659{
13660 struct tg3 *tp = netdev_priv(dev);
13661
13662 if (!(tp->phy_flags & TG3_PHYFLG_EEE_CAP)) {
13663 netdev_warn(tp->dev,
13664 "Board does not support EEE!\n");
13665 return -EOPNOTSUPP;
13666 }
13667
13668 *edata = tp->eee;
13669 return 0;
13670}
13671
13621static const struct ethtool_ops tg3_ethtool_ops = { 13672static const struct ethtool_ops tg3_ethtool_ops = {
13622 .get_settings = tg3_get_settings, 13673 .get_settings = tg3_get_settings,
13623 .set_settings = tg3_set_settings, 13674 .set_settings = tg3_set_settings,
@@ -13651,6 +13702,8 @@ static const struct ethtool_ops tg3_ethtool_ops = {
13651 .get_channels = tg3_get_channels, 13702 .get_channels = tg3_get_channels,
13652 .set_channels = tg3_set_channels, 13703 .set_channels = tg3_set_channels,
13653 .get_ts_info = tg3_get_ts_info, 13704 .get_ts_info = tg3_get_ts_info,
13705 .get_eee = tg3_get_eee,
13706 .set_eee = tg3_set_eee,
13654}; 13707};
13655 13708
13656static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev, 13709static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev,