]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
can: mcp251xfd: mcp251xfd_handle_rxif_ring_uinc(): factor out in separate function
authorMarc Kleine-Budde <mkl@pengutronix.de>
Wed, 11 Jan 2023 19:25:48 +0000 (20:25 +0100)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Fri, 28 Jun 2024 21:48:12 +0000 (23:48 +0200)
This is a preparation patch.

Sending the UINC messages followed by incrementing the tail pointer
will be called in more than one place in upcoming patches, so factor
this out into a separate function.

Also make mcp251xfd_handle_rxif_ring_uinc() safe to be called with a
"len" of 0.

Tested-by: Stefan Althöfer <Stefan.Althoefer@janztec.com>
Tested-by: Thomas Kopp <thomas.kopp@microchip.com>
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/spi/mcp251xfd/mcp251xfd-rx.c

index 6d66b97709b89fc1d08cecf9186ffa979c9074ea..2c2b057b7ac7b76551cad3487b6603187ec05686 100644 (file)
@@ -197,6 +197,37 @@ mcp251xfd_rx_obj_read(const struct mcp251xfd_priv *priv,
        return err;
 }
 
+static int
+mcp251xfd_handle_rxif_ring_uinc(const struct mcp251xfd_priv *priv,
+                               struct mcp251xfd_rx_ring *ring,
+                               u8 len)
+{
+       int offset;
+       int err;
+
+       if (!len)
+               return 0;
+
+       /* Increment the RX FIFO tail pointer 'len' times in a
+        * single SPI message.
+        *
+        * Note:
+        * Calculate offset, so that the SPI transfer ends on
+        * the last message of the uinc_xfer array, which has
+        * "cs_change == 0", to properly deactivate the chip
+        * select.
+        */
+       offset = ARRAY_SIZE(ring->uinc_xfer) - len;
+       err = spi_sync_transfer(priv->spi,
+                               ring->uinc_xfer + offset, len);
+       if (err)
+               return err;
+
+       ring->tail += len;
+
+       return 0;
+}
+
 static int
 mcp251xfd_handle_rxif_ring(struct mcp251xfd_priv *priv,
                           struct mcp251xfd_rx_ring *ring)
@@ -210,8 +241,6 @@ mcp251xfd_handle_rxif_ring(struct mcp251xfd_priv *priv,
                return err;
 
        while ((len = mcp251xfd_get_rx_linear_len(ring))) {
-               int offset;
-
                rx_tail = mcp251xfd_get_rx_tail(ring);
 
                err = mcp251xfd_rx_obj_read(priv, ring, hw_rx_obj,
@@ -227,22 +256,9 @@ mcp251xfd_handle_rxif_ring(struct mcp251xfd_priv *priv,
                                return err;
                }
 
-               /* Increment the RX FIFO tail pointer 'len' times in a
-                * single SPI message.
-                *
-                * Note:
-                * Calculate offset, so that the SPI transfer ends on
-                * the last message of the uinc_xfer array, which has
-                * "cs_change == 0", to properly deactivate the chip
-                * select.
-                */
-               offset = ARRAY_SIZE(ring->uinc_xfer) - len;
-               err = spi_sync_transfer(priv->spi,
-                                       ring->uinc_xfer + offset, len);
+               err = mcp251xfd_handle_rxif_ring_uinc(priv, ring, len);
                if (err)
                        return err;
-
-               ring->tail += len;
        }
 
        return 0;