Commit 6b43673a authored by Taehee Yoo's avatar Taehee Yoo Committed by Jakub Kicinski
Browse files

bnxt_en: add support for hds-thresh ethtool command



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: default avatarStanislav Fomichev <sdf@fomichev.me>
Tested-by: default avatarAndy Gospodarek <gospo@broadcom.com>
Signed-off-by: default avatarTaehee Yoo <ap420073@gmail.com>
Reviewed-by: default avatarMichael Chan <michael.chan@broadcom.com>
Link: https://patch.msgid.link/20250114142852.3364986-9-ap420073@gmail.com


Signed-off-by: default avatarJakub Kicinski <kuba@kernel.org>
parent 87c8f849
Loading
Loading
Loading
Loading
+3 −1
Original line number Diff line number Diff line
@@ -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);
+2 −0
Original line number Diff line number Diff line
@@ -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)
{
+5 −1
Original line number Diff line number Diff line
@@ -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,