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