summaryrefslogtreecommitdiff
path: root/net
diff options
context:
space:
mode:
authorJohannes Berg <johannes.berg@intel.com>2021-11-29 15:32:40 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2024-11-08 16:22:01 +0100
commit89e25a2ec2a215ed26780a81eeb85f216f590078 (patch)
tree968071a1eab5f9d086fb892b7691f5c9c964fac5 /net
parent1ac988c6b8ff30b4c814afc43f077a8e5ad3ce80 (diff)
downloadlinux-89e25a2ec2a215ed26780a81eeb85f216f590078.tar.gz
linux-89e25a2ec2a215ed26780a81eeb85f216f590078.tar.bz2
linux-89e25a2ec2a215ed26780a81eeb85f216f590078.zip
mac80211: do drv_reconfig_complete() before restarting all
[ Upstream commit 13dee10b30c058ee2c58c5da00339cc0d4201aa6 ] When we reconfigure, the driver might do some things to complete the reconfiguration. It's strange and could be broken in some cases because we restart other works (e.g. remain-on-channel and TX) before this happens, yet only start queues later. Change this to do the reconfig complete when reconfiguration is actually complete, not when we've already started doing other things again. For iwlwifi, this should fix a race where the reconfig can race with TX, for ath10k and ath11k that also use this it won't make a difference because they just start queues there, and mac80211 also stopped the queues and will restart them later as before. Signed-off-by: Johannes Berg <johannes.berg@intel.com> Signed-off-by: Luca Coelho <luciano.coelho@intel.com> Link: https://lore.kernel.org/r/iwlwifi.20211129152938.cab99f22fe19.Iefe494687f15fd85f77c1b989d1149c8efdfdc36@changeid Signed-off-by: Johannes Berg <johannes.berg@intel.com> Stable-dep-of: 07a6e3b78a65 ("wifi: iwlwifi: mvm: Fix response handling in iwl_mvm_send_recovery_cmd()") Signed-off-by: Sasha Levin <sashal@kernel.org>
Diffstat (limited to 'net')
-rw-r--r--net/mac80211/util.c14
1 files changed, 7 insertions, 7 deletions
diff --git a/net/mac80211/util.c b/net/mac80211/util.c
index 7fa6efa8b83c..997ce9c64336 100644
--- a/net/mac80211/util.c
+++ b/net/mac80211/util.c
@@ -2632,6 +2632,13 @@ int ieee80211_reconfig(struct ieee80211_local *local)
mutex_unlock(&local->sta_mtx);
}
+ /*
+ * If this is for hw restart things are still running.
+ * We may want to change that later, however.
+ */
+ if (local->open_count && (!suspended || reconfig_due_to_wowlan))
+ drv_reconfig_complete(local, IEEE80211_RECONFIG_TYPE_RESTART);
+
if (local->in_reconfig) {
local->in_reconfig = false;
barrier();
@@ -2650,13 +2657,6 @@ int ieee80211_reconfig(struct ieee80211_local *local)
IEEE80211_QUEUE_STOP_REASON_SUSPEND,
false);
- /*
- * If this is for hw restart things are still running.
- * We may want to change that later, however.
- */
- if (local->open_count && (!suspended || reconfig_due_to_wowlan))
- drv_reconfig_complete(local, IEEE80211_RECONFIG_TYPE_RESTART);
-
if (!suspended)
return 0;