]> Pileus Git - ~andy/linux/blobdiff - net/core/ethtool.c
time: Move update_vsyscall definitions to timekeeper_internal.h
[~andy/linux] / net / core / ethtool.c
index 9c2afb480270d0c8651e5f16d0b41dd58c694c51..cbf033dcaf1feb8b2cfc2610dad581e89bcdb061 100644 (file)
@@ -729,6 +729,40 @@ static int ethtool_set_wol(struct net_device *dev, char __user *useraddr)
        return dev->ethtool_ops->set_wol(dev, &wol);
 }
 
+static int ethtool_get_eee(struct net_device *dev, char __user *useraddr)
+{
+       struct ethtool_eee edata;
+       int rc;
+
+       if (!dev->ethtool_ops->get_eee)
+               return -EOPNOTSUPP;
+
+       memset(&edata, 0, sizeof(struct ethtool_eee));
+       edata.cmd = ETHTOOL_GEEE;
+       rc = dev->ethtool_ops->get_eee(dev, &edata);
+
+       if (rc)
+               return rc;
+
+       if (copy_to_user(useraddr, &edata, sizeof(edata)))
+               return -EFAULT;
+
+       return 0;
+}
+
+static int ethtool_set_eee(struct net_device *dev, char __user *useraddr)
+{
+       struct ethtool_eee edata;
+
+       if (!dev->ethtool_ops->set_eee)
+               return -EOPNOTSUPP;
+
+       if (copy_from_user(&edata, useraddr, sizeof(edata)))
+               return -EFAULT;
+
+       return dev->ethtool_ops->set_eee(dev, &edata);
+}
+
 static int ethtool_nway_reset(struct net_device *dev)
 {
        if (!dev->ethtool_ops->nway_reset)
@@ -1409,6 +1443,7 @@ int dev_ethtool(struct net *net, struct ifreq *ifr)
        case ETHTOOL_GSET:
        case ETHTOOL_GDRVINFO:
        case ETHTOOL_GMSGLVL:
+       case ETHTOOL_GLINK:
        case ETHTOOL_GCOALESCE:
        case ETHTOOL_GRINGPARAM:
        case ETHTOOL_GPAUSEPARAM:
@@ -1417,6 +1452,7 @@ int dev_ethtool(struct net *net, struct ifreq *ifr)
        case ETHTOOL_GSG:
        case ETHTOOL_GSSET_INFO:
        case ETHTOOL_GSTRINGS:
+       case ETHTOOL_GSTATS:
        case ETHTOOL_GTSO:
        case ETHTOOL_GPERMADDR:
        case ETHTOOL_GUFO:
@@ -1429,8 +1465,11 @@ int dev_ethtool(struct net *net, struct ifreq *ifr)
        case ETHTOOL_GRXCLSRLCNT:
        case ETHTOOL_GRXCLSRULE:
        case ETHTOOL_GRXCLSRLALL:
+       case ETHTOOL_GRXFHINDIR:
        case ETHTOOL_GFEATURES:
+       case ETHTOOL_GCHANNELS:
        case ETHTOOL_GET_TS_INFO:
+       case ETHTOOL_GEEE:
                break;
        default:
                if (!capable(CAP_NET_ADMIN))
@@ -1471,6 +1510,12 @@ int dev_ethtool(struct net *net, struct ifreq *ifr)
                rc = ethtool_set_value_void(dev, useraddr,
                                       dev->ethtool_ops->set_msglevel);
                break;
+       case ETHTOOL_GEEE:
+               rc = ethtool_get_eee(dev, useraddr);
+               break;
+       case ETHTOOL_SEEE:
+               rc = ethtool_set_eee(dev, useraddr);
+               break;
        case ETHTOOL_NWAY_RST:
                rc = ethtool_nway_reset(dev);
                break;