diff options
Diffstat (limited to 'drivers/net/ethernet/intel/ice/ice_main.c')
| -rw-r--r-- | drivers/net/ethernet/intel/ice/ice_main.c | 49 | 
1 files changed, 31 insertions, 18 deletions
| diff --git a/drivers/net/ethernet/intel/ice/ice_main.c b/drivers/net/ethernet/intel/ice/ice_main.c index e1cae253412c..c1ac2f746714 100644 --- a/drivers/net/ethernet/intel/ice/ice_main.c +++ b/drivers/net/ethernet/intel/ice/ice_main.c @@ -5763,25 +5763,38 @@ static netdev_features_t  ice_fix_features(struct net_device *netdev, netdev_features_t features)  {  	struct ice_netdev_priv *np = netdev_priv(netdev); -	netdev_features_t supported_vlan_filtering; -	netdev_features_t requested_vlan_filtering; -	struct ice_vsi *vsi = np->vsi; - -	requested_vlan_filtering = features & NETIF_VLAN_FILTERING_FEATURES; - -	/* make sure supported_vlan_filtering works for both SVM and DVM */ -	supported_vlan_filtering = NETIF_F_HW_VLAN_CTAG_FILTER; -	if (ice_is_dvm_ena(&vsi->back->hw)) -		supported_vlan_filtering |= NETIF_F_HW_VLAN_STAG_FILTER; - -	if (requested_vlan_filtering && -	    requested_vlan_filtering != supported_vlan_filtering) { -		if (requested_vlan_filtering & NETIF_F_HW_VLAN_CTAG_FILTER) { -			netdev_warn(netdev, "cannot support requested VLAN filtering settings, enabling all supported VLAN filtering settings\n"); -			features |= supported_vlan_filtering; +	netdev_features_t req_vlan_fltr, cur_vlan_fltr; +	bool cur_ctag, cur_stag, req_ctag, req_stag; + +	cur_vlan_fltr = netdev->features & NETIF_VLAN_FILTERING_FEATURES; +	cur_ctag = cur_vlan_fltr & NETIF_F_HW_VLAN_CTAG_FILTER; +	cur_stag = cur_vlan_fltr & NETIF_F_HW_VLAN_STAG_FILTER; + +	req_vlan_fltr = features & NETIF_VLAN_FILTERING_FEATURES; +	req_ctag = req_vlan_fltr & NETIF_F_HW_VLAN_CTAG_FILTER; +	req_stag = req_vlan_fltr & NETIF_F_HW_VLAN_STAG_FILTER; + +	if (req_vlan_fltr != cur_vlan_fltr) { +		if (ice_is_dvm_ena(&np->vsi->back->hw)) { +			if (req_ctag && req_stag) { +				features |= NETIF_VLAN_FILTERING_FEATURES; +			} else if (!req_ctag && !req_stag) { +				features &= ~NETIF_VLAN_FILTERING_FEATURES; +			} else if ((!cur_ctag && req_ctag && !cur_stag) || +				   (!cur_stag && req_stag && !cur_ctag)) { +				features |= NETIF_VLAN_FILTERING_FEATURES; +				netdev_warn(netdev,  "802.1Q and 802.1ad VLAN filtering must be either both on or both off. VLAN filtering has been enabled for both types.\n"); +			} else if ((cur_ctag && !req_ctag && cur_stag) || +				   (cur_stag && !req_stag && cur_ctag)) { +				features &= ~NETIF_VLAN_FILTERING_FEATURES; +				netdev_warn(netdev,  "802.1Q and 802.1ad VLAN filtering must be either both on or both off. VLAN filtering has been disabled for both types.\n"); +			}  		} else { -			netdev_warn(netdev, "cannot support requested VLAN filtering settings, clearing all supported VLAN filtering settings\n"); -			features &= ~supported_vlan_filtering; +			if (req_vlan_fltr & NETIF_F_HW_VLAN_STAG_FILTER) +				netdev_warn(netdev, "cannot support requested 802.1ad filtering setting in SVM mode\n"); + +			if (req_vlan_fltr & NETIF_F_HW_VLAN_CTAG_FILTER) +				features |= NETIF_F_HW_VLAN_CTAG_FILTER;  		}  	} |