Skip to content

Commit

Permalink
bnx2x: allow bnx2x_bsc_read() to schedule
Browse files Browse the repository at this point in the history
bnx2x_warpcore_read_sfp_module_eeprom() can call bnx2x_bsc_read()
three times before giving up.

This causes latency blips of at least 31 ms (58 ms being reported
by our teams)

Convert the long lasting loops of udelay() to usleep_range() ones,
and breaks the loops on precise time tracking.

Signed-off-by: Eric Dumazet <[email protected]>
Cc: Ariel Elior <[email protected]>
Cc: Sudarsana Kalluru <[email protected]>
Signed-off-by: David S. Miller <[email protected]>
  • Loading branch information
Eric Dumazet authored and davem330 committed May 26, 2020
1 parent 6a1015b commit 880f8f9
Showing 1 changed file with 15 additions and 11 deletions.
26 changes: 15 additions & 11 deletions drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c
Original file line number Diff line number Diff line change
Expand Up @@ -3085,6 +3085,7 @@ static int bnx2x_bsc_read(struct link_params *params,
u8 xfer_cnt,
u32 *data_array)
{
u64 t0, delta;
u32 val, i;
int rc = 0;

Expand Down Expand Up @@ -3114,17 +3115,18 @@ static int bnx2x_bsc_read(struct link_params *params,
REG_WR(bp, MCP_REG_MCPR_IMC_COMMAND, val);

/* Poll for completion */
i = 0;
t0 = ktime_get_ns();
val = REG_RD(bp, MCP_REG_MCPR_IMC_COMMAND);
while (((val >> MCPR_IMC_COMMAND_IMC_STATUS_BITSHIFT) & 0x3) != 1) {
udelay(10);
val = REG_RD(bp, MCP_REG_MCPR_IMC_COMMAND);
if (i++ > 1000) {
DP(NETIF_MSG_LINK, "wr 0 byte timed out after %d try\n",
i);
delta = ktime_get_ns() - t0;
if (delta > 10 * NSEC_PER_MSEC) {
DP(NETIF_MSG_LINK, "wr 0 byte timed out after %Lu ns\n",
delta);
rc = -EFAULT;
break;
}
usleep_range(10, 20);
val = REG_RD(bp, MCP_REG_MCPR_IMC_COMMAND);
}
if (rc == -EFAULT)
return rc;
Expand All @@ -3138,16 +3140,18 @@ static int bnx2x_bsc_read(struct link_params *params,
REG_WR(bp, MCP_REG_MCPR_IMC_COMMAND, val);

/* Poll for completion */
i = 0;
t0 = ktime_get_ns();
val = REG_RD(bp, MCP_REG_MCPR_IMC_COMMAND);
while (((val >> MCPR_IMC_COMMAND_IMC_STATUS_BITSHIFT) & 0x3) != 1) {
udelay(10);
val = REG_RD(bp, MCP_REG_MCPR_IMC_COMMAND);
if (i++ > 1000) {
DP(NETIF_MSG_LINK, "rd op timed out after %d try\n", i);
delta = ktime_get_ns() - t0;
if (delta > 10 * NSEC_PER_MSEC) {
DP(NETIF_MSG_LINK, "rd op timed out after %Lu ns\n",
delta);
rc = -EFAULT;
break;
}
usleep_range(10, 20);
val = REG_RD(bp, MCP_REG_MCPR_IMC_COMMAND);
}
if (rc == -EFAULT)
return rc;
Expand Down

0 comments on commit 880f8f9

Please sign in to comment.