selftest.c 20.6 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 28 29 30 31 32 33 34 35 36 37 38 39
#include "selftest.h"
#include "workarounds.h"

/*
 * 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];
40
} __packed;
41 42 43 44 45 46

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

47
static const char payload_msg[] =
48 49
	"Hello world! This is an Efx loopback test in progress!";

S
stephen hemminger 已提交
50 51
/* Interrupt mode names */
static const unsigned int efx_interrupt_mode_max = EFX_INT_MODE_MAX;
52
static const char *const efx_interrupt_mode_names[] = {
S
stephen hemminger 已提交
53 54 55 56 57 58 59
	[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)

60
/**
B
Ben Hutchings 已提交
61
 * efx_loopback_state - persistent state during a loopback selftest
62 63 64
 * @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
65
 * @offload_csum:	Checksums are being offloaded
66 67 68 69
 * @rx_good:		RX good packet count
 * @rx_bad:		RX bad packet count
 * @payload:		Payload used in tests
 */
B
Ben Hutchings 已提交
70
struct efx_loopback_state {
71
	bool flush;
72 73
	int packet_count;
	struct sk_buff **skbs;
74
	bool offload_csum;
75 76 77 78 79 80 81
	atomic_t rx_good;
	atomic_t rx_bad;
	struct efx_loopback_payload payload;
};

/**************************************************************************
 *
B
Ben Hutchings 已提交
82
 * MII, NVRAM and register tests
83 84 85
 *
 **************************************************************************/

86
static int efx_test_phy_alive(struct efx_nic *efx, struct efx_self_tests *tests)
B
Ben Hutchings 已提交
87 88 89
{
	int rc = 0;

90 91 92
	if (efx->phy_op->test_alive) {
		rc = efx->phy_op->test_alive(efx);
		tests->phy_alive = rc ? -1 : 1;
B
Ben Hutchings 已提交
93 94 95 96 97 98 99
	}

	return rc;
}

static int efx_test_nvram(struct efx_nic *efx, struct efx_self_tests *tests)
{
100 101 102 103 104 105
	int rc = 0;

	if (efx->type->test_nvram) {
		rc = efx->type->test_nvram(efx);
		tests->nvram = rc ? -1 : 1;
	}
B
Ben Hutchings 已提交
106 107 108 109 110 111

	return rc;
}

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

114 115 116 117 118
	/* Test register access */
	if (efx->type->test_registers) {
		rc = efx->type->test_registers(efx);
		tests->registers = rc ? -1 : 1;
	}
B
Ben Hutchings 已提交
119 120 121

	return rc;
}
122 123 124 125 126 127 128 129 130 131 132

/**************************************************************************
 *
 * 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)
{
133 134
	int cpu;

135
	netif_dbg(efx, drv, efx->net_dev, "testing interrupts\n");
136 137 138 139 140 141
	tests->interrupt = -1;

	/* Reset interrupt flag */
	efx->last_irq_cpu = -1;
	smp_wmb();

142
	efx_nic_generate_interrupt(efx);
143 144

	/* Wait for arrival of test interrupt. */
145
	netif_dbg(efx, drv, efx->net_dev, "waiting for test interrupt\n");
146
	schedule_timeout_uninterruptible(HZ / 10);
147 148
	cpu = ACCESS_ONCE(efx->last_irq_cpu);
	if (cpu >= 0)
149 150
		goto success;

151
	netif_err(efx, drv, efx->net_dev, "timed out waiting for interrupt\n");
152 153 154
	return -ETIMEDOUT;

 success:
155
	netif_dbg(efx, drv, efx->net_dev, "%s test interrupt seen on CPU%d\n",
156
		  INT_MODE(efx), cpu);
157 158 159 160 161 162 163 164
	tests->interrupt = 1;
	return 0;
}

/* Test generation and receipt of interrupting events */
static int efx_test_eventq_irq(struct efx_channel *channel,
			       struct efx_self_tests *tests)
{
165
	struct efx_nic *efx = channel->efx;
166 167
	unsigned int read_ptr;
	bool napi_ran, dma_seen, int_seen;
168

169
	read_ptr = channel->eventq_read_ptr;
170
	channel->last_irq_cpu = -1;
171 172
	smp_wmb();

173
	efx_nic_generate_test_event(channel);
174

175 176 177 178 179 180 181 182 183 184 185 186
	/* Wait for arrival of interrupt.  NAPI processing may or may
	 * not complete in time, but we can cope in any case.
	 */
	msleep(10);
	napi_disable(&channel->napi_str);
	if (channel->eventq_read_ptr != read_ptr) {
		napi_ran = true;
		dma_seen = true;
		int_seen = true;
	} else {
		napi_ran = false;
		dma_seen = efx_nic_event_present(channel);
187
		int_seen = ACCESS_ONCE(channel->last_irq_cpu) >= 0;
188
	}
189 190 191 192 193 194 195 196 197 198 199 200 201
	napi_enable(&channel->napi_str);
	efx_nic_eventq_read_ack(channel);

	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, napi_ran ? "" : "out");
		return 0;
	} else {
		/* Report failure and whether either interrupt or DMA worked */
202
		netif_err(efx, drv, efx->net_dev,
203 204 205 206 207 208 209 210 211 212 213 214 215
			  "channel %d timed out waiting for event queue\n",
			  channel->channel);
		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);
		return -ETIMEDOUT;
216 217 218
	}
}

219 220
static int efx_test_phy(struct efx_nic *efx, struct efx_self_tests *tests,
			unsigned flags)
221
{
B
Ben Hutchings 已提交
222
	int rc;
223

224
	if (!efx->phy_op->run_tests)
225 226
		return 0;

B
Ben Hutchings 已提交
227
	mutex_lock(&efx->mac_lock);
228
	rc = efx->phy_op->run_tests(efx, tests->phy_ext, flags);
B
Ben Hutchings 已提交
229 230
	mutex_unlock(&efx->mac_lock);
	return rc;
231 232 233 234 235 236 237 238 239 240 241 242 243 244 245
}

/**************************************************************************
 *
 * 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 已提交
246
	struct efx_loopback_state *state = efx->loopback_selftest;
247 248 249 250 251 252 253 254 255 256
	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 已提交
257

258
	received = (struct efx_loopback_payload *) buf_ptr;
259
	received->ip.saddr = payload->ip.saddr;
260 261 262
	if (state->offload_csum)
		received->ip.check = payload->ip.check;

263 264
	/* Check that header exists */
	if (pkt_len < sizeof(received->header)) {
265 266 267
		netif_err(efx, drv, efx->net_dev,
			  "saw runt RX packet (length %d) in %s loopback "
			  "test\n", pkt_len, LOOPBACK_MODE(efx));
268 269 270 271 272
		goto err;
	}

	/* Check that the ethernet header exists */
	if (memcmp(&received->header, &payload->header, ETH_HLEN) != 0) {
273 274 275
		netif_err(efx, drv, efx->net_dev,
			  "saw non-loopback RX packet in %s loopback test\n",
			  LOOPBACK_MODE(efx));
276 277 278 279 280
		goto err;
	}

	/* Check packet length */
	if (pkt_len != sizeof(*payload)) {
281 282 283 284
		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));
285 286 287 288 289
		goto err;
	}

	/* Check that IP header matches */
	if (memcmp(&received->ip, &payload->ip, sizeof(payload->ip)) != 0) {
290 291 292
		netif_err(efx, drv, efx->net_dev,
			  "saw corrupted IP header in %s loopback test\n",
			  LOOPBACK_MODE(efx));
293 294 295 296 297
		goto err;
	}

	/* Check that msg and padding matches */
	if (memcmp(&received->msg, &payload->msg, sizeof(received->msg)) != 0) {
298 299 300
		netif_err(efx, drv, efx->net_dev,
			  "saw corrupted RX packet in %s loopback test\n",
			  LOOPBACK_MODE(efx));
301 302 303 304 305
		goto err;
	}

	/* Check that iteration matches */
	if (received->iteration != payload->iteration) {
306 307 308 309
		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));
310 311 312 313
		goto err;
	}

	/* Increase correct RX count */
314 315
	netif_vdbg(efx, drv, efx->net_dev,
		   "got loopback RX in %s loopback test\n", LOOPBACK_MODE(efx));
316 317 318 319 320

	atomic_inc(&state->rx_good);
	return;

 err:
321
#ifdef DEBUG
322
	if (atomic_read(&state->rx_bad) == 0) {
323
		netif_err(efx, drv, efx->net_dev, "received packet:\n");
324 325
		print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 0x10, 1,
			       buf_ptr, pkt_len, 0);
326
		netif_err(efx, drv, efx->net_dev, "expected packet:\n");
327 328 329 330 331 332 333 334 335 336
		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 已提交
337
	struct efx_loopback_state *state = efx->loopback_selftest;
338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369
	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 已提交
370
static int efx_begin_loopback(struct efx_tx_queue *tx_queue)
371 372
{
	struct efx_nic *efx = tx_queue->efx;
B
Ben Hutchings 已提交
373
	struct efx_loopback_state *state = efx->loopback_selftest;
374 375
	struct efx_loopback_payload *payload;
	struct sk_buff *skb;
376 377
	int i;
	netdev_tx_t rc;
378 379 380

	/* Transmit N copies of buffer */
	for (i = 0; i < state->packet_count; i++) {
B
Ben Hutchings 已提交
381
		/* Allocate an skb, holding an extra reference for
382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399
		 * 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();

400
		netif_tx_lock_bh(efx->net_dev);
401
		rc = efx_enqueue_skb(tx_queue, skb);
402
		netif_tx_unlock_bh(efx->net_dev);
403 404

		if (rc != NETDEV_TX_OK) {
405 406 407 408 409
			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));
410 411 412 413 414 415 416 417 418 419

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

	return 0;
}

B
Ben Hutchings 已提交
420 421
static int efx_poll_loopback(struct efx_nic *efx)
{
B
Ben Hutchings 已提交
422
	struct efx_loopback_state *state = efx->loopback_selftest;
B
Ben Hutchings 已提交
423 424 425 426
	struct efx_channel *channel;

	/* NAPI polling is not enabled, so process channels
	 * synchronously */
427
	efx_for_each_channel(channel, efx) {
B
Ben Hutchings 已提交
428 429 430 431 432 433 434 435
		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)
436 437
{
	struct efx_nic *efx = tx_queue->efx;
B
Ben Hutchings 已提交
438
	struct efx_loopback_state *state = efx->loopback_selftest;
439 440 441 442
	struct sk_buff *skb;
	int tx_done = 0, rx_good, rx_bad;
	int i, rc = 0;

443
	netif_tx_lock_bh(efx->net_dev);
444 445 446

	/* Count the number of tx completions, and decrement the refcnt. Any
	 * skbs not already completed will be free'd when the queue is flushed */
447
	for (i = 0; i < state->packet_count; i++) {
448 449 450 451 452 453
		skb = state->skbs[i];
		if (skb && !skb_shared(skb))
			++tx_done;
		dev_kfree_skb_any(skb);
	}

454
	netif_tx_unlock_bh(efx->net_dev);
455 456 457 458 459 460 461 462

	/* 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.
		 */
463 464 465 466 467
		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));
468 469 470 471 472 473
		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) {
474 475 476 477 478
		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));
479 480 481 482 483 484 485 486 487 488 489 490 491 492 493 494 495 496
		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 已提交
497
	struct efx_loopback_state *state = efx->loopback_selftest;
B
Ben Hutchings 已提交
498
	int i, begin_rc, end_rc;
499

B
Ben Hutchings 已提交
500
	for (i = 0; i < 3; i++) {
501
		/* Determine how many packets to send */
502
		state->packet_count = efx->txq_entries / 3;
503
		state->packet_count = min(1 << (i << 2), state->packet_count);
504 505
		state->skbs = kcalloc(state->packet_count,
				      sizeof(state->skbs[0]), GFP_KERNEL);
506 507
		if (!state->skbs)
			return -ENOMEM;
508
		state->flush = false;
509

510 511 512 513
		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);
