]> git.ipfire.org Git - thirdparty/kernel/stable-queue.git/commitdiff
4.14-stable patches
authorGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 12 May 2022 14:01:14 +0000 (16:01 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Thu, 12 May 2022 14:01:14 +0000 (16:01 +0200)
added patches:
can-grcan-grcan_probe-fix-broken-system-id-check-for-errata-workaround-needs.patch
can-grcan-only-use-the-napi-poll-budget-for-rx.patch

queue-4.14/can-grcan-grcan_probe-fix-broken-system-id-check-for-errata-workaround-needs.patch [new file with mode: 0644]
queue-4.14/can-grcan-only-use-the-napi-poll-budget-for-rx.patch [new file with mode: 0644]
queue-4.14/series

diff --git a/queue-4.14/can-grcan-grcan_probe-fix-broken-system-id-check-for-errata-workaround-needs.patch b/queue-4.14/can-grcan-grcan_probe-fix-broken-system-id-check-for-errata-workaround-needs.patch
new file mode 100644 (file)
index 0000000..85c6126
--- /dev/null
@@ -0,0 +1,61 @@
+From 1e93ed26acf03fe6c97c6d573a10178596aadd43 Mon Sep 17 00:00:00 2001
+From: Andreas Larsson <andreas@gaisler.com>
+Date: Fri, 29 Apr 2022 10:46:55 +0200
+Subject: can: grcan: grcan_probe(): fix broken system id check for errata workaround needs
+
+From: Andreas Larsson <andreas@gaisler.com>
+
+commit 1e93ed26acf03fe6c97c6d573a10178596aadd43 upstream.
+
+The systemid property was checked for in the wrong place of the device
+tree and compared to the wrong value.
+
+Fixes: 6cec9b07fe6a ("can: grcan: Add device driver for GRCAN and GRHCAN cores")
+Link: https://lore.kernel.org/all/20220429084656.29788-3-andreas@gaisler.com
+Cc: stable@vger.kernel.org
+Signed-off-by: Andreas Larsson <andreas@gaisler.com>
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/can/grcan.c |   16 +++++++++++-----
+ 1 file changed, 11 insertions(+), 5 deletions(-)
+
+--- a/drivers/net/can/grcan.c
++++ b/drivers/net/can/grcan.c
+@@ -245,7 +245,7 @@ struct grcan_device_config {
+               .rxsize         = GRCAN_DEFAULT_BUFFER_SIZE,    \
+               }
+-#define GRCAN_TXBUG_SAFE_GRLIB_VERSION        0x4100
++#define GRCAN_TXBUG_SAFE_GRLIB_VERSION        4100
+ #define GRLIB_VERSION_MASK            0xffff
+ /* GRCAN private data structure */
+@@ -1665,6 +1665,7 @@ exit_free_candev:
+ static int grcan_probe(struct platform_device *ofdev)
+ {
+       struct device_node *np = ofdev->dev.of_node;
++      struct device_node *sysid_parent;
+       struct resource *res;
+       u32 sysid, ambafreq;
+       int irq, err;
+@@ -1674,10 +1675,15 @@ static int grcan_probe(struct platform_d
+       /* Compare GRLIB version number with the first that does not
+        * have the tx bug (see start_xmit)
+        */
+-      err = of_property_read_u32(np, "systemid", &sysid);
+-      if (!err && ((sysid & GRLIB_VERSION_MASK)
+-                   >= GRCAN_TXBUG_SAFE_GRLIB_VERSION))
+-              txbug = false;
++      sysid_parent = of_find_node_by_path("/ambapp0");
++      if (sysid_parent) {
++              of_node_get(sysid_parent);
++              err = of_property_read_u32(sysid_parent, "systemid", &sysid);
++              if (!err && ((sysid & GRLIB_VERSION_MASK) >=
++                           GRCAN_TXBUG_SAFE_GRLIB_VERSION))
++                      txbug = false;
++              of_node_put(sysid_parent);
++      }
+       err = of_property_read_u32(np, "freq", &ambafreq);
+       if (err) {
diff --git a/queue-4.14/can-grcan-only-use-the-napi-poll-budget-for-rx.patch b/queue-4.14/can-grcan-only-use-the-napi-poll-budget-for-rx.patch
new file mode 100644 (file)
index 0000000..9db0ac8
--- /dev/null
@@ -0,0 +1,87 @@
+From 2873d4d52f7c52d60b316ba6c47bd7122b5a9861 Mon Sep 17 00:00:00 2001
+From: Andreas Larsson <andreas@gaisler.com>
+Date: Fri, 29 Apr 2022 10:46:56 +0200
+Subject: can: grcan: only use the NAPI poll budget for RX
+
+From: Andreas Larsson <andreas@gaisler.com>
+
+commit 2873d4d52f7c52d60b316ba6c47bd7122b5a9861 upstream.
+
+The previous split budget between TX and RX made it return not using
+the entire budget but at the same time not having calling called
+napi_complete. This sometimes led to the poll to not be called, and at
+the same time having TX and RX interrupts disabled resulting in the
+driver getting stuck.
+
+Fixes: 6cec9b07fe6a ("can: grcan: Add device driver for GRCAN and GRHCAN cores")
+Link: https://lore.kernel.org/all/20220429084656.29788-4-andreas@gaisler.com
+Cc: stable@vger.kernel.org
+Signed-off-by: Andreas Larsson <andreas@gaisler.com>
+Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
+Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
+---
+ drivers/net/can/grcan.c |   22 +++++++---------------
+ 1 file changed, 7 insertions(+), 15 deletions(-)
+
+--- a/drivers/net/can/grcan.c
++++ b/drivers/net/can/grcan.c
+@@ -1141,7 +1141,7 @@ static int grcan_close(struct net_device
+       return 0;
+ }
+-static int grcan_transmit_catch_up(struct net_device *dev, int budget)
++static void grcan_transmit_catch_up(struct net_device *dev)
+ {
+       struct grcan_priv *priv = netdev_priv(dev);
+       unsigned long flags;
+@@ -1149,7 +1149,7 @@ static int grcan_transmit_catch_up(struc
+       spin_lock_irqsave(&priv->lock, flags);
+-      work_done = catch_up_echo_skb(dev, budget, true);
++      work_done = catch_up_echo_skb(dev, -1, true);
+       if (work_done) {
+               if (!priv->resetting && !priv->closing &&
+                   !(priv->can.ctrlmode & CAN_CTRLMODE_LISTENONLY))
+@@ -1163,8 +1163,6 @@ static int grcan_transmit_catch_up(struc
+       }
+       spin_unlock_irqrestore(&priv->lock, flags);
+-
+-      return work_done;
+ }
+ static int grcan_receive(struct net_device *dev, int budget)
+@@ -1246,19 +1244,13 @@ static int grcan_poll(struct napi_struct
+       struct net_device *dev = priv->dev;
+       struct grcan_registers __iomem *regs = priv->regs;
+       unsigned long flags;
+-      int tx_work_done, rx_work_done;
+-      int rx_budget = budget / 2;
+-      int tx_budget = budget - rx_budget;
++      int work_done;
+-      /* Half of the budget for receiveing messages */
+-      rx_work_done = grcan_receive(dev, rx_budget);
++      work_done = grcan_receive(dev, budget);
+-      /* Half of the budget for transmitting messages as that can trigger echo
+-       * frames being received
+-       */
+-      tx_work_done = grcan_transmit_catch_up(dev, tx_budget);
++      grcan_transmit_catch_up(dev);
+-      if (rx_work_done < rx_budget && tx_work_done < tx_budget) {
++      if (work_done < budget) {
+               napi_complete(napi);
+               /* Guarantee no interference with a running reset that otherwise
+@@ -1275,7 +1267,7 @@ static int grcan_poll(struct napi_struct
+               spin_unlock_irqrestore(&priv->lock, flags);
+       }
+-      return rx_work_done + tx_work_done;
++      return work_done;
+ }
+ /* Work tx bug by waiting while for the risky situation to clear. If that fails,
index 68a2b186a090387c9467882d0f6d1476bd76edc9..6b0f684d67186a1dea17494ba0ada2f1648b57ce 100644 (file)
@@ -1,2 +1,4 @@
 mips-use-address-of-operator-on-section-symbols.patch
 block-drbd-drbd_nl-make-conversion-to-enum-drbd_ret_code-explicit.patch
+can-grcan-grcan_probe-fix-broken-system-id-check-for-errata-workaround-needs.patch
+can-grcan-only-use-the-napi-poll-budget-for-rx.patch