• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /****************************************************************************
2  * Driver for Solarflare Solarstorm network controllers and boards
3  * Copyright 2005-2006 Fen Systems Ltd.
4  * Copyright 2006-2008 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 "net_driver.h"
15 #include "workarounds.h"
16 #include "selftest.h"
17 #include "efx.h"
18 #include "ethtool.h"
19 #include "falcon.h"
20 #include "spi.h"
21 #include "mdio_10g.h"
22 
23 const char *efx_loopback_mode_names[] = {
24 	[LOOPBACK_NONE]		= "NONE",
25 	[LOOPBACK_GMAC]		= "GMAC",
26 	[LOOPBACK_XGMII]	= "XGMII",
27 	[LOOPBACK_XGXS]		= "XGXS",
28 	[LOOPBACK_XAUI] 	= "XAUI",
29 	[LOOPBACK_GPHY]		= "GPHY",
30 	[LOOPBACK_PHYXS]	= "PHYXS",
31 	[LOOPBACK_PCS]	 	= "PCS",
32 	[LOOPBACK_PMAPMD]	= "PMA/PMD",
33 	[LOOPBACK_NETWORK]	= "NETWORK",
34 };
35 
36 struct ethtool_string {
37 	char name[ETH_GSTRING_LEN];
38 };
39 
40 struct efx_ethtool_stat {
41 	const char *name;
42 	enum {
43 		EFX_ETHTOOL_STAT_SOURCE_mac_stats,
44 		EFX_ETHTOOL_STAT_SOURCE_nic,
45 		EFX_ETHTOOL_STAT_SOURCE_channel
46 	} source;
47 	unsigned offset;
48 	u64(*get_stat) (void *field); /* Reader function */
49 };
50 
51 /* Initialiser for a struct #efx_ethtool_stat with type-checking */
52 #define EFX_ETHTOOL_STAT(stat_name, source_name, field, field_type, \
53 				get_stat_function) {			\
54 	.name = #stat_name,						\
55 	.source = EFX_ETHTOOL_STAT_SOURCE_##source_name,		\
56 	.offset = ((((field_type *) 0) ==				\
57 		      &((struct efx_##source_name *)0)->field) ?	\
58 		    offsetof(struct efx_##source_name, field) :		\
59 		    offsetof(struct efx_##source_name, field)),		\
60 	.get_stat = get_stat_function,					\
61 }
62 
efx_get_uint_stat(void * field)63 static u64 efx_get_uint_stat(void *field)
64 {
65 	return *(unsigned int *)field;
66 }
67 
efx_get_ulong_stat(void * field)68 static u64 efx_get_ulong_stat(void *field)
69 {
70 	return *(unsigned long *)field;
71 }
72 
efx_get_u64_stat(void * field)73 static u64 efx_get_u64_stat(void *field)
74 {
75 	return *(u64 *) field;
76 }
77 
efx_get_atomic_stat(void * field)78 static u64 efx_get_atomic_stat(void *field)
79 {
80 	return atomic_read((atomic_t *) field);
81 }
82 
83 #define EFX_ETHTOOL_ULONG_MAC_STAT(field)			\
84 	EFX_ETHTOOL_STAT(field, mac_stats, field, 		\
85 			  unsigned long, efx_get_ulong_stat)
86 
87 #define EFX_ETHTOOL_U64_MAC_STAT(field)				\
88 	EFX_ETHTOOL_STAT(field, mac_stats, field, 		\
89 			  u64, efx_get_u64_stat)
90 
91 #define EFX_ETHTOOL_UINT_NIC_STAT(name)				\
92 	EFX_ETHTOOL_STAT(name, nic, n_##name,			\
93 			 unsigned int, efx_get_uint_stat)
94 
95 #define EFX_ETHTOOL_ATOMIC_NIC_ERROR_STAT(field)		\
96 	EFX_ETHTOOL_STAT(field, nic, field,			\
97 			 atomic_t, efx_get_atomic_stat)
98 
99 #define EFX_ETHTOOL_UINT_CHANNEL_STAT(field)			\
100 	EFX_ETHTOOL_STAT(field, channel, n_##field,		\
101 			 unsigned int, efx_get_uint_stat)
102 
103 static struct efx_ethtool_stat efx_ethtool_stats[] = {
104 	EFX_ETHTOOL_U64_MAC_STAT(tx_bytes),
105 	EFX_ETHTOOL_U64_MAC_STAT(tx_good_bytes),
106 	EFX_ETHTOOL_U64_MAC_STAT(tx_bad_bytes),
107 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_packets),
108 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_bad),
109 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_pause),
110 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_control),
111 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_unicast),
112 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_multicast),
113 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_broadcast),
114 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_lt64),
115 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_64),
116 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_65_to_127),
117 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_128_to_255),
118 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_256_to_511),
119 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_512_to_1023),
120 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_1024_to_15xx),
121 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_15xx_to_jumbo),
122 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_gtjumbo),
123 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_collision),
124 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_single_collision),
125 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_multiple_collision),
126 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_excessive_collision),
127 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_deferred),
128 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_late_collision),
129 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_excessive_deferred),
130 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_non_tcpudp),
131 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_mac_src_error),
132 	EFX_ETHTOOL_ULONG_MAC_STAT(tx_ip_src_error),
133 	EFX_ETHTOOL_U64_MAC_STAT(rx_bytes),
134 	EFX_ETHTOOL_U64_MAC_STAT(rx_good_bytes),
135 	EFX_ETHTOOL_U64_MAC_STAT(rx_bad_bytes),
136 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_packets),
137 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_good),
138 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_bad),
139 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_pause),
140 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_control),
141 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_unicast),
142 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_multicast),
143 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_broadcast),
144 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_lt64),
145 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_64),
146 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_65_to_127),
147 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_128_to_255),
148 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_256_to_511),
149 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_512_to_1023),
150 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_1024_to_15xx),
151 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_15xx_to_jumbo),
152 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_gtjumbo),
153 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_bad_lt64),
154 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_bad_64_to_15xx),
155 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_bad_15xx_to_jumbo),
156 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_bad_gtjumbo),
157 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_overflow),
158 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_missed),
159 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_false_carrier),
160 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_symbol_error),
161 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_align_error),
162 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_length_error),
163 	EFX_ETHTOOL_ULONG_MAC_STAT(rx_internal_error),
164 	EFX_ETHTOOL_UINT_NIC_STAT(rx_nodesc_drop_cnt),
165 	EFX_ETHTOOL_ATOMIC_NIC_ERROR_STAT(rx_reset),
166 	EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_tobe_disc),
167 	EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_ip_hdr_chksum_err),
168 	EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_tcp_udp_chksum_err),
169 	EFX_ETHTOOL_UINT_CHANNEL_STAT(rx_frm_trunc),
170 };
171 
172 /* Number of ethtool statistics */
173 #define EFX_ETHTOOL_NUM_STATS ARRAY_SIZE(efx_ethtool_stats)
174 
175 #define EFX_ETHTOOL_EEPROM_MAGIC 0xEFAB
176 
177 /**************************************************************************
178  *
179  * Ethtool operations
180  *
181  **************************************************************************
182  */
183 
184 /* Identify device by flashing LEDs */
efx_ethtool_phys_id(struct net_device * net_dev,u32 count)185 static int efx_ethtool_phys_id(struct net_device *net_dev, u32 count)
186 {
187 	struct efx_nic *efx = netdev_priv(net_dev);
188 
189 	efx->board_info.blink(efx, 1);
190 	set_current_state(TASK_INTERRUPTIBLE);
191 	if (count)
192 		schedule_timeout(count * HZ);
193 	else
194 		schedule();
195 	efx->board_info.blink(efx, 0);
196 	return 0;
197 }
198 
199 /* This must be called with rtnl_lock held. */
efx_ethtool_get_settings(struct net_device * net_dev,struct ethtool_cmd * ecmd)200 int efx_ethtool_get_settings(struct net_device *net_dev,
201 			     struct ethtool_cmd *ecmd)
202 {
203 	struct efx_nic *efx = netdev_priv(net_dev);
204 
205 	mutex_lock(&efx->mac_lock);
206 	efx->phy_op->get_settings(efx, ecmd);
207 	mutex_unlock(&efx->mac_lock);
208 
209 	/* Falcon GMAC does not support 1000Mbps HD */
210 	ecmd->supported &= ~SUPPORTED_1000baseT_Half;
211 
212 	return 0;
213 }
214 
215 /* This must be called with rtnl_lock held. */
efx_ethtool_set_settings(struct net_device * net_dev,struct ethtool_cmd * ecmd)216 int efx_ethtool_set_settings(struct net_device *net_dev,
217 			     struct ethtool_cmd *ecmd)
218 {
219 	struct efx_nic *efx = netdev_priv(net_dev);
220 	int rc;
221 
222 	/* Falcon GMAC does not support 1000Mbps HD */
223 	if (ecmd->speed == SPEED_1000 && ecmd->duplex != DUPLEX_FULL) {
224 		EFX_LOG(efx, "rejecting unsupported 1000Mbps HD"
225 			" setting\n");
226 		return -EINVAL;
227 	}
228 
229 	mutex_lock(&efx->mac_lock);
230 	rc = efx->phy_op->set_settings(efx, ecmd);
231 	mutex_unlock(&efx->mac_lock);
232 	if (!rc)
233 		efx_reconfigure_port(efx);
234 
235 	return rc;
236 }
237 
efx_ethtool_get_drvinfo(struct net_device * net_dev,struct ethtool_drvinfo * info)238 static void efx_ethtool_get_drvinfo(struct net_device *net_dev,
239 				    struct ethtool_drvinfo *info)
240 {
241 	struct efx_nic *efx = netdev_priv(net_dev);
242 
243 	strlcpy(info->driver, EFX_DRIVER_NAME, sizeof(info->driver));
244 	strlcpy(info->version, EFX_DRIVER_VERSION, sizeof(info->version));
245 	strlcpy(info->bus_info, pci_name(efx->pci_dev), sizeof(info->bus_info));
246 }
247 
248 /**
249  * efx_fill_test - fill in an individual self-test entry
250  * @test_index:		Index of the test
251  * @strings:		Ethtool strings, or %NULL
252  * @data:		Ethtool test results, or %NULL
253  * @test:		Pointer to test result (used only if data != %NULL)
254  * @unit_format:	Unit name format (e.g. "chan\%d")
255  * @unit_id:		Unit id (e.g. 0 for "chan0")
256  * @test_format:	Test name format (e.g. "loopback.\%s.tx.sent")
257  * @test_id:		Test id (e.g. "PHYXS" for "loopback.PHYXS.tx_sent")
258  *
259  * Fill in an individual self-test entry.
260  */
efx_fill_test(unsigned int test_index,struct ethtool_string * strings,u64 * data,int * test,const char * unit_format,int unit_id,const char * test_format,const char * test_id)261 static void efx_fill_test(unsigned int test_index,
262 			  struct ethtool_string *strings, u64 *data,
263 			  int *test, const char *unit_format, int unit_id,
264 			  const char *test_format, const char *test_id)
265 {
266 	struct ethtool_string unit_str, test_str;
267 
268 	/* Fill data value, if applicable */
269 	if (data)
270 		data[test_index] = *test;
271 
272 	/* Fill string, if applicable */
273 	if (strings) {
274 		if (strchr(unit_format, '%'))
275 			snprintf(unit_str.name, sizeof(unit_str.name),
276 				 unit_format, unit_id);
277 		else
278 			strcpy(unit_str.name, unit_format);
279 		snprintf(test_str.name, sizeof(test_str.name),
280 			 test_format, test_id);
281 		snprintf(strings[test_index].name,
282 			 sizeof(strings[test_index].name),
283 			 "%-6s %-24s", unit_str.name, test_str.name);
284 	}
285 }
286 
287 #define EFX_CHANNEL_NAME(_channel) "chan%d", _channel->channel
288 #define EFX_TX_QUEUE_NAME(_tx_queue) "txq%d", _tx_queue->queue
289 #define EFX_RX_QUEUE_NAME(_rx_queue) "rxq%d", _rx_queue->queue
290 #define EFX_LOOPBACK_NAME(_mode, _counter)			\
291 	"loopback.%s." _counter, LOOPBACK_MODE_NAME(mode)
292 
293 /**
294  * efx_fill_loopback_test - fill in a block of loopback self-test entries
295  * @efx:		Efx NIC
296  * @lb_tests:		Efx loopback self-test results structure
297  * @mode:		Loopback test mode
298  * @test_index:		Starting index of the test
299  * @strings:		Ethtool strings, or %NULL
300  * @data:		Ethtool test results, or %NULL
301  */
efx_fill_loopback_test(struct efx_nic * efx,struct efx_loopback_self_tests * lb_tests,enum efx_loopback_mode mode,unsigned int test_index,struct ethtool_string * strings,u64 * data)302 static int efx_fill_loopback_test(struct efx_nic *efx,
303 				  struct efx_loopback_self_tests *lb_tests,
304 				  enum efx_loopback_mode mode,
305 				  unsigned int test_index,
306 				  struct ethtool_string *strings, u64 *data)
307 {
308 	struct efx_tx_queue *tx_queue;
309 
310 	efx_for_each_tx_queue(tx_queue, efx) {
311 		efx_fill_test(test_index++, strings, data,
312 			      &lb_tests->tx_sent[tx_queue->queue],
313 			      EFX_TX_QUEUE_NAME(tx_queue),
314 			      EFX_LOOPBACK_NAME(mode, "tx_sent"));
315 		efx_fill_test(test_index++, strings, data,
316 			      &lb_tests->tx_done[tx_queue->queue],
317 			      EFX_TX_QUEUE_NAME(tx_queue),
318 			      EFX_LOOPBACK_NAME(mode, "tx_done"));
319 	}
320 	efx_fill_test(test_index++, strings, data,
321 		      &lb_tests->rx_good,
322 		      "rx", 0,
323 		      EFX_LOOPBACK_NAME(mode, "rx_good"));
324 	efx_fill_test(test_index++, strings, data,
325 		      &lb_tests->rx_bad,
326 		      "rx", 0,
327 		      EFX_LOOPBACK_NAME(mode, "rx_bad"));
328 
329 	return test_index;
330 }
331 
332 /**
333  * efx_ethtool_fill_self_tests - get self-test details
334  * @efx:		Efx NIC
335  * @tests:		Efx self-test results structure, or %NULL
336  * @strings:		Ethtool strings, or %NULL
337  * @data:		Ethtool test results, or %NULL
338  */
efx_ethtool_fill_self_tests(struct efx_nic * efx,struct efx_self_tests * tests,struct ethtool_string * strings,u64 * data)339 static int efx_ethtool_fill_self_tests(struct efx_nic *efx,
340 				       struct efx_self_tests *tests,
341 				       struct ethtool_string *strings,
342 				       u64 *data)
343 {
344 	struct efx_channel *channel;
345 	unsigned int n = 0, i;
346 	enum efx_loopback_mode mode;
347 
348 	efx_fill_test(n++, strings, data, &tests->mii,
349 		      "core", 0, "mii", NULL);
350 	efx_fill_test(n++, strings, data, &tests->nvram,
351 		      "core", 0, "nvram", NULL);
352 	efx_fill_test(n++, strings, data, &tests->interrupt,
353 		      "core", 0, "interrupt", NULL);
354 
355 	/* Event queues */
356 	efx_for_each_channel(channel, efx) {
357 		efx_fill_test(n++, strings, data,
358 			      &tests->eventq_dma[channel->channel],
359 			      EFX_CHANNEL_NAME(channel),
360 			      "eventq.dma", NULL);
361 		efx_fill_test(n++, strings, data,
362 			      &tests->eventq_int[channel->channel],
363 			      EFX_CHANNEL_NAME(channel),
364 			      "eventq.int", NULL);
365 		efx_fill_test(n++, strings, data,
366 			      &tests->eventq_poll[channel->channel],
367 			      EFX_CHANNEL_NAME(channel),
368 			      "eventq.poll", NULL);
369 	}
370 
371 	efx_fill_test(n++, strings, data, &tests->registers,
372 		      "core", 0, "registers", NULL);
373 
374 	for (i = 0; i < efx->phy_op->num_tests; i++)
375 		efx_fill_test(n++, strings, data, &tests->phy[i],
376 			      "phy", 0, efx->phy_op->test_names[i], NULL);
377 
378 	/* Loopback tests */
379 	for (mode = LOOPBACK_NONE; mode <= LOOPBACK_TEST_MAX; mode++) {
380 		if (!(efx->loopback_modes & (1 << mode)))
381 			continue;
382 		n = efx_fill_loopback_test(efx,
383 					   &tests->loopback[mode], mode, n,
384 					   strings, data);
385 	}
386 
387 	return n;
388 }
389 
efx_ethtool_get_sset_count(struct net_device * net_dev,int string_set)390 static int efx_ethtool_get_sset_count(struct net_device *net_dev,
391 				      int string_set)
392 {
393 	switch (string_set) {
394 	case ETH_SS_STATS:
395 		return EFX_ETHTOOL_NUM_STATS;
396 	case ETH_SS_TEST:
397 		return efx_ethtool_fill_self_tests(netdev_priv(net_dev),
398 						   NULL, NULL, NULL);
399 	default:
400 		return -EINVAL;
401 	}
402 }
403 
efx_ethtool_get_strings(struct net_device * net_dev,u32 string_set,u8 * strings)404 static void efx_ethtool_get_strings(struct net_device *net_dev,
405 				    u32 string_set, u8 *strings)
406 {
407 	struct efx_nic *efx = netdev_priv(net_dev);
408 	struct ethtool_string *ethtool_strings =
409 		(struct ethtool_string *)strings;
410 	int i;
411 
412 	switch (string_set) {
413 	case ETH_SS_STATS:
414 		for (i = 0; i < EFX_ETHTOOL_NUM_STATS; i++)
415 			strncpy(ethtool_strings[i].name,
416 				efx_ethtool_stats[i].name,
417 				sizeof(ethtool_strings[i].name));
418 		break;
419 	case ETH_SS_TEST:
420 		efx_ethtool_fill_self_tests(efx, NULL,
421 					    ethtool_strings, NULL);
422 		break;
423 	default:
424 		/* No other string sets */
425 		break;
426 	}
427 }
428 
efx_ethtool_get_stats(struct net_device * net_dev,struct ethtool_stats * stats,u64 * data)429 static void efx_ethtool_get_stats(struct net_device *net_dev,
430 				  struct ethtool_stats *stats,
431 				  u64 *data)
432 {
433 	struct efx_nic *efx = netdev_priv(net_dev);
434 	struct efx_mac_stats *mac_stats = &efx->mac_stats;
435 	struct efx_ethtool_stat *stat;
436 	struct efx_channel *channel;
437 	int i;
438 
439 	EFX_BUG_ON_PARANOID(stats->n_stats != EFX_ETHTOOL_NUM_STATS);
440 
441 	/* Update MAC and NIC statistics */
442 	dev_get_stats(net_dev);
443 
444 	/* Fill detailed statistics buffer */
445 	for (i = 0; i < EFX_ETHTOOL_NUM_STATS; i++) {
446 		stat = &efx_ethtool_stats[i];
447 		switch (stat->source) {
448 		case EFX_ETHTOOL_STAT_SOURCE_mac_stats:
449 			data[i] = stat->get_stat((void *)mac_stats +
450 						 stat->offset);
451 			break;
452 		case EFX_ETHTOOL_STAT_SOURCE_nic:
453 			data[i] = stat->get_stat((void *)efx + stat->offset);
454 			break;
455 		case EFX_ETHTOOL_STAT_SOURCE_channel:
456 			data[i] = 0;
457 			efx_for_each_channel(channel, efx)
458 				data[i] += stat->get_stat((void *)channel +
459 							  stat->offset);
460 			break;
461 		}
462 	}
463 }
464 
efx_ethtool_set_rx_csum(struct net_device * net_dev,u32 enable)465 static int efx_ethtool_set_rx_csum(struct net_device *net_dev, u32 enable)
466 {
467 	struct efx_nic *efx = netdev_priv(net_dev);
468 
469 	/* No way to stop the hardware doing the checks; we just
470 	 * ignore the result.
471 	 */
472 	efx->rx_checksum_enabled = !!enable;
473 
474 	return 0;
475 }
476 
efx_ethtool_get_rx_csum(struct net_device * net_dev)477 static u32 efx_ethtool_get_rx_csum(struct net_device *net_dev)
478 {
479 	struct efx_nic *efx = netdev_priv(net_dev);
480 
481 	return efx->rx_checksum_enabled;
482 }
483 
efx_ethtool_self_test(struct net_device * net_dev,struct ethtool_test * test,u64 * data)484 static void efx_ethtool_self_test(struct net_device *net_dev,
485 				  struct ethtool_test *test, u64 *data)
486 {
487 	struct efx_nic *efx = netdev_priv(net_dev);
488 	struct efx_self_tests efx_tests;
489 	int already_up;
490 	int rc;
491 
492 	ASSERT_RTNL();
493 	if (efx->state != STATE_RUNNING) {
494 		rc = -EIO;
495 		goto fail1;
496 	}
497 
498 	/* We need rx buffers and interrupts. */
499 	already_up = (efx->net_dev->flags & IFF_UP);
500 	if (!already_up) {
501 		rc = dev_open(efx->net_dev);
502 		if (rc) {
503 			EFX_ERR(efx, "failed opening device.\n");
504 			goto fail2;
505 		}
506 	}
507 
508 	memset(&efx_tests, 0, sizeof(efx_tests));
509 
510 	rc = efx_selftest(efx, &efx_tests, test->flags);
511 
512 	if (!already_up)
513 		dev_close(efx->net_dev);
514 
515 	EFX_LOG(efx, "%s %sline self-tests\n",
516 		rc == 0 ? "passed" : "failed",
517 		(test->flags & ETH_TEST_FL_OFFLINE) ? "off" : "on");
518 
519  fail2:
520  fail1:
521 	/* Fill ethtool results structures */
522 	efx_ethtool_fill_self_tests(efx, &efx_tests, NULL, data);
523 	if (rc)
524 		test->flags |= ETH_TEST_FL_FAILED;
525 }
526 
527 /* Restart autonegotiation */
efx_ethtool_nway_reset(struct net_device * net_dev)528 static int efx_ethtool_nway_reset(struct net_device *net_dev)
529 {
530 	struct efx_nic *efx = netdev_priv(net_dev);
531 
532 	return mii_nway_restart(&efx->mii);
533 }
534 
efx_ethtool_get_link(struct net_device * net_dev)535 static u32 efx_ethtool_get_link(struct net_device *net_dev)
536 {
537 	struct efx_nic *efx = netdev_priv(net_dev);
538 
539 	return efx->link_up;
540 }
541 
efx_ethtool_get_eeprom_len(struct net_device * net_dev)542 static int efx_ethtool_get_eeprom_len(struct net_device *net_dev)
543 {
544 	struct efx_nic *efx = netdev_priv(net_dev);
545 	struct efx_spi_device *spi = efx->spi_eeprom;
546 
547 	if (!spi)
548 		return 0;
549 	return min(spi->size, EFX_EEPROM_BOOTCONFIG_END) -
550 		min(spi->size, EFX_EEPROM_BOOTCONFIG_START);
551 }
552 
efx_ethtool_get_eeprom(struct net_device * net_dev,struct ethtool_eeprom * eeprom,u8 * buf)553 static int efx_ethtool_get_eeprom(struct net_device *net_dev,
554 				  struct ethtool_eeprom *eeprom, u8 *buf)
555 {
556 	struct efx_nic *efx = netdev_priv(net_dev);
557 	struct efx_spi_device *spi = efx->spi_eeprom;
558 	size_t len;
559 	int rc;
560 
561 	rc = mutex_lock_interruptible(&efx->spi_lock);
562 	if (rc)
563 		return rc;
564 	rc = falcon_spi_read(spi, eeprom->offset + EFX_EEPROM_BOOTCONFIG_START,
565 			     eeprom->len, &len, buf);
566 	mutex_unlock(&efx->spi_lock);
567 
568 	eeprom->magic = EFX_ETHTOOL_EEPROM_MAGIC;
569 	eeprom->len = len;
570 	return rc;
571 }
572 
efx_ethtool_set_eeprom(struct net_device * net_dev,struct ethtool_eeprom * eeprom,u8 * buf)573 static int efx_ethtool_set_eeprom(struct net_device *net_dev,
574 				  struct ethtool_eeprom *eeprom, u8 *buf)
575 {
576 	struct efx_nic *efx = netdev_priv(net_dev);
577 	struct efx_spi_device *spi = efx->spi_eeprom;
578 	size_t len;
579 	int rc;
580 
581 	if (eeprom->magic != EFX_ETHTOOL_EEPROM_MAGIC)
582 		return -EINVAL;
583 
584 	rc = mutex_lock_interruptible(&efx->spi_lock);
585 	if (rc)
586 		return rc;
587 	rc = falcon_spi_write(spi, eeprom->offset + EFX_EEPROM_BOOTCONFIG_START,
588 			      eeprom->len, &len, buf);
589 	mutex_unlock(&efx->spi_lock);
590 
591 	eeprom->len = len;
592 	return rc;
593 }
594 
efx_ethtool_get_coalesce(struct net_device * net_dev,struct ethtool_coalesce * coalesce)595 static int efx_ethtool_get_coalesce(struct net_device *net_dev,
596 				    struct ethtool_coalesce *coalesce)
597 {
598 	struct efx_nic *efx = netdev_priv(net_dev);
599 	struct efx_tx_queue *tx_queue;
600 	struct efx_rx_queue *rx_queue;
601 	struct efx_channel *channel;
602 
603 	memset(coalesce, 0, sizeof(*coalesce));
604 
605 	/* Find lowest IRQ moderation across all used TX queues */
606 	coalesce->tx_coalesce_usecs_irq = ~((u32) 0);
607 	efx_for_each_tx_queue(tx_queue, efx) {
608 		channel = tx_queue->channel;
609 		if (channel->irq_moderation < coalesce->tx_coalesce_usecs_irq) {
610 			if (channel->used_flags != EFX_USED_BY_RX_TX)
611 				coalesce->tx_coalesce_usecs_irq =
612 					channel->irq_moderation;
613 			else
614 				coalesce->tx_coalesce_usecs_irq = 0;
615 		}
616 	}
617 
618 	/* Find lowest IRQ moderation across all used RX queues */
619 	coalesce->rx_coalesce_usecs_irq = ~((u32) 0);
620 	efx_for_each_rx_queue(rx_queue, efx) {
621 		channel = rx_queue->channel;
622 		if (channel->irq_moderation < coalesce->rx_coalesce_usecs_irq)
623 			coalesce->rx_coalesce_usecs_irq =
624 				channel->irq_moderation;
625 	}
626 
627 	return 0;
628 }
629 
630 /* Set coalescing parameters
631  * The difficulties occur for shared channels
632  */
efx_ethtool_set_coalesce(struct net_device * net_dev,struct ethtool_coalesce * coalesce)633 static int efx_ethtool_set_coalesce(struct net_device *net_dev,
634 				    struct ethtool_coalesce *coalesce)
635 {
636 	struct efx_nic *efx = netdev_priv(net_dev);
637 	struct efx_channel *channel;
638 	struct efx_tx_queue *tx_queue;
639 	unsigned tx_usecs, rx_usecs;
640 
641 	if (coalesce->use_adaptive_rx_coalesce ||
642 	    coalesce->use_adaptive_tx_coalesce)
643 		return -EOPNOTSUPP;
644 
645 	if (coalesce->rx_coalesce_usecs || coalesce->tx_coalesce_usecs) {
646 		EFX_ERR(efx, "invalid coalescing setting. "
647 			"Only rx/tx_coalesce_usecs_irq are supported\n");
648 		return -EOPNOTSUPP;
649 	}
650 
651 	rx_usecs = coalesce->rx_coalesce_usecs_irq;
652 	tx_usecs = coalesce->tx_coalesce_usecs_irq;
653 
654 	/* If the channel is shared only allow RX parameters to be set */
655 	efx_for_each_tx_queue(tx_queue, efx) {
656 		if ((tx_queue->channel->used_flags == EFX_USED_BY_RX_TX) &&
657 		    tx_usecs) {
658 			EFX_ERR(efx, "Channel is shared. "
659 				"Only RX coalescing may be set\n");
660 			return -EOPNOTSUPP;
661 		}
662 	}
663 
664 	efx_init_irq_moderation(efx, tx_usecs, rx_usecs);
665 
666 	/* Reset channel to pick up new moderation value.  Note that
667 	 * this may change the value of the irq_moderation field
668 	 * (e.g. to allow for hardware timer granularity).
669 	 */
670 	efx_for_each_channel(channel, efx)
671 		falcon_set_int_moderation(channel);
672 
673 	return 0;
674 }
675 
efx_ethtool_set_pauseparam(struct net_device * net_dev,struct ethtool_pauseparam * pause)676 static int efx_ethtool_set_pauseparam(struct net_device *net_dev,
677 				      struct ethtool_pauseparam *pause)
678 {
679 	struct efx_nic *efx = netdev_priv(net_dev);
680 	enum efx_fc_type wanted_fc;
681 	bool reset;
682 
683 	wanted_fc = ((pause->rx_pause ? EFX_FC_RX : 0) |
684 		     (pause->tx_pause ? EFX_FC_TX : 0) |
685 		     (pause->autoneg ? EFX_FC_AUTO : 0));
686 
687 	if ((wanted_fc & EFX_FC_TX) && !(wanted_fc & EFX_FC_RX)) {
688 		EFX_LOG(efx, "Flow control unsupported: tx ON rx OFF\n");
689 		return -EINVAL;
690 	}
691 
692 	if (!(efx->phy_op->mmds & DEV_PRESENT_BIT(MDIO_MMD_AN)) &&
693 	    (wanted_fc & EFX_FC_AUTO)) {
694 		EFX_LOG(efx, "PHY does not support flow control "
695 			"autonegotiation\n");
696 		return -EINVAL;
697 	}
698 
699 	/* TX flow control may automatically turn itself off if the
700 	 * link partner (intermittently) stops responding to pause
701 	 * frames. There isn't any indication that this has happened,
702 	 * so the best we do is leave it up to the user to spot this
703 	 * and fix it be cycling transmit flow control on this end. */
704 	reset = (wanted_fc & EFX_FC_TX) && !(efx->wanted_fc & EFX_FC_TX);
705 	if (EFX_WORKAROUND_11482(efx) && reset) {
706 		if (falcon_rev(efx) >= FALCON_REV_B0) {
707 			/* Recover by resetting the EM block */
708 			if (efx->link_up)
709 				falcon_drain_tx_fifo(efx);
710 		} else {
711 			/* Schedule a reset to recover */
712 			efx_schedule_reset(efx, RESET_TYPE_INVISIBLE);
713 		}
714 	}
715 
716 	/* Try to push the pause parameters */
717 	mutex_lock(&efx->mac_lock);
718 
719 	efx->wanted_fc = wanted_fc;
720 	mdio_clause45_set_pause(efx);
721 	__efx_reconfigure_port(efx);
722 
723 	mutex_unlock(&efx->mac_lock);
724 
725 	return 0;
726 }
727 
efx_ethtool_get_pauseparam(struct net_device * net_dev,struct ethtool_pauseparam * pause)728 static void efx_ethtool_get_pauseparam(struct net_device *net_dev,
729 				       struct ethtool_pauseparam *pause)
730 {
731 	struct efx_nic *efx = netdev_priv(net_dev);
732 
733 	pause->rx_pause = !!(efx->wanted_fc & EFX_FC_RX);
734 	pause->tx_pause = !!(efx->wanted_fc & EFX_FC_TX);
735 	pause->autoneg = !!(efx->wanted_fc & EFX_FC_AUTO);
736 }
737 
738 
739 struct ethtool_ops efx_ethtool_ops = {
740 	.get_settings		= efx_ethtool_get_settings,
741 	.set_settings		= efx_ethtool_set_settings,
742 	.get_drvinfo		= efx_ethtool_get_drvinfo,
743 	.nway_reset		= efx_ethtool_nway_reset,
744 	.get_link		= efx_ethtool_get_link,
745 	.get_eeprom_len		= efx_ethtool_get_eeprom_len,
746 	.get_eeprom		= efx_ethtool_get_eeprom,
747 	.set_eeprom		= efx_ethtool_set_eeprom,
748 	.get_coalesce		= efx_ethtool_get_coalesce,
749 	.set_coalesce		= efx_ethtool_set_coalesce,
750 	.get_pauseparam         = efx_ethtool_get_pauseparam,
751 	.set_pauseparam         = efx_ethtool_set_pauseparam,
752 	.get_rx_csum		= efx_ethtool_get_rx_csum,
753 	.set_rx_csum		= efx_ethtool_set_rx_csum,
754 	.get_tx_csum		= ethtool_op_get_tx_csum,
755 	.set_tx_csum		= ethtool_op_set_tx_csum,
756 	.get_sg			= ethtool_op_get_sg,
757 	.set_sg			= ethtool_op_set_sg,
758 	.get_tso		= ethtool_op_get_tso,
759 	.set_tso		= ethtool_op_set_tso,
760 	.get_flags		= ethtool_op_get_flags,
761 	.set_flags		= ethtool_op_set_flags,
762 	.get_sset_count		= efx_ethtool_get_sset_count,
763 	.self_test		= efx_ethtool_self_test,
764 	.get_strings		= efx_ethtool_get_strings,
765 	.phys_id		= efx_ethtool_phys_id,
766 	.get_ethtool_stats	= efx_ethtool_get_stats,
767 };
768