Linux Audio

Check our new training course

Loading...
   1/****************************************************************************
   2 * Driver for Solarflare Solarstorm network controllers and boards
   3 * Copyright 2005-2006 Fen Systems Ltd.
   4 * Copyright 2006-2010 Solarflare Communications Inc.
   5 *
   6 * This program is free software; you can redistribute it and/or modify it
   7 * under the terms of the GNU General Public License version 2 as published
   8 * by the Free Software Foundation, incorporated herein by reference.
   9 */
  10
  11#include <linux/netdevice.h>
  12#include <linux/ethtool.h>
  13#include <linux/rtnetlink.h>
  14#include <linux/in.h>
  15#include "net_driver.h"
  16#include "workarounds.h"
  17#include "selftest.h"
  18#include "efx.h"
  19#include "filter.h"
  20#include "nic.h"
  21
  22struct ethtool_string {
  23	char name[ETH_GSTRING_LEN];
  24};
  25
  26struct efx_ethtool_stat {
  27	const char *name;
  28	enum {
  29		EFX_ETHTOOL_STAT_SOURCE_mac_stats,
  30		EFX_ETHTOOL_STAT_SOURCE_nic,
  31		EFX_ETHTOOL_STAT_SOURCE_channel,
  32		EFX_ETHTOOL_STAT_SOURCE_tx_queue
  33	} source;
  34	unsigned offset;
  35	u64(*get_stat) (void *field); /* Reader function */
  36};
  37
  38/* Initialiser for a struct #efx_ethtool_stat with type-checking */
  39#define EFX_ETHTOOL_STAT(stat_name, source_name, field, field_type, \
  40				get_stat_function) {			\
  41	.name = #stat_name,						\
  42	.source = EFX_ETHTOOL_STAT_SOURCE_##source_name,		\
  43	.offset = ((((field_type *) 0) ==				\
  44		      &((struct efx_##source_name *)0)->field) ?	\
  45		    offsetof(struct efx_##source_name, field) :		\
  46		    offsetof(struct efx_##source_name, field)),		\
  47	.get_stat = get_stat_function,					\
  48}
  49
  50static u64 efx_get_uint_stat(void *field)
  51{
  52	return *(unsigned int *)field;
  53}
  54
  55static u64 efx_get_u64_stat(void *field)
  56{
  57	return *(u64 *) field;
  58}
  59
  60static u64 efx_get_atomic_stat(void *field)
  61{
  62	return atomic_read((atomic_t *) field);
  63}
  64
  65#define EFX_ETHTOOL_U64_MAC_STAT(field)				\
  66	EFX_ETHTOOL_STAT(field, mac_stats, field,		\
  67			  u64, efx_get_u64_stat)
  68
  69#define EFX_ETHTOOL_UINT_NIC_STAT(name)				\
  70	EFX_ETHTOOL_STAT(name, nic, n_##name,			\
  71			 unsigned int, efx_get_uint_stat)
  72
  73#define EFX_ETHTOOL_ATOMIC_NIC_ERROR_STAT(field)		\
  74	EFX_ETHTOOL_STAT(field, nic, field,			\
  75			 atomic_t, efx_get_atomic_stat)
  76
  77#define EFX_ETHTOOL_UINT_CHANNEL_STAT(field)			\
  78	EFX_ETHTOOL_STAT(field, channel, n_##field,		\
  79			 unsigned int, efx_get_uint_stat)
  80
  81#define EFX_ETHTOOL_UINT_TXQ_STAT(field)			\
  82	EFX_ETHTOOL_STAT(tx_##field, tx_queue, field,		\
  83			 unsigned int, efx_get_uint_stat)
  84
  85static const struct efx_ethtool_stat efx_ethtool_stats[] = {
  86	EFX_ETHTOOL_U64_MAC_STAT(tx_bytes),
  87	EFX_ETHTOOL_U64_MAC_STAT(tx_good_bytes),
  88	EFX_ETHTOOL_U64_MAC_STAT(tx_bad_bytes),
  89	EFX_ETHTOOL_U64_MAC_STAT(tx_packets),
  90	EFX_ETHTOOL_U64_MAC_STAT(tx_bad),
  91	EFX_ETHTOOL_U64_MAC_STAT(tx_pause),
  92	EFX_ETHTOOL_U64_MAC_STAT(tx_control),
  93	EFX_ETHTOOL_U64_MAC_STAT(tx_unicast),
  94	EFX_ETHTOOL_U64_MAC_STAT(tx_multicast),
  95	EFX_ETHTOOL_U64_MAC_STAT(tx_broadcast),
  96	EFX_ETHTOOL_U64_MAC_STAT(tx_lt64),
  97	EFX_ETHTOOL_U64_MAC_STAT(tx_64),
  98	EFX_ETHTOOL_U64_MAC_STAT(tx_65_to_127),
  99	EFX_ETHTOOL_U64_MAC_STAT(tx_128_to_255),
 100	EFX_ETHTOOL_U64_MAC_STAT(tx_256_to_511),
 101	EFX_ETHTOOL_U64_MAC_STAT(tx_512_to_1023),
 102	EFX_ETHTOOL_U64_MAC_STAT(tx_1024_to_15xx),
 103	EFX_ETHTOOL_U64_MAC_STAT(tx_15xx_to_jumbo),
 104	EFX_ETHTOOL_U64_MAC_STAT(tx_gtjumbo),
 105	EFX_ETHTOOL_U64_MAC_STAT(tx_collision),
 106	EFX_ETHTOOL_U64_MAC_STAT(tx_single_collision),
 107	EFX_ETHTOOL_U64_MAC_STAT(tx_multiple_collision),
 108	EFX_ETHTOOL_U64_MAC_STAT(tx_excessive_collision),
 109	EFX_ETHTOOL_U64_MAC_STAT(tx_deferred),
 110	EFX_ETHTOOL_U64_MAC_STAT(tx_late_collision),
 111	EFX_ETHTOOL_U64_MAC_STAT(tx_excessive_deferred),
 112	EFX_ETHTOOL_U64_MAC_STAT(tx_non_tcpudp),
 113	EFX_ETHTOOL_U64_MAC_STAT(tx_mac_src_error),
 114	EFX_ETHTOOL_U64_MAC_STAT(tx_ip_src_error),
 115	EFX_ETHTOOL_UINT_TXQ_STAT(tso_bursts),
 116	EFX_ETHTOOL_UINT_TXQ_STAT(tso_long_headers),
 117	EFX_ETHTOOL_UINT_TXQ_STAT(tso_packets),
 118	EFX_ETHTOOL_UINT_TXQ_STAT(pushes),
 119	EFX_ETHTOOL_U64_MAC_STAT(rx_bytes),
 120	EFX_ETHTOOL_U64_MAC_STAT(rx_good_bytes),
 121	EFX_ETHTOOL_U64_MAC_STAT(rx_bad_bytes),
 122	EFX_ETHTOOL_U64_MAC_STAT(rx_packets),
 123	EFX_ETHTOOL_U64_MAC_STAT(rx_good),
 124	EFX_ETHTOOL_U64_MAC_STAT(rx_bad),
 125	EFX_ETHTOOL_U64_MAC_STAT(rx_pause),
 126	EFX_ETHTOOL_U64_MAC_STAT(rx_control),
 127	EFX_ETHTOOL_U64_MAC_STAT(rx_unicast),
 128	EFX_ETHTOOL_U64_MAC_STAT(rx_multicast),
 129	EFX_ETHTOOL_U64_MAC_STAT(rx_broadcast),
 130	EFX_ETHTOOL_U64_MAC_STAT(rx_lt64),
 131	EFX_ETHTOOL_U64_MAC_STAT(rx_64),
 132	EFX_ETHTOOL_U64_MAC_STAT(rx_65_to_127),
 133	EFX_ETHTOOL_U64_MAC_STAT(rx_128_to_255),
 134	EFX_ETHTOOL_U64_MAC_STAT(rx_256_to_511),
 135	EFX_ETHTOOL_U64_MAC_STAT(rx_512_to_1023),
 136	EFX_ETHTOOL_U64_MAC_STAT(rx_1024_to_15xx),
 137	EFX_ETHTOOL_U64_MAC_STAT(rx_15xx_to_jumbo),
 138	EFX_ETHTOOL_U64_MAC_STAT(rx_gtjumbo),
 139	EFX_ETHTOOL_U64_MAC_STAT(rx_bad_lt64),
 140	EFX_ETHTOOL_U64_MAC_STAT(rx_bad_64_to_15xx),
 141	EFX_ETHTOOL_U64_MAC_STAT(rx_bad_15xx_to_jumbo),
 142	EFX_ETHTOOL_U64_MAC_STAT(rx_bad_gtjumbo),
 143	EFX_ETHTOOL_U64_MAC_STAT(rx_overflow),
 144	EFX_ETHTOOL_U64_MAC_STAT(rx_missed),
 145	EFX_ETHTOOL_U64_MAC_STAT(rx_false_carrier),
 146	EFX_ETHTOOL_U64_MAC_STAT(rx_symbol_error),
 147	EFX_ETHTOOL_U64_MAC_STAT(rx_align_error),
 148	EFX_ETHTOOL_U64_MAC_STAT(rx_length_error),
 149	EFX_ETHTOOL_U64_MAC_STAT(rx_internal_error),
 150	EFX_ETHTOOL_UINT_NIC_STAT(rx_nodesc_drop_cnt),
 151	EFX_ETHTOOL_ATOMIC_NIC_ERROR_STAT(rx_reset),
 152	EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_tobe_disc),
 153	EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_ip_hdr_chksum_err),
 154	EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_tcp_udp_chksum_err),
 155	EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_mcast_mismatch),
 156	EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_frm_trunc),
 157};
 158
 159/* Number of ethtool statistics */
 160#define EFX_ETHTOOL_NUM_STATS ARRAY_SIZE(efx_ethtool_stats)
 161
 162#define EFX_ETHTOOL_EEPROM_MAGIC 0xEFAB
 163
 164/**************************************************************************
 165 *
 166 * Ethtool operations
 167 *
 168 **************************************************************************
 169 */
 170
 171/* Identify device by flashing LEDs */
 172static int efx_ethtool_phys_id(struct net_device *net_dev,
 173			       enum ethtool_phys_id_state state)
 174{
 175	struct efx_nic *efx = netdev_priv(net_dev);
 176	enum efx_led_mode mode = EFX_LED_DEFAULT;
 177
 178	switch (state) {
 179	case ETHTOOL_ID_ON:
 180		mode = EFX_LED_ON;
 181		break;
 182	case ETHTOOL_ID_OFF:
 183		mode = EFX_LED_OFF;
 184		break;
 185	case ETHTOOL_ID_INACTIVE:
 186		mode = EFX_LED_DEFAULT;
 187		break;
 188	case ETHTOOL_ID_ACTIVE:
 189		return 1;	/* cycle on/off once per second */
 190	}
 191
 192	efx->type->set_id_led(efx, mode);
 193	return 0;
 194}
 195
 196/* This must be called with rtnl_lock held. */
 197static int efx_ethtool_get_settings(struct net_device *net_dev,
 198				    struct ethtool_cmd *ecmd)
 199{
 200	struct efx_nic *efx = netdev_priv(net_dev);
 201	struct efx_link_state *link_state = &efx->link_state;
 202
 203	mutex_lock(&efx->mac_lock);
 204	efx->phy_op->get_settings(efx, ecmd);
 205	mutex_unlock(&efx->mac_lock);
 206
 207	/* GMAC does not support 1000Mbps HD */
 208	ecmd->supported &= ~SUPPORTED_1000baseT_Half;
 209	/* Both MACs support pause frames (bidirectional and respond-only) */
 210	ecmd->supported |= SUPPORTED_Pause | SUPPORTED_Asym_Pause;
 211
 212	if (LOOPBACK_INTERNAL(efx)) {
 213		ethtool_cmd_speed_set(ecmd, link_state->speed);
 214		ecmd->duplex = link_state->fd ? DUPLEX_FULL : DUPLEX_HALF;
 215	}
 216
 217	return 0;
 218}
 219
 220/* This must be called with rtnl_lock held. */
 221static int efx_ethtool_set_settings(struct net_device *net_dev,
 222				    struct ethtool_cmd *ecmd)
 223{
 224	struct efx_nic *efx = netdev_priv(net_dev);
 225	int rc;
 226
 227	/* GMAC does not support 1000Mbps HD */
 228	if ((ethtool_cmd_speed(ecmd) == SPEED_1000) &&
 229	    (ecmd->duplex != DUPLEX_FULL)) {
 230		netif_dbg(efx, drv, efx->net_dev,
 231			  "rejecting unsupported 1000Mbps HD setting\n");
 232		return -EINVAL;
 233	}
 234
 235	mutex_lock(&efx->mac_lock);
 236	rc = efx->phy_op->set_settings(efx, ecmd);
 237	mutex_unlock(&efx->mac_lock);
 238	return rc;
 239}
 240
 241static void efx_ethtool_get_drvinfo(struct net_device *net_dev,
 242				    struct ethtool_drvinfo *info)
 243{
 244	struct efx_nic *efx = netdev_priv(net_dev);
 245
 246	strlcpy(info->driver, KBUILD_MODNAME, sizeof(info->driver));
 247	strlcpy(info->version, EFX_DRIVER_VERSION, sizeof(info->version));
 248	if (efx_nic_rev(efx) >= EFX_REV_SIENA_A0)
 249		efx_mcdi_print_fwver(efx, info->fw_version,
 250				     sizeof(info->fw_version));
 251	strlcpy(info->bus_info, pci_name(efx->pci_dev), sizeof(info->bus_info));
 252}
 253
 254static int efx_ethtool_get_regs_len(struct net_device *net_dev)
 255{
 256	return efx_nic_get_regs_len(netdev_priv(net_dev));
 257}
 258
 259static void efx_ethtool_get_regs(struct net_device *net_dev,
 260				 struct ethtool_regs *regs, void *buf)
 261{
 262	struct efx_nic *efx = netdev_priv(net_dev);
 263
 264	regs->version = efx->type->revision;
 265	efx_nic_get_regs(efx, buf);
 266}
 267
 268static u32 efx_ethtool_get_msglevel(struct net_device *net_dev)
 269{
 270	struct efx_nic *efx = netdev_priv(net_dev);
 271	return efx->msg_enable;
 272}
 273
 274static void efx_ethtool_set_msglevel(struct net_device *net_dev, u32 msg_enable)
 275{
 276	struct efx_nic *efx = netdev_priv(net_dev);
 277	efx->msg_enable = msg_enable;
 278}
 279
 280/**
 281 * efx_fill_test - fill in an individual self-test entry
 282 * @test_index:		Index of the test
 283 * @strings:		Ethtool strings, or %NULL
 284 * @data:		Ethtool test results, or %NULL
 285 * @test:		Pointer to test result (used only if data != %NULL)
 286 * @unit_format:	Unit name format (e.g. "chan\%d")
 287 * @unit_id:		Unit id (e.g. 0 for "chan0")
 288 * @test_format:	Test name format (e.g. "loopback.\%s.tx.sent")
 289 * @test_id:		Test id (e.g. "PHYXS" for "loopback.PHYXS.tx_sent")
 290 *
 291 * Fill in an individual self-test entry.
 292 */
 293static void efx_fill_test(unsigned int test_index,
 294			  struct ethtool_string *strings, u64 *data,
 295			  int *test, const char *unit_format, int unit_id,
 296			  const char *test_format, const char *test_id)
 297{
 298	struct ethtool_string unit_str, test_str;
 299
 300	/* Fill data value, if applicable */
 301	if (data)
 302		data[test_index] = *test;
 303
 304	/* Fill string, if applicable */
 305	if (strings) {
 306		if (strchr(unit_format, '%'))
 307			snprintf(unit_str.name, sizeof(unit_str.name),
 308				 unit_format, unit_id);
 309		else
 310			strcpy(unit_str.name, unit_format);
 311		snprintf(test_str.name, sizeof(test_str.name),
 312			 test_format, test_id);
 313		snprintf(strings[test_index].name,
 314			 sizeof(strings[test_index].name),
 315			 "%-6s %-24s", unit_str.name, test_str.name);
 316	}
 317}
 318
 319#define EFX_CHANNEL_NAME(_channel) "chan%d", _channel->channel
 320#define EFX_TX_QUEUE_NAME(_tx_queue) "txq%d", _tx_queue->queue
 321#define EFX_RX_QUEUE_NAME(_rx_queue) "rxq%d", _rx_queue->queue
 322#define EFX_LOOPBACK_NAME(_mode, _counter)			\
 323	"loopback.%s." _counter, STRING_TABLE_LOOKUP(_mode, efx_loopback_mode)
 324
 325/**
 326 * efx_fill_loopback_test - fill in a block of loopback self-test entries
 327 * @efx:		Efx NIC
 328 * @lb_tests:		Efx loopback self-test results structure
 329 * @mode:		Loopback test mode
 330 * @test_index:		Starting index of the test
 331 * @strings:		Ethtool strings, or %NULL
 332 * @data:		Ethtool test results, or %NULL
 333 */
 334static int efx_fill_loopback_test(struct efx_nic *efx,
 335				  struct efx_loopback_self_tests *lb_tests,
 336				  enum efx_loopback_mode mode,
 337				  unsigned int test_index,
 338				  struct ethtool_string *strings, u64 *data)
 339{
 340	struct efx_channel *channel = efx_get_channel(efx, 0);
 341	struct efx_tx_queue *tx_queue;
 342
 343	efx_for_each_channel_tx_queue(tx_queue, channel) {
 344		efx_fill_test(test_index++, strings, data,
 345			      &lb_tests->tx_sent[tx_queue->queue],
 346			      EFX_TX_QUEUE_NAME(tx_queue),
 347			      EFX_LOOPBACK_NAME(mode, "tx_sent"));
 348		efx_fill_test(test_index++, strings, data,
 349			      &lb_tests->tx_done[tx_queue->queue],
 350			      EFX_TX_QUEUE_NAME(tx_queue),
 351			      EFX_LOOPBACK_NAME(mode, "tx_done"));
 352	}
 353	efx_fill_test(test_index++, strings, data,
 354		      &lb_tests->rx_good,
 355		      "rx", 0,
 356		      EFX_LOOPBACK_NAME(mode, "rx_good"));
 357	efx_fill_test(test_index++, strings, data,
 358		      &lb_tests->rx_bad,
 359		      "rx", 0,
 360		      EFX_LOOPBACK_NAME(mode, "rx_bad"));
 361
 362	return test_index;
 363}
 364
 365/**
 366 * efx_ethtool_fill_self_tests - get self-test details
 367 * @efx:		Efx NIC
 368 * @tests:		Efx self-test results structure, or %NULL
 369 * @strings:		Ethtool strings, or %NULL
 370 * @data:		Ethtool test results, or %NULL
 371 */
 372static int efx_ethtool_fill_self_tests(struct efx_nic *efx,
 373				       struct efx_self_tests *tests,
 374				       struct ethtool_string *strings,
 375				       u64 *data)
 376{
 377	struct efx_channel *channel;
 378	unsigned int n = 0, i;
 379	enum efx_loopback_mode mode;
 380
 381	efx_fill_test(n++, strings, data, &tests->phy_alive,
 382		      "phy", 0, "alive", NULL);
 383	efx_fill_test(n++, strings, data, &tests->nvram,
 384		      "core", 0, "nvram", NULL);
 385	efx_fill_test(n++, strings, data, &tests->interrupt,
 386		      "core", 0, "interrupt", NULL);
 387
 388	/* Event queues */
 389	efx_for_each_channel(channel, efx) {
 390		efx_fill_test(n++, strings, data,
 391			      &tests->eventq_dma[channel->channel],
 392			      EFX_CHANNEL_NAME(channel),
 393			      "eventq.dma", NULL);
 394		efx_fill_test(n++, strings, data,
 395			      &tests->eventq_int[channel->channel],
 396			      EFX_CHANNEL_NAME(channel),
 397			      "eventq.int", NULL);
 398	}
 399
 400	efx_fill_test(n++, strings, data, &tests->registers,
 401		      "core", 0, "registers", NULL);
 402
 403	if (efx->phy_op->run_tests != NULL) {
 404		EFX_BUG_ON_PARANOID(efx->phy_op->test_name == NULL);
 405
 406		for (i = 0; true; ++i) {
 407			const char *name;
 408
 409			EFX_BUG_ON_PARANOID(i >= EFX_MAX_PHY_TESTS);
 410			name = efx->phy_op->test_name(efx, i);
 411			if (name == NULL)
 412				break;
 413
 414			efx_fill_test(n++, strings, data, &tests->phy_ext[i],
 415				      "phy", 0, name, NULL);
 416		}
 417	}
 418
 419	/* Loopback tests */
 420	for (mode = LOOPBACK_NONE; mode <= LOOPBACK_TEST_MAX; mode++) {
 421		if (!(efx->loopback_modes & (1 << mode)))
 422			continue;
 423		n = efx_fill_loopback_test(efx,
 424					   &tests->loopback[mode], mode, n,
 425					   strings, data);
 426	}
 427
 428	return n;
 429}
 430
 431static int efx_ethtool_get_sset_count(struct net_device *net_dev,
 432				      int string_set)
 433{
 434	switch (string_set) {
 435	case ETH_SS_STATS:
 436		return EFX_ETHTOOL_NUM_STATS;
 437	case ETH_SS_TEST:
 438		return efx_ethtool_fill_self_tests(netdev_priv(net_dev),
 439						   NULL, NULL, NULL);
 440	default:
 441		return -EINVAL;
 442	}
 443}
 444
 445static void efx_ethtool_get_strings(struct net_device *net_dev,
 446				    u32 string_set, u8 *strings)
 447{
 448	struct efx_nic *efx = netdev_priv(net_dev);
 449	struct ethtool_string *ethtool_strings =
 450		(struct ethtool_string *)strings;
 451	int i;
 452
 453	switch (string_set) {
 454	case ETH_SS_STATS:
 455		for (i = 0; i < EFX_ETHTOOL_NUM_STATS; i++)
 456			strncpy(ethtool_strings[i].name,
 457				efx_ethtool_stats[i].name,
 458				sizeof(ethtool_strings[i].name));
 459		break;
 460	case ETH_SS_TEST:
 461		efx_ethtool_fill_self_tests(efx, NULL,
 462					    ethtool_strings, NULL);
 463		break;
 464	default:
 465		/* No other string sets */
 466		break;
 467	}
 468}
 469
 470static void efx_ethtool_get_stats(struct net_device *net_dev,
 471				  struct ethtool_stats *stats,
 472				  u64 *data)
 473{
 474	struct efx_nic *efx = netdev_priv(net_dev);
 475	struct efx_mac_stats *mac_stats = &efx->mac_stats;
 476	const struct efx_ethtool_stat *stat;
 477	struct efx_channel *channel;
 478	struct efx_tx_queue *tx_queue;
 479	int i;
 480
 481	EFX_BUG_ON_PARANOID(stats->n_stats != EFX_ETHTOOL_NUM_STATS);
 482
 483	spin_lock_bh(&efx->stats_lock);
 484
 485	/* Update MAC and NIC statistics */
 486	efx->type->update_stats(efx);
 487
 488	/* Fill detailed statistics buffer */
 489	for (i = 0; i < EFX_ETHTOOL_NUM_STATS; i++) {
 490		stat = &efx_ethtool_stats[i];
 491		switch (stat->source) {
 492		case EFX_ETHTOOL_STAT_SOURCE_mac_stats:
 493			data[i] = stat->get_stat((void *)mac_stats +
 494						 stat->offset);
 495			break;
 496		case EFX_ETHTOOL_STAT_SOURCE_nic:
 497			data[i] = stat->get_stat((void *)efx + stat->offset);
 498			break;
 499		case EFX_ETHTOOL_STAT_SOURCE_channel:
 500			data[i] = 0;
 501			efx_for_each_channel(channel, efx)
 502				data[i] += stat->get_stat((void *)channel +
 503							  stat->offset);
 504			break;
 505		case EFX_ETHTOOL_STAT_SOURCE_tx_queue:
 506			data[i] = 0;
 507			efx_for_each_channel(channel, efx) {
 508				efx_for_each_channel_tx_queue(tx_queue, channel)
 509					data[i] +=
 510						stat->get_stat((void *)tx_queue
 511							       + stat->offset);
 512			}
 513			break;
 514		}
 515	}
 516
 517	spin_unlock_bh(&efx->stats_lock);
 518}
 519
 520static void efx_ethtool_self_test(struct net_device *net_dev,
 521				  struct ethtool_test *test, u64 *data)
 522{
 523	struct efx_nic *efx = netdev_priv(net_dev);
 524	struct efx_self_tests *efx_tests;
 525	int already_up;
 526	int rc = -ENOMEM;
 527
 528	efx_tests = kzalloc(sizeof(*efx_tests), GFP_KERNEL);
 529	if (!efx_tests)
 530		goto fail;
 531
 532
 533	ASSERT_RTNL();
 534	if (efx->state != STATE_RUNNING) {
 535		rc = -EIO;
 536		goto fail1;
 537	}
 538
 539	netif_info(efx, drv, efx->net_dev, "starting %sline testing\n",
 540		   (test->flags & ETH_TEST_FL_OFFLINE) ? "off" : "on");
 541
 542	/* We need rx buffers and interrupts. */
 543	already_up = (efx->net_dev->flags & IFF_UP);
 544	if (!already_up) {
 545		rc = dev_open(efx->net_dev);
 546		if (rc) {
 547			netif_err(efx, drv, efx->net_dev,
 548				  "failed opening device.\n");
 549			goto fail1;
 550		}
 551	}
 552
 553	rc = efx_selftest(efx, efx_tests, test->flags);
 554
 555	if (!already_up)
 556		dev_close(efx->net_dev);
 557
 558	netif_info(efx, drv, efx->net_dev, "%s %sline self-tests\n",
 559		   rc == 0 ? "passed" : "failed",
 560		   (test->flags & ETH_TEST_FL_OFFLINE) ? "off" : "on");
 561
 562fail1:
 563	/* Fill ethtool results structures */
 564	efx_ethtool_fill_self_tests(efx, efx_tests, NULL, data);
 565	kfree(efx_tests);
 566fail:
 567	if (rc)
 568		test->flags |= ETH_TEST_FL_FAILED;
 569}
 570
 571/* Restart autonegotiation */
 572static int efx_ethtool_nway_reset(struct net_device *net_dev)
 573{
 574	struct efx_nic *efx = netdev_priv(net_dev);
 575
 576	return mdio45_nway_restart(&efx->mdio);
 577}
 578
 579/*
 580 * Each channel has a single IRQ and moderation timer, started by any
 581 * completion (or other event).  Unless the module parameter
 582 * separate_tx_channels is set, IRQs and moderation are therefore
 583 * shared between RX and TX completions.  In this case, when RX IRQ
 584 * moderation is explicitly changed then TX IRQ moderation is
 585 * automatically changed too, but otherwise we fail if the two values
 586 * are requested to be different.
 587 *
 588 * The hardware does not support a limit on the number of completions
 589 * before an IRQ, so we do not use the max_frames fields.  We should
 590 * report and require that max_frames == (usecs != 0), but this would
 591 * invalidate existing user documentation.
 592 *
 593 * The hardware does not have distinct settings for interrupt
 594 * moderation while the previous IRQ is being handled, so we should
 595 * not use the 'irq' fields.  However, an earlier developer
 596 * misunderstood the meaning of the 'irq' fields and the driver did
 597 * not support the standard fields.  To avoid invalidating existing
 598 * user documentation, we report and accept changes through either the
 599 * standard or 'irq' fields.  If both are changed at the same time, we
 600 * prefer the standard field.
 601 *
 602 * We implement adaptive IRQ moderation, but use a different algorithm
 603 * from that assumed in the definition of struct ethtool_coalesce.
 604 * Therefore we do not use any of the adaptive moderation parameters
 605 * in it.
 606 */
 607
 608static int efx_ethtool_get_coalesce(struct net_device *net_dev,
 609				    struct ethtool_coalesce *coalesce)
 610{
 611	struct efx_nic *efx = netdev_priv(net_dev);
 612	unsigned int tx_usecs, rx_usecs;
 613	bool rx_adaptive;
 614
 615	efx_get_irq_moderation(efx, &tx_usecs, &rx_usecs, &rx_adaptive);
 616
 617	coalesce->tx_coalesce_usecs = tx_usecs;
 618	coalesce->tx_coalesce_usecs_irq = tx_usecs;
 619	coalesce->rx_coalesce_usecs = rx_usecs;
 620	coalesce->rx_coalesce_usecs_irq = rx_usecs;
 621	coalesce->use_adaptive_rx_coalesce = rx_adaptive;
 622
 623	return 0;
 624}
 625
 626static int efx_ethtool_set_coalesce(struct net_device *net_dev,
 627				    struct ethtool_coalesce *coalesce)
 628{
 629	struct efx_nic *efx = netdev_priv(net_dev);
 630	struct efx_channel *channel;
 631	unsigned int tx_usecs, rx_usecs;
 632	bool adaptive, rx_may_override_tx;
 633	int rc;
 634
 635	if (coalesce->use_adaptive_tx_coalesce)
 636		return -EINVAL;
 637
 638	efx_get_irq_moderation(efx, &tx_usecs, &rx_usecs, &adaptive);
 639
 640	if (coalesce->rx_coalesce_usecs != rx_usecs)
 641		rx_usecs = coalesce->rx_coalesce_usecs;
 642	else
 643		rx_usecs = coalesce->rx_coalesce_usecs_irq;
 644
 645	adaptive = coalesce->use_adaptive_rx_coalesce;
 646
 647	/* If channels are shared, TX IRQ moderation can be quietly
 648	 * overridden unless it is changed from its old value.
 649	 */
 650	rx_may_override_tx = (coalesce->tx_coalesce_usecs == tx_usecs &&
 651			      coalesce->tx_coalesce_usecs_irq == tx_usecs);
 652	if (coalesce->tx_coalesce_usecs != tx_usecs)
 653		tx_usecs = coalesce->tx_coalesce_usecs;
 654	else
 655		tx_usecs = coalesce->tx_coalesce_usecs_irq;
 656
 657	rc = efx_init_irq_moderation(efx, tx_usecs, rx_usecs, adaptive,
 658				     rx_may_override_tx);
 659	if (rc != 0)
 660		return rc;
 661
 662	efx_for_each_channel(channel, efx)
 663		efx->type->push_irq_moderation(channel);
 664
 665	return 0;
 666}
 667
 668static void efx_ethtool_get_ringparam(struct net_device *net_dev,
 669				      struct ethtool_ringparam *ring)
 670{
 671	struct efx_nic *efx = netdev_priv(net_dev);
 672
 673	ring->rx_max_pending = EFX_MAX_DMAQ_SIZE;
 674	ring->tx_max_pending = EFX_MAX_DMAQ_SIZE;
 675	ring->rx_pending = efx->rxq_entries;
 676	ring->tx_pending = efx->txq_entries;
 677}
 678
 679static int efx_ethtool_set_ringparam(struct net_device *net_dev,
 680				     struct ethtool_ringparam *ring)
 681{
 682	struct efx_nic *efx = netdev_priv(net_dev);
 683	u32 txq_entries;
 684
 685	if (ring->rx_mini_pending || ring->rx_jumbo_pending ||
 686	    ring->rx_pending > EFX_MAX_DMAQ_SIZE ||
 687	    ring->tx_pending > EFX_MAX_DMAQ_SIZE)
 688		return -EINVAL;
 689
 690	if (ring->rx_pending < EFX_RXQ_MIN_ENT) {
 691		netif_err(efx, drv, efx->net_dev,
 692			  "RX queues cannot be smaller than %u\n",
 693			  EFX_RXQ_MIN_ENT);
 694		return -EINVAL;
 695	}
 696
 697	txq_entries = max(ring->tx_pending, EFX_TXQ_MIN_ENT(efx));
 698	if (txq_entries != ring->tx_pending)
 699		netif_warn(efx, drv, efx->net_dev,
 700			   "increasing TX queue size to minimum of %u\n",
 701			   txq_entries);
 702
 703	return efx_realloc_channels(efx, ring->rx_pending, txq_entries);
 704}
 705
 706static int efx_ethtool_set_pauseparam(struct net_device *net_dev,
 707				      struct ethtool_pauseparam *pause)
 708{
 709	struct efx_nic *efx = netdev_priv(net_dev);
 710	u8 wanted_fc, old_fc;
 711	u32 old_adv;
 712	bool reset;
 713	int rc = 0;
 714
 715	mutex_lock(&efx->mac_lock);
 716
 717	wanted_fc = ((pause->rx_pause ? EFX_FC_RX : 0) |
 718		     (pause->tx_pause ? EFX_FC_TX : 0) |
 719		     (pause->autoneg ? EFX_FC_AUTO : 0));
 720
 721	if ((wanted_fc & EFX_FC_TX) && !(wanted_fc & EFX_FC_RX)) {
 722		netif_dbg(efx, drv, efx->net_dev,
 723			  "Flow control unsupported: tx ON rx OFF\n");
 724		rc = -EINVAL;
 725		goto out;
 726	}
 727
 728	if ((wanted_fc & EFX_FC_AUTO) && !efx->link_advertising) {
 729		netif_dbg(efx, drv, efx->net_dev,
 730			  "Autonegotiation is disabled\n");
 731		rc = -EINVAL;
 732		goto out;
 733	}
 734
 735	/* TX flow control may automatically turn itself off if the
 736	 * link partner (intermittently) stops responding to pause
 737	 * frames. There isn't any indication that this has happened,
 738	 * so the best we do is leave it up to the user to spot this
 739	 * and fix it be cycling transmit flow control on this end. */
 740	reset = (wanted_fc & EFX_FC_TX) && !(efx->wanted_fc & EFX_FC_TX);
 741	if (EFX_WORKAROUND_11482(efx) && reset) {
 742		if (efx_nic_rev(efx) == EFX_REV_FALCON_B0) {
 743			/* Recover by resetting the EM block */
 744			falcon_stop_nic_stats(efx);
 745			falcon_drain_tx_fifo(efx);
 746			falcon_reconfigure_xmac(efx);
 747			falcon_start_nic_stats(efx);
 748		} else {
 749			/* Schedule a reset to recover */
 750			efx_schedule_reset(efx, RESET_TYPE_INVISIBLE);
 751		}
 752	}
 753
 754	old_adv = efx->link_advertising;
 755	old_fc = efx->wanted_fc;
 756	efx_link_set_wanted_fc(efx, wanted_fc);
 757	if (efx->link_advertising != old_adv ||
 758	    (efx->wanted_fc ^ old_fc) & EFX_FC_AUTO) {
 759		rc = efx->phy_op->reconfigure(efx);
 760		if (rc) {
 761			netif_err(efx, drv, efx->net_dev,
 762				  "Unable to advertise requested flow "
 763				  "control setting\n");
 764			goto out;
 765		}
 766	}
 767
 768	/* Reconfigure the MAC. The PHY *may* generate a link state change event
 769	 * if the user just changed the advertised capabilities, but there's no
 770	 * harm doing this twice */
 771	efx->type->reconfigure_mac(efx);
 772
 773out:
 774	mutex_unlock(&efx->mac_lock);
 775
 776	return rc;
 777}
 778
 779static void efx_ethtool_get_pauseparam(struct net_device *net_dev,
 780				       struct ethtool_pauseparam *pause)
 781{
 782	struct efx_nic *efx = netdev_priv(net_dev);
 783
 784	pause->rx_pause = !!(efx->wanted_fc & EFX_FC_RX);
 785	pause->tx_pause = !!(efx->wanted_fc & EFX_FC_TX);
 786	pause->autoneg = !!(efx->wanted_fc & EFX_FC_AUTO);
 787}
 788
 789
 790static void efx_ethtool_get_wol(struct net_device *net_dev,
 791				struct ethtool_wolinfo *wol)
 792{
 793	struct efx_nic *efx = netdev_priv(net_dev);
 794	return efx->type->get_wol(efx, wol);
 795}
 796
 797
 798static int efx_ethtool_set_wol(struct net_device *net_dev,
 799			       struct ethtool_wolinfo *wol)
 800{
 801	struct efx_nic *efx = netdev_priv(net_dev);
 802	return efx->type->set_wol(efx, wol->wolopts);
 803}
 804
 805static int efx_ethtool_reset(struct net_device *net_dev, u32 *flags)
 806{
 807	struct efx_nic *efx = netdev_priv(net_dev);
 808	int rc;
 809
 810	rc = efx->type->map_reset_flags(flags);
 811	if (rc < 0)
 812		return rc;
 813
 814	return efx_reset(efx, rc);
 815}
 816
 817/* MAC address mask including only MC flag */
 818static const u8 mac_addr_mc_mask[ETH_ALEN] = { 0x01, 0, 0, 0, 0, 0 };
 819
 820static int efx_ethtool_get_class_rule(struct efx_nic *efx,
 821				      struct ethtool_rx_flow_spec *rule)
 822{
 823	struct ethtool_tcpip4_spec *ip_entry = &rule->h_u.tcp_ip4_spec;
 824	struct ethtool_tcpip4_spec *ip_mask = &rule->m_u.tcp_ip4_spec;
 825	struct ethhdr *mac_entry = &rule->h_u.ether_spec;
 826	struct ethhdr *mac_mask = &rule->m_u.ether_spec;
 827	struct efx_filter_spec spec;
 828	u16 vid;
 829	u8 proto;
 830	int rc;
 831
 832	rc = efx_filter_get_filter_safe(efx, EFX_FILTER_PRI_MANUAL,
 833					rule->location, &spec);
 834	if (rc)
 835		return rc;
 836
 837	if (spec.dmaq_id == 0xfff)
 838		rule->ring_cookie = RX_CLS_FLOW_DISC;
 839	else
 840		rule->ring_cookie = spec.dmaq_id;
 841
 842	if (spec.type == EFX_FILTER_MC_DEF || spec.type == EFX_FILTER_UC_DEF) {
 843		rule->flow_type = ETHER_FLOW;
 844		memcpy(mac_mask->h_dest, mac_addr_mc_mask, ETH_ALEN);
 845		if (spec.type == EFX_FILTER_MC_DEF)
 846			memcpy(mac_entry->h_dest, mac_addr_mc_mask, ETH_ALEN);
 847		return 0;
 848	}
 849
 850	rc = efx_filter_get_eth_local(&spec, &vid, mac_entry->h_dest);
 851	if (rc == 0) {
 852		rule->flow_type = ETHER_FLOW;
 853		memset(mac_mask->h_dest, ~0, ETH_ALEN);
 854		if (vid != EFX_FILTER_VID_UNSPEC) {
 855			rule->flow_type |= FLOW_EXT;
 856			rule->h_ext.vlan_tci = htons(vid);
 857			rule->m_ext.vlan_tci = htons(0xfff);
 858		}
 859		return 0;
 860	}
 861
 862	rc = efx_filter_get_ipv4_local(&spec, &proto,
 863				       &ip_entry->ip4dst, &ip_entry->pdst);
 864	if (rc != 0) {
 865		rc = efx_filter_get_ipv4_full(
 866			&spec, &proto, &ip_entry->ip4dst, &ip_entry->pdst,
 867			&ip_entry->ip4src, &ip_entry->psrc);
 868		EFX_WARN_ON_PARANOID(rc);
 869		ip_mask->ip4src = ~0;
 870		ip_mask->psrc = ~0;
 871	}
 872	rule->flow_type = (proto == IPPROTO_TCP) ? TCP_V4_FLOW : UDP_V4_FLOW;
 873	ip_mask->ip4dst = ~0;
 874	ip_mask->pdst = ~0;
 875	return rc;
 876}
 877
 878static int
 879efx_ethtool_get_rxnfc(struct net_device *net_dev,
 880		      struct ethtool_rxnfc *info, u32 *rule_locs)
 881{
 882	struct efx_nic *efx = netdev_priv(net_dev);
 883
 884	switch (info->cmd) {
 885	case ETHTOOL_GRXRINGS:
 886		info->data = efx->n_rx_channels;
 887		return 0;
 888
 889	case ETHTOOL_GRXFH: {
 890		unsigned min_revision = 0;
 891
 892		info->data = 0;
 893		switch (info->flow_type) {
 894		case TCP_V4_FLOW:
 895			info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
 896			/* fall through */
 897		case UDP_V4_FLOW:
 898		case SCTP_V4_FLOW:
 899		case AH_ESP_V4_FLOW:
 900		case IPV4_FLOW:
 901			info->data |= RXH_IP_SRC | RXH_IP_DST;
 902			min_revision = EFX_REV_FALCON_B0;
 903			break;
 904		case TCP_V6_FLOW:
 905			info->data |= RXH_L4_B_0_1 | RXH_L4_B_2_3;
 906			/* fall through */
 907		case UDP_V6_FLOW:
 908		case SCTP_V6_FLOW:
 909		case AH_ESP_V6_FLOW:
 910		case IPV6_FLOW:
 911			info->data |= RXH_IP_SRC | RXH_IP_DST;
 912			min_revision = EFX_REV_SIENA_A0;
 913			break;
 914		default:
 915			break;
 916		}
 917		if (efx_nic_rev(efx) < min_revision)
 918			info->data = 0;
 919		return 0;
 920	}
 921
 922	case ETHTOOL_GRXCLSRLCNT:
 923		info->data = efx_filter_get_rx_id_limit(efx);
 924		if (info->data == 0)
 925			return -EOPNOTSUPP;
 926		info->data |= RX_CLS_LOC_SPECIAL;
 927		info->rule_cnt =
 928			efx_filter_count_rx_used(efx, EFX_FILTER_PRI_MANUAL);
 929		return 0;
 930
 931	case ETHTOOL_GRXCLSRULE:
 932		if (efx_filter_get_rx_id_limit(efx) == 0)
 933			return -EOPNOTSUPP;
 934		return efx_ethtool_get_class_rule(efx, &info->fs);
 935
 936	case ETHTOOL_GRXCLSRLALL: {
 937		s32 rc;
 938		info->data = efx_filter_get_rx_id_limit(efx);
 939		if (info->data == 0)
 940			return -EOPNOTSUPP;
 941		rc = efx_filter_get_rx_ids(efx, EFX_FILTER_PRI_MANUAL,
 942					   rule_locs, info->rule_cnt);
 943		if (rc < 0)
 944			return rc;
 945		info->rule_cnt = rc;
 946		return 0;
 947	}
 948
 949	default:
 950		return -EOPNOTSUPP;
 951	}
 952}
 953
 954static int efx_ethtool_set_class_rule(struct efx_nic *efx,
 955				      struct ethtool_rx_flow_spec *rule)
 956{
 957	struct ethtool_tcpip4_spec *ip_entry = &rule->h_u.tcp_ip4_spec;
 958	struct ethtool_tcpip4_spec *ip_mask = &rule->m_u.tcp_ip4_spec;
 959	struct ethhdr *mac_entry = &rule->h_u.ether_spec;
 960	struct ethhdr *mac_mask = &rule->m_u.ether_spec;
 961	struct efx_filter_spec spec;
 962	int rc;
 963
 964	/* Check that user wants us to choose the location */
 965	if (rule->location != RX_CLS_LOC_ANY &&
 966	    rule->location != RX_CLS_LOC_FIRST &&
 967	    rule->location != RX_CLS_LOC_LAST)
 968		return -EINVAL;
 969
 970	/* Range-check ring_cookie */
 971	if (rule->ring_cookie >= efx->n_rx_channels &&
 972	    rule->ring_cookie != RX_CLS_FLOW_DISC)
 973		return -EINVAL;
 974
 975	/* Check for unsupported extensions */
 976	if ((rule->flow_type & FLOW_EXT) &&
 977	    (rule->m_ext.vlan_etype | rule->m_ext.data[0] |
 978	     rule->m_ext.data[1]))
 979		return -EINVAL;
 980
 981	efx_filter_init_rx(&spec, EFX_FILTER_PRI_MANUAL,
 982			   (rule->location == RX_CLS_LOC_FIRST) ?
 983			   EFX_FILTER_FLAG_RX_OVERRIDE_IP : 0,
 984			   (rule->ring_cookie == RX_CLS_FLOW_DISC) ?
 985			   0xfff : rule->ring_cookie);
 986
 987	switch (rule->flow_type) {
 988	case TCP_V4_FLOW:
 989	case UDP_V4_FLOW: {
 990		u8 proto = (rule->flow_type == TCP_V4_FLOW ?
 991			    IPPROTO_TCP : IPPROTO_UDP);
 992
 993		/* Must match all of destination, */
 994		if ((__force u32)~ip_mask->ip4dst |
 995		    (__force u16)~ip_mask->pdst)
 996			return -EINVAL;
 997		/* all or none of source, */
 998		if ((ip_mask->ip4src | ip_mask->psrc) &&
 999		    ((__force u32)~ip_mask->ip4src |
1000		     (__force u16)~ip_mask->psrc))
1001			return -EINVAL;
1002		/* and nothing else */
1003		if (ip_mask->tos | rule->m_ext.vlan_tci)
1004			return -EINVAL;
1005
1006		if (ip_mask->ip4src)
1007			rc = efx_filter_set_ipv4_full(&spec, proto,
1008						      ip_entry->ip4dst,
1009						      ip_entry->pdst,
1010						      ip_entry->ip4src,
1011						      ip_entry->psrc);
1012		else
1013			rc = efx_filter_set_ipv4_local(&spec, proto,
1014						       ip_entry->ip4dst,
1015						       ip_entry->pdst);
1016		if (rc)
1017			return rc;
1018		break;
1019	}
1020
1021	case ETHER_FLOW | FLOW_EXT:
1022	case ETHER_FLOW: {
1023		u16 vlan_tag_mask = (rule->flow_type & FLOW_EXT ?
1024				     ntohs(rule->m_ext.vlan_tci) : 0);
1025
1026		/* Must not match on source address or Ethertype */
1027		if (!is_zero_ether_addr(mac_mask->h_source) ||
1028		    mac_mask->h_proto)
1029			return -EINVAL;
1030
1031		/* Is it a default UC or MC filter? */
1032		if (ether_addr_equal(mac_mask->h_dest, mac_addr_mc_mask) &&
1033		    vlan_tag_mask == 0) {
1034			if (is_multicast_ether_addr(mac_entry->h_dest))
1035				rc = efx_filter_set_mc_def(&spec);
1036			else
1037				rc = efx_filter_set_uc_def(&spec);
1038		}
1039		/* Otherwise, it must match all of destination and all
1040		 * or none of VID.
1041		 */
1042		else if (is_broadcast_ether_addr(mac_mask->h_dest) &&
1043			 (vlan_tag_mask == 0xfff || vlan_tag_mask == 0)) {
1044			rc = efx_filter_set_eth_local(
1045				&spec,
1046				vlan_tag_mask ?
1047				ntohs(rule->h_ext.vlan_tci) : EFX_FILTER_VID_UNSPEC,
1048				mac_entry->h_dest);
1049		} else {
1050			rc = -EINVAL;
1051		}
1052		if (rc)
1053			return rc;
1054		break;
1055	}
1056
1057	default:
1058		return -EINVAL;
1059	}
1060
1061	rc = efx_filter_insert_filter(efx, &spec, true);
1062	if (rc < 0)
1063		return rc;
1064
1065	rule->location = rc;
1066	return 0;
1067}
1068
1069static int efx_ethtool_set_rxnfc(struct net_device *net_dev,
1070				 struct ethtool_rxnfc *info)
1071{
1072	struct efx_nic *efx = netdev_priv(net_dev);
1073
1074	if (efx_filter_get_rx_id_limit(efx) == 0)
1075		return -EOPNOTSUPP;
1076
1077	switch (info->cmd) {
1078	case ETHTOOL_SRXCLSRLINS:
1079		return efx_ethtool_set_class_rule(efx, &info->fs);
1080
1081	case ETHTOOL_SRXCLSRLDEL:
1082		return efx_filter_remove_id_safe(efx, EFX_FILTER_PRI_MANUAL,
1083						 info->fs.location);
1084
1085	default:
1086		return -EOPNOTSUPP;
1087	}
1088}
1089
1090static u32 efx_ethtool_get_rxfh_indir_size(struct net_device *net_dev)
1091{
1092	struct efx_nic *efx = netdev_priv(net_dev);
1093
1094	return ((efx_nic_rev(efx) < EFX_REV_FALCON_B0 ||
1095		 efx->n_rx_channels == 1) ?
1096		0 : ARRAY_SIZE(efx->rx_indir_table));
1097}
1098
1099static int efx_ethtool_get_rxfh_indir(struct net_device *net_dev, u32 *indir)
1100{
1101	struct efx_nic *efx = netdev_priv(net_dev);
1102
1103	memcpy(indir, efx->rx_indir_table, sizeof(efx->rx_indir_table));
1104	return 0;
1105}
1106
1107static int efx_ethtool_set_rxfh_indir(struct net_device *net_dev,
1108				      const u32 *indir)
1109{
1110	struct efx_nic *efx = netdev_priv(net_dev);
1111
1112	memcpy(efx->rx_indir_table, indir, sizeof(efx->rx_indir_table));
1113	efx_nic_push_rx_indir_table(efx);
1114	return 0;
1115}
1116
1117static int efx_ethtool_get_module_eeprom(struct net_device *net_dev,
1118					 struct ethtool_eeprom *ee,
1119					 u8 *data)
1120{
1121	struct efx_nic *efx = netdev_priv(net_dev);
1122	int ret;
1123
1124	if (!efx->phy_op || !efx->phy_op->get_module_eeprom)
1125		return -EOPNOTSUPP;
1126
1127	mutex_lock(&efx->mac_lock);
1128	ret = efx->phy_op->get_module_eeprom(efx, ee, data);
1129	mutex_unlock(&efx->mac_lock);
1130
1131	return ret;
1132}
1133
1134static int efx_ethtool_get_module_info(struct net_device *net_dev,
1135				       struct ethtool_modinfo *modinfo)
1136{
1137	struct efx_nic *efx = netdev_priv(net_dev);
1138	int ret;
1139
1140	if (!efx->phy_op || !efx->phy_op->get_module_info)
1141		return -EOPNOTSUPP;
1142
1143	mutex_lock(&efx->mac_lock);
1144	ret = efx->phy_op->get_module_info(efx, modinfo);
1145	mutex_unlock(&efx->mac_lock);
1146
1147	return ret;
1148}
1149
1150const struct ethtool_ops efx_ethtool_ops = {
1151	.get_settings		= efx_ethtool_get_settings,
1152	.set_settings		= efx_ethtool_set_settings,
1153	.get_drvinfo		= efx_ethtool_get_drvinfo,
1154	.get_regs_len		= efx_ethtool_get_regs_len,
1155	.get_regs		= efx_ethtool_get_regs,
1156	.get_msglevel		= efx_ethtool_get_msglevel,
1157	.set_msglevel		= efx_ethtool_set_msglevel,
1158	.nway_reset		= efx_ethtool_nway_reset,
1159	.get_link		= ethtool_op_get_link,
1160	.get_coalesce		= efx_ethtool_get_coalesce,
1161	.set_coalesce		= efx_ethtool_set_coalesce,
1162	.get_ringparam		= efx_ethtool_get_ringparam,
1163	.set_ringparam		= efx_ethtool_set_ringparam,
1164	.get_pauseparam         = efx_ethtool_get_pauseparam,
1165	.set_pauseparam         = efx_ethtool_set_pauseparam,
1166	.get_sset_count		= efx_ethtool_get_sset_count,
1167	.self_test		= efx_ethtool_self_test,
1168	.get_strings		= efx_ethtool_get_strings,
1169	.set_phys_id		= efx_ethtool_phys_id,
1170	.get_ethtool_stats	= efx_ethtool_get_stats,
1171	.get_wol                = efx_ethtool_get_wol,
1172	.set_wol                = efx_ethtool_set_wol,
1173	.reset			= efx_ethtool_reset,
1174	.get_rxnfc		= efx_ethtool_get_rxnfc,
1175	.set_rxnfc		= efx_ethtool_set_rxnfc,
1176	.get_rxfh_indir_size	= efx_ethtool_get_rxfh_indir_size,
1177	.get_rxfh_indir		= efx_ethtool_get_rxfh_indir,
1178	.set_rxfh_indir		= efx_ethtool_set_rxfh_indir,
1179	.get_module_info	= efx_ethtool_get_module_info,
1180	.get_module_eeprom	= efx_ethtool_get_module_eeprom,
1181};