Linux Audio

Check our new training course

Loading...
v3.1
   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/bitops.h>
  21#include <linux/uaccess.h>
  22#include <linux/vmalloc.h>
  23#include <linux/slab.h>
  24#include <linux/rtnetlink.h>
  25#include <linux/sched.h>
  26
  27/*
  28 * Some useful ethtool_ops methods that're device independent.
  29 * If we find that all drivers want to do the same thing here,
  30 * we can turn these into dev_() function calls.
  31 */
  32
  33u32 ethtool_op_get_link(struct net_device *dev)
  34{
  35	return netif_carrier_ok(dev) ? 1 : 0;
  36}
  37EXPORT_SYMBOL(ethtool_op_get_link);
  38
  39u32 ethtool_op_get_tx_csum(struct net_device *dev)
  40{
  41	return (dev->features & NETIF_F_ALL_CSUM) != 0;
  42}
  43EXPORT_SYMBOL(ethtool_op_get_tx_csum);
  44
  45int ethtool_op_set_tx_csum(struct net_device *dev, u32 data)
  46{
  47	if (data)
  48		dev->features |= NETIF_F_IP_CSUM;
  49	else
  50		dev->features &= ~NETIF_F_IP_CSUM;
  51
  52	return 0;
  53}
  54EXPORT_SYMBOL(ethtool_op_set_tx_csum);
  55
  56int ethtool_op_set_tx_hw_csum(struct net_device *dev, u32 data)
  57{
  58	if (data)
  59		dev->features |= NETIF_F_HW_CSUM;
  60	else
  61		dev->features &= ~NETIF_F_HW_CSUM;
  62
  63	return 0;
  64}
  65EXPORT_SYMBOL(ethtool_op_set_tx_hw_csum);
  66
  67int ethtool_op_set_tx_ipv6_csum(struct net_device *dev, u32 data)
  68{
  69	if (data)
  70		dev->features |= NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM;
  71	else
  72		dev->features &= ~(NETIF_F_IP_CSUM | NETIF_F_IPV6_CSUM);
  73
  74	return 0;
  75}
  76EXPORT_SYMBOL(ethtool_op_set_tx_ipv6_csum);
  77
  78u32 ethtool_op_get_sg(struct net_device *dev)
  79{
  80	return (dev->features & NETIF_F_SG) != 0;
  81}
  82EXPORT_SYMBOL(ethtool_op_get_sg);
  83
  84int ethtool_op_set_sg(struct net_device *dev, u32 data)
  85{
  86	if (data)
  87		dev->features |= NETIF_F_SG;
  88	else
  89		dev->features &= ~NETIF_F_SG;
  90
  91	return 0;
  92}
  93EXPORT_SYMBOL(ethtool_op_set_sg);
  94
  95u32 ethtool_op_get_tso(struct net_device *dev)
  96{
  97	return (dev->features & NETIF_F_TSO) != 0;
  98}
  99EXPORT_SYMBOL(ethtool_op_get_tso);
 100
 101int ethtool_op_set_tso(struct net_device *dev, u32 data)
 102{
 103	if (data)
 104		dev->features |= NETIF_F_TSO;
 105	else
 106		dev->features &= ~NETIF_F_TSO;
 107
 108	return 0;
 109}
 110EXPORT_SYMBOL(ethtool_op_set_tso);
 111
 112u32 ethtool_op_get_ufo(struct net_device *dev)
 113{
 114	return (dev->features & NETIF_F_UFO) != 0;
 115}
 116EXPORT_SYMBOL(ethtool_op_get_ufo);
 117
 118int ethtool_op_set_ufo(struct net_device *dev, u32 data)
 119{
 120	if (data)
 121		dev->features |= NETIF_F_UFO;
 122	else
 123		dev->features &= ~NETIF_F_UFO;
 124	return 0;
 125}
 126EXPORT_SYMBOL(ethtool_op_set_ufo);
 127
 128/* the following list of flags are the same as their associated
 129 * NETIF_F_xxx values in include/linux/netdevice.h
 130 */
 131static const u32 flags_dup_features =
 132	(ETH_FLAG_LRO | ETH_FLAG_RXVLAN | ETH_FLAG_TXVLAN | ETH_FLAG_NTUPLE |
 133	 ETH_FLAG_RXHASH);
 134
 135u32 ethtool_op_get_flags(struct net_device *dev)
 136{
 137	/* in the future, this function will probably contain additional
 138	 * handling for flags which are not so easily handled
 139	 * by a simple masking operation
 140	 */
 141
 142	return dev->features & flags_dup_features;
 143}
 144EXPORT_SYMBOL(ethtool_op_get_flags);
 145
 146/* Check if device can enable (or disable) particular feature coded in "data"
 147 * argument. Flags "supported" describe features that can be toggled by device.
 148 * If feature can not be toggled, it state (enabled or disabled) must match
 149 * hardcoded device features state, otherwise flags are marked as invalid.
 150 */
 151bool ethtool_invalid_flags(struct net_device *dev, u32 data, u32 supported)
 152{
 153	u32 features = dev->features & flags_dup_features;
 154	/* "data" can contain only flags_dup_features bits,
 155	 * see __ethtool_set_flags */
 156
 157	return (features & ~supported) != (data & ~supported);
 158}
 159EXPORT_SYMBOL(ethtool_invalid_flags);
 160
 161int ethtool_op_set_flags(struct net_device *dev, u32 data, u32 supported)
 162{
 163	if (ethtool_invalid_flags(dev, data, supported))
 164		return -EINVAL;
 165
 166	dev->features = ((dev->features & ~flags_dup_features) |
 167			 (data & flags_dup_features));
 168	return 0;
 169}
 170EXPORT_SYMBOL(ethtool_op_set_flags);
 171
 172/* Handlers for each ethtool command */
 173
 174#define ETHTOOL_DEV_FEATURE_WORDS	1
 175
 176static void ethtool_get_features_compat(struct net_device *dev,
 177	struct ethtool_get_features_block *features)
 178{
 179	if (!dev->ethtool_ops)
 180		return;
 181
 182	/* getting RX checksum */
 183	if (dev->ethtool_ops->get_rx_csum)
 184		if (dev->ethtool_ops->get_rx_csum(dev))
 185			features[0].active |= NETIF_F_RXCSUM;
 186
 187	/* mark legacy-changeable features */
 188	if (dev->ethtool_ops->set_sg)
 189		features[0].available |= NETIF_F_SG;
 190	if (dev->ethtool_ops->set_tx_csum)
 191		features[0].available |= NETIF_F_ALL_CSUM;
 192	if (dev->ethtool_ops->set_tso)
 193		features[0].available |= NETIF_F_ALL_TSO;
 194	if (dev->ethtool_ops->set_rx_csum)
 195		features[0].available |= NETIF_F_RXCSUM;
 196	if (dev->ethtool_ops->set_flags)
 197		features[0].available |= flags_dup_features;
 198}
 199
 200static int ethtool_set_feature_compat(struct net_device *dev,
 201	int (*legacy_set)(struct net_device *, u32),
 202	struct ethtool_set_features_block *features, u32 mask)
 203{
 204	u32 do_set;
 205
 206	if (!legacy_set)
 207		return 0;
 208
 209	if (!(features[0].valid & mask))
 210		return 0;
 211
 212	features[0].valid &= ~mask;
 213
 214	do_set = !!(features[0].requested & mask);
 215
 216	if (legacy_set(dev, do_set) < 0)
 217		netdev_info(dev,
 218			"Legacy feature change (%s) failed for 0x%08x\n",
 219			do_set ? "set" : "clear", mask);
 220
 221	return 1;
 222}
 223
 224static int ethtool_set_flags_compat(struct net_device *dev,
 225	int (*legacy_set)(struct net_device *, u32),
 226	struct ethtool_set_features_block *features, u32 mask)
 227{
 228	u32 value;
 229
 230	if (!legacy_set)
 231		return 0;
 232
 233	if (!(features[0].valid & mask))
 234		return 0;
 235
 236	value = dev->features & ~features[0].valid;
 237	value |= features[0].requested;
 238
 239	features[0].valid &= ~mask;
 240
 241	if (legacy_set(dev, value & mask) < 0)
 242		netdev_info(dev, "Legacy flags change failed\n");
 243
 244	return 1;
 245}
 246
 247static int ethtool_set_features_compat(struct net_device *dev,
 248	struct ethtool_set_features_block *features)
 249{
 250	int compat;
 251
 252	if (!dev->ethtool_ops)
 253		return 0;
 254
 255	compat  = ethtool_set_feature_compat(dev, dev->ethtool_ops->set_sg,
 256		features, NETIF_F_SG);
 257	compat |= ethtool_set_feature_compat(dev, dev->ethtool_ops->set_tx_csum,
 258		features, NETIF_F_ALL_CSUM);
 259	compat |= ethtool_set_feature_compat(dev, dev->ethtool_ops->set_tso,
 260		features, NETIF_F_ALL_TSO);
 261	compat |= ethtool_set_feature_compat(dev, dev->ethtool_ops->set_rx_csum,
 262		features, NETIF_F_RXCSUM);
 263	compat |= ethtool_set_flags_compat(dev, dev->ethtool_ops->set_flags,
 264		features, flags_dup_features);
 265
 266	return compat;
 267}
 
 
 
 
 
 
 
 
 
 
 
 
 268
 269static int ethtool_get_features(struct net_device *dev, void __user *useraddr)
 270{
 271	struct ethtool_gfeatures cmd = {
 272		.cmd = ETHTOOL_GFEATURES,
 273		.size = ETHTOOL_DEV_FEATURE_WORDS,
 274	};
 275	struct ethtool_get_features_block features[ETHTOOL_DEV_FEATURE_WORDS] = {
 276		{
 277			.available = dev->hw_features,
 278			.requested = dev->wanted_features,
 279			.active = dev->features,
 280			.never_changed = NETIF_F_NEVER_CHANGE,
 281		},
 282	};
 283	u32 __user *sizeaddr;
 284	u32 copy_size;
 
 285
 286	ethtool_get_features_compat(dev, features);
 
 
 
 
 
 
 
 
 
 287
 288	sizeaddr = useraddr + offsetof(struct ethtool_gfeatures, size);
 289	if (get_user(copy_size, sizeaddr))
 290		return -EFAULT;
 291
 292	if (copy_size > ETHTOOL_DEV_FEATURE_WORDS)
 293		copy_size = ETHTOOL_DEV_FEATURE_WORDS;
 294
 295	if (copy_to_user(useraddr, &cmd, sizeof(cmd)))
 296		return -EFAULT;
 297	useraddr += sizeof(cmd);
 298	if (copy_to_user(useraddr, features, copy_size * sizeof(*features)))
 299		return -EFAULT;
 300
 301	return 0;
 302}
 303
 304static int ethtool_set_features(struct net_device *dev, void __user *useraddr)
 305{
 306	struct ethtool_sfeatures cmd;
 307	struct ethtool_set_features_block features[ETHTOOL_DEV_FEATURE_WORDS];
 308	int ret = 0;
 
 309
 310	if (copy_from_user(&cmd, useraddr, sizeof(cmd)))
 311		return -EFAULT;
 312	useraddr += sizeof(cmd);
 313
 314	if (cmd.size != ETHTOOL_DEV_FEATURE_WORDS)
 315		return -EINVAL;
 316
 317	if (copy_from_user(features, useraddr, sizeof(features)))
 318		return -EFAULT;
 319
 320	if (features[0].valid & ~NETIF_F_ETHTOOL_BITS)
 321		return -EINVAL;
 
 
 322
 323	if (ethtool_set_features_compat(dev, features))
 324		ret |= ETHTOOL_F_COMPAT;
 325
 326	if (features[0].valid & ~dev->hw_features) {
 327		features[0].valid &= dev->hw_features;
 328		ret |= ETHTOOL_F_UNSUPPORTED;
 329	}
 330
 331	dev->wanted_features &= ~features[0].valid;
 332	dev->wanted_features |= features[0].valid & features[0].requested;
 333	__netdev_update_features(dev);
 334
 335	if ((dev->wanted_features ^ dev->features) & features[0].valid)
 336		ret |= ETHTOOL_F_WISH;
 337
 338	return ret;
 339}
 340
 341static const char netdev_features_strings[ETHTOOL_DEV_FEATURE_WORDS * 32][ETH_GSTRING_LEN] = {
 342	/* NETIF_F_SG */              "tx-scatter-gather",
 343	/* NETIF_F_IP_CSUM */         "tx-checksum-ipv4",
 344	/* NETIF_F_NO_CSUM */         "tx-checksum-unneeded",
 345	/* NETIF_F_HW_CSUM */         "tx-checksum-ip-generic",
 346	/* NETIF_F_IPV6_CSUM */       "tx-checksum-ipv6",
 347	/* NETIF_F_HIGHDMA */         "highdma",
 348	/* NETIF_F_FRAGLIST */        "tx-scatter-gather-fraglist",
 349	/* NETIF_F_HW_VLAN_TX */      "tx-vlan-hw-insert",
 350
 351	/* NETIF_F_HW_VLAN_RX */      "rx-vlan-hw-parse",
 352	/* NETIF_F_HW_VLAN_FILTER */  "rx-vlan-filter",
 353	/* NETIF_F_VLAN_CHALLENGED */ "vlan-challenged",
 354	/* NETIF_F_GSO */             "tx-generic-segmentation",
 355	/* NETIF_F_LLTX */            "tx-lockless",
 356	/* NETIF_F_NETNS_LOCAL */     "netns-local",
 357	/* NETIF_F_GRO */             "rx-gro",
 358	/* NETIF_F_LRO */             "rx-lro",
 359
 360	/* NETIF_F_TSO */             "tx-tcp-segmentation",
 361	/* NETIF_F_UFO */             "tx-udp-fragmentation",
 362	/* NETIF_F_GSO_ROBUST */      "tx-gso-robust",
 363	/* NETIF_F_TSO_ECN */         "tx-tcp-ecn-segmentation",
 364	/* NETIF_F_TSO6 */            "tx-tcp6-segmentation",
 365	/* NETIF_F_FSO */             "tx-fcoe-segmentation",
 366	"",
 367	"",
 368
 369	/* NETIF_F_FCOE_CRC */        "tx-checksum-fcoe-crc",
 370	/* NETIF_F_SCTP_CSUM */       "tx-checksum-sctp",
 371	/* NETIF_F_FCOE_MTU */        "fcoe-mtu",
 372	/* NETIF_F_NTUPLE */          "rx-ntuple-filter",
 373	/* NETIF_F_RXHASH */          "rx-hashing",
 374	/* NETIF_F_RXCSUM */          "rx-checksum",
 375	/* NETIF_F_NOCACHE_COPY */    "tx-nocache-copy",
 376	/* NETIF_F_LOOPBACK */        "loopback",
 377};
 378
 379static int __ethtool_get_sset_count(struct net_device *dev, int sset)
 380{
 381	const struct ethtool_ops *ops = dev->ethtool_ops;
 382
 383	if (sset == ETH_SS_FEATURES)
 384		return ARRAY_SIZE(netdev_features_strings);
 385
 386	if (ops && ops->get_sset_count && ops->get_strings)
 387		return ops->get_sset_count(dev, sset);
 388	else
 389		return -EOPNOTSUPP;
 390}
 391
 392static void __ethtool_get_strings(struct net_device *dev,
 393	u32 stringset, u8 *data)
 394{
 395	const struct ethtool_ops *ops = dev->ethtool_ops;
 396
 397	if (stringset == ETH_SS_FEATURES)
 398		memcpy(data, netdev_features_strings,
 399			sizeof(netdev_features_strings));
 400	else
 401		/* ops->get_strings is valid because checked earlier */
 402		ops->get_strings(dev, stringset, data);
 403}
 404
 405static u32 ethtool_get_feature_mask(u32 eth_cmd)
 406{
 407	/* feature masks of legacy discrete ethtool ops */
 408
 409	switch (eth_cmd) {
 410	case ETHTOOL_GTXCSUM:
 411	case ETHTOOL_STXCSUM:
 412		return NETIF_F_ALL_CSUM | NETIF_F_SCTP_CSUM;
 413	case ETHTOOL_GRXCSUM:
 414	case ETHTOOL_SRXCSUM:
 415		return NETIF_F_RXCSUM;
 416	case ETHTOOL_GSG:
 417	case ETHTOOL_SSG:
 418		return NETIF_F_SG;
 419	case ETHTOOL_GTSO:
 420	case ETHTOOL_STSO:
 421		return NETIF_F_ALL_TSO;
 422	case ETHTOOL_GUFO:
 423	case ETHTOOL_SUFO:
 424		return NETIF_F_UFO;
 425	case ETHTOOL_GGSO:
 426	case ETHTOOL_SGSO:
 427		return NETIF_F_GSO;
 428	case ETHTOOL_GGRO:
 429	case ETHTOOL_SGRO:
 430		return NETIF_F_GRO;
 431	default:
 432		BUG();
 433	}
 434}
 435
 436static void *__ethtool_get_one_feature_actor(struct net_device *dev, u32 ethcmd)
 437{
 438	const struct ethtool_ops *ops = dev->ethtool_ops;
 439
 440	if (!ops)
 441		return NULL;
 442
 443	switch (ethcmd) {
 444	case ETHTOOL_GTXCSUM:
 445		return ops->get_tx_csum;
 446	case ETHTOOL_GRXCSUM:
 447		return ops->get_rx_csum;
 448	case ETHTOOL_SSG:
 449		return ops->get_sg;
 450	case ETHTOOL_STSO:
 451		return ops->get_tso;
 452	case ETHTOOL_SUFO:
 453		return ops->get_ufo;
 454	default:
 455		return NULL;
 456	}
 457}
 458
 459static u32 __ethtool_get_rx_csum_oldbug(struct net_device *dev)
 460{
 461	return !!(dev->features & NETIF_F_ALL_CSUM);
 462}
 463
 464static int ethtool_get_one_feature(struct net_device *dev,
 465	char __user *useraddr, u32 ethcmd)
 466{
 467	u32 mask = ethtool_get_feature_mask(ethcmd);
 468	struct ethtool_value edata = {
 469		.cmd = ethcmd,
 470		.data = !!(dev->features & mask),
 471	};
 472
 473	/* compatibility with discrete get_ ops */
 474	if (!(dev->hw_features & mask)) {
 475		u32 (*actor)(struct net_device *);
 476
 477		actor = __ethtool_get_one_feature_actor(dev, ethcmd);
 478
 479		/* bug compatibility with old get_rx_csum */
 480		if (ethcmd == ETHTOOL_GRXCSUM && !actor)
 481			actor = __ethtool_get_rx_csum_oldbug;
 482
 483		if (actor)
 484			edata.data = actor(dev);
 485	}
 486
 487	if (copy_to_user(useraddr, &edata, sizeof(edata)))
 488		return -EFAULT;
 489	return 0;
 490}
 491
 492static int __ethtool_set_tx_csum(struct net_device *dev, u32 data);
 493static int __ethtool_set_rx_csum(struct net_device *dev, u32 data);
 494static int __ethtool_set_sg(struct net_device *dev, u32 data);
 495static int __ethtool_set_tso(struct net_device *dev, u32 data);
 496static int __ethtool_set_ufo(struct net_device *dev, u32 data);
 497
 498static int ethtool_set_one_feature(struct net_device *dev,
 499	void __user *useraddr, u32 ethcmd)
 500{
 501	struct ethtool_value edata;
 502	u32 mask;
 503
 504	if (copy_from_user(&edata, useraddr, sizeof(edata)))
 505		return -EFAULT;
 506
 507	mask = ethtool_get_feature_mask(ethcmd);
 508	mask &= dev->hw_features;
 509	if (mask) {
 510		if (edata.data)
 511			dev->wanted_features |= mask;
 512		else
 513			dev->wanted_features &= ~mask;
 514
 515		__netdev_update_features(dev);
 516		return 0;
 517	}
 
 518
 519	/* Driver is not converted to ndo_fix_features or does not
 520	 * support changing this offload. In the latter case it won't
 521	 * have corresponding ethtool_ops field set.
 522	 *
 523	 * Following part is to be removed after all drivers advertise
 524	 * their changeable features in netdev->hw_features and stop
 525	 * using discrete offload setting ops.
 526	 */
 527
 528	switch (ethcmd) {
 529	case ETHTOOL_STXCSUM:
 530		return __ethtool_set_tx_csum(dev, edata.data);
 531	case ETHTOOL_SRXCSUM:
 532		return __ethtool_set_rx_csum(dev, edata.data);
 533	case ETHTOOL_SSG:
 534		return __ethtool_set_sg(dev, edata.data);
 535	case ETHTOOL_STSO:
 536		return __ethtool_set_tso(dev, edata.data);
 537	case ETHTOOL_SUFO:
 538		return __ethtool_set_ufo(dev, edata.data);
 539	default:
 540		return -EOPNOTSUPP;
 541	}
 
 
 
 
 
 542}
 543
 544int __ethtool_set_flags(struct net_device *dev, u32 data)
 545{
 546	u32 changed;
 547
 548	if (data & ~flags_dup_features)
 549		return -EINVAL;
 550
 551	/* legacy set_flags() op */
 552	if (dev->ethtool_ops->set_flags) {
 553		if (unlikely(dev->hw_features & flags_dup_features))
 554			netdev_warn(dev,
 555				"driver BUG: mixed hw_features and set_flags()\n");
 556		return dev->ethtool_ops->set_flags(dev, data);
 557	}
 558
 559	/* allow changing only bits set in hw_features */
 560	changed = (data ^ dev->features) & flags_dup_features;
 561	if (changed & ~dev->hw_features)
 562		return (changed & dev->hw_features) ? -EINVAL : -EOPNOTSUPP;
 563
 564	dev->wanted_features =
 565		(dev->wanted_features & ~changed) | (data & dev->hw_features);
 566
 567	__netdev_update_features(dev);
 568
 569	return 0;
 570}
 571
 572static int ethtool_get_settings(struct net_device *dev, void __user *useraddr)
 573{
 574	struct ethtool_cmd cmd = { .cmd = ETHTOOL_GSET };
 575	int err;
 576
 577	if (!dev->ethtool_ops->get_settings)
 578		return -EOPNOTSUPP;
 579
 580	err = dev->ethtool_ops->get_settings(dev, &cmd);
 
 
 
 
 
 
 
 
 
 
 
 581	if (err < 0)
 582		return err;
 583
 584	if (copy_to_user(useraddr, &cmd, sizeof(cmd)))
 585		return -EFAULT;
 586	return 0;
 587}
 588
 589static int ethtool_set_settings(struct net_device *dev, void __user *useraddr)
 590{
 591	struct ethtool_cmd cmd;
 592
 593	if (!dev->ethtool_ops->set_settings)
 594		return -EOPNOTSUPP;
 595
 596	if (copy_from_user(&cmd, useraddr, sizeof(cmd)))
 597		return -EFAULT;
 598
 599	return dev->ethtool_ops->set_settings(dev, &cmd);
 600}
 601
 602static noinline_for_stack int ethtool_get_drvinfo(struct net_device *dev,
 603						  void __user *useraddr)
 604{
 605	struct ethtool_drvinfo info;
 606	const struct ethtool_ops *ops = dev->ethtool_ops;
 607
 608	memset(&info, 0, sizeof(info));
 609	info.cmd = ETHTOOL_GDRVINFO;
 610	if (ops && ops->get_drvinfo) {
 611		ops->get_drvinfo(dev, &info);
 612	} else if (dev->dev.parent && dev->dev.parent->driver) {
 613		strlcpy(info.bus_info, dev_name(dev->dev.parent),
 614			sizeof(info.bus_info));
 615		strlcpy(info.driver, dev->dev.parent->driver->name,
 616			sizeof(info.driver));
 617	} else {
 618		return -EOPNOTSUPP;
 619	}
 620
 621	/*
 622	 * this method of obtaining string set info is deprecated;
 623	 * Use ETHTOOL_GSSET_INFO instead.
 624	 */
 625	if (ops && ops->get_sset_count) {
 626		int rc;
 627
 628		rc = ops->get_sset_count(dev, ETH_SS_TEST);
 629		if (rc >= 0)
 630			info.testinfo_len = rc;
 631		rc = ops->get_sset_count(dev, ETH_SS_STATS);
 632		if (rc >= 0)
 633			info.n_stats = rc;
 634		rc = ops->get_sset_count(dev, ETH_SS_PRIV_FLAGS);
 635		if (rc >= 0)
 636			info.n_priv_flags = rc;
 637	}
 638	if (ops && ops->get_regs_len)
 639		info.regdump_len = ops->get_regs_len(dev);
 640	if (ops && ops->get_eeprom_len)
 641		info.eedump_len = ops->get_eeprom_len(dev);
 642
 643	if (copy_to_user(useraddr, &info, sizeof(info)))
 644		return -EFAULT;
 645	return 0;
 646}
 647
 648static noinline_for_stack int ethtool_get_sset_info(struct net_device *dev,
 649						    void __user *useraddr)
 650{
 651	struct ethtool_sset_info info;
 652	u64 sset_mask;
 653	int i, idx = 0, n_bits = 0, ret, rc;
 654	u32 *info_buf = NULL;
 655
 656	if (copy_from_user(&info, useraddr, sizeof(info)))
 657		return -EFAULT;
 658
 659	/* store copy of mask, because we zero struct later on */
 660	sset_mask = info.sset_mask;
 661	if (!sset_mask)
 662		return 0;
 663
 664	/* calculate size of return buffer */
 665	n_bits = hweight64(sset_mask);
 666
 667	memset(&info, 0, sizeof(info));
 668	info.cmd = ETHTOOL_GSSET_INFO;
 669
 670	info_buf = kzalloc(n_bits * sizeof(u32), GFP_USER);
 671	if (!info_buf)
 672		return -ENOMEM;
 673
 674	/*
 675	 * fill return buffer based on input bitmask and successful
 676	 * get_sset_count return
 677	 */
 678	for (i = 0; i < 64; i++) {
 679		if (!(sset_mask & (1ULL << i)))
 680			continue;
 681
 682		rc = __ethtool_get_sset_count(dev, i);
 683		if (rc >= 0) {
 684			info.sset_mask |= (1ULL << i);
 685			info_buf[idx++] = rc;
 686		}
 687	}
 688
 689	ret = -EFAULT;
 690	if (copy_to_user(useraddr, &info, sizeof(info)))
 691		goto out;
 692
 693	useraddr += offsetof(struct ethtool_sset_info, data);
 694	if (copy_to_user(useraddr, info_buf, idx * sizeof(u32)))
 695		goto out;
 696
 697	ret = 0;
 698
 699out:
 700	kfree(info_buf);
 701	return ret;
 702}
 703
 704static noinline_for_stack int ethtool_set_rxnfc(struct net_device *dev,
 705						u32 cmd, void __user *useraddr)
 706{
 707	struct ethtool_rxnfc info;
 708	size_t info_size = sizeof(info);
 
 709
 710	if (!dev->ethtool_ops->set_rxnfc)
 711		return -EOPNOTSUPP;
 712
 713	/* struct ethtool_rxnfc was originally defined for
 714	 * ETHTOOL_{G,S}RXFH with only the cmd, flow_type and data
 715	 * members.  User-space might still be using that
 716	 * definition. */
 717	if (cmd == ETHTOOL_SRXFH)
 718		info_size = (offsetof(struct ethtool_rxnfc, data) +
 719			     sizeof(info.data));
 720
 721	if (copy_from_user(&info, useraddr, info_size))
 722		return -EFAULT;
 723
 724	return dev->ethtool_ops->set_rxnfc(dev, &info);
 
 
 
 
 
 
 
 
 725}
 726
 727static noinline_for_stack int ethtool_get_rxnfc(struct net_device *dev,
 728						u32 cmd, void __user *useraddr)
 729{
 730	struct ethtool_rxnfc info;
 731	size_t info_size = sizeof(info);
 732	const struct ethtool_ops *ops = dev->ethtool_ops;
 733	int ret;
 734	void *rule_buf = NULL;
 735
 736	if (!ops->get_rxnfc)
 737		return -EOPNOTSUPP;
 738
 739	/* struct ethtool_rxnfc was originally defined for
 740	 * ETHTOOL_{G,S}RXFH with only the cmd, flow_type and data
 741	 * members.  User-space might still be using that
 742	 * definition. */
 743	if (cmd == ETHTOOL_GRXFH)
 744		info_size = (offsetof(struct ethtool_rxnfc, data) +
 745			     sizeof(info.data));
 746
 747	if (copy_from_user(&info, useraddr, info_size))
 748		return -EFAULT;
 749
 750	if (info.cmd == ETHTOOL_GRXCLSRLALL) {
 751		if (info.rule_cnt > 0) {
 752			if (info.rule_cnt <= KMALLOC_MAX_SIZE / sizeof(u32))
 753				rule_buf = kzalloc(info.rule_cnt * sizeof(u32),
 754						   GFP_USER);
 755			if (!rule_buf)
 756				return -ENOMEM;
 757		}
 758	}
 759
 760	ret = ops->get_rxnfc(dev, &info, rule_buf);
 761	if (ret < 0)
 762		goto err_out;
 763
 764	ret = -EFAULT;
 765	if (copy_to_user(useraddr, &info, info_size))
 766		goto err_out;
 767
 768	if (rule_buf) {
 769		useraddr += offsetof(struct ethtool_rxnfc, rule_locs);
 770		if (copy_to_user(useraddr, rule_buf,
 771				 info.rule_cnt * sizeof(u32)))
 772			goto err_out;
 773	}
 774	ret = 0;
 775
 776err_out:
 777	kfree(rule_buf);
 778
 779	return ret;
 780}
 781
 782static noinline_for_stack int ethtool_get_rxfh_indir(struct net_device *dev,
 783						     void __user *useraddr)
 784{
 785	struct ethtool_rxfh_indir *indir;
 786	u32 table_size;
 787	size_t full_size;
 788	int ret;
 789
 790	if (!dev->ethtool_ops->get_rxfh_indir)
 
 
 
 
 791		return -EOPNOTSUPP;
 792
 793	if (copy_from_user(&table_size,
 794			   useraddr + offsetof(struct ethtool_rxfh_indir, size),
 795			   sizeof(table_size)))
 796		return -EFAULT;
 797
 798	if (table_size >
 799	    (KMALLOC_MAX_SIZE - sizeof(*indir)) / sizeof(*indir->ring_index))
 800		return -ENOMEM;
 801	full_size = sizeof(*indir) + sizeof(*indir->ring_index) * table_size;
 802	indir = kzalloc(full_size, GFP_USER);
 
 
 
 
 
 
 
 803	if (!indir)
 804		return -ENOMEM;
 805
 806	indir->cmd = ETHTOOL_GRXFHINDIR;
 807	indir->size = table_size;
 808	ret = dev->ethtool_ops->get_rxfh_indir(dev, indir);
 809	if (ret)
 810		goto out;
 811
 812	if (copy_to_user(useraddr, indir, full_size))
 
 
 813		ret = -EFAULT;
 814
 815out:
 816	kfree(indir);
 817	return ret;
 818}
 819
 820static noinline_for_stack int ethtool_set_rxfh_indir(struct net_device *dev,
 821						     void __user *useraddr)
 822{
 823	struct ethtool_rxfh_indir *indir;
 824	u32 table_size;
 825	size_t full_size;
 826	int ret;
 827
 828	if (!dev->ethtool_ops->set_rxfh_indir)
 
 
 
 
 
 829		return -EOPNOTSUPP;
 830
 831	if (copy_from_user(&table_size,
 832			   useraddr + offsetof(struct ethtool_rxfh_indir, size),
 833			   sizeof(table_size)))
 834		return -EFAULT;
 835
 836	if (table_size >
 837	    (KMALLOC_MAX_SIZE - sizeof(*indir)) / sizeof(*indir->ring_index))
 838		return -ENOMEM;
 839	full_size = sizeof(*indir) + sizeof(*indir->ring_index) * table_size;
 840	indir = kmalloc(full_size, GFP_USER);
 841	if (!indir)
 842		return -ENOMEM;
 843
 844	if (copy_from_user(indir, useraddr, full_size)) {
 845		ret = -EFAULT;
 
 846		goto out;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 847	}
 848
 849	ret = dev->ethtool_ops->set_rxfh_indir(dev, indir);
 850
 851out:
 852	kfree(indir);
 853	return ret;
 854}
 855
 856/*
 857 * ethtool does not (or did not) set masks for flow parameters that are
 858 * not specified, so if both value and mask are 0 then this must be
 859 * treated as equivalent to a mask with all bits set.  Implement that
 860 * here rather than in drivers.
 861 */
 862static void rx_ntuple_fix_masks(struct ethtool_rx_ntuple_flow_spec *fs)
 863{
 864	struct ethtool_tcpip4_spec *entry = &fs->h_u.tcp_ip4_spec;
 865	struct ethtool_tcpip4_spec *mask = &fs->m_u.tcp_ip4_spec;
 866
 867	if (fs->flow_type != TCP_V4_FLOW &&
 868	    fs->flow_type != UDP_V4_FLOW &&
 869	    fs->flow_type != SCTP_V4_FLOW)
 870		return;
 871
 872	if (!(entry->ip4src | mask->ip4src))
 873		mask->ip4src = htonl(0xffffffff);
 874	if (!(entry->ip4dst | mask->ip4dst))
 875		mask->ip4dst = htonl(0xffffffff);
 876	if (!(entry->psrc | mask->psrc))
 877		mask->psrc = htons(0xffff);
 878	if (!(entry->pdst | mask->pdst))
 879		mask->pdst = htons(0xffff);
 880	if (!(entry->tos | mask->tos))
 881		mask->tos = 0xff;
 882	if (!(fs->vlan_tag | fs->vlan_tag_mask))
 883		fs->vlan_tag_mask = 0xffff;
 884	if (!(fs->data | fs->data_mask))
 885		fs->data_mask = 0xffffffffffffffffULL;
 886}
 887
 888static noinline_for_stack int ethtool_set_rx_ntuple(struct net_device *dev,
 889						    void __user *useraddr)
 890{
 891	struct ethtool_rx_ntuple cmd;
 892	const struct ethtool_ops *ops = dev->ethtool_ops;
 893
 894	if (!ops->set_rx_ntuple)
 895		return -EOPNOTSUPP;
 896
 897	if (!(dev->features & NETIF_F_NTUPLE))
 898		return -EINVAL;
 899
 900	if (copy_from_user(&cmd, useraddr, sizeof(cmd)))
 901		return -EFAULT;
 902
 903	rx_ntuple_fix_masks(&cmd.fs);
 904
 905	return ops->set_rx_ntuple(dev, &cmd);
 906}
 907
 908static int ethtool_get_regs(struct net_device *dev, char __user *useraddr)
 909{
 910	struct ethtool_regs regs;
 911	const struct ethtool_ops *ops = dev->ethtool_ops;
 912	void *regbuf;
 913	int reglen, ret;
 914
 915	if (!ops->get_regs || !ops->get_regs_len)
 916		return -EOPNOTSUPP;
 917
 918	if (copy_from_user(&regs, useraddr, sizeof(regs)))
 919		return -EFAULT;
 920
 921	reglen = ops->get_regs_len(dev);
 922	if (regs.len > reglen)
 923		regs.len = reglen;
 924
 925	regbuf = vzalloc(reglen);
 926	if (reglen && !regbuf)
 927		return -ENOMEM;
 928
 929	ops->get_regs(dev, &regs, regbuf);
 930
 931	ret = -EFAULT;
 932	if (copy_to_user(useraddr, &regs, sizeof(regs)))
 933		goto out;
 934	useraddr += offsetof(struct ethtool_regs, data);
 935	if (regbuf && copy_to_user(useraddr, regbuf, regs.len))
 936		goto out;
 937	ret = 0;
 938
 939 out:
 940	vfree(regbuf);
 941	return ret;
 942}
 943
 944static int ethtool_reset(struct net_device *dev, char __user *useraddr)
 945{
 946	struct ethtool_value reset;
 947	int ret;
 948
 949	if (!dev->ethtool_ops->reset)
 950		return -EOPNOTSUPP;
 951
 952	if (copy_from_user(&reset, useraddr, sizeof(reset)))
 953		return -EFAULT;
 954
 955	ret = dev->ethtool_ops->reset(dev, &reset.data);
 956	if (ret)
 957		return ret;
 958
 959	if (copy_to_user(useraddr, &reset, sizeof(reset)))
 960		return -EFAULT;
 961	return 0;
 962}
 963
 964static int ethtool_get_wol(struct net_device *dev, char __user *useraddr)
 965{
 966	struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL };
 967
 968	if (!dev->ethtool_ops->get_wol)
 969		return -EOPNOTSUPP;
 970
 971	dev->ethtool_ops->get_wol(dev, &wol);
 972
 973	if (copy_to_user(useraddr, &wol, sizeof(wol)))
 974		return -EFAULT;
 975	return 0;
 976}
 977
 978static int ethtool_set_wol(struct net_device *dev, char __user *useraddr)
 979{
 980	struct ethtool_wolinfo wol;
 981
 982	if (!dev->ethtool_ops->set_wol)
 983		return -EOPNOTSUPP;
 984
 985	if (copy_from_user(&wol, useraddr, sizeof(wol)))
 986		return -EFAULT;
 987
 988	return dev->ethtool_ops->set_wol(dev, &wol);
 989}
 990
 991static int ethtool_nway_reset(struct net_device *dev)
 992{
 993	if (!dev->ethtool_ops->nway_reset)
 994		return -EOPNOTSUPP;
 995
 996	return dev->ethtool_ops->nway_reset(dev);
 997}
 998
 999static int ethtool_get_link(struct net_device *dev, char __user *useraddr)
