[PATCH 2/4] ethdev: announce VMDq capability

Kishore Padmanabha kishore.padmanabha at broadcom.com
Tue Apr 7 00:22:10 CEST 2026


On Fri, Apr 3, 2026 at 5:19 AM David Marchand <david.marchand at redhat.com>
wrote:

> Let's mark VMDq feature availability as a per device capability.
> We can then enforce API calls related to this feature are done on device
> with such capability.
>
> Signed-off-by: David Marchand <david.marchand at redhat.com>
> ---
>  drivers/net/bnxt/bnxt_ethdev.c                |  3 ++-
>  drivers/net/bnxt/bnxt_reps.c                  |  1 +
>  drivers/net/intel/e1000/em_ethdev.c           |  1 +
>  drivers/net/intel/e1000/igb_ethdev.c          |  1 +
>  drivers/net/intel/fm10k/fm10k_ethdev.c        |  1 +
>  drivers/net/intel/i40e/i40e_ethdev.c          |  3 ++-
>  drivers/net/intel/i40e/i40e_vf_representor.c  |  1 +
>  drivers/net/intel/ipn3ke/ipn3ke_representor.c |  3 ++-
>  drivers/net/intel/ixgbe/ixgbe_ethdev.c        |  2 ++
>  drivers/net/txgbe/txgbe_ethdev.c              |  1 +
>  drivers/net/txgbe/txgbe_ethdev_vf.c           |  1 +
>  lib/ethdev/rte_ethdev.c                       | 17 +++++++++++++++++
>  lib/ethdev/rte_ethdev.h                       |  2 ++
>  13 files changed, 34 insertions(+), 3 deletions(-)
>
> diff --git a/drivers/net/bnxt/bnxt_ethdev.c
> b/drivers/net/bnxt/bnxt_ethdev.c
> index b677f9491d..0f783b9e98 100644
> --- a/drivers/net/bnxt/bnxt_ethdev.c
> +++ b/drivers/net/bnxt/bnxt_ethdev.c
> @@ -1214,7 +1214,8 @@ static int bnxt_dev_info_get_op(struct rte_eth_dev
> *eth_dev,
>
>         dev_info->speed_capa = bnxt_get_speed_capabilities(bp);
>         dev_info->dev_capa = RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP |
> -                            RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP;
> +                            RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP |
> +                            RTE_ETH_DEV_CAPA_VMDQ;
>
We have not been testing the VMDq feature for sometime, planning to
deprecate this feature. Please remove this change.

>         dev_info->dev_capa &= ~RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP;
>
>         dev_info->default_rxconf = (struct rte_eth_rxconf) {
> diff --git a/drivers/net/bnxt/bnxt_reps.c b/drivers/net/bnxt/bnxt_reps.c
> index e26a086f41..5e834830e2 100644
> --- a/drivers/net/bnxt/bnxt_reps.c
> +++ b/drivers/net/bnxt/bnxt_reps.c
> @@ -649,6 +649,7 @@ int bnxt_rep_dev_info_get_op(struct rte_eth_dev
> *eth_dev,
>         dev_info->max_tx_queues = max_rx_rings;
>         dev_info->reta_size = bnxt_rss_hash_tbl_size(parent_bp);
>         dev_info->hash_key_size = 40;
> +       dev_info->dev_capa = RTE_ETH_DEV_CAPA_VMDQ;
>         dev_info->dev_capa &= ~RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP;
>
> We have not been testing the VMDq feature for sometime, planning to
deprecate this feature. Please remove this change.

>         /* MTU specifics */
> diff --git a/drivers/net/intel/e1000/em_ethdev.c
> b/drivers/net/intel/e1000/em_ethdev.c
> index 9e15e882b9..389744ad5e 100644
> --- a/drivers/net/intel/e1000/em_ethdev.c
> +++ b/drivers/net/intel/e1000/em_ethdev.c
> @@ -1175,6 +1175,7 @@ eth_em_infos_get(struct rte_eth_dev *dev, struct
> rte_eth_dev_info *dev_info)
>                         RTE_ETH_LINK_SPEED_100M_HD |
> RTE_ETH_LINK_SPEED_100M |
>                         RTE_ETH_LINK_SPEED_1G;
>
> +       dev_info->dev_capa = RTE_ETH_DEV_CAPA_VMDQ;
>         dev_info->dev_capa &= ~RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP;
>
>         /* Preferred queue parameters */
> diff --git a/drivers/net/intel/e1000/igb_ethdev.c
> b/drivers/net/intel/e1000/igb_ethdev.c
> index ef1599ac38..fe68c18417 100644
> --- a/drivers/net/intel/e1000/igb_ethdev.c
> +++ b/drivers/net/intel/e1000/igb_ethdev.c
> @@ -2324,6 +2324,7 @@ eth_igb_infos_get(struct rte_eth_dev *dev, struct
> rte_eth_dev_info *dev_info)
>         dev_info->tx_queue_offload_capa =
> igb_get_tx_queue_offloads_capa(dev);
>         dev_info->tx_offload_capa = igb_get_tx_port_offloads_capa(dev) |
>                                     dev_info->tx_queue_offload_capa;
> +       dev_info->dev_capa = RTE_ETH_DEV_CAPA_VMDQ;
>         dev_info->dev_capa &= ~RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP;
>
>         switch (hw->mac.type) {
> diff --git a/drivers/net/intel/fm10k/fm10k_ethdev.c
> b/drivers/net/intel/fm10k/fm10k_ethdev.c
> index 97f61afec2..037d2206fd 100644
> --- a/drivers/net/intel/fm10k/fm10k_ethdev.c
> +++ b/drivers/net/intel/fm10k/fm10k_ethdev.c
> @@ -1444,6 +1444,7 @@ fm10k_dev_infos_get(struct rte_eth_dev *dev,
>         dev_info->speed_capa = RTE_ETH_LINK_SPEED_1G |
> RTE_ETH_LINK_SPEED_2_5G |
>                         RTE_ETH_LINK_SPEED_10G | RTE_ETH_LINK_SPEED_25G |
>                         RTE_ETH_LINK_SPEED_40G | RTE_ETH_LINK_SPEED_100G;
> +       dev_info->dev_capa = RTE_ETH_DEV_CAPA_VMDQ;
>
>         return 0;
>  }
> diff --git a/drivers/net/intel/i40e/i40e_ethdev.c
> b/drivers/net/intel/i40e/i40e_ethdev.c
> index 100a751225..64c29c6e85 100644
> --- a/drivers/net/intel/i40e/i40e_ethdev.c
> +++ b/drivers/net/intel/i40e/i40e_ethdev.c
> @@ -3878,7 +3878,8 @@ i40e_dev_info_get(struct rte_eth_dev *dev, struct
> rte_eth_dev_info *dev_info)
>
>         dev_info->dev_capa =
>                 RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP |
> -               RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP;
> +               RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP |
> +               RTE_ETH_DEV_CAPA_VMDQ;
>         dev_info->dev_capa &= ~RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP;
>
>         dev_info->hash_key_size = (I40E_PFQF_HKEY_MAX_INDEX + 1) *
> diff --git a/drivers/net/intel/i40e/i40e_vf_representor.c
> b/drivers/net/intel/i40e/i40e_vf_representor.c
> index e8f0bb62a0..d31148acb5 100644
> --- a/drivers/net/intel/i40e/i40e_vf_representor.c
> +++ b/drivers/net/intel/i40e/i40e_vf_representor.c
> @@ -33,6 +33,7 @@ i40e_vf_representor_dev_infos_get(struct rte_eth_dev
> *ethdev,
>         /* get dev info for the vdev */
>         dev_info->device = ethdev->device;
>
> +       dev_info->dev_capa = RTE_ETH_DEV_CAPA_VMDQ;
>         dev_info->dev_capa &= ~RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP;
>
>         dev_info->max_rx_queues = ethdev->data->nb_rx_queues;
> diff --git a/drivers/net/intel/ipn3ke/ipn3ke_representor.c
> b/drivers/net/intel/ipn3ke/ipn3ke_representor.c
> index cd34d08055..d581ee3c37 100644
> --- a/drivers/net/intel/ipn3ke/ipn3ke_representor.c
> +++ b/drivers/net/intel/ipn3ke/ipn3ke_representor.c
> @@ -95,7 +95,8 @@ ipn3ke_rpst_dev_infos_get(struct rte_eth_dev *ethdev,
>
>         dev_info->dev_capa =
>                 RTE_ETH_DEV_CAPA_RUNTIME_RX_QUEUE_SETUP |
> -               RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP;
> +               RTE_ETH_DEV_CAPA_RUNTIME_TX_QUEUE_SETUP |
> +               RTE_ETH_DEV_CAPA_VMDQ;
>         dev_info->dev_capa &= ~RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP;
>
>         dev_info->switch_info.name = ethdev->device->name;
> diff --git a/drivers/net/intel/ixgbe/ixgbe_ethdev.c
> b/drivers/net/intel/ixgbe/ixgbe_ethdev.c
> index 57d929cf2c..5d886b3e28 100644
> --- a/drivers/net/intel/ixgbe/ixgbe_ethdev.c
> +++ b/drivers/net/intel/ixgbe/ixgbe_ethdev.c
> @@ -3997,6 +3997,7 @@ ixgbe_dev_info_get(struct rte_eth_dev *dev, struct
> rte_eth_dev_info *dev_info)
>         dev_info->max_mtu =  dev_info->max_rx_pktlen - IXGBE_ETH_OVERHEAD;
>         dev_info->min_mtu = RTE_ETHER_MIN_MTU;
>         dev_info->vmdq_queue_num = dev_info->max_rx_queues;
> +       dev_info->dev_capa = RTE_ETH_DEV_CAPA_VMDQ;
>         dev_info->rx_queue_offload_capa = ixgbe_get_rx_queue_offloads(dev);
>         dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads(dev) |
>                                      dev_info->rx_queue_offload_capa);
> @@ -4115,6 +4116,7 @@ ixgbevf_dev_info_get(struct rte_eth_dev *dev,
>                 dev_info->max_vmdq_pools = RTE_ETH_16_POOLS;
>         else
>                 dev_info->max_vmdq_pools = RTE_ETH_64_POOLS;
> +       dev_info->dev_capa = RTE_ETH_DEV_CAPA_VMDQ;
>         dev_info->rx_queue_offload_capa = ixgbe_get_rx_queue_offloads(dev);
>         dev_info->rx_offload_capa = (ixgbe_get_rx_port_offloads(dev) |
>                                      dev_info->rx_queue_offload_capa);
> diff --git a/drivers/net/txgbe/txgbe_ethdev.c
> b/drivers/net/txgbe/txgbe_ethdev.c
> index 5d360f8305..bd818e8269 100644
> --- a/drivers/net/txgbe/txgbe_ethdev.c
> +++ b/drivers/net/txgbe/txgbe_ethdev.c
> @@ -2836,6 +2836,7 @@ txgbe_dev_info_get(struct rte_eth_dev *dev, struct
> rte_eth_dev_info *dev_info)
>         dev_info->max_vfs = pci_dev->max_vfs;
>         dev_info->max_vmdq_pools = RTE_ETH_64_POOLS;
>         dev_info->vmdq_queue_num = dev_info->max_rx_queues;
> +       dev_info->dev_capa = RTE_ETH_DEV_CAPA_VMDQ;
>         dev_info->dev_capa &= ~RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP;
>         dev_info->rx_queue_offload_capa = txgbe_get_rx_queue_offloads(dev);
>         dev_info->rx_offload_capa = (txgbe_get_rx_port_offloads(dev) |
> diff --git a/drivers/net/txgbe/txgbe_ethdev_vf.c
> b/drivers/net/txgbe/txgbe_ethdev_vf.c
> index 39a5fff65c..934763574c 100644
> --- a/drivers/net/txgbe/txgbe_ethdev_vf.c
> +++ b/drivers/net/txgbe/txgbe_ethdev_vf.c
> @@ -572,6 +572,7 @@ txgbevf_dev_info_get(struct rte_eth_dev *dev,
>         dev_info->max_hash_mac_addrs = TXGBE_VMDQ_NUM_UC_MAC;
>         dev_info->max_vfs = pci_dev->max_vfs;
>         dev_info->max_vmdq_pools = RTE_ETH_64_POOLS;
> +       dev_info->dev_capa = RTE_ETH_DEV_CAPA_VMDQ;
>         dev_info->dev_capa &= ~RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP;
>         dev_info->rx_queue_offload_capa = txgbe_get_rx_queue_offloads(dev);
>         dev_info->rx_offload_capa = (txgbe_get_rx_port_offloads(dev) |
> diff --git a/lib/ethdev/rte_ethdev.c b/lib/ethdev/rte_ethdev.c
> index 9577b7d848..7ba539e796 100644
> --- a/lib/ethdev/rte_ethdev.c
> +++ b/lib/ethdev/rte_ethdev.c
> @@ -158,6 +158,7 @@ static const struct {
>         {RTE_ETH_DEV_CAPA_RXQ_SHARE, "RXQ_SHARE"},
>         {RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP, "FLOW_RULE_KEEP"},
>         {RTE_ETH_DEV_CAPA_FLOW_SHARED_OBJECT_KEEP,
> "FLOW_SHARED_OBJECT_KEEP"},
> +       {RTE_ETH_DEV_CAPA_VMDQ, "VMDQ"},
>  };
>
>  enum {
> @@ -1581,6 +1582,22 @@ rte_eth_dev_configure(uint16_t port_id, uint16_t
> nb_rx_q, uint16_t nb_tx_q,
>                 goto rollback;
>         }
>
> +       if (!(dev_info.dev_capa & RTE_ETH_DEV_CAPA_VMDQ)) {
> +               if ((dev_conf->rxmode.mq_mode & RTE_ETH_MQ_RX_VMDQ_FLAG)
> != 0) {
> +                       RTE_ETHDEV_LOG_LINE(ERR, "Ethdev port_id=%u does
> not support VMDq rx mode",
> +                               port_id);
> +                       ret = -EINVAL;
> +                       goto rollback;
> +               }
> +               if (dev_conf->txmode.mq_mode == RTE_ETH_MQ_TX_VMDQ_DCB ||
> +                               dev_conf->txmode.mq_mode ==
> RTE_ETH_MQ_TX_VMDQ_ONLY) {
> +                       RTE_ETHDEV_LOG_LINE(ERR, "Ethdev port_id=%u does
> not support VMDq tx mode",
> +                               port_id);
> +                       ret = -EINVAL;
> +                       goto rollback;
> +               }
> +       }
> +
>         /*
>          * Setup new number of Rx/Tx queues and reconfigure device.
>          */
> diff --git a/lib/ethdev/rte_ethdev.h b/lib/ethdev/rte_ethdev.h
> index 0d8e2d0236..62c72de0e5 100644
> --- a/lib/ethdev/rte_ethdev.h
> +++ b/lib/ethdev/rte_ethdev.h
> @@ -1696,6 +1696,8 @@ struct rte_eth_conf {
>  #define RTE_ETH_DEV_CAPA_FLOW_RULE_KEEP         RTE_BIT64(3)
>  /** Device supports keeping shared flow objects across restart. */
>  #define RTE_ETH_DEV_CAPA_FLOW_SHARED_OBJECT_KEEP RTE_BIT64(4)
> +/** Device supports VMDq. */
> +#define RTE_ETH_DEV_CAPA_VMDQ RTE_BIT64(5)
>  /**@}*/
>
>  /*
> --
> 2.53.0
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mails.dpdk.org/archives/dev/attachments/20260406/7bab5a7b/attachment-0001.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: smime.p7s
Type: application/pkcs7-signature
Size: 5493 bytes
Desc: S/MIME Cryptographic Signature
URL: <http://mails.dpdk.org/archives/dev/attachments/20260406/7bab5a7b/attachment-0001.bin>


More information about the dev mailing list