diff options
Diffstat (limited to 'net/mac80211')
-rw-r--r-- | net/mac80211/cfg.c | 6 | ||||
-rw-r--r-- | net/mac80211/ieee80211_i.h | 1 | ||||
-rw-r--r-- | net/mac80211/mlme.c | 15 | ||||
-rw-r--r-- | net/mac80211/util.c | 3 |
4 files changed, 22 insertions, 3 deletions
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index d41974aacf51..06b8d39780e9 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
@@ -1285,9 +1285,10 @@ static int ieee80211_change_station(struct wiphy *wiphy, | |||
1285 | mutex_unlock(&local->sta_mtx); | 1285 | mutex_unlock(&local->sta_mtx); |
1286 | 1286 | ||
1287 | if (sdata->vif.type == NL80211_IFTYPE_STATION && | 1287 | if (sdata->vif.type == NL80211_IFTYPE_STATION && |
1288 | params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED)) | 1288 | params->sta_flags_mask & BIT(NL80211_STA_FLAG_AUTHORIZED)) { |
1289 | ieee80211_recalc_ps(local, -1); | 1289 | ieee80211_recalc_ps(local, -1); |
1290 | 1290 | ieee80211_recalc_ps_vif(sdata); | |
1291 | } | ||
1291 | return 0; | 1292 | return 0; |
1292 | } | 1293 | } |
1293 | 1294 | ||
@@ -2079,6 +2080,7 @@ static int ieee80211_set_power_mgmt(struct wiphy *wiphy, struct net_device *dev, | |||
2079 | ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); | 2080 | ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); |
2080 | 2081 | ||
2081 | ieee80211_recalc_ps(local, -1); | 2082 | ieee80211_recalc_ps(local, -1); |
2083 | ieee80211_recalc_ps_vif(sdata); | ||
2082 | 2084 | ||
2083 | return 0; | 2085 | return 0; |
2084 | } | 2086 | } |
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 3e2f03b1b50e..8e65ad9c870a 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -1203,6 +1203,7 @@ int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata, | |||
1203 | void ieee80211_send_pspoll(struct ieee80211_local *local, | 1203 | void ieee80211_send_pspoll(struct ieee80211_local *local, |
1204 | struct ieee80211_sub_if_data *sdata); | 1204 | struct ieee80211_sub_if_data *sdata); |
1205 | void ieee80211_recalc_ps(struct ieee80211_local *local, s32 latency); | 1205 | void ieee80211_recalc_ps(struct ieee80211_local *local, s32 latency); |
1206 | void ieee80211_recalc_ps_vif(struct ieee80211_sub_if_data *sdata); | ||
1206 | int ieee80211_max_network_latency(struct notifier_block *nb, | 1207 | int ieee80211_max_network_latency(struct notifier_block *nb, |
1207 | unsigned long data, void *dummy); | 1208 | unsigned long data, void *dummy); |
1208 | int ieee80211_set_arp_filter(struct ieee80211_sub_if_data *sdata); | 1209 | int ieee80211_set_arp_filter(struct ieee80211_sub_if_data *sdata); |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index f0d6fa283071..ea46c6446450 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -1032,6 +1032,16 @@ void ieee80211_recalc_ps(struct ieee80211_local *local, s32 latency) | |||
1032 | ieee80211_change_ps(local); | 1032 | ieee80211_change_ps(local); |
1033 | } | 1033 | } |
1034 | 1034 | ||
1035 | void ieee80211_recalc_ps_vif(struct ieee80211_sub_if_data *sdata) | ||
1036 | { | ||
1037 | bool ps_allowed = ieee80211_powersave_allowed(sdata); | ||
1038 | |||
1039 | if (sdata->vif.bss_conf.ps != ps_allowed) { | ||
1040 | sdata->vif.bss_conf.ps = ps_allowed; | ||
1041 | ieee80211_bss_info_change_notify(sdata, BSS_CHANGED_PS); | ||
1042 | } | ||
1043 | } | ||
1044 | |||
1035 | void ieee80211_dynamic_ps_disable_work(struct work_struct *work) | 1045 | void ieee80211_dynamic_ps_disable_work(struct work_struct *work) |
1036 | { | 1046 | { |
1037 | struct ieee80211_local *local = | 1047 | struct ieee80211_local *local = |
@@ -1335,6 +1345,8 @@ static void ieee80211_set_associated(struct ieee80211_sub_if_data *sdata, | |||
1335 | ieee80211_recalc_smps(local); | 1345 | ieee80211_recalc_smps(local); |
1336 | mutex_unlock(&local->iflist_mtx); | 1346 | mutex_unlock(&local->iflist_mtx); |
1337 | 1347 | ||
1348 | ieee80211_recalc_ps_vif(sdata); | ||
1349 | |||
1338 | netif_tx_start_all_queues(sdata->dev); | 1350 | netif_tx_start_all_queues(sdata->dev); |
1339 | netif_carrier_on(sdata->dev); | 1351 | netif_carrier_on(sdata->dev); |
1340 | } | 1352 | } |
@@ -1396,6 +1408,9 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, | |||
1396 | } | 1408 | } |
1397 | local->ps_sdata = NULL; | 1409 | local->ps_sdata = NULL; |
1398 | 1410 | ||
1411 | /* disable per-vif ps */ | ||
1412 | ieee80211_recalc_ps_vif(sdata); | ||
1413 | |||
1399 | /* flush out any pending frame (e.g. DELBA) before deauth/disassoc */ | 1414 | /* flush out any pending frame (e.g. DELBA) before deauth/disassoc */ |
1400 | if (tx) | 1415 | if (tx) |
1401 | drv_flush(local, false); | 1416 | drv_flush(local, false); |
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 39b82fee4904..037d148e9f19 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
@@ -1359,7 +1359,8 @@ int ieee80211_reconfig(struct ieee80211_local *local) | |||
1359 | switch (sdata->vif.type) { | 1359 | switch (sdata->vif.type) { |
1360 | case NL80211_IFTYPE_STATION: | 1360 | case NL80211_IFTYPE_STATION: |
1361 | changed |= BSS_CHANGED_ASSOC | | 1361 | changed |= BSS_CHANGED_ASSOC | |
1362 | BSS_CHANGED_ARP_FILTER; | 1362 | BSS_CHANGED_ARP_FILTER | |
1363 | BSS_CHANGED_PS; | ||
1363 | mutex_lock(&sdata->u.mgd.mtx); | 1364 | mutex_lock(&sdata->u.mgd.mtx); |
1364 | ieee80211_bss_info_change_notify(sdata, changed); | 1365 | ieee80211_bss_info_change_notify(sdata, changed); |
1365 | mutex_unlock(&sdata->u.mgd.mtx); | 1366 | mutex_unlock(&sdata->u.mgd.mtx); |