aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/sfc/ethtool.c
diff options
context:
space:
mode:
authorBen Hutchings <bhutchings@solarflare.com>2008-09-01 07:49:02 -0400
committerJeff Garzik <jgarzik@redhat.com>2008-09-03 09:53:48 -0400
commit8c8661e4cefdd1ddbfe7d5120f046694555d9e5c (patch)
tree0618e0392140bccadf012381e64a795dfe2e41a4 /drivers/net/sfc/ethtool.c
parenta515089c963b045f65c495cee1d344d8cb75e1d1 (diff)
sfc: Extend self-tests
Include PMA/PMD in loopback self-tests as intended. Add NVRAM checksum validation and include it in self-tests. Add register self-tests. Run PHY self-tests where available. Signed-off-by: Ben Hutchings <bhutchings@solarflare.com> Signed-off-by: Jeff Garzik <jgarzik@redhat.com>
Diffstat (limited to 'drivers/net/sfc/ethtool.c')
-rw-r--r--drivers/net/sfc/ethtool.c22
1 files changed, 10 insertions, 12 deletions
diff --git a/drivers/net/sfc/ethtool.c b/drivers/net/sfc/ethtool.c
index 79894160a9a4..fa98af58223e 100644
--- a/drivers/net/sfc/ethtool.c
+++ b/drivers/net/sfc/ethtool.c
@@ -333,7 +333,10 @@ static int efx_ethtool_fill_self_tests(struct efx_nic *efx,
333 unsigned int n = 0; 333 unsigned int n = 0;
334 enum efx_loopback_mode mode; 334 enum efx_loopback_mode mode;
335 335
336 /* Interrupt */ 336 efx_fill_test(n++, strings, data, &tests->mii,
337 "core", 0, "mii", NULL);
338 efx_fill_test(n++, strings, data, &tests->nvram,
339 "core", 0, "nvram", NULL);
337 efx_fill_test(n++, strings, data, &tests->interrupt, 340 efx_fill_test(n++, strings, data, &tests->interrupt,
338 "core", 0, "interrupt", NULL); 341 "core", 0, "interrupt", NULL);
339 342
@@ -353,16 +356,17 @@ static int efx_ethtool_fill_self_tests(struct efx_nic *efx,
353 "eventq.poll", NULL); 356 "eventq.poll", NULL);
354 } 357 }
355 358
356 /* PHY presence */ 359 efx_fill_test(n++, strings, data, &tests->registers,
357 efx_fill_test(n++, strings, data, &tests->phy_ok, 360 "core", 0, "registers", NULL);
358 EFX_PORT_NAME, "phy_ok", NULL); 361 efx_fill_test(n++, strings, data, &tests->phy,
362 EFX_PORT_NAME, "phy", NULL);
359 363
360 /* Loopback tests */ 364 /* Loopback tests */
361 efx_fill_test(n++, strings, data, &tests->loopback_speed, 365 efx_fill_test(n++, strings, data, &tests->loopback_speed,
362 EFX_PORT_NAME, "loopback.speed", NULL); 366 EFX_PORT_NAME, "loopback.speed", NULL);
363 efx_fill_test(n++, strings, data, &tests->loopback_full_duplex, 367 efx_fill_test(n++, strings, data, &tests->loopback_full_duplex,
364 EFX_PORT_NAME, "loopback.full_duplex", NULL); 368 EFX_PORT_NAME, "loopback.full_duplex", NULL);
365 for (mode = LOOPBACK_NONE; mode < LOOPBACK_TEST_MAX; mode++) { 369 for (mode = LOOPBACK_NONE; mode <= LOOPBACK_TEST_MAX; mode++) {
366 if (!(efx->loopback_modes & (1 << mode))) 370 if (!(efx->loopback_modes & (1 << mode)))
367 continue; 371 continue;
368 n = efx_fill_loopback_test(efx, 372 n = efx_fill_loopback_test(efx,
@@ -500,15 +504,9 @@ static void efx_ethtool_self_test(struct net_device *net_dev,
500 goto out; 504 goto out;
501 505
502 /* Perform offline tests only if online tests passed */ 506 /* Perform offline tests only if online tests passed */
503 if (offline) { 507 if (offline)
504 /* Stop the kernel from sending packets during the test. */
505 efx_stop_queue(efx);
506 efx_flush_queues(efx);
507
508 rc = efx_offline_test(efx, &efx_tests, 508 rc = efx_offline_test(efx, &efx_tests,
509 efx->loopback_modes); 509 efx->loopback_modes);
510 efx_wake_queue(efx);
511 }
512 510
513 out: 511 out:
514 if (!already_up) 512 if (!already_up)