selftest.c 22.8 KB
Newer Older
1 2 3
/****************************************************************************
 * Driver for Solarflare Solarstorm network controllers and boards
 * Copyright 2005-2006 Fen Systems Ltd.
B
Ben Hutchings 已提交
4
 * Copyright 2006-2010 Solarflare Communications Inc.
5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20
 *
 * This program is free software; you can redistribute it and/or modify it
 * under the terms of the GNU General Public License version 2 as published
 * by the Free Software Foundation, incorporated herein by reference.
 */

#include <linux/netdevice.h>
#include <linux/module.h>
#include <linux/delay.h>
#include <linux/kernel_stat.h>
#include <linux/pci.h>
#include <linux/ethtool.h>
#include <linux/ip.h>
#include <linux/in.h>
#include <linux/udp.h>
#include <linux/rtnetlink.h>
21
#include <linux/slab.h>
22 23
#include "net_driver.h"
#include "efx.h"
B
Ben Hutchings 已提交
24
#include "nic.h"
25 26 27
#include "selftest.h"
#include "workarounds.h"

B
Ben Hutchings 已提交
28 29 30 31 32 33 34 35 36 37
/* IRQ latency can be enormous because:
 * - All IRQs may be disabled on a CPU for a *long* time by e.g. a
 *   slow serial console or an old IDE driver doing error recovery
 * - The PREEMPT_RT patches mostly deal with this, but also allow a
 *   tasklet or normal task to be given higher priority than our IRQ
 *   threads
 * Try to avoid blaming the hardware for this.
 */
#define IRQ_TIMEOUT HZ

38 39 40 41 42 43 44 45 46 47 48 49
/*
 * Loopback test packet structure
 *
 * The self-test should stress every RSS vector, and unfortunately
 * Falcon only performs RSS on TCP/UDP packets.
 */
struct efx_loopback_payload {
	struct ethhdr header;
	struct iphdr ip;
	struct udphdr udp;
	__be16 iteration;
	const char msg[64];
50
} __packed;
51 52 53 54 55 56

/* Loopback test source MAC address */
static const unsigned char payload_source[ETH_ALEN] = {
	0x00, 0x0f, 0x53, 0x1b, 0x1b, 0x1b,
};

57
static const char payload_msg[] =
58 59
	"Hello world! This is an Efx loopback test in progress!";

S
stephen hemminger 已提交
60 61
/* Interrupt mode names */
static const unsigned int efx_interrupt_mode_max = EFX_INT_MODE_MAX;
62
static const char *const efx_interrupt_mode_names[] = {
S
stephen hemminger 已提交
63 64 65 66 67 68 69
	[EFX_INT_MODE_MSIX]   = "MSI-X",
	[EFX_INT_MODE_MSI]    = "MSI",
	[EFX_INT_MODE_LEGACY] = "legacy",
};
#define INT_MODE(efx) \
	STRING_TABLE_LOOKUP(efx->interrupt_mode, efx_interrupt_mode)

70
/**
B
Ben Hutchings 已提交
71
 * efx_loopback_state - persistent state during a loopback selftest
72 73 74
 * @flush:		Drop all packets in efx_loopback_rx_packet
 * @packet_count:	Number of packets being used in this test
 * @skbs:		An array of skbs transmitted
75
 * @offload_csum:	Checksums are being offloaded
76 77 78 79
 * @rx_good:		RX good packet count
 * @rx_bad:		RX bad packet count
 * @payload:		Payload used in tests
 */
B
Ben Hutchings 已提交
80
struct efx_loopback_state {
81
	bool flush;
82 83
	int packet_count;
	struct sk_buff **skbs;
84
	bool offload_csum;
85 86 87 88 89
	atomic_t rx_good;
	atomic_t rx_bad;
	struct efx_loopback_payload payload;
};

B
Ben Hutchings 已提交
90 91 92
/* How long to wait for all the packets to arrive (in ms) */
#define LOOPBACK_TIMEOUT_MS 1000

93 94
/**************************************************************************
 *
B
Ben Hutchings 已提交
95
 * MII, NVRAM and register tests
96 97 98
 *
 **************************************************************************/

99
static int efx_test_phy_alive(struct efx_nic *efx, struct efx_self_tests *tests)
B
Ben Hutchings 已提交
100 101 102
{
	int rc = 0;

103 104 105
	if (efx->phy_op->test_alive) {
		rc = efx->phy_op->test_alive(efx);
		tests->phy_alive = rc ? -1 : 1;
B
Ben Hutchings 已提交
106 107 108 109 110 111 112
	}

	return rc;
}

