Skip to content

Commit

Permalink
bnx2x: Fix rare self-test failures
Browse files Browse the repository at this point in the history
On rare occasions, self test link may fail since the link is
being sampled while it's still being stabilized.
To correct this behaviour, try to sample the link for 2 seconds
prior to declaring a failure.

Signed-off-by: Yaniv Rosner <yanivr@broadcom.com>
Signed-off-by: Yuval Mintz <yuvalmin@broadcom.com>
Signed-off-by: Ariel Elior <ariele@broadcom.com>
Signed-off-by: Eilon Greenstein <eilong@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
  • Loading branch information
Yaniv Rosner authored and David S. Miller committed Jan 15, 2013
1 parent f72839d commit a336ca7
Showing 1 changed file with 10 additions and 7 deletions.
17 changes: 10 additions & 7 deletions drivers/net/ethernet/broadcom/bnx2x/bnx2x_ethtool.c
Original file line number Diff line number Diff line change
Expand Up @@ -2379,8 +2379,8 @@ static void bnx2x_self_test(struct net_device *dev,
struct ethtool_test *etest, u64 *buf)
{
struct bnx2x *bp = netdev_priv(dev);
u8 is_serdes;
int rc;
u8 is_serdes, link_up;
int rc, cnt = 0;

if (bp->recovery_state != BNX2X_RECOVERY_DONE) {
netdev_err(bp->dev,
Expand All @@ -2402,20 +2402,17 @@ static void bnx2x_self_test(struct net_device *dev,
}

is_serdes = (bp->link_vars.link_status & LINK_STATUS_SERDES_LINK) > 0;

link_up = bp->link_vars.link_up;
/* offline tests are not supported in MF mode */
if ((etest->flags & ETH_TEST_FL_OFFLINE) && !IS_MF(bp)) {
int port = BP_PORT(bp);
u32 val;
u8 link_up;

/* save current value of input enable for TX port IF */
val = REG_RD(bp, NIG_REG_EGRESS_UMP0_IN_EN + port*4);
/* disable input for TX port IF */
REG_WR(bp, NIG_REG_EGRESS_UMP0_IN_EN + port*4, 0);

link_up = bp->link_vars.link_up;

bnx2x_nic_unload(bp, UNLOAD_NORMAL, false);
rc = bnx2x_nic_load(bp, LOAD_DIAG);
if (rc) {
Expand Down Expand Up @@ -2477,7 +2474,13 @@ static void bnx2x_self_test(struct net_device *dev,
etest->flags |= ETH_TEST_FL_FAILED;
}

if (bnx2x_link_test(bp, is_serdes) != 0) {
if (link_up) {
cnt = 100;
while (bnx2x_link_test(bp, is_serdes) && --cnt)
msleep(20);
}

if (!cnt) {
if (!IS_MF(bp))
buf[6] = 1;
else
Expand Down

0 comments on commit a336ca7

Please sign in to comment.