--- /dev/null
+From eca4cf12acda306f851f6d2a05b1c9ef62cf0e81 Mon Sep 17 00:00:00 2001
+From: Michael Chan <michael.chan@broadcom.com>
+Date: Sun, 12 Sep 2021 12:34:47 -0400
+Subject: bnxt_en: Fix error recovery regression
+
+From: Michael Chan <michael.chan@broadcom.com>
+
+commit eca4cf12acda306f851f6d2a05b1c9ef62cf0e81 upstream.
+
+The recent patch has introduced a regression by not reading the reset
+count in the ERROR_RECOVERY async event handler. We may have just
+gone through a reset and the reset count has just incremented. If
+we don't update the reset count in the ERROR_RECOVERY event handler,
+the health check timer will see that the reset count has changed and
+will initiate an unintended reset.
+
+Restore the unconditional update of the reset count in
+bnxt_async_event_process() if error recovery watchdog is enabled.
+Also, update the reset count at the end of the reset sequence to
+make it even more robust.
+
+Fixes: 1b2b91831983 ("bnxt_en: Fix possible unintended driver initiated error recovery")
+Reviewed-by: Edwin Peer <edwin.peer@broadcom.com>
+Signed-off-by: Michael Chan <michael.chan@broadcom.com>
+Signed-off-by: David S. Miller <davem@davemloft.net>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/ethernet/broadcom/bnxt/bnxt.c | 12 ++++++++----
+ 1 file changed, 8 insertions(+), 4 deletions(-)
+
+--- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c
++++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c
+@@ -2123,12 +2123,11 @@ static int bnxt_async_event_process(stru
+ DIV_ROUND_UP(fw_health->polling_dsecs * HZ,
+ bp->current_interval * 10);
+ fw_health->tmr_counter = fw_health->tmr_multiplier;
+- if (!fw_health->enabled) {
++ if (!fw_health->enabled)
+ fw_health->last_fw_heartbeat =
+ bnxt_fw_health_readl(bp, BNXT_FW_HEARTBEAT_REG);
+- fw_health->last_fw_reset_cnt =
+- bnxt_fw_health_readl(bp, BNXT_FW_RESET_CNT_REG);
+- }
++ fw_health->last_fw_reset_cnt =
++ bnxt_fw_health_readl(bp, BNXT_FW_RESET_CNT_REG);
+ netif_info(bp, drv, bp->dev,
+ "Error recovery info: error recovery[1], master[%d], reset count[%u], health status: 0x%x\n",
+ fw_health->master, fw_health->last_fw_reset_cnt,
+@@ -11653,6 +11652,11 @@ static void bnxt_fw_reset_task(struct wo
+ dev_close(bp->dev);
+ }
+
++ if ((bp->fw_cap & BNXT_FW_CAP_ERROR_RECOVERY) &&
++ bp->fw_health->enabled) {
++ bp->fw_health->last_fw_reset_cnt =
++ bnxt_fw_health_readl(bp, BNXT_FW_RESET_CNT_REG);
++ }
+ bp->fw_reset_state = 0;
+ /* Make sure fw_reset_state is 0 before clearing the flag */
+ smp_mb__before_atomic();