|
@@ -1672,6 +1672,7 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
|
|
|
|
|
|
if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
|
|
|
struct ieee80211_channel *curchan = hw->conf.channel;
|
|
|
+ struct ath9k_channel old_chan;
|
|
|
int pos = curchan->hw_value;
|
|
|
int old_pos = -1;
|
|
|
unsigned long flags;
|
|
@@ -1688,14 +1689,24 @@ static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
|
|
|
"Set channel: %d MHz type: %d\n",
|
|
|
curchan->center_freq, conf->channel_type);
|
|
|
|
|
|
- ath9k_cmn_update_ichannel(&sc->sc_ah->channels[pos],
|
|
|
- curchan, conf->channel_type);
|
|
|
-
|
|
|
/* update survey stats for the old channel before switching */
|
|
|
spin_lock_irqsave(&common->cc_lock, flags);
|
|
|
ath_update_survey_stats(sc);
|
|
|
spin_unlock_irqrestore(&common->cc_lock, flags);
|
|
|
|
|
|
+ /*
|
|
|
+ * Preserve the current channel values, before updating
|
|
|
+ * the same channel
|
|
|
+ */
|
|
|
+ if (old_pos == pos) {
|
|
|
+ memcpy(&old_chan, &sc->sc_ah->channels[pos],
|
|
|
+ sizeof(struct ath9k_channel));
|
|
|
+ ah->curchan = &old_chan;
|
|
|
+ }
|
|
|
+
|
|
|
+ ath9k_cmn_update_ichannel(&sc->sc_ah->channels[pos],
|
|
|
+ curchan, conf->channel_type);
|
|
|
+
|
|
|
/*
|
|
|
* If the operating channel changes, change the survey in-use flags
|
|
|
* along with it.
|