|
@@ -664,13 +664,21 @@ i40evf_vlan_filter *i40evf_find_vlan(struct i40evf_adapter *adapter, u16 vlan)
|
|
|
static struct
|
|
|
i40evf_vlan_filter *i40evf_add_vlan(struct i40evf_adapter *adapter, u16 vlan)
|
|
|
{
|
|
|
- struct i40evf_vlan_filter *f;
|
|
|
+ struct i40evf_vlan_filter *f = NULL;
|
|
|
+ int count = 50;
|
|
|
+
|
|
|
+ while (test_and_set_bit(__I40EVF_IN_CRITICAL_TASK,
|
|
|
+ &adapter->crit_section)) {
|
|
|
+ udelay(1);
|
|
|
+ if (--count == 0)
|
|
|
+ goto out;
|
|
|
+ }
|
|
|
|
|
|
f = i40evf_find_vlan(adapter, vlan);
|
|
|
if (!f) {
|
|
|
f = kzalloc(sizeof(*f), GFP_ATOMIC);
|
|
|
if (!f)
|
|
|
- return NULL;
|
|
|
+ goto clearout;
|
|
|
|
|
|
f->vlan = vlan;
|
|
|
|
|
@@ -680,6 +688,9 @@ i40evf_vlan_filter *i40evf_add_vlan(struct i40evf_adapter *adapter, u16 vlan)
|
|
|
adapter->aq_required |= I40EVF_FLAG_AQ_ADD_VLAN_FILTER;
|
|
|
}
|
|
|
|
|
|
+clearout:
|
|
|
+ clear_bit(__I40EVF_IN_CRITICAL_TASK, &adapter->crit_section);
|
|
|
+out:
|
|
|
return f;
|
|
|
}
|
|
|
|
|
@@ -691,12 +702,21 @@ i40evf_vlan_filter *i40evf_add_vlan(struct i40evf_adapter *adapter, u16 vlan)
|
|
|
static void i40evf_del_vlan(struct i40evf_adapter *adapter, u16 vlan)
|
|
|
{
|
|
|
struct i40evf_vlan_filter *f;
|
|
|
+ int count = 50;
|
|
|
+
|
|
|
+ while (test_and_set_bit(__I40EVF_IN_CRITICAL_TASK,
|
|
|
+ &adapter->crit_section)) {
|
|
|
+ udelay(1);
|
|
|
+ if (--count == 0)
|
|
|
+ return;
|
|
|
+ }
|
|
|
|
|
|
f = i40evf_find_vlan(adapter, vlan);
|
|
|
if (f) {
|
|
|
f->remove = true;
|
|
|
adapter->aq_required |= I40EVF_FLAG_AQ_DEL_VLAN_FILTER;
|
|
|
}
|
|
|
+ clear_bit(__I40EVF_IN_CRITICAL_TASK, &adapter->crit_section);
|
|
|
}
|
|
|
|
|
|
/**
|