On Wed, Nov 13, 2024 at 05:32:17PM +0000, Taehee Yoo wrote: > NICs that uses bnxt_en driver supports tcp-data-split feature by the > name of HDS(header-data-split). > But there is no implementation for the HDS to enable by ethtool. > Only getting the current HDS status is implemented and The HDS is just > automatically enabled only when either LRO, HW-GRO, or JUMBO is enabled. > The hds_threshold follows rx-copybreak value. and it was unchangeable. > > This implements `ethtool -G <interface name> tcp-data-split <value>` > command option. > The value can be <on> and <auto>. > The value is <auto> and one of LRO/GRO/JUMBO is enabled, HDS is > automatically enabled and all LRO/GRO/JUMBO are disabled, HDS is > automatically disabled. > > HDS feature relies on the aggregation ring. > So, if HDS is enabled, the bnxt_en driver initializes the aggregation ring. > This is the reason why BNXT_FLAG_AGG_RINGS contains HDS condition. > > Tested-by: Stanislav Fomichev <sdf@xxxxxxxxxxx> > Signed-off-by: Taehee Yoo <ap420073@xxxxxxxxx> Tested-by: Andy Gospodarek <gospo@xxxxxxxxxxxx> > --- > > v5: > - Do not set HDS if XDP is attached. > - Enable tcp-data-split only when tcp_data_split_mod is true. > > v4: > - Do not support disable tcp-data-split. > - Add Test tag from Stanislav. > > v3: > - No changes. > > v2: > - Do not set hds_threshold to 0. > > drivers/net/ethernet/broadcom/bnxt/bnxt.c | 2 +- > drivers/net/ethernet/broadcom/bnxt/bnxt.h | 5 +++-- > .../net/ethernet/broadcom/bnxt/bnxt_ethtool.c | 19 +++++++++++++++++++ > 3 files changed, 23 insertions(+), 3 deletions(-) > > diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.c b/drivers/net/ethernet/broadcom/bnxt/bnxt.c > index d521b8918c02..608bcca71676 100644 > --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.c > +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.c > @@ -4474,7 +4474,7 @@ void bnxt_set_ring_params(struct bnxt *bp) > bp->rx_agg_ring_size = 0; > bp->rx_agg_nr_pages = 0; > > - if (bp->flags & BNXT_FLAG_TPA) > + if (bp->flags & BNXT_FLAG_TPA || bp->flags & BNXT_FLAG_HDS) > agg_factor = min_t(u32, 4, 65536 / BNXT_RX_PAGE_SIZE); > > bp->flags &= ~BNXT_FLAG_JUMBO; > diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt.h b/drivers/net/ethernet/broadcom/bnxt/bnxt.h > index d1eef880eec5..3a7d2f3ebb2a 100644 > --- a/drivers/net/ethernet/broadcom/bnxt/bnxt.h > +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt.h > @@ -2202,8 +2202,6 @@ struct bnxt { > #define BNXT_FLAG_TPA (BNXT_FLAG_LRO | BNXT_FLAG_GRO) > #define BNXT_FLAG_JUMBO 0x10 > #define BNXT_FLAG_STRIP_VLAN 0x20 > - #define BNXT_FLAG_AGG_RINGS (BNXT_FLAG_JUMBO | BNXT_FLAG_GRO | \ > - BNXT_FLAG_LRO) > #define BNXT_FLAG_RFS 0x100 > #define BNXT_FLAG_SHARED_RINGS 0x200 > #define BNXT_FLAG_PORT_STATS 0x400 > @@ -2224,6 +2222,9 @@ struct bnxt { > #define BNXT_FLAG_ROCE_MIRROR_CAP 0x4000000 > #define BNXT_FLAG_TX_COAL_CMPL 0x8000000 > #define BNXT_FLAG_PORT_STATS_EXT 0x10000000 > + #define BNXT_FLAG_HDS 0x20000000 > + #define BNXT_FLAG_AGG_RINGS (BNXT_FLAG_JUMBO | BNXT_FLAG_GRO | \ > + BNXT_FLAG_LRO | BNXT_FLAG_HDS) > > #define BNXT_FLAG_ALL_CONFIG_FEATS (BNXT_FLAG_TPA | \ > BNXT_FLAG_RFS | \ > diff --git a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c > index adf30d1f738f..b0054eef389b 100644 > --- a/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c > +++ b/drivers/net/ethernet/broadcom/bnxt/bnxt_ethtool.c > @@ -840,6 +840,8 @@ static int bnxt_set_ringparam(struct net_device *dev, > struct kernel_ethtool_ringparam *kernel_ering, > struct netlink_ext_ack *extack) > { > + u8 tcp_data_split_mod = kernel_ering->tcp_data_split_mod; > + u8 tcp_data_split = kernel_ering->tcp_data_split; > struct bnxt *bp = netdev_priv(dev); > > if ((ering->rx_pending > BNXT_MAX_RX_DESC_CNT) || > @@ -847,9 +849,25 @@ static int bnxt_set_ringparam(struct net_device *dev, > (ering->tx_pending < BNXT_MIN_TX_DESC_CNT)) > return -EINVAL; > > + if (tcp_data_split == ETHTOOL_TCP_DATA_SPLIT_DISABLED && > + tcp_data_split_mod) > + return -EOPNOTSUPP; > + > + if (tcp_data_split == ETHTOOL_TCP_DATA_SPLIT_ENABLED && > + tcp_data_split_mod && BNXT_RX_PAGE_MODE(bp)) { > + NL_SET_ERR_MSG_MOD(extack, "tcp-data-split is disallowed when XDP is attached"); > + return -EOPNOTSUPP; > + } > + > if (netif_running(dev)) > bnxt_close_nic(bp, false, false); > > + if (tcp_data_split == ETHTOOL_TCP_DATA_SPLIT_ENABLED && > + tcp_data_split_mod) > + bp->flags |= BNXT_FLAG_HDS; > + else if (tcp_data_split == ETHTOOL_TCP_DATA_SPLIT_UNKNOWN) > + bp->flags &= ~BNXT_FLAG_HDS; > + > bp->rx_ring_size = ering->rx_pending; > bp->tx_ring_size = ering->tx_pending; > bnxt_set_ring_params(bp); > @@ -5345,6 +5363,7 @@ 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, > .get_link_ksettings = bnxt_get_link_ksettings, > .set_link_ksettings = bnxt_set_link_ksettings, > .get_fec_stats = bnxt_get_fec_stats, > -- > 2.34.1 >