|
@@ -598,6 +598,8 @@ void mlx5e_enable_vlan_filter(struct mlx5e_priv *priv)
|
|
|
return;
|
|
return;
|
|
|
|
|
|
|
|
priv->vlan.filter_disabled = false;
|
|
priv->vlan.filter_disabled = false;
|
|
|
|
|
+ if (priv->netdev->flags & IFF_PROMISC)
|
|
|
|
|
+ return;
|
|
|
mlx5e_del_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_ANY_VID, 0);
|
|
mlx5e_del_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_ANY_VID, 0);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -607,6 +609,8 @@ void mlx5e_disable_vlan_filter(struct mlx5e_priv *priv)
|
|
|
return;
|
|
return;
|
|
|
|
|
|
|
|
priv->vlan.filter_disabled = true;
|
|
priv->vlan.filter_disabled = true;
|
|
|
|
|
+ if (priv->netdev->flags & IFF_PROMISC)
|
|
|
|
|
+ return;
|
|
|
mlx5e_add_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_ANY_VID, 0);
|
|
mlx5e_add_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_ANY_VID, 0);
|
|
|
}
|
|
}
|
|
|
|
|
|
|
@@ -717,8 +721,12 @@ void mlx5e_set_rx_mode_work(struct work_struct *work)
|
|
|
bool enable_broadcast = !ea->broadcast_enabled && broadcast_enabled;
|
|
bool enable_broadcast = !ea->broadcast_enabled && broadcast_enabled;
|
|
|
bool disable_broadcast = ea->broadcast_enabled && !broadcast_enabled;
|
|
bool disable_broadcast = ea->broadcast_enabled && !broadcast_enabled;
|
|
|
|
|
|
|
|
- if (enable_promisc)
|
|
|
|
|
|
|
+ if (enable_promisc) {
|
|
|
mlx5e_add_eth_addr_rule(priv, &ea->promisc, MLX5E_PROMISC);
|
|
mlx5e_add_eth_addr_rule(priv, &ea->promisc, MLX5E_PROMISC);
|
|
|
|
|
+ if (!priv->vlan.filter_disabled)
|
|
|
|
|
+ mlx5e_add_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_ANY_VID,
|
|
|
|
|
+ 0);
|
|
|
|
|
+ }
|
|
|
if (enable_allmulti)
|
|
if (enable_allmulti)
|
|
|
mlx5e_add_eth_addr_rule(priv, &ea->allmulti, MLX5E_ALLMULTI);
|
|
mlx5e_add_eth_addr_rule(priv, &ea->allmulti, MLX5E_ALLMULTI);
|
|
|
if (enable_broadcast)
|
|
if (enable_broadcast)
|
|
@@ -730,8 +738,12 @@ void mlx5e_set_rx_mode_work(struct work_struct *work)
|
|
|
mlx5e_del_eth_addr_from_flow_table(priv, &ea->broadcast);
|
|
mlx5e_del_eth_addr_from_flow_table(priv, &ea->broadcast);
|
|
|
if (disable_allmulti)
|
|
if (disable_allmulti)
|
|
|
mlx5e_del_eth_addr_from_flow_table(priv, &ea->allmulti);
|
|
mlx5e_del_eth_addr_from_flow_table(priv, &ea->allmulti);
|
|
|
- if (disable_promisc)
|
|
|
|
|
|
|
+ if (disable_promisc) {
|
|
|
|
|
+ if (!priv->vlan.filter_disabled)
|
|
|
|
|
+ mlx5e_del_vlan_rule(priv, MLX5E_VLAN_RULE_TYPE_ANY_VID,
|
|
|
|
|
+ 0);
|
|
|
mlx5e_del_eth_addr_from_flow_table(priv, &ea->promisc);
|
|
mlx5e_del_eth_addr_from_flow_table(priv, &ea->promisc);
|
|
|
|
|
+ }
|
|
|
|
|
|
|
|
ea->promisc_enabled = promisc_enabled;
|
|
ea->promisc_enabled = promisc_enabled;
|
|
|
ea->allmulti_enabled = allmulti_enabled;
|
|
ea->allmulti_enabled = allmulti_enabled;
|