| 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);
|
|
|