bnxt_en: Support CQE coalescing mode in ethtool
authorMichael Chan <michael.chan@broadcom.com>
Mon, 27 Dec 2021 08:00:30 +0000 (03:00 -0500)
committerDavid S. Miller <davem@davemloft.net>
Mon, 27 Dec 2021 12:00:28 +0000 (12:00 +0000)
Support showing and setting the CQE mode in ethtool.

Reviewed-by: Edwin Peer <edwin.peer@broadcom.com>
Signed-off-by: Michael Chan <michael.chan@broadcom.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

index 1525339..46859d9 100644 (file)
@@ -68,6 +68,9 @@ static int bnxt_get_coalesce(struct net_device *dev,
        coal->rx_max_coalesced_frames = hw_coal->coal_bufs / mult;
        coal->rx_coalesce_usecs_irq = hw_coal->coal_ticks_irq;
        coal->rx_max_coalesced_frames_irq = hw_coal->coal_bufs_irq / mult;
+       if (hw_coal->flags &
+           RING_CMPL_RING_CFG_AGGINT_PARAMS_REQ_FLAGS_TIMER_RESET)
+               kernel_coal->use_cqe_mode_rx = true;
 
        hw_coal = &bp->tx_coal;
        mult = hw_coal->bufs_per_record;
@@ -75,6 +78,9 @@ static int bnxt_get_coalesce(struct net_device *dev,
        coal->tx_max_coalesced_frames = hw_coal->coal_bufs / mult;
        coal->tx_coalesce_usecs_irq = hw_coal->coal_ticks_irq;
        coal->tx_max_coalesced_frames_irq = hw_coal->coal_bufs_irq / mult;
+       if (hw_coal->flags &
+           RING_CMPL_RING_CFG_AGGINT_PARAMS_REQ_FLAGS_TIMER_RESET)
+               kernel_coal->use_cqe_mode_tx = true;
 
        coal->stats_block_coalesce_usecs = bp->stats_coal_ticks;
 
@@ -101,12 +107,22 @@ static int bnxt_set_coalesce(struct net_device *dev,
                }
        }
 
+       if ((kernel_coal->use_cqe_mode_rx || kernel_coal->use_cqe_mode_tx) &&
+           !(bp->coal_cap.cmpl_params &
+             RING_AGGINT_QCAPS_RESP_CMPL_PARAMS_TIMER_RESET))
+               return -EOPNOTSUPP;
+
        hw_coal = &bp->rx_coal;
        mult = hw_coal->bufs_per_record;
        hw_coal->coal_ticks = coal->rx_coalesce_usecs;
        hw_coal->coal_bufs = coal->rx_max_coalesced_frames * mult;
        hw_coal->coal_ticks_irq = coal->rx_coalesce_usecs_irq;
        hw_coal->coal_bufs_irq = coal->rx_max_coalesced_frames_irq * mult;
+       hw_coal->flags &=
+               ~RING_CMPL_RING_CFG_AGGINT_PARAMS_REQ_FLAGS_TIMER_RESET;
+       if (kernel_coal->use_cqe_mode_rx)
+               hw_coal->flags |=
+                       RING_CMPL_RING_CFG_AGGINT_PARAMS_REQ_FLAGS_TIMER_RESET;
 
        hw_coal = &bp->tx_coal;
        mult = hw_coal->bufs_per_record;
@@ -114,6 +130,11 @@ static int bnxt_set_coalesce(struct net_device *dev,
        hw_coal->coal_bufs = coal->tx_max_coalesced_frames * mult;
        hw_coal->coal_ticks_irq = coal->tx_coalesce_usecs_irq;
        hw_coal->coal_bufs_irq = coal->tx_max_coalesced_frames_irq * mult;
+       hw_coal->flags &=
+               ~RING_CMPL_RING_CFG_AGGINT_PARAMS_REQ_FLAGS_TIMER_RESET;
+       if (kernel_coal->use_cqe_mode_tx)
+               hw_coal->flags |=
+                       RING_CMPL_RING_CFG_AGGINT_PARAMS_REQ_FLAGS_TIMER_RESET;
 
        if (bp->stats_coal_ticks != coal->stats_block_coalesce_usecs) {
                u32 stats_ticks = coal->stats_block_coalesce_usecs;
@@ -3921,7 +3942,8 @@ const struct ethtool_ops bnxt_ethtool_ops = {
                                     ETHTOOL_COALESCE_USECS_IRQ |
                                     ETHTOOL_COALESCE_MAX_FRAMES_IRQ |
                                     ETHTOOL_COALESCE_STATS_BLOCK_USECS |
-                                    ETHTOOL_COALESCE_USE_ADAPTIVE_RX,
+                                    ETHTOOL_COALESCE_USE_ADAPTIVE_RX |
+                                    ETHTOOL_COALESCE_USE_CQE,
        .get_link_ksettings     = bnxt_get_link_ksettings,
        .set_link_ksettings     = bnxt_set_link_ksettings,
        .get_fec_stats          = bnxt_get_fec_stats,