--- a/drivers/net/wireless/ath/ath9k/ath9k.h
+++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -620,6 +620,7 @@ struct ath_softc {
+@@ -649,6 +649,7 @@ struct ath_softc {
struct ieee80211_hw *hw;
struct device *dev;
struct survey_info *cur_survey;
struct survey_info survey[ATH9K_NUM_CHANNELS];
-@@ -687,6 +688,7 @@ struct ath_softc {
+@@ -717,6 +718,7 @@ struct ath_softc {
struct dfs_pattern_detector *dfs_detector;
};
}
--- a/drivers/net/wireless/ath/ath9k/main.c
+++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -1551,7 +1551,7 @@ static void ath9k_disable_ps(struct ath_
+@@ -1084,7 +1084,7 @@ static void ath9k_disable_ps(struct ath_
ath_dbg(common, PS, "PowerSave disabled\n");
}
{
struct ath_softc *sc = hw->priv;
struct ath_hw *ah = sc->sc_ah;
-@@ -1602,9 +1602,11 @@ static int ath9k_config(struct ieee80211
+@@ -1138,9 +1138,11 @@ static int ath9k_config(struct ieee80211
if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || reset_channel) {
struct ieee80211_channel *curchan = hw->conf.channel;
if (ah->curchan)
old_pos = ah->curchan - &ah->channels[0];
-@@ -1652,7 +1654,23 @@ static int ath9k_config(struct ieee80211
+@@ -1183,7 +1185,23 @@ static int ath9k_config(struct ieee80211
memset(&sc->survey[pos], 0, sizeof(struct survey_info));
}
+ if (ath_set_channel(sc, hw, hchan) < 0) {
ath_err(common, "Unable to set channel\n");
mutex_unlock(&sc->mutex);
- return -EINVAL;
+ ath9k_ps_restore(sc);