]> git.ipfire.org Git - thirdparty/kernel/stable.git/commitdiff
amd-xgbe: Configure and retrieve 'tx-usecs' for Tx coalescing
authorVishal Badole <Vishal.Badole@amd.com>
Sat, 16 Aug 2025 14:19:41 +0000 (19:49 +0530)
committerJakub Kicinski <kuba@kernel.org>
Tue, 19 Aug 2025 00:50:55 +0000 (17:50 -0700)
Ethtool has advanced with additional configurable options, but the
current driver does not support tx-usecs configuration using Ethtool.

Add support to configure and retrieve 'tx-usecs' using ethtool, which
specifies the wait time before servicing an interrupt for Tx coalescing.

Signed-off-by: Vishal Badole <Vishal.Badole@amd.com>
Acked-by: Shyam Sundar S K <Shyam-sundar.S-k@amd.com>
Link: https://patch.msgid.link/20250816141941.126054-1-Vishal.Badole@amd.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/amd/xgbe/xgbe-ethtool.c
drivers/net/ethernet/amd/xgbe/xgbe.h

index be0d2c7d08dc2825515ff8f79bf725d263672c68..35d73306a2d6b2d60509bc02159b4188a69e3cf8 100644 (file)
@@ -329,6 +329,7 @@ static int xgbe_get_coalesce(struct net_device *netdev,
        ec->rx_coalesce_usecs = pdata->rx_usecs;
        ec->rx_max_coalesced_frames = pdata->rx_frames;
 
+       ec->tx_coalesce_usecs = pdata->tx_usecs;
        ec->tx_max_coalesced_frames = pdata->tx_frames;
 
        return 0;
@@ -342,7 +343,8 @@ static int xgbe_set_coalesce(struct net_device *netdev,
        struct xgbe_prv_data *pdata = netdev_priv(netdev);
        struct xgbe_hw_if *hw_if = &pdata->hw_if;
        unsigned int rx_frames, rx_riwt, rx_usecs;
-       unsigned int tx_frames;
+       unsigned int tx_frames, tx_usecs;
+       unsigned int jiffy_us = jiffies_to_usecs(1);
 
        rx_riwt = hw_if->usec_to_riwt(pdata, ec->rx_coalesce_usecs);
        rx_usecs = ec->rx_coalesce_usecs;
@@ -364,20 +366,42 @@ static int xgbe_set_coalesce(struct net_device *netdev,
                return -EINVAL;
        }
 
+       tx_usecs = ec->tx_coalesce_usecs;
        tx_frames = ec->tx_max_coalesced_frames;
 
        /* Check the bounds of values for Tx */
+       if (!tx_usecs) {
+               NL_SET_ERR_MSG_FMT_MOD(extack,
+                                      "tx-usecs must not be 0");
+               return -EINVAL;
+       }
+       if (tx_usecs > XGMAC_MAX_COAL_TX_TICK) {
+               NL_SET_ERR_MSG_FMT_MOD(extack, "tx-usecs is limited to %d usec",
+                                      XGMAC_MAX_COAL_TX_TICK);
+               return -EINVAL;
+       }
        if (tx_frames > pdata->tx_desc_count) {
                netdev_err(netdev, "tx-frames is limited to %d frames\n",
                           pdata->tx_desc_count);
                return -EINVAL;
        }
 
+       /* Round tx-usecs to nearest multiple of jiffy granularity */
+       if (tx_usecs % jiffy_us) {
+               tx_usecs = rounddown(tx_usecs, jiffy_us);
+               if (!tx_usecs)
+                       tx_usecs = jiffy_us;
+               NL_SET_ERR_MSG_FMT_MOD(extack,
+                                      "tx-usecs rounded to %u usec due to jiffy granularity (%u usec)",
+                                      tx_usecs, jiffy_us);
+       }
+
        pdata->rx_riwt = rx_riwt;
        pdata->rx_usecs = rx_usecs;
        pdata->rx_frames = rx_frames;
        hw_if->config_rx_coalesce(pdata);
 
+       pdata->tx_usecs = tx_usecs;
        pdata->tx_frames = tx_frames;
        hw_if->config_tx_coalesce(pdata);
 
@@ -709,7 +733,7 @@ out:
 }
 
 static const struct ethtool_ops xgbe_ethtool_ops = {
-       .supported_coalesce_params = ETHTOOL_COALESCE_RX_USECS |
+       .supported_coalesce_params = ETHTOOL_COALESCE_USECS |
                                     ETHTOOL_COALESCE_MAX_FRAMES,
        .get_drvinfo = xgbe_get_drvinfo,
        .get_msglevel = xgbe_get_msglevel,
index d7e03e292ec4be1763e7aa01e3c40ec714988603..0fa80a238ac5d0648f791bf111ee34892a5dd66d 100644 (file)
 /* Default coalescing parameters */
 #define XGMAC_INIT_DMA_TX_USECS                1000
 #define XGMAC_INIT_DMA_TX_FRAMES       25
+#define XGMAC_MAX_COAL_TX_TICK         100000
 
 #define XGMAC_MAX_DMA_RIWT             0xff
 #define XGMAC_INIT_DMA_RX_USECS                30