#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
        #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 |             \
 
                              struct kernel_ethtool_ringparam *kernel_ering,
                              struct netlink_ext_ack *extack)
 {
+       u8 tcp_data_split = kernel_ering->tcp_data_split;
        struct bnxt *bp = netdev_priv(dev);
+       u8 hds_config_mod;
 
        if ((ering->rx_pending > BNXT_MAX_RX_DESC_CNT) ||
            (ering->tx_pending > BNXT_MAX_TX_DESC_CNT) ||
            (ering->tx_pending < BNXT_MIN_TX_DESC_CNT))
                return -EINVAL;
 
+       hds_config_mod = tcp_data_split != dev->ethtool->hds_config;
+       if (tcp_data_split == ETHTOOL_TCP_DATA_SPLIT_DISABLED && hds_config_mod)
+               return -EINVAL;
+
+       if (tcp_data_split == ETHTOOL_TCP_DATA_SPLIT_ENABLED &&
+           hds_config_mod && BNXT_RX_PAGE_MODE(bp)) {
+               NL_SET_ERR_MSG_MOD(extack, "tcp-data-split is disallowed when XDP is attached");
+               return -EINVAL;
+       }
+
        if (netif_running(dev))
                bnxt_close_nic(bp, false, false);
 
+       if (hds_config_mod) {
+               if (tcp_data_split == ETHTOOL_TCP_DATA_SPLIT_ENABLED)
+                       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);
                                     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,
 
                            bp->dev->mtu, BNXT_MAX_PAGE_MODE_MTU);
                return -EOPNOTSUPP;
        }
+       if (prog && bp->flags & BNXT_FLAG_HDS) {
+               netdev_warn(dev, "XDP is disallowed when HDS is enabled.\n");
+               return -EOPNOTSUPP;
+       }
        if (!(bp->flags & BNXT_FLAG_SHARED_RINGS)) {
                netdev_warn(dev, "ethtool rx/tx channels must be combined to support XDP.\n");
                return -EOPNOTSUPP;