[12/14] net/bnxt: retry HWRM ver get if the command fails
Checks
Commit Message
Retry HWRM ver get if the command timesout because of PCI FLR.
When the PCI driver issues an FLR during device initialization,
the firmware may have to block the PXP target traffic till the FLR
is complete.
HWRM_VER_GET command issued during that window may time out.
So retry the command again in such a scenario.
Signed-off-by: Ajit Khaparde <ajit.khaparde@broadcom.com>
Reviewed-by: Kalesh AP <kalesh-anakkur.purayil@broadcom.com>
Reviewed-by: Somnath Kotur <somnath.kotur@broadcom.com>
---
drivers/net/bnxt/bnxt.h | 1 +
drivers/net/bnxt/bnxt_ethdev.c | 12 +++++++++++-
2 files changed, 12 insertions(+), 1 deletion(-)
@@ -879,6 +879,7 @@ struct bnxt {
/* default command timeout value of 500ms */
#define DFLT_HWRM_CMD_TIMEOUT 500000
+#define PCI_FUNC_RESET_WAIT_TIMEOUT 1500000
/* short command timeout value of 50ms */
#define SHORT_HWRM_CMD_TIMEOUT 50000
/* default HWRM request timeout value */
@@ -5442,6 +5442,7 @@ static int bnxt_map_hcomm_fw_status_reg(struct bnxt *bp)
static int bnxt_get_config(struct bnxt *bp)
{
uint16_t mtu;
+ int timeout;
int rc = 0;
bp->fw_cap = 0;
@@ -5450,8 +5451,17 @@ static int bnxt_get_config(struct bnxt *bp)
if (rc)
return rc;
- rc = bnxt_hwrm_ver_get(bp, DFLT_HWRM_CMD_TIMEOUT);
+ timeout = BNXT_CHIP_P7(bp) ?
+ PCI_FUNC_RESET_WAIT_TIMEOUT :
+ DFLT_HWRM_CMD_TIMEOUT;
+try_again:
+ rc = bnxt_hwrm_ver_get(bp, timeout);
if (rc) {
+ if (rc == -ETIMEDOUT && timeout == PCI_FUNC_RESET_WAIT_TIMEOUT) {
+ bp->flags &= ~BNXT_FLAG_FW_TIMEDOUT;
+ timeout = DFLT_HWRM_CMD_TIMEOUT;
+ goto try_again;
+ }
bnxt_check_fw_status(bp);
return rc;
}