514 515

		efx_iterate_state(efx);
B
Ben Hutchings 已提交
516 517 518 519 520 521 522 523
		begin_rc = efx_begin_loopback(tx_queue);

		/* This will normally complete very quickly, but be
		 * prepared to wait up to 100 ms. */
		msleep(1);
		if (!efx_poll_loopback(efx)) {
			msleep(100);
			efx_poll_loopback(efx);
524 525
		}

B
Ben Hutchings 已提交
526
		end_rc = efx_end_loopback(tx_queue, lb_tests);
527 528
		kfree(state->skbs);

B
Ben Hutchings 已提交
529
		if (begin_rc || end_rc) {
530 531 532
			/* Wait a while to ensure there are no packets
			 * floating around after a failure. */
			schedule_timeout_uninterruptible(HZ / 10);
B
Ben Hutchings 已提交
533
			return begin_rc ? begin_rc : end_rc;
534 535 536
		}
	}

537 538 539 540
	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);
541

542
	return 0;
543 544
}

545 546 547 548 549 550 551
/* 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;
552
	int count, link_up_count = 0;
553 554 555 556 557 558 559 560 561 562
	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 {
563
			struct efx_channel *channel = efx_get_channel(efx, 0);
564 565 566 567 568 569 570
			if (channel->work_pending)
				efx_process_channel_now(channel);
		}

		mutex_lock(&efx->mac_lock);
		link_up = link_state->up;
		if (link_up)
571
			link_up = !efx->type->check_mac_fault(efx);
572 573
		mutex_unlock(&efx->mac_lock);

574 575 576 577 578 579
		if (link_up) {
			if (++link_up_count == 2)
				return 0;
		} else {
			link_up_count = 0;
		}
580 581 582 583 584
	}

	return -ETIMEDOUT;
}

585
static int efx_test_loopbacks(struct efx_nic *efx, struct efx_self_tests *tests,
586 587
			      unsigned int loopback_modes)
{
B
Ben Hutchings 已提交
588 589
	enum efx_loopback_mode mode;
	struct efx_loopback_state *state;
590
	struct efx_channel *channel = efx_get_channel(efx, 0);
591
	struct efx_tx_queue *tx_queue;
592
	int rc = 0;
593

B
Ben Hutchings 已提交
594 595 596 597 598 599 600 601 602
	/* 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;
603 604

	/* Test all supported loopback modes */
B
Ben Hutchings 已提交
605
	for (mode = LOOPBACK_NONE; mode <= LOOPBACK_TEST_MAX; mode++) {
606 607 608 609
		if (!(loopback_modes & (1 << mode)))
			continue;

		/* Move the port into the specified loopback mode. */
610
		state->flush = true;
611
		mutex_lock(&efx->mac_lock);
612
		efx->loopback_mode = mode;
613 614 615
		rc = __efx_reconfigure_port(efx);
		mutex_unlock(&efx->mac_lock);
		if (rc) {
616 617 618
			netif_err(efx, drv, efx->net_dev,
				  "unable to move into %s loopback\n",
				  LOOPBACK_MODE(efx));
619 620
			goto out;
		}
621

622 623
		rc = efx_wait_for_link(efx);
		if (rc) {
624 625 626
			netif_err(efx, drv, efx->net_dev,
				  "loopback %s never came up\n",
				  LOOPBACK_MODE(efx));
627 628 629
			goto out;
		}

630
		/* Test all enabled types of TX queue */
631
		efx_for_each_channel_tx_queue(tx_queue, channel) {
B
Ben Hutchings 已提交
632 633
			state->offload_csum = (tx_queue->queue &
					       EFX_TXQ_TYPE_OFFLOAD);
B
Ben Hutchings 已提交
634 635
			rc = efx_test_loopback(tx_queue,
					       &tests->loopback[mode]);
636 637 638 639 640 641
			if (rc)
				goto out;
		}
	}

 out:
