diff options
| -rw-r--r-- | drivers/net/sfc/ethtool.c | 22 |
1 files changed, 13 insertions, 9 deletions
diff --git a/drivers/net/sfc/ethtool.c b/drivers/net/sfc/ethtool.c index 0e8bb19ed60d..ca886d98bdc7 100644 --- a/drivers/net/sfc/ethtool.c +++ b/drivers/net/sfc/ethtool.c | |||
| @@ -569,9 +569,14 @@ static void efx_ethtool_self_test(struct net_device *net_dev, | |||
| 569 | struct ethtool_test *test, u64 *data) | 569 | struct ethtool_test *test, u64 *data) |
| 570 | { | 570 | { |
| 571 | struct efx_nic *efx = netdev_priv(net_dev); | 571 | struct efx_nic *efx = netdev_priv(net_dev); |
| 572 | struct efx_self_tests efx_tests; | 572 | struct efx_self_tests *efx_tests; |
| 573 | int already_up; | 573 | int already_up; |
| 574 | int rc; | 574 | int rc = -ENOMEM; |
| 575 | |||
| 576 | efx_tests = kzalloc(sizeof(*efx_tests), GFP_KERNEL); | ||
| 577 | if (!efx_tests) | ||
| 578 | goto fail; | ||
| 579 | |||
| 575 | 580 | ||
| 576 | ASSERT_RTNL(); | 581 | ASSERT_RTNL(); |
| 577 | if (efx->state != STATE_RUNNING) { | 582 | if (efx->state != STATE_RUNNING) { |
| @@ -589,13 +594,11 @@ static void efx_ethtool_self_test(struct net_device *net_dev, | |||
| 589 | if (rc) { | 594 | if (rc) { |
| 590 | netif_err(efx, drv, efx->net_dev, | 595 | netif_err(efx, drv, efx->net_dev, |
| 591 | "failed opening device.\n"); | 596 | "failed opening device.\n"); |
| 592 | goto fail2; | 597 | goto fail1; |
| 593 | } | 598 | } |
| 594 | } | 599 | } |
| 595 | 600 | ||
| 596 | memset(&efx_tests, 0, sizeof(efx_tests)); | 601 | rc = efx_selftest(efx, efx_tests, test->flags); |
| 597 | |||
| 598 | rc = efx_selftest(efx, &efx_tests, test->flags); | ||
| 599 | 602 | ||
| 600 | if (!already_up) | 603 | if (!already_up) |
| 601 | dev_close(efx->net_dev); | 604 | dev_close(efx->net_dev); |
| @@ -604,10 +607,11 @@ static void efx_ethtool_self_test(struct net_device *net_dev, | |||
| 604 | rc == 0 ? "passed" : "failed", | 607 | rc == 0 ? "passed" : "failed", |
| 605 | (test->flags & ETH_TEST_FL_OFFLINE) ? "off" : "on"); | 608 | (test->flags & ETH_TEST_FL_OFFLINE) ? "off" : "on"); |
| 606 | 609 | ||
| 607 | fail2: | 610 | fail1: |
| 608 | fail1: | ||
| 609 | /* Fill ethtool results structures */ | 611 | /* Fill ethtool results structures */ |
| 610 | efx_ethtool_fill_self_tests(efx, &efx_tests, NULL, data); | 612 | efx_ethtool_fill_self_tests(efx, efx_tests, NULL, data); |
| 613 | kfree(efx_tests); | ||
| 614 | fail: | ||
| 611 | if (rc) | 615 | if (rc) |
| 612 | test->flags |= ETH_TEST_FL_FAILED; | 616 | test->flags |= ETH_TEST_FL_FAILED; |
| 613 | } | 617 | } |
