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 | |
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')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ani.c | 23 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar5008_phy.c | 28 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9002_calib.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9002_hw.c | 7 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9002_phy.c | 5 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/eeprom_4k.c | 10 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/hw.c | 71 | ||||
-rw-r--r-- | drivers/net/wireless/ath/ath9k/mac.c | 27 |
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 | ||
364 | void ath9k_hw_ani_monitor(struct ath_hw *ah, | 376 | void 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 | ||
1316 | void ar5008_hw_attach_phy_ops(struct ath_hw *ah) | 1344 | void 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 | ||
541 | static inline void ar9285_hw_pa_cal(struct ath_hw *ah, bool is_reset) | 546 | static 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 | ||
416 | static void ar9002_olc_init(struct ath_hw *ah) | 421 | static 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 | ||
826 | static void ath9k_hw_4k_set_addac(struct ath_hw *ah, | 836 | static 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 | ||
639 | static void ath9k_hw_init_qos(struct ath_hw *ah) | 644 | static 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 | ||
656 | static void ath9k_hw_init_pll(struct ath_hw *ah, | 666 | static 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 | ||
1005 | static bool ath9k_hw_set_reset_power_on(struct ath_hw *ah) | 1036 | static 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 | } |
2348 | EXPORT_SYMBOL(ath9k_hw_setrxfilter); | 2419 | EXPORT_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 | ||
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), |