diff options
Diffstat (limited to 'net')
-rw-r--r-- | net/mac80211/ieee80211_i.h | 1 | ||||
-rw-r--r-- | net/mac80211/mlme.c | 10 | ||||
-rw-r--r-- | net/mac80211/scan.c | 20 | ||||
-rw-r--r-- | net/mac80211/util.c | 2 | ||||
-rw-r--r-- | net/rfkill/core.c | 4 |
5 files changed, 28 insertions, 9 deletions
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index 419f186cfcf0..91dc8636d644 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -746,6 +746,7 @@ struct ieee80211_local { | |||
746 | unsigned int wmm_acm; /* bit field of ACM bits (BIT(802.1D tag)) */ | 746 | unsigned int wmm_acm; /* bit field of ACM bits (BIT(802.1D tag)) */ |
747 | 747 | ||
748 | bool pspolling; | 748 | bool pspolling; |
749 | bool scan_ps_enabled; | ||
749 | /* | 750 | /* |
750 | * PS can only be enabled when we have exactly one managed | 751 | * PS can only be enabled when we have exactly one managed |
751 | * interface (and monitors) in PS, this then points there. | 752 | * interface (and monitors) in PS, this then points there. |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 6dc7b5ad9a41..d8d50fb5e823 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -1083,8 +1083,6 @@ static void ieee80211_set_disassoc(struct ieee80211_sub_if_data *sdata, | |||
1083 | 1083 | ||
1084 | ieee80211_set_wmm_default(sdata); | 1084 | ieee80211_set_wmm_default(sdata); |
1085 | 1085 | ||
1086 | ieee80211_recalc_idle(local); | ||
1087 | |||
1088 | /* channel(_type) changes are handled by ieee80211_hw_config */ | 1086 | /* channel(_type) changes are handled by ieee80211_hw_config */ |
1089 | local->oper_channel_type = NL80211_CHAN_NO_HT; | 1087 | local->oper_channel_type = NL80211_CHAN_NO_HT; |
1090 | 1088 | ||
@@ -1370,6 +1368,7 @@ ieee80211_rx_mgmt_deauth(struct ieee80211_sub_if_data *sdata, | |||
1370 | 1368 | ||
1371 | if (!wk) { | 1369 | if (!wk) { |
1372 | ieee80211_set_disassoc(sdata, true); | 1370 | ieee80211_set_disassoc(sdata, true); |
1371 | ieee80211_recalc_idle(sdata->local); | ||
1373 | } else { | 1372 | } else { |
1374 | list_del(&wk->list); | 1373 | list_del(&wk->list); |
1375 | kfree(wk); | 1374 | kfree(wk); |
@@ -1403,6 +1402,7 @@ ieee80211_rx_mgmt_disassoc(struct ieee80211_sub_if_data *sdata, | |||
1403 | sdata->dev->name, mgmt->sa, reason_code); | 1402 | sdata->dev->name, mgmt->sa, reason_code); |
1404 | 1403 | ||
1405 | ieee80211_set_disassoc(sdata, false); | 1404 | ieee80211_set_disassoc(sdata, false); |
1405 | ieee80211_recalc_idle(sdata->local); | ||
1406 | return RX_MGMT_CFG80211_DISASSOC; | 1406 | return RX_MGMT_CFG80211_DISASSOC; |
1407 | } | 1407 | } |
1408 | 1408 | ||
@@ -2117,6 +2117,7 @@ static void ieee80211_sta_work(struct work_struct *work) | |||
2117 | " after %dms, disconnecting.\n", | 2117 | " after %dms, disconnecting.\n", |
2118 | bssid, (1000 * IEEE80211_PROBE_WAIT)/HZ); | 2118 | bssid, (1000 * IEEE80211_PROBE_WAIT)/HZ); |
2119 | ieee80211_set_disassoc(sdata, true); | 2119 | ieee80211_set_disassoc(sdata, true); |
2120 | ieee80211_recalc_idle(local); | ||
2120 | mutex_unlock(&ifmgd->mtx); | 2121 | mutex_unlock(&ifmgd->mtx); |
2121 | /* | 2122 | /* |
2122 | * must be outside lock due to cfg80211, | 2123 | * must be outside lock due to cfg80211, |
@@ -2560,6 +2561,8 @@ int ieee80211_mgd_deauth(struct ieee80211_sub_if_data *sdata, | |||
2560 | IEEE80211_STYPE_DEAUTH, req->reason_code, | 2561 | IEEE80211_STYPE_DEAUTH, req->reason_code, |
2561 | cookie); | 2562 | cookie); |
2562 | 2563 | ||
2564 | ieee80211_recalc_idle(sdata->local); | ||
2565 | |||
2563 | return 0; | 2566 | return 0; |
2564 | } | 2567 | } |
2565 | 2568 | ||
@@ -2592,5 +2595,8 @@ int ieee80211_mgd_disassoc(struct ieee80211_sub_if_data *sdata, | |||
2592 | ieee80211_send_deauth_disassoc(sdata, req->bss->bssid, | 2595 | ieee80211_send_deauth_disassoc(sdata, req->bss->bssid, |
2593 | IEEE80211_STYPE_DISASSOC, req->reason_code, | 2596 | IEEE80211_STYPE_DISASSOC, req->reason_code, |
2594 | cookie); | 2597 | cookie); |
2598 | |||
2599 | ieee80211_recalc_idle(sdata->local); | ||
2600 | |||
2595 | return 0; | 2601 | return 0; |
2596 | } | 2602 | } |
diff --git a/net/mac80211/scan.c b/net/mac80211/scan.c index 4cf387c944bf..f1a4c7160300 100644 --- a/net/mac80211/scan.c +++ b/net/mac80211/scan.c | |||
@@ -227,7 +227,8 @@ static bool ieee80211_prep_hw_scan(struct ieee80211_local *local) | |||
227 | static void ieee80211_scan_ps_enable(struct ieee80211_sub_if_data *sdata) | 227 | static void ieee80211_scan_ps_enable(struct ieee80211_sub_if_data *sdata) |
228 | { | 228 | { |
229 | struct ieee80211_local *local = sdata->local; | 229 | struct ieee80211_local *local = sdata->local; |
230 | bool ps = false; | 230 | |
231 | local->scan_ps_enabled = false; | ||
231 | 232 | ||
232 | /* FIXME: what to do when local->pspolling is true? */ | 233 | /* FIXME: what to do when local->pspolling is true? */ |
233 | 234 | ||
@@ -235,12 +236,13 @@ static void ieee80211_scan_ps_enable(struct ieee80211_sub_if_data *sdata) | |||
235 | cancel_work_sync(&local->dynamic_ps_enable_work); | 236 | cancel_work_sync(&local->dynamic_ps_enable_work); |
236 | 237 | ||
237 | if (local->hw.conf.flags & IEEE80211_CONF_PS) { | 238 | if (local->hw.conf.flags & IEEE80211_CONF_PS) { |
238 | ps = true; | 239 | local->scan_ps_enabled = true; |
239 | local->hw.conf.flags &= ~IEEE80211_CONF_PS; | 240 | local->hw.conf.flags &= ~IEEE80211_CONF_PS; |
240 | ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); | 241 | ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); |
241 | } | 242 | } |
242 | 243 | ||
243 | if (!ps || !(local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)) | 244 | if (!(local->scan_ps_enabled) || |
245 | !(local->hw.flags & IEEE80211_HW_PS_NULLFUNC_STACK)) | ||
244 | /* | 246 | /* |
245 | * If power save was enabled, no need to send a nullfunc | 247 | * If power save was enabled, no need to send a nullfunc |
246 | * frame because AP knows that we are sleeping. But if the | 248 | * frame because AP knows that we are sleeping. But if the |
@@ -261,7 +263,7 @@ static void ieee80211_scan_ps_disable(struct ieee80211_sub_if_data *sdata) | |||
261 | 263 | ||
262 | if (!local->ps_sdata) | 264 | if (!local->ps_sdata) |
263 | ieee80211_send_nullfunc(local, sdata, 0); | 265 | ieee80211_send_nullfunc(local, sdata, 0); |
264 | else { | 266 | else if (local->scan_ps_enabled) { |
265 | /* | 267 | /* |
266 | * In !IEEE80211_HW_PS_NULLFUNC_STACK case the hardware | 268 | * In !IEEE80211_HW_PS_NULLFUNC_STACK case the hardware |
267 | * will send a nullfunc frame with the powersave bit set | 269 | * will send a nullfunc frame with the powersave bit set |
@@ -277,6 +279,16 @@ static void ieee80211_scan_ps_disable(struct ieee80211_sub_if_data *sdata) | |||
277 | */ | 279 | */ |
278 | local->hw.conf.flags |= IEEE80211_CONF_PS; | 280 | local->hw.conf.flags |= IEEE80211_CONF_PS; |
279 | ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); | 281 | ieee80211_hw_config(local, IEEE80211_CONF_CHANGE_PS); |
282 | } else if (local->hw.conf.dynamic_ps_timeout > 0) { | ||
283 | /* | ||
284 | * If IEEE80211_CONF_PS was not set and the dynamic_ps_timer | ||
285 | * had been running before leaving the operating channel, | ||
286 | * restart the timer now and send a nullfunc frame to inform | ||
287 | * the AP that we are awake. | ||
288 | */ | ||
289 | ieee80211_send_nullfunc(local, sdata, 0); | ||
290 | mod_timer(&local->dynamic_ps_timer, jiffies + | ||
291 | msecs_to_jiffies(local->hw.conf.dynamic_ps_timeout)); | ||
280 | } | 292 | } |
281 | } | 293 | } |
282 | 294 | ||
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index d09f78bb2442..78a6e924c7e1 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
@@ -579,7 +579,7 @@ u32 ieee802_11_parse_elems_crc(u8 *start, size_t len, | |||
579 | if (elen > left) | 579 | if (elen > left) |
580 | break; | 580 | break; |
581 | 581 | ||
582 | if (calc_crc && id < 64 && (filter & BIT(id))) | 582 | if (calc_crc && id < 64 && (filter & (1ULL << id))) |
583 | crc = crc32_be(crc, pos - 2, elen + 2); | 583 | crc = crc32_be(crc, pos - 2, elen + 2); |
584 | 584 | ||
585 | switch (id) { | 585 | switch (id) { |
diff --git a/net/rfkill/core.c b/net/rfkill/core.c index 448e5a0fcc2e..c218e07e5caf 100644 --- a/net/rfkill/core.c +++ b/net/rfkill/core.c | |||
@@ -579,6 +579,8 @@ static ssize_t rfkill_name_show(struct device *dev, | |||
579 | 579 | ||
580 | static const char *rfkill_get_type_str(enum rfkill_type type) | 580 | static const char *rfkill_get_type_str(enum rfkill_type type) |
581 | { | 581 | { |
582 | BUILD_BUG_ON(NUM_RFKILL_TYPES != RFKILL_TYPE_FM + 1); | ||
583 | |||
582 | switch (type) { | 584 | switch (type) { |
583 | case RFKILL_TYPE_WLAN: | 585 | case RFKILL_TYPE_WLAN: |
584 | return "wlan"; | 586 | return "wlan"; |
@@ -597,8 +599,6 @@ static const char *rfkill_get_type_str(enum rfkill_type type) | |||
597 | default: | 599 | default: |
598 | BUG(); | 600 | BUG(); |
599 | } | 601 | } |
600 | |||
601 | BUILD_BUG_ON(NUM_RFKILL_TYPES != RFKILL_TYPE_FM + 1); | ||
602 | } | 602 | } |
603 | 603 | ||
604 | static ssize_t rfkill_type_show(struct device *dev, | 604 | static ssize_t rfkill_type_show(struct device *dev, |