diff options
-rw-r--r-- | net/mac80211/ieee80211_i.h | 3 | ||||
-rw-r--r-- | net/mac80211/main.c | 7 | ||||
-rw-r--r-- | net/mac80211/rx.c | 4 | ||||
-rw-r--r-- | net/mac80211/util.c | 3 |
4 files changed, 17 insertions, 0 deletions
diff --git a/net/mac80211/ieee80211_i.h b/net/mac80211/ieee80211_i.h index e6cbf5b68c89..ddf768f6350e 100644 --- a/net/mac80211/ieee80211_i.h +++ b/net/mac80211/ieee80211_i.h | |||
@@ -881,6 +881,9 @@ struct ieee80211_local { | |||
881 | /* device is started */ | 881 | /* device is started */ |
882 | bool started; | 882 | bool started; |
883 | 883 | ||
884 | /* device is during a HW reconfig */ | ||
885 | bool in_reconfig; | ||
886 | |||
884 | /* wowlan is enabled -- don't reconfig on resume */ | 887 | /* wowlan is enabled -- don't reconfig on resume */ |
885 | bool wowlan; | 888 | bool wowlan; |
886 | 889 | ||
diff --git a/net/mac80211/main.c b/net/mac80211/main.c index d81c178c7712..976e41365c25 100644 --- a/net/mac80211/main.c +++ b/net/mac80211/main.c | |||
@@ -345,6 +345,13 @@ void ieee80211_restart_hw(struct ieee80211_hw *hw) | |||
345 | ieee80211_stop_queues_by_reason(hw, | 345 | ieee80211_stop_queues_by_reason(hw, |
346 | IEEE80211_QUEUE_STOP_REASON_SUSPEND); | 346 | IEEE80211_QUEUE_STOP_REASON_SUSPEND); |
347 | 347 | ||
348 | /* | ||
349 | * Stop all Rx during the reconfig. We don't want state changes | ||
350 | * or driver callbacks while this is in progress. | ||
351 | */ | ||
352 | local->in_reconfig = true; | ||
353 | barrier(); | ||
354 | |||
348 | schedule_work(&local->restart_work); | 355 | schedule_work(&local->restart_work); |
349 | } | 356 | } |
350 | EXPORT_SYMBOL(ieee80211_restart_hw); | 357 | EXPORT_SYMBOL(ieee80211_restart_hw); |
diff --git a/net/mac80211/rx.c b/net/mac80211/rx.c index 6fd2cb0838c4..072e8f3afa2b 100644 --- a/net/mac80211/rx.c +++ b/net/mac80211/rx.c | |||
@@ -3027,6 +3027,10 @@ void ieee80211_rx(struct ieee80211_hw *hw, struct sk_buff *skb) | |||
3027 | if (unlikely(local->quiescing || local->suspended)) | 3027 | if (unlikely(local->quiescing || local->suspended)) |
3028 | goto drop; | 3028 | goto drop; |
3029 | 3029 | ||
3030 | /* We might be during a HW reconfig, prevent Rx for the same reason */ | ||
3031 | if (unlikely(local->in_reconfig)) | ||
3032 | goto drop; | ||
3033 | |||
3030 | /* | 3034 | /* |
3031 | * The same happens when we're not even started, | 3035 | * The same happens when we're not even started, |
3032 | * but that's worth a warning. | 3036 | * but that's worth a warning. |
diff --git a/net/mac80211/util.c b/net/mac80211/util.c index 1df4019f294b..242ecde381f6 100644 --- a/net/mac80211/util.c +++ b/net/mac80211/util.c | |||
@@ -1411,6 +1411,9 @@ int ieee80211_reconfig(struct ieee80211_local *local) | |||
1411 | if (ieee80211_sdata_running(sdata)) | 1411 | if (ieee80211_sdata_running(sdata)) |
1412 | ieee80211_enable_keys(sdata); | 1412 | ieee80211_enable_keys(sdata); |
1413 | 1413 | ||
1414 | local->in_reconfig = false; | ||
1415 | barrier(); | ||
1416 | |||
1414 | wake_up: | 1417 | wake_up: |
1415 | /* | 1418 | /* |
1416 | * Clear the WLAN_STA_BLOCK_BA flag so new aggregation | 1419 | * Clear the WLAN_STA_BLOCK_BA flag so new aggregation |