static int efx_test_nvram(struct efx_nic *efx, struct efx_self_tests *tests)
{
113 114 115 116 117 118
	int rc = 0;

	if (efx->type->test_nvram) {
		rc = efx->type->test_nvram(efx);
		tests->nvram = rc ? -1 : 1;
	}
B
Ben Hutchings 已提交
119 120 121 122 123 124

	return rc;
}

static int efx_test_chip(struct efx_nic *efx, struct efx_self_tests *tests)
{
125
	int rc = 0;
B
Ben Hutchings 已提交
126

127 128 129 130 131
	/* Test register access */
	if (efx->type->test_registers) {
		rc = efx->type->test_registers(efx);
		tests->registers = rc ? -1 : 1;
	}
B
Ben Hutchings 已提交
132 133 134

	return rc;
}
135 136 137 138 139 140 141 142 143 144 145

/**************************************************************************
 *
 * Interrupt and event queue testing
 *
 **************************************************************************/

/* Test generation and receipt of interrupts */
static int efx_test_interrupts(struct efx_nic *efx,
			       struct efx_self_tests *tests)
{
B
Ben Hutchings 已提交
146
	unsigned long timeout, wait;
147 148
	int cpu;

149
	netif_dbg(efx, drv, efx->net_dev, "testing interrupts\n");
150 151
	tests->interrupt = -1;

152
	efx_nic_irq_test_start(efx);
B
Ben Hutchings 已提交
153 154
	timeout = jiffies + IRQ_TIMEOUT;
	wait = 1;
155 156

	/* Wait for arrival of test interrupt. */
157
	netif_dbg(efx, drv, efx->net_dev, "waiting for test interrupt\n");
B
Ben Hutchings 已提交
158 159
	do {
		schedule_timeout_uninterruptible(wait);
160
		cpu = efx_nic_irq_test_irq_cpu(efx);
B
Ben Hutchings 已提交
161 162 163 164
		if (cpu >= 0)
			goto success;
		wait *= 2;
	} while (time_before(jiffies, timeout));
165

166
	netif_err(efx, drv, efx->net_dev, "timed out waiting for interrupt\n");
167 168 169
	return -ETIMEDOUT;

 success:
170
	netif_dbg(efx, drv, efx->net_dev, "%s test interrupt seen on CPU%d\n",
171
		  INT_MODE(efx), cpu);
172 173 174 175 176
	tests->interrupt = 1;
	return 0;
}

/* Test generation and receipt of interrupting events */
177
static int efx_test_eventq_irq(struct efx_nic *efx,
178 179
			       struct efx_self_tests *tests)
{
180 181 182
	struct efx_channel *channel;
	unsigned int read_ptr[EFX_MAX_CHANNELS];
	unsigned long napi_ran = 0, dma_pend = 0, int_pend = 0;
B
Ben Hutchings 已提交
183
	unsigned long timeout, wait;
184

185 186 187 188 189 190
	BUILD_BUG_ON(EFX_MAX_CHANNELS > BITS_PER_LONG);

