Lines Matching refs:efx
20 #include "efx.h"
72 #define INT_MODE(efx) \
73 STRING_TABLE_LOOKUP(efx->interrupt_mode, efx_siena_interrupt_mode)
104 static int efx_test_phy_alive(struct efx_nic *efx, struct efx_self_tests *tests)
108 rc = efx_siena_mcdi_phy_test_alive(efx);
114 static int efx_test_nvram(struct efx_nic *efx, struct efx_self_tests *tests)
118 if (efx->type->test_nvram) {
119 rc = efx->type->test_nvram(efx);
136 static int efx_test_interrupts(struct efx_nic *efx,
143 netif_dbg(efx, drv, efx->net_dev, "testing interrupts\n");
146 rc = efx_siena_irq_test_start(efx);
148 netif_dbg(efx, drv, efx->net_dev,
158 netif_dbg(efx, drv, efx->net_dev, "waiting for test interrupt\n");
161 cpu = efx_nic_irq_test_irq_cpu(efx);
167 netif_err(efx, drv, efx->net_dev, "timed out waiting for interrupt\n");
171 netif_dbg(efx, drv, efx->net_dev, "%s test interrupt seen on CPU%d\n",
172 INT_MODE(efx), cpu);
178 static int efx_test_eventq_irq(struct efx_nic *efx,
188 efx_for_each_channel(channel, efx) {
204 efx_for_each_channel(channel, efx) {
223 efx_for_each_channel(channel, efx) {
231 netif_dbg(efx, drv, efx->net_dev,
240 netif_err(efx, drv, efx->net_dev,
244 netif_err(efx, drv, efx->net_dev,
249 netif_err(efx, drv, efx->net_dev,
259 static int efx_test_phy(struct efx_nic *efx, struct efx_self_tests *tests,
264 mutex_lock(&efx->mac_lock);
265 rc = efx_siena_mcdi_phy_run_tests(efx, tests->phy_ext, flags);
266 mutex_unlock(&efx->mac_lock);
270 netif_info(efx, drv, efx->net_dev,
286 void efx_siena_loopback_rx_packet(struct efx_nic *efx,
289 struct efx_loopback_state *state = efx->loopback_selftest;
309 netif_err(efx, drv, efx->net_dev,
311 "test\n", pkt_len, LOOPBACK_MODE(efx));
317 netif_err(efx, drv, efx->net_dev,
319 LOOPBACK_MODE(efx));
325 netif_err(efx, drv, efx->net_dev,
328 (int)EFX_LOOPBACK_PAYLOAD_LEN, LOOPBACK_MODE(efx));
334 netif_err(efx, drv, efx->net_dev,
336 LOOPBACK_MODE(efx));
342 netif_err(efx, drv, efx->net_dev,
344 LOOPBACK_MODE(efx));
350 netif_err(efx, drv, efx->net_dev,
353 ntohs(payload->iteration), LOOPBACK_MODE(efx));
358 netif_vdbg(efx, drv, efx->net_dev,
359 "got loopback RX in %s loopback test\n", LOOPBACK_MODE(efx));
367 netif_err(efx, drv, efx->net_dev, "received packet:\n");
370 netif_err(efx, drv, efx->net_dev, "expected packet:\n");
380 static void efx_iterate_state(struct efx_nic *efx)
382 struct efx_loopback_state *state = efx->loopback_selftest;
383 struct net_device *net_dev = efx->net_dev;
418 struct efx_nic *efx = tx_queue->efx;
419 struct efx_loopback_state *state = efx->loopback_selftest;
449 netif_tx_lock_bh(efx->net_dev);
451 netif_tx_unlock_bh(efx->net_dev);
454 netif_err(efx, drv, efx->net_dev,
458 LOOPBACK_MODE(efx));
469 static int efx_poll_loopback(struct efx_nic *efx)
471 struct efx_loopback_state *state = efx->loopback_selftest;
479 struct efx_nic *efx = tx_queue->efx;
480 struct efx_loopback_state *state = efx->loopback_selftest;
485 netif_tx_lock_bh(efx->net_dev);
496 netif_tx_unlock_bh(efx->net_dev);
505 netif_err(efx, drv, efx->net_dev,
509 LOOPBACK_MODE(efx));
516 netif_dbg(efx, drv, efx->net_dev,
520 LOOPBACK_MODE(efx));
538 struct efx_nic *efx = tx_queue->efx;
539 struct efx_loopback_state *state = efx->loopback_selftest;
544 state->packet_count = efx->txq_entries / 3;
552 netif_dbg(efx, drv, efx->net_dev,
554 tx_queue->label, tx_queue->queue, LOOPBACK_MODE(efx),
557 efx_iterate_state(efx);
563 if (!efx_poll_loopback(efx)) {
565 efx_poll_loopback(efx);
579 netif_dbg(efx, drv, efx->net_dev,
581 "of %d packets\n", tx_queue->label, LOOPBACK_MODE(efx),
591 static int efx_wait_for_link(struct efx_nic *efx)
593 struct efx_link_state *link_state = &efx->link_state;
600 if (efx->type->monitor != NULL) {
601 mutex_lock(&efx->mac_lock);
602 efx->type->monitor(efx);
603 mutex_unlock(&efx->mac_lock);
606 mutex_lock(&efx->mac_lock);
609 link_up = !efx->type->check_mac_fault(efx);
610 mutex_unlock(&efx->mac_lock);
623 static int efx_test_loopbacks(struct efx_nic *efx, struct efx_self_tests *tests,
629 efx_get_channel(efx, efx->tx_channel_offset);
639 BUG_ON(efx->loopback_selftest);
641 efx->loopback_selftest = state;
650 mutex_lock(&efx->mac_lock);
651 efx->loopback_mode = mode;
652 rc = __efx_siena_reconfigure_port(efx);
653 mutex_unlock(&efx->mac_lock);
655 netif_err(efx, drv, efx->net_dev,
657 LOOPBACK_MODE(efx));
661 rc = efx_wait_for_link(efx);
663 netif_err(efx, drv, efx->net_dev,
665 LOOPBACK_MODE(efx));
683 efx->loopback_selftest = NULL;
699 int efx_siena_selftest(struct efx_nic *efx, struct efx_self_tests *tests,
702 enum efx_loopback_mode loopback_mode = efx->loopback_mode;
703 int phy_mode = efx->phy_mode;
706 efx_siena_selftest_async_cancel(efx);
711 rc = efx_test_phy_alive(efx, tests);
715 rc = efx_test_nvram(efx, tests);
719 rc = efx_test_interrupts(efx, tests);
723 rc = efx_test_eventq_irq(efx, tests);
731 return efx_test_phy(efx, tests, flags);
739 efx_device_detach_sync(efx);
741 if (efx->type->test_chip) {
742 rc_reset = efx->type->test_chip(efx, tests);
744 netif_err(efx, hw, efx->net_dev,
746 efx_siena_schedule_reset(efx, RESET_TYPE_DISABLE);
756 mutex_lock(&efx->mac_lock);
757 efx->phy_mode &= ~PHY_MODE_LOW_POWER;
758 efx->loopback_mode = LOOPBACK_NONE;
759 __efx_siena_reconfigure_port(efx);
760 mutex_unlock(&efx->mac_lock);
762 rc = efx_test_phy(efx, tests, flags);
766 rc = efx_test_loopbacks(efx, tests, efx->loopback_modes);
771 mutex_lock(&efx->mac_lock);
772 efx->phy_mode = phy_mode;
773 efx->loopback_mode = loopback_mode;
774 __efx_siena_reconfigure_port(efx);
775 mutex_unlock(&efx->mac_lock);
777 efx_device_attach_if_not_resetting(efx);
782 void efx_siena_selftest_async_start(struct efx_nic *efx)
786 efx_for_each_channel(channel, efx)
788 schedule_delayed_work(&efx->selftest_work, IRQ_TIMEOUT);
791 void efx_siena_selftest_async_cancel(struct efx_nic *efx)
793 cancel_delayed_work_sync(&efx->selftest_work);
798 struct efx_nic *efx = container_of(data, struct efx_nic,
803 efx_for_each_channel(channel, efx) {
806 netif_err(efx, ifup, efx->net_dev,
810 netif_dbg(efx, ifup, efx->net_dev,
816 void efx_siena_selftest_async_init(struct efx_nic *efx)
818 INIT_DELAYED_WORK(&efx->selftest_work, efx_siena_selftest_async_work);