bnxt_en: add support for hds-thresh ethtool command
authorTaehee Yoo <ap420073@gmail.com>
Tue, 14 Jan 2025 14:28:50 +0000 (14:28 +0000)
committerJakub Kicinski <kuba@kernel.org>
Wed, 15 Jan 2025 22:42:12 +0000 (14:42 -0800)
The bnxt_en driver has configured the hds_threshold value automatically
when TPA is enabled based on the rx-copybreak default value.
Now the hds-thresh ethtool command is added, so it adds an
implementation of hds-thresh option.

Configuration of the hds-thresh is applied only when
the tcp-data-split is enabled. The default value of
hds-thresh is 256, which is the default value of
rx-copybreak, which used to be the hds_thresh value.

The maximum hds-thresh is 1023.

   # Example:
   # ethtool -G enp14s0f0np0 tcp-data-split on hds-thresh 256
   # ethtool -g enp14s0f0np0
   Ring parameters for enp14s0f0np0:
   Pre-set maximums:
   ...
   HDS thresh:  1023
   Current hardware settings:
   ...
   TCP data split:         on
   HDS thresh:  256

Tested-by: Stanislav Fomichev <sdf@fomichev.me>
Tested-by: Andy Gospodarek <gospo@broadcom.com>
Signed-off-by: Taehee Yoo <ap420073@gmail.com>
Reviewed-by: Michael Chan <michael.chan@broadcom.com>
Link: https://patch.msgid.link/20250114142852.3364986-9-ap420073@gmail.com
Signed-off-by: Jakub Kicinski <kuba@kernel.org>
drivers/net/ethernet/broadcom/bnxt/bnxt.c
drivers/net/ethernet/broadcom/bnxt/bnxt.h
drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c

index f029559a581e515034d462e4766b4b67e621fd35..caddb5cbc02464b350d7cc6b85618f321ece7693 100644 (file)
@@ -4610,6 +4610,7 @@ void bnxt_set_tpa_flags(struct bnxt *bp)
 static void bnxt_init_ring_params(struct bnxt *bp)
 {
        bp->rx_copybreak = BNXT_DEFAULT_RX_COPYBREAK;
+       bp->dev->ethtool->hds_thresh = BNXT_DEFAULT_RX_COPYBREAK;
 }
 
 /* bp->rx_ring_size, bp->tx_ring_size, dev->mtu, BNXT_FLAG_{G|L}RO flags must
@@ -6569,6 +6570,7 @@ static void bnxt_hwrm_update_rss_hash_cfg(struct bnxt *bp)
 
 static int bnxt_hwrm_vnic_set_hds(struct bnxt *bp, struct bnxt_vnic_info *vnic)
 {
+       u16 hds_thresh = (u16)bp->dev->ethtool->hds_thresh;
        struct hwrm_vnic_plcmodes_cfg_input *req;
        int rc;
 
@@ -6585,7 +6587,7 @@ static int bnxt_hwrm_vnic_set_hds(struct bnxt *bp, struct bnxt_vnic_info *vnic)
                                          VNIC_PLCMODES_CFG_REQ_FLAGS_HDS_IPV6);
                req->enables |=
                        cpu_to_le32(VNIC_PLCMODES_CFG_REQ_ENABLES_HDS_THRESHOLD_VALID);
-               req->hds_threshold = cpu_to_le16(bp->rx_copybreak);
+               req->hds_threshold = cpu_to_le16(hds_thresh);
        }
        req->vnic_id = cpu_to_le32(vnic->fw_vnic_id);
        return hwrm_req_send(bp, req);
index 7dc06e07bae2aadd350c946b6152b1a3fd0c5d3d..8f481dd9c22454bfaaa28209fa0b5f4e54eba234 100644 (file)
@@ -2779,6 +2779,8 @@ struct bnxt {
 #define SFF_MODULE_ID_QSFP28                   0x11
 #define BNXT_MAX_PHY_I2C_RESP_SIZE             64
 
+#define BNXT_HDS_THRESHOLD_MAX                 1023
+
 static inline u32 bnxt_tx_avail(struct bnxt *bp,
                                const struct bnxt_tx_ring_info *txr)
 {
index 413007190f509c0884f04a79c8528709b4562f00..540c140d52dcfed42508693e1340e98ec2d9dc68 100644 (file)
@@ -833,6 +833,9 @@ static void bnxt_get_ringparam(struct net_device *dev,
        ering->rx_pending = bp->rx_ring_size;
        ering->rx_jumbo_pending = bp->rx_agg_ring_size;
        ering->tx_pending = bp->tx_ring_size;
+
+       kernel_ering->hds_thresh = dev->ethtool->hds_thresh;
+       kernel_ering->hds_thresh_max = BNXT_HDS_THRESHOLD_MAX;
 }
 
 static int bnxt_set_ringparam(struct net_device *dev,
@@ -5390,7 +5393,8 @@ const struct ethtool_ops bnxt_ethtool_ops = {
                                     ETHTOOL_COALESCE_STATS_BLOCK_USECS |
                                     ETHTOOL_COALESCE_USE_ADAPTIVE_RX |
                                     ETHTOOL_COALESCE_USE_CQE,
-       .supported_ring_params  = ETHTOOL_RING_USE_TCP_DATA_SPLIT,
+       .supported_ring_params  = ETHTOOL_RING_USE_TCP_DATA_SPLIT |
+                                 ETHTOOL_RING_USE_HDS_THRS,
        .get_link_ksettings     = bnxt_get_link_ksettings,
        .set_link_ksettings     = bnxt_set_link_ksettings,
        .get_fec_stats          = bnxt_get_fec_stats,