| 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) { |