Linux Audio

Check our new training course

Loading...
   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}