1000{
1001	struct ethtool_value edata = { .cmd = ETHTOOL_GLINK };
1002
1003	if (!dev->ethtool_ops->get_link)
1004		return -EOPNOTSUPP;
1005
1006	edata.data = netif_running(dev) && dev->ethtool_ops->get_link(dev);
1007
1008	if (copy_to_user(useraddr, &edata, sizeof(edata)))
1009		return -EFAULT;
1010	return 0;
1011}
1012
1013static int ethtool_get_eeprom(struct net_device *dev, void __user *useraddr)
 
 
 
1014{
1015	struct ethtool_eeprom eeprom;
1016	const struct ethtool_ops *ops = dev->ethtool_ops;
1017	void __user *userbuf = useraddr + sizeof(eeprom);
1018	u32 bytes_remaining;
1019	u8 *data;
1020	int ret = 0;
1021
1022	if (!ops->get_eeprom || !ops->get_eeprom_len)
1023		return -EOPNOTSUPP;
1024
1025	if (copy_from_user(&eeprom, useraddr, sizeof(eeprom)))
1026		return -EFAULT;
1027
1028	/* Check for wrap and zero */
1029	if (eeprom.offset + eeprom.len <= eeprom.offset)
1030		return -EINVAL;
1031
1032	/* Check for exceeding total eeprom len */
1033	if (eeprom.offset + eeprom.len > ops->get_eeprom_len(dev))
1034		return -EINVAL;
1035
1036	data = kmalloc(PAGE_SIZE, GFP_USER);
1037	if (!data)
1038		return -ENOMEM;
1039
1040	bytes_remaining = eeprom.len;
1041	while (bytes_remaining > 0) {
1042		eeprom.len = min(bytes_remaining, (u32)PAGE_SIZE);
1043
1044		ret = ops->get_eeprom(dev, &eeprom, data);
1045		if (ret)
1046			break;
1047		if (copy_to_user(userbuf, data, eeprom.len)) {
1048			ret = -EFAULT;
1049			break;
1050		}
1051		userbuf += eeprom.len;
1052		eeprom.offset += eeprom.len;
1053		bytes_remaining -= eeprom.len;
1054	}
1055
1056	eeprom.len = userbuf - (useraddr + sizeof(eeprom));
1057	eeprom.offset -= eeprom.len;
1058	if (copy_to_user(useraddr, &eeprom, sizeof(eeprom)))
1059		ret = -EFAULT;
1060
1061	kfree(data);
1062	return ret;
1063}
1064
 
 
 
 
 
 
 
 
 
 
 
