Index: chromeos/compat-wireless/net/mac80211/main.c |
diff --git a/chromeos/compat-wireless/net/mac80211/main.c b/chromeos/compat-wireless/net/mac80211/main.c |
index cd669529b34c079bedf472841185177329b88d6e..b7f84db118b0259359cd78c6fb466c3a1240cf45 100644 |
--- a/chromeos/compat-wireless/net/mac80211/main.c |
+++ b/chromeos/compat-wireless/net/mac80211/main.c |
@@ -103,16 +103,19 @@ int ieee80211_hw_config(struct ieee80211_local *local, u32 changed) |
int ret = 0; |
int power; |
enum nl80211_channel_type channel_type; |
+ u32 offchannel_flag; |
might_sleep(); |
scan_chan = local->scan_channel; |
+ offchannel_flag = local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL; |
if (scan_chan) { |
chan = scan_chan; |
channel_type = NL80211_CHAN_NO_HT; |
local->hw.conf.flags |= IEEE80211_CONF_OFFCHANNEL; |
- } else if (local->tmp_channel) { |
+ } else if (local->tmp_channel && |
+ local->oper_channel != local->tmp_channel) { |
chan = scan_chan = local->tmp_channel; |
channel_type = local->tmp_channel_type; |
local->hw.conf.flags |= IEEE80211_CONF_OFFCHANNEL; |
@@ -121,8 +124,9 @@ int ieee80211_hw_config(struct ieee80211_local *local, u32 changed) |
channel_type = local->_oper_channel_type; |
local->hw.conf.flags &= ~IEEE80211_CONF_OFFCHANNEL; |
} |
+ offchannel_flag ^= local->hw.conf.flags & IEEE80211_CONF_OFFCHANNEL; |
- if (chan != local->hw.conf.channel || |
+ if (offchannel_flag || chan != local->hw.conf.channel || |
channel_type != local->hw.conf.channel_type) { |
local->hw.conf.channel = chan; |
local->hw.conf.channel_type = channel_type; |
@@ -738,6 +742,12 @@ void ieee80211_unregister_hw(struct ieee80211_hw *hw) |
rtnl_unlock(); |
+ /* |
+ * Now all work items will be gone, but the |
+ * timer might still be armed, so delete it |
+ */ |
+ del_timer_sync(&local->work_timer); |
+ |
cancel_work_sync(&local->reconfig_filter); |
ieee80211_clear_tx_pending(local); |