diff options
Diffstat (limited to 'drivers/net/sfc/selftest.c')
| -rw-r--r-- | drivers/net/sfc/selftest.c | 154 | 
1 files changed, 86 insertions, 68 deletions
diff --git a/drivers/net/sfc/selftest.c b/drivers/net/sfc/selftest.c index 371e86cc090..85f015f005d 100644 --- a/drivers/net/sfc/selftest.c +++ b/drivers/net/sfc/selftest.c @@ -38,7 +38,7 @@ struct efx_loopback_payload {  	struct udphdr udp;  	__be16 iteration;  	const char msg[64]; -} __attribute__ ((packed)); +} __packed;  /* Loopback test source MAC address */  static const unsigned char payload_source[ETH_ALEN] = { @@ -123,7 +123,7 @@ static int efx_test_interrupts(struct efx_nic *efx,  {  	struct efx_channel *channel; -	EFX_LOG(efx, "testing interrupts\n"); +	netif_dbg(efx, drv, efx->net_dev, "testing interrupts\n");  	tests->interrupt = -1;  	/* Reset interrupt flag */ @@ -142,16 +142,17 @@ static int efx_test_interrupts(struct efx_nic *efx,  	efx_nic_generate_interrupt(efx);  	/* Wait for arrival of test interrupt. */ -	EFX_LOG(efx, "waiting for test interrupt\n"); +	netif_dbg(efx, drv, efx->net_dev, "waiting for test interrupt\n");  	schedule_timeout_uninterruptible(HZ / 10);  	if (efx->last_irq_cpu >= 0)  		goto success; -	EFX_ERR(efx, "timed out waiting for interrupt\n"); +	netif_err(efx, drv, efx->net_dev, "timed out waiting for interrupt\n");  	return -ETIMEDOUT;   success: -	EFX_LOG(efx, "%s test interrupt seen on CPU%d\n", INT_MODE(efx), +	netif_dbg(efx, drv, efx->net_dev, "%s test interrupt seen on CPU%d\n", +		  INT_MODE(efx),  		efx->last_irq_cpu);  	tests->interrupt = 1;  	return 0; @@ -161,23 +162,18 @@ static int efx_test_interrupts(struct efx_nic *efx,  static int efx_test_eventq_irq(struct efx_channel *channel,  			       struct efx_self_tests *tests)  { -	unsigned int magic, count; - -	/* Channel specific code, limited to 20 bits */ -	magic = (0x00010150 + channel->channel); -	EFX_LOG(channel->efx, "channel %d testing event queue with code %x\n", -		channel->channel, magic); +	struct efx_nic *efx = channel->efx; +	unsigned int magic_count, count;  	tests->eventq_dma[channel->channel] = -1;  	tests->eventq_int[channel->channel] = -1;  	tests->eventq_poll[channel->channel] = -1; -	/* Reset flag and zero magic word */ +	magic_count = channel->magic_count;  	channel->efx->last_irq_cpu = -1; -	channel->eventq_magic = 0;  	smp_wmb(); -	efx_nic_generate_test_event(channel, magic); +	efx_nic_generate_test_event(channel);  	/* Wait for arrival of interrupt */  	count = 0; @@ -187,33 +183,36 @@ static int efx_test_eventq_irq(struct efx_channel *channel,  		if (channel->work_pending)  			efx_process_channel_now(channel); -		if (channel->eventq_magic == magic) +		if (channel->magic_count != magic_count)  			goto eventq_ok;  	} while (++count < 2); -	EFX_ERR(channel->efx, "channel %d timed out waiting for event queue\n", -		channel->channel); +	netif_err(efx, drv, efx->net_dev, +		  "channel %d timed out waiting for event queue\n", +		  channel->channel);  	/* See if interrupt arrived */  	if (channel->efx->last_irq_cpu >= 0) { -		EFX_ERR(channel->efx, "channel %d saw interrupt on CPU%d " -			"during event queue test\n", channel->channel, -			raw_smp_processor_id()); +		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());  		tests->eventq_int[channel->channel] = 1;  	}  	/* Check to see if event was received even if interrupt wasn't */  	efx_process_channel_now(channel); -	if (channel->eventq_magic == magic) { -		EFX_ERR(channel->efx, "channel %d event was generated, but " -			"failed to trigger an interrupt\n", channel->channel); +	if (channel->magic_count != magic_count) { +		netif_err(efx, drv, efx->net_dev, +			  "channel %d event was generated, but " +			  "failed to trigger an interrupt\n", channel->channel);  		tests->eventq_dma[channel->channel] = 1;  	}  	return -ETIMEDOUT;   eventq_ok: -	EFX_LOG(channel->efx, "channel %d event queue passed\n", -		channel->channel); +	netif_dbg(efx, drv, efx->net_dev, "channel %d event queue passed\n", +		  channel->channel);  	tests->eventq_dma[channel->channel] = 1;  	tests->eventq_int[channel->channel] = 1;  	tests->eventq_poll[channel->channel] = 1; @@ -266,51 +265,57 @@ void efx_loopback_rx_packet(struct efx_nic *efx,  	/* Check that header exists */  	if (pkt_len < sizeof(received->header)) { -		EFX_ERR(efx, "saw runt RX packet (length %d) in %s loopback " -			"test\n", pkt_len, LOOPBACK_MODE(efx)); +		netif_err(efx, drv, efx->net_dev, +			  "saw runt RX packet (length %d) in %s loopback " +			  "test\n", pkt_len, LOOPBACK_MODE(efx));  		goto err;  	}  	/* Check that the ethernet header exists */  	if (memcmp(&received->header, &payload->header, ETH_HLEN) != 0) { -		EFX_ERR(efx, "saw non-loopback RX packet in %s loopback test\n", -			LOOPBACK_MODE(efx)); +		netif_err(efx, drv, efx->net_dev, +			  "saw non-loopback RX packet in %s loopback test\n", +			  LOOPBACK_MODE(efx));  		goto err;  	}  	/* Check packet length */  	if (pkt_len != sizeof(*payload)) { -		EFX_ERR(efx, "saw incorrect RX packet length %d (wanted %d) in " -			"%s loopback test\n", pkt_len, (int)sizeof(*payload), -			LOOPBACK_MODE(efx)); +		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));  		goto err;  	}  	/* Check that IP header matches */  	if (memcmp(&received->ip, &payload->ip, sizeof(payload->ip)) != 0) { -		EFX_ERR(efx, "saw corrupted IP header in %s loopback test\n", -			LOOPBACK_MODE(efx)); +		netif_err(efx, drv, efx->net_dev, +			  "saw corrupted IP header in %s loopback test\n", +			  LOOPBACK_MODE(efx));  		goto err;  	}  	/* Check that msg and padding matches */  	if (memcmp(&received->msg, &payload->msg, sizeof(received->msg)) != 0) { -		EFX_ERR(efx, "saw corrupted RX packet in %s loopback test\n", -			LOOPBACK_MODE(efx)); +		netif_err(efx, drv, efx->net_dev, +			  "saw corrupted RX packet in %s loopback test\n", +			  LOOPBACK_MODE(efx));  		goto err;  	}  	/* Check that iteration matches */  	if (received->iteration != payload->iteration) { -		EFX_ERR(efx, "saw RX packet from iteration %d (wanted %d) in " -			"%s loopback test\n", ntohs(received->iteration), -			ntohs(payload->iteration), LOOPBACK_MODE(efx)); +		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));  		goto err;  	}  	/* Increase correct RX count */ -	EFX_TRACE(efx, "got loopback RX in %s loopback test\n", -		  LOOPBACK_MODE(efx)); +	netif_vdbg(efx, drv, efx->net_dev, +		   "got loopback RX in %s loopback test\n", LOOPBACK_MODE(efx));  	atomic_inc(&state->rx_good);  	return; @@ -318,10 +323,10 @@ void efx_loopback_rx_packet(struct efx_nic *efx,   err:  #ifdef EFX_ENABLE_DEBUG  	if (atomic_read(&state->rx_bad) == 0) { -		EFX_ERR(efx, "received packet:\n"); +		netif_err(efx, drv, efx->net_dev, "received packet:\n");  		print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 0x10, 1,  			       buf_ptr, pkt_len, 0); -		EFX_ERR(efx, "expected packet:\n"); +		netif_err(efx, drv, efx->net_dev, "expected packet:\n");  		print_hex_dump(KERN_ERR, "", DUMP_PREFIX_OFFSET, 0x10, 1,  			       &state->payload, sizeof(state->payload), 0);  	} @@ -402,9 +407,11 @@ static int efx_begin_loopback(struct efx_tx_queue *tx_queue)  			netif_tx_unlock_bh(efx->net_dev);  		if (rc != NETDEV_TX_OK) { -			EFX_ERR(efx, "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)); +			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));  			/* Defer cleaning up the other skbs for the caller */  			kfree_skb(skb); @@ -460,20 +467,22 @@ static int efx_end_loopback(struct efx_tx_queue *tx_queue,  		/* Don't free the skbs; they will be picked up on TX  		 * overflow or channel teardown.  		 */ -		EFX_ERR(efx, "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)); +		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));  		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) { -		EFX_LOG(efx, "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)); +		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));  		rc = -ETIMEDOUT;  		/* Fall through */  	} @@ -505,9 +514,10 @@ efx_test_loopback(struct efx_tx_queue *tx_queue,  			return -ENOMEM;  		state->flush = false; -		EFX_LOG(efx, "TX queue %d testing %s loopback with %d " -			"packets\n", tx_queue->queue, LOOPBACK_MODE(efx), -			state->packet_count); +		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);  		efx_iterate_state(efx);  		begin_rc = efx_begin_loopback(tx_queue); @@ -531,9 +541,10 @@ efx_test_loopback(struct efx_tx_queue *tx_queue,  		}  	} -	EFX_LOG(efx, "TX queue %d passed %s loopback test with a burst length " -		"of %d packets\n", tx_queue->queue, LOOPBACK_MODE(efx), -		state->packet_count); +	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);  	return 0;  } @@ -545,7 +556,7 @@ efx_test_loopback(struct efx_tx_queue *tx_queue,  static int efx_wait_for_link(struct efx_nic *efx)  {  	struct efx_link_state *link_state = &efx->link_state; -	int count; +	int count, link_up_count = 0;  	bool link_up;  	for (count = 0; count < 40; count++) { @@ -567,8 +578,12 @@ static int efx_wait_for_link(struct efx_nic *efx)  			link_up = !efx->mac_op->check_fault(efx);  		mutex_unlock(&efx->mac_lock); -		if (link_up) -			return 0; +		if (link_up) { +			if (++link_up_count == 2) +				return 0; +		} else { +			link_up_count = 0; +		}  	}  	return -ETIMEDOUT; @@ -604,15 +619,17 @@ static int efx_test_loopbacks(struct efx_nic *efx, struct efx_self_tests *tests,  		rc = __efx_reconfigure_port(efx);  		mutex_unlock(&efx->mac_lock);  		if (rc) { -			EFX_ERR(efx, "unable to move into %s loopback\n", -				LOOPBACK_MODE(efx)); +			netif_err(efx, drv, efx->net_dev, +				  "unable to move into %s loopback\n", +				  LOOPBACK_MODE(efx));  			goto out;  		}  		rc = efx_wait_for_link(efx);  		if (rc) { -			EFX_ERR(efx, "loopback %s never came up\n", -				LOOPBACK_MODE(efx)); +			netif_err(efx, drv, efx->net_dev, +				  "loopback %s never came up\n", +				  LOOPBACK_MODE(efx));  			goto out;  		} @@ -720,7 +737,8 @@ int efx_selftest(struct efx_nic *efx, struct efx_self_tests *tests,  		rc_reset = rc;  	if (rc_reset) { -		EFX_ERR(efx, "Unable to recover from chip test\n"); +		netif_err(efx, drv, efx->net_dev, +			  "Unable to recover from chip test\n");  		efx_schedule_reset(efx, RESET_TYPE_DISABLE);  		return rc_reset;  	}  |