From: Greg Kroah-Hartman Date: Thu, 12 May 2022 14:00:56 +0000 (+0200) Subject: 4.9-stable patches X-Git-Tag: v4.9.314~26 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=6c312ac2ca6e1b62b79f8a400fc52dabf5df4c55;p=thirdparty%2Fkernel%2Fstable-queue.git 4.9-stable patches 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 --- diff --git a/queue-4.9/can-grcan-grcan_probe-fix-broken-system-id-check-for-errata-workaround-needs.patch b/queue-4.9/can-grcan-grcan_probe-fix-broken-system-id-check-for-errata-workaround-needs.patch new file mode 100644 index 00000000000..85c61266dbf --- /dev/null +++ b/queue-4.9/can-grcan-grcan_probe-fix-broken-system-id-check-for-errata-workaround-needs.patch @@ -0,0 +1,61 @@ +From 1e93ed26acf03fe6c97c6d573a10178596aadd43 Mon Sep 17 00:00:00 2001 +From: Andreas Larsson +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 + +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 +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Greg Kroah-Hartman +--- + 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.9/can-grcan-only-use-the-napi-poll-budget-for-rx.patch b/queue-4.9/can-grcan-only-use-the-napi-poll-budget-for-rx.patch new file mode 100644 index 00000000000..9db0ac8bb71 --- /dev/null +++ b/queue-4.9/can-grcan-only-use-the-napi-poll-budget-for-rx.patch @@ -0,0 +1,87 @@ +From 2873d4d52f7c52d60b316ba6c47bd7122b5a9861 Mon Sep 17 00:00:00 2001 +From: Andreas Larsson +Date: Fri, 29 Apr 2022 10:46:56 +0200 +Subject: can: grcan: only use the NAPI poll budget for RX + +From: Andreas Larsson + +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 +Signed-off-by: Marc Kleine-Budde +Signed-off-by: Greg Kroah-Hartman +--- + 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, diff --git a/queue-4.9/series b/queue-4.9/series index 68a2b186a09..6b0f684d671 100644 --- a/queue-4.9/series +++ b/queue-4.9/series @@ -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