diff options
-rw-r--r-- | net/mac80211/cfg.c | 2 | ||||
-rw-r--r-- | net/mac80211/ieee80211_i.h | 4 | ||||
-rw-r--r-- | net/mac80211/iface.c | 2 | ||||
-rw-r--r-- | net/mac80211/mlme.c | 15 | ||||
-rw-r--r-- | net/mac80211/offchannel.c | 4 | ||||
-rw-r--r-- | net/mac80211/pm.c | 2 | ||||
-rw-r--r-- | net/mac80211/scan.c | 4 | ||||
-rw-r--r-- | net/mac80211/tdls.c | 6 | ||||
-rw-r--r-- | net/mac80211/tx.c | 2 | ||||
-rw-r--r-- | net/mac80211/util.c | 8 |
10 files changed, 27 insertions, 22 deletions
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 169665835b6c..9ccecb405ede 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
@@ -3665,7 +3665,7 @@ static int ieee80211_del_tx_ts(struct wiphy *wiphy, struct net_device *dev, | |||
3665 | * queues. | 3665 | * queues. |
3666 | */ | 3666 | */ |
3667 | synchronize_net(); | 3667 | synchronize_net(); |
3668 | ieee80211_flush_queues(local, sdata); | 3668 | ieee80211_flush_queues(local, sdata, false); |
3669 | 3669 | ||
3670 | /* restore the normal QoS parameters | 3670 | /* restore the normal QoS parameters |
3671 | * (unconditionally to avoid races) | 3671 | * (unconditionally to avoid races) |
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 4f45cab8b7f1..91878ef5069a 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -1882,10 +1882,10 @@ void ieee80211_add_pending_skb(struct ieee80211_local *local, | |||
1882 | void ieee80211_add_pending_skbs(struct ieee80211_local *local, | 1882 | void ieee80211_add_pending_skbs(struct ieee80211_local *local, |
1883 | struct sk_buff_head *skbs); | 1883 | struct sk_buff_head *skbs); |
1884 | void ieee80211_flush_queues(struct ieee80211_local *local, | 1884 | void ieee80211_flush_queues(struct ieee80211_local *local, |
1885 | struct ieee80211_sub_if_data *sdata); | 1885 | struct ieee80211_sub_if_data *sdata, bool drop); |
1886 | void __ieee80211_flush_queues(struct ieee80211_local *local, | 1886 | void __ieee80211_flush_queues(struct ieee80211_local *local, |
1887 | struct ieee80211_sub_if_data *sdata, | 1887 | struct ieee80211_sub_if_data *sdata, |
1888 | unsigned int queues); | 1888 | unsigned int queues, bool drop); |
1889 | 1889 | ||
1890 | void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata, | 1890 | void ieee80211_send_auth(struct ieee80211_sub_if_data *sdata, |
1891 | u16 transaction, u16 auth_alg, u16 status, | 1891 | u16 transaction, u16 auth_alg, u16 status, |
diff --git a/net/mac80211/iface.c b/net/mac80211/iface.c index 417355390873..677422e11e07 100644 --- a/net/mac80211/iface.c +++ b/net/mac80211/iface.c | |||
@@ -93,7 +93,7 @@ static u32 __ieee80211_idle_on(struct ieee80211_local *local) | |||
93 | if (local->hw.conf.flags & IEEE80211_CONF_IDLE) | 93 | if (local->hw.conf.flags & IEEE80211_CONF_IDLE) |
94 | return 0; | 94 | return 0; |
95 | 95 | ||
96 | ieee80211_flush_queues(local, NULL); | 96 | ieee80211_flush_queues(local, NULL, false); |
97 | 97 | ||
98 | local->hw.conf.flags |= IEEE80211_CONF_IDLE; | 98 | local->hw.conf.flags |= IEEE80211_CONF_IDLE; |
99 | return IEEE80211_CONF_CHANGE_IDLE; | 99 | return IEEE80211_CONF_CHANGE_IDLE; |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 8354bedc858a..c0711082a2b8 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -1604,7 +1604,7 @@ void ieee80211_dynamic_ps_enable_work(struct work_struct *work) | |||
1604 | } else { | 1604 | } else { |
1605 | ieee80211_send_nullfunc(local, sdata, 1); | 1605 | ieee80211_send_nullfunc(local, sdata, 1); |
1606 | /* Flush to get the tx status of nullfunc frame */ | 1606 | /* Flush to get the tx status of nullfunc frame */ |
1607 | ieee80211_flush_queues(local, sdata); | 1607 | ieee80211_flush_queues(local, sdata, false); |
1608 | } | 1608 | } |
1609 | } | 1609 | } |
1610 | 1610 | ||
@@ -2011,18 +2011,23 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, | |||
2011 | /* disable per-vif ps */ | 2011 | /* disable per-vif ps */ |
2012 | ieee80211_recalc_ps_vif(sdata); | 2012 | ieee80211_recalc_ps_vif(sdata); |
2013 | 2013 | ||
2014 | /* flush out any pending frame (e.g. DELBA) before deauth/disassoc */ | 2014 | /* |
2015 | * drop any frame before deauth/disassoc, this can be data or | ||
2016 | * management frame. Since we are disconnecting, we should not | ||
2017 | * insist sending these frames which can take time and delay | ||
2018 | * the disconnection and possible the roaming. | ||
2019 | */ | ||
2015 | if (tx) | 2020 | if (tx) |
2016 | ieee80211_flush_queues(local, sdata); | 2021 | ieee80211_flush_queues(local, sdata, true); |
2017 | 2022 | ||
2018 | /* deauthenticate/disassociate now */ | 2023 | /* deauthenticate/disassociate now */ |
2019 | if (tx || frame_buf) | 2024 | if (tx || frame_buf) |
2020 | ieee80211_send_deauth_disassoc(sdata, ifmgd->bssid, stype, | 2025 | ieee80211_send_deauth_disassoc(sdata, ifmgd->bssid, stype, |
2021 | reason, tx, frame_buf); | 2026 | reason, tx, frame_buf); |
2022 | 2027 | ||
2023 | /* flush out frame */ | 2028 | /* flush out frame - make sure the deauth was actually sent */ |
2024 | if (tx) | 2029 | if (tx) |
2025 | ieee80211_flush_queues(local, sdata); | 2030 | ieee80211_flush_queues(local, sdata, false); |
2026 | 2031 | ||
2027 | /* clear bssid only after building the needed mgmt frames */ | 2032 | /* clear bssid only after building the needed mgmt frames */ |
2028 | memset(ifmgd->bssid, 0, ETH_ALEN); | 2033 | memset(ifmgd->bssid, 0, ETH_ALEN); |
diff --git a/net/mac80211/offchannel.c b/net/mac80211/offchannel.c index ff20b2ebdb30..683f0e3cb124 100644 --- a/net/mac80211/offchannel.c +++ b/net/mac80211/offchannel.c | |||
@@ -121,7 +121,7 @@ void ieee80211_offchannel_stop_vifs(struct ieee80211_local *local) | |||
121 | ieee80211_stop_queues_by_reason(&local->hw, IEEE80211_MAX_QUEUE_MAP, | 121 | ieee80211_stop_queues_by_reason(&local->hw, IEEE80211_MAX_QUEUE_MAP, |
122 | IEEE80211_QUEUE_STOP_REASON_OFFCHANNEL, | 122 | IEEE80211_QUEUE_STOP_REASON_OFFCHANNEL, |
123 | false); | 123 | false); |
124 | ieee80211_flush_queues(local, NULL); | 124 | ieee80211_flush_queues(local, NULL, false); |
125 | 125 | ||
126 | mutex_lock(&local->iflist_mtx); | 126 | mutex_lock(&local->iflist_mtx); |
127 | list_for_each_entry(sdata, &local->interfaces, list) { | 127 | list_for_each_entry(sdata, &local->interfaces, list) { |
@@ -398,7 +398,7 @@ void ieee80211_sw_roc_work(struct work_struct *work) | |||
398 | ieee80211_roc_notify_destroy(roc, !roc->abort); | 398 | ieee80211_roc_notify_destroy(roc, !roc->abort); |
399 | 399 | ||
400 | if (started && !on_channel) { | 400 | if (started && !on_channel) { |
401 | ieee80211_flush_queues(local, NULL); | 401 | ieee80211_flush_queues(local, NULL, false); |
402 | 402 | ||
403 | local->tmp_channel = NULL; | 403 | local->tmp_channel = NULL; |
404 | ieee80211_hw_config(local, 0); | 404 | ieee80211_hw_config(local, 0); |
diff --git a/net/mac80211/pm.c b/net/mac80211/pm.c index 4c5192e0d66c..8c8c67819072 100644 --- a/net/mac80211/pm.c +++ b/net/mac80211/pm.c | |||
@@ -41,7 +41,7 @@ int __ieee80211_suspend(struct ieee80211_hw *hw, struct cfg80211_wowlan *wowlan) | |||
41 | /* flush out all packets */ | 41 | /* flush out all packets */ |
42 | synchronize_net(); | 42 | synchronize_net(); |
43 | 43 | ||
44 | ieee80211_flush_queues(local, NULL); | 44 | ieee80211_flush_queues(local, NULL, true); |
45 | 45 | ||
46 | local->quiescing = true; | 46 | local->quiescing = true; |
47 | /* make quiescing visible to timers everywhere */ | 47 | /* make quiescing visible to timers everywhere */ |
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c index ae842678b629..844fb5f7910e 100644 --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c | |||
@@ -416,7 +416,7 @@ static int ieee80211_start_sw_scan(struct ieee80211_local *local, | |||
416 | ieee80211_offchannel_stop_vifs(local); | 416 | ieee80211_offchannel_stop_vifs(local); |
417 | 417 | ||
418 | /* ensure nullfunc is transmitted before leaving operating channel */ | 418 | /* ensure nullfunc is transmitted before leaving operating channel */ |
419 | ieee80211_flush_queues(local, NULL); | 419 | ieee80211_flush_queues(local, NULL, false); |
420 | 420 | ||
421 | ieee80211_configure_filter(local); | 421 | ieee80211_configure_filter(local); |
422 | 422 | ||
@@ -805,7 +805,7 @@ static void ieee80211_scan_state_resume(struct ieee80211_local *local, | |||
805 | ieee80211_offchannel_stop_vifs(local); | 805 | ieee80211_offchannel_stop_vifs(local); |
806 | 806 | ||
807 | if (local->ops->flush) { | 807 | if (local->ops->flush) { |
808 | ieee80211_flush_queues(local, NULL); | 808 | ieee80211_flush_queues(local, NULL, false); |
809 | *next_delay = 0; | 809 | *next_delay = 0; |
810 | } else | 810 | } else |
811 | *next_delay = HZ / 10; | 811 | *next_delay = HZ / 10; |
diff --git a/net/mac80211/tdls.c b/net/mac80211/tdls.c index 55ddd77b865d..159ebf1304b2 100644 --- a/net/mac80211/tdls.c +++ b/net/mac80211/tdls.c | |||
@@ -912,7 +912,7 @@ ieee80211_tdls_mgmt_setup(struct wiphy *wiphy, struct net_device *dev, | |||
912 | rcu_read_unlock(); | 912 | rcu_read_unlock(); |
913 | } | 913 | } |
914 | 914 | ||
915 | ieee80211_flush_queues(local, sdata); | 915 | ieee80211_flush_queues(local, sdata, false); |
916 | 916 | ||
917 | ret = ieee80211_tdls_prep_mgmt_packet(wiphy, dev, peer, action_code, | 917 | ret = ieee80211_tdls_prep_mgmt_packet(wiphy, dev, peer, action_code, |
918 | dialog_token, status_code, | 918 | dialog_token, status_code, |
@@ -952,7 +952,7 @@ ieee80211_tdls_mgmt_teardown(struct wiphy *wiphy, struct net_device *dev, | |||
952 | */ | 952 | */ |
953 | ieee80211_stop_vif_queues(local, sdata, | 953 | ieee80211_stop_vif_queues(local, sdata, |
954 | IEEE80211_QUEUE_STOP_REASON_TDLS_TEARDOWN); | 954 | IEEE80211_QUEUE_STOP_REASON_TDLS_TEARDOWN); |
955 | ieee80211_flush_queues(local, sdata); | 955 | ieee80211_flush_queues(local, sdata, false); |
956 | 956 | ||
957 | ret = ieee80211_tdls_prep_mgmt_packet(wiphy, dev, peer, action_code, | 957 | ret = ieee80211_tdls_prep_mgmt_packet(wiphy, dev, peer, action_code, |
958 | dialog_token, status_code, | 958 | dialog_token, status_code, |
@@ -1098,7 +1098,7 @@ int ieee80211_tdls_oper(struct wiphy *wiphy, struct net_device *dev, | |||
1098 | */ | 1098 | */ |
1099 | tasklet_kill(&local->tx_pending_tasklet); | 1099 | tasklet_kill(&local->tx_pending_tasklet); |
1100 | /* flush a potentially queued teardown packet */ | 1100 | /* flush a potentially queued teardown packet */ |
1101 | ieee80211_flush_queues(local, sdata); | 1101 | ieee80211_flush_queues(local, sdata, false); |
1102 | 1102 | ||
1103 | ret = sta_info_destroy_addr(sdata, peer); | 1103 | ret = sta_info_destroy_addr(sdata, peer); |
1104 | break; | 1104 | break; |
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index da7f352a2b16..02ed6f60629a 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -3155,7 +3155,7 @@ int ieee80211_reserve_tid(struct ieee80211_sta *pubsta, u8 tid) | |||
3155 | } | 3155 | } |
3156 | 3156 | ||
3157 | queues = BIT(sdata->vif.hw_queue[ieee802_1d_to_ac[tid]]); | 3157 | queues = BIT(sdata->vif.hw_queue[ieee802_1d_to_ac[tid]]); |
3158 | __ieee80211_flush_queues(local, sdata, queues); | 3158 | __ieee80211_flush_queues(local, sdata, queues, false); |
3159 | 3159 | ||
3160 | sta->reserved_tid = tid; | 3160 | sta->reserved_tid = tid; |
3161 | 3161 | ||
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index ad8cb4fb441e..83ba6cd9cf8d 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
@@ -578,7 +578,7 @@ ieee80211_get_vif_queues(struct ieee80211_local *local, | |||
578 | 578 | ||
579 | void __ieee80211_flush_queues(struct ieee80211_local *local, | 579 | void __ieee80211_flush_queues(struct ieee80211_local *local, |
580 | struct ieee80211_sub_if_data *sdata, | 580 | struct ieee80211_sub_if_data *sdata, |
581 | unsigned int queues) | 581 | unsigned int queues, bool drop) |
582 | { | 582 | { |
583 | if (!local->ops->flush) | 583 | if (!local->ops->flush) |
584 | return; | 584 | return; |
@@ -594,7 +594,7 @@ void __ieee80211_flush_queues(struct ieee80211_local *local, | |||
594 | IEEE80211_QUEUE_STOP_REASON_FLUSH, | 594 | IEEE80211_QUEUE_STOP_REASON_FLUSH, |
595 | false); | 595 | false); |
596 | 596 | ||
597 | drv_flush(local, sdata, queues, false); | 597 | drv_flush(local, sdata, queues, drop); |
598 | 598 | ||
599 | ieee80211_wake_queues_by_reason(&local->hw, queues, | 599 | ieee80211_wake_queues_by_reason(&local->hw, queues, |
600 | IEEE80211_QUEUE_STOP_REASON_FLUSH, | 600 | IEEE80211_QUEUE_STOP_REASON_FLUSH, |
@@ -602,9 +602,9 @@ void __ieee80211_flush_queues(struct ieee80211_local *local, | |||
602 | } | 602 | } |
603 | 603 | ||
604 | void ieee80211_flush_queues(struct ieee80211_local *local, | 604 | void ieee80211_flush_queues(struct ieee80211_local *local, |
605 | struct ieee80211_sub_if_data *sdata) | 605 | struct ieee80211_sub_if_data *sdata, bool drop) |
606 | { | 606 | { |
607 | __ieee80211_flush_queues(local, sdata, 0); | 607 | __ieee80211_flush_queues(local, sdata, 0, drop); |
608 | } | 608 | } |
609 | 609 | ||
610 | void ieee80211_stop_vif_queues(struct ieee80211_local *local, | 610 | void ieee80211_stop_vif_queues(struct ieee80211_local *local, |