diff options
author | Nithin Sujir <nsujir@broadcom.com> | 2013-05-18 02:26:55 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2013-05-20 03:13:48 -0400 |
commit | 1cbf9eb85a6601b58f01a71ff10299d2bf5d3365 (patch) | |
tree | 8383157b52d79cb6b44d7be54c3645e31d302988 /drivers/net/ethernet/broadcom/tg3.c | |
parent | 5b6c273ad6c3886f30c7c5df7009e489043c59f3 (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.c | 53 |
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 | ||
13621 | static 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 | |||
13658 | static 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 | |||
13621 | static const struct ethtool_ops tg3_ethtool_ops = { | 13672 | static 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 | ||
13656 | static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev, | 13709 | static struct rtnl_link_stats64 *tg3_get_stats64(struct net_device *dev, |