提交 3910c8ae 编写于 作者: E Eilon Greenstein 提交者: David S. Miller

bnx2x: loopback test failure

A link change interrupt might be queued and activated after the loopback was set
and it will cause the loopback to fail. The PHY lock should be kept until the
loopback test is over.

That implies that the bnx2x_test_link should used within the loopback function
and not bnx2x_wait_for_link since that function also takes the PHY link
Signed-off-by: NEilon Greenstein <eilong@broadcom.com>
Signed-off-by: NDavid S. Miller <davem@davemloft.net>
上级 5650d9d4
...@@ -8750,18 +8750,17 @@ static int bnx2x_run_loopback(struct bnx2x *bp, int loopback_mode, u8 link_up) ...@@ -8750,18 +8750,17 @@ static int bnx2x_run_loopback(struct bnx2x *bp, int loopback_mode, u8 link_up)
if (loopback_mode == BNX2X_MAC_LOOPBACK) { if (loopback_mode == BNX2X_MAC_LOOPBACK) {
bp->link_params.loopback_mode = LOOPBACK_BMAC; bp->link_params.loopback_mode = LOOPBACK_BMAC;
bnx2x_acquire_phy_lock(bp);
bnx2x_phy_init(&bp->link_params, &bp->link_vars); bnx2x_phy_init(&bp->link_params, &bp->link_vars);
bnx2x_release_phy_lock(bp);
} else if (loopback_mode == BNX2X_PHY_LOOPBACK) { } else if (loopback_mode == BNX2X_PHY_LOOPBACK) {
u16 cnt = 1000;
bp->link_params.loopback_mode = LOOPBACK_XGXS_10; bp->link_params.loopback_mode = LOOPBACK_XGXS_10;
bnx2x_acquire_phy_lock(bp);
bnx2x_phy_init(&bp->link_params, &bp->link_vars); bnx2x_phy_init(&bp->link_params, &bp->link_vars);
bnx2x_release_phy_lock(bp);
/* wait until link state is restored */ /* wait until link state is restored */
bnx2x_wait_for_link(bp, link_up); if (link_up)
while (cnt-- && bnx2x_test_link(&bp->link_params,
&bp->link_vars))
msleep(10);
} else } else
return -EINVAL; return -EINVAL;
...@@ -8867,6 +8866,7 @@ static int bnx2x_test_loopback(struct bnx2x *bp, u8 link_up) ...@@ -8867,6 +8866,7 @@ static int bnx2x_test_loopback(struct bnx2x *bp, u8 link_up)
return BNX2X_LOOPBACK_FAILED; return BNX2X_LOOPBACK_FAILED;
bnx2x_netif_stop(bp, 1); bnx2x_netif_stop(bp, 1);
bnx2x_acquire_phy_lock(bp);
if (bnx2x_run_loopback(bp, BNX2X_MAC_LOOPBACK, link_up)) { if (bnx2x_run_loopback(bp, BNX2X_MAC_LOOPBACK, link_up)) {
DP(NETIF_MSG_PROBE, "MAC loopback failed\n"); DP(NETIF_MSG_PROBE, "MAC loopback failed\n");
...@@ -8878,6 +8878,7 @@ static int bnx2x_test_loopback(struct bnx2x *bp, u8 link_up) ...@@ -8878,6 +8878,7 @@ static int bnx2x_test_loopback(struct bnx2x *bp, u8 link_up)
rc |= BNX2X_PHY_LOOPBACK_FAILED; rc |= BNX2X_PHY_LOOPBACK_FAILED;
} }
bnx2x_release_phy_lock(bp);
bnx2x_netif_start(bp); bnx2x_netif_start(bp);
return rc; return rc;
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册