The ixgbe_vlan_filter_set() should use hw->mac.ops.set_vfta() to set VLAN filtering as this is generic function that handles both non-SRIOV and SRIOV cases.
Bug was discovered issuing command in testpmd 'rx_vlan add VLAN PORT' for PF. Requested VLAN was enabled but pool mask is not set. Only command 'rx_vlan add VLAN port PORT vf MASK' can enable pointed VLAN id for PF. Signed-off-by: Pawel Wodkowski <pawelx.wodkowski at intel.com> --- lib/librte_pmd_ixgbe/ixgbe_ethdev.c | 19 ++++++++----------- 1 file changed, 8 insertions(+), 11 deletions(-) diff --git a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c index 7551bcc..7aef0e8 100644 --- a/lib/librte_pmd_ixgbe/ixgbe_ethdev.c +++ b/lib/librte_pmd_ixgbe/ixgbe_ethdev.c @@ -1162,21 +1162,18 @@ ixgbe_vlan_filter_set(struct rte_eth_dev *dev, uint16_t vlan_id, int on) IXGBE_DEV_PRIVATE_TO_HW(dev->data->dev_private); struct ixgbe_vfta * shadow_vfta = IXGBE_DEV_PRIVATE_TO_VFTA(dev->data->dev_private); - uint32_t vfta; + struct rte_eth_dev_sriov *sriov = &RTE_ETH_DEV_SRIOV(dev); + u32 vind = sriov->active ? sriov->def_vmdq_idx : 0; + s32 ret_val; uint32_t vid_idx; - uint32_t vid_bit; - vid_idx = (uint32_t) ((vlan_id >> 5) & 0x7F); - vid_bit = (uint32_t) (1 << (vlan_id & 0x1F)); - vfta = IXGBE_READ_REG(hw, IXGBE_VFTA(vid_idx)); - if (on) - vfta |= vid_bit; - else - vfta &= ~vid_bit; - IXGBE_WRITE_REG(hw, IXGBE_VFTA(vid_idx), vfta); + ret_val = hw->mac.ops.set_vfta(hw, vlan_id, vind, on); + if (ret_val != IXGBE_SUCCESS) + return ret_val; + vid_idx = (uint32_t) ((vlan_id >> 5) & 0x7F); /* update local VFTA copy */ - shadow_vfta->vfta[vid_idx] = vfta; + shadow_vfta->vfta[vid_idx] = IXGBE_READ_REG(hw, IXGBE_VFTA(vid_idx)); return 0; } -- 1.9.1