Commit 10d4629f authored by Marc Kleine-Budde's avatar Marc Kleine-Budde Committed by Wen Zhiwei
Browse files

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

stable inclusion
from stable-v6.6.51
commit 2370061f07078b1c7cce461f09b129c20f9b4861
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/IAYRVR

Reference: https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/commit/?id=2370061f07078b1c7cce461f09b129c20f9b4861



--------------------------------

[ Upstream commit d49184b7b585f9da7ee546b744525f62117019f6 ]

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>
Signed-off-by: default avatarSasha Levin <sashal@kernel.org>
Signed-off-by: default avatarWen Zhiwei <wenzhiwei@kylinos.cn>
parent 4937ae73
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;