Lines Matching +full:wait +full:- +full:state

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
38 * The self-test should stress every RSS vector, and unfortunately
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
87 /* How long to wait for all the packets to arrive (in ms) */
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()
133 unsigned long timeout, wait; in ef4_test_interrupts() local
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()
149 wait = 1; 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()
154 schedule_timeout_uninterruptible(wait); in ef4_test_interrupts()
158 wait *= 2; 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()
178 unsigned long timeout, wait; in ef4_test_eventq_irq() local
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()
190 wait = 1; in ef4_test_eventq_irq()
192 /* Wait for arrival of interrupts. NAPI processing may or may in ef4_test_eventq_irq()
196 schedule_timeout_uninterruptible(wait); 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()
214 wait *= 2; 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()
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()
286 struct ef4_loopback_state *state = efx->loopback_selftest; in ef4_loopback_rx_packet() local
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()
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()
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()
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()
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()
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() local
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()
404 /* Fill out remaining state members */ 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() local
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() local
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() local
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()
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()
509 tx_queue->queue, rx_good, state->packet_count, in ef4_end_loopback()
511 rc = -ETIMEDOUT; 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() local
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()
544 tx_queue->queue, LOOPBACK_MODE(efx), in ef4_test_loopback()
545 state->packet_count); in ef4_test_loopback()
551 * prepared to wait much longer. */ 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()
571 "of %d packets\n", tx_queue->queue, LOOPBACK_MODE(efx), in ef4_test_loopback()
572 state->packet_count); in ef4_test_loopback()
577 /* Wait for link up. On Falcon, we would prefer to rely on ef4_monitor, but
579 * to delay and retry. Therefore, it's safer to just poll directly. Wait
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()
617 struct ef4_loopback_state *state; in ef4_test_loopbacks() local
619 ef4_get_channel(efx, efx->tx_channel_offset); in ef4_test_loopbacks()
624 * all received packets will be dropped. Mark the state as in ef4_test_loopbacks()
626 state = kzalloc(sizeof(*state), GFP_KERNEL); in ef4_test_loopbacks()
627 if (state == NULL) 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()
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()
653 netif_err(efx, drv, efx->net_dev, in ef4_test_loopbacks()
661 state->offload_csum = (tx_queue->queue & in ef4_test_loopbacks()
664 &tests->loopback[mode]); in ef4_test_loopbacks()
672 state->flush = true; in ef4_test_loopbacks()
673 efx->loopback_selftest = NULL; in ef4_test_loopbacks()
675 kfree(state); 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()
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()
740 if ((tests->memory < 0 || tests->registers < 0) && !rc_test) in ef4_selftest()
741 rc_test = -EIO; 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()
760 /* restore the PHY to the previous state */ 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()