|
@@ -793,9 +793,7 @@ static int ieee80211_open(struct net_device *dev)
|
|
|
static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
|
|
|
bool going_down)
|
|
|
{
|
|
|
- struct ieee80211_sub_if_data *txq_sdata = sdata;
|
|
|
struct ieee80211_local *local = sdata->local;
|
|
|
- struct fq *fq = &local->fq;
|
|
|
unsigned long flags;
|
|
|
struct sk_buff *skb, *tmp;
|
|
|
u32 hw_reconf_flags = 0;
|
|
@@ -939,9 +937,6 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
|
|
|
|
|
|
switch (sdata->vif.type) {
|
|
|
case NL80211_IFTYPE_AP_VLAN:
|
|
|
- txq_sdata = container_of(sdata->bss,
|
|
|
- struct ieee80211_sub_if_data, u.ap);
|
|
|
-
|
|
|
mutex_lock(&local->mtx);
|
|
|
list_del(&sdata->u.vlan.list);
|
|
|
mutex_unlock(&local->mtx);
|
|
@@ -998,8 +993,6 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
|
|
|
skb_queue_purge(&sdata->skb_queue);
|
|
|
}
|
|
|
|
|
|
- sdata->bss = NULL;
|
|
|
-
|
|
|
spin_lock_irqsave(&local->queue_stop_reason_lock, flags);
|
|
|
for (i = 0; i < IEEE80211_MAX_QUEUES; i++) {
|
|
|
skb_queue_walk_safe(&local->pending[i], skb, tmp) {
|
|
@@ -1012,22 +1005,10 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata,
|
|
|
}
|
|
|
spin_unlock_irqrestore(&local->queue_stop_reason_lock, flags);
|
|
|
|
|
|
- if (txq_sdata->vif.txq) {
|
|
|
- struct txq_info *txqi = to_txq_info(txq_sdata->vif.txq);
|
|
|
+ if (sdata->vif.type == NL80211_IFTYPE_AP_VLAN)
|
|
|
+ ieee80211_txq_remove_vlan(local, sdata);
|
|
|
|
|
|
- /*
|
|
|
- * FIXME FIXME
|
|
|
- *
|
|
|
- * We really shouldn't purge the *entire* txqi since that
|
|
|
- * contains frames for the other AP_VLANs (and possibly
|
|
|
- * the AP itself) as well, but there's no API in FQ now
|
|
|
- * to be able to filter.
|
|
|
- */
|
|
|
-
|
|
|
- spin_lock_bh(&fq->lock);
|
|
|
- ieee80211_txq_purge(local, txqi);
|
|
|
- spin_unlock_bh(&fq->lock);
|
|
|
- }
|
|
|
+ sdata->bss = NULL;
|
|
|
|
|
|
if (local->open_count == 0)
|
|
|
ieee80211_clear_tx_pending(local);
|