Commit 901d3fe8 authored by Steve Hodgson's avatar Steve Hodgson Committed by David S. Miller

sfc: Wait for the link to stay up before running loopback selftest

It's been observed that some phys (such as the qt2025c) can
do down-up-down-up transitions, presumably as pcs block lock
settles down.

The loopback selftest will start sending data immediately
after the link comes up. Work around this by waiting for
the link state to stay up for two consecutive polls, rather
than one.
Signed-off-by: default avatarBen Hutchings <bhutchings@solarflare.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent cffe9d4c
...@@ -545,7 +545,7 @@ efx_test_loopback(struct efx_tx_queue *tx_queue, ...@@ -545,7 +545,7 @@ efx_test_loopback(struct efx_tx_queue *tx_queue,
static int efx_wait_for_link(struct efx_nic *efx) static int efx_wait_for_link(struct efx_nic *efx)
{ {
struct efx_link_state *link_state = &efx->link_state; struct efx_link_state *link_state = &efx->link_state;
int count; int count, link_up_count = 0;
bool link_up; bool link_up;
for (count = 0; count < 40; count++) { for (count = 0; count < 40; count++) {
...@@ -567,8 +567,12 @@ static int efx_wait_for_link(struct efx_nic *efx) ...@@ -567,8 +567,12 @@ static int efx_wait_for_link(struct efx_nic *efx)
link_up = !efx->mac_op->check_fault(efx); link_up = !efx->mac_op->check_fault(efx);
mutex_unlock(&efx->mac_lock); mutex_unlock(&efx->mac_lock);
if (link_up) if (link_up) {
if (++link_up_count == 2)
return 0; return 0;
} else {
link_up_count = 0;
}
} }
return -ETIMEDOUT; return -ETIMEDOUT;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment