lkml.org 
[lkml]   [2019]   [Jul]   [17]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 4.19 15/47] be2net: fix link failure after ethtool offline test
    Date
    [ Upstream commit 2e5db6eb3c23e5dc8171eb8f6af7a97ef9fcf3a9 ]

    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.

    Changes in v2:
    - added fixes header

    Fixes: 4276e47e2d1c ("be2net: Add link test to list of ethtool self tests.")
    Signed-off-by: Petr Oros <poros@redhat.com>
    Reviewed-by: Ivan Vecera <ivecera@redhat.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Sasha Levin <sashal@kernel.org>
    ---
    .../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 bfb16a474490..d1905d50c26c 100644
    --- a/drivers/net/ethernet/emulex/benet/be_ethtool.c
    +++ b/drivers/net/ethernet/emulex/benet/be_ethtool.c
    @@ -895,7 +895,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) {
    @@ -906,6 +906,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;
    @@ -926,13 +929,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);
    }
    }

    --
    2.20.1


    \
     
     \ /
      Last update: 2019-07-18 05:24    [W:4.041 / U:0.264 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site