Commit b891106d authored by Michael Chan's avatar Michael Chan Committed by David S. Miller

bnxt_en: Increase firmware message response DMA wait time

When polling for the firmware message response, we first poll for the
response message header.  Once the valid length is detected in the
header, we poll for the valid bit at the end of the message which
signals DMA completion.  Normally, this poll time for DMA completion
is extremely short (0 to a few usec).  But on some devices under some
rare conditions, it can be up to about 20 msec.

Increase this delay to 50 msec and use udelay() for the first 10 usec
for the common case, and usleep_range() beyond that.

Also, change the error message to include the above delay time when
printing the timeout value.

Fixes: 3c8c20db ("bnxt_en: move HWRM API implementation into separate file")
Reviewed-by: default avatarVladimir Olovyannikov <vladimir.olovyannikov@broadcom.com>
Signed-off-by: default avatarMichael Chan <michael.chan@broadcom.com>
Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
parent 0e0e3c53
...@@ -644,17 +644,23 @@ static int __hwrm_send(struct bnxt *bp, struct bnxt_hwrm_ctx *ctx) ...@@ -644,17 +644,23 @@ static int __hwrm_send(struct bnxt *bp, struct bnxt_hwrm_ctx *ctx)
/* Last byte of resp contains valid bit */ /* Last byte of resp contains valid bit */
valid = ((u8 *)ctx->resp) + len - 1; valid = ((u8 *)ctx->resp) + len - 1;
for (j = 0; j < HWRM_VALID_BIT_DELAY_USEC; j++) { for (j = 0; j < HWRM_VALID_BIT_DELAY_USEC; ) {
/* make sure we read from updated DMA memory */ /* make sure we read from updated DMA memory */
dma_rmb(); dma_rmb();
if (*valid) if (*valid)
break; break;
usleep_range(1, 5); if (j < 10) {
udelay(1);
j++;
} else {
usleep_range(20, 30);
j += 20;
}
} }
if (j >= HWRM_VALID_BIT_DELAY_USEC) { if (j >= HWRM_VALID_BIT_DELAY_USEC) {
hwrm_err(bp, ctx, "Error (timeout: %u) msg {0x%x 0x%x} len:%d v:%d\n", hwrm_err(bp, ctx, "Error (timeout: %u) msg {0x%x 0x%x} len:%d v:%d\n",
hwrm_total_timeout(i), req_type, hwrm_total_timeout(i) + j, req_type,
le16_to_cpu(ctx->req->seq_id), len, *valid); le16_to_cpu(ctx->req->seq_id), len, *valid);
goto exit; goto exit;
} }
......
...@@ -90,7 +90,7 @@ static inline unsigned int hwrm_total_timeout(unsigned int n) ...@@ -90,7 +90,7 @@ static inline unsigned int hwrm_total_timeout(unsigned int n)
} }
#define HWRM_VALID_BIT_DELAY_USEC 150 #define HWRM_VALID_BIT_DELAY_USEC 50000
static inline bool bnxt_cfa_hwrm_message(u16 req_type) static inline bool bnxt_cfa_hwrm_message(u16 req_type)
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment