@@ -4081,6 +4081,10 @@ void ixgbe_set_rx_mode(struct net_device *netdev)
hw->addr_ctrl.user_set_promisc = false;
}
+ /* Disable hardware VLAN filter if the feature flag is dropped */
+ if (!(netdev->features & NETIF_F_HW_VLAN_CTAG_FILTER))
+ vlnctrl &= ~(IXGBE_VLNCTRL_VFE | IXGBE_VLNCTRL_CFIEN);
+
/*
* Write addresses to available RAR registers, if there is not
* sufficient space to store all the addresses then enable
@@ -7734,6 +7738,26 @@ static int ixgbe_set_features(struct net_device *netdev,
netdev_features_t changed = netdev->features ^ features;
bool need_reset = false;
+ if (changed & NETIF_F_HW_VLAN_CTAG_FILTER) {
+ int vlan_filter = features & NETIF_F_HW_VLAN_CTAG_FILTER;
+
+ /* Prevent controlling VLAN filter if VFs exist */
+ if (adapter->num_vfs > 0) {
+ e_dev_info("%s HW VLAN filter is not allowed when "
+ "SR-IOV enabled.\n",
+ vlan_filter ? "Enabling" : "Disabling");
+ return -EINVAL;
+ }
+ if (!vlan_filter) {
+ e_dev_warn("Disabling HW VLAN filter. All VFs cannot "
+ "set VLAN filter from VF driver.\n");
+ e_dev_warn("All VLAN packets are delivered to "
+ "every VF.\n");
+ }
+ /* reset if HW VLAN filter is changed */
+ need_reset = true;
+ }
+
/* Make sure RSC matches LRO, reset if change */
if (!(features & NETIF_F_LRO)) {
if (adapter->flags2 & IXGBE_FLAG2_RSC_ENABLED)
@@ -839,6 +839,10 @@ static int ixgbe_set_vf_vlan_msg(struct ixgbe_adapter *adapter,
u32 bits;
u8 tcs = netdev_get_num_tc(adapter->netdev);
+ /* Ignore if VLAN filter is disabled */
+ if (!(adapter->netdev->features & NETIF_F_HW_VLAN_CTAG_FILTER))
+ return 0;
+
if (adapter->vfinfo[vf].pf_vlan || tcs) {
e_warn(drv,
"VF %d attempted to override administratively set VLAN configuration\n"