Skip to content

Commit d0d362f

Browse files
iveceraanguy11
authored andcommitted
i40e: Fix VF VLAN offloading when port VLAN is configured
If port VLAN is configured on a VF then any other VLANs on top of this VF are broken. During i40e_ndo_set_vf_port_vlan() call the i40e driver reset the VF and iavf driver asks PF (using VIRTCHNL_OP_GET_VF_RESOURCES) for VF capabilities but this reset occurs too early, prior setting of vf->info.pvid field and because this field can be zero during i40e_vc_get_vf_resources_msg() then VIRTCHNL_VF_OFFLOAD_VLAN capability is reported to iavf driver. This is wrong because iavf driver should not report VLAN offloading capability when port VLAN is configured as i40e does not support QinQ offloading. Fix the issue by moving VF reset after setting of vf->port_vlan_id field. Without this patch: $ echo 1 > /sys/class/net/enp2s0f0/device/sriov_numvfs $ ip link set enp2s0f0 vf 0 vlan 3 $ ip link set enp2s0f0v0 up $ ip link add link enp2s0f0v0 name vlan4 type vlan id 4 $ ip link set vlan4 up ... $ ethtool -k enp2s0f0v0 | grep vlan-offload rx-vlan-offload: on tx-vlan-offload: on $ dmesg -l err | grep iavf [1292500.742914] iavf 0000:02:02.0: Failed to add VLAN filter, error IAVF_ERR_INVALID_QP_ID With this patch: $ echo 1 > /sys/class/net/enp2s0f0/device/sriov_numvfs $ ip link set enp2s0f0 vf 0 vlan 3 $ ip link set enp2s0f0v0 up $ ip link add link enp2s0f0v0 name vlan4 type vlan id 4 $ ip link set vlan4 up ... $ ethtool -k enp2s0f0v0 | grep vlan-offload rx-vlan-offload: off [requested on] tx-vlan-offload: off [requested on] $ dmesg -l err | grep iavf Fixes: f9b4b62 ("i40e: Reset the VF upon conflicting VLAN configuration") Signed-off-by: Ivan Vecera <[email protected]> Reviewed-by: Jesse Brandeburg <[email protected]> Tested-by: Rafal Romanowski <[email protected]> Signed-off-by: Tony Nguyen <[email protected]>
1 parent 5f3d319 commit d0d362f

File tree

1 file changed

+5
-3
lines changed

1 file changed

+5
-3
lines changed

drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -4475,9 +4475,7 @@ int i40e_ndo_set_vf_port_vlan(struct net_device *netdev, int vf_id,
44754475
goto error_pvid;
44764476

44774477
i40e_vlan_stripping_enable(vsi);
4478-
i40e_vc_reset_vf(vf, true);
4479-
/* During reset the VF got a new VSI, so refresh a pointer. */
4480-
vsi = pf->vsi[vf->lan_vsi_idx];
4478+
44814479
/* Locked once because multiple functions below iterate list */
44824480
spin_lock_bh(&vsi->mac_filter_hash_lock);
44834481

@@ -4563,6 +4561,10 @@ int i40e_ndo_set_vf_port_vlan(struct net_device *netdev, int vf_id,
45634561
*/
45644562
vf->port_vlan_id = le16_to_cpu(vsi->info.pvid);
45654563

4564+
i40e_vc_reset_vf(vf, true);
4565+
/* During reset the VF got a new VSI, so refresh a pointer. */
4566+
vsi = pf->vsi[vf->lan_vsi_idx];
4567+
45664568
ret = i40e_config_vf_promiscuous_mode(vf, vsi->id, allmulti, alluni);
45674569
if (ret) {
45684570
dev_err(&pf->pdev->dev, "Unable to config vf promiscuous mode\n");

0 commit comments

Comments
 (0)