iavf: refactor VLAN filter states
[ Upstream commit 0c0da0e951053fda20412cd284e2714bbbb31bff ] The VLAN filter states are currently being saved as individual bits. This is error prone as multiple bits might be mistakenly set. Fix by replacing the bits with a single state enum. Also, add an "ACTIVE" state for filters that are accepted by the PF. Signed-off-by: Ahmed Zaki <ahmed.zaki@intel.com> Tested-by: Rafal Romanowski <rafal.romanowski@intel.com> Signed-off-by: Tony Nguyen <anthony.l.nguyen@intel.com> Stable-dep-of: 9c85b7fa12ef ("iavf: remove active_cvlans and active_svlans bitmaps") Signed-off-by: Sasha Levin <sashal@kernel.org>
This commit is contained in:
parent
4f6c08c232
commit
aa0f377c9b
@ -157,15 +157,18 @@ struct iavf_vlan {
|
||||
u16 tpid;
|
||||
};
|
||||
|
||||
enum iavf_vlan_state_t {
|
||||
IAVF_VLAN_INVALID,
|
||||
IAVF_VLAN_ADD, /* filter needs to be added */
|
||||
IAVF_VLAN_IS_NEW, /* filter is new, wait for PF answer */
|
||||
IAVF_VLAN_ACTIVE, /* filter is accepted by PF */
|
||||
IAVF_VLAN_REMOVE, /* filter needs to be removed */
|
||||
};
|
||||
|
||||
struct iavf_vlan_filter {
|
||||
struct list_head list;
|
||||
struct iavf_vlan vlan;
|
||||
struct {
|
||||
u8 is_new_vlan:1; /* filter is new, wait for PF answer */
|
||||
u8 remove:1; /* filter needs to be removed */
|
||||
u8 add:1; /* filter needs to be added */
|
||||
u8 padding:5;
|
||||
};
|
||||
enum iavf_vlan_state_t state;
|
||||
};
|
||||
|
||||
#define IAVF_MAX_TRAFFIC_CLASS 4
|
||||
|
@ -791,7 +791,7 @@ iavf_vlan_filter *iavf_add_vlan(struct iavf_adapter *adapter,
|
||||
f->vlan = vlan;
|
||||
|
||||
list_add_tail(&f->list, &adapter->vlan_filter_list);
|
||||
f->add = true;
|
||||
f->state = IAVF_VLAN_ADD;
|
||||
adapter->aq_required |= IAVF_FLAG_AQ_ADD_VLAN_FILTER;
|
||||
}
|
||||
|
||||
@ -813,7 +813,7 @@ static void iavf_del_vlan(struct iavf_adapter *adapter, struct iavf_vlan vlan)
|
||||
|
||||
f = iavf_find_vlan(adapter, vlan);
|
||||
if (f) {
|
||||
f->remove = true;
|
||||
f->state = IAVF_VLAN_REMOVE;
|
||||
adapter->aq_required |= IAVF_FLAG_AQ_DEL_VLAN_FILTER;
|
||||
}
|
||||
|
||||
@ -1296,11 +1296,11 @@ static void iavf_clear_mac_vlan_filters(struct iavf_adapter *adapter)
|
||||
/* remove all VLAN filters */
|
||||
list_for_each_entry_safe(vlf, vlftmp, &adapter->vlan_filter_list,
|
||||
list) {
|
||||
if (vlf->add) {
|
||||
if (vlf->state == IAVF_VLAN_ADD) {
|
||||
list_del(&vlf->list);
|
||||
kfree(vlf);
|
||||
} else {
|
||||
vlf->remove = true;
|
||||
vlf->state = IAVF_VLAN_REMOVE;
|
||||
}
|
||||
}
|
||||
spin_unlock_bh(&adapter->mac_vlan_list_lock);
|
||||
|
@ -642,7 +642,7 @@ 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->state == IAVF_VLAN_IS_NEW) {
|
||||
if (f->vlan.tpid == ETH_P_8021Q)
|
||||
clear_bit(f->vlan.vid,
|
||||
adapter->vsi.active_cvlans);
|
||||
@ -679,7 +679,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 +710,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 +759,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 +777,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 +820,11 @@ 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) {
|
||||
} else if (f->state == IAVF_VLAN_REMOVE) {
|
||||
count++;
|
||||
}
|
||||
}
|
||||
@ -857,7 +856,7 @@ 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_REMOVE) {
|
||||
vvfl->vlan_id[i] = f->vlan.vid;
|
||||
i++;
|
||||
list_del(&f->list);
|
||||
@ -901,7 +900,7 @@ 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_REMOVE) {
|
||||
struct virtchnl_vlan_supported_caps *filtering_support =
|
||||
&adapter->vlan_v2_caps.filtering.filtering_support;
|
||||
struct virtchnl_vlan *vlan;
|
||||
@ -2192,7 +2191,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;
|
||||
@ -2252,7 +2251,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;
|
||||
}
|
||||
@ -2436,8 +2435,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->state == IAVF_VLAN_IS_NEW) {
|
||||
f->state = IAVF_VLAN_ACTIVE;
|
||||
if (f->vlan.tpid == ETH_P_8021Q)
|
||||
set_bit(f->vlan.vid,
|
||||
adapter->vsi.active_cvlans);
|
||||
|
Loading…
x
Reference in New Issue
Block a user