diff options
author | Yuval Mintz <yuvalmin@broadcom.com> | 2012-06-06 13:13:06 -0400 |
---|---|---|
committer | David S. Miller <davem@davemloft.net> | 2012-06-07 16:18:54 -0400 |
commit | 80f12eccce775dc6bb93dba9b52529740f929237 (patch) | |
tree | 128d6e76e0140a6df12540b23adf0cc00c71f13a /net/core/ethtool.c | |
parent | 94b6042cfed02229b05e04002ab00085b60f8213 (diff) |
Added kernel support in EEE Ethtool commands
This patch extends the kernel's ethtool interface by adding support
for 2 new EEE commands - get_eee and set_eee.
Thanks goes to Giuseppe Cavallaro for his original patch adding this support.
Signed-off-by: Yuval Mintz <yuvalmin@broadcom.com>
Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Reviewed-by: Ben Hutchings <bhutchings@solarflare.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Diffstat (limited to 'net/core/ethtool.c')
-rw-r--r-- | net/core/ethtool.c | 40 |
1 files changed, 40 insertions, 0 deletions
diff --git a/net/core/ethtool.c b/net/core/ethtool.c index 9c2afb480270..c73d0a59212c 100644 --- a/net/core/ethtool.c +++ b/net/core/ethtool.c | |||
@@ -729,6 +729,40 @@ static int ethtool_set_wol(struct net_device *dev, char __user *useraddr) | |||
729 | return dev->ethtool_ops->set_wol(dev, &wol); | 729 | return dev->ethtool_ops->set_wol(dev, &wol); |
730 | } | 730 | } |
731 | 731 | ||
732 | static int ethtool_get_eee(struct net_device *dev, char __user *useraddr) | ||
733 | { | ||
734 | struct ethtool_eee edata; | ||
735 | int rc; | ||
736 | |||
737 | if (!dev->ethtool_ops->get_eee) | ||
738 | return -EOPNOTSUPP; | ||
739 | |||
740 | memset(&edata, 0, sizeof(struct ethtool_eee)); | ||
741 | edata.cmd = ETHTOOL_GEEE; | ||
742 | rc = dev->ethtool_ops->get_eee(dev, &edata); | ||
743 | |||
744 | if (rc) | ||
745 | return rc; | ||
746 | |||
747 | if (copy_to_user(useraddr, &edata, sizeof(edata))) | ||
748 | return -EFAULT; | ||
749 | |||
750 | return 0; | ||
751 | } | ||
752 | |||
753 | static int ethtool_set_eee(struct net_device *dev, char __user *useraddr) | ||
754 | { | ||
755 | struct ethtool_eee edata; | ||
756 | |||
757 | if (!dev->ethtool_ops->set_eee) | ||
758 | return -EOPNOTSUPP; | ||
759 | |||
760 | if (copy_from_user(&edata, useraddr, sizeof(edata))) | ||
761 | return -EFAULT; | ||
762 | |||
763 | return dev->ethtool_ops->set_eee(dev, &edata); | ||
764 | } | ||
765 | |||
732 | static int ethtool_nway_reset(struct net_device *dev) | 766 | static int ethtool_nway_reset(struct net_device *dev) |
733 | { | 767 | { |
734 | if (!dev->ethtool_ops->nway_reset) | 768 | if (!dev->ethtool_ops->nway_reset) |
@@ -1471,6 +1505,12 @@ int dev_ethtool(struct net *net, struct ifreq *ifr) | |||
1471 | rc = ethtool_set_value_void(dev, useraddr, | 1505 | rc = ethtool_set_value_void(dev, useraddr, |
1472 | dev->ethtool_ops->set_msglevel); | 1506 | dev->ethtool_ops->set_msglevel); |
1473 | break; | 1507 | break; |
1508 | case ETHTOOL_GEEE: | ||
1509 | rc = ethtool_get_eee(dev, useraddr); | ||
1510 | break; | ||
1511 | case ETHTOOL_SEEE: | ||
1512 | rc = ethtool_set_eee(dev, useraddr); | ||
1513 | break; | ||
1474 | case ETHTOOL_NWAY_RST: | 1514 | case ETHTOOL_NWAY_RST: |
1475 | rc = ethtool_nway_reset(dev); | 1515 | rc = ethtool_nway_reset(dev); |
1476 | break; | 1516 | break; |