aboutsummaryrefslogtreecommitdiffstats
path: root/net/mac80211/mlme.c
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2010-06-10 04:21:29 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-06-14 15:38:16 -0400
commit2a419056c15478d2df3f3e9d4fa64e34eb1faa7d (patch)
tree680342d6b883c18eec9003f2b93abd8ffd1e6ae6 /net/mac80211/mlme.c
parent9d38d85de0270e3927bffab94973a9c78d1dc800 (diff)
mac80211: simplify station/aggregation code
A number of places use RCU locking for accessing the station list, even though they do not need to. Use mutex locking instead to prepare for the locking changes I want to make. The mlme code is also using a WLAN_STA_DISASSOC flag that has the same meaning as WLAN_STA_BLOCK_BA, so use that. While doing so, combine places where we loop over stations twice, and optimise away some of the loops by checking if the hardware supports aggregation at all first. Also fix a more theoretical race condition: right now we could resume, set up an aggregation session, and right after tear it down again due to the code that is needed for hardware reconfiguration here. Also mark add a comment to that code marking it as a workaround. Finally, remove a pointless aggregation disabling loop when an interface is stopped, directly after that we remove all stations from it which will also disable all aggregation sessions that may still be active, and does so in a race-free way unlike the current loop that doesn't block new sessions. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'net/mac80211/mlme.c')
-rw-r--r--net/mac80211/mlme.c6
1 files changed, 3 insertions, 3 deletions
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c
index 1373b3dde8b..0154d74905c 100644
--- a/net/mac80211/mlme.c
+++ b/net/mac80211/mlme.c
@@ -898,13 +898,13 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata,
898 netif_tx_stop_all_queues(sdata->dev); 898 netif_tx_stop_all_queues(sdata->dev);
899 netif_carrier_off(sdata->dev); 899 netif_carrier_off(sdata->dev);
900 900
901 rcu_read_lock(); 901 mutex_lock(&local->sta_mtx);
902 sta = sta_info_get(sdata, bssid); 902 sta = sta_info_get(sdata, bssid);
903 if (sta) { 903 if (sta) {
904 set_sta_flags(sta, WLAN_STA_DISASSOC); 904 set_sta_flags(sta, WLAN_STA_BLOCK_BA);
905 ieee80211_sta_tear_down_BA_sessions(sta); 905 ieee80211_sta_tear_down_BA_sessions(sta);
906 } 906 }
907 rcu_read_unlock(); 907 mutex_unlock(&local->sta_mtx);
908 908
909 changed |= ieee80211_reset_erp_info(sdata); 909 changed |= ieee80211_reset_erp_info(sdata);
910 910