diff options
author | Felix Fietkau <nbd@openwrt.org> | 2010-04-15 17:38:35 -0400 |
---|---|---|
committer | John W. Linville <linville@tuxdriver.com> | 2010-04-16 15:43:24 -0400 |
commit | ca3755540707539ea3ccf45e0c777d946f768f62 (patch) | |
tree | 95bf01a848b63cb48d26b736a41960fa1360e381 /drivers | |
parent | 317d33280c63f32bd84c49aacaaae047e981b441 (diff) |
ath9k_hw: Implement spur mitigation on AR9003
Signed-off-by: Felix Fietkau <nbd@openwrt.org>
Signed-off-by: Luis R. Rodriguez <lrodriguez@atheros.com>
Signed-off-by: John W. Linville <linville@tuxdriver.com>
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/net/wireless/ath/ath9k/ar9003_phy.c | 50 |
1 files changed, 49 insertions, 1 deletions
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c index 9767265cde02..3e3472e493a4 100644 --- a/drivers/net/wireless/ath/ath9k/ar9003_phy.c +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c | |||
@@ -106,7 +106,55 @@ static int ar9003_hw_set_channel(struct ath_hw *ah, struct ath9k_channel *chan) | |||
106 | static void ar9003_hw_spur_mitigate(struct ath_hw *ah, | 106 | static void ar9003_hw_spur_mitigate(struct ath_hw *ah, |
107 | struct ath9k_channel *chan) | 107 | struct ath9k_channel *chan) |
108 | { | 108 | { |
109 | /* TODO */ | 109 | u32 spur_freq[4] = { 2420, 2440, 2464, 2480 }; |
110 | int cur_bb_spur, negative = 0, cck_spur_freq; | ||
111 | int i; | ||
112 | |||
113 | /* | ||
114 | * Need to verify range +/- 10 MHz in control channel, otherwise spur | ||
115 | * is out-of-band and can be ignored. | ||
116 | */ | ||
117 | |||
118 | for (i = 0; i < 4; i++) { | ||
119 | negative = 0; | ||
120 | cur_bb_spur = spur_freq[i] - chan->channel; | ||
121 | |||
122 | if (cur_bb_spur < 0) { | ||
123 | negative = 1; | ||
124 | cur_bb_spur = -cur_bb_spur; | ||
125 | } | ||
126 | if (cur_bb_spur < 10) { | ||
127 | cck_spur_freq = (int)((cur_bb_spur << 19) / 11); | ||
128 | |||
129 | if (negative == 1) | ||
130 | cck_spur_freq = -cck_spur_freq; | ||
131 | |||
132 | cck_spur_freq = cck_spur_freq & 0xfffff; | ||
133 | |||
134 | REG_RMW_FIELD(ah, AR_PHY_AGC_CONTROL, | ||
135 | AR_PHY_AGC_CONTROL_YCOK_MAX, 0x7); | ||
136 | REG_RMW_FIELD(ah, AR_PHY_CCK_SPUR_MIT, | ||
137 | AR_PHY_CCK_SPUR_MIT_SPUR_RSSI_THR, 0x7f); | ||
138 | REG_RMW_FIELD(ah, AR_PHY_CCK_SPUR_MIT, | ||
139 | AR_PHY_CCK_SPUR_MIT_SPUR_FILTER_TYPE, | ||
140 | 0x2); | ||
141 | REG_RMW_FIELD(ah, AR_PHY_CCK_SPUR_MIT, | ||
142 | AR_PHY_CCK_SPUR_MIT_USE_CCK_SPUR_MIT, | ||
143 | 0x1); | ||
144 | REG_RMW_FIELD(ah, AR_PHY_CCK_SPUR_MIT, | ||
145 | AR_PHY_CCK_SPUR_MIT_CCK_SPUR_FREQ, | ||
146 | cck_spur_freq); | ||
147 | |||
148 | return; | ||
149 | } | ||
150 | } | ||
151 | |||
152 | REG_RMW_FIELD(ah, AR_PHY_AGC_CONTROL, | ||
153 | AR_PHY_AGC_CONTROL_YCOK_MAX, 0x5); | ||
154 | REG_RMW_FIELD(ah, AR_PHY_CCK_SPUR_MIT, | ||
155 | AR_PHY_CCK_SPUR_MIT_USE_CCK_SPUR_MIT, 0x0); | ||
156 | REG_RMW_FIELD(ah, AR_PHY_CCK_SPUR_MIT, | ||
157 | AR_PHY_CCK_SPUR_MIT_CCK_SPUR_FREQ, 0x0); | ||
110 | } | 158 | } |
111 | 159 | ||
112 | static u32 ar9003_hw_compute_pll_control(struct ath_hw *ah, | 160 | static u32 ar9003_hw_compute_pll_control(struct ath_hw *ah, |