diff options
Diffstat (limited to 'net/mac80211/iface.c')
-rw-r--r-- | net/mac80211/iface.c | 18 |
1 files changed, 16 insertions, 2 deletions
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index c9e325d2e120..e1cb22c16530 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c | |||
@@ -977,7 +977,11 @@ static void ieee80211_do_stop(struct ieee80211_sub_if_data *sdata, | |||
977 | if (sdata->vif.txq) { | 977 | if (sdata->vif.txq) { |
978 | struct txq_info *txqi = to_txq_info(sdata->vif.txq); | 978 | struct txq_info *txqi = to_txq_info(sdata->vif.txq); |
979 | 979 | ||
980 | spin_lock_bh(&txqi->queue.lock); | ||
980 | ieee80211_purge_tx_queue(&local->hw, &txqi->queue); | 981 | ieee80211_purge_tx_queue(&local->hw, &txqi->queue); |
982 | txqi->byte_cnt = 0; | ||
983 | spin_unlock_bh(&txqi->queue.lock); | ||
984 | |||
981 | atomic_set(&sdata->txqs_len[txqi->txq.ac], 0); | 985 | atomic_set(&sdata->txqs_len[txqi->txq.ac], 0); |
982 | } | 986 | } |
983 | 987 | ||
@@ -1271,6 +1275,16 @@ static void ieee80211_iface_work(struct work_struct *work) | |||
1271 | } | 1275 | } |
1272 | } | 1276 | } |
1273 | mutex_unlock(&local->sta_mtx); | 1277 | mutex_unlock(&local->sta_mtx); |
1278 | } else if (ieee80211_is_action(mgmt->frame_control) && | ||
1279 | mgmt->u.action.category == WLAN_CATEGORY_VHT) { | ||
1280 | switch (mgmt->u.action.u.vht_group_notif.action_code) { | ||
1281 | case WLAN_VHT_ACTION_GROUPID_MGMT: | ||
1282 | ieee80211_process_mu_groups(sdata, mgmt); | ||
1283 | break; | ||
1284 | default: | ||
1285 | WARN_ON(1); | ||
1286 | break; | ||
1287 | } | ||
1274 | } else if (ieee80211_is_data_qos(mgmt->frame_control)) { | 1288 | } else if (ieee80211_is_data_qos(mgmt->frame_control)) { |
1275 | struct ieee80211_hdr *hdr = (void *)mgmt; | 1289 | struct ieee80211_hdr *hdr = (void *)mgmt; |
1276 | /* | 1290 | /* |
@@ -1747,7 +1761,7 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name, | |||
1747 | 1761 | ||
1748 | ret = dev_alloc_name(ndev, ndev->name); | 1762 | ret = dev_alloc_name(ndev, ndev->name); |
1749 | if (ret < 0) { | 1763 | if (ret < 0) { |
1750 | free_netdev(ndev); | 1764 | ieee80211_if_free(ndev); |
1751 | return ret; | 1765 | return ret; |
1752 | } | 1766 | } |
1753 | 1767 | ||
@@ -1833,7 +1847,7 @@ int ieee80211_if_add(struct ieee80211_local *local, const char *name, | |||
1833 | 1847 | ||
1834 | ret = register_netdevice(ndev); | 1848 | ret = register_netdevice(ndev); |
1835 | if (ret) { | 1849 | if (ret) { |
1836 | free_netdev(ndev); | 1850 | ieee80211_if_free(ndev); |
1837 | return ret; | 1851 | return ret; |
1838 | } | 1852 | } |
1839 | } | 1853 | } |