[PATCH] net/cpfl: fix VF ID calculation for vCPF

Bruce Richardson bruce.richardson at intel.com
Fri Sep 4 12:35:47 CEST 2026


On Fri, Aug 28, 2026 at 02:52:16AM +0530, Atul Patel wrote:
> The VF ID was incorrectly set to only the PCI function number,
> which fails when VFs span multiple PCI devices (device IDs > 0).
> Calculate the VF ID as (device_id * 8) + function to correctly
> map VFs across devices.
> 

Is this saying that the vf_id's need to be globally unique across the whole
system, or is there some other subtlety that I'm missing here? Just trying
to understand the context of this patch, thanks. Most other devices the vf
id is local only to the relevant PF, i.e. each device has its own vf 0 etc.
Is that not the case here?

/Bruce

> Fixes: f1ab44fb0ebf ("net/cpfl: add vCPF port info")
> 
> Signed-off-by: Praveen Shetty <praveen.shetty at intel.com>
> Signed-off-by: Atul Patel <atul.patel at intel.com>
> Signed-off-by: Dhananjay Shukla <dhananjay.shukla at intel.com>
> ---
>  drivers/net/intel/cpfl/cpfl_ethdev.c |  3 ++-
>  drivers/net/intel/cpfl/cpfl_ethdev.h | 10 ++++++++++
>  2 files changed, 12 insertions(+), 1 deletion(-)
> 
> diff --git a/drivers/net/intel/cpfl/cpfl_ethdev.c b/drivers/net/intel/cpfl/cpfl_ethdev.c
> index 4315adb68c..01e1b57cc8 100644
> --- a/drivers/net/intel/cpfl/cpfl_ethdev.c
> +++ b/drivers/net/intel/cpfl/cpfl_ethdev.c
> @@ -2839,7 +2839,8 @@ cpfl_dev_vport_init(struct rte_eth_dev *dev, void *init_params)
>  		pci_dev = RTE_CLASS_TO_BUS_DEVICE(dev, *pci_dev);
>  		vi.func_type = VCPF_CPCHNL2_FTYPE_LAN_VF;
>  		vi.pf_id = CPFL_HOST0_CPF_ID;
> -		vi.vf_id = pci_dev->addr.function;
> +		vi.vf_id = VCPF_VF_ID_FROM_PCI(pci_dev->addr.devid,
> +						pci_dev->addr.function);
>  
>  		v_id.vport_id = cpfl_vport->base.vport_info.info.vport_id;
>  		v_id.vport_type = cpfl_vport->base.vport_info.info.vport_type;
> diff --git a/drivers/net/intel/cpfl/cpfl_ethdev.h b/drivers/net/intel/cpfl/cpfl_ethdev.h
> index d41aa93191..97ec128128 100644
> --- a/drivers/net/intel/cpfl/cpfl_ethdev.h
> +++ b/drivers/net/intel/cpfl/cpfl_ethdev.h
> @@ -103,6 +103,16 @@
>  	((((type) & 0x3) << 14) + (((host_id) & 0x1) << 13) +	\
>  	 (((pf_id) & 0x1) << 12) + ((vf_id) & 0xfff))
>  
> +/* Max VFs per PCI device (functions 0-7) */
> +#define VCPF_VFS_PER_PCI_DEV	8
> +
> +/* Calculate VF ID from PCI device and function IDs.
> + * VFs span multiple PCI devices, e.g.:
> + *   device 0: VF 0-7, device 1: VF 8-15, etc.
> + */
> +#define VCPF_VF_ID_FROM_PCI(device_id, function) \
> +	(((device_id) * VCPF_VFS_PER_PCI_DEV) + (function))
> +
>  struct cpfl_vport_param {
>  	struct cpfl_adapter_ext *adapter;
>  	uint16_t devarg_id; /* arg id from user */
> -- 
> 2.34.1
> 


More information about the dev mailing list