ath9k: improve AP mode powersave buffering handling
[openwrt/svn-archive/archive.git] / package / mac80211 / patches / 512-ath9k_channelbw_debugfs.patch
index 637fadaa198ce119dec66d9eb97c76560bb66493..9edc4074f76967c0c31c3cc759138ba3afada800 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/ath9k.h
 +++ b/drivers/net/wireless/ath/ath9k/ath9k.h
-@@ -620,6 +620,7 @@ struct ath_softc {
+@@ -693,6 +693,7 @@ struct ath_softc {
        struct ieee80211_hw *hw;
        struct device *dev;
  
@@ -8,9 +8,9 @@
        struct survey_info *cur_survey;
        struct survey_info survey[ATH9K_NUM_CHANNELS];
  
-@@ -687,6 +688,7 @@ struct ath_softc {
-       struct dfs_pattern_detector *dfs_detector;
- };
+@@ -897,6 +898,7 @@ struct fft_sample_ht20 {
+       u8 data[SPECTRAL_HT20_NUM_BINS];
+ } __packed;
  
 +int ath9k_config(struct ieee80211_hw *hw, u32 changed);
  void ath9k_tasklet(unsigned long data);
@@ -18,7 +18,7 @@
  
 --- a/drivers/net/wireless/ath/ath9k/debug.c
 +++ b/drivers/net/wireless/ath/ath9k/debug.c
-@@ -1579,6 +1579,50 @@ static const struct file_operations fops
+@@ -2059,6 +2059,50 @@ static const struct file_operations fops
        .owner = THIS_MODULE
  };
  
@@ -51,7 +51,7 @@
 +              return -EINVAL;
 +
 +      sc->chan_bw = chan_bw;
-+      if (!(sc->sc_flags & SC_OP_INVALID))
++      if (!test_bit(SC_OP_INVALID, &sc->sc_flags))
 +              ath9k_config(sc->hw, IEEE80211_CONF_CHANGE_CHANNEL);
 +
 +      return count;
  int ath9k_init_debug(struct ath_hw *ah)
  {
        struct ath_common *common = ath9k_hw_common(ah);
-@@ -1645,5 +1689,8 @@ int ath9k_init_debug(struct ath_hw *ah)
+@@ -2078,6 +2122,8 @@ int ath9k_init_debug(struct ath_hw *ah)
        debugfs_create_file("eeprom", S_IRUSR, sc->debug.debugfs_phy, sc,
                            &fops_eeprom);
 +      debugfs_create_file("chanbw", S_IRUSR | S_IWUSR, sc->debug.debugfs_phy,
 +                          sc, &fops_chanbw);
-+
-       return 0;
- }
+       debugfs_create_file("dma", S_IRUSR, sc->debug.debugfs_phy, sc,
+                           &fops_dma);
+       debugfs_create_file("interrupt", S_IRUSR, sc->debug.debugfs_phy, sc,
 --- 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_
-       ath_dbg(common, PS, "PowerSave disabled\n");
+@@ -1140,7 +1140,7 @@ int ath9k_spectral_scan_config(struct ie
+       return 0;
  }
  
 -static int ath9k_config(struct ieee80211_hw *hw, u32 changed)
  {
        struct ath_softc *sc = hw->priv;
        struct ath_hw *ah = sc->sc_ah;
-@@ -1602,9 +1602,11 @@ static int ath9k_config(struct ieee80211
-       if ((changed & IEEE80211_CONF_CHANGE_CHANNEL) || reset_channel) {
-               struct ieee80211_channel *curchan = hw->conf.channel;
+@@ -1196,9 +1196,11 @@ static int ath9k_config(struct ieee80211
+               struct ieee80211_channel *curchan = hw->conf.chandef.chan;
+               enum nl80211_channel_type channel_type =
+                       cfg80211_get_chandef_type(&conf->chandef);
 +              struct ath9k_channel *hchan;
                int pos = curchan->hw_value;
                int old_pos = -1;
  
                if (ah->curchan)
                        old_pos = ah->curchan - &ah->channels[0];
-@@ -1652,7 +1654,23 @@ static int ath9k_config(struct ieee80211
+@@ -1241,7 +1243,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);