bnx2x: allow bnx2x_bsc_read() to schedule
authorEric Dumazet <edumazet@google.com>
Sat, 23 May 2020 19:46:49 +0000 (12:46 -0700)
committerDavid S. Miller <davem@davemloft.net>
Tue, 26 May 2020 00:52:48 +0000 (17:52 -0700)
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 <edumazet@google.com>
Cc: Ariel Elior <aelior@marvell.com>
Cc: Sudarsana Kalluru <skalluru@marvell.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnx2x/bnx2x_link.c

index 517caed..1426c69 100644 (file)
@@ -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;
 
@@ -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;
@@ -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;