ath9k: fix calibration on 5 ghz
[openwrt.git] / package / mac80211 / patches / 513-ath9k_channelbw_debugfs.patch
index 28251eeef196292b9316caeaae32280060709446..fedd17f51dfae526ebf62ad25e3b2978034d150f 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/ath9k.h
 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -586,6 +586,7 @@ struct ath_softc {
+@@ -587,6 +587,7 @@ struct ath_softc {
        struct ieee80211_hw *hw;
        struct device *dev;
  
@@ -10,7 +10,7 @@
        struct survey_info *cur_survey;
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -1281,6 +1281,9 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -1378,6 +1378,9 @@ int ath9k_init_debug(struct ath_hw *ah)
        debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
                            &fops_eeprom);
  
  }
 --- a/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -226,6 +226,7 @@ static int ath_set_channel(struct ath_so
-       bool fastcc = true, stopped;
-       struct ieee80211_channel *channel = hw->conf.channel;
-       struct ath9k_hw_cal_data *caldata = NULL;
-+      u32 oldflags;
-       int r;
+@@ -1654,9 +1654,10 @@ static int ath9k_config(struct ieee80211
  
-       if (sc->sc_flags & SC_OP_INVALID)
-@@ -268,6 +269,24 @@ static int ath_set_channel(struct ath_so
-       if (!stopped || !(sc->sc_flags & SC_OP_OFFCHANNEL))
-               fastcc = false;
+       if (changed & IEEE80211_CONF_CHANGE_CHANNEL) {
+               struct ieee80211_channel *curchan = hw->conf.channel;
+-              struct ath9k_channel old_chan;
++              struct ath9k_channel old_chan, *hchan;
+               int pos = curchan->hw_value;
+               int old_pos = -1;
++              u32 oldflags;
+               unsigned long flags;
  
-+      oldflags = hchan->channelFlags;
-+      switch (sc->chan_bw) {
-+      case 5:
-+              hchan->channelFlags &= ~CHANNEL_HALF;
-+              hchan->channelFlags |= CHANNEL_QUARTER;
-+              break;
-+      case 10:
-+              hchan->channelFlags &= ~CHANNEL_QUARTER;
-+              hchan->channelFlags |= CHANNEL_HALF;
-+              break;
-+      default:
-+              hchan->channelFlags &= ~(CHANNEL_HALF | CHANNEL_QUARTER);
-+              break;
-+      }
-+
-+      if (oldflags != hchan->channelFlags)
-+              fastcc = false;
+               if (ah->curchan)
+@@ -1709,7 +1710,23 @@ static int ath9k_config(struct ieee80211
+                       memset(&sc->survey[pos], 0, sizeof(struct survey_info));
+               }
+-              if (ath_set_channel(sc, hw, &sc->sc_ah->channels[pos]) < 0) {
++              hchan = &sc->sc_ah->channels[pos];
++              oldflags = hchan->channelFlags;
++              switch (sc->chan_bw) {
++              case 5:
++                      hchan->channelFlags &= ~CHANNEL_HALF;
++                      hchan->channelFlags |= CHANNEL_QUARTER;
++                      break;
++              case 10:
++                      hchan->channelFlags &= ~CHANNEL_QUARTER;
++                      hchan->channelFlags |= CHANNEL_HALF;
++                      break;
++              default:
++                      hchan->channelFlags &= ~(CHANNEL_HALF | CHANNEL_QUARTER);
++                      break;
++              }
 +
-       if (!(sc->sc_flags & SC_OP_OFFCHANNEL))
-               caldata = &sc->caldata;
++              if (ath_set_channel(sc, hw, hchan) < 0) {
+                       ath_err(common, "Unable to set channel\n");
+                       mutex_unlock(&sc->mutex);
+                       return -EINVAL;
+--- a/drivers/net/wireless/ath/ath9k/hw.c
++++ b/drivers/net/wireless/ath/ath9k/hw.c
+@@ -1504,6 +1504,10 @@ int ath9k_hw_reset(struct ath_hw *ah, st
+       }
+       ah->noise = ath9k_hw_getchan_noise(ah, chan);
  
++      if (!ah->curchan || ((ah->curchan->channelFlags ^ chan->channelFlags) &
++          (CHANNEL_HALF | CHANNEL_QUARTER)))
++              bChannelChange = false;
++
+       if (bChannelChange &&
+           (ah->chip_fullsleep != true) &&
+           (ah->curchan != NULL) &&