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;
                        "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.