diff options
author | Marc Kleine-Budde <mkl@pengutronix.de> | 2021-10-25 11:34:32 +0200 |
---|---|---|
committer | Marc Kleine-Budde <mkl@pengutronix.de> | 2022-03-13 09:45:36 +0100 |
commit | 9263c2e92be95a7bba009d760420170f808c2243 (patch) | |
tree | e7202bf333ec12a0388f38f11360920fcf582415 /drivers/net/can/spi/mcp251xfd/mcp251xfd-ethtool.c | |
parent | c9e6b80dfd48d1229348ac278da2a5cb79024b32 (diff) |
can: mcp251xfd: ring: add support for runtime configurable RX/TX ring parameters
This patch adds runtime configurable RX and TX ring parameters via
ethtool to the driver.
Link: https://lore.kernel.org/20220313083640.501791-8-mkl@pengutronix.de
Signed-off-by: Marc Kleine-Budde <mkl@pengutronix.de>
Diffstat (limited to 'drivers/net/can/spi/mcp251xfd/mcp251xfd-ethtool.c')
-rw-r--r-- | drivers/net/can/spi/mcp251xfd/mcp251xfd-ethtool.c | 37 |
1 files changed, 35 insertions, 2 deletions
diff --git a/drivers/net/can/spi/mcp251xfd/mcp251xfd-ethtool.c b/drivers/net/can/spi/mcp251xfd/mcp251xfd-ethtool.c index 4131185eaf5a..8825195fa05f 100644 --- a/drivers/net/can/spi/mcp251xfd/mcp251xfd-ethtool.c +++ b/drivers/net/can/spi/mcp251xfd/mcp251xfd-ethtool.c @@ -9,6 +9,7 @@ #include <linux/ethtool.h> #include "mcp251xfd.h" +#include "mcp251xfd-ram.h" static void mcp251xfd_ring_get_ringparam(struct net_device *ndev, @@ -17,19 +18,51 @@ mcp251xfd_ring_get_ringparam(struct net_device *ndev, struct netlink_ext_ack *extack) { const struct mcp251xfd_priv *priv = netdev_priv(ndev); + const bool fd_mode = mcp251xfd_is_fd_mode(priv); + struct can_ram_layout layout; - ring->rx_max_pending = MCP251XFD_RX_OBJ_NUM_MAX; - ring->tx_max_pending = MCP251XFD_TX_OBJ_NUM_MAX; + can_ram_get_layout(&layout, &mcp251xfd_ram_config, NULL, NULL, fd_mode); + ring->rx_max_pending = layout.max_rx; + ring->tx_max_pending = layout.max_tx; ring->rx_pending = priv->rx_obj_num; ring->tx_pending = priv->tx->obj_num; } +static int +mcp251xfd_ring_set_ringparam(struct net_device *ndev, + struct ethtool_ringparam *ring, + struct kernel_ethtool_ringparam *kernel_ring, + struct netlink_ext_ack *extack) +{ + struct mcp251xfd_priv *priv = netdev_priv(ndev); + const bool fd_mode = mcp251xfd_is_fd_mode(priv); + struct can_ram_layout layout; + + can_ram_get_layout(&layout, &mcp251xfd_ram_config, ring, NULL, fd_mode); + if ((layout.cur_rx != priv->rx_obj_num || + layout.cur_tx != priv->tx->obj_num) && + netif_running(ndev)) + return -EBUSY; + + priv->rx_obj_num = layout.cur_rx; + priv->tx->obj_num = layout.cur_tx; + + return 0; +} + static const struct ethtool_ops mcp251xfd_ethtool_ops = { .get_ringparam = mcp251xfd_ring_get_ringparam, + .set_ringparam = mcp251xfd_ring_set_ringparam, }; void mcp251xfd_ethtool_init(struct mcp251xfd_priv *priv) { + struct can_ram_layout layout; + priv->ndev->ethtool_ops = &mcp251xfd_ethtool_ops; + + can_ram_get_layout(&layout, &mcp251xfd_ram_config, NULL, NULL, false); + priv->rx_obj_num = layout.default_rx; + priv->tx->obj_num = layout.default_tx; } |