linux/net/core/ethtool.c
<<
>>
Prefs
   1/*
   2 * net/core/ethtool.c - Ethtool ioctl handler
   3 * Copyright (c) 2003 Matthew Wilcox <matthew@wil.cx>
   4 *
   5 * This file is where we call all the ethtool_ops commands to get
   6 * the information ethtool needs.
   7 *
   8 * This program is free software; you can redistribute it and/or modify
   9 * it under the terms of the GNU General Public License as published by
  10 * the Free Software Foundation; either version 2 of the License, or
  11 * (at your option) any later version.
  12 */
  13
  14#include <linux/module.h>
  15#include <linux/types.h>
  16#include <linux/capability.h>
  17#include <linux/errno.h>
  18#include <linux/ethtool.h>
  19#include <linux/netdevice.h>
  20#include <linux/net_tstamp.h>
  21#include <linux/phy.h>
  22#include <linux/bitops.h>
  23#include <linux/uaccess.h>
  24#include <linux/vmalloc.h>
  25#include <linux/slab.h>
  26#include <linux/rtnetlink.h>
  27#include <linux/sched.h>
  28#include <linux/net.h>
  29
  30/*
  31 * Some useful ethtool_ops methods that're device independent.
  32 * If we find that all drivers want to do the same thing here,
  33 * we can turn these into dev_() function calls.
  34 */
  35
  36u32 ethtool_op_get_link(struct net_device *dev)
  37{
  38        return netif_carrier_ok(dev) ? 1 : 0;
  39}
  40EXPORT_SYMBOL(ethtool_op_get_link);
  41
  42int ethtool_op_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info)
  43{
  44        info->so_timestamping =
  45                SOF_TIMESTAMPING_TX_SOFTWARE |
  46                SOF_TIMESTAMPING_RX_SOFTWARE |
  47                SOF_TIMESTAMPING_SOFTWARE;
  48        info->phc_index = -1;
  49        return 0;
  50}
  51EXPORT_SYMBOL(ethtool_op_get_ts_info);
  52
  53/* Handlers for each ethtool command */
  54
  55#define ETHTOOL_DEV_FEATURE_WORDS       ((NETDEV_FEATURE_COUNT + 31) / 32)
  56
  57static const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN] = {
  58        [NETIF_F_SG_BIT] =               "tx-scatter-gather",
  59        [NETIF_F_IP_CSUM_BIT] =          "tx-checksum-ipv4",
  60        [NETIF_F_HW_CSUM_BIT] =          "tx-checksum-ip-generic",
  61        [NETIF_F_IPV6_CSUM_BIT] =        "tx-checksum-ipv6",
  62        [NETIF_F_HIGHDMA_BIT] =          "highdma",
  63        [NETIF_F_FRAGLIST_BIT] =         "tx-scatter-gather-fraglist",
  64        [NETIF_F_HW_VLAN_CTAG_TX_BIT] =  "tx-vlan-hw-insert",
  65
  66        [NETIF_F_HW_VLAN_CTAG_RX_BIT] =  "rx-vlan-hw-parse",
  67        [NETIF_F_HW_VLAN_CTAG_FILTER_BIT] = "rx-vlan-filter",
  68        [NETIF_F_HW_VLAN_STAG_TX_BIT] =  "tx-vlan-stag-hw-insert",
  69        [NETIF_F_HW_VLAN_STAG_RX_BIT] =  "rx-vlan-stag-hw-parse",
  70        [NETIF_F_HW_VLAN_STAG_FILTER_BIT] = "rx-vlan-stag-filter",
  71        [NETIF_F_VLAN_CHALLENGED_BIT] =  "vlan-challenged",
  72        [NETIF_F_GSO_BIT] =              "tx-generic-segmentation",
  73        [NETIF_F_LLTX_BIT] =             "tx-lockless",
  74        [NETIF_F_NETNS_LOCAL_BIT] =      "netns-local",
  75        [NETIF_F_GRO_BIT] =              "rx-gro",
  76        [NETIF_F_LRO_BIT] =              "rx-lro",
  77
  78        [NETIF_F_TSO_BIT] =              "tx-tcp-segmentation",
  79        [NETIF_F_UFO_BIT] =              "tx-udp-fragmentation",
  80        [NETIF_F_GSO_ROBUST_BIT] =       "tx-gso-robust",
  81        [NETIF_F_TSO_ECN_BIT] =          "tx-tcp-ecn-segmentation",
  82        [NETIF_F_TSO_MANGLEID_BIT] =     "tx-tcp-mangleid-segmentation",
  83        [NETIF_F_TSO6_BIT] =             "tx-tcp6-segmentation",
  84        [NETIF_F_FSO_BIT] =              "tx-fcoe-segmentation",
  85        [NETIF_F_GSO_GRE_BIT] =          "tx-gre-segmentation",
  86        [NETIF_F_GSO_GRE_CSUM_BIT] =     "tx-gre-csum-segmentation",
  87        [NETIF_F_GSO_IPXIP4_BIT] =       "tx-ipxip4-segmentation",
  88        [NETIF_F_GSO_IPXIP6_BIT] =       "tx-ipxip6-segmentation",
  89        [NETIF_F_GSO_UDP_TUNNEL_BIT] =   "tx-udp_tnl-segmentation",
  90        [NETIF_F_GSO_UDP_TUNNEL_CSUM_BIT] = "tx-udp_tnl-csum-segmentation",
  91        [NETIF_F_GSO_PARTIAL_BIT] =      "tx-gso-partial",
  92        [NETIF_F_GSO_SCTP_BIT] =         "tx-sctp-segmentation",
  93
  94        [NETIF_F_FCOE_CRC_BIT] =         "tx-checksum-fcoe-crc",
  95        [NETIF_F_SCTP_CRC_BIT] =        "tx-checksum-sctp",
  96        [NETIF_F_FCOE_MTU_BIT] =         "fcoe-mtu",
  97        [NETIF_F_NTUPLE_BIT] =           "rx-ntuple-filter",
  98        [NETIF_F_RXHASH_BIT] =           "rx-hashing",
  99        [NETIF_F_RXCSUM_BIT] =           "rx-checksum",
 100        [NETIF_F_NOCACHE_COPY_BIT] =     "tx-nocache-copy",
 101        [NETIF_F_LOOPBACK_BIT] =         "loopback",
 102        [NETIF_F_RXFCS_BIT] =            "rx-fcs",
 103        [NETIF_F_RXALL_BIT] =            "rx-all",
 104        [NETIF_F_HW_L2FW_DOFFLOAD_BIT] = "l2-fwd-offload",
 105        [NETIF_F_BUSY_POLL_BIT] =        "busy-poll",
 106        [NETIF_F_HW_TC_BIT] =            "hw-tc-offload",
 107};
 108
 109static const char
 110rss_hash_func_strings[ETH_RSS_HASH_FUNCS_COUNT][ETH_GSTRING_LEN] = {
 111        [ETH_RSS_HASH_TOP_BIT] =        "toeplitz",
 112        [ETH_RSS_HASH_XOR_BIT] =        "xor",
 113};
 114
 115static const char
 116tunable_strings[__ETHTOOL_TUNABLE_COUNT][ETH_GSTRING_LEN] = {
 117        [ETHTOOL_ID_UNSPEC]     = "Unspec",
 118        [ETHTOOL_RX_COPYBREAK]  = "rx-copybreak",
 119        [ETHTOOL_TX_COPYBREAK]  = "tx-copybreak",
 120};
 121
 122static int ethtool_get_features(struct net_device *dev, void __user *useraddr)
 123{
 124        struct ethtool_gfeatures cmd = {
 125                .cmd = ETHTOOL_GFEATURES,
 126                .size = ETHTOOL_DEV_FEATURE_WORDS,
 127        };
 128        struct ethtool_get_features_block features[ETHTOOL_DEV_FEATURE_WORDS];
 129        u32 __user *sizeaddr;
 130        u32 copy_size;
 131        int i;
 132
 133        /* in case feature bits run out again */
 134        BUILD_BUG_ON(ETHTOOL_DEV_FEATURE_WORDS * sizeof(u32) > sizeof(netdev_features_t));
 135
 136        for (i = 0; i < ETHTOOL_DEV_FEATURE_WORDS; ++i) {
 137                features[i].available = (u32)(dev->hw_features >> (32 * i));
 138                features[i].requested = (u32)(dev->wanted_features >> (32 * i));
 139                features[i].active = (u32)(dev->features >> (32 * i));
 140                features[i].never_changed =
 141                        (u32)(NETIF_F_NEVER_CHANGE >> (32 * i));
 142        }
 143
 144        sizeaddr = useraddr + offsetof(struct ethtool_gfeatures, size);
 145        if (get_user(copy_size, sizeaddr))
 146                return -EFAULT;
 147
 148        if (copy_size > ETHTOOL_DEV_FEATURE_WORDS)
 149                copy_size = ETHTOOL_DEV_FEATURE_WORDS;
 150
 151        if (copy_to_user(useraddr, &cmd, sizeof(cmd)))
 152                return -EFAULT;
 153        useraddr += sizeof(cmd);
 154        if (copy_to_user(useraddr, features, copy_size * sizeof(*features)))
 155                return -EFAULT;
 156
 157        return 0;
 158}
 159
 160static int ethtool_set_features(struct net_device *dev, void __user *useraddr)
 161{
 162        struct ethtool_sfeatures cmd;
 163        struct ethtool_set_features_block features[ETHTOOL_DEV_FEATURE_WORDS];
 164        netdev_features_t wanted = 0, valid = 0;
 165        int i, ret = 0;
 166
 167        if (copy_from_user(&cmd, useraddr, sizeof(cmd)))
 168                return -EFAULT;
 169        useraddr += sizeof(cmd);
 170
 171        if (cmd.size != ETHTOOL_DEV_FEATURE_WORDS)
 172                return -EINVAL;
 173
 174        if (copy_from_user(features, useraddr, sizeof(features)))
 175                return -EFAULT;
 176
 177        for (i = 0; i < ETHTOOL_DEV_FEATURE_WORDS; ++i) {
 178                valid |= (netdev_features_t)features[i].valid << (32 * i);
 179                wanted |= (netdev_features_t)features[i].requested << (32 * i);
 180        }
 181
 182        if (valid & ~NETIF_F_ETHTOOL_BITS)
 183                return -EINVAL;
 184
 185        if (valid & ~dev->hw_features) {
 186                valid &= dev->hw_features;
 187                ret |= ETHTOOL_F_UNSUPPORTED;
 188        }
 189
 190        dev->wanted_features &= ~valid;
 191        dev->wanted_features |= wanted & valid;
 192        __netdev_update_features(dev);
 193
 194        if ((dev->wanted_features ^ dev->features) & valid)
 195                ret |= ETHTOOL_F_WISH;
 196
 197        return ret;
 198}
 199
 200static int phy_get_sset_count(struct phy_device *phydev)
 201{
 202        int ret;
 203
 204        if (phydev->drv->get_sset_count &&
 205            phydev->drv->get_strings &&
 206            phydev->drv->get_stats) {
 207                mutex_lock(&phydev->lock);
 208                ret = phydev->drv->get_sset_count(phydev);
 209                mutex_unlock(&phydev->lock);
 210
 211                return ret;
 212        }
 213
 214        return -EOPNOTSUPP;
 215}
 216
 217static int __ethtool_get_sset_count(struct net_device *dev, int sset)
 218{
 219        const struct ethtool_ops *ops = dev->ethtool_ops;
 220
 221        if (sset == ETH_SS_FEATURES)
 222                return ARRAY_SIZE(netdev_features_strings);
 223
 224        if (sset == ETH_SS_RSS_HASH_FUNCS)
 225                return ARRAY_SIZE(rss_hash_func_strings);
 226
 227        if (sset == ETH_SS_TUNABLES)
 228                return ARRAY_SIZE(tunable_strings);
 229
 230        if (sset == ETH_SS_PHY_STATS) {
 231                if (dev->phydev)
 232                        return phy_get_sset_count(dev->phydev);
 233                else
 234                        return -EOPNOTSUPP;
 235        }
 236
 237        if (ops->get_sset_count && ops->get_strings)
 238                return ops->get_sset_count(dev, sset);
 239        else
 240                return -EOPNOTSUPP;
 241}
 242
 243static void __ethtool_get_strings(struct net_device *dev,
 244        u32 stringset, u8 *data)
 245{
 246        const struct ethtool_ops *ops = dev->ethtool_ops;
 247
 248        if (stringset == ETH_SS_FEATURES)
 249                memcpy(data, netdev_features_strings,
 250                        sizeof(netdev_features_strings));
 251        else if (stringset == ETH_SS_RSS_HASH_FUNCS)
 252                memcpy(data, rss_hash_func_strings,
 253                       sizeof(rss_hash_func_strings));
 254        else if (stringset == ETH_SS_TUNABLES)
 255                memcpy(data, tunable_strings, sizeof(tunable_strings));
 256        else if (stringset == ETH_SS_PHY_STATS) {
 257                struct phy_device *phydev = dev->phydev;
 258
 259                if (phydev) {
 260                        mutex_lock(&phydev->lock);
 261                        phydev->drv->get_strings(phydev, data);
 262                        mutex_unlock(&phydev->lock);
 263                } else {
 264                        return;
 265                }
 266        } else
 267                /* ops->get_strings is valid because checked earlier */
 268                ops->get_strings(dev, stringset, data);
 269}
 270
 271static netdev_features_t ethtool_get_feature_mask(u32 eth_cmd)
 272{
 273        /* feature masks of legacy discrete ethtool ops */
 274
 275        switch (eth_cmd) {
 276        case ETHTOOL_GTXCSUM:
 277        case ETHTOOL_STXCSUM:
 278                return NETIF_F_CSUM_MASK | NETIF_F_SCTP_CRC;
 279        case ETHTOOL_GRXCSUM:
 280        case ETHTOOL_SRXCSUM:
 281                return NETIF_F_RXCSUM;
 282        case ETHTOOL_GSG:
 283        case ETHTOOL_SSG:
 284                return NETIF_F_SG;
 285        case ETHTOOL_GTSO:
 286        case ETHTOOL_STSO:
 287                return NETIF_F_ALL_TSO;
 288        case ETHTOOL_GUFO:
 289        case ETHTOOL_SUFO:
 290                return NETIF_F_UFO;
 291        case ETHTOOL_GGSO:
 292        case ETHTOOL_SGSO:
 293                return NETIF_F_GSO;
 294        case ETHTOOL_GGRO:
 295        case ETHTOOL_SGRO:
 296                return NETIF_F_GRO;
 297        default:
 298                BUG();
 299        }
 300}
 301
 302static int ethtool_get_one_feature(struct net_device *dev,
 303        char __user *useraddr, u32 ethcmd)
 304{
 305        netdev_features_t mask = ethtool_get_feature_mask(ethcmd);
 306        struct ethtool_value edata = {
 307                .cmd = ethcmd,
 308                .data = !!(dev->features & mask),
 309        };
 310
 311        if (copy_to_user(useraddr, &edata, sizeof(edata)))
 312                return -EFAULT;
 313        return 0;
 314}
 315
 316static int ethtool_set_one_feature(struct net_device *dev,
 317        void __user *useraddr, u32 ethcmd)
 318{
 319        struct ethtool_value edata;
 320        netdev_features_t mask;
 321
 322        if (copy_from_user(&edata, useraddr, sizeof(edata)))
 323                return -EFAULT;
 324
 325        mask = ethtool_get_feature_mask(ethcmd);
 326        mask &= dev->hw_features;
 327        if (!mask)
 328                return -EOPNOTSUPP;
 329
 330        if (edata.data)
 331                dev->wanted_features |= mask;
 332        else
 333                dev->wanted_features &= ~mask;
 334
 335        __netdev_update_features(dev);
 336
 337        return 0;
 338}
 339
 340#define ETH_ALL_FLAGS    (ETH_FLAG_LRO | ETH_FLAG_RXVLAN | ETH_FLAG_TXVLAN | \
 341                          ETH_FLAG_NTUPLE | ETH_FLAG_RXHASH)
 342#define ETH_ALL_FEATURES (NETIF_F_LRO | NETIF_F_HW_VLAN_CTAG_RX | \
 343                          NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_NTUPLE | \
 344                          NETIF_F_RXHASH)
 345
 346static u32 __ethtool_get_flags(struct net_device *dev)
 347{
 348        u32 flags = 0;
 349
 350        if (dev->features & NETIF_F_LRO)
 351                flags |= ETH_FLAG_LRO;
 352        if (dev->features & NETIF_F_HW_VLAN_CTAG_RX)
 353                flags |= ETH_FLAG_RXVLAN;
 354        if (dev->features & NETIF_F_HW_VLAN_CTAG_TX)
 355                flags |= ETH_FLAG_TXVLAN;
 356        if (dev->features & NETIF_F_NTUPLE)
 357                flags |= ETH_FLAG_NTUPLE;
 358        if (dev->features & NETIF_F_RXHASH)
 359                flags |= ETH_FLAG_RXHASH;
 360
 361        return flags;
 362}
 363
 364static int __ethtool_set_flags(struct net_device *dev, u32 data)
 365{
 366        netdev_features_t features = 0, changed;
 367
 368        if (data & ~ETH_ALL_FLAGS)
 369                return -EINVAL;
 370
 371        if (data & ETH_FLAG_LRO)
 372                features |= NETIF_F_LRO;
 373        if (data & ETH_FLAG_RXVLAN)
 374                features |= NETIF_F_HW_VLAN_CTAG_RX;
 375        if (data & ETH_FLAG_TXVLAN)
 376                features |= NETIF_F_HW_VLAN_CTAG_TX;
 377        if (data & ETH_FLAG_NTUPLE)
 378                features |= NETIF_F_NTUPLE;
 379        if (data & ETH_FLAG_RXHASH)
 380                features |= NETIF_F_RXHASH;
 381
 382        /* allow changing only bits set in hw_features */
 383        changed = (features ^ dev->features) & ETH_ALL_FEATURES;
 384        if (changed & ~dev->hw_features)
 385                return (changed & dev->hw_features) ? -EINVAL : -EOPNOTSUPP;
 386
 387        dev->wanted_features =
 388                (dev->wanted_features & ~changed) | (features & changed);
 389
 390        __netdev_update_features(dev);
 391
 392        return 0;
 393}
 394
 395void ethtool_convert_legacy_u32_to_link_mode(unsigned long *dst,
 396                                             u32 legacy_u32)
 397{
 398        bitmap_zero(dst, __ETHTOOL_LINK_MODE_MASK_NBITS);
 399        dst[0] = legacy_u32;
 400}
 401EXPORT_SYMBOL(ethtool_convert_legacy_u32_to_link_mode);
 402
 403/* return false if src had higher bits set. lower bits always updated. */
 404bool ethtool_convert_link_mode_to_legacy_u32(u32 *legacy_u32,
 405                                             const unsigned long *src)
 406{
 407        bool retval = true;
 408
 409        /* TODO: following test will soon always be true */
 410        if (__ETHTOOL_LINK_MODE_MASK_NBITS > 32) {
 411                __ETHTOOL_DECLARE_LINK_MODE_MASK(ext);
 412
 413                bitmap_zero(ext, __ETHTOOL_LINK_MODE_MASK_NBITS);
 414                bitmap_fill(ext, 32);
 415                bitmap_complement(ext, ext, __ETHTOOL_LINK_MODE_MASK_NBITS);
 416                if (bitmap_intersects(ext, src,
 417                                      __ETHTOOL_LINK_MODE_MASK_NBITS)) {
 418                        /* src mask goes beyond bit 31 */
 419                        retval = false;
 420                }
 421        }
 422        *legacy_u32 = src[0];
 423        return retval;
 424}
 425EXPORT_SYMBOL(ethtool_convert_link_mode_to_legacy_u32);
 426
 427/* return false if legacy contained non-0 deprecated fields
 428 * transceiver/maxtxpkt/maxrxpkt. rest of ksettings always updated
 429 */
 430static bool
 431convert_legacy_settings_to_link_ksettings(
 432        struct ethtool_link_ksettings *link_ksettings,
 433        const struct ethtool_cmd *legacy_settings)
 434{
 435        bool retval = true;
 436
 437        memset(link_ksettings, 0, sizeof(*link_ksettings));
 438
 439        /* This is used to tell users that driver is still using these
 440         * deprecated legacy fields, and they should not use
 441         * %ETHTOOL_GLINKSETTINGS/%ETHTOOL_SLINKSETTINGS
 442         */
 443        if (legacy_settings->transceiver ||
 444            legacy_settings->maxtxpkt ||
 445            legacy_settings->maxrxpkt)
 446                retval = false;
 447
 448        ethtool_convert_legacy_u32_to_link_mode(
 449                link_ksettings->link_modes.supported,
 450                legacy_settings->supported);
 451        ethtool_convert_legacy_u32_to_link_mode(
 452                link_ksettings->link_modes.advertising,
 453                legacy_settings->advertising);
 454        ethtool_convert_legacy_u32_to_link_mode(
 455                link_ksettings->link_modes.lp_advertising,
 456                legacy_settings->lp_advertising);
 457        link_ksettings->base.speed
 458                = ethtool_cmd_speed(legacy_settings);
 459        link_ksettings->base.duplex
 460                = legacy_settings->duplex;
 461        link_ksettings->base.port
 462                = legacy_settings->port;
 463        link_ksettings->base.phy_address
 464                = legacy_settings->phy_address;
 465        link_ksettings->base.autoneg
 466                = legacy_settings->autoneg;
 467        link_ksettings->base.mdio_support
 468                = legacy_settings->mdio_support;
 469        link_ksettings->base.eth_tp_mdix
 470                = legacy_settings->eth_tp_mdix;
 471        link_ksettings->base.eth_tp_mdix_ctrl
 472                = legacy_settings->eth_tp_mdix_ctrl;
 473        return retval;
 474}
 475
 476/* return false if ksettings link modes had higher bits
 477 * set. legacy_settings always updated (best effort)
 478 */
 479static bool
 480convert_link_ksettings_to_legacy_settings(
 481        struct ethtool_cmd *legacy_settings,
 482        const struct ethtool_link_ksettings *link_ksettings)
 483{
 484        bool retval = true;
 485
 486        memset(legacy_settings, 0, sizeof(*legacy_settings));
 487        /* this also clears the deprecated fields in legacy structure:
 488         * __u8         transceiver;
 489         * __u32        maxtxpkt;
 490         * __u32        maxrxpkt;
 491         */
 492
 493        retval &= ethtool_convert_link_mode_to_legacy_u32(
 494                &legacy_settings->supported,
 495                link_ksettings->link_modes.supported);
 496        retval &= ethtool_convert_link_mode_to_legacy_u32(
 497                &legacy_settings->advertising,
 498                link_ksettings->link_modes.advertising);
 499        retval &= ethtool_convert_link_mode_to_legacy_u32(
 500                &legacy_settings->lp_advertising,
 501                link_ksettings->link_modes.lp_advertising);
 502        ethtool_cmd_speed_set(legacy_settings, link_ksettings->base.speed);
 503        legacy_settings->duplex
 504                = link_ksettings->base.duplex;
 505        legacy_settings->port
 506                = link_ksettings->base.port;
 507        legacy_settings->phy_address
 508                = link_ksettings->base.phy_address;
 509        legacy_settings->autoneg
 510                = link_ksettings->base.autoneg;
 511        legacy_settings->mdio_support
 512                = link_ksettings->base.mdio_support;
 513        legacy_settings->eth_tp_mdix
 514                = link_ksettings->base.eth_tp_mdix;
 515        legacy_settings->eth_tp_mdix_ctrl
 516                = link_ksettings->base.eth_tp_mdix_ctrl;
 517        return retval;
 518}
 519
 520/* number of 32-bit words to store the user's link mode bitmaps */
 521#define __ETHTOOL_LINK_MODE_MASK_NU32                   \
 522        DIV_ROUND_UP(__ETHTOOL_LINK_MODE_MASK_NBITS, 32)
 523
 524/* layout of the struct passed from/to userland */
 525struct ethtool_link_usettings {
 526        struct ethtool_link_settings base;
 527        struct {
 528                __u32 supported[__ETHTOOL_LINK_MODE_MASK_NU32];
 529                __u32 advertising[__ETHTOOL_LINK_MODE_MASK_NU32];
 530                __u32 lp_advertising[__ETHTOOL_LINK_MODE_MASK_NU32];
 531        } link_modes;
 532};
 533
 534/* Internal kernel helper to query a device ethtool_link_settings.
 535 *
 536 * Backward compatibility note: for compatibility with legacy drivers
 537 * that implement only the ethtool_cmd API, this has to work with both
 538 * drivers implementing get_link_ksettings API and drivers
 539 * implementing get_settings API. When drivers implement get_settings
 540 * and report ethtool_cmd deprecated fields
 541 * (transceiver/maxrxpkt/maxtxpkt), these fields are silently ignored
 542 * because the resulting struct ethtool_link_settings does not report them.
 543 */
 544int __ethtool_get_link_ksettings(struct net_device *dev,
 545                                 struct ethtool_link_ksettings *link_ksettings)
 546{
 547        int err;
 548        struct ethtool_cmd cmd;
 549
 550        ASSERT_RTNL();
 551
 552        if (dev->ethtool_ops->get_link_ksettings) {
 553                memset(link_ksettings, 0, sizeof(*link_ksettings));
 554                return dev->ethtool_ops->get_link_ksettings(dev,
 555                                                            link_ksettings);
 556        }
 557
 558        /* driver doesn't support %ethtool_link_ksettings API. revert to
 559         * legacy %ethtool_cmd API, unless it's not supported either.
 560         * TODO: remove when ethtool_ops::get_settings disappears internally
 561         */
 562        if (!dev->ethtool_ops->get_settings)
 563                return -EOPNOTSUPP;
 564
 565        memset(&cmd, 0, sizeof(cmd));
 566        cmd.cmd = ETHTOOL_GSET;
 567        err = dev->ethtool_ops->get_settings(dev, &cmd);
 568        if (err < 0)
 569                return err;
 570
 571        /* we ignore deprecated fields transceiver/maxrxpkt/maxtxpkt
 572         */
 573        convert_legacy_settings_to_link_ksettings(link_ksettings, &cmd);
 574        return err;
 575}
 576EXPORT_SYMBOL(__ethtool_get_link_ksettings);
 577
 578/* convert ethtool_link_usettings in user space to a kernel internal
 579 * ethtool_link_ksettings. return 0 on success, errno on error.
 580 */
 581static int load_link_ksettings_from_user(struct ethtool_link_ksettings *to,
 582                                         const void __user *from)
 583{
 584        struct ethtool_link_usettings link_usettings;
 585
 586        if (copy_from_user(&link_usettings, from, sizeof(link_usettings)))
 587                return -EFAULT;
 588
 589        memcpy(&to->base, &link_usettings.base, sizeof(to->base));
 590        bitmap_from_u32array(to->link_modes.supported,
 591                             __ETHTOOL_LINK_MODE_MASK_NBITS,
 592                             link_usettings.link_modes.supported,
 593                             __ETHTOOL_LINK_MODE_MASK_NU32);
 594        bitmap_from_u32array(to->link_modes.advertising,
 595                             __ETHTOOL_LINK_MODE_MASK_NBITS,
 596                             link_usettings.link_modes.advertising,
 597                             __ETHTOOL_LINK_MODE_MASK_NU32);
 598        bitmap_from_u32array(to->link_modes.lp_advertising,
 599                             __ETHTOOL_LINK_MODE_MASK_NBITS,
 600                             link_usettings.link_modes.lp_advertising,
 601                             __ETHTOOL_LINK_MODE_MASK_NU32);
 602
 603        return 0;
 604}
 605
 606/* convert a kernel internal ethtool_link_ksettings to
 607 * ethtool_link_usettings in user space. return 0 on success, errno on
 608 * error.
 609 */
 610static int
 611store_link_ksettings_for_user(void __user *to,
 612                              const struct ethtool_link_ksettings *from)
 613{
 614        struct ethtool_link_usettings link_usettings;
 615
 616        memcpy(&link_usettings.base, &from->base, sizeof(link_usettings));
 617        bitmap_to_u32array(link_usettings.link_modes.supported,
 618                           __ETHTOOL_LINK_MODE_MASK_NU32,
 619                           from->link_modes.supported,
 620                           __ETHTOOL_LINK_MODE_MASK_NBITS);
 621        bitmap_to_u32array(link_usettings.link_modes.advertising,
 622                           __ETHTOOL_LINK_MODE_MASK_NU32,
 623                           from->link_modes.advertising,
 624                           __ETHTOOL_LINK_MODE_MASK_NBITS);
 625        bitmap_to_u32array(link_usettings.link_modes.lp_advertising,
 626                           __ETHTOOL_LINK_MODE_MASK_NU32,
 627                           from->link_modes.lp_advertising,
 628                           __ETHTOOL_LINK_MODE_MASK_NBITS);
 629
 630        if (copy_to_user(to, &link_usettings, sizeof(link_usettings)))
 631                return -EFAULT;
 632
 633        return 0;
 634}
 635
 636/* Query device for its ethtool_link_settings.
 637 *
 638 * Backward compatibility note: this function must fail when driver
 639 * does not implement ethtool::get_link_ksettings, even if legacy
 640 * ethtool_ops::get_settings is implemented. This tells new versions
 641 * of ethtool that they should use the legacy API %ETHTOOL_GSET for
 642 * this driver, so that they can correctly access the ethtool_cmd
 643 * deprecated fields (transceiver/maxrxpkt/maxtxpkt), until no driver
 644 * implements ethtool_ops::get_settings anymore.
 645 */
 646static int ethtool_get_link_ksettings(struct net_device *dev,
 647                                      void __user *useraddr)
 648{
 649        int err = 0;
 650        struct ethtool_link_ksettings link_ksettings;
 651
 652        ASSERT_RTNL();
 653
 654        if (!dev->ethtool_ops->get_link_ksettings)
 655                return -EOPNOTSUPP;
 656
 657        /* handle bitmap nbits handshake */
 658        if (copy_from_user(&link_ksettings.base, useraddr,
 659                           sizeof(link_ksettings.base)))
 660                return -EFAULT;
 661
 662        if (__ETHTOOL_LINK_MODE_MASK_NU32
 663            != link_ksettings.base.link_mode_masks_nwords) {
 664                /* wrong link mode nbits requested */
 665                memset(&link_ksettings, 0, sizeof(link_ksettings));
 666                link_ksettings.base.cmd = ETHTOOL_GLINKSETTINGS;
 667                /* send back number of words required as negative val */
 668                compiletime_assert(__ETHTOOL_LINK_MODE_MASK_NU32 <= S8_MAX,
 669                                   "need too many bits for link modes!");
 670                link_ksettings.base.link_mode_masks_nwords
 671                        = -((s8)__ETHTOOL_LINK_MODE_MASK_NU32);
 672
 673                /* copy the base fields back to user, not the link
 674                 * mode bitmaps
 675                 */
 676                if (copy_to_user(useraddr, &link_ksettings.base,
 677                                 sizeof(link_ksettings.base)))
 678                        return -EFAULT;
 679
 680                return 0;
 681        }
 682
 683        /* handshake successful: user/kernel agree on
 684         * link_mode_masks_nwords
 685         */
 686
 687        memset(&link_ksettings, 0, sizeof(link_ksettings));
 688        err = dev->ethtool_ops->get_link_ksettings(dev, &link_ksettings);
 689        if (err < 0)
 690                return err;
 691
 692        /* make sure we tell the right values to user */
 693        link_ksettings.base.cmd = ETHTOOL_GLINKSETTINGS;
 694        link_ksettings.base.link_mode_masks_nwords
 695                = __ETHTOOL_LINK_MODE_MASK_NU32;
 696
 697        return store_link_ksettings_for_user(useraddr, &link_ksettings);
 698}
 699
 700/* Update device ethtool_link_settings.
 701 *
 702 * Backward compatibility note: this function must fail when driver
 703 * does not implement ethtool::set_link_ksettings, even if legacy
 704 * ethtool_ops::set_settings is implemented. This tells new versions
 705 * of ethtool that they should use the legacy API %ETHTOOL_SSET for
 706 * this driver, so that they can correctly update the ethtool_cmd
 707 * deprecated fields (transceiver/maxrxpkt/maxtxpkt), until no driver
 708 * implements ethtool_ops::get_settings anymore.
 709 */
 710static int ethtool_set_link_ksettings(struct net_device *dev,
 711                                      void __user *useraddr)
 712{
 713        int err;
 714        struct ethtool_link_ksettings link_ksettings;
 715
 716        ASSERT_RTNL();
 717
 718        if (!dev->ethtool_ops->set_link_ksettings)
 719                return -EOPNOTSUPP;
 720
 721        /* make sure nbits field has expected value */
 722        if (copy_from_user(&link_ksettings.base, useraddr,
 723                           sizeof(link_ksettings.base)))
 724                return -EFAULT;
 725
 726        if (__ETHTOOL_LINK_MODE_MASK_NU32
 727            != link_ksettings.base.link_mode_masks_nwords)
 728                return -EINVAL;
 729
 730        /* copy the whole structure, now that we know it has expected
 731         * format
 732         */
 733        err = load_link_ksettings_from_user(&link_ksettings, useraddr);
 734        if (err)
 735                return err;
 736
 737        /* re-check nwords field, just in case */
 738        if (__ETHTOOL_LINK_MODE_MASK_NU32
 739            != link_ksettings.base.link_mode_masks_nwords)
 740                return -EINVAL;
 741
 742        return dev->ethtool_ops->set_link_ksettings(dev, &link_ksettings);
 743}
 744
 745static void
 746warn_incomplete_ethtool_legacy_settings_conversion(const char *details)
 747{
 748        char name[sizeof(current->comm)];
 749
 750        pr_info_once("warning: `%s' uses legacy ethtool link settings API, %s\n",
 751                     get_task_comm(name, current), details);
 752}
 753
 754/* Query device for its ethtool_cmd settings.
 755 *
 756 * Backward compatibility note: for compatibility with legacy ethtool,
 757 * this has to work with both drivers implementing get_link_ksettings
 758 * API and drivers implementing get_settings API. When drivers
 759 * implement get_link_ksettings and report higher link mode bits, a
 760 * kernel warning is logged once (with name of 1st driver/device) to
 761 * recommend user to upgrade ethtool, but the command is successful
 762 * (only the lower link mode bits reported back to user).
 763 */
 764static int ethtool_get_settings(struct net_device *dev, void __user *useraddr)
 765{
 766        struct ethtool_cmd cmd;
 767
 768        ASSERT_RTNL();
 769
 770        if (dev->ethtool_ops->get_link_ksettings) {
 771                /* First, use link_ksettings API if it is supported */
 772                int err;
 773                struct ethtool_link_ksettings link_ksettings;
 774
 775                memset(&link_ksettings, 0, sizeof(link_ksettings));
 776                err = dev->ethtool_ops->get_link_ksettings(dev,
 777                                                           &link_ksettings);
 778                if (err < 0)
 779                        return err;
 780                if (!convert_link_ksettings_to_legacy_settings(&cmd,
 781                                                               &link_ksettings))
 782                        warn_incomplete_ethtool_legacy_settings_conversion(
 783                                "link modes are only partially reported");
 784
 785                /* send a sensible cmd tag back to user */
 786                cmd.cmd = ETHTOOL_GSET;
 787        } else {
 788                /* driver doesn't support %ethtool_link_ksettings
 789                 * API. revert to legacy %ethtool_cmd API, unless it's
 790                 * not supported either.
 791                 */
 792                int err;
 793
 794                if (!dev->ethtool_ops->get_settings)
 795                        return -EOPNOTSUPP;
 796
 797                memset(&cmd, 0, sizeof(cmd));
 798                cmd.cmd = ETHTOOL_GSET;
 799                err = dev->ethtool_ops->get_settings(dev, &cmd);
 800                if (err < 0)
 801                        return err;
 802        }
 803
 804        if (copy_to_user(useraddr, &cmd, sizeof(cmd)))
 805                return -EFAULT;
 806
 807        return 0;
 808}
 809
 810/* Update device link settings with given ethtool_cmd.
 811 *
 812 * Backward compatibility note: for compatibility with legacy ethtool,
 813 * this has to work with both drivers implementing set_link_ksettings
 814 * API and drivers implementing set_settings API. When drivers
 815 * implement set_link_ksettings and user's request updates deprecated
 816 * ethtool_cmd fields (transceiver/maxrxpkt/maxtxpkt), a kernel
 817 * warning is logged once (with name of 1st driver/device) to
 818 * recommend user to upgrade ethtool, and the request is rejected.
 819 */
 820static int ethtool_set_settings(struct net_device *dev, void __user *useraddr)
 821{
 822        struct ethtool_cmd cmd;
 823
 824        ASSERT_RTNL();
 825
 826        if (copy_from_user(&cmd, useraddr, sizeof(cmd)))
 827                return -EFAULT;
 828
 829        /* first, try new %ethtool_link_ksettings API. */
 830        if (dev->ethtool_ops->set_link_ksettings) {
 831                struct ethtool_link_ksettings link_ksettings;
 832
 833                if (!convert_legacy_settings_to_link_ksettings(&link_ksettings,
 834                                                               &cmd))
 835                        return -EINVAL;
 836
 837                link_ksettings.base.cmd = ETHTOOL_SLINKSETTINGS;
 838                link_ksettings.base.link_mode_masks_nwords
 839                        = __ETHTOOL_LINK_MODE_MASK_NU32;
 840                return dev->ethtool_ops->set_link_ksettings(dev,
 841                                                            &link_ksettings);
 842        }
 843
 844        /* legacy %ethtool_cmd API */
 845
 846        /* TODO: return -EOPNOTSUPP when ethtool_ops::get_settings
 847         * disappears internally
 848         */
 849
 850        if (!dev->ethtool_ops->set_settings)
 851                return -EOPNOTSUPP;
 852
 853        return dev->ethtool_ops->set_settings(dev, &cmd);
 854}
 855
 856static noinline_for_stack int ethtool_get_drvinfo(struct net_device *dev,
 857                                                  void __user *useraddr)
 858{
 859        struct ethtool_drvinfo info;
 860        const struct ethtool_ops *ops = dev->ethtool_ops;
 861
 862        memset(&info, 0, sizeof(info));
 863        info.cmd = ETHTOOL_GDRVINFO;
 864        if (ops->get_drvinfo) {
 865                ops->get_drvinfo(dev, &info);
 866        } else if (dev->dev.parent && dev->dev.parent->driver) {
 867                strlcpy(info.bus_info, dev_name(dev->dev.parent),
 868                        sizeof(info.bus_info));
 869                strlcpy(info.driver, dev->dev.parent->driver->name,
 870                        sizeof(info.driver));
 871        } else {
 872                return -EOPNOTSUPP;
 873        }
 874
 875        /*
 876         * this method of obtaining string set info is deprecated;
 877         * Use ETHTOOL_GSSET_INFO instead.
 878         */
 879        if (ops->get_sset_count) {
 880                int rc;
 881
 882                rc = ops->get_sset_count(dev, ETH_SS_TEST);
 883                if (rc >= 0)
 884                        info.testinfo_len = rc;
 885                rc = ops->get_sset_count(dev, ETH_SS_STATS);
 886                if (rc >= 0)
 887                        info.n_stats = rc;
 888                rc = ops->get_sset_count(dev, ETH_SS_PRIV_FLAGS);
 889                if (rc >= 0)
 890                        info.n_priv_flags = rc;
 891        }
 892        if (ops->get_regs_len)
 893                info.regdump_len = ops->get_regs_len(dev);
 894        if (ops->get_eeprom_len)
 895                info.eedump_len = ops->get_eeprom_len(dev);
 896
 897        if (copy_to_user(useraddr, &info, sizeof(info)))
 898                return -EFAULT;
 899        return 0;
 900}
 901
 902static noinline_for_stack int ethtool_get_sset_info(struct net_device *dev,
 903                                                    void __user *useraddr)
 904{
 905        struct ethtool_sset_info info;
 906        u64 sset_mask;
 907        int i, idx = 0, n_bits = 0, ret, rc;
 908        u32 *info_buf = NULL;
 909
 910        if (copy_from_user(&info, useraddr, sizeof(info)))
 911                return -EFAULT;
 912
 913        /* store copy of mask, because we zero struct later on */
 914        sset_mask = info.sset_mask;
 915        if (!sset_mask)
 916                return 0;
 917
 918        /* calculate size of return buffer */
 919        n_bits = hweight64(sset_mask);
 920
 921        memset(&info, 0, sizeof(info));
 922        info.cmd = ETHTOOL_GSSET_INFO;
 923
 924        info_buf = kzalloc(n_bits * sizeof(u32), GFP_USER);
 925        if (!info_buf)
 926                return -ENOMEM;
 927
 928        /*
 929         * fill return buffer based on input bitmask and successful
 930         * get_sset_count return
 931         */
 932        for (i = 0; i < 64; i++) {
 933                if (!(sset_mask & (1ULL << i)))
 934                        continue;
 935
 936                rc = __ethtool_get_sset_count(dev, i);
 937                if (rc >= 0) {
 938                        info.sset_mask |= (1ULL << i);
 939                        info_buf[idx++] = rc;
 940                }
 941        }
 942
 943        ret = -EFAULT;
 944        if (copy_to_user(useraddr, &info, sizeof(info)))
 945                goto out;
 946
 947        useraddr += offsetof(struct ethtool_sset_info, data);
 948        if (copy_to_user(useraddr, info_buf, idx * sizeof(u32)))
 949                goto out;
 950
 951        ret = 0;
 952
 953out:
 954        kfree(info_buf);
 955        return ret;
 956}
 957
 958static noinline_for_stack int ethtool_set_rxnfc(struct net_device *dev,
 959                                                u32 cmd, void __user *useraddr)
 960{
 961        struct ethtool_rxnfc info;
 962        size_t info_size = sizeof(info);
 963        int rc;
 964
 965        if (!dev->ethtool_ops->set_rxnfc)
 966                return -EOPNOTSUPP;
 967
 968        /* struct ethtool_rxnfc was originally defined for
 969         * ETHTOOL_{G,S}RXFH with only the cmd, flow_type and data
 970         * members.  User-space might still be using that
 971         * definition. */
 972        if (cmd == ETHTOOL_SRXFH)
 973                info_size = (offsetof(struct ethtool_rxnfc, data) +
 974                             sizeof(info.data));
 975
 976        if (copy_from_user(&info, useraddr, info_size))
 977                return -EFAULT;
 978
 979        rc = dev->ethtool_ops->set_rxnfc(dev, &info);
 980        if (rc)
 981                return rc;
 982
 983        if (cmd == ETHTOOL_SRXCLSRLINS &&
 984            copy_to_user(useraddr, &info, info_size))
 985                return -EFAULT;
 986
 987        return 0;
 988}
 989
 990static noinline_for_stack int ethtool_get_rxnfc(struct net_device *dev,
 991                                                u32 cmd, void __user *useraddr)
 992{
 993        struct ethtool_rxnfc info;
 994        size_t info_size = sizeof(info);
 995        const struct ethtool_ops *ops = dev->ethtool_ops;
 996        int ret;
 997        void *rule_buf = NULL;
 998
 999        if (!ops->get_rxnfc)
1000                return -EOPNOTSUPP;
1001
1002        /* struct ethtool_rxnfc was originally defined for
1003         * ETHTOOL_{G,S}RXFH with only the cmd, flow_type and data
1004         * members.  User-space might still be using that
1005         * definition. */
1006        if (cmd == ETHTOOL_GRXFH)
1007                info_size = (offsetof(struct ethtool_rxnfc, data) +
1008                             sizeof(info.data));
1009
1010        if (copy_from_user(&info, useraddr, info_size))
1011                return -EFAULT;
1012
1013        if (info.cmd == ETHTOOL_GRXCLSRLALL) {
1014                if (info.rule_cnt > 0) {
1015                        if (info.rule_cnt <= KMALLOC_MAX_SIZE / sizeof(u32))
1016                                rule_buf = kzalloc(info.rule_cnt * sizeof(u32),
1017                                                   GFP_USER);
1018                        if (!rule_buf)
1019                                return -ENOMEM;
1020                }
1021        }
1022
1023        ret = ops->get_rxnfc(dev, &info, rule_buf);
1024        if (ret < 0)
1025                goto err_out;
1026
1027        ret = -EFAULT;
1028        if (copy_to_user(useraddr, &info, info_size))
1029                goto err_out;
1030
1031        if (rule_buf) {
1032                useraddr += offsetof(struct ethtool_rxnfc, rule_locs);
1033                if (copy_to_user(useraddr, rule_buf,
1034                                 info.rule_cnt * sizeof(u32)))
1035                        goto err_out;
1036        }
1037        ret = 0;
1038
1039err_out:
1040        kfree(rule_buf);
1041
1042        return ret;
1043}
1044
1045static int ethtool_copy_validate_indir(u32 *indir, void __user *useraddr,
1046                                        struct ethtool_rxnfc *rx_rings,
1047                                        u32 size)
1048{
1049        int i;
1050
1051        if (copy_from_user(indir, useraddr, size * sizeof(indir[0])))
1052                return -EFAULT;
1053
1054        /* Validate ring indices */
1055        for (i = 0; i < size; i++)
1056                if (indir[i] >= rx_rings->data)
1057                        return -EINVAL;
1058
1059        return 0;
1060}
1061
1062u8 netdev_rss_key[NETDEV_RSS_KEY_LEN] __read_mostly;
1063
1064void netdev_rss_key_fill(void *buffer, size_t len)
1065{
1066        BUG_ON(len > sizeof(netdev_rss_key));
1067        net_get_random_once(netdev_rss_key, sizeof(netdev_rss_key));
1068        memcpy(buffer, netdev_rss_key, len);
1069}
1070EXPORT_SYMBOL(netdev_rss_key_fill);
1071
1072static int ethtool_get_max_rxfh_channel(struct net_device *dev, u32 *max)
1073{
1074        u32 dev_size, current_max = 0;
1075        u32 *indir;
1076        int ret;
1077
1078        if (!dev->ethtool_ops->get_rxfh_indir_size ||
1079            !dev->ethtool_ops->get_rxfh)
1080                return -EOPNOTSUPP;
1081        dev_size = dev->ethtool_ops->get_rxfh_indir_size(dev);
1082        if (dev_size == 0)
1083                return -EOPNOTSUPP;
1084
1085        indir = kcalloc(dev_size, sizeof(indir[0]), GFP_USER);
1086        if (!indir)
1087                return -ENOMEM;
1088
1089        ret = dev->ethtool_ops->get_rxfh(dev, indir, NULL, NULL);
1090        if (ret)
1091                goto out;
1092
1093        while (dev_size--)
1094                current_max = max(current_max, indir[dev_size]);
1095
1096        *max = current_max;
1097
1098out:
1099        kfree(indir);
1100        return ret;
1101}
1102
1103static noinline_for_stack int ethtool_get_rxfh_indir(struct net_device *dev,
1104                                                     void __user *useraddr)
1105{
1106        u32 user_size, dev_size;
1107        u32 *indir;
1108        int ret;
1109
1110        if (!dev->ethtool_ops->get_rxfh_indir_size ||
1111            !dev->ethtool_ops->get_rxfh)
1112                return -EOPNOTSUPP;
1113        dev_size = dev->ethtool_ops->get_rxfh_indir_size(dev);
1114        if (dev_size == 0)
1115                return -EOPNOTSUPP;
1116
1117        if (copy_from_user(&user_size,
1118                           useraddr + offsetof(struct ethtool_rxfh_indir, size),
1119                           sizeof(user_size)))
1120                return -EFAULT;
1121
1122        if (copy_to_user(useraddr + offsetof(struct ethtool_rxfh_indir, size),
1123                         &dev_size, sizeof(dev_size)))
1124                return -EFAULT;
1125
1126        /* If the user buffer size is 0, this is just a query for the
1127         * device table size.  Otherwise, if it's smaller than the
1128         * device table size it's an error.
1129         */
1130        if (user_size < dev_size)
1131                return user_size == 0 ? 0 : -EINVAL;
1132
1133        indir = kcalloc(dev_size, sizeof(indir[0]), GFP_USER);
1134        if (!indir)
1135                return -ENOMEM;
1136
1137        ret = dev->ethtool_ops->get_rxfh(dev, indir, NULL, NULL);
1138        if (ret)
1139                goto out;
1140
1141        if (copy_to_user(useraddr +
1142                         offsetof(struct ethtool_rxfh_indir, ring_index[0]),
1143                         indir, dev_size * sizeof(indir[0])))
1144                ret = -EFAULT;
1145
1146out:
1147        kfree(indir);
1148        return ret;
1149}
1150
1151static noinline_for_stack int ethtool_set_rxfh_indir(struct net_device *dev,
1152                                                     void __user *useraddr)
1153{
1154        struct ethtool_rxnfc rx_rings;
1155        u32 user_size, dev_size, i;
1156        u32 *indir;
1157        const struct ethtool_ops *ops = dev->ethtool_ops;
1158        int ret;
1159        u32 ringidx_offset = offsetof(struct ethtool_rxfh_indir, ring_index[0]);
1160
1161        if (!ops->get_rxfh_indir_size || !ops->set_rxfh ||
1162            !ops->get_rxnfc)
1163                return -EOPNOTSUPP;
1164
1165        dev_size = ops->get_rxfh_indir_size(dev);
1166        if (dev_size == 0)
1167                return -EOPNOTSUPP;
1168
1169        if (copy_from_user(&user_size,
1170                           useraddr + offsetof(struct ethtool_rxfh_indir, size),
1171                           sizeof(user_size)))
1172                return -EFAULT;
1173
1174        if (user_size != 0 && user_size != dev_size)
1175                return -EINVAL;
1176
1177        indir = kcalloc(dev_size, sizeof(indir[0]), GFP_USER);
1178        if (!indir)
1179                return -ENOMEM;
1180
1181        rx_rings.cmd = ETHTOOL_GRXRINGS;
1182        ret = ops->get_rxnfc(dev, &rx_rings, NULL);
1183        if (ret)
1184                goto out;
1185
1186        if (user_size == 0) {
1187                for (i = 0; i < dev_size; i++)
1188                        indir[i] = ethtool_rxfh_indir_default(i, rx_rings.data);
1189        } else {
1190                ret = ethtool_copy_validate_indir(indir,
1191                                                  useraddr + ringidx_offset,
1192                                                  &rx_rings,
1193                                                  dev_size);
1194                if (ret)
1195                        goto out;
1196        }
1197
1198        ret = ops->set_rxfh(dev, indir, NULL, ETH_RSS_HASH_NO_CHANGE);
1199        if (ret)
1200                goto out;
1201
1202        /* indicate whether rxfh was set to default */
1203        if (user_size == 0)
1204                dev->priv_flags &= ~IFF_RXFH_CONFIGURED;
1205        else
1206                dev->priv_flags |= IFF_RXFH_CONFIGURED;
1207
1208out:
1209        kfree(indir);
1210        return ret;
1211}
1212
1213static noinline_for_stack int ethtool_get_rxfh(struct net_device *dev,
1214                                               void __user *useraddr)
1215{
1216        int ret;
1217        const struct ethtool_ops *ops = dev->ethtool_ops;
1218        u32 user_indir_size, user_key_size;
1219        u32 dev_indir_size = 0, dev_key_size = 0;
1220        struct ethtool_rxfh rxfh;
1221        u32 total_size;
1222        u32 indir_bytes;
1223        u32 *indir = NULL;
1224        u8 dev_hfunc = 0;
1225        u8 *hkey = NULL;
1226        u8 *rss_config;
1227
1228        if (!ops->get_rxfh)
1229                return -EOPNOTSUPP;
1230
1231        if (ops->get_rxfh_indir_size)
1232                dev_indir_size = ops->get_rxfh_indir_size(dev);
1233        if (ops->get_rxfh_key_size)
1234                dev_key_size = ops->get_rxfh_key_size(dev);
1235
1236        if (copy_from_user(&rxfh, useraddr, sizeof(rxfh)))
1237                return -EFAULT;
1238        user_indir_size = rxfh.indir_size;
1239        user_key_size = rxfh.key_size;
1240
1241        /* Check that reserved fields are 0 for now */
1242        if (rxfh.rss_context || rxfh.rsvd8[0] || rxfh.rsvd8[1] ||
1243            rxfh.rsvd8[2] || rxfh.rsvd32)
1244                return -EINVAL;
1245
1246        rxfh.indir_size = dev_indir_size;
1247        rxfh.key_size = dev_key_size;
1248        if (copy_to_user(useraddr, &rxfh, sizeof(rxfh)))
1249                return -EFAULT;
1250
1251        if ((user_indir_size && (user_indir_size != dev_indir_size)) ||
1252            (user_key_size && (user_key_size != dev_key_size)))
1253                return -EINVAL;
1254
1255        indir_bytes = user_indir_size * sizeof(indir[0]);
1256        total_size = indir_bytes + user_key_size;
1257        rss_config = kzalloc(total_size, GFP_USER);
1258        if (!rss_config)
1259                return -ENOMEM;
1260
1261        if (user_indir_size)
1262                indir = (u32 *)rss_config;
1263
1264        if (user_key_size)
1265                hkey = rss_config + indir_bytes;
1266
1267        ret = dev->ethtool_ops->get_rxfh(dev, indir, hkey, &dev_hfunc);
1268        if (ret)
1269                goto out;
1270
1271        if (copy_to_user(useraddr + offsetof(struct ethtool_rxfh, hfunc),
1272                         &dev_hfunc, sizeof(rxfh.hfunc))) {
1273                ret = -EFAULT;
1274        } else if (copy_to_user(useraddr +
1275                              offsetof(struct ethtool_rxfh, rss_config[0]),
1276                              rss_config, total_size)) {
1277                ret = -EFAULT;
1278        }
1279out:
1280        kfree(rss_config);
1281
1282        return ret;
1283}
1284
1285static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev,
1286                                               void __user *useraddr)
1287{
1288        int ret;
1289        const struct ethtool_ops *ops = dev->ethtool_ops;
1290        struct ethtool_rxnfc rx_rings;
1291        struct ethtool_rxfh rxfh;
1292        u32 dev_indir_size = 0, dev_key_size = 0, i;
1293        u32 *indir = NULL, indir_bytes = 0;
1294        u8 *hkey = NULL;
1295        u8 *rss_config;
1296        u32 rss_cfg_offset = offsetof(struct ethtool_rxfh, rss_config[0]);
1297
1298        if (!ops->get_rxnfc || !ops->set_rxfh)
1299                return -EOPNOTSUPP;
1300
1301        if (ops->get_rxfh_indir_size)
1302                dev_indir_size = ops->get_rxfh_indir_size(dev);
1303        if (ops->get_rxfh_key_size)
1304                dev_key_size = ops->get_rxfh_key_size(dev);
1305
1306        if (copy_from_user(&rxfh, useraddr, sizeof(rxfh)))
1307                return -EFAULT;
1308
1309        /* Check that reserved fields are 0 for now */
1310        if (rxfh.rss_context || rxfh.rsvd8[0] || rxfh.rsvd8[1] ||
1311            rxfh.rsvd8[2] || rxfh.rsvd32)
1312                return -EINVAL;
1313
1314        /* If either indir, hash key or function is valid, proceed further.
1315         * Must request at least one change: indir size, hash key or function.
1316         */
1317        if ((rxfh.indir_size &&
1318             rxfh.indir_size != ETH_RXFH_INDIR_NO_CHANGE &&
1319             rxfh.indir_size != dev_indir_size) ||
1320            (rxfh.key_size && (rxfh.key_size != dev_key_size)) ||
1321            (rxfh.indir_size == ETH_RXFH_INDIR_NO_CHANGE &&
1322             rxfh.key_size == 0 && rxfh.hfunc == ETH_RSS_HASH_NO_CHANGE))
1323                return -EINVAL;
1324
1325        if (rxfh.indir_size != ETH_RXFH_INDIR_NO_CHANGE)
1326                indir_bytes = dev_indir_size * sizeof(indir[0]);
1327
1328        rss_config = kzalloc(indir_bytes + rxfh.key_size, GFP_USER);
1329        if (!rss_config)
1330                return -ENOMEM;
1331
1332        rx_rings.cmd = ETHTOOL_GRXRINGS;
1333        ret = ops->get_rxnfc(dev, &rx_rings, NULL);
1334        if (ret)
1335                goto out;
1336
1337        /* rxfh.indir_size == 0 means reset the indir table to default.
1338         * rxfh.indir_size == ETH_RXFH_INDIR_NO_CHANGE means leave it unchanged.
1339         */
1340        if (rxfh.indir_size &&
1341            rxfh.indir_size != ETH_RXFH_INDIR_NO_CHANGE) {
1342                indir = (u32 *)rss_config;
1343                ret = ethtool_copy_validate_indir(indir,
1344                                                  useraddr + rss_cfg_offset,
1345                                                  &rx_rings,
1346                                                  rxfh.indir_size);
1347                if (ret)
1348                        goto out;
1349        } else if (rxfh.indir_size == 0) {
1350                indir = (u32 *)rss_config;
1351                for (i = 0; i < dev_indir_size; i++)
1352                        indir[i] = ethtool_rxfh_indir_default(i, rx_rings.data);
1353        }
1354
1355        if (rxfh.key_size) {
1356                hkey = rss_config + indir_bytes;
1357                if (copy_from_user(hkey,
1358                                   useraddr + rss_cfg_offset + indir_bytes,
1359                                   rxfh.key_size)) {
1360                        ret = -EFAULT;
1361                        goto out;
1362                }
1363        }
1364
1365        ret = ops->set_rxfh(dev, indir, hkey, rxfh.hfunc);
1366        if (ret)
1367                goto out;
1368
1369        /* indicate whether rxfh was set to default */
1370        if (rxfh.indir_size == 0)
1371                dev->priv_flags &= ~IFF_RXFH_CONFIGURED;
1372        else if (rxfh.indir_size != ETH_RXFH_INDIR_NO_CHANGE)
1373                dev->priv_flags |= IFF_RXFH_CONFIGURED;
1374
1375out:
1376        kfree(rss_config);
1377        return ret;
1378}
1379
1380static int ethtool_get_regs(struct net_device *dev, char __user *useraddr)
1381{
1382        struct ethtool_regs regs;
1383        const struct ethtool_ops *ops = dev->ethtool_ops;
1384        void *regbuf;
1385        int reglen, ret;
1386
1387        if (!ops->get_regs || !ops->get_regs_len)
1388                return -EOPNOTSUPP;
1389
1390        if (copy_from_user(&regs, useraddr, sizeof(regs)))
1391                return -EFAULT;
1392
1393        reglen = ops->get_regs_len(dev);
1394        if (regs.len > reglen)
1395                regs.len = reglen;
1396
1397        regbuf = vzalloc(reglen);
1398        if (reglen && !regbuf)
1399                return -ENOMEM;
1400
1401        ops->get_regs(dev, &regs, regbuf);
1402
1403        ret = -EFAULT;
1404        if (copy_to_user(useraddr, &regs, sizeof(regs)))
1405                goto out;
1406        useraddr += offsetof(struct ethtool_regs, data);
1407        if (regbuf && copy_to_user(useraddr, regbuf, regs.len))
1408                goto out;
1409        ret = 0;
1410
1411 out:
1412        vfree(regbuf);
1413        return ret;
1414}
1415
1416static int ethtool_reset(struct net_device *dev, char __user *useraddr)
1417{
1418        struct ethtool_value reset;
1419        int ret;
1420
1421        if (!dev->ethtool_ops->reset)
1422                return -EOPNOTSUPP;
1423
1424        if (copy_from_user(&reset, useraddr, sizeof(reset)))
1425                return -EFAULT;
1426
1427        ret = dev->ethtool_ops->reset(dev, &reset.data);
1428        if (ret)
1429                return ret;
1430
1431        if (copy_to_user(useraddr, &reset, sizeof(reset)))
1432                return -EFAULT;
1433        return 0;
1434}
1435
1436static int ethtool_get_wol(struct net_device *dev, char __user *useraddr)
1437{
1438        struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL };
1439
1440        if (!dev->ethtool_ops->get_wol)
1441                return -EOPNOTSUPP;
1442
1443        dev->ethtool_ops->get_wol(dev, &wol);
1444
1445        if (copy_to_user(useraddr, &wol, sizeof(wol)))
1446                return -EFAULT;
1447        return 0;
1448}
1449
1450static int ethtool_set_wol(struct net_device *dev, char __user *useraddr)
1451{
1452        struct ethtool_wolinfo wol;
1453
1454        if (!dev->ethtool_ops->set_wol)
1455                return -EOPNOTSUPP;
1456
1457        if (copy_from_user(&wol, useraddr, sizeof(wol)))
1458                return -EFAULT;
1459
1460        return dev->ethtool_ops->set_wol(dev, &wol);
1461}
1462
1463static int ethtool_get_eee(struct net_device *dev, char __user *useraddr)
1464{
1465        struct ethtool_eee edata;
1466        int rc;
1467
1468        if (!dev->ethtool_ops->get_eee)
1469                return -EOPNOTSUPP;
1470
1471        memset(&edata, 0, sizeof(struct ethtool_eee));
1472        edata.cmd = ETHTOOL_GEEE;
1473        rc = dev->ethtool_ops->get_eee(dev, &edata);
1474
1475        if (rc)
1476                return rc;
1477
1478        if (copy_to_user(useraddr, &edata, sizeof(edata)))
1479                return -EFAULT;
1480
1481        return 0;
1482}
1483
1484static int ethtool_set_eee(struct net_device *dev, char __user *useraddr)
1485{
1486        struct ethtool_eee edata;
1487
1488        if (!dev->ethtool_ops->set_eee)
1489                return -EOPNOTSUPP;
1490
1491        if (copy_from_user(&edata, useraddr, sizeof(edata)))
1492                return -EFAULT;
1493
1494        return dev->ethtool_ops->set_eee(dev, &edata);
1495}
1496
1497static int ethtool_nway_reset(struct net_device *dev)
1498{
1499        if (!dev->ethtool_ops->nway_reset)
1500                return -EOPNOTSUPP;
1501
1502        return dev->ethtool_ops->nway_reset(dev);
1503}
1504
1505static int ethtool_get_link(struct net_device *dev, char __user *useraddr)
1506{
1507        struct ethtool_value edata = { .cmd = ETHTOOL_GLINK };
1508
1509        if (!dev->ethtool_ops->get_link)
1510                return -EOPNOTSUPP;
1511
1512        edata.data = netif_running(dev) && dev->ethtool_ops->get_link(dev);
1513
1514        if (copy_to_user(useraddr, &edata, sizeof(edata)))
1515                return -EFAULT;
1516        return 0;
1517}
1518
1519static int ethtool_get_any_eeprom(struct net_device *dev, void __user *useraddr,
1520                                  int (*getter)(struct net_device *,
1521                                                struct ethtool_eeprom *, u8 *),
1522                                  u32 total_len)
1523{
1524        struct ethtool_eeprom eeprom;
1525        void __user *userbuf = useraddr + sizeof(eeprom);
1526        u32 bytes_remaining;
1527        u8 *data;
1528        int ret = 0;
1529
1530        if (copy_from_user(&eeprom, useraddr, sizeof(eeprom)))
1531                return -EFAULT;
1532
1533        /* Check for wrap and zero */
1534        if (eeprom.offset + eeprom.len <= eeprom.offset)
1535                return -EINVAL;
1536
1537        /* Check for exceeding total eeprom len */
1538        if (eeprom.offset + eeprom.len > total_len)
1539                return -EINVAL;
1540
1541        data = kmalloc(PAGE_SIZE, GFP_USER);
1542        if (!data)
1543                return -ENOMEM;
1544
1545        bytes_remaining = eeprom.len;
1546        while (bytes_remaining > 0) {
1547                eeprom.len = min(bytes_remaining, (u32)PAGE_SIZE);
1548
1549                ret = getter(dev, &eeprom, data);
1550                if (ret)
1551                        break;
1552                if (copy_to_user(userbuf, data, eeprom.len)) {
1553                        ret = -EFAULT;
1554                        break;
1555                }
1556                userbuf += eeprom.len;
1557                eeprom.offset += eeprom.len;
1558                bytes_remaining -= eeprom.len;
1559        }
1560
1561        eeprom.len = userbuf - (useraddr + sizeof(eeprom));
1562        eeprom.offset -= eeprom.len;
1563        if (copy_to_user(useraddr, &eeprom, sizeof(eeprom)))
1564                ret = -EFAULT;
1565
1566        kfree(data);
1567        return ret;
1568}
1569
1570static int ethtool_get_eeprom(struct net_device *dev, void __user *useraddr)
1571{
1572        const struct ethtool_ops *ops = dev->ethtool_ops;
1573
1574        if (!ops->get_eeprom || !ops->get_eeprom_len ||
1575            !ops->get_eeprom_len(dev))
1576                return -EOPNOTSUPP;
1577
1578        return ethtool_get_any_eeprom(dev, useraddr, ops->get_eeprom,
1579                                      ops->get_eeprom_len(dev));
1580}
1581
1582static int ethtool_set_eeprom(struct net_device *dev, void __user *useraddr)
1583{
1584        struct ethtool_eeprom eeprom;
1585        const struct ethtool_ops *ops = dev->ethtool_ops;
1586        void __user *userbuf = useraddr + sizeof(eeprom);
1587        u32 bytes_remaining;
1588        u8 *data;
1589        int ret = 0;
1590
1591        if (!ops->set_eeprom || !ops->get_eeprom_len ||
1592            !ops->get_eeprom_len(dev))
1593                return -EOPNOTSUPP;
1594
1595        if (copy_from_user(&eeprom, useraddr, sizeof(eeprom)))
1596                return -EFAULT;
1597
1598        /* Check for wrap and zero */
1599        if (eeprom.offset + eeprom.len <= eeprom.offset)
1600                return -EINVAL;
1601
1602        /* Check for exceeding total eeprom len */
1603        if (eeprom.offset + eeprom.len > ops->get_eeprom_len(dev))
1604                return -EINVAL;
1605
1606        data = kmalloc(PAGE_SIZE, GFP_USER);
1607        if (!data)
1608                return -ENOMEM;
1609
1610        bytes_remaining = eeprom.len;
1611        while (bytes_remaining > 0) {
1612                eeprom.len = min(bytes_remaining, (u32)PAGE_SIZE);
1613
1614                if (copy_from_user(data, userbuf, eeprom.len)) {
1615                        ret = -EFAULT;
1616                        break;
1617                }
1618                ret = ops->set_eeprom(dev, &eeprom, data);
1619                if (ret)
1620                        break;
1621                userbuf += eeprom.len;
1622                eeprom.offset += eeprom.len;
1623                bytes_remaining -= eeprom.len;
1624        }
1625
1626        kfree(data);
1627        return ret;
1628}
1629
1630static noinline_for_stack int ethtool_get_coalesce(struct net_device *dev,
1631                                                   void __user *useraddr)
1632{
1633        struct ethtool_coalesce coalesce = { .cmd = ETHTOOL_GCOALESCE };
1634
1635        if (!dev->ethtool_ops->get_coalesce)
1636                return -EOPNOTSUPP;
1637
1638        dev->ethtool_ops->get_coalesce(dev, &coalesce);
1639
1640        if (copy_to_user(useraddr, &coalesce, sizeof(coalesce)))
1641                return -EFAULT;
1642        return 0;
1643}
1644
1645static noinline_for_stack int ethtool_set_coalesce(struct net_device *dev,
1646                                                   void __user *useraddr)
1647{
1648        struct ethtool_coalesce coalesce;
1649
1650        if (!dev->ethtool_ops->set_coalesce)
1651                return -EOPNOTSUPP;
1652
1653        if (copy_from_user(&coalesce, useraddr, sizeof(coalesce)))
1654                return -EFAULT;
1655
1656        return dev->ethtool_ops->set_coalesce(dev, &coalesce);
1657}
1658
1659static int ethtool_get_ringparam(struct net_device *dev, void __user *useraddr)
1660{
1661        struct ethtool_ringparam ringparam = { .cmd = ETHTOOL_GRINGPARAM };
1662
1663        if (!dev->ethtool_ops->get_ringparam)
1664                return -EOPNOTSUPP;
1665
1666        dev->ethtool_ops->get_ringparam(dev, &ringparam);
1667
1668        if (copy_to_user(useraddr, &ringparam, sizeof(ringparam)))
1669                return -EFAULT;
1670        return 0;
1671}
1672
1673static int ethtool_set_ringparam(struct net_device *dev, void __user *useraddr)
1674{
1675        struct ethtool_ringparam ringparam;
1676
1677        if (!dev->ethtool_ops->set_ringparam)
1678                return -EOPNOTSUPP;
1679
1680        if (copy_from_user(&ringparam, useraddr, sizeof(ringparam)))
1681                return -EFAULT;
1682
1683        return dev->ethtool_ops->set_ringparam(dev, &ringparam);
1684}
1685
1686static noinline_for_stack int ethtool_get_channels(struct net_device *dev,
1687                                                   void __user *useraddr)
1688{
1689        struct ethtool_channels channels = { .cmd = ETHTOOL_GCHANNELS };
1690
1691        if (!dev->ethtool_ops->get_channels)
1692                return -EOPNOTSUPP;
1693
1694        dev->ethtool_ops->get_channels(dev, &channels);
1695
1696        if (copy_to_user(useraddr, &channels, sizeof(channels)))
1697                return -EFAULT;
1698        return 0;
1699}
1700
1701static noinline_for_stack int ethtool_set_channels(struct net_device *dev,
1702                                                   void __user *useraddr)
1703{
1704        struct ethtool_channels channels, max;
1705        u32 max_rx_in_use = 0;
1706
1707        if (!dev->ethtool_ops->set_channels || !dev->ethtool_ops->get_channels)
1708                return -EOPNOTSUPP;
1709
1710        if (copy_from_user(&channels, useraddr, sizeof(channels)))
1711                return -EFAULT;
1712
1713        dev->ethtool_ops->get_channels(dev, &max);
1714
1715        /* ensure new counts are within the maximums */
1716        if ((channels.rx_count > max.max_rx) ||
1717            (channels.tx_count > max.max_tx) ||
1718            (channels.combined_count > max.max_combined) ||
1719            (channels.other_count > max.max_other))
1720                return -EINVAL;
1721
1722        /* ensure the new Rx count fits within the configured Rx flow
1723         * indirection table settings */
1724        if (netif_is_rxfh_configured(dev) &&
1725            !ethtool_get_max_rxfh_channel(dev, &max_rx_in_use) &&
1726            (channels.combined_count + channels.rx_count) <= max_rx_in_use)
1727            return -EINVAL;
1728
1729        return dev->ethtool_ops->set_channels(dev, &channels);
1730}
1731
1732static int ethtool_get_pauseparam(struct net_device *dev, void __user *useraddr)
1733{
1734        struct ethtool_pauseparam pauseparam = { ETHTOOL_GPAUSEPARAM };
1735
1736        if (!dev->ethtool_ops->get_pauseparam)
1737                return -EOPNOTSUPP;
1738
1739        dev->ethtool_ops->get_pauseparam(dev, &pauseparam);
1740
1741        if (copy_to_user(useraddr, &pauseparam, sizeof(pauseparam)))
1742                return -EFAULT;
1743        return 0;
1744}
1745
1746static int ethtool_set_pauseparam(struct net_device *dev, void __user *useraddr)
1747{
1748        struct ethtool_pauseparam pauseparam;
1749
1750        if (!dev->ethtool_ops->set_pauseparam)
1751                return -EOPNOTSUPP;
1752
1753        if (copy_from_user(&pauseparam, useraddr, sizeof(pauseparam)))
1754                return -EFAULT;
1755
1756        return dev->ethtool_ops->set_pauseparam(dev, &pauseparam);
1757}
1758
1759static int ethtool_self_test(struct net_device *dev, char __user *useraddr)
1760{
1761        struct ethtool_test test;
1762        const struct ethtool_ops *ops = dev->ethtool_ops;
1763        u64 *data;
1764        int ret, test_len;
1765
1766        if (!ops->self_test || !ops->get_sset_count)
1767                return -EOPNOTSUPP;
1768
1769        test_len = ops->get_sset_count(dev, ETH_SS_TEST);
1770        if (test_len < 0)
1771                return test_len;
1772        WARN_ON(test_len == 0);
1773
1774        if (copy_from_user(&test, useraddr, sizeof(test)))
1775                return -EFAULT;
1776
1777        test.len = test_len;
1778        data = kmalloc(test_len * sizeof(u64), GFP_USER);
1779        if (!data)
1780                return -ENOMEM;
1781
1782        ops->self_test(dev, &test, data);
1783
1784        ret = -EFAULT;
1785        if (copy_to_user(useraddr, &test, sizeof(test)))
1786                goto out;
1787        useraddr += sizeof(test);
1788        if (copy_to_user(useraddr, data, test.len * sizeof(u64)))
1789                goto out;
1790        ret = 0;
1791
1792 out:
1793        kfree(data);
1794        return ret;
1795}
1796
1797static int ethtool_get_strings(struct net_device *dev, void __user *useraddr)
1798{
1799        struct ethtool_gstrings gstrings;
1800        u8 *data;
1801        int ret;
1802
1803        if (copy_from_user(&gstrings, useraddr, sizeof(gstrings)))
1804                return -EFAULT;
1805
1806        ret = __ethtool_get_sset_count(dev, gstrings.string_set);
1807        if (ret < 0)
1808                return ret;
1809
1810        gstrings.len = ret;
1811
1812        data = kcalloc(gstrings.len, ETH_GSTRING_LEN, GFP_USER);
1813        if (!data)
1814                return -ENOMEM;
1815
1816        __ethtool_get_strings(dev, gstrings.string_set, data);
1817
1818        ret = -EFAULT;
1819        if (copy_to_user(useraddr, &gstrings, sizeof(gstrings)))
1820                goto out;
1821        useraddr += sizeof(gstrings);
1822        if (copy_to_user(useraddr, data, gstrings.len * ETH_GSTRING_LEN))
1823                goto out;
1824        ret = 0;
1825
1826out:
1827        kfree(data);
1828        return ret;
1829}
1830
1831static int ethtool_phys_id(struct net_device *dev, void __user *useraddr)
1832{
1833        struct ethtool_value id;
1834        static bool busy;
1835        const struct ethtool_ops *ops = dev->ethtool_ops;
1836        int rc;
1837
1838        if (!ops->set_phys_id)
1839                return -EOPNOTSUPP;
1840
1841        if (busy)
1842                return -EBUSY;
1843
1844        if (copy_from_user(&id, useraddr, sizeof(id)))
1845                return -EFAULT;
1846
1847        rc = ops->set_phys_id(dev, ETHTOOL_ID_ACTIVE);
1848        if (rc < 0)
1849                return rc;
1850
1851        /* Drop the RTNL lock while waiting, but prevent reentry or
1852         * removal of the device.
1853         */
1854        busy = true;
1855        dev_hold(dev);
1856        rtnl_unlock();
1857
1858        if (rc == 0) {
1859                /* Driver will handle this itself */
1860                schedule_timeout_interruptible(
1861                        id.data ? (id.data * HZ) : MAX_SCHEDULE_TIMEOUT);
1862        } else {
1863                /* Driver expects to be called at twice the frequency in rc */
1864                int n = rc * 2, i, interval = HZ / n;
1865
1866                /* Count down seconds */
1867                do {
1868                        /* Count down iterations per second */
1869                        i = n;
1870                        do {
1871                                rtnl_lock();
1872                                rc = ops->set_phys_id(dev,
1873                                    (i & 1) ? ETHTOOL_ID_OFF : ETHTOOL_ID_ON);
1874                                rtnl_unlock();
1875                                if (rc)
1876                                        break;
1877                                schedule_timeout_interruptible(interval);
1878                        } while (!signal_pending(current) && --i != 0);
1879                } while (!signal_pending(current) &&
1880                         (id.data == 0 || --id.data != 0));
1881        }
1882
1883        rtnl_lock();
1884        dev_put(dev);
1885        busy = false;
1886
1887        (void) ops->set_phys_id(dev, ETHTOOL_ID_INACTIVE);
1888        return rc;
1889}
1890
1891static int ethtool_get_stats(struct net_device *dev, void __user *useraddr)
1892{
1893        struct ethtool_stats stats;
1894        const struct ethtool_ops *ops = dev->ethtool_ops;
1895        u64 *data;
1896        int ret, n_stats;
1897
1898        if (!ops->get_ethtool_stats || !ops->get_sset_count)
1899                return -EOPNOTSUPP;
1900
1901        n_stats = ops->get_sset_count(dev, ETH_SS_STATS);
1902        if (n_stats < 0)
1903                return n_stats;
1904        WARN_ON(n_stats == 0);
1905
1906        if (copy_from_user(&stats, useraddr, sizeof(stats)))
1907                return -EFAULT;
1908
1909        stats.n_stats = n_stats;
1910        data = kmalloc(n_stats * sizeof(u64), GFP_USER);
1911        if (!data)
1912                return -ENOMEM;
1913
1914        ops->get_ethtool_stats(dev, &stats, data);
1915
1916        ret = -EFAULT;
1917        if (copy_to_user(useraddr, &stats, sizeof(stats)))
1918                goto out;
1919        useraddr += sizeof(stats);
1920        if (copy_to_user(useraddr, data, stats.n_stats * sizeof(u64)))
1921                goto out;
1922        ret = 0;
1923
1924 out:
1925        kfree(data);
1926        return ret;
1927}
1928
1929static int ethtool_get_phy_stats(struct net_device *dev, void __user *useraddr)
1930{
1931        struct ethtool_stats stats;
1932        struct phy_device *phydev = dev->phydev;
1933        u64 *data;
1934        int ret, n_stats;
1935
1936        if (!phydev)
1937                return -EOPNOTSUPP;
1938
1939        n_stats = phy_get_sset_count(phydev);
1940
1941        if (n_stats < 0)
1942                return n_stats;
1943        WARN_ON(n_stats == 0);
1944
1945        if (copy_from_user(&stats, useraddr, sizeof(stats)))
1946                return -EFAULT;
1947
1948        stats.n_stats = n_stats;
1949        data = kmalloc_array(n_stats, sizeof(u64), GFP_USER);
1950        if (!data)
1951                return -ENOMEM;
1952
1953        mutex_lock(&phydev->lock);
1954        phydev->drv->get_stats(phydev, &stats, data);
1955        mutex_unlock(&phydev->lock);
1956
1957        ret = -EFAULT;
1958        if (copy_to_user(useraddr, &stats, sizeof(stats)))
1959                goto out;
1960        useraddr += sizeof(stats);
1961        if (copy_to_user(useraddr, data, stats.n_stats * sizeof(u64)))
1962                goto out;
1963        ret = 0;
1964
1965 out:
1966        kfree(data);
1967        return ret;
1968}
1969
1970static int ethtool_get_perm_addr(struct net_device *dev, void __user *useraddr)
1971{
1972        struct ethtool_perm_addr epaddr;
1973
1974        if (copy_from_user(&epaddr, useraddr, sizeof(epaddr)))
1975                return -EFAULT;
1976
1977        if (epaddr.size < dev->addr_len)
1978                return -ETOOSMALL;
1979        epaddr.size = dev->addr_len;
1980
1981        if (copy_to_user(useraddr, &epaddr, sizeof(epaddr)))
1982                return -EFAULT;
1983        useraddr += sizeof(epaddr);
1984        if (copy_to_user(useraddr, dev->perm_addr, epaddr.size))
1985                return -EFAULT;
1986        return 0;
1987}
1988
1989static int ethtool_get_value(struct net_device *dev, char __user *useraddr,
1990                             u32 cmd, u32 (*actor)(struct net_device *))
1991{
1992        struct ethtool_value edata = { .cmd = cmd };
1993
1994        if (!actor)
1995                return -EOPNOTSUPP;
1996
1997        edata.data = actor(dev);
1998
1999        if (copy_to_user(useraddr, &edata, sizeof(edata)))
2000                return -EFAULT;
2001        return 0;
2002}
2003
2004static int ethtool_set_value_void(struct net_device *dev, char __user *useraddr,
2005                             void (*actor)(struct net_device *, u32))
2006{
2007        struct ethtool_value edata;
2008
2009        if (!actor)
2010                return -EOPNOTSUPP;
2011
2012        if (copy_from_user(&edata, useraddr, sizeof(edata)))
2013                return -EFAULT;
2014
2015        actor(dev, edata.data);
2016        return 0;
2017}
2018
2019static int ethtool_set_value(struct net_device *dev, char __user *useraddr,
2020                             int (*actor)(struct net_device *, u32))
2021{
2022        struct ethtool_value edata;
2023
2024        if (!actor)
2025                return -EOPNOTSUPP;
2026
2027        if (copy_from_user(&edata, useraddr, sizeof(edata)))
2028                return -EFAULT;
2029
2030        return actor(dev, edata.data);
2031}
2032
2033static noinline_for_stack int ethtool_flash_device(struct net_device *dev,
2034                                                   char __user *useraddr)
2035{
2036        struct ethtool_flash efl;
2037
2038        if (copy_from_user(&efl, useraddr, sizeof(efl)))
2039                return -EFAULT;
2040
2041        if (!dev->ethtool_ops->flash_device)
2042                return -EOPNOTSUPP;
2043
2044        efl.data[ETHTOOL_FLASH_MAX_FILENAME - 1] = 0;
2045
2046        return dev->ethtool_ops->flash_device(dev, &efl);
2047}
2048
2049static int ethtool_set_dump(struct net_device *dev,
2050                        void __user *useraddr)
2051{
2052        struct ethtool_dump dump;
2053
2054        if (!dev->ethtool_ops->set_dump)
2055                return -EOPNOTSUPP;
2056
2057        if (copy_from_user(&dump, useraddr, sizeof(dump)))
2058                return -EFAULT;
2059
2060        return dev->ethtool_ops->set_dump(dev, &dump);
2061}
2062
2063static int ethtool_get_dump_flag(struct net_device *dev,
2064                                void __user *useraddr)
2065{
2066        int ret;
2067        struct ethtool_dump dump;
2068        const struct ethtool_ops *ops = dev->ethtool_ops;
2069
2070        if (!ops->get_dump_flag)
2071                return -EOPNOTSUPP;
2072
2073        if (copy_from_user(&dump, useraddr, sizeof(dump)))
2074                return -EFAULT;
2075
2076        ret = ops->get_dump_flag(dev, &dump);
2077        if (ret)
2078                return ret;
2079
2080        if (copy_to_user(useraddr, &dump, sizeof(dump)))
2081                return -EFAULT;
2082        return 0;
2083}
2084
2085static int ethtool_get_dump_data(struct net_device *dev,
2086                                void __user *useraddr)
2087{
2088        int ret;
2089        __u32 len;
2090        struct ethtool_dump dump, tmp;
2091        const struct ethtool_ops *ops = dev->ethtool_ops;
2092        void *data = NULL;
2093
2094        if (!ops->get_dump_data || !ops->get_dump_flag)
2095                return -EOPNOTSUPP;
2096
2097        if (copy_from_user(&dump, useraddr, sizeof(dump)))
2098                return -EFAULT;
2099
2100        memset(&tmp, 0, sizeof(tmp));
2101        tmp.cmd = ETHTOOL_GET_DUMP_FLAG;
2102        ret = ops->get_dump_flag(dev, &tmp);
2103        if (ret)
2104                return ret;
2105
2106        len = min(tmp.len, dump.len);
2107        if (!len)
2108                return -EFAULT;
2109
2110        /* Don't ever let the driver think there's more space available
2111         * than it requested with .get_dump_flag().
2112         */
2113        dump.len = len;
2114
2115        /* Always allocate enough space to hold the whole thing so that the
2116         * driver does not need to check the length and bother with partial
2117         * dumping.
2118         */
2119        data = vzalloc(tmp.len);
2120        if (!data)
2121                return -ENOMEM;
2122        ret = ops->get_dump_data(dev, &dump, data);
2123        if (ret)
2124                goto out;
2125
2126        /* There are two sane possibilities:
2127         * 1. The driver's .get_dump_data() does not touch dump.len.
2128         * 2. Or it may set dump.len to how much it really writes, which
2129         *    should be tmp.len (or len if it can do a partial dump).
2130         * In any case respond to userspace with the actual length of data
2131         * it's receiving.
2132         */
2133        WARN_ON(dump.len != len && dump.len != tmp.len);
2134        dump.len = len;
2135
2136        if (copy_to_user(useraddr, &dump, sizeof(dump))) {
2137                ret = -EFAULT;
2138                goto out;
2139        }
2140        useraddr += offsetof(struct ethtool_dump, data);
2141        if (copy_to_user(useraddr, data, len))
2142                ret = -EFAULT;
2143out:
2144        vfree(data);
2145        return ret;
2146}
2147
2148static int ethtool_get_ts_info(struct net_device *dev, void __user *useraddr)
2149{
2150        int err = 0;
2151        struct ethtool_ts_info info;
2152        const struct ethtool_ops *ops = dev->ethtool_ops;
2153        struct phy_device *phydev = dev->phydev;
2154
2155        memset(&info, 0, sizeof(info));
2156        info.cmd = ETHTOOL_GET_TS_INFO;
2157
2158        if (phydev && phydev->drv && phydev->drv->ts_info) {
2159                err = phydev->drv->ts_info(phydev, &info);
2160        } else if (ops->get_ts_info) {
2161                err = ops->get_ts_info(dev, &info);
2162        } else {
2163                info.so_timestamping =
2164                        SOF_TIMESTAMPING_RX_SOFTWARE |
2165                        SOF_TIMESTAMPING_SOFTWARE;
2166                info.phc_index = -1;
2167        }
2168
2169        if (err)
2170                return err;
2171
2172        if (copy_to_user(useraddr, &info, sizeof(info)))
2173                err = -EFAULT;
2174
2175        return err;
2176}
2177
2178static int __ethtool_get_module_info(struct net_device *dev,
2179                                     struct ethtool_modinfo *modinfo)
2180{
2181        const struct ethtool_ops *ops = dev->ethtool_ops;
2182        struct phy_device *phydev = dev->phydev;
2183
2184        if (phydev && phydev->drv && phydev->drv->module_info)
2185                return phydev->drv->module_info(phydev, modinfo);
2186
2187        if (ops->get_module_info)
2188                return ops->get_module_info(dev, modinfo);
2189
2190        return -EOPNOTSUPP;
2191}
2192
2193static int ethtool_get_module_info(struct net_device *dev,
2194                                   void __user *useraddr)
2195{
2196        int ret;
2197        struct ethtool_modinfo modinfo;
2198
2199        if (copy_from_user(&modinfo, useraddr, sizeof(modinfo)))
2200                return -EFAULT;
2201
2202        ret = __ethtool_get_module_info(dev, &modinfo);
2203        if (ret)
2204                return ret;
2205
2206        if (copy_to_user(useraddr, &modinfo, sizeof(modinfo)))
2207                return -EFAULT;
2208
2209        return 0;
2210}
2211
2212static int __ethtool_get_module_eeprom(struct net_device *dev,
2213                                       struct ethtool_eeprom *ee, u8 *data)
2214{
2215        const struct ethtool_ops *ops = dev->ethtool_ops;
2216        struct phy_device *phydev = dev->phydev;
2217
2218        if (phydev && phydev->drv && phydev->drv->module_eeprom)
2219                return phydev->drv->module_eeprom(phydev, ee, data);
2220
2221        if (ops->get_module_eeprom)
2222                return ops->get_module_eeprom(dev, ee, data);
2223
2224        return -EOPNOTSUPP;
2225}
2226
2227static int ethtool_get_module_eeprom(struct net_device *dev,
2228                                     void __user *useraddr)
2229{
2230        int ret;
2231        struct ethtool_modinfo modinfo;
2232
2233        ret = __ethtool_get_module_info(dev, &modinfo);
2234        if (ret)
2235                return ret;
2236
2237        return ethtool_get_any_eeprom(dev, useraddr,
2238                                      __ethtool_get_module_eeprom,
2239                                      modinfo.eeprom_len);
2240}
2241
2242static int ethtool_tunable_valid(const struct ethtool_tunable *tuna)
2243{
2244        switch (tuna->id) {
2245        case ETHTOOL_RX_COPYBREAK:
2246        case ETHTOOL_TX_COPYBREAK:
2247                if (tuna->len != sizeof(u32) ||
2248                    tuna->type_id != ETHTOOL_TUNABLE_U32)
2249                        return -EINVAL;
2250                break;
2251        default:
2252                return -EINVAL;
2253        }
2254
2255        return 0;
2256}
2257
2258static int ethtool_get_tunable(struct net_device *dev, void __user *useraddr)
2259{
2260        int ret;
2261        struct ethtool_tunable tuna;
2262        const struct ethtool_ops *ops = dev->ethtool_ops;
2263        void *data;
2264
2265        if (!ops->get_tunable)
2266                return -EOPNOTSUPP;
2267        if (copy_from_user(&tuna, useraddr, sizeof(tuna)))
2268                return -EFAULT;
2269        ret = ethtool_tunable_valid(&tuna);
2270        if (ret)
2271                return ret;
2272        data = kmalloc(tuna.len, GFP_USER);
2273        if (!data)
2274                return -ENOMEM;
2275        ret = ops->get_tunable(dev, &tuna, data);
2276        if (ret)
2277                goto out;
2278        useraddr += sizeof(tuna);
2279        ret = -EFAULT;
2280        if (copy_to_user(useraddr, data, tuna.len))
2281                goto out;
2282        ret = 0;
2283
2284out:
2285        kfree(data);
2286        return ret;
2287}
2288
2289static int ethtool_set_tunable(struct net_device *dev, void __user *useraddr)
2290{
2291        int ret;
2292        struct ethtool_tunable tuna;
2293        const struct ethtool_ops *ops = dev->ethtool_ops;
2294        void *data;
2295
2296        if (!ops->set_tunable)
2297                return -EOPNOTSUPP;
2298        if (copy_from_user(&tuna, useraddr, sizeof(tuna)))
2299                return -EFAULT;
2300        ret = ethtool_tunable_valid(&tuna);
2301        if (ret)
2302                return ret;
2303        data = kmalloc(tuna.len, GFP_USER);
2304        if (!data)
2305                return -ENOMEM;
2306        useraddr += sizeof(tuna);
2307        ret = -EFAULT;
2308        if (copy_from_user(data, useraddr, tuna.len))
2309                goto out;
2310        ret = ops->set_tunable(dev, &tuna, data);
2311
2312out:
2313        kfree(data);
2314        return ret;
2315}
2316
2317static int ethtool_get_per_queue_coalesce(struct net_device *dev,
2318                                          void __user *useraddr,
2319                                          struct ethtool_per_queue_op *per_queue_opt)
2320{
2321        u32 bit;
2322        int ret;
2323        DECLARE_BITMAP(queue_mask, MAX_NUM_QUEUE);
2324
2325        if (!dev->ethtool_ops->get_per_queue_coalesce)
2326                return -EOPNOTSUPP;
2327
2328        useraddr += sizeof(*per_queue_opt);
2329
2330        bitmap_from_u32array(queue_mask,
2331                             MAX_NUM_QUEUE,
2332                             per_queue_opt->queue_mask,
2333                             DIV_ROUND_UP(MAX_NUM_QUEUE, 32));
2334
2335        for_each_set_bit(bit, queue_mask, MAX_NUM_QUEUE) {
2336                struct ethtool_coalesce coalesce = { .cmd = ETHTOOL_GCOALESCE };
2337
2338                ret = dev->ethtool_ops->get_per_queue_coalesce(dev, bit, &coalesce);
2339                if (ret != 0)
2340                        return ret;
2341                if (copy_to_user(useraddr, &coalesce, sizeof(coalesce)))
2342                        return -EFAULT;
2343                useraddr += sizeof(coalesce);
2344        }
2345
2346        return 0;
2347}
2348
2349static int ethtool_set_per_queue_coalesce(struct net_device *dev,
2350                                          void __user *useraddr,
2351                                          struct ethtool_per_queue_op *per_queue_opt)
2352{
2353        u32 bit;
2354        int i, ret = 0;
2355        int n_queue;
2356        struct ethtool_coalesce *backup = NULL, *tmp = NULL;
2357        DECLARE_BITMAP(queue_mask, MAX_NUM_QUEUE);
2358
2359        if ((!dev->ethtool_ops->set_per_queue_coalesce) ||
2360            (!dev->ethtool_ops->get_per_queue_coalesce))
2361                return -EOPNOTSUPP;
2362
2363        useraddr += sizeof(*per_queue_opt);
2364
2365        bitmap_from_u32array(queue_mask,
2366                             MAX_NUM_QUEUE,
2367                             per_queue_opt->queue_mask,
2368                             DIV_ROUND_UP(MAX_NUM_QUEUE, 32));
2369        n_queue = bitmap_weight(queue_mask, MAX_NUM_QUEUE);
2370        tmp = backup = kmalloc_array(n_queue, sizeof(*backup), GFP_KERNEL);
2371        if (!backup)
2372                return -ENOMEM;
2373
2374        for_each_set_bit(bit, queue_mask, MAX_NUM_QUEUE) {
2375                struct ethtool_coalesce coalesce;
2376
2377                ret = dev->ethtool_ops->get_per_queue_coalesce(dev, bit, tmp);
2378                if (ret != 0)
2379                        goto roll_back;
2380
2381                tmp++;
2382
2383                if (copy_from_user(&coalesce, useraddr, sizeof(coalesce))) {
2384                        ret = -EFAULT;
2385                        goto roll_back;
2386                }
2387
2388                ret = dev->ethtool_ops->set_per_queue_coalesce(dev, bit, &coalesce);
2389                if (ret != 0)
2390                        goto roll_back;
2391
2392                useraddr += sizeof(coalesce);
2393        }
2394
2395roll_back:
2396        if (ret != 0) {
2397                tmp = backup;
2398                for_each_set_bit(i, queue_mask, bit) {
2399                        dev->ethtool_ops->set_per_queue_coalesce(dev, i, tmp);
2400                        tmp++;
2401                }
2402        }
2403        kfree(backup);
2404
2405        return ret;
2406}
2407
2408static int ethtool_set_per_queue(struct net_device *dev, void __user *useraddr)
2409{
2410        struct ethtool_per_queue_op per_queue_opt;
2411
2412        if (copy_from_user(&per_queue_opt, useraddr, sizeof(per_queue_opt)))
2413                return -EFAULT;
2414
2415        switch (per_queue_opt.sub_command) {
2416        case ETHTOOL_GCOALESCE:
2417                return ethtool_get_per_queue_coalesce(dev, useraddr, &per_queue_opt);
2418        case ETHTOOL_SCOALESCE:
2419                return ethtool_set_per_queue_coalesce(dev, useraddr, &per_queue_opt);
2420        default:
2421                return -EOPNOTSUPP;
2422        };
2423}
2424
2425/* The main entry point in this file.  Called from net/core/dev_ioctl.c */
2426
2427int dev_ethtool(struct net *net, struct ifreq *ifr)
2428{
2429        struct net_device *dev = __dev_get_by_name(net, ifr->ifr_name);
2430        void __user *useraddr = ifr->ifr_data;
2431        u32 ethcmd, sub_cmd;
2432        int rc;
2433        netdev_features_t old_features;
2434
2435        if (!dev || !netif_device_present(dev))
2436                return -ENODEV;
2437
2438        if (copy_from_user(&ethcmd, useraddr, sizeof(ethcmd)))
2439                return -EFAULT;
2440
2441        if (ethcmd == ETHTOOL_PERQUEUE) {
2442                if (copy_from_user(&sub_cmd, useraddr + sizeof(ethcmd), sizeof(sub_cmd)))
2443                        return -EFAULT;
2444        } else {
2445                sub_cmd = ethcmd;
2446        }
2447        /* Allow some commands to be done by anyone */
2448        switch (sub_cmd) {
2449        case ETHTOOL_GSET:
2450        case ETHTOOL_GDRVINFO:
2451        case ETHTOOL_GMSGLVL:
2452        case ETHTOOL_GLINK:
2453        case ETHTOOL_GCOALESCE:
2454        case ETHTOOL_GRINGPARAM:
2455        case ETHTOOL_GPAUSEPARAM:
2456        case ETHTOOL_GRXCSUM:
2457        case ETHTOOL_GTXCSUM:
2458        case ETHTOOL_GSG:
2459        case ETHTOOL_GSSET_INFO:
2460        case ETHTOOL_GSTRINGS:
2461        case ETHTOOL_GSTATS:
2462        case ETHTOOL_GPHYSTATS:
2463        case ETHTOOL_GTSO:
2464        case ETHTOOL_GPERMADDR:
2465        case ETHTOOL_GUFO:
2466        case ETHTOOL_GGSO:
2467        case ETHTOOL_GGRO:
2468        case ETHTOOL_GFLAGS:
2469        case ETHTOOL_GPFLAGS:
2470        case ETHTOOL_GRXFH:
2471        case ETHTOOL_GRXRINGS:
2472        case ETHTOOL_GRXCLSRLCNT:
2473        case ETHTOOL_GRXCLSRULE:
2474        case ETHTOOL_GRXCLSRLALL:
2475        case ETHTOOL_GRXFHINDIR:
2476        case ETHTOOL_GRSSH:
2477        case ETHTOOL_GFEATURES:
2478        case ETHTOOL_GCHANNELS:
2479        case ETHTOOL_GET_TS_INFO:
2480        case ETHTOOL_GEEE:
2481        case ETHTOOL_GTUNABLE:
2482        case ETHTOOL_GLINKSETTINGS:
2483                break;
2484        default:
2485                if (!ns_capable(net->user_ns, CAP_NET_ADMIN))
2486                        return -EPERM;
2487        }
2488
2489        if (dev->ethtool_ops->begin) {
2490                rc = dev->ethtool_ops->begin(dev);
2491                if (rc  < 0)
2492                        return rc;
2493        }
2494        old_features = dev->features;
2495
2496        switch (ethcmd) {
2497        case ETHTOOL_GSET:
2498                rc = ethtool_get_settings(dev, useraddr);
2499                break;
2500        case ETHTOOL_SSET:
2501                rc = ethtool_set_settings(dev, useraddr);
2502                break;
2503        case ETHTOOL_GDRVINFO:
2504                rc = ethtool_get_drvinfo(dev, useraddr);
2505                break;
2506        case ETHTOOL_GREGS:
2507                rc = ethtool_get_regs(dev, useraddr);
2508                break;
2509        case ETHTOOL_GWOL:
2510                rc = ethtool_get_wol(dev, useraddr);
2511                break;
2512        case ETHTOOL_SWOL:
2513                rc = ethtool_set_wol(dev, useraddr);
2514                break;
2515        case ETHTOOL_GMSGLVL:
2516                rc = ethtool_get_value(dev, useraddr, ethcmd,
2517                                       dev->ethtool_ops->get_msglevel);
2518                break;
2519        case ETHTOOL_SMSGLVL:
2520                rc = ethtool_set_value_void(dev, useraddr,
2521                                       dev->ethtool_ops->set_msglevel);
2522                break;
2523        case ETHTOOL_GEEE:
2524                rc = ethtool_get_eee(dev, useraddr);
2525                break;
2526        case ETHTOOL_SEEE:
2527                rc = ethtool_set_eee(dev, useraddr);
2528                break;
2529        case ETHTOOL_NWAY_RST:
2530                rc = ethtool_nway_reset(dev);
2531                break;
2532        case ETHTOOL_GLINK:
2533                rc = ethtool_get_link(dev, useraddr);
2534                break;
2535        case ETHTOOL_GEEPROM:
2536                rc = ethtool_get_eeprom(dev, useraddr);
2537                break;
2538        case ETHTOOL_SEEPROM:
2539                rc = ethtool_set_eeprom(dev, useraddr);
2540                break;
2541        case ETHTOOL_GCOALESCE:
2542                rc = ethtool_get_coalesce(dev, useraddr);
2543                break;
2544        case ETHTOOL_SCOALESCE:
2545                rc = ethtool_set_coalesce(dev, useraddr);
2546                break;
2547        case ETHTOOL_GRINGPARAM:
2548                rc = ethtool_get_ringparam(dev, useraddr);
2549                break;
2550        case ETHTOOL_SRINGPARAM:
2551                rc = ethtool_set_ringparam(dev, useraddr);
2552                break;
2553        case ETHTOOL_GPAUSEPARAM:
2554                rc = ethtool_get_pauseparam(dev, useraddr);
2555                break;
2556        case ETHTOOL_SPAUSEPARAM:
2557                rc = ethtool_set_pauseparam(dev, useraddr);
2558                break;
2559        case ETHTOOL_TEST:
2560                rc = ethtool_self_test(dev, useraddr);
2561                break;
2562        case ETHTOOL_GSTRINGS:
2563                rc = ethtool_get_strings(dev, useraddr);
2564                break;
2565        case ETHTOOL_PHYS_ID:
2566                rc = ethtool_phys_id(dev, useraddr);
2567                break;
2568        case ETHTOOL_GSTATS:
2569                rc = ethtool_get_stats(dev, useraddr);
2570                break;
2571        case ETHTOOL_GPERMADDR:
2572                rc = ethtool_get_perm_addr(dev, useraddr);
2573                break;
2574        case ETHTOOL_GFLAGS:
2575                rc = ethtool_get_value(dev, useraddr, ethcmd,
2576                                        __ethtool_get_flags);
2577                break;
2578        case ETHTOOL_SFLAGS:
2579                rc = ethtool_set_value(dev, useraddr, __ethtool_set_flags);
2580                break;
2581        case ETHTOOL_GPFLAGS:
2582                rc = ethtool_get_value(dev, useraddr, ethcmd,
2583                                       dev->ethtool_ops->get_priv_flags);
2584                break;
2585        case ETHTOOL_SPFLAGS:
2586                rc = ethtool_set_value(dev, useraddr,
2587                                       dev->ethtool_ops->set_priv_flags);
2588                break;
2589        case ETHTOOL_GRXFH:
2590        case ETHTOOL_GRXRINGS:
2591        case ETHTOOL_GRXCLSRLCNT:
2592        case ETHTOOL_GRXCLSRULE:
2593        case ETHTOOL_GRXCLSRLALL:
2594                rc = ethtool_get_rxnfc(dev, ethcmd, useraddr);
2595                break;
2596        case ETHTOOL_SRXFH:
2597        case ETHTOOL_SRXCLSRLDEL:
2598        case ETHTOOL_SRXCLSRLINS:
2599                rc = ethtool_set_rxnfc(dev, ethcmd, useraddr);
2600                break;
2601        case ETHTOOL_FLASHDEV:
2602                rc = ethtool_flash_device(dev, useraddr);
2603                break;
2604        case ETHTOOL_RESET:
2605                rc = ethtool_reset(dev, useraddr);
2606                break;
2607        case ETHTOOL_GSSET_INFO:
2608                rc = ethtool_get_sset_info(dev, useraddr);
2609                break;
2610        case ETHTOOL_GRXFHINDIR:
2611                rc = ethtool_get_rxfh_indir(dev, useraddr);
2612                break;
2613        case ETHTOOL_SRXFHINDIR:
2614                rc = ethtool_set_rxfh_indir(dev, useraddr);
2615                break;
2616        case ETHTOOL_GRSSH:
2617                rc = ethtool_get_rxfh(dev, useraddr);
2618                break;
2619        case ETHTOOL_SRSSH:
2620                rc = ethtool_set_rxfh(dev, useraddr);
2621                break;
2622        case ETHTOOL_GFEATURES:
2623                rc = ethtool_get_features(dev, useraddr);
2624                break;
2625        case ETHTOOL_SFEATURES:
2626                rc = ethtool_set_features(dev, useraddr);
2627                break;
2628        case ETHTOOL_GTXCSUM:
2629        case ETHTOOL_GRXCSUM:
2630        case ETHTOOL_GSG:
2631        case ETHTOOL_GTSO:
2632        case ETHTOOL_GUFO:
2633        case ETHTOOL_GGSO:
2634        case ETHTOOL_GGRO:
2635                rc = ethtool_get_one_feature(dev, useraddr, ethcmd);
2636                break;
2637        case ETHTOOL_STXCSUM:
2638        case ETHTOOL_SRXCSUM:
2639        case ETHTOOL_SSG:
2640        case ETHTOOL_STSO:
2641        case ETHTOOL_SUFO:
2642        case ETHTOOL_SGSO:
2643        case ETHTOOL_SGRO:
2644                rc = ethtool_set_one_feature(dev, useraddr, ethcmd);
2645                break;
2646        case ETHTOOL_GCHANNELS:
2647                rc = ethtool_get_channels(dev, useraddr);
2648                break;
2649        case ETHTOOL_SCHANNELS:
2650                rc = ethtool_set_channels(dev, useraddr);
2651                break;
2652        case ETHTOOL_SET_DUMP:
2653                rc = ethtool_set_dump(dev, useraddr);
2654                break;
2655        case ETHTOOL_GET_DUMP_FLAG:
2656                rc = ethtool_get_dump_flag(dev, useraddr);
2657                break;
2658        case ETHTOOL_GET_DUMP_DATA:
2659                rc = ethtool_get_dump_data(dev, useraddr);
2660                break;
2661        case ETHTOOL_GET_TS_INFO:
2662                rc = ethtool_get_ts_info(dev, useraddr);
2663                break;
2664        case ETHTOOL_GMODULEINFO:
2665                rc = ethtool_get_module_info(dev, useraddr);
2666                break;
2667        case ETHTOOL_GMODULEEEPROM:
2668                rc = ethtool_get_module_eeprom(dev, useraddr);
2669                break;
2670        case ETHTOOL_GTUNABLE:
2671                rc = ethtool_get_tunable(dev, useraddr);
2672                break;
2673        case ETHTOOL_STUNABLE:
2674                rc = ethtool_set_tunable(dev, useraddr);
2675                break;
2676        case ETHTOOL_GPHYSTATS:
2677                rc = ethtool_get_phy_stats(dev, useraddr);
2678                break;
2679        case ETHTOOL_PERQUEUE:
2680                rc = ethtool_set_per_queue(dev, useraddr);
2681                break;
2682        case ETHTOOL_GLINKSETTINGS:
2683                rc = ethtool_get_link_ksettings(dev, useraddr);
2684                break;
2685        case ETHTOOL_SLINKSETTINGS:
2686                rc = ethtool_set_link_ksettings(dev, useraddr);
2687                break;
2688        default:
2689                rc = -EOPNOTSUPP;
2690        }
2691
2692        if (dev->ethtool_ops->complete)
2693                dev->ethtool_ops->complete(dev);
2694
2695        if (old_features != dev->features)
2696                netdev_features_change(dev);
2697
2698        return rc;
2699}
2700