ath9k_hw: increase tx abort timeout for half/quarter channels
authorFelix Fietkau <nbd@openwrt.org>
Thu, 19 Apr 2012 19:18:29 +0000 (21:18 +0200)
committerJohn W. Linville <linville@tuxdriver.com>
Mon, 23 Apr 2012 19:35:32 +0000 (15:35 -0400)
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
drivers/net/wireless/ath/ath9k/mac.c

index f7bd2532269c0d8fce44a1a1d0ef7aa174d78e61..04ef775ccee1465e507592a719e8e0403c95e73f 100644 (file)
@@ -133,8 +133,16 @@ EXPORT_SYMBOL(ath9k_hw_updatetxtriglevel);
 
 void ath9k_hw_abort_tx_dma(struct ath_hw *ah)
 {
+       int maxdelay = 1000;
        int i, q;
 
+       if (ah->curchan) {
+               if (IS_CHAN_HALF_RATE(ah->curchan))
+                       maxdelay *= 2;
+               else if (IS_CHAN_QUARTER_RATE(ah->curchan))
+                       maxdelay *= 4;
+       }
+
        REG_WRITE(ah, AR_Q_TXD, AR_Q_TXD_M);
 
        REG_SET_BIT(ah, AR_PCU_MISC, AR_PCU_FORCE_QUIET_COLL | AR_PCU_CLEAR_VMF);
@@ -142,7 +150,7 @@ void ath9k_hw_abort_tx_dma(struct ath_hw *ah)
        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 = 0; i < 1000; i++) {
+               for (i = 0; i < maxdelay; i++) {
                        if (i)
                                udelay(5);