1065static int ethtool_set_eeprom(struct net_device *dev, void __user *useraddr)
1066{
1067	struct ethtool_eeprom eeprom;
1068	const struct ethtool_ops *ops = dev->ethtool_ops;
1069	void __user *userbuf = useraddr + sizeof(eeprom);
1070	u32 bytes_remaining;
1071	u8 *data;
1072	int ret = 0;
1073
1074	if (!ops->set_eeprom || !ops->get_eeprom_len)
1075		return -EOPNOTSUPP;
1076
1077	if (copy_from_user(&eeprom, useraddr, sizeof(eeprom)))
1078		return -EFAULT;
1079
1080	/* Check for wrap and zero */
1081	if (eeprom.offset + eeprom.len <= eeprom.offset)
1082		return -EINVAL;
1083
1084	/* Check for exceeding total eeprom len */
1085	if (eeprom.offset + eeprom.len > ops->get_eeprom_len(dev))
1086		return -EINVAL;
1087
1088	data = kmalloc(PAGE_SIZE, GFP_USER);
1089	if (!data)
1090		return -ENOMEM;
1091
1092	bytes_remaining = eeprom.len;
1093	while (bytes_remaining > 0) {
1094		eeprom.len = min(bytes_remaining, (u32)PAGE_SIZE);
1095
1096		if (copy_from_user(data, userbuf, eeprom.len)) {
1097			ret = -EFAULT;
1098			break;
1099		}
1100		ret = ops->set_eeprom(dev, &eeprom, data);
1101		if (ret)
1102			break;
1103		userbuf += eeprom.len;
1104		eeprom.offset += eeprom.len;
1105		bytes_remaining -= eeprom.len;
1106	}
1107
1108	kfree(data);
1109	return ret;
1110}
1111
1112static noinline_for_stack int ethtool_get_coalesce(struct net_device *dev,
1113						   void __user *useraddr)
1114{
1115	struct ethtool_coalesce coalesce = { .cmd = ETHTOOL_GCOALESCE };
1116
1117	if (!dev->ethtool_ops->get_coalesce)
1118		return -EOPNOTSUPP;
1119
1120	dev->ethtool_ops->get_coalesce(dev, &coalesce);
1121
1122	if (copy_to_user(useraddr, &coalesce, sizeof(coalesce)))
1123		return -EFAULT;
1124	return 0;
1125}
1126
1127static noinline_for_stack int ethtool_set_coalesce(struct net_device *dev,
1128						   void __user *useraddr)
1129{
1130	struct ethtool_coalesce coalesce;
1131
1132	if (!dev->ethtool_ops->set_coalesce)
1133		return -EOPNOTSUPP;
1134
1135	if (copy_from_user(&coalesce, useraddr, sizeof(coalesce)))
1136		return -EFAULT;
1137
1138	return dev->ethtool_ops->set_coalesce(dev, &coalesce);
1139}
1140
1141static int ethtool_get_ringparam(struct net_device *dev, void __user *useraddr)
1142{
1143	struct ethtool_ringparam ringparam = { .cmd = ETHTOOL_GRINGPARAM };
1144
1145	if (!dev->ethtool_ops->get_ringparam)
1146		return -EOPNOTSUPP;
1147
1148	dev->ethtool_ops->get_ringparam(dev, &ringparam);
1149
1150	if (copy_to_user(useraddr, &ringparam, sizeof(ringparam)))
1151		return -EFAULT;
1152	return 0;
1153}
1154
1155static int ethtool_set_ringparam(struct net_device *dev, void __user *useraddr)
1156{
1157	struct ethtool_ringparam ringparam;
1158
1159	if (!dev->ethtool_ops->set_ringparam)
1160		return -EOPNOTSUPP;
1161
1162	if (copy_from_user(&ringparam, useraddr, sizeof(ringparam)))
1163		return -EFAULT;
1164
1165	return dev->ethtool_ops->set_ringparam(dev, &ringparam);
1166}
1167
1168static noinline_for_stack int ethtool_get_channels(struct net_device *dev,
1169						   void __user *useraddr)
1170{
1171	struct ethtool_channels channels = { .cmd = ETHTOOL_GCHANNELS };
1172
1173	if (!dev->ethtool_ops->get_channels)
1174		return -EOPNOTSUPP;
1175
1176	dev->ethtool_ops->get_channels(dev, &channels);
1177
1178	if (copy_to_user(useraddr, &channels, sizeof(channels)))
1179		return -EFAULT;
1180	return 0;
1181}
1182
1183static noinline_for_stack int ethtool_set_channels(struct net_device *dev,
1184						   void __user *useraddr)
1185{
1186	struct ethtool_channels channels;
1187
1188	if (!dev->ethtool_ops->set_channels)
1189		return -EOPNOTSUPP;
1190
1191	if (copy_from_user(&channels, useraddr, sizeof(channels)))
1192		return -EFAULT;
1193
1194	return dev->ethtool_ops->set_channels(dev, &channels);
1195}
1196
1197static int ethtool_get_pauseparam(struct net_device *dev, void __user *useraddr)
1198{
1199	struct ethtool_pauseparam pauseparam = { ETHTOOL_GPAUSEPARAM };
1200
1201	if (!dev->ethtool_ops->get_pauseparam)
1202		return -EOPNOTSUPP;
1203
1204	dev->ethtool_ops->get_pauseparam(dev, &pauseparam);
1205
1206	if (copy_to_user(useraddr, &pauseparam, sizeof(pauseparam)))
1207		return -EFAULT;
1208	return 0;
1209}
1210
1211static int ethtool_set_pauseparam(struct net_device *dev, void __user *useraddr)
1212{
1213	struct ethtool_pauseparam pauseparam;
1214
1215	if (!dev->ethtool_ops->set_pauseparam)
1216		return -EOPNOTSUPP;
1217
1218	if (copy_from_user(&pauseparam, useraddr, sizeof(pauseparam)))
1219		return -EFAULT;
1220
1221	return dev->ethtool_ops->set_pauseparam(dev, &pauseparam);
1222}
1223
1224static int __ethtool_set_sg(struct net_device *dev, u32 data)
1225{
1226	int err;
1227
1228	if (!dev->ethtool_ops->set_sg)
1229		return -EOPNOTSUPP;
1230
1231	if (data && !(dev->features & NETIF_F_ALL_CSUM))
1232		return -EINVAL;
1233
1234	if (!data && dev->ethtool_ops->set_tso) {
1235		err = dev->ethtool_ops->set_tso(dev, 0);
1236		if (err)
1237			return err;
1238	}
1239
1240	if (!data && dev->ethtool_ops->set_ufo) {
1241		err = dev->ethtool_ops->set_ufo(dev, 0);
1242		if (err)
1243			return err;
1244	}
1245	return dev->ethtool_ops->set_sg(dev, data);
1246}
1247
1248static int __ethtool_set_tx_csum(struct net_device *dev, u32 data)
1249{
1250	int err;
1251
1252	if (!dev->ethtool_ops->set_tx_csum)
1253		return -EOPNOTSUPP;
1254
1255	if (!data && dev->ethtool_ops->set_sg) {
1256		err = __ethtool_set_sg(dev, 0);
1257		if (err)
1258			return err;
1259	}
1260
1261	return dev->ethtool_ops->set_tx_csum(dev, data);
1262}
1263
1264static int __ethtool_set_rx_csum(struct net_device *dev, u32 data)
1265{
1266	if (!dev->ethtool_ops->set_rx_csum)
1267		return -EOPNOTSUPP;
1268
1269	if (!data)
1270		dev->features &= ~NETIF_F_GRO;
1271
1272	return dev->ethtool_ops->set_rx_csum(dev, data);
1273}
1274
1275static int __ethtool_set_tso(struct net_device *dev, u32 data)
1276{
1277	if (!dev->ethtool_ops->set_tso)
1278		return -EOPNOTSUPP;
1279
1280	if (data && !(dev->features & NETIF_F_SG))
1281		return -EINVAL;
1282
1283	return dev->ethtool_ops->set_tso(dev, data);
1284}
1285
1286static int __ethtool_set_ufo(struct net_device *dev, u32 data)
1287{
1288	if (!dev->ethtool_ops->set_ufo)
1289		return -EOPNOTSUPP;
1290	if (data && !(dev->features & NETIF_F_SG))
1291		return -EINVAL;
1292	if (data && !((dev->features & NETIF_F_GEN_CSUM) ||
1293		(dev->features & (NETIF_F_IP_CSUM|NETIF_F_IPV6_CSUM))
1294			== (NETIF_F_IP_CSUM|NETIF_F_IPV6_CSUM)))
1295		return -EINVAL;
1296	return dev->ethtool_ops->set_ufo(dev, data);
1297}
1298
1299static int ethtool_self_test(struct net_device *dev, char __user *useraddr)
1300{
1301	struct ethtool_test test;
1302	const struct ethtool_ops *ops = dev->ethtool_ops;
1303	u64 *data;
1304	int ret, test_len;
1305
1306	if (!ops->self_test || !ops->get_sset_count)
1307		return -EOPNOTSUPP;
1308
1309	test_len = ops->get_sset_count(dev, ETH_SS_TEST);
1310	if (test_len < 0)
1311		return test_len;
1312	WARN_ON(test_len == 0);
1313
1314	if (copy_from_user(&test, useraddr, sizeof(test)))
1315		return -EFAULT;
1316
1317	test.len = test_len;
1318	data = kmalloc(test_len * sizeof(u64), GFP_USER);
1319	if (!data)
1320		return -ENOMEM;
1321
1322	ops->self_test(dev, &test, data);
1323
1324	ret = -EFAULT;
1325	if (copy_to_user(useraddr, &test, sizeof(test)))
1326		goto out;
1327	useraddr += sizeof(test);
1328	if (copy_to_user(useraddr, data, test.len * sizeof(u64)))
1329		goto out;
1330	ret = 0;
1331
1332 out:
1333	kfree(data);
1334	return ret;
1335}
1336
1337static int ethtool_get_strings(struct net_device *dev, void __user *useraddr)
1338{
1339	struct ethtool_gstrings gstrings;
1340	u8 *data;
1341	int ret;
1342
1343	if (copy_from_user(&gstrings, useraddr, sizeof(gstrings)))
1344		return -EFAULT;
1345
1346	ret = __ethtool_get_sset_count(dev, gstrings.string_set);
1347	if (ret < 0)
1348		return ret;
1349
1350	gstrings.len = ret;
1351
1352	data = kmalloc(gstrings.len * ETH_GSTRING_LEN, GFP_USER);
1353	if (!data)
1354		return -ENOMEM;
1355
1356	__ethtool_get_strings(dev, gstrings.string_set, data);
1357
1358	ret = -EFAULT;
1359	if (copy_to_user(useraddr, &gstrings, sizeof(gstrings)))
1360		goto out;
1361	useraddr += sizeof(gstrings);
1362	if (copy_to_user(useraddr, data, gstrings.len * ETH_GSTRING_LEN))
1363		goto out;
1364	ret = 0;
1365
1366out:
1367	kfree(data);
1368	return ret;
1369}
1370
1371static int ethtool_phys_id(struct net_device *dev, void __user *useraddr)
1372{
1373	struct ethtool_value id;
1374	static bool busy;
1375	int rc;
1376
1377	if (!dev->ethtool_ops->set_phys_id)
1378		return -EOPNOTSUPP;
1379
1380	if (busy)
1381		return -EBUSY;
1382
1383	if (copy_from_user(&id, useraddr, sizeof(id)))
1384		return -EFAULT;
1385
1386	rc = dev->ethtool_ops->set_phys_id(dev, ETHTOOL_ID_ACTIVE);
1387	if (rc < 0)
1388		return rc;
1389
1390	/* Drop the RTNL lock while waiting, but prevent reentry or
1391	 * removal of the device.
1392	 */
1393	busy = true;
1394	dev_hold(dev);
1395	rtnl_unlock();
1396
1397	if (rc == 0) {
1398		/* Driver will handle this itself */
1399		schedule_timeout_interruptible(
1400			id.data ? (id.data * HZ) : MAX_SCHEDULE_TIMEOUT);
1401	} else {
1402		/* Driver expects to be called at twice the frequency in rc */
1403		int n = rc * 2, i, interval = HZ / n;
1404
1405		/* Count down seconds */
1406		do {
1407			/* Count down iterations per second */
1408			i = n;
1409			do {
1410				rtnl_lock();
1411				rc = dev->ethtool_ops->set_phys_id(dev,
1412				    (i & 1) ? ETHTOOL_ID_OFF : ETHTOOL_ID_ON);
1413				rtnl_unlock();
1414				if (rc)
1415					break;
1416				schedule_timeout_interruptible(interval);
1417			} while (!signal_pending(current) && --i != 0);
1418		} while (!signal_pending(current) &&
1419			 (id.data == 0 || --id.data != 0));
1420	}
1421
1422	rtnl_lock();
1423	dev_put(dev);
1424	busy = false;
1425
1426	(void)dev->ethtool_ops->set_phys_id(dev, ETHTOOL_ID_INACTIVE);
1427	return rc;
1428}
1429
1430static int ethtool_get_stats(struct net_device *dev, void __user *useraddr)
1431{
1432	struct ethtool_stats stats;
1433	const struct ethtool_ops *ops = dev->ethtool_ops;
1434	u64 *data;
1435	int ret, n_stats;
1436
1437	if (!ops->get_ethtool_stats || !ops->get_sset_count)
1438		return -EOPNOTSUPP;
1439
1440	n_stats = ops->get_sset_count(dev, ETH_SS_STATS);
1441	if (n_stats < 0)
1442		return n_stats;
1443	WARN_ON(n_stats == 0);
1444
1445	if (copy_from_user(&stats, useraddr, sizeof(stats)))
1446		return -EFAULT;
1447
1448	stats.n_stats = n_stats;
1449	data = kmalloc(n_stats * sizeof(u64), GFP_USER);
1450	if (!data)
1451		return -ENOMEM;
1452
1453	ops->get_ethtool_stats(dev, &stats, data);
1454
1455	ret = -EFAULT;
1456	if (copy_to_user(useraddr, &stats, sizeof(stats)))
1457		goto out;
1458	useraddr += sizeof(stats);
1459	if (copy_to_user(useraddr, data, stats.n_stats * sizeof(u64)))
1460		goto out;
1461	ret = 0;
1462
1463 out:
1464	kfree(data);
1465	return ret;
1466}
1467
1468static int ethtool_get_perm_addr(struct net_device *dev, void __user *useraddr)
1469{
1470	struct ethtool_perm_addr epaddr;
1471
1472	if (copy_from_user(&epaddr, useraddr, sizeof(epaddr)))
1473		return -EFAULT;
1474
1475	if (epaddr.size < dev->addr_len)
1476		return -ETOOSMALL;
1477	epaddr.size = dev->addr_len;
1478
1479	if (copy_to_user(useraddr, &epaddr, sizeof(epaddr)))
1480		return -EFAULT;
1481	useraddr += sizeof(epaddr);
1482	if (copy_to_user(useraddr, dev->perm_addr, epaddr.size))
1483		return -EFAULT;
1484	return 0;
1485}
1486
1487static int ethtool_get_value(struct net_device *dev, char __user *useraddr,
1488			     u32 cmd, u32 (*actor)(struct net_device *))
1489{
1490	struct ethtool_value edata = { .cmd = cmd };
1491
1492	if (!actor)
1493		return -EOPNOTSUPP;
1494
1495	edata.data = actor(dev);
1496
1497	if (copy_to_user(useraddr, &edata, sizeof(edata)))
1498		return -EFAULT;
1499	return 0;
1500}
1501
1502static int ethtool_set_value_void(struct net_device *dev, char __user *useraddr,
1503			     void (*actor)(struct net_device *, u32))
1504{
1505	struct ethtool_value edata;
1506
1507	if (!actor)
1508		return -EOPNOTSUPP;
1509
1510	if (copy_from_user(&edata, useraddr, sizeof(edata)))
1511		return -EFAULT;
1512
1513	actor(dev, edata.data);
1514	return 0;
1515}
1516
1517static int ethtool_set_value(struct net_device *dev, char __user *useraddr,
1518			     int (*actor)(struct net_device *, u32))
1519{
1520	struct ethtool_value edata;
1521
1522	if (!actor)
1523		return -EOPNOTSUPP;
1524
1525	if (copy_from_user(&edata, useraddr, sizeof(edata)))
1526		return -EFAULT;
1527
1528	return actor(dev, edata.data);
1529}
1530
1531static noinline_for_stack int ethtool_flash_device(struct net_device *dev,
1532						   char __user *useraddr)
1533{
1534	struct ethtool_flash efl;
1535
1536	if (copy_from_user(&efl, useraddr, sizeof(efl)))
1537		return -EFAULT;
1538
1539	if (!dev->ethtool_ops->flash_device)
1540		return -EOPNOTSUPP;
1541
 
 
1542	return dev->ethtool_ops->flash_device(dev, &efl);
1543}
1544
1545static int ethtool_set_dump(struct net_device *dev,
1546			void __user *useraddr)
1547{
1548	struct ethtool_dump dump;
1549
1550	if (!dev->ethtool_ops->set_dump)
1551		return -EOPNOTSUPP;
1552
1553	if (copy_from_user(&dump, useraddr, sizeof(dump)))
1554		return -EFAULT;
1555
1556	return dev->ethtool_ops->set_dump(dev, &dump);
1557}
1558
1559static int ethtool_get_dump_flag(struct net_device *dev,
1560				void __user *useraddr)
1561{
1562	int ret;
1563	struct ethtool_dump dump;
1564	const struct ethtool_ops *ops = dev->ethtool_ops;
1565
1566	if (!dev->ethtool_ops->get_dump_flag)
1567		return -EOPNOTSUPP;
1568
1569	if (copy_from_user(&dump, useraddr, sizeof(dump)))
1570		return -EFAULT;
1571
1572	ret = ops->get_dump_flag(dev, &dump);
1573	if (ret)
1574		return ret;
1575
1576	if (copy_to_user(useraddr, &dump, sizeof(dump)))
1577		return -EFAULT;
1578	return 0;
1579}
1580
1581static int ethtool_get_dump_data(struct net_device *dev,
1582				void __user *useraddr)
1583{
1584	int ret;
1585	__u32 len;
1586	struct ethtool_dump dump, tmp;
1587	const struct ethtool_ops *ops = dev->ethtool_ops;
1588	void *data = NULL;
1589
1590	if (!dev->ethtool_ops->get_dump_data ||
1591		!dev->ethtool_ops->get_dump_flag)
1592		return -EOPNOTSUPP;
1593
1594	if (copy_from_user(&dump, useraddr, sizeof(dump)))
1595		return -EFAULT;
1596
1597	memset(&tmp, 0, sizeof(tmp));
1598	tmp.cmd = ETHTOOL_GET_DUMP_FLAG;
1599	ret = ops->get_dump_flag(dev, &tmp);
1600	if (ret)
1601		return ret;
1602
1603	len = (tmp.len > dump.len) ? dump.len : tmp.len;
1604	if (!len)
1605		return -EFAULT;
1606
1607	data = vzalloc(tmp.len);
1608	if (!data)
1609		return -ENOMEM;
1610	ret = ops->get_dump_data(dev, &dump, data);
1611	if (ret)
1612		goto out;
1613
1614	if (copy_to_user(useraddr, &dump, sizeof(dump))) {
1615		ret = -EFAULT;
1616		goto out;
1617	}
1618	useraddr += offsetof(struct ethtool_dump, data);
1619	if (copy_to_user(useraddr, data, len))
1620		ret = -EFAULT;
1621out:
1622	vfree(data);
1623	return ret;
1624}
1625
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1626/* The main entry point in this file.  Called from net/core/dev.c */
1627
1628int dev_ethtool(struct net *net, struct ifreq *ifr)
1629{
1630	struct net_device *dev = __dev_get_by_name(net, ifr->ifr_name);
1631	void __user *useraddr = ifr->ifr_data;
1632	u32 ethcmd;
1633	int rc;
1634	u32 old_features;
1635
1636	if (!dev || !netif_device_present(dev))
1637		return -ENODEV;
1638
1639	if (copy_from_user(&ethcmd, useraddr, sizeof(ethcmd)))
1640		return -EFAULT;
1641
1642	if (!dev->ethtool_ops) {
1643		/* ETHTOOL_GDRVINFO does not require any driver support.
1644		 * It is also unprivileged and does not change anything,
1645		 * so we can take a shortcut to it. */
1646		if (ethcmd == ETHTOOL_GDRVINFO)
1647			return ethtool_get_drvinfo(dev, useraddr);
 
 
1648		else
1649			return -EOPNOTSUPP;
1650	}
1651
1652	/* Allow some commands to be done by anyone */
1653	switch (ethcmd) {
1654	case ETHTOOL_GSET:
1655	case ETHTOOL_GDRVINFO:
1656	case ETHTOOL_GMSGLVL:
1657	case ETHTOOL_GCOALESCE:
1658	case ETHTOOL_GRINGPARAM:
1659	case ETHTOOL_GPAUSEPARAM:
1660	case ETHTOOL_GRXCSUM:
1661	case ETHTOOL_GTXCSUM:
1662	case ETHTOOL_GSG:
 
1663	case ETHTOOL_GSTRINGS:
1664	case ETHTOOL_GTSO:
1665	case ETHTOOL_GPERMADDR:
1666	case ETHTOOL_GUFO:
1667	case ETHTOOL_GGSO:
1668	case ETHTOOL_GGRO:
1669	case ETHTOOL_GFLAGS:
1670	case ETHTOOL_GPFLAGS:
1671	case ETHTOOL_GRXFH:
1672	case ETHTOOL_GRXRINGS:
1673	case ETHTOOL_GRXCLSRLCNT:
1674	case ETHTOOL_GRXCLSRULE:
1675	case ETHTOOL_GRXCLSRLALL:
1676	case ETHTOOL_GFEATURES:
 
1677		break;
1678	default:
1679		if (!capable(CAP_NET_ADMIN))
1680			return -EPERM;
1681	}
1682
1683	if (dev->ethtool_ops->begin) {
1684		rc = dev->ethtool_ops->begin(dev);
1685		if (rc  < 0)
1686			return rc;
1687	}
1688	old_features = dev->features;
1689
1690	switch (ethcmd) {
1691	case ETHTOOL_GSET:
1692		rc = ethtool_get_settings(dev, useraddr);
1693		break;
1694	case ETHTOOL_SSET:
1695		rc = ethtool_set_settings(dev, useraddr);
1696		break;
1697	case ETHTOOL_GDRVINFO:
1698		rc = ethtool_get_drvinfo(dev, useraddr);
1699		break;
1700	case ETHTOOL_GREGS:
1701		rc = ethtool_get_regs(dev, useraddr);
1702		break;
1703	case ETHTOOL_GWOL:
1704		rc = ethtool_get_wol(dev, useraddr);
1705		break;
1706	case ETHTOOL_SWOL:
1707		rc = ethtool_set_wol(dev, useraddr);
1708		break;
1709	case ETHTOOL_GMSGLVL:
1710		rc = ethtool_get_value(dev, useraddr, ethcmd,
1711				       dev->ethtool_ops->get_msglevel);
1712		break;
1713	case ETHTOOL_SMSGLVL:
1714		rc = ethtool_set_value_void(dev, useraddr,
1715				       dev->ethtool_ops->set_msglevel);
1716		break;
1717	case ETHTOOL_NWAY_RST:
1718		rc = ethtool_nway_reset(dev);
1719		break;
1720	case ETHTOOL_GLINK:
1721		rc = ethtool_get_link(dev, useraddr);
1722		break;
1723	case ETHTOOL_GEEPROM:
1724		rc = ethtool_get_eeprom(dev, useraddr);
1725		break;
1726	case ETHTOOL_SEEPROM:
1727		rc = ethtool_set_eeprom(dev, useraddr);
1728		break;
1729	case ETHTOOL_GCOALESCE:
1730		rc = ethtool_get_coalesce(dev, useraddr);
1731		break;
1732	case ETHTOOL_SCOALESCE:
1733		rc = ethtool_set_coalesce(dev, useraddr);
1734		break;
1735	case ETHTOOL_GRINGPARAM:
1736		rc = ethtool_get_ringparam(dev, useraddr);
1737		break;
1738	case ETHTOOL_SRINGPARAM:
1739		rc = ethtool_set_ringparam(dev, useraddr);
1740		break;
1741	case ETHTOOL_GPAUSEPARAM:
1742		rc = ethtool_get_pauseparam(dev, useraddr);
1743		break;
1744	case ETHTOOL_SPAUSEPARAM:
1745		rc = ethtool_set_pauseparam(dev, useraddr);
1746		break;
1747	case ETHTOOL_TEST:
1748		rc = ethtool_self_test(dev, useraddr);
1749		break;
1750	case ETHTOOL_GSTRINGS:
1751		rc = ethtool_get_strings(dev, useraddr);
1752		break;
1753	case ETHTOOL_PHYS_ID:
1754		rc = ethtool_phys_id(dev, useraddr);
1755		break;
1756	case ETHTOOL_GSTATS:
1757		rc = ethtool_get_stats(dev, useraddr);
1758		break;
1759	case ETHTOOL_GPERMADDR:
1760		rc = ethtool_get_perm_addr(dev, useraddr);
1761		break;
1762	case ETHTOOL_GFLAGS:
1763		rc = ethtool_get_value(dev, useraddr, ethcmd,
1764				       (dev->ethtool_ops->get_flags ?
1765					dev->ethtool_ops->get_flags :
1766					ethtool_op_get_flags));
1767		break;
1768	case ETHTOOL_SFLAGS:
1769		rc = ethtool_set_value(dev, useraddr, __ethtool_set_flags);
1770		break;
1771	case ETHTOOL_GPFLAGS:
1772		rc = ethtool_get_value(dev, useraddr, ethcmd,
1773				       dev->ethtool_ops->get_priv_flags);
1774		break;
1775	case ETHTOOL_SPFLAGS:
1776		rc = ethtool_set_value(dev, useraddr,
1777				       dev->ethtool_ops->set_priv_flags);
1778		break;
1779	case ETHTOOL_GRXFH:
1780	case ETHTOOL_GRXRINGS:
1781	case ETHTOOL_GRXCLSRLCNT:
1782	case ETHTOOL_GRXCLSRULE:
1783	case ETHTOOL_GRXCLSRLALL:
1784		rc = ethtool_get_rxnfc(dev, ethcmd, useraddr);
1785		break;
1786	case ETHTOOL_SRXFH:
1787	case ETHTOOL_SRXCLSRLDEL:
1788	case ETHTOOL_SRXCLSRLINS:
1789		rc = ethtool_set_rxnfc(dev, ethcmd, useraddr);
1790		break;
1791	case ETHTOOL_FLASHDEV:
1792		rc = ethtool_flash_device(dev, useraddr);
1793		break;
1794	case ETHTOOL_RESET:
1795		rc = ethtool_reset(dev, useraddr);
1796		break;
1797	case ETHTOOL_SRXNTUPLE:
1798		rc = ethtool_set_rx_ntuple(dev, useraddr);
1799		break;
1800	case ETHTOOL_GSSET_INFO:
1801		rc = ethtool_get_sset_info(dev, useraddr);
1802		break;
1803	case ETHTOOL_GRXFHINDIR:
1804		rc = ethtool_get_rxfh_indir(dev, useraddr);
1805		break;
1806	case ETHTOOL_SRXFHINDIR:
1807		rc = ethtool_set_rxfh_indir(dev, useraddr);
1808		break;
1809	case ETHTOOL_GFEATURES:
1810		rc = ethtool_get_features(dev, useraddr);
1811		break;
1812	case ETHTOOL_SFEATURES:
1813		rc = ethtool_set_features(dev, useraddr);
1814		break;
1815	case ETHTOOL_GTXCSUM:
1816	case ETHTOOL_GRXCSUM:
1817	case ETHTOOL_GSG:
1818	case ETHTOOL_GTSO:
1819	case ETHTOOL_GUFO:
1820	case ETHTOOL_GGSO:
1821	case ETHTOOL_GGRO:
1822		rc = ethtool_get_one_feature(dev, useraddr, ethcmd);
1823		break;
1824	case ETHTOOL_STXCSUM:
1825	case ETHTOOL_SRXCSUM:
1826	case ETHTOOL_SSG:
1827	case ETHTOOL_STSO:
1828	case ETHTOOL_SUFO:
1829	case ETHTOOL_SGSO:
1830	case ETHTOOL_SGRO:
1831		rc = ethtool_set_one_feature(dev, useraddr, ethcmd);
1832		break;
1833	case ETHTOOL_GCHANNELS:
1834		rc = ethtool_get_channels(dev, useraddr);
1835		break;
1836	case ETHTOOL_SCHANNELS:
1837		rc = ethtool_set_channels(dev, useraddr);
1838		break;
1839	case ETHTOOL_SET_DUMP:
1840		rc = ethtool_set_dump(dev, useraddr);
1841		break;
1842	case ETHTOOL_GET_DUMP_FLAG:
1843		rc = ethtool_get_dump_flag(dev, useraddr);
1844		break;
1845	case ETHTOOL_GET_DUMP_DATA:
1846		rc = ethtool_get_dump_data(dev, useraddr);
 
 
 
 
 
 
 
 
 
1847		break;
1848	default:
1849		rc = -EOPNOTSUPP;
1850	}
1851
1852	if (dev->ethtool_ops->complete)
1853		dev->ethtool_ops->complete(dev);
1854
1855	if (old_features != dev->features)
1856		netdev_features_change(dev);
1857
1858	return rc;
1859}
v3.5.6
   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
  29/*
  30 * Some useful ethtool_ops methods that're device independent.
  31 * If we find that all drivers want to do the same thing here,
  32 * we can turn these into dev_() function calls.
  33 */
  34
  35u32 ethtool_op_get_link(struct net_device *dev)
  36{
  37	return netif_carrier_ok(dev) ? 1 : 0;
  38}
  39EXPORT_SYMBOL(ethtool_op_get_link);
  40
  41int ethtool_op_get_ts_info(struct net_device *dev, struct ethtool_ts_info *info)
  42{
  43	info->so_timestamping =
  44		SOF_TIMESTAMPING_TX_SOFTWARE |
  45		SOF_TIMESTAMPING_RX_SOFTWARE |
  46		SOF_TIMESTAMPING_SOFTWARE;
  47	info->phc_index = -1;
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  48	return 0;
  49}
  50EXPORT_SYMBOL(ethtool_op_get_ts_info);
  51
  52/* Handlers for each ethtool command */
  53
  54#define ETHTOOL_DEV_FEATURE_WORDS	((NETDEV_FEATURE_COUNT + 31) / 32)
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
  55
  56static const char netdev_features_strings[NETDEV_FEATURE_COUNT][ETH_GSTRING_LEN] = {
  57	[NETIF_F_SG_BIT] =               "tx-scatter-gather",
  58	[NETIF_F_IP_CSUM_BIT] =          "tx-checksum-ipv4",
  59	[NETIF_F_HW_CSUM_BIT] =          "tx-checksum-ip-generic",
  60	[NETIF_F_IPV6_CSUM_BIT] =        "tx-checksum-ipv6",
  61	[NETIF_F_HIGHDMA_BIT] =          "highdma",
  62	[NETIF_F_FRAGLIST_BIT] =         "tx-scatter-gather-fraglist",
  63	[NETIF_F_HW_VLAN_TX_BIT] =       "tx-vlan-hw-insert",
  64
  65	[NETIF_F_HW_VLAN_RX_BIT] =       "rx-vlan-hw-parse",
  66	[NETIF_F_HW_VLAN_FILTER_BIT] =   "rx-vlan-filter",
  67	[NETIF_F_VLAN_CHALLENGED_BIT] =  "vlan-challenged",
  68	[NETIF_F_GSO_BIT] =              "tx-generic-segmentation",
  69	[NETIF_F_LLTX_BIT] =             "tx-lockless",
  70	[NETIF_F_NETNS_LOCAL_BIT] =      "netns-local",
  71	[NETIF_F_GRO_BIT] =              "rx-gro",
  72	[NETIF_F_LRO_BIT] =              "rx-lro",
  73
  74	[NETIF_F_TSO_BIT] =              "tx-tcp-segmentation",
  75	[NETIF_F_UFO_BIT] =              "tx-udp-fragmentation",
  76	[NETIF_F_GSO_ROBUST_BIT] =       "tx-gso-robust",
  77	[NETIF_F_TSO_ECN_BIT] =          "tx-tcp-ecn-segmentation",
  78	[NETIF_F_TSO6_BIT] =             "tx-tcp6-segmentation",
  79	[NETIF_F_FSO_BIT] =              "tx-fcoe-segmentation",
  80
  81	[NETIF_F_FCOE_CRC_BIT] =         "tx-checksum-fcoe-crc",
  82	[NETIF_F_SCTP_CSUM_BIT] =        "tx-checksum-sctp",
  83	[NETIF_F_FCOE_MTU_BIT] =         "fcoe-mtu",
  84	[NETIF_F_NTUPLE_BIT] =           "rx-ntuple-filter",
  85	[NETIF_F_RXHASH_BIT] =           "rx-hashing",
  86	[NETIF_F_RXCSUM_BIT] =           "rx-checksum",
  87	[NETIF_F_NOCACHE_COPY_BIT] =     "tx-nocache-copy",
  88	[NETIF_F_LOOPBACK_BIT] =         "loopback",
  89	[NETIF_F_RXFCS_BIT] =            "rx-fcs",
  90	[NETIF_F_RXALL_BIT] =            "rx-all",
  91};
  92
  93static int ethtool_get_features(struct net_device *dev, void __user *useraddr)
  94{
  95	struct ethtool_gfeatures cmd = {
  96		.cmd = ETHTOOL_GFEATURES,
  97		.size = ETHTOOL_DEV_FEATURE_WORDS,
  98	};
  99	struct ethtool_get_features_block features[ETHTOOL_DEV_FEATURE_WORDS];
 
 
 
 
 
 
 
 100	u32 __user *sizeaddr;
 101	u32 copy_size;
 102	int i;
 103
 104	/* in case feature bits run out again */
 105	BUILD_BUG_ON(ETHTOOL_DEV_FEATURE_WORDS * sizeof(u32) > sizeof(netdev_features_t));
 106
 107	for (i = 0; i < ETHTOOL_DEV_FEATURE_WORDS; ++i) {
 108		features[i].available = (u32)(dev->hw_features >> (32 * i));
 109		features[i].requested = (u32)(dev->wanted_features >> (32 * i));
 110		features[i].active = (u32)(dev->features >> (32 * i));
 111		features[i].never_changed =
 112			(u32)(NETIF_F_NEVER_CHANGE >> (32 * i));
 113	}
 114
 115	sizeaddr = useraddr + offsetof(struct ethtool_gfeatures, size);
 116	if (get_user(copy_size, sizeaddr))
 117		return -EFAULT;
 118
 119	if (copy_size > ETHTOOL_DEV_FEATURE_WORDS)
 120		copy_size = ETHTOOL_DEV_FEATURE_WORDS;
 121
 122	if (copy_to_user(useraddr, &cmd, sizeof(cmd)))
 123		return -EFAULT;
 124	useraddr += sizeof(cmd);
 125	if (copy_to_user(useraddr, features, copy_size * sizeof(*features)))
 126		return -EFAULT;
 127
 128	return 0;
 129}
 130
 131static int ethtool_set_features(struct net_device *dev, void __user *useraddr)
 132{
 133	struct ethtool_sfeatures cmd;
 134	struct ethtool_set_features_block features[ETHTOOL_DEV_FEATURE_WORDS];
 135	netdev_features_t wanted = 0, valid = 0;
 136	int i, ret = 0;
 137
 138	if (copy_from_user(&cmd, useraddr, sizeof(cmd)))
 139		return -EFAULT;
 140	useraddr += sizeof(cmd);
 141
 142	if (cmd.size != ETHTOOL_DEV_FEATURE_WORDS)
 143		return -EINVAL;
 144
 145	if (copy_from_user(features, useraddr, sizeof(features)))
 146		return -EFAULT;
 147
 148	for (i = 0; i < ETHTOOL_DEV_FEATURE_WORDS; ++i) {
 149		valid |= (netdev_features_t)features[i].valid << (32 * i);
 150		wanted |= (netdev_features_t)features[i].requested << (32 * i);
 151	}
 152
 153	if (valid & ~NETIF_F_ETHTOOL_BITS)
 154		return -EINVAL;
 155
 156	if (valid & ~dev->hw_features) {
 157		valid &= dev->hw_features;
 158		ret |= ETHTOOL_F_UNSUPPORTED;
 159	}
 160
 161	dev->wanted_features &= ~valid;
 162	dev->wanted_features |= wanted & valid;
 163	__netdev_update_features(dev);
 164
 165	if ((dev->wanted_features ^ dev->features) & valid)
 166		ret |= ETHTOOL_F_WISH;
 167
 168	return ret;
 169}
 170
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 171static int __ethtool_get_sset_count(struct net_device *dev, int sset)
 172{
 173	const struct ethtool_ops *ops = dev->ethtool_ops;
 174
 175	if (sset == ETH_SS_FEATURES)
 176		return ARRAY_SIZE(netdev_features_strings);
 177
 178	if (ops && ops->get_sset_count && ops->get_strings)
 179		return ops->get_sset_count(dev, sset);
 180	else
 181		return -EOPNOTSUPP;
 182}
 183
 184static void __ethtool_get_strings(struct net_device *dev,
 185	u32 stringset, u8 *data)
 186{
 187	const struct ethtool_ops *ops = dev->ethtool_ops;
 188
 189	if (stringset == ETH_SS_FEATURES)
 190		memcpy(data, netdev_features_strings,
 191			sizeof(netdev_features_strings));
 192	else
 193		/* ops->get_strings is valid because checked earlier */
 194		ops->get_strings(dev, stringset, data);
 195}
 196
 197static netdev_features_t ethtool_get_feature_mask(u32 eth_cmd)
 198{
 199	/* feature masks of legacy discrete ethtool ops */
 200
 201	switch (eth_cmd) {
 202	case ETHTOOL_GTXCSUM:
 203	case ETHTOOL_STXCSUM:
 204		return NETIF_F_ALL_CSUM | NETIF_F_SCTP_CSUM;
 205	case ETHTOOL_GRXCSUM:
 206	case ETHTOOL_SRXCSUM:
 207		return NETIF_F_RXCSUM;
 208	case ETHTOOL_GSG:
 209	case ETHTOOL_SSG:
 210		return NETIF_F_SG;
 211	case ETHTOOL_GTSO:
 212	case ETHTOOL_STSO:
 213		return NETIF_F_ALL_TSO;
 214	case ETHTOOL_GUFO:
 215	case ETHTOOL_SUFO:
 216		return NETIF_F_UFO;
 217	case ETHTOOL_GGSO:
 218	case ETHTOOL_SGSO:
 219		return NETIF_F_GSO;
 220	case ETHTOOL_GGRO:
 221	case ETHTOOL_SGRO:
 222		return NETIF_F_GRO;
 223	default:
 224		BUG();
 225	}
 226}
 227
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 228static int ethtool_get_one_feature(struct net_device *dev,
 229	char __user *useraddr, u32 ethcmd)
 230{
 231	netdev_features_t mask = ethtool_get_feature_mask(ethcmd);
 232	struct ethtool_value edata = {
 233		.cmd = ethcmd,
 234		.data = !!(dev->features & mask),
 235	};
 236
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 237	if (copy_to_user(useraddr, &edata, sizeof(edata)))
 238		return -EFAULT;
 239	return 0;
 240}
 241
 
 
 
 
 
 
 242static int ethtool_set_one_feature(struct net_device *dev,
 243	void __user *useraddr, u32 ethcmd)
 244{
 245	struct ethtool_value edata;
 246	netdev_features_t mask;
 247
 248	if (copy_from_user(&edata, useraddr, sizeof(edata)))
 249		return -EFAULT;
 250
 251	mask = ethtool_get_feature_mask(ethcmd);
 252	mask &= dev->hw_features;
 253	if (!mask)
 254		return -EOPNOTSUPP;
 
 
 
 255
 256	if (edata.data)
 257		dev->wanted_features |= mask;
 258	else
 259		dev->wanted_features &= ~mask;
 260
 261	__netdev_update_features(dev);
 
 
 
 
 
 
 
 262
 263	return 0;
 264}
 265
 266#define ETH_ALL_FLAGS    (ETH_FLAG_LRO | ETH_FLAG_RXVLAN | ETH_FLAG_TXVLAN | \
 267			  ETH_FLAG_NTUPLE | ETH_FLAG_RXHASH)
 268#define ETH_ALL_FEATURES (NETIF_F_LRO | NETIF_F_HW_VLAN_RX | \
 269			  NETIF_F_HW_VLAN_TX | NETIF_F_NTUPLE | NETIF_F_RXHASH)
 270
 271static u32 __ethtool_get_flags(struct net_device *dev)
 272{
 273	u32 flags = 0;
 274
 275	if (dev->features & NETIF_F_LRO)	flags |= ETH_FLAG_LRO;
 276	if (dev->features & NETIF_F_HW_VLAN_RX)	flags |= ETH_FLAG_RXVLAN;
 277	if (dev->features & NETIF_F_HW_VLAN_TX)	flags |= ETH_FLAG_TXVLAN;
 278	if (dev->features & NETIF_F_NTUPLE)	flags |= ETH_FLAG_NTUPLE;
 279	if (dev->features & NETIF_F_RXHASH)	flags |= ETH_FLAG_RXHASH;
 280
 281	return flags;
 282}
 283
 284static int __ethtool_set_flags(struct net_device *dev, u32 data)
 285{
 286	netdev_features_t features = 0, changed;
 287
 288	if (data & ~ETH_ALL_FLAGS)
 289		return -EINVAL;
 290
 291	if (data & ETH_FLAG_LRO)	features |= NETIF_F_LRO;
 292	if (data & ETH_FLAG_RXVLAN)	features |= NETIF_F_HW_VLAN_RX;
 293	if (data & ETH_FLAG_TXVLAN)	features |= NETIF_F_HW_VLAN_TX;
 294	if (data & ETH_FLAG_NTUPLE)	features |= NETIF_F_NTUPLE;
 295	if (data & ETH_FLAG_RXHASH)	features |= NETIF_F_RXHASH;
 
 
 296
 297	/* allow changing only bits set in hw_features */
 298	changed = (features ^ dev->features) & ETH_ALL_FEATURES;
 299	if (changed & ~dev->hw_features)
 300		return (changed & dev->hw_features) ? -EINVAL : -EOPNOTSUPP;
 301
 302	dev->wanted_features =
 303		(dev->wanted_features & ~changed) | (features & changed);
 304
 305	__netdev_update_features(dev);
 306
 307	return 0;
 308}
 309
 310int __ethtool_get_settings(struct net_device *dev, struct ethtool_cmd *cmd)
 311{
 312	ASSERT_RTNL();
 
 313
 314	if (!dev->ethtool_ops || !dev->ethtool_ops->get_settings)
 315		return -EOPNOTSUPP;
 316
 317	memset(cmd, 0, sizeof(struct ethtool_cmd));
 318	cmd->cmd = ETHTOOL_GSET;
 319	return dev->ethtool_ops->get_settings(dev, cmd);
 320}
 321EXPORT_SYMBOL(__ethtool_get_settings);
 322
 323static int ethtool_get_settings(struct net_device *dev, void __user *useraddr)
 324{
 325	int err;
 326	struct ethtool_cmd cmd;
 327
 328	err = __ethtool_get_settings(dev, &cmd);
 329	if (err < 0)
 330		return err;
 331
 332	if (copy_to_user(useraddr, &cmd, sizeof(cmd)))
 333		return -EFAULT;
 334	return 0;
 335}
 336
 337static int ethtool_set_settings(struct net_device *dev, void __user *useraddr)
 338{
 339	struct ethtool_cmd cmd;
 340
 341	if (!dev->ethtool_ops->set_settings)
 342		return -EOPNOTSUPP;
 343
 344	if (copy_from_user(&cmd, useraddr, sizeof(cmd)))
 345		return -EFAULT;
 346
 347	return dev->ethtool_ops->set_settings(dev, &cmd);
 348}
 349
 350static noinline_for_stack int ethtool_get_drvinfo(struct net_device *dev,
 351						  void __user *useraddr)
 352{
 353	struct ethtool_drvinfo info;
 354	const struct ethtool_ops *ops = dev->ethtool_ops;
 355
 356	memset(&info, 0, sizeof(info));
 357	info.cmd = ETHTOOL_GDRVINFO;
 358	if (ops && ops->get_drvinfo) {
 359		ops->get_drvinfo(dev, &info);
 360	} else if (dev->dev.parent && dev->dev.parent->driver) {
 361		strlcpy(info.bus_info, dev_name(dev->dev.parent),
 362			sizeof(info.bus_info));
 363		strlcpy(info.driver, dev->dev.parent->driver->name,
 364			sizeof(info.driver));
 365	} else {
 366		return -EOPNOTSUPP;
 367	}
 368
 369	/*
 370	 * this method of obtaining string set info is deprecated;
 371	 * Use ETHTOOL_GSSET_INFO instead.
 372	 */
 373	if (ops && ops->get_sset_count) {
 374		int rc;
 375
 376		rc = ops->get_sset_count(dev, ETH_SS_TEST);
 377		if (rc >= 0)
 378			info.testinfo_len = rc;
 379		rc = ops->get_sset_count(dev, ETH_SS_STATS);
 380		if (rc >= 0)
 381			info.n_stats = rc;
 382		rc = ops->get_sset_count(dev, ETH_SS_PRIV_FLAGS);
 383		if (rc >= 0)
 384			info.n_priv_flags = rc;
 385	}
 386	if (ops && ops->get_regs_len)
 387		info.regdump_len = ops->get_regs_len(dev);
 388	if (ops && ops->get_eeprom_len)
 389		info.eedump_len = ops->get_eeprom_len(dev);
 390
 391	if (copy_to_user(useraddr, &info, sizeof(info)))
 392		return -EFAULT;
 393	return 0;
 394}
 395
 396static noinline_for_stack int ethtool_get_sset_info(struct net_device *dev,
 397						    void __user *useraddr)
 398{
 399	struct ethtool_sset_info info;
 400	u64 sset_mask;
 401	int i, idx = 0, n_bits = 0, ret, rc;
 402	u32 *info_buf = NULL;
 403
 404	if (copy_from_user(&info, useraddr, sizeof(info)))
 405		return -EFAULT;
 406
 407	/* store copy of mask, because we zero struct later on */
 408	sset_mask = info.sset_mask;
 409	if (!sset_mask)
 410		return 0;
 411
 412	/* calculate size of return buffer */
 413	n_bits = hweight64(sset_mask);
 414
 415	memset(&info, 0, sizeof(info));
 416	info.cmd = ETHTOOL_GSSET_INFO;
 417
 418	info_buf = kzalloc(n_bits * sizeof(u32), GFP_USER);
 419	if (!info_buf)
 420		return -ENOMEM;
 421
 422	/*
 423	 * fill return buffer based on input bitmask and successful
 424	 * get_sset_count return
 425	 */
 426	for (i = 0; i < 64; i++) {
 427		if (!(sset_mask & (1ULL << i)))
 428			continue;
 429
 430		rc = __ethtool_get_sset_count(dev, i);
 431		if (rc >= 0) {
 432			info.sset_mask |= (1ULL << i);
 433			info_buf[idx++] = rc;
 434		}
 435	}
 436
 437	ret = -EFAULT;
 438	if (copy_to_user(useraddr, &info, sizeof(info)))
 439		goto out;
 440
 441	useraddr += offsetof(struct ethtool_sset_info, data);
 442	if (copy_to_user(useraddr, info_buf, idx * sizeof(u32)))
 443		goto out;
 444
 445	ret = 0;
 446
 447out:
 448	kfree(info_buf);
 449	return ret;
 450}
 451
 452static noinline_for_stack int ethtool_set_rxnfc(struct net_device *dev,
 453						u32 cmd, void __user *useraddr)
 454{
 455	struct ethtool_rxnfc info;
 456	size_t info_size = sizeof(info);
 457	int rc;
 458
 459	if (!dev->ethtool_ops->set_rxnfc)
 460		return -EOPNOTSUPP;
 461
 462	/* struct ethtool_rxnfc was originally defined for
 463	 * ETHTOOL_{G,S}RXFH with only the cmd, flow_type and data
 464	 * members.  User-space might still be using that
 465	 * definition. */
 466	if (cmd == ETHTOOL_SRXFH)
 467		info_size = (offsetof(struct ethtool_rxnfc, data) +
 468			     sizeof(info.data));
 469
 470	if (copy_from_user(&info, useraddr, info_size))
 471		return -EFAULT;
 472
 473	rc = dev->ethtool_ops->set_rxnfc(dev, &info);
 474	if (rc)
 475		return rc;
 476
 477	if (cmd == ETHTOOL_SRXCLSRLINS &&
 478	    copy_to_user(useraddr, &info, info_size))
 479		return -EFAULT;
 480
 481	return 0;
 482}
 483
 484static noinline_for_stack int ethtool_get_rxnfc(struct net_device *dev,
 485						u32 cmd, void __user *useraddr)
 486{
 487	struct ethtool_rxnfc info;
 488	size_t info_size = sizeof(info);
 489	const struct ethtool_ops *ops = dev->ethtool_ops;
 490	int ret;
 491	void *rule_buf = NULL;
 492
 493	if (!ops->get_rxnfc)
 494		return -EOPNOTSUPP;
 495
 496	/* struct ethtool_rxnfc was originally defined for
 497	 * ETHTOOL_{G,S}RXFH with only the cmd, flow_type and data
 498	 * members.  User-space might still be using that
 499	 * definition. */
 500	if (cmd == ETHTOOL_GRXFH)
 501		info_size = (offsetof(struct ethtool_rxnfc, data) +
 502			     sizeof(info.data));
 503
 504	if (copy_from_user(&info, useraddr, info_size))
 505		return -EFAULT;
 506
 507	if (info.cmd == ETHTOOL_GRXCLSRLALL) {
 508		if (info.rule_cnt > 0) {
 509			if (info.rule_cnt <= KMALLOC_MAX_SIZE / sizeof(u32))
 510				rule_buf = kzalloc(info.rule_cnt * sizeof(u32),
 511						   GFP_USER);
 512			if (!rule_buf)
 513				return -ENOMEM;
 514		}
 515	}
 516
 517	ret = ops->get_rxnfc(dev, &info, rule_buf);
 518	if (ret < 0)
 519		goto err_out;
 520
 521	ret = -EFAULT;
 522	if (copy_to_user(useraddr, &info, info_size))
 523		goto err_out;
 524
 525	if (rule_buf) {
 526		useraddr += offsetof(struct ethtool_rxnfc, rule_locs);
 527		if (copy_to_user(useraddr, rule_buf,
 528				 info.rule_cnt * sizeof(u32)))
 529			goto err_out;
 530	}
 531	ret = 0;
 532
 533err_out:
 534	kfree(rule_buf);
 535
 536	return ret;
 537}
 538
 539static noinline_for_stack int ethtool_get_rxfh_indir(struct net_device *dev,
 540						     void __user *useraddr)
 541{
 542	u32 user_size, dev_size;
 543	u32 *indir;
 
 544	int ret;
 545
 546	if (!dev->ethtool_ops->get_rxfh_indir_size ||
 547	    !dev->ethtool_ops->get_rxfh_indir)
 548		return -EOPNOTSUPP;
 549	dev_size = dev->ethtool_ops->get_rxfh_indir_size(dev);
 550	if (dev_size == 0)
 551		return -EOPNOTSUPP;
 552
 553	if (copy_from_user(&user_size,
 554			   useraddr + offsetof(struct ethtool_rxfh_indir, size),
 555			   sizeof(user_size)))
 556		return -EFAULT;
 557
 558	if (copy_to_user(useraddr + offsetof(struct ethtool_rxfh_indir, size),
 559			 &dev_size, sizeof(dev_size)))
 560		return -EFAULT;
 561
 562	/* If the user buffer size is 0, this is just a query for the
 563	 * device table size.  Otherwise, if it's smaller than the
 564	 * device table size it's an error.
 565	 */
 566	if (user_size < dev_size)
 567		return user_size == 0 ? 0 : -EINVAL;
 568
 569	indir = kcalloc(dev_size, sizeof(indir[0]), GFP_USER);
 570	if (!indir)
 571		return -ENOMEM;
 572
 
 
 573	ret = dev->ethtool_ops->get_rxfh_indir(dev, indir);
 574	if (ret)
 575		goto out;
 576
 577	if (copy_to_user(useraddr +
 578			 offsetof(struct ethtool_rxfh_indir, ring_index[0]),
 579			 indir, dev_size * sizeof(indir[0])))
 580		ret = -EFAULT;
 581
 582out:
 583	kfree(indir);
 584	return ret;
 585}
 586
 587static noinline_for_stack int ethtool_set_rxfh_indir(struct net_device *dev,
 588						     void __user *useraddr)
 589{
 590	struct ethtool_rxnfc rx_rings;
 591	u32 user_size, dev_size, i;
 592	u32 *indir;
 593	int ret;
 594
 595	if (!dev->ethtool_ops->get_rxfh_indir_size ||
 596	    !dev->ethtool_ops->set_rxfh_indir ||
 597	    !dev->ethtool_ops->get_rxnfc)
 598		return -EOPNOTSUPP;
 599	dev_size = dev->ethtool_ops->get_rxfh_indir_size(dev);
 600	if (dev_size == 0)
 601		return -EOPNOTSUPP;
 602
 603	if (copy_from_user(&user_size,
 604			   useraddr + offsetof(struct ethtool_rxfh_indir, size),
 605			   sizeof(user_size)))
 606		return -EFAULT;
 607
 608	if (user_size != 0 && user_size != dev_size)
 609		return -EINVAL;
 610
 611	indir = kcalloc(dev_size, sizeof(indir[0]), GFP_USER);
 
 612	if (!indir)
 613		return -ENOMEM;
 614
 615	rx_rings.cmd = ETHTOOL_GRXRINGS;
 616	ret = dev->ethtool_ops->get_rxnfc(dev, &rx_rings, NULL);
 617	if (ret)
 618		goto out;
 619
 620	if (user_size == 0) {
 621		for (i = 0; i < dev_size; i++)
 622			indir[i] = ethtool_rxfh_indir_default(i, rx_rings.data);
 623	} else {
 624		if (copy_from_user(indir,
 625				  useraddr +
 626				  offsetof(struct ethtool_rxfh_indir,
 627					   ring_index[0]),
 628				  dev_size * sizeof(indir[0]))) {
 629			ret = -EFAULT;
 630			goto out;
 631		}
 632
 633		/* Validate ring indices */
 634		for (i = 0; i < dev_size; i++) {
 635			if (indir[i] >= rx_rings.data) {
 636				ret = -EINVAL;
 637				goto out;
 638			}
 639		}
 640	}
 641
 642	ret = dev->ethtool_ops->set_rxfh_indir(dev, indir);
 643
 644out:
 645	kfree(indir);
 646	return ret;
 647}
 648
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 649static int ethtool_get_regs(struct net_device *dev, char __user *useraddr)
 650{
 651	struct ethtool_regs regs;
 652	const struct ethtool_ops *ops = dev->ethtool_ops;
 653	void *regbuf;
 654	int reglen, ret;
 655
 656	if (!ops->get_regs || !ops->get_regs_len)
 657		return -EOPNOTSUPP;
 658
 659	if (copy_from_user(&regs, useraddr, sizeof(regs)))
 660		return -EFAULT;
 661
 662	reglen = ops->get_regs_len(dev);
 663	if (regs.len > reglen)
 664		regs.len = reglen;
 665
 666	regbuf = vzalloc(reglen);
 667	if (reglen && !regbuf)
 668		return -ENOMEM;
 669
 670	ops->get_regs(dev, &regs, regbuf);
 671
 672	ret = -EFAULT;
 673	if (copy_to_user(useraddr, &regs, sizeof(regs)))
 674		goto out;
 675	useraddr += offsetof(struct ethtool_regs, data);
 676	if (regbuf && copy_to_user(useraddr, regbuf, regs.len))
 677		goto out;
 678	ret = 0;
 679
 680 out:
 681	vfree(regbuf);
 682	return ret;
 683}
 684
 685static int ethtool_reset(struct net_device *dev, char __user *useraddr)
 686{
 687	struct ethtool_value reset;
 688	int ret;
 689
 690	if (!dev->ethtool_ops->reset)
 691		return -EOPNOTSUPP;
 692
 693	if (copy_from_user(&reset, useraddr, sizeof(reset)))
 694		return -EFAULT;
 695
 696	ret = dev->ethtool_ops->reset(dev, &reset.data);
 697	if (ret)
 698		return ret;
 699
 700	if (copy_to_user(useraddr, &reset, sizeof(reset)))
 701		return -EFAULT;
 702	return 0;
 703}
 704
 705static int ethtool_get_wol(struct net_device *dev, char __user *useraddr)
 706{
 707	struct ethtool_wolinfo wol = { .cmd = ETHTOOL_GWOL };
 708
 709	if (!dev->ethtool_ops->get_wol)
 710		return -EOPNOTSUPP;
 711
 712	dev->ethtool_ops->get_wol(dev, &wol);
 713
 714	if (copy_to_user(useraddr, &wol, sizeof(wol)))
 715		return -EFAULT;
 716	return 0;
 717}
 718
 719static int ethtool_set_wol(struct net_device *dev, char __user *useraddr)
 720{
 721	struct ethtool_wolinfo wol;
 722
 723	if (!dev->ethtool_ops->set_wol)
 724		return -EOPNOTSUPP;
 725
 726	if (copy_from_user(&wol, useraddr, sizeof(wol)))
 727		return -EFAULT;
 728
 729	return dev->ethtool_ops->set_wol(dev, &wol);
 730}
 731
 732static int ethtool_nway_reset(struct net_device *dev)
 733{
 734	if (!dev->ethtool_ops->nway_reset)
 735		return -EOPNOTSUPP;
 736
 737	return dev->ethtool_ops->nway_reset(dev);
 738}
 739
 740static int ethtool_get_link(struct net_device *dev, char __user *useraddr)
 741{
 742	struct ethtool_value edata = { .cmd = ETHTOOL_GLINK };
 743
 744	if (!dev->ethtool_ops->get_link)
 745		return -EOPNOTSUPP;
 746
 747	edata.data = netif_running(dev) && dev->ethtool_ops->get_link(dev);
 748
 749	if (copy_to_user(useraddr, &edata, sizeof(edata)))
 750		return -EFAULT;
 751	return 0;
 752}
 753
 754static int ethtool_get_any_eeprom(struct net_device *dev, void __user *useraddr,
 755				  int (*getter)(struct net_device *,
 756						struct ethtool_eeprom *, u8 *),
 757				  u32 total_len)
 758{
 759	struct ethtool_eeprom eeprom;
 
 760	void __user *userbuf = useraddr + sizeof(eeprom);
 761	u32 bytes_remaining;
 762	u8 *data;
 763	int ret = 0;
 764
 
 
 
 765	if (copy_from_user(&eeprom, useraddr, sizeof(eeprom)))
 766		return -EFAULT;
 767
 768	/* Check for wrap and zero */
 769	if (eeprom.offset + eeprom.len <= eeprom.offset)
 770		return -EINVAL;
 771
 772	/* Check for exceeding total eeprom len */
 773	if (eeprom.offset + eeprom.len > total_len)
 774		return -EINVAL;
 775
 776	data = kmalloc(PAGE_SIZE, GFP_USER);
 777	if (!data)
 778		return -ENOMEM;
 779
 780	bytes_remaining = eeprom.len;
 781	while (bytes_remaining > 0) {
 782		eeprom.len = min(bytes_remaining, (u32)PAGE_SIZE);
 783
 784		ret = getter(dev, &eeprom, data);
 785		if (ret)
 786			break;
 787		if (copy_to_user(userbuf, data, eeprom.len)) {
 788			ret = -EFAULT;
 789			break;
 790		}
 791		userbuf += eeprom.len;
 792		eeprom.offset += eeprom.len;
 793		bytes_remaining -= eeprom.len;
 794	}
 795
 796	eeprom.len = userbuf - (useraddr + sizeof(eeprom));
 797	eeprom.offset -= eeprom.len;
 798	if (copy_to_user(useraddr, &eeprom, sizeof(eeprom)))
 799		ret = -EFAULT;
 800
 801	kfree(data);
 802	return ret;
 803}
 804
 805static int ethtool_get_eeprom(struct net_device *dev, void __user *useraddr)
 806{
 807	const struct ethtool_ops *ops = dev->ethtool_ops;
 808
 809	if (!ops->get_eeprom || !ops->get_eeprom_len)
 810		return -EOPNOTSUPP;
 811
 812	return ethtool_get_any_eeprom(dev, useraddr, ops->get_eeprom,
 813				      ops->get_eeprom_len(dev));
 814}
 815
 816static int ethtool_set_eeprom(struct net_device *dev, void __user *useraddr)
 817{
 818	struct ethtool_eeprom eeprom;
 819	const struct ethtool_ops *ops = dev->ethtool_ops;
 820	void __user *userbuf = useraddr + sizeof(eeprom);
 821	u32 bytes_remaining;
 822	u8 *data;
 823	int ret = 0;
 824
 825	if (!ops->set_eeprom || !ops->get_eeprom_len)
 826		return -EOPNOTSUPP;
 827
 828	if (copy_from_user(&eeprom, useraddr, sizeof(eeprom)))
 829		return -EFAULT;
 830
 831	/* Check for wrap and zero */
 832	if (eeprom.offset + eeprom.len <= eeprom.offset)
 833		return -EINVAL;
 834
 835	/* Check for exceeding total eeprom len */
 836	if (eeprom.offset + eeprom.len > ops->get_eeprom_len(dev))
 837		return -EINVAL;
 838
 839	data = kmalloc(PAGE_SIZE, GFP_USER);
 840	if (!data)
 841		return -ENOMEM;
 842
 843	bytes_remaining = eeprom.len;
 844	while (bytes_remaining > 0) {
 845		eeprom.len = min(bytes_remaining, (u32)PAGE_SIZE);
 846
 847		if (copy_from_user(data, userbuf, eeprom.len)) {
 848			ret = -EFAULT;
 849			break;
 850		}
 851		ret = ops->set_eeprom(dev, &eeprom, data);
 852		if (ret)
 853			break;
 854		userbuf += eeprom.len;
 855		eeprom.offset += eeprom.len;
 856		bytes_remaining -= eeprom.len;
 857	}
 858
 859	kfree(data);
 860	return ret;
 861}
 862
 863static noinline_for_stack int ethtool_get_coalesce(struct net_device *dev,
 864						   void __user *useraddr)
 865{
 866	struct ethtool_coalesce coalesce = { .cmd = ETHTOOL_GCOALESCE };
 867
 868	if (!dev->ethtool_ops->get_coalesce)
 869		return -EOPNOTSUPP;
 870
 871	dev->ethtool_ops->get_coalesce(dev, &coalesce);
 872
 873	if (copy_to_user(useraddr, &coalesce, sizeof(coalesce)))
 874		return -EFAULT;
 875	return 0;
 876}
 877
 878static noinline_for_stack int ethtool_set_coalesce(struct net_device *dev,
 879						   void __user *useraddr)
 880{
 881	struct ethtool_coalesce coalesce;
 882
 883	if (!dev->ethtool_ops->set_coalesce)
 884		return -EOPNOTSUPP;
 885
 886	if (copy_from_user(&coalesce, useraddr, sizeof(coalesce)))
 887		return -EFAULT;
 888
 889	return dev->ethtool_ops->set_coalesce(dev, &coalesce);
 890}
 891
 892static int ethtool_get_ringparam(struct net_device *dev, void __user *useraddr)
 893{
 894	struct ethtool_ringparam ringparam = { .cmd = ETHTOOL_GRINGPARAM };
 895
 896	if (!dev->ethtool_ops->get_ringparam)
 897		return -EOPNOTSUPP;
 898
 899	dev->ethtool_ops->get_ringparam(dev, &ringparam);
 900
 901	if (copy_to_user(useraddr, &ringparam, sizeof(ringparam)))
 902		return -EFAULT;
 903	return 0;
 904}
 905
 906static int ethtool_set_ringparam(struct net_device *dev, void __user *useraddr)
 907{
 908	struct ethtool_ringparam ringparam;
 909
 910	if (!dev->ethtool_ops->set_ringparam)
 911		return -EOPNOTSUPP;
 912
 913	if (copy_from_user(&ringparam, useraddr, sizeof(ringparam)))
 914		return -EFAULT;
 915
 916	return dev->ethtool_ops->set_ringparam(dev, &ringparam);
 917}
 918
 919static noinline_for_stack int ethtool_get_channels(struct net_device *dev,
 920						   void __user *useraddr)
 921{
 922	struct ethtool_channels channels = { .cmd = ETHTOOL_GCHANNELS };
 923
 924	if (!dev->ethtool_ops->get_channels)
 925		return -EOPNOTSUPP;
 926
 927	dev->ethtool_ops->get_channels(dev, &channels);
 928
 929	if (copy_to_user(useraddr, &channels, sizeof(channels)))
 930		return -EFAULT;
 931	return 0;
 932}
 933
 934static noinline_for_stack int ethtool_set_channels(struct net_device *dev,
 935						   void __user *useraddr)
 936{
 937	struct ethtool_channels channels;
 938
 939	if (!dev->ethtool_ops->set_channels)
 940		return -EOPNOTSUPP;
 941
 942	if (copy_from_user(&channels, useraddr, sizeof(channels)))
 943		return -EFAULT;
 944
 945	return dev->ethtool_ops->set_channels(dev, &channels);
 946}
 947
 948static int ethtool_get_pauseparam(struct net_device *dev, void __user *useraddr)
 949{
 950	struct ethtool_pauseparam pauseparam = { ETHTOOL_GPAUSEPARAM };
 951
 952	if (!dev->ethtool_ops->get_pauseparam)
 953		return -EOPNOTSUPP;
 954
 955	dev->ethtool_ops->get_pauseparam(dev, &pauseparam);
 956
 957	if (copy_to_user(useraddr, &pauseparam, sizeof(pauseparam)))
 958		return -EFAULT;
 959	return 0;
 960}
 961
 962static int ethtool_set_pauseparam(struct net_device *dev, void __user *useraddr)
 963{
 964	struct ethtool_pauseparam pauseparam;
 965
 966	if (!dev->ethtool_ops->set_pauseparam)
 967		return -EOPNOTSUPP;
 968
 969	if (copy_from_user(&pauseparam, useraddr, sizeof(pauseparam)))
 970		return -EFAULT;
 971
 972	return dev->ethtool_ops->set_pauseparam(dev, &pauseparam);
 973}
 974
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 975static int ethtool_self_test(struct net_device *dev, char __user *useraddr)
 976{
 977	struct ethtool_test test;
 978	const struct ethtool_ops *ops = dev->ethtool_ops;
 979	u64 *data;
 980	int ret, test_len;
 981
 982	if (!ops->self_test || !ops->get_sset_count)
 983		return -EOPNOTSUPP;
 984
 985	test_len = ops->get_sset_count(dev, ETH_SS_TEST);
 986	if (test_len < 0)
 987		return test_len;
 988	WARN_ON(test_len == 0);
 989
 990	if (copy_from_user(&test, useraddr, sizeof(test)))
 991		return -EFAULT;
 992
 993	test.len = test_len;
 994	data = kmalloc(test_len * sizeof(u64), GFP_USER);
 995	if (!data)
 996		return -ENOMEM;
 997
 998	ops->self_test(dev, &test, data);
 999
1000	ret = -EFAULT;
1001	if (copy_to_user(useraddr, &test, sizeof(test)))
1002		goto out;
1003	useraddr += sizeof(test);
1004	if (copy_to_user(useraddr, data, test.len * sizeof(u64)))
1005		goto out;
1006	ret = 0;
1007
1008 out:
1009	kfree(data);
1010	return ret;
1011}
1012
1013static int ethtool_get_strings(struct net_device *dev, void __user *useraddr)
1014{
1015	struct ethtool_gstrings gstrings;
1016	u8 *data;
1017	int ret;
1018
1019	if (copy_from_user(&gstrings, useraddr, sizeof(gstrings)))
1020		return -EFAULT;
1021
1022	ret = __ethtool_get_sset_count(dev, gstrings.string_set);
1023	if (ret < 0)
1024		return ret;
1025
1026	gstrings.len = ret;
1027
1028	data = kmalloc(gstrings.len * ETH_GSTRING_LEN, GFP_USER);
1029	if (!data)
1030		return -ENOMEM;
1031
1032	__ethtool_get_strings(dev, gstrings.string_set, data);
1033
1034	ret = -EFAULT;
1035	if (copy_to_user(useraddr, &gstrings, sizeof(gstrings)))
1036		goto out;
1037	useraddr += sizeof(gstrings);
1038	if (copy_to_user(useraddr, data, gstrings.len * ETH_GSTRING_LEN))
1039		goto out;
1040	ret = 0;
1041
1042out:
1043	kfree(data);
1044	return ret;
1045}
1046
1047static int ethtool_phys_id(struct net_device *dev, void __user *useraddr)
1048{
1049	struct ethtool_value id;
1050	static bool busy;
1051	int rc;
1052
1053	if (!dev->ethtool_ops->set_phys_id)
1054		return -EOPNOTSUPP;
1055
1056	if (busy)
1057		return -EBUSY;
1058
1059	if (copy_from_user(&id, useraddr, sizeof(id)))
1060		return -EFAULT;
1061
1062	rc = dev->ethtool_ops->set_phys_id(dev, ETHTOOL_ID_ACTIVE);
1063	if (rc < 0)
1064		return rc;
1065
1066	/* Drop the RTNL lock while waiting, but prevent reentry or
1067	 * removal of the device.
1068	 */
1069	busy = true;
1070	dev_hold(dev);
1071	rtnl_unlock();
1072
1073	if (rc == 0) {
1074		/* Driver will handle this itself */
1075		schedule_timeout_interruptible(
1076			id.data ? (id.data * HZ) : MAX_SCHEDULE_TIMEOUT);
1077	} else {
1078		/* Driver expects to be called at twice the frequency in rc */
1079		int n = rc * 2, i, interval = HZ / n;
1080
1081		/* Count down seconds */
1082		do {
1083			/* Count down iterations per second */
1084			i = n;
1085			do {
1086				rtnl_lock();
1087				rc = dev->ethtool_ops->set_phys_id(dev,
1088				    (i & 1) ? ETHTOOL_ID_OFF : ETHTOOL_ID_ON);
1089				rtnl_unlock();
1090				if (rc)
1091					break;
1092				schedule_timeout_interruptible(interval);
1093			} while (!signal_pending(current) && --i != 0);
1094		} while (!signal_pending(current) &&
1095			 (id.data == 0 || --id.data != 0));
1096	}
1097
1098	rtnl_lock();
1099	dev_put(dev);
1100	busy = false;
1101
1102	(void)dev->ethtool_ops->set_phys_id(dev, ETHTOOL_ID_INACTIVE);
1103	return rc;
1104}
1105
1106static int ethtool_get_stats(struct net_device *dev, void __user *useraddr)
1107{
1108	struct ethtool_stats stats;
1109	const struct ethtool_ops *ops = dev->ethtool_ops;
1110	u64 *data;
1111	int ret, n_stats;
1112
1113	if (!ops->get_ethtool_stats || !ops->get_sset_count)
1114		return -EOPNOTSUPP;
1115
1116	n_stats = ops->get_sset_count(dev, ETH_SS_STATS);
1117	if (n_stats < 0)
1118		return n_stats;
1119	WARN_ON(n_stats == 0);
1120
1121	if (copy_from_user(&stats, useraddr, sizeof(stats)))
1122		return -EFAULT;
1123
1124	stats.n_stats = n_stats;
1125	data = kmalloc(n_stats * sizeof(u64), GFP_USER);
1126	if (!data)
1127		return -ENOMEM;
1128
1129	ops->get_ethtool_stats(dev, &stats, data);
1130
1131	ret = -EFAULT;
1132	if (copy_to_user(useraddr, &stats, sizeof(stats)))
1133		goto out;
1134	useraddr += sizeof(stats);
1135	if (copy_to_user(useraddr, data, stats.n_stats * sizeof(u64)))
1136		goto out;
1137	ret = 0;
1138
1139 out:
1140	kfree(data);
1141	return ret;
1142}
1143
1144static int ethtool_get_perm_addr(struct net_device *dev, void __user *useraddr)
1145{
1146	struct ethtool_perm_addr epaddr;
1147
1148	if (copy_from_user(&epaddr, useraddr, sizeof(epaddr)))
1149		return -EFAULT;
1150
1151	if (epaddr.size < dev->addr_len)
1152		return -ETOOSMALL;
1153	epaddr.size = dev->addr_len;
1154
1155	if (copy_to_user(useraddr, &epaddr, sizeof(epaddr)))
1156		return -EFAULT;
1157	useraddr += sizeof(epaddr);
1158	if (copy_to_user(useraddr, dev->perm_addr, epaddr.size))
1159		return -EFAULT;
1160	return 0;
1161}
1162
1163static int ethtool_get_value(struct net_device *dev, char __user *useraddr,
1164			     u32 cmd, u32 (*actor)(struct net_device *))
1165{
1166	struct ethtool_value edata = { .cmd = cmd };
1167
1168	if (!actor)
1169		return -EOPNOTSUPP;
1170
1171	edata.data = actor(dev);
1172
1173	if (copy_to_user(useraddr, &edata, sizeof(edata)))
1174		return -EFAULT;
1175	return 0;
1176}
1177
1178static int ethtool_set_value_void(struct net_device *dev, char __user *useraddr,
1179			     void (*actor)(struct net_device *, u32))
1180{
1181	struct ethtool_value edata;
1182
1183	if (!actor)
1184		return -EOPNOTSUPP;
1185
1186	if (copy_from_user(&edata, useraddr, sizeof(edata)))
1187		return -EFAULT;
1188
1189	actor(dev, edata.data);
1190	return 0;
1191}
1192
1193static int ethtool_set_value(struct net_device *dev, char __user *useraddr,
1194			     int (*actor)(struct net_device *, u32))
1195{
1196	struct ethtool_value edata;
1197
1198	if (!actor)
1199		return -EOPNOTSUPP;
1200
1201	if (copy_from_user(&edata, useraddr, sizeof(edata)))
1202		return -EFAULT;
1203
1204	return actor(dev, edata.data);
1205}
1206
1207static noinline_for_stack int ethtool_flash_device(struct net_device *dev,
1208						   char __user *useraddr)
1209{
1210	struct ethtool_flash efl;
1211
1212	if (copy_from_user(&efl, useraddr, sizeof(efl)))
1213		return -EFAULT;
1214
1215	if (!dev->ethtool_ops->flash_device)
1216		return -EOPNOTSUPP;
1217
1218	efl.data[ETHTOOL_FLASH_MAX_FILENAME - 1] = 0;
1219
1220	return dev->ethtool_ops->flash_device(dev, &efl);
1221}
1222
1223static int ethtool_set_dump(struct net_device *dev,
1224			void __user *useraddr)
1225{
1226	struct ethtool_dump dump;
1227
1228	if (!dev->ethtool_ops->set_dump)
1229		return -EOPNOTSUPP;
1230
1231	if (copy_from_user(&dump, useraddr, sizeof(dump)))
1232		return -EFAULT;
1233
1234	return dev->ethtool_ops->set_dump(dev, &dump);
1235}
1236
1237static int ethtool_get_dump_flag(struct net_device *dev,
1238				void __user *useraddr)
1239{
1240	int ret;
1241	struct ethtool_dump dump;
1242	const struct ethtool_ops *ops = dev->ethtool_ops;
1243
1244	if (!dev->ethtool_ops->get_dump_flag)
1245		return -EOPNOTSUPP;
1246
1247	if (copy_from_user(&dump, useraddr, sizeof(dump)))
1248		return -EFAULT;
1249
1250	ret = ops->get_dump_flag(dev, &dump);
1251	if (ret)
1252		return ret;
1253
1254	if (copy_to_user(useraddr, &dump, sizeof(dump)))
1255		return -EFAULT;
1256	return 0;
1257}
1258
1259static int ethtool_get_dump_data(struct net_device *dev,
1260				void __user *useraddr)
1261{
1262	int ret;
1263	__u32 len;
1264	struct ethtool_dump dump, tmp;
1265	const struct ethtool_ops *ops = dev->ethtool_ops;
1266	void *data = NULL;
1267
1268	if (!dev->ethtool_ops->get_dump_data ||
1269		!dev->ethtool_ops->get_dump_flag)
1270		return -EOPNOTSUPP;
1271
1272	if (copy_from_user(&dump, useraddr, sizeof(dump)))
1273		return -EFAULT;
1274
1275	memset(&tmp, 0, sizeof(tmp));
1276	tmp.cmd = ETHTOOL_GET_DUMP_FLAG;
1277	ret = ops->get_dump_flag(dev, &tmp);
1278	if (ret)
1279		return ret;
1280
1281	len = (tmp.len > dump.len) ? dump.len : tmp.len;
1282	if (!len)
1283		return -EFAULT;
1284
1285	data = vzalloc(tmp.len);
1286	if (!data)
1287		return -ENOMEM;
1288	ret = ops->get_dump_data(dev, &dump, data);
1289	if (ret)
1290		goto out;
1291
1292	if (copy_to_user(useraddr, &dump, sizeof(dump))) {
1293		ret = -EFAULT;
1294		goto out;
1295	}
1296	useraddr += offsetof(struct ethtool_dump, data);
1297	if (copy_to_user(useraddr, data, len))
1298		ret = -EFAULT;
1299out:
1300	vfree(data);
1301	return ret;
1302}
1303
1304static int ethtool_get_ts_info(struct net_device *dev, void __user *useraddr)
1305{
1306	int err = 0;
1307	struct ethtool_ts_info info;
1308	const struct ethtool_ops *ops = dev->ethtool_ops;
1309	struct phy_device *phydev = dev->phydev;
1310
1311	memset(&info, 0, sizeof(info));
1312	info.cmd = ETHTOOL_GET_TS_INFO;
1313
1314	if (phydev && phydev->drv && phydev->drv->ts_info) {
1315
1316		err = phydev->drv->ts_info(phydev, &info);
1317
1318	} else if (dev->ethtool_ops && dev->ethtool_ops->get_ts_info) {
1319
1320		err = ops->get_ts_info(dev, &info);
1321
1322	} else {
1323		info.so_timestamping =
1324			SOF_TIMESTAMPING_RX_SOFTWARE |
1325			SOF_TIMESTAMPING_SOFTWARE;
1326		info.phc_index = -1;
1327	}
1328
1329	if (err)
1330		return err;
1331
1332	if (copy_to_user(useraddr, &info, sizeof(info)))
1333		err = -EFAULT;
1334
1335	return err;
1336}
1337
1338static int ethtool_get_module_info(struct net_device *dev,
1339				   void __user *useraddr)
1340{
1341	int ret;
1342	struct ethtool_modinfo modinfo;
1343	const struct ethtool_ops *ops = dev->ethtool_ops;
1344
1345	if (!ops->get_module_info)
1346		return -EOPNOTSUPP;
1347
1348	if (copy_from_user(&modinfo, useraddr, sizeof(modinfo)))
1349		return -EFAULT;
1350
1351	ret = ops->get_module_info(dev, &modinfo);
1352	if (ret)
1353		return ret;
1354
1355	if (copy_to_user(useraddr, &modinfo, sizeof(modinfo)))
1356		return -EFAULT;
1357
1358	return 0;
1359}
1360
1361static int ethtool_get_module_eeprom(struct net_device *dev,
1362				     void __user *useraddr)
1363{
1364	int ret;
1365	struct ethtool_modinfo modinfo;
1366	const struct ethtool_ops *ops = dev->ethtool_ops;
1367
1368	if (!ops->get_module_info || !ops->get_module_eeprom)
1369		return -EOPNOTSUPP;
1370
1371	ret = ops->get_module_info(dev, &modinfo);
1372	if (ret)
1373		return ret;
1374
1375	return ethtool_get_any_eeprom(dev, useraddr, ops->get_module_eeprom,
1376				      modinfo.eeprom_len);
1377}
1378
1379/* The main entry point in this file.  Called from net/core/dev.c */
1380
1381int dev_ethtool(struct net *net, struct ifreq *ifr)
1382{
1383	struct net_device *dev = __dev_get_by_name(net, ifr->ifr_name);
1384	void __user *useraddr = ifr->ifr_data;
1385	u32 ethcmd;
1386	int rc;
1387	u32 old_features;
1388
1389	if (!dev || !netif_device_present(dev))
1390		return -ENODEV;
1391
1392	if (copy_from_user(&ethcmd, useraddr, sizeof(ethcmd)))
1393		return -EFAULT;
1394
1395	if (!dev->ethtool_ops) {
1396		/* A few commands do not require any driver support,
1397		 * are unprivileged, and do not change anything, so we
1398		 * can take a shortcut to them. */
1399		if (ethcmd == ETHTOOL_GDRVINFO)
1400			return ethtool_get_drvinfo(dev, useraddr);
1401		else if (ethcmd == ETHTOOL_GET_TS_INFO)
1402			return ethtool_get_ts_info(dev, useraddr);
1403		else
1404			return -EOPNOTSUPP;
1405	}
1406
1407	/* Allow some commands to be done by anyone */
1408	switch (ethcmd) {
1409	case ETHTOOL_GSET:
1410	case ETHTOOL_GDRVINFO:
1411	case ETHTOOL_GMSGLVL:
1412	case ETHTOOL_GCOALESCE:
1413	case ETHTOOL_GRINGPARAM:
1414	case ETHTOOL_GPAUSEPARAM:
1415	case ETHTOOL_GRXCSUM:
1416	case ETHTOOL_GTXCSUM:
1417	case ETHTOOL_GSG:
1418	case ETHTOOL_GSSET_INFO:
1419	case ETHTOOL_GSTRINGS:
1420	case ETHTOOL_GTSO:
1421	case ETHTOOL_GPERMADDR:
1422	case ETHTOOL_GUFO:
1423	case ETHTOOL_GGSO:
1424	case ETHTOOL_GGRO:
1425	case ETHTOOL_GFLAGS:
1426	case ETHTOOL_GPFLAGS:
1427	case ETHTOOL_GRXFH:
1428	case ETHTOOL_GRXRINGS:
1429	case ETHTOOL_GRXCLSRLCNT:
1430	case ETHTOOL_GRXCLSRULE:
1431	case ETHTOOL_GRXCLSRLALL:
1432	case ETHTOOL_GFEATURES:
1433	case ETHTOOL_GET_TS_INFO:
1434		break;
1435	default:
1436		if (!capable(CAP_NET_ADMIN))
1437			return -EPERM;
1438	}
1439
1440	if (dev->ethtool_ops->begin) {
1441		rc = dev->ethtool_ops->begin(dev);
1442		if (rc  < 0)
1443			return rc;
1444	}
1445	old_features = dev->features;
1446
1447	switch (ethcmd) {
1448	case ETHTOOL_GSET:
1449		rc = ethtool_get_settings(dev, useraddr);
1450		break;
1451	case ETHTOOL_SSET:
1452		rc = ethtool_set_settings(dev, useraddr);
1453		break;
1454	case ETHTOOL_GDRVINFO:
1455		rc = ethtool_get_drvinfo(dev, useraddr);
1456		break;
1457	case ETHTOOL_GREGS:
1458		rc = ethtool_get_regs(dev, useraddr);
1459		break;
1460	case ETHTOOL_GWOL:
1461		rc = ethtool_get_wol(dev, useraddr);
1462		break;
1463	case ETHTOOL_SWOL:
1464		rc = ethtool_set_wol(dev, useraddr);
1465		break;
1466	case ETHTOOL_GMSGLVL:
1467		rc = ethtool_get_value(dev, useraddr, ethcmd,
1468				       dev->ethtool_ops->get_msglevel);
1469		break;
1470	case ETHTOOL_SMSGLVL:
1471		rc = ethtool_set_value_void(dev, useraddr,
1472				       dev->ethtool_ops->set_msglevel);
1473		break;
1474	case ETHTOOL_NWAY_RST:
1475		rc = ethtool_nway_reset(dev);
1476		break;
1477	case ETHTOOL_GLINK:
1478		rc = ethtool_get_link(dev, useraddr);
1479		break;
1480	case ETHTOOL_GEEPROM:
1481		rc = ethtool_get_eeprom(dev, useraddr);
1482		break;
1483	case ETHTOOL_SEEPROM:
1484		rc = ethtool_set_eeprom(dev, useraddr);
1485		break;
1486	case ETHTOOL_GCOALESCE:
1487		rc = ethtool_get_coalesce(dev, useraddr);
1488		break;
1489	case ETHTOOL_SCOALESCE:
1490		rc = ethtool_set_coalesce(dev, useraddr);
1491		break;
1492	case ETHTOOL_GRINGPARAM:
1493		rc = ethtool_get_ringparam(dev, useraddr);
1494		break;
1495	case ETHTOOL_SRINGPARAM:
1496		rc = ethtool_set_ringparam(dev, useraddr);
1497		break;
1498	case ETHTOOL_GPAUSEPARAM:
1499		rc = ethtool_get_pauseparam(dev, useraddr);
1500		break;
1501	case ETHTOOL_SPAUSEPARAM:
1502		rc = ethtool_set_pauseparam(dev, useraddr);
1503		break;
1504	case ETHTOOL_TEST:
1505		rc = ethtool_self_test(dev, useraddr);
1506		break;
1507	case ETHTOOL_GSTRINGS:
1508		rc = ethtool_get_strings(dev, useraddr);
1509		break;
1510	case ETHTOOL_PHYS_ID:
1511		rc = ethtool_phys_id(dev, useraddr);
1512		break;
1513	case ETHTOOL_GSTATS:
1514		rc = ethtool_get_stats(dev, useraddr);
1515		break;
1516	case ETHTOOL_GPERMADDR:
1517		rc = ethtool_get_perm_addr(dev, useraddr);
1518		break;
1519	case ETHTOOL_GFLAGS:
1520		rc = ethtool_get_value(dev, useraddr, ethcmd,
1521					__ethtool_get_flags);
 
 
1522		break;
1523	case ETHTOOL_SFLAGS:
1524		rc = ethtool_set_value(dev, useraddr, __ethtool_set_flags);
1525		break;
1526	case ETHTOOL_GPFLAGS:
1527		rc = ethtool_get_value(dev, useraddr, ethcmd,
1528				       dev->ethtool_ops->get_priv_flags);
1529		break;
1530	case ETHTOOL_SPFLAGS:
1531		rc = ethtool_set_value(dev, useraddr,
1532				       dev->ethtool_ops->set_priv_flags);
1533		break;
1534	case ETHTOOL_GRXFH:
1535	case ETHTOOL_GRXRINGS:
1536	case ETHTOOL_GRXCLSRLCNT:
1537	case ETHTOOL_GRXCLSRULE:
1538	case ETHTOOL_GRXCLSRLALL:
1539		rc = ethtool_get_rxnfc(dev, ethcmd, useraddr);
1540		break;
1541	case ETHTOOL_SRXFH:
1542	case ETHTOOL_SRXCLSRLDEL:
1543	case ETHTOOL_SRXCLSRLINS:
1544		rc = ethtool_set_rxnfc(dev, ethcmd, useraddr);
1545		break;
1546	case ETHTOOL_FLASHDEV:
1547		rc = ethtool_flash_device(dev, useraddr);
1548		break;
1549	case ETHTOOL_RESET:
1550		rc = ethtool_reset(dev, useraddr);
1551		break;
 
 
 
1552	case ETHTOOL_GSSET_INFO:
1553		rc = ethtool_get_sset_info(dev, useraddr);
1554		break;
1555	case ETHTOOL_GRXFHINDIR:
1556		rc = ethtool_get_rxfh_indir(dev, useraddr);
1557		break;
1558	case ETHTOOL_SRXFHINDIR:
1559		rc = ethtool_set_rxfh_indir(dev, useraddr);
1560		break;
1561	case ETHTOOL_GFEATURES:
1562		rc = ethtool_get_features(dev, useraddr);
1563		break;
1564	case ETHTOOL_SFEATURES:
1565		rc = ethtool_set_features(dev, useraddr);
1566		break;
1567	case ETHTOOL_GTXCSUM:
1568	case ETHTOOL_GRXCSUM:
1569	case ETHTOOL_GSG:
1570	case ETHTOOL_GTSO:
1571	case ETHTOOL_GUFO:
1572	case ETHTOOL_GGSO:
1573	case ETHTOOL_GGRO:
1574		rc = ethtool_get_one_feature(dev, useraddr, ethcmd);
1575		break;
1576	case ETHTOOL_STXCSUM:
1577	case ETHTOOL_SRXCSUM:
1578	case ETHTOOL_SSG:
1579	case ETHTOOL_STSO:
1580	case ETHTOOL_SUFO:
1581	case ETHTOOL_SGSO:
1582	case ETHTOOL_SGRO:
1583		rc = ethtool_set_one_feature(dev, useraddr, ethcmd);
1584		break;
1585	case ETHTOOL_GCHANNELS:
1586		rc = ethtool_get_channels(dev, useraddr);
1587		break;
1588	case ETHTOOL_SCHANNELS:
1589		rc = ethtool_set_channels(dev, useraddr);
1590		break;
1591	case ETHTOOL_SET_DUMP:
1592		rc = ethtool_set_dump(dev, useraddr);
1593		break;
1594	case ETHTOOL_GET_DUMP_FLAG:
1595		rc = ethtool_get_dump_flag(dev, useraddr);
1596		break;
1597	case ETHTOOL_GET_DUMP_DATA:
1598		rc = ethtool_get_dump_data(dev, useraddr);
1599		break;
1600	case ETHTOOL_GET_TS_INFO:
1601		rc = ethtool_get_ts_info(dev, useraddr);
1602		break;
1603	case ETHTOOL_GMODULEINFO:
1604		rc = ethtool_get_module_info(dev, useraddr);
1605		break;
1606	case ETHTOOL_GMODULEEEPROM:
1607		rc = ethtool_get_module_eeprom(dev, useraddr);
1608		break;
1609	default:
1610		rc = -EOPNOTSUPP;
1611	}
1612
1613	if (dev->ethtool_ops->complete)
1614		dev->ethtool_ops->complete(dev);
1615
1616	if (old_features != dev->features)
1617		netdev_features_change(dev);
1618
1619	return rc;
1620}