aboutsummaryrefslogtreecommitdiffstats
path: root/net/core/ethtool.c
diff options
context:
space:
mode:
authorYuval Mintz <yuvalmin@broadcom.com>2012-06-06 13:13:06 -0400
committerDavid S. Miller <davem@davemloft.net>2012-06-07 16:18:54 -0400
commit80f12eccce775dc6bb93dba9b52529740f929237 (patch)
tree128d6e76e0140a6df12540b23adf0cc00c71f13a /net/core/ethtool.c
parent94b6042cfed02229b05e04002ab00085b60f8213 (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.c40
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
732static 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
753static 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
732static int ethtool_nway_reset(struct net_device *dev) 766static 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;