	efx_for_each_channel(channel, efx) {
		read_ptr[channel->channel] = channel->eventq_read_ptr;
		set_bit(channel->channel, &dma_pend);
		set_bit(channel->channel, &int_pend);
191
		efx_nic_event_test_start(channel);
192
	}
193

B
Ben Hutchings 已提交
194 195
	timeout = jiffies + IRQ_TIMEOUT;
	wait = 1;
196

197
	/* Wait for arrival of interrupts.  NAPI processing may or may
198 199
	 * not complete in time, but we can cope in any case.
	 */
B
Ben Hutchings 已提交
200 201 202
	do {
		schedule_timeout_uninterruptible(wait);

203 204 205 206 207 208 209 210 211 212
		efx_for_each_channel(channel, efx) {
			napi_disable(&channel->napi_str);
			if (channel->eventq_read_ptr !=
			    read_ptr[channel->channel]) {
				set_bit(channel->channel, &napi_ran);
				clear_bit(channel->channel, &dma_pend);
				clear_bit(channel->channel, &int_pend);
			} else {
				if (efx_nic_event_present(channel))
					clear_bit(channel->channel, &dma_pend);
213
				if (efx_nic_event_test_irq_cpu(channel) >= 0)
214 215 216 217
					clear_bit(channel->channel, &int_pend);
			}
			napi_enable(&channel->napi_str);
			efx_nic_eventq_read_ack(channel);
B
Ben Hutchings 已提交
218 219 220
		}

		wait *= 2;
221
	} while ((dma_pend || int_pend) && time_before(jiffies, timeout));
222

223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239
	efx_for_each_channel(channel, efx) {
		bool dma_seen = !test_bit(channel->channel, &dma_pend);
		bool int_seen = !test_bit(channel->channel, &int_pend);

		tests->eventq_dma[channel->channel] = dma_seen ? 1 : -1;
		tests->eventq_int[channel->channel] = int_seen ? 1 : -1;

		if (dma_seen && int_seen) {
			netif_dbg(efx, drv, efx->net_dev,
				  "channel %d event queue passed (with%s NAPI)\n",
				  channel->channel,
				  test_bit(channel->channel, &napi_ran) ?
				  "" : "out");
		} else {
			/* Report failure and whether either interrupt or DMA
			 * worked
			 */
240
			netif_err(efx, drv, efx->net_dev,
241
				  "channel %d timed out waiting for event queue\n",
242
				  channel->channel);
243 244 245 246 247 248 249 250 251 252 253
			if (int_seen)
				netif_err(efx, drv, efx->net_dev,
					  "channel %d saw interrupt "
					  "during event queue test\n",
					  channel->channel);
			if (dma_seen)
				netif_err(efx, drv, efx->net_dev,
					  "channel %d event was generated, but "
					  "failed to trigger an interrupt\n",
					  channel->channel);
		}
254
	}
255 256

	return (dma_pend || int_pend) ? -ETIMEDOUT : 0;
257 258
}

259 260
static int efx_test_phy(struct efx_nic *efx, struct efx_self_tests *tests,
			unsigned flags)
261
{
B
Ben Hutchings 已提交
262
	int rc;
263

264
	if (!efx->phy_op->run_tests)
265 266
		return 0;

B
Ben Hutchings 已提交
267
	mutex_lock(&efx->mac_lock);
268
	rc = efx->phy_op->run_tests(efx, tests->phy_ext, flags);
B
Ben Hutchings 已提交
269 270
	mutex_unlock(&efx->mac_lock);
	return rc;
271 272 273 274 275 276 277 278 279 280 281 282 283 284 285
}

/**************************************************************************
 *
 * Loopback testing
 * NB Only one loopback test can be executing concurrently.
 *
 **************************************************************************/

/* Loopback test RX callback
 * This is called for each received packet during loopback testing.
 */
