aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless
diff options
context:
space:
mode:
authorSujith <Sujith.Manoharan@atheros.com>2010-04-16 02:23:57 -0400
committerJohn W. Linville <linville@tuxdriver.com>2010-04-16 15:47:09 -0400
commit7d0d0df0eca695c83a08dc386824a9d1d7c526a4 (patch)
treedf2104a15ef84bcd15478e956b3458241b3b7a78 /drivers/net/wireless
parent6819d57f07440a8f9540967d9212a70e9c98eceb (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')
-rw-r--r--drivers/net/wireless/ath/ath9k/ani.c23
-rw-r--r--drivers/net/wireless/ath/ath9k/ar5008_phy.c28
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9002_calib.c5
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9002_hw.c7
-rw-r--r--drivers/net/wireless/ath/ath9k/ar9002_phy.c5
-rw-r--r--drivers/net/wireless/ath/ath9k/eeprom_4k.c10
-rw-r--r--drivers/net/wireless/ath/ath9k/hw.c71
-rw-r--r--drivers/net/wireless/ath/ath9k/mac.c27
8 files changed, 175 insertions, 1 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ani.c b/drivers/net/wireless/ath/ath9k/ani.c
index 5a2d867a4e9..cec62d311c7 100644
--- a/drivers/net/wireless/ath/ath9k/ani.c
+++ b/drivers/net/wireless/ath/ath9k/ani.c
@@ -79,11 +79,17 @@ static void ath9k_ani_restart(struct ath_hw *ah)
79 "Writing ofdmbase=%u cckbase=%u\n", 79 "Writing ofdmbase=%u cckbase=%u\n",
80 aniState->ofdmPhyErrBase, 80 aniState->ofdmPhyErrBase,
81 aniState->cckPhyErrBase); 81 aniState->cckPhyErrBase);
82
83 ENABLE_REGWRITE_BUFFER(ah);
84
82 REG_WRITE(ah, AR_PHY_ERR_1, aniState->ofdmPhyErrBase); 85 REG_WRITE(ah, AR_PHY_ERR_1, aniState->ofdmPhyErrBase);
83 REG_WRITE(ah, AR_PHY_ERR_2, aniState->cckPhyErrBase); 86 REG_WRITE(ah, AR_PHY_ERR_2, aniState->cckPhyErrBase);
84 REG_WRITE(ah, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING); 87 REG_WRITE(ah, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING);
85 REG_WRITE(ah, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING); 88 REG_WRITE(ah, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING);
86 89
90 REGWRITE_BUFFER_FLUSH(ah);
91 DISABLE_REGWRITE_BUFFER(ah);
92
87 ath9k_hw_update_mibstats(ah, &ah->ah_mibStats); 93 ath9k_hw_update_mibstats(ah, &ah->ah_mibStats);
88 94
89 aniState->ofdmPhyErrCount = 0; 95 aniState->ofdmPhyErrCount = 0;
@@ -357,8 +363,14 @@ void ath9k_ani_reset(struct ath_hw *ah)
357 ath9k_hw_setrxfilter(ah, ath9k_hw_getrxfilter(ah) & 363 ath9k_hw_setrxfilter(ah, ath9k_hw_getrxfilter(ah) &
358 ~ATH9K_RX_FILTER_PHYERR); 364 ~ATH9K_RX_FILTER_PHYERR);
359 ath9k_ani_restart(ah); 365 ath9k_ani_restart(ah);
366
367 ENABLE_REGWRITE_BUFFER(ah);
368
360 REG_WRITE(ah, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING); 369 REG_WRITE(ah, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING);
361 REG_WRITE(ah, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING); 370 REG_WRITE(ah, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING);
371
372 REGWRITE_BUFFER_FLUSH(ah);
373 DISABLE_REGWRITE_BUFFER(ah);
362} 374}
363 375
364void ath9k_hw_ani_monitor(struct ath_hw *ah, 376void ath9k_hw_ani_monitor(struct ath_hw *ah,
@@ -456,6 +468,8 @@ void ath9k_enable_mib_counters(struct ath_hw *ah)
456 468
457 ath9k_hw_update_mibstats(ah, &ah->ah_mibStats); 469 ath9k_hw_update_mibstats(ah, &ah->ah_mibStats);
458 470
471 ENABLE_REGWRITE_BUFFER(ah);
472
459 REG_WRITE(ah, AR_FILT_OFDM, 0); 473 REG_WRITE(ah, AR_FILT_OFDM, 0);
460 REG_WRITE(ah, AR_FILT_CCK, 0); 474 REG_WRITE(ah, AR_FILT_CCK, 0);
461 REG_WRITE(ah, AR_MIBC, 475 REG_WRITE(ah, AR_MIBC,
@@ -463,6 +477,9 @@ void ath9k_enable_mib_counters(struct ath_hw *ah)
463 & 0x0f); 477 & 0x0f);
464 REG_WRITE(ah, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING); 478 REG_WRITE(ah, AR_PHY_ERR_MASK_1, AR_PHY_ERR_OFDM_TIMING);
465 REG_WRITE(ah, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING); 479 REG_WRITE(ah, AR_PHY_ERR_MASK_2, AR_PHY_ERR_CCK_TIMING);
480
481 REGWRITE_BUFFER_FLUSH(ah);
482 DISABLE_REGWRITE_BUFFER(ah);
466} 483}
467 484
468/* Freeze the MIB counters, get the stats and then clear them */ 485/* Freeze the MIB counters, get the stats and then clear them */
@@ -626,8 +643,14 @@ void ath9k_hw_ani_init(struct ath_hw *ah)
626 ath_print(common, ATH_DBG_ANI, "Setting cckErrBase = 0x%08x\n", 643 ath_print(common, ATH_DBG_ANI, "Setting cckErrBase = 0x%08x\n",
627 ah->ani[0].cckPhyErrBase); 644 ah->ani[0].cckPhyErrBase);
628 645
646 ENABLE_REGWRITE_BUFFER(ah);
647
629 REG_WRITE(ah, AR_PHY_ERR_1, ah->ani[0].ofdmPhyErrBase); 648 REG_WRITE(ah, AR_PHY_ERR_1, ah->ani[0].ofdmPhyErrBase);
630 REG_WRITE(ah, AR_PHY_ERR_2, ah->ani[0].cckPhyErrBase); 649 REG_WRITE(ah, AR_PHY_ERR_2, ah->ani[0].cckPhyErrBase);
650
651 REGWRITE_BUFFER_FLUSH(ah);
652 DISABLE_REGWRITE_BUFFER(ah);
653
631 ath9k_enable_mib_counters(ah); 654 ath9k_enable_mib_counters(ah);
632 655
633 ah->aniperiod = ATH9K_ANI_PERIOD; 656 ah->aniperiod = ATH9K_ANI_PERIOD;
diff --git a/drivers/net/wireless/ath/ath9k/ar5008_phy.c b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
index 94eb069b5ae..de8ce1291a4 100644
--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
@@ -590,10 +590,14 @@ static void ar5008_hw_init_chain_masks(struct ath_hw *ah)
590 rx_chainmask = ah->rxchainmask; 590 rx_chainmask = ah->rxchainmask;
591 tx_chainmask = ah->txchainmask; 591 tx_chainmask = ah->txchainmask;
592 592
593 ENABLE_REGWRITE_BUFFER(ah);
594
593 switch (rx_chainmask) { 595 switch (rx_chainmask) {
594 case 0x5: 596 case 0x5:
597 DISABLE_REGWRITE_BUFFER(ah);
595 REG_SET_BIT(ah, AR_PHY_ANALOG_SWAP, 598 REG_SET_BIT(ah, AR_PHY_ANALOG_SWAP,
596 AR_PHY_SWAP_ALT_CHAIN); 599 AR_PHY_SWAP_ALT_CHAIN);
600 ENABLE_REGWRITE_BUFFER(ah);
597 case 0x3: 601 case 0x3:
598 if (ah->hw_version.macVersion == AR_SREV_REVISION_5416_10) { 602 if (ah->hw_version.macVersion == AR_SREV_REVISION_5416_10) {
599 REG_WRITE(ah, AR_PHY_RX_CHAINMASK, 0x7); 603 REG_WRITE(ah, AR_PHY_RX_CHAINMASK, 0x7);
@@ -611,6 +615,10 @@ static void ar5008_hw_init_chain_masks(struct ath_hw *ah)
611 } 615 }
612 616
613 REG_WRITE(ah, AR_SELFGEN_MASK, tx_chainmask); 617 REG_WRITE(ah, AR_SELFGEN_MASK, tx_chainmask);
618
619 REGWRITE_BUFFER_FLUSH(ah);
620 DISABLE_REGWRITE_BUFFER(ah);
621
614 if (tx_chainmask == 0x5) { 622 if (tx_chainmask == 0x5) {
615 REG_SET_BIT(ah, AR_PHY_ANALOG_SWAP, 623 REG_SET_BIT(ah, AR_PHY_ANALOG_SWAP,
616 AR_PHY_SWAP_ALT_CHAIN); 624 AR_PHY_SWAP_ALT_CHAIN);
@@ -689,8 +697,13 @@ static void ar5008_hw_set_channel_regs(struct ath_hw *ah,
689 697
690 ath9k_hw_set11nmac2040(ah); 698 ath9k_hw_set11nmac2040(ah);
691 699
700 ENABLE_REGWRITE_BUFFER(ah);
701
692 REG_WRITE(ah, AR_GTXTO, 25 << AR_GTXTO_TIMEOUT_LIMIT_S); 702 REG_WRITE(ah, AR_GTXTO, 25 << AR_GTXTO_TIMEOUT_LIMIT_S);
693 REG_WRITE(ah, AR_CST, 0xF << AR_CST_TIMEOUT_LIMIT_S); 703 REG_WRITE(ah, AR_CST, 0xF << AR_CST_TIMEOUT_LIMIT_S);
704
705 REGWRITE_BUFFER_FLUSH(ah);
706 DISABLE_REGWRITE_BUFFER(ah);
694} 707}
695 708
696 709
@@ -773,6 +786,8 @@ static int ar5008_hw_process_ini(struct ath_hw *ah,
773 786
774 REG_WRITE(ah, AR_PHY_ADC_SERIAL_CTL, AR_PHY_SEL_INTERNAL_ADDAC); 787 REG_WRITE(ah, AR_PHY_ADC_SERIAL_CTL, AR_PHY_SEL_INTERNAL_ADDAC);
775 788
789 ENABLE_REGWRITE_BUFFER(ah);
790
776 for (i = 0; i < ah->iniModes.ia_rows; i++) { 791 for (i = 0; i < ah->iniModes.ia_rows; i++) {
777 u32 reg = INI_RA(&ah->iniModes, i, 0); 792 u32 reg = INI_RA(&ah->iniModes, i, 0);
778 u32 val = INI_RA(&ah->iniModes, i, modesIndex); 793 u32 val = INI_RA(&ah->iniModes, i, modesIndex);
@@ -790,6 +805,9 @@ static int ar5008_hw_process_ini(struct ath_hw *ah,
790 DO_DELAY(regWrites); 805 DO_DELAY(regWrites);
791 } 806 }
792 807
808 REGWRITE_BUFFER_FLUSH(ah);
809 DISABLE_REGWRITE_BUFFER(ah);
810
793 if (AR_SREV_9280(ah) || AR_SREV_9287_10_OR_LATER(ah)) 811 if (AR_SREV_9280(ah) || AR_SREV_9287_10_OR_LATER(ah))
794 REG_WRITE_ARRAY(&ah->iniModesRxGain, modesIndex, regWrites); 812 REG_WRITE_ARRAY(&ah->iniModesRxGain, modesIndex, regWrites);
795 813
@@ -801,6 +819,8 @@ static int ar5008_hw_process_ini(struct ath_hw *ah,
801 REG_WRITE_ARRAY(&ah->iniModes_9271_1_0_only, 819 REG_WRITE_ARRAY(&ah->iniModes_9271_1_0_only,
802 modesIndex, regWrites); 820 modesIndex, regWrites);
803 821
822 ENABLE_REGWRITE_BUFFER(ah);
823
804 /* Write common array parameters */ 824 /* Write common array parameters */
805 for (i = 0; i < ah->iniCommon.ia_rows; i++) { 825 for (i = 0; i < ah->iniCommon.ia_rows; i++) {
806 u32 reg = INI_RA(&ah->iniCommon, i, 0); 826 u32 reg = INI_RA(&ah->iniCommon, i, 0);
@@ -816,6 +836,9 @@ static int ar5008_hw_process_ini(struct ath_hw *ah,
816 DO_DELAY(regWrites); 836 DO_DELAY(regWrites);
817 } 837 }
818 838
839 REGWRITE_BUFFER_FLUSH(ah);
840 DISABLE_REGWRITE_BUFFER(ah);
841
819 if (AR_SREV_9271(ah)) { 842 if (AR_SREV_9271(ah)) {
820 if (ah->eep_ops->get_eeprom(ah, EEP_TXGAIN_TYPE) == 1) 843 if (ah->eep_ops->get_eeprom(ah, EEP_TXGAIN_TYPE) == 1)
821 REG_WRITE_ARRAY(&ah->iniModes_high_power_tx_gain_9271, 844 REG_WRITE_ARRAY(&ah->iniModes_high_power_tx_gain_9271,
@@ -1303,6 +1326,8 @@ static void ar5008_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan)
1303 udelay(50); 1326 udelay(50);
1304 } 1327 }
1305 1328
1329 ENABLE_REGWRITE_BUFFER(ah);
1330
1306 for (i = 0; i < NUM_NF_READINGS; i++) { 1331 for (i = 0; i < NUM_NF_READINGS; i++) {
1307 if (chainmask & (1 << i)) { 1332 if (chainmask & (1 << i)) {
1308 val = REG_READ(ah, ar5416_cca_regs[i]); 1333 val = REG_READ(ah, ar5416_cca_regs[i]);
@@ -1311,6 +1336,9 @@ static void ar5008_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan)
1311 REG_WRITE(ah, ar5416_cca_regs[i], val); 1336 REG_WRITE(ah, ar5416_cca_regs[i], val);
1312 } 1337 }
1313 } 1338 }
1339
1340 REGWRITE_BUFFER_FLUSH(ah);
1341 DISABLE_REGWRITE_BUFFER(ah);
1314} 1342}
1315 1343
1316void ar5008_hw_attach_phy_ops(struct ath_hw *ah) 1344void ar5008_hw_attach_phy_ops(struct ath_hw *ah)
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_calib.c b/drivers/net/wireless/ath/ath9k/ar9002_calib.c
index 968529b3988..5fdbb53b47e 100644
--- a/drivers/net/wireless/ath/ath9k/ar9002_calib.c
+++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c
@@ -527,6 +527,8 @@ static void ar9271_hw_pa_cal(struct ath_hw *ah, bool is_reset)
527 ah->pacal_info.prev_offset = regVal; 527 ah->pacal_info.prev_offset = regVal;
528 } 528 }
529 529
530 ENABLE_REGWRITE_BUFFER(ah);
531
530 regVal = REG_READ(ah, 0x7834); 532 regVal = REG_READ(ah, 0x7834);
531 regVal |= 0x1; 533 regVal |= 0x1;
532 REG_WRITE(ah, 0x7834, regVal); 534 REG_WRITE(ah, 0x7834, regVal);
@@ -536,6 +538,9 @@ static void ar9271_hw_pa_cal(struct ath_hw *ah, bool is_reset)
536 538
537 for (i = 0; i < ARRAY_SIZE(regList); i++) 539 for (i = 0; i < ARRAY_SIZE(regList); i++)
538 REG_WRITE(ah, regList[i][0], regList[i][1]); 540 REG_WRITE(ah, regList[i][0], regList[i][1]);
541
542 REGWRITE_BUFFER_FLUSH(ah);
543 DISABLE_REGWRITE_BUFFER(ah);
539} 544}
540 545
541static inline void ar9285_hw_pa_cal(struct ath_hw *ah, bool is_reset) 546static inline void ar9285_hw_pa_cal(struct ath_hw *ah, bool is_reset)
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_hw.c b/drivers/net/wireless/ath/ath9k/ar9002_hw.c
index 17b98a3f33b..adb33b34a56 100644
--- a/drivers/net/wireless/ath/ath9k/ar9002_hw.c
+++ b/drivers/net/wireless/ath/ath9k/ar9002_hw.c
@@ -488,10 +488,15 @@ static int ar9002_hw_get_radiorev(struct ath_hw *ah)
488 u32 val; 488 u32 val;
489 int i; 489 int i;
490 490
491 REG_WRITE(ah, AR_PHY(0x36), 0x00007058); 491 ENABLE_REGWRITE_BUFFER(ah);
492 492
493 REG_WRITE(ah, AR_PHY(0x36), 0x00007058);
493 for (i = 0; i < 8; i++) 494 for (i = 0; i < 8; i++)
494 REG_WRITE(ah, AR_PHY(0x20), 0x00010000); 495 REG_WRITE(ah, AR_PHY(0x20), 0x00010000);
496
497 REGWRITE_BUFFER_FLUSH(ah);
498 DISABLE_REGWRITE_BUFFER(ah);
499
495 val = (REG_READ(ah, AR_PHY(256)) >> 24) & 0xff; 500 val = (REG_READ(ah, AR_PHY(256)) >> 24) & 0xff;
496 val = ((val & 0xf0) >> 4) | ((val & 0x0f) << 4); 501 val = ((val & 0xf0) >> 4) | ((val & 0x0f) << 4);
497 502
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_phy.c b/drivers/net/wireless/ath/ath9k/ar9002_phy.c
index a0a2f58db29..18cfe1a9781 100644
--- a/drivers/net/wireless/ath/ath9k/ar9002_phy.c
+++ b/drivers/net/wireless/ath/ath9k/ar9002_phy.c
@@ -236,6 +236,8 @@ static void ar9002_hw_spur_mitigate(struct ath_hw *ah,
236 236
237 tmp = REG_READ(ah, AR_PHY_TIMING_CTRL4(0)); 237 tmp = REG_READ(ah, AR_PHY_TIMING_CTRL4(0));
238 238
239 ENABLE_REGWRITE_BUFFER(ah);
240
239 newVal = tmp | (AR_PHY_TIMING_CTRL4_ENABLE_SPUR_RSSI | 241 newVal = tmp | (AR_PHY_TIMING_CTRL4_ENABLE_SPUR_RSSI |
240 AR_PHY_TIMING_CTRL4_ENABLE_SPUR_FILTER | 242 AR_PHY_TIMING_CTRL4_ENABLE_SPUR_FILTER |
241 AR_PHY_TIMING_CTRL4_ENABLE_CHAN_MASK | 243 AR_PHY_TIMING_CTRL4_ENABLE_CHAN_MASK |
@@ -411,6 +413,9 @@ static void ar9002_hw_spur_mitigate(struct ath_hw *ah,
411 | (mask_p[47] << 2) | (mask_p[46] << 0); 413 | (mask_p[47] << 2) | (mask_p[46] << 0);
412 REG_WRITE(ah, AR_PHY_BIN_MASK2_4, tmp_mask); 414 REG_WRITE(ah, AR_PHY_BIN_MASK2_4, tmp_mask);
413 REG_WRITE(ah, AR_PHY_MASK2_P_61_45, tmp_mask); 415 REG_WRITE(ah, AR_PHY_MASK2_P_61_45, tmp_mask);
416
417 REGWRITE_BUFFER_FLUSH(ah);
418 DISABLE_REGWRITE_BUFFER(ah);
414} 419}
415 420
416static void ar9002_olc_init(struct ath_hw *ah) 421static void ar9002_olc_init(struct ath_hw *ah)
diff --git a/drivers/net/wireless/ath/ath9k/eeprom_4k.c b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
index 2384a9f4f5f..41a77d1bd43 100644
--- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c
+++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c
@@ -454,6 +454,8 @@ static void ath9k_hw_set_4k_power_cal_table(struct ath_hw *ah,
454 &tMinCalPower, gainBoundaries, 454 &tMinCalPower, gainBoundaries,
455 pdadcValues, numXpdGain); 455 pdadcValues, numXpdGain);
456 456
457 ENABLE_REGWRITE_BUFFER(ah);
458
457 if ((i == 0) || AR_SREV_5416_20_OR_LATER(ah)) { 459 if ((i == 0) || AR_SREV_5416_20_OR_LATER(ah)) {
458 REG_WRITE(ah, AR_PHY_TPCRG5 + regChainOffset, 460 REG_WRITE(ah, AR_PHY_TPCRG5 + regChainOffset,
459 SM(pdGainOverlap_t2, 461 SM(pdGainOverlap_t2,
@@ -494,6 +496,9 @@ static void ath9k_hw_set_4k_power_cal_table(struct ath_hw *ah,
494 496
495 regOffset += 4; 497 regOffset += 4;
496 } 498 }
499
500 REGWRITE_BUFFER_FLUSH(ah);
501 DISABLE_REGWRITE_BUFFER(ah);
497 } 502 }
498 } 503 }
499 504
@@ -759,6 +764,8 @@ static void ath9k_hw_4k_set_txpower(struct ath_hw *ah,
759 ratesArray[i] -= AR5416_PWR_TABLE_OFFSET_DB * 2; 764 ratesArray[i] -= AR5416_PWR_TABLE_OFFSET_DB * 2;
760 } 765 }
761 766
767 ENABLE_REGWRITE_BUFFER(ah);
768
762 /* OFDM power per rate */ 769 /* OFDM power per rate */
763 REG_WRITE(ah, AR_PHY_POWER_TX_RATE1, 770 REG_WRITE(ah, AR_PHY_POWER_TX_RATE1,
764 ATH9K_POW_SM(ratesArray[rate18mb], 24) 771 ATH9K_POW_SM(ratesArray[rate18mb], 24)
@@ -821,6 +828,9 @@ static void ath9k_hw_4k_set_txpower(struct ath_hw *ah,
821 | ATH9K_POW_SM(ratesArray[rateDupOfdm], 8) 828 | ATH9K_POW_SM(ratesArray[rateDupOfdm], 8)
822 | ATH9K_POW_SM(ratesArray[rateDupCck], 0)); 829 | ATH9K_POW_SM(ratesArray[rateDupCck], 0));
823 } 830 }
831
832 REGWRITE_BUFFER_FLUSH(ah);
833 DISABLE_REGWRITE_BUFFER(ah);
824} 834}
825 835
826static void ath9k_hw_4k_set_addac(struct ath_hw *ah, 836static void ath9k_hw_4k_set_addac(struct ath_hw *ah,
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c
index 35fe58f5675..0b85f68d516 100644
--- a/drivers/net/wireless/ath/ath9k/hw.c
+++ b/drivers/net/wireless/ath/ath9k/hw.c
@@ -274,6 +274,8 @@ static void ath9k_hw_disablepcie(struct ath_hw *ah)
274 if (AR_SREV_9100(ah)) 274 if (AR_SREV_9100(ah))
275 return; 275 return;
276 276
277 ENABLE_REGWRITE_BUFFER(ah);
278
277 REG_WRITE(ah, AR_PCIE_SERDES, 0x9248fc00); 279 REG_WRITE(ah, AR_PCIE_SERDES, 0x9248fc00);
278 REG_WRITE(ah, AR_PCIE_SERDES, 0x24924924); 280 REG_WRITE(ah, AR_PCIE_SERDES, 0x24924924);
279 REG_WRITE(ah, AR_PCIE_SERDES, 0x28000029); 281 REG_WRITE(ah, AR_PCIE_SERDES, 0x28000029);
@@ -285,6 +287,9 @@ static void ath9k_hw_disablepcie(struct ath_hw *ah)
285 REG_WRITE(ah, AR_PCIE_SERDES, 0x000e1007); 287 REG_WRITE(ah, AR_PCIE_SERDES, 0x000e1007);
286 288
287 REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000); 289 REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000);
290
291 REGWRITE_BUFFER_FLUSH(ah);
292 DISABLE_REGWRITE_BUFFER(ah);
288} 293}
289 294
290/* This should work for all families including legacy */ 295/* This should work for all families including legacy */
@@ -638,6 +643,8 @@ EXPORT_SYMBOL(ath9k_hw_init);
638 643
639static void ath9k_hw_init_qos(struct ath_hw *ah) 644static void ath9k_hw_init_qos(struct ath_hw *ah)
640{ 645{
646 ENABLE_REGWRITE_BUFFER(ah);
647
641 REG_WRITE(ah, AR_MIC_QOS_CONTROL, 0x100aa); 648 REG_WRITE(ah, AR_MIC_QOS_CONTROL, 0x100aa);
642 REG_WRITE(ah, AR_MIC_QOS_SELECT, 0x3210); 649 REG_WRITE(ah, AR_MIC_QOS_SELECT, 0x3210);
643 650
@@ -651,6 +658,9 @@ static void ath9k_hw_init_qos(struct ath_hw *ah)
651 REG_WRITE(ah, AR_TXOP_4_7, 0xFFFFFFFF); 658 REG_WRITE(ah, AR_TXOP_4_7, 0xFFFFFFFF);
652 REG_WRITE(ah, AR_TXOP_8_11, 0xFFFFFFFF); 659 REG_WRITE(ah, AR_TXOP_8_11, 0xFFFFFFFF);
653 REG_WRITE(ah, AR_TXOP_12_15, 0xFFFFFFFF); 660 REG_WRITE(ah, AR_TXOP_12_15, 0xFFFFFFFF);
661
662 REGWRITE_BUFFER_FLUSH(ah);
663 DISABLE_REGWRITE_BUFFER(ah);
654} 664}
655 665
656static void ath9k_hw_init_pll(struct ath_hw *ah, 666static void ath9k_hw_init_pll(struct ath_hw *ah,
@@ -702,6 +712,8 @@ static void ath9k_hw_init_interrupt_masks(struct ath_hw *ah,
702 if (opmode == NL80211_IFTYPE_AP) 712 if (opmode == NL80211_IFTYPE_AP)
703 imr_reg |= AR_IMR_MIB; 713 imr_reg |= AR_IMR_MIB;
704 714
715 ENABLE_REGWRITE_BUFFER(ah);
716
705 REG_WRITE(ah, AR_IMR, imr_reg); 717 REG_WRITE(ah, AR_IMR, imr_reg);
706 ah->imrs2_reg |= AR_IMR_S2_GTT; 718 ah->imrs2_reg |= AR_IMR_S2_GTT;
707 REG_WRITE(ah, AR_IMR_S2, ah->imrs2_reg); 719 REG_WRITE(ah, AR_IMR_S2, ah->imrs2_reg);
@@ -712,6 +724,9 @@ static void ath9k_hw_init_interrupt_masks(struct ath_hw *ah,
712 REG_WRITE(ah, AR_INTR_SYNC_MASK, 0); 724 REG_WRITE(ah, AR_INTR_SYNC_MASK, 0);
713 } 725 }
714 726
727 REGWRITE_BUFFER_FLUSH(ah);
728 DISABLE_REGWRITE_BUFFER(ah);
729
715 if (AR_SREV_9300_20_OR_LATER(ah)) { 730 if (AR_SREV_9300_20_OR_LATER(ah)) {
716 REG_WRITE(ah, AR_INTR_PRIO_ASYNC_ENABLE, 0); 731 REG_WRITE(ah, AR_INTR_PRIO_ASYNC_ENABLE, 0);
717 REG_WRITE(ah, AR_INTR_PRIO_ASYNC_MASK, 0); 732 REG_WRITE(ah, AR_INTR_PRIO_ASYNC_MASK, 0);
@@ -840,6 +855,8 @@ static inline void ath9k_hw_set_dma(struct ath_hw *ah)
840 struct ath_common *common = ath9k_hw_common(ah); 855 struct ath_common *common = ath9k_hw_common(ah);
841 u32 regval; 856 u32 regval;
842 857
858 ENABLE_REGWRITE_BUFFER(ah);
859
843 /* 860 /*
844 * set AHB_MODE not to do cacheline prefetches 861 * set AHB_MODE not to do cacheline prefetches
845 */ 862 */
@@ -854,6 +871,9 @@ static inline void ath9k_hw_set_dma(struct ath_hw *ah)
854 regval = REG_READ(ah, AR_TXCFG) & ~AR_TXCFG_DMASZ_MASK; 871 regval = REG_READ(ah, AR_TXCFG) & ~AR_TXCFG_DMASZ_MASK;
855 REG_WRITE(ah, AR_TXCFG, regval | AR_TXCFG_DMASZ_128B); 872 REG_WRITE(ah, AR_TXCFG, regval | AR_TXCFG_DMASZ_128B);
856 873
874 REGWRITE_BUFFER_FLUSH(ah);
875 DISABLE_REGWRITE_BUFFER(ah);
876
857 /* 877 /*
858 * Restore TX Trigger Level to its pre-reset value. 878 * Restore TX Trigger Level to its pre-reset value.
859 * The initial value depends on whether aggregation is enabled, and is 879 * The initial value depends on whether aggregation is enabled, and is
@@ -862,6 +882,8 @@ static inline void ath9k_hw_set_dma(struct ath_hw *ah)
862 if (!AR_SREV_9300_20_OR_LATER(ah)) 882 if (!AR_SREV_9300_20_OR_LATER(ah))
863 REG_RMW_FIELD(ah, AR_TXCFG, AR_FTRIG, ah->tx_trig_level); 883 REG_RMW_FIELD(ah, AR_TXCFG, AR_FTRIG, ah->tx_trig_level);
864 884
885 ENABLE_REGWRITE_BUFFER(ah);
886
865 /* 887 /*
866 * let mac dma writes be in 128 byte chunks 888 * let mac dma writes be in 128 byte chunks
867 */ 889 */
@@ -897,6 +919,9 @@ static inline void ath9k_hw_set_dma(struct ath_hw *ah)
897 AR_PCU_TXBUF_CTRL_USABLE_SIZE); 919 AR_PCU_TXBUF_CTRL_USABLE_SIZE);
898 } 920 }
899 921
922 REGWRITE_BUFFER_FLUSH(ah);
923 DISABLE_REGWRITE_BUFFER(ah);
924
900 if (AR_SREV_9300_20_OR_LATER(ah)) 925 if (AR_SREV_9300_20_OR_LATER(ah))
901 ath9k_hw_reset_txstatus_ring(ah); 926 ath9k_hw_reset_txstatus_ring(ah);
902} 927}
@@ -956,6 +981,8 @@ static bool ath9k_hw_set_reset(struct ath_hw *ah, int type)
956 (void)REG_READ(ah, AR_RTC_DERIVED_CLK); 981 (void)REG_READ(ah, AR_RTC_DERIVED_CLK);
957 } 982 }
958 983
984 ENABLE_REGWRITE_BUFFER(ah);
985
959 REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN | 986 REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN |
960 AR_RTC_FORCE_WAKE_ON_INT); 987 AR_RTC_FORCE_WAKE_ON_INT);
961 988
@@ -984,6 +1011,10 @@ static bool ath9k_hw_set_reset(struct ath_hw *ah, int type)
984 } 1011 }
985 1012
986 REG_WRITE(ah, AR_RTC_RC, rst_flags); 1013 REG_WRITE(ah, AR_RTC_RC, rst_flags);
1014
1015 REGWRITE_BUFFER_FLUSH(ah);
1016 DISABLE_REGWRITE_BUFFER(ah);
1017
987 udelay(50); 1018 udelay(50);
988 1019
989 REG_WRITE(ah, AR_RTC_RC, 0); 1020 REG_WRITE(ah, AR_RTC_RC, 0);
@@ -1004,6 +1035,8 @@ static bool ath9k_hw_set_reset(struct ath_hw *ah, int type)
1004 1035
1005static bool ath9k_hw_set_reset_power_on(struct ath_hw *ah) 1036static bool ath9k_hw_set_reset_power_on(struct ath_hw *ah)
1006{ 1037{
1038 ENABLE_REGWRITE_BUFFER(ah);
1039
1007 REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN | 1040 REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN |
1008 AR_RTC_FORCE_WAKE_ON_INT); 1041 AR_RTC_FORCE_WAKE_ON_INT);
1009 1042
@@ -1012,6 +1045,9 @@ static bool ath9k_hw_set_reset_power_on(struct ath_hw *ah)
1012 1045
1013 REG_WRITE(ah, AR_RTC_RESET, 0); 1046 REG_WRITE(ah, AR_RTC_RESET, 0);
1014 1047
1048 REGWRITE_BUFFER_FLUSH(ah);
1049 DISABLE_REGWRITE_BUFFER(ah);
1050
1015 if (!AR_SREV_9300_20_OR_LATER(ah)) 1051 if (!AR_SREV_9300_20_OR_LATER(ah))
1016 udelay(2); 1052 udelay(2);
1017 1053
@@ -1240,6 +1276,8 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
1240 1276
1241 ath9k_hw_set_operating_mode(ah, ah->opmode); 1277 ath9k_hw_set_operating_mode(ah, ah->opmode);
1242 1278
1279 ENABLE_REGWRITE_BUFFER(ah);
1280
1243 REG_WRITE(ah, AR_STA_ID0, get_unaligned_le32(common->macaddr)); 1281 REG_WRITE(ah, AR_STA_ID0, get_unaligned_le32(common->macaddr));
1244 REG_WRITE(ah, AR_STA_ID1, get_unaligned_le16(common->macaddr + 4) 1282 REG_WRITE(ah, AR_STA_ID1, get_unaligned_le16(common->macaddr + 4)
1245 | macStaId1 1283 | macStaId1
@@ -1253,13 +1291,21 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
1253 REG_WRITE(ah, AR_ISR, ~0); 1291 REG_WRITE(ah, AR_ISR, ~0);
1254 REG_WRITE(ah, AR_RSSI_THR, INIT_RSSI_THR); 1292 REG_WRITE(ah, AR_RSSI_THR, INIT_RSSI_THR);
1255 1293
1294 REGWRITE_BUFFER_FLUSH(ah);
1295 DISABLE_REGWRITE_BUFFER(ah);
1296
1256 r = ath9k_hw_rf_set_freq(ah, chan); 1297 r = ath9k_hw_rf_set_freq(ah, chan);
1257 if (r) 1298 if (r)
1258 return r; 1299 return r;
1259 1300
1301 ENABLE_REGWRITE_BUFFER(ah);
1302
1260 for (i = 0; i < AR_NUM_DCU; i++) 1303 for (i = 0; i < AR_NUM_DCU; i++)
1261 REG_WRITE(ah, AR_DQCUMASK(i), 1 << i); 1304 REG_WRITE(ah, AR_DQCUMASK(i), 1 << i);
1262 1305
1306 REGWRITE_BUFFER_FLUSH(ah);
1307 DISABLE_REGWRITE_BUFFER(ah);
1308
1263 ah->intr_txqs = 0; 1309 ah->intr_txqs = 0;
1264 for (i = 0; i < ah->caps.total_queues; i++) 1310 for (i = 0; i < ah->caps.total_queues; i++)
1265 ath9k_hw_resettxqueue(ah, i); 1311 ath9k_hw_resettxqueue(ah, i);
@@ -1299,9 +1345,14 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan,
1299 if (!ath9k_hw_init_cal(ah, chan)) 1345 if (!ath9k_hw_init_cal(ah, chan))
1300 return -EIO; 1346 return -EIO;
1301 1347
1348 ENABLE_REGWRITE_BUFFER(ah);
1349
1302 ath9k_hw_restore_chainmask(ah); 1350 ath9k_hw_restore_chainmask(ah);
1303 REG_WRITE(ah, AR_CFG_LED, saveLedState | AR_CFG_SCLK_32KHZ); 1351 REG_WRITE(ah, AR_CFG_LED, saveLedState | AR_CFG_SCLK_32KHZ);
1304 1352
1353 REGWRITE_BUFFER_FLUSH(ah);
1354 DISABLE_REGWRITE_BUFFER(ah);
1355
1305 /* 1356 /*
1306 * For big endian systems turn on swapping for descriptors 1357 * For big endian systems turn on swapping for descriptors
1307 */ 1358 */
@@ -1765,6 +1816,8 @@ void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period)
1765 1816
1766 ah->beacon_interval = beacon_period; 1817 ah->beacon_interval = beacon_period;
1767 1818
1819 ENABLE_REGWRITE_BUFFER(ah);
1820
1768 switch (ah->opmode) { 1821 switch (ah->opmode) {
1769 case NL80211_IFTYPE_STATION: 1822 case NL80211_IFTYPE_STATION:
1770 case NL80211_IFTYPE_MONITOR: 1823 case NL80211_IFTYPE_MONITOR:
@@ -1808,6 +1861,9 @@ void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period)
1808 REG_WRITE(ah, AR_SWBA_PERIOD, TU_TO_USEC(beacon_period)); 1861 REG_WRITE(ah, AR_SWBA_PERIOD, TU_TO_USEC(beacon_period));
1809 REG_WRITE(ah, AR_NDP_PERIOD, TU_TO_USEC(beacon_period)); 1862 REG_WRITE(ah, AR_NDP_PERIOD, TU_TO_USEC(beacon_period));
1810 1863
1864 REGWRITE_BUFFER_FLUSH(ah);
1865 DISABLE_REGWRITE_BUFFER(ah);
1866
1811 beacon_period &= ~ATH9K_BEACON_ENA; 1867 beacon_period &= ~ATH9K_BEACON_ENA;
1812 if (beacon_period & ATH9K_BEACON_RESET_TSF) { 1868 if (beacon_period & ATH9K_BEACON_RESET_TSF) {
1813 ath9k_hw_reset_tsf(ah); 1869 ath9k_hw_reset_tsf(ah);
@@ -1824,6 +1880,8 @@ void ath9k_hw_set_sta_beacon_timers(struct ath_hw *ah,
1824 struct ath9k_hw_capabilities *pCap = &ah->caps; 1880 struct ath9k_hw_capabilities *pCap = &ah->caps;
1825 struct ath_common *common = ath9k_hw_common(ah); 1881 struct ath_common *common = ath9k_hw_common(ah);
1826 1882
1883 ENABLE_REGWRITE_BUFFER(ah);
1884
1827 REG_WRITE(ah, AR_NEXT_TBTT_TIMER, TU_TO_USEC(bs->bs_nexttbtt)); 1885 REG_WRITE(ah, AR_NEXT_TBTT_TIMER, TU_TO_USEC(bs->bs_nexttbtt));
1828 1886
1829 REG_WRITE(ah, AR_BEACON_PERIOD, 1887 REG_WRITE(ah, AR_BEACON_PERIOD,
@@ -1831,6 +1889,9 @@ void ath9k_hw_set_sta_beacon_timers(struct ath_hw *ah,
1831 REG_WRITE(ah, AR_DMA_BEACON_PERIOD, 1889 REG_WRITE(ah, AR_DMA_BEACON_PERIOD,
1832 TU_TO_USEC(bs->bs_intval & ATH9K_BEACON_PERIOD)); 1890 TU_TO_USEC(bs->bs_intval & ATH9K_BEACON_PERIOD));
1833 1891
1892 REGWRITE_BUFFER_FLUSH(ah);
1893 DISABLE_REGWRITE_BUFFER(ah);
1894
1834 REG_RMW_FIELD(ah, AR_RSSI_THR, 1895 REG_RMW_FIELD(ah, AR_RSSI_THR,
1835 AR_RSSI_THR_BM_THR, bs->bs_bmissthreshold); 1896 AR_RSSI_THR_BM_THR, bs->bs_bmissthreshold);
1836 1897
@@ -1853,6 +1914,8 @@ void ath9k_hw_set_sta_beacon_timers(struct ath_hw *ah,
1853 ath_print(common, ATH_DBG_BEACON, "beacon period %d\n", beaconintval); 1914 ath_print(common, ATH_DBG_BEACON, "beacon period %d\n", beaconintval);
1854 ath_print(common, ATH_DBG_BEACON, "DTIM period %d\n", dtimperiod); 1915 ath_print(common, ATH_DBG_BEACON, "DTIM period %d\n", dtimperiod);
1855 1916
1917 ENABLE_REGWRITE_BUFFER(ah);
1918
1856 REG_WRITE(ah, AR_NEXT_DTIM, 1919 REG_WRITE(ah, AR_NEXT_DTIM,
1857 TU_TO_USEC(bs->bs_nextdtim - SLEEP_SLOP)); 1920 TU_TO_USEC(bs->bs_nextdtim - SLEEP_SLOP));
1858 REG_WRITE(ah, AR_NEXT_TIM, TU_TO_USEC(nextTbtt - SLEEP_SLOP)); 1921 REG_WRITE(ah, AR_NEXT_TIM, TU_TO_USEC(nextTbtt - SLEEP_SLOP));
@@ -1872,6 +1935,9 @@ void ath9k_hw_set_sta_beacon_timers(struct ath_hw *ah,
1872 REG_WRITE(ah, AR_TIM_PERIOD, TU_TO_USEC(beaconintval)); 1935 REG_WRITE(ah, AR_TIM_PERIOD, TU_TO_USEC(beaconintval));
1873 REG_WRITE(ah, AR_DTIM_PERIOD, TU_TO_USEC(dtimperiod)); 1936 REG_WRITE(ah, AR_DTIM_PERIOD, TU_TO_USEC(dtimperiod));
1874 1937
1938 REGWRITE_BUFFER_FLUSH(ah);
1939 DISABLE_REGWRITE_BUFFER(ah);
1940
1875 REG_SET_BIT(ah, AR_TIMER_MODE, 1941 REG_SET_BIT(ah, AR_TIMER_MODE,
1876 AR_TBTT_TIMER_EN | AR_TIM_TIMER_EN | 1942 AR_TBTT_TIMER_EN | AR_TIM_TIMER_EN |
1877 AR_DTIM_TIMER_EN); 1943 AR_DTIM_TIMER_EN);
@@ -2329,6 +2395,8 @@ void ath9k_hw_setrxfilter(struct ath_hw *ah, u32 bits)
2329{ 2395{
2330 u32 phybits; 2396 u32 phybits;
2331 2397
2398 ENABLE_REGWRITE_BUFFER(ah);
2399
2332 REG_WRITE(ah, AR_RX_FILTER, bits); 2400 REG_WRITE(ah, AR_RX_FILTER, bits);
2333 2401
2334 phybits = 0; 2402 phybits = 0;
@@ -2344,6 +2412,9 @@ void ath9k_hw_setrxfilter(struct ath_hw *ah, u32 bits)
2344 else 2412 else
2345 REG_WRITE(ah, AR_RXCFG, 2413 REG_WRITE(ah, AR_RXCFG,
2346 REG_READ(ah, AR_RXCFG) & ~AR_RXCFG_ZLFDMA); 2414 REG_READ(ah, AR_RXCFG) & ~AR_RXCFG_ZLFDMA);
2415
2416 REGWRITE_BUFFER_FLUSH(ah);
2417 DISABLE_REGWRITE_BUFFER(ah);
2347} 2418}
2348EXPORT_SYMBOL(ath9k_hw_setrxfilter); 2419EXPORT_SYMBOL(ath9k_hw_setrxfilter);
2349 2420
diff --git a/drivers/net/wireless/ath/ath9k/mac.c b/drivers/net/wireless/ath/ath9k/mac.c
index b54e857c031..7bbf502563b 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
40u32 ath9k_hw_gettxbuf(struct ath_hw *ah, u32 q) 45u32 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),