Commit d49184b7 authored by Marc Kleine-Budde's avatar Marc Kleine-Budde
Browse files

can: mcp251xfd: mcp251xfd_handle_rxif_ring_uinc(): factor out in separate function



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: default avatarStefan Althöfer <Stefan.Althoefer@janztec.com>
Tested-by: default avatarThomas Kopp <thomas.kopp@microchip.com>
Signed-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parent e793c724
Loading
Loading
Loading
Loading
+32 −16
Original line number Diff line number Diff line
@@ -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;