void efx_loopback_rx_packet(struct efx_nic *efx,
			    const char *buf_ptr, int pkt_len)
{
B
Ben Hutchings 已提交
286
	struct efx_loopback_state *state = efx->loopback_selftest;
287 288 289 290 291 292 293 294 295 296
	struct efx_loopback_payload *received;
	struct efx_loopback_payload *payload;

	BUG_ON(!buf_ptr);

	/* If we are just flushing, then drop the packet */
	if ((state == NULL) || state->flush)
		return;

	payload = &state->payload;
B
Ben Hutchings 已提交
297

298
	received = (struct efx_loopback_payload *) buf_ptr;
299
	received->ip.saddr = payload->ip.saddr;
300 301 302
	if (state->offload_csum)
		received->ip.check = payload->ip.check;

303 304
	/* Check that header exists */
	if (pkt_len < sizeof(received->header)) {
305 306 307
		netif_err(efx, drv, efx->net_dev,
			  "saw runt RX packet (length %d) in %s loopback "
			  "test\n", pkt_len, LOOPBACK_MODE(efx));
308 309 310 311 312
		goto err;
	}

	/* Check that the ethernet header exists */
	if (memcmp(&received->header, &payload->header, ETH_HLEN) != 0) {
313 314 315
		netif_err(efx, drv, efx->net_dev,
			  "saw non-loopback RX packet in %s loopback test\n",
			  LOOPBACK_MODE(efx));
316 317 318 319 320
		goto err;
	}

	/* Check packet length */
	if (pkt_len != sizeof(*payload)) {
321 322 323 324
		netif_err(efx, drv, efx->net_dev,
			  "saw incorrect RX packet length %d (wanted %d) in "
			  "%s loopback test\n", pkt_len, (int)sizeof(*payload),
			  LOOPBACK_MODE(efx));
325 326 327 328 329
		goto err;
	}

	/* Check that IP header matches */
	if (memcmp(&received->ip, &payload->ip, sizeof(payload->ip)) != 0) {
330 331 332
		netif_err(efx, drv, efx->net_dev,
			  "saw corrupted IP header in %s loopback test\n",
			  LOOPBACK_MODE(efx));
333 334 335 336 337
		goto err;
	}

	/* Check that msg and padding matches */
	if (memcmp(&received->msg, &payload->msg, sizeof(received->msg)) != 0) {
338 339 340
		netif_err(efx, drv, efx->net_dev,
			  "saw corrupted RX packet in %s loopback test\n",
			  LOOPBACK_MODE(efx));
341 342 343 344 345
		goto err;
	}

	/* Check that iteration matches */
	if (received->iteration != payload->iteration) {
346 347 348 349
		netif_err(efx, drv, efx->net_dev,
			  "saw RX packet from iteration %d (wanted %d) in "
			  "%s loopback test\n", ntohs(received->iteration),
			  ntohs(payload->iteration), LOOPBACK_MODE(efx));
350 351 352 353
		goto err;
	}

	/* Increase correct RX count */
354 355
	netif_vdbg(efx, drv, efx->net_dev,
		   "got loopback RX in %s loopback test\n", LOOPBACK_MODE(efx));
356 357 358 359 360

	atomic_inc(&state->rx_good);
	return;

 err:
361
#ifdef DEBUG
362
	if (atomic_read(&state->rx_bad) == 0) {
363
		netif_err(efx, drv, efx->net_dev, "received packet:\n");
364 365
		print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 0x10, 1,
			       buf_ptr, pkt_len, 0);
366
		netif_err(efx, drv, efx->net_dev, "expected packet:\n");
367 368 369 370 371 372 373 374 375 376
		print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 0x10, 1,
			       &state->payload, sizeof(state->payload), 0);
	}
#endif
	atomic_inc(&state->rx_bad);
}

/* Initialise an efx_selftest_state for a new iteration */
static void efx_iterate_state(struct efx_nic *efx)
{
B
Ben Hutchings 已提交
377
	struct efx_loopback_state *state = efx->loopback_selftest;
378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409
	struct net_device *net_dev = efx->net_dev;
	struct efx_loopback_payload *payload = &state->payload;

	/* Initialise the layerII header */
	memcpy(&payload->header.h_dest, net_dev->dev_addr, ETH_ALEN);
	memcpy(&payload->header.h_source, &payload_source, ETH_ALEN);
	payload->header.h_proto = htons(ETH_P_IP);

	/* saddr set later and used as incrementing count */
	payload->ip.daddr = htonl(INADDR_LOOPBACK);
	payload->ip.ihl = 5;
	payload->ip.check = htons(0xdead);
	payload->ip.tot_len = htons(sizeof(*payload) - sizeof(struct ethhdr));
	payload->ip.version = IPVERSION;
	payload->ip.protocol = IPPROTO_UDP;

	/* Initialise udp header */
	payload->udp.source = 0;
	payload->udp.len = htons(sizeof(*payload) - sizeof(struct ethhdr) -
				 sizeof(struct iphdr));
	payload->udp.check = 0;	/* checksum ignored */

	/* Fill out payload */
	payload->iteration = htons(ntohs(payload->iteration) + 1);
	memcpy(&payload->msg, payload_msg, sizeof(payload_msg));

	/* Fill out remaining state members */
	atomic_set(&state->rx_good, 0);
	atomic_set(&state->rx_bad, 0);
	smp_wmb();
}

