diff options
Diffstat (limited to 'drivers/net/ethernet/intel/i40e')
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e.h | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_debugfs.c | 1 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_main.c | 13 | ||||
| -rw-r--r-- | drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c | 2 | 
4 files changed, 15 insertions, 2 deletions
| diff --git a/drivers/net/ethernet/intel/i40e/i40e.h b/drivers/net/ethernet/intel/i40e/i40e.h index 2089a0e172bf..d4255c2706fa 100644 --- a/drivers/net/ethernet/intel/i40e/i40e.h +++ b/drivers/net/ethernet/intel/i40e/i40e.h @@ -755,6 +755,7 @@ enum i40e_filter_state {  	I40E_FILTER_ACTIVE,		/* Added to switch by FW */  	I40E_FILTER_FAILED,		/* Rejected by FW */  	I40E_FILTER_REMOVE,		/* To be removed */ +	I40E_FILTER_NEW_SYNC,		/* New, not sent yet, is in i40e_sync_vsi_filters() */  /* There is no 'removed' state; the filter struct is freed */  };  struct i40e_mac_filter { diff --git a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c index abf624d770e6..208c2f0857b6 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_debugfs.c +++ b/drivers/net/ethernet/intel/i40e/i40e_debugfs.c @@ -89,6 +89,7 @@ static char *i40e_filter_state_string[] = {  	"ACTIVE",  	"FAILED",  	"REMOVE", +	"NEW_SYNC",  };  /** diff --git a/drivers/net/ethernet/intel/i40e/i40e_main.c b/drivers/net/ethernet/intel/i40e/i40e_main.c index 03205eb9f925..55fb362eb508 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_main.c +++ b/drivers/net/ethernet/intel/i40e/i40e_main.c @@ -1255,6 +1255,7 @@ int i40e_count_filters(struct i40e_vsi *vsi)  	hash_for_each_safe(vsi->mac_filter_hash, bkt, h, f, hlist) {  		if (f->state == I40E_FILTER_NEW || +		    f->state == I40E_FILTER_NEW_SYNC ||  		    f->state == I40E_FILTER_ACTIVE)  			++cnt;  	} @@ -1441,6 +1442,8 @@ static int i40e_correct_mac_vlan_filters(struct i40e_vsi *vsi,  			new->f = add_head;  			new->state = add_head->state; +			if (add_head->state == I40E_FILTER_NEW) +				add_head->state = I40E_FILTER_NEW_SYNC;  			/* Add the new filter to the tmp list */  			hlist_add_head(&new->hlist, tmp_add_list); @@ -1550,6 +1553,8 @@ static int i40e_correct_vf_mac_vlan_filters(struct i40e_vsi *vsi,  				return -ENOMEM;  			new_mac->f = add_head;  			new_mac->state = add_head->state; +			if (add_head->state == I40E_FILTER_NEW) +				add_head->state = I40E_FILTER_NEW_SYNC;  			/* Add the new filter to the tmp list */  			hlist_add_head(&new_mac->hlist, tmp_add_list); @@ -1734,6 +1739,7 @@ struct i40e_mac_filter *i40e_add_mac_filter(struct i40e_vsi *vsi,  	struct hlist_node *h;  	int bkt; +	lockdep_assert_held(&vsi->mac_filter_hash_lock);  	if (vsi->info.pvid)  		return i40e_add_filter(vsi, macaddr,  				       le16_to_cpu(vsi->info.pvid)); @@ -2436,7 +2442,8 @@ static int  i40e_aqc_broadcast_filter(struct i40e_vsi *vsi, const char *vsi_name,  			  struct i40e_mac_filter *f)  { -	bool enable = f->state == I40E_FILTER_NEW; +	bool enable = f->state == I40E_FILTER_NEW || +		      f->state == I40E_FILTER_NEW_SYNC;  	struct i40e_hw *hw = &vsi->back->hw;  	int aq_ret; @@ -2610,6 +2617,7 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi)  				/* Add it to the hash list */  				hlist_add_head(&new->hlist, &tmp_add_list); +				f->state = I40E_FILTER_NEW_SYNC;  			}  			/* Count the number of active (current and new) VLAN @@ -2761,7 +2769,8 @@ int i40e_sync_vsi_filters(struct i40e_vsi *vsi)  		spin_lock_bh(&vsi->mac_filter_hash_lock);  		hlist_for_each_entry_safe(new, h, &tmp_add_list, hlist) {  			/* Only update the state if we're still NEW */ -			if (new->f->state == I40E_FILTER_NEW) +			if (new->f->state == I40E_FILTER_NEW || +			    new->f->state == I40E_FILTER_NEW_SYNC)  				new->f->state = new->state;  			hlist_del(&new->hlist);  			netdev_hw_addr_refcnt(new->f, vsi->netdev, -1); diff --git a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c index 662622f01e31..dfa785e39458 100644 --- a/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c +++ b/drivers/net/ethernet/intel/i40e/i40e_virtchnl_pf.c @@ -2213,8 +2213,10 @@ static int i40e_vc_get_vf_resources_msg(struct i40e_vf *vf, u8 *msg)  		vfres->vsi_res[0].qset_handle  					  = le16_to_cpu(vsi->info.qs_handle[0]);  		if (!(vf->driver_caps & VIRTCHNL_VF_OFFLOAD_USO) && !vf->pf_set_mac) { +			spin_lock_bh(&vsi->mac_filter_hash_lock);  			i40e_del_mac_filter(vsi, vf->default_lan_addr.addr);  			eth_zero_addr(vf->default_lan_addr.addr); +			spin_unlock_bh(&vsi->mac_filter_hash_lock);  		}  		ether_addr_copy(vfres->vsi_res[0].default_mac_addr,  				vf->default_lan_addr.addr); | 
