diff options
Diffstat (limited to 'drivers/net/ethernet/intel/iavf/iavf_virtchnl.c')
| -rw-r--r-- | drivers/net/ethernet/intel/iavf/iavf_virtchnl.c | 70 | 
1 files changed, 36 insertions, 34 deletions
| diff --git a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c index 6d23338604bb..9afbbdac3590 100644 --- a/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c +++ b/drivers/net/ethernet/intel/iavf/iavf_virtchnl.c @@ -642,16 +642,10 @@ static void iavf_vlan_add_reject(struct iavf_adapter *adapter)  	spin_lock_bh(&adapter->mac_vlan_list_lock);  	list_for_each_entry_safe(f, ftmp, &adapter->vlan_filter_list, list) { -		if (f->is_new_vlan) { -			if (f->vlan.tpid == ETH_P_8021Q) -				clear_bit(f->vlan.vid, -					  adapter->vsi.active_cvlans); -			else -				clear_bit(f->vlan.vid, -					  adapter->vsi.active_svlans); - +		if (f->state == IAVF_VLAN_IS_NEW) {  			list_del(&f->list);  			kfree(f); +			adapter->num_vlan_filters--;  		}  	}  	spin_unlock_bh(&adapter->mac_vlan_list_lock); @@ -679,7 +673,7 @@ void iavf_add_vlans(struct iavf_adapter *adapter)  	spin_lock_bh(&adapter->mac_vlan_list_lock);  	list_for_each_entry(f, &adapter->vlan_filter_list, list) { -		if (f->add) +		if (f->state == IAVF_VLAN_ADD)  			count++;  	}  	if (!count || !VLAN_FILTERING_ALLOWED(adapter)) { @@ -710,11 +704,10 @@ void iavf_add_vlans(struct iavf_adapter *adapter)  		vvfl->vsi_id = adapter->vsi_res->vsi_id;  		vvfl->num_elements = count;  		list_for_each_entry(f, &adapter->vlan_filter_list, list) { -			if (f->add) { +			if (f->state == IAVF_VLAN_ADD) {  				vvfl->vlan_id[i] = f->vlan.vid;  				i++; -				f->add = false; -				f->is_new_vlan = true; +				f->state = IAVF_VLAN_IS_NEW;  				if (i == count)  					break;  			} @@ -760,7 +753,7 @@ void iavf_add_vlans(struct iavf_adapter *adapter)  		vvfl_v2->vport_id = adapter->vsi_res->vsi_id;  		vvfl_v2->num_elements = count;  		list_for_each_entry(f, &adapter->vlan_filter_list, list) { -			if (f->add) { +			if (f->state == IAVF_VLAN_ADD) {  				struct virtchnl_vlan_supported_caps *filtering_support =  					&adapter->vlan_v2_caps.filtering.filtering_support;  				struct virtchnl_vlan *vlan; @@ -778,8 +771,7 @@ void iavf_add_vlans(struct iavf_adapter *adapter)  				vlan->tpid = f->vlan.tpid;  				i++; -				f->add = false; -				f->is_new_vlan = true; +				f->state = IAVF_VLAN_IS_NEW;  			}  		} @@ -822,10 +814,16 @@ void iavf_del_vlans(struct iavf_adapter *adapter)  		 * filters marked for removal to enable bailing out before  		 * sending a virtchnl message  		 */ -		if (f->remove && !VLAN_FILTERING_ALLOWED(adapter)) { +		if (f->state == IAVF_VLAN_REMOVE && +		    !VLAN_FILTERING_ALLOWED(adapter)) {  			list_del(&f->list);  			kfree(f); -		} else if (f->remove) { +			adapter->num_vlan_filters--; +		} else if (f->state == IAVF_VLAN_DISABLE && +		    !VLAN_FILTERING_ALLOWED(adapter)) { +			f->state = IAVF_VLAN_INACTIVE; +		} else if (f->state == IAVF_VLAN_REMOVE || +			   f->state == IAVF_VLAN_DISABLE) {  			count++;  		}  	} @@ -857,11 +855,18 @@ void iavf_del_vlans(struct iavf_adapter *adapter)  		vvfl->vsi_id = adapter->vsi_res->vsi_id;  		vvfl->num_elements = count;  		list_for_each_entry_safe(f, ftmp, &adapter->vlan_filter_list, list) { -			if (f->remove) { +			if (f->state == IAVF_VLAN_DISABLE) {  				vvfl->vlan_id[i] = f->vlan.vid; +				f->state = IAVF_VLAN_INACTIVE;  				i++; +				if (i == count) +					break; +			} else if (f->state == IAVF_VLAN_REMOVE) { +				vvfl->vlan_id[i] = f->vlan.vid;  				list_del(&f->list);  				kfree(f); +				adapter->num_vlan_filters--; +				i++;  				if (i == count)  					break;  			} @@ -901,7 +906,8 @@ void iavf_del_vlans(struct iavf_adapter *adapter)  		vvfl_v2->vport_id = adapter->vsi_res->vsi_id;  		vvfl_v2->num_elements = count;  		list_for_each_entry_safe(f, ftmp, &adapter->vlan_filter_list, list) { -			if (f->remove) { +			if (f->state == IAVF_VLAN_DISABLE || +			    f->state == IAVF_VLAN_REMOVE) {  				struct virtchnl_vlan_supported_caps *filtering_support =  					&adapter->vlan_v2_caps.filtering.filtering_support;  				struct virtchnl_vlan *vlan; @@ -915,8 +921,13 @@ void iavf_del_vlans(struct iavf_adapter *adapter)  				vlan->tci = f->vlan.vid;  				vlan->tpid = f->vlan.tpid; -				list_del(&f->list); -				kfree(f); +				if (f->state == IAVF_VLAN_DISABLE) { +					f->state = IAVF_VLAN_INACTIVE; +				} else { +					list_del(&f->list); +					kfree(f); +					adapter->num_vlan_filters--; +				}  				i++;  				if (i == count)  					break; @@ -2192,7 +2203,7 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter,  				list_for_each_entry(vlf,  						    &adapter->vlan_filter_list,  						    list) -					vlf->add = true; +					vlf->state = IAVF_VLAN_ADD;  				adapter->aq_required |=  					IAVF_FLAG_AQ_ADD_VLAN_FILTER; @@ -2260,7 +2271,7 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter,  				list_for_each_entry(vlf,  						    &adapter->vlan_filter_list,  						    list) -					vlf->add = true; +					vlf->state = IAVF_VLAN_ADD;  				aq_required |= IAVF_FLAG_AQ_ADD_VLAN_FILTER;  			} @@ -2444,17 +2455,8 @@ void iavf_virtchnl_completion(struct iavf_adapter *adapter,  		spin_lock_bh(&adapter->mac_vlan_list_lock);  		list_for_each_entry(f, &adapter->vlan_filter_list, list) { -			if (f->is_new_vlan) { -				f->is_new_vlan = false; -				if (!f->vlan.vid) -					continue; -				if (f->vlan.tpid == ETH_P_8021Q) -					set_bit(f->vlan.vid, -						adapter->vsi.active_cvlans); -				else -					set_bit(f->vlan.vid, -						adapter->vsi.active_svlans); -			} +			if (f->state == IAVF_VLAN_IS_NEW) +				f->state = IAVF_VLAN_ACTIVE;  		}  		spin_unlock_bh(&adapter->mac_vlan_list_lock);  		} |