B
Ben Hutchings 已提交
410
static int efx_begin_loopback(struct efx_tx_queue *tx_queue)
411 412
{
	struct efx_nic *efx = tx_queue->efx;
B
Ben Hutchings 已提交
413
	struct efx_loopback_state *state = efx->loopback_selftest;
414 415
	struct efx_loopback_payload *payload;
	struct sk_buff *skb;
416 417
	int i;
	netdev_tx_t rc;
418 419 420

	/* Transmit N copies of buffer */
	for (i = 0; i < state->packet_count; i++) {
B
Ben Hutchings 已提交
421
		/* Allocate an skb, holding an extra reference for
422 423 424 425 426 427 428 429 430 431 432 433 434 435 436 437 438 439
		 * transmit completion counting */
		skb = alloc_skb(sizeof(state->payload), GFP_KERNEL);
		if (!skb)
			return -ENOMEM;
		state->skbs[i] = skb;
		skb_get(skb);

		/* Copy the payload in, incrementing the source address to
		 * exercise the rss vectors */
		payload = ((struct efx_loopback_payload *)
			   skb_put(skb, sizeof(state->payload)));
		memcpy(payload, &state->payload, sizeof(state->payload));
		payload->ip.saddr = htonl(INADDR_LOOPBACK | (i << 2));

		/* Ensure everything we've written is visible to the
		 * interrupt handler. */
		smp_wmb();

440
		netif_tx_lock_bh(efx->net_dev);
441
		rc = efx_enqueue_skb(tx_queue, skb);
442
		netif_tx_unlock_bh(efx->net_dev);
443 444

		if (rc != NETDEV_TX_OK) {
445 446 447 448 449
			netif_err(efx, drv, efx->net_dev,
				  "TX queue %d could not transmit packet %d of "
				  "%d in %s loopback test\n", tx_queue->queue,
				  i + 1, state->packet_count,
				  LOOPBACK_MODE(efx));
450 451 452 453 454 455 456 457 458 459

			/* Defer cleaning up the other skbs for the caller */
			kfree_skb(skb);
			return -EPIPE;
		}
	}

	return 0;
}

B
Ben Hutchings 已提交
460 461
static int efx_poll_loopback(struct efx_nic *efx)
{
B
Ben Hutchings 已提交
462
	struct efx_loopback_state *state = efx->loopback_selftest;
B
Ben Hutchings 已提交
463 464 465 466
	struct efx_channel *channel;

	/* NAPI polling is not enabled, so process channels
	 * synchronously */
467
	efx_for_each_channel(channel, efx) {
B
Ben Hutchings 已提交
468 469 470 471 472 473 474 475
		if (channel->work_pending)
			efx_process_channel_now(channel);
	}
	return atomic_read(&state->rx_good) == state->packet_count;
}

static int efx_end_loopback(struct efx_tx_queue *tx_queue,
			    struct efx_loopback_self_tests *lb_tests)
476 477
{
	struct efx_nic *efx = tx_queue->efx;
B
Ben Hutchings 已提交
478
	struct efx_loopback_state *state = efx->loopback_selftest;
479 480 481 482
	struct sk_buff *skb;
	int tx_done = 0, rx_good, rx_bad;
	int i, rc = 0;

483
	netif_tx_lock_bh(efx->net_dev);
484 485 486

	/* Count the number of tx completions, and decrement the refcnt. Any
	 * skbs not already completed will be free'd when the queue is flushed */
487
	for (i = 0; i < state->packet_count; i++) {
488 489 490
		skb = state->skbs[i];
		if (skb && !skb_shared(skb))
			++tx_done;
491
		dev_kfree_skb(skb);
492 493
	}

494
	netif_tx_unlock_bh(efx->net_dev);
495 496 497 498 499 500 501 502

	/* Check TX completion and received packet counts */
	rx_good = atomic_read(&state->rx_good);
	rx_bad = atomic_read(&state->rx_bad);
	if (tx_done != state->packet_count) {
		/* Don't free the skbs; they will be picked up on TX
		 * overflow or channel teardown.
		 */
503 504 505 506 507
		netif_err(efx, drv, efx->net_dev,
			  "TX queue %d saw only %d out of an expected %d "
			  "TX completion events in %s loopback test\n",
			  tx_queue->queue, tx_done, state->packet_count,
			  LOOPBACK_MODE(efx));
508 509 510 511 512 513
		rc = -ETIMEDOUT;
		/* Allow to fall through so we see the RX errors as well */
	}

	/* We may always be up to a flush away from our desired packet total */
	if (rx_good != state->packet_count) {
514 515 516 517 518
		netif_dbg(efx, drv, efx->net_dev,
			  "TX queue %d saw only %d out of an expected %d "
			  "received packets in %s loopback test\n",
			  tx_queue->queue, rx_good, state->packet_count,
			  LOOPBACK_MODE(efx));
519 520 521 522 523 524 525 526 527 528 529 530 531 532 533 534 535 536
		rc = -ETIMEDOUT;
		/* Fall through */
	}

	/* Update loopback test structure */
	lb_tests->tx_sent[tx_queue->queue] += state->packet_count;
	lb_tests->tx_done[tx_queue->queue] += tx_done;
	lb_tests->rx_good += rx_good;
	lb_tests->rx_bad += rx_bad;

	return rc;
}

