Commit 0a1f2e65 authored by Marc Kleine-Budde's avatar Marc Kleine-Budde

can: mcp251xfd: ring: prepare support for runtime configurable RX/TX ring parameters

This patch prepares the driver for runtime configurable RX and TX ring
parameters. The actual runtime config support will be added in the
next patch.

Link: https://lore.kernel.org/20220313083640.501791-6-mkl@pengutronix.deSigned-off-by: default avatarMarc Kleine-Budde <mkl@pengutronix.de>
parent d86ba8db
...@@ -289,9 +289,9 @@ int mcp251xfd_ring_alloc(struct mcp251xfd_priv *priv) ...@@ -289,9 +289,9 @@ int mcp251xfd_ring_alloc(struct mcp251xfd_priv *priv)
{ {
struct mcp251xfd_tx_ring *tx_ring; struct mcp251xfd_tx_ring *tx_ring;
struct mcp251xfd_rx_ring *rx_ring; struct mcp251xfd_rx_ring *rx_ring;
int tef_obj_size, tx_obj_size, rx_obj_size; u8 tef_obj_size, tx_obj_size, rx_obj_size;
int tx_obj_num; u8 tx_obj_num;
int ram_free, i; u8 rem, i;
tef_obj_size = sizeof(struct mcp251xfd_hw_tef_obj); tef_obj_size = sizeof(struct mcp251xfd_hw_tef_obj);
if (mcp251xfd_is_fd_mode(priv)) { if (mcp251xfd_is_fd_mode(priv)) {
...@@ -310,17 +310,14 @@ int mcp251xfd_ring_alloc(struct mcp251xfd_priv *priv) ...@@ -310,17 +310,14 @@ int mcp251xfd_ring_alloc(struct mcp251xfd_priv *priv)
tx_ring->obj_num = tx_obj_num; tx_ring->obj_num = tx_obj_num;
tx_ring->obj_size = tx_obj_size; tx_ring->obj_size = tx_obj_size;
ram_free = MCP251XFD_RAM_SIZE - tx_obj_num * rem = (MCP251XFD_RAM_SIZE - tx_obj_num *
(tef_obj_size + tx_obj_size); (tef_obj_size + tx_obj_size)) / rx_obj_size;
for (i = 0; i < ARRAY_SIZE(priv->rx) && rem; i++) {
u8 rx_obj_num;
for (i = 0; rx_obj_num = min_t(u8, rounddown_pow_of_two(rem),
i < ARRAY_SIZE(priv->rx) && ram_free >= rx_obj_size; MCP251XFD_FIFO_DEPTH);
i++) { rem -= rx_obj_num;
int rx_obj_num;
rx_obj_num = ram_free / rx_obj_size;
rx_obj_num = min(1 << (fls(rx_obj_num) - 1),
MCP251XFD_RX_OBJ_NUM_MAX);
priv->rx_obj_num += rx_obj_num; priv->rx_obj_num += rx_obj_num;
...@@ -330,11 +327,10 @@ int mcp251xfd_ring_alloc(struct mcp251xfd_priv *priv) ...@@ -330,11 +327,10 @@ int mcp251xfd_ring_alloc(struct mcp251xfd_priv *priv)
mcp251xfd_ring_free(priv); mcp251xfd_ring_free(priv);
return -ENOMEM; return -ENOMEM;
} }
rx_ring->obj_num = rx_obj_num; rx_ring->obj_num = rx_obj_num;
rx_ring->obj_size = rx_obj_size; rx_ring->obj_size = rx_obj_size;
priv->rx[i] = rx_ring; priv->rx[i] = rx_ring;
ram_free -= rx_ring->obj_num * rx_ring->obj_size;
} }
priv->rx_ring_num = i; priv->rx_ring_num = i;
......
...@@ -415,6 +415,8 @@ static_assert(MCP251XFD_TIMESTAMP_WORK_DELAY_SEC < ...@@ -415,6 +415,8 @@ static_assert(MCP251XFD_TIMESTAMP_WORK_DELAY_SEC <
#define MCP251XFD_FIFO_RX_NUM_MAX 1U #define MCP251XFD_FIFO_RX_NUM_MAX 1U
#define MCP251XFD_FIFO_TX_NUM 1U #define MCP251XFD_FIFO_TX_NUM 1U
#define MCP251XFD_FIFO_DEPTH 32U
static_assert(MCP251XFD_FIFO_TEF_NUM == 1U); static_assert(MCP251XFD_FIFO_TEF_NUM == 1U);
static_assert(MCP251XFD_FIFO_TEF_NUM == MCP251XFD_FIFO_TX_NUM); static_assert(MCP251XFD_FIFO_TEF_NUM == MCP251XFD_FIFO_TX_NUM);
static_assert(MCP251XFD_FIFO_RX_NUM_MAX <= 4U); static_assert(MCP251XFD_FIFO_RX_NUM_MAX <= 4U);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment