aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/net/wireless/ath/ath9k/ar5008_phy.c
diff options
context:
space:
mode:
authorRajkumar Manoharan <rmanoharan@atheros.com>2011-03-15 13:41:35 -0400
committerJohn W. Linville <linville@tuxdriver.com>2011-03-30 14:15:12 -0400
commite7fc63388def06d2d1bdb6916748c92c037a42c6 (patch)
tree120e3880e7fb2fb18398aaf1be4f7740f6a5d561 /drivers/net/wireless/ath/ath9k/ar5008_phy.c
parentb0a9ede228175c25f76314a028d305fd5b2de427 (diff)
ath9k_hw: Speedup register ops for HTC driver
Fine-tuning register write operation and avoid unnecessay delays for ath9k_htc driver, saves hw reset time which improves scanning time and also solves one of the following scenario. Sometimes the ACK is sent by STA for assoc response is not seen at AP side. So the AP continues to send retry assoc responses. At the STA side, since the assoc response was already forwarded to mac80211, it proceeded to channel change which in turns does chip reset. In most of the cases the chip reset was completed before max retries are reached at AP side. Hence STA can able to ACK the retried frames again. But in clear environment these retries are completed within shortspan of time. Since ath9k_htc consumes more time for hw reset, this latency is causing dissociation by AP due to max reties are reached. This issue was originally reported with Cisco Aironet 1250 AP in HT40 mode in noise free environment. Signed-off-by: Rajkumar Manoharan <rmanoharan@atheros.com> Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers/net/wireless/ath/ath9k/ar5008_phy.c')
-rw-r--r--drivers/net/wireless/ath/ath9k/ar5008_phy.c7
1 files changed, 5 insertions, 2 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ar5008_phy.c b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
index ffcf44a4058b..94acce59f51d 100644
--- a/drivers/net/wireless/ath/ath9k/ar5008_phy.c
+++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c
@@ -729,6 +729,7 @@ static int ar5008_hw_process_ini(struct ath_hw *ah,
729 struct ath9k_channel *chan) 729 struct ath9k_channel *chan)
730{ 730{
731 struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah); 731 struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
732 struct ath_common *common = ath9k_hw_common(ah);
732 int i, regWrites = 0; 733 int i, regWrites = 0;
733 struct ieee80211_channel *channel = chan->chan; 734 struct ieee80211_channel *channel = chan->chan;
734 u32 modesIndex, freqIndex; 735 u32 modesIndex, freqIndex;
@@ -805,7 +806,8 @@ static int ar5008_hw_process_ini(struct ath_hw *ah,
805 REG_WRITE(ah, reg, val); 806 REG_WRITE(ah, reg, val);
806 807
807 if (reg >= 0x7800 && reg < 0x78a0 808 if (reg >= 0x7800 && reg < 0x78a0
808 && ah->config.analog_shiftreg) { 809 && ah->config.analog_shiftreg
810 && (common->bus_ops->ath_bus_type != ATH_USB)) {
809 udelay(100); 811 udelay(100);
810 } 812 }
811 813
@@ -835,7 +837,8 @@ static int ar5008_hw_process_ini(struct ath_hw *ah,
835 REG_WRITE(ah, reg, val); 837 REG_WRITE(ah, reg, val);
836 838
837 if (reg >= 0x7800 && reg < 0x78a0 839 if (reg >= 0x7800 && reg < 0x78a0
838 && ah->config.analog_shiftreg) { 840 && ah->config.analog_shiftreg
841 && (common->bus_ops->ath_bus_type != ATH_USB)) {
839 udelay(100); 842 udelay(100);
840 } 843 }
841 844