The previous patch fixes a TEF vs. TX race condition, by first updating the TEF
tail pointer in hardware, and then updating the driver internal pointer.

The same pattern exists in the RX-path, too. This should be no problem, as the
driver accesses the RX-FIFO from the interrupt handler only, thus the access is
properly serialized. Fix the order here, too, so that the TEF- and RX-path look
similar.

Fixes: 1f652bb6bae7 ("can: mcp25xxfd: rx-path: reduce number of SPI core 
requests to set UINC bit")
Link: https://lore.kernel.org/r/20210105214138.3150886-3-...@pengutronix.de
Signed-off-by: Marc Kleine-Budde <m...@pengutronix.de>
---
 drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c | 8 ++++----
 1 file changed, 4 insertions(+), 4 deletions(-)

diff --git a/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c 
b/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c
index 85a1a8b7c0e7..36235afb0bc6 100644
--- a/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c
+++ b/drivers/net/can/spi/mcp251xfd/mcp251xfd-core.c
@@ -1552,10 +1552,8 @@ mcp251xfd_handle_rxif_ring(struct mcp251xfd_priv *priv,
 
                /* Increment the RX FIFO tail pointer 'len' times in a
                 * single SPI message.
-                */
-               ring->tail += len;
-
-               /* Note:
+                *
+                * Note:
                 *
                 * "cs_change == 1" on the last transfer results in an
                 * active chip select after the complete SPI
@@ -1571,6 +1569,8 @@ mcp251xfd_handle_rxif_ring(struct mcp251xfd_priv *priv,
                last_xfer->cs_change = 1;
                if (err)
                        return err;
+
+               ring->tail += len;
        }
 
        return 0;
-- 
2.29.2


Reply via email to