static int
efx_test_loopback(struct efx_tx_queue *tx_queue,
		  struct efx_loopback_self_tests *lb_tests)
{
	struct efx_nic *efx = tx_queue->efx;
B
Ben Hutchings 已提交
537
	struct efx_loopback_state *state = efx->loopback_selftest;
B
Ben Hutchings 已提交
538
	int i, begin_rc, end_rc;
539

B
Ben Hutchings 已提交
540
	for (i = 0; i < 3; i++) {
541
		/* Determine how many packets to send */
542
		state->packet_count = efx->txq_entries / 3;
543
		state->packet_count = min(1 << (i << 2), state->packet_count);
544 545
		state->skbs = kcalloc(state->packet_count,
				      sizeof(state->skbs[0]), GFP_KERNEL);
546 547
		if (!state->skbs)
			return -ENOMEM;
548
		state->flush = false;
549

550 551 552 553
		netif_dbg(efx, drv, efx->net_dev,
			  "TX queue %d testing %s loopback with %d packets\n",
			  tx_queue->queue, LOOPBACK_MODE(efx),
			  state->packet_count);
554 555

		efx_iterate_state(efx);
B
Ben Hutchings 已提交
556 557 558
		begin_rc = efx_begin_loopback(tx_queue);

		/* This will normally complete very quickly, but be
B
Ben Hutchings 已提交
559
		 * prepared to wait much longer. */
B
Ben Hutchings 已提交
560 561
		msleep(1);
		if (!efx_poll_loopback(efx)) {
B
Ben Hutchings 已提交
562
			msleep(LOOPBACK_TIMEOUT_MS);
B
Ben Hutchings 已提交
563
			efx_poll_loopback(efx);
564 565
		}

B
Ben Hutchings 已提交
566
		end_rc = efx_end_loopback(tx_queue, lb_tests);
567 568
		kfree(state->skbs);

B
Ben Hutchings 已提交
569
		if (begin_rc || end_rc) {
570 571 572
			/* Wait a while to ensure there are no packets
			 * floating around after a failure. */
			schedule_timeout_uninterruptible(HZ / 10);
B
Ben Hutchings 已提交
573
			return begin_rc ? begin_rc : end_rc;
574 575 576
		}
	}

577 578 579 580
	netif_dbg(efx, drv, efx->net_dev,
		  "TX queue %d passed %s loopback test with a burst length "
		  "of %d packets\n", tx_queue->queue, LOOPBACK_MODE(efx),
		  state->packet_count);
581

582
	return 0;
583 584
}

585 586 587 588 589 590 591
/* Wait for link up. On Falcon, we would prefer to rely on efx_monitor, but
 * any contention on the mac lock (via e.g. efx_mac_mcast_work) causes it
 * to delay and retry. Therefore, it's safer to just poll directly. Wait
 * for link up and any faults to dissipate. */
static int efx_wait_for_link(struct efx_nic *efx)
{
	struct efx_link_state *link_state = &efx->link_state;
592
	int count, link_up_count = 0;
593 594 595 596 597 598 599 600 601 602
	bool link_up;

	for (count = 0; count < 40; count++) {
		schedule_timeout_uninterruptible(HZ / 10);

		if (efx->type->monitor != NULL) {
			mutex_lock(&efx->mac_lock);
			efx->type->monitor(efx);
			mutex_unlock(&efx->mac_lock);
		} else {
603
			struct efx_channel *channel = efx_get_channel(efx, 0);
604 605 606 607 608 609 610
			if (channel->work_pending)
				efx_process_channel_now(channel);
		}

		mutex_lock(&efx->mac_lock);
		link_up = link_state->up;
		if (link_up)
611
			link_up = !efx->type->check_mac_fault(efx);
612 613
		mutex_unlock(&efx->mac_lock);

614 615 616 617 618 619
		if (link_up) {
			if (++link_up_count == 2)
				return 0;
		} else {
			link_up_count = 0;
		}
620 621 622 623 624
	}

	return -ETIMEDOUT;
}

