Re: [PATCH net] be2net: fix link failure after ethtool offline test

From: Ivan Vecera
Date: Wed Jun 19 2019 - 08:08:41 EST


On Wed, 19 Jun 2019 13:52:31 +0200
Petr Oros <poros@xxxxxxxxxx> wrote:

> Certain cards in conjunction with certain switches need a little more
> time for link setup that results in ethtool link test failure after
> offline test. Patch adds a loop that waits for a link setup finish.
>
> Signed-off-by: Petr Oros <poros@xxxxxxxxxx>

Missing Fixes header for net stuff... Otherwise LGTM.

Ivan

> ---
> .../net/ethernet/emulex/benet/be_ethtool.c | 28
> +++++++++++++++---- 1 file changed, 22 insertions(+), 6 deletions(-)
>
> diff --git a/drivers/net/ethernet/emulex/benet/be_ethtool.c
> b/drivers/net/ethernet/emulex/benet/be_ethtool.c index
> 8a6785173228f3..492f8769ac12c2 100644 ---
> a/drivers/net/ethernet/emulex/benet/be_ethtool.c +++
> b/drivers/net/ethernet/emulex/benet/be_ethtool.c @@ -891,7 +891,7 @@
> static void be_self_test(struct net_device *netdev, struct
> ethtool_test *test, u64 *data) {
> struct be_adapter *adapter = netdev_priv(netdev);
> - int status;
> + int status, cnt;
> u8 link_status = 0;
>
> if (adapter->function_caps & BE_FUNCTION_CAPS_SUPER_NIC) {
> @@ -902,6 +902,9 @@ static void be_self_test(struct net_device
> *netdev, struct ethtool_test *test,
> memset(data, 0, sizeof(u64) * ETHTOOL_TESTS_NUM);
>
> + /* check link status before offline tests */
> + link_status = netif_carrier_ok(netdev);
> +
> if (test->flags & ETH_TEST_FL_OFFLINE) {
> if (be_loopback_test(adapter, BE_MAC_LOOPBACK,
> &data[0]) != 0) test->flags |= ETH_TEST_FL_FAILED;
> @@ -922,13 +925,26 @@ static void be_self_test(struct net_device
> *netdev, struct ethtool_test *test, test->flags |= ETH_TEST_FL_FAILED;
> }
>
> - status = be_cmd_link_status_query(adapter, NULL,
> &link_status, 0);
> - if (status) {
> - test->flags |= ETH_TEST_FL_FAILED;
> - data[4] = -1;
> - } else if (!link_status) {
> + /* link status was down prior to test */
> + if (!link_status) {
> test->flags |= ETH_TEST_FL_FAILED;
> data[4] = 1;
> + return;
> + }
> +
> + for (cnt = 10; cnt; cnt--) {
> + status = be_cmd_link_status_query(adapter, NULL,
> &link_status,
> + 0);
> + if (status) {
> + test->flags |= ETH_TEST_FL_FAILED;
> + data[4] = -1;
> + break;
> + }
> +
> + if (link_status)
> + break;
> +
> + msleep_interruptible(500);
> }
> }
>