mac80211/ath9k: improve pending patches based on review feedback
authorFelix Fietkau <nbd@openwrt.org>
Fri, 11 Mar 2011 20:55:54 +0000 (20:55 +0000)
committerFelix Fietkau <nbd@openwrt.org>
Fri, 11 Mar 2011 20:55:54 +0000 (20:55 +0000)
SVN-Revision: 26041

package/mac80211/patches/571-ath9k_fix_dma_stop.patch
package/mac80211/patches/572-ath9k_fix_tx_flush.patch
package/mac80211/patches/573-ath9k_beacon_stop.patch
package/mac80211/patches/581-mac80211_chantype_change_fix.patch

index 072e657..9f7cfa8 100644 (file)
@@ -25,7 +25,7 @@
        if (npend)
 --- a/drivers/net/wireless/ath/ath9k/mac.c
 +++ b/drivers/net/wireless/ath/ath9k/mac.c
-@@ -143,6 +143,33 @@ bool ath9k_hw_updatetxtriglevel(struct a
+@@ -143,6 +143,34 @@ bool ath9k_hw_updatetxtriglevel(struct a
  }
  EXPORT_SYMBOL(ath9k_hw_updatetxtriglevel);
  
 +      REG_SET_BIT(ah, AR_D_GBL_IFS_MISC, AR_D_GBL_IFS_MISC_IGNORE_BACKOFF);
 +
 +      for (q = 0; q < AR_NUM_QCU; q++) {
-+              for (i = 1000; i > 0; i--) {
++              for (i = 0; i < 1000; i++) {
++                      if (i)
++                              udelay(5);
++
 +                      if (!ath9k_hw_numtxpending(ah, q))
 +                              break;
-+
-+                      udelay(5);
 +              }
 +      }
 +
index ddeeb14..630abc6 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/main.c
 +++ b/drivers/net/wireless/ath/ath9k/main.c
-@@ -2149,56 +2149,40 @@ static void ath9k_set_coverage_class(str
+@@ -2149,56 +2149,42 @@ static void ath9k_set_coverage_class(str
  
  static void ath9k_flush(struct ieee80211_hw *hw, bool drop)
  {
 -              }
 +      if (drop)
 +              timeout = 1;
++
++      for (j = 0; j < timeout; j++) {
++              int npend = 0;
++
++              if (j)
++                      usleep_range(1000, 2000);
  
 -              if (drop || ath9k_has_pending_frames(sc, txq)) {
 -                      ath_dbg(common, ATH_DBG_QUEUE, "Drop frames from hw queue:%d\n",
@@ -46,8 +52,6 @@
 -                      ath9k_ps_restore(sc);
 -                      if (npend)
 -                              break;
-+      for (j = 0; j < timeout; j++) {
-+              int npend = 0;
 +              for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
 +                      if (!ATH_TXQ_SETUP(sc, i))
 +                              continue;
@@ -59,8 +63,6 @@
 +
 +              if (!npend)
 +                  goto out;
-+
-+              usleep_range(1000, 2000);
        }
  
 -      if (npend) {
index 7a9f63f..5574d17 100644 (file)
@@ -1,6 +1,6 @@
 --- a/drivers/net/wireless/ath/ath9k/mac.c
 +++ b/drivers/net/wireless/ath/ath9k/mac.c
-@@ -170,84 +170,30 @@ void ath9k_hw_abort_tx_dma(struct ath_hw
+@@ -171,84 +171,31 @@ void ath9k_hw_abort_tx_dma(struct ath_hw
  }
  EXPORT_SYMBOL(ath9k_hw_abort_tx_dma);
  
        REG_WRITE(ah, AR_Q_TXD, 1 << q);
  
        for (wait = wait_time; wait != 0; wait--) {
-               if (ath9k_hw_numtxpending(ah, q) == 0)
-                       break;
+-              if (ath9k_hw_numtxpending(ah, q) == 0)
+-                      break;
 -              udelay(ATH9K_TIME_QUANTUM);
 -      }
+-
 -      if (ath9k_hw_numtxpending(ah, q)) {
 -              ath_dbg(common, ATH_DBG_QUEUE,
 -                      "%s: Num of pending TX Frames %d on Q %d\n",
 -                                      "Failed to stop TX DMA in 100 msec after killing last frame\n");
 -                              break;
 -                      }
--                      udelay(ATH9K_TIME_QUANTUM);
++              if (wait != wait_time)
+                       udelay(ATH9K_TIME_QUANTUM);
 -              }
--
 -              REG_CLR_BIT(ah, AR_DIAG_SW, AR_DIAG_FORCE_CH_IDLE_HIGH);
-+              udelay(ATH9K_TIME_QUANTUM);
++              if (ath9k_hw_numtxpending(ah, q) == 0)
++                      break;
        }
  
        REG_WRITE(ah, AR_Q_TXD, 0);
index 87e2772..b855d1d 100644 (file)
@@ -1,10 +1,12 @@
 --- a/net/mac80211/chan.c
 +++ b/net/mac80211/chan.c
-@@ -76,6 +76,7 @@ bool ieee80211_set_channel_type(struct i
+@@ -77,6 +77,9 @@ bool ieee80211_set_channel_type(struct i
                switch (tmp->vif.bss_conf.channel_type) {
                case NL80211_CHAN_NO_HT:
-+                      break;
                case NL80211_CHAN_HT20:
++                      if (superchan > tmp->vif.bss_conf.channel_type)
++                              break;
++
                        superchan = tmp->vif.bss_conf.channel_type;
                        break;
+               case NL80211_CHAN_HT40PLUS: