diff options
author | Sujith <Sujith.Manoharan@atheros.com> | 2010-04-16 02:23:57 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-04-16 15:47:09 -0400 |
commit | 7d0d0df0eca695c83a08dc386824a9d1d7c526a4 (patch) | |
tree | df2104a15ef84bcd15478e956b3458241b3b7a78 /drivers/net/wireless/ath/ath9k/mac.c | |
parent | 6819d57f07440a8f9540967d9212a70e9c98eceb (diff) |
ath9k_hw: Use buffered register writes
This patch adds macros at certain places
which could be optimized for multiple register writes.
The performance of ath9k_htc improves considerably,
especially reducing the latency involved in a scan run.
Signed-off-by: Sujith <Sujith.Manoharan@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/mac.c')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/mac.c | 27 |
1 files changed, 27 insertions, 0 deletions
diff --git a/drivers/net/wireless/ath/ath9k/mac.c b/drivers/net/wireless/ath/ath9k/mac.c index b54e857c0310..7bbf502563bc 100644 --- a/drivers/net/wireless/ath/ath9k/mac.c +++ b/drivers/net/wireless/ath/ath9k/mac.c | |||
@@ -25,6 +25,8 @@ static void ath9k_hw_set_txq_interrupts(struct ath_hw *ah, | |||
25 | ah->txdesc_interrupt_mask, ah->txeol_interrupt_mask, | 25 | ah->txdesc_interrupt_mask, ah->txeol_interrupt_mask, |
26 | ah->txurn_interrupt_mask); | 26 | ah->txurn_interrupt_mask); |
27 | 27 | ||
28 | ENABLE_REGWRITE_BUFFER(ah); | ||
29 | |||
28 | REG_WRITE(ah, AR_IMR_S0, | 30 | REG_WRITE(ah, AR_IMR_S0, |
29 | SM(ah->txok_interrupt_mask, AR_IMR_S0_QCU_TXOK) | 31 | SM(ah->txok_interrupt_mask, AR_IMR_S0_QCU_TXOK) |
30 | | SM(ah->txdesc_interrupt_mask, AR_IMR_S0_QCU_TXDESC)); | 32 | | SM(ah->txdesc_interrupt_mask, AR_IMR_S0_QCU_TXDESC)); |
@@ -35,6 +37,9 @@ static void ath9k_hw_set_txq_interrupts(struct ath_hw *ah, | |||
35 | ah->imrs2_reg &= ~AR_IMR_S2_QCU_TXURN; | 37 | ah->imrs2_reg &= ~AR_IMR_S2_QCU_TXURN; |
36 | ah->imrs2_reg |= (ah->txurn_interrupt_mask & AR_IMR_S2_QCU_TXURN); | 38 | ah->imrs2_reg |= (ah->txurn_interrupt_mask & AR_IMR_S2_QCU_TXURN); |
37 | REG_WRITE(ah, AR_IMR_S2, ah->imrs2_reg); | 39 | REG_WRITE(ah, AR_IMR_S2, ah->imrs2_reg); |
40 | |||
41 | REGWRITE_BUFFER_FLUSH(ah); | ||
42 | DISABLE_REGWRITE_BUFFER(ah); | ||
38 | } | 43 | } |
39 | 44 | ||
40 | u32 ath9k_hw_gettxbuf(struct ath_hw *ah, u32 q) | 45 | u32 ath9k_hw_gettxbuf(struct ath_hw *ah, u32 q) |
@@ -470,6 +475,8 @@ bool ath9k_hw_resettxqueue(struct ath_hw *ah, u32 q) | |||
470 | } else | 475 | } else |
471 | cwMin = qi->tqi_cwmin; | 476 | cwMin = qi->tqi_cwmin; |
472 | 477 | ||
478 | ENABLE_REGWRITE_BUFFER(ah); | ||
479 | |||
473 | REG_WRITE(ah, AR_DLCL_IFS(q), | 480 | REG_WRITE(ah, AR_DLCL_IFS(q), |
474 | SM(cwMin, AR_D_LCL_IFS_CWMIN) | | 481 | SM(cwMin, AR_D_LCL_IFS_CWMIN) | |
475 | SM(qi->tqi_cwmax, AR_D_LCL_IFS_CWMAX) | | 482 | SM(qi->tqi_cwmax, AR_D_LCL_IFS_CWMAX) | |
@@ -484,6 +491,8 @@ bool ath9k_hw_resettxqueue(struct ath_hw *ah, u32 q) | |||
484 | REG_WRITE(ah, AR_DMISC(q), | 491 | REG_WRITE(ah, AR_DMISC(q), |
485 | AR_D_MISC_CW_BKOFF_EN | AR_D_MISC_FRAG_WAIT_EN | 0x2); | 492 | AR_D_MISC_CW_BKOFF_EN | AR_D_MISC_FRAG_WAIT_EN | 0x2); |
486 | 493 | ||
494 | REGWRITE_BUFFER_FLUSH(ah); | ||
495 | |||
487 | if (qi->tqi_cbrPeriod) { | 496 | if (qi->tqi_cbrPeriod) { |
488 | REG_WRITE(ah, AR_QCBRCFG(q), | 497 | REG_WRITE(ah, AR_QCBRCFG(q), |
489 | SM(qi->tqi_cbrPeriod, AR_Q_CBRCFG_INTERVAL) | | 498 | SM(qi->tqi_cbrPeriod, AR_Q_CBRCFG_INTERVAL) | |
@@ -499,6 +508,8 @@ bool ath9k_hw_resettxqueue(struct ath_hw *ah, u32 q) | |||
499 | AR_Q_RDYTIMECFG_EN); | 508 | AR_Q_RDYTIMECFG_EN); |
500 | } | 509 | } |
501 | 510 | ||
511 | REGWRITE_BUFFER_FLUSH(ah); | ||
512 | |||
502 | REG_WRITE(ah, AR_DCHNTIME(q), | 513 | REG_WRITE(ah, AR_DCHNTIME(q), |
503 | SM(qi->tqi_burstTime, AR_D_CHNTIME_DUR) | | 514 | SM(qi->tqi_burstTime, AR_D_CHNTIME_DUR) | |
504 | (qi->tqi_burstTime ? AR_D_CHNTIME_EN : 0)); | 515 | (qi->tqi_burstTime ? AR_D_CHNTIME_EN : 0)); |
@@ -516,6 +527,10 @@ bool ath9k_hw_resettxqueue(struct ath_hw *ah, u32 q) | |||
516 | REG_READ(ah, AR_DMISC(q)) | | 527 | REG_READ(ah, AR_DMISC(q)) | |
517 | AR_D_MISC_POST_FR_BKOFF_DIS); | 528 | AR_D_MISC_POST_FR_BKOFF_DIS); |
518 | } | 529 | } |
530 | |||
531 | REGWRITE_BUFFER_FLUSH(ah); | ||
532 | DISABLE_REGWRITE_BUFFER(ah); | ||
533 | |||
519 | if (qi->tqi_qflags & TXQ_FLAG_FRAG_BURST_BACKOFF_ENABLE) { | 534 | if (qi->tqi_qflags & TXQ_FLAG_FRAG_BURST_BACKOFF_ENABLE) { |
520 | REG_WRITE(ah, AR_DMISC(q), | 535 | REG_WRITE(ah, AR_DMISC(q), |
521 | REG_READ(ah, AR_DMISC(q)) | | 536 | REG_READ(ah, AR_DMISC(q)) | |
@@ -523,6 +538,8 @@ bool ath9k_hw_resettxqueue(struct ath_hw *ah, u32 q) | |||
523 | } | 538 | } |
524 | switch (qi->tqi_type) { | 539 | switch (qi->tqi_type) { |
525 | case ATH9K_TX_QUEUE_BEACON: | 540 | case ATH9K_TX_QUEUE_BEACON: |
541 | ENABLE_REGWRITE_BUFFER(ah); | ||
542 | |||
526 | REG_WRITE(ah, AR_QMISC(q), REG_READ(ah, AR_QMISC(q)) | 543 | REG_WRITE(ah, AR_QMISC(q), REG_READ(ah, AR_QMISC(q)) |
527 | | AR_Q_MISC_FSP_DBA_GATED | 544 | | AR_Q_MISC_FSP_DBA_GATED |
528 | | AR_Q_MISC_BEACON_USE | 545 | | AR_Q_MISC_BEACON_USE |
@@ -533,6 +550,10 @@ bool ath9k_hw_resettxqueue(struct ath_hw *ah, u32 q) | |||
533 | AR_D_MISC_ARB_LOCKOUT_CNTRL_S) | 550 | AR_D_MISC_ARB_LOCKOUT_CNTRL_S) |
534 | | AR_D_MISC_BEACON_USE | 551 | | AR_D_MISC_BEACON_USE |
535 | | AR_D_MISC_POST_FR_BKOFF_DIS); | 552 | | AR_D_MISC_POST_FR_BKOFF_DIS); |
553 | |||
554 | REGWRITE_BUFFER_FLUSH(ah); | ||
555 | DISABLE_REGWRITE_BUFFER(ah); | ||
556 | |||
536 | /* cwmin and cwmax should be 0 for beacon queue */ | 557 | /* cwmin and cwmax should be 0 for beacon queue */ |
537 | if (AR_SREV_9300_20_OR_LATER(ah)) { | 558 | if (AR_SREV_9300_20_OR_LATER(ah)) { |
538 | REG_WRITE(ah, AR_DLCL_IFS(q), SM(0, AR_D_LCL_IFS_CWMIN) | 559 | REG_WRITE(ah, AR_DLCL_IFS(q), SM(0, AR_D_LCL_IFS_CWMIN) |
@@ -541,6 +562,8 @@ bool ath9k_hw_resettxqueue(struct ath_hw *ah, u32 q) | |||
541 | } | 562 | } |
542 | break; | 563 | break; |
543 | case ATH9K_TX_QUEUE_CAB: | 564 | case ATH9K_TX_QUEUE_CAB: |
565 | ENABLE_REGWRITE_BUFFER(ah); | ||
566 | |||
544 | REG_WRITE(ah, AR_QMISC(q), REG_READ(ah, AR_QMISC(q)) | 567 | REG_WRITE(ah, AR_QMISC(q), REG_READ(ah, AR_QMISC(q)) |
545 | | AR_Q_MISC_FSP_DBA_GATED | 568 | | AR_Q_MISC_FSP_DBA_GATED |
546 | | AR_Q_MISC_CBR_INCR_DIS1 | 569 | | AR_Q_MISC_CBR_INCR_DIS1 |
@@ -554,6 +577,10 @@ bool ath9k_hw_resettxqueue(struct ath_hw *ah, u32 q) | |||
554 | REG_WRITE(ah, AR_DMISC(q), REG_READ(ah, AR_DMISC(q)) | 577 | REG_WRITE(ah, AR_DMISC(q), REG_READ(ah, AR_DMISC(q)) |
555 | | (AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL << | 578 | | (AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL << |
556 | AR_D_MISC_ARB_LOCKOUT_CNTRL_S)); | 579 | AR_D_MISC_ARB_LOCKOUT_CNTRL_S)); |
580 | |||
581 | REGWRITE_BUFFER_FLUSH(ah); | ||
582 | DISABLE_REGWRITE_BUFFER(ah); | ||
583 | |||
557 | break; | 584 | break; |
558 | case ATH9K_TX_QUEUE_PSPOLL: | 585 | case ATH9K_TX_QUEUE_PSPOLL: |
559 | REG_WRITE(ah, AR_QMISC(q), | 586 | REG_WRITE(ah, AR_QMISC(q), |