]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
5.10-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 20 Sep 2021 18:45:18 +0000 (20:45 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Mon, 20 Sep 2021 18:45:18 +0000 (20:45 +0200)
added patches:
bnxt_en-fix-error-recovery-regression.patch

queue-5.10/bnxt_en-fix-error-recovery-regression.patch [new file with mode: 0644]
queue-5.10/series

diff --git a/queue-5.10/bnxt_en-fix-error-recovery-regression.patch b/queue-5.10/bnxt_en-fix-error-recovery-regression.patch
new file mode 100644 (file)
index 0000000..b356d23
--- /dev/null
@@ -0,0 +1,60 @@
+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();
index e320cd8813e04a6c042ea6965c1bf52491071a16..468d4f73aa20a6050b7628c23f405ebc355dfcd0 100644 (file)
@@ -120,3 +120,4 @@ mfd-lpc_sch-partially-revert-add-support-for-intel-q.patch
 mfd-lpc_sch-rename-gpiobase-to-prevent-build-error.patch
 net-renesas-sh_eth-fix-freeing-wrong-tx-descriptor.patch
 x86-mce-avoid-infinite-loop-for-copy-from-user-recovery.patch
+bnxt_en-fix-error-recovery-regression.patch