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