aboutsummaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorNick Kossifidis <mickflemm@gmail.com>2010-11-23 13:50:16 -0500
committerJohn W. Linville <linville@tuxdriver.com>2010-11-30 13:52:32 -0500
commitf7317ba2d669c1b54fb31ed7834361a700a79217 (patch)
tree7ecd74d4b29564e41411d5a2305f1ca30d1bd6ba /drivers
parentb3a28e68d5c8d788a4e538a119a5d326545add8a (diff)
ath5k: Use DCU early termination correctly
* DCU early termination should be used to quickly flush QCU according to docs so don't enable it for all queues, enable it only when stopping each queue and disable it when we are done. Signed-off-by: Nick Kossifidis <mickflemm@gmail.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/net/wireless/ath/ath5k/dma.c14
-rw-r--r--drivers/net/wireless/ath/ath5k/qcu.c3
2 files changed, 14 insertions, 3 deletions
diff --git a/drivers/net/wireless/ath/ath5k/dma.c b/drivers/net/wireless/ath/ath5k/dma.c
index e39c95340841..bfdfcff42a1e 100644
--- a/drivers/net/wireless/ath/ath5k/dma.c
+++ b/drivers/net/wireless/ath/ath5k/dma.c
@@ -216,6 +216,14 @@ int ath5k_hw_stop_tx_dma(struct ath5k_hw *ah, unsigned int queue)
216 ath5k_hw_reg_write(ah, tx_queue, AR5K_CR); 216 ath5k_hw_reg_write(ah, tx_queue, AR5K_CR);
217 ath5k_hw_reg_read(ah, AR5K_CR); 217 ath5k_hw_reg_read(ah, AR5K_CR);
218 } else { 218 } else {
219
220 /*
221 * Enable DCU early termination to quickly
222 * flush any pending frames from QCU
223 */
224 AR5K_REG_ENABLE_BITS(ah, AR5K_QUEUE_MISC(queue),
225 AR5K_QCU_MISC_DCU_EARLY);
226
219 /* 227 /*
220 * Schedule TX disable and wait until queue is empty 228 * Schedule TX disable and wait until queue is empty
221 */ 229 */
@@ -285,6 +293,12 @@ int ath5k_hw_stop_tx_dma(struct ath5k_hw *ah, unsigned int queue)
285 queue); 293 queue);
286 } 294 }
287 295
296 /*
297 * Disable DCU early termination
298 */
299 AR5K_REG_DISABLE_BITS(ah, AR5K_QUEUE_MISC(queue),
300 AR5K_QCU_MISC_DCU_EARLY);
301
288 /* Clear register */ 302 /* Clear register */
289 ath5k_hw_reg_write(ah, 0, AR5K_QCU_TXD); 303 ath5k_hw_reg_write(ah, 0, AR5K_QCU_TXD);
290 if (pending) { 304 if (pending) {
diff --git a/drivers/net/wireless/ath/ath5k/qcu.c b/drivers/net/wireless/ath/ath5k/qcu.c
index 52eee34fd54d..ed62273cdf01 100644
--- a/drivers/net/wireless/ath/ath5k/qcu.c
+++ b/drivers/net/wireless/ath/ath5k/qcu.c
@@ -340,9 +340,6 @@ int ath5k_hw_reset_tx_queue(struct ath5k_hw *ah, unsigned int queue)
340 /* 340 /*
341 * Set misc registers 341 * Set misc registers
342 */ 342 */
343 /* Enable DCU early termination for this queue */
344 AR5K_REG_ENABLE_BITS(ah, AR5K_QUEUE_MISC(queue),
345 AR5K_QCU_MISC_DCU_EARLY);
346 343
347 /* Enable DCU to wait for next fragment from QCU */ 344 /* Enable DCU to wait for next fragment from QCU */
348 AR5K_REG_ENABLE_BITS(ah, AR5K_QUEUE_DFS_MISC(queue), 345 AR5K_REG_ENABLE_BITS(ah, AR5K_QUEUE_DFS_MISC(queue),