625
static int efx_test_loopbacks(struct efx_nic *efx, struct efx_self_tests *tests,
626 627
			      unsigned int loopback_modes)
{
B
Ben Hutchings 已提交
628 629
	enum efx_loopback_mode mode;
	struct efx_loopback_state *state;
630
	struct efx_channel *channel = efx_get_channel(efx, 0);
631
	struct efx_tx_queue *tx_queue;
632
	int rc = 0;
633

B
Ben Hutchings 已提交
634 635 636 637 638 639 640 641 642
	/* Set the port loopback_selftest member. From this point on
	 * all received packets will be dropped. Mark the state as
	 * "flushing" so all inflight packets are dropped */
	state = kzalloc(sizeof(*state), GFP_KERNEL);
	if (state == NULL)
		return -ENOMEM;
	BUG_ON(efx->loopback_selftest);
	state->flush = true;
	efx->loopback_selftest = state;
643 644

	/* Test all supported loopback modes */
B
Ben Hutchings 已提交
645
	for (mode = LOOPBACK_NONE; mode <= LOOPBACK_TEST_MAX; mode++) {
646 647 648 649
		if (!(loopback_modes & (1 << mode)))
			continue;

		/* Move the port into the specified loopback mode. */
650
		state->flush = true;
651
		mutex_lock(&efx->mac_lock);
652
		efx->loopback_mode = mode;
653 654 655
		rc = __efx_reconfigure_port(efx);
		mutex_unlock(&efx->mac_lock);
		if (rc) {
656 657 658
			netif_err(efx, drv, efx->net_dev,
				  "unable to move into %s loopback\n",
				  LOOPBACK_MODE(efx));
659 660
			goto out;
		}
661

662 663
		rc = efx_wait_for_link(efx);
		if (rc) {
664 665 666
			netif_err(efx, drv, efx->net_dev,
				  "loopback %s never came up\n",
				  LOOPBACK_MODE(efx));
667 668 669
			goto out;
		}

670
		/* Test all enabled types of TX queue */
671
		efx_for_each_channel_tx_queue(tx_queue, channel) {
B
Ben Hutchings 已提交
672 673
			state->offload_csum = (tx_queue->queue &
					       EFX_TXQ_TYPE_OFFLOAD);
B
Ben Hutchings 已提交
674 675
			rc = efx_test_loopback(tx_queue,
					       &tests->loopback[mode]);
676 677 678 679 680 681
			if (rc)
				goto out;
		}
	}

 out:
B
Ben Hutchings 已提交
682
	/* Remove the flush. The caller will remove the loopback setting */
683
	state->flush = true;
B
Ben Hutchings 已提交
684 685 686
	efx->loopback_selftest = NULL;
	wmb();
	kfree(state);
687 688 689 690 691 692

	return rc;
}

/**************************************************************************
 *
693
 * Entry point
694 695 696
 *
 *************************************************************************/

697 698
int efx_selftest(struct efx_nic *efx, struct efx_self_tests *tests,
		 unsigned flags)