B
Ben Hutchings 已提交
642
	/* Remove the flush. The caller will remove the loopback setting */
643
	state->flush = true;
B
Ben Hutchings 已提交
644 645 646
	efx->loopback_selftest = NULL;
	wmb();
	kfree(state);
647 648 649 650 651 652

	return rc;
}

/**************************************************************************
 *
653
 * Entry point
654 655 656
 *
 *************************************************************************/

657 658
int efx_selftest(struct efx_nic *efx, struct efx_self_tests *tests,
		 unsigned flags)
659
{
660 661
	enum efx_loopback_mode loopback_mode = efx->loopback_mode;
	int phy_mode = efx->phy_mode;
662
	enum reset_type reset_method = RESET_TYPE_INVISIBLE;
663
	struct efx_channel *channel;
664 665 666 667
	int rc_test = 0, rc_reset = 0, rc;

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

669
	rc = efx_test_phy_alive(efx, tests);
670 671
	if (rc && !rc_test)
		rc_test = rc;
B
Ben Hutchings 已提交
672 673

	rc = efx_test_nvram(efx, tests);
674 675
	if (rc && !rc_test)
		rc_test = rc;
676

B
Ben Hutchings 已提交
677
	rc = efx_test_interrupts(efx, tests);
678 679
	if (rc && !rc_test)
		rc_test = rc;
B
Ben Hutchings 已提交
680

681
	efx_for_each_channel(channel, efx) {
682
		rc = efx_test_eventq_irq(channel, tests);
683 684
		if (rc && !rc_test)
			rc_test = rc;
685
	}
B
Ben Hutchings 已提交
686

687 688
	if (rc_test)
		return rc_test;
689

690
	if (!(flags & ETH_TEST_FL_OFFLINE))
691
		return efx_test_phy(efx, tests, flags);
692 693 694

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

696 697
	/* Detach the device so the kernel doesn't transmit during the
	 * loopback test and the watchdog timeout doesn't fire.
B
Ben Hutchings 已提交
698
	 */
699 700
	netif_device_detach(efx->net_dev);

B
Ben Hutchings 已提交
701
	mutex_lock(&efx->mac_lock);
B
Ben Hutchings 已提交
702 703 704 705 706 707 708 709 710
	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 已提交
711 712 713 714
	__efx_reconfigure_port(efx);
	mutex_unlock(&efx->mac_lock);

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

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

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

724 725 726
	/* 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 已提交
727
	efx->loopback_mode = LOOPBACK_NONE;
728

B
Ben Hutchings 已提交
729
	rc = efx_reset_up(efx, reset_method, rc_reset == 0);
730 731 732 733
	if (rc && !rc_reset)
		rc_reset = rc;

	if (rc_reset) {
734 735
		netif_err(efx, drv, efx->net_dev,
			  "Unable to recover from chip test\n");
B
Ben Hutchings 已提交
736
		efx_schedule_reset(efx, RESET_TYPE_DISABLE);
737
		return rc_reset;
B
Ben Hutchings 已提交
738
	}
739

740
	rc = efx_test_phy(efx, tests, flags);
741 742
	if (rc && !rc_test)
		rc_test = rc;
743

744 745 746
	rc = efx_test_loopbacks(efx, tests, efx->loopback_modes);
	if (rc && !rc_test)
		rc_test = rc;
747

B
Ben Hutchings 已提交
748
	/* restore the PHY to the previous state */
B
Ben Hutchings 已提交
749
	mutex_lock(&efx->mac_lock);
B
Ben Hutchings 已提交
750
	efx->phy_mode = phy_mode;
B
Ben Hutchings 已提交
751 752 753
	efx->loopback_mode = loopback_mode;
	__efx_reconfigure_port(efx);
	mutex_unlock(&efx->mac_lock);
B
Ben Hutchings 已提交
754

755
	netif_device_attach(efx->net_dev);
756

757
	return rc_test;
758 759
}