Lines Matching +full:no +full:- +full:loopback +full:- +full:test

1 // SPDX-License-Identifier: GPL-2.0-only
4 * Copyright 2005-2006 Fen Systems Ltd.
5 * Copyright 2006-2012 Solarflare Communications Inc.
26 * - All IRQs may be disabled on a CPU for a *long* time by e.g. a
28 * - The PREEMPT_RT patches mostly deal with this, but also allow a
36 * Loopback test packet structure
38 * The self-test should stress every RSS vector, and unfortunately
49 /* Loopback test source MAC address */
55 "Hello world! This is an Efx loopback test in progress!";
60 [EF4_INT_MODE_MSIX] = "MSI-X",
65 STRING_TABLE_LOOKUP(efx->interrupt_mode, ef4_interrupt_mode)
68 * struct ef4_loopback_state - persistent state during a loopback selftest
70 * @packet_count: Number of packets being used in this test
100 if (efx->phy_op->test_alive) { in ef4_test_phy_alive()
101 rc = efx->phy_op->test_alive(efx); in ef4_test_phy_alive()
102 tests->phy_alive = rc ? -1 : 1; in ef4_test_phy_alive()
112 if (efx->type->test_nvram) { in ef4_test_nvram()
113 rc = efx->type->test_nvram(efx); in ef4_test_nvram()
114 if (rc == -EPERM) in ef4_test_nvram()
117 tests->nvram = rc ? -1 : 1; in ef4_test_nvram()
129 /* Test generation and receipt of interrupts */
137 netif_dbg(efx, drv, efx->net_dev, "testing interrupts\n"); in ef4_test_interrupts()
138 tests->interrupt = -1; in ef4_test_interrupts()
141 if (rc == -ENOTSUPP) { in ef4_test_interrupts()
142 netif_dbg(efx, drv, efx->net_dev, in ef4_test_interrupts()
144 tests->interrupt = 0; in ef4_test_interrupts()
151 /* Wait for arrival of test interrupt. */ in ef4_test_interrupts()
152 netif_dbg(efx, drv, efx->net_dev, "waiting for test interrupt\n"); in ef4_test_interrupts()
161 netif_err(efx, drv, efx->net_dev, "timed out waiting for interrupt\n"); in ef4_test_interrupts()
162 return -ETIMEDOUT; in ef4_test_interrupts()
165 netif_dbg(efx, drv, efx->net_dev, "%s test interrupt seen on CPU%d\n", in ef4_test_interrupts()
167 tests->interrupt = 1; in ef4_test_interrupts()
171 /* Test generation and receipt of interrupting events */
183 read_ptr[channel->channel] = channel->eventq_read_ptr; in ef4_test_eventq_irq()
184 set_bit(channel->channel, &dma_pend); in ef4_test_eventq_irq()
185 set_bit(channel->channel, &int_pend); in ef4_test_eventq_irq()
200 if (channel->eventq_read_ptr != in ef4_test_eventq_irq()
201 read_ptr[channel->channel]) { in ef4_test_eventq_irq()
202 set_bit(channel->channel, &napi_ran); in ef4_test_eventq_irq()
203 clear_bit(channel->channel, &dma_pend); in ef4_test_eventq_irq()
204 clear_bit(channel->channel, &int_pend); in ef4_test_eventq_irq()
207 clear_bit(channel->channel, &dma_pend); in ef4_test_eventq_irq()
209 clear_bit(channel->channel, &int_pend); in ef4_test_eventq_irq()
218 bool dma_seen = !test_bit(channel->channel, &dma_pend); in ef4_test_eventq_irq()
219 bool int_seen = !test_bit(channel->channel, &int_pend); in ef4_test_eventq_irq()
221 tests->eventq_dma[channel->channel] = dma_seen ? 1 : -1; in ef4_test_eventq_irq()
222 tests->eventq_int[channel->channel] = int_seen ? 1 : -1; in ef4_test_eventq_irq()
225 netif_dbg(efx, drv, efx->net_dev, in ef4_test_eventq_irq()
227 channel->channel, in ef4_test_eventq_irq()
228 test_bit(channel->channel, &napi_ran) ? in ef4_test_eventq_irq()
234 netif_err(efx, drv, efx->net_dev, in ef4_test_eventq_irq()
236 channel->channel); in ef4_test_eventq_irq()
238 netif_err(efx, drv, efx->net_dev, in ef4_test_eventq_irq()
240 "during event queue test\n", in ef4_test_eventq_irq()
241 channel->channel); in ef4_test_eventq_irq()
243 netif_err(efx, drv, efx->net_dev, in ef4_test_eventq_irq()
246 channel->channel); in ef4_test_eventq_irq()
250 return (dma_pend || int_pend) ? -ETIMEDOUT : 0; in ef4_test_eventq_irq()
258 if (!efx->phy_op->run_tests) in ef4_test_phy()
261 mutex_lock(&efx->mac_lock); in ef4_test_phy()
262 rc = efx->phy_op->run_tests(efx, tests->phy_ext, flags); in ef4_test_phy()
263 mutex_unlock(&efx->mac_lock); in ef4_test_phy()
264 if (rc == -EPERM) in ef4_test_phy()
267 netif_info(efx, drv, efx->net_dev, in ef4_test_phy()
275 * Loopback testing
276 * NB Only one loopback test can be executing concurrently.
280 /* Loopback test RX callback
281 * This is called for each received packet during loopback testing.
286 struct ef4_loopback_state *state = efx->loopback_selftest; in ef4_loopback_rx_packet()
293 if ((state == NULL) || state->flush) in ef4_loopback_rx_packet()
296 payload = &state->payload; in ef4_loopback_rx_packet()
299 received->ip.saddr = payload->ip.saddr; in ef4_loopback_rx_packet()
300 if (state->offload_csum) in ef4_loopback_rx_packet()
301 received->ip.check = payload->ip.check; in ef4_loopback_rx_packet()
304 if (pkt_len < sizeof(received->header)) { in ef4_loopback_rx_packet()
305 netif_err(efx, drv, efx->net_dev, in ef4_loopback_rx_packet()
306 "saw runt RX packet (length %d) in %s loopback " in ef4_loopback_rx_packet()
307 "test\n", pkt_len, LOOPBACK_MODE(efx)); in ef4_loopback_rx_packet()
312 if (memcmp(&received->header, &payload->header, ETH_HLEN) != 0) { in ef4_loopback_rx_packet()
313 netif_err(efx, drv, efx->net_dev, in ef4_loopback_rx_packet()
314 "saw non-loopback RX packet in %s loopback test\n", in ef4_loopback_rx_packet()
321 netif_err(efx, drv, efx->net_dev, in ef4_loopback_rx_packet()
323 "%s loopback test\n", pkt_len, (int)sizeof(*payload), in ef4_loopback_rx_packet()
329 if (memcmp(&received->ip, &payload->ip, sizeof(payload->ip)) != 0) { in ef4_loopback_rx_packet()
330 netif_err(efx, drv, efx->net_dev, in ef4_loopback_rx_packet()
331 "saw corrupted IP header in %s loopback test\n", in ef4_loopback_rx_packet()
337 if (memcmp(&received->msg, &payload->msg, sizeof(received->msg)) != 0) { in ef4_loopback_rx_packet()
338 netif_err(efx, drv, efx->net_dev, in ef4_loopback_rx_packet()
339 "saw corrupted RX packet in %s loopback test\n", in ef4_loopback_rx_packet()
345 if (received->iteration != payload->iteration) { in ef4_loopback_rx_packet()
346 netif_err(efx, drv, efx->net_dev, in ef4_loopback_rx_packet()
348 "%s loopback test\n", ntohs(received->iteration), in ef4_loopback_rx_packet()
349 ntohs(payload->iteration), LOOPBACK_MODE(efx)); in ef4_loopback_rx_packet()
354 netif_vdbg(efx, drv, efx->net_dev, in ef4_loopback_rx_packet()
355 "got loopback RX in %s loopback test\n", LOOPBACK_MODE(efx)); in ef4_loopback_rx_packet()
357 atomic_inc(&state->rx_good); in ef4_loopback_rx_packet()
362 if (atomic_read(&state->rx_bad) == 0) { in ef4_loopback_rx_packet()
363 netif_err(efx, drv, efx->net_dev, "received packet:\n"); in ef4_loopback_rx_packet()
366 netif_err(efx, drv, efx->net_dev, "expected packet:\n"); in ef4_loopback_rx_packet()
368 &state->payload, sizeof(state->payload), 0); in ef4_loopback_rx_packet()
371 atomic_inc(&state->rx_bad); in ef4_loopback_rx_packet()
377 struct ef4_loopback_state *state = efx->loopback_selftest; in ef4_iterate_state()
378 struct net_device *net_dev = efx->net_dev; in ef4_iterate_state()
379 struct ef4_loopback_payload *payload = &state->payload; in ef4_iterate_state()
382 ether_addr_copy((u8 *)&payload->header.h_dest, net_dev->dev_addr); in ef4_iterate_state()
383 ether_addr_copy((u8 *)&payload->header.h_source, payload_source); in ef4_iterate_state()
384 payload->header.h_proto = htons(ETH_P_IP); in ef4_iterate_state()
387 payload->ip.daddr = htonl(INADDR_LOOPBACK); in ef4_iterate_state()
388 payload->ip.ihl = 5; in ef4_iterate_state()
389 payload->ip.check = (__force __sum16) htons(0xdead); in ef4_iterate_state()
390 payload->ip.tot_len = htons(sizeof(*payload) - sizeof(struct ethhdr)); in ef4_iterate_state()
391 payload->ip.version = IPVERSION; in ef4_iterate_state()
392 payload->ip.protocol = IPPROTO_UDP; in ef4_iterate_state()
395 payload->udp.source = 0; in ef4_iterate_state()
396 payload->udp.len = htons(sizeof(*payload) - sizeof(struct ethhdr) - in ef4_iterate_state()
398 payload->udp.check = 0; /* checksum ignored */ in ef4_iterate_state()
401 payload->iteration = htons(ntohs(payload->iteration) + 1); in ef4_iterate_state()
402 memcpy(&payload->msg, payload_msg, sizeof(payload_msg)); in ef4_iterate_state()
405 atomic_set(&state->rx_good, 0); in ef4_iterate_state()
406 atomic_set(&state->rx_bad, 0); in ef4_iterate_state()
412 struct ef4_nic *efx = tx_queue->efx; in ef4_begin_loopback()
413 struct ef4_loopback_state *state = efx->loopback_selftest; in ef4_begin_loopback()
420 for (i = 0; i < state->packet_count; i++) { in ef4_begin_loopback()
423 skb = alloc_skb(sizeof(state->payload), GFP_KERNEL); in ef4_begin_loopback()
425 return -ENOMEM; in ef4_begin_loopback()
426 state->skbs[i] = skb; in ef4_begin_loopback()
431 payload = skb_put(skb, sizeof(state->payload)); in ef4_begin_loopback()
432 memcpy(payload, &state->payload, sizeof(state->payload)); in ef4_begin_loopback()
433 payload->ip.saddr = htonl(INADDR_LOOPBACK | (i << 2)); in ef4_begin_loopback()
439 netif_tx_lock_bh(efx->net_dev); in ef4_begin_loopback()
441 netif_tx_unlock_bh(efx->net_dev); in ef4_begin_loopback()
444 netif_err(efx, drv, efx->net_dev, in ef4_begin_loopback()
446 "%d in %s loopback test\n", tx_queue->queue, in ef4_begin_loopback()
447 i + 1, state->packet_count, in ef4_begin_loopback()
452 return -EPIPE; in ef4_begin_loopback()
461 struct ef4_loopback_state *state = efx->loopback_selftest; in ef4_poll_loopback()
463 return atomic_read(&state->rx_good) == state->packet_count; in ef4_poll_loopback()
469 struct ef4_nic *efx = tx_queue->efx; in ef4_end_loopback()
470 struct ef4_loopback_state *state = efx->loopback_selftest; in ef4_end_loopback()
475 netif_tx_lock_bh(efx->net_dev); in ef4_end_loopback()
479 for (i = 0; i < state->packet_count; i++) { in ef4_end_loopback()
480 skb = state->skbs[i]; in ef4_end_loopback()
486 netif_tx_unlock_bh(efx->net_dev); in ef4_end_loopback()
489 rx_good = atomic_read(&state->rx_good); in ef4_end_loopback()
490 rx_bad = atomic_read(&state->rx_bad); in ef4_end_loopback()
491 if (tx_done != state->packet_count) { in ef4_end_loopback()
495 netif_err(efx, drv, efx->net_dev, in ef4_end_loopback()
497 "TX completion events in %s loopback test\n", in ef4_end_loopback()
498 tx_queue->queue, tx_done, state->packet_count, in ef4_end_loopback()
500 rc = -ETIMEDOUT; in ef4_end_loopback()
505 if (rx_good != state->packet_count) { in ef4_end_loopback()
506 netif_dbg(efx, drv, efx->net_dev, in ef4_end_loopback()
508 "received packets in %s loopback test\n", in ef4_end_loopback()
509 tx_queue->queue, rx_good, state->packet_count, in ef4_end_loopback()
511 rc = -ETIMEDOUT; in ef4_end_loopback()
515 /* Update loopback test structure */ in ef4_end_loopback()
516 lb_tests->tx_sent[tx_queue->queue] += state->packet_count; in ef4_end_loopback()
517 lb_tests->tx_done[tx_queue->queue] += tx_done; in ef4_end_loopback()
518 lb_tests->rx_good += rx_good; in ef4_end_loopback()
519 lb_tests->rx_bad += rx_bad; in ef4_end_loopback()
528 struct ef4_nic *efx = tx_queue->efx; in ef4_test_loopback()
529 struct ef4_loopback_state *state = efx->loopback_selftest; in ef4_test_loopback()
534 state->packet_count = efx->txq_entries / 3; in ef4_test_loopback()
535 state->packet_count = min(1 << (i << 2), state->packet_count); in ef4_test_loopback()
536 state->skbs = kcalloc(state->packet_count, in ef4_test_loopback()
537 sizeof(state->skbs[0]), GFP_KERNEL); in ef4_test_loopback()
538 if (!state->skbs) in ef4_test_loopback()
539 return -ENOMEM; in ef4_test_loopback()
540 state->flush = false; in ef4_test_loopback()
542 netif_dbg(efx, drv, efx->net_dev, in ef4_test_loopback()
543 "TX queue %d testing %s loopback with %d packets\n", in ef4_test_loopback()
544 tx_queue->queue, LOOPBACK_MODE(efx), in ef4_test_loopback()
545 state->packet_count); in ef4_test_loopback()
559 kfree(state->skbs); in ef4_test_loopback()
562 /* Wait a while to ensure there are no packets in ef4_test_loopback()
569 netif_dbg(efx, drv, efx->net_dev, in ef4_test_loopback()
570 "TX queue %d passed %s loopback test with a burst length " in ef4_test_loopback()
571 "of %d packets\n", tx_queue->queue, LOOPBACK_MODE(efx), in ef4_test_loopback()
572 state->packet_count); in ef4_test_loopback()
583 struct ef4_link_state *link_state = &efx->link_state; in ef4_wait_for_link()
590 if (efx->type->monitor != NULL) { in ef4_wait_for_link()
591 mutex_lock(&efx->mac_lock); in ef4_wait_for_link()
592 efx->type->monitor(efx); in ef4_wait_for_link()
593 mutex_unlock(&efx->mac_lock); in ef4_wait_for_link()
596 mutex_lock(&efx->mac_lock); in ef4_wait_for_link()
597 link_up = link_state->up; in ef4_wait_for_link()
599 link_up = !efx->type->check_mac_fault(efx); in ef4_wait_for_link()
600 mutex_unlock(&efx->mac_lock); in ef4_wait_for_link()
610 return -ETIMEDOUT; in ef4_wait_for_link()
619 ef4_get_channel(efx, efx->tx_channel_offset); in ef4_test_loopbacks()
628 return -ENOMEM; in ef4_test_loopbacks()
629 BUG_ON(efx->loopback_selftest); in ef4_test_loopbacks()
630 state->flush = true; in ef4_test_loopbacks()
631 efx->loopback_selftest = state; in ef4_test_loopbacks()
633 /* Test all supported loopback modes */ in ef4_test_loopbacks()
638 /* Move the port into the specified loopback mode. */ in ef4_test_loopbacks()
639 state->flush = true; in ef4_test_loopbacks()
640 mutex_lock(&efx->mac_lock); in ef4_test_loopbacks()
641 efx->loopback_mode = mode; in ef4_test_loopbacks()
643 mutex_unlock(&efx->mac_lock); in ef4_test_loopbacks()
645 netif_err(efx, drv, efx->net_dev, in ef4_test_loopbacks()
646 "unable to move into %s loopback\n", in ef4_test_loopbacks()
653 netif_err(efx, drv, efx->net_dev, in ef4_test_loopbacks()
654 "loopback %s never came up\n", in ef4_test_loopbacks()
659 /* Test all enabled types of TX queue */ in ef4_test_loopbacks()
661 state->offload_csum = (tx_queue->queue & in ef4_test_loopbacks()
664 &tests->loopback[mode]); in ef4_test_loopbacks()
671 /* Remove the flush. The caller will remove the loopback setting */ in ef4_test_loopbacks()
672 state->flush = true; in ef4_test_loopbacks()
673 efx->loopback_selftest = NULL; in ef4_test_loopbacks()
677 if (rc == -EPERM) in ef4_test_loopbacks()
692 enum ef4_loopback_mode loopback_mode = efx->loopback_mode; in ef4_selftest()
693 int phy_mode = efx->phy_mode; in ef4_selftest()
698 /* Online (i.e. non-disruptive) testing in ef4_selftest()
724 * This checks MAC and PHY loopback on the specified port. */ in ef4_selftest()
727 * loopback test and the watchdog timeout doesn't fire. in ef4_selftest()
731 if (efx->type->test_chip) { in ef4_selftest()
732 rc_reset = efx->type->test_chip(efx, tests); in ef4_selftest()
734 netif_err(efx, hw, efx->net_dev, in ef4_selftest()
735 "Unable to recover from chip test\n"); in ef4_selftest()
740 if ((tests->memory < 0 || tests->registers < 0) && !rc_test) in ef4_selftest()
741 rc_test = -EIO; in ef4_selftest()
744 /* Ensure that the phy is powered and out of loopback in ef4_selftest()
745 * for the bist and loopback tests */ in ef4_selftest()
746 mutex_lock(&efx->mac_lock); in ef4_selftest()
747 efx->phy_mode &= ~PHY_MODE_LOW_POWER; in ef4_selftest()
748 efx->loopback_mode = LOOPBACK_NONE; in ef4_selftest()
750 mutex_unlock(&efx->mac_lock); in ef4_selftest()
756 rc = ef4_test_loopbacks(efx, tests, efx->loopback_modes); in ef4_selftest()
761 mutex_lock(&efx->mac_lock); in ef4_selftest()
762 efx->phy_mode = phy_mode; in ef4_selftest()
763 efx->loopback_mode = loopback_mode; in ef4_selftest()
765 mutex_unlock(&efx->mac_lock); in ef4_selftest()
767 netif_device_attach(efx->net_dev); in ef4_selftest()
778 schedule_delayed_work(&efx->selftest_work, IRQ_TIMEOUT); in ef4_selftest_async_start()
783 cancel_delayed_work_sync(&efx->selftest_work); in ef4_selftest_async_cancel()
796 netif_err(efx, ifup, efx->net_dev, in ef4_selftest_async_work()
798 channel->channel); in ef4_selftest_async_work()
800 netif_dbg(efx, ifup, efx->net_dev, in ef4_selftest_async_work()
802 channel->channel, cpu); in ef4_selftest_async_work()