diff options
Diffstat (limited to 'net/mac80211/util.c')
-rw-r--r-- | net/mac80211/util.c | 42 |
1 files changed, 24 insertions, 18 deletions
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 5b79d552780a..748387d45bc0 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
@@ -803,8 +803,12 @@ void ieee80211_set_wmm_default(struct ieee80211_sub_if_data *sdata) | |||
803 | 803 | ||
804 | /* after reinitialize QoS TX queues setting to default, | 804 | /* after reinitialize QoS TX queues setting to default, |
805 | * disable QoS at all */ | 805 | * disable QoS at all */ |
806 | local->hw.conf.flags &= ~IEEE80211_CONF_QOS; | 806 | |
807 | drv_config(local, IEEE80211_CONF_CHANGE_QOS); | 807 | if (sdata->vif.type != NL80211_IFTYPE_MONITOR) { |
808 | sdata->vif.bss_conf.qos = | ||
809 | sdata->vif.type != NL80211_IFTYPE_STATION; | ||
810 | ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_QOS); | ||
811 | } | ||
808 | } | 812 | } |
809 | 813 | ||
810 | void ieee80211_sta_def_wmm_params(struct ieee80211_sub_if_data *sdata, | 814 | void ieee80211_sta_def_wmm_params(struct ieee80211_sub_if_data *sdata, |
@@ -1138,18 +1142,6 @@ int ieee80211_reconfig(struct ieee80211_local *local) | |||
1138 | } | 1142 | } |
1139 | mutex_unlock(&local->sta_mtx); | 1143 | mutex_unlock(&local->sta_mtx); |
1140 | 1144 | ||
1141 | /* Clear Suspend state so that ADDBA requests can be processed */ | ||
1142 | |||
1143 | rcu_read_lock(); | ||
1144 | |||
1145 | if (hw->flags & IEEE80211_HW_AMPDU_AGGREGATION) { | ||
1146 | list_for_each_entry_rcu(sta, &local->sta_list, list) { | ||
1147 | clear_sta_flags(sta, WLAN_STA_BLOCK_BA); | ||
1148 | } | ||
1149 | } | ||
1150 | |||
1151 | rcu_read_unlock(); | ||
1152 | |||
1153 | /* setup RTS threshold */ | 1145 | /* setup RTS threshold */ |
1154 | drv_set_rts_threshold(local, hw->wiphy->rts_threshold); | 1146 | drv_set_rts_threshold(local, hw->wiphy->rts_threshold); |
1155 | 1147 | ||
@@ -1173,7 +1165,8 @@ int ieee80211_reconfig(struct ieee80211_local *local) | |||
1173 | BSS_CHANGED_BASIC_RATES | | 1165 | BSS_CHANGED_BASIC_RATES | |
1174 | BSS_CHANGED_BEACON_INT | | 1166 | BSS_CHANGED_BEACON_INT | |
1175 | BSS_CHANGED_BSSID | | 1167 | BSS_CHANGED_BSSID | |
1176 | BSS_CHANGED_CQM; | 1168 | BSS_CHANGED_CQM | |
1169 | BSS_CHANGED_QOS; | ||
1177 | 1170 | ||
1178 | switch (sdata->vif.type) { | 1171 | switch (sdata->vif.type) { |
1179 | case NL80211_IFTYPE_STATION: | 1172 | case NL80211_IFTYPE_STATION: |
@@ -1202,13 +1195,26 @@ int ieee80211_reconfig(struct ieee80211_local *local) | |||
1202 | } | 1195 | } |
1203 | } | 1196 | } |
1204 | 1197 | ||
1205 | rcu_read_lock(); | 1198 | /* |
1199 | * Clear the WLAN_STA_BLOCK_BA flag so new aggregation | ||
1200 | * sessions can be established after a resume. | ||
1201 | * | ||
1202 | * Also tear down aggregation sessions since reconfiguring | ||
1203 | * them in a hardware restart scenario is not easily done | ||
1204 | * right now, and the hardware will have lost information | ||
1205 | * about the sessions, but we and the AP still think they | ||
1206 | * are active. This is really a workaround though. | ||
1207 | */ | ||
1206 | if (hw->flags & IEEE80211_HW_AMPDU_AGGREGATION) { | 1208 | if (hw->flags & IEEE80211_HW_AMPDU_AGGREGATION) { |
1207 | list_for_each_entry_rcu(sta, &local->sta_list, list) { | 1209 | mutex_lock(&local->sta_mtx); |
1210 | |||
1211 | list_for_each_entry(sta, &local->sta_list, list) { | ||
1208 | ieee80211_sta_tear_down_BA_sessions(sta); | 1212 | ieee80211_sta_tear_down_BA_sessions(sta); |
1213 | clear_sta_flags(sta, WLAN_STA_BLOCK_BA); | ||
1209 | } | 1214 | } |
1215 | |||
1216 | mutex_unlock(&local->sta_mtx); | ||
1210 | } | 1217 | } |
1211 | rcu_read_unlock(); | ||
1212 | 1218 | ||
1213 | /* add back keys */ | 1219 | /* add back keys */ |
1214 | list_for_each_entry(sdata, &local->interfaces, list) | 1220 | list_for_each_entry(sdata, &local->interfaces, list) |