at v4.5-rc2 51 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_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_IPIP_BIT] = "tx-ipip-segmentation", 86 [NETIF_F_GSO_SIT_BIT] = "tx-sit-segmentation", 87 [NETIF_F_GSO_UDP_TUNNEL_BIT] = "tx-udp_tnl-segmentation", 88 89 [NETIF_F_FCOE_CRC_BIT] = "tx-checksum-fcoe-crc", 90 [NETIF_F_SCTP_CRC_BIT] = "tx-checksum-sctp", 91 [NETIF_F_FCOE_MTU_BIT] = "fcoe-mtu", 92 [NETIF_F_NTUPLE_BIT] = "rx-ntuple-filter", 93 [NETIF_F_RXHASH_BIT] = "rx-hashing", 94 [NETIF_F_RXCSUM_BIT] = "rx-checksum", 95 [NETIF_F_NOCACHE_COPY_BIT] = "tx-nocache-copy", 96 [NETIF_F_LOOPBACK_BIT] = "loopback", 97 [NETIF_F_RXFCS_BIT] = "rx-fcs", 98 [NETIF_F_RXALL_BIT] = "rx-all", 99 [NETIF_F_HW_L2FW_DOFFLOAD_BIT] = "l2-fwd-offload", 100 [NETIF_F_BUSY_POLL_BIT] = "busy-poll", 101}; 102 103static const char 104rss_hash_func_strings[ETH_RSS_HASH_FUNCS_COUNT][ETH_GSTRING_LEN] = { 105 [ETH_RSS_HASH_TOP_BIT] = "toeplitz", 106 [ETH_RSS_HASH_XOR_BIT] = "xor", 107}; 108 109static const char 110tunable_strings[__ETHTOOL_TUNABLE_COUNT][ETH_GSTRING_LEN] = { 111 [ETHTOOL_ID_UNSPEC] = "Unspec", 112 [ETHTOOL_RX_COPYBREAK] = "rx-copybreak", 113 [ETHTOOL_TX_COPYBREAK] = "tx-copybreak", 114}; 115 116static int ethtool_get_features(struct net_device *dev, void __user *useraddr) 117{ 118 struct ethtool_gfeatures cmd = { 119 .cmd = ETHTOOL_GFEATURES, 120 .size = ETHTOOL_DEV_FEATURE_WORDS, 121 }; 122 struct ethtool_get_features_block features[ETHTOOL_DEV_FEATURE_WORDS]; 123 u32 __user *sizeaddr; 124 u32 copy_size; 125 int i; 126 127 /* in case feature bits run out again */ 128 BUILD_BUG_ON(ETHTOOL_DEV_FEATURE_WORDS * sizeof(u32) > sizeof(netdev_features_t)); 129 130 for (i = 0; i < ETHTOOL_DEV_FEATURE_WORDS; ++i) { 131 features[i].available = (u32)(dev->hw_features >> (32 * i)); 132 features[i].requested = (u32)(dev->wanted_features >> (32 * i)); 133 features[i].active = (u32)(dev->features >> (32 * i)); 134 features[i].never_changed = 135 (u32)(NETIF_F_NEVER_CHANGE >> (32 * i)); 136 } 137 138 sizeaddr = useraddr + offsetof(struct ethtool_gfeatures, size); 139 if (get_user(copy_size, sizeaddr)) 140 return -EFAULT; 141 142 if (copy_size > ETHTOOL_DEV_FEATURE_WORDS) 143 copy_size = ETHTOOL_DEV_FEATURE_WORDS; 144 145 if (copy_to_user(useraddr, &cmd, sizeof(cmd))) 146 return -EFAULT; 147 useraddr += sizeof(cmd); 148 if (copy_to_user(useraddr, features, copy_size * sizeof(*features))) 149 return -EFAULT; 150 151 return 0; 152} 153 154static int ethtool_set_features(struct net_device *dev, void __user *useraddr) 155{ 156 struct ethtool_sfeatures cmd; 157 struct ethtool_set_features_block features[ETHTOOL_DEV_FEATURE_WORDS]; 158 netdev_features_t wanted = 0, valid = 0; 159 int i, ret = 0; 160 161 if (copy_from_user(&cmd, useraddr, sizeof(cmd))) 162 return -EFAULT; 163 useraddr += sizeof(cmd); 164 165 if (cmd.size != ETHTOOL_DEV_FEATURE_WORDS) 166 return -EINVAL; 167 168 if (copy_from_user(features, useraddr, sizeof(features))) 169 return -EFAULT; 170 171 for (i = 0; i < ETHTOOL_DEV_FEATURE_WORDS; ++i) { 172 valid |= (netdev_features_t)features[i].valid << (32 * i); 173 wanted |= (netdev_features_t)features[i].requested << (32 * i); 174 } 175 176 if (valid & ~NETIF_F_ETHTOOL_BITS) 177 return -EINVAL; 178 179 if (valid & ~dev->hw_features) { 180 valid &= dev->hw_features; 181 ret |= ETHTOOL_F_UNSUPPORTED; 182 } 183 184 dev->wanted_features &= ~valid; 185 dev->wanted_features |= wanted & valid; 186 __netdev_update_features(dev); 187 188 if ((dev->wanted_features ^ dev->features) & valid) 189 ret |= ETHTOOL_F_WISH; 190 191 return ret; 192} 193 194static int phy_get_sset_count(struct phy_device *phydev) 195{ 196 int ret; 197 198 if (phydev->drv->get_sset_count && 199 phydev->drv->get_strings && 200 phydev->drv->get_stats) { 201 mutex_lock(&phydev->lock); 202 ret = phydev->drv->get_sset_count(phydev); 203 mutex_unlock(&phydev->lock); 204 205 return ret; 206 } 207 208 return -EOPNOTSUPP; 209} 210 211static int __ethtool_get_sset_count(struct net_device *dev, int sset) 212{ 213 const struct ethtool_ops *ops = dev->ethtool_ops; 214 215 if (sset == ETH_SS_FEATURES) 216 return ARRAY_SIZE(netdev_features_strings); 217 218 if (sset == ETH_SS_RSS_HASH_FUNCS) 219 return ARRAY_SIZE(rss_hash_func_strings); 220 221 if (sset == ETH_SS_TUNABLES) 222 return ARRAY_SIZE(tunable_strings); 223 224 if (sset == ETH_SS_PHY_STATS) { 225 if (dev->phydev) 226 return phy_get_sset_count(dev->phydev); 227 else 228 return -EOPNOTSUPP; 229 } 230 231 if (ops->get_sset_count && ops->get_strings) 232 return ops->get_sset_count(dev, sset); 233 else 234 return -EOPNOTSUPP; 235} 236 237static void __ethtool_get_strings(struct net_device *dev, 238 u32 stringset, u8 *data) 239{ 240 const struct ethtool_ops *ops = dev->ethtool_ops; 241 242 if (stringset == ETH_SS_FEATURES) 243 memcpy(data, netdev_features_strings, 244 sizeof(netdev_features_strings)); 245 else if (stringset == ETH_SS_RSS_HASH_FUNCS) 246 memcpy(data, rss_hash_func_strings, 247 sizeof(rss_hash_func_strings)); 248 else if (stringset == ETH_SS_TUNABLES) 249 memcpy(data, tunable_strings, sizeof(tunable_strings)); 250 else if (stringset == ETH_SS_PHY_STATS) { 251 struct phy_device *phydev = dev->phydev; 252 253 if (phydev) { 254 mutex_lock(&phydev->lock); 255 phydev->drv->get_strings(phydev, data); 256 mutex_unlock(&phydev->lock); 257 } else { 258 return; 259 } 260 } else 261 /* ops->get_strings is valid because checked earlier */ 262 ops->get_strings(dev, stringset, data); 263} 264 265static netdev_features_t ethtool_get_feature_mask(u32 eth_cmd) 266{ 267 /* feature masks of legacy discrete ethtool ops */ 268 269 switch (eth_cmd) { 270 case ETHTOOL_GTXCSUM: 271 case ETHTOOL_STXCSUM: 272 return NETIF_F_CSUM_MASK | NETIF_F_SCTP_CRC; 273 case ETHTOOL_GRXCSUM: 274 case ETHTOOL_SRXCSUM: 275 return NETIF_F_RXCSUM; 276 case ETHTOOL_GSG: 277 case ETHTOOL_SSG: 278 return NETIF_F_SG; 279 case ETHTOOL_GTSO: 280 case ETHTOOL_STSO: 281 return NETIF_F_ALL_TSO; 282 case ETHTOOL_GUFO: 283 case ETHTOOL_SUFO: 284 return NETIF_F_UFO; 285 case ETHTOOL_GGSO: 286 case ETHTOOL_SGSO: 287 return NETIF_F_GSO; 288 case ETHTOOL_GGRO: 289 case ETHTOOL_SGRO: 290 return NETIF_F_GRO; 291 default: 292 BUG(); 293 } 294} 295 296static int ethtool_get_one_feature(struct net_device *dev, 297 char __user *useraddr, u32 ethcmd) 298{ 299 netdev_features_t mask = ethtool_get_feature_mask(ethcmd); 300 struct ethtool_value edata = { 301 .cmd = ethcmd, 302 .data = !!(dev->features & mask), 303 }; 304 305 if (copy_to_user(useraddr, &edata, sizeof(edata))) 306 return -EFAULT; 307 return 0; 308} 309 310static int ethtool_set_one_feature(struct net_device *dev, 311 void __user *useraddr, u32 ethcmd) 312{ 313 struct ethtool_value edata; 314 netdev_features_t mask; 315 316 if (copy_from_user(&edata, useraddr, sizeof(edata))) 317 return -EFAULT; 318 319 mask = ethtool_get_feature_mask(ethcmd); 320 mask &= dev->hw_features; 321 if (!mask) 322 return -EOPNOTSUPP; 323 324 if (edata.data) 325 dev->wanted_features |= mask; 326 else 327 dev->wanted_features &= ~mask; 328 329 __netdev_update_features(dev); 330 331 return 0; 332} 333 334#define ETH_ALL_FLAGS (ETH_FLAG_LRO | ETH_FLAG_RXVLAN | ETH_FLAG_TXVLAN | \ 335 ETH_FLAG_NTUPLE | ETH_FLAG_RXHASH) 336#define ETH_ALL_FEATURES (NETIF_F_LRO | NETIF_F_HW_VLAN_CTAG_RX | \ 337 NETIF_F_HW_VLAN_CTAG_TX | NETIF_F_NTUPLE | \ 338 NETIF_F_RXHASH) 339 340static u32 __ethtool_get_flags(struct net_device *dev) 341{ 342 u32 flags = 0; 343 344 if (dev->features & NETIF_F_LRO) 345 flags |= ETH_FLAG_LRO; 346 if (dev->features & NETIF_F_HW_VLAN_CTAG_RX) 347 flags |= ETH_FLAG_RXVLAN; 348 if (dev->features & NETIF_F_HW_VLAN_CTAG_TX) 349 flags |= ETH_FLAG_TXVLAN; 350 if (dev->features & NETIF_F_NTUPLE) 351 flags |= ETH_FLAG_NTUPLE; 352 if (dev->features & NETIF_F_RXHASH) 353 flags |= ETH_FLAG_RXHASH; 354 355 return flags; 356} 357 358static int __ethtool_set_flags(struct net_device *dev, u32 data) 359{ 360 netdev_features_t features = 0, changed; 361 362 if (data & ~ETH_ALL_FLAGS) 363 return -EINVAL; 364 365 if (data & ETH_FLAG_LRO) 366 features |= NETIF_F_LRO; 367 if (data & ETH_FLAG_RXVLAN) 368 features |= NETIF_F_HW_VLAN_CTAG_RX; 369 if (data & ETH_FLAG_TXVLAN) 370 features |= NETIF_F_HW_VLAN_CTAG_TX; 371 if (data & ETH_FLAG_NTUPLE) 372 features |= NETIF_F_NTUPLE; 373 if (data & ETH_FLAG_RXHASH) 374 features |= NETIF_F_RXHASH; 375 376 /* allow changing only bits set in hw_features */ 377 changed = (features ^ dev->features) & ETH_ALL_FEATURES; 378 if (changed & ~dev->hw_features) 379 return (changed & dev->hw_features) ? -EINVAL : -EOPNOTSUPP; 380 381 dev->wanted_features = 382 (dev->wanted_features & ~changed) | (features & changed); 383 384 __netdev_update_features(dev); 385 386 return 0; 387} 388 389int __ethtool_get_settings(struct net_device *dev, struct ethtool_cmd *cmd) 390{ 391 ASSERT_RTNL(); 392 393 if (!dev->ethtool_ops->get_settings) 394 return -EOPNOTSUPP; 395 396 memset(cmd, 0, sizeof(struct ethtool_cmd)); 397 cmd->cmd = ETHTOOL_GSET; 398 return dev->ethtool_ops->get_settings(dev, cmd); 399} 400EXPORT_SYMBOL(__ethtool_get_settings); 401 402static int ethtool_get_settings(struct net_device *dev, void __user *useraddr) 403{ 404 int err; 405 struct ethtool_cmd cmd; 406 407 err = __ethtool_get_settings(dev, &cmd); 408 if (err < 0) 409 return err; 410 411 if (copy_to_user(useraddr, &cmd, sizeof(cmd))) 412 return -EFAULT; 413 return 0; 414} 415 416static int ethtool_set_settings(struct net_device *dev, void __user *useraddr) 417{ 418 struct ethtool_cmd cmd; 419 420 if (!dev->ethtool_ops->set_settings) 421 return -EOPNOTSUPP; 422 423 if (copy_from_user(&cmd, useraddr, sizeof(cmd))) 424 return -EFAULT; 425 426 return dev->ethtool_ops->set_settings(dev, &cmd); 427} 428 429static noinline_for_stack int ethtool_get_drvinfo(struct net_device *dev, 430 void __user *useraddr) 431{ 432 struct ethtool_drvinfo info; 433 const struct ethtool_ops *ops = dev->ethtool_ops; 434 435 memset(&info, 0, sizeof(info)); 436 info.cmd = ETHTOOL_GDRVINFO; 437 if (ops->get_drvinfo) { 438 ops->get_drvinfo(dev, &info); 439 } else if (dev->dev.parent && dev->dev.parent->driver) { 440 strlcpy(info.bus_info, dev_name(dev->dev.parent), 441 sizeof(info.bus_info)); 442 strlcpy(info.driver, dev->dev.parent->driver->name, 443 sizeof(info.driver)); 444 } else { 445 return -EOPNOTSUPP; 446 } 447 448 /* 449 * this method of obtaining string set info is deprecated; 450 * Use ETHTOOL_GSSET_INFO instead. 451 */ 452 if (ops->get_sset_count) { 453 int rc; 454 455 rc = ops->get_sset_count(dev, ETH_SS_TEST); 456 if (rc >= 0) 457 info.testinfo_len = rc; 458 rc = ops->get_sset_count(dev, ETH_SS_STATS); 459 if (rc >= 0) 460 info.n_stats = rc; 461 rc = ops->get_sset_count(dev, ETH_SS_PRIV_FLAGS); 462 if (rc >= 0) 463 info.n_priv_flags = rc; 464 } 465 if (ops->get_regs_len) 466 info.regdump_len = ops->get_regs_len(dev); 467 if (ops->get_eeprom_len) 468 info.eedump_len = ops->get_eeprom_len(dev); 469 470 if (copy_to_user(useraddr, &info, sizeof(info))) 471 return -EFAULT; 472 return 0; 473} 474 475static noinline_for_stack int ethtool_get_sset_info(struct net_device *dev, 476 void __user *useraddr) 477{ 478 struct ethtool_sset_info info; 479 u64 sset_mask; 480 int i, idx = 0, n_bits = 0, ret, rc; 481 u32 *info_buf = NULL; 482 483 if (copy_from_user(&info, useraddr, sizeof(info))) 484 return -EFAULT; 485 486 /* store copy of mask, because we zero struct later on */ 487 sset_mask = info.sset_mask; 488 if (!sset_mask) 489 return 0; 490 491 /* calculate size of return buffer */ 492 n_bits = hweight64(sset_mask); 493 494 memset(&info, 0, sizeof(info)); 495 info.cmd = ETHTOOL_GSSET_INFO; 496 497 info_buf = kzalloc(n_bits * sizeof(u32), GFP_USER); 498 if (!info_buf) 499 return -ENOMEM; 500 501 /* 502 * fill return buffer based on input bitmask and successful 503 * get_sset_count return 504 */ 505 for (i = 0; i < 64; i++) { 506 if (!(sset_mask & (1ULL << i))) 507 continue; 508 509 rc = __ethtool_get_sset_count(dev, i); 510 if (rc >= 0) { 511 info.sset_mask |= (1ULL << i); 512 info_buf[idx++] = rc; 513 } 514 } 515 516 ret = -EFAULT; 517 if (copy_to_user(useraddr, &info, sizeof(info))) 518 goto out; 519 520 useraddr += offsetof(struct ethtool_sset_info, data); 521 if (copy_to_user(useraddr, info_buf, idx * sizeof(u32))) 522 goto out; 523 524 ret = 0; 525 526out: 527 kfree(info_buf); 528 return ret; 529} 530 531static noinline_for_stack int ethtool_set_rxnfc(struct net_device *dev, 532 u32 cmd, void __user *useraddr) 533{ 534 struct ethtool_rxnfc info; 535 size_t info_size = sizeof(info); 536 int rc; 537 538 if (!dev->ethtool_ops->set_rxnfc) 539 return -EOPNOTSUPP; 540 541 /* struct ethtool_rxnfc was originally defined for 542 * ETHTOOL_{G,S}RXFH with only the cmd, flow_type and data 543 * members. User-space might still be using that 544 * definition. */ 545 if (cmd == ETHTOOL_SRXFH) 546 info_size = (offsetof(struct ethtool_rxnfc, data) + 547 sizeof(info.data)); 548 549 if (copy_from_user(&info, useraddr, info_size)) 550 return -EFAULT; 551 552 rc = dev->ethtool_ops->set_rxnfc(dev, &info); 553 if (rc) 554 return rc; 555 556 if (cmd == ETHTOOL_SRXCLSRLINS && 557 copy_to_user(useraddr, &info, info_size)) 558 return -EFAULT; 559 560 return 0; 561} 562 563static noinline_for_stack int ethtool_get_rxnfc(struct net_device *dev, 564 u32 cmd, void __user *useraddr) 565{ 566 struct ethtool_rxnfc info; 567 size_t info_size = sizeof(info); 568 const struct ethtool_ops *ops = dev->ethtool_ops; 569 int ret; 570 void *rule_buf = NULL; 571 572 if (!ops->get_rxnfc) 573 return -EOPNOTSUPP; 574 575 /* struct ethtool_rxnfc was originally defined for 576 * ETHTOOL_{G,S}RXFH with only the cmd, flow_type and data 577 * members. User-space might still be using that 578 * definition. */ 579 if (cmd == ETHTOOL_GRXFH) 580 info_size = (offsetof(struct ethtool_rxnfc, data) + 581 sizeof(info.data)); 582 583 if (copy_from_user(&info, useraddr, info_size)) 584 return -EFAULT; 585 586 if (info.cmd == ETHTOOL_GRXCLSRLALL) { 587 if (info.rule_cnt > 0) { 588 if (info.rule_cnt <= KMALLOC_MAX_SIZE / sizeof(u32)) 589 rule_buf = kzalloc(info.rule_cnt * sizeof(u32), 590 GFP_USER); 591 if (!rule_buf) 592 return -ENOMEM; 593 } 594 } 595 596 ret = ops->get_rxnfc(dev, &info, rule_buf); 597 if (ret < 0) 598 goto err_out; 599 600 ret = -EFAULT; 601 if (copy_to_user(useraddr, &info, info_size)) 602 goto err_out; 603 604 if (rule_buf) { 605 useraddr += offsetof(struct ethtool_rxnfc, rule_locs); 606 if (copy_to_user(useraddr, rule_buf, 607 info.rule_cnt * sizeof(u32))) 608 goto err_out; 609 } 610 ret = 0; 611 612err_out: 613 kfree(rule_buf); 614 615 return ret; 616} 617 618static int ethtool_copy_validate_indir(u32 *indir, void __user *useraddr, 619 struct ethtool_rxnfc *rx_rings, 620 u32 size) 621{ 622 int i; 623 624 if (copy_from_user(indir, useraddr, size * sizeof(indir[0]))) 625 return -EFAULT; 626 627 /* Validate ring indices */ 628 for (i = 0; i < size; i++) 629 if (indir[i] >= rx_rings->data) 630 return -EINVAL; 631 632 return 0; 633} 634 635u8 netdev_rss_key[NETDEV_RSS_KEY_LEN]; 636 637void netdev_rss_key_fill(void *buffer, size_t len) 638{ 639 BUG_ON(len > sizeof(netdev_rss_key)); 640 net_get_random_once(netdev_rss_key, sizeof(netdev_rss_key)); 641 memcpy(buffer, netdev_rss_key, len); 642} 643EXPORT_SYMBOL(netdev_rss_key_fill); 644 645static noinline_for_stack int ethtool_get_rxfh_indir(struct net_device *dev, 646 void __user *useraddr) 647{ 648 u32 user_size, dev_size; 649 u32 *indir; 650 int ret; 651 652 if (!dev->ethtool_ops->get_rxfh_indir_size || 653 !dev->ethtool_ops->get_rxfh) 654 return -EOPNOTSUPP; 655 dev_size = dev->ethtool_ops->get_rxfh_indir_size(dev); 656 if (dev_size == 0) 657 return -EOPNOTSUPP; 658 659 if (copy_from_user(&user_size, 660 useraddr + offsetof(struct ethtool_rxfh_indir, size), 661 sizeof(user_size))) 662 return -EFAULT; 663 664 if (copy_to_user(useraddr + offsetof(struct ethtool_rxfh_indir, size), 665 &dev_size, sizeof(dev_size))) 666 return -EFAULT; 667 668 /* If the user buffer size is 0, this is just a query for the 669 * device table size. Otherwise, if it's smaller than the 670 * device table size it's an error. 671 */ 672 if (user_size < dev_size) 673 return user_size == 0 ? 0 : -EINVAL; 674 675 indir = kcalloc(dev_size, sizeof(indir[0]), GFP_USER); 676 if (!indir) 677 return -ENOMEM; 678 679 ret = dev->ethtool_ops->get_rxfh(dev, indir, NULL, NULL); 680 if (ret) 681 goto out; 682 683 if (copy_to_user(useraddr + 684 offsetof(struct ethtool_rxfh_indir, ring_index[0]), 685 indir, dev_size * sizeof(indir[0]))) 686 ret = -EFAULT; 687 688out: 689 kfree(indir); 690 return ret; 691} 692 693static noinline_for_stack int ethtool_set_rxfh_indir(struct net_device *dev, 694 void __user *useraddr) 695{ 696 struct ethtool_rxnfc rx_rings; 697 u32 user_size, dev_size, i; 698 u32 *indir; 699 const struct ethtool_ops *ops = dev->ethtool_ops; 700 int ret; 701 u32 ringidx_offset = offsetof(struct ethtool_rxfh_indir, ring_index[0]); 702 703 if (!ops->get_rxfh_indir_size || !ops->set_rxfh || 704 !ops->get_rxnfc) 705 return -EOPNOTSUPP; 706 707 dev_size = ops->get_rxfh_indir_size(dev); 708 if (dev_size == 0) 709 return -EOPNOTSUPP; 710 711 if (copy_from_user(&user_size, 712 useraddr + offsetof(struct ethtool_rxfh_indir, size), 713 sizeof(user_size))) 714 return -EFAULT; 715 716 if (user_size != 0 && user_size != dev_size) 717 return -EINVAL; 718 719 indir = kcalloc(dev_size, sizeof(indir[0]), GFP_USER); 720 if (!indir) 721 return -ENOMEM; 722 723 rx_rings.cmd = ETHTOOL_GRXRINGS; 724 ret = ops->get_rxnfc(dev, &rx_rings, NULL); 725 if (ret) 726 goto out; 727 728 if (user_size == 0) { 729 for (i = 0; i < dev_size; i++) 730 indir[i] = ethtool_rxfh_indir_default(i, rx_rings.data); 731 } else { 732 ret = ethtool_copy_validate_indir(indir, 733 useraddr + ringidx_offset, 734 &rx_rings, 735 dev_size); 736 if (ret) 737 goto out; 738 } 739 740 ret = ops->set_rxfh(dev, indir, NULL, ETH_RSS_HASH_NO_CHANGE); 741 742out: 743 kfree(indir); 744 return ret; 745} 746 747static noinline_for_stack int ethtool_get_rxfh(struct net_device *dev, 748 void __user *useraddr) 749{ 750 int ret; 751 const struct ethtool_ops *ops = dev->ethtool_ops; 752 u32 user_indir_size, user_key_size; 753 u32 dev_indir_size = 0, dev_key_size = 0; 754 struct ethtool_rxfh rxfh; 755 u32 total_size; 756 u32 indir_bytes; 757 u32 *indir = NULL; 758 u8 dev_hfunc = 0; 759 u8 *hkey = NULL; 760 u8 *rss_config; 761 762 if (!ops->get_rxfh) 763 return -EOPNOTSUPP; 764 765 if (ops->get_rxfh_indir_size) 766 dev_indir_size = ops->get_rxfh_indir_size(dev); 767 if (ops->get_rxfh_key_size) 768 dev_key_size = ops->get_rxfh_key_size(dev); 769 770 if (copy_from_user(&rxfh, useraddr, sizeof(rxfh))) 771 return -EFAULT; 772 user_indir_size = rxfh.indir_size; 773 user_key_size = rxfh.key_size; 774 775 /* Check that reserved fields are 0 for now */ 776 if (rxfh.rss_context || rxfh.rsvd8[0] || rxfh.rsvd8[1] || 777 rxfh.rsvd8[2] || rxfh.rsvd32) 778 return -EINVAL; 779 780 rxfh.indir_size = dev_indir_size; 781 rxfh.key_size = dev_key_size; 782 if (copy_to_user(useraddr, &rxfh, sizeof(rxfh))) 783 return -EFAULT; 784 785 if ((user_indir_size && (user_indir_size != dev_indir_size)) || 786 (user_key_size && (user_key_size != dev_key_size))) 787 return -EINVAL; 788 789 indir_bytes = user_indir_size * sizeof(indir[0]); 790 total_size = indir_bytes + user_key_size; 791 rss_config = kzalloc(total_size, GFP_USER); 792 if (!rss_config) 793 return -ENOMEM; 794 795 if (user_indir_size) 796 indir = (u32 *)rss_config; 797 798 if (user_key_size) 799 hkey = rss_config + indir_bytes; 800 801 ret = dev->ethtool_ops->get_rxfh(dev, indir, hkey, &dev_hfunc); 802 if (ret) 803 goto out; 804 805 if (copy_to_user(useraddr + offsetof(struct ethtool_rxfh, hfunc), 806 &dev_hfunc, sizeof(rxfh.hfunc))) { 807 ret = -EFAULT; 808 } else if (copy_to_user(useraddr + 809 offsetof(struct ethtool_rxfh, rss_config[0]), 810 rss_config, total_size)) { 811 ret = -EFAULT; 812 } 813out: 814 kfree(rss_config); 815 816 return ret; 817} 818 819static noinline_for_stack int ethtool_set_rxfh(struct net_device *dev, 820 void __user *useraddr) 821{ 822 int ret; 823 const struct ethtool_ops *ops = dev->ethtool_ops; 824 struct ethtool_rxnfc rx_rings; 825 struct ethtool_rxfh rxfh; 826 u32 dev_indir_size = 0, dev_key_size = 0, i; 827 u32 *indir = NULL, indir_bytes = 0; 828 u8 *hkey = NULL; 829 u8 *rss_config; 830 u32 rss_cfg_offset = offsetof(struct ethtool_rxfh, rss_config[0]); 831 832 if (!ops->get_rxnfc || !ops->set_rxfh) 833 return -EOPNOTSUPP; 834 835 if (ops->get_rxfh_indir_size) 836 dev_indir_size = ops->get_rxfh_indir_size(dev); 837 if (ops->get_rxfh_key_size) 838 dev_key_size = ops->get_rxfh_key_size(dev); 839 840 if (copy_from_user(&rxfh, useraddr, sizeof(rxfh))) 841 return -EFAULT; 842 843 /* Check that reserved fields are 0 for now */ 844 if (rxfh.rss_context || rxfh.rsvd8[0] || rxfh.rsvd8[1] || 845 rxfh.rsvd8[2] || rxfh.rsvd32) 846 return -EINVAL; 847 848 /* If either indir, hash key or function is valid, proceed further. 849 * Must request at least one change: indir size, hash key or function. 850 */ 851 if ((rxfh.indir_size && 852 rxfh.indir_size != ETH_RXFH_INDIR_NO_CHANGE && 853 rxfh.indir_size != dev_indir_size) || 854 (rxfh.key_size && (rxfh.key_size != dev_key_size)) || 855 (rxfh.indir_size == ETH_RXFH_INDIR_NO_CHANGE && 856 rxfh.key_size == 0 && rxfh.hfunc == ETH_RSS_HASH_NO_CHANGE)) 857 return -EINVAL; 858 859 if (rxfh.indir_size != ETH_RXFH_INDIR_NO_CHANGE) 860 indir_bytes = dev_indir_size * sizeof(indir[0]); 861 862 rss_config = kzalloc(indir_bytes + rxfh.key_size, GFP_USER); 863 if (!rss_config) 864 return -ENOMEM; 865 866 rx_rings.cmd = ETHTOOL_GRXRINGS; 867 ret = ops->get_rxnfc(dev, &rx_rings, NULL); 868 if (ret) 869 goto out; 870 871 /* rxfh.indir_size == 0 means reset the indir table to default. 872 * rxfh.indir_size == ETH_RXFH_INDIR_NO_CHANGE means leave it unchanged. 873 */ 874 if (rxfh.indir_size && 875 rxfh.indir_size != ETH_RXFH_INDIR_NO_CHANGE) { 876 indir = (u32 *)rss_config; 877 ret = ethtool_copy_validate_indir(indir, 878 useraddr + rss_cfg_offset, 879 &rx_rings, 880 rxfh.indir_size); 881 if (ret) 882 goto out; 883 } else if (rxfh.indir_size == 0) { 884 indir = (u32 *)rss_config; 885 for (i = 0; i < dev_indir_size; i++) 886 indir[i] = ethtool_rxfh_indir_default(i, rx_rings.data); 887 } 888 889 if (rxfh.key_size) { 890 hkey = rss_config + indir_bytes; 891 if (copy_from_user(hkey, 892 useraddr + rss_cfg_offset + indir_bytes, 893 rxfh.key_size)) { 894 ret = -EFAULT; 895 goto out; 896 } 897 } 898 899 ret = ops->set_rxfh(dev, indir, hkey, rxfh.hfunc); 900 901out: 902 kfree(rss_config); 903 return ret; 904} 905 906static int ethtool_get_regs(struct net_device *dev, char __user *useraddr) 907{ 908 struct ethtool_regs regs; 909 const struct ethtool_ops *ops = dev->ethtool_ops; 910 void *regbuf; 911 int reglen, ret; 912 913 if (!ops->get_regs || !ops->get_regs_len) 914 return -EOPNOTSUPP; 915 916 if (copy_from_user(&regs, useraddr, sizeof(regs))) 917 return -EFAULT; 918 919 reglen = ops->get_regs_len(dev); 920 if (regs.len > reglen) 921 regs.len = reglen; 922 923 regbuf = vzalloc(reglen); 924 if (reglen && !regbuf) 925 return -ENOMEM; 926 927 ops->get_regs(dev, &regs, regbuf); 928 929 ret = -EFAULT; 930 if (copy_to_user(useraddr, &regs, sizeof(regs))) 931 goto out; 932 useraddr += offsetof(struct ethtool_regs, data); 933 if (regbuf && copy_to_user(useraddr, regbuf, regs.len)) 934 goto out; 935 ret = 0; 936 937 out: 938 vfree(regbuf); 939 return ret; 940} 941 942static int ethtool_reset(struct net_device *dev, char __user *useraddr) 943{ 944 struct ethtool_value reset; 945 int ret; 946 947 if (!dev->ethtool_ops->reset) 948 return -EOPNOTSUPP; 949 950 if (copy_from_user(&reset, useraddr, sizeof(reset))) 951 return -EFAULT; 952 953 ret = dev->ethtool_ops->reset(dev, &reset.data); 954 if (ret) 955 return ret; 956 957 if (copy_to_user(useraddr, &reset, sizeof(reset))) 958 return -EFAULT; 959 return 0; 960} 961 962static int ethtool_get_wol(struct net_device *dev, char __user *useraddr) 963{ 964 struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL }; 965 966 if (!dev->ethtool_ops->get_wol) 967 return -EOPNOTSUPP; 968 969 dev->ethtool_ops->get_wol(dev, &wol); 970 971 if (copy_to_user(useraddr, &wol, sizeof(wol))) 972 return -EFAULT; 973 return 0; 974} 975 976static int ethtool_set_wol(struct net_device *dev, char __user *useraddr) 977{ 978 struct ethtool_wolinfo wol; 979 980 if (!dev->ethtool_ops->set_wol) 981 return -EOPNOTSUPP; 982 983 if (copy_from_user(&wol, useraddr, sizeof(wol))) 984 return -EFAULT; 985 986 return dev->ethtool_ops->set_wol(dev, &wol); 987} 988 989static int ethtool_get_eee(struct net_device *dev, char __user *useraddr) 990{ 991 struct ethtool_eee edata; 992 int rc; 993 994 if (!dev->ethtool_ops->get_eee) 995 return -EOPNOTSUPP; 996 997 memset(&edata, 0, sizeof(struct ethtool_eee)); 998 edata.cmd = ETHTOOL_GEEE; 999 rc = dev->ethtool_ops->get_eee(dev, &edata); 1000 1001 if (rc) 1002 return rc; 1003 1004 if (copy_to_user(useraddr, &edata, sizeof(edata))) 1005 return -EFAULT; 1006 1007 return 0; 1008} 1009 1010static int ethtool_set_eee(struct net_device *dev, char __user *useraddr) 1011{ 1012 struct ethtool_eee edata; 1013 1014 if (!dev->ethtool_ops->set_eee) 1015 return -EOPNOTSUPP; 1016 1017 if (copy_from_user(&edata, useraddr, sizeof(edata))) 1018 return -EFAULT; 1019 1020 return dev->ethtool_ops->set_eee(dev, &edata); 1021} 1022 1023static int ethtool_nway_reset(struct net_device *dev) 1024{ 1025 if (!dev->ethtool_ops->nway_reset) 1026 return -EOPNOTSUPP; 1027 1028 return dev->ethtool_ops->nway_reset(dev); 1029} 1030 1031static int ethtool_get_link(struct net_device *dev, char __user *useraddr) 1032{ 1033 struct ethtool_value edata = { .cmd = ETHTOOL_GLINK }; 1034 1035 if (!dev->ethtool_ops->get_link) 1036 return -EOPNOTSUPP; 1037 1038 edata.data = netif_running(dev) && dev->ethtool_ops->get_link(dev); 1039 1040 if (copy_to_user(useraddr, &edata, sizeof(edata))) 1041 return -EFAULT; 1042 return 0; 1043} 1044 1045static int ethtool_get_any_eeprom(struct net_device *dev, void __user *useraddr, 1046 int (*getter)(struct net_device *, 1047 struct ethtool_eeprom *, u8 *), 1048 u32 total_len) 1049{ 1050 struct ethtool_eeprom eeprom; 1051 void __user *userbuf = useraddr + sizeof(eeprom); 1052 u32 bytes_remaining; 1053 u8 *data; 1054 int ret = 0; 1055 1056 if (copy_from_user(&eeprom, useraddr, sizeof(eeprom))) 1057 return -EFAULT; 1058 1059 /* Check for wrap and zero */ 1060 if (eeprom.offset + eeprom.len <= eeprom.offset) 1061 return -EINVAL; 1062 1063 /* Check for exceeding total eeprom len */ 1064 if (eeprom.offset + eeprom.len > total_len) 1065 return -EINVAL; 1066 1067 data = kmalloc(PAGE_SIZE, GFP_USER); 1068 if (!data) 1069 return -ENOMEM; 1070 1071 bytes_remaining = eeprom.len; 1072 while (bytes_remaining > 0) { 1073 eeprom.len = min(bytes_remaining, (u32)PAGE_SIZE); 1074 1075 ret = getter(dev, &eeprom, data); 1076 if (ret) 1077 break; 1078 if (copy_to_user(userbuf, data, eeprom.len)) { 1079 ret = -EFAULT; 1080 break; 1081 } 1082 userbuf += eeprom.len; 1083 eeprom.offset += eeprom.len; 1084 bytes_remaining -= eeprom.len; 1085 } 1086 1087 eeprom.len = userbuf - (useraddr + sizeof(eeprom)); 1088 eeprom.offset -= eeprom.len; 1089 if (copy_to_user(useraddr, &eeprom, sizeof(eeprom))) 1090 ret = -EFAULT; 1091 1092 kfree(data); 1093 return ret; 1094} 1095 1096static int ethtool_get_eeprom(struct net_device *dev, void __user *useraddr) 1097{ 1098 const struct ethtool_ops *ops = dev->ethtool_ops; 1099 1100 if (!ops->get_eeprom || !ops->get_eeprom_len || 1101 !ops->get_eeprom_len(dev)) 1102 return -EOPNOTSUPP; 1103 1104 return ethtool_get_any_eeprom(dev, useraddr, ops->get_eeprom, 1105 ops->get_eeprom_len(dev)); 1106} 1107 1108static int ethtool_set_eeprom(struct net_device *dev, void __user *useraddr) 1109{ 1110 struct ethtool_eeprom eeprom; 1111 const struct ethtool_ops *ops = dev->ethtool_ops; 1112 void __user *userbuf = useraddr + sizeof(eeprom); 1113 u32 bytes_remaining; 1114 u8 *data; 1115 int ret = 0; 1116 1117 if (!ops->set_eeprom || !ops->get_eeprom_len || 1118 !ops->get_eeprom_len(dev)) 1119 return -EOPNOTSUPP; 1120 1121 if (copy_from_user(&eeprom, useraddr, sizeof(eeprom))) 1122 return -EFAULT; 1123 1124 /* Check for wrap and zero */ 1125 if (eeprom.offset + eeprom.len <= eeprom.offset) 1126 return -EINVAL; 1127 1128 /* Check for exceeding total eeprom len */ 1129 if (eeprom.offset + eeprom.len > ops->get_eeprom_len(dev)) 1130 return -EINVAL; 1131 1132 data = kmalloc(PAGE_SIZE, GFP_USER); 1133 if (!data) 1134 return -ENOMEM; 1135 1136 bytes_remaining = eeprom.len; 1137 while (bytes_remaining > 0) { 1138 eeprom.len = min(bytes_remaining, (u32)PAGE_SIZE); 1139 1140 if (copy_from_user(data, userbuf, eeprom.len)) { 1141 ret = -EFAULT; 1142 break; 1143 } 1144 ret = ops->set_eeprom(dev, &eeprom, data); 1145 if (ret) 1146 break; 1147 userbuf += eeprom.len; 1148 eeprom.offset += eeprom.len; 1149 bytes_remaining -= eeprom.len; 1150 } 1151 1152 kfree(data); 1153 return ret; 1154} 1155 1156static noinline_for_stack int ethtool_get_coalesce(struct net_device *dev, 1157 void __user *useraddr) 1158{ 1159 struct ethtool_coalesce coalesce = { .cmd = ETHTOOL_GCOALESCE }; 1160 1161 if (!dev->ethtool_ops->get_coalesce) 1162 return -EOPNOTSUPP; 1163 1164 dev->ethtool_ops->get_coalesce(dev, &coalesce); 1165 1166 if (copy_to_user(useraddr, &coalesce, sizeof(coalesce))) 1167 return -EFAULT; 1168 return 0; 1169} 1170 1171static noinline_for_stack int ethtool_set_coalesce(struct net_device *dev, 1172 void __user *useraddr) 1173{ 1174 struct ethtool_coalesce coalesce; 1175 1176 if (!dev->ethtool_ops->set_coalesce) 1177 return -EOPNOTSUPP; 1178 1179 if (copy_from_user(&coalesce, useraddr, sizeof(coalesce))) 1180 return -EFAULT; 1181 1182 return dev->ethtool_ops->set_coalesce(dev, &coalesce); 1183} 1184 1185static int ethtool_get_ringparam(struct net_device *dev, void __user *useraddr) 1186{ 1187 struct ethtool_ringparam ringparam = { .cmd = ETHTOOL_GRINGPARAM }; 1188 1189 if (!dev->ethtool_ops->get_ringparam) 1190 return -EOPNOTSUPP; 1191 1192 dev->ethtool_ops->get_ringparam(dev, &ringparam); 1193 1194 if (copy_to_user(useraddr, &ringparam, sizeof(ringparam))) 1195 return -EFAULT; 1196 return 0; 1197} 1198 1199static int ethtool_set_ringparam(struct net_device *dev, void __user *useraddr) 1200{ 1201 struct ethtool_ringparam ringparam; 1202 1203 if (!dev->ethtool_ops->set_ringparam) 1204 return -EOPNOTSUPP; 1205 1206 if (copy_from_user(&ringparam, useraddr, sizeof(ringparam))) 1207 return -EFAULT; 1208 1209 return dev->ethtool_ops->set_ringparam(dev, &ringparam); 1210} 1211 1212static noinline_for_stack int ethtool_get_channels(struct net_device *dev, 1213 void __user *useraddr) 1214{ 1215 struct ethtool_channels channels = { .cmd = ETHTOOL_GCHANNELS }; 1216 1217 if (!dev->ethtool_ops->get_channels) 1218 return -EOPNOTSUPP; 1219 1220 dev->ethtool_ops->get_channels(dev, &channels); 1221 1222 if (copy_to_user(useraddr, &channels, sizeof(channels))) 1223 return -EFAULT; 1224 return 0; 1225} 1226 1227static noinline_for_stack int ethtool_set_channels(struct net_device *dev, 1228 void __user *useraddr) 1229{ 1230 struct ethtool_channels channels; 1231 1232 if (!dev->ethtool_ops->set_channels) 1233 return -EOPNOTSUPP; 1234 1235 if (copy_from_user(&channels, useraddr, sizeof(channels))) 1236 return -EFAULT; 1237 1238 return dev->ethtool_ops->set_channels(dev, &channels); 1239} 1240 1241static int ethtool_get_pauseparam(struct net_device *dev, void __user *useraddr) 1242{ 1243 struct ethtool_pauseparam pauseparam = { ETHTOOL_GPAUSEPARAM }; 1244 1245 if (!dev->ethtool_ops->get_pauseparam) 1246 return -EOPNOTSUPP; 1247 1248 dev->ethtool_ops->get_pauseparam(dev, &pauseparam); 1249 1250 if (copy_to_user(useraddr, &pauseparam, sizeof(pauseparam))) 1251 return -EFAULT; 1252 return 0; 1253} 1254 1255static int ethtool_set_pauseparam(struct net_device *dev, void __user *useraddr) 1256{ 1257 struct ethtool_pauseparam pauseparam; 1258 1259 if (!dev->ethtool_ops->set_pauseparam) 1260 return -EOPNOTSUPP; 1261 1262 if (copy_from_user(&pauseparam, useraddr, sizeof(pauseparam))) 1263 return -EFAULT; 1264 1265 return dev->ethtool_ops->set_pauseparam(dev, &pauseparam); 1266} 1267 1268static int ethtool_self_test(struct net_device *dev, char __user *useraddr) 1269{ 1270 struct ethtool_test test; 1271 const struct ethtool_ops *ops = dev->ethtool_ops; 1272 u64 *data; 1273 int ret, test_len; 1274 1275 if (!ops->self_test || !ops->get_sset_count) 1276 return -EOPNOTSUPP; 1277 1278 test_len = ops->get_sset_count(dev, ETH_SS_TEST); 1279 if (test_len < 0) 1280 return test_len; 1281 WARN_ON(test_len == 0); 1282 1283 if (copy_from_user(&test, useraddr, sizeof(test))) 1284 return -EFAULT; 1285 1286 test.len = test_len; 1287 data = kmalloc(test_len * sizeof(u64), GFP_USER); 1288 if (!data) 1289 return -ENOMEM; 1290 1291 ops->self_test(dev, &test, data); 1292 1293 ret = -EFAULT; 1294 if (copy_to_user(useraddr, &test, sizeof(test))) 1295 goto out; 1296 useraddr += sizeof(test); 1297 if (copy_to_user(useraddr, data, test.len * sizeof(u64))) 1298 goto out; 1299 ret = 0; 1300 1301 out: 1302 kfree(data); 1303 return ret; 1304} 1305 1306static int ethtool_get_strings(struct net_device *dev, void __user *useraddr) 1307{ 1308 struct ethtool_gstrings gstrings; 1309 u8 *data; 1310 int ret; 1311 1312 if (copy_from_user(&gstrings, useraddr, sizeof(gstrings))) 1313 return -EFAULT; 1314 1315 ret = __ethtool_get_sset_count(dev, gstrings.string_set); 1316 if (ret < 0) 1317 return ret; 1318 1319 gstrings.len = ret; 1320 1321 data = kcalloc(gstrings.len, ETH_GSTRING_LEN, GFP_USER); 1322 if (!data) 1323 return -ENOMEM; 1324 1325 __ethtool_get_strings(dev, gstrings.string_set, data); 1326 1327 ret = -EFAULT; 1328 if (copy_to_user(useraddr, &gstrings, sizeof(gstrings))) 1329 goto out; 1330 useraddr += sizeof(gstrings); 1331 if (copy_to_user(useraddr, data, gstrings.len * ETH_GSTRING_LEN)) 1332 goto out; 1333 ret = 0; 1334 1335out: 1336 kfree(data); 1337 return ret; 1338} 1339 1340static int ethtool_phys_id(struct net_device *dev, void __user *useraddr) 1341{ 1342 struct ethtool_value id; 1343 static bool busy; 1344 const struct ethtool_ops *ops = dev->ethtool_ops; 1345 int rc; 1346 1347 if (!ops->set_phys_id) 1348 return -EOPNOTSUPP; 1349 1350 if (busy) 1351 return -EBUSY; 1352 1353 if (copy_from_user(&id, useraddr, sizeof(id))) 1354 return -EFAULT; 1355 1356 rc = ops->set_phys_id(dev, ETHTOOL_ID_ACTIVE); 1357 if (rc < 0) 1358 return rc; 1359 1360 /* Drop the RTNL lock while waiting, but prevent reentry or 1361 * removal of the device. 1362 */ 1363 busy = true; 1364 dev_hold(dev); 1365 rtnl_unlock(); 1366 1367 if (rc == 0) { 1368 /* Driver will handle this itself */ 1369 schedule_timeout_interruptible( 1370 id.data ? (id.data * HZ) : MAX_SCHEDULE_TIMEOUT); 1371 } else { 1372 /* Driver expects to be called at twice the frequency in rc */ 1373 int n = rc * 2, i, interval = HZ / n; 1374 1375 /* Count down seconds */ 1376 do { 1377 /* Count down iterations per second */ 1378 i = n; 1379 do { 1380 rtnl_lock(); 1381 rc = ops->set_phys_id(dev, 1382 (i & 1) ? ETHTOOL_ID_OFF : ETHTOOL_ID_ON); 1383 rtnl_unlock(); 1384 if (rc) 1385 break; 1386 schedule_timeout_interruptible(interval); 1387 } while (!signal_pending(current) && --i != 0); 1388 } while (!signal_pending(current) && 1389 (id.data == 0 || --id.data != 0)); 1390 } 1391 1392 rtnl_lock(); 1393 dev_put(dev); 1394 busy = false; 1395 1396 (void) ops->set_phys_id(dev, ETHTOOL_ID_INACTIVE); 1397 return rc; 1398} 1399 1400static int ethtool_get_stats(struct net_device *dev, void __user *useraddr) 1401{ 1402 struct ethtool_stats stats; 1403 const struct ethtool_ops *ops = dev->ethtool_ops; 1404 u64 *data; 1405 int ret, n_stats; 1406 1407 if (!ops->get_ethtool_stats || !ops->get_sset_count) 1408 return -EOPNOTSUPP; 1409 1410 n_stats = ops->get_sset_count(dev, ETH_SS_STATS); 1411 if (n_stats < 0) 1412 return n_stats; 1413 WARN_ON(n_stats == 0); 1414 1415 if (copy_from_user(&stats, useraddr, sizeof(stats))) 1416 return -EFAULT; 1417 1418 stats.n_stats = n_stats; 1419 data = kmalloc(n_stats * sizeof(u64), GFP_USER); 1420 if (!data) 1421 return -ENOMEM; 1422 1423 ops->get_ethtool_stats(dev, &stats, data); 1424 1425 ret = -EFAULT; 1426 if (copy_to_user(useraddr, &stats, sizeof(stats))) 1427 goto out; 1428 useraddr += sizeof(stats); 1429 if (copy_to_user(useraddr, data, stats.n_stats * sizeof(u64))) 1430 goto out; 1431 ret = 0; 1432 1433 out: 1434 kfree(data); 1435 return ret; 1436} 1437 1438static int ethtool_get_phy_stats(struct net_device *dev, void __user *useraddr) 1439{ 1440 struct ethtool_stats stats; 1441 struct phy_device *phydev = dev->phydev; 1442 u64 *data; 1443 int ret, n_stats; 1444 1445 if (!phydev) 1446 return -EOPNOTSUPP; 1447 1448 n_stats = phy_get_sset_count(phydev); 1449 1450 if (n_stats < 0) 1451 return n_stats; 1452 WARN_ON(n_stats == 0); 1453 1454 if (copy_from_user(&stats, useraddr, sizeof(stats))) 1455 return -EFAULT; 1456 1457 stats.n_stats = n_stats; 1458 data = kmalloc_array(n_stats, sizeof(u64), GFP_USER); 1459 if (!data) 1460 return -ENOMEM; 1461 1462 mutex_lock(&phydev->lock); 1463 phydev->drv->get_stats(phydev, &stats, data); 1464 mutex_unlock(&phydev->lock); 1465 1466 ret = -EFAULT; 1467 if (copy_to_user(useraddr, &stats, sizeof(stats))) 1468 goto out; 1469 useraddr += sizeof(stats); 1470 if (copy_to_user(useraddr, data, stats.n_stats * sizeof(u64))) 1471 goto out; 1472 ret = 0; 1473 1474 out: 1475 kfree(data); 1476 return ret; 1477} 1478 1479static int ethtool_get_perm_addr(struct net_device *dev, void __user *useraddr) 1480{ 1481 struct ethtool_perm_addr epaddr; 1482 1483 if (copy_from_user(&epaddr, useraddr, sizeof(epaddr))) 1484 return -EFAULT; 1485 1486 if (epaddr.size < dev->addr_len) 1487 return -ETOOSMALL; 1488 epaddr.size = dev->addr_len; 1489 1490 if (copy_to_user(useraddr, &epaddr, sizeof(epaddr))) 1491 return -EFAULT; 1492 useraddr += sizeof(epaddr); 1493 if (copy_to_user(useraddr, dev->perm_addr, epaddr.size)) 1494 return -EFAULT; 1495 return 0; 1496} 1497 1498static int ethtool_get_value(struct net_device *dev, char __user *useraddr, 1499 u32 cmd, u32 (*actor)(struct net_device *)) 1500{ 1501 struct ethtool_value edata = { .cmd = cmd }; 1502 1503 if (!actor) 1504 return -EOPNOTSUPP; 1505 1506 edata.data = actor(dev); 1507 1508 if (copy_to_user(useraddr, &edata, sizeof(edata))) 1509 return -EFAULT; 1510 return 0; 1511} 1512 1513static int ethtool_set_value_void(struct net_device *dev, char __user *useraddr, 1514 void (*actor)(struct net_device *, u32)) 1515{ 1516 struct ethtool_value edata; 1517 1518 if (!actor) 1519 return -EOPNOTSUPP; 1520 1521 if (copy_from_user(&edata, useraddr, sizeof(edata))) 1522 return -EFAULT; 1523 1524 actor(dev, edata.data); 1525 return 0; 1526} 1527 1528static int ethtool_set_value(struct net_device *dev, char __user *useraddr, 1529 int (*actor)(struct net_device *, u32)) 1530{ 1531 struct ethtool_value edata; 1532 1533 if (!actor) 1534 return -EOPNOTSUPP; 1535 1536 if (copy_from_user(&edata, useraddr, sizeof(edata))) 1537 return -EFAULT; 1538 1539 return actor(dev, edata.data); 1540} 1541 1542static noinline_for_stack int ethtool_flash_device(struct net_device *dev, 1543 char __user *useraddr) 1544{ 1545 struct ethtool_flash efl; 1546 1547 if (copy_from_user(&efl, useraddr, sizeof(efl))) 1548 return -EFAULT; 1549 1550 if (!dev->ethtool_ops->flash_device) 1551 return -EOPNOTSUPP; 1552 1553 efl.data[ETHTOOL_FLASH_MAX_FILENAME - 1] = 0; 1554 1555 return dev->ethtool_ops->flash_device(dev, &efl); 1556} 1557 1558static int ethtool_set_dump(struct net_device *dev, 1559 void __user *useraddr) 1560{ 1561 struct ethtool_dump dump; 1562 1563 if (!dev->ethtool_ops->set_dump) 1564 return -EOPNOTSUPP; 1565 1566 if (copy_from_user(&dump, useraddr, sizeof(dump))) 1567 return -EFAULT; 1568 1569 return dev->ethtool_ops->set_dump(dev, &dump); 1570} 1571 1572static int ethtool_get_dump_flag(struct net_device *dev, 1573 void __user *useraddr) 1574{ 1575 int ret; 1576 struct ethtool_dump dump; 1577 const struct ethtool_ops *ops = dev->ethtool_ops; 1578 1579 if (!ops->get_dump_flag) 1580 return -EOPNOTSUPP; 1581 1582 if (copy_from_user(&dump, useraddr, sizeof(dump))) 1583 return -EFAULT; 1584 1585 ret = ops->get_dump_flag(dev, &dump); 1586 if (ret) 1587 return ret; 1588 1589 if (copy_to_user(useraddr, &dump, sizeof(dump))) 1590 return -EFAULT; 1591 return 0; 1592} 1593 1594static int ethtool_get_dump_data(struct net_device *dev, 1595 void __user *useraddr) 1596{ 1597 int ret; 1598 __u32 len; 1599 struct ethtool_dump dump, tmp; 1600 const struct ethtool_ops *ops = dev->ethtool_ops; 1601 void *data = NULL; 1602 1603 if (!ops->get_dump_data || !ops->get_dump_flag) 1604 return -EOPNOTSUPP; 1605 1606 if (copy_from_user(&dump, useraddr, sizeof(dump))) 1607 return -EFAULT; 1608 1609 memset(&tmp, 0, sizeof(tmp)); 1610 tmp.cmd = ETHTOOL_GET_DUMP_FLAG; 1611 ret = ops->get_dump_flag(dev, &tmp); 1612 if (ret) 1613 return ret; 1614 1615 len = min(tmp.len, dump.len); 1616 if (!len) 1617 return -EFAULT; 1618 1619 /* Don't ever let the driver think there's more space available 1620 * than it requested with .get_dump_flag(). 1621 */ 1622 dump.len = len; 1623 1624 /* Always allocate enough space to hold the whole thing so that the 1625 * driver does not need to check the length and bother with partial 1626 * dumping. 1627 */ 1628 data = vzalloc(tmp.len); 1629 if (!data) 1630 return -ENOMEM; 1631 ret = ops->get_dump_data(dev, &dump, data); 1632 if (ret) 1633 goto out; 1634 1635 /* There are two sane possibilities: 1636 * 1. The driver's .get_dump_data() does not touch dump.len. 1637 * 2. Or it may set dump.len to how much it really writes, which 1638 * should be tmp.len (or len if it can do a partial dump). 1639 * In any case respond to userspace with the actual length of data 1640 * it's receiving. 1641 */ 1642 WARN_ON(dump.len != len && dump.len != tmp.len); 1643 dump.len = len; 1644 1645 if (copy_to_user(useraddr, &dump, sizeof(dump))) { 1646 ret = -EFAULT; 1647 goto out; 1648 } 1649 useraddr += offsetof(struct ethtool_dump, data); 1650 if (copy_to_user(useraddr, data, len)) 1651 ret = -EFAULT; 1652out: 1653 vfree(data); 1654 return ret; 1655} 1656 1657static int ethtool_get_ts_info(struct net_device *dev, void __user *useraddr) 1658{ 1659 int err = 0; 1660 struct ethtool_ts_info info; 1661 const struct ethtool_ops *ops = dev->ethtool_ops; 1662 struct phy_device *phydev = dev->phydev; 1663 1664 memset(&info, 0, sizeof(info)); 1665 info.cmd = ETHTOOL_GET_TS_INFO; 1666 1667 if (phydev && phydev->drv && phydev->drv->ts_info) { 1668 err = phydev->drv->ts_info(phydev, &info); 1669 } else if (ops->get_ts_info) { 1670 err = ops->get_ts_info(dev, &info); 1671 } else { 1672 info.so_timestamping = 1673 SOF_TIMESTAMPING_RX_SOFTWARE | 1674 SOF_TIMESTAMPING_SOFTWARE; 1675 info.phc_index = -1; 1676 } 1677 1678 if (err) 1679 return err; 1680 1681 if (copy_to_user(useraddr, &info, sizeof(info))) 1682 err = -EFAULT; 1683 1684 return err; 1685} 1686 1687static int __ethtool_get_module_info(struct net_device *dev, 1688 struct ethtool_modinfo *modinfo) 1689{ 1690 const struct ethtool_ops *ops = dev->ethtool_ops; 1691 struct phy_device *phydev = dev->phydev; 1692 1693 if (phydev && phydev->drv && phydev->drv->module_info) 1694 return phydev->drv->module_info(phydev, modinfo); 1695 1696 if (ops->get_module_info) 1697 return ops->get_module_info(dev, modinfo); 1698 1699 return -EOPNOTSUPP; 1700} 1701 1702static int ethtool_get_module_info(struct net_device *dev, 1703 void __user *useraddr) 1704{ 1705 int ret; 1706 struct ethtool_modinfo modinfo; 1707 1708 if (copy_from_user(&modinfo, useraddr, sizeof(modinfo))) 1709 return -EFAULT; 1710 1711 ret = __ethtool_get_module_info(dev, &modinfo); 1712 if (ret) 1713 return ret; 1714 1715 if (copy_to_user(useraddr, &modinfo, sizeof(modinfo))) 1716 return -EFAULT; 1717 1718 return 0; 1719} 1720 1721static int __ethtool_get_module_eeprom(struct net_device *dev, 1722 struct ethtool_eeprom *ee, u8 *data) 1723{ 1724 const struct ethtool_ops *ops = dev->ethtool_ops; 1725 struct phy_device *phydev = dev->phydev; 1726 1727 if (phydev && phydev->drv && phydev->drv->module_eeprom) 1728 return phydev->drv->module_eeprom(phydev, ee, data); 1729 1730 if (ops->get_module_eeprom) 1731 return ops->get_module_eeprom(dev, ee, data); 1732 1733 return -EOPNOTSUPP; 1734} 1735 1736static int ethtool_get_module_eeprom(struct net_device *dev, 1737 void __user *useraddr) 1738{ 1739 int ret; 1740 struct ethtool_modinfo modinfo; 1741 1742 ret = __ethtool_get_module_info(dev, &modinfo); 1743 if (ret) 1744 return ret; 1745 1746 return ethtool_get_any_eeprom(dev, useraddr, 1747 __ethtool_get_module_eeprom, 1748 modinfo.eeprom_len); 1749} 1750 1751static int ethtool_tunable_valid(const struct ethtool_tunable *tuna) 1752{ 1753 switch (tuna->id) { 1754 case ETHTOOL_RX_COPYBREAK: 1755 case ETHTOOL_TX_COPYBREAK: 1756 if (tuna->len != sizeof(u32) || 1757 tuna->type_id != ETHTOOL_TUNABLE_U32) 1758 return -EINVAL; 1759 break; 1760 default: 1761 return -EINVAL; 1762 } 1763 1764 return 0; 1765} 1766 1767static int ethtool_get_tunable(struct net_device *dev, void __user *useraddr) 1768{ 1769 int ret; 1770 struct ethtool_tunable tuna; 1771 const struct ethtool_ops *ops = dev->ethtool_ops; 1772 void *data; 1773 1774 if (!ops->get_tunable) 1775 return -EOPNOTSUPP; 1776 if (copy_from_user(&tuna, useraddr, sizeof(tuna))) 1777 return -EFAULT; 1778 ret = ethtool_tunable_valid(&tuna); 1779 if (ret) 1780 return ret; 1781 data = kmalloc(tuna.len, GFP_USER); 1782 if (!data) 1783 return -ENOMEM; 1784 ret = ops->get_tunable(dev, &tuna, data); 1785 if (ret) 1786 goto out; 1787 useraddr += sizeof(tuna); 1788 ret = -EFAULT; 1789 if (copy_to_user(useraddr, data, tuna.len)) 1790 goto out; 1791 ret = 0; 1792 1793out: 1794 kfree(data); 1795 return ret; 1796} 1797 1798static int ethtool_set_tunable(struct net_device *dev, void __user *useraddr) 1799{ 1800 int ret; 1801 struct ethtool_tunable tuna; 1802 const struct ethtool_ops *ops = dev->ethtool_ops; 1803 void *data; 1804 1805 if (!ops->set_tunable) 1806 return -EOPNOTSUPP; 1807 if (copy_from_user(&tuna, useraddr, sizeof(tuna))) 1808 return -EFAULT; 1809 ret = ethtool_tunable_valid(&tuna); 1810 if (ret) 1811 return ret; 1812 data = kmalloc(tuna.len, GFP_USER); 1813 if (!data) 1814 return -ENOMEM; 1815 useraddr += sizeof(tuna); 1816 ret = -EFAULT; 1817 if (copy_from_user(data, useraddr, tuna.len)) 1818 goto out; 1819 ret = ops->set_tunable(dev, &tuna, data); 1820 1821out: 1822 kfree(data); 1823 return ret; 1824} 1825 1826/* The main entry point in this file. Called from net/core/dev_ioctl.c */ 1827 1828int dev_ethtool(struct net *net, struct ifreq *ifr) 1829{ 1830 struct net_device *dev = __dev_get_by_name(net, ifr->ifr_name); 1831 void __user *useraddr = ifr->ifr_data; 1832 u32 ethcmd; 1833 int rc; 1834 netdev_features_t old_features; 1835 1836 if (!dev || !netif_device_present(dev)) 1837 return -ENODEV; 1838 1839 if (copy_from_user(&ethcmd, useraddr, sizeof(ethcmd))) 1840 return -EFAULT; 1841 1842 /* Allow some commands to be done by anyone */ 1843 switch (ethcmd) { 1844 case ETHTOOL_GSET: 1845 case ETHTOOL_GDRVINFO: 1846 case ETHTOOL_GMSGLVL: 1847 case ETHTOOL_GLINK: 1848 case ETHTOOL_GCOALESCE: 1849 case ETHTOOL_GRINGPARAM: 1850 case ETHTOOL_GPAUSEPARAM: 1851 case ETHTOOL_GRXCSUM: 1852 case ETHTOOL_GTXCSUM: 1853 case ETHTOOL_GSG: 1854 case ETHTOOL_GSSET_INFO: 1855 case ETHTOOL_GSTRINGS: 1856 case ETHTOOL_GSTATS: 1857 case ETHTOOL_GPHYSTATS: 1858 case ETHTOOL_GTSO: 1859 case ETHTOOL_GPERMADDR: 1860 case ETHTOOL_GUFO: 1861 case ETHTOOL_GGSO: 1862 case ETHTOOL_GGRO: 1863 case ETHTOOL_GFLAGS: 1864 case ETHTOOL_GPFLAGS: 1865 case ETHTOOL_GRXFH: 1866 case ETHTOOL_GRXRINGS: 1867 case ETHTOOL_GRXCLSRLCNT: 1868 case ETHTOOL_GRXCLSRULE: 1869 case ETHTOOL_GRXCLSRLALL: 1870 case ETHTOOL_GRXFHINDIR: 1871 case ETHTOOL_GRSSH: 1872 case ETHTOOL_GFEATURES: 1873 case ETHTOOL_GCHANNELS: 1874 case ETHTOOL_GET_TS_INFO: 1875 case ETHTOOL_GEEE: 1876 case ETHTOOL_GTUNABLE: 1877 break; 1878 default: 1879 if (!ns_capable(net->user_ns, CAP_NET_ADMIN)) 1880 return -EPERM; 1881 } 1882 1883 if (dev->ethtool_ops->begin) { 1884 rc = dev->ethtool_ops->begin(dev); 1885 if (rc < 0) 1886 return rc; 1887 } 1888 old_features = dev->features; 1889 1890 switch (ethcmd) { 1891 case ETHTOOL_GSET: 1892 rc = ethtool_get_settings(dev, useraddr); 1893 break; 1894 case ETHTOOL_SSET: 1895 rc = ethtool_set_settings(dev, useraddr); 1896 break; 1897 case ETHTOOL_GDRVINFO: 1898 rc = ethtool_get_drvinfo(dev, useraddr); 1899 break; 1900 case ETHTOOL_GREGS: 1901 rc = ethtool_get_regs(dev, useraddr); 1902 break; 1903 case ETHTOOL_GWOL: 1904 rc = ethtool_get_wol(dev, useraddr); 1905 break; 1906 case ETHTOOL_SWOL: 1907 rc = ethtool_set_wol(dev, useraddr); 1908 break; 1909 case ETHTOOL_GMSGLVL: 1910 rc = ethtool_get_value(dev, useraddr, ethcmd, 1911 dev->ethtool_ops->get_msglevel); 1912 break; 1913 case ETHTOOL_SMSGLVL: 1914 rc = ethtool_set_value_void(dev, useraddr, 1915 dev->ethtool_ops->set_msglevel); 1916 break; 1917 case ETHTOOL_GEEE: 1918 rc = ethtool_get_eee(dev, useraddr); 1919 break; 1920 case ETHTOOL_SEEE: 1921 rc = ethtool_set_eee(dev, useraddr); 1922 break; 1923 case ETHTOOL_NWAY_RST: 1924 rc = ethtool_nway_reset(dev); 1925 break; 1926 case ETHTOOL_GLINK: 1927 rc = ethtool_get_link(dev, useraddr); 1928 break; 1929 case ETHTOOL_GEEPROM: 1930 rc = ethtool_get_eeprom(dev, useraddr); 1931 break; 1932 case ETHTOOL_SEEPROM: 1933 rc = ethtool_set_eeprom(dev, useraddr); 1934 break; 1935 case ETHTOOL_GCOALESCE: 1936 rc = ethtool_get_coalesce(dev, useraddr); 1937 break; 1938 case ETHTOOL_SCOALESCE: 1939 rc = ethtool_set_coalesce(dev, useraddr); 1940 break; 1941 case ETHTOOL_GRINGPARAM: 1942 rc = ethtool_get_ringparam(dev, useraddr); 1943 break; 1944 case ETHTOOL_SRINGPARAM: 1945 rc = ethtool_set_ringparam(dev, useraddr); 1946 break; 1947 case ETHTOOL_GPAUSEPARAM: 1948 rc = ethtool_get_pauseparam(dev, useraddr); 1949 break; 1950 case ETHTOOL_SPAUSEPARAM: 1951 rc = ethtool_set_pauseparam(dev, useraddr); 1952 break; 1953 case ETHTOOL_TEST: 1954 rc = ethtool_self_test(dev, useraddr); 1955 break; 1956 case ETHTOOL_GSTRINGS: 1957 rc = ethtool_get_strings(dev, useraddr); 1958 break; 1959 case ETHTOOL_PHYS_ID: 1960 rc = ethtool_phys_id(dev, useraddr); 1961 break; 1962 case ETHTOOL_GSTATS: 1963 rc = ethtool_get_stats(dev, useraddr); 1964 break; 1965 case ETHTOOL_GPERMADDR: 1966 rc = ethtool_get_perm_addr(dev, useraddr); 1967 break; 1968 case ETHTOOL_GFLAGS: 1969 rc = ethtool_get_value(dev, useraddr, ethcmd, 1970 __ethtool_get_flags); 1971 break; 1972 case ETHTOOL_SFLAGS: 1973 rc = ethtool_set_value(dev, useraddr, __ethtool_set_flags); 1974 break; 1975 case ETHTOOL_GPFLAGS: 1976 rc = ethtool_get_value(dev, useraddr, ethcmd, 1977 dev->ethtool_ops->get_priv_flags); 1978 break; 1979 case ETHTOOL_SPFLAGS: 1980 rc = ethtool_set_value(dev, useraddr, 1981 dev->ethtool_ops->set_priv_flags); 1982 break; 1983 case ETHTOOL_GRXFH: 1984 case ETHTOOL_GRXRINGS: 1985 case ETHTOOL_GRXCLSRLCNT: 1986 case ETHTOOL_GRXCLSRULE: 1987 case ETHTOOL_GRXCLSRLALL: 1988 rc = ethtool_get_rxnfc(dev, ethcmd, useraddr); 1989 break; 1990 case ETHTOOL_SRXFH: 1991 case ETHTOOL_SRXCLSRLDEL: 1992 case ETHTOOL_SRXCLSRLINS: 1993 rc = ethtool_set_rxnfc(dev, ethcmd, useraddr); 1994 break; 1995 case ETHTOOL_FLASHDEV: 1996 rc = ethtool_flash_device(dev, useraddr); 1997 break; 1998 case ETHTOOL_RESET: 1999 rc = ethtool_reset(dev, useraddr); 2000 break; 2001 case ETHTOOL_GSSET_INFO: 2002 rc = ethtool_get_sset_info(dev, useraddr); 2003 break; 2004 case ETHTOOL_GRXFHINDIR: 2005 rc = ethtool_get_rxfh_indir(dev, useraddr); 2006 break; 2007 case ETHTOOL_SRXFHINDIR: 2008 rc = ethtool_set_rxfh_indir(dev, useraddr); 2009 break; 2010 case ETHTOOL_GRSSH: 2011 rc = ethtool_get_rxfh(dev, useraddr); 2012 break; 2013 case ETHTOOL_SRSSH: 2014 rc = ethtool_set_rxfh(dev, useraddr); 2015 break; 2016 case ETHTOOL_GFEATURES: 2017 rc = ethtool_get_features(dev, useraddr); 2018 break; 2019 case ETHTOOL_SFEATURES: 2020 rc = ethtool_set_features(dev, useraddr); 2021 break; 2022 case ETHTOOL_GTXCSUM: 2023 case ETHTOOL_GRXCSUM: 2024 case ETHTOOL_GSG: 2025 case ETHTOOL_GTSO: 2026 case ETHTOOL_GUFO: 2027 case ETHTOOL_GGSO: 2028 case ETHTOOL_GGRO: 2029 rc = ethtool_get_one_feature(dev, useraddr, ethcmd); 2030 break; 2031 case ETHTOOL_STXCSUM: 2032 case ETHTOOL_SRXCSUM: 2033 case ETHTOOL_SSG: 2034 case ETHTOOL_STSO: 2035 case ETHTOOL_SUFO: 2036 case ETHTOOL_SGSO: 2037 case ETHTOOL_SGRO: 2038 rc = ethtool_set_one_feature(dev, useraddr, ethcmd); 2039 break; 2040 case ETHTOOL_GCHANNELS: 2041 rc = ethtool_get_channels(dev, useraddr); 2042 break; 2043 case ETHTOOL_SCHANNELS: 2044 rc = ethtool_set_channels(dev, useraddr); 2045 break; 2046 case ETHTOOL_SET_DUMP: 2047 rc = ethtool_set_dump(dev, useraddr); 2048 break; 2049 case ETHTOOL_GET_DUMP_FLAG: 2050 rc = ethtool_get_dump_flag(dev, useraddr); 2051 break; 2052 case ETHTOOL_GET_DUMP_DATA: 2053 rc = ethtool_get_dump_data(dev, useraddr); 2054 break; 2055 case ETHTOOL_GET_TS_INFO: 2056 rc = ethtool_get_ts_info(dev, useraddr); 2057 break; 2058 case ETHTOOL_GMODULEINFO: 2059 rc = ethtool_get_module_info(dev, useraddr); 2060 break; 2061 case ETHTOOL_GMODULEEEPROM: 2062 rc = ethtool_get_module_eeprom(dev, useraddr); 2063 break; 2064 case ETHTOOL_GTUNABLE: 2065 rc = ethtool_get_tunable(dev, useraddr); 2066 break; 2067 case ETHTOOL_STUNABLE: 2068 rc = ethtool_set_tunable(dev, useraddr); 2069 break; 2070 case ETHTOOL_GPHYSTATS: 2071 rc = ethtool_get_phy_stats(dev, useraddr); 2072 break; 2073 default: 2074 rc = -EOPNOTSUPP; 2075 } 2076 2077 if (dev->ethtool_ops->complete) 2078 dev->ethtool_ops->complete(dev); 2079 2080 if (old_features != dev->features) 2081 netdev_features_change(dev); 2082 2083 return rc; 2084}