699
{
700 701
	enum efx_loopback_mode loopback_mode = efx->loopback_mode;
	int phy_mode = efx->phy_mode;
702
	enum reset_type reset_method = RESET_TYPE_INVISIBLE;
703 704
	int rc_test = 0, rc_reset = 0, rc;

705 706
	efx_selftest_async_cancel(efx);

707 708
	/* Online (i.e. non-disruptive) testing
	 * This checks interrupt generation, event delivery and PHY presence. */
B
Ben Hutchings 已提交
709

710
	rc = efx_test_phy_alive(efx, tests);
711 712
	if (rc && !rc_test)
		rc_test = rc;
B
Ben Hutchings 已提交
713 714

	rc = efx_test_nvram(efx, tests);
715 716
	if (rc && !rc_test)
		rc_test = rc;
717

B
Ben Hutchings 已提交
718
	rc = efx_test_interrupts(efx, tests);
719 720
	if (rc && !rc_test)
		rc_test = rc;
B
Ben Hutchings 已提交
721

722 723 724
	rc = efx_test_eventq_irq(efx, tests);
	if (rc && !rc_test)
		rc_test = rc;
B
Ben Hutchings 已提交
725

726 727
	if (rc_test)
		return rc_test;
728

729
	if (!(flags & ETH_TEST_FL_OFFLINE))
730
		return efx_test_phy(efx, tests, flags);
731 732 733

	/* Offline (i.e. disruptive) testing
	 * This checks MAC and PHY loopback on the specified port. */
B
Ben Hutchings 已提交
734

735 736
	/* Detach the device so the kernel doesn't transmit during the
	 * loopback test and the watchdog timeout doesn't fire.
B
Ben Hutchings 已提交
737
	 */
738 739
	netif_device_detach(efx->net_dev);

B
Ben Hutchings 已提交
740
	mutex_lock(&efx->mac_lock);
B
Ben Hutchings 已提交
741 742 743 744 745 746 747 748 749
	if (efx->loopback_modes) {
		/* We need the 312 clock from the PHY to test the XMAC
		 * registers, so move into XGMII loopback if available */
		if (efx->loopback_modes & (1 << LOOPBACK_XGMII))
			efx->loopback_mode = LOOPBACK_XGMII;
		else
			efx->loopback_mode = __ffs(efx->loopback_modes);
	}

B
Ben Hutchings 已提交
750 751 752 753
	__efx_reconfigure_port(efx);
	mutex_unlock(&efx->mac_lock);

	/* free up all consumers of SRAM (including all the queues) */
B
Ben Hutchings 已提交
754
	efx_reset_down(efx, reset_method);
B
Ben Hutchings 已提交
755 756

	rc = efx_test_chip(efx, tests);
757 758
	if (rc && !rc_test)
		rc_test = rc;
B
Ben Hutchings 已提交
759 760

	/* reset the chip to recover from the register test */
761
	rc_reset = efx->type->reset(efx, reset_method);
B
Ben Hutchings 已提交
762

763 764 765
	/* Ensure that the phy is powered and out of loopback
	 * for the bist and loopback tests */
	efx->phy_mode &= ~PHY_MODE_LOW_POWER;
B
Ben Hutchings 已提交
766
	efx->loopback_mode = LOOPBACK_NONE;
767

B
Ben Hutchings 已提交
768
	rc = efx_reset_up(efx, reset_method, rc_reset == 0);
769 770 771 772
	if (rc && !rc_reset)
		rc_reset = rc;

	if (rc_reset) {
773 774
		netif_err(efx, drv, efx->net_dev,
			  "Unable to recover from chip test\n");
B
Ben Hutchings 已提交
775
		efx_schedule_reset(efx, RESET_TYPE_DISABLE);
776
		return rc_reset;
B
Ben Hutchings 已提交
777
	}
778

779
	rc = efx_test_phy(efx, tests, flags);
780 781
	if (rc && !rc_test)
		rc_test = rc;
782

783 784 785
	rc = efx_test_loopbacks(efx, tests, efx->loopback_modes);
	if (rc && !rc_test)
		rc_test = rc;
786

B
Ben Hutchings 已提交
787
	/* restore the PHY to the previous state */
B
Ben Hutchings 已提交
788
	mutex_lock(&efx->mac_lock);
B
Ben Hutchings 已提交
789
	efx->phy_mode = phy_mode;
B
Ben Hutchings 已提交
790 791 792
	efx->loopback_mode = loopback_mode;
	__efx_reconfigure_port(efx);
	mutex_unlock(&efx->mac_lock);
B
Ben Hutchings 已提交
793

794
	netif_device_attach(efx->net_dev);
795

796
	return rc_test;
797 798
}

799 800 801 802 803 804 805 806 807 808 809 810 811 812 813 814 815 816 817 818 819 820 821 822 823 824 825 826 827 828 829 830 831
void efx_selftest_async_start(struct efx_nic *efx)
{
	struct efx_channel *channel;

	efx_for_each_channel(channel, efx)
		efx_nic_event_test_start(channel);
	schedule_delayed_work(&efx->selftest_work, IRQ_TIMEOUT);
}

void efx_selftest_async_cancel(struct efx_nic *efx)
{
	cancel_delayed_work_sync(&efx->selftest_work);
}

void efx_selftest_async_work(struct work_struct *data)
{
	struct efx_nic *efx = container_of(data, struct efx_nic,
					   selftest_work.work);
	struct efx_channel *channel;
	int cpu;

	efx_for_each_channel(channel, efx) {
		cpu = efx_nic_event_test_irq_cpu(channel);
		if (cpu < 0)
			netif_err(efx, ifup, efx->net_dev,
				  "channel %d failed to trigger an interrupt\n",
				  channel->channel);
		else
			netif_dbg(efx, ifup, efx->net_dev,
				  "channel %d triggered interrupt on CPU %d\n",
				  channel->channel, cpu);
	}
}