selftest.c 20.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 24
#include <asm/io.h>
#include "net_driver.h"
#include "efx.h"
B
Ben Hutchings 已提交
25
#include "nic.h"
26 27 28 29 30 31 32 33 34 35 36 37 38 39 40
#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];
41
} __packed;
42 43 44 45 46 47

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

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

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

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

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

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

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

	return rc;
}

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

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

	return rc;
}

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

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

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

/**************************************************************************
 *
 * 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)
{
134
	netif_dbg(efx, drv, efx->net_dev, "testing interrupts\n");
135 136 137 138 139 140
	tests->interrupt = -1;

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

141
	efx_nic_generate_interrupt(efx);
142 143

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

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

 success:
153 154
	netif_dbg(efx, drv, efx->net_dev, "%s test interrupt seen on CPU%d\n",
		  INT_MODE(efx),
155
		efx->last_irq_cpu);
156 157 158 159 160 161 162 163
	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)
{
164
	struct efx_nic *efx = channel->efx;
165
	unsigned int read_ptr, count;
166 167 168 169 170

	tests->eventq_dma[channel->channel] = -1;
	tests->eventq_int[channel->channel] = -1;
	tests->eventq_poll[channel->channel] = -1;

171
	read_ptr = channel->eventq_read_ptr;
172 173 174
	channel->efx->last_irq_cpu = -1;
	smp_wmb();

175
	efx_nic_generate_test_event(channel);
176 177 178 179 180 181

	/* Wait for arrival of interrupt */
	count = 0;
	do {
		schedule_timeout_uninterruptible(HZ / 100);

182
		if (ACCESS_ONCE(channel->eventq_read_ptr) != read_ptr)
183 184 185
			goto eventq_ok;
	} while (++count < 2);

186 187 188
	netif_err(efx, drv, efx->net_dev,
		  "channel %d timed out waiting for event queue\n",
		  channel->channel);
189 190 191

	/* See if interrupt arrived */
	if (channel->efx->last_irq_cpu >= 0) {
192 193 194 195
		netif_err(efx, drv, efx->net_dev,
			  "channel %d saw interrupt on CPU%d "
			  "during event queue test\n", channel->channel,
			  raw_smp_processor_id());
196 197 198 199
		tests->eventq_int[channel->channel] = 1;
	}

	/* Check to see if event was received even if interrupt wasn't */
200
	if (efx_nic_event_present(channel)) {
201 202 203
		netif_err(efx, drv, efx->net_dev,
			  "channel %d event was generated, but "
			  "failed to trigger an interrupt\n", channel->channel);
204 205 206 207 208
		tests->eventq_dma[channel->channel] = 1;
	}

	return -ETIMEDOUT;
 eventq_ok:
209 210
	netif_dbg(efx, drv, efx->net_dev, "channel %d event queue passed\n",
		  channel->channel);
211 212 213 214 215 216
	tests->eventq_dma[channel->channel] = 1;
	tests->eventq_int[channel->channel] = 1;
	tests->eventq_poll[channel->channel] = 1;
	return 0;
}

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

222
	if (!efx->phy_op->run_tests)
223 224
		return 0;

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

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

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

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

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

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

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

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

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

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

	atomic_inc(&state->rx_good);
	return;

 err:
#ifdef EFX_ENABLE_DEBUG
	if (atomic_read(&state->rx_bad) == 0) {
321
		netif_err(efx, drv, efx->net_dev, "received packet:\n");
322 323
		print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 0x10, 1,
			       buf_ptr, pkt_len, 0);
324
		netif_err(efx, drv, efx->net_dev, "expected packet:\n");
325 326 327 328 329 330 331 332 333 334
		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 已提交
335
	struct efx_loopback_state *state = efx->loopback_selftest;
336 337 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
	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 已提交
368
static int efx_begin_loopback(struct efx_tx_queue *tx_queue)
369 370
{
	struct efx_nic *efx = tx_queue->efx;
B
Ben Hutchings 已提交
371
	struct efx_loopback_state *state = efx->loopback_selftest;
372 373
	struct efx_loopback_payload *payload;
	struct sk_buff *skb;
374 375
	int i;
	netdev_tx_t rc;
376 377 378

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

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

		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
	if (efx_dev_registered(efx))
444 445 446 447 448 449 450 451 452 453 454
		netif_tx_lock_bh(efx->net_dev);

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

455
	if (efx_dev_registered(efx))
456 457 458 459 460 461 462 463 464
		netif_tx_unlock_bh(efx->net_dev);

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

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

512 513 514 515
		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);
516 517

		efx_iterate_state(efx);
B
Ben Hutchings 已提交
518 519 520 521 522 523 524 525
		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);
526 527
		}

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

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

539 540 541 542
	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);
543

544
	return 0;
545 546
}

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

		mutex_lock(&efx->mac_lock);
		link_up = link_state->up;
		if (link_up)
			link_up = !efx->mac_op->check_fault(efx);
		mutex_unlock(&efx->mac_lock);

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

	return -ETIMEDOUT;
}

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

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

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

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

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

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

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

	return rc;
}

/**************************************************************************
 *
655
 * Entry point
656 657 658
 *
 *************************************************************************/

659 660
int efx_selftest(struct efx_nic *efx, struct efx_self_tests *tests,
		 unsigned flags)
661
{
662 663
	enum efx_loopback_mode loopback_mode = efx->loopback_mode;
	int phy_mode = efx->phy_mode;
664
	enum reset_type reset_method = RESET_TYPE_INVISIBLE;
665
	struct efx_channel *channel;
666 667 668 669
	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 已提交
670

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

	rc = efx_test_nvram(efx, tests);
676 677
	if (rc && !rc_test)
		rc_test = rc;
678

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

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

689 690
	if (rc_test)
		return rc_test;
691

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

	/* Offline (i.e. disruptive) testing
	 * This checks MAC and PHY loopback on the specified port. */
B
Ben Hutchings 已提交
697 698 699 700 701 702 703

	/* force the carrier state off so the kernel doesn't transmit during
	 * the loopback test, and the watchdog timeout doesn't fire. Also put
	 * falcon into loopback for the register test.
	 */
	mutex_lock(&efx->mac_lock);
	efx->port_inhibited = true;
B
Ben Hutchings 已提交
704 705 706 707 708 709 710 711 712
	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 已提交
713 714 715 716
	__efx_reconfigure_port(efx);
	mutex_unlock(&efx->mac_lock);

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

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

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

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

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

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

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

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

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

758 759
	netif_tx_wake_all_queues(efx->net_dev);

760
	return rc_test;
761 762
}