qlge: Fix occasional loopback test failure.
authorRon Mercer <ron.mercer@qlogic.com>
Wed, 17 Feb 2010 06:41:23 +0000 (06:41 +0000)
committerDavid S. Miller <davem@davemloft.net>
Wed, 17 Feb 2010 21:35:38 +0000 (13:35 -0800)
On some servers we see the cleaning of the RX queue finish before all
the loopback packets are sent out.  This delay allows the queues to
settle before checking for successful completion.
Also, delay completion so link has time to come back up.

Signed-off-by: Ron Mercer <ron.mercer@qlogic.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/qlge/qlge_ethtool.c

index 4f26afeb0f38a87c4de07fec3b00681e3450a862..05b8bde9980dbbe0b571dd17a995a375c959ed1c 100644 (file)
@@ -503,7 +503,8 @@ static int ql_run_loopback_test(struct ql_adapter *qdev)
                        return -EPIPE;
                atomic_inc(&qdev->lb_count);
        }
-
+       /* Give queue time to settle before testing results. */
+       msleep(2);
        ql_clean_lb_rx_ring(&qdev->rx_ring[0], 128);
        return atomic_read(&qdev->lb_count) ? -EIO : 0;
 }
@@ -536,6 +537,10 @@ static void ql_self_test(struct net_device *ndev,
                        data[0] = 0;
                }
                clear_bit(QL_SELFTEST, &qdev->flags);
+               /* Give link time to come up after
+                * port configuration changes.
+                */
+               msleep_interruptible(4 * 1000);
        } else {
                netif_err(qdev, drv, qdev->ndev,
                          "is down, Loopback test will fail.\n");