can: mcp251xfd: ring: prepare support for runtime configurable RX/TX ring parameters
authorMarc Kleine-Budde <mkl@pengutronix.de>
Mon, 25 Oct 2021 09:34:32 +0000 (11:34 +0200)
committerMarc Kleine-Budde <mkl@pengutronix.de>
Sun, 13 Mar 2022 08:45:35 +0000 (09:45 +0100)
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.de
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
drivers/net/can/spi/mcp251xfd/mcp251xfd-ring.c
drivers/net/can/spi/mcp251xfd/mcp251xfd.h

index e540c97b41604f5f698abb338a83c3ca17a9146c..0e78941601bfeabce8cda16cd9389d7e2a7e25e0 100644 (file)
@@ -289,9 +289,9 @@ int mcp251xfd_ring_alloc(struct mcp251xfd_priv *priv)
 {
        struct mcp251xfd_tx_ring *tx_ring;
        struct mcp251xfd_rx_ring *rx_ring;
-       int tef_obj_size, tx_obj_size, rx_obj_size;
-       int tx_obj_num;
-       int ram_free, i;
+       u8 tef_obj_size, tx_obj_size, rx_obj_size;
+       u8 tx_obj_num;
+       u8 rem, i;
 
        tef_obj_size = sizeof(struct mcp251xfd_hw_tef_obj);
        if (mcp251xfd_is_fd_mode(priv)) {
@@ -310,17 +310,14 @@ int mcp251xfd_ring_alloc(struct mcp251xfd_priv *priv)
        tx_ring->obj_num = tx_obj_num;
        tx_ring->obj_size = tx_obj_size;
 
-       ram_free = MCP251XFD_RAM_SIZE - tx_obj_num *
-               (tef_obj_size + tx_obj_size);
+       rem = (MCP251XFD_RAM_SIZE - tx_obj_num *
+              (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;
-            i < ARRAY_SIZE(priv->rx) && ram_free >= rx_obj_size;
-            i++) {
-               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);
+               rx_obj_num = min_t(u8, rounddown_pow_of_two(rem),
+                                  MCP251XFD_FIFO_DEPTH);
+               rem -= rx_obj_num;
 
                priv->rx_obj_num += rx_obj_num;
 
@@ -330,11 +327,10 @@ int mcp251xfd_ring_alloc(struct mcp251xfd_priv *priv)
                        mcp251xfd_ring_free(priv);
                        return -ENOMEM;
                }
+
                rx_ring->obj_num = rx_obj_num;
                rx_ring->obj_size = rx_obj_size;
                priv->rx[i] = rx_ring;
-
-               ram_free -= rx_ring->obj_num * rx_ring->obj_size;
        }
        priv->rx_ring_num = i;
 
index 5c7a672464b18b937dbcb610948402b3f207e358..bd7a9999b5e360bf14bba81612f46dd929314c28 100644 (file)
@@ -415,6 +415,8 @@ static_assert(MCP251XFD_TIMESTAMP_WORK_DELAY_SEC <
 #define MCP251XFD_FIFO_RX_NUM_MAX 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 == MCP251XFD_FIFO_TX_NUM);
 static_assert(MCP251XFD_FIFO_RX_NUM_MAX <= 4U);