diff options
127 files changed, 19023 insertions, 8937 deletions
diff --git a/drivers/net/wireless/Kconfig b/drivers/net/wireless/Kconfig index 588943660755..77500cb7fd26 100644 --- a/drivers/net/wireless/Kconfig +++ b/drivers/net/wireless/Kconfig | |||
@@ -210,90 +210,7 @@ config USB_NET_RNDIS_WLAN | |||
210 | 210 | ||
211 | If you choose to build a module, it'll be called rndis_wlan. | 211 | If you choose to build a module, it'll be called rndis_wlan. |
212 | 212 | ||
213 | config RTL8180 | 213 | source "drivers/net/wireless/rtl818x/Kconfig" |
214 | tristate "Realtek 8180/8185 PCI support" | ||
215 | depends on MAC80211 && PCI && EXPERIMENTAL | ||
216 | select EEPROM_93CX6 | ||
217 | ---help--- | ||
218 | This is a driver for RTL8180 and RTL8185 based cards. | ||
219 | These are PCI based chips found in cards such as: | ||
220 | |||
221 | (RTL8185 802.11g) | ||
222 | A-Link WL54PC | ||
223 | |||
224 | (RTL8180 802.11b) | ||
225 | Belkin F5D6020 v3 | ||
226 | Belkin F5D6020 v3 | ||
227 | Dlink DWL-610 | ||
228 | Dlink DWL-510 | ||
229 | Netgear MA521 | ||
230 | Level-One WPC-0101 | ||
231 | Acer Aspire 1357 LMi | ||
232 | VCTnet PC-11B1 | ||
233 | Ovislink AirLive WL-1120PCM | ||
234 | Mentor WL-PCI | ||
235 | Linksys WPC11 v4 | ||
236 | TrendNET TEW-288PI | ||
237 | D-Link DWL-520 Rev D | ||
238 | Repotec RP-WP7126 | ||
239 | TP-Link TL-WN250/251 | ||
240 | Zonet ZEW1000 | ||
241 | Longshine LCS-8031-R | ||
242 | HomeLine HLW-PCC200 | ||
243 | GigaFast WF721-AEX | ||
244 | Planet WL-3553 | ||
245 | Encore ENLWI-PCI1-NT | ||
246 | TrendNET TEW-266PC | ||
247 | Gigabyte GN-WLMR101 | ||
248 | Siemens-fujitsu Amilo D1840W | ||
249 | Edimax EW-7126 | ||
250 | PheeNet WL-11PCIR | ||
251 | Tonze PC-2100T | ||
252 | Planet WL-8303 | ||
253 | Dlink DWL-650 v M1 | ||
254 | Edimax EW-7106 | ||
255 | Q-Tec 770WC | ||
256 | Topcom Skyr@cer 4011b | ||
257 | Roper FreeLan 802.11b (edition 2004) | ||
258 | Wistron Neweb Corp CB-200B | ||
259 | Pentagram HorNET | ||
260 | QTec 775WC | ||
261 | TwinMOS Booming B Series | ||
262 | Micronet SP906BB | ||
263 | Sweex LC700010 | ||
264 | Surecom EP-9428 | ||
265 | Safecom SWLCR-1100 | ||
266 | |||
267 | Thanks to Realtek for their support! | ||
268 | |||
269 | config RTL8187 | ||
270 | tristate "Realtek 8187 and 8187B USB support" | ||
271 | depends on MAC80211 && USB | ||
272 | select EEPROM_93CX6 | ||
273 | ---help--- | ||
274 | This is a driver for RTL8187 and RTL8187B based cards. | ||
275 | These are USB based chips found in devices such as: | ||
276 | |||
277 | Netgear WG111v2 | ||
278 | Level 1 WNC-0301USB | ||
279 | Micronet SP907GK V5 | ||
280 | Encore ENUWI-G2 | ||
281 | Trendnet TEW-424UB | ||
282 | ASUS P5B Deluxe/P5K Premium motherboards | ||
283 | Toshiba Satellite Pro series of laptops | ||
284 | Asus Wireless Link | ||
285 | Linksys WUSB54GC-EU v2 | ||
286 | (v1 = rt73usb; v3 is rt2070-based, | ||
287 | use staging/rt3070 or try rt2800usb) | ||
288 | |||
289 | Thanks to Realtek for their support! | ||
290 | |||
291 | # If possible, automatically enable LEDs for RTL8187. | ||
292 | |||
293 | config RTL8187_LEDS | ||
294 | bool | ||
295 | depends on RTL8187 && MAC80211_LEDS && (LEDS_CLASS = y || LEDS_CLASS = RTL8187) | ||
296 | default y | ||
297 | 214 | ||
298 | config ADM8211 | 215 | config ADM8211 |
299 | tristate "ADMtek ADM8211 support" | 216 | tristate "ADMtek ADM8211 support" |
diff --git a/drivers/net/wireless/ath/ath.h b/drivers/net/wireless/ath/ath.h index 1fbf6b1f9a7e..d32f2828b098 100644 --- a/drivers/net/wireless/ath/ath.h +++ b/drivers/net/wireless/ath/ath.h | |||
@@ -71,9 +71,21 @@ struct ath_regulatory { | |||
71 | struct reg_dmn_pair_mapping *regpair; | 71 | struct reg_dmn_pair_mapping *regpair; |
72 | }; | 72 | }; |
73 | 73 | ||
74 | /** | ||
75 | * struct ath_ops - Register read/write operations | ||
76 | * | ||
77 | * @read: Register read | ||
78 | * @write: Register write | ||
79 | * @enable_write_buffer: Enable multiple register writes | ||
80 | * @disable_write_buffer: Disable multiple register writes | ||
81 | * @write_flush: Flush buffered register writes | ||
82 | */ | ||
74 | struct ath_ops { | 83 | struct ath_ops { |
75 | unsigned int (*read)(void *, u32 reg_offset); | 84 | unsigned int (*read)(void *, u32 reg_offset); |
76 | void (*write)(void *, u32 val, u32 reg_offset); | 85 | void (*write)(void *, u32 val, u32 reg_offset); |
86 | void (*enable_write_buffer)(void *); | ||
87 | void (*disable_write_buffer)(void *); | ||
88 | void (*write_flush) (void *); | ||
77 | }; | 89 | }; |
78 | 90 | ||
79 | struct ath_common; | 91 | struct ath_common; |
diff --git a/drivers/net/wireless/ath/ath5k/base.c b/drivers/net/wireless/ath/ath5k/base.c index 93005f1d326d..c274979ada3a 100644 --- a/drivers/net/wireless/ath/ath5k/base.c +++ b/drivers/net/wireless/ath/ath5k/base.c | |||
@@ -242,6 +242,8 @@ static int ath5k_set_key(struct ieee80211_hw *hw, | |||
242 | struct ieee80211_key_conf *key); | 242 | struct ieee80211_key_conf *key); |
243 | static int ath5k_get_stats(struct ieee80211_hw *hw, | 243 | static int ath5k_get_stats(struct ieee80211_hw *hw, |
244 | struct ieee80211_low_level_stats *stats); | 244 | struct ieee80211_low_level_stats *stats); |
245 | static int ath5k_get_survey(struct ieee80211_hw *hw, | ||
246 | int idx, struct survey_info *survey); | ||
245 | static u64 ath5k_get_tsf(struct ieee80211_hw *hw); | 247 | static u64 ath5k_get_tsf(struct ieee80211_hw *hw); |
246 | static void ath5k_set_tsf(struct ieee80211_hw *hw, u64 tsf); | 248 | static void ath5k_set_tsf(struct ieee80211_hw *hw, u64 tsf); |
247 | static void ath5k_reset_tsf(struct ieee80211_hw *hw); | 249 | static void ath5k_reset_tsf(struct ieee80211_hw *hw); |
@@ -267,6 +269,7 @@ static const struct ieee80211_ops ath5k_hw_ops = { | |||
267 | .configure_filter = ath5k_configure_filter, | 269 | .configure_filter = ath5k_configure_filter, |
268 | .set_key = ath5k_set_key, | 270 | .set_key = ath5k_set_key, |
269 | .get_stats = ath5k_get_stats, | 271 | .get_stats = ath5k_get_stats, |
272 | .get_survey = ath5k_get_survey, | ||
270 | .conf_tx = NULL, | 273 | .conf_tx = NULL, |
271 | .get_tsf = ath5k_get_tsf, | 274 | .get_tsf = ath5k_get_tsf, |
272 | .set_tsf = ath5k_set_tsf, | 275 | .set_tsf = ath5k_set_tsf, |
@@ -3292,6 +3295,22 @@ ath5k_get_stats(struct ieee80211_hw *hw, | |||
3292 | return 0; | 3295 | return 0; |
3293 | } | 3296 | } |
3294 | 3297 | ||
3298 | static int ath5k_get_survey(struct ieee80211_hw *hw, int idx, | ||
3299 | struct survey_info *survey) | ||
3300 | { | ||
3301 | struct ath5k_softc *sc = hw->priv; | ||
3302 | struct ieee80211_conf *conf = &hw->conf; | ||
3303 | |||
3304 | if (idx != 0) | ||
3305 | return -ENOENT; | ||
3306 | |||
3307 | survey->channel = conf->channel; | ||
3308 | survey->filled = SURVEY_INFO_NOISE_DBM; | ||
3309 | survey->noise = sc->ah->ah_noise_floor; | ||
3310 | |||
3311 | return 0; | ||
3312 | } | ||
3313 | |||
3295 | static u64 | 3314 | static u64 |
3296 | ath5k_get_tsf(struct ieee80211_hw *hw) | 3315 | ath5k_get_tsf(struct ieee80211_hw *hw) |
3297 | { | 3316 | { |
diff --git a/drivers/net/wireless/ath/ath5k/pcu.c b/drivers/net/wireless/ath/ath5k/pcu.c index 174412fc81f8..5212e275f1c7 100644 --- a/drivers/net/wireless/ath/ath5k/pcu.c +++ b/drivers/net/wireless/ath/ath5k/pcu.c | |||
@@ -496,6 +496,8 @@ void ath5k_hw_set_rx_filter(struct ath5k_hw *ah, u32 filter) | |||
496 | * Beacon control * | 496 | * Beacon control * |
497 | \****************/ | 497 | \****************/ |
498 | 498 | ||
499 | #define ATH5K_MAX_TSF_READ 10 | ||
500 | |||
499 | /** | 501 | /** |
500 | * ath5k_hw_get_tsf64 - Get the full 64bit TSF | 502 | * ath5k_hw_get_tsf64 - Get the full 64bit TSF |
501 | * | 503 | * |
@@ -505,10 +507,35 @@ void ath5k_hw_set_rx_filter(struct ath5k_hw *ah, u32 filter) | |||
505 | */ | 507 | */ |
506 | u64 ath5k_hw_get_tsf64(struct ath5k_hw *ah) | 508 | u64 ath5k_hw_get_tsf64(struct ath5k_hw *ah) |
507 | { | 509 | { |
508 | u64 tsf = ath5k_hw_reg_read(ah, AR5K_TSF_U32); | 510 | u32 tsf_lower, tsf_upper1, tsf_upper2; |
511 | int i; | ||
512 | |||
513 | /* | ||
514 | * While reading TSF upper and then lower part, the clock is still | ||
515 | * counting (or jumping in case of IBSS merge) so we might get | ||
516 | * inconsistent values. To avoid this, we read the upper part again | ||
517 | * and check it has not been changed. We make the hypothesis that a | ||
518 | * maximum of 3 changes can happens in a row (we use 10 as a safe | ||
519 | * value). | ||
520 | * | ||
521 | * Impact on performance is pretty small, since in most cases, only | ||
522 | * 3 register reads are needed. | ||
523 | */ | ||
524 | |||
525 | tsf_upper1 = ath5k_hw_reg_read(ah, AR5K_TSF_U32); | ||
526 | for (i = 0; i < ATH5K_MAX_TSF_READ; i++) { | ||
527 | tsf_lower = ath5k_hw_reg_read(ah, AR5K_TSF_L32); | ||
528 | tsf_upper2 = ath5k_hw_reg_read(ah, AR5K_TSF_U32); | ||
529 | if (tsf_upper2 == tsf_upper1) | ||
530 | break; | ||
531 | tsf_upper1 = tsf_upper2; | ||
532 | } | ||
533 | |||
534 | WARN_ON( i == ATH5K_MAX_TSF_READ ); | ||
535 | |||
509 | ATH5K_TRACE(ah->ah_sc); | 536 | ATH5K_TRACE(ah->ah_sc); |
510 | 537 | ||
511 | return ath5k_hw_reg_read(ah, AR5K_TSF_L32) | (tsf << 32); | 538 | return (((u64)tsf_upper1 << 32) | tsf_lower); |
512 | } | 539 | } |
513 | 540 | ||
514 | /** | 541 | /** |
diff --git a/drivers/net/wireless/ath/ath9k/Makefile b/drivers/net/wireless/ath/ath9k/Makefile index 97133beda269..dd112be218ab 100644 --- a/drivers/net/wireless/ath/ath9k/Makefile +++ b/drivers/net/wireless/ath/ath9k/Makefile | |||
@@ -13,16 +13,26 @@ ath9k-$(CONFIG_ATH9K_DEBUGFS) += debug.o | |||
13 | 13 | ||
14 | obj-$(CONFIG_ATH9K) += ath9k.o | 14 | obj-$(CONFIG_ATH9K) += ath9k.o |
15 | 15 | ||
16 | ath9k_hw-y:= hw.o \ | 16 | ath9k_hw-y:= \ |
17 | ar9002_hw.o \ | ||
18 | ar9003_hw.o \ | ||
19 | hw.o \ | ||
20 | ar9003_phy.o \ | ||
21 | ar9002_phy.o \ | ||
22 | ar5008_phy.o \ | ||
23 | ar9002_calib.o \ | ||
24 | ar9003_calib.o \ | ||
25 | calib.o \ | ||
17 | eeprom.o \ | 26 | eeprom.o \ |
18 | eeprom_def.o \ | 27 | eeprom_def.o \ |
19 | eeprom_4k.o \ | 28 | eeprom_4k.o \ |
20 | eeprom_9287.o \ | 29 | eeprom_9287.o \ |
21 | calib.o \ | ||
22 | ani.o \ | 30 | ani.o \ |
23 | phy.o \ | ||
24 | btcoex.o \ | 31 | btcoex.o \ |
25 | mac.o \ | 32 | mac.o \ |
33 | ar9002_mac.o \ | ||
34 | ar9003_mac.o \ | ||
35 | ar9003_eeprom.o | ||
26 | 36 | ||
27 | obj-$(CONFIG_ATH9K_HW) += ath9k_hw.o | 37 | obj-$(CONFIG_ATH9K_HW) += ath9k_hw.o |
28 | 38 | ||
diff --git a/drivers/net/wireless/ath/ath9k/ani.c b/drivers/net/wireless/ath/ath9k/ani.c index 2a0cd64c2bfb..cec62d311c78 100644 --- a/drivers/net/wireless/ath/ath9k/ani.c +++ b/drivers/net/wireless/ath/ath9k/ani.c | |||
@@ -15,6 +15,7 @@ | |||
15 | */ | 15 | */ |
16 | 16 | ||
17 | #include "hw.h" | 17 | #include "hw.h" |
18 | #include "hw-ops.h" | ||
18 | 19 | ||
19 | static int ath9k_hw_get_ani_channel_idx(struct ath_hw *ah, | 20 | static int ath9k_hw_get_ani_channel_idx(struct ath_hw *ah, |
20 | struct ath9k_channel *chan) | 21 | struct ath9k_channel *chan) |
@@ -37,190 +38,6 @@ static int ath9k_hw_get_ani_channel_idx(struct ath_hw *ah, | |||
37 | return 0; | 38 | return 0; |
38 | } | 39 | } |
39 | 40 | ||
40 | static bool ath9k_hw_ani_control(struct ath_hw *ah, | ||
41 | enum ath9k_ani_cmd cmd, int param) | ||
42 | { | ||
43 | struct ar5416AniState *aniState = ah->curani; | ||
44 | struct ath_common *common = ath9k_hw_common(ah); | ||
45 | |||
46 | switch (cmd & ah->ani_function) { | ||
47 | case ATH9K_ANI_NOISE_IMMUNITY_LEVEL:{ | ||
48 | u32 level = param; | ||
49 | |||
50 | if (level >= ARRAY_SIZE(ah->totalSizeDesired)) { | ||
51 | ath_print(common, ATH_DBG_ANI, | ||
52 | "level out of range (%u > %u)\n", | ||
53 | level, | ||
54 | (unsigned)ARRAY_SIZE(ah->totalSizeDesired)); | ||
55 | return false; | ||
56 | } | ||
57 | |||
58 | REG_RMW_FIELD(ah, AR_PHY_DESIRED_SZ, | ||
59 | AR_PHY_DESIRED_SZ_TOT_DES, | ||
60 | ah->totalSizeDesired[level]); | ||
61 | REG_RMW_FIELD(ah, AR_PHY_AGC_CTL1, | ||
62 | AR_PHY_AGC_CTL1_COARSE_LOW, | ||
63 | ah->coarse_low[level]); | ||
64 | REG_RMW_FIELD(ah, AR_PHY_AGC_CTL1, | ||
65 | AR_PHY_AGC_CTL1_COARSE_HIGH, | ||
66 | ah->coarse_high[level]); | ||
67 | REG_RMW_FIELD(ah, AR_PHY_FIND_SIG, | ||
68 | AR_PHY_FIND_SIG_FIRPWR, | ||
69 | ah->firpwr[level]); | ||
70 | |||
71 | if (level > aniState->noiseImmunityLevel) | ||
72 | ah->stats.ast_ani_niup++; | ||
73 | else if (level < aniState->noiseImmunityLevel) | ||
74 | ah->stats.ast_ani_nidown++; | ||
75 | aniState->noiseImmunityLevel = level; | ||
76 | break; | ||
77 | } | ||
78 | case ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION:{ | ||
79 | const int m1ThreshLow[] = { 127, 50 }; | ||
80 | const int m2ThreshLow[] = { 127, 40 }; | ||
81 | const int m1Thresh[] = { 127, 0x4d }; | ||
82 | const int m2Thresh[] = { 127, 0x40 }; | ||
83 | const int m2CountThr[] = { 31, 16 }; | ||
84 | const int m2CountThrLow[] = { 63, 48 }; | ||
85 | u32 on = param ? 1 : 0; | ||
86 | |||
87 | REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW, | ||
88 | AR_PHY_SFCORR_LOW_M1_THRESH_LOW, | ||
89 | m1ThreshLow[on]); | ||
90 | REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW, | ||
91 | AR_PHY_SFCORR_LOW_M2_THRESH_LOW, | ||
92 | m2ThreshLow[on]); | ||
93 | REG_RMW_FIELD(ah, AR_PHY_SFCORR, | ||
94 | AR_PHY_SFCORR_M1_THRESH, | ||
95 | m1Thresh[on]); | ||
96 | REG_RMW_FIELD(ah, AR_PHY_SFCORR, | ||
97 | AR_PHY_SFCORR_M2_THRESH, | ||
98 | m2Thresh[on]); | ||
99 | REG_RMW_FIELD(ah, AR_PHY_SFCORR, | ||
100 | AR_PHY_SFCORR_M2COUNT_THR, | ||
101 | m2CountThr[on]); | ||
102 | REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW, | ||
103 | AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW, | ||
104 | m2CountThrLow[on]); | ||
105 | |||
106 | REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT, | ||
107 | AR_PHY_SFCORR_EXT_M1_THRESH_LOW, | ||
108 | m1ThreshLow[on]); | ||
109 | REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT, | ||
110 | AR_PHY_SFCORR_EXT_M2_THRESH_LOW, | ||
111 | m2ThreshLow[on]); | ||
112 | REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT, | ||
113 | AR_PHY_SFCORR_EXT_M1_THRESH, | ||
114 | m1Thresh[on]); | ||
115 | REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT, | ||
116 | AR_PHY_SFCORR_EXT_M2_THRESH, | ||
117 | m2Thresh[on]); | ||
118 | |||
119 | if (on) | ||
120 | REG_SET_BIT(ah, AR_PHY_SFCORR_LOW, | ||
121 | AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW); | ||
122 | else | ||
123 | REG_CLR_BIT(ah, AR_PHY_SFCORR_LOW, | ||
124 | AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW); | ||
125 | |||
126 | if (!on != aniState->ofdmWeakSigDetectOff) { | ||
127 | if (on) | ||
128 | ah->stats.ast_ani_ofdmon++; | ||
129 | else | ||
130 | ah->stats.ast_ani_ofdmoff++; | ||
131 | aniState->ofdmWeakSigDetectOff = !on; | ||
132 | } | ||
133 | break; | ||
134 | } | ||
135 | case ATH9K_ANI_CCK_WEAK_SIGNAL_THR:{ | ||
136 | const int weakSigThrCck[] = { 8, 6 }; | ||
137 | u32 high = param ? 1 : 0; | ||
138 | |||
139 | REG_RMW_FIELD(ah, AR_PHY_CCK_DETECT, | ||
140 | AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK, | ||
141 | weakSigThrCck[high]); | ||
142 | if (high != aniState->cckWeakSigThreshold) { | ||
143 | if (high) | ||
144 | ah->stats.ast_ani_cckhigh++; | ||
145 | else | ||
146 | ah->stats.ast_ani_ccklow++; | ||
147 | aniState->cckWeakSigThreshold = high; | ||
148 | } | ||
149 | break; | ||
150 | } | ||
151 | case ATH9K_ANI_FIRSTEP_LEVEL:{ | ||
152 | const int firstep[] = { 0, 4, 8 }; | ||
153 | u32 level = param; | ||
154 | |||
155 | if (level >= ARRAY_SIZE(firstep)) { | ||
156 | ath_print(common, ATH_DBG_ANI, | ||
157 | "level out of range (%u > %u)\n", | ||
158 | level, | ||
159 | (unsigned) ARRAY_SIZE(firstep)); | ||
160 | return false; | ||
161 | } | ||
162 | REG_RMW_FIELD(ah, AR_PHY_FIND_SIG, | ||
163 | AR_PHY_FIND_SIG_FIRSTEP, | ||
164 | firstep[level]); | ||
165 | if (level > aniState->firstepLevel) | ||
166 | ah->stats.ast_ani_stepup++; | ||
167 | else if (level < aniState->firstepLevel) | ||
168 | ah->stats.ast_ani_stepdown++; | ||
169 | aniState->firstepLevel = level; | ||
170 | break; | ||
171 | } | ||
172 | case ATH9K_ANI_SPUR_IMMUNITY_LEVEL:{ | ||
173 | const int cycpwrThr1[] = | ||
174 | { 2, 4, 6, 8, 10, 12, 14, 16 }; | ||
175 | u32 level = param; | ||
176 | |||
177 | if (level >= ARRAY_SIZE(cycpwrThr1)) { | ||
178 | ath_print(common, ATH_DBG_ANI, | ||
179 | "level out of range (%u > %u)\n", | ||
180 | level, | ||
181 | (unsigned) ARRAY_SIZE(cycpwrThr1)); | ||
182 | return false; | ||
183 | } | ||
184 | REG_RMW_FIELD(ah, AR_PHY_TIMING5, | ||
185 | AR_PHY_TIMING5_CYCPWR_THR1, | ||
186 | cycpwrThr1[level]); | ||
187 | if (level > aniState->spurImmunityLevel) | ||
188 | ah->stats.ast_ani_spurup++; | ||
189 | else if (level < aniState->spurImmunityLevel) | ||
190 | ah->stats.ast_ani_spurdown++; | ||
191 | aniState->spurImmunityLevel = level; | ||
192 | break; | ||
193 | } | ||
194 | case ATH9K_ANI_PRESENT: | ||
195 | break; | ||
196 | default: | ||
197 | ath_print(common, ATH_DBG_ANI, | ||
198 | "invalid cmd %u\n", cmd); | ||
199 | return false; | ||
200 | } | ||
201 | |||
202 | ath_print(common, ATH_DBG_ANI, "ANI parameters:\n"); | ||
203 | ath_print(common, ATH_DBG_ANI, | ||
204 | "noiseImmunityLevel=%d, spurImmunityLevel=%d, " | ||
205 | "ofdmWeakSigDetectOff=%d\n", | ||
206 | aniState->noiseImmunityLevel, | ||
207 | aniState->spurImmunityLevel, | ||
208 | !aniState->ofdmWeakSigDetectOff); | ||
209 | ath_print(common, ATH_DBG_ANI, | ||
210 | "cckWeakSigThreshold=%d, " | ||
211 | "firstepLevel=%d, listenTime=%d\n", | ||
212 | aniState->cckWeakSigThreshold, | ||
213 | aniState->firstepLevel, | ||
214 | aniState->listenTime); | ||
215 | ath_print(common, ATH_DBG_ANI, | ||
216 | "cycleCount=%d, ofdmPhyErrCount=%d, cckPhyErrCount=%d\n\n", | ||
217 | aniState->cycleCount, | ||
218 | aniState->ofdmPhyErrCount, | ||
219 | aniState->cckPhyErrCount); | ||
220 | |||
221 | return true; | ||
222 | } | ||
223 | |||
224 | static void ath9k_hw_update_mibstats(struct ath_hw *ah, | 41 | static void ath9k_hw_update_mibstats(struct ath_hw *ah, |
225 | struct ath9k_mib_stats *stats) | 42 | struct ath9k_mib_stats *stats) |
226 | { | 43 | { |
@@ -262,11 +79,17 @@ static void ath9k_ani_restart(struct ath_hw *ah) | |||
262 | "Writing ofdmbase=%u cckbase=%u\n", | 79 | "Writing ofdmbase=%u cckbase=%u\n", |
263 | aniState->ofdmPhyErrBase, | 80 | aniState->ofdmPhyErrBase, |
264 | aniState->cckPhyErrBase); | 81 | aniState->cckPhyErrBase); |
82 | |||
83 | ENABLE_REGWRITE_BUFFER(ah); | ||
84 | |||
265 | REG_WRITE(ah, AR_PHY_ERR_1, aniState->ofdmPhyErrBase); | 85 | REG_WRITE(ah, AR_PHY_ERR_1, aniState->ofdmPhyErrBase); |
266 | REG_WRITE(ah, AR_PHY_ERR_2, aniState->cckPhyErrBase); | 86 | REG_WRITE(ah, AR_PHY_ERR_2, aniState->cckPhyErrBase); |
267 | 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); |
268 | 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); |
269 | 89 | ||
90 | REGWRITE_BUFFER_FLUSH(ah); | ||
91 | DISABLE_REGWRITE_BUFFER(ah); | ||
92 | |||
270 | ath9k_hw_update_mibstats(ah, &ah->ah_mibStats); | 93 | ath9k_hw_update_mibstats(ah, &ah->ah_mibStats); |
271 | 94 | ||
272 | aniState->ofdmPhyErrCount = 0; | 95 | aniState->ofdmPhyErrCount = 0; |
@@ -540,8 +363,14 @@ void ath9k_ani_reset(struct ath_hw *ah) | |||
540 | ath9k_hw_setrxfilter(ah, ath9k_hw_getrxfilter(ah) & | 363 | ath9k_hw_setrxfilter(ah, ath9k_hw_getrxfilter(ah) & |
541 | ~ATH9K_RX_FILTER_PHYERR); | 364 | ~ATH9K_RX_FILTER_PHYERR); |
542 | ath9k_ani_restart(ah); | 365 | ath9k_ani_restart(ah); |
366 | |||
367 | ENABLE_REGWRITE_BUFFER(ah); | ||
368 | |||
543 | 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); |
544 | 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); | ||
545 | } | 374 | } |
546 | 375 | ||
547 | void ath9k_hw_ani_monitor(struct ath_hw *ah, | 376 | void ath9k_hw_ani_monitor(struct ath_hw *ah, |
@@ -639,6 +468,8 @@ void ath9k_enable_mib_counters(struct ath_hw *ah) | |||
639 | 468 | ||
640 | ath9k_hw_update_mibstats(ah, &ah->ah_mibStats); | 469 | ath9k_hw_update_mibstats(ah, &ah->ah_mibStats); |
641 | 470 | ||
471 | ENABLE_REGWRITE_BUFFER(ah); | ||
472 | |||
642 | REG_WRITE(ah, AR_FILT_OFDM, 0); | 473 | REG_WRITE(ah, AR_FILT_OFDM, 0); |
643 | REG_WRITE(ah, AR_FILT_CCK, 0); | 474 | REG_WRITE(ah, AR_FILT_CCK, 0); |
644 | REG_WRITE(ah, AR_MIBC, | 475 | REG_WRITE(ah, AR_MIBC, |
@@ -646,6 +477,9 @@ void ath9k_enable_mib_counters(struct ath_hw *ah) | |||
646 | & 0x0f); | 477 | & 0x0f); |
647 | 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); |
648 | 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); | ||
649 | } | 483 | } |
650 | 484 | ||
651 | /* Freeze the MIB counters, get the stats and then clear them */ | 485 | /* Freeze the MIB counters, get the stats and then clear them */ |
@@ -809,8 +643,14 @@ void ath9k_hw_ani_init(struct ath_hw *ah) | |||
809 | ath_print(common, ATH_DBG_ANI, "Setting cckErrBase = 0x%08x\n", | 643 | ath_print(common, ATH_DBG_ANI, "Setting cckErrBase = 0x%08x\n", |
810 | ah->ani[0].cckPhyErrBase); | 644 | ah->ani[0].cckPhyErrBase); |
811 | 645 | ||
646 | ENABLE_REGWRITE_BUFFER(ah); | ||
647 | |||
812 | REG_WRITE(ah, AR_PHY_ERR_1, ah->ani[0].ofdmPhyErrBase); | 648 | REG_WRITE(ah, AR_PHY_ERR_1, ah->ani[0].ofdmPhyErrBase); |
813 | 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 | |||
814 | ath9k_enable_mib_counters(ah); | 654 | ath9k_enable_mib_counters(ah); |
815 | 655 | ||
816 | ah->aniperiod = ATH9K_ANI_PERIOD; | 656 | ah->aniperiod = ATH9K_ANI_PERIOD; |
diff --git a/drivers/net/wireless/ath/ath9k/ar5008_initvals.h b/drivers/net/wireless/ath/ath9k/ar5008_initvals.h new file mode 100644 index 000000000000..cd953f6c4628 --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/ar5008_initvals.h | |||
@@ -0,0 +1,742 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2008-2009 Atheros Communications Inc. | ||
3 | * | ||
4 | * Permission to use, copy, modify, and/or distribute this software for any | ||
5 | * purpose with or without fee is hereby granted, provided that the above | ||
6 | * copyright notice and this permission notice appear in all copies. | ||
7 | * | ||
8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
15 | */ | ||
16 | |||
17 | #ifndef INITVALS_AR5008_H | ||
18 | #define INITVALS_AR5008_H | ||
19 | |||
20 | static const u32 ar5416Modes[][6] = { | ||
21 | { 0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160, 0x000001e0 }, | ||
22 | { 0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c, 0x000001e0 }, | ||
23 | { 0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38, 0x00001180 }, | ||
24 | { 0x000010f0, 0x0000a000, 0x00014000, 0x00016000, 0x0000b000, 0x00014008 }, | ||
25 | { 0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00, 0x06e006e0 }, | ||
26 | { 0x0000801c, 0x128d93a7, 0x128d93cf, 0x12e013d7, 0x12e013ab, 0x098813cf }, | ||
27 | { 0x00008120, 0x08f04800, 0x08f04800, 0x08f04810, 0x08f04810, 0x08f04810 }, | ||
28 | { 0x000081d0, 0x00003210, 0x00003210, 0x0000320a, 0x0000320a, 0x0000320a }, | ||
29 | { 0x00009804, 0x00000300, 0x000003c4, 0x000003c4, 0x00000300, 0x00000303 }, | ||
30 | { 0x00009820, 0x02020200, 0x02020200, 0x02020200, 0x02020200, 0x02020200 }, | ||
31 | { 0x00009824, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e }, | ||
32 | { 0x00009828, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001 }, | ||
33 | { 0x00009834, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e }, | ||
34 | { 0x00009838, 0x00000007, 0x00000007, 0x00000007, 0x00000007, 0x00000007 }, | ||
35 | { 0x00009844, 0x1372161e, 0x1372161e, 0x137216a0, 0x137216a0, 0x137216a0 }, | ||
36 | { 0x00009848, 0x001a6a65, 0x001a6a65, 0x00197a68, 0x00197a68, 0x00197a68 }, | ||
37 | { 0x0000a848, 0x001a6a65, 0x001a6a65, 0x00197a68, 0x00197a68, 0x00197a68 }, | ||
38 | { 0x0000b848, 0x001a6a65, 0x001a6a65, 0x00197a68, 0x00197a68, 0x00197a68 }, | ||
39 | { 0x00009850, 0x6c48b4e0, 0x6d48b4e0, 0x6d48b0de, 0x6c48b0de, 0x6c48b0de }, | ||
40 | { 0x00009858, 0x7ec82d2e, 0x7ec82d2e, 0x7ec82d2e, 0x7ec82d2e, 0x7ec82d2e }, | ||
41 | { 0x0000985c, 0x31395d5e, 0x3139605e, 0x3139605e, 0x31395d5e, 0x31395d5e }, | ||
42 | { 0x00009860, 0x00049d18, 0x00049d18, 0x00049d18, 0x00049d18, 0x00049d18 }, | ||
43 | { 0x00009864, 0x0001ce00, 0x0001ce00, 0x0001ce00, 0x0001ce00, 0x0001ce00 }, | ||
44 | { 0x00009868, 0x409a4190, 0x409a4190, 0x409a4190, 0x409a4190, 0x409a4190 }, | ||
45 | { 0x0000986c, 0x050cb081, 0x050cb081, 0x050cb081, 0x050cb081, 0x050cb081 }, | ||
46 | { 0x00009914, 0x000007d0, 0x00000fa0, 0x00001130, 0x00000898, 0x000007d0 }, | ||
47 | { 0x00009918, 0x000001b8, 0x00000370, 0x00000268, 0x00000134, 0x00000134 }, | ||
48 | { 0x00009924, 0xd0058a0b, 0xd0058a0b, 0xd0058a0b, 0xd0058a0b, 0xd0058a0b }, | ||
49 | { 0x00009944, 0xffb81020, 0xffb81020, 0xffb81020, 0xffb81020, 0xffb81020 }, | ||
50 | { 0x00009960, 0x00000900, 0x00000900, 0x00012d80, 0x00012d80, 0x00012d80 }, | ||
51 | { 0x0000a960, 0x00000900, 0x00000900, 0x00012d80, 0x00012d80, 0x00012d80 }, | ||
52 | { 0x0000b960, 0x00000900, 0x00000900, 0x00012d80, 0x00012d80, 0x00012d80 }, | ||
53 | { 0x00009964, 0x00000000, 0x00000000, 0x00001120, 0x00001120, 0x00001120 }, | ||
54 | { 0x000099bc, 0x001a0a00, 0x001a0a00, 0x001a0a00, 0x001a0a00, 0x001a0a00 }, | ||
55 | { 0x000099c0, 0x038919be, 0x038919be, 0x038919be, 0x038919be, 0x038919be }, | ||
56 | { 0x000099c4, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77 }, | ||
57 | { 0x000099c8, 0x6af6532c, 0x6af6532c, 0x6af6532c, 0x6af6532c, 0x6af6532c }, | ||
58 | { 0x000099cc, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8 }, | ||
59 | { 0x000099d0, 0x00046384, 0x00046384, 0x00046384, 0x00046384, 0x00046384 }, | ||
60 | { 0x000099d4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
61 | { 0x000099d8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
62 | { 0x0000a204, 0x00000880, 0x00000880, 0x00000880, 0x00000880, 0x00000880 }, | ||
63 | { 0x0000a208, 0xd6be4788, 0xd6be4788, 0xd03e4788, 0xd03e4788, 0xd03e4788 }, | ||
64 | { 0x0000a20c, 0x002ec1e0, 0x002ec1e0, 0x002ac120, 0x002ac120, 0x002ac120 }, | ||
65 | { 0x0000b20c, 0x002ec1e0, 0x002ec1e0, 0x002ac120, 0x002ac120, 0x002ac120 }, | ||
66 | { 0x0000c20c, 0x002ec1e0, 0x002ec1e0, 0x002ac120, 0x002ac120, 0x002ac120 }, | ||
67 | { 0x0000a21c, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a }, | ||
68 | { 0x0000a230, 0x00000000, 0x00000000, 0x00000210, 0x00000108, 0x00000000 }, | ||
69 | { 0x0000a274, 0x0a1a9caa, 0x0a1a9caa, 0x0a1a7caa, 0x0a1a7caa, 0x0a1a7caa }, | ||
70 | { 0x0000a300, 0x18010000, 0x18010000, 0x18010000, 0x18010000, 0x18010000 }, | ||
71 | { 0x0000a304, 0x30032602, 0x30032602, 0x2e032402, 0x2e032402, 0x2e032402 }, | ||
72 | { 0x0000a308, 0x48073e06, 0x48073e06, 0x4a0a3c06, 0x4a0a3c06, 0x4a0a3c06 }, | ||
73 | { 0x0000a30c, 0x560b4c0a, 0x560b4c0a, 0x621a540b, 0x621a540b, 0x621a540b }, | ||
74 | { 0x0000a310, 0x641a600f, 0x641a600f, 0x764f6c1b, 0x764f6c1b, 0x764f6c1b }, | ||
75 | { 0x0000a314, 0x7a4f6e1b, 0x7a4f6e1b, 0x845b7a5a, 0x845b7a5a, 0x845b7a5a }, | ||
76 | { 0x0000a318, 0x8c5b7e5a, 0x8c5b7e5a, 0x950f8ccf, 0x950f8ccf, 0x950f8ccf }, | ||
77 | { 0x0000a31c, 0x9d0f96cf, 0x9d0f96cf, 0xa5cf9b4f, 0xa5cf9b4f, 0xa5cf9b4f }, | ||
78 | { 0x0000a320, 0xb51fa69f, 0xb51fa69f, 0xbddfaf1f, 0xbddfaf1f, 0xbddfaf1f }, | ||
79 | { 0x0000a324, 0xcb3fbd07, 0xcb3fbcbf, 0xd1ffc93f, 0xd1ffc93f, 0xd1ffc93f }, | ||
80 | { 0x0000a328, 0x0000d7bf, 0x0000d7bf, 0x00000000, 0x00000000, 0x00000000 }, | ||
81 | { 0x0000a32c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
82 | { 0x0000a330, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
83 | { 0x0000a334, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
84 | }; | ||
85 | |||
86 | static const u32 ar5416Common[][2] = { | ||
87 | { 0x0000000c, 0x00000000 }, | ||
88 | { 0x00000030, 0x00020015 }, | ||
89 | { 0x00000034, 0x00000005 }, | ||
90 | { 0x00000040, 0x00000000 }, | ||
91 | { 0x00000044, 0x00000008 }, | ||
92 | { 0x00000048, 0x00000008 }, | ||
93 | { 0x0000004c, 0x00000010 }, | ||
94 | { 0x00000050, 0x00000000 }, | ||
95 | { 0x00000054, 0x0000001f }, | ||
96 | { 0x00000800, 0x00000000 }, | ||
97 | { 0x00000804, 0x00000000 }, | ||
98 | { 0x00000808, 0x00000000 }, | ||
99 | { 0x0000080c, 0x00000000 }, | ||
100 | { 0x00000810, 0x00000000 }, | ||
101 | { 0x00000814, 0x00000000 }, | ||
102 | { 0x00000818, 0x00000000 }, | ||
103 | { 0x0000081c, 0x00000000 }, | ||
104 | { 0x00000820, 0x00000000 }, | ||
105 | { 0x00000824, 0x00000000 }, | ||
106 | { 0x00001040, 0x002ffc0f }, | ||
107 | { 0x00001044, 0x002ffc0f }, | ||
108 | { 0x00001048, 0x002ffc0f }, | ||
109 | { 0x0000104c, 0x002ffc0f }, | ||
110 | { 0x00001050, 0x002ffc0f }, | ||
111 | { 0x00001054, 0x002ffc0f }, | ||
112 | { 0x00001058, 0x002ffc0f }, | ||
113 | { 0x0000105c, 0x002ffc0f }, | ||
114 | { 0x00001060, 0x002ffc0f }, | ||
115 | { 0x00001064, 0x002ffc0f }, | ||
116 | { 0x00001230, 0x00000000 }, | ||
117 | { 0x00001270, 0x00000000 }, | ||
118 | { 0x00001038, 0x00000000 }, | ||
119 | { 0x00001078, 0x00000000 }, | ||
120 | { 0x000010b8, 0x00000000 }, | ||
121 | { 0x000010f8, 0x00000000 }, | ||
122 | { 0x00001138, 0x00000000 }, | ||
123 | { 0x00001178, 0x00000000 }, | ||
124 | { 0x000011b8, 0x00000000 }, | ||
125 | { 0x000011f8, 0x00000000 }, | ||
126 | { 0x00001238, 0x00000000 }, | ||
127 | { 0x00001278, 0x00000000 }, | ||
128 | { 0x000012b8, 0x00000000 }, | ||
129 | { 0x000012f8, 0x00000000 }, | ||
130 | { 0x00001338, 0x00000000 }, | ||
131 | { 0x00001378, 0x00000000 }, | ||
132 | { 0x000013b8, 0x00000000 }, | ||
133 | { 0x000013f8, 0x00000000 }, | ||
134 | { 0x00001438, 0x00000000 }, | ||
135 | { 0x00001478, 0x00000000 }, | ||
136 | { 0x000014b8, 0x00000000 }, | ||
137 | { 0x000014f8, 0x00000000 }, | ||
138 | { 0x00001538, 0x00000000 }, | ||
139 | { 0x00001578, 0x00000000 }, | ||
140 | { 0x000015b8, 0x00000000 }, | ||
141 | { 0x000015f8, 0x00000000 }, | ||
142 | { 0x00001638, 0x00000000 }, | ||
143 | { 0x00001678, 0x00000000 }, | ||
144 | { 0x000016b8, 0x00000000 }, | ||
145 | { 0x000016f8, 0x00000000 }, | ||
146 | { 0x00001738, 0x00000000 }, | ||
147 | { 0x00001778, 0x00000000 }, | ||
148 | { 0x000017b8, 0x00000000 }, | ||
149 | { 0x000017f8, 0x00000000 }, | ||
150 | { 0x0000103c, 0x00000000 }, | ||
151 | { 0x0000107c, 0x00000000 }, | ||
152 | { 0x000010bc, 0x00000000 }, | ||
153 | { 0x000010fc, 0x00000000 }, | ||
154 | { 0x0000113c, 0x00000000 }, | ||
155 | { 0x0000117c, 0x00000000 }, | ||
156 | { 0x000011bc, 0x00000000 }, | ||
157 | { 0x000011fc, 0x00000000 }, | ||
158 | { 0x0000123c, 0x00000000 }, | ||
159 | { 0x0000127c, 0x00000000 }, | ||
160 | { 0x000012bc, 0x00000000 }, | ||
161 | { 0x000012fc, 0x00000000 }, | ||
162 | { 0x0000133c, 0x00000000 }, | ||
163 | { 0x0000137c, 0x00000000 }, | ||
164 | { 0x000013bc, 0x00000000 }, | ||
165 | { 0x000013fc, 0x00000000 }, | ||
166 | { 0x0000143c, 0x00000000 }, | ||
167 | { 0x0000147c, 0x00000000 }, | ||
168 | { 0x00004030, 0x00000002 }, | ||
169 | { 0x0000403c, 0x00000002 }, | ||
170 | { 0x00007010, 0x00000000 }, | ||
171 | { 0x00007038, 0x000004c2 }, | ||
172 | { 0x00008004, 0x00000000 }, | ||
173 | { 0x00008008, 0x00000000 }, | ||
174 | { 0x0000800c, 0x00000000 }, | ||
175 | { 0x00008018, 0x00000700 }, | ||
176 | { 0x00008020, 0x00000000 }, | ||
177 | { 0x00008038, 0x00000000 }, | ||
178 | { 0x0000803c, 0x00000000 }, | ||
179 | { 0x00008048, 0x40000000 }, | ||
180 | { 0x00008054, 0x00000000 }, | ||
181 | { 0x00008058, 0x00000000 }, | ||
182 | { 0x0000805c, 0x000fc78f }, | ||
183 | { 0x00008060, 0x0000000f }, | ||
184 | { 0x00008064, 0x00000000 }, | ||
185 | { 0x000080c0, 0x2a82301a }, | ||
186 | { 0x000080c4, 0x05dc01e0 }, | ||
187 | { 0x000080c8, 0x1f402710 }, | ||
188 | { 0x000080cc, 0x01f40000 }, | ||
189 | { 0x000080d0, 0x00001e00 }, | ||
190 | { 0x000080d4, 0x00000000 }, | ||
191 | { 0x000080d8, 0x00400000 }, | ||
192 | { 0x000080e0, 0xffffffff }, | ||
193 | { 0x000080e4, 0x0000ffff }, | ||
194 | { 0x000080e8, 0x003f3f3f }, | ||
195 | { 0x000080ec, 0x00000000 }, | ||
196 | { 0x000080f0, 0x00000000 }, | ||
197 | { 0x000080f4, 0x00000000 }, | ||
198 | { 0x000080f8, 0x00000000 }, | ||
199 | { 0x000080fc, 0x00020000 }, | ||
200 | { 0x00008100, 0x00020000 }, | ||
201 | { 0x00008104, 0x00000001 }, | ||
202 | { 0x00008108, 0x00000052 }, | ||
203 | { 0x0000810c, 0x00000000 }, | ||
204 | { 0x00008110, 0x00000168 }, | ||
205 | { 0x00008118, 0x000100aa }, | ||
206 | { 0x0000811c, 0x00003210 }, | ||
207 | { 0x00008124, 0x00000000 }, | ||
208 | { 0x00008128, 0x00000000 }, | ||
209 | { 0x0000812c, 0x00000000 }, | ||
210 | { 0x00008130, 0x00000000 }, | ||
211 | { 0x00008134, 0x00000000 }, | ||
212 | { 0x00008138, 0x00000000 }, | ||
213 | { 0x0000813c, 0x00000000 }, | ||
214 | { 0x00008144, 0xffffffff }, | ||
215 | { 0x00008168, 0x00000000 }, | ||
216 | { 0x0000816c, 0x00000000 }, | ||
217 | { 0x00008170, 0x32143320 }, | ||
218 | { 0x00008174, 0xfaa4fa50 }, | ||
219 | { 0x00008178, 0x00000100 }, | ||
220 | { 0x0000817c, 0x00000000 }, | ||
221 | { 0x000081c4, 0x00000000 }, | ||
222 | { 0x000081ec, 0x00000000 }, | ||
223 | { 0x000081f0, 0x00000000 }, | ||
224 | { 0x000081f4, 0x00000000 }, | ||
225 | { 0x000081f8, 0x00000000 }, | ||
226 | { 0x000081fc, 0x00000000 }, | ||
227 | { 0x00008200, 0x00000000 }, | ||
228 | { 0x00008204, 0x00000000 }, | ||
229 | { 0x00008208, 0x00000000 }, | ||
230 | { 0x0000820c, 0x00000000 }, | ||
231 | { 0x00008210, 0x00000000 }, | ||
232 | { 0x00008214, 0x00000000 }, | ||
233 | { 0x00008218, 0x00000000 }, | ||
234 | { 0x0000821c, 0x00000000 }, | ||
235 | { 0x00008220, 0x00000000 }, | ||
236 | { 0x00008224, 0x00000000 }, | ||
237 | { 0x00008228, 0x00000000 }, | ||
238 | { 0x0000822c, 0x00000000 }, | ||
239 | { 0x00008230, 0x00000000 }, | ||
240 | { 0x00008234, 0x00000000 }, | ||
241 | { 0x00008238, 0x00000000 }, | ||
242 | { 0x0000823c, 0x00000000 }, | ||
243 | { 0x00008240, 0x00100000 }, | ||
244 | { 0x00008244, 0x0010f400 }, | ||
245 | { 0x00008248, 0x00000100 }, | ||
246 | { 0x0000824c, 0x0001e800 }, | ||
247 | { 0x00008250, 0x00000000 }, | ||
248 | { 0x00008254, 0x00000000 }, | ||
249 | { 0x00008258, 0x00000000 }, | ||
250 | { 0x0000825c, 0x400000ff }, | ||
251 | { 0x00008260, 0x00080922 }, | ||
252 | { 0x00008264, 0xa8000010 }, | ||
253 | { 0x00008270, 0x00000000 }, | ||
254 | { 0x00008274, 0x40000000 }, | ||
255 | { 0x00008278, 0x003e4180 }, | ||
256 | { 0x0000827c, 0x00000000 }, | ||
257 | { 0x00008284, 0x0000002c }, | ||
258 | { 0x00008288, 0x0000002c }, | ||
259 | { 0x0000828c, 0x00000000 }, | ||
260 | { 0x00008294, 0x00000000 }, | ||
261 | { 0x00008298, 0x00000000 }, | ||
262 | { 0x00008300, 0x00000000 }, | ||
263 | { 0x00008304, 0x00000000 }, | ||
264 | { 0x00008308, 0x00000000 }, | ||
265 | { 0x0000830c, 0x00000000 }, | ||
266 | { 0x00008310, 0x00000000 }, | ||
267 | { 0x00008314, 0x00000000 }, | ||
268 | { 0x00008318, 0x00000000 }, | ||
269 | { 0x00008328, 0x00000000 }, | ||
270 | { 0x0000832c, 0x00000007 }, | ||
271 | { 0x00008330, 0x00000302 }, | ||
272 | { 0x00008334, 0x00000e00 }, | ||
273 | { 0x00008338, 0x00070000 }, | ||
274 | { 0x0000833c, 0x00000000 }, | ||
275 | { 0x00008340, 0x000107ff }, | ||
276 | { 0x00009808, 0x00000000 }, | ||
277 | { 0x0000980c, 0xad848e19 }, | ||
278 | { 0x00009810, 0x7d14e000 }, | ||
279 | { 0x00009814, 0x9c0a9f6b }, | ||
280 | { 0x0000981c, 0x00000000 }, | ||
281 | { 0x0000982c, 0x0000a000 }, | ||
282 | { 0x00009830, 0x00000000 }, | ||
283 | { 0x0000983c, 0x00200400 }, | ||
284 | { 0x00009840, 0x206a002e }, | ||
285 | { 0x0000984c, 0x1284233c }, | ||
286 | { 0x00009854, 0x00000859 }, | ||
287 | { 0x00009900, 0x00000000 }, | ||
288 | { 0x00009904, 0x00000000 }, | ||
289 | { 0x00009908, 0x00000000 }, | ||
290 | { 0x0000990c, 0x00000000 }, | ||
291 | { 0x0000991c, 0x10000fff }, | ||
292 | { 0x00009920, 0x05100000 }, | ||
293 | { 0x0000a920, 0x05100000 }, | ||
294 | { 0x0000b920, 0x05100000 }, | ||
295 | { 0x00009928, 0x00000001 }, | ||
296 | { 0x0000992c, 0x00000004 }, | ||
297 | { 0x00009934, 0x1e1f2022 }, | ||
298 | { 0x00009938, 0x0a0b0c0d }, | ||
299 | { 0x0000993c, 0x00000000 }, | ||
300 | { 0x00009948, 0x9280b212 }, | ||
301 | { 0x0000994c, 0x00020028 }, | ||
302 | { 0x00009954, 0x5d50e188 }, | ||
303 | { 0x00009958, 0x00081fff }, | ||
304 | { 0x0000c95c, 0x004b6a8e }, | ||
305 | { 0x0000c968, 0x000003ce }, | ||
306 | { 0x00009970, 0x190fb515 }, | ||
307 | { 0x00009974, 0x00000000 }, | ||
308 | { 0x00009978, 0x00000001 }, | ||
309 | { 0x0000997c, 0x00000000 }, | ||
310 | { 0x00009980, 0x00000000 }, | ||
311 | { 0x00009984, 0x00000000 }, | ||
312 | { 0x00009988, 0x00000000 }, | ||
313 | { 0x0000998c, 0x00000000 }, | ||
314 | { 0x00009990, 0x00000000 }, | ||
315 | { 0x00009994, 0x00000000 }, | ||
316 | { 0x00009998, 0x00000000 }, | ||
317 | { 0x0000999c, 0x00000000 }, | ||
318 | { 0x000099a0, 0x00000000 }, | ||
319 | { 0x000099a4, 0x00000001 }, | ||
320 | { 0x000099a8, 0x001fff00 }, | ||
321 | { 0x000099ac, 0x00000000 }, | ||
322 | { 0x000099b0, 0x03051000 }, | ||
323 | { 0x000099dc, 0x00000000 }, | ||
324 | { 0x000099e0, 0x00000200 }, | ||
325 | { 0x000099e4, 0xaaaaaaaa }, | ||
326 | { 0x000099e8, 0x3c466478 }, | ||
327 | { 0x000099ec, 0x000000aa }, | ||
328 | { 0x000099fc, 0x00001042 }, | ||
329 | { 0x00009b00, 0x00000000 }, | ||
330 | { 0x00009b04, 0x00000001 }, | ||
331 | { 0x00009b08, 0x00000002 }, | ||
332 | { 0x00009b0c, 0x00000003 }, | ||
333 | { 0x00009b10, 0x00000004 }, | ||
334 | { 0x00009b14, 0x00000005 }, | ||
335 | { 0x00009b18, 0x00000008 }, | ||
336 | { 0x00009b1c, 0x00000009 }, | ||
337 | { 0x00009b20, 0x0000000a }, | ||
338 | { 0x00009b24, 0x0000000b }, | ||
339 | { 0x00009b28, 0x0000000c }, | ||
340 | { 0x00009b2c, 0x0000000d }, | ||
341 | { 0x00009b30, 0x00000010 }, | ||
342 | { 0x00009b34, 0x00000011 }, | ||
343 | { 0x00009b38, 0x00000012 }, | ||
344 | { 0x00009b3c, 0x00000013 }, | ||
345 | { 0x00009b40, 0x00000014 }, | ||
346 | { 0x00009b44, 0x00000015 }, | ||
347 | { 0x00009b48, 0x00000018 }, | ||
348 | { 0x00009b4c, 0x00000019 }, | ||
349 | { 0x00009b50, 0x0000001a }, | ||
350 | { 0x00009b54, 0x0000001b }, | ||
351 | { 0x00009b58, 0x0000001c }, | ||
352 | { 0x00009b5c, 0x0000001d }, | ||
353 | { 0x00009b60, 0x00000020 }, | ||
354 | { 0x00009b64, 0x00000021 }, | ||
355 | { 0x00009b68, 0x00000022 }, | ||
356 | { 0x00009b6c, 0x00000023 }, | ||
357 | { 0x00009b70, 0x00000024 }, | ||
358 | { 0x00009b74, 0x00000025 }, | ||
359 | { 0x00009b78, 0x00000028 }, | ||
360 | { 0x00009b7c, 0x00000029 }, | ||
361 | { 0x00009b80, 0x0000002a }, | ||
362 | { 0x00009b84, 0x0000002b }, | ||
363 | { 0x00009b88, 0x0000002c }, | ||
364 | { 0x00009b8c, 0x0000002d }, | ||
365 | { 0x00009b90, 0x00000030 }, | ||
366 | { 0x00009b94, 0x00000031 }, | ||
367 | { 0x00009b98, 0x00000032 }, | ||
368 | { 0x00009b9c, 0x00000033 }, | ||
369 | { 0x00009ba0, 0x00000034 }, | ||
370 | { 0x00009ba4, 0x00000035 }, | ||
371 | { 0x00009ba8, 0x00000035 }, | ||
372 | { 0x00009bac, 0x00000035 }, | ||
373 | { 0x00009bb0, 0x00000035 }, | ||
374 | { 0x00009bb4, 0x00000035 }, | ||
375 | { 0x00009bb8, 0x00000035 }, | ||
376 | { 0x00009bbc, 0x00000035 }, | ||
377 | { 0x00009bc0, 0x00000035 }, | ||
378 | { 0x00009bc4, 0x00000035 }, | ||
379 | { 0x00009bc8, 0x00000035 }, | ||
380 | { 0x00009bcc, 0x00000035 }, | ||
381 | { 0x00009bd0, 0x00000035 }, | ||
382 | { 0x00009bd4, 0x00000035 }, | ||
383 | { 0x00009bd8, 0x00000035 }, | ||
384 | { 0x00009bdc, 0x00000035 }, | ||
385 | { 0x00009be0, 0x00000035 }, | ||
386 | { 0x00009be4, 0x00000035 }, | ||
387 | { 0x00009be8, 0x00000035 }, | ||
388 | { 0x00009bec, 0x00000035 }, | ||
389 | { 0x00009bf0, 0x00000035 }, | ||
390 | { 0x00009bf4, 0x00000035 }, | ||
391 | { 0x00009bf8, 0x00000010 }, | ||
392 | { 0x00009bfc, 0x0000001a }, | ||
393 | { 0x0000a210, 0x40806333 }, | ||
394 | { 0x0000a214, 0x00106c10 }, | ||
395 | { 0x0000a218, 0x009c4060 }, | ||
396 | { 0x0000a220, 0x018830c6 }, | ||
397 | { 0x0000a224, 0x00000400 }, | ||
398 | { 0x0000a228, 0x00000bb5 }, | ||
399 | { 0x0000a22c, 0x00000011 }, | ||
400 | { 0x0000a234, 0x20202020 }, | ||
401 | { 0x0000a238, 0x20202020 }, | ||
402 | { 0x0000a23c, 0x13c889af }, | ||
403 | { 0x0000a240, 0x38490a20 }, | ||
404 | { 0x0000a244, 0x00007bb6 }, | ||
405 | { 0x0000a248, 0x0fff3ffc }, | ||
406 | { 0x0000a24c, 0x00000001 }, | ||
407 | { 0x0000a250, 0x0000a000 }, | ||
408 | { 0x0000a254, 0x00000000 }, | ||
409 | { 0x0000a258, 0x0cc75380 }, | ||
410 | { 0x0000a25c, 0x0f0f0f01 }, | ||
411 | { 0x0000a260, 0xdfa91f01 }, | ||
412 | { 0x0000a268, 0x00000000 }, | ||
413 | { 0x0000a26c, 0x0e79e5c6 }, | ||
414 | { 0x0000b26c, 0x0e79e5c6 }, | ||
415 | { 0x0000c26c, 0x0e79e5c6 }, | ||
416 | { 0x0000d270, 0x00820820 }, | ||
417 | { 0x0000a278, 0x1ce739ce }, | ||
418 | { 0x0000a27c, 0x051701ce }, | ||
419 | { 0x0000a338, 0x00000000 }, | ||
420 | { 0x0000a33c, 0x00000000 }, | ||
421 | { 0x0000a340, 0x00000000 }, | ||
422 | { 0x0000a344, 0x00000000 }, | ||
423 | { 0x0000a348, 0x3fffffff }, | ||
424 | { 0x0000a34c, 0x3fffffff }, | ||
425 | { 0x0000a350, 0x3fffffff }, | ||
426 | { 0x0000a354, 0x0003ffff }, | ||
427 | { 0x0000a358, 0x79a8aa1f }, | ||
428 | { 0x0000d35c, 0x07ffffef }, | ||
429 | { 0x0000d360, 0x0fffffe7 }, | ||
430 | { 0x0000d364, 0x17ffffe5 }, | ||
431 | { 0x0000d368, 0x1fffffe4 }, | ||
432 | { 0x0000d36c, 0x37ffffe3 }, | ||
433 | { 0x0000d370, 0x3fffffe3 }, | ||
434 | { 0x0000d374, 0x57ffffe3 }, | ||
435 | { 0x0000d378, 0x5fffffe2 }, | ||
436 | { 0x0000d37c, 0x7fffffe2 }, | ||
437 | { 0x0000d380, 0x7f3c7bba }, | ||
438 | { 0x0000d384, 0xf3307ff0 }, | ||
439 | { 0x0000a388, 0x08000000 }, | ||
440 | { 0x0000a38c, 0x20202020 }, | ||
441 | { 0x0000a390, 0x20202020 }, | ||
442 | { 0x0000a394, 0x1ce739ce }, | ||
443 | { 0x0000a398, 0x000001ce }, | ||
444 | { 0x0000a39c, 0x00000001 }, | ||
445 | { 0x0000a3a0, 0x00000000 }, | ||
446 | { 0x0000a3a4, 0x00000000 }, | ||
447 | { 0x0000a3a8, 0x00000000 }, | ||
448 | { 0x0000a3ac, 0x00000000 }, | ||
449 | { 0x0000a3b0, 0x00000000 }, | ||
450 | { 0x0000a3b4, 0x00000000 }, | ||
451 | { 0x0000a3b8, 0x00000000 }, | ||
452 | { 0x0000a3bc, 0x00000000 }, | ||
453 | { 0x0000a3c0, 0x00000000 }, | ||
454 | { 0x0000a3c4, 0x00000000 }, | ||
455 | { 0x0000a3c8, 0x00000246 }, | ||
456 | { 0x0000a3cc, 0x20202020 }, | ||
457 | { 0x0000a3d0, 0x20202020 }, | ||
458 | { 0x0000a3d4, 0x20202020 }, | ||
459 | { 0x0000a3dc, 0x1ce739ce }, | ||
460 | { 0x0000a3e0, 0x000001ce }, | ||
461 | }; | ||
462 | |||
463 | static const u32 ar5416Bank0[][2] = { | ||
464 | { 0x000098b0, 0x1e5795e5 }, | ||
465 | { 0x000098e0, 0x02008020 }, | ||
466 | }; | ||
467 | |||
468 | static const u32 ar5416BB_RfGain[][3] = { | ||
469 | { 0x00009a00, 0x00000000, 0x00000000 }, | ||
470 | { 0x00009a04, 0x00000040, 0x00000040 }, | ||
471 | { 0x00009a08, 0x00000080, 0x00000080 }, | ||
472 | { 0x00009a0c, 0x000001a1, 0x00000141 }, | ||
473 | { 0x00009a10, 0x000001e1, 0x00000181 }, | ||
474 | { 0x00009a14, 0x00000021, 0x000001c1 }, | ||
475 | { 0x00009a18, 0x00000061, 0x00000001 }, | ||
476 | { 0x00009a1c, 0x00000168, 0x00000041 }, | ||
477 | { 0x00009a20, 0x000001a8, 0x000001a8 }, | ||
478 | { 0x00009a24, 0x000001e8, 0x000001e8 }, | ||
479 | { 0x00009a28, 0x00000028, 0x00000028 }, | ||
480 | { 0x00009a2c, 0x00000068, 0x00000068 }, | ||
481 | { 0x00009a30, 0x00000189, 0x000000a8 }, | ||
482 | { 0x00009a34, 0x000001c9, 0x00000169 }, | ||
483 | { 0x00009a38, 0x00000009, 0x000001a9 }, | ||
484 | { 0x00009a3c, 0x00000049, 0x000001e9 }, | ||
485 | { 0x00009a40, 0x00000089, 0x00000029 }, | ||
486 | { 0x00009a44, 0x00000170, 0x00000069 }, | ||
487 | { 0x00009a48, 0x000001b0, 0x00000190 }, | ||
488 | { 0x00009a4c, 0x000001f0, 0x000001d0 }, | ||
489 | { 0x00009a50, 0x00000030, 0x00000010 }, | ||
490 | { 0x00009a54, 0x00000070, 0x00000050 }, | ||
491 | { 0x00009a58, 0x00000191, 0x00000090 }, | ||
492 | { 0x00009a5c, 0x000001d1, 0x00000151 }, | ||
493 | { 0x00009a60, 0x00000011, 0x00000191 }, | ||
494 | { 0x00009a64, 0x00000051, 0x000001d1 }, | ||
495 | { 0x00009a68, 0x00000091, 0x00000011 }, | ||
496 | { 0x00009a6c, 0x000001b8, 0x00000051 }, | ||
497 | { 0x00009a70, 0x000001f8, 0x00000198 }, | ||
498 | { 0x00009a74, 0x00000038, 0x000001d8 }, | ||
499 | { 0x00009a78, 0x00000078, 0x00000018 }, | ||
500 | { 0x00009a7c, 0x00000199, 0x00000058 }, | ||
501 | { 0x00009a80, 0x000001d9, 0x00000098 }, | ||
502 | { 0x00009a84, 0x00000019, 0x00000159 }, | ||
503 | { 0x00009a88, 0x00000059, 0x00000199 }, | ||
504 | { 0x00009a8c, 0x00000099, 0x000001d9 }, | ||
505 | { 0x00009a90, 0x000000d9, 0x00000019 }, | ||
506 | { 0x00009a94, 0x000000f9, 0x00000059 }, | ||
507 | { 0x00009a98, 0x000000f9, 0x00000099 }, | ||
508 | { 0x00009a9c, 0x000000f9, 0x000000d9 }, | ||
509 | { 0x00009aa0, 0x000000f9, 0x000000f9 }, | ||
510 | { 0x00009aa4, 0x000000f9, 0x000000f9 }, | ||
511 | { 0x00009aa8, 0x000000f9, 0x000000f9 }, | ||
512 | { 0x00009aac, 0x000000f9, 0x000000f9 }, | ||
513 | { 0x00009ab0, 0x000000f9, 0x000000f9 }, | ||
514 | { 0x00009ab4, 0x000000f9, 0x000000f9 }, | ||
515 | { 0x00009ab8, 0x000000f9, 0x000000f9 }, | ||
516 | { 0x00009abc, 0x000000f9, 0x000000f9 }, | ||
517 | { 0x00009ac0, 0x000000f9, 0x000000f9 }, | ||
518 | { 0x00009ac4, 0x000000f9, 0x000000f9 }, | ||
519 | { 0x00009ac8, 0x000000f9, 0x000000f9 }, | ||
520 | { 0x00009acc, 0x000000f9, 0x000000f9 }, | ||
521 | { 0x00009ad0, 0x000000f9, 0x000000f9 }, | ||
522 | { 0x00009ad4, 0x000000f9, 0x000000f9 }, | ||
523 | { 0x00009ad8, 0x000000f9, 0x000000f9 }, | ||
524 | { 0x00009adc, 0x000000f9, 0x000000f9 }, | ||
525 | { 0x00009ae0, 0x000000f9, 0x000000f9 }, | ||
526 | { 0x00009ae4, 0x000000f9, 0x000000f9 }, | ||
527 | { 0x00009ae8, 0x000000f9, 0x000000f9 }, | ||
528 | { 0x00009aec, 0x000000f9, 0x000000f9 }, | ||
529 | { 0x00009af0, 0x000000f9, 0x000000f9 }, | ||
530 | { 0x00009af4, 0x000000f9, 0x000000f9 }, | ||
531 | { 0x00009af8, 0x000000f9, 0x000000f9 }, | ||
532 | { 0x00009afc, 0x000000f9, 0x000000f9 }, | ||
533 | }; | ||
534 | |||
535 | static const u32 ar5416Bank1[][2] = { | ||
536 | { 0x000098b0, 0x02108421 }, | ||
537 | { 0x000098ec, 0x00000008 }, | ||
538 | }; | ||
539 | |||
540 | static const u32 ar5416Bank2[][2] = { | ||
541 | { 0x000098b0, 0x0e73ff17 }, | ||
542 | { 0x000098e0, 0x00000420 }, | ||
543 | }; | ||
544 | |||
545 | static const u32 ar5416Bank3[][3] = { | ||
546 | { 0x000098f0, 0x01400018, 0x01c00018 }, | ||
547 | }; | ||
548 | |||
549 | static const u32 ar5416Bank6[][3] = { | ||
550 | |||
551 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
552 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
553 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
554 | { 0x0000989c, 0x00e00000, 0x00e00000 }, | ||
555 | { 0x0000989c, 0x005e0000, 0x005e0000 }, | ||
556 | { 0x0000989c, 0x00120000, 0x00120000 }, | ||
557 | { 0x0000989c, 0x00620000, 0x00620000 }, | ||
558 | { 0x0000989c, 0x00020000, 0x00020000 }, | ||
559 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
560 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
561 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
562 | { 0x0000989c, 0x40ff0000, 0x40ff0000 }, | ||
563 | { 0x0000989c, 0x005f0000, 0x005f0000 }, | ||
564 | { 0x0000989c, 0x00870000, 0x00870000 }, | ||
565 | { 0x0000989c, 0x00f90000, 0x00f90000 }, | ||
566 | { 0x0000989c, 0x007b0000, 0x007b0000 }, | ||
567 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
568 | { 0x0000989c, 0x00f50000, 0x00f50000 }, | ||
569 | { 0x0000989c, 0x00dc0000, 0x00dc0000 }, | ||
570 | { 0x0000989c, 0x00110000, 0x00110000 }, | ||
571 | { 0x0000989c, 0x006100a8, 0x006100a8 }, | ||
572 | { 0x0000989c, 0x004210a2, 0x004210a2 }, | ||
573 | { 0x0000989c, 0x0014008f, 0x0014008f }, | ||
574 | { 0x0000989c, 0x00c40003, 0x00c40003 }, | ||
575 | { 0x0000989c, 0x003000f2, 0x003000f2 }, | ||
576 | { 0x0000989c, 0x00440016, 0x00440016 }, | ||
577 | { 0x0000989c, 0x00410040, 0x00410040 }, | ||
578 | { 0x0000989c, 0x0001805e, 0x0001805e }, | ||
579 | { 0x0000989c, 0x0000c0ab, 0x0000c0ab }, | ||
580 | { 0x0000989c, 0x000000f1, 0x000000f1 }, | ||
581 | { 0x0000989c, 0x00002081, 0x00002081 }, | ||
582 | { 0x0000989c, 0x000000d4, 0x000000d4 }, | ||
583 | { 0x000098d0, 0x0000000f, 0x0010000f }, | ||
584 | }; | ||
585 | |||
586 | static const u32 ar5416Bank6TPC[][3] = { | ||
587 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
588 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
589 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
590 | { 0x0000989c, 0x00e00000, 0x00e00000 }, | ||
591 | { 0x0000989c, 0x005e0000, 0x005e0000 }, | ||
592 | { 0x0000989c, 0x00120000, 0x00120000 }, | ||
593 | { 0x0000989c, 0x00620000, 0x00620000 }, | ||
594 | { 0x0000989c, 0x00020000, 0x00020000 }, | ||
595 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
596 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
597 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
598 | { 0x0000989c, 0x40ff0000, 0x40ff0000 }, | ||
599 | { 0x0000989c, 0x005f0000, 0x005f0000 }, | ||
600 | { 0x0000989c, 0x00870000, 0x00870000 }, | ||
601 | { 0x0000989c, 0x00f90000, 0x00f90000 }, | ||
602 | { 0x0000989c, 0x007b0000, 0x007b0000 }, | ||
603 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
604 | { 0x0000989c, 0x00f50000, 0x00f50000 }, | ||
605 | { 0x0000989c, 0x00dc0000, 0x00dc0000 }, | ||
606 | { 0x0000989c, 0x00110000, 0x00110000 }, | ||
607 | { 0x0000989c, 0x006100a8, 0x006100a8 }, | ||
608 | { 0x0000989c, 0x00423022, 0x00423022 }, | ||
609 | { 0x0000989c, 0x201400df, 0x201400df }, | ||
610 | { 0x0000989c, 0x00c40002, 0x00c40002 }, | ||
611 | { 0x0000989c, 0x003000f2, 0x003000f2 }, | ||
612 | { 0x0000989c, 0x00440016, 0x00440016 }, | ||
613 | { 0x0000989c, 0x00410040, 0x00410040 }, | ||
614 | { 0x0000989c, 0x0001805e, 0x0001805e }, | ||
615 | { 0x0000989c, 0x0000c0ab, 0x0000c0ab }, | ||
616 | { 0x0000989c, 0x000000e1, 0x000000e1 }, | ||
617 | { 0x0000989c, 0x00007081, 0x00007081 }, | ||
618 | { 0x0000989c, 0x000000d4, 0x000000d4 }, | ||
619 | { 0x000098d0, 0x0000000f, 0x0010000f }, | ||
620 | }; | ||
621 | |||
622 | static const u32 ar5416Bank7[][2] = { | ||
623 | { 0x0000989c, 0x00000500 }, | ||
624 | { 0x0000989c, 0x00000800 }, | ||
625 | { 0x000098cc, 0x0000000e }, | ||
626 | }; | ||
627 | |||
628 | static const u32 ar5416Addac[][2] = { | ||
629 | {0x0000989c, 0x00000000 }, | ||
630 | {0x0000989c, 0x00000003 }, | ||
631 | {0x0000989c, 0x00000000 }, | ||
632 | {0x0000989c, 0x0000000c }, | ||
633 | {0x0000989c, 0x00000000 }, | ||
634 | {0x0000989c, 0x00000030 }, | ||
635 | {0x0000989c, 0x00000000 }, | ||
636 | {0x0000989c, 0x00000000 }, | ||
637 | {0x0000989c, 0x00000000 }, | ||
638 | {0x0000989c, 0x00000000 }, | ||
639 | {0x0000989c, 0x00000000 }, | ||
640 | {0x0000989c, 0x00000000 }, | ||
641 | {0x0000989c, 0x00000000 }, | ||
642 | {0x0000989c, 0x00000000 }, | ||
643 | {0x0000989c, 0x00000000 }, | ||
644 | {0x0000989c, 0x00000000 }, | ||
645 | {0x0000989c, 0x00000000 }, | ||
646 | {0x0000989c, 0x00000000 }, | ||
647 | {0x0000989c, 0x00000060 }, | ||
648 | {0x0000989c, 0x00000000 }, | ||
649 | {0x0000989c, 0x00000000 }, | ||
650 | {0x0000989c, 0x00000000 }, | ||
651 | {0x0000989c, 0x00000000 }, | ||
652 | {0x0000989c, 0x00000000 }, | ||
653 | {0x0000989c, 0x00000000 }, | ||
654 | {0x0000989c, 0x00000000 }, | ||
655 | {0x0000989c, 0x00000000 }, | ||
656 | {0x0000989c, 0x00000000 }, | ||
657 | {0x0000989c, 0x00000000 }, | ||
658 | {0x0000989c, 0x00000000 }, | ||
659 | {0x0000989c, 0x00000000 }, | ||
660 | {0x0000989c, 0x00000058 }, | ||
661 | {0x0000989c, 0x00000000 }, | ||
662 | {0x0000989c, 0x00000000 }, | ||
663 | {0x0000989c, 0x00000000 }, | ||
664 | {0x0000989c, 0x00000000 }, | ||
665 | {0x000098cc, 0x00000000 }, | ||
666 | }; | ||
667 | |||
668 | static const u32 ar5416Modes_9100[][6] = { | ||
669 | { 0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160, 0x000001e0 }, | ||
670 | { 0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c, 0x000001e0 }, | ||
671 | { 0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38, 0x00001180 }, | ||
672 | { 0x000010f0, 0x0000a000, 0x00014000, 0x00016000, 0x0000b000, 0x00014008 }, | ||
673 | { 0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00, 0x06e006e0 }, | ||
674 | { 0x0000801c, 0x128d93a7, 0x128d93cf, 0x12e013d7, 0x12e013ab, 0x098813cf }, | ||
675 | { 0x00009804, 0x00000300, 0x000003c4, 0x000003c4, 0x00000300, 0x00000303 }, | ||
676 | { 0x00009820, 0x02020200, 0x02020200, 0x02020200, 0x02020200, 0x02020200 }, | ||
677 | { 0x00009824, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e }, | ||
678 | { 0x00009828, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001 }, | ||
679 | { 0x00009834, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e }, | ||
680 | { 0x00009838, 0x00000007, 0x00000007, 0x00000007, 0x00000007, 0x00000007 }, | ||
681 | { 0x00009844, 0x0372161e, 0x0372161e, 0x037216a0, 0x037216a0, 0x037216a0 }, | ||
682 | { 0x00009848, 0x001a6a65, 0x001a6a65, 0x00197a68, 0x00197a68, 0x00197a68 }, | ||
683 | { 0x0000a848, 0x001a6a65, 0x001a6a65, 0x00197a68, 0x00197a68, 0x00197a68 }, | ||
684 | { 0x0000b848, 0x001a6a65, 0x001a6a65, 0x00197a68, 0x00197a68, 0x00197a68 }, | ||
685 | { 0x00009850, 0x6d48b4e2, 0x6d48b4e2, 0x6d48b0e2, 0x6d48b0e2, 0x6d48b0e2 }, | ||
686 | { 0x00009858, 0x7ec82d2e, 0x7ec82d2e, 0x7ec86d2e, 0x7ec84d2e, 0x7ec82d2e }, | ||
687 | { 0x0000985c, 0x3139605e, 0x3139605e, 0x3139605e, 0x3139605e, 0x3139605e }, | ||
688 | { 0x00009860, 0x00048d18, 0x00048d18, 0x00048d20, 0x00048d20, 0x00048d18 }, | ||
689 | { 0x0000c864, 0x0001ce00, 0x0001ce00, 0x0001ce00, 0x0001ce00, 0x0001ce00 }, | ||
690 | { 0x00009868, 0x409a40d0, 0x409a40d0, 0x409a40d0, 0x409a40d0, 0x409a40d0 }, | ||
691 | { 0x0000986c, 0x050cb081, 0x050cb081, 0x050cb081, 0x050cb081, 0x050cb081 }, | ||
692 | { 0x00009914, 0x000007d0, 0x000007d0, 0x00000898, 0x00000898, 0x000007d0 }, | ||
693 | { 0x00009918, 0x0000000a, 0x00000014, 0x00000016, 0x0000000b, 0x00000016 }, | ||
694 | { 0x00009924, 0xd00a8a07, 0xd00a8a07, 0xd00a8a11, 0xd00a8a0d, 0xd00a8a0d }, | ||
695 | { 0x00009940, 0x00754604, 0x00754604, 0xfff81204, 0xfff81204, 0xfff81204 }, | ||
696 | { 0x00009944, 0xdfb81020, 0xdfb81020, 0xdfb81020, 0xdfb81020, 0xdfb81020 }, | ||
697 | { 0x00009954, 0x5f3ca3de, 0x5f3ca3de, 0xe250a51e, 0xe250a51e, 0xe250a51e }, | ||
698 | { 0x00009958, 0x2108ecff, 0x2108ecff, 0x3388ffff, 0x3388ffff, 0x3388ffff }, | ||
699 | #ifdef TB243 | ||
700 | { 0x00009960, 0x00000900, 0x00000900, 0x00009b40, 0x00009b40, 0x00012d80 }, | ||
701 | { 0x0000a960, 0x00000900, 0x00000900, 0x00009b40, 0x00009b40, 0x00012d80 }, | ||
702 | { 0x0000b960, 0x00000900, 0x00000900, 0x00009b40, 0x00009b40, 0x00012d80 }, | ||
703 | { 0x00009964, 0x00000000, 0x00000000, 0x00002210, 0x00002210, 0x00001120 }, | ||
704 | #else | ||
705 | { 0x00009960, 0x0001bfc0, 0x0001bfc0, 0x0001bfc0, 0x0001bfc0, 0x0001bfc0 }, | ||
706 | { 0x0000a960, 0x0001bfc0, 0x0001bfc0, 0x0001bfc0, 0x0001bfc0, 0x0001bfc0 }, | ||
707 | { 0x0000b960, 0x0001bfc0, 0x0001bfc0, 0x0001bfc0, 0x0001bfc0, 0x0001bfc0 }, | ||
708 | { 0x00009964, 0x00001120, 0x00001120, 0x00001120, 0x00001120, 0x00001120 }, | ||
709 | #endif | ||
710 | { 0x0000c9bc, 0x001a0600, 0x001a0600, 0x001a1000, 0x001a0c00, 0x001a0c00 }, | ||
711 | { 0x000099c0, 0x038919be, 0x038919be, 0x038919be, 0x038919be, 0x038919be }, | ||
712 | { 0x000099c4, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77 }, | ||
713 | { 0x000099c8, 0x60f65329, 0x60f65329, 0x60f65329, 0x60f65329, 0x60f65329 }, | ||
714 | { 0x000099cc, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8 }, | ||
715 | { 0x000099d0, 0x00046384, 0x00046384, 0x00046384, 0x00046384, 0x00046384 }, | ||
716 | { 0x000099d4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
717 | { 0x000099d8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
718 | { 0x0000a204, 0x00000880, 0x00000880, 0x00000880, 0x00000880, 0x00000880 }, | ||
719 | { 0x0000a208, 0xd6be4788, 0xd6be4788, 0xd03e4788, 0xd03e4788, 0xd03e4788 }, | ||
720 | { 0x0000a20c, 0x002fc160, 0x002fc160, 0x002ac120, 0x002ac120, 0x002ac120 }, | ||
721 | { 0x0000b20c, 0x002fc160, 0x002fc160, 0x002ac120, 0x002ac120, 0x002ac120 }, | ||
722 | { 0x0000c20c, 0x002fc160, 0x002fc160, 0x002ac120, 0x002ac120, 0x002ac120 }, | ||
723 | { 0x0000a21c, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a }, | ||
724 | { 0x0000a230, 0x00000000, 0x00000000, 0x00000210, 0x00000108, 0x00000000 }, | ||
725 | { 0x0000a274, 0x0a1a9caa, 0x0a1a9caa, 0x0a1a7caa, 0x0a1a7caa, 0x0a1a7caa }, | ||
726 | { 0x0000a300, 0x18010000, 0x18010000, 0x18010000, 0x18010000, 0x18010000 }, | ||
727 | { 0x0000a304, 0x30032602, 0x30032602, 0x2e032402, 0x2e032402, 0x2e032402 }, | ||
728 | { 0x0000a308, 0x48073e06, 0x48073e06, 0x4a0a3c06, 0x4a0a3c06, 0x4a0a3c06 }, | ||
729 | { 0x0000a30c, 0x560b4c0a, 0x560b4c0a, 0x621a540b, 0x621a540b, 0x621a540b }, | ||
730 | { 0x0000a310, 0x641a600f, 0x641a600f, 0x764f6c1b, 0x764f6c1b, 0x764f6c1b }, | ||
731 | { 0x0000a314, 0x7a4f6e1b, 0x7a4f6e1b, 0x845b7a5a, 0x845b7a5a, 0x845b7a5a }, | ||
732 | { 0x0000a318, 0x8c5b7e5a, 0x8c5b7e5a, 0x950f8ccf, 0x950f8ccf, 0x950f8ccf }, | ||
733 | { 0x0000a31c, 0x9d0f96cf, 0x9d0f96cf, 0xa5cf9b4f, 0xa5cf9b4f, 0xa5cf9b4f }, | ||
734 | { 0x0000a320, 0xb51fa69f, 0xb51fa69f, 0xbddfaf1f, 0xbddfaf1f, 0xbddfaf1f }, | ||
735 | { 0x0000a324, 0xcb3fbd07, 0xcb3fbcbf, 0xd1ffc93f, 0xd1ffc93f, 0xd1ffc93f }, | ||
736 | { 0x0000a328, 0x0000d7bf, 0x0000d7bf, 0x00000000, 0x00000000, 0x00000000 }, | ||
737 | { 0x0000a32c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
738 | { 0x0000a330, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
739 | { 0x0000a334, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
740 | }; | ||
741 | |||
742 | #endif /* INITVALS_AR5008_H */ | ||
diff --git a/drivers/net/wireless/ath/ath9k/ar5008_phy.c b/drivers/net/wireless/ath/ath9k/ar5008_phy.c new file mode 100644 index 000000000000..de8ce1291a46 --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/ar5008_phy.c | |||
@@ -0,0 +1,1375 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2008-2010 Atheros Communications Inc. | ||
3 | * | ||
4 | * Permission to use, copy, modify, and/or distribute this software for any | ||
5 | * purpose with or without fee is hereby granted, provided that the above | ||
6 | * copyright notice and this permission notice appear in all copies. | ||
7 | * | ||
8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
15 | */ | ||
16 | |||
17 | #include "hw.h" | ||
18 | #include "hw-ops.h" | ||
19 | #include "../regd.h" | ||
20 | #include "ar9002_phy.h" | ||
21 | |||
22 | /* All code below is for non single-chip solutions */ | ||
23 | |||
24 | /** | ||
25 | * ar5008_hw_phy_modify_rx_buffer() - perform analog swizzling of parameters | ||
26 | * @rfbuf: | ||
27 | * @reg32: | ||
28 | * @numBits: | ||
29 | * @firstBit: | ||
30 | * @column: | ||
31 | * | ||
32 | * Performs analog "swizzling" of parameters into their location. | ||
33 | * Used on external AR2133/AR5133 radios. | ||
34 | */ | ||
35 | static void ar5008_hw_phy_modify_rx_buffer(u32 *rfBuf, u32 reg32, | ||
36 | u32 numBits, u32 firstBit, | ||
37 | u32 column) | ||
38 | { | ||
39 | u32 tmp32, mask, arrayEntry, lastBit; | ||
40 | int32_t bitPosition, bitsLeft; | ||
41 | |||
42 | tmp32 = ath9k_hw_reverse_bits(reg32, numBits); | ||
43 | arrayEntry = (firstBit - 1) / 8; | ||
44 | bitPosition = (firstBit - 1) % 8; | ||
45 | bitsLeft = numBits; | ||
46 | while (bitsLeft > 0) { | ||
47 | lastBit = (bitPosition + bitsLeft > 8) ? | ||
48 | 8 : bitPosition + bitsLeft; | ||
49 | mask = (((1 << lastBit) - 1) ^ ((1 << bitPosition) - 1)) << | ||
50 | (column * 8); | ||
51 | rfBuf[arrayEntry] &= ~mask; | ||
52 | rfBuf[arrayEntry] |= ((tmp32 << bitPosition) << | ||
53 | (column * 8)) & mask; | ||
54 | bitsLeft -= 8 - bitPosition; | ||
55 | tmp32 = tmp32 >> (8 - bitPosition); | ||
56 | bitPosition = 0; | ||
57 | arrayEntry++; | ||
58 | } | ||
59 | } | ||
60 | |||
61 | /* | ||
62 | * Fix on 2.4 GHz band for orientation sensitivity issue by increasing | ||
63 | * rf_pwd_icsyndiv. | ||
64 | * | ||
65 | * Theoretical Rules: | ||
66 | * if 2 GHz band | ||
67 | * if forceBiasAuto | ||
68 | * if synth_freq < 2412 | ||
69 | * bias = 0 | ||
70 | * else if 2412 <= synth_freq <= 2422 | ||
71 | * bias = 1 | ||
72 | * else // synth_freq > 2422 | ||
73 | * bias = 2 | ||
74 | * else if forceBias > 0 | ||
75 | * bias = forceBias & 7 | ||
76 | * else | ||
77 | * no change, use value from ini file | ||
78 | * else | ||
79 | * no change, invalid band | ||
80 | * | ||
81 | * 1st Mod: | ||
82 | * 2422 also uses value of 2 | ||
83 | * <approved> | ||
84 | * | ||
85 | * 2nd Mod: | ||
86 | * Less than 2412 uses value of 0, 2412 and above uses value of 2 | ||
87 | */ | ||
88 | static void ar5008_hw_force_bias(struct ath_hw *ah, u16 synth_freq) | ||
89 | { | ||
90 | struct ath_common *common = ath9k_hw_common(ah); | ||
91 | u32 tmp_reg; | ||
92 | int reg_writes = 0; | ||
93 | u32 new_bias = 0; | ||
94 | |||
95 | if (!AR_SREV_5416(ah) || synth_freq >= 3000) | ||
96 | return; | ||
97 | |||
98 | BUG_ON(AR_SREV_9280_10_OR_LATER(ah)); | ||
99 | |||
100 | if (synth_freq < 2412) | ||
101 | new_bias = 0; | ||
102 | else if (synth_freq < 2422) | ||
103 | new_bias = 1; | ||
104 | else | ||
105 | new_bias = 2; | ||
106 | |||
107 | /* pre-reverse this field */ | ||
108 | tmp_reg = ath9k_hw_reverse_bits(new_bias, 3); | ||
109 | |||
110 | ath_print(common, ATH_DBG_CONFIG, | ||
111 | "Force rf_pwd_icsyndiv to %1d on %4d\n", | ||
112 | new_bias, synth_freq); | ||
113 | |||
114 | /* swizzle rf_pwd_icsyndiv */ | ||
115 | ar5008_hw_phy_modify_rx_buffer(ah->analogBank6Data, tmp_reg, 3, 181, 3); | ||
116 | |||
117 | /* write Bank 6 with new params */ | ||
118 | REG_WRITE_RF_ARRAY(&ah->iniBank6, ah->analogBank6Data, reg_writes); | ||
119 | } | ||
120 | |||
121 | /** | ||
122 | * ar5008_hw_set_channel - tune to a channel on the external AR2133/AR5133 radios | ||
123 | * @ah: atheros hardware stucture | ||
124 | * @chan: | ||
125 | * | ||
126 | * For the external AR2133/AR5133 radios, takes the MHz channel value and set | ||
127 | * the channel value. Assumes writes enabled to analog bus and bank6 register | ||
128 | * cache in ah->analogBank6Data. | ||
129 | */ | ||
130 | static int ar5008_hw_set_channel(struct ath_hw *ah, struct ath9k_channel *chan) | ||
131 | { | ||
132 | struct ath_common *common = ath9k_hw_common(ah); | ||
133 | u32 channelSel = 0; | ||
134 | u32 bModeSynth = 0; | ||
135 | u32 aModeRefSel = 0; | ||
136 | u32 reg32 = 0; | ||
137 | u16 freq; | ||
138 | struct chan_centers centers; | ||
139 | |||
140 | ath9k_hw_get_channel_centers(ah, chan, ¢ers); | ||
141 | freq = centers.synth_center; | ||
142 | |||
143 | if (freq < 4800) { | ||
144 | u32 txctl; | ||
145 | |||
146 | if (((freq - 2192) % 5) == 0) { | ||
147 | channelSel = ((freq - 672) * 2 - 3040) / 10; | ||
148 | bModeSynth = 0; | ||
149 | } else if (((freq - 2224) % 5) == 0) { | ||
150 | channelSel = ((freq - 704) * 2 - 3040) / 10; | ||
151 | bModeSynth = 1; | ||
152 | } else { | ||
153 | ath_print(common, ATH_DBG_FATAL, | ||
154 | "Invalid channel %u MHz\n", freq); | ||
155 | return -EINVAL; | ||
156 | } | ||
157 | |||
158 | channelSel = (channelSel << 2) & 0xff; | ||
159 | channelSel = ath9k_hw_reverse_bits(channelSel, 8); | ||
160 | |||
161 | txctl = REG_READ(ah, AR_PHY_CCK_TX_CTRL); | ||
162 | if (freq == 2484) { | ||
163 | |||
164 | REG_WRITE(ah, AR_PHY_CCK_TX_CTRL, | ||
165 | txctl | AR_PHY_CCK_TX_CTRL_JAPAN); | ||
166 | } else { | ||
167 | REG_WRITE(ah, AR_PHY_CCK_TX_CTRL, | ||
168 | txctl & ~AR_PHY_CCK_TX_CTRL_JAPAN); | ||
169 | } | ||
170 | |||
171 | } else if ((freq % 20) == 0 && freq >= 5120) { | ||
172 | channelSel = | ||
173 | ath9k_hw_reverse_bits(((freq - 4800) / 20 << 2), 8); | ||
174 | aModeRefSel = ath9k_hw_reverse_bits(1, 2); | ||
175 | } else if ((freq % 10) == 0) { | ||
176 | channelSel = | ||
177 | ath9k_hw_reverse_bits(((freq - 4800) / 10 << 1), 8); | ||
178 | if (AR_SREV_9100(ah) || AR_SREV_9160_10_OR_LATER(ah)) | ||
179 | aModeRefSel = ath9k_hw_reverse_bits(2, 2); | ||
180 | else | ||
181 | aModeRefSel = ath9k_hw_reverse_bits(1, 2); | ||
182 | } else if ((freq % 5) == 0) { | ||
183 | channelSel = ath9k_hw_reverse_bits((freq - 4800) / 5, 8); | ||
184 | aModeRefSel = ath9k_hw_reverse_bits(1, 2); | ||
185 | } else { | ||
186 | ath_print(common, ATH_DBG_FATAL, | ||
187 | "Invalid channel %u MHz\n", freq); | ||
188 | return -EINVAL; | ||
189 | } | ||
190 | |||
191 | ar5008_hw_force_bias(ah, freq); | ||
192 | |||
193 | reg32 = | ||
194 | (channelSel << 8) | (aModeRefSel << 2) | (bModeSynth << 1) | | ||
195 | (1 << 5) | 0x1; | ||
196 | |||
197 | REG_WRITE(ah, AR_PHY(0x37), reg32); | ||
198 | |||
199 | ah->curchan = chan; | ||
200 | ah->curchan_rad_index = -1; | ||
201 | |||
202 | return 0; | ||
203 | } | ||
204 | |||
205 | /** | ||
206 | * ar5008_hw_spur_mitigate - convert baseband spur frequency for external radios | ||
207 | * @ah: atheros hardware structure | ||
208 | * @chan: | ||
209 | * | ||
210 | * For non single-chip solutions. Converts to baseband spur frequency given the | ||
211 | * input channel frequency and compute register settings below. | ||
212 | */ | ||
213 | static void ar5008_hw_spur_mitigate(struct ath_hw *ah, | ||
214 | struct ath9k_channel *chan) | ||
215 | { | ||
216 | int bb_spur = AR_NO_SPUR; | ||
217 | int bin, cur_bin; | ||
218 | int spur_freq_sd; | ||
219 | int spur_delta_phase; | ||
220 | int denominator; | ||
221 | int upper, lower, cur_vit_mask; | ||
222 | int tmp, new; | ||
223 | int i; | ||
224 | int pilot_mask_reg[4] = { AR_PHY_TIMING7, AR_PHY_TIMING8, | ||
225 | AR_PHY_PILOT_MASK_01_30, AR_PHY_PILOT_MASK_31_60 | ||
226 | }; | ||
227 | int chan_mask_reg[4] = { AR_PHY_TIMING9, AR_PHY_TIMING10, | ||
228 | AR_PHY_CHANNEL_MASK_01_30, AR_PHY_CHANNEL_MASK_31_60 | ||
229 | }; | ||
230 | int inc[4] = { 0, 100, 0, 0 }; | ||
231 | |||
232 | int8_t mask_m[123]; | ||
233 | int8_t mask_p[123]; | ||
234 | int8_t mask_amt; | ||
235 | int tmp_mask; | ||
236 | int cur_bb_spur; | ||
237 | bool is2GHz = IS_CHAN_2GHZ(chan); | ||
238 | |||
239 | memset(&mask_m, 0, sizeof(int8_t) * 123); | ||
240 | memset(&mask_p, 0, sizeof(int8_t) * 123); | ||
241 | |||
242 | for (i = 0; i < AR_EEPROM_MODAL_SPURS; i++) { | ||
243 | cur_bb_spur = ah->eep_ops->get_spur_channel(ah, i, is2GHz); | ||
244 | if (AR_NO_SPUR == cur_bb_spur) | ||
245 | break; | ||
246 | cur_bb_spur = cur_bb_spur - (chan->channel * 10); | ||
247 | if ((cur_bb_spur > -95) && (cur_bb_spur < 95)) { | ||
248 | bb_spur = cur_bb_spur; | ||
249 | break; | ||
250 | } | ||
251 | } | ||
252 | |||
253 | if (AR_NO_SPUR == bb_spur) | ||
254 | return; | ||
255 | |||
256 | bin = bb_spur * 32; | ||
257 | |||
258 | tmp = REG_READ(ah, AR_PHY_TIMING_CTRL4(0)); | ||
259 | new = tmp | (AR_PHY_TIMING_CTRL4_ENABLE_SPUR_RSSI | | ||
260 | AR_PHY_TIMING_CTRL4_ENABLE_SPUR_FILTER | | ||
261 | AR_PHY_TIMING_CTRL4_ENABLE_CHAN_MASK | | ||
262 | AR_PHY_TIMING_CTRL4_ENABLE_PILOT_MASK); | ||
263 | |||
264 | REG_WRITE(ah, AR_PHY_TIMING_CTRL4(0), new); | ||
265 | |||
266 | new = (AR_PHY_SPUR_REG_MASK_RATE_CNTL | | ||
267 | AR_PHY_SPUR_REG_ENABLE_MASK_PPM | | ||
268 | AR_PHY_SPUR_REG_MASK_RATE_SELECT | | ||
269 | AR_PHY_SPUR_REG_ENABLE_VIT_SPUR_RSSI | | ||
270 | SM(SPUR_RSSI_THRESH, AR_PHY_SPUR_REG_SPUR_RSSI_THRESH)); | ||
271 | REG_WRITE(ah, AR_PHY_SPUR_REG, new); | ||
272 | |||
273 | spur_delta_phase = ((bb_spur * 524288) / 100) & | ||
274 | AR_PHY_TIMING11_SPUR_DELTA_PHASE; | ||
275 | |||
276 | denominator = IS_CHAN_2GHZ(chan) ? 440 : 400; | ||
277 | spur_freq_sd = ((bb_spur * 2048) / denominator) & 0x3ff; | ||
278 | |||
279 | new = (AR_PHY_TIMING11_USE_SPUR_IN_AGC | | ||
280 | SM(spur_freq_sd, AR_PHY_TIMING11_SPUR_FREQ_SD) | | ||
281 | SM(spur_delta_phase, AR_PHY_TIMING11_SPUR_DELTA_PHASE)); | ||
282 | REG_WRITE(ah, AR_PHY_TIMING11, new); | ||
283 | |||
284 | cur_bin = -6000; | ||
285 | upper = bin + 100; | ||
286 | lower = bin - 100; | ||
287 | |||
288 | for (i = 0; i < 4; i++) { | ||
289 | int pilot_mask = 0; | ||
290 | int chan_mask = 0; | ||
291 | int bp = 0; | ||
292 | for (bp = 0; bp < 30; bp++) { | ||
293 | if ((cur_bin > lower) && (cur_bin < upper)) { | ||
294 | pilot_mask = pilot_mask | 0x1 << bp; | ||
295 | chan_mask = chan_mask | 0x1 << bp; | ||
296 | } | ||
297 | cur_bin += 100; | ||
298 | } | ||
299 | cur_bin += inc[i]; | ||
300 | REG_WRITE(ah, pilot_mask_reg[i], pilot_mask); | ||
301 | REG_WRITE(ah, chan_mask_reg[i], chan_mask); | ||
302 | } | ||
303 | |||
304 | cur_vit_mask = 6100; | ||
305 | upper = bin + 120; | ||
306 | lower = bin - 120; | ||
307 | |||
308 | for (i = 0; i < 123; i++) { | ||
309 | if ((cur_vit_mask > lower) && (cur_vit_mask < upper)) { | ||
310 | |||
311 | /* workaround for gcc bug #37014 */ | ||
312 | volatile int tmp_v = abs(cur_vit_mask - bin); | ||
313 | |||
314 | if (tmp_v < 75) | ||
315 | mask_amt = 1; | ||
316 | else | ||
317 | mask_amt = 0; | ||
318 | if (cur_vit_mask < 0) | ||
319 | mask_m[abs(cur_vit_mask / 100)] = mask_amt; | ||
320 | else | ||
321 | mask_p[cur_vit_mask / 100] = mask_amt; | ||
322 | } | ||
323 | cur_vit_mask -= 100; | ||
324 | } | ||
325 | |||
326 | tmp_mask = (mask_m[46] << 30) | (mask_m[47] << 28) | ||
327 | | (mask_m[48] << 26) | (mask_m[49] << 24) | ||
328 | | (mask_m[50] << 22) | (mask_m[51] << 20) | ||
329 | | (mask_m[52] << 18) | (mask_m[53] << 16) | ||
330 | | (mask_m[54] << 14) | (mask_m[55] << 12) | ||
331 | | (mask_m[56] << 10) | (mask_m[57] << 8) | ||
332 | | (mask_m[58] << 6) | (mask_m[59] << 4) | ||
333 | | (mask_m[60] << 2) | (mask_m[61] << 0); | ||
334 | REG_WRITE(ah, AR_PHY_BIN_MASK_1, tmp_mask); | ||
335 | REG_WRITE(ah, AR_PHY_VIT_MASK2_M_46_61, tmp_mask); | ||
336 | |||
337 | tmp_mask = (mask_m[31] << 28) | ||
338 | | (mask_m[32] << 26) | (mask_m[33] << 24) | ||
339 | | (mask_m[34] << 22) | (mask_m[35] << 20) | ||
340 | | (mask_m[36] << 18) | (mask_m[37] << 16) | ||
341 | | (mask_m[48] << 14) | (mask_m[39] << 12) | ||
342 | | (mask_m[40] << 10) | (mask_m[41] << 8) | ||
343 | | (mask_m[42] << 6) | (mask_m[43] << 4) | ||
344 | | (mask_m[44] << 2) | (mask_m[45] << 0); | ||
345 | REG_WRITE(ah, AR_PHY_BIN_MASK_2, tmp_mask); | ||
346 | REG_WRITE(ah, AR_PHY_MASK2_M_31_45, tmp_mask); | ||
347 | |||
348 | tmp_mask = (mask_m[16] << 30) | (mask_m[16] << 28) | ||
349 | | (mask_m[18] << 26) | (mask_m[18] << 24) | ||
350 | | (mask_m[20] << 22) | (mask_m[20] << 20) | ||
351 | | (mask_m[22] << 18) | (mask_m[22] << 16) | ||
352 | | (mask_m[24] << 14) | (mask_m[24] << 12) | ||
353 | | (mask_m[25] << 10) | (mask_m[26] << 8) | ||
354 | | (mask_m[27] << 6) | (mask_m[28] << 4) | ||
355 | | (mask_m[29] << 2) | (mask_m[30] << 0); | ||
356 | REG_WRITE(ah, AR_PHY_BIN_MASK_3, tmp_mask); | ||
357 | REG_WRITE(ah, AR_PHY_MASK2_M_16_30, tmp_mask); | ||
358 | |||
359 | tmp_mask = (mask_m[0] << 30) | (mask_m[1] << 28) | ||
360 | | (mask_m[2] << 26) | (mask_m[3] << 24) | ||
361 | | (mask_m[4] << 22) | (mask_m[5] << 20) | ||
362 | | (mask_m[6] << 18) | (mask_m[7] << 16) | ||
363 | | (mask_m[8] << 14) | (mask_m[9] << 12) | ||
364 | | (mask_m[10] << 10) | (mask_m[11] << 8) | ||
365 | | (mask_m[12] << 6) | (mask_m[13] << 4) | ||
366 | | (mask_m[14] << 2) | (mask_m[15] << 0); | ||
367 | REG_WRITE(ah, AR_PHY_MASK_CTL, tmp_mask); | ||
368 | REG_WRITE(ah, AR_PHY_MASK2_M_00_15, tmp_mask); | ||
369 | |||
370 | tmp_mask = (mask_p[15] << 28) | ||
371 | | (mask_p[14] << 26) | (mask_p[13] << 24) | ||
372 | | (mask_p[12] << 22) | (mask_p[11] << 20) | ||
373 | | (mask_p[10] << 18) | (mask_p[9] << 16) | ||
374 | | (mask_p[8] << 14) | (mask_p[7] << 12) | ||
375 | | (mask_p[6] << 10) | (mask_p[5] << 8) | ||
376 | | (mask_p[4] << 6) | (mask_p[3] << 4) | ||
377 | | (mask_p[2] << 2) | (mask_p[1] << 0); | ||
378 | REG_WRITE(ah, AR_PHY_BIN_MASK2_1, tmp_mask); | ||
379 | REG_WRITE(ah, AR_PHY_MASK2_P_15_01, tmp_mask); | ||
380 | |||
381 | tmp_mask = (mask_p[30] << 28) | ||
382 | | (mask_p[29] << 26) | (mask_p[28] << 24) | ||
383 | | (mask_p[27] << 22) | (mask_p[26] << 20) | ||
384 | | (mask_p[25] << 18) | (mask_p[24] << 16) | ||
385 | | (mask_p[23] << 14) | (mask_p[22] << 12) | ||
386 | | (mask_p[21] << 10) | (mask_p[20] << 8) | ||
387 | | (mask_p[19] << 6) | (mask_p[18] << 4) | ||
388 | | (mask_p[17] << 2) | (mask_p[16] << 0); | ||
389 | REG_WRITE(ah, AR_PHY_BIN_MASK2_2, tmp_mask); | ||
390 | REG_WRITE(ah, AR_PHY_MASK2_P_30_16, tmp_mask); | ||
391 | |||
392 | tmp_mask = (mask_p[45] << 28) | ||
393 | | (mask_p[44] << 26) | (mask_p[43] << 24) | ||
394 | | (mask_p[42] << 22) | (mask_p[41] << 20) | ||
395 | | (mask_p[40] << 18) | (mask_p[39] << 16) | ||
396 | | (mask_p[38] << 14) | (mask_p[37] << 12) | ||
397 | | (mask_p[36] << 10) | (mask_p[35] << 8) | ||
398 | | (mask_p[34] << 6) | (mask_p[33] << 4) | ||
399 | | (mask_p[32] << 2) | (mask_p[31] << 0); | ||
400 | REG_WRITE(ah, AR_PHY_BIN_MASK2_3, tmp_mask); | ||
401 | REG_WRITE(ah, AR_PHY_MASK2_P_45_31, tmp_mask); | ||
402 | |||
403 | tmp_mask = (mask_p[61] << 30) | (mask_p[60] << 28) | ||
404 | | (mask_p[59] << 26) | (mask_p[58] << 24) | ||
405 | | (mask_p[57] << 22) | (mask_p[56] << 20) | ||
406 | | (mask_p[55] << 18) | (mask_p[54] << 16) | ||
407 | | (mask_p[53] << 14) | (mask_p[52] << 12) | ||
408 | | (mask_p[51] << 10) | (mask_p[50] << 8) | ||
409 | | (mask_p[49] << 6) | (mask_p[48] << 4) | ||
410 | | (mask_p[47] << 2) | (mask_p[46] << 0); | ||
411 | REG_WRITE(ah, AR_PHY_BIN_MASK2_4, tmp_mask); | ||
412 | REG_WRITE(ah, AR_PHY_MASK2_P_61_45, tmp_mask); | ||
413 | } | ||
414 | |||
415 | /** | ||
416 | * ar5008_hw_rf_alloc_ext_banks - allocates banks for external radio programming | ||
417 | * @ah: atheros hardware structure | ||
418 | * | ||
419 | * Only required for older devices with external AR2133/AR5133 radios. | ||
420 | */ | ||
421 | static int ar5008_hw_rf_alloc_ext_banks(struct ath_hw *ah) | ||
422 | { | ||
423 | #define ATH_ALLOC_BANK(bank, size) do { \ | ||
424 | bank = kzalloc((sizeof(u32) * size), GFP_KERNEL); \ | ||
425 | if (!bank) { \ | ||
426 | ath_print(common, ATH_DBG_FATAL, \ | ||
427 | "Cannot allocate RF banks\n"); \ | ||
428 | return -ENOMEM; \ | ||
429 | } \ | ||
430 | } while (0); | ||
431 | |||
432 | struct ath_common *common = ath9k_hw_common(ah); | ||
433 | |||
434 | BUG_ON(AR_SREV_9280_10_OR_LATER(ah)); | ||
435 | |||
436 | ATH_ALLOC_BANK(ah->analogBank0Data, ah->iniBank0.ia_rows); | ||
437 | ATH_ALLOC_BANK(ah->analogBank1Data, ah->iniBank1.ia_rows); | ||
438 | ATH_ALLOC_BANK(ah->analogBank2Data, ah->iniBank2.ia_rows); | ||
439 | ATH_ALLOC_BANK(ah->analogBank3Data, ah->iniBank3.ia_rows); | ||
440 | ATH_ALLOC_BANK(ah->analogBank6Data, ah->iniBank6.ia_rows); | ||
441 | ATH_ALLOC_BANK(ah->analogBank6TPCData, ah->iniBank6TPC.ia_rows); | ||
442 | ATH_ALLOC_BANK(ah->analogBank7Data, ah->iniBank7.ia_rows); | ||
443 | ATH_ALLOC_BANK(ah->addac5416_21, | ||
444 | ah->iniAddac.ia_rows * ah->iniAddac.ia_columns); | ||
445 | ATH_ALLOC_BANK(ah->bank6Temp, ah->iniBank6.ia_rows); | ||
446 | |||
447 | return 0; | ||
448 | #undef ATH_ALLOC_BANK | ||
449 | } | ||
450 | |||
451 | |||
452 | /** | ||
453 | * ar5008_hw_rf_free_ext_banks - Free memory for analog bank scratch buffers | ||
454 | * @ah: atheros hardware struture | ||
455 | * For the external AR2133/AR5133 radios banks. | ||
456 | */ | ||
457 | static void ar5008_hw_rf_free_ext_banks(struct ath_hw *ah) | ||
458 | { | ||
459 | #define ATH_FREE_BANK(bank) do { \ | ||
460 | kfree(bank); \ | ||
461 | bank = NULL; \ | ||
462 | } while (0); | ||
463 | |||
464 | BUG_ON(AR_SREV_9280_10_OR_LATER(ah)); | ||
465 | |||
466 | ATH_FREE_BANK(ah->analogBank0Data); | ||
467 | ATH_FREE_BANK(ah->analogBank1Data); | ||
468 | ATH_FREE_BANK(ah->analogBank2Data); | ||
469 | ATH_FREE_BANK(ah->analogBank3Data); | ||
470 | ATH_FREE_BANK(ah->analogBank6Data); | ||
471 | ATH_FREE_BANK(ah->analogBank6TPCData); | ||
472 | ATH_FREE_BANK(ah->analogBank7Data); | ||
473 | ATH_FREE_BANK(ah->addac5416_21); | ||
474 | ATH_FREE_BANK(ah->bank6Temp); | ||
475 | |||
476 | #undef ATH_FREE_BANK | ||
477 | } | ||
478 | |||
479 | /* * | ||
480 | * ar5008_hw_set_rf_regs - programs rf registers based on EEPROM | ||
481 | * @ah: atheros hardware structure | ||
482 | * @chan: | ||
483 | * @modesIndex: | ||
484 | * | ||
485 | * Used for the external AR2133/AR5133 radios. | ||
486 | * | ||
487 | * Reads the EEPROM header info from the device structure and programs | ||
488 | * all rf registers. This routine requires access to the analog | ||
489 | * rf device. This is not required for single-chip devices. | ||
490 | */ | ||
491 | static bool ar5008_hw_set_rf_regs(struct ath_hw *ah, | ||
492 | struct ath9k_channel *chan, | ||
493 | u16 modesIndex) | ||
494 | { | ||
495 | u32 eepMinorRev; | ||
496 | u32 ob5GHz = 0, db5GHz = 0; | ||
497 | u32 ob2GHz = 0, db2GHz = 0; | ||
498 | int regWrites = 0; | ||
499 | |||
500 | /* | ||
501 | * Software does not need to program bank data | ||
502 | * for single chip devices, that is AR9280 or anything | ||
503 | * after that. | ||
504 | */ | ||
505 | if (AR_SREV_9280_10_OR_LATER(ah)) | ||
506 | return true; | ||
507 | |||
508 | /* Setup rf parameters */ | ||
509 | eepMinorRev = ah->eep_ops->get_eeprom(ah, EEP_MINOR_REV); | ||
510 | |||
511 | /* Setup Bank 0 Write */ | ||
512 | RF_BANK_SETUP(ah->analogBank0Data, &ah->iniBank0, 1); | ||
513 | |||
514 | /* Setup Bank 1 Write */ | ||
515 | RF_BANK_SETUP(ah->analogBank1Data, &ah->iniBank1, 1); | ||
516 | |||
517 | /* Setup Bank 2 Write */ | ||
518 | RF_BANK_SETUP(ah->analogBank2Data, &ah->iniBank2, 1); | ||
519 | |||
520 | /* Setup Bank 6 Write */ | ||
521 | RF_BANK_SETUP(ah->analogBank3Data, &ah->iniBank3, | ||
522 | modesIndex); | ||
523 | { | ||
524 | int i; | ||
525 | for (i = 0; i < ah->iniBank6TPC.ia_rows; i++) { | ||
526 | ah->analogBank6Data[i] = | ||
527 | INI_RA(&ah->iniBank6TPC, i, modesIndex); | ||
528 | } | ||
529 | } | ||
530 | |||
531 | /* Only the 5 or 2 GHz OB/DB need to be set for a mode */ | ||
532 | if (eepMinorRev >= 2) { | ||
533 | if (IS_CHAN_2GHZ(chan)) { | ||
534 | ob2GHz = ah->eep_ops->get_eeprom(ah, EEP_OB_2); | ||
535 | db2GHz = ah->eep_ops->get_eeprom(ah, EEP_DB_2); | ||
536 | ar5008_hw_phy_modify_rx_buffer(ah->analogBank6Data, | ||
537 | ob2GHz, 3, 197, 0); | ||
538 | ar5008_hw_phy_modify_rx_buffer(ah->analogBank6Data, | ||
539 | db2GHz, 3, 194, 0); | ||
540 | } else { | ||
541 | ob5GHz = ah->eep_ops->get_eeprom(ah, EEP_OB_5); | ||
542 | db5GHz = ah->eep_ops->get_eeprom(ah, EEP_DB_5); | ||
543 | ar5008_hw_phy_modify_rx_buffer(ah->analogBank6Data, | ||
544 | ob5GHz, 3, 203, 0); | ||
545 | ar5008_hw_phy_modify_rx_buffer(ah->analogBank6Data, | ||
546 | db5GHz, 3, 200, 0); | ||
547 | } | ||
548 | } | ||
549 | |||
550 | /* Setup Bank 7 Setup */ | ||
551 | RF_BANK_SETUP(ah->analogBank7Data, &ah->iniBank7, 1); | ||
552 | |||
553 | /* Write Analog registers */ | ||
554 | REG_WRITE_RF_ARRAY(&ah->iniBank0, ah->analogBank0Data, | ||
555 | regWrites); | ||
556 | REG_WRITE_RF_ARRAY(&ah->iniBank1, ah->analogBank1Data, | ||
557 | regWrites); | ||
558 | REG_WRITE_RF_ARRAY(&ah->iniBank2, ah->analogBank2Data, | ||
559 | regWrites); | ||
560 | REG_WRITE_RF_ARRAY(&ah->iniBank3, ah->analogBank3Data, | ||
561 | regWrites); | ||
562 | REG_WRITE_RF_ARRAY(&ah->iniBank6TPC, ah->analogBank6Data, | ||
563 | regWrites); | ||
564 | REG_WRITE_RF_ARRAY(&ah->iniBank7, ah->analogBank7Data, | ||
565 | regWrites); | ||
566 | |||
567 | return true; | ||
568 | } | ||
569 | |||
570 | static void ar5008_hw_init_bb(struct ath_hw *ah, | ||
571 | struct ath9k_channel *chan) | ||
572 | { | ||
573 | u32 synthDelay; | ||
574 | |||
575 | synthDelay = REG_READ(ah, AR_PHY_RX_DELAY) & AR_PHY_RX_DELAY_DELAY; | ||
576 | if (IS_CHAN_B(chan)) | ||
577 | synthDelay = (4 * synthDelay) / 22; | ||
578 | else | ||
579 | synthDelay /= 10; | ||
580 | |||
581 | REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_EN); | ||
582 | |||
583 | udelay(synthDelay + BASE_ACTIVATE_DELAY); | ||
584 | } | ||
585 | |||
586 | static void ar5008_hw_init_chain_masks(struct ath_hw *ah) | ||
587 | { | ||
588 | int rx_chainmask, tx_chainmask; | ||
589 | |||
590 | rx_chainmask = ah->rxchainmask; | ||
591 | tx_chainmask = ah->txchainmask; | ||
592 | |||
593 | ENABLE_REGWRITE_BUFFER(ah); | ||
594 | |||
595 | switch (rx_chainmask) { | ||
596 | case 0x5: | ||
597 | DISABLE_REGWRITE_BUFFER(ah); | ||
598 | REG_SET_BIT(ah, AR_PHY_ANALOG_SWAP, | ||
599 | AR_PHY_SWAP_ALT_CHAIN); | ||
600 | ENABLE_REGWRITE_BUFFER(ah); | ||
601 | case 0x3: | ||
602 | if (ah->hw_version.macVersion == AR_SREV_REVISION_5416_10) { | ||
603 | REG_WRITE(ah, AR_PHY_RX_CHAINMASK, 0x7); | ||
604 | REG_WRITE(ah, AR_PHY_CAL_CHAINMASK, 0x7); | ||
605 | break; | ||
606 | } | ||
607 | case 0x1: | ||
608 | case 0x2: | ||
609 | case 0x7: | ||
610 | REG_WRITE(ah, AR_PHY_RX_CHAINMASK, rx_chainmask); | ||
611 | REG_WRITE(ah, AR_PHY_CAL_CHAINMASK, rx_chainmask); | ||
612 | break; | ||
613 | default: | ||
614 | break; | ||
615 | } | ||
616 | |||
617 | REG_WRITE(ah, AR_SELFGEN_MASK, tx_chainmask); | ||
618 | |||
619 | REGWRITE_BUFFER_FLUSH(ah); | ||
620 | DISABLE_REGWRITE_BUFFER(ah); | ||
621 | |||
622 | if (tx_chainmask == 0x5) { | ||
623 | REG_SET_BIT(ah, AR_PHY_ANALOG_SWAP, | ||
624 | AR_PHY_SWAP_ALT_CHAIN); | ||
625 | } | ||
626 | if (AR_SREV_9100(ah)) | ||
627 | REG_WRITE(ah, AR_PHY_ANALOG_SWAP, | ||
628 | REG_READ(ah, AR_PHY_ANALOG_SWAP) | 0x00000001); | ||
629 | } | ||
630 | |||
631 | static void ar5008_hw_override_ini(struct ath_hw *ah, | ||
632 | struct ath9k_channel *chan) | ||
633 | { | ||
634 | u32 val; | ||
635 | |||
636 | /* | ||
637 | * Set the RX_ABORT and RX_DIS and clear if off only after | ||
638 | * RXE is set for MAC. This prevents frames with corrupted | ||
639 | * descriptor status. | ||
640 | */ | ||
641 | REG_SET_BIT(ah, AR_DIAG_SW, (AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT)); | ||
642 | |||
643 | if (AR_SREV_9280_10_OR_LATER(ah)) { | ||
644 | val = REG_READ(ah, AR_PCU_MISC_MODE2); | ||
645 | |||
646 | if (!AR_SREV_9271(ah)) | ||
647 | val &= ~AR_PCU_MISC_MODE2_HWWAR1; | ||
648 | |||
649 | if (AR_SREV_9287_10_OR_LATER(ah)) | ||
650 | val = val & (~AR_PCU_MISC_MODE2_HWWAR2); | ||
651 | |||
652 | REG_WRITE(ah, AR_PCU_MISC_MODE2, val); | ||
653 | } | ||
654 | |||
655 | if (!AR_SREV_5416_20_OR_LATER(ah) || | ||
656 | AR_SREV_9280_10_OR_LATER(ah)) | ||
657 | return; | ||
658 | /* | ||
659 | * Disable BB clock gating | ||
660 | * Necessary to avoid issues on AR5416 2.0 | ||
661 | */ | ||
662 | REG_WRITE(ah, 0x9800 + (651 << 2), 0x11); | ||
663 | |||
664 | /* | ||
665 | * Disable RIFS search on some chips to avoid baseband | ||
666 | * hang issues. | ||
667 | */ | ||
668 | if (AR_SREV_9100(ah) || AR_SREV_9160(ah)) { | ||
669 | val = REG_READ(ah, AR_PHY_HEAVY_CLIP_FACTOR_RIFS); | ||
670 | val &= ~AR_PHY_RIFS_INIT_DELAY; | ||
671 | REG_WRITE(ah, AR_PHY_HEAVY_CLIP_FACTOR_RIFS, val); | ||
672 | } | ||
673 | } | ||
674 | |||
675 | static void ar5008_hw_set_channel_regs(struct ath_hw *ah, | ||
676 | struct ath9k_channel *chan) | ||
677 | { | ||
678 | u32 phymode; | ||
679 | u32 enableDacFifo = 0; | ||
680 | |||
681 | if (AR_SREV_9285_10_OR_LATER(ah)) | ||
682 | enableDacFifo = (REG_READ(ah, AR_PHY_TURBO) & | ||
683 | AR_PHY_FC_ENABLE_DAC_FIFO); | ||
684 | |||
685 | phymode = AR_PHY_FC_HT_EN | AR_PHY_FC_SHORT_GI_40 | ||
686 | | AR_PHY_FC_SINGLE_HT_LTF1 | AR_PHY_FC_WALSH | enableDacFifo; | ||
687 | |||
688 | if (IS_CHAN_HT40(chan)) { | ||
689 | phymode |= AR_PHY_FC_DYN2040_EN; | ||
690 | |||
691 | if ((chan->chanmode == CHANNEL_A_HT40PLUS) || | ||
692 | (chan->chanmode == CHANNEL_G_HT40PLUS)) | ||
693 | phymode |= AR_PHY_FC_DYN2040_PRI_CH; | ||
694 | |||
695 | } | ||
696 | REG_WRITE(ah, AR_PHY_TURBO, phymode); | ||
697 | |||
698 | ath9k_hw_set11nmac2040(ah); | ||
699 | |||
700 | ENABLE_REGWRITE_BUFFER(ah); | ||
701 | |||
702 | REG_WRITE(ah, AR_GTXTO, 25 << AR_GTXTO_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); | ||
707 | } | ||
708 | |||
709 | |||
710 | static int ar5008_hw_process_ini(struct ath_hw *ah, | ||
711 | struct ath9k_channel *chan) | ||
712 | { | ||
713 | struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah); | ||
714 | int i, regWrites = 0; | ||
715 | struct ieee80211_channel *channel = chan->chan; | ||
716 | u32 modesIndex, freqIndex; | ||
717 | |||
718 | switch (chan->chanmode) { | ||
719 | case CHANNEL_A: | ||
720 | case CHANNEL_A_HT20: | ||
721 | modesIndex = 1; | ||
722 | freqIndex = 1; | ||
723 | break; | ||
724 | case CHANNEL_A_HT40PLUS: | ||
725 | case CHANNEL_A_HT40MINUS: | ||
726 | modesIndex = 2; | ||
727 | freqIndex = 1; | ||
728 | break; | ||
729 | case CHANNEL_G: | ||
730 | case CHANNEL_G_HT20: | ||
731 | case CHANNEL_B: | ||
732 | modesIndex = 4; | ||
733 | freqIndex = 2; | ||
734 | break; | ||
735 | case CHANNEL_G_HT40PLUS: | ||
736 | case CHANNEL_G_HT40MINUS: | ||
737 | modesIndex = 3; | ||
738 | freqIndex = 2; | ||
739 | break; | ||
740 | |||
741 | default: | ||
742 | return -EINVAL; | ||
743 | } | ||
744 | |||
745 | if (AR_SREV_9287_12_OR_LATER(ah)) { | ||
746 | /* Enable ASYNC FIFO */ | ||
747 | REG_SET_BIT(ah, AR_MAC_PCU_ASYNC_FIFO_REG3, | ||
748 | AR_MAC_PCU_ASYNC_FIFO_REG3_DATAPATH_SEL); | ||
749 | REG_SET_BIT(ah, AR_PHY_MODE, AR_PHY_MODE_ASYNCFIFO); | ||
750 | REG_CLR_BIT(ah, AR_MAC_PCU_ASYNC_FIFO_REG3, | ||
751 | AR_MAC_PCU_ASYNC_FIFO_REG3_SOFT_RESET); | ||
752 | REG_SET_BIT(ah, AR_MAC_PCU_ASYNC_FIFO_REG3, | ||
753 | AR_MAC_PCU_ASYNC_FIFO_REG3_SOFT_RESET); | ||
754 | } | ||
755 | |||
756 | /* | ||
757 | * Set correct baseband to analog shift setting to | ||
758 | * access analog chips. | ||
759 | */ | ||
760 | REG_WRITE(ah, AR_PHY(0), 0x00000007); | ||
761 | |||
762 | /* Write ADDAC shifts */ | ||
763 | REG_WRITE(ah, AR_PHY_ADC_SERIAL_CTL, AR_PHY_SEL_EXTERNAL_RADIO); | ||
764 | ah->eep_ops->set_addac(ah, chan); | ||
765 | |||
766 | if (AR_SREV_5416_22_OR_LATER(ah)) { | ||
767 | REG_WRITE_ARRAY(&ah->iniAddac, 1, regWrites); | ||
768 | } else { | ||
769 | struct ar5416IniArray temp; | ||
770 | u32 addacSize = | ||
771 | sizeof(u32) * ah->iniAddac.ia_rows * | ||
772 | ah->iniAddac.ia_columns; | ||
773 | |||
774 | /* For AR5416 2.0/2.1 */ | ||
775 | memcpy(ah->addac5416_21, | ||
776 | ah->iniAddac.ia_array, addacSize); | ||
777 | |||
778 | /* override CLKDRV value at [row, column] = [31, 1] */ | ||
779 | (ah->addac5416_21)[31 * ah->iniAddac.ia_columns + 1] = 0; | ||
780 | |||
781 | temp.ia_array = ah->addac5416_21; | ||
782 | temp.ia_columns = ah->iniAddac.ia_columns; | ||
783 | temp.ia_rows = ah->iniAddac.ia_rows; | ||
784 | REG_WRITE_ARRAY(&temp, 1, regWrites); | ||
785 | } | ||
786 | |||
787 | REG_WRITE(ah, AR_PHY_ADC_SERIAL_CTL, AR_PHY_SEL_INTERNAL_ADDAC); | ||
788 | |||
789 | ENABLE_REGWRITE_BUFFER(ah); | ||
790 | |||
791 | for (i = 0; i < ah->iniModes.ia_rows; i++) { | ||
792 | u32 reg = INI_RA(&ah->iniModes, i, 0); | ||
793 | u32 val = INI_RA(&ah->iniModes, i, modesIndex); | ||
794 | |||
795 | if (reg == AR_AN_TOP2 && ah->need_an_top2_fixup) | ||
796 | val &= ~AR_AN_TOP2_PWDCLKIND; | ||
797 | |||
798 | REG_WRITE(ah, reg, val); | ||
799 | |||
800 | if (reg >= 0x7800 && reg < 0x78a0 | ||
801 | && ah->config.analog_shiftreg) { | ||
802 | udelay(100); | ||
803 | } | ||
804 | |||
805 | DO_DELAY(regWrites); | ||
806 | } | ||
807 | |||
808 | REGWRITE_BUFFER_FLUSH(ah); | ||
809 | DISABLE_REGWRITE_BUFFER(ah); | ||
810 | |||
811 | if (AR_SREV_9280(ah) || AR_SREV_9287_10_OR_LATER(ah)) | ||
812 | REG_WRITE_ARRAY(&ah->iniModesRxGain, modesIndex, regWrites); | ||
813 | |||
814 | if (AR_SREV_9280(ah) || AR_SREV_9285_12_OR_LATER(ah) || | ||
815 | AR_SREV_9287_10_OR_LATER(ah)) | ||
816 | REG_WRITE_ARRAY(&ah->iniModesTxGain, modesIndex, regWrites); | ||
817 | |||
818 | if (AR_SREV_9271_10(ah)) | ||
819 | REG_WRITE_ARRAY(&ah->iniModes_9271_1_0_only, | ||
820 | modesIndex, regWrites); | ||
821 | |||
822 | ENABLE_REGWRITE_BUFFER(ah); | ||
823 | |||
824 | /* Write common array parameters */ | ||
825 | for (i = 0; i < ah->iniCommon.ia_rows; i++) { | ||
826 | u32 reg = INI_RA(&ah->iniCommon, i, 0); | ||
827 | u32 val = INI_RA(&ah->iniCommon, i, 1); | ||
828 | |||
829 | REG_WRITE(ah, reg, val); | ||
830 | |||
831 | if (reg >= 0x7800 && reg < 0x78a0 | ||
832 | && ah->config.analog_shiftreg) { | ||
833 | udelay(100); | ||
834 | } | ||
835 | |||
836 | DO_DELAY(regWrites); | ||
837 | } | ||
838 | |||
839 | REGWRITE_BUFFER_FLUSH(ah); | ||
840 | DISABLE_REGWRITE_BUFFER(ah); | ||
841 | |||
842 | if (AR_SREV_9271(ah)) { | ||
843 | if (ah->eep_ops->get_eeprom(ah, EEP_TXGAIN_TYPE) == 1) | ||
844 | REG_WRITE_ARRAY(&ah->iniModes_high_power_tx_gain_9271, | ||
845 | modesIndex, regWrites); | ||
846 | else | ||
847 | REG_WRITE_ARRAY(&ah->iniModes_normal_power_tx_gain_9271, | ||
848 | modesIndex, regWrites); | ||
849 | } | ||
850 | |||
851 | REG_WRITE_ARRAY(&ah->iniBB_RfGain, freqIndex, regWrites); | ||
852 | |||
853 | if (AR_SREV_9280_20(ah) && IS_CHAN_A_5MHZ_SPACED(chan)) { | ||
854 | REG_WRITE_ARRAY(&ah->iniModesAdditional, modesIndex, | ||
855 | regWrites); | ||
856 | } | ||
857 | |||
858 | ar5008_hw_override_ini(ah, chan); | ||
859 | ar5008_hw_set_channel_regs(ah, chan); | ||
860 | ar5008_hw_init_chain_masks(ah); | ||
861 | ath9k_olc_init(ah); | ||
862 | |||
863 | /* Set TX power */ | ||
864 | ah->eep_ops->set_txpower(ah, chan, | ||
865 | ath9k_regd_get_ctl(regulatory, chan), | ||
866 | channel->max_antenna_gain * 2, | ||
867 | channel->max_power * 2, | ||
868 | min((u32) MAX_RATE_POWER, | ||
869 | (u32) regulatory->power_limit)); | ||
870 | |||
871 | /* Write analog registers */ | ||
872 | if (!ath9k_hw_set_rf_regs(ah, chan, freqIndex)) { | ||
873 | ath_print(ath9k_hw_common(ah), ATH_DBG_FATAL, | ||
874 | "ar5416SetRfRegs failed\n"); | ||
875 | return -EIO; | ||
876 | } | ||
877 | |||
878 | return 0; | ||
879 | } | ||
880 | |||
881 | static void ar5008_hw_set_rfmode(struct ath_hw *ah, struct ath9k_channel *chan) | ||
882 | { | ||
883 | u32 rfMode = 0; | ||
884 | |||
885 | if (chan == NULL) | ||
886 | return; | ||
887 | |||
888 | rfMode |= (IS_CHAN_B(chan) || IS_CHAN_G(chan)) | ||
889 | ? AR_PHY_MODE_DYNAMIC : AR_PHY_MODE_OFDM; | ||
890 | |||
891 | if (!AR_SREV_9280_10_OR_LATER(ah)) | ||
892 | rfMode |= (IS_CHAN_5GHZ(chan)) ? | ||
893 | AR_PHY_MODE_RF5GHZ : AR_PHY_MODE_RF2GHZ; | ||
894 | |||
895 | if ((AR_SREV_9280_20(ah) || AR_SREV_9300_20_OR_LATER(ah)) | ||
896 | && IS_CHAN_A_5MHZ_SPACED(chan)) | ||
897 | rfMode |= (AR_PHY_MODE_DYNAMIC | AR_PHY_MODE_DYN_CCK_DISABLE); | ||
898 | |||
899 | REG_WRITE(ah, AR_PHY_MODE, rfMode); | ||
900 | } | ||
901 | |||
902 | static void ar5008_hw_mark_phy_inactive(struct ath_hw *ah) | ||
903 | { | ||
904 | REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_DIS); | ||
905 | } | ||
906 | |||
907 | static void ar5008_hw_set_delta_slope(struct ath_hw *ah, | ||
908 | struct ath9k_channel *chan) | ||
909 | { | ||
910 | u32 coef_scaled, ds_coef_exp, ds_coef_man; | ||
911 | u32 clockMhzScaled = 0x64000000; | ||
912 | struct chan_centers centers; | ||
913 | |||
914 | if (IS_CHAN_HALF_RATE(chan)) | ||
915 | clockMhzScaled = clockMhzScaled >> 1; | ||
916 | else if (IS_CHAN_QUARTER_RATE(chan)) | ||
917 | clockMhzScaled = clockMhzScaled >> 2; | ||
918 | |||
919 | ath9k_hw_get_channel_centers(ah, chan, ¢ers); | ||
920 | coef_scaled = clockMhzScaled / centers.synth_center; | ||
921 | |||
922 | ath9k_hw_get_delta_slope_vals(ah, coef_scaled, &ds_coef_man, | ||
923 | &ds_coef_exp); | ||
924 | |||
925 | REG_RMW_FIELD(ah, AR_PHY_TIMING3, | ||
926 | AR_PHY_TIMING3_DSC_MAN, ds_coef_man); | ||
927 | REG_RMW_FIELD(ah, AR_PHY_TIMING3, | ||
928 | AR_PHY_TIMING3_DSC_EXP, ds_coef_exp); | ||
929 | |||
930 | coef_scaled = (9 * coef_scaled) / 10; | ||
931 | |||
932 | ath9k_hw_get_delta_slope_vals(ah, coef_scaled, &ds_coef_man, | ||
933 | &ds_coef_exp); | ||
934 | |||
935 | REG_RMW_FIELD(ah, AR_PHY_HALFGI, | ||
936 | AR_PHY_HALFGI_DSC_MAN, ds_coef_man); | ||
937 | REG_RMW_FIELD(ah, AR_PHY_HALFGI, | ||
938 | AR_PHY_HALFGI_DSC_EXP, ds_coef_exp); | ||
939 | } | ||
940 | |||
941 | static bool ar5008_hw_rfbus_req(struct ath_hw *ah) | ||
942 | { | ||
943 | REG_WRITE(ah, AR_PHY_RFBUS_REQ, AR_PHY_RFBUS_REQ_EN); | ||
944 | return ath9k_hw_wait(ah, AR_PHY_RFBUS_GRANT, AR_PHY_RFBUS_GRANT_EN, | ||
945 | AR_PHY_RFBUS_GRANT_EN, AH_WAIT_TIMEOUT); | ||
946 | } | ||
947 | |||
948 | static void ar5008_hw_rfbus_done(struct ath_hw *ah) | ||
949 | { | ||
950 | u32 synthDelay = REG_READ(ah, AR_PHY_RX_DELAY) & AR_PHY_RX_DELAY_DELAY; | ||
951 | if (IS_CHAN_B(ah->curchan)) | ||
952 | synthDelay = (4 * synthDelay) / 22; | ||
953 | else | ||
954 | synthDelay /= 10; | ||
955 | |||
956 | udelay(synthDelay + BASE_ACTIVATE_DELAY); | ||
957 | |||
958 | REG_WRITE(ah, AR_PHY_RFBUS_REQ, 0); | ||
959 | } | ||
960 | |||
961 | static void ar5008_hw_enable_rfkill(struct ath_hw *ah) | ||
962 | { | ||
963 | REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, | ||
964 | AR_GPIO_INPUT_EN_VAL_RFSILENT_BB); | ||
965 | |||
966 | REG_CLR_BIT(ah, AR_GPIO_INPUT_MUX2, | ||
967 | AR_GPIO_INPUT_MUX2_RFSILENT); | ||
968 | |||
969 | ath9k_hw_cfg_gpio_input(ah, ah->rfkill_gpio); | ||
970 | REG_SET_BIT(ah, AR_PHY_TEST, RFSILENT_BB); | ||
971 | } | ||
972 | |||
973 | static void ar5008_restore_chainmask(struct ath_hw *ah) | ||
974 | { | ||
975 | int rx_chainmask = ah->rxchainmask; | ||
976 | |||
977 | if ((rx_chainmask == 0x5) || (rx_chainmask == 0x3)) { | ||
978 | REG_WRITE(ah, AR_PHY_RX_CHAINMASK, rx_chainmask); | ||
979 | REG_WRITE(ah, AR_PHY_CAL_CHAINMASK, rx_chainmask); | ||
980 | } | ||
981 | } | ||
982 | |||
983 | static void ar5008_set_diversity(struct ath_hw *ah, bool value) | ||
984 | { | ||
985 | u32 v = REG_READ(ah, AR_PHY_CCK_DETECT); | ||
986 | if (value) | ||
987 | v |= AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV; | ||
988 | else | ||
989 | v &= ~AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV; | ||
990 | REG_WRITE(ah, AR_PHY_CCK_DETECT, v); | ||
991 | } | ||
992 | |||
993 | static u32 ar9100_hw_compute_pll_control(struct ath_hw *ah, | ||
994 | struct ath9k_channel *chan) | ||
995 | { | ||
996 | if (chan && IS_CHAN_5GHZ(chan)) | ||
997 | return 0x1450; | ||
998 | return 0x1458; | ||
999 | } | ||
1000 | |||
1001 | static u32 ar9160_hw_compute_pll_control(struct ath_hw *ah, | ||
1002 | struct ath9k_channel *chan) | ||
1003 | { | ||
1004 | u32 pll; | ||
1005 | |||
1006 | pll = SM(0x5, AR_RTC_9160_PLL_REFDIV); | ||
1007 | |||
1008 | if (chan && IS_CHAN_HALF_RATE(chan)) | ||
1009 | pll |= SM(0x1, AR_RTC_9160_PLL_CLKSEL); | ||
1010 | else if (chan && IS_CHAN_QUARTER_RATE(chan)) | ||
1011 | pll |= SM(0x2, AR_RTC_9160_PLL_CLKSEL); | ||
1012 | |||
1013 | if (chan && IS_CHAN_5GHZ(chan)) | ||
1014 | pll |= SM(0x50, AR_RTC_9160_PLL_DIV); | ||
1015 | else | ||
1016 | pll |= SM(0x58, AR_RTC_9160_PLL_DIV); | ||
1017 | |||
1018 | return pll; | ||
1019 | } | ||
1020 | |||
1021 | static u32 ar5008_hw_compute_pll_control(struct ath_hw *ah, | ||
1022 | struct ath9k_channel *chan) | ||
1023 | { | ||
1024 | u32 pll; | ||
1025 | |||
1026 | pll = AR_RTC_PLL_REFDIV_5 | AR_RTC_PLL_DIV2; | ||
1027 | |||
1028 | if (chan && IS_CHAN_HALF_RATE(chan)) | ||
1029 | pll |= SM(0x1, AR_RTC_PLL_CLKSEL); | ||
1030 | else if (chan && IS_CHAN_QUARTER_RATE(chan)) | ||
1031 | pll |= SM(0x2, AR_RTC_PLL_CLKSEL); | ||
1032 | |||
1033 | if (chan && IS_CHAN_5GHZ(chan)) | ||
1034 | pll |= SM(0xa, AR_RTC_PLL_DIV); | ||
1035 | else | ||
1036 | pll |= SM(0xb, AR_RTC_PLL_DIV); | ||
1037 | |||
1038 | return pll; | ||
1039 | } | ||
1040 | |||
1041 | static bool ar5008_hw_ani_control(struct ath_hw *ah, | ||
1042 | enum ath9k_ani_cmd cmd, int param) | ||
1043 | { | ||
1044 | struct ar5416AniState *aniState = ah->curani; | ||
1045 | struct ath_common *common = ath9k_hw_common(ah); | ||
1046 | |||
1047 | switch (cmd & ah->ani_function) { | ||
1048 | case ATH9K_ANI_NOISE_IMMUNITY_LEVEL:{ | ||
1049 | u32 level = param; | ||
1050 | |||
1051 | if (level >= ARRAY_SIZE(ah->totalSizeDesired)) { | ||
1052 | ath_print(common, ATH_DBG_ANI, | ||
1053 | "level out of range (%u > %u)\n", | ||
1054 | level, | ||
1055 | (unsigned)ARRAY_SIZE(ah->totalSizeDesired)); | ||
1056 | return false; | ||
1057 | } | ||
1058 | |||
1059 | REG_RMW_FIELD(ah, AR_PHY_DESIRED_SZ, | ||
1060 | AR_PHY_DESIRED_SZ_TOT_DES, | ||
1061 | ah->totalSizeDesired[level]); | ||
1062 | REG_RMW_FIELD(ah, AR_PHY_AGC_CTL1, | ||
1063 | AR_PHY_AGC_CTL1_COARSE_LOW, | ||
1064 | ah->coarse_low[level]); | ||
1065 | REG_RMW_FIELD(ah, AR_PHY_AGC_CTL1, | ||
1066 | AR_PHY_AGC_CTL1_COARSE_HIGH, | ||
1067 | ah->coarse_high[level]); | ||
1068 | REG_RMW_FIELD(ah, AR_PHY_FIND_SIG, | ||
1069 | AR_PHY_FIND_SIG_FIRPWR, | ||
1070 | ah->firpwr[level]); | ||
1071 | |||
1072 | if (level > aniState->noiseImmunityLevel) | ||
1073 | ah->stats.ast_ani_niup++; | ||
1074 | else if (level < aniState->noiseImmunityLevel) | ||
1075 | ah->stats.ast_ani_nidown++; | ||
1076 | aniState->noiseImmunityLevel = level; | ||
1077 | break; | ||
1078 | } | ||
1079 | case ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION:{ | ||
1080 | const int m1ThreshLow[] = { 127, 50 }; | ||
1081 | const int m2ThreshLow[] = { 127, 40 }; | ||
1082 | const int m1Thresh[] = { 127, 0x4d }; | ||
1083 | const int m2Thresh[] = { 127, 0x40 }; | ||
1084 | const int m2CountThr[] = { 31, 16 }; | ||
1085 | const int m2CountThrLow[] = { 63, 48 }; | ||
1086 | u32 on = param ? 1 : 0; | ||
1087 | |||
1088 | REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW, | ||
1089 | AR_PHY_SFCORR_LOW_M1_THRESH_LOW, | ||
1090 | m1ThreshLow[on]); | ||
1091 | REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW, | ||
1092 | AR_PHY_SFCORR_LOW_M2_THRESH_LOW, | ||
1093 | m2ThreshLow[on]); | ||
1094 | REG_RMW_FIELD(ah, AR_PHY_SFCORR, | ||
1095 | AR_PHY_SFCORR_M1_THRESH, | ||
1096 | m1Thresh[on]); | ||
1097 | REG_RMW_FIELD(ah, AR_PHY_SFCORR, | ||
1098 | AR_PHY_SFCORR_M2_THRESH, | ||
1099 | m2Thresh[on]); | ||
1100 | REG_RMW_FIELD(ah, AR_PHY_SFCORR, | ||
1101 | AR_PHY_SFCORR_M2COUNT_THR, | ||
1102 | m2CountThr[on]); | ||
1103 | REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW, | ||
1104 | AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW, | ||
1105 | m2CountThrLow[on]); | ||
1106 | |||
1107 | REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT, | ||
1108 | AR_PHY_SFCORR_EXT_M1_THRESH_LOW, | ||
1109 | m1ThreshLow[on]); | ||
1110 | REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT, | ||
1111 | AR_PHY_SFCORR_EXT_M2_THRESH_LOW, | ||
1112 | m2ThreshLow[on]); | ||
1113 | REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT, | ||
1114 | AR_PHY_SFCORR_EXT_M1_THRESH, | ||
1115 | m1Thresh[on]); | ||
1116 | REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT, | ||
1117 | AR_PHY_SFCORR_EXT_M2_THRESH, | ||
1118 | m2Thresh[on]); | ||
1119 | |||
1120 | if (on) | ||
1121 | REG_SET_BIT(ah, AR_PHY_SFCORR_LOW, | ||
1122 | AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW); | ||
1123 | else | ||
1124 | REG_CLR_BIT(ah, AR_PHY_SFCORR_LOW, | ||
1125 | AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW); | ||
1126 | |||
1127 | if (!on != aniState->ofdmWeakSigDetectOff) { | ||
1128 | if (on) | ||
1129 | ah->stats.ast_ani_ofdmon++; | ||
1130 | else | ||
1131 | ah->stats.ast_ani_ofdmoff++; | ||
1132 | aniState->ofdmWeakSigDetectOff = !on; | ||
1133 | } | ||
1134 | break; | ||
1135 | } | ||
1136 | case ATH9K_ANI_CCK_WEAK_SIGNAL_THR:{ | ||
1137 | const int weakSigThrCck[] = { 8, 6 }; | ||
1138 | u32 high = param ? 1 : 0; | ||
1139 | |||
1140 | REG_RMW_FIELD(ah, AR_PHY_CCK_DETECT, | ||
1141 | AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK, | ||
1142 | weakSigThrCck[high]); | ||
1143 | if (high != aniState->cckWeakSigThreshold) { | ||
1144 | if (high) | ||
1145 | ah->stats.ast_ani_cckhigh++; | ||
1146 | else | ||
1147 | ah->stats.ast_ani_ccklow++; | ||
1148 | aniState->cckWeakSigThreshold = high; | ||
1149 | } | ||
1150 | break; | ||
1151 | } | ||
1152 | case ATH9K_ANI_FIRSTEP_LEVEL:{ | ||
1153 | const int firstep[] = { 0, 4, 8 }; | ||
1154 | u32 level = param; | ||
1155 | |||
1156 | if (level >= ARRAY_SIZE(firstep)) { | ||
1157 | ath_print(common, ATH_DBG_ANI, | ||
1158 | "level out of range (%u > %u)\n", | ||
1159 | level, | ||
1160 | (unsigned) ARRAY_SIZE(firstep)); | ||
1161 | return false; | ||
1162 | } | ||
1163 | REG_RMW_FIELD(ah, AR_PHY_FIND_SIG, | ||
1164 | AR_PHY_FIND_SIG_FIRSTEP, | ||
1165 | firstep[level]); | ||
1166 | if (level > aniState->firstepLevel) | ||
1167 | ah->stats.ast_ani_stepup++; | ||
1168 | else if (level < aniState->firstepLevel) | ||
1169 | ah->stats.ast_ani_stepdown++; | ||
1170 | aniState->firstepLevel = level; | ||
1171 | break; | ||
1172 | } | ||
1173 | case ATH9K_ANI_SPUR_IMMUNITY_LEVEL:{ | ||
1174 | const int cycpwrThr1[] = { 2, 4, 6, 8, 10, 12, 14, 16 }; | ||
1175 | u32 level = param; | ||
1176 | |||
1177 | if (level >= ARRAY_SIZE(cycpwrThr1)) { | ||
1178 | ath_print(common, ATH_DBG_ANI, | ||
1179 | "level out of range (%u > %u)\n", | ||
1180 | level, | ||
1181 | (unsigned) ARRAY_SIZE(cycpwrThr1)); | ||
1182 | return false; | ||
1183 | } | ||
1184 | REG_RMW_FIELD(ah, AR_PHY_TIMING5, | ||
1185 | AR_PHY_TIMING5_CYCPWR_THR1, | ||
1186 | cycpwrThr1[level]); | ||
1187 | if (level > aniState->spurImmunityLevel) | ||
1188 | ah->stats.ast_ani_spurup++; | ||
1189 | else if (level < aniState->spurImmunityLevel) | ||
1190 | ah->stats.ast_ani_spurdown++; | ||
1191 | aniState->spurImmunityLevel = level; | ||
1192 | break; | ||
1193 | } | ||
1194 | case ATH9K_ANI_PRESENT: | ||
1195 | break; | ||
1196 | default: | ||
1197 | ath_print(common, ATH_DBG_ANI, | ||
1198 | "invalid cmd %u\n", cmd); | ||
1199 | return false; | ||
1200 | } | ||
1201 | |||
1202 | ath_print(common, ATH_DBG_ANI, "ANI parameters:\n"); | ||
1203 | ath_print(common, ATH_DBG_ANI, | ||
1204 | "noiseImmunityLevel=%d, spurImmunityLevel=%d, " | ||
1205 | "ofdmWeakSigDetectOff=%d\n", | ||
1206 | aniState->noiseImmunityLevel, | ||
1207 | aniState->spurImmunityLevel, | ||
1208 | !aniState->ofdmWeakSigDetectOff); | ||
1209 | ath_print(common, ATH_DBG_ANI, | ||
1210 | "cckWeakSigThreshold=%d, " | ||
1211 | "firstepLevel=%d, listenTime=%d\n", | ||
1212 | aniState->cckWeakSigThreshold, | ||
1213 | aniState->firstepLevel, | ||
1214 | aniState->listenTime); | ||
1215 | ath_print(common, ATH_DBG_ANI, | ||
1216 | "cycleCount=%d, ofdmPhyErrCount=%d, cckPhyErrCount=%d\n\n", | ||
1217 | aniState->cycleCount, | ||
1218 | aniState->ofdmPhyErrCount, | ||
1219 | aniState->cckPhyErrCount); | ||
1220 | |||
1221 | return true; | ||
1222 | } | ||
1223 | |||
1224 | static void ar5008_hw_do_getnf(struct ath_hw *ah, | ||
1225 | int16_t nfarray[NUM_NF_READINGS]) | ||
1226 | { | ||
1227 | struct ath_common *common = ath9k_hw_common(ah); | ||
1228 | int16_t nf; | ||
1229 | |||
1230 | nf = MS(REG_READ(ah, AR_PHY_CCA), AR_PHY_MINCCA_PWR); | ||
1231 | if (nf & 0x100) | ||
1232 | nf = 0 - ((nf ^ 0x1ff) + 1); | ||
1233 | ath_print(common, ATH_DBG_CALIBRATE, | ||
1234 | "NF calibrated [ctl] [chain 0] is %d\n", nf); | ||
1235 | nfarray[0] = nf; | ||
1236 | |||
1237 | nf = MS(REG_READ(ah, AR_PHY_CH1_CCA), AR_PHY_CH1_MINCCA_PWR); | ||
1238 | if (nf & 0x100) | ||
1239 | nf = 0 - ((nf ^ 0x1ff) + 1); | ||
1240 | ath_print(common, ATH_DBG_CALIBRATE, | ||
1241 | "NF calibrated [ctl] [chain 1] is %d\n", nf); | ||
1242 | nfarray[1] = nf; | ||
1243 | |||
1244 | nf = MS(REG_READ(ah, AR_PHY_CH2_CCA), AR_PHY_CH2_MINCCA_PWR); | ||
1245 | if (nf & 0x100) | ||
1246 | nf = 0 - ((nf ^ 0x1ff) + 1); | ||
1247 | ath_print(common, ATH_DBG_CALIBRATE, | ||
1248 | "NF calibrated [ctl] [chain 2] is %d\n", nf); | ||
1249 | nfarray[2] = nf; | ||
1250 | |||
1251 | nf = MS(REG_READ(ah, AR_PHY_EXT_CCA), AR_PHY_EXT_MINCCA_PWR); | ||
1252 | if (nf & 0x100) | ||
1253 | nf = 0 - ((nf ^ 0x1ff) + 1); | ||
1254 | ath_print(common, ATH_DBG_CALIBRATE, | ||
1255 | "NF calibrated [ext] [chain 0] is %d\n", nf); | ||
1256 | nfarray[3] = nf; | ||
1257 | |||
1258 | nf = MS(REG_READ(ah, AR_PHY_CH1_EXT_CCA), AR_PHY_CH1_EXT_MINCCA_PWR); | ||
1259 | if (nf & 0x100) | ||
1260 | nf = 0 - ((nf ^ 0x1ff) + 1); | ||
1261 | ath_print(common, ATH_DBG_CALIBRATE, | ||
1262 | "NF calibrated [ext] [chain 1] is %d\n", nf); | ||
1263 | nfarray[4] = nf; | ||
1264 | |||
1265 | nf = MS(REG_READ(ah, AR_PHY_CH2_EXT_CCA), AR_PHY_CH2_EXT_MINCCA_PWR); | ||
1266 | if (nf & 0x100) | ||
1267 | nf = 0 - ((nf ^ 0x1ff) + 1); | ||
1268 | ath_print(common, ATH_DBG_CALIBRATE, | ||
1269 | "NF calibrated [ext] [chain 2] is %d\n", nf); | ||
1270 | nfarray[5] = nf; | ||
1271 | } | ||
1272 | |||
1273 | static void ar5008_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan) | ||
1274 | { | ||
1275 | struct ath9k_nfcal_hist *h; | ||
1276 | int i, j; | ||
1277 | int32_t val; | ||
1278 | const u32 ar5416_cca_regs[6] = { | ||
1279 | AR_PHY_CCA, | ||
1280 | AR_PHY_CH1_CCA, | ||
1281 | AR_PHY_CH2_CCA, | ||
1282 | AR_PHY_EXT_CCA, | ||
1283 | AR_PHY_CH1_EXT_CCA, | ||
1284 | AR_PHY_CH2_EXT_CCA | ||
1285 | }; | ||
1286 | u8 chainmask, rx_chain_status; | ||
1287 | |||
1288 | rx_chain_status = REG_READ(ah, AR_PHY_RX_CHAINMASK); | ||
1289 | if (AR_SREV_9285(ah) || AR_SREV_9271(ah)) | ||
1290 | chainmask = 0x9; | ||
1291 | else if (AR_SREV_9280(ah) || AR_SREV_9287(ah)) { | ||
1292 | if ((rx_chain_status & 0x2) || (rx_chain_status & 0x4)) | ||
1293 | chainmask = 0x1B; | ||
1294 | else | ||
1295 | chainmask = 0x09; | ||
1296 | } else { | ||
1297 | if (rx_chain_status & 0x4) | ||
1298 | chainmask = 0x3F; | ||
1299 | else if (rx_chain_status & 0x2) | ||
1300 | chainmask = 0x1B; | ||
1301 | else | ||
1302 | chainmask = 0x09; | ||
1303 | } | ||
1304 | |||
1305 | h = ah->nfCalHist; | ||
1306 | |||
1307 | for (i = 0; i < NUM_NF_READINGS; i++) { | ||
1308 | if (chainmask & (1 << i)) { | ||
1309 | val = REG_READ(ah, ar5416_cca_regs[i]); | ||
1310 | val &= 0xFFFFFE00; | ||
1311 | val |= (((u32) (h[i].privNF) << 1) & 0x1ff); | ||
1312 | REG_WRITE(ah, ar5416_cca_regs[i], val); | ||
1313 | } | ||
1314 | } | ||
1315 | |||
1316 | REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, | ||
1317 | AR_PHY_AGC_CONTROL_ENABLE_NF); | ||
1318 | REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, | ||
1319 | AR_PHY_AGC_CONTROL_NO_UPDATE_NF); | ||
1320 | REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_NF); | ||
1321 | |||
1322 | for (j = 0; j < 5; j++) { | ||
1323 | if ((REG_READ(ah, AR_PHY_AGC_CONTROL) & | ||
1324 | AR_PHY_AGC_CONTROL_NF) == 0) | ||
1325 | break; | ||
1326 | udelay(50); | ||
1327 | } | ||
1328 | |||
1329 | ENABLE_REGWRITE_BUFFER(ah); | ||
1330 | |||
1331 | for (i = 0; i < NUM_NF_READINGS; i++) { | ||
1332 | if (chainmask & (1 << i)) { | ||
1333 | val = REG_READ(ah, ar5416_cca_regs[i]); | ||
1334 | val &= 0xFFFFFE00; | ||
1335 | val |= (((u32) (-50) << 1) & 0x1ff); | ||
1336 | REG_WRITE(ah, ar5416_cca_regs[i], val); | ||
1337 | } | ||
1338 | } | ||
1339 | |||
1340 | REGWRITE_BUFFER_FLUSH(ah); | ||
1341 | DISABLE_REGWRITE_BUFFER(ah); | ||
1342 | } | ||
1343 | |||
1344 | void ar5008_hw_attach_phy_ops(struct ath_hw *ah) | ||
1345 | { | ||
1346 | struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); | ||
1347 | |||
1348 | priv_ops->rf_set_freq = ar5008_hw_set_channel; | ||
1349 | priv_ops->spur_mitigate_freq = ar5008_hw_spur_mitigate; | ||
1350 | |||
1351 | priv_ops->rf_alloc_ext_banks = ar5008_hw_rf_alloc_ext_banks; | ||
1352 | priv_ops->rf_free_ext_banks = ar5008_hw_rf_free_ext_banks; | ||
1353 | priv_ops->set_rf_regs = ar5008_hw_set_rf_regs; | ||
1354 | priv_ops->set_channel_regs = ar5008_hw_set_channel_regs; | ||
1355 | priv_ops->init_bb = ar5008_hw_init_bb; | ||
1356 | priv_ops->process_ini = ar5008_hw_process_ini; | ||
1357 | priv_ops->set_rfmode = ar5008_hw_set_rfmode; | ||
1358 | priv_ops->mark_phy_inactive = ar5008_hw_mark_phy_inactive; | ||
1359 | priv_ops->set_delta_slope = ar5008_hw_set_delta_slope; | ||
1360 | priv_ops->rfbus_req = ar5008_hw_rfbus_req; | ||
1361 | priv_ops->rfbus_done = ar5008_hw_rfbus_done; | ||
1362 | priv_ops->enable_rfkill = ar5008_hw_enable_rfkill; | ||
1363 | priv_ops->restore_chainmask = ar5008_restore_chainmask; | ||
1364 | priv_ops->set_diversity = ar5008_set_diversity; | ||
1365 | priv_ops->ani_control = ar5008_hw_ani_control; | ||
1366 | priv_ops->do_getnf = ar5008_hw_do_getnf; | ||
1367 | priv_ops->loadnf = ar5008_hw_loadnf; | ||
1368 | |||
1369 | if (AR_SREV_9100(ah)) | ||
1370 | priv_ops->compute_pll_control = ar9100_hw_compute_pll_control; | ||
1371 | else if (AR_SREV_9160_10_OR_LATER(ah)) | ||
1372 | priv_ops->compute_pll_control = ar9160_hw_compute_pll_control; | ||
1373 | else | ||
1374 | priv_ops->compute_pll_control = ar5008_hw_compute_pll_control; | ||
1375 | } | ||
diff --git a/drivers/net/wireless/ath/ath9k/ar9001_initvals.h b/drivers/net/wireless/ath/ath9k/ar9001_initvals.h new file mode 100644 index 000000000000..0b94bd385b0a --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/ar9001_initvals.h | |||
@@ -0,0 +1,1254 @@ | |||
1 | |||
2 | static const u32 ar5416Common_9100[][2] = { | ||
3 | { 0x0000000c, 0x00000000 }, | ||
4 | { 0x00000030, 0x00020015 }, | ||
5 | { 0x00000034, 0x00000005 }, | ||
6 | { 0x00000040, 0x00000000 }, | ||
7 | { 0x00000044, 0x00000008 }, | ||
8 | { 0x00000048, 0x00000008 }, | ||
9 | { 0x0000004c, 0x00000010 }, | ||
10 | { 0x00000050, 0x00000000 }, | ||
11 | { 0x00000054, 0x0000001f }, | ||
12 | { 0x00000800, 0x00000000 }, | ||
13 | { 0x00000804, 0x00000000 }, | ||
14 | { 0x00000808, 0x00000000 }, | ||
15 | { 0x0000080c, 0x00000000 }, | ||
16 | { 0x00000810, 0x00000000 }, | ||
17 | { 0x00000814, 0x00000000 }, | ||
18 | { 0x00000818, 0x00000000 }, | ||
19 | { 0x0000081c, 0x00000000 }, | ||
20 | { 0x00000820, 0x00000000 }, | ||
21 | { 0x00000824, 0x00000000 }, | ||
22 | { 0x00001040, 0x002ffc0f }, | ||
23 | { 0x00001044, 0x002ffc0f }, | ||
24 | { 0x00001048, 0x002ffc0f }, | ||
25 | { 0x0000104c, 0x002ffc0f }, | ||
26 | { 0x00001050, 0x002ffc0f }, | ||
27 | { 0x00001054, 0x002ffc0f }, | ||
28 | { 0x00001058, 0x002ffc0f }, | ||
29 | { 0x0000105c, 0x002ffc0f }, | ||
30 | { 0x00001060, 0x002ffc0f }, | ||
31 | { 0x00001064, 0x002ffc0f }, | ||
32 | { 0x00001230, 0x00000000 }, | ||
33 | { 0x00001270, 0x00000000 }, | ||
34 | { 0x00001038, 0x00000000 }, | ||
35 | { 0x00001078, 0x00000000 }, | ||
36 | { 0x000010b8, 0x00000000 }, | ||
37 | { 0x000010f8, 0x00000000 }, | ||
38 | { 0x00001138, 0x00000000 }, | ||
39 | { 0x00001178, 0x00000000 }, | ||
40 | { 0x000011b8, 0x00000000 }, | ||
41 | { 0x000011f8, 0x00000000 }, | ||
42 | { 0x00001238, 0x00000000 }, | ||
43 | { 0x00001278, 0x00000000 }, | ||
44 | { 0x000012b8, 0x00000000 }, | ||
45 | { 0x000012f8, 0x00000000 }, | ||
46 | { 0x00001338, 0x00000000 }, | ||
47 | { 0x00001378, 0x00000000 }, | ||
48 | { 0x000013b8, 0x00000000 }, | ||
49 | { 0x000013f8, 0x00000000 }, | ||
50 | { 0x00001438, 0x00000000 }, | ||
51 | { 0x00001478, 0x00000000 }, | ||
52 | { 0x000014b8, 0x00000000 }, | ||
53 | { 0x000014f8, 0x00000000 }, | ||
54 | { 0x00001538, 0x00000000 }, | ||
55 | { 0x00001578, 0x00000000 }, | ||
56 | { 0x000015b8, 0x00000000 }, | ||
57 | { 0x000015f8, 0x00000000 }, | ||
58 | { 0x00001638, 0x00000000 }, | ||
59 | { 0x00001678, 0x00000000 }, | ||
60 | { 0x000016b8, 0x00000000 }, | ||
61 | { 0x000016f8, 0x00000000 }, | ||
62 | { 0x00001738, 0x00000000 }, | ||
63 | { 0x00001778, 0x00000000 }, | ||
64 | { 0x000017b8, 0x00000000 }, | ||
65 | { 0x000017f8, 0x00000000 }, | ||
66 | { 0x0000103c, 0x00000000 }, | ||
67 | { 0x0000107c, 0x00000000 }, | ||
68 | { 0x000010bc, 0x00000000 }, | ||
69 | { 0x000010fc, 0x00000000 }, | ||
70 | { 0x0000113c, 0x00000000 }, | ||
71 | { 0x0000117c, 0x00000000 }, | ||
72 | { 0x000011bc, 0x00000000 }, | ||
73 | { 0x000011fc, 0x00000000 }, | ||
74 | { 0x0000123c, 0x00000000 }, | ||
75 | { 0x0000127c, 0x00000000 }, | ||
76 | { 0x000012bc, 0x00000000 }, | ||
77 | { 0x000012fc, 0x00000000 }, | ||
78 | { 0x0000133c, 0x00000000 }, | ||
79 | { 0x0000137c, 0x00000000 }, | ||
80 | { 0x000013bc, 0x00000000 }, | ||
81 | { 0x000013fc, 0x00000000 }, | ||
82 | { 0x0000143c, 0x00000000 }, | ||
83 | { 0x0000147c, 0x00000000 }, | ||
84 | { 0x00020010, 0x00000003 }, | ||
85 | { 0x00020038, 0x000004c2 }, | ||
86 | { 0x00008004, 0x00000000 }, | ||
87 | { 0x00008008, 0x00000000 }, | ||
88 | { 0x0000800c, 0x00000000 }, | ||
89 | { 0x00008018, 0x00000700 }, | ||
90 | { 0x00008020, 0x00000000 }, | ||
91 | { 0x00008038, 0x00000000 }, | ||
92 | { 0x0000803c, 0x00000000 }, | ||
93 | { 0x00008048, 0x40000000 }, | ||
94 | { 0x00008054, 0x00004000 }, | ||
95 | { 0x00008058, 0x00000000 }, | ||
96 | { 0x0000805c, 0x000fc78f }, | ||
97 | { 0x00008060, 0x0000000f }, | ||
98 | { 0x00008064, 0x00000000 }, | ||
99 | { 0x000080c0, 0x2a82301a }, | ||
100 | { 0x000080c4, 0x05dc01e0 }, | ||
101 | { 0x000080c8, 0x1f402710 }, | ||
102 | { 0x000080cc, 0x01f40000 }, | ||
103 | { 0x000080d0, 0x00001e00 }, | ||
104 | { 0x000080d4, 0x00000000 }, | ||
105 | { 0x000080d8, 0x00400000 }, | ||
106 | { 0x000080e0, 0xffffffff }, | ||
107 | { 0x000080e4, 0x0000ffff }, | ||
108 | { 0x000080e8, 0x003f3f3f }, | ||
109 | { 0x000080ec, 0x00000000 }, | ||
110 | { 0x000080f0, 0x00000000 }, | ||
111 | { 0x000080f4, 0x00000000 }, | ||
112 | { 0x000080f8, 0x00000000 }, | ||
113 | { 0x000080fc, 0x00020000 }, | ||
114 | { 0x00008100, 0x00020000 }, | ||
115 | { 0x00008104, 0x00000001 }, | ||
116 | { 0x00008108, 0x00000052 }, | ||
117 | { 0x0000810c, 0x00000000 }, | ||
118 | { 0x00008110, 0x00000168 }, | ||
119 | { 0x00008118, 0x000100aa }, | ||
120 | { 0x0000811c, 0x00003210 }, | ||
121 | { 0x00008120, 0x08f04800 }, | ||
122 | { 0x00008124, 0x00000000 }, | ||
123 | { 0x00008128, 0x00000000 }, | ||
124 | { 0x0000812c, 0x00000000 }, | ||
125 | { 0x00008130, 0x00000000 }, | ||
126 | { 0x00008134, 0x00000000 }, | ||
127 | { 0x00008138, 0x00000000 }, | ||
128 | { 0x0000813c, 0x00000000 }, | ||
129 | { 0x00008144, 0x00000000 }, | ||
130 | { 0x00008168, 0x00000000 }, | ||
131 | { 0x0000816c, 0x00000000 }, | ||
132 | { 0x00008170, 0x32143320 }, | ||
133 | { 0x00008174, 0xfaa4fa50 }, | ||
134 | { 0x00008178, 0x00000100 }, | ||
135 | { 0x0000817c, 0x00000000 }, | ||
136 | { 0x000081c4, 0x00000000 }, | ||
137 | { 0x000081d0, 0x00003210 }, | ||
138 | { 0x000081ec, 0x00000000 }, | ||
139 | { 0x000081f0, 0x00000000 }, | ||
140 | { 0x000081f4, 0x00000000 }, | ||
141 | { 0x000081f8, 0x00000000 }, | ||
142 | { 0x000081fc, 0x00000000 }, | ||
143 | { 0x00008200, 0x00000000 }, | ||
144 | { 0x00008204, 0x00000000 }, | ||
145 | { 0x00008208, 0x00000000 }, | ||
146 | { 0x0000820c, 0x00000000 }, | ||
147 | { 0x00008210, 0x00000000 }, | ||
148 | { 0x00008214, 0x00000000 }, | ||
149 | { 0x00008218, 0x00000000 }, | ||
150 | { 0x0000821c, 0x00000000 }, | ||
151 | { 0x00008220, 0x00000000 }, | ||
152 | { 0x00008224, 0x00000000 }, | ||
153 | { 0x00008228, 0x00000000 }, | ||
154 | { 0x0000822c, 0x00000000 }, | ||
155 | { 0x00008230, 0x00000000 }, | ||
156 | { 0x00008234, 0x00000000 }, | ||
157 | { 0x00008238, 0x00000000 }, | ||
158 | { 0x0000823c, 0x00000000 }, | ||
159 | { 0x00008240, 0x00100000 }, | ||
160 | { 0x00008244, 0x0010f400 }, | ||
161 | { 0x00008248, 0x00000100 }, | ||
162 | { 0x0000824c, 0x0001e800 }, | ||
163 | { 0x00008250, 0x00000000 }, | ||
164 | { 0x00008254, 0x00000000 }, | ||
165 | { 0x00008258, 0x00000000 }, | ||
166 | { 0x0000825c, 0x400000ff }, | ||
167 | { 0x00008260, 0x00080922 }, | ||
168 | { 0x00008270, 0x00000000 }, | ||
169 | { 0x00008274, 0x40000000 }, | ||
170 | { 0x00008278, 0x003e4180 }, | ||
171 | { 0x0000827c, 0x00000000 }, | ||
172 | { 0x00008284, 0x0000002c }, | ||
173 | { 0x00008288, 0x0000002c }, | ||
174 | { 0x0000828c, 0x00000000 }, | ||
175 | { 0x00008294, 0x00000000 }, | ||
176 | { 0x00008298, 0x00000000 }, | ||
177 | { 0x00008300, 0x00000000 }, | ||
178 | { 0x00008304, 0x00000000 }, | ||
179 | { 0x00008308, 0x00000000 }, | ||
180 | { 0x0000830c, 0x00000000 }, | ||
181 | { 0x00008310, 0x00000000 }, | ||
182 | { 0x00008314, 0x00000000 }, | ||
183 | { 0x00008318, 0x00000000 }, | ||
184 | { 0x00008328, 0x00000000 }, | ||
185 | { 0x0000832c, 0x00000007 }, | ||
186 | { 0x00008330, 0x00000302 }, | ||
187 | { 0x00008334, 0x00000e00 }, | ||
188 | { 0x00008338, 0x00000000 }, | ||
189 | { 0x0000833c, 0x00000000 }, | ||
190 | { 0x00008340, 0x000107ff }, | ||
191 | { 0x00009808, 0x00000000 }, | ||
192 | { 0x0000980c, 0xad848e19 }, | ||
193 | { 0x00009810, 0x7d14e000 }, | ||
194 | { 0x00009814, 0x9c0a9f6b }, | ||
195 | { 0x0000981c, 0x00000000 }, | ||
196 | { 0x0000982c, 0x0000a000 }, | ||
197 | { 0x00009830, 0x00000000 }, | ||
198 | { 0x0000983c, 0x00200400 }, | ||
199 | { 0x00009840, 0x206a01ae }, | ||
200 | { 0x0000984c, 0x1284233c }, | ||
201 | { 0x00009854, 0x00000859 }, | ||
202 | { 0x00009900, 0x00000000 }, | ||
203 | { 0x00009904, 0x00000000 }, | ||
204 | { 0x00009908, 0x00000000 }, | ||
205 | { 0x0000990c, 0x00000000 }, | ||
206 | { 0x0000991c, 0x10000fff }, | ||
207 | { 0x00009920, 0x05100000 }, | ||
208 | { 0x0000a920, 0x05100000 }, | ||
209 | { 0x0000b920, 0x05100000 }, | ||
210 | { 0x00009928, 0x00000001 }, | ||
211 | { 0x0000992c, 0x00000004 }, | ||
212 | { 0x00009934, 0x1e1f2022 }, | ||
213 | { 0x00009938, 0x0a0b0c0d }, | ||
214 | { 0x0000993c, 0x00000000 }, | ||
215 | { 0x00009948, 0x9280b212 }, | ||
216 | { 0x0000994c, 0x00020028 }, | ||
217 | { 0x0000c95c, 0x004b6a8e }, | ||
218 | { 0x0000c968, 0x000003ce }, | ||
219 | { 0x00009970, 0x190fb515 }, | ||
220 | { 0x00009974, 0x00000000 }, | ||
221 | { 0x00009978, 0x00000001 }, | ||
222 | { 0x0000997c, 0x00000000 }, | ||
223 | { 0x00009980, 0x00000000 }, | ||
224 | { 0x00009984, 0x00000000 }, | ||
225 | { 0x00009988, 0x00000000 }, | ||
226 | { 0x0000998c, 0x00000000 }, | ||
227 | { 0x00009990, 0x00000000 }, | ||
228 | { 0x00009994, 0x00000000 }, | ||
229 | { 0x00009998, 0x00000000 }, | ||
230 | { 0x0000999c, 0x00000000 }, | ||
231 | { 0x000099a0, 0x00000000 }, | ||
232 | { 0x000099a4, 0x00000001 }, | ||
233 | { 0x000099a8, 0x201fff00 }, | ||
234 | { 0x000099ac, 0x006f0000 }, | ||
235 | { 0x000099b0, 0x03051000 }, | ||
236 | { 0x000099dc, 0x00000000 }, | ||
237 | { 0x000099e0, 0x00000200 }, | ||
238 | { 0x000099e4, 0xaaaaaaaa }, | ||
239 | { 0x000099e8, 0x3c466478 }, | ||
240 | { 0x000099ec, 0x0cc80caa }, | ||
241 | { 0x000099fc, 0x00001042 }, | ||
242 | { 0x00009b00, 0x00000000 }, | ||
243 | { 0x00009b04, 0x00000001 }, | ||
244 | { 0x00009b08, 0x00000002 }, | ||
245 | { 0x00009b0c, 0x00000003 }, | ||
246 | { 0x00009b10, 0x00000004 }, | ||
247 | { 0x00009b14, 0x00000005 }, | ||
248 | { 0x00009b18, 0x00000008 }, | ||
249 | { 0x00009b1c, 0x00000009 }, | ||
250 | { 0x00009b20, 0x0000000a }, | ||
251 | { 0x00009b24, 0x0000000b }, | ||
252 | { 0x00009b28, 0x0000000c }, | ||
253 | { 0x00009b2c, 0x0000000d }, | ||
254 | { 0x00009b30, 0x00000010 }, | ||
255 | { 0x00009b34, 0x00000011 }, | ||
256 | { 0x00009b38, 0x00000012 }, | ||
257 | { 0x00009b3c, 0x00000013 }, | ||
258 | { 0x00009b40, 0x00000014 }, | ||
259 | { 0x00009b44, 0x00000015 }, | ||
260 | { 0x00009b48, 0x00000018 }, | ||
261 | { 0x00009b4c, 0x00000019 }, | ||
262 | { 0x00009b50, 0x0000001a }, | ||
263 | { 0x00009b54, 0x0000001b }, | ||
264 | { 0x00009b58, 0x0000001c }, | ||
265 | { 0x00009b5c, 0x0000001d }, | ||
266 | { 0x00009b60, 0x00000020 }, | ||
267 | { 0x00009b64, 0x00000021 }, | ||
268 | { 0x00009b68, 0x00000022 }, | ||
269 | { 0x00009b6c, 0x00000023 }, | ||
270 | { 0x00009b70, 0x00000024 }, | ||
271 | { 0x00009b74, 0x00000025 }, | ||
272 | { 0x00009b78, 0x00000028 }, | ||
273 | { 0x00009b7c, 0x00000029 }, | ||
274 | { 0x00009b80, 0x0000002a }, | ||
275 | { 0x00009b84, 0x0000002b }, | ||
276 | { 0x00009b88, 0x0000002c }, | ||
277 | { 0x00009b8c, 0x0000002d }, | ||
278 | { 0x00009b90, 0x00000030 }, | ||
279 | { 0x00009b94, 0x00000031 }, | ||
280 | { 0x00009b98, 0x00000032 }, | ||
281 | { 0x00009b9c, 0x00000033 }, | ||
282 | { 0x00009ba0, 0x00000034 }, | ||
283 | { 0x00009ba4, 0x00000035 }, | ||
284 | { 0x00009ba8, 0x00000035 }, | ||
285 | { 0x00009bac, 0x00000035 }, | ||
286 | { 0x00009bb0, 0x00000035 }, | ||
287 | { 0x00009bb4, 0x00000035 }, | ||
288 | { 0x00009bb8, 0x00000035 }, | ||
289 | { 0x00009bbc, 0x00000035 }, | ||
290 | { 0x00009bc0, 0x00000035 }, | ||
291 | { 0x00009bc4, 0x00000035 }, | ||
292 | { 0x00009bc8, 0x00000035 }, | ||
293 | { 0x00009bcc, 0x00000035 }, | ||
294 | { 0x00009bd0, 0x00000035 }, | ||
295 | { 0x00009bd4, 0x00000035 }, | ||
296 | { 0x00009bd8, 0x00000035 }, | ||
297 | { 0x00009bdc, 0x00000035 }, | ||
298 | { 0x00009be0, 0x00000035 }, | ||
299 | { 0x00009be4, 0x00000035 }, | ||
300 | { 0x00009be8, 0x00000035 }, | ||
301 | { 0x00009bec, 0x00000035 }, | ||
302 | { 0x00009bf0, 0x00000035 }, | ||
303 | { 0x00009bf4, 0x00000035 }, | ||
304 | { 0x00009bf8, 0x00000010 }, | ||
305 | { 0x00009bfc, 0x0000001a }, | ||
306 | { 0x0000a210, 0x40806333 }, | ||
307 | { 0x0000a214, 0x00106c10 }, | ||
308 | { 0x0000a218, 0x009c4060 }, | ||
309 | { 0x0000a220, 0x018830c6 }, | ||
310 | { 0x0000a224, 0x00000400 }, | ||
311 | { 0x0000a228, 0x001a0bb5 }, | ||
312 | { 0x0000a22c, 0x00000000 }, | ||
313 | { 0x0000a234, 0x20202020 }, | ||
314 | { 0x0000a238, 0x20202020 }, | ||
315 | { 0x0000a23c, 0x13c889ae }, | ||
316 | { 0x0000a240, 0x38490a20 }, | ||
317 | { 0x0000a244, 0x00007bb6 }, | ||
318 | { 0x0000a248, 0x0fff3ffc }, | ||
319 | { 0x0000a24c, 0x00000001 }, | ||
320 | { 0x0000a250, 0x0000a000 }, | ||
321 | { 0x0000a254, 0x00000000 }, | ||
322 | { 0x0000a258, 0x0cc75380 }, | ||
323 | { 0x0000a25c, 0x0f0f0f01 }, | ||
324 | { 0x0000a260, 0xdfa91f01 }, | ||
325 | { 0x0000a268, 0x00000001 }, | ||
326 | { 0x0000a26c, 0x0ebae9c6 }, | ||
327 | { 0x0000b26c, 0x0ebae9c6 }, | ||
328 | { 0x0000c26c, 0x0ebae9c6 }, | ||
329 | { 0x0000d270, 0x00820820 }, | ||
330 | { 0x0000a278, 0x1ce739ce }, | ||
331 | { 0x0000a27c, 0x050701ce }, | ||
332 | { 0x0000a338, 0x00000000 }, | ||
333 | { 0x0000a33c, 0x00000000 }, | ||
334 | { 0x0000a340, 0x00000000 }, | ||
335 | { 0x0000a344, 0x00000000 }, | ||
336 | { 0x0000a348, 0x3fffffff }, | ||
337 | { 0x0000a34c, 0x3fffffff }, | ||
338 | { 0x0000a350, 0x3fffffff }, | ||
339 | { 0x0000a354, 0x0003ffff }, | ||
340 | { 0x0000a358, 0x79a8aa33 }, | ||
341 | { 0x0000d35c, 0x07ffffef }, | ||
342 | { 0x0000d360, 0x0fffffe7 }, | ||
343 | { 0x0000d364, 0x17ffffe5 }, | ||
344 | { 0x0000d368, 0x1fffffe4 }, | ||
345 | { 0x0000d36c, 0x37ffffe3 }, | ||
346 | { 0x0000d370, 0x3fffffe3 }, | ||
347 | { 0x0000d374, 0x57ffffe3 }, | ||
348 | { 0x0000d378, 0x5fffffe2 }, | ||
349 | { 0x0000d37c, 0x7fffffe2 }, | ||
350 | { 0x0000d380, 0x7f3c7bba }, | ||
351 | { 0x0000d384, 0xf3307ff0 }, | ||
352 | { 0x0000a388, 0x0c000000 }, | ||
353 | { 0x0000a38c, 0x20202020 }, | ||
354 | { 0x0000a390, 0x20202020 }, | ||
355 | { 0x0000a394, 0x1ce739ce }, | ||
356 | { 0x0000a398, 0x000001ce }, | ||
357 | { 0x0000a39c, 0x00000001 }, | ||
358 | { 0x0000a3a0, 0x00000000 }, | ||
359 | { 0x0000a3a4, 0x00000000 }, | ||
360 | { 0x0000a3a8, 0x00000000 }, | ||
361 | { 0x0000a3ac, 0x00000000 }, | ||
362 | { 0x0000a3b0, 0x00000000 }, | ||
363 | { 0x0000a3b4, 0x00000000 }, | ||
364 | { 0x0000a3b8, 0x00000000 }, | ||
365 | { 0x0000a3bc, 0x00000000 }, | ||
366 | { 0x0000a3c0, 0x00000000 }, | ||
367 | { 0x0000a3c4, 0x00000000 }, | ||
368 | { 0x0000a3c8, 0x00000246 }, | ||
369 | { 0x0000a3cc, 0x20202020 }, | ||
370 | { 0x0000a3d0, 0x20202020 }, | ||
371 | { 0x0000a3d4, 0x20202020 }, | ||
372 | { 0x0000a3dc, 0x1ce739ce }, | ||
373 | { 0x0000a3e0, 0x000001ce }, | ||
374 | }; | ||
375 | |||
376 | static const u32 ar5416Bank0_9100[][2] = { | ||
377 | { 0x000098b0, 0x1e5795e5 }, | ||
378 | { 0x000098e0, 0x02008020 }, | ||
379 | }; | ||
380 | |||
381 | static const u32 ar5416BB_RfGain_9100[][3] = { | ||
382 | { 0x00009a00, 0x00000000, 0x00000000 }, | ||
383 | { 0x00009a04, 0x00000040, 0x00000040 }, | ||
384 | { 0x00009a08, 0x00000080, 0x00000080 }, | ||
385 | { 0x00009a0c, 0x000001a1, 0x00000141 }, | ||
386 | { 0x00009a10, 0x000001e1, 0x00000181 }, | ||
387 | { 0x00009a14, 0x00000021, 0x000001c1 }, | ||
388 | { 0x00009a18, 0x00000061, 0x00000001 }, | ||
389 | { 0x00009a1c, 0x00000168, 0x00000041 }, | ||
390 | { 0x00009a20, 0x000001a8, 0x000001a8 }, | ||
391 | { 0x00009a24, 0x000001e8, 0x000001e8 }, | ||
392 | { 0x00009a28, 0x00000028, 0x00000028 }, | ||
393 | { 0x00009a2c, 0x00000068, 0x00000068 }, | ||
394 | { 0x00009a30, 0x00000189, 0x000000a8 }, | ||
395 | { 0x00009a34, 0x000001c9, 0x00000169 }, | ||
396 | { 0x00009a38, 0x00000009, 0x000001a9 }, | ||
397 | { 0x00009a3c, 0x00000049, 0x000001e9 }, | ||
398 | { 0x00009a40, 0x00000089, 0x00000029 }, | ||
399 | { 0x00009a44, 0x00000170, 0x00000069 }, | ||
400 | { 0x00009a48, 0x000001b0, 0x00000190 }, | ||
401 | { 0x00009a4c, 0x000001f0, 0x000001d0 }, | ||
402 | { 0x00009a50, 0x00000030, 0x00000010 }, | ||
403 | { 0x00009a54, 0x00000070, 0x00000050 }, | ||
404 | { 0x00009a58, 0x00000191, 0x00000090 }, | ||
405 | { 0x00009a5c, 0x000001d1, 0x00000151 }, | ||
406 | { 0x00009a60, 0x00000011, 0x00000191 }, | ||
407 | { 0x00009a64, 0x00000051, 0x000001d1 }, | ||
408 | { 0x00009a68, 0x00000091, 0x00000011 }, | ||
409 | { 0x00009a6c, 0x000001b8, 0x00000051 }, | ||
410 | { 0x00009a70, 0x000001f8, 0x00000198 }, | ||
411 | { 0x00009a74, 0x00000038, 0x000001d8 }, | ||
412 | { 0x00009a78, 0x00000078, 0x00000018 }, | ||
413 | { 0x00009a7c, 0x00000199, 0x00000058 }, | ||
414 | { 0x00009a80, 0x000001d9, 0x00000098 }, | ||
415 | { 0x00009a84, 0x00000019, 0x00000159 }, | ||
416 | { 0x00009a88, 0x00000059, 0x00000199 }, | ||
417 | { 0x00009a8c, 0x00000099, 0x000001d9 }, | ||
418 | { 0x00009a90, 0x000000d9, 0x00000019 }, | ||
419 | { 0x00009a94, 0x000000f9, 0x00000059 }, | ||
420 | { 0x00009a98, 0x000000f9, 0x00000099 }, | ||
421 | { 0x00009a9c, 0x000000f9, 0x000000d9 }, | ||
422 | { 0x00009aa0, 0x000000f9, 0x000000f9 }, | ||
423 | { 0x00009aa4, 0x000000f9, 0x000000f9 }, | ||
424 | { 0x00009aa8, 0x000000f9, 0x000000f9 }, | ||
425 | { 0x00009aac, 0x000000f9, 0x000000f9 }, | ||
426 | { 0x00009ab0, 0x000000f9, 0x000000f9 }, | ||
427 | { 0x00009ab4, 0x000000f9, 0x000000f9 }, | ||
428 | { 0x00009ab8, 0x000000f9, 0x000000f9 }, | ||
429 | { 0x00009abc, 0x000000f9, 0x000000f9 }, | ||
430 | { 0x00009ac0, 0x000000f9, 0x000000f9 }, | ||
431 | { 0x00009ac4, 0x000000f9, 0x000000f9 }, | ||
432 | { 0x00009ac8, 0x000000f9, 0x000000f9 }, | ||
433 | { 0x00009acc, 0x000000f9, 0x000000f9 }, | ||
434 | { 0x00009ad0, 0x000000f9, 0x000000f9 }, | ||
435 | { 0x00009ad4, 0x000000f9, 0x000000f9 }, | ||
436 | { 0x00009ad8, 0x000000f9, 0x000000f9 }, | ||
437 | { 0x00009adc, 0x000000f9, 0x000000f9 }, | ||
438 | { 0x00009ae0, 0x000000f9, 0x000000f9 }, | ||
439 | { 0x00009ae4, 0x000000f9, 0x000000f9 }, | ||
440 | { 0x00009ae8, 0x000000f9, 0x000000f9 }, | ||
441 | { 0x00009aec, 0x000000f9, 0x000000f9 }, | ||
442 | { 0x00009af0, 0x000000f9, 0x000000f9 }, | ||
443 | { 0x00009af4, 0x000000f9, 0x000000f9 }, | ||
444 | { 0x00009af8, 0x000000f9, 0x000000f9 }, | ||
445 | { 0x00009afc, 0x000000f9, 0x000000f9 }, | ||
446 | }; | ||
447 | |||
448 | static const u32 ar5416Bank1_9100[][2] = { | ||
449 | { 0x000098b0, 0x02108421}, | ||
450 | { 0x000098ec, 0x00000008}, | ||
451 | }; | ||
452 | |||
453 | static const u32 ar5416Bank2_9100[][2] = { | ||
454 | { 0x000098b0, 0x0e73ff17}, | ||
455 | { 0x000098e0, 0x00000420}, | ||
456 | }; | ||
457 | |||
458 | static const u32 ar5416Bank3_9100[][3] = { | ||
459 | { 0x000098f0, 0x01400018, 0x01c00018 }, | ||
460 | }; | ||
461 | |||
462 | static const u32 ar5416Bank6_9100[][3] = { | ||
463 | |||
464 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
465 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
466 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
467 | { 0x0000989c, 0x00e00000, 0x00e00000 }, | ||
468 | { 0x0000989c, 0x005e0000, 0x005e0000 }, | ||
469 | { 0x0000989c, 0x00120000, 0x00120000 }, | ||
470 | { 0x0000989c, 0x00620000, 0x00620000 }, | ||
471 | { 0x0000989c, 0x00020000, 0x00020000 }, | ||
472 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
473 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
474 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
475 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
476 | { 0x0000989c, 0x005f0000, 0x005f0000 }, | ||
477 | { 0x0000989c, 0x00870000, 0x00870000 }, | ||
478 | { 0x0000989c, 0x00f90000, 0x00f90000 }, | ||
479 | { 0x0000989c, 0x007b0000, 0x007b0000 }, | ||
480 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
481 | { 0x0000989c, 0x00f50000, 0x00f50000 }, | ||
482 | { 0x0000989c, 0x00dc0000, 0x00dc0000 }, | ||
483 | { 0x0000989c, 0x00110000, 0x00110000 }, | ||
484 | { 0x0000989c, 0x006100a8, 0x006100a8 }, | ||
485 | { 0x0000989c, 0x004210a2, 0x004210a2 }, | ||
486 | { 0x0000989c, 0x0014000f, 0x0014000f }, | ||
487 | { 0x0000989c, 0x00c40002, 0x00c40002 }, | ||
488 | { 0x0000989c, 0x003000f2, 0x003000f2 }, | ||
489 | { 0x0000989c, 0x00440016, 0x00440016 }, | ||
490 | { 0x0000989c, 0x00410040, 0x00410040 }, | ||
491 | { 0x0000989c, 0x000180d6, 0x000180d6 }, | ||
492 | { 0x0000989c, 0x0000c0aa, 0x0000c0aa }, | ||
493 | { 0x0000989c, 0x000000b1, 0x000000b1 }, | ||
494 | { 0x0000989c, 0x00002000, 0x00002000 }, | ||
495 | { 0x0000989c, 0x000000d4, 0x000000d4 }, | ||
496 | { 0x000098d0, 0x0000000f, 0x0010000f }, | ||
497 | }; | ||
498 | |||
499 | |||
500 | static const u32 ar5416Bank6TPC_9100[][3] = { | ||
501 | |||
502 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
503 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
504 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
505 | { 0x0000989c, 0x00e00000, 0x00e00000 }, | ||
506 | { 0x0000989c, 0x005e0000, 0x005e0000 }, | ||
507 | { 0x0000989c, 0x00120000, 0x00120000 }, | ||
508 | { 0x0000989c, 0x00620000, 0x00620000 }, | ||
509 | { 0x0000989c, 0x00020000, 0x00020000 }, | ||
510 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
511 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
512 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
513 | { 0x0000989c, 0x40ff0000, 0x40ff0000 }, | ||
514 | { 0x0000989c, 0x005f0000, 0x005f0000 }, | ||
515 | { 0x0000989c, 0x00870000, 0x00870000 }, | ||
516 | { 0x0000989c, 0x00f90000, 0x00f90000 }, | ||
517 | { 0x0000989c, 0x007b0000, 0x007b0000 }, | ||
518 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
519 | { 0x0000989c, 0x00f50000, 0x00f50000 }, | ||
520 | { 0x0000989c, 0x00dc0000, 0x00dc0000 }, | ||
521 | { 0x0000989c, 0x00110000, 0x00110000 }, | ||
522 | { 0x0000989c, 0x006100a8, 0x006100a8 }, | ||
523 | { 0x0000989c, 0x00423022, 0x00423022 }, | ||
524 | { 0x0000989c, 0x2014008f, 0x2014008f }, | ||
525 | { 0x0000989c, 0x00c40002, 0x00c40002 }, | ||
526 | { 0x0000989c, 0x003000f2, 0x003000f2 }, | ||
527 | { 0x0000989c, 0x00440016, 0x00440016 }, | ||
528 | { 0x0000989c, 0x00410040, 0x00410040 }, | ||
529 | { 0x0000989c, 0x0001805e, 0x0001805e }, | ||
530 | { 0x0000989c, 0x0000c0ab, 0x0000c0ab }, | ||
531 | { 0x0000989c, 0x000000e1, 0x000000e1 }, | ||
532 | { 0x0000989c, 0x00007080, 0x00007080 }, | ||
533 | { 0x0000989c, 0x000000d4, 0x000000d4 }, | ||
534 | { 0x000098d0, 0x0000000f, 0x0010000f }, | ||
535 | }; | ||
536 | |||
537 | static const u32 ar5416Bank7_9100[][2] = { | ||
538 | { 0x0000989c, 0x00000500 }, | ||
539 | { 0x0000989c, 0x00000800 }, | ||
540 | { 0x000098cc, 0x0000000e }, | ||
541 | }; | ||
542 | |||
543 | static const u32 ar5416Addac_9100[][2] = { | ||
544 | {0x0000989c, 0x00000000 }, | ||
545 | {0x0000989c, 0x00000000 }, | ||
546 | {0x0000989c, 0x00000000 }, | ||
547 | {0x0000989c, 0x00000000 }, | ||
548 | {0x0000989c, 0x00000000 }, | ||
549 | {0x0000989c, 0x00000000 }, | ||
550 | {0x0000989c, 0x00000000 }, | ||
551 | {0x0000989c, 0x00000010 }, | ||
552 | {0x0000989c, 0x00000000 }, | ||
553 | {0x0000989c, 0x00000000 }, | ||
554 | {0x0000989c, 0x00000000 }, | ||
555 | {0x0000989c, 0x00000000 }, | ||
556 | {0x0000989c, 0x00000000 }, | ||
557 | {0x0000989c, 0x00000000 }, | ||
558 | {0x0000989c, 0x00000000 }, | ||
559 | {0x0000989c, 0x00000000 }, | ||
560 | {0x0000989c, 0x00000000 }, | ||
561 | {0x0000989c, 0x00000000 }, | ||
562 | {0x0000989c, 0x00000000 }, | ||
563 | {0x0000989c, 0x00000000 }, | ||
564 | {0x0000989c, 0x00000000 }, | ||
565 | {0x0000989c, 0x000000c0 }, | ||
566 | {0x0000989c, 0x00000015 }, | ||
567 | {0x0000989c, 0x00000000 }, | ||
568 | {0x0000989c, 0x00000000 }, | ||
569 | {0x0000989c, 0x00000000 }, | ||
570 | {0x0000989c, 0x00000000 }, | ||
571 | {0x0000989c, 0x00000000 }, | ||
572 | {0x0000989c, 0x00000000 }, | ||
573 | {0x0000989c, 0x00000000 }, | ||
574 | {0x0000989c, 0x00000000 }, | ||
575 | {0x000098cc, 0x00000000 }, | ||
576 | }; | ||
577 | |||
578 | static const u32 ar5416Modes_9160[][6] = { | ||
579 | { 0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160, 0x000001e0 }, | ||
580 | { 0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c, 0x000001e0 }, | ||
581 | { 0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38, 0x00001180 }, | ||
582 | { 0x000010f0, 0x0000a000, 0x00014000, 0x00016000, 0x0000b000, 0x00014008 }, | ||
583 | { 0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00, 0x06e006e0 }, | ||
584 | { 0x0000801c, 0x128d93a7, 0x128d93cf, 0x12e013d7, 0x12e013ab, 0x098813cf }, | ||
585 | { 0x00009804, 0x00000300, 0x000003c4, 0x000003c4, 0x00000300, 0x00000303 }, | ||
586 | { 0x00009820, 0x02020200, 0x02020200, 0x02020200, 0x02020200, 0x02020200 }, | ||
587 | { 0x00009824, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e }, | ||
588 | { 0x00009828, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001 }, | ||
589 | { 0x00009834, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e }, | ||
590 | { 0x00009838, 0x00000007, 0x00000007, 0x00000007, 0x00000007, 0x00000007 }, | ||
591 | { 0x00009844, 0x0372161e, 0x0372161e, 0x037216a0, 0x037216a0, 0x037216a0 }, | ||
592 | { 0x00009848, 0x001a6a65, 0x001a6a65, 0x00197a68, 0x00197a68, 0x00197a68 }, | ||
593 | { 0x0000a848, 0x001a6a65, 0x001a6a65, 0x00197a68, 0x00197a68, 0x00197a68 }, | ||
594 | { 0x0000b848, 0x001a6a65, 0x001a6a65, 0x00197a68, 0x00197a68, 0x00197a68 }, | ||
595 | { 0x00009850, 0x6c48b4e2, 0x6c48b4e2, 0x6c48b0e2, 0x6c48b0e2, 0x6c48b0e2 }, | ||
596 | { 0x00009858, 0x7ec82d2e, 0x7ec82d2e, 0x7ec82d2e, 0x7ec82d2e, 0x7ec82d2e }, | ||
597 | { 0x0000985c, 0x31395d5e, 0x31395d5e, 0x31395d5e, 0x31395d5e, 0x31395d5e }, | ||
598 | { 0x00009860, 0x00048d18, 0x00048d18, 0x00048d20, 0x00048d20, 0x00048d18 }, | ||
599 | { 0x0000c864, 0x0001ce00, 0x0001ce00, 0x0001ce00, 0x0001ce00, 0x0001ce00 }, | ||
600 | { 0x00009868, 0x409a40d0, 0x409a40d0, 0x409a40d0, 0x409a40d0, 0x409a40d0 }, | ||
601 | { 0x0000986c, 0x050cb081, 0x050cb081, 0x050cb081, 0x050cb081, 0x050cb081 }, | ||
602 | { 0x00009914, 0x000007d0, 0x00000fa0, 0x00001130, 0x00000898, 0x000007d0 }, | ||
603 | { 0x00009918, 0x0000000a, 0x00000014, 0x00000016, 0x0000000b, 0x00000016 }, | ||
604 | { 0x00009924, 0xd00a8a07, 0xd00a8a07, 0xd00a8a0d, 0xd00a8a0d, 0xd00a8a0d }, | ||
605 | { 0x00009944, 0xffb81020, 0xffb81020, 0xffb81020, 0xffb81020, 0xffb81020 }, | ||
606 | { 0x00009960, 0x00009b40, 0x00009b40, 0x00009b40, 0x00009b40, 0x00009b40 }, | ||
607 | { 0x0000a960, 0x00009b40, 0x00009b40, 0x00009b40, 0x00009b40, 0x00009b40 }, | ||
608 | { 0x0000b960, 0x00009b40, 0x00009b40, 0x00009b40, 0x00009b40, 0x00009b40 }, | ||
609 | { 0x00009964, 0x00001120, 0x00001120, 0x00001120, 0x00001120, 0x00001120 }, | ||
610 | { 0x0000c968, 0x000003b5, 0x000003b5, 0x000003ce, 0x000003ce, 0x000003ce }, | ||
611 | { 0x0000c9bc, 0x001a0600, 0x001a0600, 0x001a0c00, 0x001a0c00, 0x001a0c00 }, | ||
612 | { 0x000099c0, 0x038919be, 0x038919be, 0x038919be, 0x038919be, 0x038919be }, | ||
613 | { 0x000099c4, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77 }, | ||
614 | { 0x000099c8, 0x60f65329, 0x60f65329, 0x60f65329, 0x60f65329, 0x60f65329 }, | ||
615 | { 0x000099cc, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8 }, | ||
616 | { 0x000099d0, 0x00046384, 0x00046384, 0x00046384, 0x00046384, 0x00046384 }, | ||
617 | { 0x000099d4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
618 | { 0x000099d8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
619 | { 0x0000a204, 0x00000880, 0x00000880, 0x00000880, 0x00000880, 0x00000880 }, | ||
620 | { 0x0000a208, 0xd6be4788, 0xd6be4788, 0xd03e4788, 0xd03e4788, 0xd03e4788 }, | ||
621 | { 0x0000a20c, 0x002fc160, 0x002fc160, 0x002ac120, 0x002ac120, 0x002ac120 }, | ||
622 | { 0x0000b20c, 0x002fc160, 0x002fc160, 0x002ac120, 0x002ac120, 0x002ac120 }, | ||
623 | { 0x0000c20c, 0x002fc160, 0x002fc160, 0x002ac120, 0x002ac120, 0x002ac120 }, | ||
624 | { 0x0000a21c, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a }, | ||
625 | { 0x0000a230, 0x00000000, 0x00000000, 0x00000210, 0x00000108, 0x00000000 }, | ||
626 | { 0x0000a274, 0x0a1a9caa, 0x0a1a9caa, 0x0a1a7caa, 0x0a1a7caa, 0x0a1a7caa }, | ||
627 | { 0x0000a300, 0x18010000, 0x18010000, 0x18010000, 0x18010000, 0x18010000 }, | ||
628 | { 0x0000a304, 0x30032602, 0x30032602, 0x2e032402, 0x2e032402, 0x2e032402 }, | ||
629 | { 0x0000a308, 0x48073e06, 0x48073e06, 0x4a0a3c06, 0x4a0a3c06, 0x4a0a3c06 }, | ||
630 | { 0x0000a30c, 0x560b4c0a, 0x560b4c0a, 0x621a540b, 0x621a540b, 0x621a540b }, | ||
631 | { 0x0000a310, 0x641a600f, 0x641a600f, 0x764f6c1b, 0x764f6c1b, 0x764f6c1b }, | ||
632 | { 0x0000a314, 0x7a4f6e1b, 0x7a4f6e1b, 0x845b7a5a, 0x845b7a5a, 0x845b7a5a }, | ||
633 | { 0x0000a318, 0x8c5b7e5a, 0x8c5b7e5a, 0x950f8ccf, 0x950f8ccf, 0x950f8ccf }, | ||
634 | { 0x0000a31c, 0x9d0f96cf, 0x9d0f96cf, 0xa5cf9b4f, 0xa5cf9b4f, 0xa5cf9b4f }, | ||
635 | { 0x0000a320, 0xb51fa69f, 0xb51fa69f, 0xbddfaf1f, 0xbddfaf1f, 0xbddfaf1f }, | ||
636 | { 0x0000a324, 0xcb3fbd07, 0xcb3fbcbf, 0xd1ffc93f, 0xd1ffc93f, 0xd1ffc93f }, | ||
637 | { 0x0000a328, 0x0000d7bf, 0x0000d7bf, 0x00000000, 0x00000000, 0x00000000 }, | ||
638 | { 0x0000a32c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
639 | { 0x0000a330, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
640 | { 0x0000a334, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
641 | }; | ||
642 | |||
643 | static const u32 ar5416Common_9160[][2] = { | ||
644 | { 0x0000000c, 0x00000000 }, | ||
645 | { 0x00000030, 0x00020015 }, | ||
646 | { 0x00000034, 0x00000005 }, | ||
647 | { 0x00000040, 0x00000000 }, | ||
648 | { 0x00000044, 0x00000008 }, | ||
649 | { 0x00000048, 0x00000008 }, | ||
650 | { 0x0000004c, 0x00000010 }, | ||
651 | { 0x00000050, 0x00000000 }, | ||
652 | { 0x00000054, 0x0000001f }, | ||
653 | { 0x00000800, 0x00000000 }, | ||
654 | { 0x00000804, 0x00000000 }, | ||
655 | { 0x00000808, 0x00000000 }, | ||
656 | { 0x0000080c, 0x00000000 }, | ||
657 | { 0x00000810, 0x00000000 }, | ||
658 | { 0x00000814, 0x00000000 }, | ||
659 | { 0x00000818, 0x00000000 }, | ||
660 | { 0x0000081c, 0x00000000 }, | ||
661 | { 0x00000820, 0x00000000 }, | ||
662 | { 0x00000824, 0x00000000 }, | ||
663 | { 0x00001040, 0x002ffc0f }, | ||
664 | { 0x00001044, 0x002ffc0f }, | ||
665 | { 0x00001048, 0x002ffc0f }, | ||
666 | { 0x0000104c, 0x002ffc0f }, | ||
667 | { 0x00001050, 0x002ffc0f }, | ||
668 | { 0x00001054, 0x002ffc0f }, | ||
669 | { 0x00001058, 0x002ffc0f }, | ||
670 | { 0x0000105c, 0x002ffc0f }, | ||
671 | { 0x00001060, 0x002ffc0f }, | ||
672 | { 0x00001064, 0x002ffc0f }, | ||
673 | { 0x00001230, 0x00000000 }, | ||
674 | { 0x00001270, 0x00000000 }, | ||
675 | { 0x00001038, 0x00000000 }, | ||
676 | { 0x00001078, 0x00000000 }, | ||
677 | { 0x000010b8, 0x00000000 }, | ||
678 | { 0x000010f8, 0x00000000 }, | ||
679 | { 0x00001138, 0x00000000 }, | ||
680 | { 0x00001178, 0x00000000 }, | ||
681 | { 0x000011b8, 0x00000000 }, | ||
682 | { 0x000011f8, 0x00000000 }, | ||
683 | { 0x00001238, 0x00000000 }, | ||
684 | { 0x00001278, 0x00000000 }, | ||
685 | { 0x000012b8, 0x00000000 }, | ||
686 | { 0x000012f8, 0x00000000 }, | ||
687 | { 0x00001338, 0x00000000 }, | ||
688 | { 0x00001378, 0x00000000 }, | ||
689 | { 0x000013b8, 0x00000000 }, | ||
690 | { 0x000013f8, 0x00000000 }, | ||
691 | { 0x00001438, 0x00000000 }, | ||
692 | { 0x00001478, 0x00000000 }, | ||
693 | { 0x000014b8, 0x00000000 }, | ||
694 | { 0x000014f8, 0x00000000 }, | ||
695 | { 0x00001538, 0x00000000 }, | ||
696 | { 0x00001578, 0x00000000 }, | ||
697 | { 0x000015b8, 0x00000000 }, | ||
698 | { 0x000015f8, 0x00000000 }, | ||
699 | { 0x00001638, 0x00000000 }, | ||
700 | { 0x00001678, 0x00000000 }, | ||
701 | { 0x000016b8, 0x00000000 }, | ||
702 | { 0x000016f8, 0x00000000 }, | ||
703 | { 0x00001738, 0x00000000 }, | ||
704 | { 0x00001778, 0x00000000 }, | ||
705 | { 0x000017b8, 0x00000000 }, | ||
706 | { 0x000017f8, 0x00000000 }, | ||
707 | { 0x0000103c, 0x00000000 }, | ||
708 | { 0x0000107c, 0x00000000 }, | ||
709 | { 0x000010bc, 0x00000000 }, | ||
710 | { 0x000010fc, 0x00000000 }, | ||
711 | { 0x0000113c, 0x00000000 }, | ||
712 | { 0x0000117c, 0x00000000 }, | ||
713 | { 0x000011bc, 0x00000000 }, | ||
714 | { 0x000011fc, 0x00000000 }, | ||
715 | { 0x0000123c, 0x00000000 }, | ||
716 | { 0x0000127c, 0x00000000 }, | ||
717 | { 0x000012bc, 0x00000000 }, | ||
718 | { 0x000012fc, 0x00000000 }, | ||
719 | { 0x0000133c, 0x00000000 }, | ||
720 | { 0x0000137c, 0x00000000 }, | ||
721 | { 0x000013bc, 0x00000000 }, | ||
722 | { 0x000013fc, 0x00000000 }, | ||
723 | { 0x0000143c, 0x00000000 }, | ||
724 | { 0x0000147c, 0x00000000 }, | ||
725 | { 0x00004030, 0x00000002 }, | ||
726 | { 0x0000403c, 0x00000002 }, | ||
727 | { 0x00007010, 0x00000020 }, | ||
728 | { 0x00007038, 0x000004c2 }, | ||
729 | { 0x00008004, 0x00000000 }, | ||
730 | { 0x00008008, 0x00000000 }, | ||
731 | { 0x0000800c, 0x00000000 }, | ||
732 | { 0x00008018, 0x00000700 }, | ||
733 | { 0x00008020, 0x00000000 }, | ||
734 | { 0x00008038, 0x00000000 }, | ||
735 | { 0x0000803c, 0x00000000 }, | ||
736 | { 0x00008048, 0x40000000 }, | ||
737 | { 0x00008054, 0x00000000 }, | ||
738 | { 0x00008058, 0x00000000 }, | ||
739 | { 0x0000805c, 0x000fc78f }, | ||
740 | { 0x00008060, 0x0000000f }, | ||
741 | { 0x00008064, 0x00000000 }, | ||
742 | { 0x000080c0, 0x2a82301a }, | ||
743 | { 0x000080c4, 0x05dc01e0 }, | ||
744 | { 0x000080c8, 0x1f402710 }, | ||
745 | { 0x000080cc, 0x01f40000 }, | ||
746 | { 0x000080d0, 0x00001e00 }, | ||
747 | { 0x000080d4, 0x00000000 }, | ||
748 | { 0x000080d8, 0x00400000 }, | ||
749 | { 0x000080e0, 0xffffffff }, | ||
750 | { 0x000080e4, 0x0000ffff }, | ||
751 | { 0x000080e8, 0x003f3f3f }, | ||
752 | { 0x000080ec, 0x00000000 }, | ||
753 | { 0x000080f0, 0x00000000 }, | ||
754 | { 0x000080f4, 0x00000000 }, | ||
755 | { 0x000080f8, 0x00000000 }, | ||
756 | { 0x000080fc, 0x00020000 }, | ||
757 | { 0x00008100, 0x00020000 }, | ||
758 | { 0x00008104, 0x00000001 }, | ||
759 | { 0x00008108, 0x00000052 }, | ||
760 | { 0x0000810c, 0x00000000 }, | ||
761 | { 0x00008110, 0x00000168 }, | ||
762 | { 0x00008118, 0x000100aa }, | ||
763 | { 0x0000811c, 0x00003210 }, | ||
764 | { 0x00008120, 0x08f04800 }, | ||
765 | { 0x00008124, 0x00000000 }, | ||
766 | { 0x00008128, 0x00000000 }, | ||
767 | { 0x0000812c, 0x00000000 }, | ||
768 | { 0x00008130, 0x00000000 }, | ||
769 | { 0x00008134, 0x00000000 }, | ||
770 | { 0x00008138, 0x00000000 }, | ||
771 | { 0x0000813c, 0x00000000 }, | ||
772 | { 0x00008144, 0xffffffff }, | ||
773 | { 0x00008168, 0x00000000 }, | ||
774 | { 0x0000816c, 0x00000000 }, | ||
775 | { 0x00008170, 0x32143320 }, | ||
776 | { 0x00008174, 0xfaa4fa50 }, | ||
777 | { 0x00008178, 0x00000100 }, | ||
778 | { 0x0000817c, 0x00000000 }, | ||
779 | { 0x000081c4, 0x00000000 }, | ||
780 | { 0x000081d0, 0x00003210 }, | ||
781 | { 0x000081ec, 0x00000000 }, | ||
782 | { 0x000081f0, 0x00000000 }, | ||
783 | { 0x000081f4, 0x00000000 }, | ||
784 | { 0x000081f8, 0x00000000 }, | ||
785 | { 0x000081fc, 0x00000000 }, | ||
786 | { 0x00008200, 0x00000000 }, | ||
787 | { 0x00008204, 0x00000000 }, | ||
788 | { 0x00008208, 0x00000000 }, | ||
789 | { 0x0000820c, 0x00000000 }, | ||
790 | { 0x00008210, 0x00000000 }, | ||
791 | { 0x00008214, 0x00000000 }, | ||
792 | { 0x00008218, 0x00000000 }, | ||
793 | { 0x0000821c, 0x00000000 }, | ||
794 | { 0x00008220, 0x00000000 }, | ||
795 | { 0x00008224, 0x00000000 }, | ||
796 | { 0x00008228, 0x00000000 }, | ||
797 | { 0x0000822c, 0x00000000 }, | ||
798 | { 0x00008230, 0x00000000 }, | ||
799 | { 0x00008234, 0x00000000 }, | ||
800 | { 0x00008238, 0x00000000 }, | ||
801 | { 0x0000823c, 0x00000000 }, | ||
802 | { 0x00008240, 0x00100000 }, | ||
803 | { 0x00008244, 0x0010f400 }, | ||
804 | { 0x00008248, 0x00000100 }, | ||
805 | { 0x0000824c, 0x0001e800 }, | ||
806 | { 0x00008250, 0x00000000 }, | ||
807 | { 0x00008254, 0x00000000 }, | ||
808 | { 0x00008258, 0x00000000 }, | ||
809 | { 0x0000825c, 0x400000ff }, | ||
810 | { 0x00008260, 0x00080922 }, | ||
811 | { 0x00008270, 0x00000000 }, | ||
812 | { 0x00008274, 0x40000000 }, | ||
813 | { 0x00008278, 0x003e4180 }, | ||
814 | { 0x0000827c, 0x00000000 }, | ||
815 | { 0x00008284, 0x0000002c }, | ||
816 | { 0x00008288, 0x0000002c }, | ||
817 | { 0x0000828c, 0x00000000 }, | ||
818 | { 0x00008294, 0x00000000 }, | ||
819 | { 0x00008298, 0x00000000 }, | ||
820 | { 0x00008300, 0x00000000 }, | ||
821 | { 0x00008304, 0x00000000 }, | ||
822 | { 0x00008308, 0x00000000 }, | ||
823 | { 0x0000830c, 0x00000000 }, | ||
824 | { 0x00008310, 0x00000000 }, | ||
825 | { 0x00008314, 0x00000000 }, | ||
826 | { 0x00008318, 0x00000000 }, | ||
827 | { 0x00008328, 0x00000000 }, | ||
828 | { 0x0000832c, 0x00000007 }, | ||
829 | { 0x00008330, 0x00000302 }, | ||
830 | { 0x00008334, 0x00000e00 }, | ||
831 | { 0x00008338, 0x00ff0000 }, | ||
832 | { 0x0000833c, 0x00000000 }, | ||
833 | { 0x00008340, 0x000107ff }, | ||
834 | { 0x00009808, 0x00000000 }, | ||
835 | { 0x0000980c, 0xad848e19 }, | ||
836 | { 0x00009810, 0x7d14e000 }, | ||
837 | { 0x00009814, 0x9c0a9f6b }, | ||
838 | { 0x0000981c, 0x00000000 }, | ||
839 | { 0x0000982c, 0x0000a000 }, | ||
840 | { 0x00009830, 0x00000000 }, | ||
841 | { 0x0000983c, 0x00200400 }, | ||
842 | { 0x00009840, 0x206a01ae }, | ||
843 | { 0x0000984c, 0x1284233c }, | ||
844 | { 0x00009854, 0x00000859 }, | ||
845 | { 0x00009900, 0x00000000 }, | ||
846 | { 0x00009904, 0x00000000 }, | ||
847 | { 0x00009908, 0x00000000 }, | ||
848 | { 0x0000990c, 0x00000000 }, | ||
849 | { 0x0000991c, 0x10000fff }, | ||
850 | { 0x00009920, 0x05100000 }, | ||
851 | { 0x0000a920, 0x05100000 }, | ||
852 | { 0x0000b920, 0x05100000 }, | ||
853 | { 0x00009928, 0x00000001 }, | ||
854 | { 0x0000992c, 0x00000004 }, | ||
855 | { 0x00009934, 0x1e1f2022 }, | ||
856 | { 0x00009938, 0x0a0b0c0d }, | ||
857 | { 0x0000993c, 0x00000000 }, | ||
858 | { 0x00009948, 0x9280b212 }, | ||
859 | { 0x0000994c, 0x00020028 }, | ||
860 | { 0x00009954, 0x5f3ca3de }, | ||
861 | { 0x00009958, 0x2108ecff }, | ||
862 | { 0x00009940, 0x00750604 }, | ||
863 | { 0x0000c95c, 0x004b6a8e }, | ||
864 | { 0x00009970, 0x190fb515 }, | ||
865 | { 0x00009974, 0x00000000 }, | ||
866 | { 0x00009978, 0x00000001 }, | ||
867 | { 0x0000997c, 0x00000000 }, | ||
868 | { 0x00009980, 0x00000000 }, | ||
869 | { 0x00009984, 0x00000000 }, | ||
870 | { 0x00009988, 0x00000000 }, | ||
871 | { 0x0000998c, 0x00000000 }, | ||
872 | { 0x00009990, 0x00000000 }, | ||
873 | { 0x00009994, 0x00000000 }, | ||
874 | { 0x00009998, 0x00000000 }, | ||
875 | { 0x0000999c, 0x00000000 }, | ||
876 | { 0x000099a0, 0x00000000 }, | ||
877 | { 0x000099a4, 0x00000001 }, | ||
878 | { 0x000099a8, 0x201fff00 }, | ||
879 | { 0x000099ac, 0x006f0000 }, | ||
880 | { 0x000099b0, 0x03051000 }, | ||
881 | { 0x000099dc, 0x00000000 }, | ||
882 | { 0x000099e0, 0x00000200 }, | ||
883 | { 0x000099e4, 0xaaaaaaaa }, | ||
884 | { 0x000099e8, 0x3c466478 }, | ||
885 | { 0x000099ec, 0x0cc80caa }, | ||
886 | { 0x000099fc, 0x00001042 }, | ||
887 | { 0x00009b00, 0x00000000 }, | ||
888 | { 0x00009b04, 0x00000001 }, | ||
889 | { 0x00009b08, 0x00000002 }, | ||
890 | { 0x00009b0c, 0x00000003 }, | ||
891 | { 0x00009b10, 0x00000004 }, | ||
892 | { 0x00009b14, 0x00000005 }, | ||
893 | { 0x00009b18, 0x00000008 }, | ||
894 | { 0x00009b1c, 0x00000009 }, | ||
895 | { 0x00009b20, 0x0000000a }, | ||
896 | { 0x00009b24, 0x0000000b }, | ||
897 | { 0x00009b28, 0x0000000c }, | ||
898 | { 0x00009b2c, 0x0000000d }, | ||
899 | { 0x00009b30, 0x00000010 }, | ||
900 | { 0x00009b34, 0x00000011 }, | ||
901 | { 0x00009b38, 0x00000012 }, | ||
902 | { 0x00009b3c, 0x00000013 }, | ||
903 | { 0x00009b40, 0x00000014 }, | ||
904 | { 0x00009b44, 0x00000015 }, | ||
905 | { 0x00009b48, 0x00000018 }, | ||
906 | { 0x00009b4c, 0x00000019 }, | ||
907 | { 0x00009b50, 0x0000001a }, | ||
908 | { 0x00009b54, 0x0000001b }, | ||
909 | { 0x00009b58, 0x0000001c }, | ||
910 | { 0x00009b5c, 0x0000001d }, | ||
911 | { 0x00009b60, 0x00000020 }, | ||
912 | { 0x00009b64, 0x00000021 }, | ||
913 | { 0x00009b68, 0x00000022 }, | ||
914 | { 0x00009b6c, 0x00000023 }, | ||
915 | { 0x00009b70, 0x00000024 }, | ||
916 | { 0x00009b74, 0x00000025 }, | ||
917 | { 0x00009b78, 0x00000028 }, | ||
918 | { 0x00009b7c, 0x00000029 }, | ||
919 | { 0x00009b80, 0x0000002a }, | ||
920 | { 0x00009b84, 0x0000002b }, | ||
921 | { 0x00009b88, 0x0000002c }, | ||
922 | { 0x00009b8c, 0x0000002d }, | ||
923 | { 0x00009b90, 0x00000030 }, | ||
924 | { 0x00009b94, 0x00000031 }, | ||
925 | { 0x00009b98, 0x00000032 }, | ||
926 | { 0x00009b9c, 0x00000033 }, | ||
927 | { 0x00009ba0, 0x00000034 }, | ||
928 | { 0x00009ba4, 0x00000035 }, | ||
929 | { 0x00009ba8, 0x00000035 }, | ||
930 | { 0x00009bac, 0x00000035 }, | ||
931 | { 0x00009bb0, 0x00000035 }, | ||
932 | { 0x00009bb4, 0x00000035 }, | ||
933 | { 0x00009bb8, 0x00000035 }, | ||
934 | { 0x00009bbc, 0x00000035 }, | ||
935 | { 0x00009bc0, 0x00000035 }, | ||
936 | { 0x00009bc4, 0x00000035 }, | ||
937 | { 0x00009bc8, 0x00000035 }, | ||
938 | { 0x00009bcc, 0x00000035 }, | ||
939 | { 0x00009bd0, 0x00000035 }, | ||
940 | { 0x00009bd4, 0x00000035 }, | ||
941 | { 0x00009bd8, 0x00000035 }, | ||
942 | { 0x00009bdc, 0x00000035 }, | ||
943 | { 0x00009be0, 0x00000035 }, | ||
944 | { 0x00009be4, 0x00000035 }, | ||
945 | { 0x00009be8, 0x00000035 }, | ||
946 | { 0x00009bec, 0x00000035 }, | ||
947 | { 0x00009bf0, 0x00000035 }, | ||
948 | { 0x00009bf4, 0x00000035 }, | ||
949 | { 0x00009bf8, 0x00000010 }, | ||
950 | { 0x00009bfc, 0x0000001a }, | ||
951 | { 0x0000a210, 0x40806333 }, | ||
952 | { 0x0000a214, 0x00106c10 }, | ||
953 | { 0x0000a218, 0x009c4060 }, | ||
954 | { 0x0000a220, 0x018830c6 }, | ||
955 | { 0x0000a224, 0x00000400 }, | ||
956 | { 0x0000a228, 0x001a0bb5 }, | ||
957 | { 0x0000a22c, 0x00000000 }, | ||
958 | { 0x0000a234, 0x20202020 }, | ||
959 | { 0x0000a238, 0x20202020 }, | ||
960 | { 0x0000a23c, 0x13c889af }, | ||
961 | { 0x0000a240, 0x38490a20 }, | ||
962 | { 0x0000a244, 0x00007bb6 }, | ||
963 | { 0x0000a248, 0x0fff3ffc }, | ||
964 | { 0x0000a24c, 0x00000001 }, | ||
965 | { 0x0000a250, 0x0000e000 }, | ||
966 | { 0x0000a254, 0x00000000 }, | ||
967 | { 0x0000a258, 0x0cc75380 }, | ||
968 | { 0x0000a25c, 0x0f0f0f01 }, | ||
969 | { 0x0000a260, 0xdfa91f01 }, | ||
970 | { 0x0000a268, 0x00000001 }, | ||
971 | { 0x0000a26c, 0x0ebae9c6 }, | ||
972 | { 0x0000b26c, 0x0ebae9c6 }, | ||
973 | { 0x0000c26c, 0x0ebae9c6 }, | ||
974 | { 0x0000d270, 0x00820820 }, | ||
975 | { 0x0000a278, 0x1ce739ce }, | ||
976 | { 0x0000a27c, 0x050701ce }, | ||
977 | { 0x0000a338, 0x00000000 }, | ||
978 | { 0x0000a33c, 0x00000000 }, | ||
979 | { 0x0000a340, 0x00000000 }, | ||
980 | { 0x0000a344, 0x00000000 }, | ||
981 | { 0x0000a348, 0x3fffffff }, | ||
982 | { 0x0000a34c, 0x3fffffff }, | ||
983 | { 0x0000a350, 0x3fffffff }, | ||
984 | { 0x0000a354, 0x0003ffff }, | ||
985 | { 0x0000a358, 0x79bfaa03 }, | ||
986 | { 0x0000d35c, 0x07ffffef }, | ||
987 | { 0x0000d360, 0x0fffffe7 }, | ||
988 | { 0x0000d364, 0x17ffffe5 }, | ||
989 | { 0x0000d368, 0x1fffffe4 }, | ||
990 | { 0x0000d36c, 0x37ffffe3 }, | ||
991 | { 0x0000d370, 0x3fffffe3 }, | ||
992 | { 0x0000d374, 0x57ffffe3 }, | ||
993 | { 0x0000d378, 0x5fffffe2 }, | ||
994 | { 0x0000d37c, 0x7fffffe2 }, | ||
995 | { 0x0000d380, 0x7f3c7bba }, | ||
996 | { 0x0000d384, 0xf3307ff0 }, | ||
997 | { 0x0000a388, 0x0c000000 }, | ||
998 | { 0x0000a38c, 0x20202020 }, | ||
999 | { 0x0000a390, 0x20202020 }, | ||
1000 | { 0x0000a394, 0x1ce739ce }, | ||
1001 | { 0x0000a398, 0x000001ce }, | ||
1002 | { 0x0000a39c, 0x00000001 }, | ||
1003 | { 0x0000a3a0, 0x00000000 }, | ||
1004 | { 0x0000a3a4, 0x00000000 }, | ||
1005 | { 0x0000a3a8, 0x00000000 }, | ||
1006 | { 0x0000a3ac, 0x00000000 }, | ||
1007 | { 0x0000a3b0, 0x00000000 }, | ||
1008 | { 0x0000a3b4, 0x00000000 }, | ||
1009 | { 0x0000a3b8, 0x00000000 }, | ||
1010 | { 0x0000a3bc, 0x00000000 }, | ||
1011 | { 0x0000a3c0, 0x00000000 }, | ||
1012 | { 0x0000a3c4, 0x00000000 }, | ||
1013 | { 0x0000a3c8, 0x00000246 }, | ||
1014 | { 0x0000a3cc, 0x20202020 }, | ||
1015 | { 0x0000a3d0, 0x20202020 }, | ||
1016 | { 0x0000a3d4, 0x20202020 }, | ||
1017 | { 0x0000a3dc, 0x1ce739ce }, | ||
1018 | { 0x0000a3e0, 0x000001ce }, | ||
1019 | }; | ||
1020 | |||
1021 | static const u32 ar5416Bank0_9160[][2] = { | ||
1022 | { 0x000098b0, 0x1e5795e5 }, | ||
1023 | { 0x000098e0, 0x02008020 }, | ||
1024 | }; | ||
1025 | |||
1026 | static const u32 ar5416BB_RfGain_9160[][3] = { | ||
1027 | { 0x00009a00, 0x00000000, 0x00000000 }, | ||
1028 | { 0x00009a04, 0x00000040, 0x00000040 }, | ||
1029 | { 0x00009a08, 0x00000080, 0x00000080 }, | ||
1030 | { 0x00009a0c, 0x000001a1, 0x00000141 }, | ||
1031 | { 0x00009a10, 0x000001e1, 0x00000181 }, | ||
1032 | { 0x00009a14, 0x00000021, 0x000001c1 }, | ||
1033 | { 0x00009a18, 0x00000061, 0x00000001 }, | ||
1034 | { 0x00009a1c, 0x00000168, 0x00000041 }, | ||
1035 | { 0x00009a20, 0x000001a8, 0x000001a8 }, | ||
1036 | { 0x00009a24, 0x000001e8, 0x000001e8 }, | ||
1037 | { 0x00009a28, 0x00000028, 0x00000028 }, | ||
1038 | { 0x00009a2c, 0x00000068, 0x00000068 }, | ||
1039 | { 0x00009a30, 0x00000189, 0x000000a8 }, | ||
1040 | { 0x00009a34, 0x000001c9, 0x00000169 }, | ||
1041 | { 0x00009a38, 0x00000009, 0x000001a9 }, | ||
1042 | { 0x00009a3c, 0x00000049, 0x000001e9 }, | ||
1043 | { 0x00009a40, 0x00000089, 0x00000029 }, | ||
1044 | { 0x00009a44, 0x00000170, 0x00000069 }, | ||
1045 | { 0x00009a48, 0x000001b0, 0x00000190 }, | ||
1046 | { 0x00009a4c, 0x000001f0, 0x000001d0 }, | ||
1047 | { 0x00009a50, 0x00000030, 0x00000010 }, | ||
1048 | { 0x00009a54, 0x00000070, 0x00000050 }, | ||
1049 | { 0x00009a58, 0x00000191, 0x00000090 }, | ||
1050 | { 0x00009a5c, 0x000001d1, 0x00000151 }, | ||
1051 | { 0x00009a60, 0x00000011, 0x00000191 }, | ||
1052 | { 0x00009a64, 0x00000051, 0x000001d1 }, | ||
1053 | { 0x00009a68, 0x00000091, 0x00000011 }, | ||
1054 | { 0x00009a6c, 0x000001b8, 0x00000051 }, | ||
1055 | { 0x00009a70, 0x000001f8, 0x00000198 }, | ||
1056 | { 0x00009a74, 0x00000038, 0x000001d8 }, | ||
1057 | { 0x00009a78, 0x00000078, 0x00000018 }, | ||
1058 | { 0x00009a7c, 0x00000199, 0x00000058 }, | ||
1059 | { 0x00009a80, 0x000001d9, 0x00000098 }, | ||
1060 | { 0x00009a84, 0x00000019, 0x00000159 }, | ||
1061 | { 0x00009a88, 0x00000059, 0x00000199 }, | ||
1062 | { 0x00009a8c, 0x00000099, 0x000001d9 }, | ||
1063 | { 0x00009a90, 0x000000d9, 0x00000019 }, | ||
1064 | { 0x00009a94, 0x000000f9, 0x00000059 }, | ||
1065 | { 0x00009a98, 0x000000f9, 0x00000099 }, | ||
1066 | { 0x00009a9c, 0x000000f9, 0x000000d9 }, | ||
1067 | { 0x00009aa0, 0x000000f9, 0x000000f9 }, | ||
1068 | { 0x00009aa4, 0x000000f9, 0x000000f9 }, | ||
1069 | { 0x00009aa8, 0x000000f9, 0x000000f9 }, | ||
1070 | { 0x00009aac, 0x000000f9, 0x000000f9 }, | ||
1071 | { 0x00009ab0, 0x000000f9, 0x000000f9 }, | ||
1072 | { 0x00009ab4, 0x000000f9, 0x000000f9 }, | ||
1073 | { 0x00009ab8, 0x000000f9, 0x000000f9 }, | ||
1074 | { 0x00009abc, 0x000000f9, 0x000000f9 }, | ||
1075 | { 0x00009ac0, 0x000000f9, 0x000000f9 }, | ||
1076 | { 0x00009ac4, 0x000000f9, 0x000000f9 }, | ||
1077 | { 0x00009ac8, 0x000000f9, 0x000000f9 }, | ||
1078 | { 0x00009acc, 0x000000f9, 0x000000f9 }, | ||
1079 | { 0x00009ad0, 0x000000f9, 0x000000f9 }, | ||
1080 | { 0x00009ad4, 0x000000f9, 0x000000f9 }, | ||
1081 | { 0x00009ad8, 0x000000f9, 0x000000f9 }, | ||
1082 | { 0x00009adc, 0x000000f9, 0x000000f9 }, | ||
1083 | { 0x00009ae0, 0x000000f9, 0x000000f9 }, | ||
1084 | { 0x00009ae4, 0x000000f9, 0x000000f9 }, | ||
1085 | { 0x00009ae8, 0x000000f9, 0x000000f9 }, | ||
1086 | { 0x00009aec, 0x000000f9, 0x000000f9 }, | ||
1087 | { 0x00009af0, 0x000000f9, 0x000000f9 }, | ||
1088 | { 0x00009af4, 0x000000f9, 0x000000f9 }, | ||
1089 | { 0x00009af8, 0x000000f9, 0x000000f9 }, | ||
1090 | { 0x00009afc, 0x000000f9, 0x000000f9 }, | ||
1091 | }; | ||
1092 | |||
1093 | static const u32 ar5416Bank1_9160[][2] = { | ||
1094 | { 0x000098b0, 0x02108421 }, | ||
1095 | { 0x000098ec, 0x00000008 }, | ||
1096 | }; | ||
1097 | |||
1098 | static const u32 ar5416Bank2_9160[][2] = { | ||
1099 | { 0x000098b0, 0x0e73ff17 }, | ||
1100 | { 0x000098e0, 0x00000420 }, | ||
1101 | }; | ||
1102 | |||
1103 | static const u32 ar5416Bank3_9160[][3] = { | ||
1104 | { 0x000098f0, 0x01400018, 0x01c00018 }, | ||
1105 | }; | ||
1106 | |||
1107 | static const u32 ar5416Bank6_9160[][3] = { | ||
1108 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
1109 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
1110 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
1111 | { 0x0000989c, 0x00e00000, 0x00e00000 }, | ||
1112 | { 0x0000989c, 0x005e0000, 0x005e0000 }, | ||
1113 | { 0x0000989c, 0x00120000, 0x00120000 }, | ||
1114 | { 0x0000989c, 0x00620000, 0x00620000 }, | ||
1115 | { 0x0000989c, 0x00020000, 0x00020000 }, | ||
1116 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1117 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1118 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1119 | { 0x0000989c, 0x40ff0000, 0x40ff0000 }, | ||
1120 | { 0x0000989c, 0x005f0000, 0x005f0000 }, | ||
1121 | { 0x0000989c, 0x00870000, 0x00870000 }, | ||
1122 | { 0x0000989c, 0x00f90000, 0x00f90000 }, | ||
1123 | { 0x0000989c, 0x007b0000, 0x007b0000 }, | ||
1124 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1125 | { 0x0000989c, 0x00f50000, 0x00f50000 }, | ||
1126 | { 0x0000989c, 0x00dc0000, 0x00dc0000 }, | ||
1127 | { 0x0000989c, 0x00110000, 0x00110000 }, | ||
1128 | { 0x0000989c, 0x006100a8, 0x006100a8 }, | ||
1129 | { 0x0000989c, 0x004210a2, 0x004210a2 }, | ||
1130 | { 0x0000989c, 0x0014008f, 0x0014008f }, | ||
1131 | { 0x0000989c, 0x00c40003, 0x00c40003 }, | ||
1132 | { 0x0000989c, 0x003000f2, 0x003000f2 }, | ||
1133 | { 0x0000989c, 0x00440016, 0x00440016 }, | ||
1134 | { 0x0000989c, 0x00410040, 0x00410040 }, | ||
1135 | { 0x0000989c, 0x0001805e, 0x0001805e }, | ||
1136 | { 0x0000989c, 0x0000c0ab, 0x0000c0ab }, | ||
1137 | { 0x0000989c, 0x000000f1, 0x000000f1 }, | ||
1138 | { 0x0000989c, 0x00002081, 0x00002081 }, | ||
1139 | { 0x0000989c, 0x000000d4, 0x000000d4 }, | ||
1140 | { 0x000098d0, 0x0000000f, 0x0010000f }, | ||
1141 | }; | ||
1142 | |||
1143 | static const u32 ar5416Bank6TPC_9160[][3] = { | ||
1144 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
1145 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
1146 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
1147 | { 0x0000989c, 0x00e00000, 0x00e00000 }, | ||
1148 | { 0x0000989c, 0x005e0000, 0x005e0000 }, | ||
1149 | { 0x0000989c, 0x00120000, 0x00120000 }, | ||
1150 | { 0x0000989c, 0x00620000, 0x00620000 }, | ||
1151 | { 0x0000989c, 0x00020000, 0x00020000 }, | ||
1152 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1153 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1154 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1155 | { 0x0000989c, 0x40ff0000, 0x40ff0000 }, | ||
1156 | { 0x0000989c, 0x005f0000, 0x005f0000 }, | ||
1157 | { 0x0000989c, 0x00870000, 0x00870000 }, | ||
1158 | { 0x0000989c, 0x00f90000, 0x00f90000 }, | ||
1159 | { 0x0000989c, 0x007b0000, 0x007b0000 }, | ||
1160 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1161 | { 0x0000989c, 0x00f50000, 0x00f50000 }, | ||
1162 | { 0x0000989c, 0x00dc0000, 0x00dc0000 }, | ||
1163 | { 0x0000989c, 0x00110000, 0x00110000 }, | ||
1164 | { 0x0000989c, 0x006100a8, 0x006100a8 }, | ||
1165 | { 0x0000989c, 0x00423022, 0x00423022 }, | ||
1166 | { 0x0000989c, 0x2014008f, 0x2014008f }, | ||
1167 | { 0x0000989c, 0x00c40002, 0x00c40002 }, | ||
1168 | { 0x0000989c, 0x003000f2, 0x003000f2 }, | ||
1169 | { 0x0000989c, 0x00440016, 0x00440016 }, | ||
1170 | { 0x0000989c, 0x00410040, 0x00410040 }, | ||
1171 | { 0x0000989c, 0x0001805e, 0x0001805e }, | ||
1172 | { 0x0000989c, 0x0000c0ab, 0x0000c0ab }, | ||
1173 | { 0x0000989c, 0x000000e1, 0x000000e1 }, | ||
1174 | { 0x0000989c, 0x00007080, 0x00007080 }, | ||
1175 | { 0x0000989c, 0x000000d4, 0x000000d4 }, | ||
1176 | { 0x000098d0, 0x0000000f, 0x0010000f }, | ||
1177 | }; | ||
1178 | |||
1179 | static const u32 ar5416Bank7_9160[][2] = { | ||
1180 | { 0x0000989c, 0x00000500 }, | ||
1181 | { 0x0000989c, 0x00000800 }, | ||
1182 | { 0x000098cc, 0x0000000e }, | ||
1183 | }; | ||
1184 | |||
1185 | static const u32 ar5416Addac_9160[][2] = { | ||
1186 | {0x0000989c, 0x00000000 }, | ||
1187 | {0x0000989c, 0x00000000 }, | ||
1188 | {0x0000989c, 0x00000000 }, | ||
1189 | {0x0000989c, 0x00000000 }, | ||
1190 | {0x0000989c, 0x00000000 }, | ||
1191 | {0x0000989c, 0x00000000 }, | ||
1192 | {0x0000989c, 0x000000c0 }, | ||
1193 | {0x0000989c, 0x00000018 }, | ||
1194 | {0x0000989c, 0x00000004 }, | ||
1195 | {0x0000989c, 0x00000000 }, | ||
1196 | {0x0000989c, 0x00000000 }, | ||
1197 | {0x0000989c, 0x00000000 }, | ||
1198 | {0x0000989c, 0x00000000 }, | ||
1199 | {0x0000989c, 0x00000000 }, | ||
1200 | {0x0000989c, 0x00000000 }, | ||
1201 | {0x0000989c, 0x00000000 }, | ||
1202 | {0x0000989c, 0x00000000 }, | ||
1203 | {0x0000989c, 0x00000000 }, | ||
1204 | {0x0000989c, 0x00000000 }, | ||
1205 | {0x0000989c, 0x00000000 }, | ||
1206 | {0x0000989c, 0x00000000 }, | ||
1207 | {0x0000989c, 0x000000c0 }, | ||
1208 | {0x0000989c, 0x00000019 }, | ||
1209 | {0x0000989c, 0x00000004 }, | ||
1210 | {0x0000989c, 0x00000000 }, | ||
1211 | {0x0000989c, 0x00000000 }, | ||
1212 | {0x0000989c, 0x00000000 }, | ||
1213 | {0x0000989c, 0x00000004 }, | ||
1214 | {0x0000989c, 0x00000003 }, | ||
1215 | {0x0000989c, 0x00000008 }, | ||
1216 | {0x0000989c, 0x00000000 }, | ||
1217 | {0x000098cc, 0x00000000 }, | ||
1218 | }; | ||
1219 | |||
1220 | static const u32 ar5416Addac_91601_1[][2] = { | ||
1221 | {0x0000989c, 0x00000000 }, | ||
1222 | {0x0000989c, 0x00000000 }, | ||
1223 | {0x0000989c, 0x00000000 }, | ||
1224 | {0x0000989c, 0x00000000 }, | ||
1225 | {0x0000989c, 0x00000000 }, | ||
1226 | {0x0000989c, 0x00000000 }, | ||
1227 | {0x0000989c, 0x000000c0 }, | ||
1228 | {0x0000989c, 0x00000018 }, | ||
1229 | {0x0000989c, 0x00000004 }, | ||
1230 | {0x0000989c, 0x00000000 }, | ||
1231 | {0x0000989c, 0x00000000 }, | ||
1232 | {0x0000989c, 0x00000000 }, | ||
1233 | {0x0000989c, 0x00000000 }, | ||
1234 | {0x0000989c, 0x00000000 }, | ||
1235 | {0x0000989c, 0x00000000 }, | ||
1236 | {0x0000989c, 0x00000000 }, | ||
1237 | {0x0000989c, 0x00000000 }, | ||
1238 | {0x0000989c, 0x00000000 }, | ||
1239 | {0x0000989c, 0x00000000 }, | ||
1240 | {0x0000989c, 0x00000000 }, | ||
1241 | {0x0000989c, 0x00000000 }, | ||
1242 | {0x0000989c, 0x000000c0 }, | ||
1243 | {0x0000989c, 0x00000019 }, | ||
1244 | {0x0000989c, 0x00000004 }, | ||
1245 | {0x0000989c, 0x00000000 }, | ||
1246 | {0x0000989c, 0x00000000 }, | ||
1247 | {0x0000989c, 0x00000000 }, | ||
1248 | {0x0000989c, 0x00000000 }, | ||
1249 | {0x0000989c, 0x00000000 }, | ||
1250 | {0x0000989c, 0x00000000 }, | ||
1251 | {0x0000989c, 0x00000000 }, | ||
1252 | {0x000098cc, 0x00000000 }, | ||
1253 | }; | ||
1254 | |||
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_calib.c b/drivers/net/wireless/ath/ath9k/ar9002_calib.c new file mode 100644 index 000000000000..5fdbb53b47e0 --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/ar9002_calib.c | |||
@@ -0,0 +1,1000 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2008-2010 Atheros Communications Inc. | ||
3 | * | ||
4 | * Permission to use, copy, modify, and/or distribute this software for any | ||
5 | * purpose with or without fee is hereby granted, provided that the above | ||
6 | * copyright notice and this permission notice appear in all copies. | ||
7 | * | ||
8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
15 | */ | ||
16 | |||
17 | #include "hw.h" | ||
18 | #include "hw-ops.h" | ||
19 | #include "ar9002_phy.h" | ||
20 | |||
21 | #define AR9285_CLCAL_REDO_THRESH 1 | ||
22 | |||
23 | static void ar9002_hw_setup_calibration(struct ath_hw *ah, | ||
24 | struct ath9k_cal_list *currCal) | ||
25 | { | ||
26 | struct ath_common *common = ath9k_hw_common(ah); | ||
27 | |||
28 | REG_RMW_FIELD(ah, AR_PHY_TIMING_CTRL4(0), | ||
29 | AR_PHY_TIMING_CTRL4_IQCAL_LOG_COUNT_MAX, | ||
30 | currCal->calData->calCountMax); | ||
31 | |||
32 | switch (currCal->calData->calType) { | ||
33 | case IQ_MISMATCH_CAL: | ||
34 | REG_WRITE(ah, AR_PHY_CALMODE, AR_PHY_CALMODE_IQ); | ||
35 | ath_print(common, ATH_DBG_CALIBRATE, | ||
36 | "starting IQ Mismatch Calibration\n"); | ||
37 | break; | ||
38 | case ADC_GAIN_CAL: | ||
39 | REG_WRITE(ah, AR_PHY_CALMODE, AR_PHY_CALMODE_ADC_GAIN); | ||
40 | ath_print(common, ATH_DBG_CALIBRATE, | ||
41 | "starting ADC Gain Calibration\n"); | ||
42 | break; | ||
43 | case ADC_DC_CAL: | ||
44 | REG_WRITE(ah, AR_PHY_CALMODE, AR_PHY_CALMODE_ADC_DC_PER); | ||
45 | ath_print(common, ATH_DBG_CALIBRATE, | ||
46 | "starting ADC DC Calibration\n"); | ||
47 | break; | ||
48 | case ADC_DC_INIT_CAL: | ||
49 | REG_WRITE(ah, AR_PHY_CALMODE, AR_PHY_CALMODE_ADC_DC_INIT); | ||
50 | ath_print(common, ATH_DBG_CALIBRATE, | ||
51 | "starting Init ADC DC Calibration\n"); | ||
52 | break; | ||
53 | case TEMP_COMP_CAL: | ||
54 | break; /* Not supported */ | ||
55 | } | ||
56 | |||
57 | REG_SET_BIT(ah, AR_PHY_TIMING_CTRL4(0), | ||
58 | AR_PHY_TIMING_CTRL4_DO_CAL); | ||
59 | } | ||
60 | |||
61 | static bool ar9002_hw_per_calibration(struct ath_hw *ah, | ||
62 | struct ath9k_channel *ichan, | ||
63 | u8 rxchainmask, | ||
64 | struct ath9k_cal_list *currCal) | ||
65 | { | ||
66 | bool iscaldone = false; | ||
67 | |||
68 | if (currCal->calState == CAL_RUNNING) { | ||
69 | if (!(REG_READ(ah, AR_PHY_TIMING_CTRL4(0)) & | ||
70 | AR_PHY_TIMING_CTRL4_DO_CAL)) { | ||
71 | |||
72 | currCal->calData->calCollect(ah); | ||
73 | ah->cal_samples++; | ||
74 | |||
75 | if (ah->cal_samples >= | ||
76 | currCal->calData->calNumSamples) { | ||
77 | int i, numChains = 0; | ||
78 | for (i = 0; i < AR5416_MAX_CHAINS; i++) { | ||
79 | if (rxchainmask & (1 << i)) | ||
80 | numChains++; | ||
81 | } | ||
82 | |||
83 | currCal->calData->calPostProc(ah, numChains); | ||
84 | ichan->CalValid |= currCal->calData->calType; | ||
85 | currCal->calState = CAL_DONE; | ||
86 | iscaldone = true; | ||
87 | } else { | ||
88 | ar9002_hw_setup_calibration(ah, currCal); | ||
89 | } | ||
90 | } | ||
91 | } else if (!(ichan->CalValid & currCal->calData->calType)) { | ||
92 | ath9k_hw_reset_calibration(ah, currCal); | ||
93 | } | ||
94 | |||
95 | return iscaldone; | ||
96 | } | ||
97 | |||
98 | /* Assumes you are talking about the currently configured channel */ | ||
99 | static bool ar9002_hw_iscal_supported(struct ath_hw *ah, | ||
100 | enum ath9k_cal_types calType) | ||
101 | { | ||
102 | struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf; | ||
103 | |||
104 | switch (calType & ah->supp_cals) { | ||
105 | case IQ_MISMATCH_CAL: /* Both 2 GHz and 5 GHz support OFDM */ | ||
106 | return true; | ||
107 | case ADC_GAIN_CAL: | ||
108 | case ADC_DC_CAL: | ||
109 | if (!(conf->channel->band == IEEE80211_BAND_2GHZ && | ||
110 | conf_is_ht20(conf))) | ||
111 | return true; | ||
112 | break; | ||
113 | } | ||
114 | return false; | ||
115 | } | ||
116 | |||
117 | static void ar9002_hw_iqcal_collect(struct ath_hw *ah) | ||
118 | { | ||
119 | int i; | ||
120 | |||
121 | for (i = 0; i < AR5416_MAX_CHAINS; i++) { | ||
122 | ah->totalPowerMeasI[i] += | ||
123 | REG_READ(ah, AR_PHY_CAL_MEAS_0(i)); | ||
124 | ah->totalPowerMeasQ[i] += | ||
125 | REG_READ(ah, AR_PHY_CAL_MEAS_1(i)); | ||
126 | ah->totalIqCorrMeas[i] += | ||
127 | (int32_t) REG_READ(ah, AR_PHY_CAL_MEAS_2(i)); | ||
128 | ath_print(ath9k_hw_common(ah), ATH_DBG_CALIBRATE, | ||
129 | "%d: Chn %d pmi=0x%08x;pmq=0x%08x;iqcm=0x%08x;\n", | ||
130 | ah->cal_samples, i, ah->totalPowerMeasI[i], | ||
131 | ah->totalPowerMeasQ[i], | ||
132 | ah->totalIqCorrMeas[i]); | ||
133 | } | ||
134 | } | ||
135 | |||
136 | static void ar9002_hw_adc_gaincal_collect(struct ath_hw *ah) | ||
137 | { | ||
138 | int i; | ||
139 | |||
140 | for (i = 0; i < AR5416_MAX_CHAINS; i++) { | ||
141 | ah->totalAdcIOddPhase[i] += | ||
142 | REG_READ(ah, AR_PHY_CAL_MEAS_0(i)); | ||
143 | ah->totalAdcIEvenPhase[i] += | ||
144 | REG_READ(ah, AR_PHY_CAL_MEAS_1(i)); | ||
145 | ah->totalAdcQOddPhase[i] += | ||
146 | REG_READ(ah, AR_PHY_CAL_MEAS_2(i)); | ||
147 | ah->totalAdcQEvenPhase[i] += | ||
148 | REG_READ(ah, AR_PHY_CAL_MEAS_3(i)); | ||
149 | |||
150 | ath_print(ath9k_hw_common(ah), ATH_DBG_CALIBRATE, | ||
151 | "%d: Chn %d oddi=0x%08x; eveni=0x%08x; " | ||
152 | "oddq=0x%08x; evenq=0x%08x;\n", | ||
153 | ah->cal_samples, i, | ||
154 | ah->totalAdcIOddPhase[i], | ||
155 | ah->totalAdcIEvenPhase[i], | ||
156 | ah->totalAdcQOddPhase[i], | ||
157 | ah->totalAdcQEvenPhase[i]); | ||
158 | } | ||
159 | } | ||
160 | |||
161 | static void ar9002_hw_adc_dccal_collect(struct ath_hw *ah) | ||
162 | { | ||
163 | int i; | ||
164 | |||
165 | for (i = 0; i < AR5416_MAX_CHAINS; i++) { | ||
166 | ah->totalAdcDcOffsetIOddPhase[i] += | ||
167 | (int32_t) REG_READ(ah, AR_PHY_CAL_MEAS_0(i)); | ||
168 | ah->totalAdcDcOffsetIEvenPhase[i] += | ||
169 | (int32_t) REG_READ(ah, AR_PHY_CAL_MEAS_1(i)); | ||
170 | ah->totalAdcDcOffsetQOddPhase[i] += | ||
171 | (int32_t) REG_READ(ah, AR_PHY_CAL_MEAS_2(i)); | ||
172 | ah->totalAdcDcOffsetQEvenPhase[i] += | ||
173 | (int32_t) REG_READ(ah, AR_PHY_CAL_MEAS_3(i)); | ||
174 | |||
175 | ath_print(ath9k_hw_common(ah), ATH_DBG_CALIBRATE, | ||
176 | "%d: Chn %d oddi=0x%08x; eveni=0x%08x; " | ||
177 | "oddq=0x%08x; evenq=0x%08x;\n", | ||
178 | ah->cal_samples, i, | ||
179 | ah->totalAdcDcOffsetIOddPhase[i], | ||
180 | ah->totalAdcDcOffsetIEvenPhase[i], | ||
181 | ah->totalAdcDcOffsetQOddPhase[i], | ||
182 | ah->totalAdcDcOffsetQEvenPhase[i]); | ||
183 | } | ||
184 | } | ||
185 | |||
186 | static void ar9002_hw_iqcalibrate(struct ath_hw *ah, u8 numChains) | ||
187 | { | ||
188 | struct ath_common *common = ath9k_hw_common(ah); | ||
189 | u32 powerMeasQ, powerMeasI, iqCorrMeas; | ||
190 | u32 qCoffDenom, iCoffDenom; | ||
191 | int32_t qCoff, iCoff; | ||
192 | int iqCorrNeg, i; | ||
193 | |||
194 | for (i = 0; i < numChains; i++) { | ||
195 | powerMeasI = ah->totalPowerMeasI[i]; | ||
196 | powerMeasQ = ah->totalPowerMeasQ[i]; | ||
197 | iqCorrMeas = ah->totalIqCorrMeas[i]; | ||
198 | |||
199 | ath_print(common, ATH_DBG_CALIBRATE, | ||
200 | "Starting IQ Cal and Correction for Chain %d\n", | ||
201 | i); | ||
202 | |||
203 | ath_print(common, ATH_DBG_CALIBRATE, | ||
204 | "Orignal: Chn %diq_corr_meas = 0x%08x\n", | ||
205 | i, ah->totalIqCorrMeas[i]); | ||
206 | |||
207 | iqCorrNeg = 0; | ||
208 | |||
209 | if (iqCorrMeas > 0x80000000) { | ||
210 | iqCorrMeas = (0xffffffff - iqCorrMeas) + 1; | ||
211 | iqCorrNeg = 1; | ||
212 | } | ||
213 | |||
214 | ath_print(common, ATH_DBG_CALIBRATE, | ||
215 | "Chn %d pwr_meas_i = 0x%08x\n", i, powerMeasI); | ||
216 | ath_print(common, ATH_DBG_CALIBRATE, | ||
217 | "Chn %d pwr_meas_q = 0x%08x\n", i, powerMeasQ); | ||
218 | ath_print(common, ATH_DBG_CALIBRATE, "iqCorrNeg is 0x%08x\n", | ||
219 | iqCorrNeg); | ||
220 | |||
221 | iCoffDenom = (powerMeasI / 2 + powerMeasQ / 2) / 128; | ||
222 | qCoffDenom = powerMeasQ / 64; | ||
223 | |||
224 | if ((powerMeasQ != 0) && (iCoffDenom != 0) && | ||
225 | (qCoffDenom != 0)) { | ||
226 | iCoff = iqCorrMeas / iCoffDenom; | ||
227 | qCoff = powerMeasI / qCoffDenom - 64; | ||
228 | ath_print(common, ATH_DBG_CALIBRATE, | ||
229 | "Chn %d iCoff = 0x%08x\n", i, iCoff); | ||
230 | ath_print(common, ATH_DBG_CALIBRATE, | ||
231 | "Chn %d qCoff = 0x%08x\n", i, qCoff); | ||
232 | |||
233 | iCoff = iCoff & 0x3f; | ||
234 | ath_print(common, ATH_DBG_CALIBRATE, | ||
235 | "New: Chn %d iCoff = 0x%08x\n", i, iCoff); | ||
236 | if (iqCorrNeg == 0x0) | ||
237 | iCoff = 0x40 - iCoff; | ||
238 | |||
239 | if (qCoff > 15) | ||
240 | qCoff = 15; | ||
241 | else if (qCoff <= -16) | ||
242 | qCoff = 16; | ||
243 | |||
244 | ath_print(common, ATH_DBG_CALIBRATE, | ||
245 | "Chn %d : iCoff = 0x%x qCoff = 0x%x\n", | ||
246 | i, iCoff, qCoff); | ||
247 | |||
248 | REG_RMW_FIELD(ah, AR_PHY_TIMING_CTRL4(i), | ||
249 | AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF, | ||
250 | iCoff); | ||
251 | REG_RMW_FIELD(ah, AR_PHY_TIMING_CTRL4(i), | ||
252 | AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF, | ||
253 | qCoff); | ||
254 | ath_print(common, ATH_DBG_CALIBRATE, | ||
255 | "IQ Cal and Correction done for Chain %d\n", | ||
256 | i); | ||
257 | } | ||
258 | } | ||
259 | |||
260 | REG_SET_BIT(ah, AR_PHY_TIMING_CTRL4(0), | ||
261 | AR_PHY_TIMING_CTRL4_IQCORR_ENABLE); | ||
262 | } | ||
263 | |||
264 | static void ar9002_hw_adc_gaincal_calibrate(struct ath_hw *ah, u8 numChains) | ||
265 | { | ||
266 | struct ath_common *common = ath9k_hw_common(ah); | ||
267 | u32 iOddMeasOffset, iEvenMeasOffset, qOddMeasOffset, qEvenMeasOffset; | ||
268 | u32 qGainMismatch, iGainMismatch, val, i; | ||
269 | |||
270 | for (i = 0; i < numChains; i++) { | ||
271 | iOddMeasOffset = ah->totalAdcIOddPhase[i]; | ||
272 | iEvenMeasOffset = ah->totalAdcIEvenPhase[i]; | ||
273 | qOddMeasOffset = ah->totalAdcQOddPhase[i]; | ||
274 | qEvenMeasOffset = ah->totalAdcQEvenPhase[i]; | ||
275 | |||
276 | ath_print(common, ATH_DBG_CALIBRATE, | ||
277 | "Starting ADC Gain Cal for Chain %d\n", i); | ||
278 | |||
279 | ath_print(common, ATH_DBG_CALIBRATE, | ||
280 | "Chn %d pwr_meas_odd_i = 0x%08x\n", i, | ||
281 | iOddMeasOffset); | ||
282 | ath_print(common, ATH_DBG_CALIBRATE, | ||
283 | "Chn %d pwr_meas_even_i = 0x%08x\n", i, | ||
284 | iEvenMeasOffset); | ||
285 | ath_print(common, ATH_DBG_CALIBRATE, | ||
286 | "Chn %d pwr_meas_odd_q = 0x%08x\n", i, | ||
287 | qOddMeasOffset); | ||
288 | ath_print(common, ATH_DBG_CALIBRATE, | ||
289 | "Chn %d pwr_meas_even_q = 0x%08x\n", i, | ||
290 | qEvenMeasOffset); | ||
291 | |||
292 | if (iOddMeasOffset != 0 && qEvenMeasOffset != 0) { | ||
293 | iGainMismatch = | ||
294 | ((iEvenMeasOffset * 32) / | ||
295 | iOddMeasOffset) & 0x3f; | ||
296 | qGainMismatch = | ||
297 | ((qOddMeasOffset * 32) / | ||
298 | qEvenMeasOffset) & 0x3f; | ||
299 | |||
300 | ath_print(common, ATH_DBG_CALIBRATE, | ||
301 | "Chn %d gain_mismatch_i = 0x%08x\n", i, | ||
302 | iGainMismatch); | ||
303 | ath_print(common, ATH_DBG_CALIBRATE, | ||
304 | "Chn %d gain_mismatch_q = 0x%08x\n", i, | ||
305 | qGainMismatch); | ||
306 | |||
307 | val = REG_READ(ah, AR_PHY_NEW_ADC_DC_GAIN_CORR(i)); | ||
308 | val &= 0xfffff000; | ||
309 | val |= (qGainMismatch) | (iGainMismatch << 6); | ||
310 | REG_WRITE(ah, AR_PHY_NEW_ADC_DC_GAIN_CORR(i), val); | ||
311 | |||
312 | ath_print(common, ATH_DBG_CALIBRATE, | ||
313 | "ADC Gain Cal done for Chain %d\n", i); | ||
314 | } | ||
315 | } | ||
316 | |||
317 | REG_WRITE(ah, AR_PHY_NEW_ADC_DC_GAIN_CORR(0), | ||
318 | REG_READ(ah, AR_PHY_NEW_ADC_DC_GAIN_CORR(0)) | | ||
319 | AR_PHY_NEW_ADC_GAIN_CORR_ENABLE); | ||
320 | } | ||
321 | |||
322 | static void ar9002_hw_adc_dccal_calibrate(struct ath_hw *ah, u8 numChains) | ||
323 | { | ||
324 | struct ath_common *common = ath9k_hw_common(ah); | ||
325 | u32 iOddMeasOffset, iEvenMeasOffset, val, i; | ||
326 | int32_t qOddMeasOffset, qEvenMeasOffset, qDcMismatch, iDcMismatch; | ||
327 | const struct ath9k_percal_data *calData = | ||
328 | ah->cal_list_curr->calData; | ||
329 | u32 numSamples = | ||
330 | (1 << (calData->calCountMax + 5)) * calData->calNumSamples; | ||
331 | |||
332 | for (i = 0; i < numChains; i++) { | ||
333 | iOddMeasOffset = ah->totalAdcDcOffsetIOddPhase[i]; | ||
334 | iEvenMeasOffset = ah->totalAdcDcOffsetIEvenPhase[i]; | ||
335 | qOddMeasOffset = ah->totalAdcDcOffsetQOddPhase[i]; | ||
336 | qEvenMeasOffset = ah->totalAdcDcOffsetQEvenPhase[i]; | ||
337 | |||
338 | ath_print(common, ATH_DBG_CALIBRATE, | ||
339 | "Starting ADC DC Offset Cal for Chain %d\n", i); | ||
340 | |||
341 | ath_print(common, ATH_DBG_CALIBRATE, | ||
342 | "Chn %d pwr_meas_odd_i = %d\n", i, | ||
343 | iOddMeasOffset); | ||
344 | ath_print(common, ATH_DBG_CALIBRATE, | ||
345 | "Chn %d pwr_meas_even_i = %d\n", i, | ||
346 | iEvenMeasOffset); | ||
347 | ath_print(common, ATH_DBG_CALIBRATE, | ||
348 | "Chn %d pwr_meas_odd_q = %d\n", i, | ||
349 | qOddMeasOffset); | ||
350 | ath_print(common, ATH_DBG_CALIBRATE, | ||
351 | "Chn %d pwr_meas_even_q = %d\n", i, | ||
352 | qEvenMeasOffset); | ||
353 | |||
354 | iDcMismatch = (((iEvenMeasOffset - iOddMeasOffset) * 2) / | ||
355 | numSamples) & 0x1ff; | ||
356 | qDcMismatch = (((qOddMeasOffset - qEvenMeasOffset) * 2) / | ||
357 | numSamples) & 0x1ff; | ||
358 | |||
359 | ath_print(common, ATH_DBG_CALIBRATE, | ||
360 | "Chn %d dc_offset_mismatch_i = 0x%08x\n", i, | ||
361 | iDcMismatch); | ||
362 | ath_print(common, ATH_DBG_CALIBRATE, | ||
363 | "Chn %d dc_offset_mismatch_q = 0x%08x\n", i, | ||
364 | qDcMismatch); | ||
365 | |||
366 | val = REG_READ(ah, AR_PHY_NEW_ADC_DC_GAIN_CORR(i)); | ||
367 | val &= 0xc0000fff; | ||
368 | val |= (qDcMismatch << 12) | (iDcMismatch << 21); | ||
369 | REG_WRITE(ah, AR_PHY_NEW_ADC_DC_GAIN_CORR(i), val); | ||
370 | |||
371 | ath_print(common, ATH_DBG_CALIBRATE, | ||
372 | "ADC DC Offset Cal done for Chain %d\n", i); | ||
373 | } | ||
374 | |||
375 | REG_WRITE(ah, AR_PHY_NEW_ADC_DC_GAIN_CORR(0), | ||
376 | REG_READ(ah, AR_PHY_NEW_ADC_DC_GAIN_CORR(0)) | | ||
377 | AR_PHY_NEW_ADC_DC_OFFSET_CORR_ENABLE); | ||
378 | } | ||
379 | |||
380 | static void ar9287_hw_olc_temp_compensation(struct ath_hw *ah) | ||
381 | { | ||
382 | u32 rddata; | ||
383 | int32_t delta, currPDADC, slope; | ||
384 | |||
385 | rddata = REG_READ(ah, AR_PHY_TX_PWRCTRL4); | ||
386 | currPDADC = MS(rddata, AR_PHY_TX_PWRCTRL_PD_AVG_OUT); | ||
387 | |||
388 | if (ah->initPDADC == 0 || currPDADC == 0) { | ||
389 | /* | ||
390 | * Zero value indicates that no frames have been transmitted | ||
391 | * yet, can't do temperature compensation until frames are | ||
392 | * transmitted. | ||
393 | */ | ||
394 | return; | ||
395 | } else { | ||
396 | slope = ah->eep_ops->get_eeprom(ah, EEP_TEMPSENSE_SLOPE); | ||
397 | |||
398 | if (slope == 0) { /* to avoid divide by zero case */ | ||
399 | delta = 0; | ||
400 | } else { | ||
401 | delta = ((currPDADC - ah->initPDADC)*4) / slope; | ||
402 | } | ||
403 | REG_RMW_FIELD(ah, AR_PHY_CH0_TX_PWRCTRL11, | ||
404 | AR_PHY_TX_PWRCTRL_OLPC_TEMP_COMP, delta); | ||
405 | REG_RMW_FIELD(ah, AR_PHY_CH1_TX_PWRCTRL11, | ||
406 | AR_PHY_TX_PWRCTRL_OLPC_TEMP_COMP, delta); | ||
407 | } | ||
408 | } | ||
409 | |||
410 | static void ar9280_hw_olc_temp_compensation(struct ath_hw *ah) | ||
411 | { | ||
412 | u32 rddata, i; | ||
413 | int delta, currPDADC, regval; | ||
414 | |||
415 | rddata = REG_READ(ah, AR_PHY_TX_PWRCTRL4); | ||
416 | currPDADC = MS(rddata, AR_PHY_TX_PWRCTRL_PD_AVG_OUT); | ||
417 | |||
418 | if (ah->initPDADC == 0 || currPDADC == 0) | ||
419 | return; | ||
420 | |||
421 | if (ah->eep_ops->get_eeprom(ah, EEP_DAC_HPWR_5G)) | ||
422 | delta = (currPDADC - ah->initPDADC + 4) / 8; | ||
423 | else | ||
424 | delta = (currPDADC - ah->initPDADC + 5) / 10; | ||
425 | |||
426 | if (delta != ah->PDADCdelta) { | ||
427 | ah->PDADCdelta = delta; | ||
428 | for (i = 1; i < AR9280_TX_GAIN_TABLE_SIZE; i++) { | ||
429 | regval = ah->originalGain[i] - delta; | ||
430 | if (regval < 0) | ||
431 | regval = 0; | ||
432 | |||
433 | REG_RMW_FIELD(ah, | ||
434 | AR_PHY_TX_GAIN_TBL1 + i * 4, | ||
435 | AR_PHY_TX_GAIN, regval); | ||
436 | } | ||
437 | } | ||
438 | } | ||
439 | |||
440 | static void ar9271_hw_pa_cal(struct ath_hw *ah, bool is_reset) | ||
441 | { | ||
442 | u32 regVal; | ||
443 | unsigned int i; | ||
444 | u32 regList[][2] = { | ||
445 | { 0x786c, 0 }, | ||
446 | { 0x7854, 0 }, | ||
447 | { 0x7820, 0 }, | ||
448 | { 0x7824, 0 }, | ||
449 | { 0x7868, 0 }, | ||
450 | { 0x783c, 0 }, | ||
451 | { 0x7838, 0 } , | ||
452 | { 0x7828, 0 } , | ||
453 | }; | ||
454 | |||
455 | for (i = 0; i < ARRAY_SIZE(regList); i++) | ||
456 | regList[i][1] = REG_READ(ah, regList[i][0]); | ||
457 | |||
458 | regVal = REG_READ(ah, 0x7834); | ||
459 | regVal &= (~(0x1)); | ||
460 | REG_WRITE(ah, 0x7834, regVal); | ||
461 | regVal = REG_READ(ah, 0x9808); | ||
462 | regVal |= (0x1 << 27); | ||
463 | REG_WRITE(ah, 0x9808, regVal); | ||
464 | |||
465 | /* 786c,b23,1, pwddac=1 */ | ||
466 | REG_RMW_FIELD(ah, AR9285_AN_TOP3, AR9285_AN_TOP3_PWDDAC, 1); | ||
467 | /* 7854, b5,1, pdrxtxbb=1 */ | ||
468 | REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDRXTXBB1, 1); | ||
469 | /* 7854, b7,1, pdv2i=1 */ | ||
470 | REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDV2I, 1); | ||
471 | /* 7854, b8,1, pddacinterface=1 */ | ||
472 | REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDDACIF, 1); | ||
473 | /* 7824,b12,0, offcal=0 */ | ||
474 | REG_RMW_FIELD(ah, AR9285_AN_RF2G2, AR9285_AN_RF2G2_OFFCAL, 0); | ||
475 | /* 7838, b1,0, pwddb=0 */ | ||
476 | REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PWDDB, 0); | ||
477 | /* 7820,b11,0, enpacal=0 */ | ||
478 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_ENPACAL, 0); | ||
479 | /* 7820,b25,1, pdpadrv1=0 */ | ||
480 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV1, 0); | ||
481 | /* 7820,b24,0, pdpadrv2=0 */ | ||
482 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV2, 0); | ||
483 | /* 7820,b23,0, pdpaout=0 */ | ||
484 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPAOUT, 0); | ||
485 | /* 783c,b14-16,7, padrvgn2tab_0=7 */ | ||
486 | REG_RMW_FIELD(ah, AR9285_AN_RF2G8, AR9285_AN_RF2G8_PADRVGN2TAB0, 7); | ||
487 | /* | ||
488 | * 7838,b29-31,0, padrvgn1tab_0=0 | ||
489 | * does not matter since we turn it off | ||
490 | */ | ||
491 | REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PADRVGN2TAB0, 0); | ||
492 | |||
493 | REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9271_AN_RF2G3_CCOMP, 0xfff); | ||
494 | |||
495 | /* Set: | ||
496 | * localmode=1,bmode=1,bmoderxtx=1,synthon=1, | ||
497 | * txon=1,paon=1,oscon=1,synthon_force=1 | ||
498 | */ | ||
499 | REG_WRITE(ah, AR9285_AN_TOP2, 0xca0358a0); | ||
500 | udelay(30); | ||
501 | REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9271_AN_RF2G6_OFFS, 0); | ||
502 | |||
503 | /* find off_6_1; */ | ||
504 | for (i = 6; i > 0; i--) { | ||
505 | regVal = REG_READ(ah, 0x7834); | ||
506 | regVal |= (1 << (20 + i)); | ||
507 | REG_WRITE(ah, 0x7834, regVal); | ||
508 | udelay(1); | ||
509 | /* regVal = REG_READ(ah, 0x7834); */ | ||
510 | regVal &= (~(0x1 << (20 + i))); | ||
511 | regVal |= (MS(REG_READ(ah, 0x7840), AR9285_AN_RXTXBB1_SPARE9) | ||
512 | << (20 + i)); | ||
513 | REG_WRITE(ah, 0x7834, regVal); | ||
514 | } | ||
515 | |||
516 | regVal = (regVal >> 20) & 0x7f; | ||
517 | |||
518 | /* Update PA cal info */ | ||
519 | if ((!is_reset) && (ah->pacal_info.prev_offset == regVal)) { | ||
520 | if (ah->pacal_info.max_skipcount < MAX_PACAL_SKIPCOUNT) | ||
521 | ah->pacal_info.max_skipcount = | ||
522 | 2 * ah->pacal_info.max_skipcount; | ||
523 | ah->pacal_info.skipcount = ah->pacal_info.max_skipcount; | ||
524 | } else { | ||
525 | ah->pacal_info.max_skipcount = 1; | ||
526 | ah->pacal_info.skipcount = 0; | ||
527 | ah->pacal_info.prev_offset = regVal; | ||
528 | } | ||
529 | |||
530 | ENABLE_REGWRITE_BUFFER(ah); | ||
531 | |||
532 | regVal = REG_READ(ah, 0x7834); | ||
533 | regVal |= 0x1; | ||
534 | REG_WRITE(ah, 0x7834, regVal); | ||
535 | regVal = REG_READ(ah, 0x9808); | ||
536 | regVal &= (~(0x1 << 27)); | ||
537 | REG_WRITE(ah, 0x9808, regVal); | ||
538 | |||
539 | for (i = 0; i < ARRAY_SIZE(regList); i++) | ||
540 | REG_WRITE(ah, regList[i][0], regList[i][1]); | ||
541 | |||
542 | REGWRITE_BUFFER_FLUSH(ah); | ||
543 | DISABLE_REGWRITE_BUFFER(ah); | ||
544 | } | ||
545 | |||
546 | static inline void ar9285_hw_pa_cal(struct ath_hw *ah, bool is_reset) | ||
547 | { | ||
548 | struct ath_common *common = ath9k_hw_common(ah); | ||
549 | u32 regVal; | ||
550 | int i, offset, offs_6_1, offs_0; | ||
551 | u32 ccomp_org, reg_field; | ||
552 | u32 regList[][2] = { | ||
553 | { 0x786c, 0 }, | ||
554 | { 0x7854, 0 }, | ||
555 | { 0x7820, 0 }, | ||
556 | { 0x7824, 0 }, | ||
557 | { 0x7868, 0 }, | ||
558 | { 0x783c, 0 }, | ||
559 | { 0x7838, 0 }, | ||
560 | }; | ||
561 | |||
562 | ath_print(common, ATH_DBG_CALIBRATE, "Running PA Calibration\n"); | ||
563 | |||
564 | /* PA CAL is not needed for high power solution */ | ||
565 | if (ah->eep_ops->get_eeprom(ah, EEP_TXGAIN_TYPE) == | ||
566 | AR5416_EEP_TXGAIN_HIGH_POWER) | ||
567 | return; | ||
568 | |||
569 | if (AR_SREV_9285_11(ah)) { | ||
570 | REG_WRITE(ah, AR9285_AN_TOP4, (AR9285_AN_TOP4_DEFAULT | 0x14)); | ||
571 | udelay(10); | ||
572 | } | ||
573 | |||
574 | for (i = 0; i < ARRAY_SIZE(regList); i++) | ||
575 | regList[i][1] = REG_READ(ah, regList[i][0]); | ||
576 | |||
577 | regVal = REG_READ(ah, 0x7834); | ||
578 | regVal &= (~(0x1)); | ||
579 | REG_WRITE(ah, 0x7834, regVal); | ||
580 | regVal = REG_READ(ah, 0x9808); | ||
581 | regVal |= (0x1 << 27); | ||
582 | REG_WRITE(ah, 0x9808, regVal); | ||
583 | |||
584 | REG_RMW_FIELD(ah, AR9285_AN_TOP3, AR9285_AN_TOP3_PWDDAC, 1); | ||
585 | REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDRXTXBB1, 1); | ||
586 | REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDV2I, 1); | ||
587 | REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDDACIF, 1); | ||
588 | REG_RMW_FIELD(ah, AR9285_AN_RF2G2, AR9285_AN_RF2G2_OFFCAL, 0); | ||
589 | REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PWDDB, 0); | ||
590 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_ENPACAL, 0); | ||
591 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV1, 0); | ||
592 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV2, 0); | ||
593 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPAOUT, 0); | ||
594 | REG_RMW_FIELD(ah, AR9285_AN_RF2G8, AR9285_AN_RF2G8_PADRVGN2TAB0, 7); | ||
595 | REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PADRVGN2TAB0, 0); | ||
596 | ccomp_org = MS(REG_READ(ah, AR9285_AN_RF2G6), AR9285_AN_RF2G6_CCOMP); | ||
597 | REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9285_AN_RF2G6_CCOMP, 0xf); | ||
598 | |||
599 | REG_WRITE(ah, AR9285_AN_TOP2, 0xca0358a0); | ||
600 | udelay(30); | ||
601 | REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9285_AN_RF2G6_OFFS, 0); | ||
602 | REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9285_AN_RF2G3_PDVCCOMP, 0); | ||
603 | |||
604 | for (i = 6; i > 0; i--) { | ||
605 | regVal = REG_READ(ah, 0x7834); | ||
606 | regVal |= (1 << (19 + i)); | ||
607 | REG_WRITE(ah, 0x7834, regVal); | ||
608 | udelay(1); | ||
609 | regVal = REG_READ(ah, 0x7834); | ||
610 | regVal &= (~(0x1 << (19 + i))); | ||
611 | reg_field = MS(REG_READ(ah, 0x7840), AR9285_AN_RXTXBB1_SPARE9); | ||
612 | regVal |= (reg_field << (19 + i)); | ||
613 | REG_WRITE(ah, 0x7834, regVal); | ||
614 | } | ||
615 | |||
616 | REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9285_AN_RF2G3_PDVCCOMP, 1); | ||
617 | udelay(1); | ||
618 | reg_field = MS(REG_READ(ah, AR9285_AN_RF2G9), AR9285_AN_RXTXBB1_SPARE9); | ||
619 | REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9285_AN_RF2G3_PDVCCOMP, reg_field); | ||
620 | offs_6_1 = MS(REG_READ(ah, AR9285_AN_RF2G6), AR9285_AN_RF2G6_OFFS); | ||
621 | offs_0 = MS(REG_READ(ah, AR9285_AN_RF2G3), AR9285_AN_RF2G3_PDVCCOMP); | ||
622 | |||
623 | offset = (offs_6_1<<1) | offs_0; | ||
624 | offset = offset - 0; | ||
625 | offs_6_1 = offset>>1; | ||
626 | offs_0 = offset & 1; | ||
627 | |||
628 | if ((!is_reset) && (ah->pacal_info.prev_offset == offset)) { | ||
629 | if (ah->pacal_info.max_skipcount < MAX_PACAL_SKIPCOUNT) | ||
630 | ah->pacal_info.max_skipcount = | ||
631 | 2 * ah->pacal_info.max_skipcount; | ||
632 | ah->pacal_info.skipcount = ah->pacal_info.max_skipcount; | ||
633 | } else { | ||
634 | ah->pacal_info.max_skipcount = 1; | ||
635 | ah->pacal_info.skipcount = 0; | ||
636 | ah->pacal_info.prev_offset = offset; | ||
637 | } | ||
638 | |||
639 | REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9285_AN_RF2G6_OFFS, offs_6_1); | ||
640 | REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9285_AN_RF2G3_PDVCCOMP, offs_0); | ||
641 | |||
642 | regVal = REG_READ(ah, 0x7834); | ||
643 | regVal |= 0x1; | ||
644 | REG_WRITE(ah, 0x7834, regVal); | ||
645 | regVal = REG_READ(ah, 0x9808); | ||
646 | regVal &= (~(0x1 << 27)); | ||
647 | REG_WRITE(ah, 0x9808, regVal); | ||
648 | |||
649 | for (i = 0; i < ARRAY_SIZE(regList); i++) | ||
650 | REG_WRITE(ah, regList[i][0], regList[i][1]); | ||
651 | |||
652 | REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9285_AN_RF2G6_CCOMP, ccomp_org); | ||
653 | |||
654 | if (AR_SREV_9285_11(ah)) | ||
655 | REG_WRITE(ah, AR9285_AN_TOP4, AR9285_AN_TOP4_DEFAULT); | ||
656 | |||
657 | } | ||
658 | |||
659 | static void ar9002_hw_pa_cal(struct ath_hw *ah, bool is_reset) | ||
660 | { | ||
661 | if (AR_SREV_9271(ah)) { | ||
662 | if (is_reset || !ah->pacal_info.skipcount) | ||
663 | ar9271_hw_pa_cal(ah, is_reset); | ||
664 | else | ||
665 | ah->pacal_info.skipcount--; | ||
666 | } else if (AR_SREV_9285_11_OR_LATER(ah)) { | ||
667 | if (is_reset || !ah->pacal_info.skipcount) | ||
668 | ar9285_hw_pa_cal(ah, is_reset); | ||
669 | else | ||
670 | ah->pacal_info.skipcount--; | ||
671 | } | ||
672 | } | ||
673 | |||
674 | static void ar9002_hw_olc_temp_compensation(struct ath_hw *ah) | ||
675 | { | ||
676 | if (OLC_FOR_AR9287_10_LATER) | ||
677 | ar9287_hw_olc_temp_compensation(ah); | ||
678 | else if (OLC_FOR_AR9280_20_LATER) | ||
679 | ar9280_hw_olc_temp_compensation(ah); | ||
680 | } | ||
681 | |||
682 | static bool ar9002_hw_calibrate(struct ath_hw *ah, | ||
683 | struct ath9k_channel *chan, | ||
684 | u8 rxchainmask, | ||
685 | bool longcal) | ||
686 | { | ||
687 | bool iscaldone = true; | ||
688 | struct ath9k_cal_list *currCal = ah->cal_list_curr; | ||
689 | |||
690 | if (currCal && | ||
691 | (currCal->calState == CAL_RUNNING || | ||
692 | currCal->calState == CAL_WAITING)) { | ||
693 | iscaldone = ar9002_hw_per_calibration(ah, chan, | ||
694 | rxchainmask, currCal); | ||
695 | if (iscaldone) { | ||
696 | ah->cal_list_curr = currCal = currCal->calNext; | ||
697 | |||
698 | if (currCal->calState == CAL_WAITING) { | ||
699 | iscaldone = false; | ||
700 | ath9k_hw_reset_calibration(ah, currCal); | ||
701 | } | ||
702 | } | ||
703 | } | ||
704 | |||
705 | /* Do NF cal only at longer intervals */ | ||
706 | if (longcal) { | ||
707 | /* Do periodic PAOffset Cal */ | ||
708 | ar9002_hw_pa_cal(ah, false); | ||
709 | ar9002_hw_olc_temp_compensation(ah); | ||
710 | |||
711 | /* | ||
712 | * Get the value from the previous NF cal and update | ||
713 | * history buffer. | ||
714 | */ | ||
715 | ath9k_hw_getnf(ah, chan); | ||
716 | |||
717 | /* | ||
718 | * Load the NF from history buffer of the current channel. | ||
719 | * NF is slow time-variant, so it is OK to use a historical | ||
720 | * value. | ||
721 | */ | ||
722 | ath9k_hw_loadnf(ah, ah->curchan); | ||
723 | |||
724 | ath9k_hw_start_nfcal(ah); | ||
725 | } | ||
726 | |||
727 | return iscaldone; | ||
728 | } | ||
729 | |||
730 | /* Carrier leakage Calibration fix */ | ||
731 | static bool ar9285_hw_cl_cal(struct ath_hw *ah, struct ath9k_channel *chan) | ||
732 | { | ||
733 | struct ath_common *common = ath9k_hw_common(ah); | ||
734 | |||
735 | REG_SET_BIT(ah, AR_PHY_CL_CAL_CTL, AR_PHY_CL_CAL_ENABLE); | ||
736 | if (IS_CHAN_HT20(chan)) { | ||
737 | REG_SET_BIT(ah, AR_PHY_CL_CAL_CTL, AR_PHY_PARALLEL_CAL_ENABLE); | ||
738 | REG_SET_BIT(ah, AR_PHY_TURBO, AR_PHY_FC_DYN2040_EN); | ||
739 | REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, | ||
740 | AR_PHY_AGC_CONTROL_FLTR_CAL); | ||
741 | REG_CLR_BIT(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_CAL_ENABLE); | ||
742 | REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_CAL); | ||
743 | if (!ath9k_hw_wait(ah, AR_PHY_AGC_CONTROL, | ||
744 | AR_PHY_AGC_CONTROL_CAL, 0, AH_WAIT_TIMEOUT)) { | ||
745 | ath_print(common, ATH_DBG_CALIBRATE, "offset " | ||
746 | "calibration failed to complete in " | ||
747 | "1ms; noisy ??\n"); | ||
748 | return false; | ||
749 | } | ||
750 | REG_CLR_BIT(ah, AR_PHY_TURBO, AR_PHY_FC_DYN2040_EN); | ||
751 | REG_CLR_BIT(ah, AR_PHY_CL_CAL_CTL, AR_PHY_PARALLEL_CAL_ENABLE); | ||
752 | REG_CLR_BIT(ah, AR_PHY_CL_CAL_CTL, AR_PHY_CL_CAL_ENABLE); | ||
753 | } | ||
754 | REG_CLR_BIT(ah, AR_PHY_ADC_CTL, AR_PHY_ADC_CTL_OFF_PWDADC); | ||
755 | REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_FLTR_CAL); | ||
756 | REG_SET_BIT(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_CAL_ENABLE); | ||
757 | REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_CAL); | ||
758 | if (!ath9k_hw_wait(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_CAL, | ||
759 | 0, AH_WAIT_TIMEOUT)) { | ||
760 | ath_print(common, ATH_DBG_CALIBRATE, "offset calibration " | ||
761 | "failed to complete in 1ms; noisy ??\n"); | ||
762 | return false; | ||
763 | } | ||
764 | |||
765 | REG_SET_BIT(ah, AR_PHY_ADC_CTL, AR_PHY_ADC_CTL_OFF_PWDADC); | ||
766 | REG_CLR_BIT(ah, AR_PHY_CL_CAL_CTL, AR_PHY_CL_CAL_ENABLE); | ||
767 | REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_FLTR_CAL); | ||
768 | |||
769 | return true; | ||
770 | } | ||
771 | |||
772 | static bool ar9285_hw_clc(struct ath_hw *ah, struct ath9k_channel *chan) | ||
773 | { | ||
774 | int i; | ||
775 | u_int32_t txgain_max; | ||
776 | u_int32_t clc_gain, gain_mask = 0, clc_num = 0; | ||
777 | u_int32_t reg_clc_I0, reg_clc_Q0; | ||
778 | u_int32_t i0_num = 0; | ||
779 | u_int32_t q0_num = 0; | ||
780 | u_int32_t total_num = 0; | ||
781 | u_int32_t reg_rf2g5_org; | ||
782 | bool retv = true; | ||
783 | |||
784 | if (!(ar9285_hw_cl_cal(ah, chan))) | ||
785 | return false; | ||
786 | |||
787 | txgain_max = MS(REG_READ(ah, AR_PHY_TX_PWRCTRL7), | ||
788 | AR_PHY_TX_PWRCTRL_TX_GAIN_TAB_MAX); | ||
789 | |||
790 | for (i = 0; i < (txgain_max+1); i++) { | ||
791 | clc_gain = (REG_READ(ah, (AR_PHY_TX_GAIN_TBL1+(i<<2))) & | ||
792 | AR_PHY_TX_GAIN_CLC) >> AR_PHY_TX_GAIN_CLC_S; | ||
793 | if (!(gain_mask & (1 << clc_gain))) { | ||
794 | gain_mask |= (1 << clc_gain); | ||
795 | clc_num++; | ||
796 | } | ||
797 | } | ||
798 | |||
799 | for (i = 0; i < clc_num; i++) { | ||
800 | reg_clc_I0 = (REG_READ(ah, (AR_PHY_CLC_TBL1 + (i << 2))) | ||
801 | & AR_PHY_CLC_I0) >> AR_PHY_CLC_I0_S; | ||
802 | reg_clc_Q0 = (REG_READ(ah, (AR_PHY_CLC_TBL1 + (i << 2))) | ||
803 | & AR_PHY_CLC_Q0) >> AR_PHY_CLC_Q0_S; | ||
804 | if (reg_clc_I0 == 0) | ||
805 | i0_num++; | ||
806 | |||
807 | if (reg_clc_Q0 == 0) | ||
808 | q0_num++; | ||
809 | } | ||
810 | total_num = i0_num + q0_num; | ||
811 | if (total_num > AR9285_CLCAL_REDO_THRESH) { | ||
812 | reg_rf2g5_org = REG_READ(ah, AR9285_RF2G5); | ||
813 | if (AR_SREV_9285E_20(ah)) { | ||
814 | REG_WRITE(ah, AR9285_RF2G5, | ||
815 | (reg_rf2g5_org & AR9285_RF2G5_IC50TX) | | ||
816 | AR9285_RF2G5_IC50TX_XE_SET); | ||
817 | } else { | ||
818 | REG_WRITE(ah, AR9285_RF2G5, | ||
819 | (reg_rf2g5_org & AR9285_RF2G5_IC50TX) | | ||
820 | AR9285_RF2G5_IC50TX_SET); | ||
821 | } | ||
822 | retv = ar9285_hw_cl_cal(ah, chan); | ||
823 | REG_WRITE(ah, AR9285_RF2G5, reg_rf2g5_org); | ||
824 | } | ||
825 | return retv; | ||
826 | } | ||
827 | |||
828 | static bool ar9002_hw_init_cal(struct ath_hw *ah, struct ath9k_channel *chan) | ||
829 | { | ||
830 | struct ath_common *common = ath9k_hw_common(ah); | ||
831 | |||
832 | if (AR_SREV_9271(ah) || AR_SREV_9285_12_OR_LATER(ah)) { | ||
833 | if (!ar9285_hw_clc(ah, chan)) | ||
834 | return false; | ||
835 | } else { | ||
836 | if (AR_SREV_9280_10_OR_LATER(ah)) { | ||
837 | if (!AR_SREV_9287_10_OR_LATER(ah)) | ||
838 | REG_CLR_BIT(ah, AR_PHY_ADC_CTL, | ||
839 | AR_PHY_ADC_CTL_OFF_PWDADC); | ||
840 | REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, | ||
841 | AR_PHY_AGC_CONTROL_FLTR_CAL); | ||
842 | } | ||
843 | |||
844 | /* Calibrate the AGC */ | ||
845 | REG_WRITE(ah, AR_PHY_AGC_CONTROL, | ||
846 | REG_READ(ah, AR_PHY_AGC_CONTROL) | | ||
847 | AR_PHY_AGC_CONTROL_CAL); | ||
848 | |||
849 | /* Poll for offset calibration complete */ | ||
850 | if (!ath9k_hw_wait(ah, AR_PHY_AGC_CONTROL, | ||
851 | AR_PHY_AGC_CONTROL_CAL, | ||
852 | 0, AH_WAIT_TIMEOUT)) { | ||
853 | ath_print(common, ATH_DBG_CALIBRATE, | ||
854 | "offset calibration failed to " | ||
855 | "complete in 1ms; noisy environment?\n"); | ||
856 | return false; | ||
857 | } | ||
858 | |||
859 | if (AR_SREV_9280_10_OR_LATER(ah)) { | ||
860 | if (!AR_SREV_9287_10_OR_LATER(ah)) | ||
861 | REG_SET_BIT(ah, AR_PHY_ADC_CTL, | ||
862 | AR_PHY_ADC_CTL_OFF_PWDADC); | ||
863 | REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, | ||
864 | AR_PHY_AGC_CONTROL_FLTR_CAL); | ||
865 | } | ||
866 | } | ||
867 | |||
868 | /* Do PA Calibration */ | ||
869 | ar9002_hw_pa_cal(ah, true); | ||
870 | |||
871 | /* Do NF Calibration after DC offset and other calibrations */ | ||
872 | REG_WRITE(ah, AR_PHY_AGC_CONTROL, | ||
873 | REG_READ(ah, AR_PHY_AGC_CONTROL) | AR_PHY_AGC_CONTROL_NF); | ||
874 | |||
875 | ah->cal_list = ah->cal_list_last = ah->cal_list_curr = NULL; | ||
876 | |||
877 | /* Enable IQ, ADC Gain and ADC DC offset CALs */ | ||
878 | if (AR_SREV_9100(ah) || AR_SREV_9160_10_OR_LATER(ah)) { | ||
879 | if (ar9002_hw_iscal_supported(ah, ADC_GAIN_CAL)) { | ||
880 | INIT_CAL(&ah->adcgain_caldata); | ||
881 | INSERT_CAL(ah, &ah->adcgain_caldata); | ||
882 | ath_print(common, ATH_DBG_CALIBRATE, | ||
883 | "enabling ADC Gain Calibration.\n"); | ||
884 | } | ||
885 | if (ar9002_hw_iscal_supported(ah, ADC_DC_CAL)) { | ||
886 | INIT_CAL(&ah->adcdc_caldata); | ||
887 | INSERT_CAL(ah, &ah->adcdc_caldata); | ||
888 | ath_print(common, ATH_DBG_CALIBRATE, | ||
889 | "enabling ADC DC Calibration.\n"); | ||
890 | } | ||
891 | if (ar9002_hw_iscal_supported(ah, IQ_MISMATCH_CAL)) { | ||
892 | INIT_CAL(&ah->iq_caldata); | ||
893 | INSERT_CAL(ah, &ah->iq_caldata); | ||
894 | ath_print(common, ATH_DBG_CALIBRATE, | ||
895 | "enabling IQ Calibration.\n"); | ||
896 | } | ||
897 | |||
898 | ah->cal_list_curr = ah->cal_list; | ||
899 | |||
900 | if (ah->cal_list_curr) | ||
901 | ath9k_hw_reset_calibration(ah, ah->cal_list_curr); | ||
902 | } | ||
903 | |||
904 | chan->CalValid = 0; | ||
905 | |||
906 | return true; | ||
907 | } | ||
908 | |||
909 | static const struct ath9k_percal_data iq_cal_multi_sample = { | ||
910 | IQ_MISMATCH_CAL, | ||
911 | MAX_CAL_SAMPLES, | ||
912 | PER_MIN_LOG_COUNT, | ||
913 | ar9002_hw_iqcal_collect, | ||
914 | ar9002_hw_iqcalibrate | ||
915 | }; | ||
916 | static const struct ath9k_percal_data iq_cal_single_sample = { | ||
917 | IQ_MISMATCH_CAL, | ||
918 | MIN_CAL_SAMPLES, | ||
919 | PER_MAX_LOG_COUNT, | ||
920 | ar9002_hw_iqcal_collect, | ||
921 | ar9002_hw_iqcalibrate | ||
922 | }; | ||
923 | static const struct ath9k_percal_data adc_gain_cal_multi_sample = { | ||
924 | ADC_GAIN_CAL, | ||
925 | MAX_CAL_SAMPLES, | ||
926 | PER_MIN_LOG_COUNT, | ||
927 | ar9002_hw_adc_gaincal_collect, | ||
928 | ar9002_hw_adc_gaincal_calibrate | ||
929 | }; | ||
930 | static const struct ath9k_percal_data adc_gain_cal_single_sample = { | ||
931 | ADC_GAIN_CAL, | ||
932 | MIN_CAL_SAMPLES, | ||
933 | PER_MAX_LOG_COUNT, | ||
934 | ar9002_hw_adc_gaincal_collect, | ||
935 | ar9002_hw_adc_gaincal_calibrate | ||
936 | }; | ||
937 | static const struct ath9k_percal_data adc_dc_cal_multi_sample = { | ||
938 | ADC_DC_CAL, | ||
939 | MAX_CAL_SAMPLES, | ||
940 | PER_MIN_LOG_COUNT, | ||
941 | ar9002_hw_adc_dccal_collect, | ||
942 | ar9002_hw_adc_dccal_calibrate | ||
943 | }; | ||
944 | static const struct ath9k_percal_data adc_dc_cal_single_sample = { | ||
945 | ADC_DC_CAL, | ||
946 | MIN_CAL_SAMPLES, | ||
947 | PER_MAX_LOG_COUNT, | ||
948 | ar9002_hw_adc_dccal_collect, | ||
949 | ar9002_hw_adc_dccal_calibrate | ||
950 | }; | ||
951 | static const struct ath9k_percal_data adc_init_dc_cal = { | ||
952 | ADC_DC_INIT_CAL, | ||
953 | MIN_CAL_SAMPLES, | ||
954 | INIT_LOG_COUNT, | ||
955 | ar9002_hw_adc_dccal_collect, | ||
956 | ar9002_hw_adc_dccal_calibrate | ||
957 | }; | ||
958 | |||
959 | static void ar9002_hw_init_cal_settings(struct ath_hw *ah) | ||
960 | { | ||
961 | if (AR_SREV_9100(ah)) { | ||
962 | ah->iq_caldata.calData = &iq_cal_multi_sample; | ||
963 | ah->supp_cals = IQ_MISMATCH_CAL; | ||
964 | return; | ||
965 | } | ||
966 | |||
967 | if (AR_SREV_9160_10_OR_LATER(ah)) { | ||
968 | if (AR_SREV_9280_10_OR_LATER(ah)) { | ||
969 | ah->iq_caldata.calData = &iq_cal_single_sample; | ||
970 | ah->adcgain_caldata.calData = | ||
971 | &adc_gain_cal_single_sample; | ||
972 | ah->adcdc_caldata.calData = | ||
973 | &adc_dc_cal_single_sample; | ||
974 | ah->adcdc_calinitdata.calData = | ||
975 | &adc_init_dc_cal; | ||
976 | } else { | ||
977 | ah->iq_caldata.calData = &iq_cal_multi_sample; | ||
978 | ah->adcgain_caldata.calData = | ||
979 | &adc_gain_cal_multi_sample; | ||
980 | ah->adcdc_caldata.calData = | ||
981 | &adc_dc_cal_multi_sample; | ||
982 | ah->adcdc_calinitdata.calData = | ||
983 | &adc_init_dc_cal; | ||
984 | } | ||
985 | ah->supp_cals = ADC_GAIN_CAL | ADC_DC_CAL | IQ_MISMATCH_CAL; | ||
986 | } | ||
987 | } | ||
988 | |||
989 | void ar9002_hw_attach_calib_ops(struct ath_hw *ah) | ||
990 | { | ||
991 | struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); | ||
992 | struct ath_hw_ops *ops = ath9k_hw_ops(ah); | ||
993 | |||
994 | priv_ops->init_cal_settings = ar9002_hw_init_cal_settings; | ||
995 | priv_ops->init_cal = ar9002_hw_init_cal; | ||
996 | priv_ops->setup_calibration = ar9002_hw_setup_calibration; | ||
997 | priv_ops->iscal_supported = ar9002_hw_iscal_supported; | ||
998 | |||
999 | ops->calibrate = ar9002_hw_calibrate; | ||
1000 | } | ||
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_hw.c b/drivers/net/wireless/ath/ath9k/ar9002_hw.c new file mode 100644 index 000000000000..adb33b34a56d --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/ar9002_hw.c | |||
@@ -0,0 +1,593 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2008-2010 Atheros Communications Inc. | ||
3 | * | ||
4 | * Permission to use, copy, modify, and/or distribute this software for any | ||
5 | * purpose with or without fee is hereby granted, provided that the above | ||
6 | * copyright notice and this permission notice appear in all copies. | ||
7 | * | ||
8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
15 | */ | ||
16 | |||
17 | #include "hw.h" | ||
18 | #include "ar5008_initvals.h" | ||
19 | #include "ar9001_initvals.h" | ||
20 | #include "ar9002_initvals.h" | ||
21 | |||
22 | /* General hardware code for the A5008/AR9001/AR9002 hadware families */ | ||
23 | |||
24 | static bool ar9002_hw_macversion_supported(u32 macversion) | ||
25 | { | ||
26 | switch (macversion) { | ||
27 | case AR_SREV_VERSION_5416_PCI: | ||
28 | case AR_SREV_VERSION_5416_PCIE: | ||
29 | case AR_SREV_VERSION_9160: | ||
30 | case AR_SREV_VERSION_9100: | ||
31 | case AR_SREV_VERSION_9280: | ||
32 | case AR_SREV_VERSION_9285: | ||
33 | case AR_SREV_VERSION_9287: | ||
34 | case AR_SREV_VERSION_9271: | ||
35 | return true; | ||
36 | default: | ||
37 | break; | ||
38 | } | ||
39 | return false; | ||
40 | } | ||
41 | |||
42 | static void ar9002_hw_init_mode_regs(struct ath_hw *ah) | ||
43 | { | ||
44 | if (AR_SREV_9271(ah)) { | ||
45 | INIT_INI_ARRAY(&ah->iniModes, ar9271Modes_9271, | ||
46 | ARRAY_SIZE(ar9271Modes_9271), 6); | ||
47 | INIT_INI_ARRAY(&ah->iniCommon, ar9271Common_9271, | ||
48 | ARRAY_SIZE(ar9271Common_9271), 2); | ||
49 | INIT_INI_ARRAY(&ah->iniCommon_normal_cck_fir_coeff_9271, | ||
50 | ar9271Common_normal_cck_fir_coeff_9271, | ||
51 | ARRAY_SIZE(ar9271Common_normal_cck_fir_coeff_9271), 2); | ||
52 | INIT_INI_ARRAY(&ah->iniCommon_japan_2484_cck_fir_coeff_9271, | ||
53 | ar9271Common_japan_2484_cck_fir_coeff_9271, | ||
54 | ARRAY_SIZE(ar9271Common_japan_2484_cck_fir_coeff_9271), 2); | ||
55 | INIT_INI_ARRAY(&ah->iniModes_9271_1_0_only, | ||
56 | ar9271Modes_9271_1_0_only, | ||
57 | ARRAY_SIZE(ar9271Modes_9271_1_0_only), 6); | ||
58 | INIT_INI_ARRAY(&ah->iniModes_9271_ANI_reg, ar9271Modes_9271_ANI_reg, | ||
59 | ARRAY_SIZE(ar9271Modes_9271_ANI_reg), 6); | ||
60 | INIT_INI_ARRAY(&ah->iniModes_high_power_tx_gain_9271, | ||
61 | ar9271Modes_high_power_tx_gain_9271, | ||
62 | ARRAY_SIZE(ar9271Modes_high_power_tx_gain_9271), 6); | ||
63 | INIT_INI_ARRAY(&ah->iniModes_normal_power_tx_gain_9271, | ||
64 | ar9271Modes_normal_power_tx_gain_9271, | ||
65 | ARRAY_SIZE(ar9271Modes_normal_power_tx_gain_9271), 6); | ||
66 | return; | ||
67 | } | ||
68 | |||
69 | if (AR_SREV_9287_11_OR_LATER(ah)) { | ||
70 | INIT_INI_ARRAY(&ah->iniModes, ar9287Modes_9287_1_1, | ||
71 | ARRAY_SIZE(ar9287Modes_9287_1_1), 6); | ||
72 | INIT_INI_ARRAY(&ah->iniCommon, ar9287Common_9287_1_1, | ||
73 | ARRAY_SIZE(ar9287Common_9287_1_1), 2); | ||
74 | if (ah->config.pcie_clock_req) | ||
75 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | ||
76 | ar9287PciePhy_clkreq_off_L1_9287_1_1, | ||
77 | ARRAY_SIZE(ar9287PciePhy_clkreq_off_L1_9287_1_1), 2); | ||
78 | else | ||
79 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | ||
80 | ar9287PciePhy_clkreq_always_on_L1_9287_1_1, | ||
81 | ARRAY_SIZE(ar9287PciePhy_clkreq_always_on_L1_9287_1_1), | ||
82 | 2); | ||
83 | } else if (AR_SREV_9287_10_OR_LATER(ah)) { | ||
84 | INIT_INI_ARRAY(&ah->iniModes, ar9287Modes_9287_1_0, | ||
85 | ARRAY_SIZE(ar9287Modes_9287_1_0), 6); | ||
86 | INIT_INI_ARRAY(&ah->iniCommon, ar9287Common_9287_1_0, | ||
87 | ARRAY_SIZE(ar9287Common_9287_1_0), 2); | ||
88 | |||
89 | if (ah->config.pcie_clock_req) | ||
90 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | ||
91 | ar9287PciePhy_clkreq_off_L1_9287_1_0, | ||
92 | ARRAY_SIZE(ar9287PciePhy_clkreq_off_L1_9287_1_0), 2); | ||
93 | else | ||
94 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | ||
95 | ar9287PciePhy_clkreq_always_on_L1_9287_1_0, | ||
96 | ARRAY_SIZE(ar9287PciePhy_clkreq_always_on_L1_9287_1_0), | ||
97 | 2); | ||
98 | } else if (AR_SREV_9285_12_OR_LATER(ah)) { | ||
99 | |||
100 | |||
101 | INIT_INI_ARRAY(&ah->iniModes, ar9285Modes_9285_1_2, | ||
102 | ARRAY_SIZE(ar9285Modes_9285_1_2), 6); | ||
103 | INIT_INI_ARRAY(&ah->iniCommon, ar9285Common_9285_1_2, | ||
104 | ARRAY_SIZE(ar9285Common_9285_1_2), 2); | ||
105 | |||
106 | if (ah->config.pcie_clock_req) { | ||
107 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | ||
108 | ar9285PciePhy_clkreq_off_L1_9285_1_2, | ||
109 | ARRAY_SIZE(ar9285PciePhy_clkreq_off_L1_9285_1_2), 2); | ||
110 | } else { | ||
111 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | ||
112 | ar9285PciePhy_clkreq_always_on_L1_9285_1_2, | ||
113 | ARRAY_SIZE(ar9285PciePhy_clkreq_always_on_L1_9285_1_2), | ||
114 | 2); | ||
115 | } | ||
116 | } else if (AR_SREV_9285_10_OR_LATER(ah)) { | ||
117 | INIT_INI_ARRAY(&ah->iniModes, ar9285Modes_9285, | ||
118 | ARRAY_SIZE(ar9285Modes_9285), 6); | ||
119 | INIT_INI_ARRAY(&ah->iniCommon, ar9285Common_9285, | ||
120 | ARRAY_SIZE(ar9285Common_9285), 2); | ||
121 | |||
122 | if (ah->config.pcie_clock_req) { | ||
123 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | ||
124 | ar9285PciePhy_clkreq_off_L1_9285, | ||
125 | ARRAY_SIZE(ar9285PciePhy_clkreq_off_L1_9285), 2); | ||
126 | } else { | ||
127 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | ||
128 | ar9285PciePhy_clkreq_always_on_L1_9285, | ||
129 | ARRAY_SIZE(ar9285PciePhy_clkreq_always_on_L1_9285), 2); | ||
130 | } | ||
131 | } else if (AR_SREV_9280_20_OR_LATER(ah)) { | ||
132 | INIT_INI_ARRAY(&ah->iniModes, ar9280Modes_9280_2, | ||
133 | ARRAY_SIZE(ar9280Modes_9280_2), 6); | ||
134 | INIT_INI_ARRAY(&ah->iniCommon, ar9280Common_9280_2, | ||
135 | ARRAY_SIZE(ar9280Common_9280_2), 2); | ||
136 | |||
137 | if (ah->config.pcie_clock_req) { | ||
138 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | ||
139 | ar9280PciePhy_clkreq_off_L1_9280, | ||
140 | ARRAY_SIZE(ar9280PciePhy_clkreq_off_L1_9280), 2); | ||
141 | } else { | ||
142 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | ||
143 | ar9280PciePhy_clkreq_always_on_L1_9280, | ||
144 | ARRAY_SIZE(ar9280PciePhy_clkreq_always_on_L1_9280), 2); | ||
145 | } | ||
146 | INIT_INI_ARRAY(&ah->iniModesAdditional, | ||
147 | ar9280Modes_fast_clock_9280_2, | ||
148 | ARRAY_SIZE(ar9280Modes_fast_clock_9280_2), 3); | ||
149 | } else if (AR_SREV_9280_10_OR_LATER(ah)) { | ||
150 | INIT_INI_ARRAY(&ah->iniModes, ar9280Modes_9280, | ||
151 | ARRAY_SIZE(ar9280Modes_9280), 6); | ||
152 | INIT_INI_ARRAY(&ah->iniCommon, ar9280Common_9280, | ||
153 | ARRAY_SIZE(ar9280Common_9280), 2); | ||
154 | } else if (AR_SREV_9160_10_OR_LATER(ah)) { | ||
155 | INIT_INI_ARRAY(&ah->iniModes, ar5416Modes_9160, | ||
156 | ARRAY_SIZE(ar5416Modes_9160), 6); | ||
157 | INIT_INI_ARRAY(&ah->iniCommon, ar5416Common_9160, | ||
158 | ARRAY_SIZE(ar5416Common_9160), 2); | ||
159 | INIT_INI_ARRAY(&ah->iniBank0, ar5416Bank0_9160, | ||
160 | ARRAY_SIZE(ar5416Bank0_9160), 2); | ||
161 | INIT_INI_ARRAY(&ah->iniBB_RfGain, ar5416BB_RfGain_9160, | ||
162 | ARRAY_SIZE(ar5416BB_RfGain_9160), 3); | ||
163 | INIT_INI_ARRAY(&ah->iniBank1, ar5416Bank1_9160, | ||
164 | ARRAY_SIZE(ar5416Bank1_9160), 2); | ||
165 | INIT_INI_ARRAY(&ah->iniBank2, ar5416Bank2_9160, | ||
166 | ARRAY_SIZE(ar5416Bank2_9160), 2); | ||
167 | INIT_INI_ARRAY(&ah->iniBank3, ar5416Bank3_9160, | ||
168 | ARRAY_SIZE(ar5416Bank3_9160), 3); | ||
169 | INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6_9160, | ||
170 | ARRAY_SIZE(ar5416Bank6_9160), 3); | ||
171 | INIT_INI_ARRAY(&ah->iniBank6TPC, ar5416Bank6TPC_9160, | ||
172 | ARRAY_SIZE(ar5416Bank6TPC_9160), 3); | ||
173 | INIT_INI_ARRAY(&ah->iniBank7, ar5416Bank7_9160, | ||
174 | ARRAY_SIZE(ar5416Bank7_9160), 2); | ||
175 | if (AR_SREV_9160_11(ah)) { | ||
176 | INIT_INI_ARRAY(&ah->iniAddac, | ||
177 | ar5416Addac_91601_1, | ||
178 | ARRAY_SIZE(ar5416Addac_91601_1), 2); | ||
179 | } else { | ||
180 | INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac_9160, | ||
181 | ARRAY_SIZE(ar5416Addac_9160), 2); | ||
182 | } | ||
183 | } else if (AR_SREV_9100_OR_LATER(ah)) { | ||
184 | INIT_INI_ARRAY(&ah->iniModes, ar5416Modes_9100, | ||
185 | ARRAY_SIZE(ar5416Modes_9100), 6); | ||
186 | INIT_INI_ARRAY(&ah->iniCommon, ar5416Common_9100, | ||
187 | ARRAY_SIZE(ar5416Common_9100), 2); | ||
188 | INIT_INI_ARRAY(&ah->iniBank0, ar5416Bank0_9100, | ||
189 | ARRAY_SIZE(ar5416Bank0_9100), 2); | ||
190 | INIT_INI_ARRAY(&ah->iniBB_RfGain, ar5416BB_RfGain_9100, | ||
191 | ARRAY_SIZE(ar5416BB_RfGain_9100), 3); | ||
192 | INIT_INI_ARRAY(&ah->iniBank1, ar5416Bank1_9100, | ||
193 | ARRAY_SIZE(ar5416Bank1_9100), 2); | ||
194 | INIT_INI_ARRAY(&ah->iniBank2, ar5416Bank2_9100, | ||
195 | ARRAY_SIZE(ar5416Bank2_9100), 2); | ||
196 | INIT_INI_ARRAY(&ah->iniBank3, ar5416Bank3_9100, | ||
197 | ARRAY_SIZE(ar5416Bank3_9100), 3); | ||
198 | INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6_9100, | ||
199 | ARRAY_SIZE(ar5416Bank6_9100), 3); | ||
200 | INIT_INI_ARRAY(&ah->iniBank6TPC, ar5416Bank6TPC_9100, | ||
201 | ARRAY_SIZE(ar5416Bank6TPC_9100), 3); | ||
202 | INIT_INI_ARRAY(&ah->iniBank7, ar5416Bank7_9100, | ||
203 | ARRAY_SIZE(ar5416Bank7_9100), 2); | ||
204 | INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac_9100, | ||
205 | ARRAY_SIZE(ar5416Addac_9100), 2); | ||
206 | } else { | ||
207 | INIT_INI_ARRAY(&ah->iniModes, ar5416Modes, | ||
208 | ARRAY_SIZE(ar5416Modes), 6); | ||
209 | INIT_INI_ARRAY(&ah->iniCommon, ar5416Common, | ||
210 | ARRAY_SIZE(ar5416Common), 2); | ||
211 | INIT_INI_ARRAY(&ah->iniBank0, ar5416Bank0, | ||
212 | ARRAY_SIZE(ar5416Bank0), 2); | ||
213 | INIT_INI_ARRAY(&ah->iniBB_RfGain, ar5416BB_RfGain, | ||
214 | ARRAY_SIZE(ar5416BB_RfGain), 3); | ||
215 | INIT_INI_ARRAY(&ah->iniBank1, ar5416Bank1, | ||
216 | ARRAY_SIZE(ar5416Bank1), 2); | ||
217 | INIT_INI_ARRAY(&ah->iniBank2, ar5416Bank2, | ||
218 | ARRAY_SIZE(ar5416Bank2), 2); | ||
219 | INIT_INI_ARRAY(&ah->iniBank3, ar5416Bank3, | ||
220 | ARRAY_SIZE(ar5416Bank3), 3); | ||
221 | INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6, | ||
222 | ARRAY_SIZE(ar5416Bank6), 3); | ||
223 | INIT_INI_ARRAY(&ah->iniBank6TPC, ar5416Bank6TPC, | ||
224 | ARRAY_SIZE(ar5416Bank6TPC), 3); | ||
225 | INIT_INI_ARRAY(&ah->iniBank7, ar5416Bank7, | ||
226 | ARRAY_SIZE(ar5416Bank7), 2); | ||
227 | INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac, | ||
228 | ARRAY_SIZE(ar5416Addac), 2); | ||
229 | } | ||
230 | } | ||
231 | |||
232 | /* Support for Japan ch.14 (2484) spread */ | ||
233 | void ar9002_hw_cck_chan14_spread(struct ath_hw *ah) | ||
234 | { | ||
235 | if (AR_SREV_9287_11_OR_LATER(ah)) { | ||
236 | INIT_INI_ARRAY(&ah->iniCckfirNormal, | ||
237 | ar9287Common_normal_cck_fir_coeff_92871_1, | ||
238 | ARRAY_SIZE(ar9287Common_normal_cck_fir_coeff_92871_1), | ||
239 | 2); | ||
240 | INIT_INI_ARRAY(&ah->iniCckfirJapan2484, | ||
241 | ar9287Common_japan_2484_cck_fir_coeff_92871_1, | ||
242 | ARRAY_SIZE(ar9287Common_japan_2484_cck_fir_coeff_92871_1), | ||
243 | 2); | ||
244 | } | ||
245 | } | ||
246 | |||
247 | static void ar9280_20_hw_init_rxgain_ini(struct ath_hw *ah) | ||
248 | { | ||
249 | u32 rxgain_type; | ||
250 | |||
251 | if (ah->eep_ops->get_eeprom(ah, EEP_MINOR_REV) >= | ||
252 | AR5416_EEP_MINOR_VER_17) { | ||
253 | rxgain_type = ah->eep_ops->get_eeprom(ah, EEP_RXGAIN_TYPE); | ||
254 | |||
255 | if (rxgain_type == AR5416_EEP_RXGAIN_13DB_BACKOFF) | ||
256 | INIT_INI_ARRAY(&ah->iniModesRxGain, | ||
257 | ar9280Modes_backoff_13db_rxgain_9280_2, | ||
258 | ARRAY_SIZE(ar9280Modes_backoff_13db_rxgain_9280_2), 6); | ||
259 | else if (rxgain_type == AR5416_EEP_RXGAIN_23DB_BACKOFF) | ||
260 | INIT_INI_ARRAY(&ah->iniModesRxGain, | ||
261 | ar9280Modes_backoff_23db_rxgain_9280_2, | ||
262 | ARRAY_SIZE(ar9280Modes_backoff_23db_rxgain_9280_2), 6); | ||
263 | else | ||
264 | INIT_INI_ARRAY(&ah->iniModesRxGain, | ||
265 | ar9280Modes_original_rxgain_9280_2, | ||
266 | ARRAY_SIZE(ar9280Modes_original_rxgain_9280_2), 6); | ||
267 | } else { | ||
268 | INIT_INI_ARRAY(&ah->iniModesRxGain, | ||
269 | ar9280Modes_original_rxgain_9280_2, | ||
270 | ARRAY_SIZE(ar9280Modes_original_rxgain_9280_2), 6); | ||
271 | } | ||
272 | } | ||
273 | |||
274 | static void ar9280_20_hw_init_txgain_ini(struct ath_hw *ah) | ||
275 | { | ||
276 | u32 txgain_type; | ||
277 | |||
278 | if (ah->eep_ops->get_eeprom(ah, EEP_MINOR_REV) >= | ||
279 | AR5416_EEP_MINOR_VER_19) { | ||
280 | txgain_type = ah->eep_ops->get_eeprom(ah, EEP_TXGAIN_TYPE); | ||
281 | |||
282 | if (txgain_type == AR5416_EEP_TXGAIN_HIGH_POWER) | ||
283 | INIT_INI_ARRAY(&ah->iniModesTxGain, | ||
284 | ar9280Modes_high_power_tx_gain_9280_2, | ||
285 | ARRAY_SIZE(ar9280Modes_high_power_tx_gain_9280_2), 6); | ||
286 | else | ||
287 | INIT_INI_ARRAY(&ah->iniModesTxGain, | ||
288 | ar9280Modes_original_tx_gain_9280_2, | ||
289 | ARRAY_SIZE(ar9280Modes_original_tx_gain_9280_2), 6); | ||
290 | } else { | ||
291 | INIT_INI_ARRAY(&ah->iniModesTxGain, | ||
292 | ar9280Modes_original_tx_gain_9280_2, | ||
293 | ARRAY_SIZE(ar9280Modes_original_tx_gain_9280_2), 6); | ||
294 | } | ||
295 | } | ||
296 | |||
297 | static void ar9002_hw_init_mode_gain_regs(struct ath_hw *ah) | ||
298 | { | ||
299 | if (AR_SREV_9287_11_OR_LATER(ah)) | ||
300 | INIT_INI_ARRAY(&ah->iniModesRxGain, | ||
301 | ar9287Modes_rx_gain_9287_1_1, | ||
302 | ARRAY_SIZE(ar9287Modes_rx_gain_9287_1_1), 6); | ||
303 | else if (AR_SREV_9287_10(ah)) | ||
304 | INIT_INI_ARRAY(&ah->iniModesRxGain, | ||
305 | ar9287Modes_rx_gain_9287_1_0, | ||
306 | ARRAY_SIZE(ar9287Modes_rx_gain_9287_1_0), 6); | ||
307 | else if (AR_SREV_9280_20(ah)) | ||
308 | ar9280_20_hw_init_rxgain_ini(ah); | ||
309 | |||
310 | if (AR_SREV_9287_11_OR_LATER(ah)) { | ||
311 | INIT_INI_ARRAY(&ah->iniModesTxGain, | ||
312 | ar9287Modes_tx_gain_9287_1_1, | ||
313 | ARRAY_SIZE(ar9287Modes_tx_gain_9287_1_1), 6); | ||
314 | } else if (AR_SREV_9287_10(ah)) { | ||
315 | INIT_INI_ARRAY(&ah->iniModesTxGain, | ||
316 | ar9287Modes_tx_gain_9287_1_0, | ||
317 | ARRAY_SIZE(ar9287Modes_tx_gain_9287_1_0), 6); | ||
318 | } else if (AR_SREV_9280_20(ah)) { | ||
319 | ar9280_20_hw_init_txgain_ini(ah); | ||
320 | } else if (AR_SREV_9285_12_OR_LATER(ah)) { | ||
321 | u32 txgain_type = ah->eep_ops->get_eeprom(ah, EEP_TXGAIN_TYPE); | ||
322 | |||
323 | /* txgain table */ | ||
324 | if (txgain_type == AR5416_EEP_TXGAIN_HIGH_POWER) { | ||
325 | if (AR_SREV_9285E_20(ah)) { | ||
326 | INIT_INI_ARRAY(&ah->iniModesTxGain, | ||
327 | ar9285Modes_XE2_0_high_power, | ||
328 | ARRAY_SIZE( | ||
329 | ar9285Modes_XE2_0_high_power), 6); | ||
330 | } else { | ||
331 | INIT_INI_ARRAY(&ah->iniModesTxGain, | ||
332 | ar9285Modes_high_power_tx_gain_9285_1_2, | ||
333 | ARRAY_SIZE( | ||
334 | ar9285Modes_high_power_tx_gain_9285_1_2), 6); | ||
335 | } | ||
336 | } else { | ||
337 | if (AR_SREV_9285E_20(ah)) { | ||
338 | INIT_INI_ARRAY(&ah->iniModesTxGain, | ||
339 | ar9285Modes_XE2_0_normal_power, | ||
340 | ARRAY_SIZE( | ||
341 | ar9285Modes_XE2_0_normal_power), 6); | ||
342 | } else { | ||
343 | INIT_INI_ARRAY(&ah->iniModesTxGain, | ||
344 | ar9285Modes_original_tx_gain_9285_1_2, | ||
345 | ARRAY_SIZE( | ||
346 | ar9285Modes_original_tx_gain_9285_1_2), 6); | ||
347 | } | ||
348 | } | ||
349 | } | ||
350 | } | ||
351 | |||
352 | /* | ||
353 | * Helper for ASPM support. | ||
354 | * | ||
355 | * Disable PLL when in L0s as well as receiver clock when in L1. | ||
356 | * This power saving option must be enabled through the SerDes. | ||
357 | * | ||
358 | * Programming the SerDes must go through the same 288 bit serial shift | ||
359 | * register as the other analog registers. Hence the 9 writes. | ||
360 | */ | ||
361 | static void ar9002_hw_configpcipowersave(struct ath_hw *ah, | ||
362 | int restore, | ||
363 | int power_off) | ||
364 | { | ||
365 | u8 i; | ||
366 | u32 val; | ||
367 | |||
368 | if (ah->is_pciexpress != true) | ||
369 | return; | ||
370 | |||
371 | /* Do not touch SerDes registers */ | ||
372 | if (ah->config.pcie_powersave_enable == 2) | ||
373 | return; | ||
374 | |||
375 | /* Nothing to do on restore for 11N */ | ||
376 | if (!restore) { | ||
377 | if (AR_SREV_9280_20_OR_LATER(ah)) { | ||
378 | /* | ||
379 | * AR9280 2.0 or later chips use SerDes values from the | ||
380 | * initvals.h initialized depending on chipset during | ||
381 | * __ath9k_hw_init() | ||
382 | */ | ||
383 | for (i = 0; i < ah->iniPcieSerdes.ia_rows; i++) { | ||
384 | REG_WRITE(ah, INI_RA(&ah->iniPcieSerdes, i, 0), | ||
385 | INI_RA(&ah->iniPcieSerdes, i, 1)); | ||
386 | } | ||
387 | } else if (AR_SREV_9280(ah) && | ||
388 | (ah->hw_version.macRev == AR_SREV_REVISION_9280_10)) { | ||
389 | REG_WRITE(ah, AR_PCIE_SERDES, 0x9248fd00); | ||
390 | REG_WRITE(ah, AR_PCIE_SERDES, 0x24924924); | ||
391 | |||
392 | /* RX shut off when elecidle is asserted */ | ||
393 | REG_WRITE(ah, AR_PCIE_SERDES, 0xa8000019); | ||
394 | REG_WRITE(ah, AR_PCIE_SERDES, 0x13160820); | ||
395 | REG_WRITE(ah, AR_PCIE_SERDES, 0xe5980560); | ||
396 | |||
397 | /* Shut off CLKREQ active in L1 */ | ||
398 | if (ah->config.pcie_clock_req) | ||
399 | REG_WRITE(ah, AR_PCIE_SERDES, 0x401deffc); | ||
400 | else | ||
401 | REG_WRITE(ah, AR_PCIE_SERDES, 0x401deffd); | ||
402 | |||
403 | REG_WRITE(ah, AR_PCIE_SERDES, 0x1aaabe40); | ||
404 | REG_WRITE(ah, AR_PCIE_SERDES, 0xbe105554); | ||
405 | REG_WRITE(ah, AR_PCIE_SERDES, 0x00043007); | ||
406 | |||
407 | /* Load the new settings */ | ||
408 | REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000); | ||
409 | |||
410 | } else { | ||
411 | REG_WRITE(ah, AR_PCIE_SERDES, 0x9248fc00); | ||
412 | REG_WRITE(ah, AR_PCIE_SERDES, 0x24924924); | ||
413 | |||
414 | /* RX shut off when elecidle is asserted */ | ||
415 | REG_WRITE(ah, AR_PCIE_SERDES, 0x28000039); | ||
416 | REG_WRITE(ah, AR_PCIE_SERDES, 0x53160824); | ||
417 | REG_WRITE(ah, AR_PCIE_SERDES, 0xe5980579); | ||
418 | |||
419 | /* | ||
420 | * Ignore ah->ah_config.pcie_clock_req setting for | ||
421 | * pre-AR9280 11n | ||
422 | */ | ||
423 | REG_WRITE(ah, AR_PCIE_SERDES, 0x001defff); | ||
424 | |||
425 | REG_WRITE(ah, AR_PCIE_SERDES, 0x1aaabe40); | ||
426 | REG_WRITE(ah, AR_PCIE_SERDES, 0xbe105554); | ||
427 | REG_WRITE(ah, AR_PCIE_SERDES, 0x000e3007); | ||
428 | |||
429 | /* Load the new settings */ | ||
430 | REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000); | ||
431 | } | ||
432 | |||
433 | udelay(1000); | ||
434 | |||
435 | /* set bit 19 to allow forcing of pcie core into L1 state */ | ||
436 | REG_SET_BIT(ah, AR_PCIE_PM_CTRL, AR_PCIE_PM_CTRL_ENA); | ||
437 | |||
438 | /* Several PCIe massages to ensure proper behaviour */ | ||
439 | if (ah->config.pcie_waen) { | ||
440 | val = ah->config.pcie_waen; | ||
441 | if (!power_off) | ||
442 | val &= (~AR_WA_D3_L1_DISABLE); | ||
443 | } else { | ||
444 | if (AR_SREV_9285(ah) || AR_SREV_9271(ah) || | ||
445 | AR_SREV_9287(ah)) { | ||
446 | val = AR9285_WA_DEFAULT; | ||
447 | if (!power_off) | ||
448 | val &= (~AR_WA_D3_L1_DISABLE); | ||
449 | } else if (AR_SREV_9280(ah)) { | ||
450 | /* | ||
451 | * On AR9280 chips bit 22 of 0x4004 needs to be | ||
452 | * set otherwise card may disappear. | ||
453 | */ | ||
454 | val = AR9280_WA_DEFAULT; | ||
455 | if (!power_off) | ||
456 | val &= (~AR_WA_D3_L1_DISABLE); | ||
457 | } else | ||
458 | val = AR_WA_DEFAULT; | ||
459 | } | ||
460 | |||
461 | REG_WRITE(ah, AR_WA, val); | ||
462 | } | ||
463 | |||
464 | if (power_off) { | ||
465 | /* | ||
466 | * Set PCIe workaround bits | ||
467 | * bit 14 in WA register (disable L1) should only | ||
468 | * be set when device enters D3 and be cleared | ||
469 | * when device comes back to D0. | ||
470 | */ | ||
471 | if (ah->config.pcie_waen) { | ||
472 | if (ah->config.pcie_waen & AR_WA_D3_L1_DISABLE) | ||
473 | REG_SET_BIT(ah, AR_WA, AR_WA_D3_L1_DISABLE); | ||
474 | } else { | ||
475 | if (((AR_SREV_9285(ah) || AR_SREV_9271(ah) || | ||
476 | AR_SREV_9287(ah)) && | ||
477 | (AR9285_WA_DEFAULT & AR_WA_D3_L1_DISABLE)) || | ||
478 | (AR_SREV_9280(ah) && | ||
479 | (AR9280_WA_DEFAULT & AR_WA_D3_L1_DISABLE))) { | ||
480 | REG_SET_BIT(ah, AR_WA, AR_WA_D3_L1_DISABLE); | ||
481 | } | ||
482 | } | ||
483 | } | ||
484 | } | ||
485 | |||
486 | static int ar9002_hw_get_radiorev(struct ath_hw *ah) | ||
487 | { | ||
488 | u32 val; | ||
489 | int i; | ||
490 | |||
491 | ENABLE_REGWRITE_BUFFER(ah); | ||
492 | |||
493 | REG_WRITE(ah, AR_PHY(0x36), 0x00007058); | ||
494 | for (i = 0; i < 8; i++) | ||
495 | REG_WRITE(ah, AR_PHY(0x20), 0x00010000); | ||
496 | |||
497 | REGWRITE_BUFFER_FLUSH(ah); | ||
498 | DISABLE_REGWRITE_BUFFER(ah); | ||
499 | |||
500 | val = (REG_READ(ah, AR_PHY(256)) >> 24) & 0xff; | ||
501 | val = ((val & 0xf0) >> 4) | ((val & 0x0f) << 4); | ||
502 | |||
503 | return ath9k_hw_reverse_bits(val, 8); | ||
504 | } | ||
505 | |||
506 | int ar9002_hw_rf_claim(struct ath_hw *ah) | ||
507 | { | ||
508 | u32 val; | ||
509 | |||
510 | REG_WRITE(ah, AR_PHY(0), 0x00000007); | ||
511 | |||
512 | val = ar9002_hw_get_radiorev(ah); | ||
513 | switch (val & AR_RADIO_SREV_MAJOR) { | ||
514 | case 0: | ||
515 | val = AR_RAD5133_SREV_MAJOR; | ||
516 | break; | ||
517 | case AR_RAD5133_SREV_MAJOR: | ||
518 | case AR_RAD5122_SREV_MAJOR: | ||
519 | case AR_RAD2133_SREV_MAJOR: | ||
520 | case AR_RAD2122_SREV_MAJOR: | ||
521 | break; | ||
522 | default: | ||
523 | ath_print(ath9k_hw_common(ah), ATH_DBG_FATAL, | ||
524 | "Radio Chip Rev 0x%02X not supported\n", | ||
525 | val & AR_RADIO_SREV_MAJOR); | ||
526 | return -EOPNOTSUPP; | ||
527 | } | ||
528 | |||
529 | ah->hw_version.analog5GhzRev = val; | ||
530 | |||
531 | return 0; | ||
532 | } | ||
533 | |||
534 | /* | ||
535 | * Enable ASYNC FIFO | ||
536 | * | ||
537 | * If Async FIFO is enabled, the following counters change as MAC now runs | ||
538 | * at 117 Mhz instead of 88/44MHz when async FIFO is disabled. | ||
539 | * | ||
540 | * The values below tested for ht40 2 chain. | ||
541 | * Overwrite the delay/timeouts initialized in process ini. | ||
542 | */ | ||
543 | void ar9002_hw_enable_async_fifo(struct ath_hw *ah) | ||
544 | { | ||
545 | if (AR_SREV_9287_12_OR_LATER(ah)) { | ||
546 | REG_WRITE(ah, AR_D_GBL_IFS_SIFS, | ||
547 | AR_D_GBL_IFS_SIFS_ASYNC_FIFO_DUR); | ||
548 | REG_WRITE(ah, AR_D_GBL_IFS_SLOT, | ||
549 | AR_D_GBL_IFS_SLOT_ASYNC_FIFO_DUR); | ||
550 | REG_WRITE(ah, AR_D_GBL_IFS_EIFS, | ||
551 | AR_D_GBL_IFS_EIFS_ASYNC_FIFO_DUR); | ||
552 | |||
553 | REG_WRITE(ah, AR_TIME_OUT, AR_TIME_OUT_ACK_CTS_ASYNC_FIFO_DUR); | ||
554 | REG_WRITE(ah, AR_USEC, AR_USEC_ASYNC_FIFO_DUR); | ||
555 | |||
556 | REG_SET_BIT(ah, AR_MAC_PCU_LOGIC_ANALYZER, | ||
557 | AR_MAC_PCU_LOGIC_ANALYZER_DISBUG20768); | ||
558 | REG_RMW_FIELD(ah, AR_AHB_MODE, AR_AHB_CUSTOM_BURST_EN, | ||
559 | AR_AHB_CUSTOM_BURST_ASYNC_FIFO_VAL); | ||
560 | } | ||
561 | } | ||
562 | |||
563 | /* | ||
564 | * We don't enable WEP aggregation on mac80211 but we keep this | ||
565 | * around for HAL unification purposes. | ||
566 | */ | ||
567 | void ar9002_hw_enable_wep_aggregation(struct ath_hw *ah) | ||
568 | { | ||
569 | if (AR_SREV_9287_12_OR_LATER(ah)) { | ||
570 | REG_SET_BIT(ah, AR_PCU_MISC_MODE2, | ||
571 | AR_PCU_MISC_MODE2_ENABLE_AGGWEP); | ||
572 | } | ||
573 | } | ||
574 | |||
575 | /* Sets up the AR5008/AR9001/AR9002 hardware familiy callbacks */ | ||
576 | void ar9002_hw_attach_ops(struct ath_hw *ah) | ||
577 | { | ||
578 | struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); | ||
579 | struct ath_hw_ops *ops = ath9k_hw_ops(ah); | ||
580 | |||
581 | priv_ops->init_mode_regs = ar9002_hw_init_mode_regs; | ||
582 | priv_ops->init_mode_gain_regs = ar9002_hw_init_mode_gain_regs; | ||
583 | priv_ops->macversion_supported = ar9002_hw_macversion_supported; | ||
584 | |||
585 | ops->config_pci_powersave = ar9002_hw_configpcipowersave; | ||
586 | |||
587 | ar5008_hw_attach_phy_ops(ah); | ||
588 | if (AR_SREV_9280_10_OR_LATER(ah)) | ||
589 | ar9002_hw_attach_phy_ops(ah); | ||
590 | |||
591 | ar9002_hw_attach_calib_ops(ah); | ||
592 | ar9002_hw_attach_mac_ops(ah); | ||
593 | } | ||
diff --git a/drivers/net/wireless/ath/ath9k/initvals.h b/drivers/net/wireless/ath/ath9k/ar9002_initvals.h index 455e9d3b3f13..f06313d3bad6 100644 --- a/drivers/net/wireless/ath/ath9k/initvals.h +++ b/drivers/net/wireless/ath/ath9k/ar9002_initvals.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2008-2009 Atheros Communications Inc. | 2 | * Copyright (c) 2010 Atheros Communications Inc. |
3 | * | 3 | * |
4 | * Permission to use, copy, modify, and/or distribute this software for any | 4 | * Permission to use, copy, modify, and/or distribute this software for any |
5 | * purpose with or without fee is hereby granted, provided that the above | 5 | * purpose with or without fee is hereby granted, provided that the above |
@@ -14,1982 +14,9 @@ | |||
14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | 14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
15 | */ | 15 | */ |
16 | 16 | ||
17 | static const u32 ar5416Modes[][6] = { | 17 | #ifndef INITVALS_9002_10_H |
18 | { 0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160, 0x000001e0 }, | 18 | #define INITVALS_9002_10_H |
19 | { 0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c, 0x000001e0 }, | ||
20 | { 0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38, 0x00001180 }, | ||
21 | { 0x000010f0, 0x0000a000, 0x00014000, 0x00016000, 0x0000b000, 0x00014008 }, | ||
22 | { 0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00, 0x06e006e0 }, | ||
23 | { 0x0000801c, 0x128d93a7, 0x128d93cf, 0x12e013d7, 0x12e013ab, 0x098813cf }, | ||
24 | { 0x00008120, 0x08f04800, 0x08f04800, 0x08f04810, 0x08f04810, 0x08f04810 }, | ||
25 | { 0x000081d0, 0x00003210, 0x00003210, 0x0000320a, 0x0000320a, 0x0000320a }, | ||
26 | { 0x00009804, 0x00000300, 0x000003c4, 0x000003c4, 0x00000300, 0x00000303 }, | ||
27 | { 0x00009820, 0x02020200, 0x02020200, 0x02020200, 0x02020200, 0x02020200 }, | ||
28 | { 0x00009824, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e }, | ||
29 | { 0x00009828, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001 }, | ||
30 | { 0x00009834, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e }, | ||
31 | { 0x00009838, 0x00000007, 0x00000007, 0x00000007, 0x00000007, 0x00000007 }, | ||
32 | { 0x00009844, 0x1372161e, 0x1372161e, 0x137216a0, 0x137216a0, 0x137216a0 }, | ||
33 | { 0x00009848, 0x001a6a65, 0x001a6a65, 0x00197a68, 0x00197a68, 0x00197a68 }, | ||
34 | { 0x0000a848, 0x001a6a65, 0x001a6a65, 0x00197a68, 0x00197a68, 0x00197a68 }, | ||
35 | { 0x0000b848, 0x001a6a65, 0x001a6a65, 0x00197a68, 0x00197a68, 0x00197a68 }, | ||
36 | { 0x00009850, 0x6c48b4e0, 0x6d48b4e0, 0x6d48b0de, 0x6c48b0de, 0x6c48b0de }, | ||
37 | { 0x00009858, 0x7ec82d2e, 0x7ec82d2e, 0x7ec82d2e, 0x7ec82d2e, 0x7ec82d2e }, | ||
38 | { 0x0000985c, 0x31395d5e, 0x3139605e, 0x3139605e, 0x31395d5e, 0x31395d5e }, | ||
39 | { 0x00009860, 0x00049d18, 0x00049d18, 0x00049d18, 0x00049d18, 0x00049d18 }, | ||
40 | { 0x00009864, 0x0001ce00, 0x0001ce00, 0x0001ce00, 0x0001ce00, 0x0001ce00 }, | ||
41 | { 0x00009868, 0x409a4190, 0x409a4190, 0x409a4190, 0x409a4190, 0x409a4190 }, | ||
42 | { 0x0000986c, 0x050cb081, 0x050cb081, 0x050cb081, 0x050cb081, 0x050cb081 }, | ||
43 | { 0x00009914, 0x000007d0, 0x00000fa0, 0x00001130, 0x00000898, 0x000007d0 }, | ||
44 | { 0x00009918, 0x000001b8, 0x00000370, 0x00000268, 0x00000134, 0x00000134 }, | ||
45 | { 0x00009924, 0xd0058a0b, 0xd0058a0b, 0xd0058a0b, 0xd0058a0b, 0xd0058a0b }, | ||
46 | { 0x00009944, 0xffb81020, 0xffb81020, 0xffb81020, 0xffb81020, 0xffb81020 }, | ||
47 | { 0x00009960, 0x00000900, 0x00000900, 0x00012d80, 0x00012d80, 0x00012d80 }, | ||
48 | { 0x0000a960, 0x00000900, 0x00000900, 0x00012d80, 0x00012d80, 0x00012d80 }, | ||
49 | { 0x0000b960, 0x00000900, 0x00000900, 0x00012d80, 0x00012d80, 0x00012d80 }, | ||
50 | { 0x00009964, 0x00000000, 0x00000000, 0x00001120, 0x00001120, 0x00001120 }, | ||
51 | { 0x000099bc, 0x001a0a00, 0x001a0a00, 0x001a0a00, 0x001a0a00, 0x001a0a00 }, | ||
52 | { 0x000099c0, 0x038919be, 0x038919be, 0x038919be, 0x038919be, 0x038919be }, | ||
53 | { 0x000099c4, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77 }, | ||
54 | { 0x000099c8, 0x6af6532c, 0x6af6532c, 0x6af6532c, 0x6af6532c, 0x6af6532c }, | ||
55 | { 0x000099cc, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8 }, | ||
56 | { 0x000099d0, 0x00046384, 0x00046384, 0x00046384, 0x00046384, 0x00046384 }, | ||
57 | { 0x000099d4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
58 | { 0x000099d8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
59 | { 0x0000a204, 0x00000880, 0x00000880, 0x00000880, 0x00000880, 0x00000880 }, | ||
60 | { 0x0000a208, 0xd6be4788, 0xd6be4788, 0xd03e4788, 0xd03e4788, 0xd03e4788 }, | ||
61 | { 0x0000a20c, 0x002ec1e0, 0x002ec1e0, 0x002ac120, 0x002ac120, 0x002ac120 }, | ||
62 | { 0x0000b20c, 0x002ec1e0, 0x002ec1e0, 0x002ac120, 0x002ac120, 0x002ac120 }, | ||
63 | { 0x0000c20c, 0x002ec1e0, 0x002ec1e0, 0x002ac120, 0x002ac120, 0x002ac120 }, | ||
64 | { 0x0000a21c, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a }, | ||
65 | { 0x0000a230, 0x00000000, 0x00000000, 0x00000210, 0x00000108, 0x00000000 }, | ||
66 | { 0x0000a274, 0x0a1a9caa, 0x0a1a9caa, 0x0a1a7caa, 0x0a1a7caa, 0x0a1a7caa }, | ||
67 | { 0x0000a300, 0x18010000, 0x18010000, 0x18010000, 0x18010000, 0x18010000 }, | ||
68 | { 0x0000a304, 0x30032602, 0x30032602, 0x2e032402, 0x2e032402, 0x2e032402 }, | ||
69 | { 0x0000a308, 0x48073e06, 0x48073e06, 0x4a0a3c06, 0x4a0a3c06, 0x4a0a3c06 }, | ||
70 | { 0x0000a30c, 0x560b4c0a, 0x560b4c0a, 0x621a540b, 0x621a540b, 0x621a540b }, | ||
71 | { 0x0000a310, 0x641a600f, 0x641a600f, 0x764f6c1b, 0x764f6c1b, 0x764f6c1b }, | ||
72 | { 0x0000a314, 0x7a4f6e1b, 0x7a4f6e1b, 0x845b7a5a, 0x845b7a5a, 0x845b7a5a }, | ||
73 | { 0x0000a318, 0x8c5b7e5a, 0x8c5b7e5a, 0x950f8ccf, 0x950f8ccf, 0x950f8ccf }, | ||
74 | { 0x0000a31c, 0x9d0f96cf, 0x9d0f96cf, 0xa5cf9b4f, 0xa5cf9b4f, 0xa5cf9b4f }, | ||
75 | { 0x0000a320, 0xb51fa69f, 0xb51fa69f, 0xbddfaf1f, 0xbddfaf1f, 0xbddfaf1f }, | ||
76 | { 0x0000a324, 0xcb3fbd07, 0xcb3fbcbf, 0xd1ffc93f, 0xd1ffc93f, 0xd1ffc93f }, | ||
77 | { 0x0000a328, 0x0000d7bf, 0x0000d7bf, 0x00000000, 0x00000000, 0x00000000 }, | ||
78 | { 0x0000a32c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
79 | { 0x0000a330, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
80 | { 0x0000a334, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
81 | }; | ||
82 | |||
83 | static const u32 ar5416Common[][2] = { | ||
84 | { 0x0000000c, 0x00000000 }, | ||
85 | { 0x00000030, 0x00020015 }, | ||
86 | { 0x00000034, 0x00000005 }, | ||
87 | { 0x00000040, 0x00000000 }, | ||
88 | { 0x00000044, 0x00000008 }, | ||
89 | { 0x00000048, 0x00000008 }, | ||
90 | { 0x0000004c, 0x00000010 }, | ||
91 | { 0x00000050, 0x00000000 }, | ||
92 | { 0x00000054, 0x0000001f }, | ||
93 | { 0x00000800, 0x00000000 }, | ||
94 | { 0x00000804, 0x00000000 }, | ||
95 | { 0x00000808, 0x00000000 }, | ||
96 | { 0x0000080c, 0x00000000 }, | ||
97 | { 0x00000810, 0x00000000 }, | ||
98 | { 0x00000814, 0x00000000 }, | ||
99 | { 0x00000818, 0x00000000 }, | ||
100 | { 0x0000081c, 0x00000000 }, | ||
101 | { 0x00000820, 0x00000000 }, | ||
102 | { 0x00000824, 0x00000000 }, | ||
103 | { 0x00001040, 0x002ffc0f }, | ||
104 | { 0x00001044, 0x002ffc0f }, | ||
105 | { 0x00001048, 0x002ffc0f }, | ||
106 | { 0x0000104c, 0x002ffc0f }, | ||
107 | { 0x00001050, 0x002ffc0f }, | ||
108 | { 0x00001054, 0x002ffc0f }, | ||
109 | { 0x00001058, 0x002ffc0f }, | ||
110 | { 0x0000105c, 0x002ffc0f }, | ||
111 | { 0x00001060, 0x002ffc0f }, | ||
112 | { 0x00001064, 0x002ffc0f }, | ||
113 | { 0x00001230, 0x00000000 }, | ||
114 | { 0x00001270, 0x00000000 }, | ||
115 | { 0x00001038, 0x00000000 }, | ||
116 | { 0x00001078, 0x00000000 }, | ||
117 | { 0x000010b8, 0x00000000 }, | ||
118 | { 0x000010f8, 0x00000000 }, | ||
119 | { 0x00001138, 0x00000000 }, | ||
120 | { 0x00001178, 0x00000000 }, | ||
121 | { 0x000011b8, 0x00000000 }, | ||
122 | { 0x000011f8, 0x00000000 }, | ||
123 | { 0x00001238, 0x00000000 }, | ||
124 | { 0x00001278, 0x00000000 }, | ||
125 | { 0x000012b8, 0x00000000 }, | ||
126 | { 0x000012f8, 0x00000000 }, | ||
127 | { 0x00001338, 0x00000000 }, | ||
128 | { 0x00001378, 0x00000000 }, | ||
129 | { 0x000013b8, 0x00000000 }, | ||
130 | { 0x000013f8, 0x00000000 }, | ||
131 | { 0x00001438, 0x00000000 }, | ||
132 | { 0x00001478, 0x00000000 }, | ||
133 | { 0x000014b8, 0x00000000 }, | ||
134 | { 0x000014f8, 0x00000000 }, | ||
135 | { 0x00001538, 0x00000000 }, | ||
136 | { 0x00001578, 0x00000000 }, | ||
137 | { 0x000015b8, 0x00000000 }, | ||
138 | { 0x000015f8, 0x00000000 }, | ||
139 | { 0x00001638, 0x00000000 }, | ||
140 | { 0x00001678, 0x00000000 }, | ||
141 | { 0x000016b8, 0x00000000 }, | ||
142 | { 0x000016f8, 0x00000000 }, | ||
143 | { 0x00001738, 0x00000000 }, | ||
144 | { 0x00001778, 0x00000000 }, | ||
145 | { 0x000017b8, 0x00000000 }, | ||
146 | { 0x000017f8, 0x00000000 }, | ||
147 | { 0x0000103c, 0x00000000 }, | ||
148 | { 0x0000107c, 0x00000000 }, | ||
149 | { 0x000010bc, 0x00000000 }, | ||
150 | { 0x000010fc, 0x00000000 }, | ||
151 | { 0x0000113c, 0x00000000 }, | ||
152 | { 0x0000117c, 0x00000000 }, | ||
153 | { 0x000011bc, 0x00000000 }, | ||
154 | { 0x000011fc, 0x00000000 }, | ||
155 | { 0x0000123c, 0x00000000 }, | ||
156 | { 0x0000127c, 0x00000000 }, | ||
157 | { 0x000012bc, 0x00000000 }, | ||
158 | { 0x000012fc, 0x00000000 }, | ||
159 | { 0x0000133c, 0x00000000 }, | ||
160 | { 0x0000137c, 0x00000000 }, | ||
161 | { 0x000013bc, 0x00000000 }, | ||
162 | { 0x000013fc, 0x00000000 }, | ||
163 | { 0x0000143c, 0x00000000 }, | ||
164 | { 0x0000147c, 0x00000000 }, | ||
165 | { 0x00004030, 0x00000002 }, | ||
166 | { 0x0000403c, 0x00000002 }, | ||
167 | { 0x00007010, 0x00000000 }, | ||
168 | { 0x00007038, 0x000004c2 }, | ||
169 | { 0x00008004, 0x00000000 }, | ||
170 | { 0x00008008, 0x00000000 }, | ||
171 | { 0x0000800c, 0x00000000 }, | ||
172 | { 0x00008018, 0x00000700 }, | ||
173 | { 0x00008020, 0x00000000 }, | ||
174 | { 0x00008038, 0x00000000 }, | ||
175 | { 0x0000803c, 0x00000000 }, | ||
176 | { 0x00008048, 0x40000000 }, | ||
177 | { 0x00008054, 0x00000000 }, | ||
178 | { 0x00008058, 0x00000000 }, | ||
179 | { 0x0000805c, 0x000fc78f }, | ||
180 | { 0x00008060, 0x0000000f }, | ||
181 | { 0x00008064, 0x00000000 }, | ||
182 | { 0x000080c0, 0x2a82301a }, | ||
183 | { 0x000080c4, 0x05dc01e0 }, | ||
184 | { 0x000080c8, 0x1f402710 }, | ||
185 | { 0x000080cc, 0x01f40000 }, | ||
186 | { 0x000080d0, 0x00001e00 }, | ||
187 | { 0x000080d4, 0x00000000 }, | ||
188 | { 0x000080d8, 0x00400000 }, | ||
189 | { 0x000080e0, 0xffffffff }, | ||
190 | { 0x000080e4, 0x0000ffff }, | ||
191 | { 0x000080e8, 0x003f3f3f }, | ||
192 | { 0x000080ec, 0x00000000 }, | ||
193 | { 0x000080f0, 0x00000000 }, | ||
194 | { 0x000080f4, 0x00000000 }, | ||
195 | { 0x000080f8, 0x00000000 }, | ||
196 | { 0x000080fc, 0x00020000 }, | ||
197 | { 0x00008100, 0x00020000 }, | ||
198 | { 0x00008104, 0x00000001 }, | ||
199 | { 0x00008108, 0x00000052 }, | ||
200 | { 0x0000810c, 0x00000000 }, | ||
201 | { 0x00008110, 0x00000168 }, | ||
202 | { 0x00008118, 0x000100aa }, | ||
203 | { 0x0000811c, 0x00003210 }, | ||
204 | { 0x00008124, 0x00000000 }, | ||
205 | { 0x00008128, 0x00000000 }, | ||
206 | { 0x0000812c, 0x00000000 }, | ||
207 | { 0x00008130, 0x00000000 }, | ||
208 | { 0x00008134, 0x00000000 }, | ||
209 | { 0x00008138, 0x00000000 }, | ||
210 | { 0x0000813c, 0x00000000 }, | ||
211 | { 0x00008144, 0xffffffff }, | ||
212 | { 0x00008168, 0x00000000 }, | ||
213 | { 0x0000816c, 0x00000000 }, | ||
214 | { 0x00008170, 0x32143320 }, | ||
215 | { 0x00008174, 0xfaa4fa50 }, | ||
216 | { 0x00008178, 0x00000100 }, | ||
217 | { 0x0000817c, 0x00000000 }, | ||
218 | { 0x000081c4, 0x00000000 }, | ||
219 | { 0x000081ec, 0x00000000 }, | ||
220 | { 0x000081f0, 0x00000000 }, | ||
221 | { 0x000081f4, 0x00000000 }, | ||
222 | { 0x000081f8, 0x00000000 }, | ||
223 | { 0x000081fc, 0x00000000 }, | ||
224 | { 0x00008200, 0x00000000 }, | ||
225 | { 0x00008204, 0x00000000 }, | ||
226 | { 0x00008208, 0x00000000 }, | ||
227 | { 0x0000820c, 0x00000000 }, | ||
228 | { 0x00008210, 0x00000000 }, | ||
229 | { 0x00008214, 0x00000000 }, | ||
230 | { 0x00008218, 0x00000000 }, | ||
231 | { 0x0000821c, 0x00000000 }, | ||
232 | { 0x00008220, 0x00000000 }, | ||
233 | { 0x00008224, 0x00000000 }, | ||
234 | { 0x00008228, 0x00000000 }, | ||
235 | { 0x0000822c, 0x00000000 }, | ||
236 | { 0x00008230, 0x00000000 }, | ||
237 | { 0x00008234, 0x00000000 }, | ||
238 | { 0x00008238, 0x00000000 }, | ||
239 | { 0x0000823c, 0x00000000 }, | ||
240 | { 0x00008240, 0x00100000 }, | ||
241 | { 0x00008244, 0x0010f400 }, | ||
242 | { 0x00008248, 0x00000100 }, | ||
243 | { 0x0000824c, 0x0001e800 }, | ||
244 | { 0x00008250, 0x00000000 }, | ||
245 | { 0x00008254, 0x00000000 }, | ||
246 | { 0x00008258, 0x00000000 }, | ||
247 | { 0x0000825c, 0x400000ff }, | ||
248 | { 0x00008260, 0x00080922 }, | ||
249 | { 0x00008264, 0xa8000010 }, | ||
250 | { 0x00008270, 0x00000000 }, | ||
251 | { 0x00008274, 0x40000000 }, | ||
252 | { 0x00008278, 0x003e4180 }, | ||
253 | { 0x0000827c, 0x00000000 }, | ||
254 | { 0x00008284, 0x0000002c }, | ||
255 | { 0x00008288, 0x0000002c }, | ||
256 | { 0x0000828c, 0x00000000 }, | ||
257 | { 0x00008294, 0x00000000 }, | ||
258 | { 0x00008298, 0x00000000 }, | ||
259 | { 0x00008300, 0x00000000 }, | ||
260 | { 0x00008304, 0x00000000 }, | ||
261 | { 0x00008308, 0x00000000 }, | ||
262 | { 0x0000830c, 0x00000000 }, | ||
263 | { 0x00008310, 0x00000000 }, | ||
264 | { 0x00008314, 0x00000000 }, | ||
265 | { 0x00008318, 0x00000000 }, | ||
266 | { 0x00008328, 0x00000000 }, | ||
267 | { 0x0000832c, 0x00000007 }, | ||
268 | { 0x00008330, 0x00000302 }, | ||
269 | { 0x00008334, 0x00000e00 }, | ||
270 | { 0x00008338, 0x00070000 }, | ||
271 | { 0x0000833c, 0x00000000 }, | ||
272 | { 0x00008340, 0x000107ff }, | ||
273 | { 0x00009808, 0x00000000 }, | ||
274 | { 0x0000980c, 0xad848e19 }, | ||
275 | { 0x00009810, 0x7d14e000 }, | ||
276 | { 0x00009814, 0x9c0a9f6b }, | ||
277 | { 0x0000981c, 0x00000000 }, | ||
278 | { 0x0000982c, 0x0000a000 }, | ||
279 | { 0x00009830, 0x00000000 }, | ||
280 | { 0x0000983c, 0x00200400 }, | ||
281 | { 0x00009840, 0x206a002e }, | ||
282 | { 0x0000984c, 0x1284233c }, | ||
283 | { 0x00009854, 0x00000859 }, | ||
284 | { 0x00009900, 0x00000000 }, | ||
285 | { 0x00009904, 0x00000000 }, | ||
286 | { 0x00009908, 0x00000000 }, | ||
287 | { 0x0000990c, 0x00000000 }, | ||
288 | { 0x0000991c, 0x10000fff }, | ||
289 | { 0x00009920, 0x05100000 }, | ||
290 | { 0x0000a920, 0x05100000 }, | ||
291 | { 0x0000b920, 0x05100000 }, | ||
292 | { 0x00009928, 0x00000001 }, | ||
293 | { 0x0000992c, 0x00000004 }, | ||
294 | { 0x00009934, 0x1e1f2022 }, | ||
295 | { 0x00009938, 0x0a0b0c0d }, | ||
296 | { 0x0000993c, 0x00000000 }, | ||
297 | { 0x00009948, 0x9280b212 }, | ||
298 | { 0x0000994c, 0x00020028 }, | ||
299 | { 0x00009954, 0x5d50e188 }, | ||
300 | { 0x00009958, 0x00081fff }, | ||
301 | { 0x0000c95c, 0x004b6a8e }, | ||
302 | { 0x0000c968, 0x000003ce }, | ||
303 | { 0x00009970, 0x190fb515 }, | ||
304 | { 0x00009974, 0x00000000 }, | ||
305 | { 0x00009978, 0x00000001 }, | ||
306 | { 0x0000997c, 0x00000000 }, | ||
307 | { 0x00009980, 0x00000000 }, | ||
308 | { 0x00009984, 0x00000000 }, | ||
309 | { 0x00009988, 0x00000000 }, | ||
310 | { 0x0000998c, 0x00000000 }, | ||
311 | { 0x00009990, 0x00000000 }, | ||
312 | { 0x00009994, 0x00000000 }, | ||
313 | { 0x00009998, 0x00000000 }, | ||
314 | { 0x0000999c, 0x00000000 }, | ||
315 | { 0x000099a0, 0x00000000 }, | ||
316 | { 0x000099a4, 0x00000001 }, | ||
317 | { 0x000099a8, 0x001fff00 }, | ||
318 | { 0x000099ac, 0x00000000 }, | ||
319 | { 0x000099b0, 0x03051000 }, | ||
320 | { 0x000099dc, 0x00000000 }, | ||
321 | { 0x000099e0, 0x00000200 }, | ||
322 | { 0x000099e4, 0xaaaaaaaa }, | ||
323 | { 0x000099e8, 0x3c466478 }, | ||
324 | { 0x000099ec, 0x000000aa }, | ||
325 | { 0x000099fc, 0x00001042 }, | ||
326 | { 0x00009b00, 0x00000000 }, | ||
327 | { 0x00009b04, 0x00000001 }, | ||
328 | { 0x00009b08, 0x00000002 }, | ||
329 | { 0x00009b0c, 0x00000003 }, | ||
330 | { 0x00009b10, 0x00000004 }, | ||
331 | { 0x00009b14, 0x00000005 }, | ||
332 | { 0x00009b18, 0x00000008 }, | ||
333 | { 0x00009b1c, 0x00000009 }, | ||
334 | { 0x00009b20, 0x0000000a }, | ||
335 | { 0x00009b24, 0x0000000b }, | ||
336 | { 0x00009b28, 0x0000000c }, | ||
337 | { 0x00009b2c, 0x0000000d }, | ||
338 | { 0x00009b30, 0x00000010 }, | ||
339 | { 0x00009b34, 0x00000011 }, | ||
340 | { 0x00009b38, 0x00000012 }, | ||
341 | { 0x00009b3c, 0x00000013 }, | ||
342 | { 0x00009b40, 0x00000014 }, | ||
343 | { 0x00009b44, 0x00000015 }, | ||
344 | { 0x00009b48, 0x00000018 }, | ||
345 | { 0x00009b4c, 0x00000019 }, | ||
346 | { 0x00009b50, 0x0000001a }, | ||
347 | { 0x00009b54, 0x0000001b }, | ||
348 | { 0x00009b58, 0x0000001c }, | ||
349 | { 0x00009b5c, 0x0000001d }, | ||
350 | { 0x00009b60, 0x00000020 }, | ||
351 | { 0x00009b64, 0x00000021 }, | ||
352 | { 0x00009b68, 0x00000022 }, | ||
353 | { 0x00009b6c, 0x00000023 }, | ||
354 | { 0x00009b70, 0x00000024 }, | ||
355 | { 0x00009b74, 0x00000025 }, | ||
356 | { 0x00009b78, 0x00000028 }, | ||
357 | { 0x00009b7c, 0x00000029 }, | ||
358 | { 0x00009b80, 0x0000002a }, | ||
359 | { 0x00009b84, 0x0000002b }, | ||
360 | { 0x00009b88, 0x0000002c }, | ||
361 | { 0x00009b8c, 0x0000002d }, | ||
362 | { 0x00009b90, 0x00000030 }, | ||
363 | { 0x00009b94, 0x00000031 }, | ||
364 | { 0x00009b98, 0x00000032 }, | ||
365 | { 0x00009b9c, 0x00000033 }, | ||
366 | { 0x00009ba0, 0x00000034 }, | ||
367 | { 0x00009ba4, 0x00000035 }, | ||
368 | { 0x00009ba8, 0x00000035 }, | ||
369 | { 0x00009bac, 0x00000035 }, | ||
370 | { 0x00009bb0, 0x00000035 }, | ||
371 | { 0x00009bb4, 0x00000035 }, | ||
372 | { 0x00009bb8, 0x00000035 }, | ||
373 | { 0x00009bbc, 0x00000035 }, | ||
374 | { 0x00009bc0, 0x00000035 }, | ||
375 | { 0x00009bc4, 0x00000035 }, | ||
376 | { 0x00009bc8, 0x00000035 }, | ||
377 | { 0x00009bcc, 0x00000035 }, | ||
378 | { 0x00009bd0, 0x00000035 }, | ||
379 | { 0x00009bd4, 0x00000035 }, | ||
380 | { 0x00009bd8, 0x00000035 }, | ||
381 | { 0x00009bdc, 0x00000035 }, | ||
382 | { 0x00009be0, 0x00000035 }, | ||
383 | { 0x00009be4, 0x00000035 }, | ||
384 | { 0x00009be8, 0x00000035 }, | ||
385 | { 0x00009bec, 0x00000035 }, | ||
386 | { 0x00009bf0, 0x00000035 }, | ||
387 | { 0x00009bf4, 0x00000035 }, | ||
388 | { 0x00009bf8, 0x00000010 }, | ||
389 | { 0x00009bfc, 0x0000001a }, | ||
390 | { 0x0000a210, 0x40806333 }, | ||
391 | { 0x0000a214, 0x00106c10 }, | ||
392 | { 0x0000a218, 0x009c4060 }, | ||
393 | { 0x0000a220, 0x018830c6 }, | ||
394 | { 0x0000a224, 0x00000400 }, | ||
395 | { 0x0000a228, 0x00000bb5 }, | ||
396 | { 0x0000a22c, 0x00000011 }, | ||
397 | { 0x0000a234, 0x20202020 }, | ||
398 | { 0x0000a238, 0x20202020 }, | ||
399 | { 0x0000a23c, 0x13c889af }, | ||
400 | { 0x0000a240, 0x38490a20 }, | ||
401 | { 0x0000a244, 0x00007bb6 }, | ||
402 | { 0x0000a248, 0x0fff3ffc }, | ||
403 | { 0x0000a24c, 0x00000001 }, | ||
404 | { 0x0000a250, 0x0000a000 }, | ||
405 | { 0x0000a254, 0x00000000 }, | ||
406 | { 0x0000a258, 0x0cc75380 }, | ||
407 | { 0x0000a25c, 0x0f0f0f01 }, | ||
408 | { 0x0000a260, 0xdfa91f01 }, | ||
409 | { 0x0000a268, 0x00000000 }, | ||
410 | { 0x0000a26c, 0x0e79e5c6 }, | ||
411 | { 0x0000b26c, 0x0e79e5c6 }, | ||
412 | { 0x0000c26c, 0x0e79e5c6 }, | ||
413 | { 0x0000d270, 0x00820820 }, | ||
414 | { 0x0000a278, 0x1ce739ce }, | ||
415 | { 0x0000a27c, 0x051701ce }, | ||
416 | { 0x0000a338, 0x00000000 }, | ||
417 | { 0x0000a33c, 0x00000000 }, | ||
418 | { 0x0000a340, 0x00000000 }, | ||
419 | { 0x0000a344, 0x00000000 }, | ||
420 | { 0x0000a348, 0x3fffffff }, | ||
421 | { 0x0000a34c, 0x3fffffff }, | ||
422 | { 0x0000a350, 0x3fffffff }, | ||
423 | { 0x0000a354, 0x0003ffff }, | ||
424 | { 0x0000a358, 0x79a8aa1f }, | ||
425 | { 0x0000d35c, 0x07ffffef }, | ||
426 | { 0x0000d360, 0x0fffffe7 }, | ||
427 | { 0x0000d364, 0x17ffffe5 }, | ||
428 | { 0x0000d368, 0x1fffffe4 }, | ||
429 | { 0x0000d36c, 0x37ffffe3 }, | ||
430 | { 0x0000d370, 0x3fffffe3 }, | ||
431 | { 0x0000d374, 0x57ffffe3 }, | ||
432 | { 0x0000d378, 0x5fffffe2 }, | ||
433 | { 0x0000d37c, 0x7fffffe2 }, | ||
434 | { 0x0000d380, 0x7f3c7bba }, | ||
435 | { 0x0000d384, 0xf3307ff0 }, | ||
436 | { 0x0000a388, 0x08000000 }, | ||
437 | { 0x0000a38c, 0x20202020 }, | ||
438 | { 0x0000a390, 0x20202020 }, | ||
439 | { 0x0000a394, 0x1ce739ce }, | ||
440 | { 0x0000a398, 0x000001ce }, | ||
441 | { 0x0000a39c, 0x00000001 }, | ||
442 | { 0x0000a3a0, 0x00000000 }, | ||
443 | { 0x0000a3a4, 0x00000000 }, | ||
444 | { 0x0000a3a8, 0x00000000 }, | ||
445 | { 0x0000a3ac, 0x00000000 }, | ||
446 | { 0x0000a3b0, 0x00000000 }, | ||
447 | { 0x0000a3b4, 0x00000000 }, | ||
448 | { 0x0000a3b8, 0x00000000 }, | ||
449 | { 0x0000a3bc, 0x00000000 }, | ||
450 | { 0x0000a3c0, 0x00000000 }, | ||
451 | { 0x0000a3c4, 0x00000000 }, | ||
452 | { 0x0000a3c8, 0x00000246 }, | ||
453 | { 0x0000a3cc, 0x20202020 }, | ||
454 | { 0x0000a3d0, 0x20202020 }, | ||
455 | { 0x0000a3d4, 0x20202020 }, | ||
456 | { 0x0000a3dc, 0x1ce739ce }, | ||
457 | { 0x0000a3e0, 0x000001ce }, | ||
458 | }; | ||
459 | |||
460 | static const u32 ar5416Bank0[][2] = { | ||
461 | { 0x000098b0, 0x1e5795e5 }, | ||
462 | { 0x000098e0, 0x02008020 }, | ||
463 | }; | ||
464 | |||
465 | static const u32 ar5416BB_RfGain[][3] = { | ||
466 | { 0x00009a00, 0x00000000, 0x00000000 }, | ||
467 | { 0x00009a04, 0x00000040, 0x00000040 }, | ||
468 | { 0x00009a08, 0x00000080, 0x00000080 }, | ||
469 | { 0x00009a0c, 0x000001a1, 0x00000141 }, | ||
470 | { 0x00009a10, 0x000001e1, 0x00000181 }, | ||
471 | { 0x00009a14, 0x00000021, 0x000001c1 }, | ||
472 | { 0x00009a18, 0x00000061, 0x00000001 }, | ||
473 | { 0x00009a1c, 0x00000168, 0x00000041 }, | ||
474 | { 0x00009a20, 0x000001a8, 0x000001a8 }, | ||
475 | { 0x00009a24, 0x000001e8, 0x000001e8 }, | ||
476 | { 0x00009a28, 0x00000028, 0x00000028 }, | ||
477 | { 0x00009a2c, 0x00000068, 0x00000068 }, | ||
478 | { 0x00009a30, 0x00000189, 0x000000a8 }, | ||
479 | { 0x00009a34, 0x000001c9, 0x00000169 }, | ||
480 | { 0x00009a38, 0x00000009, 0x000001a9 }, | ||
481 | { 0x00009a3c, 0x00000049, 0x000001e9 }, | ||
482 | { 0x00009a40, 0x00000089, 0x00000029 }, | ||
483 | { 0x00009a44, 0x00000170, 0x00000069 }, | ||
484 | { 0x00009a48, 0x000001b0, 0x00000190 }, | ||
485 | { 0x00009a4c, 0x000001f0, 0x000001d0 }, | ||
486 | { 0x00009a50, 0x00000030, 0x00000010 }, | ||
487 | { 0x00009a54, 0x00000070, 0x00000050 }, | ||
488 | { 0x00009a58, 0x00000191, 0x00000090 }, | ||
489 | { 0x00009a5c, 0x000001d1, 0x00000151 }, | ||
490 | { 0x00009a60, 0x00000011, 0x00000191 }, | ||
491 | { 0x00009a64, 0x00000051, 0x000001d1 }, | ||
492 | { 0x00009a68, 0x00000091, 0x00000011 }, | ||
493 | { 0x00009a6c, 0x000001b8, 0x00000051 }, | ||
494 | { 0x00009a70, 0x000001f8, 0x00000198 }, | ||
495 | { 0x00009a74, 0x00000038, 0x000001d8 }, | ||
496 | { 0x00009a78, 0x00000078, 0x00000018 }, | ||
497 | { 0x00009a7c, 0x00000199, 0x00000058 }, | ||
498 | { 0x00009a80, 0x000001d9, 0x00000098 }, | ||
499 | { 0x00009a84, 0x00000019, 0x00000159 }, | ||
500 | { 0x00009a88, 0x00000059, 0x00000199 }, | ||
501 | { 0x00009a8c, 0x00000099, 0x000001d9 }, | ||
502 | { 0x00009a90, 0x000000d9, 0x00000019 }, | ||
503 | { 0x00009a94, 0x000000f9, 0x00000059 }, | ||
504 | { 0x00009a98, 0x000000f9, 0x00000099 }, | ||
505 | { 0x00009a9c, 0x000000f9, 0x000000d9 }, | ||
506 | { 0x00009aa0, 0x000000f9, 0x000000f9 }, | ||
507 | { 0x00009aa4, 0x000000f9, 0x000000f9 }, | ||
508 | { 0x00009aa8, 0x000000f9, 0x000000f9 }, | ||
509 | { 0x00009aac, 0x000000f9, 0x000000f9 }, | ||
510 | { 0x00009ab0, 0x000000f9, 0x000000f9 }, | ||
511 | { 0x00009ab4, 0x000000f9, 0x000000f9 }, | ||
512 | { 0x00009ab8, 0x000000f9, 0x000000f9 }, | ||
513 | { 0x00009abc, 0x000000f9, 0x000000f9 }, | ||
514 | { 0x00009ac0, 0x000000f9, 0x000000f9 }, | ||
515 | { 0x00009ac4, 0x000000f9, 0x000000f9 }, | ||
516 | { 0x00009ac8, 0x000000f9, 0x000000f9 }, | ||
517 | { 0x00009acc, 0x000000f9, 0x000000f9 }, | ||
518 | { 0x00009ad0, 0x000000f9, 0x000000f9 }, | ||
519 | { 0x00009ad4, 0x000000f9, 0x000000f9 }, | ||
520 | { 0x00009ad8, 0x000000f9, 0x000000f9 }, | ||
521 | { 0x00009adc, 0x000000f9, 0x000000f9 }, | ||
522 | { 0x00009ae0, 0x000000f9, 0x000000f9 }, | ||
523 | { 0x00009ae4, 0x000000f9, 0x000000f9 }, | ||
524 | { 0x00009ae8, 0x000000f9, 0x000000f9 }, | ||
525 | { 0x00009aec, 0x000000f9, 0x000000f9 }, | ||
526 | { 0x00009af0, 0x000000f9, 0x000000f9 }, | ||
527 | { 0x00009af4, 0x000000f9, 0x000000f9 }, | ||
528 | { 0x00009af8, 0x000000f9, 0x000000f9 }, | ||
529 | { 0x00009afc, 0x000000f9, 0x000000f9 }, | ||
530 | }; | ||
531 | |||
532 | static const u32 ar5416Bank1[][2] = { | ||
533 | { 0x000098b0, 0x02108421 }, | ||
534 | { 0x000098ec, 0x00000008 }, | ||
535 | }; | ||
536 | |||
537 | static const u32 ar5416Bank2[][2] = { | ||
538 | { 0x000098b0, 0x0e73ff17 }, | ||
539 | { 0x000098e0, 0x00000420 }, | ||
540 | }; | ||
541 | |||
542 | static const u32 ar5416Bank3[][3] = { | ||
543 | { 0x000098f0, 0x01400018, 0x01c00018 }, | ||
544 | }; | ||
545 | |||
546 | static const u32 ar5416Bank6[][3] = { | ||
547 | |||
548 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
549 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
550 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
551 | { 0x0000989c, 0x00e00000, 0x00e00000 }, | ||
552 | { 0x0000989c, 0x005e0000, 0x005e0000 }, | ||
553 | { 0x0000989c, 0x00120000, 0x00120000 }, | ||
554 | { 0x0000989c, 0x00620000, 0x00620000 }, | ||
555 | { 0x0000989c, 0x00020000, 0x00020000 }, | ||
556 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
557 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
558 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
559 | { 0x0000989c, 0x40ff0000, 0x40ff0000 }, | ||
560 | { 0x0000989c, 0x005f0000, 0x005f0000 }, | ||
561 | { 0x0000989c, 0x00870000, 0x00870000 }, | ||
562 | { 0x0000989c, 0x00f90000, 0x00f90000 }, | ||
563 | { 0x0000989c, 0x007b0000, 0x007b0000 }, | ||
564 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
565 | { 0x0000989c, 0x00f50000, 0x00f50000 }, | ||
566 | { 0x0000989c, 0x00dc0000, 0x00dc0000 }, | ||
567 | { 0x0000989c, 0x00110000, 0x00110000 }, | ||
568 | { 0x0000989c, 0x006100a8, 0x006100a8 }, | ||
569 | { 0x0000989c, 0x004210a2, 0x004210a2 }, | ||
570 | { 0x0000989c, 0x0014008f, 0x0014008f }, | ||
571 | { 0x0000989c, 0x00c40003, 0x00c40003 }, | ||
572 | { 0x0000989c, 0x003000f2, 0x003000f2 }, | ||
573 | { 0x0000989c, 0x00440016, 0x00440016 }, | ||
574 | { 0x0000989c, 0x00410040, 0x00410040 }, | ||
575 | { 0x0000989c, 0x0001805e, 0x0001805e }, | ||
576 | { 0x0000989c, 0x0000c0ab, 0x0000c0ab }, | ||
577 | { 0x0000989c, 0x000000f1, 0x000000f1 }, | ||
578 | { 0x0000989c, 0x00002081, 0x00002081 }, | ||
579 | { 0x0000989c, 0x000000d4, 0x000000d4 }, | ||
580 | { 0x000098d0, 0x0000000f, 0x0010000f }, | ||
581 | }; | ||
582 | |||
583 | static const u32 ar5416Bank6TPC[][3] = { | ||
584 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
585 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
586 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
587 | { 0x0000989c, 0x00e00000, 0x00e00000 }, | ||
588 | { 0x0000989c, 0x005e0000, 0x005e0000 }, | ||
589 | { 0x0000989c, 0x00120000, 0x00120000 }, | ||
590 | { 0x0000989c, 0x00620000, 0x00620000 }, | ||
591 | { 0x0000989c, 0x00020000, 0x00020000 }, | ||
592 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
593 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
594 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
595 | { 0x0000989c, 0x40ff0000, 0x40ff0000 }, | ||
596 | { 0x0000989c, 0x005f0000, 0x005f0000 }, | ||
597 | { 0x0000989c, 0x00870000, 0x00870000 }, | ||
598 | { 0x0000989c, 0x00f90000, 0x00f90000 }, | ||
599 | { 0x0000989c, 0x007b0000, 0x007b0000 }, | ||
600 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
601 | { 0x0000989c, 0x00f50000, 0x00f50000 }, | ||
602 | { 0x0000989c, 0x00dc0000, 0x00dc0000 }, | ||
603 | { 0x0000989c, 0x00110000, 0x00110000 }, | ||
604 | { 0x0000989c, 0x006100a8, 0x006100a8 }, | ||
605 | { 0x0000989c, 0x00423022, 0x00423022 }, | ||
606 | { 0x0000989c, 0x201400df, 0x201400df }, | ||
607 | { 0x0000989c, 0x00c40002, 0x00c40002 }, | ||
608 | { 0x0000989c, 0x003000f2, 0x003000f2 }, | ||
609 | { 0x0000989c, 0x00440016, 0x00440016 }, | ||
610 | { 0x0000989c, 0x00410040, 0x00410040 }, | ||
611 | { 0x0000989c, 0x0001805e, 0x0001805e }, | ||
612 | { 0x0000989c, 0x0000c0ab, 0x0000c0ab }, | ||
613 | { 0x0000989c, 0x000000e1, 0x000000e1 }, | ||
614 | { 0x0000989c, 0x00007081, 0x00007081 }, | ||
615 | { 0x0000989c, 0x000000d4, 0x000000d4 }, | ||
616 | { 0x000098d0, 0x0000000f, 0x0010000f }, | ||
617 | }; | ||
618 | |||
619 | static const u32 ar5416Bank7[][2] = { | ||
620 | { 0x0000989c, 0x00000500 }, | ||
621 | { 0x0000989c, 0x00000800 }, | ||
622 | { 0x000098cc, 0x0000000e }, | ||
623 | }; | ||
624 | |||
625 | static const u32 ar5416Addac[][2] = { | ||
626 | {0x0000989c, 0x00000000 }, | ||
627 | {0x0000989c, 0x00000003 }, | ||
628 | {0x0000989c, 0x00000000 }, | ||
629 | {0x0000989c, 0x0000000c }, | ||
630 | {0x0000989c, 0x00000000 }, | ||
631 | {0x0000989c, 0x00000030 }, | ||
632 | {0x0000989c, 0x00000000 }, | ||
633 | {0x0000989c, 0x00000000 }, | ||
634 | {0x0000989c, 0x00000000 }, | ||
635 | {0x0000989c, 0x00000000 }, | ||
636 | {0x0000989c, 0x00000000 }, | ||
637 | {0x0000989c, 0x00000000 }, | ||
638 | {0x0000989c, 0x00000000 }, | ||
639 | {0x0000989c, 0x00000000 }, | ||
640 | {0x0000989c, 0x00000000 }, | ||
641 | {0x0000989c, 0x00000000 }, | ||
642 | {0x0000989c, 0x00000000 }, | ||
643 | {0x0000989c, 0x00000000 }, | ||
644 | {0x0000989c, 0x00000060 }, | ||
645 | {0x0000989c, 0x00000000 }, | ||
646 | {0x0000989c, 0x00000000 }, | ||
647 | {0x0000989c, 0x00000000 }, | ||
648 | {0x0000989c, 0x00000000 }, | ||
649 | {0x0000989c, 0x00000000 }, | ||
650 | {0x0000989c, 0x00000000 }, | ||
651 | {0x0000989c, 0x00000000 }, | ||
652 | {0x0000989c, 0x00000000 }, | ||
653 | {0x0000989c, 0x00000000 }, | ||
654 | {0x0000989c, 0x00000000 }, | ||
655 | {0x0000989c, 0x00000000 }, | ||
656 | {0x0000989c, 0x00000000 }, | ||
657 | {0x0000989c, 0x00000058 }, | ||
658 | {0x0000989c, 0x00000000 }, | ||
659 | {0x0000989c, 0x00000000 }, | ||
660 | {0x0000989c, 0x00000000 }, | ||
661 | {0x0000989c, 0x00000000 }, | ||
662 | {0x000098cc, 0x00000000 }, | ||
663 | }; | ||
664 | |||
665 | static const u32 ar5416Modes_9100[][6] = { | ||
666 | { 0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160, 0x000001e0 }, | ||
667 | { 0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c, 0x000001e0 }, | ||
668 | { 0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38, 0x00001180 }, | ||
669 | { 0x000010f0, 0x0000a000, 0x00014000, 0x00016000, 0x0000b000, 0x00014008 }, | ||
670 | { 0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00, 0x06e006e0 }, | ||
671 | { 0x0000801c, 0x128d93a7, 0x128d93cf, 0x12e013d7, 0x12e013ab, 0x098813cf }, | ||
672 | { 0x00009804, 0x00000300, 0x000003c4, 0x000003c4, 0x00000300, 0x00000303 }, | ||
673 | { 0x00009820, 0x02020200, 0x02020200, 0x02020200, 0x02020200, 0x02020200 }, | ||
674 | { 0x00009824, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e }, | ||
675 | { 0x00009828, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001 }, | ||
676 | { 0x00009834, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e }, | ||
677 | { 0x00009838, 0x00000007, 0x00000007, 0x00000007, 0x00000007, 0x00000007 }, | ||
678 | { 0x00009844, 0x0372161e, 0x0372161e, 0x037216a0, 0x037216a0, 0x037216a0 }, | ||
679 | { 0x00009848, 0x001a6a65, 0x001a6a65, 0x00197a68, 0x00197a68, 0x00197a68 }, | ||
680 | { 0x0000a848, 0x001a6a65, 0x001a6a65, 0x00197a68, 0x00197a68, 0x00197a68 }, | ||
681 | { 0x0000b848, 0x001a6a65, 0x001a6a65, 0x00197a68, 0x00197a68, 0x00197a68 }, | ||
682 | { 0x00009850, 0x6d48b4e2, 0x6d48b4e2, 0x6d48b0e2, 0x6d48b0e2, 0x6d48b0e2 }, | ||
683 | { 0x00009858, 0x7ec82d2e, 0x7ec82d2e, 0x7ec86d2e, 0x7ec84d2e, 0x7ec82d2e }, | ||
684 | { 0x0000985c, 0x3139605e, 0x3139605e, 0x3139605e, 0x3139605e, 0x3139605e }, | ||
685 | { 0x00009860, 0x00048d18, 0x00048d18, 0x00048d20, 0x00048d20, 0x00048d18 }, | ||
686 | { 0x0000c864, 0x0001ce00, 0x0001ce00, 0x0001ce00, 0x0001ce00, 0x0001ce00 }, | ||
687 | { 0x00009868, 0x409a40d0, 0x409a40d0, 0x409a40d0, 0x409a40d0, 0x409a40d0 }, | ||
688 | { 0x0000986c, 0x050cb081, 0x050cb081, 0x050cb081, 0x050cb081, 0x050cb081 }, | ||
689 | { 0x00009914, 0x000007d0, 0x000007d0, 0x00000898, 0x00000898, 0x000007d0 }, | ||
690 | { 0x00009918, 0x0000000a, 0x00000014, 0x00000016, 0x0000000b, 0x00000016 }, | ||
691 | { 0x00009924, 0xd00a8a07, 0xd00a8a07, 0xd00a8a11, 0xd00a8a0d, 0xd00a8a0d }, | ||
692 | { 0x00009940, 0x00754604, 0x00754604, 0xfff81204, 0xfff81204, 0xfff81204 }, | ||
693 | { 0x00009944, 0xdfb81020, 0xdfb81020, 0xdfb81020, 0xdfb81020, 0xdfb81020 }, | ||
694 | { 0x00009954, 0x5f3ca3de, 0x5f3ca3de, 0xe250a51e, 0xe250a51e, 0xe250a51e }, | ||
695 | { 0x00009958, 0x2108ecff, 0x2108ecff, 0x3388ffff, 0x3388ffff, 0x3388ffff }, | ||
696 | #ifdef TB243 | ||
697 | { 0x00009960, 0x00000900, 0x00000900, 0x00009b40, 0x00009b40, 0x00012d80 }, | ||
698 | { 0x0000a960, 0x00000900, 0x00000900, 0x00009b40, 0x00009b40, 0x00012d80 }, | ||
699 | { 0x0000b960, 0x00000900, 0x00000900, 0x00009b40, 0x00009b40, 0x00012d80 }, | ||
700 | { 0x00009964, 0x00000000, 0x00000000, 0x00002210, 0x00002210, 0x00001120 }, | ||
701 | #else | ||
702 | { 0x00009960, 0x0001bfc0, 0x0001bfc0, 0x0001bfc0, 0x0001bfc0, 0x0001bfc0 }, | ||
703 | { 0x0000a960, 0x0001bfc0, 0x0001bfc0, 0x0001bfc0, 0x0001bfc0, 0x0001bfc0 }, | ||
704 | { 0x0000b960, 0x0001bfc0, 0x0001bfc0, 0x0001bfc0, 0x0001bfc0, 0x0001bfc0 }, | ||
705 | { 0x00009964, 0x00001120, 0x00001120, 0x00001120, 0x00001120, 0x00001120 }, | ||
706 | #endif | ||
707 | { 0x0000c9bc, 0x001a0600, 0x001a0600, 0x001a1000, 0x001a0c00, 0x001a0c00 }, | ||
708 | { 0x000099c0, 0x038919be, 0x038919be, 0x038919be, 0x038919be, 0x038919be }, | ||
709 | { 0x000099c4, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77 }, | ||
710 | { 0x000099c8, 0x60f65329, 0x60f65329, 0x60f65329, 0x60f65329, 0x60f65329 }, | ||
711 | { 0x000099cc, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8 }, | ||
712 | { 0x000099d0, 0x00046384, 0x00046384, 0x00046384, 0x00046384, 0x00046384 }, | ||
713 | { 0x000099d4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
714 | { 0x000099d8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
715 | { 0x0000a204, 0x00000880, 0x00000880, 0x00000880, 0x00000880, 0x00000880 }, | ||
716 | { 0x0000a208, 0xd6be4788, 0xd6be4788, 0xd03e4788, 0xd03e4788, 0xd03e4788 }, | ||
717 | { 0x0000a20c, 0x002fc160, 0x002fc160, 0x002ac120, 0x002ac120, 0x002ac120 }, | ||
718 | { 0x0000b20c, 0x002fc160, 0x002fc160, 0x002ac120, 0x002ac120, 0x002ac120 }, | ||
719 | { 0x0000c20c, 0x002fc160, 0x002fc160, 0x002ac120, 0x002ac120, 0x002ac120 }, | ||
720 | { 0x0000a21c, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a }, | ||
721 | { 0x0000a230, 0x00000000, 0x00000000, 0x00000210, 0x00000108, 0x00000000 }, | ||
722 | { 0x0000a274, 0x0a1a9caa, 0x0a1a9caa, 0x0a1a7caa, 0x0a1a7caa, 0x0a1a7caa }, | ||
723 | { 0x0000a300, 0x18010000, 0x18010000, 0x18010000, 0x18010000, 0x18010000 }, | ||
724 | { 0x0000a304, 0x30032602, 0x30032602, 0x2e032402, 0x2e032402, 0x2e032402 }, | ||
725 | { 0x0000a308, 0x48073e06, 0x48073e06, 0x4a0a3c06, 0x4a0a3c06, 0x4a0a3c06 }, | ||
726 | { 0x0000a30c, 0x560b4c0a, 0x560b4c0a, 0x621a540b, 0x621a540b, 0x621a540b }, | ||
727 | { 0x0000a310, 0x641a600f, 0x641a600f, 0x764f6c1b, 0x764f6c1b, 0x764f6c1b }, | ||
728 | { 0x0000a314, 0x7a4f6e1b, 0x7a4f6e1b, 0x845b7a5a, 0x845b7a5a, 0x845b7a5a }, | ||
729 | { 0x0000a318, 0x8c5b7e5a, 0x8c5b7e5a, 0x950f8ccf, 0x950f8ccf, 0x950f8ccf }, | ||
730 | { 0x0000a31c, 0x9d0f96cf, 0x9d0f96cf, 0xa5cf9b4f, 0xa5cf9b4f, 0xa5cf9b4f }, | ||
731 | { 0x0000a320, 0xb51fa69f, 0xb51fa69f, 0xbddfaf1f, 0xbddfaf1f, 0xbddfaf1f }, | ||
732 | { 0x0000a324, 0xcb3fbd07, 0xcb3fbcbf, 0xd1ffc93f, 0xd1ffc93f, 0xd1ffc93f }, | ||
733 | { 0x0000a328, 0x0000d7bf, 0x0000d7bf, 0x00000000, 0x00000000, 0x00000000 }, | ||
734 | { 0x0000a32c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
735 | { 0x0000a330, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
736 | { 0x0000a334, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
737 | }; | ||
738 | |||
739 | static const u32 ar5416Common_9100[][2] = { | ||
740 | { 0x0000000c, 0x00000000 }, | ||
741 | { 0x00000030, 0x00020015 }, | ||
742 | { 0x00000034, 0x00000005 }, | ||
743 | { 0x00000040, 0x00000000 }, | ||
744 | { 0x00000044, 0x00000008 }, | ||
745 | { 0x00000048, 0x00000008 }, | ||
746 | { 0x0000004c, 0x00000010 }, | ||
747 | { 0x00000050, 0x00000000 }, | ||
748 | { 0x00000054, 0x0000001f }, | ||
749 | { 0x00000800, 0x00000000 }, | ||
750 | { 0x00000804, 0x00000000 }, | ||
751 | { 0x00000808, 0x00000000 }, | ||
752 | { 0x0000080c, 0x00000000 }, | ||
753 | { 0x00000810, 0x00000000 }, | ||
754 | { 0x00000814, 0x00000000 }, | ||
755 | { 0x00000818, 0x00000000 }, | ||
756 | { 0x0000081c, 0x00000000 }, | ||
757 | { 0x00000820, 0x00000000 }, | ||
758 | { 0x00000824, 0x00000000 }, | ||
759 | { 0x00001040, 0x002ffc0f }, | ||
760 | { 0x00001044, 0x002ffc0f }, | ||
761 | { 0x00001048, 0x002ffc0f }, | ||
762 | { 0x0000104c, 0x002ffc0f }, | ||
763 | { 0x00001050, 0x002ffc0f }, | ||
764 | { 0x00001054, 0x002ffc0f }, | ||
765 | { 0x00001058, 0x002ffc0f }, | ||
766 | { 0x0000105c, 0x002ffc0f }, | ||
767 | { 0x00001060, 0x002ffc0f }, | ||
768 | { 0x00001064, 0x002ffc0f }, | ||
769 | { 0x00001230, 0x00000000 }, | ||
770 | { 0x00001270, 0x00000000 }, | ||
771 | { 0x00001038, 0x00000000 }, | ||
772 | { 0x00001078, 0x00000000 }, | ||
773 | { 0x000010b8, 0x00000000 }, | ||
774 | { 0x000010f8, 0x00000000 }, | ||
775 | { 0x00001138, 0x00000000 }, | ||
776 | { 0x00001178, 0x00000000 }, | ||
777 | { 0x000011b8, 0x00000000 }, | ||
778 | { 0x000011f8, 0x00000000 }, | ||
779 | { 0x00001238, 0x00000000 }, | ||
780 | { 0x00001278, 0x00000000 }, | ||
781 | { 0x000012b8, 0x00000000 }, | ||
782 | { 0x000012f8, 0x00000000 }, | ||
783 | { 0x00001338, 0x00000000 }, | ||
784 | { 0x00001378, 0x00000000 }, | ||
785 | { 0x000013b8, 0x00000000 }, | ||
786 | { 0x000013f8, 0x00000000 }, | ||
787 | { 0x00001438, 0x00000000 }, | ||
788 | { 0x00001478, 0x00000000 }, | ||
789 | { 0x000014b8, 0x00000000 }, | ||
790 | { 0x000014f8, 0x00000000 }, | ||
791 | { 0x00001538, 0x00000000 }, | ||
792 | { 0x00001578, 0x00000000 }, | ||
793 | { 0x000015b8, 0x00000000 }, | ||
794 | { 0x000015f8, 0x00000000 }, | ||
795 | { 0x00001638, 0x00000000 }, | ||
796 | { 0x00001678, 0x00000000 }, | ||
797 | { 0x000016b8, 0x00000000 }, | ||
798 | { 0x000016f8, 0x00000000 }, | ||
799 | { 0x00001738, 0x00000000 }, | ||
800 | { 0x00001778, 0x00000000 }, | ||
801 | { 0x000017b8, 0x00000000 }, | ||
802 | { 0x000017f8, 0x00000000 }, | ||
803 | { 0x0000103c, 0x00000000 }, | ||
804 | { 0x0000107c, 0x00000000 }, | ||
805 | { 0x000010bc, 0x00000000 }, | ||
806 | { 0x000010fc, 0x00000000 }, | ||
807 | { 0x0000113c, 0x00000000 }, | ||
808 | { 0x0000117c, 0x00000000 }, | ||
809 | { 0x000011bc, 0x00000000 }, | ||
810 | { 0x000011fc, 0x00000000 }, | ||
811 | { 0x0000123c, 0x00000000 }, | ||
812 | { 0x0000127c, 0x00000000 }, | ||
813 | { 0x000012bc, 0x00000000 }, | ||
814 | { 0x000012fc, 0x00000000 }, | ||
815 | { 0x0000133c, 0x00000000 }, | ||
816 | { 0x0000137c, 0x00000000 }, | ||
817 | { 0x000013bc, 0x00000000 }, | ||
818 | { 0x000013fc, 0x00000000 }, | ||
819 | { 0x0000143c, 0x00000000 }, | ||
820 | { 0x0000147c, 0x00000000 }, | ||
821 | { 0x00020010, 0x00000003 }, | ||
822 | { 0x00020038, 0x000004c2 }, | ||
823 | { 0x00008004, 0x00000000 }, | ||
824 | { 0x00008008, 0x00000000 }, | ||
825 | { 0x0000800c, 0x00000000 }, | ||
826 | { 0x00008018, 0x00000700 }, | ||
827 | { 0x00008020, 0x00000000 }, | ||
828 | { 0x00008038, 0x00000000 }, | ||
829 | { 0x0000803c, 0x00000000 }, | ||
830 | { 0x00008048, 0x40000000 }, | ||
831 | { 0x00008054, 0x00004000 }, | ||
832 | { 0x00008058, 0x00000000 }, | ||
833 | { 0x0000805c, 0x000fc78f }, | ||
834 | { 0x00008060, 0x0000000f }, | ||
835 | { 0x00008064, 0x00000000 }, | ||
836 | { 0x000080c0, 0x2a82301a }, | ||
837 | { 0x000080c4, 0x05dc01e0 }, | ||
838 | { 0x000080c8, 0x1f402710 }, | ||
839 | { 0x000080cc, 0x01f40000 }, | ||
840 | { 0x000080d0, 0x00001e00 }, | ||
841 | { 0x000080d4, 0x00000000 }, | ||
842 | { 0x000080d8, 0x00400000 }, | ||
843 | { 0x000080e0, 0xffffffff }, | ||
844 | { 0x000080e4, 0x0000ffff }, | ||
845 | { 0x000080e8, 0x003f3f3f }, | ||
846 | { 0x000080ec, 0x00000000 }, | ||
847 | { 0x000080f0, 0x00000000 }, | ||
848 | { 0x000080f4, 0x00000000 }, | ||
849 | { 0x000080f8, 0x00000000 }, | ||
850 | { 0x000080fc, 0x00020000 }, | ||
851 | { 0x00008100, 0x00020000 }, | ||
852 | { 0x00008104, 0x00000001 }, | ||
853 | { 0x00008108, 0x00000052 }, | ||
854 | { 0x0000810c, 0x00000000 }, | ||
855 | { 0x00008110, 0x00000168 }, | ||
856 | { 0x00008118, 0x000100aa }, | ||
857 | { 0x0000811c, 0x00003210 }, | ||
858 | { 0x00008120, 0x08f04800 }, | ||
859 | { 0x00008124, 0x00000000 }, | ||
860 | { 0x00008128, 0x00000000 }, | ||
861 | { 0x0000812c, 0x00000000 }, | ||
862 | { 0x00008130, 0x00000000 }, | ||
863 | { 0x00008134, 0x00000000 }, | ||
864 | { 0x00008138, 0x00000000 }, | ||
865 | { 0x0000813c, 0x00000000 }, | ||
866 | { 0x00008144, 0x00000000 }, | ||
867 | { 0x00008168, 0x00000000 }, | ||
868 | { 0x0000816c, 0x00000000 }, | ||
869 | { 0x00008170, 0x32143320 }, | ||
870 | { 0x00008174, 0xfaa4fa50 }, | ||
871 | { 0x00008178, 0x00000100 }, | ||
872 | { 0x0000817c, 0x00000000 }, | ||
873 | { 0x000081c4, 0x00000000 }, | ||
874 | { 0x000081d0, 0x00003210 }, | ||
875 | { 0x000081ec, 0x00000000 }, | ||
876 | { 0x000081f0, 0x00000000 }, | ||
877 | { 0x000081f4, 0x00000000 }, | ||
878 | { 0x000081f8, 0x00000000 }, | ||
879 | { 0x000081fc, 0x00000000 }, | ||
880 | { 0x00008200, 0x00000000 }, | ||
881 | { 0x00008204, 0x00000000 }, | ||
882 | { 0x00008208, 0x00000000 }, | ||
883 | { 0x0000820c, 0x00000000 }, | ||
884 | { 0x00008210, 0x00000000 }, | ||
885 | { 0x00008214, 0x00000000 }, | ||
886 | { 0x00008218, 0x00000000 }, | ||
887 | { 0x0000821c, 0x00000000 }, | ||
888 | { 0x00008220, 0x00000000 }, | ||
889 | { 0x00008224, 0x00000000 }, | ||
890 | { 0x00008228, 0x00000000 }, | ||
891 | { 0x0000822c, 0x00000000 }, | ||
892 | { 0x00008230, 0x00000000 }, | ||
893 | { 0x00008234, 0x00000000 }, | ||
894 | { 0x00008238, 0x00000000 }, | ||
895 | { 0x0000823c, 0x00000000 }, | ||
896 | { 0x00008240, 0x00100000 }, | ||
897 | { 0x00008244, 0x0010f400 }, | ||
898 | { 0x00008248, 0x00000100 }, | ||
899 | { 0x0000824c, 0x0001e800 }, | ||
900 | { 0x00008250, 0x00000000 }, | ||
901 | { 0x00008254, 0x00000000 }, | ||
902 | { 0x00008258, 0x00000000 }, | ||
903 | { 0x0000825c, 0x400000ff }, | ||
904 | { 0x00008260, 0x00080922 }, | ||
905 | { 0x00008270, 0x00000000 }, | ||
906 | { 0x00008274, 0x40000000 }, | ||
907 | { 0x00008278, 0x003e4180 }, | ||
908 | { 0x0000827c, 0x00000000 }, | ||
909 | { 0x00008284, 0x0000002c }, | ||
910 | { 0x00008288, 0x0000002c }, | ||
911 | { 0x0000828c, 0x00000000 }, | ||
912 | { 0x00008294, 0x00000000 }, | ||
913 | { 0x00008298, 0x00000000 }, | ||
914 | { 0x00008300, 0x00000000 }, | ||
915 | { 0x00008304, 0x00000000 }, | ||
916 | { 0x00008308, 0x00000000 }, | ||
917 | { 0x0000830c, 0x00000000 }, | ||
918 | { 0x00008310, 0x00000000 }, | ||
919 | { 0x00008314, 0x00000000 }, | ||
920 | { 0x00008318, 0x00000000 }, | ||
921 | { 0x00008328, 0x00000000 }, | ||
922 | { 0x0000832c, 0x00000007 }, | ||
923 | { 0x00008330, 0x00000302 }, | ||
924 | { 0x00008334, 0x00000e00 }, | ||
925 | { 0x00008338, 0x00000000 }, | ||
926 | { 0x0000833c, 0x00000000 }, | ||
927 | { 0x00008340, 0x000107ff }, | ||
928 | { 0x00009808, 0x00000000 }, | ||
929 | { 0x0000980c, 0xad848e19 }, | ||
930 | { 0x00009810, 0x7d14e000 }, | ||
931 | { 0x00009814, 0x9c0a9f6b }, | ||
932 | { 0x0000981c, 0x00000000 }, | ||
933 | { 0x0000982c, 0x0000a000 }, | ||
934 | { 0x00009830, 0x00000000 }, | ||
935 | { 0x0000983c, 0x00200400 }, | ||
936 | { 0x00009840, 0x206a01ae }, | ||
937 | { 0x0000984c, 0x1284233c }, | ||
938 | { 0x00009854, 0x00000859 }, | ||
939 | { 0x00009900, 0x00000000 }, | ||
940 | { 0x00009904, 0x00000000 }, | ||
941 | { 0x00009908, 0x00000000 }, | ||
942 | { 0x0000990c, 0x00000000 }, | ||
943 | { 0x0000991c, 0x10000fff }, | ||
944 | { 0x00009920, 0x05100000 }, | ||
945 | { 0x0000a920, 0x05100000 }, | ||
946 | { 0x0000b920, 0x05100000 }, | ||
947 | { 0x00009928, 0x00000001 }, | ||
948 | { 0x0000992c, 0x00000004 }, | ||
949 | { 0x00009934, 0x1e1f2022 }, | ||
950 | { 0x00009938, 0x0a0b0c0d }, | ||
951 | { 0x0000993c, 0x00000000 }, | ||
952 | { 0x00009948, 0x9280b212 }, | ||
953 | { 0x0000994c, 0x00020028 }, | ||
954 | { 0x0000c95c, 0x004b6a8e }, | ||
955 | { 0x0000c968, 0x000003ce }, | ||
956 | { 0x00009970, 0x190fb515 }, | ||
957 | { 0x00009974, 0x00000000 }, | ||
958 | { 0x00009978, 0x00000001 }, | ||
959 | { 0x0000997c, 0x00000000 }, | ||
960 | { 0x00009980, 0x00000000 }, | ||
961 | { 0x00009984, 0x00000000 }, | ||
962 | { 0x00009988, 0x00000000 }, | ||
963 | { 0x0000998c, 0x00000000 }, | ||
964 | { 0x00009990, 0x00000000 }, | ||
965 | { 0x00009994, 0x00000000 }, | ||
966 | { 0x00009998, 0x00000000 }, | ||
967 | { 0x0000999c, 0x00000000 }, | ||
968 | { 0x000099a0, 0x00000000 }, | ||
969 | { 0x000099a4, 0x00000001 }, | ||
970 | { 0x000099a8, 0x201fff00 }, | ||
971 | { 0x000099ac, 0x006f0000 }, | ||
972 | { 0x000099b0, 0x03051000 }, | ||
973 | { 0x000099dc, 0x00000000 }, | ||
974 | { 0x000099e0, 0x00000200 }, | ||
975 | { 0x000099e4, 0xaaaaaaaa }, | ||
976 | { 0x000099e8, 0x3c466478 }, | ||
977 | { 0x000099ec, 0x0cc80caa }, | ||
978 | { 0x000099fc, 0x00001042 }, | ||
979 | { 0x00009b00, 0x00000000 }, | ||
980 | { 0x00009b04, 0x00000001 }, | ||
981 | { 0x00009b08, 0x00000002 }, | ||
982 | { 0x00009b0c, 0x00000003 }, | ||
983 | { 0x00009b10, 0x00000004 }, | ||
984 | { 0x00009b14, 0x00000005 }, | ||
985 | { 0x00009b18, 0x00000008 }, | ||
986 | { 0x00009b1c, 0x00000009 }, | ||
987 | { 0x00009b20, 0x0000000a }, | ||
988 | { 0x00009b24, 0x0000000b }, | ||
989 | { 0x00009b28, 0x0000000c }, | ||
990 | { 0x00009b2c, 0x0000000d }, | ||
991 | { 0x00009b30, 0x00000010 }, | ||
992 | { 0x00009b34, 0x00000011 }, | ||
993 | { 0x00009b38, 0x00000012 }, | ||
994 | { 0x00009b3c, 0x00000013 }, | ||
995 | { 0x00009b40, 0x00000014 }, | ||
996 | { 0x00009b44, 0x00000015 }, | ||
997 | { 0x00009b48, 0x00000018 }, | ||
998 | { 0x00009b4c, 0x00000019 }, | ||
999 | { 0x00009b50, 0x0000001a }, | ||
1000 | { 0x00009b54, 0x0000001b }, | ||
1001 | { 0x00009b58, 0x0000001c }, | ||
1002 | { 0x00009b5c, 0x0000001d }, | ||
1003 | { 0x00009b60, 0x00000020 }, | ||
1004 | { 0x00009b64, 0x00000021 }, | ||
1005 | { 0x00009b68, 0x00000022 }, | ||
1006 | { 0x00009b6c, 0x00000023 }, | ||
1007 | { 0x00009b70, 0x00000024 }, | ||
1008 | { 0x00009b74, 0x00000025 }, | ||
1009 | { 0x00009b78, 0x00000028 }, | ||
1010 | { 0x00009b7c, 0x00000029 }, | ||
1011 | { 0x00009b80, 0x0000002a }, | ||
1012 | { 0x00009b84, 0x0000002b }, | ||
1013 | { 0x00009b88, 0x0000002c }, | ||
1014 | { 0x00009b8c, 0x0000002d }, | ||
1015 | { 0x00009b90, 0x00000030 }, | ||
1016 | { 0x00009b94, 0x00000031 }, | ||
1017 | { 0x00009b98, 0x00000032 }, | ||
1018 | { 0x00009b9c, 0x00000033 }, | ||
1019 | { 0x00009ba0, 0x00000034 }, | ||
1020 | { 0x00009ba4, 0x00000035 }, | ||
1021 | { 0x00009ba8, 0x00000035 }, | ||
1022 | { 0x00009bac, 0x00000035 }, | ||
1023 | { 0x00009bb0, 0x00000035 }, | ||
1024 | { 0x00009bb4, 0x00000035 }, | ||
1025 | { 0x00009bb8, 0x00000035 }, | ||
1026 | { 0x00009bbc, 0x00000035 }, | ||
1027 | { 0x00009bc0, 0x00000035 }, | ||
1028 | { 0x00009bc4, 0x00000035 }, | ||
1029 | { 0x00009bc8, 0x00000035 }, | ||
1030 | { 0x00009bcc, 0x00000035 }, | ||
1031 | { 0x00009bd0, 0x00000035 }, | ||
1032 | { 0x00009bd4, 0x00000035 }, | ||
1033 | { 0x00009bd8, 0x00000035 }, | ||
1034 | { 0x00009bdc, 0x00000035 }, | ||
1035 | { 0x00009be0, 0x00000035 }, | ||
1036 | { 0x00009be4, 0x00000035 }, | ||
1037 | { 0x00009be8, 0x00000035 }, | ||
1038 | { 0x00009bec, 0x00000035 }, | ||
1039 | { 0x00009bf0, 0x00000035 }, | ||
1040 | { 0x00009bf4, 0x00000035 }, | ||
1041 | { 0x00009bf8, 0x00000010 }, | ||
1042 | { 0x00009bfc, 0x0000001a }, | ||
1043 | { 0x0000a210, 0x40806333 }, | ||
1044 | { 0x0000a214, 0x00106c10 }, | ||
1045 | { 0x0000a218, 0x009c4060 }, | ||
1046 | { 0x0000a220, 0x018830c6 }, | ||
1047 | { 0x0000a224, 0x00000400 }, | ||
1048 | { 0x0000a228, 0x001a0bb5 }, | ||
1049 | { 0x0000a22c, 0x00000000 }, | ||
1050 | { 0x0000a234, 0x20202020 }, | ||
1051 | { 0x0000a238, 0x20202020 }, | ||
1052 | { 0x0000a23c, 0x13c889ae }, | ||
1053 | { 0x0000a240, 0x38490a20 }, | ||
1054 | { 0x0000a244, 0x00007bb6 }, | ||
1055 | { 0x0000a248, 0x0fff3ffc }, | ||
1056 | { 0x0000a24c, 0x00000001 }, | ||
1057 | { 0x0000a250, 0x0000a000 }, | ||
1058 | { 0x0000a254, 0x00000000 }, | ||
1059 | { 0x0000a258, 0x0cc75380 }, | ||
1060 | { 0x0000a25c, 0x0f0f0f01 }, | ||
1061 | { 0x0000a260, 0xdfa91f01 }, | ||
1062 | { 0x0000a268, 0x00000001 }, | ||
1063 | { 0x0000a26c, 0x0ebae9c6 }, | ||
1064 | { 0x0000b26c, 0x0ebae9c6 }, | ||
1065 | { 0x0000c26c, 0x0ebae9c6 }, | ||
1066 | { 0x0000d270, 0x00820820 }, | ||
1067 | { 0x0000a278, 0x1ce739ce }, | ||
1068 | { 0x0000a27c, 0x050701ce }, | ||
1069 | { 0x0000a338, 0x00000000 }, | ||
1070 | { 0x0000a33c, 0x00000000 }, | ||
1071 | { 0x0000a340, 0x00000000 }, | ||
1072 | { 0x0000a344, 0x00000000 }, | ||
1073 | { 0x0000a348, 0x3fffffff }, | ||
1074 | { 0x0000a34c, 0x3fffffff }, | ||
1075 | { 0x0000a350, 0x3fffffff }, | ||
1076 | { 0x0000a354, 0x0003ffff }, | ||
1077 | { 0x0000a358, 0x79a8aa33 }, | ||
1078 | { 0x0000d35c, 0x07ffffef }, | ||
1079 | { 0x0000d360, 0x0fffffe7 }, | ||
1080 | { 0x0000d364, 0x17ffffe5 }, | ||
1081 | { 0x0000d368, 0x1fffffe4 }, | ||
1082 | { 0x0000d36c, 0x37ffffe3 }, | ||
1083 | { 0x0000d370, 0x3fffffe3 }, | ||
1084 | { 0x0000d374, 0x57ffffe3 }, | ||
1085 | { 0x0000d378, 0x5fffffe2 }, | ||
1086 | { 0x0000d37c, 0x7fffffe2 }, | ||
1087 | { 0x0000d380, 0x7f3c7bba }, | ||
1088 | { 0x0000d384, 0xf3307ff0 }, | ||
1089 | { 0x0000a388, 0x0c000000 }, | ||
1090 | { 0x0000a38c, 0x20202020 }, | ||
1091 | { 0x0000a390, 0x20202020 }, | ||
1092 | { 0x0000a394, 0x1ce739ce }, | ||
1093 | { 0x0000a398, 0x000001ce }, | ||
1094 | { 0x0000a39c, 0x00000001 }, | ||
1095 | { 0x0000a3a0, 0x00000000 }, | ||
1096 | { 0x0000a3a4, 0x00000000 }, | ||
1097 | { 0x0000a3a8, 0x00000000 }, | ||
1098 | { 0x0000a3ac, 0x00000000 }, | ||
1099 | { 0x0000a3b0, 0x00000000 }, | ||
1100 | { 0x0000a3b4, 0x00000000 }, | ||
1101 | { 0x0000a3b8, 0x00000000 }, | ||
1102 | { 0x0000a3bc, 0x00000000 }, | ||
1103 | { 0x0000a3c0, 0x00000000 }, | ||
1104 | { 0x0000a3c4, 0x00000000 }, | ||
1105 | { 0x0000a3c8, 0x00000246 }, | ||
1106 | { 0x0000a3cc, 0x20202020 }, | ||
1107 | { 0x0000a3d0, 0x20202020 }, | ||
1108 | { 0x0000a3d4, 0x20202020 }, | ||
1109 | { 0x0000a3dc, 0x1ce739ce }, | ||
1110 | { 0x0000a3e0, 0x000001ce }, | ||
1111 | }; | ||
1112 | |||
1113 | static const u32 ar5416Bank0_9100[][2] = { | ||
1114 | { 0x000098b0, 0x1e5795e5 }, | ||
1115 | { 0x000098e0, 0x02008020 }, | ||
1116 | }; | ||
1117 | |||
1118 | static const u32 ar5416BB_RfGain_9100[][3] = { | ||
1119 | { 0x00009a00, 0x00000000, 0x00000000 }, | ||
1120 | { 0x00009a04, 0x00000040, 0x00000040 }, | ||
1121 | { 0x00009a08, 0x00000080, 0x00000080 }, | ||
1122 | { 0x00009a0c, 0x000001a1, 0x00000141 }, | ||
1123 | { 0x00009a10, 0x000001e1, 0x00000181 }, | ||
1124 | { 0x00009a14, 0x00000021, 0x000001c1 }, | ||
1125 | { 0x00009a18, 0x00000061, 0x00000001 }, | ||
1126 | { 0x00009a1c, 0x00000168, 0x00000041 }, | ||
1127 | { 0x00009a20, 0x000001a8, 0x000001a8 }, | ||
1128 | { 0x00009a24, 0x000001e8, 0x000001e8 }, | ||
1129 | { 0x00009a28, 0x00000028, 0x00000028 }, | ||
1130 | { 0x00009a2c, 0x00000068, 0x00000068 }, | ||
1131 | { 0x00009a30, 0x00000189, 0x000000a8 }, | ||
1132 | { 0x00009a34, 0x000001c9, 0x00000169 }, | ||
1133 | { 0x00009a38, 0x00000009, 0x000001a9 }, | ||
1134 | { 0x00009a3c, 0x00000049, 0x000001e9 }, | ||
1135 | { 0x00009a40, 0x00000089, 0x00000029 }, | ||
1136 | { 0x00009a44, 0x00000170, 0x00000069 }, | ||
1137 | { 0x00009a48, 0x000001b0, 0x00000190 }, | ||
1138 | { 0x00009a4c, 0x000001f0, 0x000001d0 }, | ||
1139 | { 0x00009a50, 0x00000030, 0x00000010 }, | ||
1140 | { 0x00009a54, 0x00000070, 0x00000050 }, | ||
1141 | { 0x00009a58, 0x00000191, 0x00000090 }, | ||
1142 | { 0x00009a5c, 0x000001d1, 0x00000151 }, | ||
1143 | { 0x00009a60, 0x00000011, 0x00000191 }, | ||
1144 | { 0x00009a64, 0x00000051, 0x000001d1 }, | ||
1145 | { 0x00009a68, 0x00000091, 0x00000011 }, | ||
1146 | { 0x00009a6c, 0x000001b8, 0x00000051 }, | ||
1147 | { 0x00009a70, 0x000001f8, 0x00000198 }, | ||
1148 | { 0x00009a74, 0x00000038, 0x000001d8 }, | ||
1149 | { 0x00009a78, 0x00000078, 0x00000018 }, | ||
1150 | { 0x00009a7c, 0x00000199, 0x00000058 }, | ||
1151 | { 0x00009a80, 0x000001d9, 0x00000098 }, | ||
1152 | { 0x00009a84, 0x00000019, 0x00000159 }, | ||
1153 | { 0x00009a88, 0x00000059, 0x00000199 }, | ||
1154 | { 0x00009a8c, 0x00000099, 0x000001d9 }, | ||
1155 | { 0x00009a90, 0x000000d9, 0x00000019 }, | ||
1156 | { 0x00009a94, 0x000000f9, 0x00000059 }, | ||
1157 | { 0x00009a98, 0x000000f9, 0x00000099 }, | ||
1158 | { 0x00009a9c, 0x000000f9, 0x000000d9 }, | ||
1159 | { 0x00009aa0, 0x000000f9, 0x000000f9 }, | ||
1160 | { 0x00009aa4, 0x000000f9, 0x000000f9 }, | ||
1161 | { 0x00009aa8, 0x000000f9, 0x000000f9 }, | ||
1162 | { 0x00009aac, 0x000000f9, 0x000000f9 }, | ||
1163 | { 0x00009ab0, 0x000000f9, 0x000000f9 }, | ||
1164 | { 0x00009ab4, 0x000000f9, 0x000000f9 }, | ||
1165 | { 0x00009ab8, 0x000000f9, 0x000000f9 }, | ||
1166 | { 0x00009abc, 0x000000f9, 0x000000f9 }, | ||
1167 | { 0x00009ac0, 0x000000f9, 0x000000f9 }, | ||
1168 | { 0x00009ac4, 0x000000f9, 0x000000f9 }, | ||
1169 | { 0x00009ac8, 0x000000f9, 0x000000f9 }, | ||
1170 | { 0x00009acc, 0x000000f9, 0x000000f9 }, | ||
1171 | { 0x00009ad0, 0x000000f9, 0x000000f9 }, | ||
1172 | { 0x00009ad4, 0x000000f9, 0x000000f9 }, | ||
1173 | { 0x00009ad8, 0x000000f9, 0x000000f9 }, | ||
1174 | { 0x00009adc, 0x000000f9, 0x000000f9 }, | ||
1175 | { 0x00009ae0, 0x000000f9, 0x000000f9 }, | ||
1176 | { 0x00009ae4, 0x000000f9, 0x000000f9 }, | ||
1177 | { 0x00009ae8, 0x000000f9, 0x000000f9 }, | ||
1178 | { 0x00009aec, 0x000000f9, 0x000000f9 }, | ||
1179 | { 0x00009af0, 0x000000f9, 0x000000f9 }, | ||
1180 | { 0x00009af4, 0x000000f9, 0x000000f9 }, | ||
1181 | { 0x00009af8, 0x000000f9, 0x000000f9 }, | ||
1182 | { 0x00009afc, 0x000000f9, 0x000000f9 }, | ||
1183 | }; | ||
1184 | |||
1185 | static const u32 ar5416Bank1_9100[][2] = { | ||
1186 | { 0x000098b0, 0x02108421}, | ||
1187 | { 0x000098ec, 0x00000008}, | ||
1188 | }; | ||
1189 | |||
1190 | static const u32 ar5416Bank2_9100[][2] = { | ||
1191 | { 0x000098b0, 0x0e73ff17}, | ||
1192 | { 0x000098e0, 0x00000420}, | ||
1193 | }; | ||
1194 | |||
1195 | static const u32 ar5416Bank3_9100[][3] = { | ||
1196 | { 0x000098f0, 0x01400018, 0x01c00018 }, | ||
1197 | }; | ||
1198 | |||
1199 | static const u32 ar5416Bank6_9100[][3] = { | ||
1200 | |||
1201 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
1202 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
1203 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
1204 | { 0x0000989c, 0x00e00000, 0x00e00000 }, | ||
1205 | { 0x0000989c, 0x005e0000, 0x005e0000 }, | ||
1206 | { 0x0000989c, 0x00120000, 0x00120000 }, | ||
1207 | { 0x0000989c, 0x00620000, 0x00620000 }, | ||
1208 | { 0x0000989c, 0x00020000, 0x00020000 }, | ||
1209 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1210 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1211 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1212 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1213 | { 0x0000989c, 0x005f0000, 0x005f0000 }, | ||
1214 | { 0x0000989c, 0x00870000, 0x00870000 }, | ||
1215 | { 0x0000989c, 0x00f90000, 0x00f90000 }, | ||
1216 | { 0x0000989c, 0x007b0000, 0x007b0000 }, | ||
1217 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1218 | { 0x0000989c, 0x00f50000, 0x00f50000 }, | ||
1219 | { 0x0000989c, 0x00dc0000, 0x00dc0000 }, | ||
1220 | { 0x0000989c, 0x00110000, 0x00110000 }, | ||
1221 | { 0x0000989c, 0x006100a8, 0x006100a8 }, | ||
1222 | { 0x0000989c, 0x004210a2, 0x004210a2 }, | ||
1223 | { 0x0000989c, 0x0014000f, 0x0014000f }, | ||
1224 | { 0x0000989c, 0x00c40002, 0x00c40002 }, | ||
1225 | { 0x0000989c, 0x003000f2, 0x003000f2 }, | ||
1226 | { 0x0000989c, 0x00440016, 0x00440016 }, | ||
1227 | { 0x0000989c, 0x00410040, 0x00410040 }, | ||
1228 | { 0x0000989c, 0x000180d6, 0x000180d6 }, | ||
1229 | { 0x0000989c, 0x0000c0aa, 0x0000c0aa }, | ||
1230 | { 0x0000989c, 0x000000b1, 0x000000b1 }, | ||
1231 | { 0x0000989c, 0x00002000, 0x00002000 }, | ||
1232 | { 0x0000989c, 0x000000d4, 0x000000d4 }, | ||
1233 | { 0x000098d0, 0x0000000f, 0x0010000f }, | ||
1234 | }; | ||
1235 | |||
1236 | |||
1237 | static const u32 ar5416Bank6TPC_9100[][3] = { | ||
1238 | |||
1239 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
1240 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
1241 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
1242 | { 0x0000989c, 0x00e00000, 0x00e00000 }, | ||
1243 | { 0x0000989c, 0x005e0000, 0x005e0000 }, | ||
1244 | { 0x0000989c, 0x00120000, 0x00120000 }, | ||
1245 | { 0x0000989c, 0x00620000, 0x00620000 }, | ||
1246 | { 0x0000989c, 0x00020000, 0x00020000 }, | ||
1247 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1248 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1249 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1250 | { 0x0000989c, 0x40ff0000, 0x40ff0000 }, | ||
1251 | { 0x0000989c, 0x005f0000, 0x005f0000 }, | ||
1252 | { 0x0000989c, 0x00870000, 0x00870000 }, | ||
1253 | { 0x0000989c, 0x00f90000, 0x00f90000 }, | ||
1254 | { 0x0000989c, 0x007b0000, 0x007b0000 }, | ||
1255 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1256 | { 0x0000989c, 0x00f50000, 0x00f50000 }, | ||
1257 | { 0x0000989c, 0x00dc0000, 0x00dc0000 }, | ||
1258 | { 0x0000989c, 0x00110000, 0x00110000 }, | ||
1259 | { 0x0000989c, 0x006100a8, 0x006100a8 }, | ||
1260 | { 0x0000989c, 0x00423022, 0x00423022 }, | ||
1261 | { 0x0000989c, 0x2014008f, 0x2014008f }, | ||
1262 | { 0x0000989c, 0x00c40002, 0x00c40002 }, | ||
1263 | { 0x0000989c, 0x003000f2, 0x003000f2 }, | ||
1264 | { 0x0000989c, 0x00440016, 0x00440016 }, | ||
1265 | { 0x0000989c, 0x00410040, 0x00410040 }, | ||
1266 | { 0x0000989c, 0x0001805e, 0x0001805e }, | ||
1267 | { 0x0000989c, 0x0000c0ab, 0x0000c0ab }, | ||
1268 | { 0x0000989c, 0x000000e1, 0x000000e1 }, | ||
1269 | { 0x0000989c, 0x00007080, 0x00007080 }, | ||
1270 | { 0x0000989c, 0x000000d4, 0x000000d4 }, | ||
1271 | { 0x000098d0, 0x0000000f, 0x0010000f }, | ||
1272 | }; | ||
1273 | |||
1274 | static const u32 ar5416Bank7_9100[][2] = { | ||
1275 | { 0x0000989c, 0x00000500 }, | ||
1276 | { 0x0000989c, 0x00000800 }, | ||
1277 | { 0x000098cc, 0x0000000e }, | ||
1278 | }; | ||
1279 | |||
1280 | static const u32 ar5416Addac_9100[][2] = { | ||
1281 | {0x0000989c, 0x00000000 }, | ||
1282 | {0x0000989c, 0x00000000 }, | ||
1283 | {0x0000989c, 0x00000000 }, | ||
1284 | {0x0000989c, 0x00000000 }, | ||
1285 | {0x0000989c, 0x00000000 }, | ||
1286 | {0x0000989c, 0x00000000 }, | ||
1287 | {0x0000989c, 0x00000000 }, | ||
1288 | {0x0000989c, 0x00000010 }, | ||
1289 | {0x0000989c, 0x00000000 }, | ||
1290 | {0x0000989c, 0x00000000 }, | ||
1291 | {0x0000989c, 0x00000000 }, | ||
1292 | {0x0000989c, 0x00000000 }, | ||
1293 | {0x0000989c, 0x00000000 }, | ||
1294 | {0x0000989c, 0x00000000 }, | ||
1295 | {0x0000989c, 0x00000000 }, | ||
1296 | {0x0000989c, 0x00000000 }, | ||
1297 | {0x0000989c, 0x00000000 }, | ||
1298 | {0x0000989c, 0x00000000 }, | ||
1299 | {0x0000989c, 0x00000000 }, | ||
1300 | {0x0000989c, 0x00000000 }, | ||
1301 | {0x0000989c, 0x00000000 }, | ||
1302 | {0x0000989c, 0x000000c0 }, | ||
1303 | {0x0000989c, 0x00000015 }, | ||
1304 | {0x0000989c, 0x00000000 }, | ||
1305 | {0x0000989c, 0x00000000 }, | ||
1306 | {0x0000989c, 0x00000000 }, | ||
1307 | {0x0000989c, 0x00000000 }, | ||
1308 | {0x0000989c, 0x00000000 }, | ||
1309 | {0x0000989c, 0x00000000 }, | ||
1310 | {0x0000989c, 0x00000000 }, | ||
1311 | {0x0000989c, 0x00000000 }, | ||
1312 | {0x000098cc, 0x00000000 }, | ||
1313 | }; | ||
1314 | |||
1315 | static const u32 ar5416Modes_9160[][6] = { | ||
1316 | { 0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160, 0x000001e0 }, | ||
1317 | { 0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c, 0x000001e0 }, | ||
1318 | { 0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38, 0x00001180 }, | ||
1319 | { 0x000010f0, 0x0000a000, 0x00014000, 0x00016000, 0x0000b000, 0x00014008 }, | ||
1320 | { 0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00, 0x06e006e0 }, | ||
1321 | { 0x0000801c, 0x128d93a7, 0x128d93cf, 0x12e013d7, 0x12e013ab, 0x098813cf }, | ||
1322 | { 0x00009804, 0x00000300, 0x000003c4, 0x000003c4, 0x00000300, 0x00000303 }, | ||
1323 | { 0x00009820, 0x02020200, 0x02020200, 0x02020200, 0x02020200, 0x02020200 }, | ||
1324 | { 0x00009824, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e }, | ||
1325 | { 0x00009828, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001 }, | ||
1326 | { 0x00009834, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e }, | ||
1327 | { 0x00009838, 0x00000007, 0x00000007, 0x00000007, 0x00000007, 0x00000007 }, | ||
1328 | { 0x00009844, 0x0372161e, 0x0372161e, 0x037216a0, 0x037216a0, 0x037216a0 }, | ||
1329 | { 0x00009848, 0x001a6a65, 0x001a6a65, 0x00197a68, 0x00197a68, 0x00197a68 }, | ||
1330 | { 0x0000a848, 0x001a6a65, 0x001a6a65, 0x00197a68, 0x00197a68, 0x00197a68 }, | ||
1331 | { 0x0000b848, 0x001a6a65, 0x001a6a65, 0x00197a68, 0x00197a68, 0x00197a68 }, | ||
1332 | { 0x00009850, 0x6c48b4e2, 0x6c48b4e2, 0x6c48b0e2, 0x6c48b0e2, 0x6c48b0e2 }, | ||
1333 | { 0x00009858, 0x7ec82d2e, 0x7ec82d2e, 0x7ec82d2e, 0x7ec82d2e, 0x7ec82d2e }, | ||
1334 | { 0x0000985c, 0x31395d5e, 0x31395d5e, 0x31395d5e, 0x31395d5e, 0x31395d5e }, | ||
1335 | { 0x00009860, 0x00048d18, 0x00048d18, 0x00048d20, 0x00048d20, 0x00048d18 }, | ||
1336 | { 0x0000c864, 0x0001ce00, 0x0001ce00, 0x0001ce00, 0x0001ce00, 0x0001ce00 }, | ||
1337 | { 0x00009868, 0x409a40d0, 0x409a40d0, 0x409a40d0, 0x409a40d0, 0x409a40d0 }, | ||
1338 | { 0x0000986c, 0x050cb081, 0x050cb081, 0x050cb081, 0x050cb081, 0x050cb081 }, | ||
1339 | { 0x00009914, 0x000007d0, 0x00000fa0, 0x00001130, 0x00000898, 0x000007d0 }, | ||
1340 | { 0x00009918, 0x0000000a, 0x00000014, 0x00000016, 0x0000000b, 0x00000016 }, | ||
1341 | { 0x00009924, 0xd00a8a07, 0xd00a8a07, 0xd00a8a0d, 0xd00a8a0d, 0xd00a8a0d }, | ||
1342 | { 0x00009944, 0xffb81020, 0xffb81020, 0xffb81020, 0xffb81020, 0xffb81020 }, | ||
1343 | { 0x00009960, 0x00009b40, 0x00009b40, 0x00009b40, 0x00009b40, 0x00009b40 }, | ||
1344 | { 0x0000a960, 0x00009b40, 0x00009b40, 0x00009b40, 0x00009b40, 0x00009b40 }, | ||
1345 | { 0x0000b960, 0x00009b40, 0x00009b40, 0x00009b40, 0x00009b40, 0x00009b40 }, | ||
1346 | { 0x00009964, 0x00001120, 0x00001120, 0x00001120, 0x00001120, 0x00001120 }, | ||
1347 | { 0x0000c968, 0x000003b5, 0x000003b5, 0x000003ce, 0x000003ce, 0x000003ce }, | ||
1348 | { 0x0000c9bc, 0x001a0600, 0x001a0600, 0x001a0c00, 0x001a0c00, 0x001a0c00 }, | ||
1349 | { 0x000099c0, 0x038919be, 0x038919be, 0x038919be, 0x038919be, 0x038919be }, | ||
1350 | { 0x000099c4, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77, 0x06336f77 }, | ||
1351 | { 0x000099c8, 0x60f65329, 0x60f65329, 0x60f65329, 0x60f65329, 0x60f65329 }, | ||
1352 | { 0x000099cc, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8, 0x08f186c8 }, | ||
1353 | { 0x000099d0, 0x00046384, 0x00046384, 0x00046384, 0x00046384, 0x00046384 }, | ||
1354 | { 0x000099d4, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
1355 | { 0x000099d8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
1356 | { 0x0000a204, 0x00000880, 0x00000880, 0x00000880, 0x00000880, 0x00000880 }, | ||
1357 | { 0x0000a208, 0xd6be4788, 0xd6be4788, 0xd03e4788, 0xd03e4788, 0xd03e4788 }, | ||
1358 | { 0x0000a20c, 0x002fc160, 0x002fc160, 0x002ac120, 0x002ac120, 0x002ac120 }, | ||
1359 | { 0x0000b20c, 0x002fc160, 0x002fc160, 0x002ac120, 0x002ac120, 0x002ac120 }, | ||
1360 | { 0x0000c20c, 0x002fc160, 0x002fc160, 0x002ac120, 0x002ac120, 0x002ac120 }, | ||
1361 | { 0x0000a21c, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a, 0x1883800a }, | ||
1362 | { 0x0000a230, 0x00000000, 0x00000000, 0x00000210, 0x00000108, 0x00000000 }, | ||
1363 | { 0x0000a274, 0x0a1a9caa, 0x0a1a9caa, 0x0a1a7caa, 0x0a1a7caa, 0x0a1a7caa }, | ||
1364 | { 0x0000a300, 0x18010000, 0x18010000, 0x18010000, 0x18010000, 0x18010000 }, | ||
1365 | { 0x0000a304, 0x30032602, 0x30032602, 0x2e032402, 0x2e032402, 0x2e032402 }, | ||
1366 | { 0x0000a308, 0x48073e06, 0x48073e06, 0x4a0a3c06, 0x4a0a3c06, 0x4a0a3c06 }, | ||
1367 | { 0x0000a30c, 0x560b4c0a, 0x560b4c0a, 0x621a540b, 0x621a540b, 0x621a540b }, | ||
1368 | { 0x0000a310, 0x641a600f, 0x641a600f, 0x764f6c1b, 0x764f6c1b, 0x764f6c1b }, | ||
1369 | { 0x0000a314, 0x7a4f6e1b, 0x7a4f6e1b, 0x845b7a5a, 0x845b7a5a, 0x845b7a5a }, | ||
1370 | { 0x0000a318, 0x8c5b7e5a, 0x8c5b7e5a, 0x950f8ccf, 0x950f8ccf, 0x950f8ccf }, | ||
1371 | { 0x0000a31c, 0x9d0f96cf, 0x9d0f96cf, 0xa5cf9b4f, 0xa5cf9b4f, 0xa5cf9b4f }, | ||
1372 | { 0x0000a320, 0xb51fa69f, 0xb51fa69f, 0xbddfaf1f, 0xbddfaf1f, 0xbddfaf1f }, | ||
1373 | { 0x0000a324, 0xcb3fbd07, 0xcb3fbcbf, 0xd1ffc93f, 0xd1ffc93f, 0xd1ffc93f }, | ||
1374 | { 0x0000a328, 0x0000d7bf, 0x0000d7bf, 0x00000000, 0x00000000, 0x00000000 }, | ||
1375 | { 0x0000a32c, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
1376 | { 0x0000a330, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
1377 | { 0x0000a334, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | ||
1378 | }; | ||
1379 | 19 | ||
1380 | static const u32 ar5416Common_9160[][2] = { | ||
1381 | { 0x0000000c, 0x00000000 }, | ||
1382 | { 0x00000030, 0x00020015 }, | ||
1383 | { 0x00000034, 0x00000005 }, | ||
1384 | { 0x00000040, 0x00000000 }, | ||
1385 | { 0x00000044, 0x00000008 }, | ||
1386 | { 0x00000048, 0x00000008 }, | ||
1387 | { 0x0000004c, 0x00000010 }, | ||
1388 | { 0x00000050, 0x00000000 }, | ||
1389 | { 0x00000054, 0x0000001f }, | ||
1390 | { 0x00000800, 0x00000000 }, | ||
1391 | { 0x00000804, 0x00000000 }, | ||
1392 | { 0x00000808, 0x00000000 }, | ||
1393 | { 0x0000080c, 0x00000000 }, | ||
1394 | { 0x00000810, 0x00000000 }, | ||
1395 | { 0x00000814, 0x00000000 }, | ||
1396 | { 0x00000818, 0x00000000 }, | ||
1397 | { 0x0000081c, 0x00000000 }, | ||
1398 | { 0x00000820, 0x00000000 }, | ||
1399 | { 0x00000824, 0x00000000 }, | ||
1400 | { 0x00001040, 0x002ffc0f }, | ||
1401 | { 0x00001044, 0x002ffc0f }, | ||
1402 | { 0x00001048, 0x002ffc0f }, | ||
1403 | { 0x0000104c, 0x002ffc0f }, | ||
1404 | { 0x00001050, 0x002ffc0f }, | ||
1405 | { 0x00001054, 0x002ffc0f }, | ||
1406 | { 0x00001058, 0x002ffc0f }, | ||
1407 | { 0x0000105c, 0x002ffc0f }, | ||
1408 | { 0x00001060, 0x002ffc0f }, | ||
1409 | { 0x00001064, 0x002ffc0f }, | ||
1410 | { 0x00001230, 0x00000000 }, | ||
1411 | { 0x00001270, 0x00000000 }, | ||
1412 | { 0x00001038, 0x00000000 }, | ||
1413 | { 0x00001078, 0x00000000 }, | ||
1414 | { 0x000010b8, 0x00000000 }, | ||
1415 | { 0x000010f8, 0x00000000 }, | ||
1416 | { 0x00001138, 0x00000000 }, | ||
1417 | { 0x00001178, 0x00000000 }, | ||
1418 | { 0x000011b8, 0x00000000 }, | ||
1419 | { 0x000011f8, 0x00000000 }, | ||
1420 | { 0x00001238, 0x00000000 }, | ||
1421 | { 0x00001278, 0x00000000 }, | ||
1422 | { 0x000012b8, 0x00000000 }, | ||
1423 | { 0x000012f8, 0x00000000 }, | ||
1424 | { 0x00001338, 0x00000000 }, | ||
1425 | { 0x00001378, 0x00000000 }, | ||
1426 | { 0x000013b8, 0x00000000 }, | ||
1427 | { 0x000013f8, 0x00000000 }, | ||
1428 | { 0x00001438, 0x00000000 }, | ||
1429 | { 0x00001478, 0x00000000 }, | ||
1430 | { 0x000014b8, 0x00000000 }, | ||
1431 | { 0x000014f8, 0x00000000 }, | ||
1432 | { 0x00001538, 0x00000000 }, | ||
1433 | { 0x00001578, 0x00000000 }, | ||
1434 | { 0x000015b8, 0x00000000 }, | ||
1435 | { 0x000015f8, 0x00000000 }, | ||
1436 | { 0x00001638, 0x00000000 }, | ||
1437 | { 0x00001678, 0x00000000 }, | ||
1438 | { 0x000016b8, 0x00000000 }, | ||
1439 | { 0x000016f8, 0x00000000 }, | ||
1440 | { 0x00001738, 0x00000000 }, | ||
1441 | { 0x00001778, 0x00000000 }, | ||
1442 | { 0x000017b8, 0x00000000 }, | ||
1443 | { 0x000017f8, 0x00000000 }, | ||
1444 | { 0x0000103c, 0x00000000 }, | ||
1445 | { 0x0000107c, 0x00000000 }, | ||
1446 | { 0x000010bc, 0x00000000 }, | ||
1447 | { 0x000010fc, 0x00000000 }, | ||
1448 | { 0x0000113c, 0x00000000 }, | ||
1449 | { 0x0000117c, 0x00000000 }, | ||
1450 | { 0x000011bc, 0x00000000 }, | ||
1451 | { 0x000011fc, 0x00000000 }, | ||
1452 | { 0x0000123c, 0x00000000 }, | ||
1453 | { 0x0000127c, 0x00000000 }, | ||
1454 | { 0x000012bc, 0x00000000 }, | ||
1455 | { 0x000012fc, 0x00000000 }, | ||
1456 | { 0x0000133c, 0x00000000 }, | ||
1457 | { 0x0000137c, 0x00000000 }, | ||
1458 | { 0x000013bc, 0x00000000 }, | ||
1459 | { 0x000013fc, 0x00000000 }, | ||
1460 | { 0x0000143c, 0x00000000 }, | ||
1461 | { 0x0000147c, 0x00000000 }, | ||
1462 | { 0x00004030, 0x00000002 }, | ||
1463 | { 0x0000403c, 0x00000002 }, | ||
1464 | { 0x00007010, 0x00000020 }, | ||
1465 | { 0x00007038, 0x000004c2 }, | ||
1466 | { 0x00008004, 0x00000000 }, | ||
1467 | { 0x00008008, 0x00000000 }, | ||
1468 | { 0x0000800c, 0x00000000 }, | ||
1469 | { 0x00008018, 0x00000700 }, | ||
1470 | { 0x00008020, 0x00000000 }, | ||
1471 | { 0x00008038, 0x00000000 }, | ||
1472 | { 0x0000803c, 0x00000000 }, | ||
1473 | { 0x00008048, 0x40000000 }, | ||
1474 | { 0x00008054, 0x00000000 }, | ||
1475 | { 0x00008058, 0x00000000 }, | ||
1476 | { 0x0000805c, 0x000fc78f }, | ||
1477 | { 0x00008060, 0x0000000f }, | ||
1478 | { 0x00008064, 0x00000000 }, | ||
1479 | { 0x000080c0, 0x2a82301a }, | ||
1480 | { 0x000080c4, 0x05dc01e0 }, | ||
1481 | { 0x000080c8, 0x1f402710 }, | ||
1482 | { 0x000080cc, 0x01f40000 }, | ||
1483 | { 0x000080d0, 0x00001e00 }, | ||
1484 | { 0x000080d4, 0x00000000 }, | ||
1485 | { 0x000080d8, 0x00400000 }, | ||
1486 | { 0x000080e0, 0xffffffff }, | ||
1487 | { 0x000080e4, 0x0000ffff }, | ||
1488 | { 0x000080e8, 0x003f3f3f }, | ||
1489 | { 0x000080ec, 0x00000000 }, | ||
1490 | { 0x000080f0, 0x00000000 }, | ||
1491 | { 0x000080f4, 0x00000000 }, | ||
1492 | { 0x000080f8, 0x00000000 }, | ||
1493 | { 0x000080fc, 0x00020000 }, | ||
1494 | { 0x00008100, 0x00020000 }, | ||
1495 | { 0x00008104, 0x00000001 }, | ||
1496 | { 0x00008108, 0x00000052 }, | ||
1497 | { 0x0000810c, 0x00000000 }, | ||
1498 | { 0x00008110, 0x00000168 }, | ||
1499 | { 0x00008118, 0x000100aa }, | ||
1500 | { 0x0000811c, 0x00003210 }, | ||
1501 | { 0x00008120, 0x08f04800 }, | ||
1502 | { 0x00008124, 0x00000000 }, | ||
1503 | { 0x00008128, 0x00000000 }, | ||
1504 | { 0x0000812c, 0x00000000 }, | ||
1505 | { 0x00008130, 0x00000000 }, | ||
1506 | { 0x00008134, 0x00000000 }, | ||
1507 | { 0x00008138, 0x00000000 }, | ||
1508 | { 0x0000813c, 0x00000000 }, | ||
1509 | { 0x00008144, 0xffffffff }, | ||
1510 | { 0x00008168, 0x00000000 }, | ||
1511 | { 0x0000816c, 0x00000000 }, | ||
1512 | { 0x00008170, 0x32143320 }, | ||
1513 | { 0x00008174, 0xfaa4fa50 }, | ||
1514 | { 0x00008178, 0x00000100 }, | ||
1515 | { 0x0000817c, 0x00000000 }, | ||
1516 | { 0x000081c4, 0x00000000 }, | ||
1517 | { 0x000081d0, 0x00003210 }, | ||
1518 | { 0x000081ec, 0x00000000 }, | ||
1519 | { 0x000081f0, 0x00000000 }, | ||
1520 | { 0x000081f4, 0x00000000 }, | ||
1521 | { 0x000081f8, 0x00000000 }, | ||
1522 | { 0x000081fc, 0x00000000 }, | ||
1523 | { 0x00008200, 0x00000000 }, | ||
1524 | { 0x00008204, 0x00000000 }, | ||
1525 | { 0x00008208, 0x00000000 }, | ||
1526 | { 0x0000820c, 0x00000000 }, | ||
1527 | { 0x00008210, 0x00000000 }, | ||
1528 | { 0x00008214, 0x00000000 }, | ||
1529 | { 0x00008218, 0x00000000 }, | ||
1530 | { 0x0000821c, 0x00000000 }, | ||
1531 | { 0x00008220, 0x00000000 }, | ||
1532 | { 0x00008224, 0x00000000 }, | ||
1533 | { 0x00008228, 0x00000000 }, | ||
1534 | { 0x0000822c, 0x00000000 }, | ||
1535 | { 0x00008230, 0x00000000 }, | ||
1536 | { 0x00008234, 0x00000000 }, | ||
1537 | { 0x00008238, 0x00000000 }, | ||
1538 | { 0x0000823c, 0x00000000 }, | ||
1539 | { 0x00008240, 0x00100000 }, | ||
1540 | { 0x00008244, 0x0010f400 }, | ||
1541 | { 0x00008248, 0x00000100 }, | ||
1542 | { 0x0000824c, 0x0001e800 }, | ||
1543 | { 0x00008250, 0x00000000 }, | ||
1544 | { 0x00008254, 0x00000000 }, | ||
1545 | { 0x00008258, 0x00000000 }, | ||
1546 | { 0x0000825c, 0x400000ff }, | ||
1547 | { 0x00008260, 0x00080922 }, | ||
1548 | { 0x00008270, 0x00000000 }, | ||
1549 | { 0x00008274, 0x40000000 }, | ||
1550 | { 0x00008278, 0x003e4180 }, | ||
1551 | { 0x0000827c, 0x00000000 }, | ||
1552 | { 0x00008284, 0x0000002c }, | ||
1553 | { 0x00008288, 0x0000002c }, | ||
1554 | { 0x0000828c, 0x00000000 }, | ||
1555 | { 0x00008294, 0x00000000 }, | ||
1556 | { 0x00008298, 0x00000000 }, | ||
1557 | { 0x00008300, 0x00000000 }, | ||
1558 | { 0x00008304, 0x00000000 }, | ||
1559 | { 0x00008308, 0x00000000 }, | ||
1560 | { 0x0000830c, 0x00000000 }, | ||
1561 | { 0x00008310, 0x00000000 }, | ||
1562 | { 0x00008314, 0x00000000 }, | ||
1563 | { 0x00008318, 0x00000000 }, | ||
1564 | { 0x00008328, 0x00000000 }, | ||
1565 | { 0x0000832c, 0x00000007 }, | ||
1566 | { 0x00008330, 0x00000302 }, | ||
1567 | { 0x00008334, 0x00000e00 }, | ||
1568 | { 0x00008338, 0x00ff0000 }, | ||
1569 | { 0x0000833c, 0x00000000 }, | ||
1570 | { 0x00008340, 0x000107ff }, | ||
1571 | { 0x00009808, 0x00000000 }, | ||
1572 | { 0x0000980c, 0xad848e19 }, | ||
1573 | { 0x00009810, 0x7d14e000 }, | ||
1574 | { 0x00009814, 0x9c0a9f6b }, | ||
1575 | { 0x0000981c, 0x00000000 }, | ||
1576 | { 0x0000982c, 0x0000a000 }, | ||
1577 | { 0x00009830, 0x00000000 }, | ||
1578 | { 0x0000983c, 0x00200400 }, | ||
1579 | { 0x00009840, 0x206a01ae }, | ||
1580 | { 0x0000984c, 0x1284233c }, | ||
1581 | { 0x00009854, 0x00000859 }, | ||
1582 | { 0x00009900, 0x00000000 }, | ||
1583 | { 0x00009904, 0x00000000 }, | ||
1584 | { 0x00009908, 0x00000000 }, | ||
1585 | { 0x0000990c, 0x00000000 }, | ||
1586 | { 0x0000991c, 0x10000fff }, | ||
1587 | { 0x00009920, 0x05100000 }, | ||
1588 | { 0x0000a920, 0x05100000 }, | ||
1589 | { 0x0000b920, 0x05100000 }, | ||
1590 | { 0x00009928, 0x00000001 }, | ||
1591 | { 0x0000992c, 0x00000004 }, | ||
1592 | { 0x00009934, 0x1e1f2022 }, | ||
1593 | { 0x00009938, 0x0a0b0c0d }, | ||
1594 | { 0x0000993c, 0x00000000 }, | ||
1595 | { 0x00009948, 0x9280b212 }, | ||
1596 | { 0x0000994c, 0x00020028 }, | ||
1597 | { 0x00009954, 0x5f3ca3de }, | ||
1598 | { 0x00009958, 0x2108ecff }, | ||
1599 | { 0x00009940, 0x00750604 }, | ||
1600 | { 0x0000c95c, 0x004b6a8e }, | ||
1601 | { 0x00009970, 0x190fb515 }, | ||
1602 | { 0x00009974, 0x00000000 }, | ||
1603 | { 0x00009978, 0x00000001 }, | ||
1604 | { 0x0000997c, 0x00000000 }, | ||
1605 | { 0x00009980, 0x00000000 }, | ||
1606 | { 0x00009984, 0x00000000 }, | ||
1607 | { 0x00009988, 0x00000000 }, | ||
1608 | { 0x0000998c, 0x00000000 }, | ||
1609 | { 0x00009990, 0x00000000 }, | ||
1610 | { 0x00009994, 0x00000000 }, | ||
1611 | { 0x00009998, 0x00000000 }, | ||
1612 | { 0x0000999c, 0x00000000 }, | ||
1613 | { 0x000099a0, 0x00000000 }, | ||
1614 | { 0x000099a4, 0x00000001 }, | ||
1615 | { 0x000099a8, 0x201fff00 }, | ||
1616 | { 0x000099ac, 0x006f0000 }, | ||
1617 | { 0x000099b0, 0x03051000 }, | ||
1618 | { 0x000099dc, 0x00000000 }, | ||
1619 | { 0x000099e0, 0x00000200 }, | ||
1620 | { 0x000099e4, 0xaaaaaaaa }, | ||
1621 | { 0x000099e8, 0x3c466478 }, | ||
1622 | { 0x000099ec, 0x0cc80caa }, | ||
1623 | { 0x000099fc, 0x00001042 }, | ||
1624 | { 0x00009b00, 0x00000000 }, | ||
1625 | { 0x00009b04, 0x00000001 }, | ||
1626 | { 0x00009b08, 0x00000002 }, | ||
1627 | { 0x00009b0c, 0x00000003 }, | ||
1628 | { 0x00009b10, 0x00000004 }, | ||
1629 | { 0x00009b14, 0x00000005 }, | ||
1630 | { 0x00009b18, 0x00000008 }, | ||
1631 | { 0x00009b1c, 0x00000009 }, | ||
1632 | { 0x00009b20, 0x0000000a }, | ||
1633 | { 0x00009b24, 0x0000000b }, | ||
1634 | { 0x00009b28, 0x0000000c }, | ||
1635 | { 0x00009b2c, 0x0000000d }, | ||
1636 | { 0x00009b30, 0x00000010 }, | ||
1637 | { 0x00009b34, 0x00000011 }, | ||
1638 | { 0x00009b38, 0x00000012 }, | ||
1639 | { 0x00009b3c, 0x00000013 }, | ||
1640 | { 0x00009b40, 0x00000014 }, | ||
1641 | { 0x00009b44, 0x00000015 }, | ||
1642 | { 0x00009b48, 0x00000018 }, | ||
1643 | { 0x00009b4c, 0x00000019 }, | ||
1644 | { 0x00009b50, 0x0000001a }, | ||
1645 | { 0x00009b54, 0x0000001b }, | ||
1646 | { 0x00009b58, 0x0000001c }, | ||
1647 | { 0x00009b5c, 0x0000001d }, | ||
1648 | { 0x00009b60, 0x00000020 }, | ||
1649 | { 0x00009b64, 0x00000021 }, | ||
1650 | { 0x00009b68, 0x00000022 }, | ||
1651 | { 0x00009b6c, 0x00000023 }, | ||
1652 | { 0x00009b70, 0x00000024 }, | ||
1653 | { 0x00009b74, 0x00000025 }, | ||
1654 | { 0x00009b78, 0x00000028 }, | ||
1655 | { 0x00009b7c, 0x00000029 }, | ||
1656 | { 0x00009b80, 0x0000002a }, | ||
1657 | { 0x00009b84, 0x0000002b }, | ||
1658 | { 0x00009b88, 0x0000002c }, | ||
1659 | { 0x00009b8c, 0x0000002d }, | ||
1660 | { 0x00009b90, 0x00000030 }, | ||
1661 | { 0x00009b94, 0x00000031 }, | ||
1662 | { 0x00009b98, 0x00000032 }, | ||
1663 | { 0x00009b9c, 0x00000033 }, | ||
1664 | { 0x00009ba0, 0x00000034 }, | ||
1665 | { 0x00009ba4, 0x00000035 }, | ||
1666 | { 0x00009ba8, 0x00000035 }, | ||
1667 | { 0x00009bac, 0x00000035 }, | ||
1668 | { 0x00009bb0, 0x00000035 }, | ||
1669 | { 0x00009bb4, 0x00000035 }, | ||
1670 | { 0x00009bb8, 0x00000035 }, | ||
1671 | { 0x00009bbc, 0x00000035 }, | ||
1672 | { 0x00009bc0, 0x00000035 }, | ||
1673 | { 0x00009bc4, 0x00000035 }, | ||
1674 | { 0x00009bc8, 0x00000035 }, | ||
1675 | { 0x00009bcc, 0x00000035 }, | ||
1676 | { 0x00009bd0, 0x00000035 }, | ||
1677 | { 0x00009bd4, 0x00000035 }, | ||
1678 | { 0x00009bd8, 0x00000035 }, | ||
1679 | { 0x00009bdc, 0x00000035 }, | ||
1680 | { 0x00009be0, 0x00000035 }, | ||
1681 | { 0x00009be4, 0x00000035 }, | ||
1682 | { 0x00009be8, 0x00000035 }, | ||
1683 | { 0x00009bec, 0x00000035 }, | ||
1684 | { 0x00009bf0, 0x00000035 }, | ||
1685 | { 0x00009bf4, 0x00000035 }, | ||
1686 | { 0x00009bf8, 0x00000010 }, | ||
1687 | { 0x00009bfc, 0x0000001a }, | ||
1688 | { 0x0000a210, 0x40806333 }, | ||
1689 | { 0x0000a214, 0x00106c10 }, | ||
1690 | { 0x0000a218, 0x009c4060 }, | ||
1691 | { 0x0000a220, 0x018830c6 }, | ||
1692 | { 0x0000a224, 0x00000400 }, | ||
1693 | { 0x0000a228, 0x001a0bb5 }, | ||
1694 | { 0x0000a22c, 0x00000000 }, | ||
1695 | { 0x0000a234, 0x20202020 }, | ||
1696 | { 0x0000a238, 0x20202020 }, | ||
1697 | { 0x0000a23c, 0x13c889af }, | ||
1698 | { 0x0000a240, 0x38490a20 }, | ||
1699 | { 0x0000a244, 0x00007bb6 }, | ||
1700 | { 0x0000a248, 0x0fff3ffc }, | ||
1701 | { 0x0000a24c, 0x00000001 }, | ||
1702 | { 0x0000a250, 0x0000e000 }, | ||
1703 | { 0x0000a254, 0x00000000 }, | ||
1704 | { 0x0000a258, 0x0cc75380 }, | ||
1705 | { 0x0000a25c, 0x0f0f0f01 }, | ||
1706 | { 0x0000a260, 0xdfa91f01 }, | ||
1707 | { 0x0000a268, 0x00000001 }, | ||
1708 | { 0x0000a26c, 0x0ebae9c6 }, | ||
1709 | { 0x0000b26c, 0x0ebae9c6 }, | ||
1710 | { 0x0000c26c, 0x0ebae9c6 }, | ||
1711 | { 0x0000d270, 0x00820820 }, | ||
1712 | { 0x0000a278, 0x1ce739ce }, | ||
1713 | { 0x0000a27c, 0x050701ce }, | ||
1714 | { 0x0000a338, 0x00000000 }, | ||
1715 | { 0x0000a33c, 0x00000000 }, | ||
1716 | { 0x0000a340, 0x00000000 }, | ||
1717 | { 0x0000a344, 0x00000000 }, | ||
1718 | { 0x0000a348, 0x3fffffff }, | ||
1719 | { 0x0000a34c, 0x3fffffff }, | ||
1720 | { 0x0000a350, 0x3fffffff }, | ||
1721 | { 0x0000a354, 0x0003ffff }, | ||
1722 | { 0x0000a358, 0x79bfaa03 }, | ||
1723 | { 0x0000d35c, 0x07ffffef }, | ||
1724 | { 0x0000d360, 0x0fffffe7 }, | ||
1725 | { 0x0000d364, 0x17ffffe5 }, | ||
1726 | { 0x0000d368, 0x1fffffe4 }, | ||
1727 | { 0x0000d36c, 0x37ffffe3 }, | ||
1728 | { 0x0000d370, 0x3fffffe3 }, | ||
1729 | { 0x0000d374, 0x57ffffe3 }, | ||
1730 | { 0x0000d378, 0x5fffffe2 }, | ||
1731 | { 0x0000d37c, 0x7fffffe2 }, | ||
1732 | { 0x0000d380, 0x7f3c7bba }, | ||
1733 | { 0x0000d384, 0xf3307ff0 }, | ||
1734 | { 0x0000a388, 0x0c000000 }, | ||
1735 | { 0x0000a38c, 0x20202020 }, | ||
1736 | { 0x0000a390, 0x20202020 }, | ||
1737 | { 0x0000a394, 0x1ce739ce }, | ||
1738 | { 0x0000a398, 0x000001ce }, | ||
1739 | { 0x0000a39c, 0x00000001 }, | ||
1740 | { 0x0000a3a0, 0x00000000 }, | ||
1741 | { 0x0000a3a4, 0x00000000 }, | ||
1742 | { 0x0000a3a8, 0x00000000 }, | ||
1743 | { 0x0000a3ac, 0x00000000 }, | ||
1744 | { 0x0000a3b0, 0x00000000 }, | ||
1745 | { 0x0000a3b4, 0x00000000 }, | ||
1746 | { 0x0000a3b8, 0x00000000 }, | ||
1747 | { 0x0000a3bc, 0x00000000 }, | ||
1748 | { 0x0000a3c0, 0x00000000 }, | ||
1749 | { 0x0000a3c4, 0x00000000 }, | ||
1750 | { 0x0000a3c8, 0x00000246 }, | ||
1751 | { 0x0000a3cc, 0x20202020 }, | ||
1752 | { 0x0000a3d0, 0x20202020 }, | ||
1753 | { 0x0000a3d4, 0x20202020 }, | ||
1754 | { 0x0000a3dc, 0x1ce739ce }, | ||
1755 | { 0x0000a3e0, 0x000001ce }, | ||
1756 | }; | ||
1757 | |||
1758 | static const u32 ar5416Bank0_9160[][2] = { | ||
1759 | { 0x000098b0, 0x1e5795e5 }, | ||
1760 | { 0x000098e0, 0x02008020 }, | ||
1761 | }; | ||
1762 | |||
1763 | static const u32 ar5416BB_RfGain_9160[][3] = { | ||
1764 | { 0x00009a00, 0x00000000, 0x00000000 }, | ||
1765 | { 0x00009a04, 0x00000040, 0x00000040 }, | ||
1766 | { 0x00009a08, 0x00000080, 0x00000080 }, | ||
1767 | { 0x00009a0c, 0x000001a1, 0x00000141 }, | ||
1768 | { 0x00009a10, 0x000001e1, 0x00000181 }, | ||
1769 | { 0x00009a14, 0x00000021, 0x000001c1 }, | ||
1770 | { 0x00009a18, 0x00000061, 0x00000001 }, | ||
1771 | { 0x00009a1c, 0x00000168, 0x00000041 }, | ||
1772 | { 0x00009a20, 0x000001a8, 0x000001a8 }, | ||
1773 | { 0x00009a24, 0x000001e8, 0x000001e8 }, | ||
1774 | { 0x00009a28, 0x00000028, 0x00000028 }, | ||
1775 | { 0x00009a2c, 0x00000068, 0x00000068 }, | ||
1776 | { 0x00009a30, 0x00000189, 0x000000a8 }, | ||
1777 | { 0x00009a34, 0x000001c9, 0x00000169 }, | ||
1778 | { 0x00009a38, 0x00000009, 0x000001a9 }, | ||
1779 | { 0x00009a3c, 0x00000049, 0x000001e9 }, | ||
1780 | { 0x00009a40, 0x00000089, 0x00000029 }, | ||
1781 | { 0x00009a44, 0x00000170, 0x00000069 }, | ||
1782 | { 0x00009a48, 0x000001b0, 0x00000190 }, | ||
1783 | { 0x00009a4c, 0x000001f0, 0x000001d0 }, | ||
1784 | { 0x00009a50, 0x00000030, 0x00000010 }, | ||
1785 | { 0x00009a54, 0x00000070, 0x00000050 }, | ||
1786 | { 0x00009a58, 0x00000191, 0x00000090 }, | ||
1787 | { 0x00009a5c, 0x000001d1, 0x00000151 }, | ||
1788 | { 0x00009a60, 0x00000011, 0x00000191 }, | ||
1789 | { 0x00009a64, 0x00000051, 0x000001d1 }, | ||
1790 | { 0x00009a68, 0x00000091, 0x00000011 }, | ||
1791 | { 0x00009a6c, 0x000001b8, 0x00000051 }, | ||
1792 | { 0x00009a70, 0x000001f8, 0x00000198 }, | ||
1793 | { 0x00009a74, 0x00000038, 0x000001d8 }, | ||
1794 | { 0x00009a78, 0x00000078, 0x00000018 }, | ||
1795 | { 0x00009a7c, 0x00000199, 0x00000058 }, | ||
1796 | { 0x00009a80, 0x000001d9, 0x00000098 }, | ||
1797 | { 0x00009a84, 0x00000019, 0x00000159 }, | ||
1798 | { 0x00009a88, 0x00000059, 0x00000199 }, | ||
1799 | { 0x00009a8c, 0x00000099, 0x000001d9 }, | ||
1800 | { 0x00009a90, 0x000000d9, 0x00000019 }, | ||
1801 | { 0x00009a94, 0x000000f9, 0x00000059 }, | ||
1802 | { 0x00009a98, 0x000000f9, 0x00000099 }, | ||
1803 | { 0x00009a9c, 0x000000f9, 0x000000d9 }, | ||
1804 | { 0x00009aa0, 0x000000f9, 0x000000f9 }, | ||
1805 | { 0x00009aa4, 0x000000f9, 0x000000f9 }, | ||
1806 | { 0x00009aa8, 0x000000f9, 0x000000f9 }, | ||
1807 | { 0x00009aac, 0x000000f9, 0x000000f9 }, | ||
1808 | { 0x00009ab0, 0x000000f9, 0x000000f9 }, | ||
1809 | { 0x00009ab4, 0x000000f9, 0x000000f9 }, | ||
1810 | { 0x00009ab8, 0x000000f9, 0x000000f9 }, | ||
1811 | { 0x00009abc, 0x000000f9, 0x000000f9 }, | ||
1812 | { 0x00009ac0, 0x000000f9, 0x000000f9 }, | ||
1813 | { 0x00009ac4, 0x000000f9, 0x000000f9 }, | ||
1814 | { 0x00009ac8, 0x000000f9, 0x000000f9 }, | ||
1815 | { 0x00009acc, 0x000000f9, 0x000000f9 }, | ||
1816 | { 0x00009ad0, 0x000000f9, 0x000000f9 }, | ||
1817 | { 0x00009ad4, 0x000000f9, 0x000000f9 }, | ||
1818 | { 0x00009ad8, 0x000000f9, 0x000000f9 }, | ||
1819 | { 0x00009adc, 0x000000f9, 0x000000f9 }, | ||
1820 | { 0x00009ae0, 0x000000f9, 0x000000f9 }, | ||
1821 | { 0x00009ae4, 0x000000f9, 0x000000f9 }, | ||
1822 | { 0x00009ae8, 0x000000f9, 0x000000f9 }, | ||
1823 | { 0x00009aec, 0x000000f9, 0x000000f9 }, | ||
1824 | { 0x00009af0, 0x000000f9, 0x000000f9 }, | ||
1825 | { 0x00009af4, 0x000000f9, 0x000000f9 }, | ||
1826 | { 0x00009af8, 0x000000f9, 0x000000f9 }, | ||
1827 | { 0x00009afc, 0x000000f9, 0x000000f9 }, | ||
1828 | }; | ||
1829 | |||
1830 | static const u32 ar5416Bank1_9160[][2] = { | ||
1831 | { 0x000098b0, 0x02108421 }, | ||
1832 | { 0x000098ec, 0x00000008 }, | ||
1833 | }; | ||
1834 | |||
1835 | static const u32 ar5416Bank2_9160[][2] = { | ||
1836 | { 0x000098b0, 0x0e73ff17 }, | ||
1837 | { 0x000098e0, 0x00000420 }, | ||
1838 | }; | ||
1839 | |||
1840 | static const u32 ar5416Bank3_9160[][3] = { | ||
1841 | { 0x000098f0, 0x01400018, 0x01c00018 }, | ||
1842 | }; | ||
1843 | |||
1844 | static const u32 ar5416Bank6_9160[][3] = { | ||
1845 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
1846 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
1847 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
1848 | { 0x0000989c, 0x00e00000, 0x00e00000 }, | ||
1849 | { 0x0000989c, 0x005e0000, 0x005e0000 }, | ||
1850 | { 0x0000989c, 0x00120000, 0x00120000 }, | ||
1851 | { 0x0000989c, 0x00620000, 0x00620000 }, | ||
1852 | { 0x0000989c, 0x00020000, 0x00020000 }, | ||
1853 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1854 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1855 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1856 | { 0x0000989c, 0x40ff0000, 0x40ff0000 }, | ||
1857 | { 0x0000989c, 0x005f0000, 0x005f0000 }, | ||
1858 | { 0x0000989c, 0x00870000, 0x00870000 }, | ||
1859 | { 0x0000989c, 0x00f90000, 0x00f90000 }, | ||
1860 | { 0x0000989c, 0x007b0000, 0x007b0000 }, | ||
1861 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1862 | { 0x0000989c, 0x00f50000, 0x00f50000 }, | ||
1863 | { 0x0000989c, 0x00dc0000, 0x00dc0000 }, | ||
1864 | { 0x0000989c, 0x00110000, 0x00110000 }, | ||
1865 | { 0x0000989c, 0x006100a8, 0x006100a8 }, | ||
1866 | { 0x0000989c, 0x004210a2, 0x004210a2 }, | ||
1867 | { 0x0000989c, 0x0014008f, 0x0014008f }, | ||
1868 | { 0x0000989c, 0x00c40003, 0x00c40003 }, | ||
1869 | { 0x0000989c, 0x003000f2, 0x003000f2 }, | ||
1870 | { 0x0000989c, 0x00440016, 0x00440016 }, | ||
1871 | { 0x0000989c, 0x00410040, 0x00410040 }, | ||
1872 | { 0x0000989c, 0x0001805e, 0x0001805e }, | ||
1873 | { 0x0000989c, 0x0000c0ab, 0x0000c0ab }, | ||
1874 | { 0x0000989c, 0x000000f1, 0x000000f1 }, | ||
1875 | { 0x0000989c, 0x00002081, 0x00002081 }, | ||
1876 | { 0x0000989c, 0x000000d4, 0x000000d4 }, | ||
1877 | { 0x000098d0, 0x0000000f, 0x0010000f }, | ||
1878 | }; | ||
1879 | |||
1880 | static const u32 ar5416Bank6TPC_9160[][3] = { | ||
1881 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
1882 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
1883 | { 0x0000989c, 0x00000000, 0x00000000 }, | ||
1884 | { 0x0000989c, 0x00e00000, 0x00e00000 }, | ||
1885 | { 0x0000989c, 0x005e0000, 0x005e0000 }, | ||
1886 | { 0x0000989c, 0x00120000, 0x00120000 }, | ||
1887 | { 0x0000989c, 0x00620000, 0x00620000 }, | ||
1888 | { 0x0000989c, 0x00020000, 0x00020000 }, | ||
1889 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1890 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1891 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1892 | { 0x0000989c, 0x40ff0000, 0x40ff0000 }, | ||
1893 | { 0x0000989c, 0x005f0000, 0x005f0000 }, | ||
1894 | { 0x0000989c, 0x00870000, 0x00870000 }, | ||
1895 | { 0x0000989c, 0x00f90000, 0x00f90000 }, | ||
1896 | { 0x0000989c, 0x007b0000, 0x007b0000 }, | ||
1897 | { 0x0000989c, 0x00ff0000, 0x00ff0000 }, | ||
1898 | { 0x0000989c, 0x00f50000, 0x00f50000 }, | ||
1899 | { 0x0000989c, 0x00dc0000, 0x00dc0000 }, | ||
1900 | { 0x0000989c, 0x00110000, 0x00110000 }, | ||
1901 | { 0x0000989c, 0x006100a8, 0x006100a8 }, | ||
1902 | { 0x0000989c, 0x00423022, 0x00423022 }, | ||
1903 | { 0x0000989c, 0x2014008f, 0x2014008f }, | ||
1904 | { 0x0000989c, 0x00c40002, 0x00c40002 }, | ||
1905 | { 0x0000989c, 0x003000f2, 0x003000f2 }, | ||
1906 | { 0x0000989c, 0x00440016, 0x00440016 }, | ||
1907 | { 0x0000989c, 0x00410040, 0x00410040 }, | ||
1908 | { 0x0000989c, 0x0001805e, 0x0001805e }, | ||
1909 | { 0x0000989c, 0x0000c0ab, 0x0000c0ab }, | ||
1910 | { 0x0000989c, 0x000000e1, 0x000000e1 }, | ||
1911 | { 0x0000989c, 0x00007080, 0x00007080 }, | ||
1912 | { 0x0000989c, 0x000000d4, 0x000000d4 }, | ||
1913 | { 0x000098d0, 0x0000000f, 0x0010000f }, | ||
1914 | }; | ||
1915 | |||
1916 | static const u32 ar5416Bank7_9160[][2] = { | ||
1917 | { 0x0000989c, 0x00000500 }, | ||
1918 | { 0x0000989c, 0x00000800 }, | ||
1919 | { 0x000098cc, 0x0000000e }, | ||
1920 | }; | ||
1921 | |||
1922 | static u32 ar5416Addac_9160[][2] = { | ||
1923 | {0x0000989c, 0x00000000 }, | ||
1924 | {0x0000989c, 0x00000000 }, | ||
1925 | {0x0000989c, 0x00000000 }, | ||
1926 | {0x0000989c, 0x00000000 }, | ||
1927 | {0x0000989c, 0x00000000 }, | ||
1928 | {0x0000989c, 0x00000000 }, | ||
1929 | {0x0000989c, 0x000000c0 }, | ||
1930 | {0x0000989c, 0x00000018 }, | ||
1931 | {0x0000989c, 0x00000004 }, | ||
1932 | {0x0000989c, 0x00000000 }, | ||
1933 | {0x0000989c, 0x00000000 }, | ||
1934 | {0x0000989c, 0x00000000 }, | ||
1935 | {0x0000989c, 0x00000000 }, | ||
1936 | {0x0000989c, 0x00000000 }, | ||
1937 | {0x0000989c, 0x00000000 }, | ||
1938 | {0x0000989c, 0x00000000 }, | ||
1939 | {0x0000989c, 0x00000000 }, | ||
1940 | {0x0000989c, 0x00000000 }, | ||
1941 | {0x0000989c, 0x00000000 }, | ||
1942 | {0x0000989c, 0x00000000 }, | ||
1943 | {0x0000989c, 0x00000000 }, | ||
1944 | {0x0000989c, 0x000000c0 }, | ||
1945 | {0x0000989c, 0x00000019 }, | ||
1946 | {0x0000989c, 0x00000004 }, | ||
1947 | {0x0000989c, 0x00000000 }, | ||
1948 | {0x0000989c, 0x00000000 }, | ||
1949 | {0x0000989c, 0x00000000 }, | ||
1950 | {0x0000989c, 0x00000004 }, | ||
1951 | {0x0000989c, 0x00000003 }, | ||
1952 | {0x0000989c, 0x00000008 }, | ||
1953 | {0x0000989c, 0x00000000 }, | ||
1954 | {0x000098cc, 0x00000000 }, | ||
1955 | }; | ||
1956 | |||
1957 | static u32 ar5416Addac_91601_1[][2] = { | ||
1958 | {0x0000989c, 0x00000000 }, | ||
1959 | {0x0000989c, 0x00000000 }, | ||
1960 | {0x0000989c, 0x00000000 }, | ||
1961 | {0x0000989c, 0x00000000 }, | ||
1962 | {0x0000989c, 0x00000000 }, | ||
1963 | {0x0000989c, 0x00000000 }, | ||
1964 | {0x0000989c, 0x000000c0 }, | ||
1965 | {0x0000989c, 0x00000018 }, | ||
1966 | {0x0000989c, 0x00000004 }, | ||
1967 | {0x0000989c, 0x00000000 }, | ||
1968 | {0x0000989c, 0x00000000 }, | ||
1969 | {0x0000989c, 0x00000000 }, | ||
1970 | {0x0000989c, 0x00000000 }, | ||
1971 | {0x0000989c, 0x00000000 }, | ||
1972 | {0x0000989c, 0x00000000 }, | ||
1973 | {0x0000989c, 0x00000000 }, | ||
1974 | {0x0000989c, 0x00000000 }, | ||
1975 | {0x0000989c, 0x00000000 }, | ||
1976 | {0x0000989c, 0x00000000 }, | ||
1977 | {0x0000989c, 0x00000000 }, | ||
1978 | {0x0000989c, 0x00000000 }, | ||
1979 | {0x0000989c, 0x000000c0 }, | ||
1980 | {0x0000989c, 0x00000019 }, | ||
1981 | {0x0000989c, 0x00000004 }, | ||
1982 | {0x0000989c, 0x00000000 }, | ||
1983 | {0x0000989c, 0x00000000 }, | ||
1984 | {0x0000989c, 0x00000000 }, | ||
1985 | {0x0000989c, 0x00000000 }, | ||
1986 | {0x0000989c, 0x00000000 }, | ||
1987 | {0x0000989c, 0x00000000 }, | ||
1988 | {0x0000989c, 0x00000000 }, | ||
1989 | {0x000098cc, 0x00000000 }, | ||
1990 | }; | ||
1991 | |||
1992 | /* XXX 9280 1 */ | ||
1993 | static const u32 ar9280Modes_9280[][6] = { | 20 | static const u32 ar9280Modes_9280[][6] = { |
1994 | { 0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160, 0x000001e0 }, | 21 | { 0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160, 0x000001e0 }, |
1995 | { 0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c, 0x000001e0 }, | 22 | { 0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c, 0x000001e0 }, |
@@ -3441,7 +1468,7 @@ static const u32 ar9280PciePhy_clkreq_always_on_L1_9280[][2] = { | |||
3441 | }; | 1468 | }; |
3442 | 1469 | ||
3443 | /* AR9285 Revsion 10*/ | 1470 | /* AR9285 Revsion 10*/ |
3444 | static const u_int32_t ar9285Modes_9285[][6] = { | 1471 | static const u32 ar9285Modes_9285[][6] = { |
3445 | { 0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160, 0x000001e0 }, | 1472 | { 0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160, 0x000001e0 }, |
3446 | { 0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c, 0x000001e0 }, | 1473 | { 0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c, 0x000001e0 }, |
3447 | { 0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38, 0x00001180 }, | 1474 | { 0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38, 0x00001180 }, |
@@ -3763,7 +1790,7 @@ static const u_int32_t ar9285Modes_9285[][6] = { | |||
3763 | { 0x0000a358, 0x7999aa02, 0x7999aa02, 0x7999aa0e, 0x7999aa0e, 0x7999aa0e }, | 1790 | { 0x0000a358, 0x7999aa02, 0x7999aa02, 0x7999aa0e, 0x7999aa0e, 0x7999aa0e }, |
3764 | }; | 1791 | }; |
3765 | 1792 | ||
3766 | static const u_int32_t ar9285Common_9285[][2] = { | 1793 | static const u32 ar9285Common_9285[][2] = { |
3767 | { 0x0000000c, 0x00000000 }, | 1794 | { 0x0000000c, 0x00000000 }, |
3768 | { 0x00000030, 0x00020045 }, | 1795 | { 0x00000030, 0x00020045 }, |
3769 | { 0x00000034, 0x00000005 }, | 1796 | { 0x00000034, 0x00000005 }, |
@@ -4096,7 +2123,7 @@ static const u_int32_t ar9285Common_9285[][2] = { | |||
4096 | { 0x00007870, 0x10142c00 }, | 2123 | { 0x00007870, 0x10142c00 }, |
4097 | }; | 2124 | }; |
4098 | 2125 | ||
4099 | static const u_int32_t ar9285PciePhy_clkreq_always_on_L1_9285[][2] = { | 2126 | static const u32 ar9285PciePhy_clkreq_always_on_L1_9285[][2] = { |
4100 | {0x00004040, 0x9248fd00 }, | 2127 | {0x00004040, 0x9248fd00 }, |
4101 | {0x00004040, 0x24924924 }, | 2128 | {0x00004040, 0x24924924 }, |
4102 | {0x00004040, 0xa8000019 }, | 2129 | {0x00004040, 0xa8000019 }, |
@@ -4109,7 +2136,7 @@ static const u_int32_t ar9285PciePhy_clkreq_always_on_L1_9285[][2] = { | |||
4109 | {0x00004044, 0x00000000 }, | 2136 | {0x00004044, 0x00000000 }, |
4110 | }; | 2137 | }; |
4111 | 2138 | ||
4112 | static const u_int32_t ar9285PciePhy_clkreq_off_L1_9285[][2] = { | 2139 | static const u32 ar9285PciePhy_clkreq_off_L1_9285[][2] = { |
4113 | {0x00004040, 0x9248fd00 }, | 2140 | {0x00004040, 0x9248fd00 }, |
4114 | {0x00004040, 0x24924924 }, | 2141 | {0x00004040, 0x24924924 }, |
4115 | {0x00004040, 0xa8000019 }, | 2142 | {0x00004040, 0xa8000019 }, |
@@ -4123,7 +2150,7 @@ static const u_int32_t ar9285PciePhy_clkreq_off_L1_9285[][2] = { | |||
4123 | }; | 2150 | }; |
4124 | 2151 | ||
4125 | /* AR9285 v1_2 PCI Register Writes. Created: 04/13/09 */ | 2152 | /* AR9285 v1_2 PCI Register Writes. Created: 04/13/09 */ |
4126 | static const u_int32_t ar9285Modes_9285_1_2[][6] = { | 2153 | static const u32 ar9285Modes_9285_1_2[][6] = { |
4127 | /* Address 5G-HT20 5G-HT40 2G-HT40 2G-HT20 Turbo */ | 2154 | /* Address 5G-HT20 5G-HT40 2G-HT40 2G-HT20 Turbo */ |
4128 | { 0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160, 0x000001e0 }, | 2155 | { 0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160, 0x000001e0 }, |
4129 | { 0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c, 0x000001e0 }, | 2156 | { 0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c, 0x000001e0 }, |
@@ -4429,7 +2456,7 @@ static const u_int32_t ar9285Modes_9285_1_2[][6] = { | |||
4429 | { 0x0000a358, 0x7999aa02, 0x7999aa02, 0x7999aa0e, 0x7999aa0e, 0x7999aa0e }, | 2456 | { 0x0000a358, 0x7999aa02, 0x7999aa02, 0x7999aa0e, 0x7999aa0e, 0x7999aa0e }, |
4430 | }; | 2457 | }; |
4431 | 2458 | ||
4432 | static const u_int32_t ar9285Common_9285_1_2[][2] = { | 2459 | static const u32 ar9285Common_9285_1_2[][2] = { |
4433 | { 0x0000000c, 0x00000000 }, | 2460 | { 0x0000000c, 0x00000000 }, |
4434 | { 0x00000030, 0x00020045 }, | 2461 | { 0x00000030, 0x00020045 }, |
4435 | { 0x00000034, 0x00000005 }, | 2462 | { 0x00000034, 0x00000005 }, |
@@ -4748,7 +2775,7 @@ static const u_int32_t ar9285Common_9285_1_2[][2] = { | |||
4748 | { 0x00007870, 0x10142c00 }, | 2775 | { 0x00007870, 0x10142c00 }, |
4749 | }; | 2776 | }; |
4750 | 2777 | ||
4751 | static const u_int32_t ar9285Modes_high_power_tx_gain_9285_1_2[][6] = { | 2778 | static const u32 ar9285Modes_high_power_tx_gain_9285_1_2[][6] = { |
4752 | /* Address 5G-HT20 5G-HT40 2G-HT40 2G-HT20 Turbo */ | 2779 | /* Address 5G-HT20 5G-HT40 2G-HT40 2G-HT20 Turbo */ |
4753 | { 0x0000a300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | 2780 | { 0x0000a300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
4754 | { 0x0000a304, 0x00000000, 0x00000000, 0x00006200, 0x00006200, 0x00000000 }, | 2781 | { 0x0000a304, 0x00000000, 0x00000000, 0x00006200, 0x00006200, 0x00000000 }, |
@@ -4789,7 +2816,7 @@ static const u_int32_t ar9285Modes_high_power_tx_gain_9285_1_2[][6] = { | |||
4789 | { 0x0000a3e0, 0x000000e7, 0x000000e7, 0x000000e7, 0x000000e7, 0x000000e7 }, | 2816 | { 0x0000a3e0, 0x000000e7, 0x000000e7, 0x000000e7, 0x000000e7, 0x000000e7 }, |
4790 | }; | 2817 | }; |
4791 | 2818 | ||
4792 | static const u_int32_t ar9285Modes_original_tx_gain_9285_1_2[][6] = { | 2819 | static const u32 ar9285Modes_original_tx_gain_9285_1_2[][6] = { |
4793 | /* Address 5G-HT20 5G-HT40 2G-HT40 2G-HT20 Turbo */ | 2820 | /* Address 5G-HT20 5G-HT40 2G-HT40 2G-HT20 Turbo */ |
4794 | { 0x0000a300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | 2821 | { 0x0000a300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
4795 | { 0x0000a304, 0x00000000, 0x00000000, 0x00009200, 0x00009200, 0x00000000 }, | 2822 | { 0x0000a304, 0x00000000, 0x00000000, 0x00009200, 0x00009200, 0x00000000 }, |
@@ -4830,7 +2857,7 @@ static const u_int32_t ar9285Modes_original_tx_gain_9285_1_2[][6] = { | |||
4830 | { 0x0000a3e0, 0x0000039c, 0x0000039c, 0x0000039c, 0x0000039c, 0x0000039c }, | 2857 | { 0x0000a3e0, 0x0000039c, 0x0000039c, 0x0000039c, 0x0000039c, 0x0000039c }, |
4831 | }; | 2858 | }; |
4832 | 2859 | ||
4833 | static const u_int32_t ar9285Modes_XE2_0_normal_power[][6] = { | 2860 | static const u32 ar9285Modes_XE2_0_normal_power[][6] = { |
4834 | { 0x0000a300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | 2861 | { 0x0000a300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
4835 | { 0x0000a304, 0x00000000, 0x00000000, 0x00009200, 0x00009200, 0x00000000 }, | 2862 | { 0x0000a304, 0x00000000, 0x00000000, 0x00009200, 0x00009200, 0x00000000 }, |
4836 | { 0x0000a308, 0x00000000, 0x00000000, 0x00010208, 0x00010208, 0x00000000 }, | 2863 | { 0x0000a308, 0x00000000, 0x00000000, 0x00010208, 0x00010208, 0x00000000 }, |
@@ -4870,7 +2897,7 @@ static const u_int32_t ar9285Modes_XE2_0_normal_power[][6] = { | |||
4870 | { 0x0000a3e0, 0x0000039c, 0x0000039c, 0x0000039c, 0x0000039c, 0x0000039c }, | 2897 | { 0x0000a3e0, 0x0000039c, 0x0000039c, 0x0000039c, 0x0000039c, 0x0000039c }, |
4871 | }; | 2898 | }; |
4872 | 2899 | ||
4873 | static const u_int32_t ar9285Modes_XE2_0_high_power[][6] = { | 2900 | static const u32 ar9285Modes_XE2_0_high_power[][6] = { |
4874 | { 0x0000a300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | 2901 | { 0x0000a300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
4875 | { 0x0000a304, 0x00000000, 0x00000000, 0x00006200, 0x00006200, 0x00000000 }, | 2902 | { 0x0000a304, 0x00000000, 0x00000000, 0x00006200, 0x00006200, 0x00000000 }, |
4876 | { 0x0000a308, 0x00000000, 0x00000000, 0x00008201, 0x00008201, 0x00000000 }, | 2903 | { 0x0000a308, 0x00000000, 0x00000000, 0x00008201, 0x00008201, 0x00000000 }, |
@@ -4910,7 +2937,7 @@ static const u_int32_t ar9285Modes_XE2_0_high_power[][6] = { | |||
4910 | { 0x0000a3e0, 0x000000e7, 0x000000e7, 0x000000e7, 0x000000e7, 0x000000e7 }, | 2937 | { 0x0000a3e0, 0x000000e7, 0x000000e7, 0x000000e7, 0x000000e7, 0x000000e7 }, |
4911 | }; | 2938 | }; |
4912 | 2939 | ||
4913 | static const u_int32_t ar9285PciePhy_clkreq_always_on_L1_9285_1_2[][2] = { | 2940 | static const u32 ar9285PciePhy_clkreq_always_on_L1_9285_1_2[][2] = { |
4914 | {0x00004040, 0x9248fd00 }, | 2941 | {0x00004040, 0x9248fd00 }, |
4915 | {0x00004040, 0x24924924 }, | 2942 | {0x00004040, 0x24924924 }, |
4916 | {0x00004040, 0xa8000019 }, | 2943 | {0x00004040, 0xa8000019 }, |
@@ -4923,7 +2950,7 @@ static const u_int32_t ar9285PciePhy_clkreq_always_on_L1_9285_1_2[][2] = { | |||
4923 | {0x00004044, 0x00000000 }, | 2950 | {0x00004044, 0x00000000 }, |
4924 | }; | 2951 | }; |
4925 | 2952 | ||
4926 | static const u_int32_t ar9285PciePhy_clkreq_off_L1_9285_1_2[][2] = { | 2953 | static const u32 ar9285PciePhy_clkreq_off_L1_9285_1_2[][2] = { |
4927 | {0x00004040, 0x9248fd00 }, | 2954 | {0x00004040, 0x9248fd00 }, |
4928 | {0x00004040, 0x24924924 }, | 2955 | {0x00004040, 0x24924924 }, |
4929 | {0x00004040, 0xa8000019 }, | 2956 | {0x00004040, 0xa8000019 }, |
@@ -4937,7 +2964,7 @@ static const u_int32_t ar9285PciePhy_clkreq_off_L1_9285_1_2[][2] = { | |||
4937 | }; | 2964 | }; |
4938 | 2965 | ||
4939 | /* AR9287 Revision 10 */ | 2966 | /* AR9287 Revision 10 */ |
4940 | static const u_int32_t ar9287Modes_9287_1_0[][6] = { | 2967 | static const u32 ar9287Modes_9287_1_0[][6] = { |
4941 | /* Address 5G-HT20 5G-HT40 2G-HT40 2G-HT20 Turbo */ | 2968 | /* Address 5G-HT20 5G-HT40 2G-HT40 2G-HT20 Turbo */ |
4942 | { 0x00001030, 0x00000000, 0x00000000, 0x000002c0, 0x00000160, 0x000001e0 }, | 2969 | { 0x00001030, 0x00000000, 0x00000000, 0x000002c0, 0x00000160, 0x000001e0 }, |
4943 | { 0x00001070, 0x00000000, 0x00000000, 0x00000318, 0x0000018c, 0x000001e0 }, | 2970 | { 0x00001070, 0x00000000, 0x00000000, 0x00000318, 0x0000018c, 0x000001e0 }, |
@@ -4984,7 +3011,7 @@ static const u_int32_t ar9287Modes_9287_1_0[][6] = { | |||
4984 | { 0x0000a3d8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | 3011 | { 0x0000a3d8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
4985 | }; | 3012 | }; |
4986 | 3013 | ||
4987 | static const u_int32_t ar9287Common_9287_1_0[][2] = { | 3014 | static const u32 ar9287Common_9287_1_0[][2] = { |
4988 | { 0x0000000c, 0x00000000 }, | 3015 | { 0x0000000c, 0x00000000 }, |
4989 | { 0x00000030, 0x00020015 }, | 3016 | { 0x00000030, 0x00020015 }, |
4990 | { 0x00000034, 0x00000005 }, | 3017 | { 0x00000034, 0x00000005 }, |
@@ -5355,7 +3382,7 @@ static const u_int32_t ar9287Common_9287_1_0[][2] = { | |||
5355 | { 0x000078b8, 0x2a850160 }, | 3382 | { 0x000078b8, 0x2a850160 }, |
5356 | }; | 3383 | }; |
5357 | 3384 | ||
5358 | static const u_int32_t ar9287Modes_tx_gain_9287_1_0[][6] = { | 3385 | static const u32 ar9287Modes_tx_gain_9287_1_0[][6] = { |
5359 | /* Address 5G-HT20 5G-HT40 2G-HT40 2G-HT20 Turbo */ | 3386 | /* Address 5G-HT20 5G-HT40 2G-HT40 2G-HT20 Turbo */ |
5360 | { 0x0000a300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | 3387 | { 0x0000a300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
5361 | { 0x0000a304, 0x00000000, 0x00000000, 0x00004002, 0x00004002, 0x00004002 }, | 3388 | { 0x0000a304, 0x00000000, 0x00000000, 0x00004002, 0x00004002, 0x00004002 }, |
@@ -5405,7 +3432,7 @@ static const u_int32_t ar9287Modes_tx_gain_9287_1_0[][6] = { | |||
5405 | }; | 3432 | }; |
5406 | 3433 | ||
5407 | 3434 | ||
5408 | static const u_int32_t ar9287Modes_rx_gain_9287_1_0[][6] = { | 3435 | static const u32 ar9287Modes_rx_gain_9287_1_0[][6] = { |
5409 | /* Address 5G-HT20 5G-HT40 2G-HT40 2G-HT20 Turbo */ | 3436 | /* Address 5G-HT20 5G-HT40 2G-HT40 2G-HT20 Turbo */ |
5410 | { 0x00009a00, 0x00000000, 0x00000000, 0x0000a120, 0x0000a120, 0x0000a120 }, | 3437 | { 0x00009a00, 0x00000000, 0x00000000, 0x0000a120, 0x0000a120, 0x0000a120 }, |
5411 | { 0x00009a04, 0x00000000, 0x00000000, 0x0000a124, 0x0000a124, 0x0000a124 }, | 3438 | { 0x00009a04, 0x00000000, 0x00000000, 0x0000a124, 0x0000a124, 0x0000a124 }, |
@@ -5667,7 +3694,7 @@ static const u_int32_t ar9287Modes_rx_gain_9287_1_0[][6] = { | |||
5667 | { 0x0000a848, 0x00000000, 0x00000000, 0x00001067, 0x00001067, 0x00001067 }, | 3694 | { 0x0000a848, 0x00000000, 0x00000000, 0x00001067, 0x00001067, 0x00001067 }, |
5668 | }; | 3695 | }; |
5669 | 3696 | ||
5670 | static const u_int32_t ar9287PciePhy_clkreq_always_on_L1_9287_1_0[][2] = { | 3697 | static const u32 ar9287PciePhy_clkreq_always_on_L1_9287_1_0[][2] = { |
5671 | {0x00004040, 0x9248fd00 }, | 3698 | {0x00004040, 0x9248fd00 }, |
5672 | {0x00004040, 0x24924924 }, | 3699 | {0x00004040, 0x24924924 }, |
5673 | {0x00004040, 0xa8000019 }, | 3700 | {0x00004040, 0xa8000019 }, |
@@ -5680,7 +3707,7 @@ static const u_int32_t ar9287PciePhy_clkreq_always_on_L1_9287_1_0[][2] = { | |||
5680 | {0x00004044, 0x00000000 }, | 3707 | {0x00004044, 0x00000000 }, |
5681 | }; | 3708 | }; |
5682 | 3709 | ||
5683 | static const u_int32_t ar9287PciePhy_clkreq_off_L1_9287_1_0[][2] = { | 3710 | static const u32 ar9287PciePhy_clkreq_off_L1_9287_1_0[][2] = { |
5684 | {0x00004040, 0x9248fd00 }, | 3711 | {0x00004040, 0x9248fd00 }, |
5685 | {0x00004040, 0x24924924 }, | 3712 | {0x00004040, 0x24924924 }, |
5686 | {0x00004040, 0xa8000019 }, | 3713 | {0x00004040, 0xa8000019 }, |
@@ -5695,7 +3722,7 @@ static const u_int32_t ar9287PciePhy_clkreq_off_L1_9287_1_0[][2] = { | |||
5695 | 3722 | ||
5696 | /* AR9287 Revision 11 */ | 3723 | /* AR9287 Revision 11 */ |
5697 | 3724 | ||
5698 | static const u_int32_t ar9287Modes_9287_1_1[][6] = { | 3725 | static const u32 ar9287Modes_9287_1_1[][6] = { |
5699 | /* Address 5G-HT20 5G-HT40 2G-HT40 2G-HT20 Turbo */ | 3726 | /* Address 5G-HT20 5G-HT40 2G-HT40 2G-HT20 Turbo */ |
5700 | { 0x00001030, 0x00000000, 0x00000000, 0x000002c0, 0x00000160, 0x000001e0 }, | 3727 | { 0x00001030, 0x00000000, 0x00000000, 0x000002c0, 0x00000160, 0x000001e0 }, |
5701 | { 0x00001070, 0x00000000, 0x00000000, 0x00000318, 0x0000018c, 0x000001e0 }, | 3728 | { 0x00001070, 0x00000000, 0x00000000, 0x00000318, 0x0000018c, 0x000001e0 }, |
@@ -5742,7 +3769,7 @@ static const u_int32_t ar9287Modes_9287_1_1[][6] = { | |||
5742 | { 0x0000a3d8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | 3769 | { 0x0000a3d8, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
5743 | }; | 3770 | }; |
5744 | 3771 | ||
5745 | static const u_int32_t ar9287Common_9287_1_1[][2] = { | 3772 | static const u32 ar9287Common_9287_1_1[][2] = { |
5746 | { 0x0000000c, 0x00000000 }, | 3773 | { 0x0000000c, 0x00000000 }, |
5747 | { 0x00000030, 0x00020015 }, | 3774 | { 0x00000030, 0x00020015 }, |
5748 | { 0x00000034, 0x00000005 }, | 3775 | { 0x00000034, 0x00000005 }, |
@@ -6112,21 +4139,22 @@ static const u_int32_t ar9287Common_9287_1_1[][2] = { | |||
6112 | 4139 | ||
6113 | /* | 4140 | /* |
6114 | * For Japanese regulatory requirements, 2484 MHz requires the following three | 4141 | * For Japanese regulatory requirements, 2484 MHz requires the following three |
6115 | * registers be programmed differently from the channel between 2412 and 2472 MHz. | 4142 | * registers be programmed differently from the channel between 2412 and |
4143 | * 2472 MHz. | ||
6116 | */ | 4144 | */ |
6117 | static const u_int32_t ar9287Common_normal_cck_fir_coeff_92871_1[][2] = { | 4145 | static const u32 ar9287Common_normal_cck_fir_coeff_92871_1[][2] = { |
6118 | { 0x0000a1f4, 0x00fffeff }, | 4146 | { 0x0000a1f4, 0x00fffeff }, |
6119 | { 0x0000a1f8, 0x00f5f9ff }, | 4147 | { 0x0000a1f8, 0x00f5f9ff }, |
6120 | { 0x0000a1fc, 0xb79f6427 }, | 4148 | { 0x0000a1fc, 0xb79f6427 }, |
6121 | }; | 4149 | }; |
6122 | 4150 | ||
6123 | static const u_int32_t ar9287Common_japan_2484_cck_fir_coeff_92871_1[][2] = { | 4151 | static const u32 ar9287Common_japan_2484_cck_fir_coeff_92871_1[][2] = { |
6124 | { 0x0000a1f4, 0x00000000 }, | 4152 | { 0x0000a1f4, 0x00000000 }, |
6125 | { 0x0000a1f8, 0xefff0301 }, | 4153 | { 0x0000a1f8, 0xefff0301 }, |
6126 | { 0x0000a1fc, 0xca9228ee }, | 4154 | { 0x0000a1fc, 0xca9228ee }, |
6127 | }; | 4155 | }; |
6128 | 4156 | ||
6129 | static const u_int32_t ar9287Modes_tx_gain_9287_1_1[][6] = { | 4157 | static const u32 ar9287Modes_tx_gain_9287_1_1[][6] = { |
6130 | /* Address 5G-HT20 5G-HT40 2G-HT40 2G-HT20 Turbo */ | 4158 | /* Address 5G-HT20 5G-HT40 2G-HT40 2G-HT20 Turbo */ |
6131 | { 0x0000a300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | 4159 | { 0x0000a300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
6132 | { 0x0000a304, 0x00000000, 0x00000000, 0x00004002, 0x00004002, 0x00004002 }, | 4160 | { 0x0000a304, 0x00000000, 0x00000000, 0x00004002, 0x00004002, 0x00004002 }, |
@@ -6175,7 +4203,7 @@ static const u_int32_t ar9287Modes_tx_gain_9287_1_1[][6] = { | |||
6175 | { 0x0000a274, 0x0a180000, 0x0a180000, 0x0a1aa000, 0x0a1aa000, 0x0a1aa000 }, | 4203 | { 0x0000a274, 0x0a180000, 0x0a180000, 0x0a1aa000, 0x0a1aa000, 0x0a1aa000 }, |
6176 | }; | 4204 | }; |
6177 | 4205 | ||
6178 | static const u_int32_t ar9287Modes_rx_gain_9287_1_1[][6] = { | 4206 | static const u32 ar9287Modes_rx_gain_9287_1_1[][6] = { |
6179 | /* Address 5G-HT20 5G-HT40 2G-HT40 2G-HT20 Turbo */ | 4207 | /* Address 5G-HT20 5G-HT40 2G-HT40 2G-HT20 Turbo */ |
6180 | { 0x00009a00, 0x00000000, 0x00000000, 0x0000a120, 0x0000a120, 0x0000a120 }, | 4208 | { 0x00009a00, 0x00000000, 0x00000000, 0x0000a120, 0x0000a120, 0x0000a120 }, |
6181 | { 0x00009a04, 0x00000000, 0x00000000, 0x0000a124, 0x0000a124, 0x0000a124 }, | 4209 | { 0x00009a04, 0x00000000, 0x00000000, 0x0000a124, 0x0000a124, 0x0000a124 }, |
@@ -6437,7 +4465,7 @@ static const u_int32_t ar9287Modes_rx_gain_9287_1_1[][6] = { | |||
6437 | { 0x0000a848, 0x00000000, 0x00000000, 0x00001067, 0x00001067, 0x00001067 }, | 4465 | { 0x0000a848, 0x00000000, 0x00000000, 0x00001067, 0x00001067, 0x00001067 }, |
6438 | }; | 4466 | }; |
6439 | 4467 | ||
6440 | static const u_int32_t ar9287PciePhy_clkreq_always_on_L1_9287_1_1[][2] = { | 4468 | static const u32 ar9287PciePhy_clkreq_always_on_L1_9287_1_1[][2] = { |
6441 | {0x00004040, 0x9248fd00 }, | 4469 | {0x00004040, 0x9248fd00 }, |
6442 | {0x00004040, 0x24924924 }, | 4470 | {0x00004040, 0x24924924 }, |
6443 | {0x00004040, 0xa8000019 }, | 4471 | {0x00004040, 0xa8000019 }, |
@@ -6450,7 +4478,7 @@ static const u_int32_t ar9287PciePhy_clkreq_always_on_L1_9287_1_1[][2] = { | |||
6450 | {0x00004044, 0x00000000 }, | 4478 | {0x00004044, 0x00000000 }, |
6451 | }; | 4479 | }; |
6452 | 4480 | ||
6453 | static const u_int32_t ar9287PciePhy_clkreq_off_L1_9287_1_1[][2] = { | 4481 | static const u32 ar9287PciePhy_clkreq_off_L1_9287_1_1[][2] = { |
6454 | {0x00004040, 0x9248fd00 }, | 4482 | {0x00004040, 0x9248fd00 }, |
6455 | {0x00004040, 0x24924924 }, | 4483 | {0x00004040, 0x24924924 }, |
6456 | {0x00004040, 0xa8000019 }, | 4484 | {0x00004040, 0xa8000019 }, |
@@ -6465,7 +4493,7 @@ static const u_int32_t ar9287PciePhy_clkreq_off_L1_9287_1_1[][2] = { | |||
6465 | 4493 | ||
6466 | 4494 | ||
6467 | /* AR9271 initialization values automaticaly created: 06/04/09 */ | 4495 | /* AR9271 initialization values automaticaly created: 06/04/09 */ |
6468 | static const u_int32_t ar9271Modes_9271[][6] = { | 4496 | static const u32 ar9271Modes_9271[][6] = { |
6469 | { 0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160, 0x000001e0 }, | 4497 | { 0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160, 0x000001e0 }, |
6470 | { 0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c, 0x000001e0 }, | 4498 | { 0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c, 0x000001e0 }, |
6471 | { 0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38, 0x00001180 }, | 4499 | { 0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38, 0x00001180 }, |
@@ -6771,7 +4799,7 @@ static const u_int32_t ar9271Modes_9271[][6] = { | |||
6771 | { 0x0000a358, 0x7999aa02, 0x7999aa02, 0x7999aa0e, 0x7999aa0e, 0x7999aa0e }, | 4799 | { 0x0000a358, 0x7999aa02, 0x7999aa02, 0x7999aa0e, 0x7999aa0e, 0x7999aa0e }, |
6772 | }; | 4800 | }; |
6773 | 4801 | ||
6774 | static const u_int32_t ar9271Common_9271[][2] = { | 4802 | static const u32 ar9271Common_9271[][2] = { |
6775 | { 0x0000000c, 0x00000000 }, | 4803 | { 0x0000000c, 0x00000000 }, |
6776 | { 0x00000030, 0x00020045 }, | 4804 | { 0x00000030, 0x00020045 }, |
6777 | { 0x00000034, 0x00000005 }, | 4805 | { 0x00000034, 0x00000005 }, |
@@ -7099,24 +5127,24 @@ static const u_int32_t ar9271Common_9271[][2] = { | |||
7099 | { 0x0000d384, 0xf3307ff0 }, | 5127 | { 0x0000d384, 0xf3307ff0 }, |
7100 | }; | 5128 | }; |
7101 | 5129 | ||
7102 | static const u_int32_t ar9271Common_normal_cck_fir_coeff_9271[][2] = { | 5130 | static const u32 ar9271Common_normal_cck_fir_coeff_9271[][2] = { |
7103 | { 0x0000a1f4, 0x00fffeff }, | 5131 | { 0x0000a1f4, 0x00fffeff }, |
7104 | { 0x0000a1f8, 0x00f5f9ff }, | 5132 | { 0x0000a1f8, 0x00f5f9ff }, |
7105 | { 0x0000a1fc, 0xb79f6427 }, | 5133 | { 0x0000a1fc, 0xb79f6427 }, |
7106 | }; | 5134 | }; |
7107 | 5135 | ||
7108 | static const u_int32_t ar9271Common_japan_2484_cck_fir_coeff_9271[][2] = { | 5136 | static const u32 ar9271Common_japan_2484_cck_fir_coeff_9271[][2] = { |
7109 | { 0x0000a1f4, 0x00000000 }, | 5137 | { 0x0000a1f4, 0x00000000 }, |
7110 | { 0x0000a1f8, 0xefff0301 }, | 5138 | { 0x0000a1f8, 0xefff0301 }, |
7111 | { 0x0000a1fc, 0xca9228ee }, | 5139 | { 0x0000a1fc, 0xca9228ee }, |
7112 | }; | 5140 | }; |
7113 | 5141 | ||
7114 | static const u_int32_t ar9271Modes_9271_1_0_only[][6] = { | 5142 | static const u32 ar9271Modes_9271_1_0_only[][6] = { |
7115 | { 0x00009910, 0x30002311, 0x30002311, 0x30002311, 0x30002311, 0x30002311 }, | 5143 | { 0x00009910, 0x30002311, 0x30002311, 0x30002311, 0x30002311, 0x30002311 }, |
7116 | { 0x00009828, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001 }, | 5144 | { 0x00009828, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001, 0x0a020001 }, |
7117 | }; | 5145 | }; |
7118 | 5146 | ||
7119 | static const u_int32_t ar9271Modes_9271_ANI_reg[][6] = { | 5147 | static const u32 ar9271Modes_9271_ANI_reg[][6] = { |
7120 | { 0x00009850, 0x6d4000e2, 0x6d4000e2, 0x6d4000e2, 0x6d4000e2, 0x6d4000e2 }, | 5148 | { 0x00009850, 0x6d4000e2, 0x6d4000e2, 0x6d4000e2, 0x6d4000e2, 0x6d4000e2 }, |
7121 | { 0x0000985c, 0x3139605e, 0x3139605e, 0x3137605e, 0x3137605e, 0x3139605e }, | 5149 | { 0x0000985c, 0x3139605e, 0x3139605e, 0x3137605e, 0x3137605e, 0x3139605e }, |
7122 | { 0x00009858, 0x7ec84d2e, 0x7ec84d2e, 0x7ec84d2e, 0x7ec84d2e, 0x7ec84d2e }, | 5150 | { 0x00009858, 0x7ec84d2e, 0x7ec84d2e, 0x7ec84d2e, 0x7ec84d2e, 0x7ec84d2e }, |
@@ -7127,7 +5155,7 @@ static const u_int32_t ar9271Modes_9271_ANI_reg[][6] = { | |||
7127 | { 0x000099c0, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4 }, | 5155 | { 0x000099c0, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4 }, |
7128 | }; | 5156 | }; |
7129 | 5157 | ||
7130 | static const u_int32_t ar9271Modes_normal_power_tx_gain_9271[][6] = { | 5158 | static const u32 ar9271Modes_normal_power_tx_gain_9271[][6] = { |
7131 | { 0x0000a300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, | 5159 | { 0x0000a300, 0x00000000, 0x00000000, 0x00000000, 0x00000000, 0x00000000 }, |
7132 | { 0x0000a304, 0x00000000, 0x00000000, 0x00009200, 0x00009200, 0x00000000 }, | 5160 | { 0x0000a304, 0x00000000, 0x00000000, 0x00009200, 0x00009200, 0x00000000 }, |
7133 | { 0x0000a308, 0x00000000, 0x00000000, 0x00010208, 0x00010208, 0x00000000 }, | 5161 | { 0x0000a308, 0x00000000, 0x00000000, 0x00010208, 0x00010208, 0x00000000 }, |
@@ -7163,7 +5191,7 @@ static const u_int32_t ar9271Modes_normal_power_tx_gain_9271[][6] = { | |||
7163 | { 0x0000a3e0, 0x000003bd, 0x000003bd, 0x000003bd, 0x000003bd, 0x000003bd }, | 5191 | { 0x0000a3e0, 0x000003bd, 0x000003bd, 0x000003bd, 0x000003bd, 0x000003bd }, |
7164 | }; | 5192 | }; |
7165 | 5193 | ||
7166 | static const u_int32_t ar9271Modes_high_power_tx_gain_9271[][6] = { | 5194 | static const u32 ar9271Modes_high_power_tx_gain_9271[][6] = { |
7167 | { 0x0000a300, 0x00000000, 0x00000000, 0x00010000, 0x00010000, 0x00000000 }, | 5195 | { 0x0000a300, 0x00000000, 0x00000000, 0x00010000, 0x00010000, 0x00000000 }, |
7168 | { 0x0000a304, 0x00000000, 0x00000000, 0x00016200, 0x00016200, 0x00000000 }, | 5196 | { 0x0000a304, 0x00000000, 0x00000000, 0x00016200, 0x00016200, 0x00000000 }, |
7169 | { 0x0000a308, 0x00000000, 0x00000000, 0x00018201, 0x00018201, 0x00000000 }, | 5197 | { 0x0000a308, 0x00000000, 0x00000000, 0x00018201, 0x00018201, 0x00000000 }, |
@@ -7198,3 +5226,5 @@ static const u_int32_t ar9271Modes_high_power_tx_gain_9271[][6] = { | |||
7198 | { 0x0000a3dc, 0x06318c63, 0x06318c63, 0x06318c63, 0x06318c63, 0x06318c63 }, | 5226 | { 0x0000a3dc, 0x06318c63, 0x06318c63, 0x06318c63, 0x06318c63, 0x06318c63 }, |
7199 | { 0x0000a3e0, 0x00000063, 0x00000063, 0x00000063, 0x00000063, 0x00000063 }, | 5227 | { 0x0000a3e0, 0x00000063, 0x00000063, 0x00000063, 0x00000063, 0x00000063 }, |
7200 | }; | 5228 | }; |
5229 | |||
5230 | #endif /* INITVALS_9002_10_H */ | ||
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_mac.c b/drivers/net/wireless/ath/ath9k/ar9002_mac.c new file mode 100644 index 000000000000..2be20d2070c4 --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/ar9002_mac.c | |||
@@ -0,0 +1,480 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2008-2009 Atheros Communications Inc. | ||
3 | * | ||
4 | * Permission to use, copy, modify, and/or distribute this software for any | ||
5 | * purpose with or without fee is hereby granted, provided that the above | ||
6 | * copyright notice and this permission notice appear in all copies. | ||
7 | * | ||
8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
15 | */ | ||
16 | |||
17 | #include "hw.h" | ||
18 | |||
19 | #define AR_BufLen 0x00000fff | ||
20 | |||
21 | static void ar9002_hw_rx_enable(struct ath_hw *ah) | ||
22 | { | ||
23 | REG_WRITE(ah, AR_CR, AR_CR_RXE); | ||
24 | } | ||
25 | |||
26 | static void ar9002_hw_set_desc_link(void *ds, u32 ds_link) | ||
27 | { | ||
28 | ((struct ath_desc*) ds)->ds_link = ds_link; | ||
29 | } | ||
30 | |||
31 | static void ar9002_hw_get_desc_link(void *ds, u32 **ds_link) | ||
32 | { | ||
33 | *ds_link = &((struct ath_desc *)ds)->ds_link; | ||
34 | } | ||
35 | |||
36 | static bool ar9002_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked) | ||
37 | { | ||
38 | u32 isr = 0; | ||
39 | u32 mask2 = 0; | ||
40 | struct ath9k_hw_capabilities *pCap = &ah->caps; | ||
41 | u32 sync_cause = 0; | ||
42 | bool fatal_int = false; | ||
43 | struct ath_common *common = ath9k_hw_common(ah); | ||
44 | |||
45 | if (!AR_SREV_9100(ah)) { | ||
46 | if (REG_READ(ah, AR_INTR_ASYNC_CAUSE) & AR_INTR_MAC_IRQ) { | ||
47 | if ((REG_READ(ah, AR_RTC_STATUS) & AR_RTC_STATUS_M) | ||
48 | == AR_RTC_STATUS_ON) { | ||
49 | isr = REG_READ(ah, AR_ISR); | ||
50 | } | ||
51 | } | ||
52 | |||
53 | sync_cause = REG_READ(ah, AR_INTR_SYNC_CAUSE) & | ||
54 | AR_INTR_SYNC_DEFAULT; | ||
55 | |||
56 | *masked = 0; | ||
57 | |||
58 | if (!isr && !sync_cause) | ||
59 | return false; | ||
60 | } else { | ||
61 | *masked = 0; | ||
62 | isr = REG_READ(ah, AR_ISR); | ||
63 | } | ||
64 | |||
65 | if (isr) { | ||
66 | if (isr & AR_ISR_BCNMISC) { | ||
67 | u32 isr2; | ||
68 | isr2 = REG_READ(ah, AR_ISR_S2); | ||
69 | if (isr2 & AR_ISR_S2_TIM) | ||
70 | mask2 |= ATH9K_INT_TIM; | ||
71 | if (isr2 & AR_ISR_S2_DTIM) | ||
72 | mask2 |= ATH9K_INT_DTIM; | ||
73 | if (isr2 & AR_ISR_S2_DTIMSYNC) | ||
74 | mask2 |= ATH9K_INT_DTIMSYNC; | ||
75 | if (isr2 & (AR_ISR_S2_CABEND)) | ||
76 | mask2 |= ATH9K_INT_CABEND; | ||
77 | if (isr2 & AR_ISR_S2_GTT) | ||
78 | mask2 |= ATH9K_INT_GTT; | ||
79 | if (isr2 & AR_ISR_S2_CST) | ||
80 | mask2 |= ATH9K_INT_CST; | ||
81 | if (isr2 & AR_ISR_S2_TSFOOR) | ||
82 | mask2 |= ATH9K_INT_TSFOOR; | ||
83 | } | ||
84 | |||
85 | isr = REG_READ(ah, AR_ISR_RAC); | ||
86 | if (isr == 0xffffffff) { | ||
87 | *masked = 0; | ||
88 | return false; | ||
89 | } | ||
90 | |||
91 | *masked = isr & ATH9K_INT_COMMON; | ||
92 | |||
93 | if (ah->config.rx_intr_mitigation) { | ||
94 | if (isr & (AR_ISR_RXMINTR | AR_ISR_RXINTM)) | ||
95 | *masked |= ATH9K_INT_RX; | ||
96 | } | ||
97 | |||
98 | if (isr & (AR_ISR_RXOK | AR_ISR_RXERR)) | ||
99 | *masked |= ATH9K_INT_RX; | ||
100 | if (isr & | ||
101 | (AR_ISR_TXOK | AR_ISR_TXDESC | AR_ISR_TXERR | | ||
102 | AR_ISR_TXEOL)) { | ||
103 | u32 s0_s, s1_s; | ||
104 | |||
105 | *masked |= ATH9K_INT_TX; | ||
106 | |||
107 | s0_s = REG_READ(ah, AR_ISR_S0_S); | ||
108 | ah->intr_txqs |= MS(s0_s, AR_ISR_S0_QCU_TXOK); | ||
109 | ah->intr_txqs |= MS(s0_s, AR_ISR_S0_QCU_TXDESC); | ||
110 | |||
111 | s1_s = REG_READ(ah, AR_ISR_S1_S); | ||
112 | ah->intr_txqs |= MS(s1_s, AR_ISR_S1_QCU_TXERR); | ||
113 | ah->intr_txqs |= MS(s1_s, AR_ISR_S1_QCU_TXEOL); | ||
114 | } | ||
115 | |||
116 | if (isr & AR_ISR_RXORN) { | ||
117 | ath_print(common, ATH_DBG_INTERRUPT, | ||
118 | "receive FIFO overrun interrupt\n"); | ||
119 | } | ||
120 | |||
121 | if (!AR_SREV_9100(ah)) { | ||
122 | if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) { | ||
123 | u32 isr5 = REG_READ(ah, AR_ISR_S5_S); | ||
124 | if (isr5 & AR_ISR_S5_TIM_TIMER) | ||
125 | *masked |= ATH9K_INT_TIM_TIMER; | ||
126 | } | ||
127 | } | ||
128 | |||
129 | *masked |= mask2; | ||
130 | } | ||
131 | |||
132 | if (AR_SREV_9100(ah)) | ||
133 | return true; | ||
134 | |||
135 | if (isr & AR_ISR_GENTMR) { | ||
136 | u32 s5_s; | ||
137 | |||
138 | s5_s = REG_READ(ah, AR_ISR_S5_S); | ||
139 | if (isr & AR_ISR_GENTMR) { | ||
140 | ah->intr_gen_timer_trigger = | ||
141 | MS(s5_s, AR_ISR_S5_GENTIMER_TRIG); | ||
142 | |||
143 | ah->intr_gen_timer_thresh = | ||
144 | MS(s5_s, AR_ISR_S5_GENTIMER_THRESH); | ||
145 | |||
146 | if (ah->intr_gen_timer_trigger) | ||
147 | *masked |= ATH9K_INT_GENTIMER; | ||
148 | |||
149 | } | ||
150 | } | ||
151 | |||
152 | if (sync_cause) { | ||
153 | fatal_int = | ||
154 | (sync_cause & | ||
155 | (AR_INTR_SYNC_HOST1_FATAL | AR_INTR_SYNC_HOST1_PERR)) | ||
156 | ? true : false; | ||
157 | |||
158 | if (fatal_int) { | ||
159 | if (sync_cause & AR_INTR_SYNC_HOST1_FATAL) { | ||
160 | ath_print(common, ATH_DBG_ANY, | ||
161 | "received PCI FATAL interrupt\n"); | ||
162 | } | ||
163 | if (sync_cause & AR_INTR_SYNC_HOST1_PERR) { | ||
164 | ath_print(common, ATH_DBG_ANY, | ||
165 | "received PCI PERR interrupt\n"); | ||
166 | } | ||
167 | *masked |= ATH9K_INT_FATAL; | ||
168 | } | ||
169 | if (sync_cause & AR_INTR_SYNC_RADM_CPL_TIMEOUT) { | ||
170 | ath_print(common, ATH_DBG_INTERRUPT, | ||
171 | "AR_INTR_SYNC_RADM_CPL_TIMEOUT\n"); | ||
172 | REG_WRITE(ah, AR_RC, AR_RC_HOSTIF); | ||
173 | REG_WRITE(ah, AR_RC, 0); | ||
174 | *masked |= ATH9K_INT_FATAL; | ||
175 | } | ||
176 | if (sync_cause & AR_INTR_SYNC_LOCAL_TIMEOUT) { | ||
177 | ath_print(common, ATH_DBG_INTERRUPT, | ||
178 | "AR_INTR_SYNC_LOCAL_TIMEOUT\n"); | ||
179 | } | ||
180 | |||
181 | REG_WRITE(ah, AR_INTR_SYNC_CAUSE_CLR, sync_cause); | ||
182 | (void) REG_READ(ah, AR_INTR_SYNC_CAUSE_CLR); | ||
183 | } | ||
184 | |||
185 | return true; | ||
186 | } | ||
187 | |||
188 | static void ar9002_hw_fill_txdesc(struct ath_hw *ah, void *ds, u32 seglen, | ||
189 | bool is_firstseg, bool is_lastseg, | ||
190 | const void *ds0, dma_addr_t buf_addr, | ||
191 | unsigned int qcu) | ||
192 | { | ||
193 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
194 | |||
195 | ads->ds_data = buf_addr; | ||
196 | |||
197 | if (is_firstseg) { | ||
198 | ads->ds_ctl1 |= seglen | (is_lastseg ? 0 : AR_TxMore); | ||
199 | } else if (is_lastseg) { | ||
200 | ads->ds_ctl0 = 0; | ||
201 | ads->ds_ctl1 = seglen; | ||
202 | ads->ds_ctl2 = AR5416DESC_CONST(ds0)->ds_ctl2; | ||
203 | ads->ds_ctl3 = AR5416DESC_CONST(ds0)->ds_ctl3; | ||
204 | } else { | ||
205 | ads->ds_ctl0 = 0; | ||
206 | ads->ds_ctl1 = seglen | AR_TxMore; | ||
207 | ads->ds_ctl2 = 0; | ||
208 | ads->ds_ctl3 = 0; | ||
209 | } | ||
210 | ads->ds_txstatus0 = ads->ds_txstatus1 = 0; | ||
211 | ads->ds_txstatus2 = ads->ds_txstatus3 = 0; | ||
212 | ads->ds_txstatus4 = ads->ds_txstatus5 = 0; | ||
213 | ads->ds_txstatus6 = ads->ds_txstatus7 = 0; | ||
214 | ads->ds_txstatus8 = ads->ds_txstatus9 = 0; | ||
215 | } | ||
216 | |||
217 | static int ar9002_hw_proc_txdesc(struct ath_hw *ah, void *ds, | ||
218 | struct ath_tx_status *ts) | ||
219 | { | ||
220 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
221 | |||
222 | if ((ads->ds_txstatus9 & AR_TxDone) == 0) | ||
223 | return -EINPROGRESS; | ||
224 | |||
225 | ts->ts_seqnum = MS(ads->ds_txstatus9, AR_SeqNum); | ||
226 | ts->ts_tstamp = ads->AR_SendTimestamp; | ||
227 | ts->ts_status = 0; | ||
228 | ts->ts_flags = 0; | ||
229 | |||
230 | if (ads->ds_txstatus1 & AR_FrmXmitOK) | ||
231 | ts->ts_status |= ATH9K_TX_ACKED; | ||
232 | if (ads->ds_txstatus1 & AR_ExcessiveRetries) | ||
233 | ts->ts_status |= ATH9K_TXERR_XRETRY; | ||
234 | if (ads->ds_txstatus1 & AR_Filtered) | ||
235 | ts->ts_status |= ATH9K_TXERR_FILT; | ||
236 | if (ads->ds_txstatus1 & AR_FIFOUnderrun) { | ||
237 | ts->ts_status |= ATH9K_TXERR_FIFO; | ||
238 | ath9k_hw_updatetxtriglevel(ah, true); | ||
239 | } | ||
240 | if (ads->ds_txstatus9 & AR_TxOpExceeded) | ||
241 | ts->ts_status |= ATH9K_TXERR_XTXOP; | ||
242 | if (ads->ds_txstatus1 & AR_TxTimerExpired) | ||
243 | ts->ts_status |= ATH9K_TXERR_TIMER_EXPIRED; | ||
244 | |||
245 | if (ads->ds_txstatus1 & AR_DescCfgErr) | ||
246 | ts->ts_flags |= ATH9K_TX_DESC_CFG_ERR; | ||
247 | if (ads->ds_txstatus1 & AR_TxDataUnderrun) { | ||
248 | ts->ts_flags |= ATH9K_TX_DATA_UNDERRUN; | ||
249 | ath9k_hw_updatetxtriglevel(ah, true); | ||
250 | } | ||
251 | if (ads->ds_txstatus1 & AR_TxDelimUnderrun) { | ||
252 | ts->ts_flags |= ATH9K_TX_DELIM_UNDERRUN; | ||
253 | ath9k_hw_updatetxtriglevel(ah, true); | ||
254 | } | ||
255 | if (ads->ds_txstatus0 & AR_TxBaStatus) { | ||
256 | ts->ts_flags |= ATH9K_TX_BA; | ||
257 | ts->ba_low = ads->AR_BaBitmapLow; | ||
258 | ts->ba_high = ads->AR_BaBitmapHigh; | ||
259 | } | ||
260 | |||
261 | ts->ts_rateindex = MS(ads->ds_txstatus9, AR_FinalTxIdx); | ||
262 | switch (ts->ts_rateindex) { | ||
263 | case 0: | ||
264 | ts->ts_ratecode = MS(ads->ds_ctl3, AR_XmitRate0); | ||
265 | break; | ||
266 | case 1: | ||
267 | ts->ts_ratecode = MS(ads->ds_ctl3, AR_XmitRate1); | ||
268 | break; | ||
269 | case 2: | ||
270 | ts->ts_ratecode = MS(ads->ds_ctl3, AR_XmitRate2); | ||
271 | break; | ||
272 | case 3: | ||
273 | ts->ts_ratecode = MS(ads->ds_ctl3, AR_XmitRate3); | ||
274 | break; | ||
275 | } | ||
276 | |||
277 | ts->ts_rssi = MS(ads->ds_txstatus5, AR_TxRSSICombined); | ||
278 | ts->ts_rssi_ctl0 = MS(ads->ds_txstatus0, AR_TxRSSIAnt00); | ||
279 | ts->ts_rssi_ctl1 = MS(ads->ds_txstatus0, AR_TxRSSIAnt01); | ||
280 | ts->ts_rssi_ctl2 = MS(ads->ds_txstatus0, AR_TxRSSIAnt02); | ||
281 | ts->ts_rssi_ext0 = MS(ads->ds_txstatus5, AR_TxRSSIAnt10); | ||
282 | ts->ts_rssi_ext1 = MS(ads->ds_txstatus5, AR_TxRSSIAnt11); | ||
283 | ts->ts_rssi_ext2 = MS(ads->ds_txstatus5, AR_TxRSSIAnt12); | ||
284 | ts->evm0 = ads->AR_TxEVM0; | ||
285 | ts->evm1 = ads->AR_TxEVM1; | ||
286 | ts->evm2 = ads->AR_TxEVM2; | ||
287 | ts->ts_shortretry = MS(ads->ds_txstatus1, AR_RTSFailCnt); | ||
288 | ts->ts_longretry = MS(ads->ds_txstatus1, AR_DataFailCnt); | ||
289 | ts->ts_virtcol = MS(ads->ds_txstatus1, AR_VirtRetryCnt); | ||
290 | ts->ts_antenna = 0; | ||
291 | |||
292 | return 0; | ||
293 | } | ||
294 | |||
295 | static void ar9002_hw_set11n_txdesc(struct ath_hw *ah, void *ds, | ||
296 | u32 pktLen, enum ath9k_pkt_type type, | ||
297 | u32 txPower, u32 keyIx, | ||
298 | enum ath9k_key_type keyType, u32 flags) | ||
299 | { | ||
300 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
301 | |||
302 | txPower += ah->txpower_indexoffset; | ||
303 | if (txPower > 63) | ||
304 | txPower = 63; | ||
305 | |||
306 | ads->ds_ctl0 = (pktLen & AR_FrameLen) | ||
307 | | (flags & ATH9K_TXDESC_VMF ? AR_VirtMoreFrag : 0) | ||
308 | | SM(txPower, AR_XmitPower) | ||
309 | | (flags & ATH9K_TXDESC_VEOL ? AR_VEOL : 0) | ||
310 | | (flags & ATH9K_TXDESC_CLRDMASK ? AR_ClrDestMask : 0) | ||
311 | | (flags & ATH9K_TXDESC_INTREQ ? AR_TxIntrReq : 0) | ||
312 | | (keyIx != ATH9K_TXKEYIX_INVALID ? AR_DestIdxValid : 0); | ||
313 | |||
314 | ads->ds_ctl1 = | ||
315 | (keyIx != ATH9K_TXKEYIX_INVALID ? SM(keyIx, AR_DestIdx) : 0) | ||
316 | | SM(type, AR_FrameType) | ||
317 | | (flags & ATH9K_TXDESC_NOACK ? AR_NoAck : 0) | ||
318 | | (flags & ATH9K_TXDESC_EXT_ONLY ? AR_ExtOnly : 0) | ||
319 | | (flags & ATH9K_TXDESC_EXT_AND_CTL ? AR_ExtAndCtl : 0); | ||
320 | |||
321 | ads->ds_ctl6 = SM(keyType, AR_EncrType); | ||
322 | |||
323 | if (AR_SREV_9285(ah) || AR_SREV_9271(ah)) { | ||
324 | ads->ds_ctl8 = 0; | ||
325 | ads->ds_ctl9 = 0; | ||
326 | ads->ds_ctl10 = 0; | ||
327 | ads->ds_ctl11 = 0; | ||
328 | } | ||
329 | } | ||
330 | |||
331 | static void ar9002_hw_set11n_ratescenario(struct ath_hw *ah, void *ds, | ||
332 | void *lastds, | ||
333 | u32 durUpdateEn, u32 rtsctsRate, | ||
334 | u32 rtsctsDuration, | ||
335 | struct ath9k_11n_rate_series series[], | ||
336 | u32 nseries, u32 flags) | ||
337 | { | ||
338 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
339 | struct ar5416_desc *last_ads = AR5416DESC(lastds); | ||
340 | u32 ds_ctl0; | ||
341 | |||
342 | if (flags & (ATH9K_TXDESC_RTSENA | ATH9K_TXDESC_CTSENA)) { | ||
343 | ds_ctl0 = ads->ds_ctl0; | ||
344 | |||
345 | if (flags & ATH9K_TXDESC_RTSENA) { | ||
346 | ds_ctl0 &= ~AR_CTSEnable; | ||
347 | ds_ctl0 |= AR_RTSEnable; | ||
348 | } else { | ||
349 | ds_ctl0 &= ~AR_RTSEnable; | ||
350 | ds_ctl0 |= AR_CTSEnable; | ||
351 | } | ||
352 | |||
353 | ads->ds_ctl0 = ds_ctl0; | ||
354 | } else { | ||
355 | ads->ds_ctl0 = | ||
356 | (ads->ds_ctl0 & ~(AR_RTSEnable | AR_CTSEnable)); | ||
357 | } | ||
358 | |||
359 | ads->ds_ctl2 = set11nTries(series, 0) | ||
360 | | set11nTries(series, 1) | ||
361 | | set11nTries(series, 2) | ||
362 | | set11nTries(series, 3) | ||
363 | | (durUpdateEn ? AR_DurUpdateEna : 0) | ||
364 | | SM(0, AR_BurstDur); | ||
365 | |||
366 | ads->ds_ctl3 = set11nRate(series, 0) | ||
367 | | set11nRate(series, 1) | ||
368 | | set11nRate(series, 2) | ||
369 | | set11nRate(series, 3); | ||
370 | |||
371 | ads->ds_ctl4 = set11nPktDurRTSCTS(series, 0) | ||
372 | | set11nPktDurRTSCTS(series, 1); | ||
373 | |||
374 | ads->ds_ctl5 = set11nPktDurRTSCTS(series, 2) | ||
375 | | set11nPktDurRTSCTS(series, 3); | ||
376 | |||
377 | ads->ds_ctl7 = set11nRateFlags(series, 0) | ||
378 | | set11nRateFlags(series, 1) | ||
379 | | set11nRateFlags(series, 2) | ||
380 | | set11nRateFlags(series, 3) | ||
381 | | SM(rtsctsRate, AR_RTSCTSRate); | ||
382 | last_ads->ds_ctl2 = ads->ds_ctl2; | ||
383 | last_ads->ds_ctl3 = ads->ds_ctl3; | ||
384 | } | ||
385 | |||
386 | static void ar9002_hw_set11n_aggr_first(struct ath_hw *ah, void *ds, | ||
387 | u32 aggrLen) | ||
388 | { | ||
389 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
390 | |||
391 | ads->ds_ctl1 |= (AR_IsAggr | AR_MoreAggr); | ||
392 | ads->ds_ctl6 &= ~AR_AggrLen; | ||
393 | ads->ds_ctl6 |= SM(aggrLen, AR_AggrLen); | ||
394 | } | ||
395 | |||
396 | static void ar9002_hw_set11n_aggr_middle(struct ath_hw *ah, void *ds, | ||
397 | u32 numDelims) | ||
398 | { | ||
399 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
400 | unsigned int ctl6; | ||
401 | |||
402 | ads->ds_ctl1 |= (AR_IsAggr | AR_MoreAggr); | ||
403 | |||
404 | ctl6 = ads->ds_ctl6; | ||
405 | ctl6 &= ~AR_PadDelim; | ||
406 | ctl6 |= SM(numDelims, AR_PadDelim); | ||
407 | ads->ds_ctl6 = ctl6; | ||
408 | } | ||
409 | |||
410 | static void ar9002_hw_set11n_aggr_last(struct ath_hw *ah, void *ds) | ||
411 | { | ||
412 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
413 | |||
414 | ads->ds_ctl1 |= AR_IsAggr; | ||
415 | ads->ds_ctl1 &= ~AR_MoreAggr; | ||
416 | ads->ds_ctl6 &= ~AR_PadDelim; | ||
417 | } | ||
418 | |||
419 | static void ar9002_hw_clr11n_aggr(struct ath_hw *ah, void *ds) | ||
420 | { | ||
421 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
422 | |||
423 | ads->ds_ctl1 &= (~AR_IsAggr & ~AR_MoreAggr); | ||
424 | } | ||
425 | |||
426 | static void ar9002_hw_set11n_burstduration(struct ath_hw *ah, void *ds, | ||
427 | u32 burstDuration) | ||
428 | { | ||
429 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
430 | |||
431 | ads->ds_ctl2 &= ~AR_BurstDur; | ||
432 | ads->ds_ctl2 |= SM(burstDuration, AR_BurstDur); | ||
433 | } | ||
434 | |||
435 | static void ar9002_hw_set11n_virtualmorefrag(struct ath_hw *ah, void *ds, | ||
436 | u32 vmf) | ||
437 | { | ||
438 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
439 | |||
440 | if (vmf) | ||
441 | ads->ds_ctl0 |= AR_VirtMoreFrag; | ||
442 | else | ||
443 | ads->ds_ctl0 &= ~AR_VirtMoreFrag; | ||
444 | } | ||
445 | |||
446 | void ath9k_hw_setuprxdesc(struct ath_hw *ah, struct ath_desc *ds, | ||
447 | u32 size, u32 flags) | ||
448 | { | ||
449 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
450 | struct ath9k_hw_capabilities *pCap = &ah->caps; | ||
451 | |||
452 | ads->ds_ctl1 = size & AR_BufLen; | ||
453 | if (flags & ATH9K_RXDESC_INTREQ) | ||
454 | ads->ds_ctl1 |= AR_RxIntrReq; | ||
455 | |||
456 | ads->ds_rxstatus8 &= ~AR_RxDone; | ||
457 | if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) | ||
458 | memset(&(ads->u), 0, sizeof(ads->u)); | ||
459 | } | ||
460 | EXPORT_SYMBOL(ath9k_hw_setuprxdesc); | ||
461 | |||
462 | void ar9002_hw_attach_mac_ops(struct ath_hw *ah) | ||
463 | { | ||
464 | struct ath_hw_ops *ops = ath9k_hw_ops(ah); | ||
465 | |||
466 | ops->rx_enable = ar9002_hw_rx_enable; | ||
467 | ops->set_desc_link = ar9002_hw_set_desc_link; | ||
468 | ops->get_desc_link = ar9002_hw_get_desc_link; | ||
469 | ops->get_isr = ar9002_hw_get_isr; | ||
470 | ops->fill_txdesc = ar9002_hw_fill_txdesc; | ||
471 | ops->proc_txdesc = ar9002_hw_proc_txdesc; | ||
472 | ops->set11n_txdesc = ar9002_hw_set11n_txdesc; | ||
473 | ops->set11n_ratescenario = ar9002_hw_set11n_ratescenario; | ||
474 | ops->set11n_aggr_first = ar9002_hw_set11n_aggr_first; | ||
475 | ops->set11n_aggr_middle = ar9002_hw_set11n_aggr_middle; | ||
476 | ops->set11n_aggr_last = ar9002_hw_set11n_aggr_last; | ||
477 | ops->clr11n_aggr = ar9002_hw_clr11n_aggr; | ||
478 | ops->set11n_burstduration = ar9002_hw_set11n_burstduration; | ||
479 | ops->set11n_virtualmorefrag = ar9002_hw_set11n_virtualmorefrag; | ||
480 | } | ||
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_phy.c b/drivers/net/wireless/ath/ath9k/ar9002_phy.c new file mode 100644 index 000000000000..18cfe1a9781c --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/ar9002_phy.c | |||
@@ -0,0 +1,539 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2008-2010 Atheros Communications Inc. | ||
3 | * | ||
4 | * Permission to use, copy, modify, and/or distribute this software for any | ||
5 | * purpose with or without fee is hereby granted, provided that the above | ||
6 | * copyright notice and this permission notice appear in all copies. | ||
7 | * | ||
8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
15 | */ | ||
16 | |||
17 | /** | ||
18 | * DOC: Programming Atheros 802.11n analog front end radios | ||
19 | * | ||
20 | * AR5416 MAC based PCI devices and AR518 MAC based PCI-Express | ||
21 | * devices have either an external AR2133 analog front end radio for single | ||
22 | * band 2.4 GHz communication or an AR5133 analog front end radio for dual | ||
23 | * band 2.4 GHz / 5 GHz communication. | ||
24 | * | ||
25 | * All devices after the AR5416 and AR5418 family starting with the AR9280 | ||
26 | * have their analog front radios, MAC/BB and host PCIe/USB interface embedded | ||
27 | * into a single-chip and require less programming. | ||
28 | * | ||
29 | * The following single-chips exist with a respective embedded radio: | ||
30 | * | ||
31 | * AR9280 - 11n dual-band 2x2 MIMO for PCIe | ||
32 | * AR9281 - 11n single-band 1x2 MIMO for PCIe | ||
33 | * AR9285 - 11n single-band 1x1 for PCIe | ||
34 | * AR9287 - 11n single-band 2x2 MIMO for PCIe | ||
35 | * | ||
36 | * AR9220 - 11n dual-band 2x2 MIMO for PCI | ||
37 | * AR9223 - 11n single-band 2x2 MIMO for PCI | ||
38 | * | ||
39 | * AR9287 - 11n single-band 1x1 MIMO for USB | ||
40 | */ | ||
41 | |||
42 | #include "hw.h" | ||
43 | #include "ar9002_phy.h" | ||
44 | |||
45 | /** | ||
46 | * ar9002_hw_set_channel - set channel on single-chip device | ||
47 | * @ah: atheros hardware structure | ||
48 | * @chan: | ||
49 | * | ||
50 | * This is the function to change channel on single-chip devices, that is | ||
51 | * all devices after ar9280. | ||
52 | * | ||
53 | * This function takes the channel value in MHz and sets | ||
54 | * hardware channel value. Assumes writes have been enabled to analog bus. | ||
55 | * | ||
56 | * Actual Expression, | ||
57 | * | ||
58 | * For 2GHz channel, | ||
59 | * Channel Frequency = (3/4) * freq_ref * (chansel[8:0] + chanfrac[16:0]/2^17) | ||
60 | * (freq_ref = 40MHz) | ||
61 | * | ||
62 | * For 5GHz channel, | ||
63 | * Channel Frequency = (3/2) * freq_ref * (chansel[8:0] + chanfrac[16:0]/2^10) | ||
64 | * (freq_ref = 40MHz/(24>>amodeRefSel)) | ||
65 | */ | ||
66 | static int ar9002_hw_set_channel(struct ath_hw *ah, struct ath9k_channel *chan) | ||
67 | { | ||
68 | u16 bMode, fracMode, aModeRefSel = 0; | ||
69 | u32 freq, ndiv, channelSel = 0, channelFrac = 0, reg32 = 0; | ||
70 | struct chan_centers centers; | ||
71 | u32 refDivA = 24; | ||
72 | |||
73 | ath9k_hw_get_channel_centers(ah, chan, ¢ers); | ||
74 | freq = centers.synth_center; | ||
75 | |||
76 | reg32 = REG_READ(ah, AR_PHY_SYNTH_CONTROL); | ||
77 | reg32 &= 0xc0000000; | ||
78 | |||
79 | if (freq < 4800) { /* 2 GHz, fractional mode */ | ||
80 | u32 txctl; | ||
81 | int regWrites = 0; | ||
82 | |||
83 | bMode = 1; | ||
84 | fracMode = 1; | ||
85 | aModeRefSel = 0; | ||
86 | channelSel = CHANSEL_2G(freq); | ||
87 | |||
88 | if (AR_SREV_9287_11_OR_LATER(ah)) { | ||
89 | if (freq == 2484) { | ||
90 | /* Enable channel spreading for channel 14 */ | ||
91 | REG_WRITE_ARRAY(&ah->iniCckfirJapan2484, | ||
92 | 1, regWrites); | ||
93 | } else { | ||
94 | REG_WRITE_ARRAY(&ah->iniCckfirNormal, | ||
95 | 1, regWrites); | ||
96 | } | ||
97 | } else { | ||
98 | txctl = REG_READ(ah, AR_PHY_CCK_TX_CTRL); | ||
99 | if (freq == 2484) { | ||
100 | /* Enable channel spreading for channel 14 */ | ||
101 | REG_WRITE(ah, AR_PHY_CCK_TX_CTRL, | ||
102 | txctl | AR_PHY_CCK_TX_CTRL_JAPAN); | ||
103 | } else { | ||
104 | REG_WRITE(ah, AR_PHY_CCK_TX_CTRL, | ||
105 | txctl & ~AR_PHY_CCK_TX_CTRL_JAPAN); | ||
106 | } | ||
107 | } | ||
108 | } else { | ||
109 | bMode = 0; | ||
110 | fracMode = 0; | ||
111 | |||
112 | switch (ah->eep_ops->get_eeprom(ah, EEP_FRAC_N_5G)) { | ||
113 | case 0: | ||
114 | if ((freq % 20) == 0) | ||
115 | aModeRefSel = 3; | ||
116 | else if ((freq % 10) == 0) | ||
117 | aModeRefSel = 2; | ||
118 | if (aModeRefSel) | ||
119 | break; | ||
120 | case 1: | ||
121 | default: | ||
122 | aModeRefSel = 0; | ||
123 | /* | ||
124 | * Enable 2G (fractional) mode for channels | ||
125 | * which are 5MHz spaced. | ||
126 | */ | ||
127 | fracMode = 1; | ||
128 | refDivA = 1; | ||
129 | channelSel = CHANSEL_5G(freq); | ||
130 | |||
131 | /* RefDivA setting */ | ||
132 | REG_RMW_FIELD(ah, AR_AN_SYNTH9, | ||
133 | AR_AN_SYNTH9_REFDIVA, refDivA); | ||
134 | |||
135 | } | ||
136 | |||
137 | if (!fracMode) { | ||
138 | ndiv = (freq * (refDivA >> aModeRefSel)) / 60; | ||
139 | channelSel = ndiv & 0x1ff; | ||
140 | channelFrac = (ndiv & 0xfffffe00) * 2; | ||
141 | channelSel = (channelSel << 17) | channelFrac; | ||
142 | } | ||
143 | } | ||
144 | |||
145 | reg32 = reg32 | | ||
146 | (bMode << 29) | | ||
147 | (fracMode << 28) | (aModeRefSel << 26) | (channelSel); | ||
148 | |||
149 | REG_WRITE(ah, AR_PHY_SYNTH_CONTROL, reg32); | ||
150 | |||
151 | ah->curchan = chan; | ||
152 | ah->curchan_rad_index = -1; | ||
153 | |||
154 | return 0; | ||
155 | } | ||
156 | |||
157 | /** | ||
158 | * ar9002_hw_spur_mitigate - convert baseband spur frequency | ||
159 | * @ah: atheros hardware structure | ||
160 | * @chan: | ||
161 | * | ||
162 | * For single-chip solutions. Converts to baseband spur frequency given the | ||
163 | * input channel frequency and compute register settings below. | ||
164 | */ | ||
165 | static void ar9002_hw_spur_mitigate(struct ath_hw *ah, | ||
166 | struct ath9k_channel *chan) | ||
167 | { | ||
168 | int bb_spur = AR_NO_SPUR; | ||
169 | int freq; | ||
170 | int bin, cur_bin; | ||
171 | int bb_spur_off, spur_subchannel_sd; | ||
172 | int spur_freq_sd; | ||
173 | int spur_delta_phase; | ||
174 | int denominator; | ||
175 | int upper, lower, cur_vit_mask; | ||
176 | int tmp, newVal; | ||
177 | int i; | ||
178 | int pilot_mask_reg[4] = { AR_PHY_TIMING7, AR_PHY_TIMING8, | ||
179 | AR_PHY_PILOT_MASK_01_30, AR_PHY_PILOT_MASK_31_60 | ||
180 | }; | ||
181 | int chan_mask_reg[4] = { AR_PHY_TIMING9, AR_PHY_TIMING10, | ||
182 | AR_PHY_CHANNEL_MASK_01_30, AR_PHY_CHANNEL_MASK_31_60 | ||
183 | }; | ||
184 | int inc[4] = { 0, 100, 0, 0 }; | ||
185 | struct chan_centers centers; | ||
186 | |||
187 | int8_t mask_m[123]; | ||
188 | int8_t mask_p[123]; | ||
189 | int8_t mask_amt; | ||
190 | int tmp_mask; | ||
191 | int cur_bb_spur; | ||
192 | bool is2GHz = IS_CHAN_2GHZ(chan); | ||
193 | |||
194 | memset(&mask_m, 0, sizeof(int8_t) * 123); | ||
195 | memset(&mask_p, 0, sizeof(int8_t) * 123); | ||
196 | |||
197 | ath9k_hw_get_channel_centers(ah, chan, ¢ers); | ||
198 | freq = centers.synth_center; | ||
199 | |||
200 | ah->config.spurmode = SPUR_ENABLE_EEPROM; | ||
201 | for (i = 0; i < AR_EEPROM_MODAL_SPURS; i++) { | ||
202 | cur_bb_spur = ah->eep_ops->get_spur_channel(ah, i, is2GHz); | ||
203 | |||
204 | if (is2GHz) | ||
205 | cur_bb_spur = (cur_bb_spur / 10) + AR_BASE_FREQ_2GHZ; | ||
206 | else | ||
207 | cur_bb_spur = (cur_bb_spur / 10) + AR_BASE_FREQ_5GHZ; | ||
208 | |||
209 | if (AR_NO_SPUR == cur_bb_spur) | ||
210 | break; | ||
211 | cur_bb_spur = cur_bb_spur - freq; | ||
212 | |||
213 | if (IS_CHAN_HT40(chan)) { | ||
214 | if ((cur_bb_spur > -AR_SPUR_FEEQ_BOUND_HT40) && | ||
215 | (cur_bb_spur < AR_SPUR_FEEQ_BOUND_HT40)) { | ||
216 | bb_spur = cur_bb_spur; | ||
217 | break; | ||
218 | } | ||
219 | } else if ((cur_bb_spur > -AR_SPUR_FEEQ_BOUND_HT20) && | ||
220 | (cur_bb_spur < AR_SPUR_FEEQ_BOUND_HT20)) { | ||
221 | bb_spur = cur_bb_spur; | ||
222 | break; | ||
223 | } | ||
224 | } | ||
225 | |||
226 | if (AR_NO_SPUR == bb_spur) { | ||
227 | REG_CLR_BIT(ah, AR_PHY_FORCE_CLKEN_CCK, | ||
228 | AR_PHY_FORCE_CLKEN_CCK_MRC_MUX); | ||
229 | return; | ||
230 | } else { | ||
231 | REG_CLR_BIT(ah, AR_PHY_FORCE_CLKEN_CCK, | ||
232 | AR_PHY_FORCE_CLKEN_CCK_MRC_MUX); | ||
233 | } | ||
234 | |||
235 | bin = bb_spur * 320; | ||
236 | |||
237 | tmp = REG_READ(ah, AR_PHY_TIMING_CTRL4(0)); | ||
238 | |||
239 | ENABLE_REGWRITE_BUFFER(ah); | ||
240 | |||
241 | newVal = tmp | (AR_PHY_TIMING_CTRL4_ENABLE_SPUR_RSSI | | ||
242 | AR_PHY_TIMING_CTRL4_ENABLE_SPUR_FILTER | | ||
243 | AR_PHY_TIMING_CTRL4_ENABLE_CHAN_MASK | | ||
244 | AR_PHY_TIMING_CTRL4_ENABLE_PILOT_MASK); | ||
245 | REG_WRITE(ah, AR_PHY_TIMING_CTRL4(0), newVal); | ||
246 | |||
247 | newVal = (AR_PHY_SPUR_REG_MASK_RATE_CNTL | | ||
248 | AR_PHY_SPUR_REG_ENABLE_MASK_PPM | | ||
249 | AR_PHY_SPUR_REG_MASK_RATE_SELECT | | ||
250 | AR_PHY_SPUR_REG_ENABLE_VIT_SPUR_RSSI | | ||
251 | SM(SPUR_RSSI_THRESH, AR_PHY_SPUR_REG_SPUR_RSSI_THRESH)); | ||
252 | REG_WRITE(ah, AR_PHY_SPUR_REG, newVal); | ||
253 | |||
254 | if (IS_CHAN_HT40(chan)) { | ||
255 | if (bb_spur < 0) { | ||
256 | spur_subchannel_sd = 1; | ||
257 | bb_spur_off = bb_spur + 10; | ||
258 | } else { | ||
259 | spur_subchannel_sd = 0; | ||
260 | bb_spur_off = bb_spur - 10; | ||
261 | } | ||
262 | } else { | ||
263 | spur_subchannel_sd = 0; | ||
264 | bb_spur_off = bb_spur; | ||
265 | } | ||
266 | |||
267 | if (IS_CHAN_HT40(chan)) | ||
268 | spur_delta_phase = | ||
269 | ((bb_spur * 262144) / | ||
270 | 10) & AR_PHY_TIMING11_SPUR_DELTA_PHASE; | ||
271 | else | ||
272 | spur_delta_phase = | ||
273 | ((bb_spur * 524288) / | ||
274 | 10) & AR_PHY_TIMING11_SPUR_DELTA_PHASE; | ||
275 | |||
276 | denominator = IS_CHAN_2GHZ(chan) ? 44 : 40; | ||
277 | spur_freq_sd = ((bb_spur_off * 2048) / denominator) & 0x3ff; | ||
278 | |||
279 | newVal = (AR_PHY_TIMING11_USE_SPUR_IN_AGC | | ||
280 | SM(spur_freq_sd, AR_PHY_TIMING11_SPUR_FREQ_SD) | | ||
281 | SM(spur_delta_phase, AR_PHY_TIMING11_SPUR_DELTA_PHASE)); | ||
282 | REG_WRITE(ah, AR_PHY_TIMING11, newVal); | ||
283 | |||
284 | newVal = spur_subchannel_sd << AR_PHY_SFCORR_SPUR_SUBCHNL_SD_S; | ||
285 | REG_WRITE(ah, AR_PHY_SFCORR_EXT, newVal); | ||
286 | |||
287 | cur_bin = -6000; | ||
288 | upper = bin + 100; | ||
289 | lower = bin - 100; | ||
290 | |||
291 | for (i = 0; i < 4; i++) { | ||
292 | int pilot_mask = 0; | ||
293 | int chan_mask = 0; | ||
294 | int bp = 0; | ||
295 | for (bp = 0; bp < 30; bp++) { | ||
296 | if ((cur_bin > lower) && (cur_bin < upper)) { | ||
297 | pilot_mask = pilot_mask | 0x1 << bp; | ||
298 | chan_mask = chan_mask | 0x1 << bp; | ||
299 | } | ||
300 | cur_bin += 100; | ||
301 | } | ||
302 | cur_bin += inc[i]; | ||
303 | REG_WRITE(ah, pilot_mask_reg[i], pilot_mask); | ||
304 | REG_WRITE(ah, chan_mask_reg[i], chan_mask); | ||
305 | } | ||
306 | |||
307 | cur_vit_mask = 6100; | ||
308 | upper = bin + 120; | ||
309 | lower = bin - 120; | ||
310 | |||
311 | for (i = 0; i < 123; i++) { | ||
312 | if ((cur_vit_mask > lower) && (cur_vit_mask < upper)) { | ||
313 | |||
314 | /* workaround for gcc bug #37014 */ | ||
315 | volatile int tmp_v = abs(cur_vit_mask - bin); | ||
316 | |||
317 | if (tmp_v < 75) | ||
318 | mask_amt = 1; | ||
319 | else | ||
320 | mask_amt = 0; | ||
321 | if (cur_vit_mask < 0) | ||
322 | mask_m[abs(cur_vit_mask / 100)] = mask_amt; | ||
323 | else | ||
324 | mask_p[cur_vit_mask / 100] = mask_amt; | ||
325 | } | ||
326 | cur_vit_mask -= 100; | ||
327 | } | ||
328 | |||
329 | tmp_mask = (mask_m[46] << 30) | (mask_m[47] << 28) | ||
330 | | (mask_m[48] << 26) | (mask_m[49] << 24) | ||
331 | | (mask_m[50] << 22) | (mask_m[51] << 20) | ||
332 | | (mask_m[52] << 18) | (mask_m[53] << 16) | ||
333 | | (mask_m[54] << 14) | (mask_m[55] << 12) | ||
334 | | (mask_m[56] << 10) | (mask_m[57] << 8) | ||
335 | | (mask_m[58] << 6) | (mask_m[59] << 4) | ||
336 | | (mask_m[60] << 2) | (mask_m[61] << 0); | ||
337 | REG_WRITE(ah, AR_PHY_BIN_MASK_1, tmp_mask); | ||
338 | REG_WRITE(ah, AR_PHY_VIT_MASK2_M_46_61, tmp_mask); | ||
339 | |||
340 | tmp_mask = (mask_m[31] << 28) | ||
341 | | (mask_m[32] << 26) | (mask_m[33] << 24) | ||
342 | | (mask_m[34] << 22) | (mask_m[35] << 20) | ||
343 | | (mask_m[36] << 18) | (mask_m[37] << 16) | ||
344 | | (mask_m[48] << 14) | (mask_m[39] << 12) | ||
345 | | (mask_m[40] << 10) | (mask_m[41] << 8) | ||
346 | | (mask_m[42] << 6) | (mask_m[43] << 4) | ||
347 | | (mask_m[44] << 2) | (mask_m[45] << 0); | ||
348 | REG_WRITE(ah, AR_PHY_BIN_MASK_2, tmp_mask); | ||
349 | REG_WRITE(ah, AR_PHY_MASK2_M_31_45, tmp_mask); | ||
350 | |||
351 | tmp_mask = (mask_m[16] << 30) | (mask_m[16] << 28) | ||
352 | | (mask_m[18] << 26) | (mask_m[18] << 24) | ||
353 | | (mask_m[20] << 22) | (mask_m[20] << 20) | ||
354 | | (mask_m[22] << 18) | (mask_m[22] << 16) | ||
355 | | (mask_m[24] << 14) | (mask_m[24] << 12) | ||
356 | | (mask_m[25] << 10) | (mask_m[26] << 8) | ||
357 | | (mask_m[27] << 6) | (mask_m[28] << 4) | ||
358 | | (mask_m[29] << 2) | (mask_m[30] << 0); | ||
359 | REG_WRITE(ah, AR_PHY_BIN_MASK_3, tmp_mask); | ||
360 | REG_WRITE(ah, AR_PHY_MASK2_M_16_30, tmp_mask); | ||
361 | |||
362 | tmp_mask = (mask_m[0] << 30) | (mask_m[1] << 28) | ||
363 | | (mask_m[2] << 26) | (mask_m[3] << 24) | ||
364 | | (mask_m[4] << 22) | (mask_m[5] << 20) | ||
365 | | (mask_m[6] << 18) | (mask_m[7] << 16) | ||
366 | | (mask_m[8] << 14) | (mask_m[9] << 12) | ||
367 | | (mask_m[10] << 10) | (mask_m[11] << 8) | ||
368 | | (mask_m[12] << 6) | (mask_m[13] << 4) | ||
369 | | (mask_m[14] << 2) | (mask_m[15] << 0); | ||
370 | REG_WRITE(ah, AR_PHY_MASK_CTL, tmp_mask); | ||
371 | REG_WRITE(ah, AR_PHY_MASK2_M_00_15, tmp_mask); | ||
372 | |||
373 | tmp_mask = (mask_p[15] << 28) | ||
374 | | (mask_p[14] << 26) | (mask_p[13] << 24) | ||
375 | | (mask_p[12] << 22) | (mask_p[11] << 20) | ||
376 | | (mask_p[10] << 18) | (mask_p[9] << 16) | ||
377 | | (mask_p[8] << 14) | (mask_p[7] << 12) | ||
378 | | (mask_p[6] << 10) | (mask_p[5] << 8) | ||
379 | | (mask_p[4] << 6) | (mask_p[3] << 4) | ||
380 | | (mask_p[2] << 2) | (mask_p[1] << 0); | ||
381 | REG_WRITE(ah, AR_PHY_BIN_MASK2_1, tmp_mask); | ||
382 | REG_WRITE(ah, AR_PHY_MASK2_P_15_01, tmp_mask); | ||
383 | |||
384 | tmp_mask = (mask_p[30] << 28) | ||
385 | | (mask_p[29] << 26) | (mask_p[28] << 24) | ||
386 | | (mask_p[27] << 22) | (mask_p[26] << 20) | ||
387 | | (mask_p[25] << 18) | (mask_p[24] << 16) | ||
388 | | (mask_p[23] << 14) | (mask_p[22] << 12) | ||
389 | | (mask_p[21] << 10) | (mask_p[20] << 8) | ||
390 | | (mask_p[19] << 6) | (mask_p[18] << 4) | ||
391 | | (mask_p[17] << 2) | (mask_p[16] << 0); | ||
392 | REG_WRITE(ah, AR_PHY_BIN_MASK2_2, tmp_mask); | ||
393 | REG_WRITE(ah, AR_PHY_MASK2_P_30_16, tmp_mask); | ||
394 | |||
395 | tmp_mask = (mask_p[45] << 28) | ||
396 | | (mask_p[44] << 26) | (mask_p[43] << 24) | ||
397 | | (mask_p[42] << 22) | (mask_p[41] << 20) | ||
398 | | (mask_p[40] << 18) | (mask_p[39] << 16) | ||
399 | | (mask_p[38] << 14) | (mask_p[37] << 12) | ||
400 | | (mask_p[36] << 10) | (mask_p[35] << 8) | ||
401 | | (mask_p[34] << 6) | (mask_p[33] << 4) | ||
402 | | (mask_p[32] << 2) | (mask_p[31] << 0); | ||
403 | REG_WRITE(ah, AR_PHY_BIN_MASK2_3, tmp_mask); | ||
404 | REG_WRITE(ah, AR_PHY_MASK2_P_45_31, tmp_mask); | ||
405 | |||
406 | tmp_mask = (mask_p[61] << 30) | (mask_p[60] << 28) | ||
407 | | (mask_p[59] << 26) | (mask_p[58] << 24) | ||
408 | | (mask_p[57] << 22) | (mask_p[56] << 20) | ||
409 | | (mask_p[55] << 18) | (mask_p[54] << 16) | ||
410 | | (mask_p[53] << 14) | (mask_p[52] << 12) | ||
411 | | (mask_p[51] << 10) | (mask_p[50] << 8) | ||
412 | | (mask_p[49] << 6) | (mask_p[48] << 4) | ||
413 | | (mask_p[47] << 2) | (mask_p[46] << 0); | ||
414 | REG_WRITE(ah, AR_PHY_BIN_MASK2_4, 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); | ||
419 | } | ||
420 | |||
421 | static void ar9002_olc_init(struct ath_hw *ah) | ||
422 | { | ||
423 | u32 i; | ||
424 | |||
425 | if (!OLC_FOR_AR9280_20_LATER) | ||
426 | return; | ||
427 | |||
428 | if (OLC_FOR_AR9287_10_LATER) { | ||
429 | REG_SET_BIT(ah, AR_PHY_TX_PWRCTRL9, | ||
430 | AR_PHY_TX_PWRCTRL9_RES_DC_REMOVAL); | ||
431 | ath9k_hw_analog_shift_rmw(ah, AR9287_AN_TXPC0, | ||
432 | AR9287_AN_TXPC0_TXPCMODE, | ||
433 | AR9287_AN_TXPC0_TXPCMODE_S, | ||
434 | AR9287_AN_TXPC0_TXPCMODE_TEMPSENSE); | ||
435 | udelay(100); | ||
436 | } else { | ||
437 | for (i = 0; i < AR9280_TX_GAIN_TABLE_SIZE; i++) | ||
438 | ah->originalGain[i] = | ||
439 | MS(REG_READ(ah, AR_PHY_TX_GAIN_TBL1 + i * 4), | ||
440 | AR_PHY_TX_GAIN); | ||
441 | ah->PDADCdelta = 0; | ||
442 | } | ||
443 | } | ||
444 | |||
445 | static u32 ar9002_hw_compute_pll_control(struct ath_hw *ah, | ||
446 | struct ath9k_channel *chan) | ||
447 | { | ||
448 | u32 pll; | ||
449 | |||
450 | pll = SM(0x5, AR_RTC_9160_PLL_REFDIV); | ||
451 | |||
452 | if (chan && IS_CHAN_HALF_RATE(chan)) | ||
453 | pll |= SM(0x1, AR_RTC_9160_PLL_CLKSEL); | ||
454 | else if (chan && IS_CHAN_QUARTER_RATE(chan)) | ||
455 | pll |= SM(0x2, AR_RTC_9160_PLL_CLKSEL); | ||
456 | |||
457 | if (chan && IS_CHAN_5GHZ(chan)) { | ||
458 | pll |= SM(0x28, AR_RTC_9160_PLL_DIV); | ||
459 | |||
460 | |||
461 | if (AR_SREV_9280_20(ah)) { | ||
462 | if (((chan->channel % 20) == 0) | ||
463 | || ((chan->channel % 10) == 0)) | ||
464 | pll = 0x2850; | ||
465 | else | ||
466 | pll = 0x142c; | ||
467 | } | ||
468 | } else { | ||
469 | pll |= SM(0x2c, AR_RTC_9160_PLL_DIV); | ||
470 | } | ||
471 | |||
472 | return pll; | ||
473 | } | ||
474 | |||
475 | static void ar9002_hw_do_getnf(struct ath_hw *ah, | ||
476 | int16_t nfarray[NUM_NF_READINGS]) | ||
477 | { | ||
478 | struct ath_common *common = ath9k_hw_common(ah); | ||
479 | int16_t nf; | ||
480 | |||
481 | nf = MS(REG_READ(ah, AR_PHY_CCA), AR9280_PHY_MINCCA_PWR); | ||
482 | |||
483 | if (nf & 0x100) | ||
484 | nf = 0 - ((nf ^ 0x1ff) + 1); | ||
485 | ath_print(common, ATH_DBG_CALIBRATE, | ||
486 | "NF calibrated [ctl] [chain 0] is %d\n", nf); | ||
487 | |||
488 | if (AR_SREV_9271(ah) && (nf >= -114)) | ||
489 | nf = -116; | ||
490 | |||
491 | nfarray[0] = nf; | ||
492 | |||
493 | if (!AR_SREV_9285(ah) && !AR_SREV_9271(ah)) { | ||
494 | nf = MS(REG_READ(ah, AR_PHY_CH1_CCA), | ||
495 | AR9280_PHY_CH1_MINCCA_PWR); | ||
496 | |||
497 | if (nf & 0x100) | ||
498 | nf = 0 - ((nf ^ 0x1ff) + 1); | ||
499 | ath_print(common, ATH_DBG_CALIBRATE, | ||
500 | "NF calibrated [ctl] [chain 1] is %d\n", nf); | ||
501 | nfarray[1] = nf; | ||
502 | } | ||
503 | |||
504 | nf = MS(REG_READ(ah, AR_PHY_EXT_CCA), AR9280_PHY_EXT_MINCCA_PWR); | ||
505 | if (nf & 0x100) | ||
506 | nf = 0 - ((nf ^ 0x1ff) + 1); | ||
507 | ath_print(common, ATH_DBG_CALIBRATE, | ||
508 | "NF calibrated [ext] [chain 0] is %d\n", nf); | ||
509 | |||
510 | if (AR_SREV_9271(ah) && (nf >= -114)) | ||
511 | nf = -116; | ||
512 | |||
513 | nfarray[3] = nf; | ||
514 | |||
515 | if (!AR_SREV_9285(ah) && !AR_SREV_9271(ah)) { | ||
516 | nf = MS(REG_READ(ah, AR_PHY_CH1_EXT_CCA), | ||
517 | AR9280_PHY_CH1_EXT_MINCCA_PWR); | ||
518 | |||
519 | if (nf & 0x100) | ||
520 | nf = 0 - ((nf ^ 0x1ff) + 1); | ||
521 | ath_print(common, ATH_DBG_CALIBRATE, | ||
522 | "NF calibrated [ext] [chain 1] is %d\n", nf); | ||
523 | nfarray[4] = nf; | ||
524 | } | ||
525 | } | ||
526 | |||
527 | void ar9002_hw_attach_phy_ops(struct ath_hw *ah) | ||
528 | { | ||
529 | struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); | ||
530 | |||
531 | priv_ops->set_rf_regs = NULL; | ||
532 | priv_ops->rf_alloc_ext_banks = NULL; | ||
533 | priv_ops->rf_free_ext_banks = NULL; | ||
534 | priv_ops->rf_set_freq = ar9002_hw_set_channel; | ||
535 | priv_ops->spur_mitigate_freq = ar9002_hw_spur_mitigate; | ||
536 | priv_ops->olc_init = ar9002_olc_init; | ||
537 | priv_ops->compute_pll_control = ar9002_hw_compute_pll_control; | ||
538 | priv_ops->do_getnf = ar9002_hw_do_getnf; | ||
539 | } | ||
diff --git a/drivers/net/wireless/ath/ath9k/ar9002_phy.h b/drivers/net/wireless/ath/ath9k/ar9002_phy.h new file mode 100644 index 000000000000..81bf6e5840e1 --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/ar9002_phy.h | |||
@@ -0,0 +1,572 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2008-2010 Atheros Communications Inc. | ||
3 | * | ||
4 | * Permission to use, copy, modify, and/or distribute this software for any | ||
5 | * purpose with or without fee is hereby granted, provided that the above | ||
6 | * copyright notice and this permission notice appear in all copies. | ||
7 | * | ||
8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
15 | */ | ||
16 | #ifndef AR9002_PHY_H | ||
17 | #define AR9002_PHY_H | ||
18 | |||
19 | #define AR_PHY_TEST 0x9800 | ||
20 | #define PHY_AGC_CLR 0x10000000 | ||
21 | #define RFSILENT_BB 0x00002000 | ||
22 | |||
23 | #define AR_PHY_TURBO 0x9804 | ||
24 | #define AR_PHY_FC_TURBO_MODE 0x00000001 | ||
25 | #define AR_PHY_FC_TURBO_SHORT 0x00000002 | ||
26 | #define AR_PHY_FC_DYN2040_EN 0x00000004 | ||
27 | #define AR_PHY_FC_DYN2040_PRI_ONLY 0x00000008 | ||
28 | #define AR_PHY_FC_DYN2040_PRI_CH 0x00000010 | ||
29 | /* For 25 MHz channel spacing -- not used but supported by hw */ | ||
30 | #define AR_PHY_FC_DYN2040_EXT_CH 0x00000020 | ||
31 | #define AR_PHY_FC_HT_EN 0x00000040 | ||
32 | #define AR_PHY_FC_SHORT_GI_40 0x00000080 | ||
33 | #define AR_PHY_FC_WALSH 0x00000100 | ||
34 | #define AR_PHY_FC_SINGLE_HT_LTF1 0x00000200 | ||
35 | #define AR_PHY_FC_ENABLE_DAC_FIFO 0x00000800 | ||
36 | |||
37 | #define AR_PHY_TEST2 0x9808 | ||
38 | |||
39 | #define AR_PHY_TIMING2 0x9810 | ||
40 | #define AR_PHY_TIMING3 0x9814 | ||
41 | #define AR_PHY_TIMING3_DSC_MAN 0xFFFE0000 | ||
42 | #define AR_PHY_TIMING3_DSC_MAN_S 17 | ||
43 | #define AR_PHY_TIMING3_DSC_EXP 0x0001E000 | ||
44 | #define AR_PHY_TIMING3_DSC_EXP_S 13 | ||
45 | |||
46 | #define AR_PHY_CHIP_ID_REV_0 0x80 | ||
47 | #define AR_PHY_CHIP_ID_REV_1 0x81 | ||
48 | #define AR_PHY_CHIP_ID_9160_REV_0 0xb0 | ||
49 | |||
50 | #define AR_PHY_ACTIVE 0x981C | ||
51 | #define AR_PHY_ACTIVE_EN 0x00000001 | ||
52 | #define AR_PHY_ACTIVE_DIS 0x00000000 | ||
53 | |||
54 | #define AR_PHY_RF_CTL2 0x9824 | ||
55 | #define AR_PHY_TX_END_DATA_START 0x000000FF | ||
56 | #define AR_PHY_TX_END_DATA_START_S 0 | ||
57 | #define AR_PHY_TX_END_PA_ON 0x0000FF00 | ||
58 | #define AR_PHY_TX_END_PA_ON_S 8 | ||
59 | |||
60 | #define AR_PHY_RF_CTL3 0x9828 | ||
61 | #define AR_PHY_TX_END_TO_A2_RX_ON 0x00FF0000 | ||
62 | #define AR_PHY_TX_END_TO_A2_RX_ON_S 16 | ||
63 | |||
64 | #define AR_PHY_ADC_CTL 0x982C | ||
65 | #define AR_PHY_ADC_CTL_OFF_INBUFGAIN 0x00000003 | ||
66 | #define AR_PHY_ADC_CTL_OFF_INBUFGAIN_S 0 | ||
67 | #define AR_PHY_ADC_CTL_OFF_PWDDAC 0x00002000 | ||
68 | #define AR_PHY_ADC_CTL_OFF_PWDBANDGAP 0x00004000 | ||
69 | #define AR_PHY_ADC_CTL_OFF_PWDADC 0x00008000 | ||
70 | #define AR_PHY_ADC_CTL_ON_INBUFGAIN 0x00030000 | ||
71 | #define AR_PHY_ADC_CTL_ON_INBUFGAIN_S 16 | ||
72 | |||
73 | #define AR_PHY_ADC_SERIAL_CTL 0x9830 | ||
74 | #define AR_PHY_SEL_INTERNAL_ADDAC 0x00000000 | ||
75 | #define AR_PHY_SEL_EXTERNAL_RADIO 0x00000001 | ||
76 | |||
77 | #define AR_PHY_RF_CTL4 0x9834 | ||
78 | #define AR_PHY_RF_CTL4_TX_END_XPAB_OFF 0xFF000000 | ||
79 | #define AR_PHY_RF_CTL4_TX_END_XPAB_OFF_S 24 | ||
80 | #define AR_PHY_RF_CTL4_TX_END_XPAA_OFF 0x00FF0000 | ||
81 | #define AR_PHY_RF_CTL4_TX_END_XPAA_OFF_S 16 | ||
82 | #define AR_PHY_RF_CTL4_FRAME_XPAB_ON 0x0000FF00 | ||
83 | #define AR_PHY_RF_CTL4_FRAME_XPAB_ON_S 8 | ||
84 | #define AR_PHY_RF_CTL4_FRAME_XPAA_ON 0x000000FF | ||
85 | #define AR_PHY_RF_CTL4_FRAME_XPAA_ON_S 0 | ||
86 | |||
87 | #define AR_PHY_TSTDAC_CONST 0x983c | ||
88 | |||
89 | #define AR_PHY_SETTLING 0x9844 | ||
90 | #define AR_PHY_SETTLING_SWITCH 0x00003F80 | ||
91 | #define AR_PHY_SETTLING_SWITCH_S 7 | ||
92 | |||
93 | #define AR_PHY_RXGAIN 0x9848 | ||
94 | #define AR_PHY_RXGAIN_TXRX_ATTEN 0x0003F000 | ||
95 | #define AR_PHY_RXGAIN_TXRX_ATTEN_S 12 | ||
96 | #define AR_PHY_RXGAIN_TXRX_RF_MAX 0x007C0000 | ||
97 | #define AR_PHY_RXGAIN_TXRX_RF_MAX_S 18 | ||
98 | #define AR9280_PHY_RXGAIN_TXRX_ATTEN 0x00003F80 | ||
99 | #define AR9280_PHY_RXGAIN_TXRX_ATTEN_S 7 | ||
100 | #define AR9280_PHY_RXGAIN_TXRX_MARGIN 0x001FC000 | ||
101 | #define AR9280_PHY_RXGAIN_TXRX_MARGIN_S 14 | ||
102 | |||
103 | #define AR_PHY_DESIRED_SZ 0x9850 | ||
104 | #define AR_PHY_DESIRED_SZ_ADC 0x000000FF | ||
105 | #define AR_PHY_DESIRED_SZ_ADC_S 0 | ||
106 | #define AR_PHY_DESIRED_SZ_PGA 0x0000FF00 | ||
107 | #define AR_PHY_DESIRED_SZ_PGA_S 8 | ||
108 | #define AR_PHY_DESIRED_SZ_TOT_DES 0x0FF00000 | ||
109 | #define AR_PHY_DESIRED_SZ_TOT_DES_S 20 | ||
110 | |||
111 | #define AR_PHY_FIND_SIG 0x9858 | ||
112 | #define AR_PHY_FIND_SIG_FIRSTEP 0x0003F000 | ||
113 | #define AR_PHY_FIND_SIG_FIRSTEP_S 12 | ||
114 | #define AR_PHY_FIND_SIG_FIRPWR 0x03FC0000 | ||
115 | #define AR_PHY_FIND_SIG_FIRPWR_S 18 | ||
116 | |||
117 | #define AR_PHY_AGC_CTL1 0x985C | ||
118 | #define AR_PHY_AGC_CTL1_COARSE_LOW 0x00007F80 | ||
119 | #define AR_PHY_AGC_CTL1_COARSE_LOW_S 7 | ||
120 | #define AR_PHY_AGC_CTL1_COARSE_HIGH 0x003F8000 | ||
121 | #define AR_PHY_AGC_CTL1_COARSE_HIGH_S 15 | ||
122 | |||
123 | #define AR_PHY_CCA 0x9864 | ||
124 | #define AR_PHY_MINCCA_PWR 0x0FF80000 | ||
125 | #define AR_PHY_MINCCA_PWR_S 19 | ||
126 | #define AR_PHY_CCA_THRESH62 0x0007F000 | ||
127 | #define AR_PHY_CCA_THRESH62_S 12 | ||
128 | #define AR9280_PHY_MINCCA_PWR 0x1FF00000 | ||
129 | #define AR9280_PHY_MINCCA_PWR_S 20 | ||
130 | #define AR9280_PHY_CCA_THRESH62 0x000FF000 | ||
131 | #define AR9280_PHY_CCA_THRESH62_S 12 | ||
132 | |||
133 | #define AR_PHY_SFCORR_LOW 0x986C | ||
134 | #define AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW 0x00000001 | ||
135 | #define AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW 0x00003F00 | ||
136 | #define AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW_S 8 | ||
137 | #define AR_PHY_SFCORR_LOW_M1_THRESH_LOW 0x001FC000 | ||
138 | #define AR_PHY_SFCORR_LOW_M1_THRESH_LOW_S 14 | ||
139 | #define AR_PHY_SFCORR_LOW_M2_THRESH_LOW 0x0FE00000 | ||
140 | #define AR_PHY_SFCORR_LOW_M2_THRESH_LOW_S 21 | ||
141 | |||
142 | #define AR_PHY_SFCORR 0x9868 | ||
143 | #define AR_PHY_SFCORR_M2COUNT_THR 0x0000001F | ||
144 | #define AR_PHY_SFCORR_M2COUNT_THR_S 0 | ||
145 | #define AR_PHY_SFCORR_M1_THRESH 0x00FE0000 | ||
146 | #define AR_PHY_SFCORR_M1_THRESH_S 17 | ||
147 | #define AR_PHY_SFCORR_M2_THRESH 0x7F000000 | ||
148 | #define AR_PHY_SFCORR_M2_THRESH_S 24 | ||
149 | |||
150 | #define AR_PHY_SLEEP_CTR_CONTROL 0x9870 | ||
151 | #define AR_PHY_SLEEP_CTR_LIMIT 0x9874 | ||
152 | #define AR_PHY_SYNTH_CONTROL 0x9874 | ||
153 | #define AR_PHY_SLEEP_SCAL 0x9878 | ||
154 | |||
155 | #define AR_PHY_PLL_CTL 0x987c | ||
156 | #define AR_PHY_PLL_CTL_40 0xaa | ||
157 | #define AR_PHY_PLL_CTL_40_5413 0x04 | ||
158 | #define AR_PHY_PLL_CTL_44 0xab | ||
159 | #define AR_PHY_PLL_CTL_44_2133 0xeb | ||
160 | #define AR_PHY_PLL_CTL_40_2133 0xea | ||
161 | |||
162 | #define AR_PHY_SPECTRAL_SCAN 0x9910 /* AR9280 spectral scan configuration register */ | ||
163 | #define AR_PHY_SPECTRAL_SCAN_ENABLE 0x1 | ||
164 | #define AR_PHY_SPECTRAL_SCAN_ENA 0x00000001 /* Enable spectral scan, reg 68, bit 0 */ | ||
165 | #define AR_PHY_SPECTRAL_SCAN_ENA_S 0 /* Enable spectral scan, reg 68, bit 0 */ | ||
166 | #define AR_PHY_SPECTRAL_SCAN_ACTIVE 0x00000002 /* Activate spectral scan reg 68, bit 1*/ | ||
167 | #define AR_PHY_SPECTRAL_SCAN_ACTIVE_S 1 /* Activate spectral scan reg 68, bit 1*/ | ||
168 | #define AR_PHY_SPECTRAL_SCAN_FFT_PERIOD 0x000000F0 /* Interval for FFT reports, reg 68, bits 4-7*/ | ||
169 | #define AR_PHY_SPECTRAL_SCAN_FFT_PERIOD_S 4 | ||
170 | #define AR_PHY_SPECTRAL_SCAN_PERIOD 0x0000FF00 /* Interval for FFT reports, reg 68, bits 8-15*/ | ||
171 | #define AR_PHY_SPECTRAL_SCAN_PERIOD_S 8 | ||
172 | #define AR_PHY_SPECTRAL_SCAN_COUNT 0x00FF0000 /* Number of reports, reg 68, bits 16-23*/ | ||
173 | #define AR_PHY_SPECTRAL_SCAN_COUNT_S 16 | ||
174 | #define AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT 0x01000000 /* Short repeat, reg 68, bit 24*/ | ||
175 | #define AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT_S 24 /* Short repeat, reg 68, bit 24*/ | ||
176 | |||
177 | #define AR_PHY_RX_DELAY 0x9914 | ||
178 | #define AR_PHY_SEARCH_START_DELAY 0x9918 | ||
179 | #define AR_PHY_RX_DELAY_DELAY 0x00003FFF | ||
180 | |||
181 | #define AR_PHY_TIMING_CTRL4(_i) (0x9920 + ((_i) << 12)) | ||
182 | #define AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF 0x01F | ||
183 | #define AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF_S 0 | ||
184 | #define AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF 0x7E0 | ||
185 | #define AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF_S 5 | ||
186 | #define AR_PHY_TIMING_CTRL4_IQCORR_ENABLE 0x800 | ||
187 | #define AR_PHY_TIMING_CTRL4_IQCAL_LOG_COUNT_MAX 0xF000 | ||
188 | #define AR_PHY_TIMING_CTRL4_IQCAL_LOG_COUNT_MAX_S 12 | ||
189 | #define AR_PHY_TIMING_CTRL4_DO_CAL 0x10000 | ||
190 | |||
191 | #define AR_PHY_TIMING_CTRL4_ENABLE_SPUR_RSSI 0x80000000 | ||
192 | #define AR_PHY_TIMING_CTRL4_ENABLE_SPUR_FILTER 0x40000000 | ||
193 | #define AR_PHY_TIMING_CTRL4_ENABLE_CHAN_MASK 0x20000000 | ||
194 | #define AR_PHY_TIMING_CTRL4_ENABLE_PILOT_MASK 0x10000000 | ||
195 | |||
196 | #define AR_PHY_TIMING5 0x9924 | ||
197 | #define AR_PHY_TIMING5_CYCPWR_THR1 0x000000FE | ||
198 | #define AR_PHY_TIMING5_CYCPWR_THR1_S 1 | ||
199 | |||
200 | #define AR_PHY_POWER_TX_RATE1 0x9934 | ||
201 | #define AR_PHY_POWER_TX_RATE2 0x9938 | ||
202 | #define AR_PHY_POWER_TX_RATE_MAX 0x993c | ||
203 | #define AR_PHY_POWER_TX_RATE_MAX_TPC_ENABLE 0x00000040 | ||
204 | |||
205 | #define AR_PHY_FRAME_CTL 0x9944 | ||
206 | #define AR_PHY_FRAME_CTL_TX_CLIP 0x00000038 | ||
207 | #define AR_PHY_FRAME_CTL_TX_CLIP_S 3 | ||
208 | |||
209 | #define AR_PHY_TXPWRADJ 0x994C | ||
210 | #define AR_PHY_TXPWRADJ_CCK_GAIN_DELTA 0x00000FC0 | ||
211 | #define AR_PHY_TXPWRADJ_CCK_GAIN_DELTA_S 6 | ||
212 | #define AR_PHY_TXPWRADJ_CCK_PCDAC_INDEX 0x00FC0000 | ||
213 | #define AR_PHY_TXPWRADJ_CCK_PCDAC_INDEX_S 18 | ||
214 | |||
215 | #define AR_PHY_RADAR_EXT 0x9940 | ||
216 | #define AR_PHY_RADAR_EXT_ENA 0x00004000 | ||
217 | |||
218 | #define AR_PHY_RADAR_0 0x9954 | ||
219 | #define AR_PHY_RADAR_0_ENA 0x00000001 | ||
220 | #define AR_PHY_RADAR_0_FFT_ENA 0x80000000 | ||
221 | #define AR_PHY_RADAR_0_INBAND 0x0000003e | ||
222 | #define AR_PHY_RADAR_0_INBAND_S 1 | ||
223 | #define AR_PHY_RADAR_0_PRSSI 0x00000FC0 | ||
224 | #define AR_PHY_RADAR_0_PRSSI_S 6 | ||
225 | #define AR_PHY_RADAR_0_HEIGHT 0x0003F000 | ||
226 | #define AR_PHY_RADAR_0_HEIGHT_S 12 | ||
227 | #define AR_PHY_RADAR_0_RRSSI 0x00FC0000 | ||
228 | #define AR_PHY_RADAR_0_RRSSI_S 18 | ||
229 | #define AR_PHY_RADAR_0_FIRPWR 0x7F000000 | ||
230 | #define AR_PHY_RADAR_0_FIRPWR_S 24 | ||
231 | |||
232 | #define AR_PHY_RADAR_1 0x9958 | ||
233 | #define AR_PHY_RADAR_1_RELPWR_ENA 0x00800000 | ||
234 | #define AR_PHY_RADAR_1_USE_FIR128 0x00400000 | ||
235 | #define AR_PHY_RADAR_1_RELPWR_THRESH 0x003F0000 | ||
236 | #define AR_PHY_RADAR_1_RELPWR_THRESH_S 16 | ||
237 | #define AR_PHY_RADAR_1_BLOCK_CHECK 0x00008000 | ||
238 | #define AR_PHY_RADAR_1_MAX_RRSSI 0x00004000 | ||
239 | #define AR_PHY_RADAR_1_RELSTEP_CHECK 0x00002000 | ||
240 | #define AR_PHY_RADAR_1_RELSTEP_THRESH 0x00001F00 | ||
241 | #define AR_PHY_RADAR_1_RELSTEP_THRESH_S 8 | ||
242 | #define AR_PHY_RADAR_1_MAXLEN 0x000000FF | ||
243 | #define AR_PHY_RADAR_1_MAXLEN_S 0 | ||
244 | |||
245 | #define AR_PHY_SWITCH_CHAIN_0 0x9960 | ||
246 | #define AR_PHY_SWITCH_COM 0x9964 | ||
247 | |||
248 | #define AR_PHY_SIGMA_DELTA 0x996C | ||
249 | #define AR_PHY_SIGMA_DELTA_ADC_SEL 0x00000003 | ||
250 | #define AR_PHY_SIGMA_DELTA_ADC_SEL_S 0 | ||
251 | #define AR_PHY_SIGMA_DELTA_FILT2 0x000000F8 | ||
252 | #define AR_PHY_SIGMA_DELTA_FILT2_S 3 | ||
253 | #define AR_PHY_SIGMA_DELTA_FILT1 0x00001F00 | ||
254 | #define AR_PHY_SIGMA_DELTA_FILT1_S 8 | ||
255 | #define AR_PHY_SIGMA_DELTA_ADC_CLIP 0x01FFE000 | ||
256 | #define AR_PHY_SIGMA_DELTA_ADC_CLIP_S 13 | ||
257 | |||
258 | #define AR_PHY_RESTART 0x9970 | ||
259 | #define AR_PHY_RESTART_DIV_GC 0x001C0000 | ||
260 | #define AR_PHY_RESTART_DIV_GC_S 18 | ||
261 | |||
262 | #define AR_PHY_RFBUS_REQ 0x997C | ||
263 | #define AR_PHY_RFBUS_REQ_EN 0x00000001 | ||
264 | |||
265 | #define AR_PHY_TIMING7 0x9980 | ||
266 | #define AR_PHY_TIMING8 0x9984 | ||
267 | #define AR_PHY_TIMING8_PILOT_MASK_2 0x000FFFFF | ||
268 | #define AR_PHY_TIMING8_PILOT_MASK_2_S 0 | ||
269 | |||
270 | #define AR_PHY_BIN_MASK2_1 0x9988 | ||
271 | #define AR_PHY_BIN_MASK2_2 0x998c | ||
272 | #define AR_PHY_BIN_MASK2_3 0x9990 | ||
273 | #define AR_PHY_BIN_MASK2_4 0x9994 | ||
274 | |||
275 | #define AR_PHY_BIN_MASK_1 0x9900 | ||
276 | #define AR_PHY_BIN_MASK_2 0x9904 | ||
277 | #define AR_PHY_BIN_MASK_3 0x9908 | ||
278 | |||
279 | #define AR_PHY_MASK_CTL 0x990c | ||
280 | |||
281 | #define AR_PHY_BIN_MASK2_4_MASK_4 0x00003FFF | ||
282 | #define AR_PHY_BIN_MASK2_4_MASK_4_S 0 | ||
283 | |||
284 | #define AR_PHY_TIMING9 0x9998 | ||
285 | #define AR_PHY_TIMING10 0x999c | ||
286 | #define AR_PHY_TIMING10_PILOT_MASK_2 0x000FFFFF | ||
287 | #define AR_PHY_TIMING10_PILOT_MASK_2_S 0 | ||
288 | |||
289 | #define AR_PHY_TIMING11 0x99a0 | ||
290 | #define AR_PHY_TIMING11_SPUR_DELTA_PHASE 0x000FFFFF | ||
291 | #define AR_PHY_TIMING11_SPUR_DELTA_PHASE_S 0 | ||
292 | #define AR_PHY_TIMING11_USE_SPUR_IN_AGC 0x40000000 | ||
293 | #define AR_PHY_TIMING11_USE_SPUR_IN_SELFCOR 0x80000000 | ||
294 | |||
295 | #define AR_PHY_RX_CHAINMASK 0x99a4 | ||
296 | #define AR_PHY_NEW_ADC_DC_GAIN_CORR(_i) (0x99b4 + ((_i) << 12)) | ||
297 | #define AR_PHY_NEW_ADC_GAIN_CORR_ENABLE 0x40000000 | ||
298 | #define AR_PHY_NEW_ADC_DC_OFFSET_CORR_ENABLE 0x80000000 | ||
299 | |||
300 | #define AR_PHY_MULTICHAIN_GAIN_CTL 0x99ac | ||
301 | #define AR_PHY_9285_ANT_DIV_CTL_ALL 0x7f000000 | ||
302 | #define AR_PHY_9285_ANT_DIV_CTL 0x01000000 | ||
303 | #define AR_PHY_9285_ANT_DIV_CTL_S 24 | ||
304 | #define AR_PHY_9285_ANT_DIV_ALT_LNACONF 0x06000000 | ||
305 | #define AR_PHY_9285_ANT_DIV_ALT_LNACONF_S 25 | ||
306 | #define AR_PHY_9285_ANT_DIV_MAIN_LNACONF 0x18000000 | ||
307 | #define AR_PHY_9285_ANT_DIV_MAIN_LNACONF_S 27 | ||
308 | #define AR_PHY_9285_ANT_DIV_ALT_GAINTB 0x20000000 | ||
309 | #define AR_PHY_9285_ANT_DIV_ALT_GAINTB_S 29 | ||
310 | #define AR_PHY_9285_ANT_DIV_MAIN_GAINTB 0x40000000 | ||
311 | #define AR_PHY_9285_ANT_DIV_MAIN_GAINTB_S 30 | ||
312 | #define AR_PHY_9285_ANT_DIV_LNA1 2 | ||
313 | #define AR_PHY_9285_ANT_DIV_LNA2 1 | ||
314 | #define AR_PHY_9285_ANT_DIV_LNA1_PLUS_LNA2 3 | ||
315 | #define AR_PHY_9285_ANT_DIV_LNA1_MINUS_LNA2 0 | ||
316 | #define AR_PHY_9285_ANT_DIV_GAINTB_0 0 | ||
317 | #define AR_PHY_9285_ANT_DIV_GAINTB_1 1 | ||
318 | |||
319 | #define AR_PHY_EXT_CCA0 0x99b8 | ||
320 | #define AR_PHY_EXT_CCA0_THRESH62 0x000000FF | ||
321 | #define AR_PHY_EXT_CCA0_THRESH62_S 0 | ||
322 | |||
323 | #define AR_PHY_EXT_CCA 0x99bc | ||
324 | #define AR_PHY_EXT_CCA_CYCPWR_THR1 0x0000FE00 | ||
325 | #define AR_PHY_EXT_CCA_CYCPWR_THR1_S 9 | ||
326 | #define AR_PHY_EXT_CCA_THRESH62 0x007F0000 | ||
327 | #define AR_PHY_EXT_CCA_THRESH62_S 16 | ||
328 | #define AR_PHY_EXT_MINCCA_PWR 0xFF800000 | ||
329 | #define AR_PHY_EXT_MINCCA_PWR_S 23 | ||
330 | #define AR9280_PHY_EXT_MINCCA_PWR 0x01FF0000 | ||
331 | #define AR9280_PHY_EXT_MINCCA_PWR_S 16 | ||
332 | |||
333 | #define AR_PHY_SFCORR_EXT 0x99c0 | ||
334 | #define AR_PHY_SFCORR_EXT_M1_THRESH 0x0000007F | ||
335 | #define AR_PHY_SFCORR_EXT_M1_THRESH_S 0 | ||
336 | #define AR_PHY_SFCORR_EXT_M2_THRESH 0x00003F80 | ||
337 | #define AR_PHY_SFCORR_EXT_M2_THRESH_S 7 | ||
338 | #define AR_PHY_SFCORR_EXT_M1_THRESH_LOW 0x001FC000 | ||
339 | #define AR_PHY_SFCORR_EXT_M1_THRESH_LOW_S 14 | ||
340 | #define AR_PHY_SFCORR_EXT_M2_THRESH_LOW 0x0FE00000 | ||
341 | #define AR_PHY_SFCORR_EXT_M2_THRESH_LOW_S 21 | ||
342 | #define AR_PHY_SFCORR_SPUR_SUBCHNL_SD_S 28 | ||
343 | |||
344 | #define AR_PHY_HALFGI 0x99D0 | ||
345 | #define AR_PHY_HALFGI_DSC_MAN 0x0007FFF0 | ||
346 | #define AR_PHY_HALFGI_DSC_MAN_S 4 | ||
347 | #define AR_PHY_HALFGI_DSC_EXP 0x0000000F | ||
348 | #define AR_PHY_HALFGI_DSC_EXP_S 0 | ||
349 | |||
350 | #define AR_PHY_CHAN_INFO_MEMORY 0x99DC | ||
351 | #define AR_PHY_CHAN_INFO_MEMORY_CAPTURE_MASK 0x0001 | ||
352 | |||
353 | #define AR_PHY_HEAVY_CLIP_ENABLE 0x99E0 | ||
354 | |||
355 | #define AR_PHY_HEAVY_CLIP_FACTOR_RIFS 0x99EC | ||
356 | #define AR_PHY_RIFS_INIT_DELAY 0x03ff0000 | ||
357 | |||
358 | #define AR_PHY_M_SLEEP 0x99f0 | ||
359 | #define AR_PHY_REFCLKDLY 0x99f4 | ||
360 | #define AR_PHY_REFCLKPD 0x99f8 | ||
361 | |||
362 | #define AR_PHY_CALMODE 0x99f0 | ||
363 | |||
364 | #define AR_PHY_CALMODE_IQ 0x00000000 | ||
365 | #define AR_PHY_CALMODE_ADC_GAIN 0x00000001 | ||
366 | #define AR_PHY_CALMODE_ADC_DC_PER 0x00000002 | ||
367 | #define AR_PHY_CALMODE_ADC_DC_INIT 0x00000003 | ||
368 | |||
369 | #define AR_PHY_CAL_MEAS_0(_i) (0x9c10 + ((_i) << 12)) | ||
370 | #define AR_PHY_CAL_MEAS_1(_i) (0x9c14 + ((_i) << 12)) | ||
371 | #define AR_PHY_CAL_MEAS_2(_i) (0x9c18 + ((_i) << 12)) | ||
372 | #define AR_PHY_CAL_MEAS_3(_i) (0x9c1c + ((_i) << 12)) | ||
373 | |||
374 | #define AR_PHY_CURRENT_RSSI 0x9c1c | ||
375 | #define AR9280_PHY_CURRENT_RSSI 0x9c3c | ||
376 | |||
377 | #define AR_PHY_RFBUS_GRANT 0x9C20 | ||
378 | #define AR_PHY_RFBUS_GRANT_EN 0x00000001 | ||
379 | |||
380 | #define AR_PHY_CHAN_INFO_GAIN_DIFF 0x9CF4 | ||
381 | #define AR_PHY_CHAN_INFO_GAIN_DIFF_UPPER_LIMIT 320 | ||
382 | |||
383 | #define AR_PHY_CHAN_INFO_GAIN 0x9CFC | ||
384 | |||
385 | #define AR_PHY_MODE 0xA200 | ||
386 | #define AR_PHY_MODE_ASYNCFIFO 0x80 | ||
387 | #define AR_PHY_MODE_AR2133 0x08 | ||
388 | #define AR_PHY_MODE_AR5111 0x00 | ||
389 | #define AR_PHY_MODE_AR5112 0x08 | ||
390 | #define AR_PHY_MODE_DYNAMIC 0x04 | ||
391 | #define AR_PHY_MODE_RF2GHZ 0x02 | ||
392 | #define AR_PHY_MODE_RF5GHZ 0x00 | ||
393 | #define AR_PHY_MODE_CCK 0x01 | ||
394 | #define AR_PHY_MODE_OFDM 0x00 | ||
395 | #define AR_PHY_MODE_DYN_CCK_DISABLE 0x100 | ||
396 | |||
397 | #define AR_PHY_CCK_TX_CTRL 0xA204 | ||
398 | #define AR_PHY_CCK_TX_CTRL_JAPAN 0x00000010 | ||
399 | #define AR_PHY_CCK_TX_CTRL_TX_DAC_SCALE_CCK 0x0000000C | ||
400 | #define AR_PHY_CCK_TX_CTRL_TX_DAC_SCALE_CCK_S 2 | ||
401 | |||
402 | #define AR_PHY_CCK_DETECT 0xA208 | ||
403 | #define AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK 0x0000003F | ||
404 | #define AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK_S 0 | ||
405 | /* [12:6] settling time for antenna switch */ | ||
406 | #define AR_PHY_CCK_DETECT_ANT_SWITCH_TIME 0x00001FC0 | ||
407 | #define AR_PHY_CCK_DETECT_ANT_SWITCH_TIME_S 6 | ||
408 | #define AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV 0x2000 | ||
409 | #define AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV_S 13 | ||
410 | |||
411 | #define AR_PHY_GAIN_2GHZ 0xA20C | ||
412 | #define AR_PHY_GAIN_2GHZ_RXTX_MARGIN 0x00FC0000 | ||
413 | #define AR_PHY_GAIN_2GHZ_RXTX_MARGIN_S 18 | ||
414 | #define AR_PHY_GAIN_2GHZ_BSW_MARGIN 0x00003C00 | ||
415 | #define AR_PHY_GAIN_2GHZ_BSW_MARGIN_S 10 | ||
416 | #define AR_PHY_GAIN_2GHZ_BSW_ATTEN 0x0000001F | ||
417 | #define AR_PHY_GAIN_2GHZ_BSW_ATTEN_S 0 | ||
418 | |||
419 | #define AR_PHY_GAIN_2GHZ_XATTEN2_MARGIN 0x003E0000 | ||
420 | #define AR_PHY_GAIN_2GHZ_XATTEN2_MARGIN_S 17 | ||
421 | #define AR_PHY_GAIN_2GHZ_XATTEN1_MARGIN 0x0001F000 | ||
422 | #define AR_PHY_GAIN_2GHZ_XATTEN1_MARGIN_S 12 | ||
423 | #define AR_PHY_GAIN_2GHZ_XATTEN2_DB 0x00000FC0 | ||
424 | #define AR_PHY_GAIN_2GHZ_XATTEN2_DB_S 6 | ||
425 | #define AR_PHY_GAIN_2GHZ_XATTEN1_DB 0x0000003F | ||
426 | #define AR_PHY_GAIN_2GHZ_XATTEN1_DB_S 0 | ||
427 | |||
428 | #define AR_PHY_CCK_RXCTRL4 0xA21C | ||
429 | #define AR_PHY_CCK_RXCTRL4_FREQ_EST_SHORT 0x01F80000 | ||
430 | #define AR_PHY_CCK_RXCTRL4_FREQ_EST_SHORT_S 19 | ||
431 | |||
432 | #define AR_PHY_DAG_CTRLCCK 0xA228 | ||
433 | #define AR_PHY_DAG_CTRLCCK_EN_RSSI_THR 0x00000200 | ||
434 | #define AR_PHY_DAG_CTRLCCK_RSSI_THR 0x0001FC00 | ||
435 | #define AR_PHY_DAG_CTRLCCK_RSSI_THR_S 10 | ||
436 | |||
437 | #define AR_PHY_FORCE_CLKEN_CCK 0xA22C | ||
438 | #define AR_PHY_FORCE_CLKEN_CCK_MRC_MUX 0x00000040 | ||
439 | |||
440 | #define AR_PHY_POWER_TX_RATE3 0xA234 | ||
441 | #define AR_PHY_POWER_TX_RATE4 0xA238 | ||
442 | |||
443 | #define AR_PHY_SCRM_SEQ_XR 0xA23C | ||
444 | #define AR_PHY_HEADER_DETECT_XR 0xA240 | ||
445 | #define AR_PHY_CHIRP_DETECTED_XR 0xA244 | ||
446 | #define AR_PHY_BLUETOOTH 0xA254 | ||
447 | |||
448 | #define AR_PHY_TPCRG1 0xA258 | ||
449 | #define AR_PHY_TPCRG1_NUM_PD_GAIN 0x0000c000 | ||
450 | #define AR_PHY_TPCRG1_NUM_PD_GAIN_S 14 | ||
451 | |||
452 | #define AR_PHY_TPCRG1_PD_GAIN_1 0x00030000 | ||
453 | #define AR_PHY_TPCRG1_PD_GAIN_1_S 16 | ||
454 | #define AR_PHY_TPCRG1_PD_GAIN_2 0x000C0000 | ||
455 | #define AR_PHY_TPCRG1_PD_GAIN_2_S 18 | ||
456 | #define AR_PHY_TPCRG1_PD_GAIN_3 0x00300000 | ||
457 | #define AR_PHY_TPCRG1_PD_GAIN_3_S 20 | ||
458 | |||
459 | #define AR_PHY_TPCRG1_PD_CAL_ENABLE 0x00400000 | ||
460 | #define AR_PHY_TPCRG1_PD_CAL_ENABLE_S 22 | ||
461 | |||
462 | #define AR_PHY_TX_PWRCTRL4 0xa264 | ||
463 | #define AR_PHY_TX_PWRCTRL_PD_AVG_VALID 0x00000001 | ||
464 | #define AR_PHY_TX_PWRCTRL_PD_AVG_VALID_S 0 | ||
465 | #define AR_PHY_TX_PWRCTRL_PD_AVG_OUT 0x000001FE | ||
466 | #define AR_PHY_TX_PWRCTRL_PD_AVG_OUT_S 1 | ||
467 | |||
468 | #define AR_PHY_TX_PWRCTRL6_0 0xa270 | ||
469 | #define AR_PHY_TX_PWRCTRL6_1 0xb270 | ||
470 | #define AR_PHY_TX_PWRCTRL_ERR_EST_MODE 0x03000000 | ||
471 | #define AR_PHY_TX_PWRCTRL_ERR_EST_MODE_S 24 | ||
472 | |||
473 | #define AR_PHY_TX_PWRCTRL7 0xa274 | ||
474 | #define AR_PHY_TX_PWRCTRL_INIT_TX_GAIN 0x01F80000 | ||
475 | #define AR_PHY_TX_PWRCTRL_INIT_TX_GAIN_S 19 | ||
476 | |||
477 | #define AR_PHY_TX_PWRCTRL9 0xa27C | ||
478 | #define AR_PHY_TX_DESIRED_SCALE_CCK 0x00007C00 | ||
479 | #define AR_PHY_TX_DESIRED_SCALE_CCK_S 10 | ||
480 | #define AR_PHY_TX_PWRCTRL9_RES_DC_REMOVAL 0x80000000 | ||
481 | #define AR_PHY_TX_PWRCTRL9_RES_DC_REMOVAL_S 31 | ||
482 | |||
483 | #define AR_PHY_TX_GAIN_TBL1 0xa300 | ||
484 | #define AR_PHY_TX_GAIN 0x0007F000 | ||
485 | #define AR_PHY_TX_GAIN_S 12 | ||
486 | |||
487 | #define AR_PHY_CH0_TX_PWRCTRL11 0xa398 | ||
488 | #define AR_PHY_CH1_TX_PWRCTRL11 0xb398 | ||
489 | #define AR_PHY_TX_PWRCTRL_OLPC_TEMP_COMP 0x0000FC00 | ||
490 | #define AR_PHY_TX_PWRCTRL_OLPC_TEMP_COMP_S 10 | ||
491 | |||
492 | #define AR_PHY_VIT_MASK2_M_46_61 0xa3a0 | ||
493 | #define AR_PHY_MASK2_M_31_45 0xa3a4 | ||
494 | #define AR_PHY_MASK2_M_16_30 0xa3a8 | ||
495 | #define AR_PHY_MASK2_M_00_15 0xa3ac | ||
496 | #define AR_PHY_MASK2_P_15_01 0xa3b8 | ||
497 | #define AR_PHY_MASK2_P_30_16 0xa3bc | ||
498 | #define AR_PHY_MASK2_P_45_31 0xa3c0 | ||
499 | #define AR_PHY_MASK2_P_61_45 0xa3c4 | ||
500 | #define AR_PHY_SPUR_REG 0x994c | ||
501 | |||
502 | #define AR_PHY_SPUR_REG_MASK_RATE_CNTL (0xFF << 18) | ||
503 | #define AR_PHY_SPUR_REG_MASK_RATE_CNTL_S 18 | ||
504 | |||
505 | #define AR_PHY_SPUR_REG_ENABLE_MASK_PPM 0x20000 | ||
506 | #define AR_PHY_SPUR_REG_MASK_RATE_SELECT (0xFF << 9) | ||
507 | #define AR_PHY_SPUR_REG_MASK_RATE_SELECT_S 9 | ||
508 | #define AR_PHY_SPUR_REG_ENABLE_VIT_SPUR_RSSI 0x100 | ||
509 | #define AR_PHY_SPUR_REG_SPUR_RSSI_THRESH 0x7F | ||
510 | #define AR_PHY_SPUR_REG_SPUR_RSSI_THRESH_S 0 | ||
511 | |||
512 | #define AR_PHY_PILOT_MASK_01_30 0xa3b0 | ||
513 | #define AR_PHY_PILOT_MASK_31_60 0xa3b4 | ||
514 | |||
515 | #define AR_PHY_CHANNEL_MASK_01_30 0x99d4 | ||
516 | #define AR_PHY_CHANNEL_MASK_31_60 0x99d8 | ||
517 | |||
518 | #define AR_PHY_ANALOG_SWAP 0xa268 | ||
519 | #define AR_PHY_SWAP_ALT_CHAIN 0x00000040 | ||
520 | |||
521 | #define AR_PHY_TPCRG5 0xA26C | ||
522 | #define AR_PHY_TPCRG5_PD_GAIN_OVERLAP 0x0000000F | ||
523 | #define AR_PHY_TPCRG5_PD_GAIN_OVERLAP_S 0 | ||
524 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_1 0x000003F0 | ||
525 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_1_S 4 | ||
526 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_2 0x0000FC00 | ||
527 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_2_S 10 | ||
528 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_3 0x003F0000 | ||
529 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_3_S 16 | ||
530 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_4 0x0FC00000 | ||
531 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_4_S 22 | ||
532 | |||
533 | /* Carrier leak calibration control, do it after AGC calibration */ | ||
534 | #define AR_PHY_CL_CAL_CTL 0xA358 | ||
535 | #define AR_PHY_CL_CAL_ENABLE 0x00000002 | ||
536 | #define AR_PHY_PARALLEL_CAL_ENABLE 0x00000001 | ||
537 | |||
538 | #define AR_PHY_POWER_TX_RATE5 0xA38C | ||
539 | #define AR_PHY_POWER_TX_RATE6 0xA390 | ||
540 | |||
541 | #define AR_PHY_CAL_CHAINMASK 0xA39C | ||
542 | |||
543 | #define AR_PHY_POWER_TX_SUB 0xA3C8 | ||
544 | #define AR_PHY_POWER_TX_RATE7 0xA3CC | ||
545 | #define AR_PHY_POWER_TX_RATE8 0xA3D0 | ||
546 | #define AR_PHY_POWER_TX_RATE9 0xA3D4 | ||
547 | |||
548 | #define AR_PHY_XPA_CFG 0xA3D8 | ||
549 | #define AR_PHY_FORCE_XPA_CFG 0x000000001 | ||
550 | #define AR_PHY_FORCE_XPA_CFG_S 0 | ||
551 | |||
552 | #define AR_PHY_CH1_CCA 0xa864 | ||
553 | #define AR_PHY_CH1_MINCCA_PWR 0x0FF80000 | ||
554 | #define AR_PHY_CH1_MINCCA_PWR_S 19 | ||
555 | #define AR9280_PHY_CH1_MINCCA_PWR 0x1FF00000 | ||
556 | #define AR9280_PHY_CH1_MINCCA_PWR_S 20 | ||
557 | |||
558 | #define AR_PHY_CH2_CCA 0xb864 | ||
559 | #define AR_PHY_CH2_MINCCA_PWR 0x0FF80000 | ||
560 | #define AR_PHY_CH2_MINCCA_PWR_S 19 | ||
561 | |||
562 | #define AR_PHY_CH1_EXT_CCA 0xa9bc | ||
563 | #define AR_PHY_CH1_EXT_MINCCA_PWR 0xFF800000 | ||
564 | #define AR_PHY_CH1_EXT_MINCCA_PWR_S 23 | ||
565 | #define AR9280_PHY_CH1_EXT_MINCCA_PWR 0x01FF0000 | ||
566 | #define AR9280_PHY_CH1_EXT_MINCCA_PWR_S 16 | ||
567 | |||
568 | #define AR_PHY_CH2_EXT_CCA 0xb9bc | ||
569 | #define AR_PHY_CH2_EXT_MINCCA_PWR 0xFF800000 | ||
570 | #define AR_PHY_CH2_EXT_MINCCA_PWR_S 23 | ||
571 | |||
572 | #endif | ||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_calib.c b/drivers/net/wireless/ath/ath9k/ar9003_calib.c new file mode 100644 index 000000000000..5e20b4860c7f --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/ar9003_calib.c | |||
@@ -0,0 +1,802 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2010 Atheros Communications Inc. | ||
3 | * | ||
4 | * Permission to use, copy, modify, and/or distribute this software for any | ||
5 | * purpose with or without fee is hereby granted, provided that the above | ||
6 | * copyright notice and this permission notice appear in all copies. | ||
7 | * | ||
8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
15 | */ | ||
16 | |||
17 | #include "hw.h" | ||
18 | #include "hw-ops.h" | ||
19 | #include "ar9003_phy.h" | ||
20 | |||
21 | static void ar9003_hw_setup_calibration(struct ath_hw *ah, | ||
22 | struct ath9k_cal_list *currCal) | ||
23 | { | ||
24 | struct ath_common *common = ath9k_hw_common(ah); | ||
25 | |||
26 | /* Select calibration to run */ | ||
27 | switch (currCal->calData->calType) { | ||
28 | case IQ_MISMATCH_CAL: | ||
29 | /* | ||
30 | * Start calibration with | ||
31 | * 2^(INIT_IQCAL_LOG_COUNT_MAX+1) samples | ||
32 | */ | ||
33 | REG_RMW_FIELD(ah, AR_PHY_TIMING4, | ||
34 | AR_PHY_TIMING4_IQCAL_LOG_COUNT_MAX, | ||
35 | currCal->calData->calCountMax); | ||
36 | REG_WRITE(ah, AR_PHY_CALMODE, AR_PHY_CALMODE_IQ); | ||
37 | |||
38 | ath_print(common, ATH_DBG_CALIBRATE, | ||
39 | "starting IQ Mismatch Calibration\n"); | ||
40 | |||
41 | /* Kick-off cal */ | ||
42 | REG_SET_BIT(ah, AR_PHY_TIMING4, AR_PHY_TIMING4_DO_CAL); | ||
43 | break; | ||
44 | case TEMP_COMP_CAL: | ||
45 | REG_RMW_FIELD(ah, AR_PHY_65NM_CH0_THERM, | ||
46 | AR_PHY_65NM_CH0_THERM_LOCAL, 1); | ||
47 | REG_RMW_FIELD(ah, AR_PHY_65NM_CH0_THERM, | ||
48 | AR_PHY_65NM_CH0_THERM_START, 1); | ||
49 | |||
50 | ath_print(common, ATH_DBG_CALIBRATE, | ||
51 | "starting Temperature Compensation Calibration\n"); | ||
52 | break; | ||
53 | case ADC_DC_INIT_CAL: | ||
54 | case ADC_GAIN_CAL: | ||
55 | case ADC_DC_CAL: | ||
56 | /* Not yet */ | ||
57 | break; | ||
58 | } | ||
59 | } | ||
60 | |||
61 | /* | ||
62 | * Generic calibration routine. | ||
63 | * Recalibrate the lower PHY chips to account for temperature/environment | ||
64 | * changes. | ||
65 | */ | ||
66 | static bool ar9003_hw_per_calibration(struct ath_hw *ah, | ||
67 | struct ath9k_channel *ichan, | ||
68 | u8 rxchainmask, | ||
69 | struct ath9k_cal_list *currCal) | ||
70 | { | ||
71 | /* Cal is assumed not done until explicitly set below */ | ||
72 | bool iscaldone = false; | ||
73 | |||
74 | /* Calibration in progress. */ | ||
75 | if (currCal->calState == CAL_RUNNING) { | ||
76 | /* Check to see if it has finished. */ | ||
77 | if (!(REG_READ(ah, AR_PHY_TIMING4) & AR_PHY_TIMING4_DO_CAL)) { | ||
78 | /* | ||
79 | * Accumulate cal measures for active chains | ||
80 | */ | ||
81 | currCal->calData->calCollect(ah); | ||
82 | ah->cal_samples++; | ||
83 | |||
84 | if (ah->cal_samples >= | ||
85 | currCal->calData->calNumSamples) { | ||
86 | unsigned int i, numChains = 0; | ||
87 | for (i = 0; i < AR9300_MAX_CHAINS; i++) { | ||
88 | if (rxchainmask & (1 << i)) | ||
89 | numChains++; | ||
90 | } | ||
91 | |||
92 | /* | ||
93 | * Process accumulated data | ||
94 | */ | ||
95 | currCal->calData->calPostProc(ah, numChains); | ||
96 | |||
97 | /* Calibration has finished. */ | ||
98 | ichan->CalValid |= currCal->calData->calType; | ||
99 | currCal->calState = CAL_DONE; | ||
100 | iscaldone = true; | ||
101 | } else { | ||
102 | /* | ||
103 | * Set-up collection of another sub-sample until we | ||
104 | * get desired number | ||
105 | */ | ||
106 | ar9003_hw_setup_calibration(ah, currCal); | ||
107 | } | ||
108 | } | ||
109 | } else if (!(ichan->CalValid & currCal->calData->calType)) { | ||
110 | /* If current cal is marked invalid in channel, kick it off */ | ||
111 | ath9k_hw_reset_calibration(ah, currCal); | ||
112 | } | ||
113 | |||
114 | return iscaldone; | ||
115 | } | ||
116 | |||
117 | static bool ar9003_hw_calibrate(struct ath_hw *ah, | ||
118 | struct ath9k_channel *chan, | ||
119 | u8 rxchainmask, | ||
120 | bool longcal) | ||
121 | { | ||
122 | bool iscaldone = true; | ||
123 | struct ath9k_cal_list *currCal = ah->cal_list_curr; | ||
124 | |||
125 | /* | ||
126 | * For given calibration: | ||
127 | * 1. Call generic cal routine | ||
128 | * 2. When this cal is done (isCalDone) if we have more cals waiting | ||
129 | * (eg after reset), mask this to upper layers by not propagating | ||
130 | * isCalDone if it is set to TRUE. | ||
131 | * Instead, change isCalDone to FALSE and setup the waiting cal(s) | ||
132 | * to be run. | ||
133 | */ | ||
134 | if (currCal && | ||
135 | (currCal->calState == CAL_RUNNING || | ||
136 | currCal->calState == CAL_WAITING)) { | ||
137 | iscaldone = ar9003_hw_per_calibration(ah, chan, | ||
138 | rxchainmask, currCal); | ||
139 | if (iscaldone) { | ||
140 | ah->cal_list_curr = currCal = currCal->calNext; | ||
141 | |||
142 | if (currCal->calState == CAL_WAITING) { | ||
143 | iscaldone = false; | ||
144 | ath9k_hw_reset_calibration(ah, currCal); | ||
145 | } | ||
146 | } | ||
147 | } | ||
148 | |||
149 | /* Do NF cal only at longer intervals */ | ||
150 | if (longcal) { | ||
151 | /* | ||
152 | * Load the NF from history buffer of the current channel. | ||
153 | * NF is slow time-variant, so it is OK to use a historical | ||
154 | * value. | ||
155 | */ | ||
156 | ath9k_hw_loadnf(ah, ah->curchan); | ||
157 | |||
158 | /* start NF calibration, without updating BB NF register */ | ||
159 | ath9k_hw_start_nfcal(ah); | ||
160 | } | ||
161 | |||
162 | return iscaldone; | ||
163 | } | ||
164 | |||
165 | static void ar9003_hw_iqcal_collect(struct ath_hw *ah) | ||
166 | { | ||
167 | int i; | ||
168 | |||
169 | /* Accumulate IQ cal measures for active chains */ | ||
170 | for (i = 0; i < AR5416_MAX_CHAINS; i++) { | ||
171 | ah->totalPowerMeasI[i] += | ||
172 | REG_READ(ah, AR_PHY_CAL_MEAS_0(i)); | ||
173 | ah->totalPowerMeasQ[i] += | ||
174 | REG_READ(ah, AR_PHY_CAL_MEAS_1(i)); | ||
175 | ah->totalIqCorrMeas[i] += | ||
176 | (int32_t) REG_READ(ah, AR_PHY_CAL_MEAS_2(i)); | ||
177 | ath_print(ath9k_hw_common(ah), ATH_DBG_CALIBRATE, | ||
178 | "%d: Chn %d pmi=0x%08x;pmq=0x%08x;iqcm=0x%08x;\n", | ||
179 | ah->cal_samples, i, ah->totalPowerMeasI[i], | ||
180 | ah->totalPowerMeasQ[i], | ||
181 | ah->totalIqCorrMeas[i]); | ||
182 | } | ||
183 | } | ||
184 | |||
185 | static void ar9003_hw_iqcalibrate(struct ath_hw *ah, u8 numChains) | ||
186 | { | ||
187 | struct ath_common *common = ath9k_hw_common(ah); | ||
188 | u32 powerMeasQ, powerMeasI, iqCorrMeas; | ||
189 | u32 qCoffDenom, iCoffDenom; | ||
190 | int32_t qCoff, iCoff; | ||
191 | int iqCorrNeg, i; | ||
192 | const u_int32_t offset_array[3] = { | ||
193 | AR_PHY_RX_IQCAL_CORR_B0, | ||
194 | AR_PHY_RX_IQCAL_CORR_B1, | ||
195 | AR_PHY_RX_IQCAL_CORR_B2, | ||
196 | }; | ||
197 | |||
198 | for (i = 0; i < numChains; i++) { | ||
199 | powerMeasI = ah->totalPowerMeasI[i]; | ||
200 | powerMeasQ = ah->totalPowerMeasQ[i]; | ||
201 | iqCorrMeas = ah->totalIqCorrMeas[i]; | ||
202 | |||
203 | ath_print(common, ATH_DBG_CALIBRATE, | ||
204 | "Starting IQ Cal and Correction for Chain %d\n", | ||
205 | i); | ||
206 | |||
207 | ath_print(common, ATH_DBG_CALIBRATE, | ||
208 | "Orignal: Chn %diq_corr_meas = 0x%08x\n", | ||
209 | i, ah->totalIqCorrMeas[i]); | ||
210 | |||
211 | iqCorrNeg = 0; | ||
212 | |||
213 | if (iqCorrMeas > 0x80000000) { | ||
214 | iqCorrMeas = (0xffffffff - iqCorrMeas) + 1; | ||
215 | iqCorrNeg = 1; | ||
216 | } | ||
217 | |||
218 | ath_print(common, ATH_DBG_CALIBRATE, | ||
219 | "Chn %d pwr_meas_i = 0x%08x\n", i, powerMeasI); | ||
220 | ath_print(common, ATH_DBG_CALIBRATE, | ||
221 | "Chn %d pwr_meas_q = 0x%08x\n", i, powerMeasQ); | ||
222 | ath_print(common, ATH_DBG_CALIBRATE, "iqCorrNeg is 0x%08x\n", | ||
223 | iqCorrNeg); | ||
224 | |||
225 | iCoffDenom = (powerMeasI / 2 + powerMeasQ / 2) / 256; | ||
226 | qCoffDenom = powerMeasQ / 64; | ||
227 | |||
228 | if ((iCoffDenom != 0) && (qCoffDenom != 0)) { | ||
229 | iCoff = iqCorrMeas / iCoffDenom; | ||
230 | qCoff = powerMeasI / qCoffDenom - 64; | ||
231 | ath_print(common, ATH_DBG_CALIBRATE, | ||
232 | "Chn %d iCoff = 0x%08x\n", i, iCoff); | ||
233 | ath_print(common, ATH_DBG_CALIBRATE, | ||
234 | "Chn %d qCoff = 0x%08x\n", i, qCoff); | ||
235 | |||
236 | /* Force bounds on iCoff */ | ||
237 | if (iCoff >= 63) | ||
238 | iCoff = 63; | ||
239 | else if (iCoff <= -63) | ||
240 | iCoff = -63; | ||
241 | |||
242 | /* Negate iCoff if iqCorrNeg == 0 */ | ||
243 | if (iqCorrNeg == 0x0) | ||
244 | iCoff = -iCoff; | ||
245 | |||
246 | /* Force bounds on qCoff */ | ||
247 | if (qCoff >= 63) | ||
248 | qCoff = 63; | ||
249 | else if (qCoff <= -63) | ||
250 | qCoff = -63; | ||
251 | |||
252 | iCoff = iCoff & 0x7f; | ||
253 | qCoff = qCoff & 0x7f; | ||
254 | |||
255 | ath_print(common, ATH_DBG_CALIBRATE, | ||
256 | "Chn %d : iCoff = 0x%x qCoff = 0x%x\n", | ||
257 | i, iCoff, qCoff); | ||
258 | ath_print(common, ATH_DBG_CALIBRATE, | ||
259 | "Register offset (0x%04x) " | ||
260 | "before update = 0x%x\n", | ||
261 | offset_array[i], | ||
262 | REG_READ(ah, offset_array[i])); | ||
263 | |||
264 | REG_RMW_FIELD(ah, offset_array[i], | ||
265 | AR_PHY_RX_IQCAL_CORR_IQCORR_Q_I_COFF, | ||
266 | iCoff); | ||
267 | REG_RMW_FIELD(ah, offset_array[i], | ||
268 | AR_PHY_RX_IQCAL_CORR_IQCORR_Q_Q_COFF, | ||
269 | qCoff); | ||
270 | ath_print(common, ATH_DBG_CALIBRATE, | ||
271 | "Register offset (0x%04x) QI COFF " | ||
272 | "(bitfields 0x%08x) after update = 0x%x\n", | ||
273 | offset_array[i], | ||
274 | AR_PHY_RX_IQCAL_CORR_IQCORR_Q_I_COFF, | ||
275 | REG_READ(ah, offset_array[i])); | ||
276 | ath_print(common, ATH_DBG_CALIBRATE, | ||
277 | "Register offset (0x%04x) QQ COFF " | ||
278 | "(bitfields 0x%08x) after update = 0x%x\n", | ||
279 | offset_array[i], | ||
280 | AR_PHY_RX_IQCAL_CORR_IQCORR_Q_Q_COFF, | ||
281 | REG_READ(ah, offset_array[i])); | ||
282 | |||
283 | ath_print(common, ATH_DBG_CALIBRATE, | ||
284 | "IQ Cal and Correction done for Chain %d\n", | ||
285 | i); | ||
286 | } | ||
287 | } | ||
288 | |||
289 | REG_SET_BIT(ah, AR_PHY_RX_IQCAL_CORR_B0, | ||
290 | AR_PHY_RX_IQCAL_CORR_IQCORR_ENABLE); | ||
291 | ath_print(common, ATH_DBG_CALIBRATE, | ||
292 | "IQ Cal and Correction (offset 0x%04x) enabled " | ||
293 | "(bit position 0x%08x). New Value 0x%08x\n", | ||
294 | (unsigned) (AR_PHY_RX_IQCAL_CORR_B0), | ||
295 | AR_PHY_RX_IQCAL_CORR_IQCORR_ENABLE, | ||
296 | REG_READ(ah, AR_PHY_RX_IQCAL_CORR_B0)); | ||
297 | } | ||
298 | |||
299 | static const struct ath9k_percal_data iq_cal_single_sample = { | ||
300 | IQ_MISMATCH_CAL, | ||
301 | MIN_CAL_SAMPLES, | ||
302 | PER_MAX_LOG_COUNT, | ||
303 | ar9003_hw_iqcal_collect, | ||
304 | ar9003_hw_iqcalibrate | ||
305 | }; | ||
306 | |||
307 | static void ar9003_hw_init_cal_settings(struct ath_hw *ah) | ||
308 | { | ||
309 | ah->iq_caldata.calData = &iq_cal_single_sample; | ||
310 | ah->supp_cals = IQ_MISMATCH_CAL; | ||
311 | } | ||
312 | |||
313 | static bool ar9003_hw_iscal_supported(struct ath_hw *ah, | ||
314 | enum ath9k_cal_types calType) | ||
315 | { | ||
316 | switch (calType & ah->supp_cals) { | ||
317 | case IQ_MISMATCH_CAL: | ||
318 | /* | ||
319 | * XXX: Run IQ Mismatch for non-CCK only | ||
320 | * Note that CHANNEL_B is never set though. | ||
321 | */ | ||
322 | return true; | ||
323 | case ADC_GAIN_CAL: | ||
324 | case ADC_DC_CAL: | ||
325 | return false; | ||
326 | case TEMP_COMP_CAL: | ||
327 | return true; | ||
328 | } | ||
329 | |||
330 | return false; | ||
331 | } | ||
332 | |||
333 | /* | ||
334 | * solve 4x4 linear equation used in loopback iq cal. | ||
335 | */ | ||
336 | static bool ar9003_hw_solve_iq_cal(struct ath_hw *ah, | ||
337 | s32 sin_2phi_1, | ||
338 | s32 cos_2phi_1, | ||
339 | s32 sin_2phi_2, | ||
340 | s32 cos_2phi_2, | ||
341 | s32 mag_a0_d0, | ||
342 | s32 phs_a0_d0, | ||
343 | s32 mag_a1_d0, | ||
344 | s32 phs_a1_d0, | ||
345 | s32 solved_eq[]) | ||
346 | { | ||
347 | s32 f1 = cos_2phi_1 - cos_2phi_2, | ||
348 | f3 = sin_2phi_1 - sin_2phi_2, | ||
349 | f2; | ||
350 | s32 mag_tx, phs_tx, mag_rx, phs_rx; | ||
351 | const s32 result_shift = 1 << 15; | ||
352 | struct ath_common *common = ath9k_hw_common(ah); | ||
353 | |||
354 | f2 = (f1 * f1 + f3 * f3) / result_shift; | ||
355 | |||
356 | if (!f2) { | ||
357 | ath_print(common, ATH_DBG_CALIBRATE, "Divide by 0\n"); | ||
358 | return false; | ||
359 | } | ||
360 | |||
361 | /* mag mismatch, tx */ | ||
362 | mag_tx = f1 * (mag_a0_d0 - mag_a1_d0) + f3 * (phs_a0_d0 - phs_a1_d0); | ||
363 | /* phs mismatch, tx */ | ||
364 | phs_tx = f3 * (-mag_a0_d0 + mag_a1_d0) + f1 * (phs_a0_d0 - phs_a1_d0); | ||
365 | |||
366 | mag_tx = (mag_tx / f2); | ||
367 | phs_tx = (phs_tx / f2); | ||
368 | |||
369 | /* mag mismatch, rx */ | ||
370 | mag_rx = mag_a0_d0 - (cos_2phi_1 * mag_tx + sin_2phi_1 * phs_tx) / | ||
371 | result_shift; | ||
372 | /* phs mismatch, rx */ | ||
373 | phs_rx = phs_a0_d0 + (sin_2phi_1 * mag_tx - cos_2phi_1 * phs_tx) / | ||
374 | result_shift; | ||
375 | |||
376 | solved_eq[0] = mag_tx; | ||
377 | solved_eq[1] = phs_tx; | ||
378 | solved_eq[2] = mag_rx; | ||
379 | solved_eq[3] = phs_rx; | ||
380 | |||
381 | return true; | ||
382 | } | ||
383 | |||
384 | static s32 ar9003_hw_find_mag_approx(struct ath_hw *ah, s32 in_re, s32 in_im) | ||
385 | { | ||
386 | s32 abs_i = abs(in_re), | ||
387 | abs_q = abs(in_im), | ||
388 | max_abs, min_abs; | ||
389 | |||
390 | if (abs_i > abs_q) { | ||
391 | max_abs = abs_i; | ||
392 | min_abs = abs_q; | ||
393 | } else { | ||
394 | max_abs = abs_q; | ||
395 | min_abs = abs_i; | ||
396 | } | ||
397 | |||
398 | return max_abs - (max_abs / 32) + (min_abs / 8) + (min_abs / 4); | ||
399 | } | ||
400 | |||
401 | #define DELPT 32 | ||
402 | |||
403 | static bool ar9003_hw_calc_iq_corr(struct ath_hw *ah, | ||
404 | s32 chain_idx, | ||
405 | const s32 iq_res[], | ||
406 | s32 iqc_coeff[]) | ||
407 | { | ||
408 | s32 i2_m_q2_a0_d0, i2_p_q2_a0_d0, iq_corr_a0_d0, | ||
409 | i2_m_q2_a0_d1, i2_p_q2_a0_d1, iq_corr_a0_d1, | ||
410 | i2_m_q2_a1_d0, i2_p_q2_a1_d0, iq_corr_a1_d0, | ||
411 | i2_m_q2_a1_d1, i2_p_q2_a1_d1, iq_corr_a1_d1; | ||
412 | s32 mag_a0_d0, mag_a1_d0, mag_a0_d1, mag_a1_d1, | ||
413 | phs_a0_d0, phs_a1_d0, phs_a0_d1, phs_a1_d1, | ||
414 | sin_2phi_1, cos_2phi_1, | ||
415 | sin_2phi_2, cos_2phi_2; | ||
416 | s32 mag_tx, phs_tx, mag_rx, phs_rx; | ||
417 | s32 solved_eq[4], mag_corr_tx, phs_corr_tx, mag_corr_rx, phs_corr_rx, | ||
418 | q_q_coff, q_i_coff; | ||
419 | const s32 res_scale = 1 << 15; | ||
420 | const s32 delpt_shift = 1 << 8; | ||
421 | s32 mag1, mag2; | ||
422 | struct ath_common *common = ath9k_hw_common(ah); | ||
423 | |||
424 | i2_m_q2_a0_d0 = iq_res[0] & 0xfff; | ||
425 | i2_p_q2_a0_d0 = (iq_res[0] >> 12) & 0xfff; | ||
426 | iq_corr_a0_d0 = ((iq_res[0] >> 24) & 0xff) + ((iq_res[1] & 0xf) << 8); | ||
427 | |||
428 | if (i2_m_q2_a0_d0 > 0x800) | ||
429 | i2_m_q2_a0_d0 = -((0xfff - i2_m_q2_a0_d0) + 1); | ||
430 | |||
431 | if (i2_p_q2_a0_d0 > 0x800) | ||
432 | i2_p_q2_a0_d0 = -((0xfff - i2_p_q2_a0_d0) + 1); | ||
433 | |||
434 | if (iq_corr_a0_d0 > 0x800) | ||
435 | iq_corr_a0_d0 = -((0xfff - iq_corr_a0_d0) + 1); | ||
436 | |||
437 | i2_m_q2_a0_d1 = (iq_res[1] >> 4) & 0xfff; | ||
438 | i2_p_q2_a0_d1 = (iq_res[2] & 0xfff); | ||
439 | iq_corr_a0_d1 = (iq_res[2] >> 12) & 0xfff; | ||
440 | |||
441 | if (i2_m_q2_a0_d1 > 0x800) | ||
442 | i2_m_q2_a0_d1 = -((0xfff - i2_m_q2_a0_d1) + 1); | ||
443 | |||
444 | if (i2_p_q2_a0_d1 > 0x800) | ||
445 | i2_p_q2_a0_d1 = -((0xfff - i2_p_q2_a0_d1) + 1); | ||
446 | |||
447 | if (iq_corr_a0_d1 > 0x800) | ||
448 | iq_corr_a0_d1 = -((0xfff - iq_corr_a0_d1) + 1); | ||
449 | |||
450 | i2_m_q2_a1_d0 = ((iq_res[2] >> 24) & 0xff) + ((iq_res[3] & 0xf) << 8); | ||
451 | i2_p_q2_a1_d0 = (iq_res[3] >> 4) & 0xfff; | ||
452 | iq_corr_a1_d0 = iq_res[4] & 0xfff; | ||
453 | |||
454 | if (i2_m_q2_a1_d0 > 0x800) | ||
455 | i2_m_q2_a1_d0 = -((0xfff - i2_m_q2_a1_d0) + 1); | ||
456 | |||
457 | if (i2_p_q2_a1_d0 > 0x800) | ||
458 | i2_p_q2_a1_d0 = -((0xfff - i2_p_q2_a1_d0) + 1); | ||
459 | |||
460 | if (iq_corr_a1_d0 > 0x800) | ||
461 | iq_corr_a1_d0 = -((0xfff - iq_corr_a1_d0) + 1); | ||
462 | |||
463 | i2_m_q2_a1_d1 = (iq_res[4] >> 12) & 0xfff; | ||
464 | i2_p_q2_a1_d1 = ((iq_res[4] >> 24) & 0xff) + ((iq_res[5] & 0xf) << 8); | ||
465 | iq_corr_a1_d1 = (iq_res[5] >> 4) & 0xfff; | ||
466 | |||
467 | if (i2_m_q2_a1_d1 > 0x800) | ||
468 | i2_m_q2_a1_d1 = -((0xfff - i2_m_q2_a1_d1) + 1); | ||
469 | |||
470 | if (i2_p_q2_a1_d1 > 0x800) | ||
471 | i2_p_q2_a1_d1 = -((0xfff - i2_p_q2_a1_d1) + 1); | ||
472 | |||
473 | if (iq_corr_a1_d1 > 0x800) | ||
474 | iq_corr_a1_d1 = -((0xfff - iq_corr_a1_d1) + 1); | ||
475 | |||
476 | if ((i2_p_q2_a0_d0 == 0) || (i2_p_q2_a0_d1 == 0) || | ||
477 | (i2_p_q2_a1_d0 == 0) || (i2_p_q2_a1_d1 == 0)) { | ||
478 | ath_print(common, ATH_DBG_CALIBRATE, | ||
479 | "Divide by 0:\na0_d0=%d\n" | ||
480 | "a0_d1=%d\na2_d0=%d\na1_d1=%d\n", | ||
481 | i2_p_q2_a0_d0, i2_p_q2_a0_d1, | ||
482 | i2_p_q2_a1_d0, i2_p_q2_a1_d1); | ||
483 | return false; | ||
484 | } | ||
485 | |||
486 | mag_a0_d0 = (i2_m_q2_a0_d0 * res_scale) / i2_p_q2_a0_d0; | ||
487 | phs_a0_d0 = (iq_corr_a0_d0 * res_scale) / i2_p_q2_a0_d0; | ||
488 | |||
489 | mag_a0_d1 = (i2_m_q2_a0_d1 * res_scale) / i2_p_q2_a0_d1; | ||
490 | phs_a0_d1 = (iq_corr_a0_d1 * res_scale) / i2_p_q2_a0_d1; | ||
491 | |||
492 | mag_a1_d0 = (i2_m_q2_a1_d0 * res_scale) / i2_p_q2_a1_d0; | ||
493 | phs_a1_d0 = (iq_corr_a1_d0 * res_scale) / i2_p_q2_a1_d0; | ||
494 | |||
495 | mag_a1_d1 = (i2_m_q2_a1_d1 * res_scale) / i2_p_q2_a1_d1; | ||
496 | phs_a1_d1 = (iq_corr_a1_d1 * res_scale) / i2_p_q2_a1_d1; | ||
497 | |||
498 | /* w/o analog phase shift */ | ||
499 | sin_2phi_1 = (((mag_a0_d0 - mag_a0_d1) * delpt_shift) / DELPT); | ||
500 | /* w/o analog phase shift */ | ||
501 | cos_2phi_1 = (((phs_a0_d1 - phs_a0_d0) * delpt_shift) / DELPT); | ||
502 | /* w/ analog phase shift */ | ||
503 | sin_2phi_2 = (((mag_a1_d0 - mag_a1_d1) * delpt_shift) / DELPT); | ||
504 | /* w/ analog phase shift */ | ||
505 | cos_2phi_2 = (((phs_a1_d1 - phs_a1_d0) * delpt_shift) / DELPT); | ||
506 | |||
507 | /* | ||
508 | * force sin^2 + cos^2 = 1; | ||
509 | * find magnitude by approximation | ||
510 | */ | ||
511 | mag1 = ar9003_hw_find_mag_approx(ah, cos_2phi_1, sin_2phi_1); | ||
512 | mag2 = ar9003_hw_find_mag_approx(ah, cos_2phi_2, sin_2phi_2); | ||
513 | |||
514 | if ((mag1 == 0) || (mag2 == 0)) { | ||
515 | ath_print(common, ATH_DBG_CALIBRATE, | ||
516 | "Divide by 0: mag1=%d, mag2=%d\n", | ||
517 | mag1, mag2); | ||
518 | return false; | ||
519 | } | ||
520 | |||
521 | /* normalization sin and cos by mag */ | ||
522 | sin_2phi_1 = (sin_2phi_1 * res_scale / mag1); | ||
523 | cos_2phi_1 = (cos_2phi_1 * res_scale / mag1); | ||
524 | sin_2phi_2 = (sin_2phi_2 * res_scale / mag2); | ||
525 | cos_2phi_2 = (cos_2phi_2 * res_scale / mag2); | ||
526 | |||
527 | /* calculate IQ mismatch */ | ||
528 | if (!ar9003_hw_solve_iq_cal(ah, | ||
529 | sin_2phi_1, cos_2phi_1, | ||
530 | sin_2phi_2, cos_2phi_2, | ||
531 | mag_a0_d0, phs_a0_d0, | ||
532 | mag_a1_d0, | ||
533 | phs_a1_d0, solved_eq)) { | ||
534 | ath_print(common, ATH_DBG_CALIBRATE, | ||
535 | "Call to ar9003_hw_solve_iq_cal() failed.\n"); | ||
536 | return false; | ||
537 | } | ||
538 | |||
539 | mag_tx = solved_eq[0]; | ||
540 | phs_tx = solved_eq[1]; | ||
541 | mag_rx = solved_eq[2]; | ||
542 | phs_rx = solved_eq[3]; | ||
543 | |||
544 | ath_print(common, ATH_DBG_CALIBRATE, | ||
545 | "chain %d: mag mismatch=%d phase mismatch=%d\n", | ||
546 | chain_idx, mag_tx/res_scale, phs_tx/res_scale); | ||
547 | |||
548 | if (res_scale == mag_tx) { | ||
549 | ath_print(common, ATH_DBG_CALIBRATE, | ||
550 | "Divide by 0: mag_tx=%d, res_scale=%d\n", | ||
551 | mag_tx, res_scale); | ||
552 | return false; | ||
553 | } | ||
554 | |||
555 | /* calculate and quantize Tx IQ correction factor */ | ||
556 | mag_corr_tx = (mag_tx * res_scale) / (res_scale - mag_tx); | ||
557 | phs_corr_tx = -phs_tx; | ||
558 | |||
559 | q_q_coff = (mag_corr_tx * 128 / res_scale); | ||
560 | q_i_coff = (phs_corr_tx * 256 / res_scale); | ||
561 | |||
562 | ath_print(common, ATH_DBG_CALIBRATE, | ||
563 | "tx chain %d: mag corr=%d phase corr=%d\n", | ||
564 | chain_idx, q_q_coff, q_i_coff); | ||
565 | |||
566 | if (q_i_coff < -63) | ||
567 | q_i_coff = -63; | ||
568 | if (q_i_coff > 63) | ||
569 | q_i_coff = 63; | ||
570 | if (q_q_coff < -63) | ||
571 | q_q_coff = -63; | ||
572 | if (q_q_coff > 63) | ||
573 | q_q_coff = 63; | ||
574 | |||
575 | iqc_coeff[0] = (q_q_coff * 128) + q_i_coff; | ||
576 | |||
577 | ath_print(common, ATH_DBG_CALIBRATE, | ||
578 | "tx chain %d: iq corr coeff=%x\n", | ||
579 | chain_idx, iqc_coeff[0]); | ||
580 | |||
581 | if (-mag_rx == res_scale) { | ||
582 | ath_print(common, ATH_DBG_CALIBRATE, | ||
583 | "Divide by 0: mag_rx=%d, res_scale=%d\n", | ||
584 | mag_rx, res_scale); | ||
585 | return false; | ||
586 | } | ||
587 | |||
588 | /* calculate and quantize Rx IQ correction factors */ | ||
589 | mag_corr_rx = (-mag_rx * res_scale) / (res_scale + mag_rx); | ||
590 | phs_corr_rx = -phs_rx; | ||
591 | |||
592 | q_q_coff = (mag_corr_rx * 128 / res_scale); | ||
593 | q_i_coff = (phs_corr_rx * 256 / res_scale); | ||
594 | |||
595 | ath_print(common, ATH_DBG_CALIBRATE, | ||
596 | "rx chain %d: mag corr=%d phase corr=%d\n", | ||
597 | chain_idx, q_q_coff, q_i_coff); | ||
598 | |||
599 | if (q_i_coff < -63) | ||
600 | q_i_coff = -63; | ||
601 | if (q_i_coff > 63) | ||
602 | q_i_coff = 63; | ||
603 | if (q_q_coff < -63) | ||
604 | q_q_coff = -63; | ||
605 | if (q_q_coff > 63) | ||
606 | q_q_coff = 63; | ||
607 | |||
608 | iqc_coeff[1] = (q_q_coff * 128) + q_i_coff; | ||
609 | |||
610 | ath_print(common, ATH_DBG_CALIBRATE, | ||
611 | "rx chain %d: iq corr coeff=%x\n", | ||
612 | chain_idx, iqc_coeff[1]); | ||
613 | |||
614 | return true; | ||
615 | } | ||
616 | |||
617 | static void ar9003_hw_tx_iq_cal(struct ath_hw *ah) | ||
618 | { | ||
619 | struct ath_common *common = ath9k_hw_common(ah); | ||
620 | const u32 txiqcal_status[AR9300_MAX_CHAINS] = { | ||
621 | AR_PHY_TX_IQCAL_STATUS_B0, | ||
622 | AR_PHY_TX_IQCAL_STATUS_B1, | ||
623 | AR_PHY_TX_IQCAL_STATUS_B2, | ||
624 | }; | ||
625 | const u32 tx_corr_coeff[AR9300_MAX_CHAINS] = { | ||
626 | AR_PHY_TX_IQCAL_CORR_COEFF_01_B0, | ||
627 | AR_PHY_TX_IQCAL_CORR_COEFF_01_B1, | ||
628 | AR_PHY_TX_IQCAL_CORR_COEFF_01_B2, | ||
629 | }; | ||
630 | const u32 rx_corr[AR9300_MAX_CHAINS] = { | ||
631 | AR_PHY_RX_IQCAL_CORR_B0, | ||
632 | AR_PHY_RX_IQCAL_CORR_B1, | ||
633 | AR_PHY_RX_IQCAL_CORR_B2, | ||
634 | }; | ||
635 | const u_int32_t chan_info_tab[] = { | ||
636 | AR_PHY_CHAN_INFO_TAB_0, | ||
637 | AR_PHY_CHAN_INFO_TAB_1, | ||
638 | AR_PHY_CHAN_INFO_TAB_2, | ||
639 | }; | ||
640 | s32 iq_res[6]; | ||
641 | s32 iqc_coeff[2]; | ||
642 | s32 i, j; | ||
643 | u32 num_chains = 0; | ||
644 | |||
645 | for (i = 0; i < AR9300_MAX_CHAINS; i++) { | ||
646 | if (ah->txchainmask & (1 << i)) | ||
647 | num_chains++; | ||
648 | } | ||
649 | |||
650 | REG_RMW_FIELD(ah, AR_PHY_TX_IQCAL_CONTROL_1, | ||
651 | AR_PHY_TX_IQCAQL_CONTROL_1_IQCORR_I_Q_COFF_DELPT, | ||
652 | DELPT); | ||
653 | REG_RMW_FIELD(ah, AR_PHY_TX_IQCAL_START, | ||
654 | AR_PHY_TX_IQCAL_START_DO_CAL, | ||
655 | AR_PHY_TX_IQCAL_START_DO_CAL); | ||
656 | |||
657 | if (!ath9k_hw_wait(ah, AR_PHY_TX_IQCAL_START, | ||
658 | AR_PHY_TX_IQCAL_START_DO_CAL, | ||
659 | 0, AH_WAIT_TIMEOUT)) { | ||
660 | ath_print(common, ATH_DBG_CALIBRATE, | ||
661 | "Tx IQ Cal not complete.\n"); | ||
662 | goto TX_IQ_CAL_FAILED; | ||
663 | } | ||
664 | |||
665 | for (i = 0; i < num_chains; i++) { | ||
666 | ath_print(common, ATH_DBG_CALIBRATE, | ||
667 | "Doing Tx IQ Cal for chain %d.\n", i); | ||
668 | |||
669 | if (REG_READ(ah, txiqcal_status[i]) & | ||
670 | AR_PHY_TX_IQCAL_STATUS_FAILED) { | ||
671 | ath_print(common, ATH_DBG_CALIBRATE, | ||
672 | "Tx IQ Cal failed for chain %d.\n", i); | ||
673 | goto TX_IQ_CAL_FAILED; | ||
674 | } | ||
675 | |||
676 | for (j = 0; j < 3; j++) { | ||
677 | u_int8_t idx = 2 * j, | ||
678 | offset = 4 * j; | ||
679 | |||
680 | REG_RMW_FIELD(ah, AR_PHY_CHAN_INFO_MEMORY, | ||
681 | AR_PHY_CHAN_INFO_TAB_S2_READ, 0); | ||
682 | |||
683 | /* 32 bits */ | ||
684 | iq_res[idx] = REG_READ(ah, chan_info_tab[i] + offset); | ||
685 | |||
686 | REG_RMW_FIELD(ah, AR_PHY_CHAN_INFO_MEMORY, | ||
687 | AR_PHY_CHAN_INFO_TAB_S2_READ, 1); | ||
688 | |||
689 | /* 16 bits */ | ||
690 | iq_res[idx+1] = 0xffff & REG_READ(ah, | ||
691 | chan_info_tab[i] + | ||
692 | offset); | ||
693 | |||
694 | ath_print(common, ATH_DBG_CALIBRATE, | ||
695 | "IQ RES[%d]=0x%x IQ_RES[%d]=0x%x\n", | ||
696 | idx, iq_res[idx], idx+1, iq_res[idx+1]); | ||
697 | } | ||
698 | |||
699 | if (!ar9003_hw_calc_iq_corr(ah, i, iq_res, iqc_coeff)) { | ||
700 | ath_print(common, ATH_DBG_CALIBRATE, | ||
701 | "Failed in calculation of IQ correction.\n"); | ||
702 | goto TX_IQ_CAL_FAILED; | ||
703 | } | ||
704 | |||
705 | ath_print(common, ATH_DBG_CALIBRATE, | ||
706 | "IQ_COEFF[0] = 0x%x IQ_COEFF[1] = 0x%x\n", | ||
707 | iqc_coeff[0], iqc_coeff[1]); | ||
708 | |||
709 | REG_RMW_FIELD(ah, tx_corr_coeff[i], | ||
710 | AR_PHY_TX_IQCAL_CORR_COEFF_01_COEFF_TABLE, | ||
711 | iqc_coeff[0]); | ||
712 | REG_RMW_FIELD(ah, rx_corr[i], | ||
713 | AR_PHY_RX_IQCAL_CORR_LOOPBACK_IQCORR_Q_Q_COFF, | ||
714 | iqc_coeff[1] >> 7); | ||
715 | REG_RMW_FIELD(ah, rx_corr[i], | ||
716 | AR_PHY_RX_IQCAL_CORR_LOOPBACK_IQCORR_Q_I_COFF, | ||
717 | iqc_coeff[1]); | ||
718 | } | ||
719 | |||
720 | REG_RMW_FIELD(ah, AR_PHY_TX_IQCAL_CONTROL_3, | ||
721 | AR_PHY_TX_IQCAL_CONTROL_3_IQCORR_EN, 0x1); | ||
722 | REG_RMW_FIELD(ah, AR_PHY_RX_IQCAL_CORR_B0, | ||
723 | AR_PHY_RX_IQCAL_CORR_B0_LOOPBACK_IQCORR_EN, 0x1); | ||
724 | |||
725 | return; | ||
726 | |||
727 | TX_IQ_CAL_FAILED: | ||
728 | ath_print(common, ATH_DBG_CALIBRATE, "Tx IQ Cal failed\n"); | ||
729 | return; | ||
730 | } | ||
731 | |||
732 | static bool ar9003_hw_init_cal(struct ath_hw *ah, | ||
733 | struct ath9k_channel *chan) | ||
734 | { | ||
735 | struct ath_common *common = ath9k_hw_common(ah); | ||
736 | |||
737 | /* | ||
738 | * 0x7 = 0b111 , AR9003 needs to be configured for 3-chain mode before | ||
739 | * running AGC/TxIQ cals | ||
740 | */ | ||
741 | ar9003_hw_set_chain_masks(ah, 0x7, 0x7); | ||
742 | |||
743 | /* Calibrate the AGC */ | ||
744 | REG_WRITE(ah, AR_PHY_AGC_CONTROL, | ||
745 | REG_READ(ah, AR_PHY_AGC_CONTROL) | | ||
746 | AR_PHY_AGC_CONTROL_CAL); | ||
747 | |||
748 | /* Poll for offset calibration complete */ | ||
749 | if (!ath9k_hw_wait(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_CAL, | ||
750 | 0, AH_WAIT_TIMEOUT)) { | ||
751 | ath_print(common, ATH_DBG_CALIBRATE, | ||
752 | "offset calibration failed to " | ||
753 | "complete in 1ms; noisy environment?\n"); | ||
754 | return false; | ||
755 | } | ||
756 | |||
757 | /* Do Tx IQ Calibration */ | ||
758 | ar9003_hw_tx_iq_cal(ah); | ||
759 | |||
760 | /* Revert chainmasks to their original values before NF cal */ | ||
761 | ar9003_hw_set_chain_masks(ah, ah->rxchainmask, ah->txchainmask); | ||
762 | |||
763 | /* Initialize list pointers */ | ||
764 | ah->cal_list = ah->cal_list_last = ah->cal_list_curr = NULL; | ||
765 | |||
766 | if (ar9003_hw_iscal_supported(ah, IQ_MISMATCH_CAL)) { | ||
767 | INIT_CAL(&ah->iq_caldata); | ||
768 | INSERT_CAL(ah, &ah->iq_caldata); | ||
769 | ath_print(common, ATH_DBG_CALIBRATE, | ||
770 | "enabling IQ Calibration.\n"); | ||
771 | } | ||
772 | |||
773 | if (ar9003_hw_iscal_supported(ah, TEMP_COMP_CAL)) { | ||
774 | INIT_CAL(&ah->tempCompCalData); | ||
775 | INSERT_CAL(ah, &ah->tempCompCalData); | ||
776 | ath_print(common, ATH_DBG_CALIBRATE, | ||
777 | "enabling Temperature Compensation Calibration.\n"); | ||
778 | } | ||
779 | |||
780 | /* Initialize current pointer to first element in list */ | ||
781 | ah->cal_list_curr = ah->cal_list; | ||
782 | |||
783 | if (ah->cal_list_curr) | ||
784 | ath9k_hw_reset_calibration(ah, ah->cal_list_curr); | ||
785 | |||
786 | chan->CalValid = 0; | ||
787 | |||
788 | return true; | ||
789 | } | ||
790 | |||
791 | void ar9003_hw_attach_calib_ops(struct ath_hw *ah) | ||
792 | { | ||
793 | struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); | ||
794 | struct ath_hw_ops *ops = ath9k_hw_ops(ah); | ||
795 | |||
796 | priv_ops->init_cal_settings = ar9003_hw_init_cal_settings; | ||
797 | priv_ops->init_cal = ar9003_hw_init_cal; | ||
798 | priv_ops->setup_calibration = ar9003_hw_setup_calibration; | ||
799 | priv_ops->iscal_supported = ar9003_hw_iscal_supported; | ||
800 | |||
801 | ops->calibrate = ar9003_hw_calibrate; | ||
802 | } | ||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c new file mode 100644 index 000000000000..5d92be47c5a5 --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.c | |||
@@ -0,0 +1,1856 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2010 Atheros Communications Inc. | ||
3 | * | ||
4 | * Permission to use, copy, modify, and/or distribute this software for any | ||
5 | * purpose with or without fee is hereby granted, provided that the above | ||
6 | * copyright notice and this permission notice appear in all copies. | ||
7 | * | ||
8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
15 | */ | ||
16 | |||
17 | #include "hw.h" | ||
18 | #include "ar9003_phy.h" | ||
19 | #include "ar9003_eeprom.h" | ||
20 | |||
21 | #define COMP_HDR_LEN 4 | ||
22 | #define COMP_CKSUM_LEN 2 | ||
23 | |||
24 | #define AR_CH0_TOP (0x00016288) | ||
25 | #define AR_CH0_TOP_XPABIASLVL (0x3) | ||
26 | #define AR_CH0_TOP_XPABIASLVL_S (8) | ||
27 | |||
28 | #define AR_CH0_THERM (0x00016290) | ||
29 | #define AR_CH0_THERM_SPARE (0x3f) | ||
30 | #define AR_CH0_THERM_SPARE_S (0) | ||
31 | |||
32 | #define AR_SWITCH_TABLE_COM_ALL (0xffff) | ||
33 | #define AR_SWITCH_TABLE_COM_ALL_S (0) | ||
34 | |||
35 | #define AR_SWITCH_TABLE_COM2_ALL (0xffffff) | ||
36 | #define AR_SWITCH_TABLE_COM2_ALL_S (0) | ||
37 | |||
38 | #define AR_SWITCH_TABLE_ALL (0xfff) | ||
39 | #define AR_SWITCH_TABLE_ALL_S (0) | ||
40 | |||
41 | static const struct ar9300_eeprom ar9300_default = { | ||
42 | .eepromVersion = 2, | ||
43 | .templateVersion = 2, | ||
44 | .macAddr = {1, 2, 3, 4, 5, 6}, | ||
45 | .custData = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
46 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}, | ||
47 | .baseEepHeader = { | ||
48 | .regDmn = {0, 0x1f}, | ||
49 | .txrxMask = 0x77, /* 4 bits tx and 4 bits rx */ | ||
50 | .opCapFlags = { | ||
51 | .opFlags = AR9300_OPFLAGS_11G | AR9300_OPFLAGS_11A, | ||
52 | .eepMisc = 0, | ||
53 | }, | ||
54 | .rfSilent = 0, | ||
55 | .blueToothOptions = 0, | ||
56 | .deviceCap = 0, | ||
57 | .deviceType = 5, /* takes lower byte in eeprom location */ | ||
58 | .pwrTableOffset = AR9300_PWR_TABLE_OFFSET, | ||
59 | .params_for_tuning_caps = {0, 0}, | ||
60 | .featureEnable = 0x0c, | ||
61 | /* | ||
62 | * bit0 - enable tx temp comp - disabled | ||
63 | * bit1 - enable tx volt comp - disabled | ||
64 | * bit2 - enable fastClock - enabled | ||
65 | * bit3 - enable doubling - enabled | ||
66 | * bit4 - enable internal regulator - disabled | ||
67 | */ | ||
68 | .miscConfiguration = 0, /* bit0 - turn down drivestrength */ | ||
69 | .eepromWriteEnableGpio = 3, | ||
70 | .wlanDisableGpio = 0, | ||
71 | .wlanLedGpio = 8, | ||
72 | .rxBandSelectGpio = 0xff, | ||
73 | .txrxgain = 0, | ||
74 | .swreg = 0, | ||
75 | }, | ||
76 | .modalHeader2G = { | ||
77 | /* ar9300_modal_eep_header 2g */ | ||
78 | /* 4 idle,t1,t2,b(4 bits per setting) */ | ||
79 | .antCtrlCommon = 0x110, | ||
80 | /* 4 ra1l1, ra2l1, ra1l2, ra2l2, ra12 */ | ||
81 | .antCtrlCommon2 = 0x22222, | ||
82 | |||
83 | /* | ||
84 | * antCtrlChain[AR9300_MAX_CHAINS]; 6 idle, t, r, | ||
85 | * rx1, rx12, b (2 bits each) | ||
86 | */ | ||
87 | .antCtrlChain = {0x150, 0x150, 0x150}, | ||
88 | |||
89 | /* | ||
90 | * xatten1DB[AR9300_MAX_CHAINS]; 3 xatten1_db | ||
91 | * for ar9280 (0xa20c/b20c 5:0) | ||
92 | */ | ||
93 | .xatten1DB = {0, 0, 0}, | ||
94 | |||
95 | /* | ||
96 | * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin | ||
97 | * for ar9280 (0xa20c/b20c 16:12 | ||
98 | */ | ||
99 | .xatten1Margin = {0, 0, 0}, | ||
100 | .tempSlope = 36, | ||
101 | .voltSlope = 0, | ||
102 | |||
103 | /* | ||
104 | * spurChans[OSPREY_EEPROM_MODAL_SPURS]; spur | ||
105 | * channels in usual fbin coding format | ||
106 | */ | ||
107 | .spurChans = {0, 0, 0, 0, 0}, | ||
108 | |||
109 | /* | ||
110 | * noiseFloorThreshCh[AR9300_MAX_CHAINS]; 3 Check | ||
111 | * if the register is per chain | ||
112 | */ | ||
113 | .noiseFloorThreshCh = {-1, 0, 0}, | ||
114 | .ob = {1, 1, 1},/* 3 chain */ | ||
115 | .db_stage2 = {1, 1, 1}, /* 3 chain */ | ||
116 | .db_stage3 = {0, 0, 0}, | ||
117 | .db_stage4 = {0, 0, 0}, | ||
118 | .xpaBiasLvl = 0, | ||
119 | .txFrameToDataStart = 0x0e, | ||
120 | .txFrameToPaOn = 0x0e, | ||
121 | .txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */ | ||
122 | .antennaGain = 0, | ||
123 | .switchSettling = 0x2c, | ||
124 | .adcDesiredSize = -30, | ||
125 | .txEndToXpaOff = 0, | ||
126 | .txEndToRxOn = 0x2, | ||
127 | .txFrameToXpaOn = 0xe, | ||
128 | .thresh62 = 28, | ||
129 | .futureModal = { /* [32] */ | ||
130 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
131 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | ||
132 | }, | ||
133 | }, | ||
134 | .calFreqPier2G = { | ||
135 | FREQ2FBIN(2412, 1), | ||
136 | FREQ2FBIN(2437, 1), | ||
137 | FREQ2FBIN(2472, 1), | ||
138 | }, | ||
139 | /* ar9300_cal_data_per_freq_op_loop 2g */ | ||
140 | .calPierData2G = { | ||
141 | { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} }, | ||
142 | { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} }, | ||
143 | { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} }, | ||
144 | }, | ||
145 | .calTarget_freqbin_Cck = { | ||
146 | FREQ2FBIN(2412, 1), | ||
147 | FREQ2FBIN(2484, 1), | ||
148 | }, | ||
149 | .calTarget_freqbin_2G = { | ||
150 | FREQ2FBIN(2412, 1), | ||
151 | FREQ2FBIN(2437, 1), | ||
152 | FREQ2FBIN(2472, 1) | ||
153 | }, | ||
154 | .calTarget_freqbin_2GHT20 = { | ||
155 | FREQ2FBIN(2412, 1), | ||
156 | FREQ2FBIN(2437, 1), | ||
157 | FREQ2FBIN(2472, 1) | ||
158 | }, | ||
159 | .calTarget_freqbin_2GHT40 = { | ||
160 | FREQ2FBIN(2412, 1), | ||
161 | FREQ2FBIN(2437, 1), | ||
162 | FREQ2FBIN(2472, 1) | ||
163 | }, | ||
164 | .calTargetPowerCck = { | ||
165 | /* 1L-5L,5S,11L,11S */ | ||
166 | { {36, 36, 36, 36} }, | ||
167 | { {36, 36, 36, 36} }, | ||
168 | }, | ||
169 | .calTargetPower2G = { | ||
170 | /* 6-24,36,48,54 */ | ||
171 | { {32, 32, 28, 24} }, | ||
172 | { {32, 32, 28, 24} }, | ||
173 | { {32, 32, 28, 24} }, | ||
174 | }, | ||
175 | .calTargetPower2GHT20 = { | ||
176 | { {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} }, | ||
177 | { {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} }, | ||
178 | { {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} }, | ||
179 | }, | ||
180 | .calTargetPower2GHT40 = { | ||
181 | { {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} }, | ||
182 | { {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} }, | ||
183 | { {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} }, | ||
184 | }, | ||
185 | .ctlIndex_2G = { | ||
186 | 0x11, 0x12, 0x15, 0x17, 0x41, 0x42, | ||
187 | 0x45, 0x47, 0x31, 0x32, 0x35, 0x37, | ||
188 | }, | ||
189 | .ctl_freqbin_2G = { | ||
190 | { | ||
191 | FREQ2FBIN(2412, 1), | ||
192 | FREQ2FBIN(2417, 1), | ||
193 | FREQ2FBIN(2457, 1), | ||
194 | FREQ2FBIN(2462, 1) | ||
195 | }, | ||
196 | { | ||
197 | FREQ2FBIN(2412, 1), | ||
198 | FREQ2FBIN(2417, 1), | ||
199 | FREQ2FBIN(2462, 1), | ||
200 | 0xFF, | ||
201 | }, | ||
202 | |||
203 | { | ||
204 | FREQ2FBIN(2412, 1), | ||
205 | FREQ2FBIN(2417, 1), | ||
206 | FREQ2FBIN(2462, 1), | ||
207 | 0xFF, | ||
208 | }, | ||
209 | { | ||
210 | FREQ2FBIN(2422, 1), | ||
211 | FREQ2FBIN(2427, 1), | ||
212 | FREQ2FBIN(2447, 1), | ||
213 | FREQ2FBIN(2452, 1) | ||
214 | }, | ||
215 | |||
216 | { | ||
217 | /* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1), | ||
218 | /* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1), | ||
219 | /* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1), | ||
220 | /* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(2484, 1), | ||
221 | }, | ||
222 | |||
223 | { | ||
224 | /* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1), | ||
225 | /* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1), | ||
226 | /* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1), | ||
227 | 0, | ||
228 | }, | ||
229 | |||
230 | { | ||
231 | /* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1), | ||
232 | /* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1), | ||
233 | FREQ2FBIN(2472, 1), | ||
234 | 0, | ||
235 | }, | ||
236 | |||
237 | { | ||
238 | /* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1), | ||
239 | /* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1), | ||
240 | /* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1), | ||
241 | /* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1), | ||
242 | }, | ||
243 | |||
244 | { | ||
245 | /* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1), | ||
246 | /* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1), | ||
247 | /* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1), | ||
248 | }, | ||
249 | |||
250 | { | ||
251 | /* Data[9].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1), | ||
252 | /* Data[9].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1), | ||
253 | /* Data[9].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1), | ||
254 | 0 | ||
255 | }, | ||
256 | |||
257 | { | ||
258 | /* Data[10].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1), | ||
259 | /* Data[10].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1), | ||
260 | /* Data[10].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1), | ||
261 | 0 | ||
262 | }, | ||
263 | |||
264 | { | ||
265 | /* Data[11].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1), | ||
266 | /* Data[11].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1), | ||
267 | /* Data[11].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1), | ||
268 | /* Data[11].ctlEdges[3].bChannel */ | ||
269 | FREQ2FBIN(2462, 1), | ||
270 | } | ||
271 | }, | ||
272 | .ctlPowerData_2G = { | ||
273 | { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, | ||
274 | { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, | ||
275 | { { {60, 1}, {60, 0}, {60, 0}, {60, 1} } }, | ||
276 | |||
277 | { { {60, 1}, {60, 0}, {0, 0}, {0, 0} } }, | ||
278 | { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, | ||
279 | { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, | ||
280 | |||
281 | { { {60, 0}, {60, 1}, {60, 1}, {60, 0} } }, | ||
282 | { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, | ||
283 | { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, | ||
284 | |||
285 | { { {60, 0}, {60, 1}, {60, 0}, {60, 0} } }, | ||
286 | { { {60, 0}, {60, 1}, {60, 1}, {60, 1} } }, | ||
287 | }, | ||
288 | .modalHeader5G = { | ||
289 | /* 4 idle,t1,t2,b (4 bits per setting) */ | ||
290 | .antCtrlCommon = 0x110, | ||
291 | /* 4 ra1l1, ra2l1, ra1l2,ra2l2,ra12 */ | ||
292 | .antCtrlCommon2 = 0x22222, | ||
293 | /* antCtrlChain 6 idle, t,r,rx1,rx12,b (2 bits each) */ | ||
294 | .antCtrlChain = { | ||
295 | 0x000, 0x000, 0x000, | ||
296 | }, | ||
297 | /* xatten1DB 3 xatten1_db for AR9280 (0xa20c/b20c 5:0) */ | ||
298 | .xatten1DB = {0, 0, 0}, | ||
299 | |||
300 | /* | ||
301 | * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin | ||
302 | * for merlin (0xa20c/b20c 16:12 | ||
303 | */ | ||
304 | .xatten1Margin = {0, 0, 0}, | ||
305 | .tempSlope = 68, | ||
306 | .voltSlope = 0, | ||
307 | /* spurChans spur channels in usual fbin coding format */ | ||
308 | .spurChans = {0, 0, 0, 0, 0}, | ||
309 | /* noiseFloorThreshCh Check if the register is per chain */ | ||
310 | .noiseFloorThreshCh = {-1, 0, 0}, | ||
311 | .ob = {3, 3, 3}, /* 3 chain */ | ||
312 | .db_stage2 = {3, 3, 3}, /* 3 chain */ | ||
313 | .db_stage3 = {3, 3, 3}, /* doesn't exist for 2G */ | ||
314 | .db_stage4 = {3, 3, 3}, /* don't exist for 2G */ | ||
315 | .xpaBiasLvl = 0, | ||
316 | .txFrameToDataStart = 0x0e, | ||
317 | .txFrameToPaOn = 0x0e, | ||
318 | .txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */ | ||
319 | .antennaGain = 0, | ||
320 | .switchSettling = 0x2d, | ||
321 | .adcDesiredSize = -30, | ||
322 | .txEndToXpaOff = 0, | ||
323 | .txEndToRxOn = 0x2, | ||
324 | .txFrameToXpaOn = 0xe, | ||
325 | .thresh62 = 28, | ||
326 | .futureModal = { | ||
327 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, | ||
328 | 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0 | ||
329 | }, | ||
330 | }, | ||
331 | .calFreqPier5G = { | ||
332 | FREQ2FBIN(5180, 0), | ||
333 | FREQ2FBIN(5220, 0), | ||
334 | FREQ2FBIN(5320, 0), | ||
335 | FREQ2FBIN(5400, 0), | ||
336 | FREQ2FBIN(5500, 0), | ||
337 | FREQ2FBIN(5600, 0), | ||
338 | FREQ2FBIN(5725, 0), | ||
339 | FREQ2FBIN(5825, 0) | ||
340 | }, | ||
341 | .calPierData5G = { | ||
342 | { | ||
343 | {0, 0, 0, 0, 0}, | ||
344 | {0, 0, 0, 0, 0}, | ||
345 | {0, 0, 0, 0, 0}, | ||
346 | {0, 0, 0, 0, 0}, | ||
347 | {0, 0, 0, 0, 0}, | ||
348 | {0, 0, 0, 0, 0}, | ||
349 | {0, 0, 0, 0, 0}, | ||
350 | {0, 0, 0, 0, 0}, | ||
351 | }, | ||
352 | { | ||
353 | {0, 0, 0, 0, 0}, | ||
354 | {0, 0, 0, 0, 0}, | ||
355 | {0, 0, 0, 0, 0}, | ||
356 | {0, 0, 0, 0, 0}, | ||
357 | {0, 0, 0, 0, 0}, | ||
358 | {0, 0, 0, 0, 0}, | ||
359 | {0, 0, 0, 0, 0}, | ||
360 | {0, 0, 0, 0, 0}, | ||
361 | }, | ||
362 | { | ||
363 | {0, 0, 0, 0, 0}, | ||
364 | {0, 0, 0, 0, 0}, | ||
365 | {0, 0, 0, 0, 0}, | ||
366 | {0, 0, 0, 0, 0}, | ||
367 | {0, 0, 0, 0, 0}, | ||
368 | {0, 0, 0, 0, 0}, | ||
369 | {0, 0, 0, 0, 0}, | ||
370 | {0, 0, 0, 0, 0}, | ||
371 | }, | ||
372 | |||
373 | }, | ||
374 | .calTarget_freqbin_5G = { | ||
375 | FREQ2FBIN(5180, 0), | ||
376 | FREQ2FBIN(5220, 0), | ||
377 | FREQ2FBIN(5320, 0), | ||
378 | FREQ2FBIN(5400, 0), | ||
379 | FREQ2FBIN(5500, 0), | ||
380 | FREQ2FBIN(5600, 0), | ||
381 | FREQ2FBIN(5725, 0), | ||
382 | FREQ2FBIN(5825, 0) | ||
383 | }, | ||
384 | .calTarget_freqbin_5GHT20 = { | ||
385 | FREQ2FBIN(5180, 0), | ||
386 | FREQ2FBIN(5240, 0), | ||
387 | FREQ2FBIN(5320, 0), | ||
388 | FREQ2FBIN(5500, 0), | ||
389 | FREQ2FBIN(5700, 0), | ||
390 | FREQ2FBIN(5745, 0), | ||
391 | FREQ2FBIN(5725, 0), | ||
392 | FREQ2FBIN(5825, 0) | ||
393 | }, | ||
394 | .calTarget_freqbin_5GHT40 = { | ||
395 | FREQ2FBIN(5180, 0), | ||
396 | FREQ2FBIN(5240, 0), | ||
397 | FREQ2FBIN(5320, 0), | ||
398 | FREQ2FBIN(5500, 0), | ||
399 | FREQ2FBIN(5700, 0), | ||
400 | FREQ2FBIN(5745, 0), | ||
401 | FREQ2FBIN(5725, 0), | ||
402 | FREQ2FBIN(5825, 0) | ||
403 | }, | ||
404 | .calTargetPower5G = { | ||
405 | /* 6-24,36,48,54 */ | ||
406 | { {20, 20, 20, 10} }, | ||
407 | { {20, 20, 20, 10} }, | ||
408 | { {20, 20, 20, 10} }, | ||
409 | { {20, 20, 20, 10} }, | ||
410 | { {20, 20, 20, 10} }, | ||
411 | { {20, 20, 20, 10} }, | ||
412 | { {20, 20, 20, 10} }, | ||
413 | { {20, 20, 20, 10} }, | ||
414 | }, | ||
415 | .calTargetPower5GHT20 = { | ||
416 | /* | ||
417 | * 0_8_16,1-3_9-11_17-19, | ||
418 | * 4,5,6,7,12,13,14,15,20,21,22,23 | ||
419 | */ | ||
420 | { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} }, | ||
421 | { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} }, | ||
422 | { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} }, | ||
423 | { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} }, | ||
424 | { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} }, | ||
425 | { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} }, | ||
426 | { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} }, | ||
427 | { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} }, | ||
428 | }, | ||
429 | .calTargetPower5GHT40 = { | ||
430 | /* | ||
431 | * 0_8_16,1-3_9-11_17-19, | ||
432 | * 4,5,6,7,12,13,14,15,20,21,22,23 | ||
433 | */ | ||
434 | { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} }, | ||
435 | { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} }, | ||
436 | { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} }, | ||
437 | { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} }, | ||
438 | { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} }, | ||
439 | { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} }, | ||
440 | { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} }, | ||
441 | { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} }, | ||
442 | }, | ||
443 | .ctlIndex_5G = { | ||
444 | 0x10, 0x16, 0x18, 0x40, 0x46, | ||
445 | 0x48, 0x30, 0x36, 0x38 | ||
446 | }, | ||
447 | .ctl_freqbin_5G = { | ||
448 | { | ||
449 | /* Data[0].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0), | ||
450 | /* Data[0].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0), | ||
451 | /* Data[0].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0), | ||
452 | /* Data[0].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0), | ||
453 | /* Data[0].ctlEdges[4].bChannel */ FREQ2FBIN(5600, 0), | ||
454 | /* Data[0].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0), | ||
455 | /* Data[0].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0), | ||
456 | /* Data[0].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0) | ||
457 | }, | ||
458 | { | ||
459 | /* Data[1].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0), | ||
460 | /* Data[1].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0), | ||
461 | /* Data[1].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0), | ||
462 | /* Data[1].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0), | ||
463 | /* Data[1].ctlEdges[4].bChannel */ FREQ2FBIN(5520, 0), | ||
464 | /* Data[1].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0), | ||
465 | /* Data[1].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0), | ||
466 | /* Data[1].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0) | ||
467 | }, | ||
468 | |||
469 | { | ||
470 | /* Data[2].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0), | ||
471 | /* Data[2].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0), | ||
472 | /* Data[2].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0), | ||
473 | /* Data[2].ctlEdges[3].bChannel */ FREQ2FBIN(5310, 0), | ||
474 | /* Data[2].ctlEdges[4].bChannel */ FREQ2FBIN(5510, 0), | ||
475 | /* Data[2].ctlEdges[5].bChannel */ FREQ2FBIN(5550, 0), | ||
476 | /* Data[2].ctlEdges[6].bChannel */ FREQ2FBIN(5670, 0), | ||
477 | /* Data[2].ctlEdges[7].bChannel */ FREQ2FBIN(5755, 0) | ||
478 | }, | ||
479 | |||
480 | { | ||
481 | /* Data[3].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0), | ||
482 | /* Data[3].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0), | ||
483 | /* Data[3].ctlEdges[2].bChannel */ FREQ2FBIN(5260, 0), | ||
484 | /* Data[3].ctlEdges[3].bChannel */ FREQ2FBIN(5320, 0), | ||
485 | /* Data[3].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0), | ||
486 | /* Data[3].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0), | ||
487 | /* Data[3].ctlEdges[6].bChannel */ 0xFF, | ||
488 | /* Data[3].ctlEdges[7].bChannel */ 0xFF, | ||
489 | }, | ||
490 | |||
491 | { | ||
492 | /* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0), | ||
493 | /* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0), | ||
494 | /* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(5500, 0), | ||
495 | /* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(5700, 0), | ||
496 | /* Data[4].ctlEdges[4].bChannel */ 0xFF, | ||
497 | /* Data[4].ctlEdges[5].bChannel */ 0xFF, | ||
498 | /* Data[4].ctlEdges[6].bChannel */ 0xFF, | ||
499 | /* Data[4].ctlEdges[7].bChannel */ 0xFF, | ||
500 | }, | ||
501 | |||
502 | { | ||
503 | /* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0), | ||
504 | /* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(5270, 0), | ||
505 | /* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(5310, 0), | ||
506 | /* Data[5].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0), | ||
507 | /* Data[5].ctlEdges[4].bChannel */ FREQ2FBIN(5590, 0), | ||
508 | /* Data[5].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0), | ||
509 | /* Data[5].ctlEdges[6].bChannel */ 0xFF, | ||
510 | /* Data[5].ctlEdges[7].bChannel */ 0xFF | ||
511 | }, | ||
512 | |||
513 | { | ||
514 | /* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0), | ||
515 | /* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0), | ||
516 | /* Data[6].ctlEdges[2].bChannel */ FREQ2FBIN(5220, 0), | ||
517 | /* Data[6].ctlEdges[3].bChannel */ FREQ2FBIN(5260, 0), | ||
518 | /* Data[6].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0), | ||
519 | /* Data[6].ctlEdges[5].bChannel */ FREQ2FBIN(5600, 0), | ||
520 | /* Data[6].ctlEdges[6].bChannel */ FREQ2FBIN(5700, 0), | ||
521 | /* Data[6].ctlEdges[7].bChannel */ FREQ2FBIN(5745, 0) | ||
522 | }, | ||
523 | |||
524 | { | ||
525 | /* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0), | ||
526 | /* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0), | ||
527 | /* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(5320, 0), | ||
528 | /* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0), | ||
529 | /* Data[7].ctlEdges[4].bChannel */ FREQ2FBIN(5560, 0), | ||
530 | /* Data[7].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0), | ||
531 | /* Data[7].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0), | ||
532 | /* Data[7].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0) | ||
533 | }, | ||
534 | |||
535 | { | ||
536 | /* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0), | ||
537 | /* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0), | ||
538 | /* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0), | ||
539 | /* Data[8].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0), | ||
540 | /* Data[8].ctlEdges[4].bChannel */ FREQ2FBIN(5550, 0), | ||
541 | /* Data[8].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0), | ||
542 | /* Data[8].ctlEdges[6].bChannel */ FREQ2FBIN(5755, 0), | ||
543 | /* Data[8].ctlEdges[7].bChannel */ FREQ2FBIN(5795, 0) | ||
544 | } | ||
545 | }, | ||
546 | .ctlPowerData_5G = { | ||
547 | { | ||
548 | { | ||
549 | {60, 1}, {60, 1}, {60, 1}, {60, 1}, | ||
550 | {60, 1}, {60, 1}, {60, 1}, {60, 0}, | ||
551 | } | ||
552 | }, | ||
553 | { | ||
554 | { | ||
555 | {60, 1}, {60, 1}, {60, 1}, {60, 1}, | ||
556 | {60, 1}, {60, 1}, {60, 1}, {60, 0}, | ||
557 | } | ||
558 | }, | ||
559 | { | ||
560 | { | ||
561 | {60, 0}, {60, 1}, {60, 0}, {60, 1}, | ||
562 | {60, 1}, {60, 1}, {60, 1}, {60, 1}, | ||
563 | } | ||
564 | }, | ||
565 | { | ||
566 | { | ||
567 | {60, 0}, {60, 1}, {60, 1}, {60, 0}, | ||
568 | {60, 1}, {60, 0}, {60, 0}, {60, 0}, | ||
569 | } | ||
570 | }, | ||
571 | { | ||
572 | { | ||
573 | {60, 1}, {60, 1}, {60, 1}, {60, 0}, | ||
574 | {60, 0}, {60, 0}, {60, 0}, {60, 0}, | ||
575 | } | ||
576 | }, | ||
577 | { | ||
578 | { | ||
579 | {60, 1}, {60, 1}, {60, 1}, {60, 1}, | ||
580 | {60, 1}, {60, 0}, {60, 0}, {60, 0}, | ||
581 | } | ||
582 | }, | ||
583 | { | ||
584 | { | ||
585 | {60, 1}, {60, 1}, {60, 1}, {60, 1}, | ||
586 | {60, 1}, {60, 1}, {60, 1}, {60, 1}, | ||
587 | } | ||
588 | }, | ||
589 | { | ||
590 | { | ||
591 | {60, 1}, {60, 1}, {60, 0}, {60, 1}, | ||
592 | {60, 1}, {60, 1}, {60, 1}, {60, 0}, | ||
593 | } | ||
594 | }, | ||
595 | { | ||
596 | { | ||
597 | {60, 1}, {60, 0}, {60, 1}, {60, 1}, | ||
598 | {60, 1}, {60, 1}, {60, 0}, {60, 1}, | ||
599 | } | ||
600 | }, | ||
601 | } | ||
602 | }; | ||
603 | |||
604 | static int ath9k_hw_ar9300_check_eeprom(struct ath_hw *ah) | ||
605 | { | ||
606 | return 0; | ||
607 | } | ||
608 | |||
609 | static u32 ath9k_hw_ar9300_get_eeprom(struct ath_hw *ah, | ||
610 | enum eeprom_param param) | ||
611 | { | ||
612 | struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; | ||
613 | struct ar9300_base_eep_hdr *pBase = &eep->baseEepHeader; | ||
614 | |||
615 | switch (param) { | ||
616 | case EEP_MAC_LSW: | ||
617 | return eep->macAddr[0] << 8 | eep->macAddr[1]; | ||
618 | case EEP_MAC_MID: | ||
619 | return eep->macAddr[2] << 8 | eep->macAddr[3]; | ||
620 | case EEP_MAC_MSW: | ||
621 | return eep->macAddr[4] << 8 | eep->macAddr[5]; | ||
622 | case EEP_REG_0: | ||
623 | return pBase->regDmn[0]; | ||
624 | case EEP_REG_1: | ||
625 | return pBase->regDmn[1]; | ||
626 | case EEP_OP_CAP: | ||
627 | return pBase->deviceCap; | ||
628 | case EEP_OP_MODE: | ||
629 | return pBase->opCapFlags.opFlags; | ||
630 | case EEP_RF_SILENT: | ||
631 | return pBase->rfSilent; | ||
632 | case EEP_TX_MASK: | ||
633 | return (pBase->txrxMask >> 4) & 0xf; | ||
634 | case EEP_RX_MASK: | ||
635 | return pBase->txrxMask & 0xf; | ||
636 | case EEP_DRIVE_STRENGTH: | ||
637 | #define AR9300_EEP_BASE_DRIV_STRENGTH 0x1 | ||
638 | return pBase->miscConfiguration & AR9300_EEP_BASE_DRIV_STRENGTH; | ||
639 | case EEP_INTERNAL_REGULATOR: | ||
640 | /* Bit 4 is internal regulator flag */ | ||
641 | return (pBase->featureEnable & 0x10) >> 4; | ||
642 | case EEP_SWREG: | ||
643 | return pBase->swreg; | ||
644 | default: | ||
645 | return 0; | ||
646 | } | ||
647 | } | ||
648 | |||
649 | #ifdef __BIG_ENDIAN | ||
650 | static void ar9300_swap_eeprom(struct ar9300_eeprom *eep) | ||
651 | { | ||
652 | u32 dword; | ||
653 | u16 word; | ||
654 | int i; | ||
655 | |||
656 | word = swab16(eep->baseEepHeader.regDmn[0]); | ||
657 | eep->baseEepHeader.regDmn[0] = word; | ||
658 | |||
659 | word = swab16(eep->baseEepHeader.regDmn[1]); | ||
660 | eep->baseEepHeader.regDmn[1] = word; | ||
661 | |||
662 | dword = swab32(eep->modalHeader2G.antCtrlCommon); | ||
663 | eep->modalHeader2G.antCtrlCommon = dword; | ||
664 | |||
665 | dword = swab32(eep->modalHeader2G.antCtrlCommon2); | ||
666 | eep->modalHeader2G.antCtrlCommon2 = dword; | ||
667 | |||
668 | dword = swab32(eep->modalHeader5G.antCtrlCommon); | ||
669 | eep->modalHeader5G.antCtrlCommon = dword; | ||
670 | |||
671 | dword = swab32(eep->modalHeader5G.antCtrlCommon2); | ||
672 | eep->modalHeader5G.antCtrlCommon2 = dword; | ||
673 | |||
674 | for (i = 0; i < AR9300_MAX_CHAINS; i++) { | ||
675 | word = swab16(eep->modalHeader2G.antCtrlChain[i]); | ||
676 | eep->modalHeader2G.antCtrlChain[i] = word; | ||
677 | |||
678 | word = swab16(eep->modalHeader5G.antCtrlChain[i]); | ||
679 | eep->modalHeader5G.antCtrlChain[i] = word; | ||
680 | } | ||
681 | } | ||
682 | #endif | ||
683 | |||
684 | static bool ar9300_hw_read_eeprom(struct ath_hw *ah, | ||
685 | long address, u8 *buffer, int many) | ||
686 | { | ||
687 | int i; | ||
688 | u8 value[2]; | ||
689 | unsigned long eepAddr; | ||
690 | unsigned long byteAddr; | ||
691 | u16 *svalue; | ||
692 | struct ath_common *common = ath9k_hw_common(ah); | ||
693 | |||
694 | if ((address < 0) || ((address + many) > AR9300_EEPROM_SIZE - 1)) { | ||
695 | ath_print(common, ATH_DBG_EEPROM, | ||
696 | "eeprom address not in range\n"); | ||
697 | return false; | ||
698 | } | ||
699 | |||
700 | for (i = 0; i < many; i++) { | ||
701 | eepAddr = (u16) (address + i) / 2; | ||
702 | byteAddr = (u16) (address + i) % 2; | ||
703 | svalue = (u16 *) value; | ||
704 | if (!ath9k_hw_nvram_read(common, eepAddr, svalue)) { | ||
705 | ath_print(common, ATH_DBG_EEPROM, | ||
706 | "unable to read eeprom region\n"); | ||
707 | return false; | ||
708 | } | ||
709 | *svalue = le16_to_cpu(*svalue); | ||
710 | buffer[i] = value[byteAddr]; | ||
711 | } | ||
712 | |||
713 | return true; | ||
714 | } | ||
715 | |||
716 | static bool ar9300_read_eeprom(struct ath_hw *ah, | ||
717 | int address, u8 *buffer, int many) | ||
718 | { | ||
719 | int it; | ||
720 | |||
721 | for (it = 0; it < many; it++) | ||
722 | if (!ar9300_hw_read_eeprom(ah, | ||
723 | (address - it), | ||
724 | (buffer + it), 1)) | ||
725 | return false; | ||
726 | return true; | ||
727 | } | ||
728 | |||
729 | static void ar9300_comp_hdr_unpack(u8 *best, int *code, int *reference, | ||
730 | int *length, int *major, int *minor) | ||
731 | { | ||
732 | unsigned long value[4]; | ||
733 | |||
734 | value[0] = best[0]; | ||
735 | value[1] = best[1]; | ||
736 | value[2] = best[2]; | ||
737 | value[3] = best[3]; | ||
738 | *code = ((value[0] >> 5) & 0x0007); | ||
739 | *reference = (value[0] & 0x001f) | ((value[1] >> 2) & 0x0020); | ||
740 | *length = ((value[1] << 4) & 0x07f0) | ((value[2] >> 4) & 0x000f); | ||
741 | *major = (value[2] & 0x000f); | ||
742 | *minor = (value[3] & 0x00ff); | ||
743 | } | ||
744 | |||
745 | static u16 ar9300_comp_cksum(u8 *data, int dsize) | ||
746 | { | ||
747 | int it, checksum = 0; | ||
748 | |||
749 | for (it = 0; it < dsize; it++) { | ||
750 | checksum += data[it]; | ||
751 | checksum &= 0xffff; | ||
752 | } | ||
753 | |||
754 | return checksum; | ||
755 | } | ||
756 | |||
757 | static bool ar9300_uncompress_block(struct ath_hw *ah, | ||
758 | u8 *mptr, | ||
759 | int mdataSize, | ||
760 | u8 *block, | ||
761 | int size) | ||
762 | { | ||
763 | int it; | ||
764 | int spot; | ||
765 | int offset; | ||
766 | int length; | ||
767 | struct ath_common *common = ath9k_hw_common(ah); | ||
768 | |||
769 | spot = 0; | ||
770 | |||
771 | for (it = 0; it < size; it += (length+2)) { | ||
772 | offset = block[it]; | ||
773 | offset &= 0xff; | ||
774 | spot += offset; | ||
775 | length = block[it+1]; | ||
776 | length &= 0xff; | ||
777 | |||
778 | if (length > 0 && spot >= 0 && spot+length < mdataSize) { | ||
779 | ath_print(common, ATH_DBG_EEPROM, | ||
780 | "Restore at %d: spot=%d " | ||
781 | "offset=%d length=%d\n", | ||
782 | it, spot, offset, length); | ||
783 | memcpy(&mptr[spot], &block[it+2], length); | ||
784 | spot += length; | ||
785 | } else if (length > 0) { | ||
786 | ath_print(common, ATH_DBG_EEPROM, | ||
787 | "Bad restore at %d: spot=%d " | ||
788 | "offset=%d length=%d\n", | ||
789 | it, spot, offset, length); | ||
790 | return false; | ||
791 | } | ||
792 | } | ||
793 | return true; | ||
794 | } | ||
795 | |||
796 | static int ar9300_compress_decision(struct ath_hw *ah, | ||
797 | int it, | ||
798 | int code, | ||
799 | int reference, | ||
800 | u8 *mptr, | ||
801 | u8 *word, int length, int mdata_size) | ||
802 | { | ||
803 | struct ath_common *common = ath9k_hw_common(ah); | ||
804 | u8 *dptr; | ||
805 | |||
806 | switch (code) { | ||
807 | case _CompressNone: | ||
808 | if (length != mdata_size) { | ||
809 | ath_print(common, ATH_DBG_EEPROM, | ||
810 | "EEPROM structure size mismatch" | ||
811 | "memory=%d eeprom=%d\n", mdata_size, length); | ||
812 | return -1; | ||
813 | } | ||
814 | memcpy(mptr, (u8 *) (word + COMP_HDR_LEN), length); | ||
815 | ath_print(common, ATH_DBG_EEPROM, "restored eeprom %d:" | ||
816 | " uncompressed, length %d\n", it, length); | ||
817 | break; | ||
818 | case _CompressBlock: | ||
819 | if (reference == 0) { | ||
820 | dptr = mptr; | ||
821 | } else { | ||
822 | if (reference != 2) { | ||
823 | ath_print(common, ATH_DBG_EEPROM, | ||
824 | "cant find reference eeprom" | ||
825 | "struct %d\n", reference); | ||
826 | return -1; | ||
827 | } | ||
828 | memcpy(mptr, &ar9300_default, mdata_size); | ||
829 | } | ||
830 | ath_print(common, ATH_DBG_EEPROM, | ||
831 | "restore eeprom %d: block, reference %d," | ||
832 | " length %d\n", it, reference, length); | ||
833 | ar9300_uncompress_block(ah, mptr, mdata_size, | ||
834 | (u8 *) (word + COMP_HDR_LEN), length); | ||
835 | break; | ||
836 | default: | ||
837 | ath_print(common, ATH_DBG_EEPROM, "unknown compression" | ||
838 | " code %d\n", code); | ||
839 | return -1; | ||
840 | } | ||
841 | return 0; | ||
842 | } | ||
843 | |||
844 | /* | ||
845 | * Read the configuration data from the eeprom. | ||
846 | * The data can be put in any specified memory buffer. | ||
847 | * | ||
848 | * Returns -1 on error. | ||
849 | * Returns address of next memory location on success. | ||
850 | */ | ||
851 | static int ar9300_eeprom_restore_internal(struct ath_hw *ah, | ||
852 | u8 *mptr, int mdata_size) | ||
853 | { | ||
854 | #define MDEFAULT 15 | ||
855 | #define MSTATE 100 | ||
856 | int cptr; | ||
857 | u8 *word; | ||
858 | int code; | ||
859 | int reference, length, major, minor; | ||
860 | int osize; | ||
861 | int it; | ||
862 | u16 checksum, mchecksum; | ||
863 | struct ath_common *common = ath9k_hw_common(ah); | ||
864 | |||
865 | word = kzalloc(2048, GFP_KERNEL); | ||
866 | if (!word) | ||
867 | return -1; | ||
868 | |||
869 | memcpy(mptr, &ar9300_default, mdata_size); | ||
870 | |||
871 | cptr = AR9300_BASE_ADDR; | ||
872 | for (it = 0; it < MSTATE; it++) { | ||
873 | if (!ar9300_read_eeprom(ah, cptr, word, COMP_HDR_LEN)) | ||
874 | goto fail; | ||
875 | |||
876 | if ((word[0] == 0 && word[1] == 0 && word[2] == 0 && | ||
877 | word[3] == 0) || (word[0] == 0xff && word[1] == 0xff | ||
878 | && word[2] == 0xff && word[3] == 0xff)) | ||
879 | break; | ||
880 | |||
881 | ar9300_comp_hdr_unpack(word, &code, &reference, | ||
882 | &length, &major, &minor); | ||
883 | ath_print(common, ATH_DBG_EEPROM, | ||
884 | "Found block at %x: code=%d ref=%d" | ||
885 | "length=%d major=%d minor=%d\n", cptr, code, | ||
886 | reference, length, major, minor); | ||
887 | if (length >= 1024) { | ||
888 | ath_print(common, ATH_DBG_EEPROM, | ||
889 | "Skipping bad header\n"); | ||
890 | cptr -= COMP_HDR_LEN; | ||
891 | continue; | ||
892 | } | ||
893 | |||
894 | osize = length; | ||
895 | ar9300_read_eeprom(ah, cptr, word, | ||
896 | COMP_HDR_LEN + osize + COMP_CKSUM_LEN); | ||
897 | checksum = ar9300_comp_cksum(&word[COMP_HDR_LEN], length); | ||
898 | mchecksum = word[COMP_HDR_LEN + osize] | | ||
899 | (word[COMP_HDR_LEN + osize + 1] << 8); | ||
900 | ath_print(common, ATH_DBG_EEPROM, | ||
901 | "checksum %x %x\n", checksum, mchecksum); | ||
902 | if (checksum == mchecksum) { | ||
903 | ar9300_compress_decision(ah, it, code, reference, mptr, | ||
904 | word, length, mdata_size); | ||
905 | } else { | ||
906 | ath_print(common, ATH_DBG_EEPROM, | ||
907 | "skipping block with bad checksum\n"); | ||
908 | } | ||
909 | cptr -= (COMP_HDR_LEN + osize + COMP_CKSUM_LEN); | ||
910 | } | ||
911 | |||
912 | kfree(word); | ||
913 | return cptr; | ||
914 | |||
915 | fail: | ||
916 | kfree(word); | ||
917 | return -1; | ||
918 | } | ||
919 | |||
920 | /* | ||
921 | * Restore the configuration structure by reading the eeprom. | ||
922 | * This function destroys any existing in-memory structure | ||
923 | * content. | ||
924 | */ | ||
925 | static bool ath9k_hw_ar9300_fill_eeprom(struct ath_hw *ah) | ||
926 | { | ||
927 | u8 *mptr = NULL; | ||
928 | int mdata_size; | ||
929 | |||
930 | mptr = (u8 *) &ah->eeprom.ar9300_eep; | ||
931 | mdata_size = sizeof(struct ar9300_eeprom); | ||
932 | |||
933 | if (mptr && mdata_size > 0) { | ||
934 | /* At this point, mptr points to the eeprom data structure | ||
935 | * in it's "default" state. If this is big endian, swap the | ||
936 | * data structures back to "little endian" | ||
937 | */ | ||
938 | /* First swap, default to Little Endian */ | ||
939 | #ifdef __BIG_ENDIAN | ||
940 | ar9300_swap_eeprom((struct ar9300_eeprom *)mptr); | ||
941 | #endif | ||
942 | if (ar9300_eeprom_restore_internal(ah, mptr, mdata_size) >= 0) | ||
943 | return true; | ||
944 | |||
945 | /* Second Swap, back to Big Endian */ | ||
946 | #ifdef __BIG_ENDIAN | ||
947 | ar9300_swap_eeprom((struct ar9300_eeprom *)mptr); | ||
948 | #endif | ||
949 | } | ||
950 | return false; | ||
951 | } | ||
952 | |||
953 | /* XXX: review hardware docs */ | ||
954 | static int ath9k_hw_ar9300_get_eeprom_ver(struct ath_hw *ah) | ||
955 | { | ||
956 | return ah->eeprom.ar9300_eep.eepromVersion; | ||
957 | } | ||
958 | |||
959 | /* XXX: could be read from the eepromVersion, not sure yet */ | ||
960 | static int ath9k_hw_ar9300_get_eeprom_rev(struct ath_hw *ah) | ||
961 | { | ||
962 | return 0; | ||
963 | } | ||
964 | |||
965 | static u8 ath9k_hw_ar9300_get_num_ant_config(struct ath_hw *ah, | ||
966 | enum ieee80211_band freq_band) | ||
967 | { | ||
968 | return 1; | ||
969 | } | ||
970 | |||
971 | static u16 ath9k_hw_ar9300_get_eeprom_antenna_cfg(struct ath_hw *ah, | ||
972 | struct ath9k_channel *chan) | ||
973 | { | ||
974 | return -EINVAL; | ||
975 | } | ||
976 | |||
977 | static s32 ar9003_hw_xpa_bias_level_get(struct ath_hw *ah, bool is2ghz) | ||
978 | { | ||
979 | struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; | ||
980 | |||
981 | if (is2ghz) | ||
982 | return eep->modalHeader2G.xpaBiasLvl; | ||
983 | else | ||
984 | return eep->modalHeader5G.xpaBiasLvl; | ||
985 | } | ||
986 | |||
987 | static void ar9003_hw_xpa_bias_level_apply(struct ath_hw *ah, bool is2ghz) | ||
988 | { | ||
989 | int bias = ar9003_hw_xpa_bias_level_get(ah, is2ghz); | ||
990 | REG_RMW_FIELD(ah, AR_CH0_TOP, AR_CH0_TOP_XPABIASLVL, (bias & 0x3)); | ||
991 | REG_RMW_FIELD(ah, AR_CH0_THERM, AR_CH0_THERM_SPARE, | ||
992 | ((bias >> 2) & 0x3)); | ||
993 | } | ||
994 | |||
995 | static u32 ar9003_hw_ant_ctrl_common_get(struct ath_hw *ah, bool is2ghz) | ||
996 | { | ||
997 | struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; | ||
998 | |||
999 | if (is2ghz) | ||
1000 | return eep->modalHeader2G.antCtrlCommon; | ||
1001 | else | ||
1002 | return eep->modalHeader5G.antCtrlCommon; | ||
1003 | } | ||
1004 | |||
1005 | static u32 ar9003_hw_ant_ctrl_common_2_get(struct ath_hw *ah, bool is2ghz) | ||
1006 | { | ||
1007 | struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; | ||
1008 | |||
1009 | if (is2ghz) | ||
1010 | return eep->modalHeader2G.antCtrlCommon2; | ||
1011 | else | ||
1012 | return eep->modalHeader5G.antCtrlCommon2; | ||
1013 | } | ||
1014 | |||
1015 | static u16 ar9003_hw_ant_ctrl_chain_get(struct ath_hw *ah, | ||
1016 | int chain, | ||
1017 | bool is2ghz) | ||
1018 | { | ||
1019 | struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; | ||
1020 | |||
1021 | if (chain >= 0 && chain < AR9300_MAX_CHAINS) { | ||
1022 | if (is2ghz) | ||
1023 | return eep->modalHeader2G.antCtrlChain[chain]; | ||
1024 | else | ||
1025 | return eep->modalHeader5G.antCtrlChain[chain]; | ||
1026 | } | ||
1027 | |||
1028 | return 0; | ||
1029 | } | ||
1030 | |||
1031 | static void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz) | ||
1032 | { | ||
1033 | u32 value = ar9003_hw_ant_ctrl_common_get(ah, is2ghz); | ||
1034 | REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM, AR_SWITCH_TABLE_COM_ALL, value); | ||
1035 | |||
1036 | value = ar9003_hw_ant_ctrl_common_2_get(ah, is2ghz); | ||
1037 | REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM_2, AR_SWITCH_TABLE_COM2_ALL, value); | ||
1038 | |||
1039 | value = ar9003_hw_ant_ctrl_chain_get(ah, 0, is2ghz); | ||
1040 | REG_RMW_FIELD(ah, AR_PHY_SWITCH_CHAIN_0, AR_SWITCH_TABLE_ALL, value); | ||
1041 | |||
1042 | value = ar9003_hw_ant_ctrl_chain_get(ah, 1, is2ghz); | ||
1043 | REG_RMW_FIELD(ah, AR_PHY_SWITCH_CHAIN_1, AR_SWITCH_TABLE_ALL, value); | ||
1044 | |||
1045 | value = ar9003_hw_ant_ctrl_chain_get(ah, 2, is2ghz); | ||
1046 | REG_RMW_FIELD(ah, AR_PHY_SWITCH_CHAIN_2, AR_SWITCH_TABLE_ALL, value); | ||
1047 | } | ||
1048 | |||
1049 | static void ar9003_hw_drive_strength_apply(struct ath_hw *ah) | ||
1050 | { | ||
1051 | int drive_strength; | ||
1052 | unsigned long reg; | ||
1053 | |||
1054 | drive_strength = ath9k_hw_ar9300_get_eeprom(ah, EEP_DRIVE_STRENGTH); | ||
1055 | |||
1056 | if (!drive_strength) | ||
1057 | return; | ||
1058 | |||
1059 | reg = REG_READ(ah, AR_PHY_65NM_CH0_BIAS1); | ||
1060 | reg &= ~0x00ffffc0; | ||
1061 | reg |= 0x5 << 21; | ||
1062 | reg |= 0x5 << 18; | ||
1063 | reg |= 0x5 << 15; | ||
1064 | reg |= 0x5 << 12; | ||
1065 | reg |= 0x5 << 9; | ||
1066 | reg |= 0x5 << 6; | ||
1067 | REG_WRITE(ah, AR_PHY_65NM_CH0_BIAS1, reg); | ||
1068 | |||
1069 | reg = REG_READ(ah, AR_PHY_65NM_CH0_BIAS2); | ||
1070 | reg &= ~0xffffffe0; | ||
1071 | reg |= 0x5 << 29; | ||
1072 | reg |= 0x5 << 26; | ||
1073 | reg |= 0x5 << 23; | ||
1074 | reg |= 0x5 << 20; | ||
1075 | reg |= 0x5 << 17; | ||
1076 | reg |= 0x5 << 14; | ||
1077 | reg |= 0x5 << 11; | ||
1078 | reg |= 0x5 << 8; | ||
1079 | reg |= 0x5 << 5; | ||
1080 | REG_WRITE(ah, AR_PHY_65NM_CH0_BIAS2, reg); | ||
1081 | |||
1082 | reg = REG_READ(ah, AR_PHY_65NM_CH0_BIAS4); | ||
1083 | reg &= ~0xff800000; | ||
1084 | reg |= 0x5 << 29; | ||
1085 | reg |= 0x5 << 26; | ||
1086 | reg |= 0x5 << 23; | ||
1087 | REG_WRITE(ah, AR_PHY_65NM_CH0_BIAS4, reg); | ||
1088 | } | ||
1089 | |||
1090 | static void ar9003_hw_internal_regulator_apply(struct ath_hw *ah) | ||
1091 | { | ||
1092 | int internal_regulator = | ||
1093 | ath9k_hw_ar9300_get_eeprom(ah, EEP_INTERNAL_REGULATOR); | ||
1094 | |||
1095 | if (internal_regulator) { | ||
1096 | /* Internal regulator is ON. Write swreg register. */ | ||
1097 | int swreg = ath9k_hw_ar9300_get_eeprom(ah, EEP_SWREG); | ||
1098 | REG_WRITE(ah, AR_RTC_REG_CONTROL1, | ||
1099 | REG_READ(ah, AR_RTC_REG_CONTROL1) & | ||
1100 | (~AR_RTC_REG_CONTROL1_SWREG_PROGRAM)); | ||
1101 | REG_WRITE(ah, AR_RTC_REG_CONTROL0, swreg); | ||
1102 | /* Set REG_CONTROL1.SWREG_PROGRAM */ | ||
1103 | REG_WRITE(ah, AR_RTC_REG_CONTROL1, | ||
1104 | REG_READ(ah, | ||
1105 | AR_RTC_REG_CONTROL1) | | ||
1106 | AR_RTC_REG_CONTROL1_SWREG_PROGRAM); | ||
1107 | } else { | ||
1108 | REG_WRITE(ah, AR_RTC_SLEEP_CLK, | ||
1109 | (REG_READ(ah, | ||
1110 | AR_RTC_SLEEP_CLK) | | ||
1111 | AR_RTC_FORCE_SWREG_PRD)); | ||
1112 | } | ||
1113 | } | ||
1114 | |||
1115 | static void ath9k_hw_ar9300_set_board_values(struct ath_hw *ah, | ||
1116 | struct ath9k_channel *chan) | ||
1117 | { | ||
1118 | ar9003_hw_xpa_bias_level_apply(ah, IS_CHAN_2GHZ(chan)); | ||
1119 | ar9003_hw_ant_ctrl_apply(ah, IS_CHAN_2GHZ(chan)); | ||
1120 | ar9003_hw_drive_strength_apply(ah); | ||
1121 | ar9003_hw_internal_regulator_apply(ah); | ||
1122 | } | ||
1123 | |||
1124 | static void ath9k_hw_ar9300_set_addac(struct ath_hw *ah, | ||
1125 | struct ath9k_channel *chan) | ||
1126 | { | ||
1127 | } | ||
1128 | |||
1129 | /* | ||
1130 | * Returns the interpolated y value corresponding to the specified x value | ||
1131 | * from the np ordered pairs of data (px,py). | ||
1132 | * The pairs do not have to be in any order. | ||
1133 | * If the specified x value is less than any of the px, | ||
1134 | * the returned y value is equal to the py for the lowest px. | ||
1135 | * If the specified x value is greater than any of the px, | ||
1136 | * the returned y value is equal to the py for the highest px. | ||
1137 | */ | ||
1138 | static int ar9003_hw_power_interpolate(int32_t x, | ||
1139 | int32_t *px, int32_t *py, u_int16_t np) | ||
1140 | { | ||
1141 | int ip = 0; | ||
1142 | int lx = 0, ly = 0, lhave = 0; | ||
1143 | int hx = 0, hy = 0, hhave = 0; | ||
1144 | int dx = 0; | ||
1145 | int y = 0; | ||
1146 | |||
1147 | lhave = 0; | ||
1148 | hhave = 0; | ||
1149 | |||
1150 | /* identify best lower and higher x calibration measurement */ | ||
1151 | for (ip = 0; ip < np; ip++) { | ||
1152 | dx = x - px[ip]; | ||
1153 | |||
1154 | /* this measurement is higher than our desired x */ | ||
1155 | if (dx <= 0) { | ||
1156 | if (!hhave || dx > (x - hx)) { | ||
1157 | /* new best higher x measurement */ | ||
1158 | hx = px[ip]; | ||
1159 | hy = py[ip]; | ||
1160 | hhave = 1; | ||
1161 | } | ||
1162 | } | ||
1163 | /* this measurement is lower than our desired x */ | ||
1164 | if (dx >= 0) { | ||
1165 | if (!lhave || dx < (x - lx)) { | ||
1166 | /* new best lower x measurement */ | ||
1167 | lx = px[ip]; | ||
1168 | ly = py[ip]; | ||
1169 | lhave = 1; | ||
1170 | } | ||
1171 | } | ||
1172 | } | ||
1173 | |||
1174 | /* the low x is good */ | ||
1175 | if (lhave) { | ||
1176 | /* so is the high x */ | ||
1177 | if (hhave) { | ||
1178 | /* they're the same, so just pick one */ | ||
1179 | if (hx == lx) | ||
1180 | y = ly; | ||
1181 | else /* interpolate */ | ||
1182 | y = ly + (((x - lx) * (hy - ly)) / (hx - lx)); | ||
1183 | } else /* only low is good, use it */ | ||
1184 | y = ly; | ||
1185 | } else if (hhave) /* only high is good, use it */ | ||
1186 | y = hy; | ||
1187 | else /* nothing is good,this should never happen unless np=0, ???? */ | ||
1188 | y = -(1 << 30); | ||
1189 | return y; | ||
1190 | } | ||
1191 | |||
1192 | static u8 ar9003_hw_eeprom_get_tgt_pwr(struct ath_hw *ah, | ||
1193 | u16 rateIndex, u16 freq, bool is2GHz) | ||
1194 | { | ||
1195 | u16 numPiers, i; | ||
1196 | s32 targetPowerArray[AR9300_NUM_5G_20_TARGET_POWERS]; | ||
1197 | s32 freqArray[AR9300_NUM_5G_20_TARGET_POWERS]; | ||
1198 | struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; | ||
1199 | struct cal_tgt_pow_legacy *pEepromTargetPwr; | ||
1200 | u8 *pFreqBin; | ||
1201 | |||
1202 | if (is2GHz) { | ||
1203 | numPiers = AR9300_NUM_5G_20_TARGET_POWERS; | ||
1204 | pEepromTargetPwr = eep->calTargetPower2G; | ||
1205 | pFreqBin = eep->calTarget_freqbin_2G; | ||
1206 | } else { | ||
1207 | numPiers = AR9300_NUM_5G_20_TARGET_POWERS; | ||
1208 | pEepromTargetPwr = eep->calTargetPower5G; | ||
1209 | pFreqBin = eep->calTarget_freqbin_5G; | ||
1210 | } | ||
1211 | |||
1212 | /* | ||
1213 | * create array of channels and targetpower from | ||
1214 | * targetpower piers stored on eeprom | ||
1215 | */ | ||
1216 | for (i = 0; i < numPiers; i++) { | ||
1217 | freqArray[i] = FBIN2FREQ(pFreqBin[i], is2GHz); | ||
1218 | targetPowerArray[i] = pEepromTargetPwr[i].tPow2x[rateIndex]; | ||
1219 | } | ||
1220 | |||
1221 | /* interpolate to get target power for given frequency */ | ||
1222 | return (u8) ar9003_hw_power_interpolate((s32) freq, | ||
1223 | freqArray, | ||
1224 | targetPowerArray, numPiers); | ||
1225 | } | ||
1226 | |||
1227 | static u8 ar9003_hw_eeprom_get_ht20_tgt_pwr(struct ath_hw *ah, | ||
1228 | u16 rateIndex, | ||
1229 | u16 freq, bool is2GHz) | ||
1230 | { | ||
1231 | u16 numPiers, i; | ||
1232 | s32 targetPowerArray[AR9300_NUM_5G_20_TARGET_POWERS]; | ||
1233 | s32 freqArray[AR9300_NUM_5G_20_TARGET_POWERS]; | ||
1234 | struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; | ||
1235 | struct cal_tgt_pow_ht *pEepromTargetPwr; | ||
1236 | u8 *pFreqBin; | ||
1237 | |||
1238 | if (is2GHz) { | ||
1239 | numPiers = AR9300_NUM_5G_20_TARGET_POWERS; | ||
1240 | pEepromTargetPwr = eep->calTargetPower2GHT20; | ||
1241 | pFreqBin = eep->calTarget_freqbin_2GHT20; | ||
1242 | } else { | ||
1243 | numPiers = AR9300_NUM_5G_20_TARGET_POWERS; | ||
1244 | pEepromTargetPwr = eep->calTargetPower5GHT20; | ||
1245 | pFreqBin = eep->calTarget_freqbin_5GHT20; | ||
1246 | } | ||
1247 | |||
1248 | /* | ||
1249 | * create array of channels and targetpower | ||
1250 | * from targetpower piers stored on eeprom | ||
1251 | */ | ||
1252 | for (i = 0; i < numPiers; i++) { | ||
1253 | freqArray[i] = FBIN2FREQ(pFreqBin[i], is2GHz); | ||
1254 | targetPowerArray[i] = pEepromTargetPwr[i].tPow2x[rateIndex]; | ||
1255 | } | ||
1256 | |||
1257 | /* interpolate to get target power for given frequency */ | ||
1258 | return (u8) ar9003_hw_power_interpolate((s32) freq, | ||
1259 | freqArray, | ||
1260 | targetPowerArray, numPiers); | ||
1261 | } | ||
1262 | |||
1263 | static u8 ar9003_hw_eeprom_get_ht40_tgt_pwr(struct ath_hw *ah, | ||
1264 | u16 rateIndex, | ||
1265 | u16 freq, bool is2GHz) | ||
1266 | { | ||
1267 | u16 numPiers, i; | ||
1268 | s32 targetPowerArray[AR9300_NUM_5G_40_TARGET_POWERS]; | ||
1269 | s32 freqArray[AR9300_NUM_5G_40_TARGET_POWERS]; | ||
1270 | struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; | ||
1271 | struct cal_tgt_pow_ht *pEepromTargetPwr; | ||
1272 | u8 *pFreqBin; | ||
1273 | |||
1274 | if (is2GHz) { | ||
1275 | numPiers = AR9300_NUM_2G_40_TARGET_POWERS; | ||
1276 | pEepromTargetPwr = eep->calTargetPower2GHT40; | ||
1277 | pFreqBin = eep->calTarget_freqbin_2GHT40; | ||
1278 | } else { | ||
1279 | numPiers = AR9300_NUM_5G_40_TARGET_POWERS; | ||
1280 | pEepromTargetPwr = eep->calTargetPower5GHT40; | ||
1281 | pFreqBin = eep->calTarget_freqbin_5GHT40; | ||
1282 | } | ||
1283 | |||
1284 | /* | ||
1285 | * create array of channels and targetpower from | ||
1286 | * targetpower piers stored on eeprom | ||
1287 | */ | ||
1288 | for (i = 0; i < numPiers; i++) { | ||
1289 | freqArray[i] = FBIN2FREQ(pFreqBin[i], is2GHz); | ||
1290 | targetPowerArray[i] = pEepromTargetPwr[i].tPow2x[rateIndex]; | ||
1291 | } | ||
1292 | |||
1293 | /* interpolate to get target power for given frequency */ | ||
1294 | return (u8) ar9003_hw_power_interpolate((s32) freq, | ||
1295 | freqArray, | ||
1296 | targetPowerArray, numPiers); | ||
1297 | } | ||
1298 | |||
1299 | static u8 ar9003_hw_eeprom_get_cck_tgt_pwr(struct ath_hw *ah, | ||
1300 | u16 rateIndex, u16 freq) | ||
1301 | { | ||
1302 | u16 numPiers = AR9300_NUM_2G_CCK_TARGET_POWERS, i; | ||
1303 | s32 targetPowerArray[AR9300_NUM_2G_CCK_TARGET_POWERS]; | ||
1304 | s32 freqArray[AR9300_NUM_2G_CCK_TARGET_POWERS]; | ||
1305 | struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; | ||
1306 | struct cal_tgt_pow_legacy *pEepromTargetPwr = eep->calTargetPowerCck; | ||
1307 | u8 *pFreqBin = eep->calTarget_freqbin_Cck; | ||
1308 | |||
1309 | /* | ||
1310 | * create array of channels and targetpower from | ||
1311 | * targetpower piers stored on eeprom | ||
1312 | */ | ||
1313 | for (i = 0; i < numPiers; i++) { | ||
1314 | freqArray[i] = FBIN2FREQ(pFreqBin[i], 1); | ||
1315 | targetPowerArray[i] = pEepromTargetPwr[i].tPow2x[rateIndex]; | ||
1316 | } | ||
1317 | |||
1318 | /* interpolate to get target power for given frequency */ | ||
1319 | return (u8) ar9003_hw_power_interpolate((s32) freq, | ||
1320 | freqArray, | ||
1321 | targetPowerArray, numPiers); | ||
1322 | } | ||
1323 | |||
1324 | /* Set tx power registers to array of values passed in */ | ||
1325 | static int ar9003_hw_tx_power_regwrite(struct ath_hw *ah, u8 * pPwrArray) | ||
1326 | { | ||
1327 | #define POW_SM(_r, _s) (((_r) & 0x3f) << (_s)) | ||
1328 | /* make sure forced gain is not set */ | ||
1329 | REG_WRITE(ah, 0xa458, 0); | ||
1330 | |||
1331 | /* Write the OFDM power per rate set */ | ||
1332 | |||
1333 | /* 6 (LSB), 9, 12, 18 (MSB) */ | ||
1334 | REG_WRITE(ah, 0xa3c0, | ||
1335 | POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 24) | | ||
1336 | POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 16) | | ||
1337 | POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 8) | | ||
1338 | POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 0)); | ||
1339 | |||
1340 | /* 24 (LSB), 36, 48, 54 (MSB) */ | ||
1341 | REG_WRITE(ah, 0xa3c4, | ||
1342 | POW_SM(pPwrArray[ALL_TARGET_LEGACY_54], 24) | | ||
1343 | POW_SM(pPwrArray[ALL_TARGET_LEGACY_48], 16) | | ||
1344 | POW_SM(pPwrArray[ALL_TARGET_LEGACY_36], 8) | | ||
1345 | POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 0)); | ||
1346 | |||
1347 | /* Write the CCK power per rate set */ | ||
1348 | |||
1349 | /* 1L (LSB), reserved, 2L, 2S (MSB) */ | ||
1350 | REG_WRITE(ah, 0xa3c8, | ||
1351 | POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 24) | | ||
1352 | POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 16) | | ||
1353 | /* POW_SM(txPowerTimes2, 8) | this is reserved for AR9003 */ | ||
1354 | POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 0)); | ||
1355 | |||
1356 | /* 5.5L (LSB), 5.5S, 11L, 11S (MSB) */ | ||
1357 | REG_WRITE(ah, 0xa3cc, | ||
1358 | POW_SM(pPwrArray[ALL_TARGET_LEGACY_11S], 24) | | ||
1359 | POW_SM(pPwrArray[ALL_TARGET_LEGACY_11L], 16) | | ||
1360 | POW_SM(pPwrArray[ALL_TARGET_LEGACY_5S], 8) | | ||
1361 | POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 0) | ||
1362 | ); | ||
1363 | |||
1364 | /* Write the HT20 power per rate set */ | ||
1365 | |||
1366 | /* 0/8/16 (LSB), 1-3/9-11/17-19, 4, 5 (MSB) */ | ||
1367 | REG_WRITE(ah, 0xa3d0, | ||
1368 | POW_SM(pPwrArray[ALL_TARGET_HT20_5], 24) | | ||
1369 | POW_SM(pPwrArray[ALL_TARGET_HT20_4], 16) | | ||
1370 | POW_SM(pPwrArray[ALL_TARGET_HT20_1_3_9_11_17_19], 8) | | ||
1371 | POW_SM(pPwrArray[ALL_TARGET_HT20_0_8_16], 0) | ||
1372 | ); | ||
1373 | |||
1374 | /* 6 (LSB), 7, 12, 13 (MSB) */ | ||
1375 | REG_WRITE(ah, 0xa3d4, | ||
1376 | POW_SM(pPwrArray[ALL_TARGET_HT20_13], 24) | | ||
1377 | POW_SM(pPwrArray[ALL_TARGET_HT20_12], 16) | | ||
1378 | POW_SM(pPwrArray[ALL_TARGET_HT20_7], 8) | | ||
1379 | POW_SM(pPwrArray[ALL_TARGET_HT20_6], 0) | ||
1380 | ); | ||
1381 | |||
1382 | /* 14 (LSB), 15, 20, 21 */ | ||
1383 | REG_WRITE(ah, 0xa3e4, | ||
1384 | POW_SM(pPwrArray[ALL_TARGET_HT20_21], 24) | | ||
1385 | POW_SM(pPwrArray[ALL_TARGET_HT20_20], 16) | | ||
1386 | POW_SM(pPwrArray[ALL_TARGET_HT20_15], 8) | | ||
1387 | POW_SM(pPwrArray[ALL_TARGET_HT20_14], 0) | ||
1388 | ); | ||
1389 | |||
1390 | /* Mixed HT20 and HT40 rates */ | ||
1391 | |||
1392 | /* HT20 22 (LSB), HT20 23, HT40 22, HT40 23 (MSB) */ | ||
1393 | REG_WRITE(ah, 0xa3e8, | ||
1394 | POW_SM(pPwrArray[ALL_TARGET_HT40_23], 24) | | ||
1395 | POW_SM(pPwrArray[ALL_TARGET_HT40_22], 16) | | ||
1396 | POW_SM(pPwrArray[ALL_TARGET_HT20_23], 8) | | ||
1397 | POW_SM(pPwrArray[ALL_TARGET_HT20_22], 0) | ||
1398 | ); | ||
1399 | |||
1400 | /* | ||
1401 | * Write the HT40 power per rate set | ||
1402 | * correct PAR difference between HT40 and HT20/LEGACY | ||
1403 | * 0/8/16 (LSB), 1-3/9-11/17-19, 4, 5 (MSB) | ||
1404 | */ | ||
1405 | REG_WRITE(ah, 0xa3d8, | ||
1406 | POW_SM(pPwrArray[ALL_TARGET_HT40_5], 24) | | ||
1407 | POW_SM(pPwrArray[ALL_TARGET_HT40_4], 16) | | ||
1408 | POW_SM(pPwrArray[ALL_TARGET_HT40_1_3_9_11_17_19], 8) | | ||
1409 | POW_SM(pPwrArray[ALL_TARGET_HT40_0_8_16], 0) | ||
1410 | ); | ||
1411 | |||
1412 | /* 6 (LSB), 7, 12, 13 (MSB) */ | ||
1413 | REG_WRITE(ah, 0xa3dc, | ||
1414 | POW_SM(pPwrArray[ALL_TARGET_HT40_13], 24) | | ||
1415 | POW_SM(pPwrArray[ALL_TARGET_HT40_12], 16) | | ||
1416 | POW_SM(pPwrArray[ALL_TARGET_HT40_7], 8) | | ||
1417 | POW_SM(pPwrArray[ALL_TARGET_HT40_6], 0) | ||
1418 | ); | ||
1419 | |||
1420 | /* 14 (LSB), 15, 20, 21 */ | ||
1421 | REG_WRITE(ah, 0xa3ec, | ||
1422 | POW_SM(pPwrArray[ALL_TARGET_HT40_21], 24) | | ||
1423 | POW_SM(pPwrArray[ALL_TARGET_HT40_20], 16) | | ||
1424 | POW_SM(pPwrArray[ALL_TARGET_HT40_15], 8) | | ||
1425 | POW_SM(pPwrArray[ALL_TARGET_HT40_14], 0) | ||
1426 | ); | ||
1427 | |||
1428 | return 0; | ||
1429 | #undef POW_SM | ||
1430 | } | ||
1431 | |||
1432 | static void ar9003_hw_set_target_power_eeprom(struct ath_hw *ah, u16 freq) | ||
1433 | { | ||
1434 | u8 targetPowerValT2[ar9300RateSize]; | ||
1435 | /* XXX: hard code for now, need to get from eeprom struct */ | ||
1436 | u8 ht40PowerIncForPdadc = 0; | ||
1437 | bool is2GHz = false; | ||
1438 | unsigned int i = 0; | ||
1439 | struct ath_common *common = ath9k_hw_common(ah); | ||
1440 | |||
1441 | if (freq < 4000) | ||
1442 | is2GHz = true; | ||
1443 | |||
1444 | targetPowerValT2[ALL_TARGET_LEGACY_6_24] = | ||
1445 | ar9003_hw_eeprom_get_tgt_pwr(ah, LEGACY_TARGET_RATE_6_24, freq, | ||
1446 | is2GHz); | ||
1447 | targetPowerValT2[ALL_TARGET_LEGACY_36] = | ||
1448 | ar9003_hw_eeprom_get_tgt_pwr(ah, LEGACY_TARGET_RATE_36, freq, | ||
1449 | is2GHz); | ||
1450 | targetPowerValT2[ALL_TARGET_LEGACY_48] = | ||
1451 | ar9003_hw_eeprom_get_tgt_pwr(ah, LEGACY_TARGET_RATE_48, freq, | ||
1452 | is2GHz); | ||
1453 | targetPowerValT2[ALL_TARGET_LEGACY_54] = | ||
1454 | ar9003_hw_eeprom_get_tgt_pwr(ah, LEGACY_TARGET_RATE_54, freq, | ||
1455 | is2GHz); | ||
1456 | targetPowerValT2[ALL_TARGET_LEGACY_1L_5L] = | ||
1457 | ar9003_hw_eeprom_get_cck_tgt_pwr(ah, LEGACY_TARGET_RATE_1L_5L, | ||
1458 | freq); | ||
1459 | targetPowerValT2[ALL_TARGET_LEGACY_5S] = | ||
1460 | ar9003_hw_eeprom_get_cck_tgt_pwr(ah, LEGACY_TARGET_RATE_5S, freq); | ||
1461 | targetPowerValT2[ALL_TARGET_LEGACY_11L] = | ||
1462 | ar9003_hw_eeprom_get_cck_tgt_pwr(ah, LEGACY_TARGET_RATE_11L, freq); | ||
1463 | targetPowerValT2[ALL_TARGET_LEGACY_11S] = | ||
1464 | ar9003_hw_eeprom_get_cck_tgt_pwr(ah, LEGACY_TARGET_RATE_11S, freq); | ||
1465 | targetPowerValT2[ALL_TARGET_HT20_0_8_16] = | ||
1466 | ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_0_8_16, freq, | ||
1467 | is2GHz); | ||
1468 | targetPowerValT2[ALL_TARGET_HT20_1_3_9_11_17_19] = | ||
1469 | ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_1_3_9_11_17_19, | ||
1470 | freq, is2GHz); | ||
1471 | targetPowerValT2[ALL_TARGET_HT20_4] = | ||
1472 | ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_4, freq, | ||
1473 | is2GHz); | ||
1474 | targetPowerValT2[ALL_TARGET_HT20_5] = | ||
1475 | ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_5, freq, | ||
1476 | is2GHz); | ||
1477 | targetPowerValT2[ALL_TARGET_HT20_6] = | ||
1478 | ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_6, freq, | ||
1479 | is2GHz); | ||
1480 | targetPowerValT2[ALL_TARGET_HT20_7] = | ||
1481 | ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_7, freq, | ||
1482 | is2GHz); | ||
1483 | targetPowerValT2[ALL_TARGET_HT20_12] = | ||
1484 | ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_12, freq, | ||
1485 | is2GHz); | ||
1486 | targetPowerValT2[ALL_TARGET_HT20_13] = | ||
1487 | ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_13, freq, | ||
1488 | is2GHz); | ||
1489 | targetPowerValT2[ALL_TARGET_HT20_14] = | ||
1490 | ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_14, freq, | ||
1491 | is2GHz); | ||
1492 | targetPowerValT2[ALL_TARGET_HT20_15] = | ||
1493 | ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_15, freq, | ||
1494 | is2GHz); | ||
1495 | targetPowerValT2[ALL_TARGET_HT20_20] = | ||
1496 | ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_20, freq, | ||
1497 | is2GHz); | ||
1498 | targetPowerValT2[ALL_TARGET_HT20_21] = | ||
1499 | ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_21, freq, | ||
1500 | is2GHz); | ||
1501 | targetPowerValT2[ALL_TARGET_HT20_22] = | ||
1502 | ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_22, freq, | ||
1503 | is2GHz); | ||
1504 | targetPowerValT2[ALL_TARGET_HT20_23] = | ||
1505 | ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_23, freq, | ||
1506 | is2GHz); | ||
1507 | targetPowerValT2[ALL_TARGET_HT40_0_8_16] = | ||
1508 | ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_0_8_16, freq, | ||
1509 | is2GHz) + ht40PowerIncForPdadc; | ||
1510 | targetPowerValT2[ALL_TARGET_HT40_1_3_9_11_17_19] = | ||
1511 | ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_1_3_9_11_17_19, | ||
1512 | freq, | ||
1513 | is2GHz) + ht40PowerIncForPdadc; | ||
1514 | targetPowerValT2[ALL_TARGET_HT40_4] = | ||
1515 | ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_4, freq, | ||
1516 | is2GHz) + ht40PowerIncForPdadc; | ||
1517 | targetPowerValT2[ALL_TARGET_HT40_5] = | ||
1518 | ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_5, freq, | ||
1519 | is2GHz) + ht40PowerIncForPdadc; | ||
1520 | targetPowerValT2[ALL_TARGET_HT40_6] = | ||
1521 | ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_6, freq, | ||
1522 | is2GHz) + ht40PowerIncForPdadc; | ||
1523 | targetPowerValT2[ALL_TARGET_HT40_7] = | ||
1524 | ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_7, freq, | ||
1525 | is2GHz) + ht40PowerIncForPdadc; | ||
1526 | targetPowerValT2[ALL_TARGET_HT40_12] = | ||
1527 | ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_12, freq, | ||
1528 | is2GHz) + ht40PowerIncForPdadc; | ||
1529 | targetPowerValT2[ALL_TARGET_HT40_13] = | ||
1530 | ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_13, freq, | ||
1531 | is2GHz) + ht40PowerIncForPdadc; | ||
1532 | targetPowerValT2[ALL_TARGET_HT40_14] = | ||
1533 | ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_14, freq, | ||
1534 | is2GHz) + ht40PowerIncForPdadc; | ||
1535 | targetPowerValT2[ALL_TARGET_HT40_15] = | ||
1536 | ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_15, freq, | ||
1537 | is2GHz) + ht40PowerIncForPdadc; | ||
1538 | targetPowerValT2[ALL_TARGET_HT40_20] = | ||
1539 | ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_20, freq, | ||
1540 | is2GHz) + ht40PowerIncForPdadc; | ||
1541 | targetPowerValT2[ALL_TARGET_HT40_21] = | ||
1542 | ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_21, freq, | ||
1543 | is2GHz) + ht40PowerIncForPdadc; | ||
1544 | targetPowerValT2[ALL_TARGET_HT40_22] = | ||
1545 | ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_22, freq, | ||
1546 | is2GHz) + ht40PowerIncForPdadc; | ||
1547 | targetPowerValT2[ALL_TARGET_HT40_23] = | ||
1548 | ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_23, freq, | ||
1549 | is2GHz) + ht40PowerIncForPdadc; | ||
1550 | |||
1551 | while (i < ar9300RateSize) { | ||
1552 | ath_print(common, ATH_DBG_EEPROM, | ||
1553 | "TPC[%02d] 0x%08x ", i, targetPowerValT2[i]); | ||
1554 | i++; | ||
1555 | |||
1556 | ath_print(common, ATH_DBG_EEPROM, | ||
1557 | "TPC[%02d] 0x%08x ", i, targetPowerValT2[i]); | ||
1558 | i++; | ||
1559 | |||
1560 | ath_print(common, ATH_DBG_EEPROM, | ||
1561 | "TPC[%02d] 0x%08x ", i, targetPowerValT2[i]); | ||
1562 | i++; | ||
1563 | |||
1564 | ath_print(common, ATH_DBG_EEPROM, | ||
1565 | "TPC[%02d] 0x%08x\n", i, targetPowerValT2[i]); | ||
1566 | i++; | ||
1567 | } | ||
1568 | |||
1569 | /* Write target power array to registers */ | ||
1570 | ar9003_hw_tx_power_regwrite(ah, targetPowerValT2); | ||
1571 | } | ||
1572 | |||
1573 | static int ar9003_hw_cal_pier_get(struct ath_hw *ah, | ||
1574 | int mode, | ||
1575 | int ipier, | ||
1576 | int ichain, | ||
1577 | int *pfrequency, | ||
1578 | int *pcorrection, | ||
1579 | int *ptemperature, int *pvoltage) | ||
1580 | { | ||
1581 | u8 *pCalPier; | ||
1582 | struct ar9300_cal_data_per_freq_op_loop *pCalPierStruct; | ||
1583 | int is2GHz; | ||
1584 | struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; | ||
1585 | struct ath_common *common = ath9k_hw_common(ah); | ||
1586 | |||
1587 | if (ichain >= AR9300_MAX_CHAINS) { | ||
1588 | ath_print(common, ATH_DBG_EEPROM, | ||
1589 | "Invalid chain index, must be less than %d\n", | ||
1590 | AR9300_MAX_CHAINS); | ||
1591 | return -1; | ||
1592 | } | ||
1593 | |||
1594 | if (mode) { /* 5GHz */ | ||
1595 | if (ipier >= AR9300_NUM_5G_CAL_PIERS) { | ||
1596 | ath_print(common, ATH_DBG_EEPROM, | ||
1597 | "Invalid 5GHz cal pier index, must " | ||
1598 | "be less than %d\n", | ||
1599 | AR9300_NUM_5G_CAL_PIERS); | ||
1600 | return -1; | ||
1601 | } | ||
1602 | pCalPier = &(eep->calFreqPier5G[ipier]); | ||
1603 | pCalPierStruct = &(eep->calPierData5G[ichain][ipier]); | ||
1604 | is2GHz = 0; | ||
1605 | } else { | ||
1606 | if (ipier >= AR9300_NUM_2G_CAL_PIERS) { | ||
1607 | ath_print(common, ATH_DBG_EEPROM, | ||
1608 | "Invalid 2GHz cal pier index, must " | ||
1609 | "be less than %d\n", AR9300_NUM_2G_CAL_PIERS); | ||
1610 | return -1; | ||
1611 | } | ||
1612 | |||
1613 | pCalPier = &(eep->calFreqPier2G[ipier]); | ||
1614 | pCalPierStruct = &(eep->calPierData2G[ichain][ipier]); | ||
1615 | is2GHz = 1; | ||
1616 | } | ||
1617 | |||
1618 | *pfrequency = FBIN2FREQ(*pCalPier, is2GHz); | ||
1619 | *pcorrection = pCalPierStruct->refPower; | ||
1620 | *ptemperature = pCalPierStruct->tempMeas; | ||
1621 | *pvoltage = pCalPierStruct->voltMeas; | ||
1622 | |||
1623 | return 0; | ||
1624 | } | ||
1625 | |||
1626 | static int ar9003_hw_power_control_override(struct ath_hw *ah, | ||
1627 | int frequency, | ||
1628 | int *correction, | ||
1629 | int *voltage, int *temperature) | ||
1630 | { | ||
1631 | int tempSlope = 0; | ||
1632 | struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; | ||
1633 | |||
1634 | REG_RMW(ah, AR_PHY_TPC_11_B0, | ||
1635 | (correction[0] << AR_PHY_TPC_OLPC_GAIN_DELTA_S), | ||
1636 | AR_PHY_TPC_OLPC_GAIN_DELTA); | ||
1637 | REG_RMW(ah, AR_PHY_TPC_11_B1, | ||
1638 | (correction[1] << AR_PHY_TPC_OLPC_GAIN_DELTA_S), | ||
1639 | AR_PHY_TPC_OLPC_GAIN_DELTA); | ||
1640 | REG_RMW(ah, AR_PHY_TPC_11_B2, | ||
1641 | (correction[2] << AR_PHY_TPC_OLPC_GAIN_DELTA_S), | ||
1642 | AR_PHY_TPC_OLPC_GAIN_DELTA); | ||
1643 | |||
1644 | /* enable open loop power control on chip */ | ||
1645 | REG_RMW(ah, AR_PHY_TPC_6_B0, | ||
1646 | (3 << AR_PHY_TPC_6_ERROR_EST_MODE_S), | ||
1647 | AR_PHY_TPC_6_ERROR_EST_MODE); | ||
1648 | REG_RMW(ah, AR_PHY_TPC_6_B1, | ||
1649 | (3 << AR_PHY_TPC_6_ERROR_EST_MODE_S), | ||
1650 | AR_PHY_TPC_6_ERROR_EST_MODE); | ||
1651 | REG_RMW(ah, AR_PHY_TPC_6_B2, | ||
1652 | (3 << AR_PHY_TPC_6_ERROR_EST_MODE_S), | ||
1653 | AR_PHY_TPC_6_ERROR_EST_MODE); | ||
1654 | |||
1655 | /* | ||
1656 | * enable temperature compensation | ||
1657 | * Need to use register names | ||
1658 | */ | ||
1659 | if (frequency < 4000) | ||
1660 | tempSlope = eep->modalHeader2G.tempSlope; | ||
1661 | else | ||
1662 | tempSlope = eep->modalHeader5G.tempSlope; | ||
1663 | |||
1664 | REG_RMW_FIELD(ah, AR_PHY_TPC_19, AR_PHY_TPC_19_ALPHA_THERM, tempSlope); | ||
1665 | REG_RMW_FIELD(ah, AR_PHY_TPC_18, AR_PHY_TPC_18_THERM_CAL_VALUE, | ||
1666 | temperature[0]); | ||
1667 | |||
1668 | return 0; | ||
1669 | } | ||
1670 | |||
1671 | /* Apply the recorded correction values. */ | ||
1672 | static int ar9003_hw_calibration_apply(struct ath_hw *ah, int frequency) | ||
1673 | { | ||
1674 | int ichain, ipier, npier; | ||
1675 | int mode; | ||
1676 | int lfrequency[AR9300_MAX_CHAINS], | ||
1677 | lcorrection[AR9300_MAX_CHAINS], | ||
1678 | ltemperature[AR9300_MAX_CHAINS], lvoltage[AR9300_MAX_CHAINS]; | ||
1679 | int hfrequency[AR9300_MAX_CHAINS], | ||
1680 | hcorrection[AR9300_MAX_CHAINS], | ||
1681 | htemperature[AR9300_MAX_CHAINS], hvoltage[AR9300_MAX_CHAINS]; | ||
1682 | int fdiff; | ||
1683 | int correction[AR9300_MAX_CHAINS], | ||
1684 | voltage[AR9300_MAX_CHAINS], temperature[AR9300_MAX_CHAINS]; | ||
1685 | int pfrequency, pcorrection, ptemperature, pvoltage; | ||
1686 | struct ath_common *common = ath9k_hw_common(ah); | ||
1687 | |||
1688 | mode = (frequency >= 4000); | ||
1689 | if (mode) | ||
1690 | npier = AR9300_NUM_5G_CAL_PIERS; | ||
1691 | else | ||
1692 | npier = AR9300_NUM_2G_CAL_PIERS; | ||
1693 | |||
1694 | for (ichain = 0; ichain < AR9300_MAX_CHAINS; ichain++) { | ||
1695 | lfrequency[ichain] = 0; | ||
1696 | hfrequency[ichain] = 100000; | ||
1697 | } | ||
1698 | /* identify best lower and higher frequency calibration measurement */ | ||
1699 | for (ichain = 0; ichain < AR9300_MAX_CHAINS; ichain++) { | ||
1700 | for (ipier = 0; ipier < npier; ipier++) { | ||
1701 | if (!ar9003_hw_cal_pier_get(ah, mode, ipier, ichain, | ||
1702 | &pfrequency, &pcorrection, | ||
1703 | &ptemperature, &pvoltage)) { | ||
1704 | fdiff = frequency - pfrequency; | ||
1705 | |||
1706 | /* | ||
1707 | * this measurement is higher than | ||
1708 | * our desired frequency | ||
1709 | */ | ||
1710 | if (fdiff <= 0) { | ||
1711 | if (hfrequency[ichain] <= 0 || | ||
1712 | hfrequency[ichain] >= 100000 || | ||
1713 | fdiff > | ||
1714 | (frequency - hfrequency[ichain])) { | ||
1715 | /* | ||
1716 | * new best higher | ||
1717 | * frequency measurement | ||
1718 | */ | ||
1719 | hfrequency[ichain] = pfrequency; | ||
1720 | hcorrection[ichain] = | ||
1721 | pcorrection; | ||
1722 | htemperature[ichain] = | ||
1723 | ptemperature; | ||
1724 | hvoltage[ichain] = pvoltage; | ||
1725 | } | ||
1726 | } | ||
1727 | if (fdiff >= 0) { | ||
1728 | if (lfrequency[ichain] <= 0 | ||
1729 | || fdiff < | ||
1730 | (frequency - lfrequency[ichain])) { | ||
1731 | /* | ||
1732 | * new best lower | ||
1733 | * frequency measurement | ||
1734 | */ | ||
1735 | lfrequency[ichain] = pfrequency; | ||
1736 | lcorrection[ichain] = | ||
1737 | pcorrection; | ||
1738 | ltemperature[ichain] = | ||
1739 | ptemperature; | ||
1740 | lvoltage[ichain] = pvoltage; | ||
1741 | } | ||
1742 | } | ||
1743 | } | ||
1744 | } | ||
1745 | } | ||
1746 | |||
1747 | /* interpolate */ | ||
1748 | for (ichain = 0; ichain < AR9300_MAX_CHAINS; ichain++) { | ||
1749 | ath_print(common, ATH_DBG_EEPROM, | ||
1750 | "ch=%d f=%d low=%d %d h=%d %d\n", | ||
1751 | ichain, frequency, lfrequency[ichain], | ||
1752 | lcorrection[ichain], hfrequency[ichain], | ||
1753 | hcorrection[ichain]); | ||
1754 | /* they're the same, so just pick one */ | ||
1755 | if (hfrequency[ichain] == lfrequency[ichain]) { | ||
1756 | correction[ichain] = lcorrection[ichain]; | ||
1757 | voltage[ichain] = lvoltage[ichain]; | ||
1758 | temperature[ichain] = ltemperature[ichain]; | ||
1759 | } | ||
1760 | /* the low frequency is good */ | ||
1761 | else if (frequency - lfrequency[ichain] < 1000) { | ||
1762 | /* so is the high frequency, interpolate */ | ||
1763 | if (hfrequency[ichain] - frequency < 1000) { | ||
1764 | |||
1765 | correction[ichain] = lcorrection[ichain] + | ||
1766 | (((frequency - lfrequency[ichain]) * | ||
1767 | (hcorrection[ichain] - | ||
1768 | lcorrection[ichain])) / | ||
1769 | (hfrequency[ichain] - lfrequency[ichain])); | ||
1770 | |||
1771 | temperature[ichain] = ltemperature[ichain] + | ||
1772 | (((frequency - lfrequency[ichain]) * | ||
1773 | (htemperature[ichain] - | ||
1774 | ltemperature[ichain])) / | ||
1775 | (hfrequency[ichain] - lfrequency[ichain])); | ||
1776 | |||
1777 | voltage[ichain] = | ||
1778 | lvoltage[ichain] + | ||
1779 | (((frequency - | ||
1780 | lfrequency[ichain]) * (hvoltage[ichain] - | ||
1781 | lvoltage[ichain])) | ||
1782 | / (hfrequency[ichain] - | ||
1783 | lfrequency[ichain])); | ||
1784 | } | ||
1785 | /* only low is good, use it */ | ||
1786 | else { | ||
1787 | correction[ichain] = lcorrection[ichain]; | ||
1788 | temperature[ichain] = ltemperature[ichain]; | ||
1789 | voltage[ichain] = lvoltage[ichain]; | ||
1790 | } | ||
1791 | } | ||
1792 | /* only high is good, use it */ | ||
1793 | else if (hfrequency[ichain] - frequency < 1000) { | ||
1794 | correction[ichain] = hcorrection[ichain]; | ||
1795 | temperature[ichain] = htemperature[ichain]; | ||
1796 | voltage[ichain] = hvoltage[ichain]; | ||
1797 | } else { /* nothing is good, presume 0???? */ | ||
1798 | correction[ichain] = 0; | ||
1799 | temperature[ichain] = 0; | ||
1800 | voltage[ichain] = 0; | ||
1801 | } | ||
1802 | } | ||
1803 | |||
1804 | ar9003_hw_power_control_override(ah, frequency, correction, voltage, | ||
1805 | temperature); | ||
1806 | |||
1807 | ath_print(common, ATH_DBG_EEPROM, | ||
1808 | "for frequency=%d, calibration correction = %d %d %d\n", | ||
1809 | frequency, correction[0], correction[1], correction[2]); | ||
1810 | |||
1811 | return 0; | ||
1812 | } | ||
1813 | |||
1814 | static void ath9k_hw_ar9300_set_txpower(struct ath_hw *ah, | ||
1815 | struct ath9k_channel *chan, u16 cfgCtl, | ||
1816 | u8 twiceAntennaReduction, | ||
1817 | u8 twiceMaxRegulatoryPower, | ||
1818 | u8 powerLimit) | ||
1819 | { | ||
1820 | ar9003_hw_set_target_power_eeprom(ah, chan->channel); | ||
1821 | ar9003_hw_calibration_apply(ah, chan->channel); | ||
1822 | } | ||
1823 | |||
1824 | static u16 ath9k_hw_ar9300_get_spur_channel(struct ath_hw *ah, | ||
1825 | u16 i, bool is2GHz) | ||
1826 | { | ||
1827 | return AR_NO_SPUR; | ||
1828 | } | ||
1829 | |||
1830 | s32 ar9003_hw_get_tx_gain_idx(struct ath_hw *ah) | ||
1831 | { | ||
1832 | struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; | ||
1833 | |||
1834 | return (eep->baseEepHeader.txrxgain >> 4) & 0xf; /* bits 7:4 */ | ||
1835 | } | ||
1836 | |||
1837 | s32 ar9003_hw_get_rx_gain_idx(struct ath_hw *ah) | ||
1838 | { | ||
1839 | struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; | ||
1840 | |||
1841 | return (eep->baseEepHeader.txrxgain) & 0xf; /* bits 3:0 */ | ||
1842 | } | ||
1843 | |||
1844 | const struct eeprom_ops eep_ar9300_ops = { | ||
1845 | .check_eeprom = ath9k_hw_ar9300_check_eeprom, | ||
1846 | .get_eeprom = ath9k_hw_ar9300_get_eeprom, | ||
1847 | .fill_eeprom = ath9k_hw_ar9300_fill_eeprom, | ||
1848 | .get_eeprom_ver = ath9k_hw_ar9300_get_eeprom_ver, | ||
1849 | .get_eeprom_rev = ath9k_hw_ar9300_get_eeprom_rev, | ||
1850 | .get_num_ant_config = ath9k_hw_ar9300_get_num_ant_config, | ||
1851 | .get_eeprom_antenna_cfg = ath9k_hw_ar9300_get_eeprom_antenna_cfg, | ||
1852 | .set_board_values = ath9k_hw_ar9300_set_board_values, | ||
1853 | .set_addac = ath9k_hw_ar9300_set_addac, | ||
1854 | .set_txpower = ath9k_hw_ar9300_set_txpower, | ||
1855 | .get_spur_channel = ath9k_hw_ar9300_get_spur_channel | ||
1856 | }; | ||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h new file mode 100644 index 000000000000..5fe335e22c89 --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/ar9003_eeprom.h | |||
@@ -0,0 +1,323 @@ | |||
1 | #ifndef AR9003_EEPROM_H | ||
2 | #define AR9003_EEPROM_H | ||
3 | |||
4 | #include <linux/types.h> | ||
5 | |||
6 | #define AR9300_EEP_VER 0xD000 | ||
7 | #define AR9300_EEP_VER_MINOR_MASK 0xFFF | ||
8 | #define AR9300_EEP_MINOR_VER_1 0x1 | ||
9 | #define AR9300_EEP_MINOR_VER AR9300_EEP_MINOR_VER_1 | ||
10 | |||
11 | /* 16-bit offset location start of calibration struct */ | ||
12 | #define AR9300_EEP_START_LOC 256 | ||
13 | #define AR9300_NUM_5G_CAL_PIERS 8 | ||
14 | #define AR9300_NUM_2G_CAL_PIERS 3 | ||
15 | #define AR9300_NUM_5G_20_TARGET_POWERS 8 | ||
16 | #define AR9300_NUM_5G_40_TARGET_POWERS 8 | ||
17 | #define AR9300_NUM_2G_CCK_TARGET_POWERS 2 | ||
18 | #define AR9300_NUM_2G_20_TARGET_POWERS 3 | ||
19 | #define AR9300_NUM_2G_40_TARGET_POWERS 3 | ||
20 | /* #define AR9300_NUM_CTLS 21 */ | ||
21 | #define AR9300_NUM_CTLS_5G 9 | ||
22 | #define AR9300_NUM_CTLS_2G 12 | ||
23 | #define AR9300_CTL_MODE_M 0xF | ||
24 | #define AR9300_NUM_BAND_EDGES_5G 8 | ||
25 | #define AR9300_NUM_BAND_EDGES_2G 4 | ||
26 | #define AR9300_NUM_PD_GAINS 4 | ||
27 | #define AR9300_PD_GAINS_IN_MASK 4 | ||
28 | #define AR9300_PD_GAIN_ICEPTS 5 | ||
29 | #define AR9300_EEPROM_MODAL_SPURS 5 | ||
30 | #define AR9300_MAX_RATE_POWER 63 | ||
31 | #define AR9300_NUM_PDADC_VALUES 128 | ||
32 | #define AR9300_NUM_RATES 16 | ||
33 | #define AR9300_BCHAN_UNUSED 0xFF | ||
34 | #define AR9300_MAX_PWR_RANGE_IN_HALF_DB 64 | ||
35 | #define AR9300_OPFLAGS_11A 0x01 | ||
36 | #define AR9300_OPFLAGS_11G 0x02 | ||
37 | #define AR9300_OPFLAGS_5G_HT40 0x04 | ||
38 | #define AR9300_OPFLAGS_2G_HT40 0x08 | ||
39 | #define AR9300_OPFLAGS_5G_HT20 0x10 | ||
40 | #define AR9300_OPFLAGS_2G_HT20 0x20 | ||
41 | #define AR9300_EEPMISC_BIG_ENDIAN 0x01 | ||
42 | #define AR9300_EEPMISC_WOW 0x02 | ||
43 | #define AR9300_CUSTOMER_DATA_SIZE 20 | ||
44 | |||
45 | #define FREQ2FBIN(x, y) ((y) ? ((x) - 2300) : (((x) - 4800) / 5)) | ||
46 | #define FBIN2FREQ(x, y) ((y) ? (2300 + x) : (4800 + 5 * x)) | ||
47 | #define AR9300_MAX_CHAINS 3 | ||
48 | #define AR9300_ANT_16S 25 | ||
49 | #define AR9300_FUTURE_MODAL_SZ 6 | ||
50 | |||
51 | #define AR9300_NUM_ANT_CHAIN_FIELDS 7 | ||
52 | #define AR9300_NUM_ANT_COMMON_FIELDS 4 | ||
53 | #define AR9300_SIZE_ANT_CHAIN_FIELD 3 | ||
54 | #define AR9300_SIZE_ANT_COMMON_FIELD 4 | ||
55 | #define AR9300_ANT_CHAIN_MASK 0x7 | ||
56 | #define AR9300_ANT_COMMON_MASK 0xf | ||
57 | #define AR9300_CHAIN_0_IDX 0 | ||
58 | #define AR9300_CHAIN_1_IDX 1 | ||
59 | #define AR9300_CHAIN_2_IDX 2 | ||
60 | |||
61 | #define AR928X_NUM_ANT_CHAIN_FIELDS 6 | ||
62 | #define AR928X_SIZE_ANT_CHAIN_FIELD 2 | ||
63 | #define AR928X_ANT_CHAIN_MASK 0x3 | ||
64 | |||
65 | /* Delta from which to start power to pdadc table */ | ||
66 | /* This offset is used in both open loop and closed loop power control | ||
67 | * schemes. In open loop power control, it is not really needed, but for | ||
68 | * the "sake of consistency" it was kept. For certain AP designs, this | ||
69 | * value is overwritten by the value in the flag "pwrTableOffset" just | ||
70 | * before writing the pdadc vs pwr into the chip registers. | ||
71 | */ | ||
72 | #define AR9300_PWR_TABLE_OFFSET 0 | ||
73 | |||
74 | /* enable flags for voltage and temp compensation */ | ||
75 | #define ENABLE_TEMP_COMPENSATION 0x01 | ||
76 | #define ENABLE_VOLT_COMPENSATION 0x02 | ||
77 | /* byte addressable */ | ||
78 | #define AR9300_EEPROM_SIZE (16*1024) | ||
79 | #define FIXED_CCA_THRESHOLD 15 | ||
80 | |||
81 | #define AR9300_BASE_ADDR 0x3ff | ||
82 | |||
83 | enum targetPowerHTRates { | ||
84 | HT_TARGET_RATE_0_8_16, | ||
85 | HT_TARGET_RATE_1_3_9_11_17_19, | ||
86 | HT_TARGET_RATE_4, | ||
87 | HT_TARGET_RATE_5, | ||
88 | HT_TARGET_RATE_6, | ||
89 | HT_TARGET_RATE_7, | ||
90 | HT_TARGET_RATE_12, | ||
91 | HT_TARGET_RATE_13, | ||
92 | HT_TARGET_RATE_14, | ||
93 | HT_TARGET_RATE_15, | ||
94 | HT_TARGET_RATE_20, | ||
95 | HT_TARGET_RATE_21, | ||
96 | HT_TARGET_RATE_22, | ||
97 | HT_TARGET_RATE_23 | ||
98 | }; | ||
99 | |||
100 | enum targetPowerLegacyRates { | ||
101 | LEGACY_TARGET_RATE_6_24, | ||
102 | LEGACY_TARGET_RATE_36, | ||
103 | LEGACY_TARGET_RATE_48, | ||
104 | LEGACY_TARGET_RATE_54 | ||
105 | }; | ||
106 | |||
107 | enum targetPowerCckRates { | ||
108 | LEGACY_TARGET_RATE_1L_5L, | ||
109 | LEGACY_TARGET_RATE_5S, | ||
110 | LEGACY_TARGET_RATE_11L, | ||
111 | LEGACY_TARGET_RATE_11S | ||
112 | }; | ||
113 | |||
114 | enum ar9300_Rates { | ||
115 | ALL_TARGET_LEGACY_6_24, | ||
116 | ALL_TARGET_LEGACY_36, | ||
117 | ALL_TARGET_LEGACY_48, | ||
118 | ALL_TARGET_LEGACY_54, | ||
119 | ALL_TARGET_LEGACY_1L_5L, | ||
120 | ALL_TARGET_LEGACY_5S, | ||
121 | ALL_TARGET_LEGACY_11L, | ||
122 | ALL_TARGET_LEGACY_11S, | ||
123 | ALL_TARGET_HT20_0_8_16, | ||
124 | ALL_TARGET_HT20_1_3_9_11_17_19, | ||
125 | ALL_TARGET_HT20_4, | ||
126 | ALL_TARGET_HT20_5, | ||
127 | ALL_TARGET_HT20_6, | ||
128 | ALL_TARGET_HT20_7, | ||
129 | ALL_TARGET_HT20_12, | ||
130 | ALL_TARGET_HT20_13, | ||
131 | ALL_TARGET_HT20_14, | ||
132 | ALL_TARGET_HT20_15, | ||
133 | ALL_TARGET_HT20_20, | ||
134 | ALL_TARGET_HT20_21, | ||
135 | ALL_TARGET_HT20_22, | ||
136 | ALL_TARGET_HT20_23, | ||
137 | ALL_TARGET_HT40_0_8_16, | ||
138 | ALL_TARGET_HT40_1_3_9_11_17_19, | ||
139 | ALL_TARGET_HT40_4, | ||
140 | ALL_TARGET_HT40_5, | ||
141 | ALL_TARGET_HT40_6, | ||
142 | ALL_TARGET_HT40_7, | ||
143 | ALL_TARGET_HT40_12, | ||
144 | ALL_TARGET_HT40_13, | ||
145 | ALL_TARGET_HT40_14, | ||
146 | ALL_TARGET_HT40_15, | ||
147 | ALL_TARGET_HT40_20, | ||
148 | ALL_TARGET_HT40_21, | ||
149 | ALL_TARGET_HT40_22, | ||
150 | ALL_TARGET_HT40_23, | ||
151 | ar9300RateSize, | ||
152 | }; | ||
153 | |||
154 | |||
155 | struct eepFlags { | ||
156 | u8 opFlags; | ||
157 | u8 eepMisc; | ||
158 | } __packed; | ||
159 | |||
160 | enum CompressAlgorithm { | ||
161 | _CompressNone = 0, | ||
162 | _CompressLzma, | ||
163 | _CompressPairs, | ||
164 | _CompressBlock, | ||
165 | _Compress4, | ||
166 | _Compress5, | ||
167 | _Compress6, | ||
168 | _Compress7, | ||
169 | }; | ||
170 | |||
171 | struct ar9300_base_eep_hdr { | ||
172 | u16 regDmn[2]; | ||
173 | /* 4 bits tx and 4 bits rx */ | ||
174 | u8 txrxMask; | ||
175 | struct eepFlags opCapFlags; | ||
176 | u8 rfSilent; | ||
177 | u8 blueToothOptions; | ||
178 | u8 deviceCap; | ||
179 | /* takes lower byte in eeprom location */ | ||
180 | u8 deviceType; | ||
181 | /* offset in dB to be added to beginning | ||
182 | * of pdadc table in calibration | ||
183 | */ | ||
184 | int8_t pwrTableOffset; | ||
185 | u8 params_for_tuning_caps[2]; | ||
186 | /* | ||
187 | * bit0 - enable tx temp comp | ||
188 | * bit1 - enable tx volt comp | ||
189 | * bit2 - enable fastClock - default to 1 | ||
190 | * bit3 - enable doubling - default to 1 | ||
191 | * bit4 - enable internal regulator - default to 1 | ||
192 | */ | ||
193 | u8 featureEnable; | ||
194 | /* misc flags: bit0 - turn down drivestrength */ | ||
195 | u8 miscConfiguration; | ||
196 | u8 eepromWriteEnableGpio; | ||
197 | u8 wlanDisableGpio; | ||
198 | u8 wlanLedGpio; | ||
199 | u8 rxBandSelectGpio; | ||
200 | u8 txrxgain; | ||
201 | /* SW controlled internal regulator fields */ | ||
202 | u32 swreg; | ||
203 | } __packed; | ||
204 | |||
205 | struct ar9300_modal_eep_header { | ||
206 | /* 4 idle, t1, t2, b (4 bits per setting) */ | ||
207 | u32 antCtrlCommon; | ||
208 | /* 4 ra1l1, ra2l1, ra1l2, ra2l2, ra12 */ | ||
209 | u32 antCtrlCommon2; | ||
210 | /* 6 idle, t, r, rx1, rx12, b (2 bits each) */ | ||
211 | u16 antCtrlChain[AR9300_MAX_CHAINS]; | ||
212 | /* 3 xatten1_db for AR9280 (0xa20c/b20c 5:0) */ | ||
213 | u8 xatten1DB[AR9300_MAX_CHAINS]; | ||
214 | /* 3 xatten1_margin for merlin (0xa20c/b20c 16:12 */ | ||
215 | u8 xatten1Margin[AR9300_MAX_CHAINS]; | ||
216 | int8_t tempSlope; | ||
217 | int8_t voltSlope; | ||
218 | /* spur channels in usual fbin coding format */ | ||
219 | u8 spurChans[AR9300_EEPROM_MODAL_SPURS]; | ||
220 | /* 3 Check if the register is per chain */ | ||
221 | int8_t noiseFloorThreshCh[AR9300_MAX_CHAINS]; | ||
222 | u8 ob[AR9300_MAX_CHAINS]; | ||
223 | u8 db_stage2[AR9300_MAX_CHAINS]; | ||
224 | u8 db_stage3[AR9300_MAX_CHAINS]; | ||
225 | u8 db_stage4[AR9300_MAX_CHAINS]; | ||
226 | u8 xpaBiasLvl; | ||
227 | u8 txFrameToDataStart; | ||
228 | u8 txFrameToPaOn; | ||
229 | u8 txClip; | ||
230 | int8_t antennaGain; | ||
231 | u8 switchSettling; | ||
232 | int8_t adcDesiredSize; | ||
233 | u8 txEndToXpaOff; | ||
234 | u8 txEndToRxOn; | ||
235 | u8 txFrameToXpaOn; | ||
236 | u8 thresh62; | ||
237 | u8 futureModal[32]; | ||
238 | } __packed; | ||
239 | |||
240 | struct ar9300_cal_data_per_freq_op_loop { | ||
241 | int8_t refPower; | ||
242 | /* pdadc voltage at power measurement */ | ||
243 | u8 voltMeas; | ||
244 | /* pcdac used for power measurement */ | ||
245 | u8 tempMeas; | ||
246 | /* range is -60 to -127 create a mapping equation 1db resolution */ | ||
247 | int8_t rxNoisefloorCal; | ||
248 | /*range is same as noisefloor */ | ||
249 | int8_t rxNoisefloorPower; | ||
250 | /* temp measured when noisefloor cal was performed */ | ||
251 | u8 rxTempMeas; | ||
252 | } __packed; | ||
253 | |||
254 | struct cal_tgt_pow_legacy { | ||
255 | u8 tPow2x[4]; | ||
256 | } __packed; | ||
257 | |||
258 | struct cal_tgt_pow_ht { | ||
259 | u8 tPow2x[14]; | ||
260 | } __packed; | ||
261 | |||
262 | struct cal_ctl_edge_pwr { | ||
263 | u8 tPower:6, | ||
264 | flag:2; | ||
265 | } __packed; | ||
266 | |||
267 | struct cal_ctl_data_2g { | ||
268 | struct cal_ctl_edge_pwr ctlEdges[AR9300_NUM_BAND_EDGES_5G]; | ||
269 | } __packed; | ||
270 | |||
271 | struct cal_ctl_data_5g { | ||
272 | struct cal_ctl_edge_pwr ctlEdges[AR9300_NUM_BAND_EDGES_5G]; | ||
273 | } __packed; | ||
274 | |||
275 | struct ar9300_eeprom { | ||
276 | u8 eepromVersion; | ||
277 | u8 templateVersion; | ||
278 | u8 macAddr[6]; | ||
279 | u8 custData[AR9300_CUSTOMER_DATA_SIZE]; | ||
280 | |||
281 | struct ar9300_base_eep_hdr baseEepHeader; | ||
282 | |||
283 | struct ar9300_modal_eep_header modalHeader2G; | ||
284 | u8 calFreqPier2G[AR9300_NUM_2G_CAL_PIERS]; | ||
285 | struct ar9300_cal_data_per_freq_op_loop | ||
286 | calPierData2G[AR9300_MAX_CHAINS][AR9300_NUM_2G_CAL_PIERS]; | ||
287 | u8 calTarget_freqbin_Cck[AR9300_NUM_2G_CCK_TARGET_POWERS]; | ||
288 | u8 calTarget_freqbin_2G[AR9300_NUM_2G_20_TARGET_POWERS]; | ||
289 | u8 calTarget_freqbin_2GHT20[AR9300_NUM_2G_20_TARGET_POWERS]; | ||
290 | u8 calTarget_freqbin_2GHT40[AR9300_NUM_2G_40_TARGET_POWERS]; | ||
291 | struct cal_tgt_pow_legacy | ||
292 | calTargetPowerCck[AR9300_NUM_2G_CCK_TARGET_POWERS]; | ||
293 | struct cal_tgt_pow_legacy | ||
294 | calTargetPower2G[AR9300_NUM_2G_20_TARGET_POWERS]; | ||
295 | struct cal_tgt_pow_ht | ||
296 | calTargetPower2GHT20[AR9300_NUM_2G_20_TARGET_POWERS]; | ||
297 | struct cal_tgt_pow_ht | ||
298 | calTargetPower2GHT40[AR9300_NUM_2G_40_TARGET_POWERS]; | ||
299 | u8 ctlIndex_2G[AR9300_NUM_CTLS_2G]; | ||
300 | u8 ctl_freqbin_2G[AR9300_NUM_CTLS_2G][AR9300_NUM_BAND_EDGES_2G]; | ||
301 | struct cal_ctl_data_2g ctlPowerData_2G[AR9300_NUM_CTLS_2G]; | ||
302 | struct ar9300_modal_eep_header modalHeader5G; | ||
303 | u8 calFreqPier5G[AR9300_NUM_5G_CAL_PIERS]; | ||
304 | struct ar9300_cal_data_per_freq_op_loop | ||
305 | calPierData5G[AR9300_MAX_CHAINS][AR9300_NUM_5G_CAL_PIERS]; | ||
306 | u8 calTarget_freqbin_5G[AR9300_NUM_5G_20_TARGET_POWERS]; | ||
307 | u8 calTarget_freqbin_5GHT20[AR9300_NUM_5G_20_TARGET_POWERS]; | ||
308 | u8 calTarget_freqbin_5GHT40[AR9300_NUM_5G_40_TARGET_POWERS]; | ||
309 | struct cal_tgt_pow_legacy | ||
310 | calTargetPower5G[AR9300_NUM_5G_20_TARGET_POWERS]; | ||
311 | struct cal_tgt_pow_ht | ||
312 | calTargetPower5GHT20[AR9300_NUM_5G_20_TARGET_POWERS]; | ||
313 | struct cal_tgt_pow_ht | ||
314 | calTargetPower5GHT40[AR9300_NUM_5G_40_TARGET_POWERS]; | ||
315 | u8 ctlIndex_5G[AR9300_NUM_CTLS_5G]; | ||
316 | u8 ctl_freqbin_5G[AR9300_NUM_CTLS_5G][AR9300_NUM_BAND_EDGES_5G]; | ||
317 | struct cal_ctl_data_5g ctlPowerData_5G[AR9300_NUM_CTLS_5G]; | ||
318 | } __packed; | ||
319 | |||
320 | s32 ar9003_hw_get_tx_gain_idx(struct ath_hw *ah); | ||
321 | s32 ar9003_hw_get_rx_gain_idx(struct ath_hw *ah); | ||
322 | |||
323 | #endif | ||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_hw.c b/drivers/net/wireless/ath/ath9k/ar9003_hw.c new file mode 100644 index 000000000000..b15309caf1da --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/ar9003_hw.c | |||
@@ -0,0 +1,205 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2008-2010 Atheros Communications Inc. | ||
3 | * | ||
4 | * Permission to use, copy, modify, and/or distribute this software for any | ||
5 | * purpose with or without fee is hereby granted, provided that the above | ||
6 | * copyright notice and this permission notice appear in all copies. | ||
7 | * | ||
8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
15 | */ | ||
16 | |||
17 | #include "hw.h" | ||
18 | #include "ar9003_mac.h" | ||
19 | #include "ar9003_initvals.h" | ||
20 | |||
21 | /* General hardware code for the AR9003 hadware family */ | ||
22 | |||
23 | static bool ar9003_hw_macversion_supported(u32 macversion) | ||
24 | { | ||
25 | switch (macversion) { | ||
26 | case AR_SREV_VERSION_9300: | ||
27 | return true; | ||
28 | default: | ||
29 | break; | ||
30 | } | ||
31 | return false; | ||
32 | } | ||
33 | |||
34 | /* AR9003 2.0 - new INI format (pre, core, post arrays per subsystem) */ | ||
35 | /* | ||
36 | * XXX: move TX/RX gain INI to its own init_mode_gain_regs after | ||
37 | * ensuring it does not affect hardware bring up | ||
38 | */ | ||
39 | static void ar9003_hw_init_mode_regs(struct ath_hw *ah) | ||
40 | { | ||
41 | /* mac */ | ||
42 | INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0); | ||
43 | INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], | ||
44 | ar9300_2p0_mac_core, | ||
45 | ARRAY_SIZE(ar9300_2p0_mac_core), 2); | ||
46 | INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST], | ||
47 | ar9300_2p0_mac_postamble, | ||
48 | ARRAY_SIZE(ar9300_2p0_mac_postamble), 5); | ||
49 | |||
50 | /* bb */ | ||
51 | INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], NULL, 0, 0); | ||
52 | INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE], | ||
53 | ar9300_2p0_baseband_core, | ||
54 | ARRAY_SIZE(ar9300_2p0_baseband_core), 2); | ||
55 | INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST], | ||
56 | ar9300_2p0_baseband_postamble, | ||
57 | ARRAY_SIZE(ar9300_2p0_baseband_postamble), 5); | ||
58 | |||
59 | /* radio */ | ||
60 | INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_PRE], NULL, 0, 0); | ||
61 | INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE], | ||
62 | ar9300_2p0_radio_core, | ||
63 | ARRAY_SIZE(ar9300_2p0_radio_core), 2); | ||
64 | INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST], | ||
65 | ar9300_2p0_radio_postamble, | ||
66 | ARRAY_SIZE(ar9300_2p0_radio_postamble), 5); | ||
67 | |||
68 | /* soc */ | ||
69 | INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE], | ||
70 | ar9300_2p0_soc_preamble, | ||
71 | ARRAY_SIZE(ar9300_2p0_soc_preamble), 2); | ||
72 | INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_CORE], NULL, 0, 0); | ||
73 | INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST], | ||
74 | ar9300_2p0_soc_postamble, | ||
75 | ARRAY_SIZE(ar9300_2p0_soc_postamble), 5); | ||
76 | |||
77 | /* rx/tx gain */ | ||
78 | INIT_INI_ARRAY(&ah->iniModesRxGain, | ||
79 | ar9300Common_rx_gain_table_2p0, | ||
80 | ARRAY_SIZE(ar9300Common_rx_gain_table_2p0), 2); | ||
81 | INIT_INI_ARRAY(&ah->iniModesTxGain, | ||
82 | ar9300Modes_lowest_ob_db_tx_gain_table_2p0, | ||
83 | ARRAY_SIZE(ar9300Modes_lowest_ob_db_tx_gain_table_2p0), | ||
84 | 5); | ||
85 | |||
86 | /* Load PCIE SERDES settings from INI */ | ||
87 | |||
88 | /* Awake Setting */ | ||
89 | |||
90 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | ||
91 | ar9300PciePhy_pll_on_clkreq_disable_L1_2p0, | ||
92 | ARRAY_SIZE(ar9300PciePhy_pll_on_clkreq_disable_L1_2p0), | ||
93 | 2); | ||
94 | |||
95 | /* Sleep Setting */ | ||
96 | |||
97 | INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower, | ||
98 | ar9300PciePhy_clkreq_enable_L1_2p0, | ||
99 | ARRAY_SIZE(ar9300PciePhy_clkreq_enable_L1_2p0), | ||
100 | 2); | ||
101 | |||
102 | /* Fast clock modal settings */ | ||
103 | INIT_INI_ARRAY(&ah->iniModesAdditional, | ||
104 | ar9300Modes_fast_clock_2p0, | ||
105 | ARRAY_SIZE(ar9300Modes_fast_clock_2p0), | ||
106 | 3); | ||
107 | } | ||
108 | |||
109 | static void ar9003_tx_gain_table_apply(struct ath_hw *ah) | ||
110 | { | ||
111 | switch (ar9003_hw_get_tx_gain_idx(ah)) { | ||
112 | case 0: | ||
113 | default: | ||
114 | INIT_INI_ARRAY(&ah->iniModesTxGain, | ||
115 | ar9300Modes_lowest_ob_db_tx_gain_table_2p0, | ||
116 | ARRAY_SIZE(ar9300Modes_lowest_ob_db_tx_gain_table_2p0), | ||
117 | 5); | ||
118 | break; | ||
119 | case 1: | ||
120 | INIT_INI_ARRAY(&ah->iniModesTxGain, | ||
121 | ar9300Modes_high_ob_db_tx_gain_table_2p0, | ||
122 | ARRAY_SIZE(ar9300Modes_high_ob_db_tx_gain_table_2p0), | ||
123 | 5); | ||
124 | break; | ||
125 | case 2: | ||
126 | INIT_INI_ARRAY(&ah->iniModesTxGain, | ||
127 | ar9300Modes_low_ob_db_tx_gain_table_2p0, | ||
128 | ARRAY_SIZE(ar9300Modes_low_ob_db_tx_gain_table_2p0), | ||
129 | 5); | ||
130 | break; | ||
131 | } | ||
132 | } | ||
133 | |||
134 | static void ar9003_rx_gain_table_apply(struct ath_hw *ah) | ||
135 | { | ||
136 | switch (ar9003_hw_get_rx_gain_idx(ah)) { | ||
137 | case 0: | ||
138 | default: | ||
139 | INIT_INI_ARRAY(&ah->iniModesRxGain, ar9300Common_rx_gain_table_2p0, | ||
140 | ARRAY_SIZE(ar9300Common_rx_gain_table_2p0), | ||
141 | 2); | ||
142 | break; | ||
143 | case 1: | ||
144 | INIT_INI_ARRAY(&ah->iniModesRxGain, | ||
145 | ar9300Common_wo_xlna_rx_gain_table_2p0, | ||
146 | ARRAY_SIZE(ar9300Common_wo_xlna_rx_gain_table_2p0), | ||
147 | 2); | ||
148 | break; | ||
149 | } | ||
150 | } | ||
151 | |||
152 | /* set gain table pointers according to values read from the eeprom */ | ||
153 | static void ar9003_hw_init_mode_gain_regs(struct ath_hw *ah) | ||
154 | { | ||
155 | ar9003_tx_gain_table_apply(ah); | ||
156 | ar9003_rx_gain_table_apply(ah); | ||
157 | } | ||
158 | |||
159 | /* | ||
160 | * Helper for ASPM support. | ||
161 | * | ||
162 | * Disable PLL when in L0s as well as receiver clock when in L1. | ||
163 | * This power saving option must be enabled through the SerDes. | ||
164 | * | ||
165 | * Programming the SerDes must go through the same 288 bit serial shift | ||
166 | * register as the other analog registers. Hence the 9 writes. | ||
167 | */ | ||
168 | static void ar9003_hw_configpcipowersave(struct ath_hw *ah, | ||
169 | int restore, | ||
170 | int power_off) | ||
171 | { | ||
172 | if (ah->is_pciexpress != true) | ||
173 | return; | ||
174 | |||
175 | /* Do not touch SerDes registers */ | ||
176 | if (ah->config.pcie_powersave_enable == 2) | ||
177 | return; | ||
178 | |||
179 | /* Nothing to do on restore for 11N */ | ||
180 | if (!restore) { | ||
181 | /* set bit 19 to allow forcing of pcie core into L1 state */ | ||
182 | REG_SET_BIT(ah, AR_PCIE_PM_CTRL, AR_PCIE_PM_CTRL_ENA); | ||
183 | |||
184 | /* Several PCIe massages to ensure proper behaviour */ | ||
185 | if (ah->config.pcie_waen) | ||
186 | REG_WRITE(ah, AR_WA, ah->config.pcie_waen); | ||
187 | } | ||
188 | } | ||
189 | |||
190 | /* Sets up the AR9003 hardware familiy callbacks */ | ||
191 | void ar9003_hw_attach_ops(struct ath_hw *ah) | ||
192 | { | ||
193 | struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); | ||
194 | struct ath_hw_ops *ops = ath9k_hw_ops(ah); | ||
195 | |||
196 | priv_ops->init_mode_regs = ar9003_hw_init_mode_regs; | ||
197 | priv_ops->init_mode_gain_regs = ar9003_hw_init_mode_gain_regs; | ||
198 | priv_ops->macversion_supported = ar9003_hw_macversion_supported; | ||
199 | |||
200 | ops->config_pci_powersave = ar9003_hw_configpcipowersave; | ||
201 | |||
202 | ar9003_hw_attach_phy_ops(ah); | ||
203 | ar9003_hw_attach_calib_ops(ah); | ||
204 | ar9003_hw_attach_mac_ops(ah); | ||
205 | } | ||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_initvals.h b/drivers/net/wireless/ath/ath9k/ar9003_initvals.h new file mode 100644 index 000000000000..e0391b12e533 --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/ar9003_initvals.h | |||
@@ -0,0 +1,1793 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2010 Atheros Communications Inc. | ||
3 | * | ||
4 | * Permission to use, copy, modify, and/or distribute this software for any | ||
5 | * purpose with or without fee is hereby granted, provided that the above | ||
6 | * copyright notice and this permission notice appear in all copies. | ||
7 | * | ||
8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
15 | */ | ||
16 | |||
17 | #ifndef INITVALS_9003_H | ||
18 | #define INITVALS_9003_H | ||
19 | |||
20 | /* AR9003 2.0 */ | ||
21 | |||
22 | static const u32 ar9300_2p0_radio_postamble[][5] = { | ||
23 | /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */ | ||
24 | {0x0001609c, 0x0dd08f29, 0x0dd08f29, 0x0b283f31, 0x0b283f31}, | ||
25 | {0x000160ac, 0xa4653c00, 0xa4653c00, 0x24652800, 0x24652800}, | ||
26 | {0x000160b0, 0x03284f3e, 0x03284f3e, 0x05d08f20, 0x05d08f20}, | ||
27 | {0x0001610c, 0x08000000, 0x00000000, 0x00000000, 0x00000000}, | ||
28 | {0x0001650c, 0x08000000, 0x00000000, 0x00000000, 0x00000000}, | ||
29 | {0x0001690c, 0x08000000, 0x00000000, 0x00000000, 0x00000000}, | ||
30 | }; | ||
31 | |||
32 | static const u32 ar9300Modes_lowest_ob_db_tx_gain_table_2p0[][5] = { | ||
33 | /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */ | ||
34 | {0x0000a410, 0x000050da, 0x000050da, 0x000050da, 0x000050da}, | ||
35 | {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | ||
36 | {0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002}, | ||
37 | {0x0000a508, 0x0a000020, 0x0a000020, 0x08000004, 0x08000004}, | ||
38 | {0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200}, | ||
39 | {0x0000a510, 0x16000220, 0x16000220, 0x0f000202, 0x0f000202}, | ||
40 | {0x0000a514, 0x1c000223, 0x1c000223, 0x12000400, 0x12000400}, | ||
41 | {0x0000a518, 0x21020220, 0x21020220, 0x16000402, 0x16000402}, | ||
42 | {0x0000a51c, 0x27020223, 0x27020223, 0x19000404, 0x19000404}, | ||
43 | {0x0000a520, 0x2b022220, 0x2b022220, 0x1c000603, 0x1c000603}, | ||
44 | {0x0000a524, 0x2f022222, 0x2f022222, 0x21000a02, 0x21000a02}, | ||
45 | {0x0000a528, 0x34022225, 0x34022225, 0x25000a04, 0x25000a04}, | ||
46 | {0x0000a52c, 0x3a02222a, 0x3a02222a, 0x28000a20, 0x28000a20}, | ||
47 | {0x0000a530, 0x3e02222c, 0x3e02222c, 0x2c000e20, 0x2c000e20}, | ||
48 | {0x0000a534, 0x4202242a, 0x4202242a, 0x30000e22, 0x30000e22}, | ||
49 | {0x0000a538, 0x4702244a, 0x4702244a, 0x34000e24, 0x34000e24}, | ||
50 | {0x0000a53c, 0x4b02244c, 0x4b02244c, 0x38001640, 0x38001640}, | ||
51 | {0x0000a540, 0x4e02246c, 0x4e02246c, 0x3c001660, 0x3c001660}, | ||
52 | {0x0000a544, 0x5302266c, 0x5302266c, 0x3f001861, 0x3f001861}, | ||
53 | {0x0000a548, 0x5702286c, 0x5702286c, 0x43001a81, 0x43001a81}, | ||
54 | {0x0000a54c, 0x5c04286b, 0x5c04286b, 0x47001a83, 0x47001a83}, | ||
55 | {0x0000a550, 0x61042a6c, 0x61042a6c, 0x4a001c84, 0x4a001c84}, | ||
56 | {0x0000a554, 0x66062a6c, 0x66062a6c, 0x4e001ce3, 0x4e001ce3}, | ||
57 | {0x0000a558, 0x6b062e6c, 0x6b062e6c, 0x52001ce5, 0x52001ce5}, | ||
58 | {0x0000a55c, 0x7006308c, 0x7006308c, 0x56001ce9, 0x56001ce9}, | ||
59 | {0x0000a560, 0x730a308a, 0x730a308a, 0x5a001ceb, 0x5a001ceb}, | ||
60 | {0x0000a564, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec}, | ||
61 | {0x0000a568, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec}, | ||
62 | {0x0000a56c, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec}, | ||
63 | {0x0000a570, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec}, | ||
64 | {0x0000a574, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec}, | ||
65 | {0x0000a578, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec}, | ||
66 | {0x0000a57c, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec}, | ||
67 | {0x0000a580, 0x00800000, 0x00800000, 0x00800000, 0x00800000}, | ||
68 | {0x0000a584, 0x06800003, 0x06800003, 0x04800002, 0x04800002}, | ||
69 | {0x0000a588, 0x0a800020, 0x0a800020, 0x08800004, 0x08800004}, | ||
70 | {0x0000a58c, 0x10800023, 0x10800023, 0x0b800200, 0x0b800200}, | ||
71 | {0x0000a590, 0x16800220, 0x16800220, 0x0f800202, 0x0f800202}, | ||
72 | {0x0000a594, 0x1c800223, 0x1c800223, 0x12800400, 0x12800400}, | ||
73 | {0x0000a598, 0x21820220, 0x21820220, 0x16800402, 0x16800402}, | ||
74 | {0x0000a59c, 0x27820223, 0x27820223, 0x19800404, 0x19800404}, | ||
75 | {0x0000a5a0, 0x2b822220, 0x2b822220, 0x1c800603, 0x1c800603}, | ||
76 | {0x0000a5a4, 0x2f822222, 0x2f822222, 0x21800a02, 0x21800a02}, | ||
77 | {0x0000a5a8, 0x34822225, 0x34822225, 0x25800a04, 0x25800a04}, | ||
78 | {0x0000a5ac, 0x3a82222a, 0x3a82222a, 0x28800a20, 0x28800a20}, | ||
79 | {0x0000a5b0, 0x3e82222c, 0x3e82222c, 0x2c800e20, 0x2c800e20}, | ||
80 | {0x0000a5b4, 0x4282242a, 0x4282242a, 0x30800e22, 0x30800e22}, | ||
81 | {0x0000a5b8, 0x4782244a, 0x4782244a, 0x34800e24, 0x34800e24}, | ||
82 | {0x0000a5bc, 0x4b82244c, 0x4b82244c, 0x38801640, 0x38801640}, | ||
83 | {0x0000a5c0, 0x4e82246c, 0x4e82246c, 0x3c801660, 0x3c801660}, | ||
84 | {0x0000a5c4, 0x5382266c, 0x5382266c, 0x3f801861, 0x3f801861}, | ||
85 | {0x0000a5c8, 0x5782286c, 0x5782286c, 0x43801a81, 0x43801a81}, | ||
86 | {0x0000a5cc, 0x5c84286b, 0x5c84286b, 0x47801a83, 0x47801a83}, | ||
87 | {0x0000a5d0, 0x61842a6c, 0x61842a6c, 0x4a801c84, 0x4a801c84}, | ||
88 | {0x0000a5d4, 0x66862a6c, 0x66862a6c, 0x4e801ce3, 0x4e801ce3}, | ||
89 | {0x0000a5d8, 0x6b862e6c, 0x6b862e6c, 0x52801ce5, 0x52801ce5}, | ||
90 | {0x0000a5dc, 0x7086308c, 0x7086308c, 0x56801ce9, 0x56801ce9}, | ||
91 | {0x0000a5e0, 0x738a308a, 0x738a308a, 0x5a801ceb, 0x5a801ceb}, | ||
92 | {0x0000a5e4, 0x778a308c, 0x778a308c, 0x5d801eec, 0x5d801eec}, | ||
93 | {0x0000a5e8, 0x778a308c, 0x778a308c, 0x5d801eec, 0x5d801eec}, | ||
94 | {0x0000a5ec, 0x778a308c, 0x778a308c, 0x5d801eec, 0x5d801eec}, | ||
95 | {0x0000a5f0, 0x778a308c, 0x778a308c, 0x5d801eec, 0x5d801eec}, | ||
96 | {0x0000a5f4, 0x778a308c, 0x778a308c, 0x5d801eec, 0x5d801eec}, | ||
97 | {0x0000a5f8, 0x778a308c, 0x778a308c, 0x5d801eec, 0x5d801eec}, | ||
98 | {0x0000a5fc, 0x778a308c, 0x778a308c, 0x5d801eec, 0x5d801eec}, | ||
99 | {0x00016044, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, | ||
100 | {0x00016048, 0x60001a61, 0x60001a61, 0x60001a61, 0x60001a61}, | ||
101 | {0x00016068, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, | ||
102 | {0x00016444, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, | ||
103 | {0x00016448, 0x60001a61, 0x60001a61, 0x60001a61, 0x60001a61}, | ||
104 | {0x00016468, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, | ||
105 | {0x00016844, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, | ||
106 | {0x00016848, 0x60001a61, 0x60001a61, 0x60001a61, 0x60001a61}, | ||
107 | {0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, | ||
108 | }; | ||
109 | |||
110 | static const u32 ar9300Modes_fast_clock_2p0[][3] = { | ||
111 | /* Addr 5G_HT20 5G_HT40 */ | ||
112 | {0x00001030, 0x00000268, 0x000004d0}, | ||
113 | {0x00001070, 0x0000018c, 0x00000318}, | ||
114 | {0x000010b0, 0x00000fd0, 0x00001fa0}, | ||
115 | {0x00008014, 0x044c044c, 0x08980898}, | ||
116 | {0x0000801c, 0x148ec02b, 0x148ec057}, | ||
117 | {0x00008318, 0x000044c0, 0x00008980}, | ||
118 | {0x00009e00, 0x03721821, 0x03721821}, | ||
119 | {0x0000a230, 0x0000000b, 0x00000016}, | ||
120 | {0x0000a254, 0x00000898, 0x00001130}, | ||
121 | }; | ||
122 | |||
123 | static const u32 ar9300_2p0_radio_core[][2] = { | ||
124 | /* Addr allmodes */ | ||
125 | {0x00016000, 0x36db6db6}, | ||
126 | {0x00016004, 0x6db6db40}, | ||
127 | {0x00016008, 0x73f00000}, | ||
128 | {0x0001600c, 0x00000000}, | ||
129 | {0x00016040, 0x7f80fff8}, | ||
130 | {0x0001604c, 0x76d005b5}, | ||
131 | {0x00016050, 0x556cf031}, | ||
132 | {0x00016054, 0x43449440}, | ||
133 | {0x00016058, 0x0c51c92c}, | ||
134 | {0x0001605c, 0x3db7fffc}, | ||
135 | {0x00016060, 0xfffffffc}, | ||
136 | {0x00016064, 0x000f0278}, | ||
137 | {0x0001606c, 0x6db60000}, | ||
138 | {0x00016080, 0x00000000}, | ||
139 | {0x00016084, 0x0e48048c}, | ||
140 | {0x00016088, 0x54214514}, | ||
141 | {0x0001608c, 0x119f481e}, | ||
142 | {0x00016090, 0x24926490}, | ||
143 | {0x00016098, 0xd2888888}, | ||
144 | {0x000160a0, 0x0a108ffe}, | ||
145 | {0x000160a4, 0x812fc370}, | ||
146 | {0x000160a8, 0x423c8000}, | ||
147 | {0x000160b4, 0x92480080}, | ||
148 | {0x000160c0, 0x00adb6d0}, | ||
149 | {0x000160c4, 0x6db6db60}, | ||
150 | {0x000160c8, 0x6db6db6c}, | ||
151 | {0x000160cc, 0x01e6c000}, | ||
152 | {0x00016100, 0x3fffbe01}, | ||
153 | {0x00016104, 0xfff80000}, | ||
154 | {0x00016108, 0x00080010}, | ||
155 | {0x00016140, 0x10804008}, | ||
156 | {0x00016144, 0x02084080}, | ||
157 | {0x00016148, 0x00000000}, | ||
158 | {0x00016280, 0x058a0001}, | ||
159 | {0x00016284, 0x3d840208}, | ||
160 | {0x00016288, 0x01a20408}, | ||
161 | {0x0001628c, 0x00038c07}, | ||
162 | {0x00016290, 0x40000004}, | ||
163 | {0x00016294, 0x458aa14f}, | ||
164 | {0x00016380, 0x00000000}, | ||
165 | {0x00016384, 0x00000000}, | ||
166 | {0x00016388, 0x00800700}, | ||
167 | {0x0001638c, 0x00800700}, | ||
168 | {0x00016390, 0x00800700}, | ||
169 | {0x00016394, 0x00000000}, | ||
170 | {0x00016398, 0x00000000}, | ||
171 | {0x0001639c, 0x00000000}, | ||
172 | {0x000163a0, 0x00000001}, | ||
173 | {0x000163a4, 0x00000001}, | ||
174 | {0x000163a8, 0x00000000}, | ||
175 | {0x000163ac, 0x00000000}, | ||
176 | {0x000163b0, 0x00000000}, | ||
177 | {0x000163b4, 0x00000000}, | ||
178 | {0x000163b8, 0x00000000}, | ||
179 | {0x000163bc, 0x00000000}, | ||
180 | {0x000163c0, 0x000000a0}, | ||
181 | {0x000163c4, 0x000c0000}, | ||
182 | {0x000163c8, 0x14021402}, | ||
183 | {0x000163cc, 0x00001402}, | ||
184 | {0x000163d0, 0x00000000}, | ||
185 | {0x000163d4, 0x00000000}, | ||
186 | {0x00016400, 0x36db6db6}, | ||
187 | {0x00016404, 0x6db6db40}, | ||
188 | {0x00016408, 0x73f00000}, | ||
189 | {0x0001640c, 0x00000000}, | ||
190 | {0x00016440, 0x7f80fff8}, | ||
191 | {0x0001644c, 0x76d005b5}, | ||
192 | {0x00016450, 0x556cf031}, | ||
193 | {0x00016454, 0x43449440}, | ||
194 | {0x00016458, 0x0c51c92c}, | ||
195 | {0x0001645c, 0x3db7fffc}, | ||
196 | {0x00016460, 0xfffffffc}, | ||
197 | {0x00016464, 0x000f0278}, | ||
198 | {0x0001646c, 0x6db60000}, | ||
199 | {0x00016500, 0x3fffbe01}, | ||
200 | {0x00016504, 0xfff80000}, | ||
201 | {0x00016508, 0x00080010}, | ||
202 | {0x00016540, 0x10804008}, | ||
203 | {0x00016544, 0x02084080}, | ||
204 | {0x00016548, 0x00000000}, | ||
205 | {0x00016780, 0x00000000}, | ||
206 | {0x00016784, 0x00000000}, | ||
207 | {0x00016788, 0x00800700}, | ||
208 | {0x0001678c, 0x00800700}, | ||
209 | {0x00016790, 0x00800700}, | ||
210 | {0x00016794, 0x00000000}, | ||
211 | {0x00016798, 0x00000000}, | ||
212 | {0x0001679c, 0x00000000}, | ||
213 | {0x000167a0, 0x00000001}, | ||
214 | {0x000167a4, 0x00000001}, | ||
215 | {0x000167a8, 0x00000000}, | ||
216 | {0x000167ac, 0x00000000}, | ||
217 | {0x000167b0, 0x00000000}, | ||
218 | {0x000167b4, 0x00000000}, | ||
219 | {0x000167b8, 0x00000000}, | ||
220 | {0x000167bc, 0x00000000}, | ||
221 | {0x000167c0, 0x000000a0}, | ||
222 | {0x000167c4, 0x000c0000}, | ||
223 | {0x000167c8, 0x14021402}, | ||
224 | {0x000167cc, 0x00001402}, | ||
225 | {0x000167d0, 0x00000000}, | ||
226 | {0x000167d4, 0x00000000}, | ||
227 | {0x00016800, 0x36db6db6}, | ||
228 | {0x00016804, 0x6db6db40}, | ||
229 | {0x00016808, 0x73f00000}, | ||
230 | {0x0001680c, 0x00000000}, | ||
231 | {0x00016840, 0x7f80fff8}, | ||
232 | {0x0001684c, 0x76d005b5}, | ||
233 | {0x00016850, 0x556cf031}, | ||
234 | {0x00016854, 0x43449440}, | ||
235 | {0x00016858, 0x0c51c92c}, | ||
236 | {0x0001685c, 0x3db7fffc}, | ||
237 | {0x00016860, 0xfffffffc}, | ||
238 | {0x00016864, 0x000f0278}, | ||
239 | {0x0001686c, 0x6db60000}, | ||
240 | {0x00016900, 0x3fffbe01}, | ||
241 | {0x00016904, 0xfff80000}, | ||
242 | {0x00016908, 0x00080010}, | ||
243 | {0x00016940, 0x10804008}, | ||
244 | {0x00016944, 0x02084080}, | ||
245 | {0x00016948, 0x00000000}, | ||
246 | {0x00016b80, 0x00000000}, | ||
247 | {0x00016b84, 0x00000000}, | ||
248 | {0x00016b88, 0x00800700}, | ||
249 | {0x00016b8c, 0x00800700}, | ||
250 | {0x00016b90, 0x00800700}, | ||
251 | {0x00016b94, 0x00000000}, | ||
252 | {0x00016b98, 0x00000000}, | ||
253 | {0x00016b9c, 0x00000000}, | ||
254 | {0x00016ba0, 0x00000001}, | ||
255 | {0x00016ba4, 0x00000001}, | ||
256 | {0x00016ba8, 0x00000000}, | ||
257 | {0x00016bac, 0x00000000}, | ||
258 | {0x00016bb0, 0x00000000}, | ||
259 | {0x00016bb4, 0x00000000}, | ||
260 | {0x00016bb8, 0x00000000}, | ||
261 | {0x00016bbc, 0x00000000}, | ||
262 | {0x00016bc0, 0x000000a0}, | ||
263 | {0x00016bc4, 0x000c0000}, | ||
264 | {0x00016bc8, 0x14021402}, | ||
265 | {0x00016bcc, 0x00001402}, | ||
266 | {0x00016bd0, 0x00000000}, | ||
267 | {0x00016bd4, 0x00000000}, | ||
268 | }; | ||
269 | |||
270 | static const u32 ar9300Common_rx_gain_table_merlin_2p0[][2] = { | ||
271 | /* Addr allmodes */ | ||
272 | {0x0000a000, 0x02000101}, | ||
273 | {0x0000a004, 0x02000102}, | ||
274 | {0x0000a008, 0x02000103}, | ||
275 | {0x0000a00c, 0x02000104}, | ||
276 | {0x0000a010, 0x02000200}, | ||
277 | {0x0000a014, 0x02000201}, | ||
278 | {0x0000a018, 0x02000202}, | ||
279 | {0x0000a01c, 0x02000203}, | ||
280 | {0x0000a020, 0x02000204}, | ||
281 | {0x0000a024, 0x02000205}, | ||
282 | {0x0000a028, 0x02000208}, | ||
283 | {0x0000a02c, 0x02000302}, | ||
284 | {0x0000a030, 0x02000303}, | ||
285 | {0x0000a034, 0x02000304}, | ||
286 | {0x0000a038, 0x02000400}, | ||
287 | {0x0000a03c, 0x02010300}, | ||
288 | {0x0000a040, 0x02010301}, | ||
289 | {0x0000a044, 0x02010302}, | ||
290 | {0x0000a048, 0x02000500}, | ||
291 | {0x0000a04c, 0x02010400}, | ||
292 | {0x0000a050, 0x02020300}, | ||
293 | {0x0000a054, 0x02020301}, | ||
294 | {0x0000a058, 0x02020302}, | ||
295 | {0x0000a05c, 0x02020303}, | ||
296 | {0x0000a060, 0x02020400}, | ||
297 | {0x0000a064, 0x02030300}, | ||
298 | {0x0000a068, 0x02030301}, | ||
299 | {0x0000a06c, 0x02030302}, | ||
300 | {0x0000a070, 0x02030303}, | ||
301 | {0x0000a074, 0x02030400}, | ||
302 | {0x0000a078, 0x02040300}, | ||
303 | {0x0000a07c, 0x02040301}, | ||
304 | {0x0000a080, 0x02040302}, | ||
305 | {0x0000a084, 0x02040303}, | ||
306 | {0x0000a088, 0x02030500}, | ||
307 | {0x0000a08c, 0x02040400}, | ||
308 | {0x0000a090, 0x02050203}, | ||
309 | {0x0000a094, 0x02050204}, | ||
310 | {0x0000a098, 0x02050205}, | ||
311 | {0x0000a09c, 0x02040500}, | ||
312 | {0x0000a0a0, 0x02050301}, | ||
313 | {0x0000a0a4, 0x02050302}, | ||
314 | {0x0000a0a8, 0x02050303}, | ||
315 | {0x0000a0ac, 0x02050400}, | ||
316 | {0x0000a0b0, 0x02050401}, | ||
317 | {0x0000a0b4, 0x02050402}, | ||
318 | {0x0000a0b8, 0x02050403}, | ||
319 | {0x0000a0bc, 0x02050500}, | ||
320 | {0x0000a0c0, 0x02050501}, | ||
321 | {0x0000a0c4, 0x02050502}, | ||
322 | {0x0000a0c8, 0x02050503}, | ||
323 | {0x0000a0cc, 0x02050504}, | ||
324 | {0x0000a0d0, 0x02050600}, | ||
325 | {0x0000a0d4, 0x02050601}, | ||
326 | {0x0000a0d8, 0x02050602}, | ||
327 | {0x0000a0dc, 0x02050603}, | ||
328 | {0x0000a0e0, 0x02050604}, | ||
329 | {0x0000a0e4, 0x02050700}, | ||
330 | {0x0000a0e8, 0x02050701}, | ||
331 | {0x0000a0ec, 0x02050702}, | ||
332 | {0x0000a0f0, 0x02050703}, | ||
333 | {0x0000a0f4, 0x02050704}, | ||
334 | {0x0000a0f8, 0x02050705}, | ||
335 | {0x0000a0fc, 0x02050708}, | ||
336 | {0x0000a100, 0x02050709}, | ||
337 | {0x0000a104, 0x0205070a}, | ||
338 | {0x0000a108, 0x0205070b}, | ||
339 | {0x0000a10c, 0x0205070c}, | ||
340 | {0x0000a110, 0x0205070d}, | ||
341 | {0x0000a114, 0x02050710}, | ||
342 | {0x0000a118, 0x02050711}, | ||
343 | {0x0000a11c, 0x02050712}, | ||
344 | {0x0000a120, 0x02050713}, | ||
345 | {0x0000a124, 0x02050714}, | ||
346 | {0x0000a128, 0x02050715}, | ||
347 | {0x0000a12c, 0x02050730}, | ||
348 | {0x0000a130, 0x02050731}, | ||
349 | {0x0000a134, 0x02050732}, | ||
350 | {0x0000a138, 0x02050733}, | ||
351 | {0x0000a13c, 0x02050734}, | ||
352 | {0x0000a140, 0x02050735}, | ||
353 | {0x0000a144, 0x02050750}, | ||
354 | {0x0000a148, 0x02050751}, | ||
355 | {0x0000a14c, 0x02050752}, | ||
356 | {0x0000a150, 0x02050753}, | ||
357 | {0x0000a154, 0x02050754}, | ||
358 | {0x0000a158, 0x02050755}, | ||
359 | {0x0000a15c, 0x02050770}, | ||
360 | {0x0000a160, 0x02050771}, | ||
361 | {0x0000a164, 0x02050772}, | ||
362 | {0x0000a168, 0x02050773}, | ||
363 | {0x0000a16c, 0x02050774}, | ||
364 | {0x0000a170, 0x02050775}, | ||
365 | {0x0000a174, 0x00000776}, | ||
366 | {0x0000a178, 0x00000776}, | ||
367 | {0x0000a17c, 0x00000776}, | ||
368 | {0x0000a180, 0x00000776}, | ||
369 | {0x0000a184, 0x00000776}, | ||
370 | {0x0000a188, 0x00000776}, | ||
371 | {0x0000a18c, 0x00000776}, | ||
372 | {0x0000a190, 0x00000776}, | ||
373 | {0x0000a194, 0x00000776}, | ||
374 | {0x0000a198, 0x00000776}, | ||
375 | {0x0000a19c, 0x00000776}, | ||
376 | {0x0000a1a0, 0x00000776}, | ||
377 | {0x0000a1a4, 0x00000776}, | ||
378 | {0x0000a1a8, 0x00000776}, | ||
379 | {0x0000a1ac, 0x00000776}, | ||
380 | {0x0000a1b0, 0x00000776}, | ||
381 | {0x0000a1b4, 0x00000776}, | ||
382 | {0x0000a1b8, 0x00000776}, | ||
383 | {0x0000a1bc, 0x00000776}, | ||
384 | {0x0000a1c0, 0x00000776}, | ||
385 | {0x0000a1c4, 0x00000776}, | ||
386 | {0x0000a1c8, 0x00000776}, | ||
387 | {0x0000a1cc, 0x00000776}, | ||
388 | {0x0000a1d0, 0x00000776}, | ||
389 | {0x0000a1d4, 0x00000776}, | ||
390 | {0x0000a1d8, 0x00000776}, | ||
391 | {0x0000a1dc, 0x00000776}, | ||
392 | {0x0000a1e0, 0x00000776}, | ||
393 | {0x0000a1e4, 0x00000776}, | ||
394 | {0x0000a1e8, 0x00000776}, | ||
395 | {0x0000a1ec, 0x00000776}, | ||
396 | {0x0000a1f0, 0x00000776}, | ||
397 | {0x0000a1f4, 0x00000776}, | ||
398 | {0x0000a1f8, 0x00000776}, | ||
399 | {0x0000a1fc, 0x00000776}, | ||
400 | {0x0000b000, 0x02000101}, | ||
401 | {0x0000b004, 0x02000102}, | ||
402 | {0x0000b008, 0x02000103}, | ||
403 | {0x0000b00c, 0x02000104}, | ||
404 | {0x0000b010, 0x02000200}, | ||
405 | {0x0000b014, 0x02000201}, | ||
406 | {0x0000b018, 0x02000202}, | ||
407 | {0x0000b01c, 0x02000203}, | ||
408 | {0x0000b020, 0x02000204}, | ||
409 | {0x0000b024, 0x02000205}, | ||
410 | {0x0000b028, 0x02000208}, | ||
411 | {0x0000b02c, 0x02000302}, | ||
412 | {0x0000b030, 0x02000303}, | ||
413 | {0x0000b034, 0x02000304}, | ||
414 | {0x0000b038, 0x02000400}, | ||
415 | {0x0000b03c, 0x02010300}, | ||
416 | {0x0000b040, 0x02010301}, | ||
417 | {0x0000b044, 0x02010302}, | ||
418 | {0x0000b048, 0x02000500}, | ||
419 | {0x0000b04c, 0x02010400}, | ||
420 | {0x0000b050, 0x02020300}, | ||
421 | {0x0000b054, 0x02020301}, | ||
422 | {0x0000b058, 0x02020302}, | ||
423 | {0x0000b05c, 0x02020303}, | ||
424 | {0x0000b060, 0x02020400}, | ||
425 | {0x0000b064, 0x02030300}, | ||
426 | {0x0000b068, 0x02030301}, | ||
427 | {0x0000b06c, 0x02030302}, | ||
428 | {0x0000b070, 0x02030303}, | ||
429 | {0x0000b074, 0x02030400}, | ||
430 | {0x0000b078, 0x02040300}, | ||
431 | {0x0000b07c, 0x02040301}, | ||
432 | {0x0000b080, 0x02040302}, | ||
433 | {0x0000b084, 0x02040303}, | ||
434 | {0x0000b088, 0x02030500}, | ||
435 | {0x0000b08c, 0x02040400}, | ||
436 | {0x0000b090, 0x02050203}, | ||
437 | {0x0000b094, 0x02050204}, | ||
438 | {0x0000b098, 0x02050205}, | ||
439 | {0x0000b09c, 0x02040500}, | ||
440 | {0x0000b0a0, 0x02050301}, | ||
441 | {0x0000b0a4, 0x02050302}, | ||
442 | {0x0000b0a8, 0x02050303}, | ||
443 | {0x0000b0ac, 0x02050400}, | ||
444 | {0x0000b0b0, 0x02050401}, | ||
445 | {0x0000b0b4, 0x02050402}, | ||
446 | {0x0000b0b8, 0x02050403}, | ||
447 | {0x0000b0bc, 0x02050500}, | ||
448 | {0x0000b0c0, 0x02050501}, | ||
449 | {0x0000b0c4, 0x02050502}, | ||
450 | {0x0000b0c8, 0x02050503}, | ||
451 | {0x0000b0cc, 0x02050504}, | ||
452 | {0x0000b0d0, 0x02050600}, | ||
453 | {0x0000b0d4, 0x02050601}, | ||
454 | {0x0000b0d8, 0x02050602}, | ||
455 | {0x0000b0dc, 0x02050603}, | ||
456 | {0x0000b0e0, 0x02050604}, | ||
457 | {0x0000b0e4, 0x02050700}, | ||
458 | {0x0000b0e8, 0x02050701}, | ||
459 | {0x0000b0ec, 0x02050702}, | ||
460 | {0x0000b0f0, 0x02050703}, | ||
461 | {0x0000b0f4, 0x02050704}, | ||
462 | {0x0000b0f8, 0x02050705}, | ||
463 | {0x0000b0fc, 0x02050708}, | ||
464 | {0x0000b100, 0x02050709}, | ||
465 | {0x0000b104, 0x0205070a}, | ||
466 | {0x0000b108, 0x0205070b}, | ||
467 | {0x0000b10c, 0x0205070c}, | ||
468 | {0x0000b110, 0x0205070d}, | ||
469 | {0x0000b114, 0x02050710}, | ||
470 | {0x0000b118, 0x02050711}, | ||
471 | {0x0000b11c, 0x02050712}, | ||
472 | {0x0000b120, 0x02050713}, | ||
473 | {0x0000b124, 0x02050714}, | ||
474 | {0x0000b128, 0x02050715}, | ||
475 | {0x0000b12c, 0x02050730}, | ||
476 | {0x0000b130, 0x02050731}, | ||
477 | {0x0000b134, 0x02050732}, | ||
478 | {0x0000b138, 0x02050733}, | ||
479 | {0x0000b13c, 0x02050734}, | ||
480 | {0x0000b140, 0x02050735}, | ||
481 | {0x0000b144, 0x02050750}, | ||
482 | {0x0000b148, 0x02050751}, | ||
483 | {0x0000b14c, 0x02050752}, | ||
484 | {0x0000b150, 0x02050753}, | ||
485 | {0x0000b154, 0x02050754}, | ||
486 | {0x0000b158, 0x02050755}, | ||
487 | {0x0000b15c, 0x02050770}, | ||
488 | {0x0000b160, 0x02050771}, | ||
489 | {0x0000b164, 0x02050772}, | ||
490 | {0x0000b168, 0x02050773}, | ||
491 | {0x0000b16c, 0x02050774}, | ||
492 | {0x0000b170, 0x02050775}, | ||
493 | {0x0000b174, 0x00000776}, | ||
494 | {0x0000b178, 0x00000776}, | ||
495 | {0x0000b17c, 0x00000776}, | ||
496 | {0x0000b180, 0x00000776}, | ||
497 | {0x0000b184, 0x00000776}, | ||
498 | {0x0000b188, 0x00000776}, | ||
499 | {0x0000b18c, 0x00000776}, | ||
500 | {0x0000b190, 0x00000776}, | ||
501 | {0x0000b194, 0x00000776}, | ||
502 | {0x0000b198, 0x00000776}, | ||
503 | {0x0000b19c, 0x00000776}, | ||
504 | {0x0000b1a0, 0x00000776}, | ||
505 | {0x0000b1a4, 0x00000776}, | ||
506 | {0x0000b1a8, 0x00000776}, | ||
507 | {0x0000b1ac, 0x00000776}, | ||
508 | {0x0000b1b0, 0x00000776}, | ||
509 | {0x0000b1b4, 0x00000776}, | ||
510 | {0x0000b1b8, 0x00000776}, | ||
511 | {0x0000b1bc, 0x00000776}, | ||
512 | {0x0000b1c0, 0x00000776}, | ||
513 | {0x0000b1c4, 0x00000776}, | ||
514 | {0x0000b1c8, 0x00000776}, | ||
515 | {0x0000b1cc, 0x00000776}, | ||
516 | {0x0000b1d0, 0x00000776}, | ||
517 | {0x0000b1d4, 0x00000776}, | ||
518 | {0x0000b1d8, 0x00000776}, | ||
519 | {0x0000b1dc, 0x00000776}, | ||
520 | {0x0000b1e0, 0x00000776}, | ||
521 | {0x0000b1e4, 0x00000776}, | ||
522 | {0x0000b1e8, 0x00000776}, | ||
523 | {0x0000b1ec, 0x00000776}, | ||
524 | {0x0000b1f0, 0x00000776}, | ||
525 | {0x0000b1f4, 0x00000776}, | ||
526 | {0x0000b1f8, 0x00000776}, | ||
527 | {0x0000b1fc, 0x00000776}, | ||
528 | }; | ||
529 | |||
530 | static const u32 ar9300_2p0_mac_postamble[][5] = { | ||
531 | /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */ | ||
532 | {0x00001030, 0x00000230, 0x00000460, 0x000002c0, 0x00000160}, | ||
533 | {0x00001070, 0x00000168, 0x000002d0, 0x00000318, 0x0000018c}, | ||
534 | {0x000010b0, 0x00000e60, 0x00001cc0, 0x00007c70, 0x00003e38}, | ||
535 | {0x00008014, 0x03e803e8, 0x07d007d0, 0x10801600, 0x08400b00}, | ||
536 | {0x0000801c, 0x128d8027, 0x128d804f, 0x12e00057, 0x12e0002b}, | ||
537 | {0x00008120, 0x08f04800, 0x08f04800, 0x08f04810, 0x08f04810}, | ||
538 | {0x000081d0, 0x00003210, 0x00003210, 0x0000320a, 0x0000320a}, | ||
539 | {0x00008318, 0x00003e80, 0x00007d00, 0x00006880, 0x00003440}, | ||
540 | }; | ||
541 | |||
542 | static const u32 ar9300_2p0_soc_postamble[][5] = { | ||
543 | /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */ | ||
544 | {0x00007010, 0x00000023, 0x00000023, 0x00000022, 0x00000022}, | ||
545 | }; | ||
546 | |||
547 | static const u32 ar9200_merlin_2p0_radio_core[][2] = { | ||
548 | /* Addr common */ | ||
549 | {0x00007800, 0x00040000}, | ||
550 | {0x00007804, 0xdb005012}, | ||
551 | {0x00007808, 0x04924914}, | ||
552 | {0x0000780c, 0x21084210}, | ||
553 | {0x00007810, 0x6d801300}, | ||
554 | {0x00007814, 0x0019beff}, | ||
555 | {0x00007818, 0x07e41000}, | ||
556 | {0x0000781c, 0x00392000}, | ||
557 | {0x00007820, 0x92592480}, | ||
558 | {0x00007824, 0x00040000}, | ||
559 | {0x00007828, 0xdb005012}, | ||
560 | {0x0000782c, 0x04924914}, | ||
561 | {0x00007830, 0x21084210}, | ||
562 | {0x00007834, 0x6d801300}, | ||
563 | {0x00007838, 0x0019beff}, | ||
564 | {0x0000783c, 0x07e40000}, | ||
565 | {0x00007840, 0x00392000}, | ||
566 | {0x00007844, 0x92592480}, | ||
567 | {0x00007848, 0x00100000}, | ||
568 | {0x0000784c, 0x773f0567}, | ||
569 | {0x00007850, 0x54214514}, | ||
570 | {0x00007854, 0x12035828}, | ||
571 | {0x00007858, 0x92592692}, | ||
572 | {0x0000785c, 0x00000000}, | ||
573 | {0x00007860, 0x56400000}, | ||
574 | {0x00007864, 0x0a8e370e}, | ||
575 | {0x00007868, 0xc0102850}, | ||
576 | {0x0000786c, 0x812d4000}, | ||
577 | {0x00007870, 0x807ec400}, | ||
578 | {0x00007874, 0x001b6db0}, | ||
579 | {0x00007878, 0x00376b63}, | ||
580 | {0x0000787c, 0x06db6db6}, | ||
581 | {0x00007880, 0x006d8000}, | ||
582 | {0x00007884, 0xffeffffe}, | ||
583 | {0x00007888, 0xffeffffe}, | ||
584 | {0x0000788c, 0x00010000}, | ||
585 | {0x00007890, 0x02060aeb}, | ||
586 | {0x00007894, 0x5a108000}, | ||
587 | }; | ||
588 | |||
589 | static const u32 ar9300_2p0_baseband_postamble[][5] = { | ||
590 | /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */ | ||
591 | {0x00009810, 0xd00a8005, 0xd00a8005, 0xd00a8005, 0xd00a8005}, | ||
592 | {0x00009820, 0x206a022e, 0x206a022e, 0x206a012e, 0x206a012e}, | ||
593 | {0x00009824, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0, 0x5ac640d0}, | ||
594 | {0x00009828, 0x06903081, 0x06903081, 0x06903881, 0x06903881}, | ||
595 | {0x0000982c, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4, 0x05eea6d4}, | ||
596 | {0x00009830, 0x0000059c, 0x0000059c, 0x0000059c, 0x0000059c}, | ||
597 | {0x00009c00, 0x00000044, 0x000000c4, 0x000000c4, 0x00000044}, | ||
598 | {0x00009e00, 0x0372161e, 0x0372161e, 0x037216a0, 0x037216a0}, | ||
599 | {0x00009e04, 0x00802020, 0x00802020, 0x00802020, 0x00802020}, | ||
600 | {0x00009e0c, 0x6c4000e2, 0x6d4000e2, 0x6d4000e2, 0x6c4000e2}, | ||
601 | {0x00009e10, 0x7ec88d2e, 0x7ec88d2e, 0x7ec84d2e, 0x7ec84d2e}, | ||
602 | {0x00009e14, 0x31395d5e, 0x3139605e, 0x3139605e, 0x31395d5e}, | ||
603 | {0x00009e18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | ||
604 | {0x00009e1c, 0x0001cf9c, 0x0001cf9c, 0x00021f9c, 0x00021f9c}, | ||
605 | {0x00009e20, 0x000003b5, 0x000003b5, 0x000003ce, 0x000003ce}, | ||
606 | {0x00009e2c, 0x0000001c, 0x0000001c, 0x00000021, 0x00000021}, | ||
607 | {0x00009e44, 0x02321e27, 0x02321e27, 0x02282324, 0x02282324}, | ||
608 | {0x00009e48, 0x5030201a, 0x5030201a, 0x50302010, 0x50302010}, | ||
609 | {0x00009fc8, 0x0003f000, 0x0003f000, 0x0001a000, 0x0001a000}, | ||
610 | {0x0000a204, 0x000037c0, 0x000037c4, 0x000037c4, 0x000037c0}, | ||
611 | {0x0000a208, 0x00000104, 0x00000104, 0x00000004, 0x00000004}, | ||
612 | {0x0000a230, 0x0000000a, 0x00000014, 0x00000016, 0x0000000b}, | ||
613 | {0x0000a238, 0xffb81018, 0xffb81018, 0xffb81018, 0xffb81018}, | ||
614 | {0x0000a250, 0x00000000, 0x00000000, 0x00000210, 0x00000108}, | ||
615 | {0x0000a254, 0x000007d0, 0x00000fa0, 0x00001130, 0x00000898}, | ||
616 | {0x0000a258, 0x02020002, 0x02020002, 0x02020002, 0x02020002}, | ||
617 | {0x0000a25c, 0x01000e0e, 0x01000e0e, 0x01000e0e, 0x01000e0e}, | ||
618 | {0x0000a260, 0x0a021501, 0x0a021501, 0x3a021501, 0x3a021501}, | ||
619 | {0x0000a264, 0x00000e0e, 0x00000e0e, 0x00000e0e, 0x00000e0e}, | ||
620 | {0x0000a280, 0x00000007, 0x00000007, 0x0000000b, 0x0000000b}, | ||
621 | {0x0000a284, 0x00000000, 0x00000000, 0x00000150, 0x00000150}, | ||
622 | {0x0000a288, 0x00000110, 0x00000110, 0x00000110, 0x00000110}, | ||
623 | {0x0000a28c, 0x00022222, 0x00022222, 0x00022222, 0x00022222}, | ||
624 | {0x0000a2c4, 0x00158d18, 0x00158d18, 0x00158d18, 0x00158d18}, | ||
625 | {0x0000a2d0, 0x00071981, 0x00071981, 0x00071981, 0x00071982}, | ||
626 | {0x0000a2d8, 0xf999a83a, 0xf999a83a, 0xf999a83a, 0xf999a83a}, | ||
627 | {0x0000a358, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | ||
628 | {0x0000a830, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c}, | ||
629 | {0x0000ae04, 0x00800000, 0x00800000, 0x00800000, 0x00800000}, | ||
630 | {0x0000ae18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | ||
631 | {0x0000ae1c, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c}, | ||
632 | {0x0000ae20, 0x000001b5, 0x000001b5, 0x000001ce, 0x000001ce}, | ||
633 | {0x0000b284, 0x00000000, 0x00000000, 0x00000150, 0x00000150}, | ||
634 | {0x0000b830, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c}, | ||
635 | {0x0000be04, 0x00800000, 0x00800000, 0x00800000, 0x00800000}, | ||
636 | {0x0000be18, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | ||
637 | {0x0000be1c, 0x0000019c, 0x0000019c, 0x0000019c, 0x0000019c}, | ||
638 | {0x0000be20, 0x000001b5, 0x000001b5, 0x000001ce, 0x000001ce}, | ||
639 | {0x0000c284, 0x00000000, 0x00000000, 0x00000150, 0x00000150}, | ||
640 | }; | ||
641 | |||
642 | static const u32 ar9300_2p0_baseband_core[][2] = { | ||
643 | /* Addr allmodes */ | ||
644 | {0x00009800, 0xafe68e30}, | ||
645 | {0x00009804, 0xfd14e000}, | ||
646 | {0x00009808, 0x9c0a9f6b}, | ||
647 | {0x0000980c, 0x04900000}, | ||
648 | {0x00009814, 0x9280c00a}, | ||
649 | {0x00009818, 0x00000000}, | ||
650 | {0x0000981c, 0x00020028}, | ||
651 | {0x00009834, 0x5f3ca3de}, | ||
652 | {0x00009838, 0x0108ecff}, | ||
653 | {0x0000983c, 0x14750600}, | ||
654 | {0x00009880, 0x201fff00}, | ||
655 | {0x00009884, 0x00001042}, | ||
656 | {0x000098a4, 0x00200400}, | ||
657 | {0x000098b0, 0x52440bbe}, | ||
658 | {0x000098d0, 0x004b6a8e}, | ||
659 | {0x000098d4, 0x00000820}, | ||
660 | {0x000098dc, 0x00000000}, | ||
661 | {0x000098f0, 0x00000000}, | ||
662 | {0x000098f4, 0x00000000}, | ||
663 | {0x00009c04, 0xff55ff55}, | ||
664 | {0x00009c08, 0x0320ff55}, | ||
665 | {0x00009c0c, 0x00000000}, | ||
666 | {0x00009c10, 0x00000000}, | ||
667 | {0x00009c14, 0x00046384}, | ||
668 | {0x00009c18, 0x05b6b440}, | ||
669 | {0x00009c1c, 0x00b6b440}, | ||
670 | {0x00009d00, 0xc080a333}, | ||
671 | {0x00009d04, 0x40206c10}, | ||
672 | {0x00009d08, 0x009c4060}, | ||
673 | {0x00009d0c, 0x9883800a}, | ||
674 | {0x00009d10, 0x01834061}, | ||
675 | {0x00009d14, 0x00c0040b}, | ||
676 | {0x00009d18, 0x00000000}, | ||
677 | {0x00009e08, 0x0038233c}, | ||
678 | {0x00009e24, 0x990bb515}, | ||
679 | {0x00009e28, 0x0c6f0000}, | ||
680 | {0x00009e30, 0x06336f77}, | ||
681 | {0x00009e34, 0x6af6532f}, | ||
682 | {0x00009e38, 0x0cc80c00}, | ||
683 | {0x00009e3c, 0xcf946222}, | ||
684 | {0x00009e40, 0x0d261820}, | ||
685 | {0x00009e4c, 0x00001004}, | ||
686 | {0x00009e50, 0x00ff03f1}, | ||
687 | {0x00009e54, 0x00000000}, | ||
688 | {0x00009fc0, 0x803e4788}, | ||
689 | {0x00009fc4, 0x0001efb5}, | ||
690 | {0x00009fcc, 0x40000014}, | ||
691 | {0x00009fd0, 0x01193b93}, | ||
692 | {0x0000a20c, 0x00000000}, | ||
693 | {0x0000a220, 0x00000000}, | ||
694 | {0x0000a224, 0x00000000}, | ||
695 | {0x0000a228, 0x10002310}, | ||
696 | {0x0000a22c, 0x01036a1e}, | ||
697 | {0x0000a234, 0x10000fff}, | ||
698 | {0x0000a23c, 0x00000000}, | ||
699 | {0x0000a244, 0x0c000000}, | ||
700 | {0x0000a2a0, 0x00000001}, | ||
701 | {0x0000a2c0, 0x00000001}, | ||
702 | {0x0000a2c8, 0x00000000}, | ||
703 | {0x0000a2cc, 0x18c43433}, | ||
704 | {0x0000a2d4, 0x00000000}, | ||
705 | {0x0000a2dc, 0x00000000}, | ||
706 | {0x0000a2e0, 0x00000000}, | ||
707 | {0x0000a2e4, 0x00000000}, | ||
708 | {0x0000a2e8, 0x00000000}, | ||
709 | {0x0000a2ec, 0x00000000}, | ||
710 | {0x0000a2f0, 0x00000000}, | ||
711 | {0x0000a2f4, 0x00000000}, | ||
712 | {0x0000a2f8, 0x00000000}, | ||
713 | {0x0000a344, 0x00000000}, | ||
714 | {0x0000a34c, 0x00000000}, | ||
715 | {0x0000a350, 0x0000a000}, | ||
716 | {0x0000a364, 0x00000000}, | ||
717 | {0x0000a370, 0x00000000}, | ||
718 | {0x0000a390, 0x00000001}, | ||
719 | {0x0000a394, 0x00000444}, | ||
720 | {0x0000a398, 0x001f0e0f}, | ||
721 | {0x0000a39c, 0x0075393f}, | ||
722 | {0x0000a3a0, 0xb79f6427}, | ||
723 | {0x0000a3a4, 0x00000000}, | ||
724 | {0x0000a3a8, 0xaaaaaaaa}, | ||
725 | {0x0000a3ac, 0x3c466478}, | ||
726 | {0x0000a3c0, 0x20202020}, | ||
727 | {0x0000a3c4, 0x22222220}, | ||
728 | {0x0000a3c8, 0x20200020}, | ||
729 | {0x0000a3cc, 0x20202020}, | ||
730 | {0x0000a3d0, 0x20202020}, | ||
731 | {0x0000a3d4, 0x20202020}, | ||
732 | {0x0000a3d8, 0x20202020}, | ||
733 | {0x0000a3dc, 0x20202020}, | ||
734 | {0x0000a3e0, 0x20202020}, | ||
735 | {0x0000a3e4, 0x20202020}, | ||
736 | {0x0000a3e8, 0x20202020}, | ||
737 | {0x0000a3ec, 0x20202020}, | ||
738 | {0x0000a3f0, 0x00000000}, | ||
739 | {0x0000a3f4, 0x00000246}, | ||
740 | {0x0000a3f8, 0x0cdbd380}, | ||
741 | {0x0000a3fc, 0x000f0f01}, | ||
742 | {0x0000a400, 0x8fa91f01}, | ||
743 | {0x0000a404, 0x00000000}, | ||
744 | {0x0000a408, 0x0e79e5c6}, | ||
745 | {0x0000a40c, 0x00820820}, | ||
746 | {0x0000a414, 0x1ce739ce}, | ||
747 | {0x0000a418, 0x7d001dce}, | ||
748 | {0x0000a41c, 0x1ce739ce}, | ||
749 | {0x0000a420, 0x000001ce}, | ||
750 | {0x0000a424, 0x1ce739ce}, | ||
751 | {0x0000a428, 0x000001ce}, | ||
752 | {0x0000a42c, 0x1ce739ce}, | ||
753 | {0x0000a430, 0x1ce739ce}, | ||
754 | {0x0000a434, 0x00000000}, | ||
755 | {0x0000a438, 0x00001801}, | ||
756 | {0x0000a43c, 0x00000000}, | ||
757 | {0x0000a440, 0x00000000}, | ||
758 | {0x0000a444, 0x00000000}, | ||
759 | {0x0000a448, 0x07000080}, | ||
760 | {0x0000a44c, 0x00000001}, | ||
761 | {0x0000a450, 0x00010000}, | ||
762 | {0x0000a458, 0x00000000}, | ||
763 | {0x0000a600, 0x00000000}, | ||
764 | {0x0000a604, 0x00000000}, | ||
765 | {0x0000a608, 0x00000000}, | ||
766 | {0x0000a60c, 0x00000000}, | ||
767 | {0x0000a610, 0x00000000}, | ||
768 | {0x0000a614, 0x00000000}, | ||
769 | {0x0000a618, 0x00000000}, | ||
770 | {0x0000a61c, 0x00000000}, | ||
771 | {0x0000a620, 0x00000000}, | ||
772 | {0x0000a624, 0x00000000}, | ||
773 | {0x0000a628, 0x00000000}, | ||
774 | {0x0000a62c, 0x00000000}, | ||
775 | {0x0000a630, 0x00000000}, | ||
776 | {0x0000a634, 0x00000000}, | ||
777 | {0x0000a638, 0x00000000}, | ||
778 | {0x0000a63c, 0x00000000}, | ||
779 | {0x0000a640, 0x00000000}, | ||
780 | {0x0000a644, 0x3ffd9d74}, | ||
781 | {0x0000a648, 0x0048060a}, | ||
782 | {0x0000a64c, 0x00000637}, | ||
783 | {0x0000a670, 0x03020100}, | ||
784 | {0x0000a674, 0x09080504}, | ||
785 | {0x0000a678, 0x0d0c0b0a}, | ||
786 | {0x0000a67c, 0x13121110}, | ||
787 | {0x0000a680, 0x31301514}, | ||
788 | {0x0000a684, 0x35343332}, | ||
789 | {0x0000a688, 0x00000036}, | ||
790 | {0x0000a690, 0x00000838}, | ||
791 | {0x0000a7c0, 0x00000000}, | ||
792 | {0x0000a7c4, 0xfffffffc}, | ||
793 | {0x0000a7c8, 0x00000000}, | ||
794 | {0x0000a7cc, 0x00000000}, | ||
795 | {0x0000a7d0, 0x00000000}, | ||
796 | {0x0000a7d4, 0x00000004}, | ||
797 | {0x0000a7dc, 0x00000001}, | ||
798 | {0x0000a8d0, 0x004b6a8e}, | ||
799 | {0x0000a8d4, 0x00000820}, | ||
800 | {0x0000a8dc, 0x00000000}, | ||
801 | {0x0000a8f0, 0x00000000}, | ||
802 | {0x0000a8f4, 0x00000000}, | ||
803 | {0x0000b2d0, 0x00000080}, | ||
804 | {0x0000b2d4, 0x00000000}, | ||
805 | {0x0000b2dc, 0x00000000}, | ||
806 | {0x0000b2e0, 0x00000000}, | ||
807 | {0x0000b2e4, 0x00000000}, | ||
808 | {0x0000b2e8, 0x00000000}, | ||
809 | {0x0000b2ec, 0x00000000}, | ||
810 | {0x0000b2f0, 0x00000000}, | ||
811 | {0x0000b2f4, 0x00000000}, | ||
812 | {0x0000b2f8, 0x00000000}, | ||
813 | {0x0000b408, 0x0e79e5c0}, | ||
814 | {0x0000b40c, 0x00820820}, | ||
815 | {0x0000b420, 0x00000000}, | ||
816 | {0x0000b8d0, 0x004b6a8e}, | ||
817 | {0x0000b8d4, 0x00000820}, | ||
818 | {0x0000b8dc, 0x00000000}, | ||
819 | {0x0000b8f0, 0x00000000}, | ||
820 | {0x0000b8f4, 0x00000000}, | ||
821 | {0x0000c2d0, 0x00000080}, | ||
822 | {0x0000c2d4, 0x00000000}, | ||
823 | {0x0000c2dc, 0x00000000}, | ||
824 | {0x0000c2e0, 0x00000000}, | ||
825 | {0x0000c2e4, 0x00000000}, | ||
826 | {0x0000c2e8, 0x00000000}, | ||
827 | {0x0000c2ec, 0x00000000}, | ||
828 | {0x0000c2f0, 0x00000000}, | ||
829 | {0x0000c2f4, 0x00000000}, | ||
830 | {0x0000c2f8, 0x00000000}, | ||
831 | {0x0000c408, 0x0e79e5c0}, | ||
832 | {0x0000c40c, 0x00820820}, | ||
833 | {0x0000c420, 0x00000000}, | ||
834 | }; | ||
835 | |||
836 | static const u32 ar9300Modes_high_power_tx_gain_table_2p0[][5] = { | ||
837 | /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */ | ||
838 | {0x0000a410, 0x000050d9, 0x000050d9, 0x000050da, 0x000050da}, | ||
839 | {0x0000a500, 0x00020220, 0x00020220, 0x00000000, 0x00000000}, | ||
840 | {0x0000a504, 0x06020223, 0x06020223, 0x04000002, 0x04000002}, | ||
841 | {0x0000a508, 0x0b022220, 0x0b022220, 0x08000004, 0x08000004}, | ||
842 | {0x0000a50c, 0x10022223, 0x10022223, 0x0b000200, 0x0b000200}, | ||
843 | {0x0000a510, 0x17022620, 0x17022620, 0x0f000202, 0x0f000202}, | ||
844 | {0x0000a514, 0x1b022622, 0x1b022622, 0x11000400, 0x11000400}, | ||
845 | {0x0000a518, 0x1f022822, 0x1f022822, 0x15000402, 0x15000402}, | ||
846 | {0x0000a51c, 0x24022842, 0x24022842, 0x19000404, 0x19000404}, | ||
847 | {0x0000a520, 0x28042840, 0x28042840, 0x1b000603, 0x1b000603}, | ||
848 | {0x0000a524, 0x2c042842, 0x2c042842, 0x1f000a02, 0x1f000a02}, | ||
849 | {0x0000a528, 0x30042844, 0x30042844, 0x23000a04, 0x23000a04}, | ||
850 | {0x0000a52c, 0x34042846, 0x34042846, 0x26000a20, 0x26000a20}, | ||
851 | {0x0000a530, 0x39042869, 0x39042869, 0x2a000e20, 0x2a000e20}, | ||
852 | {0x0000a534, 0x3d062869, 0x3d062869, 0x2e000e22, 0x2e000e22}, | ||
853 | {0x0000a538, 0x44062c69, 0x44062c69, 0x31000e24, 0x31000e24}, | ||
854 | {0x0000a53c, 0x48063069, 0x48063069, 0x34001640, 0x34001640}, | ||
855 | {0x0000a540, 0x4c0a3065, 0x4c0a3065, 0x38001660, 0x38001660}, | ||
856 | {0x0000a544, 0x500a3069, 0x500a3069, 0x3b001861, 0x3b001861}, | ||
857 | {0x0000a548, 0x530a3469, 0x530a3469, 0x3e001a81, 0x3e001a81}, | ||
858 | {0x0000a54c, 0x590a7464, 0x590a7464, 0x42001a83, 0x42001a83}, | ||
859 | {0x0000a550, 0x5e0a7865, 0x5e0a7865, 0x44001c84, 0x44001c84}, | ||
860 | {0x0000a554, 0x630a7e66, 0x630a7e66, 0x48001ce3, 0x48001ce3}, | ||
861 | {0x0000a558, 0x680a7e89, 0x680a7e89, 0x4c001ce5, 0x4c001ce5}, | ||
862 | {0x0000a55c, 0x6e0a7e8c, 0x6e0a7e8c, 0x50001ce9, 0x50001ce9}, | ||
863 | {0x0000a560, 0x730e7e8c, 0x730e7e8c, 0x54001ceb, 0x54001ceb}, | ||
864 | {0x0000a564, 0x730e7e8c, 0x730e7e8c, 0x56001eec, 0x56001eec}, | ||
865 | {0x0000a568, 0x730e7e8c, 0x730e7e8c, 0x56001eec, 0x56001eec}, | ||
866 | {0x0000a56c, 0x730e7e8c, 0x730e7e8c, 0x56001eec, 0x56001eec}, | ||
867 | {0x0000a570, 0x730e7e8c, 0x730e7e8c, 0x56001eec, 0x56001eec}, | ||
868 | {0x0000a574, 0x730e7e8c, 0x730e7e8c, 0x56001eec, 0x56001eec}, | ||
869 | {0x0000a578, 0x730e7e8c, 0x730e7e8c, 0x56001eec, 0x56001eec}, | ||
870 | {0x0000a57c, 0x730e7e8c, 0x730e7e8c, 0x56001eec, 0x56001eec}, | ||
871 | {0x0000a580, 0x00820220, 0x00820220, 0x00800000, 0x00800000}, | ||
872 | {0x0000a584, 0x06820223, 0x06820223, 0x04800002, 0x04800002}, | ||
873 | {0x0000a588, 0x0b822220, 0x0b822220, 0x08800004, 0x08800004}, | ||
874 | {0x0000a58c, 0x10822223, 0x10822223, 0x0b800200, 0x0b800200}, | ||
875 | {0x0000a590, 0x17822620, 0x17822620, 0x0f800202, 0x0f800202}, | ||
876 | {0x0000a594, 0x1b822622, 0x1b822622, 0x11800400, 0x11800400}, | ||
877 | {0x0000a598, 0x1f822822, 0x1f822822, 0x15800402, 0x15800402}, | ||
878 | {0x0000a59c, 0x24822842, 0x24822842, 0x19800404, 0x19800404}, | ||
879 | {0x0000a5a0, 0x28842840, 0x28842840, 0x1b800603, 0x1b800603}, | ||
880 | {0x0000a5a4, 0x2c842842, 0x2c842842, 0x1f800a02, 0x1f800a02}, | ||
881 | {0x0000a5a8, 0x30842844, 0x30842844, 0x23800a04, 0x23800a04}, | ||
882 | {0x0000a5ac, 0x34842846, 0x34842846, 0x26800a20, 0x26800a20}, | ||
883 | {0x0000a5b0, 0x39842869, 0x39842869, 0x2a800e20, 0x2a800e20}, | ||
884 | {0x0000a5b4, 0x3d862869, 0x3d862869, 0x2e800e22, 0x2e800e22}, | ||
885 | {0x0000a5b8, 0x44862c69, 0x44862c69, 0x31800e24, 0x31800e24}, | ||
886 | {0x0000a5bc, 0x48863069, 0x48863069, 0x34801640, 0x34801640}, | ||
887 | {0x0000a5c0, 0x4c8a3065, 0x4c8a3065, 0x38801660, 0x38801660}, | ||
888 | {0x0000a5c4, 0x508a3069, 0x508a3069, 0x3b801861, 0x3b801861}, | ||
889 | {0x0000a5c8, 0x538a3469, 0x538a3469, 0x3e801a81, 0x3e801a81}, | ||
890 | {0x0000a5cc, 0x598a7464, 0x598a7464, 0x42801a83, 0x42801a83}, | ||
891 | {0x0000a5d0, 0x5e8a7865, 0x5e8a7865, 0x44801c84, 0x44801c84}, | ||
892 | {0x0000a5d4, 0x638a7e66, 0x638a7e66, 0x48801ce3, 0x48801ce3}, | ||
893 | {0x0000a5d8, 0x688a7e89, 0x688a7e89, 0x4c801ce5, 0x4c801ce5}, | ||
894 | {0x0000a5dc, 0x6e8a7e8c, 0x6e8a7e8c, 0x50801ce9, 0x50801ce9}, | ||
895 | {0x0000a5e0, 0x738e7e8c, 0x738e7e8c, 0x54801ceb, 0x54801ceb}, | ||
896 | {0x0000a5e4, 0x738e7e8c, 0x738e7e8c, 0x56801eec, 0x56801eec}, | ||
897 | {0x0000a5e8, 0x738e7e8c, 0x738e7e8c, 0x56801eec, 0x56801eec}, | ||
898 | {0x0000a5ec, 0x738e7e8c, 0x738e7e8c, 0x56801eec, 0x56801eec}, | ||
899 | {0x0000a5f0, 0x738e7e8c, 0x738e7e8c, 0x56801eec, 0x56801eec}, | ||
900 | {0x0000a5f4, 0x738e7e8c, 0x738e7e8c, 0x56801eec, 0x56801eec}, | ||
901 | {0x0000a5f8, 0x738e7e8c, 0x738e7e8c, 0x56801eec, 0x56801eec}, | ||
902 | {0x0000a5fc, 0x738e7e8c, 0x738e7e8c, 0x56801eec, 0x56801eec}, | ||
903 | {0x00016044, 0x056db2e6, 0x056db2e6, 0x056db2e6, 0x056db2e6}, | ||
904 | {0x00016048, 0xad241a61, 0xad241a61, 0xad241a61, 0xad241a61}, | ||
905 | {0x00016068, 0x6eb6db6c, 0x6eb6db6c, 0x6eb6db6c, 0x6eb6db6c}, | ||
906 | {0x00016444, 0x056db2e6, 0x056db2e6, 0x056db2e6, 0x056db2e6}, | ||
907 | {0x00016448, 0xad241a61, 0xad241a61, 0xad241a61, 0xad241a61}, | ||
908 | {0x00016468, 0x6eb6db6c, 0x6eb6db6c, 0x6eb6db6c, 0x6eb6db6c}, | ||
909 | {0x00016844, 0x056db2e6, 0x056db2e6, 0x056db2e6, 0x056db2e6}, | ||
910 | {0x00016848, 0xad241a61, 0xad241a61, 0xad241a61, 0xad241a61}, | ||
911 | {0x00016868, 0x6eb6db6c, 0x6eb6db6c, 0x6eb6db6c, 0x6eb6db6c}, | ||
912 | }; | ||
913 | |||
914 | static const u32 ar9300Modes_high_ob_db_tx_gain_table_2p0[][5] = { | ||
915 | /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */ | ||
916 | {0x0000a410, 0x000050d9, 0x000050d9, 0x000050da, 0x000050da}, | ||
917 | {0x0000a500, 0x00020220, 0x00020220, 0x00000000, 0x00000000}, | ||
918 | {0x0000a504, 0x06020223, 0x06020223, 0x04000002, 0x04000002}, | ||
919 | {0x0000a508, 0x0b022220, 0x0b022220, 0x08000004, 0x08000004}, | ||
920 | {0x0000a50c, 0x10022223, 0x10022223, 0x0b000200, 0x0b000200}, | ||
921 | {0x0000a510, 0x17022620, 0x17022620, 0x0f000202, 0x0f000202}, | ||
922 | {0x0000a514, 0x1b022622, 0x1b022622, 0x11000400, 0x11000400}, | ||
923 | {0x0000a518, 0x1f022822, 0x1f022822, 0x15000402, 0x15000402}, | ||
924 | {0x0000a51c, 0x24022842, 0x24022842, 0x19000404, 0x19000404}, | ||
925 | {0x0000a520, 0x28042840, 0x28042840, 0x1b000603, 0x1b000603}, | ||
926 | {0x0000a524, 0x2c042842, 0x2c042842, 0x1f000a02, 0x1f000a02}, | ||
927 | {0x0000a528, 0x30042844, 0x30042844, 0x23000a04, 0x23000a04}, | ||
928 | {0x0000a52c, 0x34042846, 0x34042846, 0x26000a20, 0x26000a20}, | ||
929 | {0x0000a530, 0x39042869, 0x39042869, 0x2a000e20, 0x2a000e20}, | ||
930 | {0x0000a534, 0x3d062869, 0x3d062869, 0x2e000e22, 0x2e000e22}, | ||
931 | {0x0000a538, 0x44062c69, 0x44062c69, 0x31000e24, 0x31000e24}, | ||
932 | {0x0000a53c, 0x48063069, 0x48063069, 0x34001640, 0x34001640}, | ||
933 | {0x0000a540, 0x4c0a3065, 0x4c0a3065, 0x38001660, 0x38001660}, | ||
934 | {0x0000a544, 0x500a3069, 0x500a3069, 0x3b001861, 0x3b001861}, | ||
935 | {0x0000a548, 0x530a3469, 0x530a3469, 0x3e001a81, 0x3e001a81}, | ||
936 | {0x0000a54c, 0x590a7464, 0x590a7464, 0x42001a83, 0x42001a83}, | ||
937 | {0x0000a550, 0x5e0a7865, 0x5e0a7865, 0x44001c84, 0x44001c84}, | ||
938 | {0x0000a554, 0x630a7e66, 0x630a7e66, 0x48001ce3, 0x48001ce3}, | ||
939 | {0x0000a558, 0x680a7e89, 0x680a7e89, 0x4c001ce5, 0x4c001ce5}, | ||
940 | {0x0000a55c, 0x6e0a7e8c, 0x6e0a7e8c, 0x50001ce9, 0x50001ce9}, | ||
941 | {0x0000a560, 0x730e7e8c, 0x730e7e8c, 0x54001ceb, 0x54001ceb}, | ||
942 | {0x0000a564, 0x730e7e8c, 0x730e7e8c, 0x56001eec, 0x56001eec}, | ||
943 | {0x0000a568, 0x730e7e8c, 0x730e7e8c, 0x56001eec, 0x56001eec}, | ||
944 | {0x0000a56c, 0x730e7e8c, 0x730e7e8c, 0x56001eec, 0x56001eec}, | ||
945 | {0x0000a570, 0x730e7e8c, 0x730e7e8c, 0x56001eec, 0x56001eec}, | ||
946 | {0x0000a574, 0x730e7e8c, 0x730e7e8c, 0x56001eec, 0x56001eec}, | ||
947 | {0x0000a578, 0x730e7e8c, 0x730e7e8c, 0x56001eec, 0x56001eec}, | ||
948 | {0x0000a57c, 0x730e7e8c, 0x730e7e8c, 0x56001eec, 0x56001eec}, | ||
949 | {0x0000a580, 0x00820220, 0x00820220, 0x00800000, 0x00800000}, | ||
950 | {0x0000a584, 0x06820223, 0x06820223, 0x04800002, 0x04800002}, | ||
951 | {0x0000a588, 0x0b822220, 0x0b822220, 0x08800004, 0x08800004}, | ||
952 | {0x0000a58c, 0x10822223, 0x10822223, 0x0b800200, 0x0b800200}, | ||
953 | {0x0000a590, 0x17822620, 0x17822620, 0x0f800202, 0x0f800202}, | ||
954 | {0x0000a594, 0x1b822622, 0x1b822622, 0x11800400, 0x11800400}, | ||
955 | {0x0000a598, 0x1f822822, 0x1f822822, 0x15800402, 0x15800402}, | ||
956 | {0x0000a59c, 0x24822842, 0x24822842, 0x19800404, 0x19800404}, | ||
957 | {0x0000a5a0, 0x28842840, 0x28842840, 0x1b800603, 0x1b800603}, | ||
958 | {0x0000a5a4, 0x2c842842, 0x2c842842, 0x1f800a02, 0x1f800a02}, | ||
959 | {0x0000a5a8, 0x30842844, 0x30842844, 0x23800a04, 0x23800a04}, | ||
960 | {0x0000a5ac, 0x34842846, 0x34842846, 0x26800a20, 0x26800a20}, | ||
961 | {0x0000a5b0, 0x39842869, 0x39842869, 0x2a800e20, 0x2a800e20}, | ||
962 | {0x0000a5b4, 0x3d862869, 0x3d862869, 0x2e800e22, 0x2e800e22}, | ||
963 | {0x0000a5b8, 0x44862c69, 0x44862c69, 0x31800e24, 0x31800e24}, | ||
964 | {0x0000a5bc, 0x48863069, 0x48863069, 0x34801640, 0x34801640}, | ||
965 | {0x0000a5c0, 0x4c8a3065, 0x4c8a3065, 0x38801660, 0x38801660}, | ||
966 | {0x0000a5c4, 0x508a3069, 0x508a3069, 0x3b801861, 0x3b801861}, | ||
967 | {0x0000a5c8, 0x538a3469, 0x538a3469, 0x3e801a81, 0x3e801a81}, | ||
968 | {0x0000a5cc, 0x598a7464, 0x598a7464, 0x42801a83, 0x42801a83}, | ||
969 | {0x0000a5d0, 0x5e8a7865, 0x5e8a7865, 0x44801c84, 0x44801c84}, | ||
970 | {0x0000a5d4, 0x638a7e66, 0x638a7e66, 0x48801ce3, 0x48801ce3}, | ||
971 | {0x0000a5d8, 0x688a7e89, 0x688a7e89, 0x4c801ce5, 0x4c801ce5}, | ||
972 | {0x0000a5dc, 0x6e8a7e8c, 0x6e8a7e8c, 0x50801ce9, 0x50801ce9}, | ||
973 | {0x0000a5e0, 0x738e7e8c, 0x738e7e8c, 0x54801ceb, 0x54801ceb}, | ||
974 | {0x0000a5e4, 0x738e7e8c, 0x738e7e8c, 0x56801eec, 0x56801eec}, | ||
975 | {0x0000a5e8, 0x738e7e8c, 0x738e7e8c, 0x56801eec, 0x56801eec}, | ||
976 | {0x0000a5ec, 0x738e7e8c, 0x738e7e8c, 0x56801eec, 0x56801eec}, | ||
977 | {0x0000a5f0, 0x738e7e8c, 0x738e7e8c, 0x56801eec, 0x56801eec}, | ||
978 | {0x0000a5f4, 0x738e7e8c, 0x738e7e8c, 0x56801eec, 0x56801eec}, | ||
979 | {0x0000a5f8, 0x738e7e8c, 0x738e7e8c, 0x56801eec, 0x56801eec}, | ||
980 | {0x0000a5fc, 0x738e7e8c, 0x738e7e8c, 0x56801eec, 0x56801eec}, | ||
981 | {0x00016044, 0x056db2e4, 0x056db2e4, 0x056db2e4, 0x056db2e4}, | ||
982 | {0x00016048, 0x8c001a61, 0x8c001a61, 0x8c001a61, 0x8c001a61}, | ||
983 | {0x00016068, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, | ||
984 | {0x00016444, 0x056db2e4, 0x056db2e4, 0x056db2e4, 0x056db2e4}, | ||
985 | {0x00016448, 0x8c001a61, 0x8c001a61, 0x8c001a61, 0x8c001a61}, | ||
986 | {0x00016468, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, | ||
987 | {0x00016844, 0x056db2e4, 0x056db2e4, 0x056db2e4, 0x056db2e4}, | ||
988 | {0x00016848, 0x8c001a61, 0x8c001a61, 0x8c001a61, 0x8c001a61}, | ||
989 | {0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, | ||
990 | }; | ||
991 | |||
992 | static const u32 ar9300Common_rx_gain_table_2p0[][2] = { | ||
993 | /* Addr allmodes */ | ||
994 | {0x0000a000, 0x00010000}, | ||
995 | {0x0000a004, 0x00030002}, | ||
996 | {0x0000a008, 0x00050004}, | ||
997 | {0x0000a00c, 0x00810080}, | ||
998 | {0x0000a010, 0x01800082}, | ||
999 | {0x0000a014, 0x01820181}, | ||
1000 | {0x0000a018, 0x01840183}, | ||
1001 | {0x0000a01c, 0x01880185}, | ||
1002 | {0x0000a020, 0x018a0189}, | ||
1003 | {0x0000a024, 0x02850284}, | ||
1004 | {0x0000a028, 0x02890288}, | ||
1005 | {0x0000a02c, 0x028b028a}, | ||
1006 | {0x0000a030, 0x028d028c}, | ||
1007 | {0x0000a034, 0x02910290}, | ||
1008 | {0x0000a038, 0x02930292}, | ||
1009 | {0x0000a03c, 0x03910390}, | ||
1010 | {0x0000a040, 0x03930392}, | ||
1011 | {0x0000a044, 0x03950394}, | ||
1012 | {0x0000a048, 0x00000396}, | ||
1013 | {0x0000a04c, 0x00000000}, | ||
1014 | {0x0000a050, 0x00000000}, | ||
1015 | {0x0000a054, 0x00000000}, | ||
1016 | {0x0000a058, 0x00000000}, | ||
1017 | {0x0000a05c, 0x00000000}, | ||
1018 | {0x0000a060, 0x00000000}, | ||
1019 | {0x0000a064, 0x00000000}, | ||
1020 | {0x0000a068, 0x00000000}, | ||
1021 | {0x0000a06c, 0x00000000}, | ||
1022 | {0x0000a070, 0x00000000}, | ||
1023 | {0x0000a074, 0x00000000}, | ||
1024 | {0x0000a078, 0x00000000}, | ||
1025 | {0x0000a07c, 0x00000000}, | ||
1026 | {0x0000a080, 0x28282828}, | ||
1027 | {0x0000a084, 0x21212128}, | ||
1028 | {0x0000a088, 0x21212121}, | ||
1029 | {0x0000a08c, 0x1c1c1c21}, | ||
1030 | {0x0000a090, 0x1c1c1c1c}, | ||
1031 | {0x0000a094, 0x17171c1c}, | ||
1032 | {0x0000a098, 0x02020212}, | ||
1033 | {0x0000a09c, 0x02020202}, | ||
1034 | {0x0000a0a0, 0x00000000}, | ||
1035 | {0x0000a0a4, 0x00000000}, | ||
1036 | {0x0000a0a8, 0x00000000}, | ||
1037 | {0x0000a0ac, 0x00000000}, | ||
1038 | {0x0000a0b0, 0x00000000}, | ||
1039 | {0x0000a0b4, 0x00000000}, | ||
1040 | {0x0000a0b8, 0x00000000}, | ||
1041 | {0x0000a0bc, 0x00000000}, | ||
1042 | {0x0000a0c0, 0x001f0000}, | ||
1043 | {0x0000a0c4, 0x011f0100}, | ||
1044 | {0x0000a0c8, 0x011d011e}, | ||
1045 | {0x0000a0cc, 0x011b011c}, | ||
1046 | {0x0000a0d0, 0x02030204}, | ||
1047 | {0x0000a0d4, 0x02010202}, | ||
1048 | {0x0000a0d8, 0x021f0200}, | ||
1049 | {0x0000a0dc, 0x021d021e}, | ||
1050 | {0x0000a0e0, 0x03010302}, | ||
1051 | {0x0000a0e4, 0x031f0300}, | ||
1052 | {0x0000a0e8, 0x0402031e}, | ||
1053 | {0x0000a0ec, 0x04000401}, | ||
1054 | {0x0000a0f0, 0x041e041f}, | ||
1055 | {0x0000a0f4, 0x05010502}, | ||
1056 | {0x0000a0f8, 0x051f0500}, | ||
1057 | {0x0000a0fc, 0x0602051e}, | ||
1058 | {0x0000a100, 0x06000601}, | ||
1059 | {0x0000a104, 0x061e061f}, | ||
1060 | {0x0000a108, 0x0703061d}, | ||
1061 | {0x0000a10c, 0x07010702}, | ||
1062 | {0x0000a110, 0x00000700}, | ||
1063 | {0x0000a114, 0x00000000}, | ||
1064 | {0x0000a118, 0x00000000}, | ||
1065 | {0x0000a11c, 0x00000000}, | ||
1066 | {0x0000a120, 0x00000000}, | ||
1067 | {0x0000a124, 0x00000000}, | ||
1068 | {0x0000a128, 0x00000000}, | ||
1069 | {0x0000a12c, 0x00000000}, | ||
1070 | {0x0000a130, 0x00000000}, | ||
1071 | {0x0000a134, 0x00000000}, | ||
1072 | {0x0000a138, 0x00000000}, | ||
1073 | {0x0000a13c, 0x00000000}, | ||
1074 | {0x0000a140, 0x001f0000}, | ||
1075 | {0x0000a144, 0x011f0100}, | ||
1076 | {0x0000a148, 0x011d011e}, | ||
1077 | {0x0000a14c, 0x011b011c}, | ||
1078 | {0x0000a150, 0x02030204}, | ||
1079 | {0x0000a154, 0x02010202}, | ||
1080 | {0x0000a158, 0x021f0200}, | ||
1081 | {0x0000a15c, 0x021d021e}, | ||
1082 | {0x0000a160, 0x03010302}, | ||
1083 | {0x0000a164, 0x031f0300}, | ||
1084 | {0x0000a168, 0x0402031e}, | ||
1085 | {0x0000a16c, 0x04000401}, | ||
1086 | {0x0000a170, 0x041e041f}, | ||
1087 | {0x0000a174, 0x05010502}, | ||
1088 | {0x0000a178, 0x051f0500}, | ||
1089 | {0x0000a17c, 0x0602051e}, | ||
1090 | {0x0000a180, 0x06000601}, | ||
1091 | {0x0000a184, 0x061e061f}, | ||
1092 | {0x0000a188, 0x0703061d}, | ||
1093 | {0x0000a18c, 0x07010702}, | ||
1094 | {0x0000a190, 0x00000700}, | ||
1095 | {0x0000a194, 0x00000000}, | ||
1096 | {0x0000a198, 0x00000000}, | ||
1097 | {0x0000a19c, 0x00000000}, | ||
1098 | {0x0000a1a0, 0x00000000}, | ||
1099 | {0x0000a1a4, 0x00000000}, | ||
1100 | {0x0000a1a8, 0x00000000}, | ||
1101 | {0x0000a1ac, 0x00000000}, | ||
1102 | {0x0000a1b0, 0x00000000}, | ||
1103 | {0x0000a1b4, 0x00000000}, | ||
1104 | {0x0000a1b8, 0x00000000}, | ||
1105 | {0x0000a1bc, 0x00000000}, | ||
1106 | {0x0000a1c0, 0x00000000}, | ||
1107 | {0x0000a1c4, 0x00000000}, | ||
1108 | {0x0000a1c8, 0x00000000}, | ||
1109 | {0x0000a1cc, 0x00000000}, | ||
1110 | {0x0000a1d0, 0x00000000}, | ||
1111 | {0x0000a1d4, 0x00000000}, | ||
1112 | {0x0000a1d8, 0x00000000}, | ||
1113 | {0x0000a1dc, 0x00000000}, | ||
1114 | {0x0000a1e0, 0x00000000}, | ||
1115 | {0x0000a1e4, 0x00000000}, | ||
1116 | {0x0000a1e8, 0x00000000}, | ||
1117 | {0x0000a1ec, 0x00000000}, | ||
1118 | {0x0000a1f0, 0x00000396}, | ||
1119 | {0x0000a1f4, 0x00000396}, | ||
1120 | {0x0000a1f8, 0x00000396}, | ||
1121 | {0x0000a1fc, 0x00000196}, | ||
1122 | {0x0000b000, 0x00010000}, | ||
1123 | {0x0000b004, 0x00030002}, | ||
1124 | {0x0000b008, 0x00050004}, | ||
1125 | {0x0000b00c, 0x00810080}, | ||
1126 | {0x0000b010, 0x00830082}, | ||
1127 | {0x0000b014, 0x01810180}, | ||
1128 | {0x0000b018, 0x01830182}, | ||
1129 | {0x0000b01c, 0x01850184}, | ||
1130 | {0x0000b020, 0x02810280}, | ||
1131 | {0x0000b024, 0x02830282}, | ||
1132 | {0x0000b028, 0x02850284}, | ||
1133 | {0x0000b02c, 0x02890288}, | ||
1134 | {0x0000b030, 0x028b028a}, | ||
1135 | {0x0000b034, 0x0388028c}, | ||
1136 | {0x0000b038, 0x038a0389}, | ||
1137 | {0x0000b03c, 0x038c038b}, | ||
1138 | {0x0000b040, 0x0390038d}, | ||
1139 | {0x0000b044, 0x03920391}, | ||
1140 | {0x0000b048, 0x03940393}, | ||
1141 | {0x0000b04c, 0x03960395}, | ||
1142 | {0x0000b050, 0x00000000}, | ||
1143 | {0x0000b054, 0x00000000}, | ||
1144 | {0x0000b058, 0x00000000}, | ||
1145 | {0x0000b05c, 0x00000000}, | ||
1146 | {0x0000b060, 0x00000000}, | ||
1147 | {0x0000b064, 0x00000000}, | ||
1148 | {0x0000b068, 0x00000000}, | ||
1149 | {0x0000b06c, 0x00000000}, | ||
1150 | {0x0000b070, 0x00000000}, | ||
1151 | {0x0000b074, 0x00000000}, | ||
1152 | {0x0000b078, 0x00000000}, | ||
1153 | {0x0000b07c, 0x00000000}, | ||
1154 | {0x0000b080, 0x32323232}, | ||
1155 | {0x0000b084, 0x2f2f3232}, | ||
1156 | {0x0000b088, 0x23282a2d}, | ||
1157 | {0x0000b08c, 0x1c1e2123}, | ||
1158 | {0x0000b090, 0x14171919}, | ||
1159 | {0x0000b094, 0x0e0e1214}, | ||
1160 | {0x0000b098, 0x03050707}, | ||
1161 | {0x0000b09c, 0x00030303}, | ||
1162 | {0x0000b0a0, 0x00000000}, | ||
1163 | {0x0000b0a4, 0x00000000}, | ||
1164 | {0x0000b0a8, 0x00000000}, | ||
1165 | {0x0000b0ac, 0x00000000}, | ||
1166 | {0x0000b0b0, 0x00000000}, | ||
1167 | {0x0000b0b4, 0x00000000}, | ||
1168 | {0x0000b0b8, 0x00000000}, | ||
1169 | {0x0000b0bc, 0x00000000}, | ||
1170 | {0x0000b0c0, 0x003f0020}, | ||
1171 | {0x0000b0c4, 0x00400041}, | ||
1172 | {0x0000b0c8, 0x0140005f}, | ||
1173 | {0x0000b0cc, 0x0160015f}, | ||
1174 | {0x0000b0d0, 0x017e017f}, | ||
1175 | {0x0000b0d4, 0x02410242}, | ||
1176 | {0x0000b0d8, 0x025f0240}, | ||
1177 | {0x0000b0dc, 0x027f0260}, | ||
1178 | {0x0000b0e0, 0x0341027e}, | ||
1179 | {0x0000b0e4, 0x035f0340}, | ||
1180 | {0x0000b0e8, 0x037f0360}, | ||
1181 | {0x0000b0ec, 0x04400441}, | ||
1182 | {0x0000b0f0, 0x0460045f}, | ||
1183 | {0x0000b0f4, 0x0541047f}, | ||
1184 | {0x0000b0f8, 0x055f0540}, | ||
1185 | {0x0000b0fc, 0x057f0560}, | ||
1186 | {0x0000b100, 0x06400641}, | ||
1187 | {0x0000b104, 0x0660065f}, | ||
1188 | {0x0000b108, 0x067e067f}, | ||
1189 | {0x0000b10c, 0x07410742}, | ||
1190 | {0x0000b110, 0x075f0740}, | ||
1191 | {0x0000b114, 0x077f0760}, | ||
1192 | {0x0000b118, 0x07800781}, | ||
1193 | {0x0000b11c, 0x07a0079f}, | ||
1194 | {0x0000b120, 0x07c107bf}, | ||
1195 | {0x0000b124, 0x000007c0}, | ||
1196 | {0x0000b128, 0x00000000}, | ||
1197 | {0x0000b12c, 0x00000000}, | ||
1198 | {0x0000b130, 0x00000000}, | ||
1199 | {0x0000b134, 0x00000000}, | ||
1200 | {0x0000b138, 0x00000000}, | ||
1201 | {0x0000b13c, 0x00000000}, | ||
1202 | {0x0000b140, 0x003f0020}, | ||
1203 | {0x0000b144, 0x00400041}, | ||
1204 | {0x0000b148, 0x0140005f}, | ||
1205 | {0x0000b14c, 0x0160015f}, | ||
1206 | {0x0000b150, 0x017e017f}, | ||
1207 | {0x0000b154, 0x02410242}, | ||
1208 | {0x0000b158, 0x025f0240}, | ||
1209 | {0x0000b15c, 0x027f0260}, | ||
1210 | {0x0000b160, 0x0341027e}, | ||
1211 | {0x0000b164, 0x035f0340}, | ||
1212 | {0x0000b168, 0x037f0360}, | ||
1213 | {0x0000b16c, 0x04400441}, | ||
1214 | {0x0000b170, 0x0460045f}, | ||
1215 | {0x0000b174, 0x0541047f}, | ||
1216 | {0x0000b178, 0x055f0540}, | ||
1217 | {0x0000b17c, 0x057f0560}, | ||
1218 | {0x0000b180, 0x06400641}, | ||
1219 | {0x0000b184, 0x0660065f}, | ||
1220 | {0x0000b188, 0x067e067f}, | ||
1221 | {0x0000b18c, 0x07410742}, | ||
1222 | {0x0000b190, 0x075f0740}, | ||
1223 | {0x0000b194, 0x077f0760}, | ||
1224 | {0x0000b198, 0x07800781}, | ||
1225 | {0x0000b19c, 0x07a0079f}, | ||
1226 | {0x0000b1a0, 0x07c107bf}, | ||
1227 | {0x0000b1a4, 0x000007c0}, | ||
1228 | {0x0000b1a8, 0x00000000}, | ||
1229 | {0x0000b1ac, 0x00000000}, | ||
1230 | {0x0000b1b0, 0x00000000}, | ||
1231 | {0x0000b1b4, 0x00000000}, | ||
1232 | {0x0000b1b8, 0x00000000}, | ||
1233 | {0x0000b1bc, 0x00000000}, | ||
1234 | {0x0000b1c0, 0x00000000}, | ||
1235 | {0x0000b1c4, 0x00000000}, | ||
1236 | {0x0000b1c8, 0x00000000}, | ||
1237 | {0x0000b1cc, 0x00000000}, | ||
1238 | {0x0000b1d0, 0x00000000}, | ||
1239 | {0x0000b1d4, 0x00000000}, | ||
1240 | {0x0000b1d8, 0x00000000}, | ||
1241 | {0x0000b1dc, 0x00000000}, | ||
1242 | {0x0000b1e0, 0x00000000}, | ||
1243 | {0x0000b1e4, 0x00000000}, | ||
1244 | {0x0000b1e8, 0x00000000}, | ||
1245 | {0x0000b1ec, 0x00000000}, | ||
1246 | {0x0000b1f0, 0x00000396}, | ||
1247 | {0x0000b1f4, 0x00000396}, | ||
1248 | {0x0000b1f8, 0x00000396}, | ||
1249 | {0x0000b1fc, 0x00000196}, | ||
1250 | }; | ||
1251 | |||
1252 | static const u32 ar9300Modes_low_ob_db_tx_gain_table_2p0[][5] = { | ||
1253 | /* Addr 5G_HT20 5G_HT40 2G_HT40 2G_HT20 */ | ||
1254 | {0x0000a410, 0x000050da, 0x000050da, 0x000050da, 0x000050da}, | ||
1255 | {0x0000a500, 0x00000000, 0x00000000, 0x00000000, 0x00000000}, | ||
1256 | {0x0000a504, 0x06000003, 0x06000003, 0x04000002, 0x04000002}, | ||
1257 | {0x0000a508, 0x0a000020, 0x0a000020, 0x08000004, 0x08000004}, | ||
1258 | {0x0000a50c, 0x10000023, 0x10000023, 0x0b000200, 0x0b000200}, | ||
1259 | {0x0000a510, 0x16000220, 0x16000220, 0x0f000202, 0x0f000202}, | ||
1260 | {0x0000a514, 0x1c000223, 0x1c000223, 0x12000400, 0x12000400}, | ||
1261 | {0x0000a518, 0x21020220, 0x21020220, 0x16000402, 0x16000402}, | ||
1262 | {0x0000a51c, 0x27020223, 0x27020223, 0x19000404, 0x19000404}, | ||
1263 | {0x0000a520, 0x2b022220, 0x2b022220, 0x1c000603, 0x1c000603}, | ||
1264 | {0x0000a524, 0x2f022222, 0x2f022222, 0x21000a02, 0x21000a02}, | ||
1265 | {0x0000a528, 0x34022225, 0x34022225, 0x25000a04, 0x25000a04}, | ||
1266 | {0x0000a52c, 0x3a02222a, 0x3a02222a, 0x28000a20, 0x28000a20}, | ||
1267 | {0x0000a530, 0x3e02222c, 0x3e02222c, 0x2c000e20, 0x2c000e20}, | ||
1268 | {0x0000a534, 0x4202242a, 0x4202242a, 0x30000e22, 0x30000e22}, | ||
1269 | {0x0000a538, 0x4702244a, 0x4702244a, 0x34000e24, 0x34000e24}, | ||
1270 | {0x0000a53c, 0x4b02244c, 0x4b02244c, 0x38001640, 0x38001640}, | ||
1271 | {0x0000a540, 0x4e02246c, 0x4e02246c, 0x3c001660, 0x3c001660}, | ||
1272 | {0x0000a544, 0x5302266c, 0x5302266c, 0x3f001861, 0x3f001861}, | ||
1273 | {0x0000a548, 0x5702286c, 0x5702286c, 0x43001a81, 0x43001a81}, | ||
1274 | {0x0000a54c, 0x5c04286b, 0x5c04286b, 0x47001a83, 0x47001a83}, | ||
1275 | {0x0000a550, 0x61042a6c, 0x61042a6c, 0x4a001c84, 0x4a001c84}, | ||
1276 | {0x0000a554, 0x66062a6c, 0x66062a6c, 0x4e001ce3, 0x4e001ce3}, | ||
1277 | {0x0000a558, 0x6b062e6c, 0x6b062e6c, 0x52001ce5, 0x52001ce5}, | ||
1278 | {0x0000a55c, 0x7006308c, 0x7006308c, 0x56001ce9, 0x56001ce9}, | ||
1279 | {0x0000a560, 0x730a308a, 0x730a308a, 0x5a001ceb, 0x5a001ceb}, | ||
1280 | {0x0000a564, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec}, | ||
1281 | {0x0000a568, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec}, | ||
1282 | {0x0000a56c, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec}, | ||
1283 | {0x0000a570, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec}, | ||
1284 | {0x0000a574, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec}, | ||
1285 | {0x0000a578, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec}, | ||
1286 | {0x0000a57c, 0x770a308c, 0x770a308c, 0x5d001eec, 0x5d001eec}, | ||
1287 | {0x0000a580, 0x00800000, 0x00800000, 0x00800000, 0x00800000}, | ||
1288 | {0x0000a584, 0x06800003, 0x06800003, 0x04800002, 0x04800002}, | ||
1289 | {0x0000a588, 0x0a800020, 0x0a800020, 0x08800004, 0x08800004}, | ||
1290 | {0x0000a58c, 0x10800023, 0x10800023, 0x0b800200, 0x0b800200}, | ||
1291 | {0x0000a590, 0x16800220, 0x16800220, 0x0f800202, 0x0f800202}, | ||
1292 | {0x0000a594, 0x1c800223, 0x1c800223, 0x12800400, 0x12800400}, | ||
1293 | {0x0000a598, 0x21820220, 0x21820220, 0x16800402, 0x16800402}, | ||
1294 | {0x0000a59c, 0x27820223, 0x27820223, 0x19800404, 0x19800404}, | ||
1295 | {0x0000a5a0, 0x2b822220, 0x2b822220, 0x1c800603, 0x1c800603}, | ||
1296 | {0x0000a5a4, 0x2f822222, 0x2f822222, 0x21800a02, 0x21800a02}, | ||
1297 | {0x0000a5a8, 0x34822225, 0x34822225, 0x25800a04, 0x25800a04}, | ||
1298 | {0x0000a5ac, 0x3a82222a, 0x3a82222a, 0x28800a20, 0x28800a20}, | ||
1299 | {0x0000a5b0, 0x3e82222c, 0x3e82222c, 0x2c800e20, 0x2c800e20}, | ||
1300 | {0x0000a5b4, 0x4282242a, 0x4282242a, 0x30800e22, 0x30800e22}, | ||
1301 | {0x0000a5b8, 0x4782244a, 0x4782244a, 0x34800e24, 0x34800e24}, | ||
1302 | {0x0000a5bc, 0x4b82244c, 0x4b82244c, 0x38801640, 0x38801640}, | ||
1303 | {0x0000a5c0, 0x4e82246c, 0x4e82246c, 0x3c801660, 0x3c801660}, | ||
1304 | {0x0000a5c4, 0x5382266c, 0x5382266c, 0x3f801861, 0x3f801861}, | ||
1305 | {0x0000a5c8, 0x5782286c, 0x5782286c, 0x43801a81, 0x43801a81}, | ||
1306 | {0x0000a5cc, 0x5c84286b, 0x5c84286b, 0x47801a83, 0x47801a83}, | ||
1307 | {0x0000a5d0, 0x61842a6c, 0x61842a6c, 0x4a801c84, 0x4a801c84}, | ||
1308 | {0x0000a5d4, 0x66862a6c, 0x66862a6c, 0x4e801ce3, 0x4e801ce3}, | ||
1309 | {0x0000a5d8, 0x6b862e6c, 0x6b862e6c, 0x52801ce5, 0x52801ce5}, | ||
1310 | {0x0000a5dc, 0x7086308c, 0x7086308c, 0x56801ce9, 0x56801ce9}, | ||
1311 | {0x0000a5e0, 0x738a308a, 0x738a308a, 0x5a801ceb, 0x5a801ceb}, | ||
1312 | {0x0000a5e4, 0x778a308c, 0x778a308c, 0x5d801eec, 0x5d801eec}, | ||
1313 | {0x0000a5e8, 0x778a308c, 0x778a308c, 0x5d801eec, 0x5d801eec}, | ||
1314 | {0x0000a5ec, 0x778a308c, 0x778a308c, 0x5d801eec, 0x5d801eec}, | ||
1315 | {0x0000a5f0, 0x778a308c, 0x778a308c, 0x5d801eec, 0x5d801eec}, | ||
1316 | {0x0000a5f4, 0x778a308c, 0x778a308c, 0x5d801eec, 0x5d801eec}, | ||
1317 | {0x0000a5f8, 0x778a308c, 0x778a308c, 0x5d801eec, 0x5d801eec}, | ||
1318 | {0x0000a5fc, 0x778a308c, 0x778a308c, 0x5d801eec, 0x5d801eec}, | ||
1319 | {0x00016044, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, | ||
1320 | {0x00016048, 0x64001a61, 0x64001a61, 0x64001a61, 0x64001a61}, | ||
1321 | {0x00016068, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, | ||
1322 | {0x00016444, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, | ||
1323 | {0x00016448, 0x64001a61, 0x64001a61, 0x64001a61, 0x64001a61}, | ||
1324 | {0x00016468, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, | ||
1325 | {0x00016844, 0x012492d4, 0x012492d4, 0x012492d4, 0x012492d4}, | ||
1326 | {0x00016848, 0x64001a61, 0x64001a61, 0x64001a61, 0x64001a61}, | ||
1327 | {0x00016868, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c, 0x6db6db6c}, | ||
1328 | }; | ||
1329 | |||
1330 | static const u32 ar9300_2p0_mac_core[][2] = { | ||
1331 | /* Addr allmodes */ | ||
1332 | {0x00000008, 0x00000000}, | ||
1333 | {0x00000030, 0x00020085}, | ||
1334 | {0x00000034, 0x00000005}, | ||
1335 | {0x00000040, 0x00000000}, | ||
1336 | {0x00000044, 0x00000000}, | ||
1337 | {0x00000048, 0x00000008}, | ||
1338 | {0x0000004c, 0x00000010}, | ||
1339 | {0x00000050, 0x00000000}, | ||
1340 | {0x00001040, 0x002ffc0f}, | ||
1341 | {0x00001044, 0x002ffc0f}, | ||
1342 | {0x00001048, 0x002ffc0f}, | ||
1343 | {0x0000104c, 0x002ffc0f}, | ||
1344 | {0x00001050, 0x002ffc0f}, | ||
1345 | {0x00001054, 0x002ffc0f}, | ||
1346 | {0x00001058, 0x002ffc0f}, | ||
1347 | {0x0000105c, 0x002ffc0f}, | ||
1348 | {0x00001060, 0x002ffc0f}, | ||
1349 | {0x00001064, 0x002ffc0f}, | ||
1350 | {0x000010f0, 0x00000100}, | ||
1351 | {0x00001270, 0x00000000}, | ||
1352 | {0x000012b0, 0x00000000}, | ||
1353 | {0x000012f0, 0x00000000}, | ||
1354 | {0x0000143c, 0x00000000}, | ||
1355 | {0x0000147c, 0x00000000}, | ||
1356 | {0x00008000, 0x00000000}, | ||
1357 | {0x00008004, 0x00000000}, | ||
1358 | {0x00008008, 0x00000000}, | ||
1359 | {0x0000800c, 0x00000000}, | ||
1360 | {0x00008018, 0x00000000}, | ||
1361 | {0x00008020, 0x00000000}, | ||
1362 | {0x00008038, 0x00000000}, | ||
1363 | {0x0000803c, 0x00000000}, | ||
1364 | {0x00008040, 0x00000000}, | ||
1365 | {0x00008044, 0x00000000}, | ||
1366 | {0x00008048, 0x00000000}, | ||
1367 | {0x0000804c, 0xffffffff}, | ||
1368 | {0x00008054, 0x00000000}, | ||
1369 | {0x00008058, 0x00000000}, | ||
1370 | {0x0000805c, 0x000fc78f}, | ||
1371 | {0x00008060, 0x0000000f}, | ||
1372 | {0x00008064, 0x00000000}, | ||
1373 | {0x00008070, 0x00000310}, | ||
1374 | {0x00008074, 0x00000020}, | ||
1375 | {0x00008078, 0x00000000}, | ||
1376 | {0x0000809c, 0x0000000f}, | ||
1377 | {0x000080a0, 0x00000000}, | ||
1378 | {0x000080a4, 0x02ff0000}, | ||
1379 | {0x000080a8, 0x0e070605}, | ||
1380 | {0x000080ac, 0x0000000d}, | ||
1381 | {0x000080b0, 0x00000000}, | ||
1382 | {0x000080b4, 0x00000000}, | ||
1383 | {0x000080b8, 0x00000000}, | ||
1384 | {0x000080bc, 0x00000000}, | ||
1385 | {0x000080c0, 0x2a800000}, | ||
1386 | {0x000080c4, 0x06900168}, | ||
1387 | {0x000080c8, 0x13881c20}, | ||
1388 | {0x000080cc, 0x01f40000}, | ||
1389 | {0x000080d0, 0x00252500}, | ||
1390 | {0x000080d4, 0x00a00000}, | ||
1391 | {0x000080d8, 0x00400000}, | ||
1392 | {0x000080dc, 0x00000000}, | ||
1393 | {0x000080e0, 0xffffffff}, | ||
1394 | {0x000080e4, 0x0000ffff}, | ||
1395 | {0x000080e8, 0x3f3f3f3f}, | ||
1396 | {0x000080ec, 0x00000000}, | ||
1397 | {0x000080f0, 0x00000000}, | ||
1398 | {0x000080f4, 0x00000000}, | ||
1399 | {0x000080fc, 0x00020000}, | ||
1400 | {0x00008100, 0x00000000}, | ||
1401 | {0x00008108, 0x00000052}, | ||
1402 | {0x0000810c, 0x00000000}, | ||
1403 | {0x00008110, 0x00000000}, | ||
1404 | {0x00008114, 0x000007ff}, | ||
1405 | {0x00008118, 0x000000aa}, | ||
1406 | {0x0000811c, 0x00003210}, | ||
1407 | {0x00008124, 0x00000000}, | ||
1408 | {0x00008128, 0x00000000}, | ||
1409 | {0x0000812c, 0x00000000}, | ||
1410 | {0x00008130, 0x00000000}, | ||
1411 | {0x00008134, 0x00000000}, | ||
1412 | {0x00008138, 0x00000000}, | ||
1413 | {0x0000813c, 0x0000ffff}, | ||
1414 | {0x00008144, 0xffffffff}, | ||
1415 | {0x00008168, 0x00000000}, | ||
1416 | {0x0000816c, 0x00000000}, | ||
1417 | {0x00008170, 0x18486200}, | ||
1418 | {0x00008174, 0x33332210}, | ||
1419 | {0x00008178, 0x00000000}, | ||
1420 | {0x0000817c, 0x00020000}, | ||
1421 | {0x000081c0, 0x00000000}, | ||
1422 | {0x000081c4, 0x33332210}, | ||
1423 | {0x000081c8, 0x00000000}, | ||
1424 | {0x000081cc, 0x00000000}, | ||
1425 | {0x000081d4, 0x00000000}, | ||
1426 | {0x000081ec, 0x00000000}, | ||
1427 | {0x000081f0, 0x00000000}, | ||
1428 | {0x000081f4, 0x00000000}, | ||
1429 | {0x000081f8, 0x00000000}, | ||
1430 | {0x000081fc, 0x00000000}, | ||
1431 | {0x00008240, 0x00100000}, | ||
1432 | {0x00008244, 0x0010f424}, | ||
1433 | {0x00008248, 0x00000800}, | ||
1434 | {0x0000824c, 0x0001e848}, | ||
1435 | {0x00008250, 0x00000000}, | ||
1436 | {0x00008254, 0x00000000}, | ||
1437 | {0x00008258, 0x00000000}, | ||
1438 | {0x0000825c, 0x40000000}, | ||
1439 | {0x00008260, 0x00080922}, | ||
1440 | {0x00008264, 0x98a00010}, | ||
1441 | {0x00008268, 0xffffffff}, | ||
1442 | {0x0000826c, 0x0000ffff}, | ||
1443 | {0x00008270, 0x00000000}, | ||
1444 | {0x00008274, 0x40000000}, | ||
1445 | {0x00008278, 0x003e4180}, | ||
1446 | {0x0000827c, 0x00000004}, | ||
1447 | {0x00008284, 0x0000002c}, | ||
1448 | {0x00008288, 0x0000002c}, | ||
1449 | {0x0000828c, 0x000000ff}, | ||
1450 | {0x00008294, 0x00000000}, | ||
1451 | {0x00008298, 0x00000000}, | ||
1452 | {0x0000829c, 0x00000000}, | ||
1453 | {0x00008300, 0x00000140}, | ||
1454 | {0x00008314, 0x00000000}, | ||
1455 | {0x0000831c, 0x0000010d}, | ||
1456 | {0x00008328, 0x00000000}, | ||
1457 | {0x0000832c, 0x00000007}, | ||
1458 | {0x00008330, 0x00000302}, | ||
1459 | {0x00008334, 0x00000700}, | ||
1460 | {0x00008338, 0x00ff0000}, | ||
1461 | {0x0000833c, 0x02400000}, | ||
1462 | {0x00008340, 0x000107ff}, | ||
1463 | {0x00008344, 0xaa48105b}, | ||
1464 | {0x00008348, 0x008f0000}, | ||
1465 | {0x0000835c, 0x00000000}, | ||
1466 | {0x00008360, 0xffffffff}, | ||
1467 | {0x00008364, 0xffffffff}, | ||
1468 | {0x00008368, 0x00000000}, | ||
1469 | {0x00008370, 0x00000000}, | ||
1470 | {0x00008374, 0x000000ff}, | ||
1471 | {0x00008378, 0x00000000}, | ||
1472 | {0x0000837c, 0x00000000}, | ||
1473 | {0x00008380, 0xffffffff}, | ||
1474 | {0x00008384, 0xffffffff}, | ||
1475 | {0x00008390, 0xffffffff}, | ||
1476 | {0x00008394, 0xffffffff}, | ||
1477 | {0x00008398, 0x00000000}, | ||
1478 | {0x0000839c, 0x00000000}, | ||
1479 | {0x000083a0, 0x00000000}, | ||
1480 | {0x000083a4, 0x0000fa14}, | ||
1481 | {0x000083a8, 0x000f0c00}, | ||
1482 | {0x000083ac, 0x33332210}, | ||
1483 | {0x000083b0, 0x33332210}, | ||
1484 | {0x000083b4, 0x33332210}, | ||
1485 | {0x000083b8, 0x33332210}, | ||
1486 | {0x000083bc, 0x00000000}, | ||
1487 | {0x000083c0, 0x00000000}, | ||
1488 | {0x000083c4, 0x00000000}, | ||
1489 | {0x000083c8, 0x00000000}, | ||
1490 | {0x000083cc, 0x00000200}, | ||
1491 | {0x000083d0, 0x000301ff}, | ||
1492 | }; | ||
1493 | |||
1494 | static const u32 ar9300Common_wo_xlna_rx_gain_table_2p0[][2] = { | ||
1495 | /* Addr allmodes */ | ||
1496 | {0x0000a000, 0x00010000}, | ||
1497 | {0x0000a004, 0x00030002}, | ||
1498 | {0x0000a008, 0x00050004}, | ||
1499 | {0x0000a00c, 0x00810080}, | ||
1500 | {0x0000a010, 0x01800082}, | ||
1501 | {0x0000a014, 0x01820181}, | ||
1502 | {0x0000a018, 0x01840183}, | ||
1503 | {0x0000a01c, 0x01880185}, | ||
1504 | {0x0000a020, 0x018a0189}, | ||
1505 | {0x0000a024, 0x02850284}, | ||
1506 | {0x0000a028, 0x02890288}, | ||
1507 | {0x0000a02c, 0x03850384}, | ||
1508 | {0x0000a030, 0x03890388}, | ||
1509 | {0x0000a034, 0x038b038a}, | ||
1510 | {0x0000a038, 0x038d038c}, | ||
1511 | {0x0000a03c, 0x03910390}, | ||
1512 | {0x0000a040, 0x03930392}, | ||
1513 | {0x0000a044, 0x03950394}, | ||
1514 | {0x0000a048, 0x00000396}, | ||
1515 | {0x0000a04c, 0x00000000}, | ||
1516 | {0x0000a050, 0x00000000}, | ||
1517 | {0x0000a054, 0x00000000}, | ||
1518 | {0x0000a058, 0x00000000}, | ||
1519 | {0x0000a05c, 0x00000000}, | ||
1520 | {0x0000a060, 0x00000000}, | ||
1521 | {0x0000a064, 0x00000000}, | ||
1522 | {0x0000a068, 0x00000000}, | ||
1523 | {0x0000a06c, 0x00000000}, | ||
1524 | {0x0000a070, 0x00000000}, | ||
1525 | {0x0000a074, 0x00000000}, | ||
1526 | {0x0000a078, 0x00000000}, | ||
1527 | {0x0000a07c, 0x00000000}, | ||
1528 | {0x0000a080, 0x28282828}, | ||
1529 | {0x0000a084, 0x28282828}, | ||
1530 | {0x0000a088, 0x28282828}, | ||
1531 | {0x0000a08c, 0x28282828}, | ||
1532 | {0x0000a090, 0x28282828}, | ||
1533 | {0x0000a094, 0x21212128}, | ||
1534 | {0x0000a098, 0x171c1c1c}, | ||
1535 | {0x0000a09c, 0x02020212}, | ||
1536 | {0x0000a0a0, 0x00000202}, | ||
1537 | {0x0000a0a4, 0x00000000}, | ||
1538 | {0x0000a0a8, 0x00000000}, | ||
1539 | {0x0000a0ac, 0x00000000}, | ||
1540 | {0x0000a0b0, 0x00000000}, | ||
1541 | {0x0000a0b4, 0x00000000}, | ||
1542 | {0x0000a0b8, 0x00000000}, | ||
1543 | {0x0000a0bc, 0x00000000}, | ||
1544 | {0x0000a0c0, 0x001f0000}, | ||
1545 | {0x0000a0c4, 0x011f0100}, | ||
1546 | {0x0000a0c8, 0x011d011e}, | ||
1547 | {0x0000a0cc, 0x011b011c}, | ||
1548 | {0x0000a0d0, 0x02030204}, | ||
1549 | {0x0000a0d4, 0x02010202}, | ||
1550 | {0x0000a0d8, 0x021f0200}, | ||
1551 | {0x0000a0dc, 0x021d021e}, | ||
1552 | {0x0000a0e0, 0x03010302}, | ||
1553 | {0x0000a0e4, 0x031f0300}, | ||
1554 | {0x0000a0e8, 0x0402031e}, | ||
1555 | {0x0000a0ec, 0x04000401}, | ||
1556 | {0x0000a0f0, 0x041e041f}, | ||
1557 | {0x0000a0f4, 0x05010502}, | ||
1558 | {0x0000a0f8, 0x051f0500}, | ||
1559 | {0x0000a0fc, 0x0602051e}, | ||
1560 | {0x0000a100, 0x06000601}, | ||
1561 | {0x0000a104, 0x061e061f}, | ||
1562 | {0x0000a108, 0x0703061d}, | ||
1563 | {0x0000a10c, 0x07010702}, | ||
1564 | {0x0000a110, 0x00000700}, | ||
1565 | {0x0000a114, 0x00000000}, | ||
1566 | {0x0000a118, 0x00000000}, | ||
1567 | {0x0000a11c, 0x00000000}, | ||
1568 | {0x0000a120, 0x00000000}, | ||
1569 | {0x0000a124, 0x00000000}, | ||
1570 | {0x0000a128, 0x00000000}, | ||
1571 | {0x0000a12c, 0x00000000}, | ||
1572 | {0x0000a130, 0x00000000}, | ||
1573 | {0x0000a134, 0x00000000}, | ||
1574 | {0x0000a138, 0x00000000}, | ||
1575 | {0x0000a13c, 0x00000000}, | ||
1576 | {0x0000a140, 0x001f0000}, | ||
1577 | {0x0000a144, 0x011f0100}, | ||
1578 | {0x0000a148, 0x011d011e}, | ||
1579 | {0x0000a14c, 0x011b011c}, | ||
1580 | {0x0000a150, 0x02030204}, | ||
1581 | {0x0000a154, 0x02010202}, | ||
1582 | {0x0000a158, 0x021f0200}, | ||
1583 | {0x0000a15c, 0x021d021e}, | ||
1584 | {0x0000a160, 0x03010302}, | ||
1585 | {0x0000a164, 0x031f0300}, | ||
1586 | {0x0000a168, 0x0402031e}, | ||
1587 | {0x0000a16c, 0x04000401}, | ||
1588 | {0x0000a170, 0x041e041f}, | ||
1589 | {0x0000a174, 0x05010502}, | ||
1590 | {0x0000a178, 0x051f0500}, | ||
1591 | {0x0000a17c, 0x0602051e}, | ||
1592 | {0x0000a180, 0x06000601}, | ||
1593 | {0x0000a184, 0x061e061f}, | ||
1594 | {0x0000a188, 0x0703061d}, | ||
1595 | {0x0000a18c, 0x07010702}, | ||
1596 | {0x0000a190, 0x00000700}, | ||
1597 | {0x0000a194, 0x00000000}, | ||
1598 | {0x0000a198, 0x00000000}, | ||
1599 | {0x0000a19c, 0x00000000}, | ||
1600 | {0x0000a1a0, 0x00000000}, | ||
1601 | {0x0000a1a4, 0x00000000}, | ||
1602 | {0x0000a1a8, 0x00000000}, | ||
1603 | {0x0000a1ac, 0x00000000}, | ||
1604 | {0x0000a1b0, 0x00000000}, | ||
1605 | {0x0000a1b4, 0x00000000}, | ||
1606 | {0x0000a1b8, 0x00000000}, | ||
1607 | {0x0000a1bc, 0x00000000}, | ||
1608 | {0x0000a1c0, 0x00000000}, | ||
1609 | {0x0000a1c4, 0x00000000}, | ||
1610 | {0x0000a1c8, 0x00000000}, | ||
1611 | {0x0000a1cc, 0x00000000}, | ||
1612 | {0x0000a1d0, 0x00000000}, | ||
1613 | {0x0000a1d4, 0x00000000}, | ||
1614 | {0x0000a1d8, 0x00000000}, | ||
1615 | {0x0000a1dc, 0x00000000}, | ||
1616 | {0x0000a1e0, 0x00000000}, | ||
1617 | {0x0000a1e4, 0x00000000}, | ||
1618 | {0x0000a1e8, 0x00000000}, | ||
1619 | {0x0000a1ec, 0x00000000}, | ||
1620 | {0x0000a1f0, 0x00000396}, | ||
1621 | {0x0000a1f4, 0x00000396}, | ||
1622 | {0x0000a1f8, 0x00000396}, | ||
1623 | {0x0000a1fc, 0x00000296}, | ||
1624 | {0x0000b000, 0x00010000}, | ||
1625 | {0x0000b004, 0x00030002}, | ||
1626 | {0x0000b008, 0x00050004}, | ||
1627 | {0x0000b00c, 0x00810080}, | ||
1628 | {0x0000b010, 0x00830082}, | ||
1629 | {0x0000b014, 0x01810180}, | ||
1630 | {0x0000b018, 0x01830182}, | ||
1631 | {0x0000b01c, 0x01850184}, | ||
1632 | {0x0000b020, 0x02810280}, | ||
1633 | {0x0000b024, 0x02830282}, | ||
1634 | {0x0000b028, 0x02850284}, | ||
1635 | {0x0000b02c, 0x02890288}, | ||
1636 | {0x0000b030, 0x028b028a}, | ||
1637 | {0x0000b034, 0x0388028c}, | ||
1638 | {0x0000b038, 0x038a0389}, | ||
1639 | {0x0000b03c, 0x038c038b}, | ||
1640 | {0x0000b040, 0x0390038d}, | ||
1641 | {0x0000b044, 0x03920391}, | ||
1642 | {0x0000b048, 0x03940393}, | ||
1643 | {0x0000b04c, 0x03960395}, | ||
1644 | {0x0000b050, 0x00000000}, | ||
1645 | {0x0000b054, 0x00000000}, | ||
1646 | {0x0000b058, 0x00000000}, | ||
1647 | {0x0000b05c, 0x00000000}, | ||
1648 | {0x0000b060, 0x00000000}, | ||
1649 | {0x0000b064, 0x00000000}, | ||
1650 | {0x0000b068, 0x00000000}, | ||
1651 | {0x0000b06c, 0x00000000}, | ||
1652 | {0x0000b070, 0x00000000}, | ||
1653 | {0x0000b074, 0x00000000}, | ||
1654 | {0x0000b078, 0x00000000}, | ||
1655 | {0x0000b07c, 0x00000000}, | ||
1656 | {0x0000b080, 0x32323232}, | ||
1657 | {0x0000b084, 0x2f2f3232}, | ||
1658 | {0x0000b088, 0x23282a2d}, | ||
1659 | {0x0000b08c, 0x1c1e2123}, | ||
1660 | {0x0000b090, 0x14171919}, | ||
1661 | {0x0000b094, 0x0e0e1214}, | ||
1662 | {0x0000b098, 0x03050707}, | ||
1663 | {0x0000b09c, 0x00030303}, | ||
1664 | {0x0000b0a0, 0x00000000}, | ||
1665 | {0x0000b0a4, 0x00000000}, | ||
1666 | {0x0000b0a8, 0x00000000}, | ||
1667 | {0x0000b0ac, 0x00000000}, | ||
1668 | {0x0000b0b0, 0x00000000}, | ||
1669 | {0x0000b0b4, 0x00000000}, | ||
1670 | {0x0000b0b8, 0x00000000}, | ||
1671 | {0x0000b0bc, 0x00000000}, | ||
1672 | {0x0000b0c0, 0x003f0020}, | ||
1673 | {0x0000b0c4, 0x00400041}, | ||
1674 | {0x0000b0c8, 0x0140005f}, | ||
1675 | {0x0000b0cc, 0x0160015f}, | ||
1676 | {0x0000b0d0, 0x017e017f}, | ||
1677 | {0x0000b0d4, 0x02410242}, | ||
1678 | {0x0000b0d8, 0x025f0240}, | ||
1679 | {0x0000b0dc, 0x027f0260}, | ||
1680 | {0x0000b0e0, 0x0341027e}, | ||
1681 | {0x0000b0e4, 0x035f0340}, | ||
1682 | {0x0000b0e8, 0x037f0360}, | ||
1683 | {0x0000b0ec, 0x04400441}, | ||
1684 | {0x0000b0f0, 0x0460045f}, | ||
1685 | {0x0000b0f4, 0x0541047f}, | ||
1686 | {0x0000b0f8, 0x055f0540}, | ||
1687 | {0x0000b0fc, 0x057f0560}, | ||
1688 | {0x0000b100, 0x06400641}, | ||
1689 | {0x0000b104, 0x0660065f}, | ||
1690 | {0x0000b108, 0x067e067f}, | ||
1691 | {0x0000b10c, 0x07410742}, | ||
1692 | {0x0000b110, 0x075f0740}, | ||
1693 | {0x0000b114, 0x077f0760}, | ||
1694 | {0x0000b118, 0x07800781}, | ||
1695 | {0x0000b11c, 0x07a0079f}, | ||
1696 | {0x0000b120, 0x07c107bf}, | ||
1697 | {0x0000b124, 0x000007c0}, | ||
1698 | {0x0000b128, 0x00000000}, | ||
1699 | {0x0000b12c, 0x00000000}, | ||
1700 | {0x0000b130, 0x00000000}, | ||
1701 | {0x0000b134, 0x00000000}, | ||
1702 | {0x0000b138, 0x00000000}, | ||
1703 | {0x0000b13c, 0x00000000}, | ||
1704 | {0x0000b140, 0x003f0020}, | ||
1705 | {0x0000b144, 0x00400041}, | ||
1706 | {0x0000b148, 0x0140005f}, | ||
1707 | {0x0000b14c, 0x0160015f}, | ||
1708 | {0x0000b150, 0x017e017f}, | ||
1709 | {0x0000b154, 0x02410242}, | ||
1710 | {0x0000b158, 0x025f0240}, | ||
1711 | {0x0000b15c, 0x027f0260}, | ||
1712 | {0x0000b160, 0x0341027e}, | ||
1713 | {0x0000b164, 0x035f0340}, | ||
1714 | {0x0000b168, 0x037f0360}, | ||
1715 | {0x0000b16c, 0x04400441}, | ||
1716 | {0x0000b170, 0x0460045f}, | ||
1717 | {0x0000b174, 0x0541047f}, | ||
1718 | {0x0000b178, 0x055f0540}, | ||
1719 | {0x0000b17c, 0x057f0560}, | ||
1720 | {0x0000b180, 0x06400641}, | ||
1721 | {0x0000b184, 0x0660065f}, | ||
1722 | {0x0000b188, 0x067e067f}, | ||
1723 | {0x0000b18c, 0x07410742}, | ||
1724 | {0x0000b190, 0x075f0740}, | ||
1725 | {0x0000b194, 0x077f0760}, | ||
1726 | {0x0000b198, 0x07800781}, | ||
1727 | {0x0000b19c, 0x07a0079f}, | ||
1728 | {0x0000b1a0, 0x07c107bf}, | ||
1729 | {0x0000b1a4, 0x000007c0}, | ||
1730 | {0x0000b1a8, 0x00000000}, | ||
1731 | {0x0000b1ac, 0x00000000}, | ||
1732 | {0x0000b1b0, 0x00000000}, | ||
1733 | {0x0000b1b4, 0x00000000}, | ||
1734 | {0x0000b1b8, 0x00000000}, | ||
1735 | {0x0000b1bc, 0x00000000}, | ||
1736 | {0x0000b1c0, 0x00000000}, | ||
1737 | {0x0000b1c4, 0x00000000}, | ||
1738 | {0x0000b1c8, 0x00000000}, | ||
1739 | {0x0000b1cc, 0x00000000}, | ||
1740 | {0x0000b1d0, 0x00000000}, | ||
1741 | {0x0000b1d4, 0x00000000}, | ||
1742 | {0x0000b1d8, 0x00000000}, | ||
1743 | {0x0000b1dc, 0x00000000}, | ||
1744 | {0x0000b1e0, 0x00000000}, | ||
1745 | {0x0000b1e4, 0x00000000}, | ||
1746 | {0x0000b1e8, 0x00000000}, | ||
1747 | {0x0000b1ec, 0x00000000}, | ||
1748 | {0x0000b1f0, 0x00000396}, | ||
1749 | {0x0000b1f4, 0x00000396}, | ||
1750 | {0x0000b1f8, 0x00000396}, | ||
1751 | {0x0000b1fc, 0x00000196}, | ||
1752 | }; | ||
1753 | |||
1754 | static const u32 ar9300_2p0_soc_preamble[][2] = { | ||
1755 | /* Addr allmodes */ | ||
1756 | {0x000040a4, 0x00a0c1c9}, | ||
1757 | {0x00007008, 0x00000000}, | ||
1758 | {0x00007020, 0x00000000}, | ||
1759 | {0x00007034, 0x00000002}, | ||
1760 | {0x00007038, 0x000004c2}, | ||
1761 | }; | ||
1762 | |||
1763 | /* | ||
1764 | * PCIE-PHY programming array, to be used prior to entering | ||
1765 | * full sleep (holding RTC in reset, PLL is ON in L1 mode) | ||
1766 | */ | ||
1767 | static const u32 ar9300PciePhy_pll_on_clkreq_disable_L1_2p0[][2] = { | ||
1768 | {0x00004040, 0x08212e5e}, | ||
1769 | {0x00004040, 0x0008003b}, | ||
1770 | {0x00004044, 0x00000000}, | ||
1771 | }; | ||
1772 | |||
1773 | /* | ||
1774 | * PCIE-PHY programming array, to be used when not in | ||
1775 | * full sleep (holding RTC in reset) | ||
1776 | */ | ||
1777 | static const u32 ar9300PciePhy_clkreq_enable_L1_2p0[][2] = { | ||
1778 | {0x00004040, 0x08253e5e}, | ||
1779 | {0x00004040, 0x0008003b}, | ||
1780 | {0x00004044, 0x00000000}, | ||
1781 | }; | ||
1782 | |||
1783 | /* | ||
1784 | * PCIE-PHY programming array, to be used prior to entering | ||
1785 | * full sleep (holding RTC in reset) | ||
1786 | */ | ||
1787 | static const u32 ar9300PciePhy_clkreq_disable_L1_2p0[][2] = { | ||
1788 | {0x00004040, 0x08213e5e}, | ||
1789 | {0x00004040, 0x0008003b}, | ||
1790 | {0x00004044, 0x00000000}, | ||
1791 | }; | ||
1792 | |||
1793 | #endif /* INITVALS_9003_H */ | ||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mac.c b/drivers/net/wireless/ath/ath9k/ar9003_mac.c new file mode 100644 index 000000000000..7d111fbf8bc5 --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.c | |||
@@ -0,0 +1,611 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2010 Atheros Communications Inc. | ||
3 | * | ||
4 | * Permission to use, copy, modify, and/or distribute this software for any | ||
5 | * purpose with or without fee is hereby granted, provided that the above | ||
6 | * copyright notice and this permission notice appear in all copies. | ||
7 | * | ||
8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
15 | */ | ||
16 | #include "hw.h" | ||
17 | #include "ar9003_mac.h" | ||
18 | |||
19 | static void ar9003_hw_rx_enable(struct ath_hw *hw) | ||
20 | { | ||
21 | REG_WRITE(hw, AR_CR, 0); | ||
22 | } | ||
23 | |||
24 | static u16 ar9003_calc_ptr_chksum(struct ar9003_txc *ads) | ||
25 | { | ||
26 | int checksum; | ||
27 | |||
28 | checksum = ads->info + ads->link | ||
29 | + ads->data0 + ads->ctl3 | ||
30 | + ads->data1 + ads->ctl5 | ||
31 | + ads->data2 + ads->ctl7 | ||
32 | + ads->data3 + ads->ctl9; | ||
33 | |||
34 | return ((checksum & 0xffff) + (checksum >> 16)) & AR_TxPtrChkSum; | ||
35 | } | ||
36 | |||
37 | static void ar9003_hw_set_desc_link(void *ds, u32 ds_link) | ||
38 | { | ||
39 | struct ar9003_txc *ads = ds; | ||
40 | |||
41 | ads->link = ds_link; | ||
42 | ads->ctl10 &= ~AR_TxPtrChkSum; | ||
43 | ads->ctl10 |= ar9003_calc_ptr_chksum(ads); | ||
44 | } | ||
45 | |||
46 | static void ar9003_hw_get_desc_link(void *ds, u32 **ds_link) | ||
47 | { | ||
48 | struct ar9003_txc *ads = ds; | ||
49 | |||
50 | *ds_link = &ads->link; | ||
51 | } | ||
52 | |||
53 | static bool ar9003_hw_get_isr(struct ath_hw *ah, enum ath9k_int *masked) | ||
54 | { | ||
55 | u32 isr = 0; | ||
56 | u32 mask2 = 0; | ||
57 | struct ath9k_hw_capabilities *pCap = &ah->caps; | ||
58 | u32 sync_cause = 0; | ||
59 | struct ath_common *common = ath9k_hw_common(ah); | ||
60 | |||
61 | if (REG_READ(ah, AR_INTR_ASYNC_CAUSE) & AR_INTR_MAC_IRQ) { | ||
62 | if ((REG_READ(ah, AR_RTC_STATUS) & AR_RTC_STATUS_M) | ||
63 | == AR_RTC_STATUS_ON) | ||
64 | isr = REG_READ(ah, AR_ISR); | ||
65 | } | ||
66 | |||
67 | sync_cause = REG_READ(ah, AR_INTR_SYNC_CAUSE) & AR_INTR_SYNC_DEFAULT; | ||
68 | |||
69 | *masked = 0; | ||
70 | |||
71 | if (!isr && !sync_cause) | ||
72 | return false; | ||
73 | |||
74 | if (isr) { | ||
75 | if (isr & AR_ISR_BCNMISC) { | ||
76 | u32 isr2; | ||
77 | isr2 = REG_READ(ah, AR_ISR_S2); | ||
78 | |||
79 | mask2 |= ((isr2 & AR_ISR_S2_TIM) >> | ||
80 | MAP_ISR_S2_TIM); | ||
81 | mask2 |= ((isr2 & AR_ISR_S2_DTIM) >> | ||
82 | MAP_ISR_S2_DTIM); | ||
83 | mask2 |= ((isr2 & AR_ISR_S2_DTIMSYNC) >> | ||
84 | MAP_ISR_S2_DTIMSYNC); | ||
85 | mask2 |= ((isr2 & AR_ISR_S2_CABEND) >> | ||
86 | MAP_ISR_S2_CABEND); | ||
87 | mask2 |= ((isr2 & AR_ISR_S2_GTT) << | ||
88 | MAP_ISR_S2_GTT); | ||
89 | mask2 |= ((isr2 & AR_ISR_S2_CST) << | ||
90 | MAP_ISR_S2_CST); | ||
91 | mask2 |= ((isr2 & AR_ISR_S2_TSFOOR) >> | ||
92 | MAP_ISR_S2_TSFOOR); | ||
93 | |||
94 | if (!(pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)) { | ||
95 | REG_WRITE(ah, AR_ISR_S2, isr2); | ||
96 | isr &= ~AR_ISR_BCNMISC; | ||
97 | } | ||
98 | } | ||
99 | |||
100 | if ((pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)) | ||
101 | isr = REG_READ(ah, AR_ISR_RAC); | ||
102 | |||
103 | if (isr == 0xffffffff) { | ||
104 | *masked = 0; | ||
105 | return false; | ||
106 | } | ||
107 | |||
108 | *masked = isr & ATH9K_INT_COMMON; | ||
109 | |||
110 | if (ah->config.rx_intr_mitigation) | ||
111 | if (isr & (AR_ISR_RXMINTR | AR_ISR_RXINTM)) | ||
112 | *masked |= ATH9K_INT_RXLP; | ||
113 | |||
114 | if (ah->config.tx_intr_mitigation) | ||
115 | if (isr & (AR_ISR_TXMINTR | AR_ISR_TXINTM)) | ||
116 | *masked |= ATH9K_INT_TX; | ||
117 | |||
118 | if (isr & (AR_ISR_LP_RXOK | AR_ISR_RXERR)) | ||
119 | *masked |= ATH9K_INT_RXLP; | ||
120 | |||
121 | if (isr & AR_ISR_HP_RXOK) | ||
122 | *masked |= ATH9K_INT_RXHP; | ||
123 | |||
124 | if (isr & (AR_ISR_TXOK | AR_ISR_TXERR | AR_ISR_TXEOL)) { | ||
125 | *masked |= ATH9K_INT_TX; | ||
126 | |||
127 | if (!(pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)) { | ||
128 | u32 s0, s1; | ||
129 | s0 = REG_READ(ah, AR_ISR_S0); | ||
130 | REG_WRITE(ah, AR_ISR_S0, s0); | ||
131 | s1 = REG_READ(ah, AR_ISR_S1); | ||
132 | REG_WRITE(ah, AR_ISR_S1, s1); | ||
133 | |||
134 | isr &= ~(AR_ISR_TXOK | AR_ISR_TXERR | | ||
135 | AR_ISR_TXEOL); | ||
136 | } | ||
137 | } | ||
138 | |||
139 | if (isr & AR_ISR_GENTMR) { | ||
140 | u32 s5; | ||
141 | |||
142 | if (pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED) | ||
143 | s5 = REG_READ(ah, AR_ISR_S5_S); | ||
144 | else | ||
145 | s5 = REG_READ(ah, AR_ISR_S5); | ||
146 | |||
147 | ah->intr_gen_timer_trigger = | ||
148 | MS(s5, AR_ISR_S5_GENTIMER_TRIG); | ||
149 | |||
150 | ah->intr_gen_timer_thresh = | ||
151 | MS(s5, AR_ISR_S5_GENTIMER_THRESH); | ||
152 | |||
153 | if (ah->intr_gen_timer_trigger) | ||
154 | *masked |= ATH9K_INT_GENTIMER; | ||
155 | |||
156 | if (!(pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)) { | ||
157 | REG_WRITE(ah, AR_ISR_S5, s5); | ||
158 | isr &= ~AR_ISR_GENTMR; | ||
159 | } | ||
160 | |||
161 | } | ||
162 | |||
163 | *masked |= mask2; | ||
164 | |||
165 | if (!(pCap->hw_caps & ATH9K_HW_CAP_RAC_SUPPORTED)) { | ||
166 | REG_WRITE(ah, AR_ISR, isr); | ||
167 | |||
168 | (void) REG_READ(ah, AR_ISR); | ||
169 | } | ||
170 | } | ||
171 | |||
172 | if (sync_cause) { | ||
173 | if (sync_cause & AR_INTR_SYNC_RADM_CPL_TIMEOUT) { | ||
174 | REG_WRITE(ah, AR_RC, AR_RC_HOSTIF); | ||
175 | REG_WRITE(ah, AR_RC, 0); | ||
176 | *masked |= ATH9K_INT_FATAL; | ||
177 | } | ||
178 | |||
179 | if (sync_cause & AR_INTR_SYNC_LOCAL_TIMEOUT) | ||
180 | ath_print(common, ATH_DBG_INTERRUPT, | ||
181 | "AR_INTR_SYNC_LOCAL_TIMEOUT\n"); | ||
182 | |||
183 | REG_WRITE(ah, AR_INTR_SYNC_CAUSE_CLR, sync_cause); | ||
184 | (void) REG_READ(ah, AR_INTR_SYNC_CAUSE_CLR); | ||
185 | |||
186 | } | ||
187 | return true; | ||
188 | } | ||
189 | |||
190 | static void ar9003_hw_fill_txdesc(struct ath_hw *ah, void *ds, u32 seglen, | ||
191 | bool is_firstseg, bool is_lastseg, | ||
192 | const void *ds0, dma_addr_t buf_addr, | ||
193 | unsigned int qcu) | ||
194 | { | ||
195 | struct ar9003_txc *ads = (struct ar9003_txc *) ds; | ||
196 | unsigned int descid = 0; | ||
197 | |||
198 | ads->info = (ATHEROS_VENDOR_ID << AR_DescId_S) | | ||
199 | (1 << AR_TxRxDesc_S) | | ||
200 | (1 << AR_CtrlStat_S) | | ||
201 | (qcu << AR_TxQcuNum_S) | 0x17; | ||
202 | |||
203 | ads->data0 = buf_addr; | ||
204 | ads->data1 = 0; | ||
205 | ads->data2 = 0; | ||
206 | ads->data3 = 0; | ||
207 | |||
208 | ads->ctl3 = (seglen << AR_BufLen_S); | ||
209 | ads->ctl3 &= AR_BufLen; | ||
210 | |||
211 | /* Fill in pointer checksum and descriptor id */ | ||
212 | ads->ctl10 = ar9003_calc_ptr_chksum(ads); | ||
213 | ads->ctl10 |= (descid << AR_TxDescId_S); | ||
214 | |||
215 | if (is_firstseg) { | ||
216 | ads->ctl12 |= (is_lastseg ? 0 : AR_TxMore); | ||
217 | } else if (is_lastseg) { | ||
218 | ads->ctl11 = 0; | ||
219 | ads->ctl12 = 0; | ||
220 | ads->ctl13 = AR9003TXC_CONST(ds0)->ctl13; | ||
221 | ads->ctl14 = AR9003TXC_CONST(ds0)->ctl14; | ||
222 | } else { | ||
223 | /* XXX Intermediate descriptor in a multi-descriptor frame.*/ | ||
224 | ads->ctl11 = 0; | ||
225 | ads->ctl12 = AR_TxMore; | ||
226 | ads->ctl13 = 0; | ||
227 | ads->ctl14 = 0; | ||
228 | } | ||
229 | } | ||
230 | |||
231 | static int ar9003_hw_proc_txdesc(struct ath_hw *ah, void *ds, | ||
232 | struct ath_tx_status *ts) | ||
233 | { | ||
234 | struct ar9003_txs *ads; | ||
235 | |||
236 | ads = &ah->ts_ring[ah->ts_tail]; | ||
237 | |||
238 | if ((ads->status8 & AR_TxDone) == 0) | ||
239 | return -EINPROGRESS; | ||
240 | |||
241 | ah->ts_tail = (ah->ts_tail + 1) % ah->ts_size; | ||
242 | |||
243 | if ((MS(ads->ds_info, AR_DescId) != ATHEROS_VENDOR_ID) || | ||
244 | (MS(ads->ds_info, AR_TxRxDesc) != 1)) { | ||
245 | ath_print(ath9k_hw_common(ah), ATH_DBG_XMIT, | ||
246 | "Tx Descriptor error %x\n", ads->ds_info); | ||
247 | memset(ads, 0, sizeof(*ads)); | ||
248 | return -EIO; | ||
249 | } | ||
250 | |||
251 | ts->qid = MS(ads->ds_info, AR_TxQcuNum); | ||
252 | ts->desc_id = MS(ads->status1, AR_TxDescId); | ||
253 | ts->ts_seqnum = MS(ads->status8, AR_SeqNum); | ||
254 | ts->ts_tstamp = ads->status4; | ||
255 | ts->ts_status = 0; | ||
256 | ts->ts_flags = 0; | ||
257 | |||
258 | if (ads->status3 & AR_ExcessiveRetries) | ||
259 | ts->ts_status |= ATH9K_TXERR_XRETRY; | ||
260 | if (ads->status3 & AR_Filtered) | ||
261 | ts->ts_status |= ATH9K_TXERR_FILT; | ||
262 | if (ads->status3 & AR_FIFOUnderrun) { | ||
263 | ts->ts_status |= ATH9K_TXERR_FIFO; | ||
264 | ath9k_hw_updatetxtriglevel(ah, true); | ||
265 | } | ||
266 | if (ads->status8 & AR_TxOpExceeded) | ||
267 | ts->ts_status |= ATH9K_TXERR_XTXOP; | ||
268 | if (ads->status3 & AR_TxTimerExpired) | ||
269 | ts->ts_status |= ATH9K_TXERR_TIMER_EXPIRED; | ||
270 | |||
271 | if (ads->status3 & AR_DescCfgErr) | ||
272 | ts->ts_flags |= ATH9K_TX_DESC_CFG_ERR; | ||
273 | if (ads->status3 & AR_TxDataUnderrun) { | ||
274 | ts->ts_flags |= ATH9K_TX_DATA_UNDERRUN; | ||
275 | ath9k_hw_updatetxtriglevel(ah, true); | ||
276 | } | ||
277 | if (ads->status3 & AR_TxDelimUnderrun) { | ||
278 | ts->ts_flags |= ATH9K_TX_DELIM_UNDERRUN; | ||
279 | ath9k_hw_updatetxtriglevel(ah, true); | ||
280 | } | ||
281 | if (ads->status2 & AR_TxBaStatus) { | ||
282 | ts->ts_flags |= ATH9K_TX_BA; | ||
283 | ts->ba_low = ads->status5; | ||
284 | ts->ba_high = ads->status6; | ||
285 | } | ||
286 | |||
287 | ts->ts_rateindex = MS(ads->status8, AR_FinalTxIdx); | ||
288 | |||
289 | ts->ts_rssi = MS(ads->status7, AR_TxRSSICombined); | ||
290 | ts->ts_rssi_ctl0 = MS(ads->status2, AR_TxRSSIAnt00); | ||
291 | ts->ts_rssi_ctl1 = MS(ads->status2, AR_TxRSSIAnt01); | ||
292 | ts->ts_rssi_ctl2 = MS(ads->status2, AR_TxRSSIAnt02); | ||
293 | ts->ts_rssi_ext0 = MS(ads->status7, AR_TxRSSIAnt10); | ||
294 | ts->ts_rssi_ext1 = MS(ads->status7, AR_TxRSSIAnt11); | ||
295 | ts->ts_rssi_ext2 = MS(ads->status7, AR_TxRSSIAnt12); | ||
296 | ts->ts_shortretry = MS(ads->status3, AR_RTSFailCnt); | ||
297 | ts->ts_longretry = MS(ads->status3, AR_DataFailCnt); | ||
298 | ts->ts_virtcol = MS(ads->status3, AR_VirtRetryCnt); | ||
299 | ts->ts_antenna = 0; | ||
300 | |||
301 | ts->tid = MS(ads->status8, AR_TxTid); | ||
302 | |||
303 | memset(ads, 0, sizeof(*ads)); | ||
304 | |||
305 | return 0; | ||
306 | } | ||
307 | |||
308 | static void ar9003_hw_set11n_txdesc(struct ath_hw *ah, void *ds, | ||
309 | u32 pktlen, enum ath9k_pkt_type type, u32 txpower, | ||
310 | u32 keyIx, enum ath9k_key_type keyType, u32 flags) | ||
311 | { | ||
312 | struct ar9003_txc *ads = (struct ar9003_txc *) ds; | ||
313 | |||
314 | txpower += ah->txpower_indexoffset; | ||
315 | if (txpower > 63) | ||
316 | txpower = 63; | ||
317 | |||
318 | ads->ctl11 = (pktlen & AR_FrameLen) | ||
319 | | (flags & ATH9K_TXDESC_VMF ? AR_VirtMoreFrag : 0) | ||
320 | | SM(txpower, AR_XmitPower) | ||
321 | | (flags & ATH9K_TXDESC_VEOL ? AR_VEOL : 0) | ||
322 | | (flags & ATH9K_TXDESC_CLRDMASK ? AR_ClrDestMask : 0) | ||
323 | | (keyIx != ATH9K_TXKEYIX_INVALID ? AR_DestIdxValid : 0) | ||
324 | | (flags & ATH9K_TXDESC_LOWRXCHAIN ? AR_LowRxChain : 0); | ||
325 | |||
326 | ads->ctl12 = | ||
327 | (keyIx != ATH9K_TXKEYIX_INVALID ? SM(keyIx, AR_DestIdx) : 0) | ||
328 | | SM(type, AR_FrameType) | ||
329 | | (flags & ATH9K_TXDESC_NOACK ? AR_NoAck : 0) | ||
330 | | (flags & ATH9K_TXDESC_EXT_ONLY ? AR_ExtOnly : 0) | ||
331 | | (flags & ATH9K_TXDESC_EXT_AND_CTL ? AR_ExtAndCtl : 0); | ||
332 | |||
333 | ads->ctl17 = SM(keyType, AR_EncrType) | | ||
334 | (flags & ATH9K_TXDESC_LDPC ? AR_LDPC : 0); | ||
335 | ads->ctl18 = 0; | ||
336 | ads->ctl19 = AR_Not_Sounding; | ||
337 | |||
338 | ads->ctl20 = 0; | ||
339 | ads->ctl21 = 0; | ||
340 | ads->ctl22 = 0; | ||
341 | } | ||
342 | |||
343 | static void ar9003_hw_set11n_ratescenario(struct ath_hw *ah, void *ds, | ||
344 | void *lastds, | ||
345 | u32 durUpdateEn, u32 rtsctsRate, | ||
346 | u32 rtsctsDuration, | ||
347 | struct ath9k_11n_rate_series series[], | ||
348 | u32 nseries, u32 flags) | ||
349 | { | ||
350 | struct ar9003_txc *ads = (struct ar9003_txc *) ds; | ||
351 | struct ar9003_txc *last_ads = (struct ar9003_txc *) lastds; | ||
352 | u_int32_t ctl11; | ||
353 | |||
354 | if (flags & (ATH9K_TXDESC_RTSENA | ATH9K_TXDESC_CTSENA)) { | ||
355 | ctl11 = ads->ctl11; | ||
356 | |||
357 | if (flags & ATH9K_TXDESC_RTSENA) { | ||
358 | ctl11 &= ~AR_CTSEnable; | ||
359 | ctl11 |= AR_RTSEnable; | ||
360 | } else { | ||
361 | ctl11 &= ~AR_RTSEnable; | ||
362 | ctl11 |= AR_CTSEnable; | ||
363 | } | ||
364 | |||
365 | ads->ctl11 = ctl11; | ||
366 | } else { | ||
367 | ads->ctl11 = (ads->ctl11 & ~(AR_RTSEnable | AR_CTSEnable)); | ||
368 | } | ||
369 | |||
370 | ads->ctl13 = set11nTries(series, 0) | ||
371 | | set11nTries(series, 1) | ||
372 | | set11nTries(series, 2) | ||
373 | | set11nTries(series, 3) | ||
374 | | (durUpdateEn ? AR_DurUpdateEna : 0) | ||
375 | | SM(0, AR_BurstDur); | ||
376 | |||
377 | ads->ctl14 = set11nRate(series, 0) | ||
378 | | set11nRate(series, 1) | ||
379 | | set11nRate(series, 2) | ||
380 | | set11nRate(series, 3); | ||
381 | |||
382 | ads->ctl15 = set11nPktDurRTSCTS(series, 0) | ||
383 | | set11nPktDurRTSCTS(series, 1); | ||
384 | |||
385 | ads->ctl16 = set11nPktDurRTSCTS(series, 2) | ||
386 | | set11nPktDurRTSCTS(series, 3); | ||
387 | |||
388 | ads->ctl18 = set11nRateFlags(series, 0) | ||
389 | | set11nRateFlags(series, 1) | ||
390 | | set11nRateFlags(series, 2) | ||
391 | | set11nRateFlags(series, 3) | ||
392 | | SM(rtsctsRate, AR_RTSCTSRate); | ||
393 | ads->ctl19 = AR_Not_Sounding; | ||
394 | |||
395 | last_ads->ctl13 = ads->ctl13; | ||
396 | last_ads->ctl14 = ads->ctl14; | ||
397 | } | ||
398 | |||
399 | static void ar9003_hw_set11n_aggr_first(struct ath_hw *ah, void *ds, | ||
400 | u32 aggrLen) | ||
401 | { | ||
402 | struct ar9003_txc *ads = (struct ar9003_txc *) ds; | ||
403 | |||
404 | ads->ctl12 |= (AR_IsAggr | AR_MoreAggr); | ||
405 | |||
406 | ads->ctl17 &= ~AR_AggrLen; | ||
407 | ads->ctl17 |= SM(aggrLen, AR_AggrLen); | ||
408 | } | ||
409 | |||
410 | static void ar9003_hw_set11n_aggr_middle(struct ath_hw *ah, void *ds, | ||
411 | u32 numDelims) | ||
412 | { | ||
413 | struct ar9003_txc *ads = (struct ar9003_txc *) ds; | ||
414 | unsigned int ctl17; | ||
415 | |||
416 | ads->ctl12 |= (AR_IsAggr | AR_MoreAggr); | ||
417 | |||
418 | /* | ||
419 | * We use a stack variable to manipulate ctl6 to reduce uncached | ||
420 | * read modify, modfiy, write. | ||
421 | */ | ||
422 | ctl17 = ads->ctl17; | ||
423 | ctl17 &= ~AR_PadDelim; | ||
424 | ctl17 |= SM(numDelims, AR_PadDelim); | ||
425 | ads->ctl17 = ctl17; | ||
426 | } | ||
427 | |||
428 | static void ar9003_hw_set11n_aggr_last(struct ath_hw *ah, void *ds) | ||
429 | { | ||
430 | struct ar9003_txc *ads = (struct ar9003_txc *) ds; | ||
431 | |||
432 | ads->ctl12 |= AR_IsAggr; | ||
433 | ads->ctl12 &= ~AR_MoreAggr; | ||
434 | ads->ctl17 &= ~AR_PadDelim; | ||
435 | } | ||
436 | |||
437 | static void ar9003_hw_clr11n_aggr(struct ath_hw *ah, void *ds) | ||
438 | { | ||
439 | struct ar9003_txc *ads = (struct ar9003_txc *) ds; | ||
440 | |||
441 | ads->ctl12 &= (~AR_IsAggr & ~AR_MoreAggr); | ||
442 | } | ||
443 | |||
444 | static void ar9003_hw_set11n_burstduration(struct ath_hw *ah, void *ds, | ||
445 | u32 burstDuration) | ||
446 | { | ||
447 | struct ar9003_txc *ads = (struct ar9003_txc *) ds; | ||
448 | |||
449 | ads->ctl13 &= ~AR_BurstDur; | ||
450 | ads->ctl13 |= SM(burstDuration, AR_BurstDur); | ||
451 | |||
452 | } | ||
453 | |||
454 | static void ar9003_hw_set11n_virtualmorefrag(struct ath_hw *ah, void *ds, | ||
455 | u32 vmf) | ||
456 | { | ||
457 | struct ar9003_txc *ads = (struct ar9003_txc *) ds; | ||
458 | |||
459 | if (vmf) | ||
460 | ads->ctl11 |= AR_VirtMoreFrag; | ||
461 | else | ||
462 | ads->ctl11 &= ~AR_VirtMoreFrag; | ||
463 | } | ||
464 | |||
465 | void ar9003_hw_attach_mac_ops(struct ath_hw *hw) | ||
466 | { | ||
467 | struct ath_hw_ops *ops = ath9k_hw_ops(hw); | ||
468 | |||
469 | ops->rx_enable = ar9003_hw_rx_enable; | ||
470 | ops->set_desc_link = ar9003_hw_set_desc_link; | ||
471 | ops->get_desc_link = ar9003_hw_get_desc_link; | ||
472 | ops->get_isr = ar9003_hw_get_isr; | ||
473 | ops->fill_txdesc = ar9003_hw_fill_txdesc; | ||
474 | ops->proc_txdesc = ar9003_hw_proc_txdesc; | ||
475 | ops->set11n_txdesc = ar9003_hw_set11n_txdesc; | ||
476 | ops->set11n_ratescenario = ar9003_hw_set11n_ratescenario; | ||
477 | ops->set11n_aggr_first = ar9003_hw_set11n_aggr_first; | ||
478 | ops->set11n_aggr_middle = ar9003_hw_set11n_aggr_middle; | ||
479 | ops->set11n_aggr_last = ar9003_hw_set11n_aggr_last; | ||
480 | ops->clr11n_aggr = ar9003_hw_clr11n_aggr; | ||
481 | ops->set11n_burstduration = ar9003_hw_set11n_burstduration; | ||
482 | ops->set11n_virtualmorefrag = ar9003_hw_set11n_virtualmorefrag; | ||
483 | } | ||
484 | |||
485 | void ath9k_hw_set_rx_bufsize(struct ath_hw *ah, u16 buf_size) | ||
486 | { | ||
487 | REG_WRITE(ah, AR_DATABUF_SIZE, buf_size & AR_DATABUF_SIZE_MASK); | ||
488 | } | ||
489 | EXPORT_SYMBOL(ath9k_hw_set_rx_bufsize); | ||
490 | |||
491 | void ath9k_hw_addrxbuf_edma(struct ath_hw *ah, u32 rxdp, | ||
492 | enum ath9k_rx_qtype qtype) | ||
493 | { | ||
494 | if (qtype == ATH9K_RX_QUEUE_HP) | ||
495 | REG_WRITE(ah, AR_HP_RXDP, rxdp); | ||
496 | else | ||
497 | REG_WRITE(ah, AR_LP_RXDP, rxdp); | ||
498 | } | ||
499 | EXPORT_SYMBOL(ath9k_hw_addrxbuf_edma); | ||
500 | |||
501 | int ath9k_hw_process_rxdesc_edma(struct ath_hw *ah, struct ath_rx_status *rxs, | ||
502 | void *buf_addr) | ||
503 | { | ||
504 | struct ar9003_rxs *rxsp = (struct ar9003_rxs *) buf_addr; | ||
505 | unsigned int phyerr; | ||
506 | |||
507 | /* TODO: byte swap on big endian for ar9300_10 */ | ||
508 | |||
509 | if ((rxsp->status11 & AR_RxDone) == 0) | ||
510 | return -EINPROGRESS; | ||
511 | |||
512 | if (MS(rxsp->ds_info, AR_DescId) != 0x168c) | ||
513 | return -EINVAL; | ||
514 | |||
515 | if ((rxsp->ds_info & (AR_TxRxDesc | AR_CtrlStat)) != 0) | ||
516 | return -EINPROGRESS; | ||
517 | |||
518 | if (!rxs) | ||
519 | return 0; | ||
520 | |||
521 | rxs->rs_status = 0; | ||
522 | rxs->rs_flags = 0; | ||
523 | |||
524 | rxs->rs_datalen = rxsp->status2 & AR_DataLen; | ||
525 | rxs->rs_tstamp = rxsp->status3; | ||
526 | |||
527 | /* XXX: Keycache */ | ||
528 | rxs->rs_rssi = MS(rxsp->status5, AR_RxRSSICombined); | ||
529 | rxs->rs_rssi_ctl0 = MS(rxsp->status1, AR_RxRSSIAnt00); | ||
530 | rxs->rs_rssi_ctl1 = MS(rxsp->status1, AR_RxRSSIAnt01); | ||
531 | rxs->rs_rssi_ctl2 = MS(rxsp->status1, AR_RxRSSIAnt02); | ||
532 | rxs->rs_rssi_ext0 = MS(rxsp->status5, AR_RxRSSIAnt10); | ||
533 | rxs->rs_rssi_ext1 = MS(rxsp->status5, AR_RxRSSIAnt11); | ||
534 | rxs->rs_rssi_ext2 = MS(rxsp->status5, AR_RxRSSIAnt12); | ||
535 | |||
536 | if (rxsp->status11 & AR_RxKeyIdxValid) | ||
537 | rxs->rs_keyix = MS(rxsp->status11, AR_KeyIdx); | ||
538 | else | ||
539 | rxs->rs_keyix = ATH9K_RXKEYIX_INVALID; | ||
540 | |||
541 | rxs->rs_rate = MS(rxsp->status1, AR_RxRate); | ||
542 | rxs->rs_more = (rxsp->status2 & AR_RxMore) ? 1 : 0; | ||
543 | |||
544 | rxs->rs_isaggr = (rxsp->status11 & AR_RxAggr) ? 1 : 0; | ||
545 | rxs->rs_moreaggr = (rxsp->status11 & AR_RxMoreAggr) ? 1 : 0; | ||
546 | rxs->rs_antenna = (MS(rxsp->status4, AR_RxAntenna) & 0x7); | ||
547 | rxs->rs_flags = (rxsp->status4 & AR_GI) ? ATH9K_RX_GI : 0; | ||
548 | rxs->rs_flags |= (rxsp->status4 & AR_2040) ? ATH9K_RX_2040 : 0; | ||
549 | |||
550 | rxs->evm0 = rxsp->status6; | ||
551 | rxs->evm1 = rxsp->status7; | ||
552 | rxs->evm2 = rxsp->status8; | ||
553 | rxs->evm3 = rxsp->status9; | ||
554 | rxs->evm4 = (rxsp->status10 & 0xffff); | ||
555 | |||
556 | if (rxsp->status11 & AR_PreDelimCRCErr) | ||
557 | rxs->rs_flags |= ATH9K_RX_DELIM_CRC_PRE; | ||
558 | |||
559 | if (rxsp->status11 & AR_PostDelimCRCErr) | ||
560 | rxs->rs_flags |= ATH9K_RX_DELIM_CRC_POST; | ||
561 | |||
562 | if (rxsp->status11 & AR_DecryptBusyErr) | ||
563 | rxs->rs_flags |= ATH9K_RX_DECRYPT_BUSY; | ||
564 | |||
565 | if ((rxsp->status11 & AR_RxFrameOK) == 0) { | ||
566 | if (rxsp->status11 & AR_CRCErr) { | ||
567 | rxs->rs_status |= ATH9K_RXERR_CRC; | ||
568 | } else if (rxsp->status11 & AR_PHYErr) { | ||
569 | rxs->rs_status |= ATH9K_RXERR_PHY; | ||
570 | phyerr = MS(rxsp->status11, AR_PHYErrCode); | ||
571 | rxs->rs_phyerr = phyerr; | ||
572 | } else if (rxsp->status11 & AR_DecryptCRCErr) { | ||
573 | rxs->rs_status |= ATH9K_RXERR_DECRYPT; | ||
574 | } else if (rxsp->status11 & AR_MichaelErr) { | ||
575 | rxs->rs_status |= ATH9K_RXERR_MIC; | ||
576 | } | ||
577 | } | ||
578 | |||
579 | return 0; | ||
580 | } | ||
581 | EXPORT_SYMBOL(ath9k_hw_process_rxdesc_edma); | ||
582 | |||
583 | void ath9k_hw_reset_txstatus_ring(struct ath_hw *ah) | ||
584 | { | ||
585 | ah->ts_tail = 0; | ||
586 | |||
587 | memset((void *) ah->ts_ring, 0, | ||
588 | ah->ts_size * sizeof(struct ar9003_txs)); | ||
589 | |||
590 | ath_print(ath9k_hw_common(ah), ATH_DBG_XMIT, | ||
591 | "TS Start 0x%x End 0x%x Virt %p, Size %d\n", | ||
592 | ah->ts_paddr_start, ah->ts_paddr_end, | ||
593 | ah->ts_ring, ah->ts_size); | ||
594 | |||
595 | REG_WRITE(ah, AR_Q_STATUS_RING_START, ah->ts_paddr_start); | ||
596 | REG_WRITE(ah, AR_Q_STATUS_RING_END, ah->ts_paddr_end); | ||
597 | } | ||
598 | |||
599 | void ath9k_hw_setup_statusring(struct ath_hw *ah, void *ts_start, | ||
600 | u32 ts_paddr_start, | ||
601 | u8 size) | ||
602 | { | ||
603 | |||
604 | ah->ts_paddr_start = ts_paddr_start; | ||
605 | ah->ts_paddr_end = ts_paddr_start + (size * sizeof(struct ar9003_txs)); | ||
606 | ah->ts_size = size; | ||
607 | ah->ts_ring = (struct ar9003_txs *) ts_start; | ||
608 | |||
609 | ath9k_hw_reset_txstatus_ring(ah); | ||
610 | } | ||
611 | EXPORT_SYMBOL(ath9k_hw_setup_statusring); | ||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_mac.h b/drivers/net/wireless/ath/ath9k/ar9003_mac.h new file mode 100644 index 000000000000..f17558b14539 --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/ar9003_mac.h | |||
@@ -0,0 +1,120 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2010 Atheros Communications Inc. | ||
3 | * | ||
4 | * Permission to use, copy, modify, and/or distribute this software for any | ||
5 | * purpose with or without fee is hereby granted, provided that the above | ||
6 | * copyright notice and this permission notice appear in all copies. | ||
7 | * | ||
8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
15 | */ | ||
16 | |||
17 | #ifndef AR9003_MAC_H | ||
18 | #define AR9003_MAC_H | ||
19 | |||
20 | #define AR_DescId 0xffff0000 | ||
21 | #define AR_DescId_S 16 | ||
22 | #define AR_CtrlStat 0x00004000 | ||
23 | #define AR_CtrlStat_S 14 | ||
24 | #define AR_TxRxDesc 0x00008000 | ||
25 | #define AR_TxRxDesc_S 15 | ||
26 | #define AR_TxQcuNum 0x00000f00 | ||
27 | #define AR_TxQcuNum_S 8 | ||
28 | |||
29 | #define AR_BufLen 0x0fff0000 | ||
30 | #define AR_BufLen_S 16 | ||
31 | |||
32 | #define AR_TxDescId 0xffff0000 | ||
33 | #define AR_TxDescId_S 16 | ||
34 | #define AR_TxPtrChkSum 0x0000ffff | ||
35 | |||
36 | #define AR_TxTid 0xf0000000 | ||
37 | #define AR_TxTid_S 28 | ||
38 | |||
39 | #define AR_LowRxChain 0x00004000 | ||
40 | |||
41 | #define AR_Not_Sounding 0x20000000 | ||
42 | |||
43 | #define MAP_ISR_S2_CST 6 | ||
44 | #define MAP_ISR_S2_GTT 6 | ||
45 | #define MAP_ISR_S2_TIM 3 | ||
46 | #define MAP_ISR_S2_CABEND 0 | ||
47 | #define MAP_ISR_S2_DTIMSYNC 7 | ||
48 | #define MAP_ISR_S2_DTIM 7 | ||
49 | #define MAP_ISR_S2_TSFOOR 4 | ||
50 | |||
51 | #define AR9003TXC_CONST(_ds) ((const struct ar9003_txc *) _ds) | ||
52 | |||
53 | struct ar9003_rxs { | ||
54 | u32 ds_info; | ||
55 | u32 status1; | ||
56 | u32 status2; | ||
57 | u32 status3; | ||
58 | u32 status4; | ||
59 | u32 status5; | ||
60 | u32 status6; | ||
61 | u32 status7; | ||
62 | u32 status8; | ||
63 | u32 status9; | ||
64 | u32 status10; | ||
65 | u32 status11; | ||
66 | } __packed; | ||
67 | |||
68 | /* Transmit Control Descriptor */ | ||
69 | struct ar9003_txc { | ||
70 | u32 info; /* descriptor information */ | ||
71 | u32 link; /* link pointer */ | ||
72 | u32 data0; /* data pointer to 1st buffer */ | ||
73 | u32 ctl3; /* DMA control 3 */ | ||
74 | u32 data1; /* data pointer to 2nd buffer */ | ||
75 | u32 ctl5; /* DMA control 5 */ | ||
76 | u32 data2; /* data pointer to 3rd buffer */ | ||
77 | u32 ctl7; /* DMA control 7 */ | ||
78 | u32 data3; /* data pointer to 4th buffer */ | ||
79 | u32 ctl9; /* DMA control 9 */ | ||
80 | u32 ctl10; /* DMA control 10 */ | ||
81 | u32 ctl11; /* DMA control 11 */ | ||
82 | u32 ctl12; /* DMA control 12 */ | ||
83 | u32 ctl13; /* DMA control 13 */ | ||
84 | u32 ctl14; /* DMA control 14 */ | ||
85 | u32 ctl15; /* DMA control 15 */ | ||
86 | u32 ctl16; /* DMA control 16 */ | ||
87 | u32 ctl17; /* DMA control 17 */ | ||
88 | u32 ctl18; /* DMA control 18 */ | ||
89 | u32 ctl19; /* DMA control 19 */ | ||
90 | u32 ctl20; /* DMA control 20 */ | ||
91 | u32 ctl21; /* DMA control 21 */ | ||
92 | u32 ctl22; /* DMA control 22 */ | ||
93 | u32 pad[9]; /* pad to cache line (128 bytes/32 dwords) */ | ||
94 | } __packed; | ||
95 | |||
96 | struct ar9003_txs { | ||
97 | u32 ds_info; | ||
98 | u32 status1; | ||
99 | u32 status2; | ||
100 | u32 status3; | ||
101 | u32 status4; | ||
102 | u32 status5; | ||
103 | u32 status6; | ||
104 | u32 status7; | ||
105 | u32 status8; | ||
106 | } __packed; | ||
107 | |||
108 | void ar9003_hw_attach_mac_ops(struct ath_hw *hw); | ||
109 | void ath9k_hw_set_rx_bufsize(struct ath_hw *ah, u16 buf_size); | ||
110 | void ath9k_hw_addrxbuf_edma(struct ath_hw *ah, u32 rxdp, | ||
111 | enum ath9k_rx_qtype qtype); | ||
112 | |||
113 | int ath9k_hw_process_rxdesc_edma(struct ath_hw *ah, | ||
114 | struct ath_rx_status *rxs, | ||
115 | void *buf_addr); | ||
116 | void ath9k_hw_reset_txstatus_ring(struct ath_hw *ah); | ||
117 | void ath9k_hw_setup_statusring(struct ath_hw *ah, void *ts_start, | ||
118 | u32 ts_paddr_start, | ||
119 | u8 size); | ||
120 | #endif | ||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.c b/drivers/net/wireless/ath/ath9k/ar9003_phy.c new file mode 100644 index 000000000000..137543b2d739 --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.c | |||
@@ -0,0 +1,1142 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2010 Atheros Communications Inc. | ||
3 | * | ||
4 | * Permission to use, copy, modify, and/or distribute this software for any | ||
5 | * purpose with or without fee is hereby granted, provided that the above | ||
6 | * copyright notice and this permission notice appear in all copies. | ||
7 | * | ||
8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
15 | */ | ||
16 | |||
17 | #include "hw.h" | ||
18 | #include "ar9003_phy.h" | ||
19 | |||
20 | /** | ||
21 | * ar9003_hw_set_channel - set channel on single-chip device | ||
22 | * @ah: atheros hardware structure | ||
23 | * @chan: | ||
24 | * | ||
25 | * This is the function to change channel on single-chip devices, that is | ||
26 | * all devices after ar9280. | ||
27 | * | ||
28 | * This function takes the channel value in MHz and sets | ||
29 | * hardware channel value. Assumes writes have been enabled to analog bus. | ||
30 | * | ||
31 | * Actual Expression, | ||
32 | * | ||
33 | * For 2GHz channel, | ||
34 | * Channel Frequency = (3/4) * freq_ref * (chansel[8:0] + chanfrac[16:0]/2^17) | ||
35 | * (freq_ref = 40MHz) | ||
36 | * | ||
37 | * For 5GHz channel, | ||
38 | * Channel Frequency = (3/2) * freq_ref * (chansel[8:0] + chanfrac[16:0]/2^10) | ||
39 | * (freq_ref = 40MHz/(24>>amodeRefSel)) | ||
40 | * | ||
41 | * For 5GHz channels which are 5MHz spaced, | ||
42 | * Channel Frequency = (3/2) * freq_ref * (chansel[8:0] + chanfrac[16:0]/2^17) | ||
43 | * (freq_ref = 40MHz) | ||
44 | */ | ||
45 | static int ar9003_hw_set_channel(struct ath_hw *ah, struct ath9k_channel *chan) | ||
46 | { | ||
47 | u16 bMode, fracMode = 0, aModeRefSel = 0; | ||
48 | u32 freq, channelSel = 0, reg32 = 0; | ||
49 | struct chan_centers centers; | ||
50 | int loadSynthChannel; | ||
51 | |||
52 | ath9k_hw_get_channel_centers(ah, chan, ¢ers); | ||
53 | freq = centers.synth_center; | ||
54 | |||
55 | if (freq < 4800) { /* 2 GHz, fractional mode */ | ||
56 | channelSel = CHANSEL_2G(freq); | ||
57 | /* Set to 2G mode */ | ||
58 | bMode = 1; | ||
59 | } else { | ||
60 | channelSel = CHANSEL_5G(freq); | ||
61 | /* Doubler is ON, so, divide channelSel by 2. */ | ||
62 | channelSel >>= 1; | ||
63 | /* Set to 5G mode */ | ||
64 | bMode = 0; | ||
65 | } | ||
66 | |||
67 | /* Enable fractional mode for all channels */ | ||
68 | fracMode = 1; | ||
69 | aModeRefSel = 0; | ||
70 | loadSynthChannel = 0; | ||
71 | |||
72 | reg32 = (bMode << 29); | ||
73 | REG_WRITE(ah, AR_PHY_SYNTH_CONTROL, reg32); | ||
74 | |||
75 | /* Enable Long shift Select for Synthesizer */ | ||
76 | REG_RMW_FIELD(ah, AR_PHY_65NM_CH0_SYNTH4, | ||
77 | AR_PHY_SYNTH4_LONG_SHIFT_SELECT, 1); | ||
78 | |||
79 | /* Program Synth. setting */ | ||
80 | reg32 = (channelSel << 2) | (fracMode << 30) | | ||
81 | (aModeRefSel << 28) | (loadSynthChannel << 31); | ||
82 | REG_WRITE(ah, AR_PHY_65NM_CH0_SYNTH7, reg32); | ||
83 | |||
84 | /* Toggle Load Synth channel bit */ | ||
85 | loadSynthChannel = 1; | ||
86 | reg32 = (channelSel << 2) | (fracMode << 30) | | ||
87 | (aModeRefSel << 28) | (loadSynthChannel << 31); | ||
88 | REG_WRITE(ah, AR_PHY_65NM_CH0_SYNTH7, reg32); | ||
89 | |||
90 | ah->curchan = chan; | ||
91 | ah->curchan_rad_index = -1; | ||
92 | |||
93 | return 0; | ||
94 | } | ||
95 | |||
96 | /** | ||
97 | * ar9003_hw_spur_mitigate - convert baseband spur frequency | ||
98 | * @ah: atheros hardware structure | ||
99 | * @chan: | ||
100 | * | ||
101 | * For single-chip solutions. Converts to baseband spur frequency given the | ||
102 | * input channel frequency and compute register settings below. | ||
103 | * | ||
104 | * Spur mitigation for MRC CCK | ||
105 | */ | ||
106 | static void ar9003_hw_spur_mitigate_mrc_cck(struct ath_hw *ah, | ||
107 | struct ath9k_channel *chan) | ||
108 | { | ||
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); | ||
158 | } | ||
159 | |||
160 | /* Clean all spur register fields */ | ||
161 | static void ar9003_hw_spur_ofdm_clear(struct ath_hw *ah) | ||
162 | { | ||
163 | REG_RMW_FIELD(ah, AR_PHY_TIMING4, | ||
164 | AR_PHY_TIMING4_ENABLE_SPUR_FILTER, 0); | ||
165 | REG_RMW_FIELD(ah, AR_PHY_TIMING11, | ||
166 | AR_PHY_TIMING11_SPUR_FREQ_SD, 0); | ||
167 | REG_RMW_FIELD(ah, AR_PHY_TIMING11, | ||
168 | AR_PHY_TIMING11_SPUR_DELTA_PHASE, 0); | ||
169 | REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT, | ||
170 | AR_PHY_SFCORR_EXT_SPUR_SUBCHANNEL_SD, 0); | ||
171 | REG_RMW_FIELD(ah, AR_PHY_TIMING11, | ||
172 | AR_PHY_TIMING11_USE_SPUR_FILTER_IN_AGC, 0); | ||
173 | REG_RMW_FIELD(ah, AR_PHY_TIMING11, | ||
174 | AR_PHY_TIMING11_USE_SPUR_FILTER_IN_SELFCOR, 0); | ||
175 | REG_RMW_FIELD(ah, AR_PHY_TIMING4, | ||
176 | AR_PHY_TIMING4_ENABLE_SPUR_RSSI, 0); | ||
177 | REG_RMW_FIELD(ah, AR_PHY_SPUR_REG, | ||
178 | AR_PHY_SPUR_REG_EN_VIT_SPUR_RSSI, 0); | ||
179 | REG_RMW_FIELD(ah, AR_PHY_SPUR_REG, | ||
180 | AR_PHY_SPUR_REG_ENABLE_NF_RSSI_SPUR_MIT, 0); | ||
181 | |||
182 | REG_RMW_FIELD(ah, AR_PHY_SPUR_REG, | ||
183 | AR_PHY_SPUR_REG_ENABLE_MASK_PPM, 0); | ||
184 | REG_RMW_FIELD(ah, AR_PHY_TIMING4, | ||
185 | AR_PHY_TIMING4_ENABLE_PILOT_MASK, 0); | ||
186 | REG_RMW_FIELD(ah, AR_PHY_TIMING4, | ||
187 | AR_PHY_TIMING4_ENABLE_CHAN_MASK, 0); | ||
188 | REG_RMW_FIELD(ah, AR_PHY_PILOT_SPUR_MASK, | ||
189 | AR_PHY_PILOT_SPUR_MASK_CF_PILOT_MASK_IDX_A, 0); | ||
190 | REG_RMW_FIELD(ah, AR_PHY_SPUR_MASK_A, | ||
191 | AR_PHY_SPUR_MASK_A_CF_PUNC_MASK_IDX_A, 0); | ||
192 | REG_RMW_FIELD(ah, AR_PHY_CHAN_SPUR_MASK, | ||
193 | AR_PHY_CHAN_SPUR_MASK_CF_CHAN_MASK_IDX_A, 0); | ||
194 | REG_RMW_FIELD(ah, AR_PHY_PILOT_SPUR_MASK, | ||
195 | AR_PHY_PILOT_SPUR_MASK_CF_PILOT_MASK_A, 0); | ||
196 | REG_RMW_FIELD(ah, AR_PHY_CHAN_SPUR_MASK, | ||
197 | AR_PHY_CHAN_SPUR_MASK_CF_CHAN_MASK_A, 0); | ||
198 | REG_RMW_FIELD(ah, AR_PHY_SPUR_MASK_A, | ||
199 | AR_PHY_SPUR_MASK_A_CF_PUNC_MASK_A, 0); | ||
200 | REG_RMW_FIELD(ah, AR_PHY_SPUR_REG, | ||
201 | AR_PHY_SPUR_REG_MASK_RATE_CNTL, 0); | ||
202 | } | ||
203 | |||
204 | static void ar9003_hw_spur_ofdm(struct ath_hw *ah, | ||
205 | int freq_offset, | ||
206 | int spur_freq_sd, | ||
207 | int spur_delta_phase, | ||
208 | int spur_subchannel_sd) | ||
209 | { | ||
210 | int mask_index = 0; | ||
211 | |||
212 | /* OFDM Spur mitigation */ | ||
213 | REG_RMW_FIELD(ah, AR_PHY_TIMING4, | ||
214 | AR_PHY_TIMING4_ENABLE_SPUR_FILTER, 0x1); | ||
215 | REG_RMW_FIELD(ah, AR_PHY_TIMING11, | ||
216 | AR_PHY_TIMING11_SPUR_FREQ_SD, spur_freq_sd); | ||
217 | REG_RMW_FIELD(ah, AR_PHY_TIMING11, | ||
218 | AR_PHY_TIMING11_SPUR_DELTA_PHASE, spur_delta_phase); | ||
219 | REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT, | ||
220 | AR_PHY_SFCORR_EXT_SPUR_SUBCHANNEL_SD, spur_subchannel_sd); | ||
221 | REG_RMW_FIELD(ah, AR_PHY_TIMING11, | ||
222 | AR_PHY_TIMING11_USE_SPUR_FILTER_IN_AGC, 0x1); | ||
223 | REG_RMW_FIELD(ah, AR_PHY_TIMING11, | ||
224 | AR_PHY_TIMING11_USE_SPUR_FILTER_IN_SELFCOR, 0x1); | ||
225 | REG_RMW_FIELD(ah, AR_PHY_TIMING4, | ||
226 | AR_PHY_TIMING4_ENABLE_SPUR_RSSI, 0x1); | ||
227 | REG_RMW_FIELD(ah, AR_PHY_SPUR_REG, | ||
228 | AR_PHY_SPUR_REG_SPUR_RSSI_THRESH, 34); | ||
229 | REG_RMW_FIELD(ah, AR_PHY_SPUR_REG, | ||
230 | AR_PHY_SPUR_REG_EN_VIT_SPUR_RSSI, 1); | ||
231 | |||
232 | if (REG_READ_FIELD(ah, AR_PHY_MODE, | ||
233 | AR_PHY_MODE_DYNAMIC) == 0x1) | ||
234 | REG_RMW_FIELD(ah, AR_PHY_SPUR_REG, | ||
235 | AR_PHY_SPUR_REG_ENABLE_NF_RSSI_SPUR_MIT, 1); | ||
236 | |||
237 | mask_index = (freq_offset << 4) / 5; | ||
238 | if (mask_index < 0) | ||
239 | mask_index = mask_index - 1; | ||
240 | |||
241 | mask_index = mask_index & 0x7f; | ||
242 | |||
243 | REG_RMW_FIELD(ah, AR_PHY_SPUR_REG, | ||
244 | AR_PHY_SPUR_REG_ENABLE_MASK_PPM, 0x1); | ||
245 | REG_RMW_FIELD(ah, AR_PHY_TIMING4, | ||
246 | AR_PHY_TIMING4_ENABLE_PILOT_MASK, 0x1); | ||
247 | REG_RMW_FIELD(ah, AR_PHY_TIMING4, | ||
248 | AR_PHY_TIMING4_ENABLE_CHAN_MASK, 0x1); | ||
249 | REG_RMW_FIELD(ah, AR_PHY_PILOT_SPUR_MASK, | ||
250 | AR_PHY_PILOT_SPUR_MASK_CF_PILOT_MASK_IDX_A, mask_index); | ||
251 | REG_RMW_FIELD(ah, AR_PHY_SPUR_MASK_A, | ||
252 | AR_PHY_SPUR_MASK_A_CF_PUNC_MASK_IDX_A, mask_index); | ||
253 | REG_RMW_FIELD(ah, AR_PHY_CHAN_SPUR_MASK, | ||
254 | AR_PHY_CHAN_SPUR_MASK_CF_CHAN_MASK_IDX_A, mask_index); | ||
255 | REG_RMW_FIELD(ah, AR_PHY_PILOT_SPUR_MASK, | ||
256 | AR_PHY_PILOT_SPUR_MASK_CF_PILOT_MASK_A, 0xc); | ||
257 | REG_RMW_FIELD(ah, AR_PHY_CHAN_SPUR_MASK, | ||
258 | AR_PHY_CHAN_SPUR_MASK_CF_CHAN_MASK_A, 0xc); | ||
259 | REG_RMW_FIELD(ah, AR_PHY_SPUR_MASK_A, | ||
260 | AR_PHY_SPUR_MASK_A_CF_PUNC_MASK_A, 0xa0); | ||
261 | REG_RMW_FIELD(ah, AR_PHY_SPUR_REG, | ||
262 | AR_PHY_SPUR_REG_MASK_RATE_CNTL, 0xff); | ||
263 | } | ||
264 | |||
265 | static void ar9003_hw_spur_ofdm_work(struct ath_hw *ah, | ||
266 | struct ath9k_channel *chan, | ||
267 | int freq_offset) | ||
268 | { | ||
269 | int spur_freq_sd = 0; | ||
270 | int spur_subchannel_sd = 0; | ||
271 | int spur_delta_phase = 0; | ||
272 | |||
273 | if (IS_CHAN_HT40(chan)) { | ||
274 | if (freq_offset < 0) { | ||
275 | if (REG_READ_FIELD(ah, AR_PHY_GEN_CTRL, | ||
276 | AR_PHY_GC_DYN2040_PRI_CH) == 0x0) | ||
277 | spur_subchannel_sd = 1; | ||
278 | else | ||
279 | spur_subchannel_sd = 0; | ||
280 | |||
281 | spur_freq_sd = ((freq_offset + 10) << 9) / 11; | ||
282 | |||
283 | } else { | ||
284 | if (REG_READ_FIELD(ah, AR_PHY_GEN_CTRL, | ||
285 | AR_PHY_GC_DYN2040_PRI_CH) == 0x0) | ||
286 | spur_subchannel_sd = 0; | ||
287 | else | ||
288 | spur_subchannel_sd = 1; | ||
289 | |||
290 | spur_freq_sd = ((freq_offset - 10) << 9) / 11; | ||
291 | |||
292 | } | ||
293 | |||
294 | spur_delta_phase = (freq_offset << 17) / 5; | ||
295 | |||
296 | } else { | ||
297 | spur_subchannel_sd = 0; | ||
298 | spur_freq_sd = (freq_offset << 9) /11; | ||
299 | spur_delta_phase = (freq_offset << 18) / 5; | ||
300 | } | ||
301 | |||
302 | spur_freq_sd = spur_freq_sd & 0x3ff; | ||
303 | spur_delta_phase = spur_delta_phase & 0xfffff; | ||
304 | |||
305 | ar9003_hw_spur_ofdm(ah, | ||
306 | freq_offset, | ||
307 | spur_freq_sd, | ||
308 | spur_delta_phase, | ||
309 | spur_subchannel_sd); | ||
310 | } | ||
311 | |||
312 | /* Spur mitigation for OFDM */ | ||
313 | static void ar9003_hw_spur_mitigate_ofdm(struct ath_hw *ah, | ||
314 | struct ath9k_channel *chan) | ||
315 | { | ||
316 | int synth_freq; | ||
317 | int range = 10; | ||
318 | int freq_offset = 0; | ||
319 | int mode; | ||
320 | u8* spurChansPtr; | ||
321 | unsigned int i; | ||
322 | struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep; | ||
323 | |||
324 | if (IS_CHAN_5GHZ(chan)) { | ||
325 | spurChansPtr = &(eep->modalHeader5G.spurChans[0]); | ||
326 | mode = 0; | ||
327 | } | ||
328 | else { | ||
329 | spurChansPtr = &(eep->modalHeader2G.spurChans[0]); | ||
330 | mode = 1; | ||
331 | } | ||
332 | |||
333 | if (spurChansPtr[0] == 0) | ||
334 | return; /* No spur in the mode */ | ||
335 | |||
336 | if (IS_CHAN_HT40(chan)) { | ||
337 | range = 19; | ||
338 | if (REG_READ_FIELD(ah, AR_PHY_GEN_CTRL, | ||
339 | AR_PHY_GC_DYN2040_PRI_CH) == 0x0) | ||
340 | synth_freq = chan->channel - 10; | ||
341 | else | ||
342 | synth_freq = chan->channel + 10; | ||
343 | } else { | ||
344 | range = 10; | ||
345 | synth_freq = chan->channel; | ||
346 | } | ||
347 | |||
348 | ar9003_hw_spur_ofdm_clear(ah); | ||
349 | |||
350 | for (i = 0; spurChansPtr[i] && i < 5; i++) { | ||
351 | freq_offset = FBIN2FREQ(spurChansPtr[i], mode) - synth_freq; | ||
352 | if (abs(freq_offset) < range) { | ||
353 | ar9003_hw_spur_ofdm_work(ah, chan, freq_offset); | ||
354 | break; | ||
355 | } | ||
356 | } | ||
357 | } | ||
358 | |||
359 | static void ar9003_hw_spur_mitigate(struct ath_hw *ah, | ||
360 | struct ath9k_channel *chan) | ||
361 | { | ||
362 | ar9003_hw_spur_mitigate_mrc_cck(ah, chan); | ||
363 | ar9003_hw_spur_mitigate_ofdm(ah, chan); | ||
364 | } | ||
365 | |||
366 | static u32 ar9003_hw_compute_pll_control(struct ath_hw *ah, | ||
367 | struct ath9k_channel *chan) | ||
368 | { | ||
369 | u32 pll; | ||
370 | |||
371 | pll = SM(0x5, AR_RTC_9300_PLL_REFDIV); | ||
372 | |||
373 | if (chan && IS_CHAN_HALF_RATE(chan)) | ||
374 | pll |= SM(0x1, AR_RTC_9300_PLL_CLKSEL); | ||
375 | else if (chan && IS_CHAN_QUARTER_RATE(chan)) | ||
376 | pll |= SM(0x2, AR_RTC_9300_PLL_CLKSEL); | ||
377 | |||
378 | if (chan && IS_CHAN_5GHZ(chan)) { | ||
379 | pll |= SM(0x28, AR_RTC_9300_PLL_DIV); | ||
380 | |||
381 | /* | ||
382 | * When doing fast clock, set PLL to 0x142c | ||
383 | */ | ||
384 | if (IS_CHAN_A_5MHZ_SPACED(chan)) | ||
385 | pll = 0x142c; | ||
386 | } else | ||
387 | pll |= SM(0x2c, AR_RTC_9300_PLL_DIV); | ||
388 | |||
389 | return pll; | ||
390 | } | ||
391 | |||
392 | static void ar9003_hw_set_channel_regs(struct ath_hw *ah, | ||
393 | struct ath9k_channel *chan) | ||
394 | { | ||
395 | u32 phymode; | ||
396 | u32 enableDacFifo = 0; | ||
397 | |||
398 | enableDacFifo = | ||
399 | (REG_READ(ah, AR_PHY_GEN_CTRL) & AR_PHY_GC_ENABLE_DAC_FIFO); | ||
400 | |||
401 | /* Enable 11n HT, 20 MHz */ | ||
402 | phymode = AR_PHY_GC_HT_EN | AR_PHY_GC_SINGLE_HT_LTF1 | AR_PHY_GC_WALSH | | ||
403 | AR_PHY_GC_SHORT_GI_40 | enableDacFifo; | ||
404 | |||
405 | /* Configure baseband for dynamic 20/40 operation */ | ||
406 | if (IS_CHAN_HT40(chan)) { | ||
407 | phymode |= AR_PHY_GC_DYN2040_EN; | ||
408 | /* Configure control (primary) channel at +-10MHz */ | ||
409 | if ((chan->chanmode == CHANNEL_A_HT40PLUS) || | ||
410 | (chan->chanmode == CHANNEL_G_HT40PLUS)) | ||
411 | phymode |= AR_PHY_GC_DYN2040_PRI_CH; | ||
412 | |||
413 | } | ||
414 | |||
415 | /* make sure we preserve INI settings */ | ||
416 | phymode |= REG_READ(ah, AR_PHY_GEN_CTRL); | ||
417 | /* turn off Green Field detection for STA for now */ | ||
418 | phymode &= ~AR_PHY_GC_GF_DETECT_EN; | ||
419 | |||
420 | REG_WRITE(ah, AR_PHY_GEN_CTRL, phymode); | ||
421 | |||
422 | /* Configure MAC for 20/40 operation */ | ||
423 | ath9k_hw_set11nmac2040(ah); | ||
424 | |||
425 | /* global transmit timeout (25 TUs default)*/ | ||
426 | REG_WRITE(ah, AR_GTXTO, 25 << AR_GTXTO_TIMEOUT_LIMIT_S); | ||
427 | /* carrier sense timeout */ | ||
428 | REG_WRITE(ah, AR_CST, 0xF << AR_CST_TIMEOUT_LIMIT_S); | ||
429 | } | ||
430 | |||
431 | static void ar9003_hw_init_bb(struct ath_hw *ah, | ||
432 | struct ath9k_channel *chan) | ||
433 | { | ||
434 | u32 synthDelay; | ||
435 | |||
436 | /* | ||
437 | * Wait for the frequency synth to settle (synth goes on | ||
438 | * via AR_PHY_ACTIVE_EN). Read the phy active delay register. | ||
439 | * Value is in 100ns increments. | ||
440 | */ | ||
441 | synthDelay = REG_READ(ah, AR_PHY_RX_DELAY) & AR_PHY_RX_DELAY_DELAY; | ||
442 | if (IS_CHAN_B(chan)) | ||
443 | synthDelay = (4 * synthDelay) / 22; | ||
444 | else | ||
445 | synthDelay /= 10; | ||
446 | |||
447 | /* Activate the PHY (includes baseband activate + synthesizer on) */ | ||
448 | REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_EN); | ||
449 | |||
450 | /* | ||
451 | * There is an issue if the AP starts the calibration before | ||
452 | * the base band timeout completes. This could result in the | ||
453 | * rx_clear false triggering. As a workaround we add delay an | ||
454 | * extra BASE_ACTIVATE_DELAY usecs to ensure this condition | ||
455 | * does not happen. | ||
456 | */ | ||
457 | udelay(synthDelay + BASE_ACTIVATE_DELAY); | ||
458 | } | ||
459 | |||
460 | void ar9003_hw_set_chain_masks(struct ath_hw *ah, u8 rx, u8 tx) | ||
461 | { | ||
462 | switch (rx) { | ||
463 | case 0x5: | ||
464 | REG_SET_BIT(ah, AR_PHY_ANALOG_SWAP, | ||
465 | AR_PHY_SWAP_ALT_CHAIN); | ||
466 | case 0x3: | ||
467 | case 0x1: | ||
468 | case 0x2: | ||
469 | case 0x7: | ||
470 | REG_WRITE(ah, AR_PHY_RX_CHAINMASK, rx); | ||
471 | REG_WRITE(ah, AR_PHY_CAL_CHAINMASK, rx); | ||
472 | break; | ||
473 | default: | ||
474 | break; | ||
475 | } | ||
476 | |||
477 | REG_WRITE(ah, AR_SELFGEN_MASK, tx); | ||
478 | if (tx == 0x5) { | ||
479 | REG_SET_BIT(ah, AR_PHY_ANALOG_SWAP, | ||
480 | AR_PHY_SWAP_ALT_CHAIN); | ||
481 | } | ||
482 | } | ||
483 | |||
484 | /* | ||
485 | * Override INI values with chip specific configuration. | ||
486 | */ | ||
487 | static void ar9003_hw_override_ini(struct ath_hw *ah) | ||
488 | { | ||
489 | u32 val; | ||
490 | |||
491 | /* | ||
492 | * Set the RX_ABORT and RX_DIS and clear it only after | ||
493 | * RXE is set for MAC. This prevents frames with | ||
494 | * corrupted descriptor status. | ||
495 | */ | ||
496 | REG_SET_BIT(ah, AR_DIAG_SW, (AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT)); | ||
497 | |||
498 | /* | ||
499 | * For AR9280 and above, there is a new feature that allows | ||
500 | * Multicast search based on both MAC Address and Key ID. By default, | ||
501 | * this feature is enabled. But since the driver is not using this | ||
502 | * feature, we switch it off; otherwise multicast search based on | ||
503 | * MAC addr only will fail. | ||
504 | */ | ||
505 | val = REG_READ(ah, AR_PCU_MISC_MODE2) & (~AR_ADHOC_MCAST_KEYID_ENABLE); | ||
506 | REG_WRITE(ah, AR_PCU_MISC_MODE2, | ||
507 | val | AR_AGG_WEP_ENABLE_FIX | AR_AGG_WEP_ENABLE); | ||
508 | } | ||
509 | |||
510 | static void ar9003_hw_prog_ini(struct ath_hw *ah, | ||
511 | struct ar5416IniArray *iniArr, | ||
512 | int column) | ||
513 | { | ||
514 | unsigned int i, regWrites = 0; | ||
515 | |||
516 | /* New INI format: Array may be undefined (pre, core, post arrays) */ | ||
517 | if (!iniArr->ia_array) | ||
518 | return; | ||
519 | |||
520 | /* | ||
521 | * New INI format: Pre, core, and post arrays for a given subsystem | ||
522 | * may be modal (> 2 columns) or non-modal (2 columns). Determine if | ||
523 | * the array is non-modal and force the column to 1. | ||
524 | */ | ||
525 | if (column >= iniArr->ia_columns) | ||
526 | column = 1; | ||
527 | |||
528 | for (i = 0; i < iniArr->ia_rows; i++) { | ||
529 | u32 reg = INI_RA(iniArr, i, 0); | ||
530 | u32 val = INI_RA(iniArr, i, column); | ||
531 | |||
532 | REG_WRITE(ah, reg, val); | ||
533 | |||
534 | /* | ||
535 | * Determine if this is a shift register value, and insert the | ||
536 | * configured delay if so. | ||
537 | */ | ||
538 | if (reg >= 0x16000 && reg < 0x17000 | ||
539 | && ah->config.analog_shiftreg) | ||
540 | udelay(100); | ||
541 | |||
542 | DO_DELAY(regWrites); | ||
543 | } | ||
544 | } | ||
545 | |||
546 | static int ar9003_hw_process_ini(struct ath_hw *ah, | ||
547 | struct ath9k_channel *chan) | ||
548 | { | ||
549 | struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah); | ||
550 | unsigned int regWrites = 0, i; | ||
551 | struct ieee80211_channel *channel = chan->chan; | ||
552 | u32 modesIndex, freqIndex; | ||
553 | |||
554 | switch (chan->chanmode) { | ||
555 | case CHANNEL_A: | ||
556 | case CHANNEL_A_HT20: | ||
557 | modesIndex = 1; | ||
558 | freqIndex = 1; | ||
559 | break; | ||
560 | case CHANNEL_A_HT40PLUS: | ||
561 | case CHANNEL_A_HT40MINUS: | ||
562 | modesIndex = 2; | ||
563 | freqIndex = 1; | ||
564 | break; | ||
565 | case CHANNEL_G: | ||
566 | case CHANNEL_G_HT20: | ||
567 | case CHANNEL_B: | ||
568 | modesIndex = 4; | ||
569 | freqIndex = 2; | ||
570 | break; | ||
571 | case CHANNEL_G_HT40PLUS: | ||
572 | case CHANNEL_G_HT40MINUS: | ||
573 | modesIndex = 3; | ||
574 | freqIndex = 2; | ||
575 | break; | ||
576 | |||
577 | default: | ||
578 | return -EINVAL; | ||
579 | } | ||
580 | |||
581 | for (i = 0; i < ATH_INI_NUM_SPLIT; i++) { | ||
582 | ar9003_hw_prog_ini(ah, &ah->iniSOC[i], modesIndex); | ||
583 | ar9003_hw_prog_ini(ah, &ah->iniMac[i], modesIndex); | ||
584 | ar9003_hw_prog_ini(ah, &ah->iniBB[i], modesIndex); | ||
585 | ar9003_hw_prog_ini(ah, &ah->iniRadio[i], modesIndex); | ||
586 | } | ||
587 | |||
588 | REG_WRITE_ARRAY(&ah->iniModesRxGain, 1, regWrites); | ||
589 | REG_WRITE_ARRAY(&ah->iniModesTxGain, modesIndex, regWrites); | ||
590 | |||
591 | /* | ||
592 | * For 5GHz channels requiring Fast Clock, apply | ||
593 | * different modal values. | ||
594 | */ | ||
595 | if (IS_CHAN_A_5MHZ_SPACED(chan)) | ||
596 | REG_WRITE_ARRAY(&ah->iniModesAdditional, | ||
597 | modesIndex, regWrites); | ||
598 | |||
599 | ar9003_hw_override_ini(ah); | ||
600 | ar9003_hw_set_channel_regs(ah, chan); | ||
601 | ar9003_hw_set_chain_masks(ah, ah->rxchainmask, ah->txchainmask); | ||
602 | |||
603 | /* Set TX power */ | ||
604 | ah->eep_ops->set_txpower(ah, chan, | ||
605 | ath9k_regd_get_ctl(regulatory, chan), | ||
606 | channel->max_antenna_gain * 2, | ||
607 | channel->max_power * 2, | ||
608 | min((u32) MAX_RATE_POWER, | ||
609 | (u32) regulatory->power_limit)); | ||
610 | |||
611 | return 0; | ||
612 | } | ||
613 | |||
614 | static void ar9003_hw_set_rfmode(struct ath_hw *ah, | ||
615 | struct ath9k_channel *chan) | ||
616 | { | ||
617 | u32 rfMode = 0; | ||
618 | |||
619 | if (chan == NULL) | ||
620 | return; | ||
621 | |||
622 | rfMode |= (IS_CHAN_B(chan) || IS_CHAN_G(chan)) | ||
623 | ? AR_PHY_MODE_DYNAMIC : AR_PHY_MODE_OFDM; | ||
624 | |||
625 | if (IS_CHAN_A_5MHZ_SPACED(chan)) | ||
626 | rfMode |= (AR_PHY_MODE_DYNAMIC | AR_PHY_MODE_DYN_CCK_DISABLE); | ||
627 | |||
628 | REG_WRITE(ah, AR_PHY_MODE, rfMode); | ||
629 | } | ||
630 | |||
631 | static void ar9003_hw_mark_phy_inactive(struct ath_hw *ah) | ||
632 | { | ||
633 | REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_DIS); | ||
634 | } | ||
635 | |||
636 | static void ar9003_hw_set_delta_slope(struct ath_hw *ah, | ||
637 | struct ath9k_channel *chan) | ||
638 | { | ||
639 | u32 coef_scaled, ds_coef_exp, ds_coef_man; | ||
640 | u32 clockMhzScaled = 0x64000000; | ||
641 | struct chan_centers centers; | ||
642 | |||
643 | /* | ||
644 | * half and quarter rate can divide the scaled clock by 2 or 4 | ||
645 | * scale for selected channel bandwidth | ||
646 | */ | ||
647 | if (IS_CHAN_HALF_RATE(chan)) | ||
648 | clockMhzScaled = clockMhzScaled >> 1; | ||
649 | else if (IS_CHAN_QUARTER_RATE(chan)) | ||
650 | clockMhzScaled = clockMhzScaled >> 2; | ||
651 | |||
652 | /* | ||
653 | * ALGO -> coef = 1e8/fcarrier*fclock/40; | ||
654 | * scaled coef to provide precision for this floating calculation | ||
655 | */ | ||
656 | ath9k_hw_get_channel_centers(ah, chan, ¢ers); | ||
657 | coef_scaled = clockMhzScaled / centers.synth_center; | ||
658 | |||
659 | ath9k_hw_get_delta_slope_vals(ah, coef_scaled, &ds_coef_man, | ||
660 | &ds_coef_exp); | ||
661 | |||
662 | REG_RMW_FIELD(ah, AR_PHY_TIMING3, | ||
663 | AR_PHY_TIMING3_DSC_MAN, ds_coef_man); | ||
664 | REG_RMW_FIELD(ah, AR_PHY_TIMING3, | ||
665 | AR_PHY_TIMING3_DSC_EXP, ds_coef_exp); | ||
666 | |||
667 | /* | ||
668 | * For Short GI, | ||
669 | * scaled coeff is 9/10 that of normal coeff | ||
670 | */ | ||
671 | coef_scaled = (9 * coef_scaled) / 10; | ||
672 | |||
673 | ath9k_hw_get_delta_slope_vals(ah, coef_scaled, &ds_coef_man, | ||
674 | &ds_coef_exp); | ||
675 | |||
676 | /* for short gi */ | ||
677 | REG_RMW_FIELD(ah, AR_PHY_SGI_DELTA, | ||
678 | AR_PHY_SGI_DSC_MAN, ds_coef_man); | ||
679 | REG_RMW_FIELD(ah, AR_PHY_SGI_DELTA, | ||
680 | AR_PHY_SGI_DSC_EXP, ds_coef_exp); | ||
681 | } | ||
682 | |||
683 | static bool ar9003_hw_rfbus_req(struct ath_hw *ah) | ||
684 | { | ||
685 | REG_WRITE(ah, AR_PHY_RFBUS_REQ, AR_PHY_RFBUS_REQ_EN); | ||
686 | return ath9k_hw_wait(ah, AR_PHY_RFBUS_GRANT, AR_PHY_RFBUS_GRANT_EN, | ||
687 | AR_PHY_RFBUS_GRANT_EN, AH_WAIT_TIMEOUT); | ||
688 | } | ||
689 | |||
690 | /* | ||
691 | * Wait for the frequency synth to settle (synth goes on via PHY_ACTIVE_EN). | ||
692 | * Read the phy active delay register. Value is in 100ns increments. | ||
693 | */ | ||
694 | static void ar9003_hw_rfbus_done(struct ath_hw *ah) | ||
695 | { | ||
696 | u32 synthDelay = REG_READ(ah, AR_PHY_RX_DELAY) & AR_PHY_RX_DELAY_DELAY; | ||
697 | if (IS_CHAN_B(ah->curchan)) | ||
698 | synthDelay = (4 * synthDelay) / 22; | ||
699 | else | ||
700 | synthDelay /= 10; | ||
701 | |||
702 | udelay(synthDelay + BASE_ACTIVATE_DELAY); | ||
703 | |||
704 | REG_WRITE(ah, AR_PHY_RFBUS_REQ, 0); | ||
705 | } | ||
706 | |||
707 | /* | ||
708 | * Set the interrupt and GPIO values so the ISR can disable RF | ||
709 | * on a switch signal. Assumes GPIO port and interrupt polarity | ||
710 | * are set prior to call. | ||
711 | */ | ||
712 | static void ar9003_hw_enable_rfkill(struct ath_hw *ah) | ||
713 | { | ||
714 | /* Connect rfsilent_bb_l to baseband */ | ||
715 | REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, | ||
716 | AR_GPIO_INPUT_EN_VAL_RFSILENT_BB); | ||
717 | /* Set input mux for rfsilent_bb_l to GPIO #0 */ | ||
718 | REG_CLR_BIT(ah, AR_GPIO_INPUT_MUX2, | ||
719 | AR_GPIO_INPUT_MUX2_RFSILENT); | ||
720 | |||
721 | /* | ||
722 | * Configure the desired GPIO port for input and | ||
723 | * enable baseband rf silence. | ||
724 | */ | ||
725 | ath9k_hw_cfg_gpio_input(ah, ah->rfkill_gpio); | ||
726 | REG_SET_BIT(ah, AR_PHY_TEST, RFSILENT_BB); | ||
727 | } | ||
728 | |||
729 | static void ar9003_hw_set_diversity(struct ath_hw *ah, bool value) | ||
730 | { | ||
731 | u32 v = REG_READ(ah, AR_PHY_CCK_DETECT); | ||
732 | if (value) | ||
733 | v |= AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV; | ||
734 | else | ||
735 | v &= ~AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV; | ||
736 | REG_WRITE(ah, AR_PHY_CCK_DETECT, v); | ||
737 | } | ||
738 | |||
739 | static bool ar9003_hw_ani_control(struct ath_hw *ah, | ||
740 | enum ath9k_ani_cmd cmd, int param) | ||
741 | { | ||
742 | struct ar5416AniState *aniState = ah->curani; | ||
743 | struct ath_common *common = ath9k_hw_common(ah); | ||
744 | |||
745 | switch (cmd & ah->ani_function) { | ||
746 | case ATH9K_ANI_NOISE_IMMUNITY_LEVEL:{ | ||
747 | u32 level = param; | ||
748 | |||
749 | if (level >= ARRAY_SIZE(ah->totalSizeDesired)) { | ||
750 | ath_print(common, ATH_DBG_ANI, | ||
751 | "level out of range (%u > %u)\n", | ||
752 | level, | ||
753 | (unsigned)ARRAY_SIZE(ah->totalSizeDesired)); | ||
754 | return false; | ||
755 | } | ||
756 | |||
757 | REG_RMW_FIELD(ah, AR_PHY_DESIRED_SZ, | ||
758 | AR_PHY_DESIRED_SZ_TOT_DES, | ||
759 | ah->totalSizeDesired[level]); | ||
760 | REG_RMW_FIELD(ah, AR_PHY_AGC, | ||
761 | AR_PHY_AGC_COARSE_LOW, | ||
762 | ah->coarse_low[level]); | ||
763 | REG_RMW_FIELD(ah, AR_PHY_AGC, | ||
764 | AR_PHY_AGC_COARSE_HIGH, | ||
765 | ah->coarse_high[level]); | ||
766 | REG_RMW_FIELD(ah, AR_PHY_FIND_SIG, | ||
767 | AR_PHY_FIND_SIG_FIRPWR, ah->firpwr[level]); | ||
768 | |||
769 | if (level > aniState->noiseImmunityLevel) | ||
770 | ah->stats.ast_ani_niup++; | ||
771 | else if (level < aniState->noiseImmunityLevel) | ||
772 | ah->stats.ast_ani_nidown++; | ||
773 | aniState->noiseImmunityLevel = level; | ||
774 | break; | ||
775 | } | ||
776 | case ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION:{ | ||
777 | const int m1ThreshLow[] = { 127, 50 }; | ||
778 | const int m2ThreshLow[] = { 127, 40 }; | ||
779 | const int m1Thresh[] = { 127, 0x4d }; | ||
780 | const int m2Thresh[] = { 127, 0x40 }; | ||
781 | const int m2CountThr[] = { 31, 16 }; | ||
782 | const int m2CountThrLow[] = { 63, 48 }; | ||
783 | u32 on = param ? 1 : 0; | ||
784 | |||
785 | REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW, | ||
786 | AR_PHY_SFCORR_LOW_M1_THRESH_LOW, | ||
787 | m1ThreshLow[on]); | ||
788 | REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW, | ||
789 | AR_PHY_SFCORR_LOW_M2_THRESH_LOW, | ||
790 | m2ThreshLow[on]); | ||
791 | REG_RMW_FIELD(ah, AR_PHY_SFCORR, | ||
792 | AR_PHY_SFCORR_M1_THRESH, m1Thresh[on]); | ||
793 | REG_RMW_FIELD(ah, AR_PHY_SFCORR, | ||
794 | AR_PHY_SFCORR_M2_THRESH, m2Thresh[on]); | ||
795 | REG_RMW_FIELD(ah, AR_PHY_SFCORR, | ||
796 | AR_PHY_SFCORR_M2COUNT_THR, m2CountThr[on]); | ||
797 | REG_RMW_FIELD(ah, AR_PHY_SFCORR_LOW, | ||
798 | AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW, | ||
799 | m2CountThrLow[on]); | ||
800 | |||
801 | REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT, | ||
802 | AR_PHY_SFCORR_EXT_M1_THRESH_LOW, m1ThreshLow[on]); | ||
803 | REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT, | ||
804 | AR_PHY_SFCORR_EXT_M2_THRESH_LOW, m2ThreshLow[on]); | ||
805 | REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT, | ||
806 | AR_PHY_SFCORR_EXT_M1_THRESH, m1Thresh[on]); | ||
807 | REG_RMW_FIELD(ah, AR_PHY_SFCORR_EXT, | ||
808 | AR_PHY_SFCORR_EXT_M2_THRESH, m2Thresh[on]); | ||
809 | |||
810 | if (on) | ||
811 | REG_SET_BIT(ah, AR_PHY_SFCORR_LOW, | ||
812 | AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW); | ||
813 | else | ||
814 | REG_CLR_BIT(ah, AR_PHY_SFCORR_LOW, | ||
815 | AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW); | ||
816 | |||
817 | if (!on != aniState->ofdmWeakSigDetectOff) { | ||
818 | if (on) | ||
819 | ah->stats.ast_ani_ofdmon++; | ||
820 | else | ||
821 | ah->stats.ast_ani_ofdmoff++; | ||
822 | aniState->ofdmWeakSigDetectOff = !on; | ||
823 | } | ||
824 | break; | ||
825 | } | ||
826 | case ATH9K_ANI_CCK_WEAK_SIGNAL_THR:{ | ||
827 | const int weakSigThrCck[] = { 8, 6 }; | ||
828 | u32 high = param ? 1 : 0; | ||
829 | |||
830 | REG_RMW_FIELD(ah, AR_PHY_CCK_DETECT, | ||
831 | AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK, | ||
832 | weakSigThrCck[high]); | ||
833 | if (high != aniState->cckWeakSigThreshold) { | ||
834 | if (high) | ||
835 | ah->stats.ast_ani_cckhigh++; | ||
836 | else | ||
837 | ah->stats.ast_ani_ccklow++; | ||
838 | aniState->cckWeakSigThreshold = high; | ||
839 | } | ||
840 | break; | ||
841 | } | ||
842 | case ATH9K_ANI_FIRSTEP_LEVEL:{ | ||
843 | const int firstep[] = { 0, 4, 8 }; | ||
844 | u32 level = param; | ||
845 | |||
846 | if (level >= ARRAY_SIZE(firstep)) { | ||
847 | ath_print(common, ATH_DBG_ANI, | ||
848 | "level out of range (%u > %u)\n", | ||
849 | level, | ||
850 | (unsigned) ARRAY_SIZE(firstep)); | ||
851 | return false; | ||
852 | } | ||
853 | REG_RMW_FIELD(ah, AR_PHY_FIND_SIG, | ||
854 | AR_PHY_FIND_SIG_FIRSTEP, | ||
855 | firstep[level]); | ||
856 | if (level > aniState->firstepLevel) | ||
857 | ah->stats.ast_ani_stepup++; | ||
858 | else if (level < aniState->firstepLevel) | ||
859 | ah->stats.ast_ani_stepdown++; | ||
860 | aniState->firstepLevel = level; | ||
861 | break; | ||
862 | } | ||
863 | case ATH9K_ANI_SPUR_IMMUNITY_LEVEL:{ | ||
864 | const int cycpwrThr1[] = { 2, 4, 6, 8, 10, 12, 14, 16 }; | ||
865 | u32 level = param; | ||
866 | |||
867 | if (level >= ARRAY_SIZE(cycpwrThr1)) { | ||
868 | ath_print(common, ATH_DBG_ANI, | ||
869 | "level out of range (%u > %u)\n", | ||
870 | level, | ||
871 | (unsigned) ARRAY_SIZE(cycpwrThr1)); | ||
872 | return false; | ||
873 | } | ||
874 | REG_RMW_FIELD(ah, AR_PHY_TIMING5, | ||
875 | AR_PHY_TIMING5_CYCPWR_THR1, | ||
876 | cycpwrThr1[level]); | ||
877 | if (level > aniState->spurImmunityLevel) | ||
878 | ah->stats.ast_ani_spurup++; | ||
879 | else if (level < aniState->spurImmunityLevel) | ||
880 | ah->stats.ast_ani_spurdown++; | ||
881 | aniState->spurImmunityLevel = level; | ||
882 | break; | ||
883 | } | ||
884 | case ATH9K_ANI_PRESENT: | ||
885 | break; | ||
886 | default: | ||
887 | ath_print(common, ATH_DBG_ANI, | ||
888 | "invalid cmd %u\n", cmd); | ||
889 | return false; | ||
890 | } | ||
891 | |||
892 | ath_print(common, ATH_DBG_ANI, "ANI parameters:\n"); | ||
893 | ath_print(common, ATH_DBG_ANI, | ||
894 | "noiseImmunityLevel=%d, spurImmunityLevel=%d, " | ||
895 | "ofdmWeakSigDetectOff=%d\n", | ||
896 | aniState->noiseImmunityLevel, | ||
897 | aniState->spurImmunityLevel, | ||
898 | !aniState->ofdmWeakSigDetectOff); | ||
899 | ath_print(common, ATH_DBG_ANI, | ||
900 | "cckWeakSigThreshold=%d, " | ||
901 | "firstepLevel=%d, listenTime=%d\n", | ||
902 | aniState->cckWeakSigThreshold, | ||
903 | aniState->firstepLevel, | ||
904 | aniState->listenTime); | ||
905 | ath_print(common, ATH_DBG_ANI, | ||
906 | "cycleCount=%d, ofdmPhyErrCount=%d, cckPhyErrCount=%d\n\n", | ||
907 | aniState->cycleCount, | ||
908 | aniState->ofdmPhyErrCount, | ||
909 | aniState->cckPhyErrCount); | ||
910 | |||
911 | return true; | ||
912 | } | ||
913 | |||
914 | static void ar9003_hw_nf_sanitize_2g(struct ath_hw *ah, s16 *nf) | ||
915 | { | ||
916 | struct ath_common *common = ath9k_hw_common(ah); | ||
917 | |||
918 | if (*nf > ah->nf_2g_max) { | ||
919 | ath_print(common, ATH_DBG_CALIBRATE, | ||
920 | "2 GHz NF (%d) > MAX (%d), " | ||
921 | "correcting to MAX", | ||
922 | *nf, ah->nf_2g_max); | ||
923 | *nf = ah->nf_2g_max; | ||
924 | } else if (*nf < ah->nf_2g_min) { | ||
925 | ath_print(common, ATH_DBG_CALIBRATE, | ||
926 | "2 GHz NF (%d) < MIN (%d), " | ||
927 | "correcting to MIN", | ||
928 | *nf, ah->nf_2g_min); | ||
929 | *nf = ah->nf_2g_min; | ||
930 | } | ||
931 | } | ||
932 | |||
933 | static void ar9003_hw_nf_sanitize_5g(struct ath_hw *ah, s16 *nf) | ||
934 | { | ||
935 | struct ath_common *common = ath9k_hw_common(ah); | ||
936 | |||
937 | if (*nf > ah->nf_5g_max) { | ||
938 | ath_print(common, ATH_DBG_CALIBRATE, | ||
939 | "5 GHz NF (%d) > MAX (%d), " | ||
940 | "correcting to MAX", | ||
941 | *nf, ah->nf_5g_max); | ||
942 | *nf = ah->nf_5g_max; | ||
943 | } else if (*nf < ah->nf_5g_min) { | ||
944 | ath_print(common, ATH_DBG_CALIBRATE, | ||
945 | "5 GHz NF (%d) < MIN (%d), " | ||
946 | "correcting to MIN", | ||
947 | *nf, ah->nf_5g_min); | ||
948 | *nf = ah->nf_5g_min; | ||
949 | } | ||
950 | } | ||
951 | |||
952 | static void ar9003_hw_nf_sanitize(struct ath_hw *ah, s16 *nf) | ||
953 | { | ||
954 | if (IS_CHAN_2GHZ(ah->curchan)) | ||
955 | ar9003_hw_nf_sanitize_2g(ah, nf); | ||
956 | else | ||
957 | ar9003_hw_nf_sanitize_5g(ah, nf); | ||
958 | } | ||
959 | |||
960 | static void ar9003_hw_do_getnf(struct ath_hw *ah, | ||
961 | int16_t nfarray[NUM_NF_READINGS]) | ||
962 | { | ||
963 | struct ath_common *common = ath9k_hw_common(ah); | ||
964 | int16_t nf; | ||
965 | |||
966 | nf = MS(REG_READ(ah, AR_PHY_CCA_0), AR_PHY_MINCCA_PWR); | ||
967 | if (nf & 0x100) | ||
968 | nf = 0 - ((nf ^ 0x1ff) + 1); | ||
969 | ar9003_hw_nf_sanitize(ah, &nf); | ||
970 | ath_print(common, ATH_DBG_CALIBRATE, | ||
971 | "NF calibrated [ctl] [chain 0] is %d\n", nf); | ||
972 | nfarray[0] = nf; | ||
973 | |||
974 | nf = MS(REG_READ(ah, AR_PHY_CCA_1), AR_PHY_CH1_MINCCA_PWR); | ||
975 | if (nf & 0x100) | ||
976 | nf = 0 - ((nf ^ 0x1ff) + 1); | ||
977 | ar9003_hw_nf_sanitize(ah, &nf); | ||
978 | ath_print(common, ATH_DBG_CALIBRATE, | ||
979 | "NF calibrated [ctl] [chain 1] is %d\n", nf); | ||
980 | nfarray[1] = nf; | ||
981 | |||
982 | nf = MS(REG_READ(ah, AR_PHY_CCA_2), AR_PHY_CH2_MINCCA_PWR); | ||
983 | if (nf & 0x100) | ||
984 | nf = 0 - ((nf ^ 0x1ff) + 1); | ||
985 | ar9003_hw_nf_sanitize(ah, &nf); | ||
986 | ath_print(common, ATH_DBG_CALIBRATE, | ||
987 | "NF calibrated [ctl] [chain 2] is %d\n", nf); | ||
988 | nfarray[2] = nf; | ||
989 | |||
990 | nf = MS(REG_READ(ah, AR_PHY_EXT_CCA), AR_PHY_EXT_MINCCA_PWR); | ||
991 | if (nf & 0x100) | ||
992 | nf = 0 - ((nf ^ 0x1ff) + 1); | ||
993 | ar9003_hw_nf_sanitize(ah, &nf); | ||
994 | ath_print(common, ATH_DBG_CALIBRATE, | ||
995 | "NF calibrated [ext] [chain 0] is %d\n", nf); | ||
996 | nfarray[3] = nf; | ||
997 | |||
998 | nf = MS(REG_READ(ah, AR_PHY_EXT_CCA_1), AR_PHY_CH1_EXT_MINCCA_PWR); | ||
999 | if (nf & 0x100) | ||
1000 | nf = 0 - ((nf ^ 0x1ff) + 1); | ||
1001 | ar9003_hw_nf_sanitize(ah, &nf); | ||
1002 | ath_print(common, ATH_DBG_CALIBRATE, | ||
1003 | "NF calibrated [ext] [chain 1] is %d\n", nf); | ||
1004 | nfarray[4] = nf; | ||
1005 | |||
1006 | nf = MS(REG_READ(ah, AR_PHY_EXT_CCA_2), AR_PHY_CH2_EXT_MINCCA_PWR); | ||
1007 | if (nf & 0x100) | ||
1008 | nf = 0 - ((nf ^ 0x1ff) + 1); | ||
1009 | ar9003_hw_nf_sanitize(ah, &nf); | ||
1010 | ath_print(common, ATH_DBG_CALIBRATE, | ||
1011 | "NF calibrated [ext] [chain 2] is %d\n", nf); | ||
1012 | nfarray[5] = nf; | ||
1013 | } | ||
1014 | |||
1015 | void ar9003_hw_set_nf_limits(struct ath_hw *ah) | ||
1016 | { | ||
1017 | ah->nf_2g_max = AR_PHY_CCA_MAX_GOOD_VAL_9300_2GHZ; | ||
1018 | ah->nf_2g_min = AR_PHY_CCA_MIN_GOOD_VAL_9300_2GHZ; | ||
1019 | ah->nf_5g_max = AR_PHY_CCA_MAX_GOOD_VAL_9300_5GHZ; | ||
1020 | ah->nf_5g_min = AR_PHY_CCA_MIN_GOOD_VAL_9300_5GHZ; | ||
1021 | } | ||
1022 | |||
1023 | /* | ||
1024 | * Find out which of the RX chains are enabled | ||
1025 | */ | ||
1026 | static u32 ar9003_hw_get_rx_chainmask(struct ath_hw *ah) | ||
1027 | { | ||
1028 | u32 chain = REG_READ(ah, AR_PHY_RX_CHAINMASK); | ||
1029 | /* | ||
1030 | * The bits [2:0] indicate the rx chain mask and are to be | ||
1031 | * interpreted as follows: | ||
1032 | * 00x => Only chain 0 is enabled | ||
1033 | * 01x => Chain 1 and 0 enabled | ||
1034 | * 1xx => Chain 2,1 and 0 enabled | ||
1035 | */ | ||
1036 | return chain & 0x7; | ||
1037 | } | ||
1038 | |||
1039 | static void ar9003_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan) | ||
1040 | { | ||
1041 | struct ath9k_nfcal_hist *h; | ||
1042 | unsigned i, j; | ||
1043 | int32_t val; | ||
1044 | const u32 ar9300_cca_regs[6] = { | ||
1045 | AR_PHY_CCA_0, | ||
1046 | AR_PHY_CCA_1, | ||
1047 | AR_PHY_CCA_2, | ||
1048 | AR_PHY_EXT_CCA, | ||
1049 | AR_PHY_EXT_CCA_1, | ||
1050 | AR_PHY_EXT_CCA_2, | ||
1051 | }; | ||
1052 | u8 chainmask, rx_chain_status; | ||
1053 | struct ath_common *common = ath9k_hw_common(ah); | ||
1054 | |||
1055 | rx_chain_status = ar9003_hw_get_rx_chainmask(ah); | ||
1056 | |||
1057 | chainmask = 0x3F; | ||
1058 | h = ah->nfCalHist; | ||
1059 | |||
1060 | for (i = 0; i < NUM_NF_READINGS; i++) { | ||
1061 | if (chainmask & (1 << i)) { | ||
1062 | val = REG_READ(ah, ar9300_cca_regs[i]); | ||
1063 | val &= 0xFFFFFE00; | ||
1064 | val |= (((u32) (h[i].privNF) << 1) & 0x1ff); | ||
1065 | REG_WRITE(ah, ar9300_cca_regs[i], val); | ||
1066 | } | ||
1067 | } | ||
1068 | |||
1069 | /* | ||
1070 | * Load software filtered NF value into baseband internal minCCApwr | ||
1071 | * variable. | ||
1072 | */ | ||
1073 | REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, | ||
1074 | AR_PHY_AGC_CONTROL_ENABLE_NF); | ||
1075 | REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, | ||
1076 | AR_PHY_AGC_CONTROL_NO_UPDATE_NF); | ||
1077 | REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_NF); | ||
1078 | |||
1079 | /* | ||
1080 | * Wait for load to complete, should be fast, a few 10s of us. | ||
1081 | * The max delay was changed from an original 250us to 10000us | ||
1082 | * since 250us often results in NF load timeout and causes deaf | ||
1083 | * condition during stress testing 12/12/2009 | ||
1084 | */ | ||
1085 | for (j = 0; j < 1000; j++) { | ||
1086 | if ((REG_READ(ah, AR_PHY_AGC_CONTROL) & | ||
1087 | AR_PHY_AGC_CONTROL_NF) == 0) | ||
1088 | break; | ||
1089 | udelay(10); | ||
1090 | } | ||
1091 | |||
1092 | /* | ||
1093 | * We timed out waiting for the noisefloor to load, probably due to an | ||
1094 | * in-progress rx. Simply return here and allow the load plenty of time | ||
1095 | * to complete before the next calibration interval. We need to avoid | ||
1096 | * trying to load -50 (which happens below) while the previous load is | ||
1097 | * still in progress as this can cause rx deafness. Instead by returning | ||
1098 | * here, the baseband nf cal will just be capped by our present | ||
1099 | * noisefloor until the next calibration timer. | ||
1100 | */ | ||
1101 | if (j == 1000) { | ||
1102 | ath_print(common, ATH_DBG_ANY, "Timeout while waiting for nf " | ||
1103 | "to load: AR_PHY_AGC_CONTROL=0x%x\n", | ||
1104 | REG_READ(ah, AR_PHY_AGC_CONTROL)); | ||
1105 | } | ||
1106 | |||
1107 | /* | ||
1108 | * Restore maxCCAPower register parameter again so that we're not capped | ||
1109 | * by the median we just loaded. This will be initial (and max) value | ||
1110 | * of next noise floor calibration the baseband does. | ||
1111 | */ | ||
1112 | for (i = 0; i < NUM_NF_READINGS; i++) { | ||
1113 | if (chainmask & (1 << i)) { | ||
1114 | val = REG_READ(ah, ar9300_cca_regs[i]); | ||
1115 | val &= 0xFFFFFE00; | ||
1116 | val |= (((u32) (-50) << 1) & 0x1ff); | ||
1117 | REG_WRITE(ah, ar9300_cca_regs[i], val); | ||
1118 | } | ||
1119 | } | ||
1120 | } | ||
1121 | |||
1122 | void ar9003_hw_attach_phy_ops(struct ath_hw *ah) | ||
1123 | { | ||
1124 | struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); | ||
1125 | |||
1126 | priv_ops->rf_set_freq = ar9003_hw_set_channel; | ||
1127 | priv_ops->spur_mitigate_freq = ar9003_hw_spur_mitigate; | ||
1128 | priv_ops->compute_pll_control = ar9003_hw_compute_pll_control; | ||
1129 | priv_ops->set_channel_regs = ar9003_hw_set_channel_regs; | ||
1130 | priv_ops->init_bb = ar9003_hw_init_bb; | ||
1131 | priv_ops->process_ini = ar9003_hw_process_ini; | ||
1132 | priv_ops->set_rfmode = ar9003_hw_set_rfmode; | ||
1133 | priv_ops->mark_phy_inactive = ar9003_hw_mark_phy_inactive; | ||
1134 | priv_ops->set_delta_slope = ar9003_hw_set_delta_slope; | ||
1135 | priv_ops->rfbus_req = ar9003_hw_rfbus_req; | ||
1136 | priv_ops->rfbus_done = ar9003_hw_rfbus_done; | ||
1137 | priv_ops->enable_rfkill = ar9003_hw_enable_rfkill; | ||
1138 | priv_ops->set_diversity = ar9003_hw_set_diversity; | ||
1139 | priv_ops->ani_control = ar9003_hw_ani_control; | ||
1140 | priv_ops->do_getnf = ar9003_hw_do_getnf; | ||
1141 | priv_ops->loadnf = ar9003_hw_loadnf; | ||
1142 | } | ||
diff --git a/drivers/net/wireless/ath/ath9k/ar9003_phy.h b/drivers/net/wireless/ath/ath9k/ar9003_phy.h new file mode 100644 index 000000000000..f08cc8bda005 --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/ar9003_phy.h | |||
@@ -0,0 +1,847 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2002-2010 Atheros Communications, Inc. | ||
3 | * | ||
4 | * Permission to use, copy, modify, and/or distribute this software for any | ||
5 | * purpose with or without fee is hereby granted, provided that the above | ||
6 | * copyright notice and this permission notice appear in all copies. | ||
7 | * | ||
8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
15 | */ | ||
16 | |||
17 | #ifndef AR9003_PHY_H | ||
18 | #define AR9003_PHY_H | ||
19 | |||
20 | /* | ||
21 | * Channel Register Map | ||
22 | */ | ||
23 | #define AR_CHAN_BASE 0x9800 | ||
24 | |||
25 | #define AR_PHY_TIMING1 (AR_CHAN_BASE + 0x0) | ||
26 | #define AR_PHY_TIMING2 (AR_CHAN_BASE + 0x4) | ||
27 | #define AR_PHY_TIMING3 (AR_CHAN_BASE + 0x8) | ||
28 | #define AR_PHY_TIMING4 (AR_CHAN_BASE + 0xc) | ||
29 | #define AR_PHY_TIMING5 (AR_CHAN_BASE + 0x10) | ||
30 | #define AR_PHY_TIMING6 (AR_CHAN_BASE + 0x14) | ||
31 | #define AR_PHY_TIMING11 (AR_CHAN_BASE + 0x18) | ||
32 | #define AR_PHY_SPUR_REG (AR_CHAN_BASE + 0x1c) | ||
33 | #define AR_PHY_RX_IQCAL_CORR_B0 (AR_CHAN_BASE + 0xdc) | ||
34 | #define AR_PHY_TX_IQCAL_CONTROL_3 (AR_CHAN_BASE + 0xb0) | ||
35 | |||
36 | #define AR_PHY_TIMING11_SPUR_FREQ_SD 0x3FF00000 | ||
37 | #define AR_PHY_TIMING11_SPUR_FREQ_SD_S 20 | ||
38 | |||
39 | #define AR_PHY_TIMING11_SPUR_DELTA_PHASE 0x000FFFFF | ||
40 | #define AR_PHY_TIMING11_SPUR_DELTA_PHASE_S 0 | ||
41 | |||
42 | #define AR_PHY_TIMING11_USE_SPUR_FILTER_IN_AGC 0x40000000 | ||
43 | #define AR_PHY_TIMING11_USE_SPUR_FILTER_IN_AGC_S 30 | ||
44 | |||
45 | #define AR_PHY_TIMING11_USE_SPUR_FILTER_IN_SELFCOR 0x80000000 | ||
46 | #define AR_PHY_TIMING11_USE_SPUR_FILTER_IN_SELFCOR_S 31 | ||
47 | |||
48 | #define AR_PHY_SPUR_REG_ENABLE_NF_RSSI_SPUR_MIT 0x4000000 | ||
49 | #define AR_PHY_SPUR_REG_ENABLE_NF_RSSI_SPUR_MIT_S 26 | ||
50 | |||
51 | #define AR_PHY_SPUR_REG_ENABLE_MASK_PPM 0x20000 /* bins move with freq offset */ | ||
52 | #define AR_PHY_SPUR_REG_ENABLE_MASK_PPM_S 17 | ||
53 | #define AR_PHY_SPUR_REG_SPUR_RSSI_THRESH 0x000000FF | ||
54 | #define AR_PHY_SPUR_REG_SPUR_RSSI_THRESH_S 0 | ||
55 | #define AR_PHY_SPUR_REG_EN_VIT_SPUR_RSSI 0x00000100 | ||
56 | #define AR_PHY_SPUR_REG_EN_VIT_SPUR_RSSI_S 8 | ||
57 | #define AR_PHY_SPUR_REG_MASK_RATE_CNTL 0x03FC0000 | ||
58 | #define AR_PHY_SPUR_REG_MASK_RATE_CNTL_S 18 | ||
59 | |||
60 | #define AR_PHY_RX_IQCAL_CORR_B0_LOOPBACK_IQCORR_EN 0x20000000 | ||
61 | #define AR_PHY_RX_IQCAL_CORR_B0_LOOPBACK_IQCORR_EN_S 29 | ||
62 | |||
63 | #define AR_PHY_TX_IQCAL_CONTROL_3_IQCORR_EN 0x80000000 | ||
64 | #define AR_PHY_TX_IQCAL_CONTROL_3_IQCORR_EN_S 31 | ||
65 | |||
66 | #define AR_PHY_FIND_SIG_LOW (AR_CHAN_BASE + 0x20) | ||
67 | |||
68 | #define AR_PHY_SFCORR (AR_CHAN_BASE + 0x24) | ||
69 | #define AR_PHY_SFCORR_LOW (AR_CHAN_BASE + 0x28) | ||
70 | #define AR_PHY_SFCORR_EXT (AR_CHAN_BASE + 0x2c) | ||
71 | |||
72 | #define AR_PHY_EXT_CCA (AR_CHAN_BASE + 0x30) | ||
73 | #define AR_PHY_RADAR_0 (AR_CHAN_BASE + 0x34) | ||
74 | #define AR_PHY_RADAR_1 (AR_CHAN_BASE + 0x38) | ||
75 | #define AR_PHY_RADAR_EXT (AR_CHAN_BASE + 0x3c) | ||
76 | #define AR_PHY_MULTICHAIN_CTRL (AR_CHAN_BASE + 0x80) | ||
77 | #define AR_PHY_PERCHAIN_CSD (AR_CHAN_BASE + 0x84) | ||
78 | |||
79 | #define AR_PHY_TX_PHASE_RAMP_0 (AR_CHAN_BASE + 0xd0) | ||
80 | #define AR_PHY_ADC_GAIN_DC_CORR_0 (AR_CHAN_BASE + 0xd4) | ||
81 | #define AR_PHY_IQ_ADC_MEAS_0_B0 (AR_CHAN_BASE + 0xc0) | ||
82 | #define AR_PHY_IQ_ADC_MEAS_1_B0 (AR_CHAN_BASE + 0xc4) | ||
83 | #define AR_PHY_IQ_ADC_MEAS_2_B0 (AR_CHAN_BASE + 0xc8) | ||
84 | #define AR_PHY_IQ_ADC_MEAS_3_B0 (AR_CHAN_BASE + 0xcc) | ||
85 | |||
86 | /* The following registers changed position from AR9300 1.0 to AR9300 2.0 */ | ||
87 | #define AR_PHY_TX_PHASE_RAMP_0_9300_10 (AR_CHAN_BASE + 0xd0 - 0x10) | ||
88 | #define AR_PHY_ADC_GAIN_DC_CORR_0_9300_10 (AR_CHAN_BASE + 0xd4 - 0x10) | ||
89 | #define AR_PHY_IQ_ADC_MEAS_0_B0_9300_10 (AR_CHAN_BASE + 0xc0 + 0x8) | ||
90 | #define AR_PHY_IQ_ADC_MEAS_1_B0_9300_10 (AR_CHAN_BASE + 0xc4 + 0x8) | ||
91 | #define AR_PHY_IQ_ADC_MEAS_2_B0_9300_10 (AR_CHAN_BASE + 0xc8 + 0x8) | ||
92 | #define AR_PHY_IQ_ADC_MEAS_3_B0_9300_10 (AR_CHAN_BASE + 0xcc + 0x8) | ||
93 | |||
94 | #define AR_PHY_TX_CRC (AR_CHAN_BASE + 0xa0) | ||
95 | #define AR_PHY_TST_DAC_CONST (AR_CHAN_BASE + 0xa4) | ||
96 | #define AR_PHY_SPUR_REPORT_0 (AR_CHAN_BASE + 0xa8) | ||
97 | #define AR_PHY_CHAN_INFO_TAB_0 (AR_CHAN_BASE + 0x300) | ||
98 | |||
99 | /* | ||
100 | * Channel Field Definitions | ||
101 | */ | ||
102 | #define AR_PHY_TIMING2_USE_FORCE_PPM 0x00001000 | ||
103 | #define AR_PHY_TIMING2_FORCE_PPM_VAL 0x00000fff | ||
104 | #define AR_PHY_TIMING3_DSC_MAN 0xFFFE0000 | ||
105 | #define AR_PHY_TIMING3_DSC_MAN_S 17 | ||
106 | #define AR_PHY_TIMING3_DSC_EXP 0x0001E000 | ||
107 | #define AR_PHY_TIMING3_DSC_EXP_S 13 | ||
108 | #define AR_PHY_TIMING4_IQCAL_LOG_COUNT_MAX 0xF000 | ||
109 | #define AR_PHY_TIMING4_IQCAL_LOG_COUNT_MAX_S 12 | ||
110 | #define AR_PHY_TIMING4_DO_CAL 0x10000 | ||
111 | |||
112 | #define AR_PHY_TIMING4_ENABLE_PILOT_MASK 0x10000000 | ||
113 | #define AR_PHY_TIMING4_ENABLE_PILOT_MASK_S 28 | ||
114 | #define AR_PHY_TIMING4_ENABLE_CHAN_MASK 0x20000000 | ||
115 | #define AR_PHY_TIMING4_ENABLE_CHAN_MASK_S 29 | ||
116 | |||
117 | #define AR_PHY_TIMING4_ENABLE_SPUR_FILTER 0x40000000 | ||
118 | #define AR_PHY_TIMING4_ENABLE_SPUR_FILTER_S 30 | ||
119 | #define AR_PHY_TIMING4_ENABLE_SPUR_RSSI 0x80000000 | ||
120 | #define AR_PHY_TIMING4_ENABLE_SPUR_RSSI_S 31 | ||
121 | |||
122 | #define AR_PHY_NEW_ADC_GAIN_CORR_ENABLE 0x40000000 | ||
123 | #define AR_PHY_NEW_ADC_DC_OFFSET_CORR_ENABLE 0x80000000 | ||
124 | #define AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW 0x00000001 | ||
125 | #define AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW 0x00003F00 | ||
126 | #define AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW_S 8 | ||
127 | #define AR_PHY_SFCORR_LOW_M1_THRESH_LOW 0x001FC000 | ||
128 | #define AR_PHY_SFCORR_LOW_M1_THRESH_LOW_S 14 | ||
129 | #define AR_PHY_SFCORR_LOW_M2_THRESH_LOW 0x0FE00000 | ||
130 | #define AR_PHY_SFCORR_LOW_M2_THRESH_LOW_S 21 | ||
131 | #define AR_PHY_SFCORR_M2COUNT_THR 0x0000001F | ||
132 | #define AR_PHY_SFCORR_M2COUNT_THR_S 0 | ||
133 | #define AR_PHY_SFCORR_M1_THRESH 0x00FE0000 | ||
134 | #define AR_PHY_SFCORR_M1_THRESH_S 17 | ||
135 | #define AR_PHY_SFCORR_M2_THRESH 0x7F000000 | ||
136 | #define AR_PHY_SFCORR_M2_THRESH_S 24 | ||
137 | #define AR_PHY_SFCORR_EXT_M1_THRESH 0x0000007F | ||
138 | #define AR_PHY_SFCORR_EXT_M1_THRESH_S 0 | ||
139 | #define AR_PHY_SFCORR_EXT_M2_THRESH 0x00003F80 | ||
140 | #define AR_PHY_SFCORR_EXT_M2_THRESH_S 7 | ||
141 | #define AR_PHY_SFCORR_EXT_M1_THRESH_LOW 0x001FC000 | ||
142 | #define AR_PHY_SFCORR_EXT_M1_THRESH_LOW_S 14 | ||
143 | #define AR_PHY_SFCORR_EXT_M2_THRESH_LOW 0x0FE00000 | ||
144 | #define AR_PHY_SFCORR_EXT_M2_THRESH_LOW_S 21 | ||
145 | #define AR_PHY_SFCORR_EXT_SPUR_SUBCHANNEL_SD 0x10000000 | ||
146 | #define AR_PHY_SFCORR_EXT_SPUR_SUBCHANNEL_SD_S 28 | ||
147 | #define AR_PHY_SFCORR_SPUR_SUBCHNL_SD_S 28 | ||
148 | #define AR_PHY_EXT_CCA_THRESH62 0x007F0000 | ||
149 | #define AR_PHY_EXT_CCA_THRESH62_S 16 | ||
150 | #define AR_PHY_EXT_MINCCA_PWR 0x01FF0000 | ||
151 | #define AR_PHY_EXT_MINCCA_PWR_S 16 | ||
152 | #define AR_PHY_TIMING5_CYCPWR_THR1 0x000000FE | ||
153 | #define AR_PHY_TIMING5_CYCPWR_THR1_S 1 | ||
154 | #define AR_PHY_TIMING5_CYCPWR_THR1_ENABLE 0x00000001 | ||
155 | #define AR_PHY_TIMING5_CYCPWR_THR1_ENABLE_S 0 | ||
156 | #define AR_PHY_TIMING5_CYCPWR_THR1A 0x007F0000 | ||
157 | #define AR_PHY_TIMING5_CYCPWR_THR1A_S 16 | ||
158 | #define AR_PHY_TIMING5_RSSI_THR1A (0x7F << 16) | ||
159 | #define AR_PHY_TIMING5_RSSI_THR1A_S 16 | ||
160 | #define AR_PHY_TIMING5_RSSI_THR1A_ENA (0x1 << 15) | ||
161 | #define AR_PHY_RADAR_0_ENA 0x00000001 | ||
162 | #define AR_PHY_RADAR_0_FFT_ENA 0x80000000 | ||
163 | #define AR_PHY_RADAR_0_INBAND 0x0000003e | ||
164 | #define AR_PHY_RADAR_0_INBAND_S 1 | ||
165 | #define AR_PHY_RADAR_0_PRSSI 0x00000FC0 | ||
166 | #define AR_PHY_RADAR_0_PRSSI_S 6 | ||
167 | #define AR_PHY_RADAR_0_HEIGHT 0x0003F000 | ||
168 | #define AR_PHY_RADAR_0_HEIGHT_S 12 | ||
169 | #define AR_PHY_RADAR_0_RRSSI 0x00FC0000 | ||
170 | #define AR_PHY_RADAR_0_RRSSI_S 18 | ||
171 | #define AR_PHY_RADAR_0_FIRPWR 0x7F000000 | ||
172 | #define AR_PHY_RADAR_0_FIRPWR_S 24 | ||
173 | #define AR_PHY_RADAR_1_RELPWR_ENA 0x00800000 | ||
174 | #define AR_PHY_RADAR_1_USE_FIR128 0x00400000 | ||
175 | #define AR_PHY_RADAR_1_RELPWR_THRESH 0x003F0000 | ||
176 | #define AR_PHY_RADAR_1_RELPWR_THRESH_S 16 | ||
177 | #define AR_PHY_RADAR_1_BLOCK_CHECK 0x00008000 | ||
178 | #define AR_PHY_RADAR_1_MAX_RRSSI 0x00004000 | ||
179 | #define AR_PHY_RADAR_1_RELSTEP_CHECK 0x00002000 | ||
180 | #define AR_PHY_RADAR_1_RELSTEP_THRESH 0x00001F00 | ||
181 | #define AR_PHY_RADAR_1_RELSTEP_THRESH_S 8 | ||
182 | #define AR_PHY_RADAR_1_MAXLEN 0x000000FF | ||
183 | #define AR_PHY_RADAR_1_MAXLEN_S 0 | ||
184 | #define AR_PHY_RADAR_EXT_ENA 0x00004000 | ||
185 | #define AR_PHY_RADAR_DC_PWR_THRESH 0x007f8000 | ||
186 | #define AR_PHY_RADAR_DC_PWR_THRESH_S 15 | ||
187 | #define AR_PHY_RADAR_LB_DC_CAP 0x7f800000 | ||
188 | #define AR_PHY_RADAR_LB_DC_CAP_S 23 | ||
189 | #define AR_PHY_FIND_SIG_LOW_FIRSTEP_LOW (0x3f << 6) | ||
190 | #define AR_PHY_FIND_SIG_LOW_FIRSTEP_LOW_S 6 | ||
191 | #define AR_PHY_FIND_SIG_LOW_FIRPWR (0x7f << 12) | ||
192 | #define AR_PHY_FIND_SIG_LOW_FIRPWR_S 12 | ||
193 | #define AR_PHY_FIND_SIG_LOW_FIRPWR_SIGN_BIT 19 | ||
194 | #define AR_PHY_FIND_SIG_LOW_RELSTEP 0x1f | ||
195 | #define AR_PHY_FIND_SIG_LOW_RELSTEP_S 0 | ||
196 | #define AR_PHY_FIND_SIG_LOW_RELSTEP_SIGN_BIT 5 | ||
197 | #define AR_PHY_CHAN_INFO_TAB_S2_READ 0x00000008 | ||
198 | #define AR_PHY_CHAN_INFO_TAB_S2_READ_S 3 | ||
199 | #define AR_PHY_RX_IQCAL_CORR_IQCORR_Q_Q_COFF 0x0000007F | ||
200 | #define AR_PHY_RX_IQCAL_CORR_IQCORR_Q_Q_COFF_S 0 | ||
201 | #define AR_PHY_RX_IQCAL_CORR_IQCORR_Q_I_COFF 0x00003F80 | ||
202 | #define AR_PHY_RX_IQCAL_CORR_IQCORR_Q_I_COFF_S 7 | ||
203 | #define AR_PHY_RX_IQCAL_CORR_IQCORR_ENABLE 0x00004000 | ||
204 | #define AR_PHY_RX_IQCAL_CORR_LOOPBACK_IQCORR_Q_Q_COFF 0x003f8000 | ||
205 | #define AR_PHY_RX_IQCAL_CORR_LOOPBACK_IQCORR_Q_Q_COFF_S 15 | ||
206 | #define AR_PHY_RX_IQCAL_CORR_LOOPBACK_IQCORR_Q_I_COFF 0x1fc00000 | ||
207 | #define AR_PHY_RX_IQCAL_CORR_LOOPBACK_IQCORR_Q_I_COFF_S 22 | ||
208 | |||
209 | /* | ||
210 | * MRC Register Map | ||
211 | */ | ||
212 | #define AR_MRC_BASE 0x9c00 | ||
213 | |||
214 | #define AR_PHY_TIMING_3A (AR_MRC_BASE + 0x0) | ||
215 | #define AR_PHY_LDPC_CNTL1 (AR_MRC_BASE + 0x4) | ||
216 | #define AR_PHY_LDPC_CNTL2 (AR_MRC_BASE + 0x8) | ||
217 | #define AR_PHY_PILOT_SPUR_MASK (AR_MRC_BASE + 0xc) | ||
218 | #define AR_PHY_CHAN_SPUR_MASK (AR_MRC_BASE + 0x10) | ||
219 | #define AR_PHY_SGI_DELTA (AR_MRC_BASE + 0x14) | ||
220 | #define AR_PHY_ML_CNTL_1 (AR_MRC_BASE + 0x18) | ||
221 | #define AR_PHY_ML_CNTL_2 (AR_MRC_BASE + 0x1c) | ||
222 | #define AR_PHY_TST_ADC (AR_MRC_BASE + 0x20) | ||
223 | |||
224 | #define AR_PHY_PILOT_SPUR_MASK_CF_PILOT_MASK_IDX_A 0x00000FE0 | ||
225 | #define AR_PHY_PILOT_SPUR_MASK_CF_PILOT_MASK_IDX_A_S 5 | ||
226 | #define AR_PHY_PILOT_SPUR_MASK_CF_PILOT_MASK_A 0x1F | ||
227 | #define AR_PHY_PILOT_SPUR_MASK_CF_PILOT_MASK_A_S 0 | ||
228 | |||
229 | #define AR_PHY_CHAN_SPUR_MASK_CF_CHAN_MASK_IDX_A 0x00000FE0 | ||
230 | #define AR_PHY_CHAN_SPUR_MASK_CF_CHAN_MASK_IDX_A_S 5 | ||
231 | #define AR_PHY_CHAN_SPUR_MASK_CF_CHAN_MASK_A 0x1F | ||
232 | #define AR_PHY_CHAN_SPUR_MASK_CF_CHAN_MASK_A_S 0 | ||
233 | |||
234 | /* | ||
235 | * MRC Feild Definitions | ||
236 | */ | ||
237 | #define AR_PHY_SGI_DSC_MAN 0x0007FFF0 | ||
238 | #define AR_PHY_SGI_DSC_MAN_S 4 | ||
239 | #define AR_PHY_SGI_DSC_EXP 0x0000000F | ||
240 | #define AR_PHY_SGI_DSC_EXP_S 0 | ||
241 | /* | ||
242 | * BBB Register Map | ||
243 | */ | ||
244 | #define AR_BBB_BASE 0x9d00 | ||
245 | |||
246 | /* | ||
247 | * AGC Register Map | ||
248 | */ | ||
249 | #define AR_AGC_BASE 0x9e00 | ||
250 | |||
251 | #define AR_PHY_SETTLING (AR_AGC_BASE + 0x0) | ||
252 | #define AR_PHY_FORCEMAX_GAINS_0 (AR_AGC_BASE + 0x4) | ||
253 | #define AR_PHY_GAINS_MINOFF0 (AR_AGC_BASE + 0x8) | ||
254 | #define AR_PHY_DESIRED_SZ (AR_AGC_BASE + 0xc) | ||
255 | #define AR_PHY_FIND_SIG (AR_AGC_BASE + 0x10) | ||
256 | #define AR_PHY_AGC (AR_AGC_BASE + 0x14) | ||
257 | #define AR_PHY_EXT_ATTEN_CTL_0 (AR_AGC_BASE + 0x18) | ||
258 | #define AR_PHY_CCA_0 (AR_AGC_BASE + 0x1c) | ||
259 | #define AR_PHY_EXT_CCA0 (AR_AGC_BASE + 0x20) | ||
260 | #define AR_PHY_RESTART (AR_AGC_BASE + 0x24) | ||
261 | #define AR_PHY_MC_GAIN_CTRL (AR_AGC_BASE + 0x28) | ||
262 | #define AR_PHY_EXTCHN_PWRTHR1 (AR_AGC_BASE + 0x2c) | ||
263 | #define AR_PHY_EXT_CHN_WIN (AR_AGC_BASE + 0x30) | ||
264 | #define AR_PHY_20_40_DET_THR (AR_AGC_BASE + 0x34) | ||
265 | #define AR_PHY_RIFS_SRCH (AR_AGC_BASE + 0x38) | ||
266 | #define AR_PHY_PEAK_DET_CTRL_1 (AR_AGC_BASE + 0x3c) | ||
267 | #define AR_PHY_PEAK_DET_CTRL_2 (AR_AGC_BASE + 0x40) | ||
268 | #define AR_PHY_RX_GAIN_BOUNDS_1 (AR_AGC_BASE + 0x44) | ||
269 | #define AR_PHY_RX_GAIN_BOUNDS_2 (AR_AGC_BASE + 0x48) | ||
270 | #define AR_PHY_RSSI_0 (AR_AGC_BASE + 0x180) | ||
271 | #define AR_PHY_SPUR_CCK_REP0 (AR_AGC_BASE + 0x184) | ||
272 | #define AR_PHY_CCK_DETECT (AR_AGC_BASE + 0x1c0) | ||
273 | #define AR_PHY_DAG_CTRLCCK (AR_AGC_BASE + 0x1c4) | ||
274 | #define AR_PHY_IQCORR_CTRL_CCK (AR_AGC_BASE + 0x1c8) | ||
275 | |||
276 | #define AR_PHY_CCK_SPUR_MIT (AR_AGC_BASE + 0x1cc) | ||
277 | #define AR_PHY_CCK_SPUR_MIT_SPUR_RSSI_THR 0x000001fe | ||
278 | #define AR_PHY_CCK_SPUR_MIT_SPUR_RSSI_THR_S 1 | ||
279 | #define AR_PHY_CCK_SPUR_MIT_SPUR_FILTER_TYPE 0x60000000 | ||
280 | #define AR_PHY_CCK_SPUR_MIT_SPUR_FILTER_TYPE_S 29 | ||
281 | #define AR_PHY_CCK_SPUR_MIT_USE_CCK_SPUR_MIT 0x00000001 | ||
282 | #define AR_PHY_CCK_SPUR_MIT_USE_CCK_SPUR_MIT_S 0 | ||
283 | #define AR_PHY_CCK_SPUR_MIT_CCK_SPUR_FREQ 0x1ffffe00 | ||
284 | #define AR_PHY_CCK_SPUR_MIT_CCK_SPUR_FREQ_S 9 | ||
285 | |||
286 | #define AR_PHY_RX_OCGAIN (AR_AGC_BASE + 0x200) | ||
287 | |||
288 | #define AR_PHY_CCA_NOM_VAL_9300_2GHZ -110 | ||
289 | #define AR_PHY_CCA_NOM_VAL_9300_5GHZ -115 | ||
290 | #define AR_PHY_CCA_MIN_GOOD_VAL_9300_2GHZ -125 | ||
291 | #define AR_PHY_CCA_MIN_GOOD_VAL_9300_5GHZ -125 | ||
292 | #define AR_PHY_CCA_MAX_GOOD_VAL_9300_2GHZ -95 | ||
293 | #define AR_PHY_CCA_MAX_GOOD_VAL_9300_5GHZ -100 | ||
294 | |||
295 | /* | ||
296 | * AGC Field Definitions | ||
297 | */ | ||
298 | #define AR_PHY_EXT_ATTEN_CTL_RXTX_MARGIN 0x00FC0000 | ||
299 | #define AR_PHY_EXT_ATTEN_CTL_RXTX_MARGIN_S 18 | ||
300 | #define AR_PHY_EXT_ATTEN_CTL_BSW_MARGIN 0x00003C00 | ||
301 | #define AR_PHY_EXT_ATTEN_CTL_BSW_MARGIN_S 10 | ||
302 | #define AR_PHY_EXT_ATTEN_CTL_BSW_ATTEN 0x0000001F | ||
303 | #define AR_PHY_EXT_ATTEN_CTL_BSW_ATTEN_S 0 | ||
304 | #define AR_PHY_EXT_ATTEN_CTL_XATTEN2_MARGIN 0x003E0000 | ||
305 | #define AR_PHY_EXT_ATTEN_CTL_XATTEN2_MARGIN_S 17 | ||
306 | #define AR_PHY_EXT_ATTEN_CTL_XATTEN1_MARGIN 0x0001F000 | ||
307 | #define AR_PHY_EXT_ATTEN_CTL_XATTEN1_MARGIN_S 12 | ||
308 | #define AR_PHY_EXT_ATTEN_CTL_XATTEN2_DB 0x00000FC0 | ||
309 | #define AR_PHY_EXT_ATTEN_CTL_XATTEN2_DB_S 6 | ||
310 | #define AR_PHY_EXT_ATTEN_CTL_XATTEN1_DB 0x0000003F | ||
311 | #define AR_PHY_EXT_ATTEN_CTL_XATTEN1_DB_S 0 | ||
312 | #define AR_PHY_RXGAIN_TXRX_ATTEN 0x0003F000 | ||
313 | #define AR_PHY_RXGAIN_TXRX_ATTEN_S 12 | ||
314 | #define AR_PHY_RXGAIN_TXRX_RF_MAX 0x007C0000 | ||
315 | #define AR_PHY_RXGAIN_TXRX_RF_MAX_S 18 | ||
316 | #define AR9280_PHY_RXGAIN_TXRX_ATTEN 0x00003F80 | ||
317 | #define AR9280_PHY_RXGAIN_TXRX_ATTEN_S 7 | ||
318 | #define AR9280_PHY_RXGAIN_TXRX_MARGIN 0x001FC000 | ||
319 | #define AR9280_PHY_RXGAIN_TXRX_MARGIN_S 14 | ||
320 | #define AR_PHY_SETTLING_SWITCH 0x00003F80 | ||
321 | #define AR_PHY_SETTLING_SWITCH_S 7 | ||
322 | #define AR_PHY_DESIRED_SZ_ADC 0x000000FF | ||
323 | #define AR_PHY_DESIRED_SZ_ADC_S 0 | ||
324 | #define AR_PHY_DESIRED_SZ_PGA 0x0000FF00 | ||
325 | #define AR_PHY_DESIRED_SZ_PGA_S 8 | ||
326 | #define AR_PHY_DESIRED_SZ_TOT_DES 0x0FF00000 | ||
327 | #define AR_PHY_DESIRED_SZ_TOT_DES_S 20 | ||
328 | #define AR_PHY_MINCCA_PWR 0x1FF00000 | ||
329 | #define AR_PHY_MINCCA_PWR_S 20 | ||
330 | #define AR_PHY_CCA_THRESH62 0x0007F000 | ||
331 | #define AR_PHY_CCA_THRESH62_S 12 | ||
332 | #define AR9280_PHY_MINCCA_PWR 0x1FF00000 | ||
333 | #define AR9280_PHY_MINCCA_PWR_S 20 | ||
334 | #define AR9280_PHY_CCA_THRESH62 0x000FF000 | ||
335 | #define AR9280_PHY_CCA_THRESH62_S 12 | ||
336 | #define AR_PHY_EXT_CCA0_THRESH62 0x000000FF | ||
337 | #define AR_PHY_EXT_CCA0_THRESH62_S 0 | ||
338 | #define AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK 0x0000003F | ||
339 | #define AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK_S 0 | ||
340 | #define AR_PHY_CCK_DETECT_ANT_SWITCH_TIME 0x00001FC0 | ||
341 | #define AR_PHY_CCK_DETECT_ANT_SWITCH_TIME_S 6 | ||
342 | #define AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV 0x2000 | ||
343 | |||
344 | #define AR_PHY_DAG_CTRLCCK_EN_RSSI_THR 0x00000200 | ||
345 | #define AR_PHY_DAG_CTRLCCK_EN_RSSI_THR_S 9 | ||
346 | #define AR_PHY_DAG_CTRLCCK_RSSI_THR 0x0001FC00 | ||
347 | #define AR_PHY_DAG_CTRLCCK_RSSI_THR_S 10 | ||
348 | |||
349 | #define AR_PHY_RIFS_INIT_DELAY 0x3ff0000 | ||
350 | #define AR_PHY_AGC_COARSE_LOW 0x00007F80 | ||
351 | #define AR_PHY_AGC_COARSE_LOW_S 7 | ||
352 | #define AR_PHY_AGC_COARSE_HIGH 0x003F8000 | ||
353 | #define AR_PHY_AGC_COARSE_HIGH_S 15 | ||
354 | #define AR_PHY_AGC_COARSE_PWR_CONST 0x0000007F | ||
355 | #define AR_PHY_AGC_COARSE_PWR_CONST_S 0 | ||
356 | #define AR_PHY_FIND_SIG_FIRSTEP 0x0003F000 | ||
357 | #define AR_PHY_FIND_SIG_FIRSTEP_S 12 | ||
358 | #define AR_PHY_FIND_SIG_FIRPWR 0x03FC0000 | ||
359 | #define AR_PHY_FIND_SIG_FIRPWR_S 18 | ||
360 | #define AR_PHY_FIND_SIG_FIRPWR_SIGN_BIT 25 | ||
361 | #define AR_PHY_FIND_SIG_RELPWR (0x1f << 6) | ||
362 | #define AR_PHY_FIND_SIG_RELPWR_S 6 | ||
363 | #define AR_PHY_FIND_SIG_RELPWR_SIGN_BIT 11 | ||
364 | #define AR_PHY_FIND_SIG_RELSTEP 0x1f | ||
365 | #define AR_PHY_FIND_SIG_RELSTEP_S 0 | ||
366 | #define AR_PHY_FIND_SIG_RELSTEP_SIGN_BIT 5 | ||
367 | #define AR_PHY_RESTART_DIV_GC 0x001C0000 | ||
368 | #define AR_PHY_RESTART_DIV_GC_S 18 | ||
369 | #define AR_PHY_RESTART_ENA 0x01 | ||
370 | #define AR_PHY_DC_RESTART_DIS 0x40000000 | ||
371 | |||
372 | #define AR_PHY_TPC_OLPC_GAIN_DELTA_PAL_ON 0xFF000000 | ||
373 | #define AR_PHY_TPC_OLPC_GAIN_DELTA_PAL_ON_S 24 | ||
374 | #define AR_PHY_TPC_OLPC_GAIN_DELTA 0x00FF0000 | ||
375 | #define AR_PHY_TPC_OLPC_GAIN_DELTA_S 16 | ||
376 | |||
377 | #define AR_PHY_TPC_6_ERROR_EST_MODE 0x03000000 | ||
378 | #define AR_PHY_TPC_6_ERROR_EST_MODE_S 24 | ||
379 | |||
380 | /* | ||
381 | * SM Register Map | ||
382 | */ | ||
383 | #define AR_SM_BASE 0xa200 | ||
384 | |||
385 | #define AR_PHY_D2_CHIP_ID (AR_SM_BASE + 0x0) | ||
386 | #define AR_PHY_GEN_CTRL (AR_SM_BASE + 0x4) | ||
387 | #define AR_PHY_MODE (AR_SM_BASE + 0x8) | ||
388 | #define AR_PHY_ACTIVE (AR_SM_BASE + 0xc) | ||
389 | #define AR_PHY_SPUR_MASK_A (AR_SM_BASE + 0x20) | ||
390 | #define AR_PHY_SPUR_MASK_B (AR_SM_BASE + 0x24) | ||
391 | #define AR_PHY_SPECTRAL_SCAN (AR_SM_BASE + 0x28) | ||
392 | #define AR_PHY_RADAR_BW_FILTER (AR_SM_BASE + 0x2c) | ||
393 | #define AR_PHY_SEARCH_START_DELAY (AR_SM_BASE + 0x30) | ||
394 | #define AR_PHY_MAX_RX_LEN (AR_SM_BASE + 0x34) | ||
395 | #define AR_PHY_FRAME_CTL (AR_SM_BASE + 0x38) | ||
396 | #define AR_PHY_RFBUS_REQ (AR_SM_BASE + 0x3c) | ||
397 | #define AR_PHY_RFBUS_GRANT (AR_SM_BASE + 0x40) | ||
398 | #define AR_PHY_RIFS (AR_SM_BASE + 0x44) | ||
399 | #define AR_PHY_RX_CLR_DELAY (AR_SM_BASE + 0x50) | ||
400 | #define AR_PHY_RX_DELAY (AR_SM_BASE + 0x54) | ||
401 | |||
402 | #define AR_PHY_XPA_TIMING_CTL (AR_SM_BASE + 0x64) | ||
403 | #define AR_PHY_MISC_PA_CTL (AR_SM_BASE + 0x80) | ||
404 | #define AR_PHY_SWITCH_CHAIN_0 (AR_SM_BASE + 0x84) | ||
405 | #define AR_PHY_SWITCH_COM (AR_SM_BASE + 0x88) | ||
406 | #define AR_PHY_SWITCH_COM_2 (AR_SM_BASE + 0x8c) | ||
407 | #define AR_PHY_RX_CHAINMASK (AR_SM_BASE + 0xa0) | ||
408 | #define AR_PHY_CAL_CHAINMASK (AR_SM_BASE + 0xc0) | ||
409 | #define AR_PHY_CALMODE (AR_SM_BASE + 0xc8) | ||
410 | #define AR_PHY_FCAL_1 (AR_SM_BASE + 0xcc) | ||
411 | #define AR_PHY_FCAL_2_0 (AR_SM_BASE + 0xd0) | ||
412 | #define AR_PHY_DFT_TONE_CTL_0 (AR_SM_BASE + 0xd4) | ||
413 | #define AR_PHY_CL_CAL_CTL (AR_SM_BASE + 0xd8) | ||
414 | #define AR_PHY_CL_TAB_0 (AR_SM_BASE + 0x100) | ||
415 | #define AR_PHY_SYNTH_CONTROL (AR_SM_BASE + 0x140) | ||
416 | #define AR_PHY_ADDAC_CLK_SEL (AR_SM_BASE + 0x144) | ||
417 | #define AR_PHY_PLL_CTL (AR_SM_BASE + 0x148) | ||
418 | #define AR_PHY_ANALOG_SWAP (AR_SM_BASE + 0x14c) | ||
419 | #define AR_PHY_ADDAC_PARA_CTL (AR_SM_BASE + 0x150) | ||
420 | #define AR_PHY_XPA_CFG (AR_SM_BASE + 0x158) | ||
421 | |||
422 | #define AR_PHY_SPUR_MASK_A_CF_PUNC_MASK_IDX_A 0x0001FC00 | ||
423 | #define AR_PHY_SPUR_MASK_A_CF_PUNC_MASK_IDX_A_S 10 | ||
424 | #define AR_PHY_SPUR_MASK_A_CF_PUNC_MASK_A 0x3FF | ||
425 | #define AR_PHY_SPUR_MASK_A_CF_PUNC_MASK_A_S 0 | ||
426 | |||
427 | #define AR_PHY_TEST (AR_SM_BASE + 0x160) | ||
428 | |||
429 | #define AR_PHY_TEST_BBB_OBS_SEL 0x780000 | ||
430 | #define AR_PHY_TEST_BBB_OBS_SEL_S 19 | ||
431 | |||
432 | #define AR_PHY_TEST_RX_OBS_SEL_BIT5_S 23 | ||
433 | #define AR_PHY_TEST_RX_OBS_SEL_BIT5 (1 << AR_PHY_TEST_RX_OBS_SEL_BIT5_S) | ||
434 | |||
435 | #define AR_PHY_TEST_CHAIN_SEL 0xC0000000 | ||
436 | #define AR_PHY_TEST_CHAIN_SEL_S 30 | ||
437 | |||
438 | #define AR_PHY_TEST_CTL_STATUS (AR_SM_BASE + 0x164) | ||
439 | #define AR_PHY_TEST_CTL_TSTDAC_EN 0x1 | ||
440 | #define AR_PHY_TEST_CTL_TSTDAC_EN_S 0 | ||
441 | #define AR_PHY_TEST_CTL_TX_OBS_SEL 0x1C | ||
442 | #define AR_PHY_TEST_CTL_TX_OBS_SEL_S 2 | ||
443 | #define AR_PHY_TEST_CTL_TX_OBS_MUX_SEL 0x60 | ||
444 | #define AR_PHY_TEST_CTL_TX_OBS_MUX_SEL_S 5 | ||
445 | #define AR_PHY_TEST_CTL_TSTADC_EN 0x100 | ||
446 | #define AR_PHY_TEST_CTL_TSTADC_EN_S 8 | ||
447 | #define AR_PHY_TEST_CTL_RX_OBS_SEL 0x3C00 | ||
448 | #define AR_PHY_TEST_CTL_RX_OBS_SEL_S 10 | ||
449 | |||
450 | |||
451 | #define AR_PHY_TSTDAC (AR_SM_BASE + 0x168) | ||
452 | |||
453 | #define AR_PHY_CHAN_STATUS (AR_SM_BASE + 0x16c) | ||
454 | #define AR_PHY_CHAN_INFO_MEMORY (AR_SM_BASE + 0x170) | ||
455 | #define AR_PHY_CHNINFO_NOISEPWR (AR_SM_BASE + 0x174) | ||
456 | #define AR_PHY_CHNINFO_GAINDIFF (AR_SM_BASE + 0x178) | ||
457 | #define AR_PHY_CHNINFO_FINETIM (AR_SM_BASE + 0x17c) | ||
458 | #define AR_PHY_CHAN_INFO_GAIN_0 (AR_SM_BASE + 0x180) | ||
459 | #define AR_PHY_SCRAMBLER_SEED (AR_SM_BASE + 0x190) | ||
460 | #define AR_PHY_CCK_TX_CTRL (AR_SM_BASE + 0x194) | ||
461 | |||
462 | #define AR_PHY_HEAVYCLIP_CTL (AR_SM_BASE + 0x1a4) | ||
463 | #define AR_PHY_HEAVYCLIP_20 (AR_SM_BASE + 0x1a8) | ||
464 | #define AR_PHY_HEAVYCLIP_40 (AR_SM_BASE + 0x1ac) | ||
465 | #define AR_PHY_ILLEGAL_TXRATE (AR_SM_BASE + 0x1b0) | ||
466 | |||
467 | #define AR_PHY_PWRTX_MAX (AR_SM_BASE + 0x1f0) | ||
468 | #define AR_PHY_POWER_TX_SUB (AR_SM_BASE + 0x1f4) | ||
469 | |||
470 | #define AR_PHY_TPC_4_B0 (AR_SM_BASE + 0x204) | ||
471 | #define AR_PHY_TPC_5_B0 (AR_SM_BASE + 0x208) | ||
472 | #define AR_PHY_TPC_6_B0 (AR_SM_BASE + 0x20c) | ||
473 | #define AR_PHY_TPC_11_B0 (AR_SM_BASE + 0x220) | ||
474 | #define AR_PHY_TPC_18 (AR_SM_BASE + 0x23c) | ||
475 | #define AR_PHY_TPC_19 (AR_SM_BASE + 0x240) | ||
476 | |||
477 | #define AR_PHY_TX_FORCED_GAIN (AR_SM_BASE + 0x258) | ||
478 | |||
479 | #define AR_PHY_PDADC_TAB_0 (AR_SM_BASE + 0x280) | ||
480 | |||
481 | #define AR_PHY_TX_IQCAL_CONTROL_1 (AR_SM_BASE + 0x448) | ||
482 | #define AR_PHY_TX_IQCAL_START (AR_SM_BASE + 0x440) | ||
483 | #define AR_PHY_TX_IQCAL_STATUS_B0 (AR_SM_BASE + 0x48c) | ||
484 | #define AR_PHY_TX_IQCAL_CORR_COEFF_01_B0 (AR_SM_BASE + 0x450) | ||
485 | |||
486 | #define AR_PHY_PANIC_WD_STATUS (AR_SM_BASE + 0x5c0) | ||
487 | #define AR_PHY_PANIC_WD_CTL_1 (AR_SM_BASE + 0x5c4) | ||
488 | #define AR_PHY_PANIC_WD_CTL_2 (AR_SM_BASE + 0x5c8) | ||
489 | #define AR_PHY_BT_CTL (AR_SM_BASE + 0x5cc) | ||
490 | #define AR_PHY_ONLY_WARMRESET (AR_SM_BASE + 0x5d0) | ||
491 | #define AR_PHY_ONLY_CTL (AR_SM_BASE + 0x5d4) | ||
492 | #define AR_PHY_ECO_CTRL (AR_SM_BASE + 0x5dc) | ||
493 | #define AR_PHY_BB_THERM_ADC_1 (AR_SM_BASE + 0x248) | ||
494 | |||
495 | #define AR_PHY_65NM_CH0_SYNTH4 0x1608c | ||
496 | #define AR_PHY_SYNTH4_LONG_SHIFT_SELECT 0x00000002 | ||
497 | #define AR_PHY_SYNTH4_LONG_SHIFT_SELECT_S 1 | ||
498 | #define AR_PHY_65NM_CH0_SYNTH7 0x16098 | ||
499 | #define AR_PHY_65NM_CH0_BIAS1 0x160c0 | ||
500 | #define AR_PHY_65NM_CH0_BIAS2 0x160c4 | ||
501 | #define AR_PHY_65NM_CH0_BIAS4 0x160cc | ||
502 | #define AR_PHY_65NM_CH0_RXTX4 0x1610c | ||
503 | #define AR_PHY_65NM_CH0_THERM 0x16290 | ||
504 | |||
505 | #define AR_PHY_65NM_CH0_THERM_LOCAL 0x80000000 | ||
506 | #define AR_PHY_65NM_CH0_THERM_LOCAL_S 31 | ||
507 | #define AR_PHY_65NM_CH0_THERM_START 0x20000000 | ||
508 | #define AR_PHY_65NM_CH0_THERM_START_S 29 | ||
509 | #define AR_PHY_65NM_CH0_THERM_SAR_ADC_OUT 0x0000ff00 | ||
510 | #define AR_PHY_65NM_CH0_THERM_SAR_ADC_OUT_S 8 | ||
511 | |||
512 | #define AR_PHY_65NM_CH0_RXTX1 0x16100 | ||
513 | #define AR_PHY_65NM_CH0_RXTX2 0x16104 | ||
514 | #define AR_PHY_65NM_CH1_RXTX1 0x16500 | ||
515 | #define AR_PHY_65NM_CH1_RXTX2 0x16504 | ||
516 | #define AR_PHY_65NM_CH2_RXTX1 0x16900 | ||
517 | #define AR_PHY_65NM_CH2_RXTX2 0x16904 | ||
518 | |||
519 | #define AR_PHY_RX1DB_BIQUAD_LONG_SHIFT 0x00380000 | ||
520 | #define AR_PHY_RX1DB_BIQUAD_LONG_SHIFT_S 19 | ||
521 | #define AR_PHY_RX6DB_BIQUAD_LONG_SHIFT 0x00c00000 | ||
522 | #define AR_PHY_RX6DB_BIQUAD_LONG_SHIFT_S 22 | ||
523 | #define AR_PHY_LNAGAIN_LONG_SHIFT 0xe0000000 | ||
524 | #define AR_PHY_LNAGAIN_LONG_SHIFT_S 29 | ||
525 | #define AR_PHY_MXRGAIN_LONG_SHIFT 0x03000000 | ||
526 | #define AR_PHY_MXRGAIN_LONG_SHIFT_S 24 | ||
527 | #define AR_PHY_VGAGAIN_LONG_SHIFT 0x1c000000 | ||
528 | #define AR_PHY_VGAGAIN_LONG_SHIFT_S 26 | ||
529 | #define AR_PHY_SCFIR_GAIN_LONG_SHIFT 0x00000001 | ||
530 | #define AR_PHY_SCFIR_GAIN_LONG_SHIFT_S 0 | ||
531 | #define AR_PHY_MANRXGAIN_LONG_SHIFT 0x00000002 | ||
532 | #define AR_PHY_MANRXGAIN_LONG_SHIFT_S 1 | ||
533 | |||
534 | /* | ||
535 | * SM Field Definitions | ||
536 | */ | ||
537 | #define AR_PHY_CL_CAL_ENABLE 0x00000002 | ||
538 | #define AR_PHY_PARALLEL_CAL_ENABLE 0x00000001 | ||
539 | #define AR_PHY_TPCRG1_PD_CAL_ENABLE 0x00400000 | ||
540 | #define AR_PHY_TPCRG1_PD_CAL_ENABLE_S 22 | ||
541 | |||
542 | #define AR_PHY_ADDAC_PARACTL_OFF_PWDADC 0x00008000 | ||
543 | |||
544 | #define AR_PHY_FCAL20_CAP_STATUS_0 0x01f00000 | ||
545 | #define AR_PHY_FCAL20_CAP_STATUS_0_S 20 | ||
546 | |||
547 | #define AR_PHY_RFBUS_REQ_EN 0x00000001 /* request for RF bus */ | ||
548 | #define AR_PHY_RFBUS_GRANT_EN 0x00000001 /* RF bus granted */ | ||
549 | #define AR_PHY_GC_TURBO_MODE 0x00000001 /* set turbo mode bits */ | ||
550 | #define AR_PHY_GC_TURBO_SHORT 0x00000002 /* set short symbols to turbo mode setting */ | ||
551 | #define AR_PHY_GC_DYN2040_EN 0x00000004 /* enable dyn 20/40 mode */ | ||
552 | #define AR_PHY_GC_DYN2040_PRI_ONLY 0x00000008 /* dyn 20/40 - primary only */ | ||
553 | #define AR_PHY_GC_DYN2040_PRI_CH 0x00000010 /* dyn 20/40 - primary ch offset (0=+10MHz, 1=-10MHz)*/ | ||
554 | #define AR_PHY_GC_DYN2040_PRI_CH_S 4 | ||
555 | #define AR_PHY_GC_DYN2040_EXT_CH 0x00000020 /* dyn 20/40 - ext ch spacing (0=20MHz/ 1=25MHz) */ | ||
556 | #define AR_PHY_GC_HT_EN 0x00000040 /* ht enable */ | ||
557 | #define AR_PHY_GC_SHORT_GI_40 0x00000080 /* allow short GI for HT 40 */ | ||
558 | #define AR_PHY_GC_WALSH 0x00000100 /* walsh spatial spreading for 2 chains,2 streams TX */ | ||
559 | #define AR_PHY_GC_SINGLE_HT_LTF1 0x00000200 /* single length (4us) 1st HT long training symbol */ | ||
560 | #define AR_PHY_GC_GF_DETECT_EN 0x00000400 /* enable Green Field detection. Only affects rx, not tx */ | ||
561 | #define AR_PHY_GC_ENABLE_DAC_FIFO 0x00000800 /* fifo between bb and dac */ | ||
562 | #define AR_PHY_RX_DELAY_DELAY 0x00003FFF /* delay from wakeup to rx ena */ | ||
563 | |||
564 | #define AR_PHY_CALMODE_IQ 0x00000000 | ||
565 | #define AR_PHY_CALMODE_ADC_GAIN 0x00000001 | ||
566 | #define AR_PHY_CALMODE_ADC_DC_PER 0x00000002 | ||
567 | #define AR_PHY_CALMODE_ADC_DC_INIT 0x00000003 | ||
568 | #define AR_PHY_SWAP_ALT_CHAIN 0x00000040 | ||
569 | #define AR_PHY_MODE_OFDM 0x00000000 | ||
570 | #define AR_PHY_MODE_CCK 0x00000001 | ||
571 | #define AR_PHY_MODE_DYNAMIC 0x00000004 | ||
572 | #define AR_PHY_MODE_DYNAMIC_S 2 | ||
573 | #define AR_PHY_MODE_HALF 0x00000020 | ||
574 | #define AR_PHY_MODE_QUARTER 0x00000040 | ||
575 | #define AR_PHY_MAC_CLK_MODE 0x00000080 | ||
576 | #define AR_PHY_MODE_DYN_CCK_DISABLE 0x00000100 | ||
577 | #define AR_PHY_MODE_SVD_HALF 0x00000200 | ||
578 | #define AR_PHY_ACTIVE_EN 0x00000001 | ||
579 | #define AR_PHY_ACTIVE_DIS 0x00000000 | ||
580 | #define AR_PHY_FORCE_XPA_CFG 0x000000001 | ||
581 | #define AR_PHY_FORCE_XPA_CFG_S 0 | ||
582 | #define AR_PHY_XPA_TIMING_CTL_TX_END_XPAB_OFF 0xFF000000 | ||
583 | #define AR_PHY_XPA_TIMING_CTL_TX_END_XPAB_OFF_S 24 | ||
584 | #define AR_PHY_XPA_TIMING_CTL_TX_END_XPAA_OFF 0x00FF0000 | ||
585 | #define AR_PHY_XPA_TIMING_CTL_TX_END_XPAA_OFF_S 16 | ||
586 | #define AR_PHY_XPA_TIMING_CTL_FRAME_XPAB_ON 0x0000FF00 | ||
587 | #define AR_PHY_XPA_TIMING_CTL_FRAME_XPAB_ON_S 8 | ||
588 | #define AR_PHY_XPA_TIMING_CTL_FRAME_XPAA_ON 0x000000FF | ||
589 | #define AR_PHY_XPA_TIMING_CTL_FRAME_XPAA_ON_S 0 | ||
590 | #define AR_PHY_TX_END_TO_A2_RX_ON 0x00FF0000 | ||
591 | #define AR_PHY_TX_END_TO_A2_RX_ON_S 16 | ||
592 | #define AR_PHY_TX_END_DATA_START 0x000000FF | ||
593 | #define AR_PHY_TX_END_DATA_START_S 0 | ||
594 | #define AR_PHY_TX_END_PA_ON 0x0000FF00 | ||
595 | #define AR_PHY_TX_END_PA_ON_S 8 | ||
596 | #define AR_PHY_TPCRG5_PD_GAIN_OVERLAP 0x0000000F | ||
597 | #define AR_PHY_TPCRG5_PD_GAIN_OVERLAP_S 0 | ||
598 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_1 0x000003F0 | ||
599 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_1_S 4 | ||
600 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_2 0x0000FC00 | ||
601 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_2_S 10 | ||
602 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_3 0x003F0000 | ||
603 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_3_S 16 | ||
604 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_4 0x0FC00000 | ||
605 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_4_S 22 | ||
606 | #define AR_PHY_TPCRG1_NUM_PD_GAIN 0x0000c000 | ||
607 | #define AR_PHY_TPCRG1_NUM_PD_GAIN_S 14 | ||
608 | #define AR_PHY_TPCRG1_PD_GAIN_1 0x00030000 | ||
609 | #define AR_PHY_TPCRG1_PD_GAIN_1_S 16 | ||
610 | #define AR_PHY_TPCRG1_PD_GAIN_2 0x000C0000 | ||
611 | #define AR_PHY_TPCRG1_PD_GAIN_2_S 18 | ||
612 | #define AR_PHY_TPCRG1_PD_GAIN_3 0x00300000 | ||
613 | #define AR_PHY_TPCRG1_PD_GAIN_3_S 20 | ||
614 | #define AR_PHY_TPCGR1_FORCED_DAC_GAIN 0x0000003e | ||
615 | #define AR_PHY_TPCGR1_FORCED_DAC_GAIN_S 1 | ||
616 | #define AR_PHY_TPCGR1_FORCE_DAC_GAIN 0x00000001 | ||
617 | #define AR_PHY_TXGAIN_FORCE 0x00000001 | ||
618 | #define AR_PHY_TXGAIN_FORCED_PADVGNRA 0x00003c00 | ||
619 | #define AR_PHY_TXGAIN_FORCED_PADVGNRA_S 10 | ||
620 | #define AR_PHY_TXGAIN_FORCED_PADVGNRB 0x0003c000 | ||
621 | #define AR_PHY_TXGAIN_FORCED_PADVGNRB_S 14 | ||
622 | #define AR_PHY_TXGAIN_FORCED_PADVGNRD 0x00c00000 | ||
623 | #define AR_PHY_TXGAIN_FORCED_PADVGNRD_S 22 | ||
624 | #define AR_PHY_TXGAIN_FORCED_TXMXRGAIN 0x000003c0 | ||
625 | #define AR_PHY_TXGAIN_FORCED_TXMXRGAIN_S 6 | ||
626 | #define AR_PHY_TXGAIN_FORCED_TXBB1DBGAIN 0x0000000e | ||
627 | #define AR_PHY_TXGAIN_FORCED_TXBB1DBGAIN_S 1 | ||
628 | |||
629 | #define AR_PHY_POWER_TX_RATE1 0x9934 | ||
630 | #define AR_PHY_POWER_TX_RATE2 0x9938 | ||
631 | #define AR_PHY_POWER_TX_RATE_MAX 0x993c | ||
632 | #define AR_PHY_POWER_TX_RATE_MAX_TPC_ENABLE 0x00000040 | ||
633 | #define PHY_AGC_CLR 0x10000000 | ||
634 | #define RFSILENT_BB 0x00002000 | ||
635 | #define AR_PHY_CHAN_INFO_GAIN_DIFF_PPM_MASK 0xFFF | ||
636 | #define AR_PHY_CHAN_INFO_GAIN_DIFF_PPM_SIGNED_BIT 0x800 | ||
637 | #define AR_PHY_CHAN_INFO_GAIN_DIFF_UPPER_LIMIT 320 | ||
638 | #define AR_PHY_CHAN_INFO_MEMORY_CAPTURE_MASK 0x0001 | ||
639 | #define AR_PHY_RX_DELAY_DELAY 0x00003FFF | ||
640 | #define AR_PHY_CCK_TX_CTRL_JAPAN 0x00000010 | ||
641 | #define AR_PHY_SPECTRAL_SCAN_ENABLE 0x00000001 | ||
642 | #define AR_PHY_SPECTRAL_SCAN_ENABLE_S 0 | ||
643 | #define AR_PHY_SPECTRAL_SCAN_ACTIVE 0x00000002 | ||
644 | #define AR_PHY_SPECTRAL_SCAN_ACTIVE_S 1 | ||
645 | #define AR_PHY_SPECTRAL_SCAN_FFT_PERIOD 0x000000F0 | ||
646 | #define AR_PHY_SPECTRAL_SCAN_FFT_PERIOD_S 4 | ||
647 | #define AR_PHY_SPECTRAL_SCAN_PERIOD 0x0000FF00 | ||
648 | #define AR_PHY_SPECTRAL_SCAN_PERIOD_S 8 | ||
649 | #define AR_PHY_SPECTRAL_SCAN_COUNT 0x00FF0000 | ||
650 | #define AR_PHY_SPECTRAL_SCAN_COUNT_S 16 | ||
651 | #define AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT 0x01000000 | ||
652 | #define AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT_S 24 | ||
653 | #define AR_PHY_CHANNEL_STATUS_RX_CLEAR 0x00000004 | ||
654 | #define AR_PHY_TX_IQCAQL_CONTROL_1_IQCORR_I_Q_COFF_DELPT 0x01fc0000 | ||
655 | #define AR_PHY_TX_IQCAQL_CONTROL_1_IQCORR_I_Q_COFF_DELPT_S 18 | ||
656 | #define AR_PHY_TX_IQCAL_START_DO_CAL 0x00000001 | ||
657 | #define AR_PHY_TX_IQCAL_START_DO_CAL_S 0 | ||
658 | |||
659 | #define AR_PHY_TX_IQCAL_STATUS_FAILED 0x00000001 | ||
660 | #define AR_PHY_TX_IQCAL_CORR_COEFF_01_COEFF_TABLE 0x00003fff | ||
661 | #define AR_PHY_TX_IQCAL_CORR_COEFF_01_COEFF_TABLE_S 0 | ||
662 | |||
663 | #define AR_PHY_TPC_18_THERM_CAL_VALUE 0xff | ||
664 | #define AR_PHY_TPC_18_THERM_CAL_VALUE_S 0 | ||
665 | #define AR_PHY_TPC_19_ALPHA_THERM 0xff | ||
666 | #define AR_PHY_TPC_19_ALPHA_THERM_S 0 | ||
667 | |||
668 | #define AR_PHY_65NM_CH0_RXTX4_THERM_ON 0x10000000 | ||
669 | #define AR_PHY_65NM_CH0_RXTX4_THERM_ON_S 28 | ||
670 | |||
671 | #define AR_PHY_BB_THERM_ADC_1_INIT_THERM 0x000000ff | ||
672 | #define AR_PHY_BB_THERM_ADC_1_INIT_THERM_S 0 | ||
673 | |||
674 | /* | ||
675 | * Channel 1 Register Map | ||
676 | */ | ||
677 | #define AR_CHAN1_BASE 0xa800 | ||
678 | |||
679 | #define AR_PHY_EXT_CCA_1 (AR_CHAN1_BASE + 0x30) | ||
680 | #define AR_PHY_TX_PHASE_RAMP_1 (AR_CHAN1_BASE + 0xd0) | ||
681 | #define AR_PHY_ADC_GAIN_DC_CORR_1 (AR_CHAN1_BASE + 0xd4) | ||
682 | |||
683 | #define AR_PHY_SPUR_REPORT_1 (AR_CHAN1_BASE + 0xa8) | ||
684 | #define AR_PHY_CHAN_INFO_TAB_1 (AR_CHAN1_BASE + 0x300) | ||
685 | #define AR_PHY_RX_IQCAL_CORR_B1 (AR_CHAN1_BASE + 0xdc) | ||
686 | |||
687 | /* | ||
688 | * Channel 1 Field Definitions | ||
689 | */ | ||
690 | #define AR_PHY_CH1_EXT_MINCCA_PWR 0x01FF0000 | ||
691 | #define AR_PHY_CH1_EXT_MINCCA_PWR_S 16 | ||
692 | |||
693 | /* | ||
694 | * AGC 1 Register Map | ||
695 | */ | ||
696 | #define AR_AGC1_BASE 0xae00 | ||
697 | |||
698 | #define AR_PHY_FORCEMAX_GAINS_1 (AR_AGC1_BASE + 0x4) | ||
699 | #define AR_PHY_EXT_ATTEN_CTL_1 (AR_AGC1_BASE + 0x18) | ||
700 | #define AR_PHY_CCA_1 (AR_AGC1_BASE + 0x1c) | ||
701 | #define AR_PHY_CCA_CTRL_1 (AR_AGC1_BASE + 0x20) | ||
702 | #define AR_PHY_RSSI_1 (AR_AGC1_BASE + 0x180) | ||
703 | #define AR_PHY_SPUR_CCK_REP_1 (AR_AGC1_BASE + 0x184) | ||
704 | #define AR_PHY_RX_OCGAIN_2 (AR_AGC1_BASE + 0x200) | ||
705 | |||
706 | /* | ||
707 | * AGC 1 Field Definitions | ||
708 | */ | ||
709 | #define AR_PHY_CH1_MINCCA_PWR 0x1FF00000 | ||
710 | #define AR_PHY_CH1_MINCCA_PWR_S 20 | ||
711 | |||
712 | /* | ||
713 | * SM 1 Register Map | ||
714 | */ | ||
715 | #define AR_SM1_BASE 0xb200 | ||
716 | |||
717 | #define AR_PHY_SWITCH_CHAIN_1 (AR_SM1_BASE + 0x84) | ||
718 | #define AR_PHY_FCAL_2_1 (AR_SM1_BASE + 0xd0) | ||
719 | #define AR_PHY_DFT_TONE_CTL_1 (AR_SM1_BASE + 0xd4) | ||
720 | #define AR_PHY_CL_TAB_1 (AR_SM1_BASE + 0x100) | ||
721 | #define AR_PHY_CHAN_INFO_GAIN_1 (AR_SM1_BASE + 0x180) | ||
722 | #define AR_PHY_TPC_4_B1 (AR_SM1_BASE + 0x204) | ||
723 | #define AR_PHY_TPC_5_B1 (AR_SM1_BASE + 0x208) | ||
724 | #define AR_PHY_TPC_6_B1 (AR_SM1_BASE + 0x20c) | ||
725 | #define AR_PHY_TPC_11_B1 (AR_SM1_BASE + 0x220) | ||
726 | #define AR_PHY_PDADC_TAB_1 (AR_SM1_BASE + 0x240) | ||
727 | #define AR_PHY_TX_IQCAL_STATUS_B1 (AR_SM1_BASE + 0x48c) | ||
728 | #define AR_PHY_TX_IQCAL_CORR_COEFF_01_B1 (AR_SM1_BASE + 0x450) | ||
729 | |||
730 | /* | ||
731 | * Channel 2 Register Map | ||
732 | */ | ||
733 | #define AR_CHAN2_BASE 0xb800 | ||
734 | |||
735 | #define AR_PHY_EXT_CCA_2 (AR_CHAN2_BASE + 0x30) | ||
736 | #define AR_PHY_TX_PHASE_RAMP_2 (AR_CHAN2_BASE + 0xd0) | ||
737 | #define AR_PHY_ADC_GAIN_DC_CORR_2 (AR_CHAN2_BASE + 0xd4) | ||
738 | |||
739 | #define AR_PHY_SPUR_REPORT_2 (AR_CHAN2_BASE + 0xa8) | ||
740 | #define AR_PHY_CHAN_INFO_TAB_2 (AR_CHAN2_BASE + 0x300) | ||
741 | #define AR_PHY_RX_IQCAL_CORR_B2 (AR_CHAN2_BASE + 0xdc) | ||
742 | |||
743 | /* | ||
744 | * Channel 2 Field Definitions | ||
745 | */ | ||
746 | #define AR_PHY_CH2_EXT_MINCCA_PWR 0x01FF0000 | ||
747 | #define AR_PHY_CH2_EXT_MINCCA_PWR_S 16 | ||
748 | /* | ||
749 | * AGC 2 Register Map | ||
750 | */ | ||
751 | #define AR_AGC2_BASE 0xbe00 | ||
752 | |||
753 | #define AR_PHY_FORCEMAX_GAINS_2 (AR_AGC2_BASE + 0x4) | ||
754 | #define AR_PHY_EXT_ATTEN_CTL_2 (AR_AGC2_BASE + 0x18) | ||
755 | #define AR_PHY_CCA_2 (AR_AGC2_BASE + 0x1c) | ||
756 | #define AR_PHY_CCA_CTRL_2 (AR_AGC2_BASE + 0x20) | ||
757 | #define AR_PHY_RSSI_2 (AR_AGC2_BASE + 0x180) | ||
758 | |||
759 | /* | ||
760 | * AGC 2 Field Definitions | ||
761 | */ | ||
762 | #define AR_PHY_CH2_MINCCA_PWR 0x1FF00000 | ||
763 | #define AR_PHY_CH2_MINCCA_PWR_S 20 | ||
764 | |||
765 | /* | ||
766 | * SM 2 Register Map | ||
767 | */ | ||
768 | #define AR_SM2_BASE 0xc200 | ||
769 | |||
770 | #define AR_PHY_SWITCH_CHAIN_2 (AR_SM2_BASE + 0x84) | ||
771 | #define AR_PHY_FCAL_2_2 (AR_SM2_BASE + 0xd0) | ||
772 | #define AR_PHY_DFT_TONE_CTL_2 (AR_SM2_BASE + 0xd4) | ||
773 | #define AR_PHY_CL_TAB_2 (AR_SM2_BASE + 0x100) | ||
774 | #define AR_PHY_CHAN_INFO_GAIN_2 (AR_SM2_BASE + 0x180) | ||
775 | #define AR_PHY_TPC_4_B2 (AR_SM2_BASE + 0x204) | ||
776 | #define AR_PHY_TPC_5_B2 (AR_SM2_BASE + 0x208) | ||
777 | #define AR_PHY_TPC_6_B2 (AR_SM2_BASE + 0x20c) | ||
778 | #define AR_PHY_TPC_11_B2 (AR_SM2_BASE + 0x220) | ||
779 | #define AR_PHY_PDADC_TAB_2 (AR_SM2_BASE + 0x240) | ||
780 | #define AR_PHY_TX_IQCAL_STATUS_B2 (AR_SM2_BASE + 0x48c) | ||
781 | #define AR_PHY_TX_IQCAL_CORR_COEFF_01_B2 (AR_SM2_BASE + 0x450) | ||
782 | |||
783 | #define AR_PHY_TX_IQCAL_STATUS_B2_FAILED 0x00000001 | ||
784 | |||
785 | /* | ||
786 | * AGC 3 Register Map | ||
787 | */ | ||
788 | #define AR_AGC3_BASE 0xce00 | ||
789 | |||
790 | #define AR_PHY_RSSI_3 (AR_AGC3_BASE + 0x180) | ||
791 | |||
792 | /* | ||
793 | * Misc helper defines | ||
794 | */ | ||
795 | #define AR_PHY_CHAIN_OFFSET (AR_CHAN1_BASE - AR_CHAN_BASE) | ||
796 | |||
797 | #define AR_PHY_NEW_ADC_DC_GAIN_CORR(_i) (AR_PHY_ADC_GAIN_DC_CORR_0 + (AR_PHY_CHAIN_OFFSET * (_i))) | ||
798 | #define AR_PHY_NEW_ADC_DC_GAIN_CORR_9300_10(_i) (AR_PHY_ADC_GAIN_DC_CORR_0_9300_10 + (AR_PHY_CHAIN_OFFSET * (_i))) | ||
799 | #define AR_PHY_SWITCH_CHAIN(_i) (AR_PHY_SWITCH_CHAIN_0 + (AR_PHY_CHAIN_OFFSET * (_i))) | ||
800 | #define AR_PHY_EXT_ATTEN_CTL(_i) (AR_PHY_EXT_ATTEN_CTL_0 + (AR_PHY_CHAIN_OFFSET * (_i))) | ||
801 | |||
802 | #define AR_PHY_RXGAIN(_i) (AR_PHY_FORCEMAX_GAINS_0 + (AR_PHY_CHAIN_OFFSET * (_i))) | ||
803 | #define AR_PHY_TPCRG5(_i) (AR_PHY_TPC_5_B0 + (AR_PHY_CHAIN_OFFSET * (_i))) | ||
804 | #define AR_PHY_PDADC_TAB(_i) (AR_PHY_PDADC_TAB_0 + (AR_PHY_CHAIN_OFFSET * (_i))) | ||
805 | |||
806 | #define AR_PHY_CAL_MEAS_0(_i) (AR_PHY_IQ_ADC_MEAS_0_B0 + (AR_PHY_CHAIN_OFFSET * (_i))) | ||
807 | #define AR_PHY_CAL_MEAS_1(_i) (AR_PHY_IQ_ADC_MEAS_1_B0 + (AR_PHY_CHAIN_OFFSET * (_i))) | ||
808 | #define AR_PHY_CAL_MEAS_2(_i) (AR_PHY_IQ_ADC_MEAS_2_B0 + (AR_PHY_CHAIN_OFFSET * (_i))) | ||
809 | #define AR_PHY_CAL_MEAS_3(_i) (AR_PHY_IQ_ADC_MEAS_3_B0 + (AR_PHY_CHAIN_OFFSET * (_i))) | ||
810 | #define AR_PHY_CAL_MEAS_0_9300_10(_i) (AR_PHY_IQ_ADC_MEAS_0_B0_9300_10 + (AR_PHY_CHAIN_OFFSET * (_i))) | ||
811 | #define AR_PHY_CAL_MEAS_1_9300_10(_i) (AR_PHY_IQ_ADC_MEAS_1_B0_9300_10 + (AR_PHY_CHAIN_OFFSET * (_i))) | ||
812 | #define AR_PHY_CAL_MEAS_2_9300_10(_i) (AR_PHY_IQ_ADC_MEAS_2_B0_9300_10 + (AR_PHY_CHAIN_OFFSET * (_i))) | ||
813 | #define AR_PHY_CAL_MEAS_3_9300_10(_i) (AR_PHY_IQ_ADC_MEAS_3_B0_9300_10 + (AR_PHY_CHAIN_OFFSET * (_i))) | ||
814 | |||
815 | #define AR_PHY_BB_PANIC_NON_IDLE_ENABLE 0x00000001 | ||
816 | #define AR_PHY_BB_PANIC_IDLE_ENABLE 0x00000002 | ||
817 | #define AR_PHY_BB_PANIC_IDLE_MASK 0xFFFF0000 | ||
818 | #define AR_PHY_BB_PANIC_NON_IDLE_MASK 0x0000FFFC | ||
819 | |||
820 | #define AR_PHY_BB_PANIC_RST_ENABLE 0x00000002 | ||
821 | #define AR_PHY_BB_PANIC_IRQ_ENABLE 0x00000004 | ||
822 | #define AR_PHY_BB_PANIC_CNTL2_MASK 0xFFFFFFF9 | ||
823 | |||
824 | #define AR_PHY_BB_WD_STATUS 0x00000007 | ||
825 | #define AR_PHY_BB_WD_STATUS_S 0 | ||
826 | #define AR_PHY_BB_WD_DET_HANG 0x00000008 | ||
827 | #define AR_PHY_BB_WD_DET_HANG_S 3 | ||
828 | #define AR_PHY_BB_WD_RADAR_SM 0x000000F0 | ||
829 | #define AR_PHY_BB_WD_RADAR_SM_S 4 | ||
830 | #define AR_PHY_BB_WD_RX_OFDM_SM 0x00000F00 | ||
831 | #define AR_PHY_BB_WD_RX_OFDM_SM_S 8 | ||
832 | #define AR_PHY_BB_WD_RX_CCK_SM 0x0000F000 | ||
833 | #define AR_PHY_BB_WD_RX_CCK_SM_S 12 | ||
834 | #define AR_PHY_BB_WD_TX_OFDM_SM 0x000F0000 | ||
835 | #define AR_PHY_BB_WD_TX_OFDM_SM_S 16 | ||
836 | #define AR_PHY_BB_WD_TX_CCK_SM 0x00F00000 | ||
837 | #define AR_PHY_BB_WD_TX_CCK_SM_S 20 | ||
838 | #define AR_PHY_BB_WD_AGC_SM 0x0F000000 | ||
839 | #define AR_PHY_BB_WD_AGC_SM_S 24 | ||
840 | #define AR_PHY_BB_WD_SRCH_SM 0xF0000000 | ||
841 | #define AR_PHY_BB_WD_SRCH_SM_S 28 | ||
842 | |||
843 | #define AR_PHY_BB_WD_STATUS_CLR 0x00000008 | ||
844 | |||
845 | void ar9003_hw_set_chain_masks(struct ath_hw *ah, u8 rx, u8 tx); | ||
846 | |||
847 | #endif /* AR9003_PHY_H */ | ||
diff --git a/drivers/net/wireless/ath/ath9k/ath9k.h b/drivers/net/wireless/ath/ath9k/ath9k.h index bdcd257ca7a4..fbb7dec6ddeb 100644 --- a/drivers/net/wireless/ath/ath9k/ath9k.h +++ b/drivers/net/wireless/ath/ath9k/ath9k.h | |||
@@ -114,8 +114,10 @@ enum buffer_type { | |||
114 | #define bf_isretried(bf) (bf->bf_state.bf_type & BUF_RETRY) | 114 | #define bf_isretried(bf) (bf->bf_state.bf_type & BUF_RETRY) |
115 | #define bf_isxretried(bf) (bf->bf_state.bf_type & BUF_XRETRY) | 115 | #define bf_isxretried(bf) (bf->bf_state.bf_type & BUF_XRETRY) |
116 | 116 | ||
117 | #define ATH_TXSTATUS_RING_SIZE 64 | ||
118 | |||
117 | struct ath_descdma { | 119 | struct ath_descdma { |
118 | struct ath_desc *dd_desc; | 120 | void *dd_desc; |
119 | dma_addr_t dd_desc_paddr; | 121 | dma_addr_t dd_desc_paddr; |
120 | u32 dd_desc_len; | 122 | u32 dd_desc_len; |
121 | struct ath_buf *dd_bufptr; | 123 | struct ath_buf *dd_bufptr; |
@@ -123,7 +125,7 @@ struct ath_descdma { | |||
123 | 125 | ||
124 | int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd, | 126 | int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd, |
125 | struct list_head *head, const char *name, | 127 | struct list_head *head, const char *name, |
126 | int nbuf, int ndesc); | 128 | int nbuf, int ndesc, bool is_tx); |
127 | void ath_descdma_cleanup(struct ath_softc *sc, struct ath_descdma *dd, | 129 | void ath_descdma_cleanup(struct ath_softc *sc, struct ath_descdma *dd, |
128 | struct list_head *head); | 130 | struct list_head *head); |
129 | 131 | ||
@@ -188,6 +190,7 @@ enum ATH_AGGR_STATUS { | |||
188 | ATH_AGGR_LIMITED, | 190 | ATH_AGGR_LIMITED, |
189 | }; | 191 | }; |
190 | 192 | ||
193 | #define ATH_TXFIFO_DEPTH 8 | ||
191 | struct ath_txq { | 194 | struct ath_txq { |
192 | u32 axq_qnum; | 195 | u32 axq_qnum; |
193 | u32 *axq_link; | 196 | u32 *axq_link; |
@@ -197,6 +200,10 @@ struct ath_txq { | |||
197 | bool stopped; | 200 | bool stopped; |
198 | bool axq_tx_inprogress; | 201 | bool axq_tx_inprogress; |
199 | struct list_head axq_acq; | 202 | struct list_head axq_acq; |
203 | struct list_head txq_fifo[ATH_TXFIFO_DEPTH]; | ||
204 | struct list_head txq_fifo_pending; | ||
205 | u8 txq_headidx; | ||
206 | u8 txq_tailidx; | ||
200 | }; | 207 | }; |
201 | 208 | ||
202 | #define AGGR_CLEANUP BIT(1) | 209 | #define AGGR_CLEANUP BIT(1) |
@@ -223,6 +230,12 @@ struct ath_tx { | |||
223 | struct ath_descdma txdma; | 230 | struct ath_descdma txdma; |
224 | }; | 231 | }; |
225 | 232 | ||
233 | struct ath_rx_edma { | ||
234 | struct sk_buff_head rx_fifo; | ||
235 | struct sk_buff_head rx_buffers; | ||
236 | u32 rx_fifo_hwsize; | ||
237 | }; | ||
238 | |||
226 | struct ath_rx { | 239 | struct ath_rx { |
227 | u8 defant; | 240 | u8 defant; |
228 | u8 rxotherant; | 241 | u8 rxotherant; |
@@ -232,6 +245,8 @@ struct ath_rx { | |||
232 | spinlock_t rxbuflock; | 245 | spinlock_t rxbuflock; |
233 | struct list_head rxbuf; | 246 | struct list_head rxbuf; |
234 | struct ath_descdma rxdma; | 247 | struct ath_descdma rxdma; |
248 | struct ath_buf *rx_bufptr; | ||
249 | struct ath_rx_edma rx_edma[ATH9K_RX_QUEUE_MAX]; | ||
235 | }; | 250 | }; |
236 | 251 | ||
237 | int ath_startrecv(struct ath_softc *sc); | 252 | int ath_startrecv(struct ath_softc *sc); |
@@ -240,7 +255,7 @@ void ath_flushrecv(struct ath_softc *sc); | |||
240 | u32 ath_calcrxfilter(struct ath_softc *sc); | 255 | u32 ath_calcrxfilter(struct ath_softc *sc); |
241 | int ath_rx_init(struct ath_softc *sc, int nbufs); | 256 | int ath_rx_init(struct ath_softc *sc, int nbufs); |
242 | void ath_rx_cleanup(struct ath_softc *sc); | 257 | void ath_rx_cleanup(struct ath_softc *sc); |
243 | int ath_rx_tasklet(struct ath_softc *sc, int flush); | 258 | int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp); |
244 | struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype); | 259 | struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype); |
245 | void ath_tx_cleanupq(struct ath_softc *sc, struct ath_txq *txq); | 260 | void ath_tx_cleanupq(struct ath_softc *sc, struct ath_txq *txq); |
246 | int ath_tx_setup(struct ath_softc *sc, int haltype); | 261 | int ath_tx_setup(struct ath_softc *sc, int haltype); |
@@ -258,6 +273,7 @@ int ath_txq_update(struct ath_softc *sc, int qnum, | |||
258 | int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb, | 273 | int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb, |
259 | struct ath_tx_control *txctl); | 274 | struct ath_tx_control *txctl); |
260 | void ath_tx_tasklet(struct ath_softc *sc); | 275 | void ath_tx_tasklet(struct ath_softc *sc); |
276 | void ath_tx_edma_tasklet(struct ath_softc *sc); | ||
261 | void ath_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb); | 277 | void ath_tx_cabq(struct ieee80211_hw *hw, struct sk_buff *skb); |
262 | bool ath_tx_aggr_check(struct ath_softc *sc, struct ath_node *an, u8 tidno); | 278 | bool ath_tx_aggr_check(struct ath_softc *sc, struct ath_node *an, u8 tidno); |
263 | void ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta, | 279 | void ath_tx_aggr_start(struct ath_softc *sc, struct ieee80211_sta *sta, |
@@ -507,6 +523,8 @@ struct ath_softc { | |||
507 | struct ath_beacon_config cur_beacon_conf; | 523 | struct ath_beacon_config cur_beacon_conf; |
508 | struct delayed_work tx_complete_work; | 524 | struct delayed_work tx_complete_work; |
509 | struct ath_btcoex btcoex; | 525 | struct ath_btcoex btcoex; |
526 | |||
527 | struct ath_descdma txsdma; | ||
510 | }; | 528 | }; |
511 | 529 | ||
512 | struct ath_wiphy { | 530 | struct ath_wiphy { |
diff --git a/drivers/net/wireless/ath/ath9k/beacon.c b/drivers/net/wireless/ath/ath9k/beacon.c index 22375a754718..c8a4558f79ba 100644 --- a/drivers/net/wireless/ath/ath9k/beacon.c +++ b/drivers/net/wireless/ath/ath9k/beacon.c | |||
@@ -93,8 +93,6 @@ static void ath_beacon_setup(struct ath_softc *sc, struct ath_vif *avp, | |||
93 | antenna = ((sc->beacon.ast_be_xmit / sc->nbcnvifs) & 1 ? 2 : 1); | 93 | antenna = ((sc->beacon.ast_be_xmit / sc->nbcnvifs) & 1 ? 2 : 1); |
94 | } | 94 | } |
95 | 95 | ||
96 | ds->ds_data = bf->bf_buf_addr; | ||
97 | |||
98 | sband = &sc->sbands[common->hw->conf.channel->band]; | 96 | sband = &sc->sbands[common->hw->conf.channel->band]; |
99 | rate = sband->bitrates[rateidx].hw_value; | 97 | rate = sband->bitrates[rateidx].hw_value; |
100 | if (sc->sc_flags & SC_OP_PREAMBLE_SHORT) | 98 | if (sc->sc_flags & SC_OP_PREAMBLE_SHORT) |
@@ -109,7 +107,8 @@ static void ath_beacon_setup(struct ath_softc *sc, struct ath_vif *avp, | |||
109 | 107 | ||
110 | /* NB: beacon's BufLen must be a multiple of 4 bytes */ | 108 | /* NB: beacon's BufLen must be a multiple of 4 bytes */ |
111 | ath9k_hw_filltxdesc(ah, ds, roundup(skb->len, 4), | 109 | ath9k_hw_filltxdesc(ah, ds, roundup(skb->len, 4), |
112 | true, true, ds); | 110 | true, true, ds, bf->bf_buf_addr, |
111 | sc->beacon.beaconq); | ||
113 | 112 | ||
114 | memset(series, 0, sizeof(struct ath9k_11n_rate_series) * 4); | 113 | memset(series, 0, sizeof(struct ath9k_11n_rate_series) * 4); |
115 | series[0].Tries = 1; | 114 | series[0].Tries = 1; |
diff --git a/drivers/net/wireless/ath/ath9k/calib.c b/drivers/net/wireless/ath/ath9k/calib.c index 064f5b51dfcd..6982577043b8 100644 --- a/drivers/net/wireless/ath/ath9k/calib.c +++ b/drivers/net/wireless/ath/ath9k/calib.c | |||
@@ -15,10 +15,12 @@ | |||
15 | */ | 15 | */ |
16 | 16 | ||
17 | #include "hw.h" | 17 | #include "hw.h" |
18 | #include "hw-ops.h" | ||
19 | |||
20 | /* Common calibration code */ | ||
18 | 21 | ||
19 | /* We can tune this as we go by monitoring really low values */ | 22 | /* We can tune this as we go by monitoring really low values */ |
20 | #define ATH9K_NF_TOO_LOW -60 | 23 | #define ATH9K_NF_TOO_LOW -60 |
21 | #define AR9285_CLCAL_REDO_THRESH 1 | ||
22 | 24 | ||
23 | /* AR5416 may return very high value (like -31 dBm), in those cases the nf | 25 | /* AR5416 may return very high value (like -31 dBm), in those cases the nf |
24 | * is incorrect and we should use the static NF value. Later we can try to | 26 | * is incorrect and we should use the static NF value. Later we can try to |
@@ -87,98 +89,9 @@ static void ath9k_hw_update_nfcal_hist_buffer(struct ath9k_nfcal_hist *h, | |||
87 | return; | 89 | return; |
88 | } | 90 | } |
89 | 91 | ||
90 | static void ath9k_hw_do_getnf(struct ath_hw *ah, | 92 | static bool ath9k_hw_get_nf_thresh(struct ath_hw *ah, |
91 | int16_t nfarray[NUM_NF_READINGS]) | 93 | enum ieee80211_band band, |
92 | { | 94 | int16_t *nft) |
93 | struct ath_common *common = ath9k_hw_common(ah); | ||
94 | int16_t nf; | ||
95 | |||
96 | if (AR_SREV_9280_10_OR_LATER(ah)) | ||
97 | nf = MS(REG_READ(ah, AR_PHY_CCA), AR9280_PHY_MINCCA_PWR); | ||
98 | else | ||
99 | nf = MS(REG_READ(ah, AR_PHY_CCA), AR_PHY_MINCCA_PWR); | ||
100 | |||
101 | if (nf & 0x100) | ||
102 | nf = 0 - ((nf ^ 0x1ff) + 1); | ||
103 | ath_print(common, ATH_DBG_CALIBRATE, | ||
104 | "NF calibrated [ctl] [chain 0] is %d\n", nf); | ||
105 | |||
106 | if (AR_SREV_9271(ah) && (nf >= -114)) | ||
107 | nf = -116; | ||
108 | |||
109 | nfarray[0] = nf; | ||
110 | |||
111 | if (!AR_SREV_9285(ah) && !AR_SREV_9271(ah)) { | ||
112 | if (AR_SREV_9280_10_OR_LATER(ah)) | ||
113 | nf = MS(REG_READ(ah, AR_PHY_CH1_CCA), | ||
114 | AR9280_PHY_CH1_MINCCA_PWR); | ||
115 | else | ||
116 | nf = MS(REG_READ(ah, AR_PHY_CH1_CCA), | ||
117 | AR_PHY_CH1_MINCCA_PWR); | ||
118 | |||
119 | if (nf & 0x100) | ||
120 | nf = 0 - ((nf ^ 0x1ff) + 1); | ||
121 | ath_print(common, ATH_DBG_CALIBRATE, | ||
122 | "NF calibrated [ctl] [chain 1] is %d\n", nf); | ||
123 | nfarray[1] = nf; | ||
124 | |||
125 | if (!AR_SREV_9280(ah) && !AR_SREV_9287(ah)) { | ||
126 | nf = MS(REG_READ(ah, AR_PHY_CH2_CCA), | ||
127 | AR_PHY_CH2_MINCCA_PWR); | ||
128 | if (nf & 0x100) | ||
129 | nf = 0 - ((nf ^ 0x1ff) + 1); | ||
130 | ath_print(common, ATH_DBG_CALIBRATE, | ||
131 | "NF calibrated [ctl] [chain 2] is %d\n", nf); | ||
132 | nfarray[2] = nf; | ||
133 | } | ||
134 | } | ||
135 | |||
136 | if (AR_SREV_9280_10_OR_LATER(ah)) | ||
137 | nf = MS(REG_READ(ah, AR_PHY_EXT_CCA), | ||
138 | AR9280_PHY_EXT_MINCCA_PWR); | ||
139 | else | ||
140 | nf = MS(REG_READ(ah, AR_PHY_EXT_CCA), | ||
141 | AR_PHY_EXT_MINCCA_PWR); | ||
142 | |||
143 | if (nf & 0x100) | ||
144 | nf = 0 - ((nf ^ 0x1ff) + 1); | ||
145 | ath_print(common, ATH_DBG_CALIBRATE, | ||
146 | "NF calibrated [ext] [chain 0] is %d\n", nf); | ||
147 | |||
148 | if (AR_SREV_9271(ah) && (nf >= -114)) | ||
149 | nf = -116; | ||
150 | |||
151 | nfarray[3] = nf; | ||
152 | |||
153 | if (!AR_SREV_9285(ah) && !AR_SREV_9271(ah)) { | ||
154 | if (AR_SREV_9280_10_OR_LATER(ah)) | ||
155 | nf = MS(REG_READ(ah, AR_PHY_CH1_EXT_CCA), | ||
156 | AR9280_PHY_CH1_EXT_MINCCA_PWR); | ||
157 | else | ||
158 | nf = MS(REG_READ(ah, AR_PHY_CH1_EXT_CCA), | ||
159 | AR_PHY_CH1_EXT_MINCCA_PWR); | ||
160 | |||
161 | if (nf & 0x100) | ||
162 | nf = 0 - ((nf ^ 0x1ff) + 1); | ||
163 | ath_print(common, ATH_DBG_CALIBRATE, | ||
164 | "NF calibrated [ext] [chain 1] is %d\n", nf); | ||
165 | nfarray[4] = nf; | ||
166 | |||
167 | if (!AR_SREV_9280(ah) && !AR_SREV_9287(ah)) { | ||
168 | nf = MS(REG_READ(ah, AR_PHY_CH2_EXT_CCA), | ||
169 | AR_PHY_CH2_EXT_MINCCA_PWR); | ||
170 | if (nf & 0x100) | ||
171 | nf = 0 - ((nf ^ 0x1ff) + 1); | ||
172 | ath_print(common, ATH_DBG_CALIBRATE, | ||
173 | "NF calibrated [ext] [chain 2] is %d\n", nf); | ||
174 | nfarray[5] = nf; | ||
175 | } | ||
176 | } | ||
177 | } | ||
178 | |||
179 | static bool getNoiseFloorThresh(struct ath_hw *ah, | ||
180 | enum ieee80211_band band, | ||
181 | int16_t *nft) | ||
182 | { | 95 | { |
183 | switch (band) { | 96 | switch (band) { |
184 | case IEEE80211_BAND_5GHZ: | 97 | case IEEE80211_BAND_5GHZ: |
@@ -195,44 +108,8 @@ static bool getNoiseFloorThresh(struct ath_hw *ah, | |||
195 | return true; | 108 | return true; |
196 | } | 109 | } |
197 | 110 | ||
198 | static void ath9k_hw_setup_calibration(struct ath_hw *ah, | 111 | void ath9k_hw_reset_calibration(struct ath_hw *ah, |
199 | struct ath9k_cal_list *currCal) | 112 | struct ath9k_cal_list *currCal) |
200 | { | ||
201 | struct ath_common *common = ath9k_hw_common(ah); | ||
202 | |||
203 | REG_RMW_FIELD(ah, AR_PHY_TIMING_CTRL4(0), | ||
204 | AR_PHY_TIMING_CTRL4_IQCAL_LOG_COUNT_MAX, | ||
205 | currCal->calData->calCountMax); | ||
206 | |||
207 | switch (currCal->calData->calType) { | ||
208 | case IQ_MISMATCH_CAL: | ||
209 | REG_WRITE(ah, AR_PHY_CALMODE, AR_PHY_CALMODE_IQ); | ||
210 | ath_print(common, ATH_DBG_CALIBRATE, | ||
211 | "starting IQ Mismatch Calibration\n"); | ||
212 | break; | ||
213 | case ADC_GAIN_CAL: | ||
214 | REG_WRITE(ah, AR_PHY_CALMODE, AR_PHY_CALMODE_ADC_GAIN); | ||
215 | ath_print(common, ATH_DBG_CALIBRATE, | ||
216 | "starting ADC Gain Calibration\n"); | ||
217 | break; | ||
218 | case ADC_DC_CAL: | ||
219 | REG_WRITE(ah, AR_PHY_CALMODE, AR_PHY_CALMODE_ADC_DC_PER); | ||
220 | ath_print(common, ATH_DBG_CALIBRATE, | ||
221 | "starting ADC DC Calibration\n"); | ||
222 | break; | ||
223 | case ADC_DC_INIT_CAL: | ||
224 | REG_WRITE(ah, AR_PHY_CALMODE, AR_PHY_CALMODE_ADC_DC_INIT); | ||
225 | ath_print(common, ATH_DBG_CALIBRATE, | ||
226 | "starting Init ADC DC Calibration\n"); | ||
227 | break; | ||
228 | } | ||
229 | |||
230 | REG_SET_BIT(ah, AR_PHY_TIMING_CTRL4(0), | ||
231 | AR_PHY_TIMING_CTRL4_DO_CAL); | ||
232 | } | ||
233 | |||
234 | static void ath9k_hw_reset_calibration(struct ath_hw *ah, | ||
235 | struct ath9k_cal_list *currCal) | ||
236 | { | 113 | { |
237 | int i; | 114 | int i; |
238 | 115 | ||
@@ -250,324 +127,6 @@ static void ath9k_hw_reset_calibration(struct ath_hw *ah, | |||
250 | ah->cal_samples = 0; | 127 | ah->cal_samples = 0; |
251 | } | 128 | } |
252 | 129 | ||
253 | static bool ath9k_hw_per_calibration(struct ath_hw *ah, | ||
254 | struct ath9k_channel *ichan, | ||
255 | u8 rxchainmask, | ||
256 | struct ath9k_cal_list *currCal) | ||
257 | { | ||
258 | bool iscaldone = false; | ||
259 | |||
260 | if (currCal->calState == CAL_RUNNING) { | ||
261 | if (!(REG_READ(ah, AR_PHY_TIMING_CTRL4(0)) & | ||
262 | AR_PHY_TIMING_CTRL4_DO_CAL)) { | ||
263 | |||
264 | currCal->calData->calCollect(ah); | ||
265 | ah->cal_samples++; | ||
266 | |||
267 | if (ah->cal_samples >= currCal->calData->calNumSamples) { | ||
268 | int i, numChains = 0; | ||
269 | for (i = 0; i < AR5416_MAX_CHAINS; i++) { | ||
270 | if (rxchainmask & (1 << i)) | ||
271 | numChains++; | ||
272 | } | ||
273 | |||
274 | currCal->calData->calPostProc(ah, numChains); | ||
275 | ichan->CalValid |= currCal->calData->calType; | ||
276 | currCal->calState = CAL_DONE; | ||
277 | iscaldone = true; | ||
278 | } else { | ||
279 | ath9k_hw_setup_calibration(ah, currCal); | ||
280 | } | ||
281 | } | ||
282 | } else if (!(ichan->CalValid & currCal->calData->calType)) { | ||
283 | ath9k_hw_reset_calibration(ah, currCal); | ||
284 | } | ||
285 | |||
286 | return iscaldone; | ||
287 | } | ||
288 | |||
289 | /* Assumes you are talking about the currently configured channel */ | ||
290 | static bool ath9k_hw_iscal_supported(struct ath_hw *ah, | ||
291 | enum ath9k_cal_types calType) | ||
292 | { | ||
293 | struct ieee80211_conf *conf = &ath9k_hw_common(ah)->hw->conf; | ||
294 | |||
295 | switch (calType & ah->supp_cals) { | ||
296 | case IQ_MISMATCH_CAL: /* Both 2 GHz and 5 GHz support OFDM */ | ||
297 | return true; | ||
298 | case ADC_GAIN_CAL: | ||
299 | case ADC_DC_CAL: | ||
300 | if (!(conf->channel->band == IEEE80211_BAND_2GHZ && | ||
301 | conf_is_ht20(conf))) | ||
302 | return true; | ||
303 | break; | ||
304 | } | ||
305 | return false; | ||
306 | } | ||
307 | |||
308 | static void ath9k_hw_iqcal_collect(struct ath_hw *ah) | ||
309 | { | ||
310 | int i; | ||
311 | |||
312 | for (i = 0; i < AR5416_MAX_CHAINS; i++) { | ||
313 | ah->totalPowerMeasI[i] += | ||
314 | REG_READ(ah, AR_PHY_CAL_MEAS_0(i)); | ||
315 | ah->totalPowerMeasQ[i] += | ||
316 | REG_READ(ah, AR_PHY_CAL_MEAS_1(i)); | ||
317 | ah->totalIqCorrMeas[i] += | ||
318 | (int32_t) REG_READ(ah, AR_PHY_CAL_MEAS_2(i)); | ||
319 | ath_print(ath9k_hw_common(ah), ATH_DBG_CALIBRATE, | ||
320 | "%d: Chn %d pmi=0x%08x;pmq=0x%08x;iqcm=0x%08x;\n", | ||
321 | ah->cal_samples, i, ah->totalPowerMeasI[i], | ||
322 | ah->totalPowerMeasQ[i], | ||
323 | ah->totalIqCorrMeas[i]); | ||
324 | } | ||
325 | } | ||
326 | |||
327 | static void ath9k_hw_adc_gaincal_collect(struct ath_hw *ah) | ||
328 | { | ||
329 | int i; | ||
330 | |||
331 | for (i = 0; i < AR5416_MAX_CHAINS; i++) { | ||
332 | ah->totalAdcIOddPhase[i] += | ||
333 | REG_READ(ah, AR_PHY_CAL_MEAS_0(i)); | ||
334 | ah->totalAdcIEvenPhase[i] += | ||
335 | REG_READ(ah, AR_PHY_CAL_MEAS_1(i)); | ||
336 | ah->totalAdcQOddPhase[i] += | ||
337 | REG_READ(ah, AR_PHY_CAL_MEAS_2(i)); | ||
338 | ah->totalAdcQEvenPhase[i] += | ||
339 | REG_READ(ah, AR_PHY_CAL_MEAS_3(i)); | ||
340 | |||
341 | ath_print(ath9k_hw_common(ah), ATH_DBG_CALIBRATE, | ||
342 | "%d: Chn %d oddi=0x%08x; eveni=0x%08x; " | ||
343 | "oddq=0x%08x; evenq=0x%08x;\n", | ||
344 | ah->cal_samples, i, | ||
345 | ah->totalAdcIOddPhase[i], | ||
346 | ah->totalAdcIEvenPhase[i], | ||
347 | ah->totalAdcQOddPhase[i], | ||
348 | ah->totalAdcQEvenPhase[i]); | ||
349 | } | ||
350 | } | ||
351 | |||
352 | static void ath9k_hw_adc_dccal_collect(struct ath_hw *ah) | ||
353 | { | ||
354 | int i; | ||
355 | |||
356 | for (i = 0; i < AR5416_MAX_CHAINS; i++) { | ||
357 | ah->totalAdcDcOffsetIOddPhase[i] += | ||
358 | (int32_t) REG_READ(ah, AR_PHY_CAL_MEAS_0(i)); | ||
359 | ah->totalAdcDcOffsetIEvenPhase[i] += | ||
360 | (int32_t) REG_READ(ah, AR_PHY_CAL_MEAS_1(i)); | ||
361 | ah->totalAdcDcOffsetQOddPhase[i] += | ||
362 | (int32_t) REG_READ(ah, AR_PHY_CAL_MEAS_2(i)); | ||
363 | ah->totalAdcDcOffsetQEvenPhase[i] += | ||
364 | (int32_t) REG_READ(ah, AR_PHY_CAL_MEAS_3(i)); | ||
365 | |||
366 | ath_print(ath9k_hw_common(ah), ATH_DBG_CALIBRATE, | ||
367 | "%d: Chn %d oddi=0x%08x; eveni=0x%08x; " | ||
368 | "oddq=0x%08x; evenq=0x%08x;\n", | ||
369 | ah->cal_samples, i, | ||
370 | ah->totalAdcDcOffsetIOddPhase[i], | ||
371 | ah->totalAdcDcOffsetIEvenPhase[i], | ||
372 | ah->totalAdcDcOffsetQOddPhase[i], | ||
373 | ah->totalAdcDcOffsetQEvenPhase[i]); | ||
374 | } | ||
375 | } | ||
376 | |||
377 | static void ath9k_hw_iqcalibrate(struct ath_hw *ah, u8 numChains) | ||
378 | { | ||
379 | struct ath_common *common = ath9k_hw_common(ah); | ||
380 | u32 powerMeasQ, powerMeasI, iqCorrMeas; | ||
381 | u32 qCoffDenom, iCoffDenom; | ||
382 | int32_t qCoff, iCoff; | ||
383 | int iqCorrNeg, i; | ||
384 | |||
385 | for (i = 0; i < numChains; i++) { | ||
386 | powerMeasI = ah->totalPowerMeasI[i]; | ||
387 | powerMeasQ = ah->totalPowerMeasQ[i]; | ||
388 | iqCorrMeas = ah->totalIqCorrMeas[i]; | ||
389 | |||
390 | ath_print(common, ATH_DBG_CALIBRATE, | ||
391 | "Starting IQ Cal and Correction for Chain %d\n", | ||
392 | i); | ||
393 | |||
394 | ath_print(common, ATH_DBG_CALIBRATE, | ||
395 | "Orignal: Chn %diq_corr_meas = 0x%08x\n", | ||
396 | i, ah->totalIqCorrMeas[i]); | ||
397 | |||
398 | iqCorrNeg = 0; | ||
399 | |||
400 | if (iqCorrMeas > 0x80000000) { | ||
401 | iqCorrMeas = (0xffffffff - iqCorrMeas) + 1; | ||
402 | iqCorrNeg = 1; | ||
403 | } | ||
404 | |||
405 | ath_print(common, ATH_DBG_CALIBRATE, | ||
406 | "Chn %d pwr_meas_i = 0x%08x\n", i, powerMeasI); | ||
407 | ath_print(common, ATH_DBG_CALIBRATE, | ||
408 | "Chn %d pwr_meas_q = 0x%08x\n", i, powerMeasQ); | ||
409 | ath_print(common, ATH_DBG_CALIBRATE, "iqCorrNeg is 0x%08x\n", | ||
410 | iqCorrNeg); | ||
411 | |||
412 | iCoffDenom = (powerMeasI / 2 + powerMeasQ / 2) / 128; | ||
413 | qCoffDenom = powerMeasQ / 64; | ||
414 | |||
415 | if ((powerMeasQ != 0) && (iCoffDenom != 0) && | ||
416 | (qCoffDenom != 0)) { | ||
417 | iCoff = iqCorrMeas / iCoffDenom; | ||
418 | qCoff = powerMeasI / qCoffDenom - 64; | ||
419 | ath_print(common, ATH_DBG_CALIBRATE, | ||
420 | "Chn %d iCoff = 0x%08x\n", i, iCoff); | ||
421 | ath_print(common, ATH_DBG_CALIBRATE, | ||
422 | "Chn %d qCoff = 0x%08x\n", i, qCoff); | ||
423 | |||
424 | iCoff = iCoff & 0x3f; | ||
425 | ath_print(common, ATH_DBG_CALIBRATE, | ||
426 | "New: Chn %d iCoff = 0x%08x\n", i, iCoff); | ||
427 | if (iqCorrNeg == 0x0) | ||
428 | iCoff = 0x40 - iCoff; | ||
429 | |||
430 | if (qCoff > 15) | ||
431 | qCoff = 15; | ||
432 | else if (qCoff <= -16) | ||
433 | qCoff = 16; | ||
434 | |||
435 | ath_print(common, ATH_DBG_CALIBRATE, | ||
436 | "Chn %d : iCoff = 0x%x qCoff = 0x%x\n", | ||
437 | i, iCoff, qCoff); | ||
438 | |||
439 | REG_RMW_FIELD(ah, AR_PHY_TIMING_CTRL4(i), | ||
440 | AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF, | ||
441 | iCoff); | ||
442 | REG_RMW_FIELD(ah, AR_PHY_TIMING_CTRL4(i), | ||
443 | AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF, | ||
444 | qCoff); | ||
445 | ath_print(common, ATH_DBG_CALIBRATE, | ||
446 | "IQ Cal and Correction done for Chain %d\n", | ||
447 | i); | ||
448 | } | ||
449 | } | ||
450 | |||
451 | REG_SET_BIT(ah, AR_PHY_TIMING_CTRL4(0), | ||
452 | AR_PHY_TIMING_CTRL4_IQCORR_ENABLE); | ||
453 | } | ||
454 | |||
455 | static void ath9k_hw_adc_gaincal_calibrate(struct ath_hw *ah, u8 numChains) | ||
456 | { | ||
457 | struct ath_common *common = ath9k_hw_common(ah); | ||
458 | u32 iOddMeasOffset, iEvenMeasOffset, qOddMeasOffset, qEvenMeasOffset; | ||
459 | u32 qGainMismatch, iGainMismatch, val, i; | ||
460 | |||
461 | for (i = 0; i < numChains; i++) { | ||
462 | iOddMeasOffset = ah->totalAdcIOddPhase[i]; | ||
463 | iEvenMeasOffset = ah->totalAdcIEvenPhase[i]; | ||
464 | qOddMeasOffset = ah->totalAdcQOddPhase[i]; | ||
465 | qEvenMeasOffset = ah->totalAdcQEvenPhase[i]; | ||
466 | |||
467 | ath_print(common, ATH_DBG_CALIBRATE, | ||
468 | "Starting ADC Gain Cal for Chain %d\n", i); | ||
469 | |||
470 | ath_print(common, ATH_DBG_CALIBRATE, | ||
471 | "Chn %d pwr_meas_odd_i = 0x%08x\n", i, | ||
472 | iOddMeasOffset); | ||
473 | ath_print(common, ATH_DBG_CALIBRATE, | ||
474 | "Chn %d pwr_meas_even_i = 0x%08x\n", i, | ||
475 | iEvenMeasOffset); | ||
476 | ath_print(common, ATH_DBG_CALIBRATE, | ||
477 | "Chn %d pwr_meas_odd_q = 0x%08x\n", i, | ||
478 | qOddMeasOffset); | ||
479 | ath_print(common, ATH_DBG_CALIBRATE, | ||
480 | "Chn %d pwr_meas_even_q = 0x%08x\n", i, | ||
481 | qEvenMeasOffset); | ||
482 | |||
483 | if (iOddMeasOffset != 0 && qEvenMeasOffset != 0) { | ||
484 | iGainMismatch = | ||
485 | ((iEvenMeasOffset * 32) / | ||
486 | iOddMeasOffset) & 0x3f; | ||
487 | qGainMismatch = | ||
488 | ((qOddMeasOffset * 32) / | ||
489 | qEvenMeasOffset) & 0x3f; | ||
490 | |||
491 | ath_print(common, ATH_DBG_CALIBRATE, | ||
492 | "Chn %d gain_mismatch_i = 0x%08x\n", i, | ||
493 | iGainMismatch); | ||
494 | ath_print(common, ATH_DBG_CALIBRATE, | ||
495 | "Chn %d gain_mismatch_q = 0x%08x\n", i, | ||
496 | qGainMismatch); | ||
497 | |||
498 | val = REG_READ(ah, AR_PHY_NEW_ADC_DC_GAIN_CORR(i)); | ||
499 | val &= 0xfffff000; | ||
500 | val |= (qGainMismatch) | (iGainMismatch << 6); | ||
501 | REG_WRITE(ah, AR_PHY_NEW_ADC_DC_GAIN_CORR(i), val); | ||
502 | |||
503 | ath_print(common, ATH_DBG_CALIBRATE, | ||
504 | "ADC Gain Cal done for Chain %d\n", i); | ||
505 | } | ||
506 | } | ||
507 | |||
508 | REG_WRITE(ah, AR_PHY_NEW_ADC_DC_GAIN_CORR(0), | ||
509 | REG_READ(ah, AR_PHY_NEW_ADC_DC_GAIN_CORR(0)) | | ||
510 | AR_PHY_NEW_ADC_GAIN_CORR_ENABLE); | ||
511 | } | ||
512 | |||
513 | static void ath9k_hw_adc_dccal_calibrate(struct ath_hw *ah, u8 numChains) | ||
514 | { | ||
515 | struct ath_common *common = ath9k_hw_common(ah); | ||
516 | u32 iOddMeasOffset, iEvenMeasOffset, val, i; | ||
517 | int32_t qOddMeasOffset, qEvenMeasOffset, qDcMismatch, iDcMismatch; | ||
518 | const struct ath9k_percal_data *calData = | ||
519 | ah->cal_list_curr->calData; | ||
520 | u32 numSamples = | ||
521 | (1 << (calData->calCountMax + 5)) * calData->calNumSamples; | ||
522 | |||
523 | for (i = 0; i < numChains; i++) { | ||
524 | iOddMeasOffset = ah->totalAdcDcOffsetIOddPhase[i]; | ||
525 | iEvenMeasOffset = ah->totalAdcDcOffsetIEvenPhase[i]; | ||
526 | qOddMeasOffset = ah->totalAdcDcOffsetQOddPhase[i]; | ||
527 | qEvenMeasOffset = ah->totalAdcDcOffsetQEvenPhase[i]; | ||
528 | |||
529 | ath_print(common, ATH_DBG_CALIBRATE, | ||
530 | "Starting ADC DC Offset Cal for Chain %d\n", i); | ||
531 | |||
532 | ath_print(common, ATH_DBG_CALIBRATE, | ||
533 | "Chn %d pwr_meas_odd_i = %d\n", i, | ||
534 | iOddMeasOffset); | ||
535 | ath_print(common, ATH_DBG_CALIBRATE, | ||
536 | "Chn %d pwr_meas_even_i = %d\n", i, | ||
537 | iEvenMeasOffset); | ||
538 | ath_print(common, ATH_DBG_CALIBRATE, | ||
539 | "Chn %d pwr_meas_odd_q = %d\n", i, | ||
540 | qOddMeasOffset); | ||
541 | ath_print(common, ATH_DBG_CALIBRATE, | ||
542 | "Chn %d pwr_meas_even_q = %d\n", i, | ||
543 | qEvenMeasOffset); | ||
544 | |||
545 | iDcMismatch = (((iEvenMeasOffset - iOddMeasOffset) * 2) / | ||
546 | numSamples) & 0x1ff; | ||
547 | qDcMismatch = (((qOddMeasOffset - qEvenMeasOffset) * 2) / | ||
548 | numSamples) & 0x1ff; | ||
549 | |||
550 | ath_print(common, ATH_DBG_CALIBRATE, | ||
551 | "Chn %d dc_offset_mismatch_i = 0x%08x\n", i, | ||
552 | iDcMismatch); | ||
553 | ath_print(common, ATH_DBG_CALIBRATE, | ||
554 | "Chn %d dc_offset_mismatch_q = 0x%08x\n", i, | ||
555 | qDcMismatch); | ||
556 | |||
557 | val = REG_READ(ah, AR_PHY_NEW_ADC_DC_GAIN_CORR(i)); | ||
558 | val &= 0xc0000fff; | ||
559 | val |= (qDcMismatch << 12) | (iDcMismatch << 21); | ||
560 | REG_WRITE(ah, AR_PHY_NEW_ADC_DC_GAIN_CORR(i), val); | ||
561 | |||
562 | ath_print(common, ATH_DBG_CALIBRATE, | ||
563 | "ADC DC Offset Cal done for Chain %d\n", i); | ||
564 | } | ||
565 | |||
566 | REG_WRITE(ah, AR_PHY_NEW_ADC_DC_GAIN_CORR(0), | ||
567 | REG_READ(ah, AR_PHY_NEW_ADC_DC_GAIN_CORR(0)) | | ||
568 | AR_PHY_NEW_ADC_DC_OFFSET_CORR_ENABLE); | ||
569 | } | ||
570 | |||
571 | /* This is done for the currently configured channel */ | 130 | /* This is done for the currently configured channel */ |
572 | bool ath9k_hw_reset_calvalid(struct ath_hw *ah) | 131 | bool ath9k_hw_reset_calvalid(struct ath_hw *ah) |
573 | { | 132 | { |
@@ -614,72 +173,6 @@ void ath9k_hw_start_nfcal(struct ath_hw *ah) | |||
614 | REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_NF); | 173 | REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_NF); |
615 | } | 174 | } |
616 | 175 | ||
617 | void ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan) | ||
618 | { | ||
619 | struct ath9k_nfcal_hist *h; | ||
620 | int i, j; | ||
621 | int32_t val; | ||
622 | const u32 ar5416_cca_regs[6] = { | ||
623 | AR_PHY_CCA, | ||
624 | AR_PHY_CH1_CCA, | ||
625 | AR_PHY_CH2_CCA, | ||
626 | AR_PHY_EXT_CCA, | ||
627 | AR_PHY_CH1_EXT_CCA, | ||
628 | AR_PHY_CH2_EXT_CCA | ||
629 | }; | ||
630 | u8 chainmask, rx_chain_status; | ||
631 | |||
632 | rx_chain_status = REG_READ(ah, AR_PHY_RX_CHAINMASK); | ||
633 | if (AR_SREV_9285(ah) || AR_SREV_9271(ah)) | ||
634 | chainmask = 0x9; | ||
635 | else if (AR_SREV_9280(ah) || AR_SREV_9287(ah)) { | ||
636 | if ((rx_chain_status & 0x2) || (rx_chain_status & 0x4)) | ||
637 | chainmask = 0x1B; | ||
638 | else | ||
639 | chainmask = 0x09; | ||
640 | } else { | ||
641 | if (rx_chain_status & 0x4) | ||
642 | chainmask = 0x3F; | ||
643 | else if (rx_chain_status & 0x2) | ||
644 | chainmask = 0x1B; | ||
645 | else | ||
646 | chainmask = 0x09; | ||
647 | } | ||
648 | |||
649 | h = ah->nfCalHist; | ||
650 | |||
651 | for (i = 0; i < NUM_NF_READINGS; i++) { | ||
652 | if (chainmask & (1 << i)) { | ||
653 | val = REG_READ(ah, ar5416_cca_regs[i]); | ||
654 | val &= 0xFFFFFE00; | ||
655 | val |= (((u32) (h[i].privNF) << 1) & 0x1ff); | ||
656 | REG_WRITE(ah, ar5416_cca_regs[i], val); | ||
657 | } | ||
658 | } | ||
659 | |||
660 | REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, | ||
661 | AR_PHY_AGC_CONTROL_ENABLE_NF); | ||
662 | REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, | ||
663 | AR_PHY_AGC_CONTROL_NO_UPDATE_NF); | ||
664 | REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_NF); | ||
665 | |||
666 | for (j = 0; j < 5; j++) { | ||
667 | if ((REG_READ(ah, AR_PHY_AGC_CONTROL) & | ||
668 | AR_PHY_AGC_CONTROL_NF) == 0) | ||
669 | break; | ||
670 | udelay(50); | ||
671 | } | ||
672 | |||
673 | for (i = 0; i < NUM_NF_READINGS; i++) { | ||
674 | if (chainmask & (1 << i)) { | ||
675 | val = REG_READ(ah, ar5416_cca_regs[i]); | ||
676 | val &= 0xFFFFFE00; | ||
677 | val |= (((u32) (-50) << 1) & 0x1ff); | ||
678 | REG_WRITE(ah, ar5416_cca_regs[i], val); | ||
679 | } | ||
680 | } | ||
681 | } | ||
682 | |||
683 | int16_t ath9k_hw_getnf(struct ath_hw *ah, | 176 | int16_t ath9k_hw_getnf(struct ath_hw *ah, |
684 | struct ath9k_channel *chan) | 177 | struct ath9k_channel *chan) |
685 | { | 178 | { |
@@ -699,7 +192,7 @@ int16_t ath9k_hw_getnf(struct ath_hw *ah, | |||
699 | } else { | 192 | } else { |
700 | ath9k_hw_do_getnf(ah, nfarray); | 193 | ath9k_hw_do_getnf(ah, nfarray); |
701 | nf = nfarray[0]; | 194 | nf = nfarray[0]; |
702 | if (getNoiseFloorThresh(ah, c->band, &nfThresh) | 195 | if (ath9k_hw_get_nf_thresh(ah, c->band, &nfThresh) |
703 | && nf > nfThresh) { | 196 | && nf > nfThresh) { |
704 | ath_print(common, ATH_DBG_CALIBRATE, | 197 | ath_print(common, ATH_DBG_CALIBRATE, |
705 | "noise floor failed detected; " | 198 | "noise floor failed detected; " |
@@ -757,567 +250,3 @@ s16 ath9k_hw_getchan_noise(struct ath_hw *ah, struct ath9k_channel *chan) | |||
757 | return nf; | 250 | return nf; |
758 | } | 251 | } |
759 | EXPORT_SYMBOL(ath9k_hw_getchan_noise); | 252 | EXPORT_SYMBOL(ath9k_hw_getchan_noise); |
760 | |||
761 | static void ath9k_olc_temp_compensation_9287(struct ath_hw *ah) | ||
762 | { | ||
763 | u32 rddata; | ||
764 | int32_t delta, currPDADC, slope; | ||
765 | |||
766 | rddata = REG_READ(ah, AR_PHY_TX_PWRCTRL4); | ||
767 | currPDADC = MS(rddata, AR_PHY_TX_PWRCTRL_PD_AVG_OUT); | ||
768 | |||
769 | if (ah->initPDADC == 0 || currPDADC == 0) { | ||
770 | /* | ||
771 | * Zero value indicates that no frames have been transmitted yet, | ||
772 | * can't do temperature compensation until frames are transmitted. | ||
773 | */ | ||
774 | return; | ||
775 | } else { | ||
776 | slope = ah->eep_ops->get_eeprom(ah, EEP_TEMPSENSE_SLOPE); | ||
777 | |||
778 | if (slope == 0) { /* to avoid divide by zero case */ | ||
779 | delta = 0; | ||
780 | } else { | ||
781 | delta = ((currPDADC - ah->initPDADC)*4) / slope; | ||
782 | } | ||
783 | REG_RMW_FIELD(ah, AR_PHY_CH0_TX_PWRCTRL11, | ||
784 | AR_PHY_TX_PWRCTRL_OLPC_TEMP_COMP, delta); | ||
785 | REG_RMW_FIELD(ah, AR_PHY_CH1_TX_PWRCTRL11, | ||
786 | AR_PHY_TX_PWRCTRL_OLPC_TEMP_COMP, delta); | ||
787 | } | ||
788 | } | ||
789 | |||
790 | static void ath9k_olc_temp_compensation(struct ath_hw *ah) | ||
791 | { | ||
792 | u32 rddata, i; | ||
793 | int delta, currPDADC, regval; | ||
794 | |||
795 | if (OLC_FOR_AR9287_10_LATER) { | ||
796 | ath9k_olc_temp_compensation_9287(ah); | ||
797 | } else { | ||
798 | rddata = REG_READ(ah, AR_PHY_TX_PWRCTRL4); | ||
799 | currPDADC = MS(rddata, AR_PHY_TX_PWRCTRL_PD_AVG_OUT); | ||
800 | |||
801 | if (ah->initPDADC == 0 || currPDADC == 0) { | ||
802 | return; | ||
803 | } else { | ||
804 | if (ah->eep_ops->get_eeprom(ah, EEP_DAC_HPWR_5G)) | ||
805 | delta = (currPDADC - ah->initPDADC + 4) / 8; | ||
806 | else | ||
807 | delta = (currPDADC - ah->initPDADC + 5) / 10; | ||
808 | |||
809 | if (delta != ah->PDADCdelta) { | ||
810 | ah->PDADCdelta = delta; | ||
811 | for (i = 1; i < AR9280_TX_GAIN_TABLE_SIZE; i++) { | ||
812 | regval = ah->originalGain[i] - delta; | ||
813 | if (regval < 0) | ||
814 | regval = 0; | ||
815 | |||
816 | REG_RMW_FIELD(ah, | ||
817 | AR_PHY_TX_GAIN_TBL1 + i * 4, | ||
818 | AR_PHY_TX_GAIN, regval); | ||
819 | } | ||
820 | } | ||
821 | } | ||
822 | } | ||
823 | } | ||
824 | |||
825 | static void ath9k_hw_9271_pa_cal(struct ath_hw *ah, bool is_reset) | ||
826 | { | ||
827 | u32 regVal; | ||
828 | unsigned int i; | ||
829 | u32 regList [][2] = { | ||
830 | { 0x786c, 0 }, | ||
831 | { 0x7854, 0 }, | ||
832 | { 0x7820, 0 }, | ||
833 | { 0x7824, 0 }, | ||
834 | { 0x7868, 0 }, | ||
835 | { 0x783c, 0 }, | ||
836 | { 0x7838, 0 } , | ||
837 | { 0x7828, 0 } , | ||
838 | }; | ||
839 | |||
840 | for (i = 0; i < ARRAY_SIZE(regList); i++) | ||
841 | regList[i][1] = REG_READ(ah, regList[i][0]); | ||
842 | |||
843 | regVal = REG_READ(ah, 0x7834); | ||
844 | regVal &= (~(0x1)); | ||
845 | REG_WRITE(ah, 0x7834, regVal); | ||
846 | regVal = REG_READ(ah, 0x9808); | ||
847 | regVal |= (0x1 << 27); | ||
848 | REG_WRITE(ah, 0x9808, regVal); | ||
849 | |||
850 | /* 786c,b23,1, pwddac=1 */ | ||
851 | REG_RMW_FIELD(ah, AR9285_AN_TOP3, AR9285_AN_TOP3_PWDDAC, 1); | ||
852 | /* 7854, b5,1, pdrxtxbb=1 */ | ||
853 | REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDRXTXBB1, 1); | ||
854 | /* 7854, b7,1, pdv2i=1 */ | ||
855 | REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDV2I, 1); | ||
856 | /* 7854, b8,1, pddacinterface=1 */ | ||
857 | REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDDACIF, 1); | ||
858 | /* 7824,b12,0, offcal=0 */ | ||
859 | REG_RMW_FIELD(ah, AR9285_AN_RF2G2, AR9285_AN_RF2G2_OFFCAL, 0); | ||
860 | /* 7838, b1,0, pwddb=0 */ | ||
861 | REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PWDDB, 0); | ||
862 | /* 7820,b11,0, enpacal=0 */ | ||
863 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_ENPACAL, 0); | ||
864 | /* 7820,b25,1, pdpadrv1=0 */ | ||
865 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV1, 0); | ||
866 | /* 7820,b24,0, pdpadrv2=0 */ | ||
867 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1,AR9285_AN_RF2G1_PDPADRV2,0); | ||
868 | /* 7820,b23,0, pdpaout=0 */ | ||
869 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPAOUT, 0); | ||
870 | /* 783c,b14-16,7, padrvgn2tab_0=7 */ | ||
871 | REG_RMW_FIELD(ah, AR9285_AN_RF2G8,AR9285_AN_RF2G8_PADRVGN2TAB0, 7); | ||
872 | /* | ||
873 | * 7838,b29-31,0, padrvgn1tab_0=0 | ||
874 | * does not matter since we turn it off | ||
875 | */ | ||
876 | REG_RMW_FIELD(ah, AR9285_AN_RF2G7,AR9285_AN_RF2G7_PADRVGN2TAB0, 0); | ||
877 | |||
878 | REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9271_AN_RF2G3_CCOMP, 0xfff); | ||
879 | |||
880 | /* Set: | ||
881 | * localmode=1,bmode=1,bmoderxtx=1,synthon=1, | ||
882 | * txon=1,paon=1,oscon=1,synthon_force=1 | ||
883 | */ | ||
884 | REG_WRITE(ah, AR9285_AN_TOP2, 0xca0358a0); | ||
885 | udelay(30); | ||
886 | REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9271_AN_RF2G6_OFFS, 0); | ||
887 | |||
888 | /* find off_6_1; */ | ||
889 | for (i = 6; i > 0; i--) { | ||
890 | regVal = REG_READ(ah, 0x7834); | ||
891 | regVal |= (1 << (20 + i)); | ||
892 | REG_WRITE(ah, 0x7834, regVal); | ||
893 | udelay(1); | ||
894 | //regVal = REG_READ(ah, 0x7834); | ||
895 | regVal &= (~(0x1 << (20 + i))); | ||
896 | regVal |= (MS(REG_READ(ah, 0x7840), AR9285_AN_RXTXBB1_SPARE9) | ||
897 | << (20 + i)); | ||
898 | REG_WRITE(ah, 0x7834, regVal); | ||
899 | } | ||
900 | |||
901 | regVal = (regVal >>20) & 0x7f; | ||
902 | |||
903 | /* Update PA cal info */ | ||
904 | if ((!is_reset) && (ah->pacal_info.prev_offset == regVal)) { | ||
905 | if (ah->pacal_info.max_skipcount < MAX_PACAL_SKIPCOUNT) | ||
906 | ah->pacal_info.max_skipcount = | ||
907 | 2 * ah->pacal_info.max_skipcount; | ||
908 | ah->pacal_info.skipcount = ah->pacal_info.max_skipcount; | ||
909 | } else { | ||
910 | ah->pacal_info.max_skipcount = 1; | ||
911 | ah->pacal_info.skipcount = 0; | ||
912 | ah->pacal_info.prev_offset = regVal; | ||
913 | } | ||
914 | |||
915 | regVal = REG_READ(ah, 0x7834); | ||
916 | regVal |= 0x1; | ||
917 | REG_WRITE(ah, 0x7834, regVal); | ||
918 | regVal = REG_READ(ah, 0x9808); | ||
919 | regVal &= (~(0x1 << 27)); | ||
920 | REG_WRITE(ah, 0x9808, regVal); | ||
921 | |||
922 | for (i = 0; i < ARRAY_SIZE(regList); i++) | ||
923 | REG_WRITE(ah, regList[i][0], regList[i][1]); | ||
924 | } | ||
925 | |||
926 | static inline void ath9k_hw_9285_pa_cal(struct ath_hw *ah, bool is_reset) | ||
927 | { | ||
928 | struct ath_common *common = ath9k_hw_common(ah); | ||
929 | u32 regVal; | ||
930 | int i, offset, offs_6_1, offs_0; | ||
931 | u32 ccomp_org, reg_field; | ||
932 | u32 regList[][2] = { | ||
933 | { 0x786c, 0 }, | ||
934 | { 0x7854, 0 }, | ||
935 | { 0x7820, 0 }, | ||
936 | { 0x7824, 0 }, | ||
937 | { 0x7868, 0 }, | ||
938 | { 0x783c, 0 }, | ||
939 | { 0x7838, 0 }, | ||
940 | }; | ||
941 | |||
942 | ath_print(common, ATH_DBG_CALIBRATE, "Running PA Calibration\n"); | ||
943 | |||
944 | /* PA CAL is not needed for high power solution */ | ||
945 | if (ah->eep_ops->get_eeprom(ah, EEP_TXGAIN_TYPE) == | ||
946 | AR5416_EEP_TXGAIN_HIGH_POWER) | ||
947 | return; | ||
948 | |||
949 | if (AR_SREV_9285_11(ah)) { | ||
950 | REG_WRITE(ah, AR9285_AN_TOP4, (AR9285_AN_TOP4_DEFAULT | 0x14)); | ||
951 | udelay(10); | ||
952 | } | ||
953 | |||
954 | for (i = 0; i < ARRAY_SIZE(regList); i++) | ||
955 | regList[i][1] = REG_READ(ah, regList[i][0]); | ||
956 | |||
957 | regVal = REG_READ(ah, 0x7834); | ||
958 | regVal &= (~(0x1)); | ||
959 | REG_WRITE(ah, 0x7834, regVal); | ||
960 | regVal = REG_READ(ah, 0x9808); | ||
961 | regVal |= (0x1 << 27); | ||
962 | REG_WRITE(ah, 0x9808, regVal); | ||
963 | |||
964 | REG_RMW_FIELD(ah, AR9285_AN_TOP3, AR9285_AN_TOP3_PWDDAC, 1); | ||
965 | REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDRXTXBB1, 1); | ||
966 | REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDV2I, 1); | ||
967 | REG_RMW_FIELD(ah, AR9285_AN_RXTXBB1, AR9285_AN_RXTXBB1_PDDACIF, 1); | ||
968 | REG_RMW_FIELD(ah, AR9285_AN_RF2G2, AR9285_AN_RF2G2_OFFCAL, 0); | ||
969 | REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PWDDB, 0); | ||
970 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_ENPACAL, 0); | ||
971 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV1, 0); | ||
972 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPADRV2, 0); | ||
973 | REG_RMW_FIELD(ah, AR9285_AN_RF2G1, AR9285_AN_RF2G1_PDPAOUT, 0); | ||
974 | REG_RMW_FIELD(ah, AR9285_AN_RF2G8, AR9285_AN_RF2G8_PADRVGN2TAB0, 7); | ||
975 | REG_RMW_FIELD(ah, AR9285_AN_RF2G7, AR9285_AN_RF2G7_PADRVGN2TAB0, 0); | ||
976 | ccomp_org = MS(REG_READ(ah, AR9285_AN_RF2G6), AR9285_AN_RF2G6_CCOMP); | ||
977 | REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9285_AN_RF2G6_CCOMP, 0xf); | ||
978 | |||
979 | REG_WRITE(ah, AR9285_AN_TOP2, 0xca0358a0); | ||
980 | udelay(30); | ||
981 | REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9285_AN_RF2G6_OFFS, 0); | ||
982 | REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9285_AN_RF2G3_PDVCCOMP, 0); | ||
983 | |||
984 | for (i = 6; i > 0; i--) { | ||
985 | regVal = REG_READ(ah, 0x7834); | ||
986 | regVal |= (1 << (19 + i)); | ||
987 | REG_WRITE(ah, 0x7834, regVal); | ||
988 | udelay(1); | ||
989 | regVal = REG_READ(ah, 0x7834); | ||
990 | regVal &= (~(0x1 << (19 + i))); | ||
991 | reg_field = MS(REG_READ(ah, 0x7840), AR9285_AN_RXTXBB1_SPARE9); | ||
992 | regVal |= (reg_field << (19 + i)); | ||
993 | REG_WRITE(ah, 0x7834, regVal); | ||
994 | } | ||
995 | |||
996 | REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9285_AN_RF2G3_PDVCCOMP, 1); | ||
997 | udelay(1); | ||
998 | reg_field = MS(REG_READ(ah, AR9285_AN_RF2G9), AR9285_AN_RXTXBB1_SPARE9); | ||
999 | REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9285_AN_RF2G3_PDVCCOMP, reg_field); | ||
1000 | offs_6_1 = MS(REG_READ(ah, AR9285_AN_RF2G6), AR9285_AN_RF2G6_OFFS); | ||
1001 | offs_0 = MS(REG_READ(ah, AR9285_AN_RF2G3), AR9285_AN_RF2G3_PDVCCOMP); | ||
1002 | |||
1003 | offset = (offs_6_1<<1) | offs_0; | ||
1004 | offset = offset - 0; | ||
1005 | offs_6_1 = offset>>1; | ||
1006 | offs_0 = offset & 1; | ||
1007 | |||
1008 | if ((!is_reset) && (ah->pacal_info.prev_offset == offset)) { | ||
1009 | if (ah->pacal_info.max_skipcount < MAX_PACAL_SKIPCOUNT) | ||
1010 | ah->pacal_info.max_skipcount = | ||
1011 | 2 * ah->pacal_info.max_skipcount; | ||
1012 | ah->pacal_info.skipcount = ah->pacal_info.max_skipcount; | ||
1013 | } else { | ||
1014 | ah->pacal_info.max_skipcount = 1; | ||
1015 | ah->pacal_info.skipcount = 0; | ||
1016 | ah->pacal_info.prev_offset = offset; | ||
1017 | } | ||
1018 | |||
1019 | REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9285_AN_RF2G6_OFFS, offs_6_1); | ||
1020 | REG_RMW_FIELD(ah, AR9285_AN_RF2G3, AR9285_AN_RF2G3_PDVCCOMP, offs_0); | ||
1021 | |||
1022 | regVal = REG_READ(ah, 0x7834); | ||
1023 | regVal |= 0x1; | ||
1024 | REG_WRITE(ah, 0x7834, regVal); | ||
1025 | regVal = REG_READ(ah, 0x9808); | ||
1026 | regVal &= (~(0x1 << 27)); | ||
1027 | REG_WRITE(ah, 0x9808, regVal); | ||
1028 | |||
1029 | for (i = 0; i < ARRAY_SIZE(regList); i++) | ||
1030 | REG_WRITE(ah, regList[i][0], regList[i][1]); | ||
1031 | |||
1032 | REG_RMW_FIELD(ah, AR9285_AN_RF2G6, AR9285_AN_RF2G6_CCOMP, ccomp_org); | ||
1033 | |||
1034 | if (AR_SREV_9285_11(ah)) | ||
1035 | REG_WRITE(ah, AR9285_AN_TOP4, AR9285_AN_TOP4_DEFAULT); | ||
1036 | |||
1037 | } | ||
1038 | |||
1039 | bool ath9k_hw_calibrate(struct ath_hw *ah, struct ath9k_channel *chan, | ||
1040 | u8 rxchainmask, bool longcal) | ||
1041 | { | ||
1042 | bool iscaldone = true; | ||
1043 | struct ath9k_cal_list *currCal = ah->cal_list_curr; | ||
1044 | |||
1045 | if (currCal && | ||
1046 | (currCal->calState == CAL_RUNNING || | ||
1047 | currCal->calState == CAL_WAITING)) { | ||
1048 | iscaldone = ath9k_hw_per_calibration(ah, chan, | ||
1049 | rxchainmask, currCal); | ||
1050 | if (iscaldone) { | ||
1051 | ah->cal_list_curr = currCal = currCal->calNext; | ||
1052 | |||
1053 | if (currCal->calState == CAL_WAITING) { | ||
1054 | iscaldone = false; | ||
1055 | ath9k_hw_reset_calibration(ah, currCal); | ||
1056 | } | ||
1057 | } | ||
1058 | } | ||
1059 | |||
1060 | /* Do NF cal only at longer intervals */ | ||
1061 | if (longcal) { | ||
1062 | /* Do periodic PAOffset Cal */ | ||
1063 | if (AR_SREV_9271(ah)) { | ||
1064 | if (!ah->pacal_info.skipcount) | ||
1065 | ath9k_hw_9271_pa_cal(ah, false); | ||
1066 | else | ||
1067 | ah->pacal_info.skipcount--; | ||
1068 | } else if (AR_SREV_9285_11_OR_LATER(ah)) { | ||
1069 | if (!ah->pacal_info.skipcount) | ||
1070 | ath9k_hw_9285_pa_cal(ah, false); | ||
1071 | else | ||
1072 | ah->pacal_info.skipcount--; | ||
1073 | } | ||
1074 | |||
1075 | if (OLC_FOR_AR9280_20_LATER || OLC_FOR_AR9287_10_LATER) | ||
1076 | ath9k_olc_temp_compensation(ah); | ||
1077 | |||
1078 | /* Get the value from the previous NF cal and update history buffer */ | ||
1079 | ath9k_hw_getnf(ah, chan); | ||
1080 | |||
1081 | /* | ||
1082 | * Load the NF from history buffer of the current channel. | ||
1083 | * NF is slow time-variant, so it is OK to use a historical value. | ||
1084 | */ | ||
1085 | ath9k_hw_loadnf(ah, ah->curchan); | ||
1086 | |||
1087 | ath9k_hw_start_nfcal(ah); | ||
1088 | } | ||
1089 | |||
1090 | return iscaldone; | ||
1091 | } | ||
1092 | EXPORT_SYMBOL(ath9k_hw_calibrate); | ||
1093 | |||
1094 | /* Carrier leakage Calibration fix */ | ||
1095 | static bool ar9285_cl_cal(struct ath_hw *ah, struct ath9k_channel *chan) | ||
1096 | { | ||
1097 | struct ath_common *common = ath9k_hw_common(ah); | ||
1098 | |||
1099 | REG_SET_BIT(ah, AR_PHY_CL_CAL_CTL, AR_PHY_CL_CAL_ENABLE); | ||
1100 | if (IS_CHAN_HT20(chan)) { | ||
1101 | REG_SET_BIT(ah, AR_PHY_CL_CAL_CTL, AR_PHY_PARALLEL_CAL_ENABLE); | ||
1102 | REG_SET_BIT(ah, AR_PHY_TURBO, AR_PHY_FC_DYN2040_EN); | ||
1103 | REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, | ||
1104 | AR_PHY_AGC_CONTROL_FLTR_CAL); | ||
1105 | REG_CLR_BIT(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_CAL_ENABLE); | ||
1106 | REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_CAL); | ||
1107 | if (!ath9k_hw_wait(ah, AR_PHY_AGC_CONTROL, | ||
1108 | AR_PHY_AGC_CONTROL_CAL, 0, AH_WAIT_TIMEOUT)) { | ||
1109 | ath_print(common, ATH_DBG_CALIBRATE, "offset " | ||
1110 | "calibration failed to complete in " | ||
1111 | "1ms; noisy ??\n"); | ||
1112 | return false; | ||
1113 | } | ||
1114 | REG_CLR_BIT(ah, AR_PHY_TURBO, AR_PHY_FC_DYN2040_EN); | ||
1115 | REG_CLR_BIT(ah, AR_PHY_CL_CAL_CTL, AR_PHY_PARALLEL_CAL_ENABLE); | ||
1116 | REG_CLR_BIT(ah, AR_PHY_CL_CAL_CTL, AR_PHY_CL_CAL_ENABLE); | ||
1117 | } | ||
1118 | REG_CLR_BIT(ah, AR_PHY_ADC_CTL, AR_PHY_ADC_CTL_OFF_PWDADC); | ||
1119 | REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_FLTR_CAL); | ||
1120 | REG_SET_BIT(ah, AR_PHY_TPCRG1, AR_PHY_TPCRG1_PD_CAL_ENABLE); | ||
1121 | REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_CAL); | ||
1122 | if (!ath9k_hw_wait(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_CAL, | ||
1123 | 0, AH_WAIT_TIMEOUT)) { | ||
1124 | ath_print(common, ATH_DBG_CALIBRATE, "offset calibration " | ||
1125 | "failed to complete in 1ms; noisy ??\n"); | ||
1126 | return false; | ||
1127 | } | ||
1128 | |||
1129 | REG_SET_BIT(ah, AR_PHY_ADC_CTL, AR_PHY_ADC_CTL_OFF_PWDADC); | ||
1130 | REG_CLR_BIT(ah, AR_PHY_CL_CAL_CTL, AR_PHY_CL_CAL_ENABLE); | ||
1131 | REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_FLTR_CAL); | ||
1132 | |||
1133 | return true; | ||
1134 | } | ||
1135 | |||
1136 | static bool ar9285_clc(struct ath_hw *ah, struct ath9k_channel *chan) | ||
1137 | { | ||
1138 | int i; | ||
1139 | u_int32_t txgain_max; | ||
1140 | u_int32_t clc_gain, gain_mask = 0, clc_num = 0; | ||
1141 | u_int32_t reg_clc_I0, reg_clc_Q0; | ||
1142 | u_int32_t i0_num = 0; | ||
1143 | u_int32_t q0_num = 0; | ||
1144 | u_int32_t total_num = 0; | ||
1145 | u_int32_t reg_rf2g5_org; | ||
1146 | bool retv = true; | ||
1147 | |||
1148 | if (!(ar9285_cl_cal(ah, chan))) | ||
1149 | return false; | ||
1150 | |||
1151 | txgain_max = MS(REG_READ(ah, AR_PHY_TX_PWRCTRL7), | ||
1152 | AR_PHY_TX_PWRCTRL_TX_GAIN_TAB_MAX); | ||
1153 | |||
1154 | for (i = 0; i < (txgain_max+1); i++) { | ||
1155 | clc_gain = (REG_READ(ah, (AR_PHY_TX_GAIN_TBL1+(i<<2))) & | ||
1156 | AR_PHY_TX_GAIN_CLC) >> AR_PHY_TX_GAIN_CLC_S; | ||
1157 | if (!(gain_mask & (1 << clc_gain))) { | ||
1158 | gain_mask |= (1 << clc_gain); | ||
1159 | clc_num++; | ||
1160 | } | ||
1161 | } | ||
1162 | |||
1163 | for (i = 0; i < clc_num; i++) { | ||
1164 | reg_clc_I0 = (REG_READ(ah, (AR_PHY_CLC_TBL1 + (i << 2))) | ||
1165 | & AR_PHY_CLC_I0) >> AR_PHY_CLC_I0_S; | ||
1166 | reg_clc_Q0 = (REG_READ(ah, (AR_PHY_CLC_TBL1 + (i << 2))) | ||
1167 | & AR_PHY_CLC_Q0) >> AR_PHY_CLC_Q0_S; | ||
1168 | if (reg_clc_I0 == 0) | ||
1169 | i0_num++; | ||
1170 | |||
1171 | if (reg_clc_Q0 == 0) | ||
1172 | q0_num++; | ||
1173 | } | ||
1174 | total_num = i0_num + q0_num; | ||
1175 | if (total_num > AR9285_CLCAL_REDO_THRESH) { | ||
1176 | reg_rf2g5_org = REG_READ(ah, AR9285_RF2G5); | ||
1177 | if (AR_SREV_9285E_20(ah)) { | ||
1178 | REG_WRITE(ah, AR9285_RF2G5, | ||
1179 | (reg_rf2g5_org & AR9285_RF2G5_IC50TX) | | ||
1180 | AR9285_RF2G5_IC50TX_XE_SET); | ||
1181 | } else { | ||
1182 | REG_WRITE(ah, AR9285_RF2G5, | ||
1183 | (reg_rf2g5_org & AR9285_RF2G5_IC50TX) | | ||
1184 | AR9285_RF2G5_IC50TX_SET); | ||
1185 | } | ||
1186 | retv = ar9285_cl_cal(ah, chan); | ||
1187 | REG_WRITE(ah, AR9285_RF2G5, reg_rf2g5_org); | ||
1188 | } | ||
1189 | return retv; | ||
1190 | } | ||
1191 | |||
1192 | bool ath9k_hw_init_cal(struct ath_hw *ah, struct ath9k_channel *chan) | ||
1193 | { | ||
1194 | struct ath_common *common = ath9k_hw_common(ah); | ||
1195 | |||
1196 | if (AR_SREV_9271(ah) || AR_SREV_9285_12_OR_LATER(ah)) { | ||
1197 | if (!ar9285_clc(ah, chan)) | ||
1198 | return false; | ||
1199 | } else { | ||
1200 | if (AR_SREV_9280_10_OR_LATER(ah)) { | ||
1201 | if (!AR_SREV_9287_10_OR_LATER(ah)) | ||
1202 | REG_CLR_BIT(ah, AR_PHY_ADC_CTL, | ||
1203 | AR_PHY_ADC_CTL_OFF_PWDADC); | ||
1204 | REG_SET_BIT(ah, AR_PHY_AGC_CONTROL, | ||
1205 | AR_PHY_AGC_CONTROL_FLTR_CAL); | ||
1206 | } | ||
1207 | |||
1208 | /* Calibrate the AGC */ | ||
1209 | REG_WRITE(ah, AR_PHY_AGC_CONTROL, | ||
1210 | REG_READ(ah, AR_PHY_AGC_CONTROL) | | ||
1211 | AR_PHY_AGC_CONTROL_CAL); | ||
1212 | |||
1213 | /* Poll for offset calibration complete */ | ||
1214 | if (!ath9k_hw_wait(ah, AR_PHY_AGC_CONTROL, AR_PHY_AGC_CONTROL_CAL, | ||
1215 | 0, AH_WAIT_TIMEOUT)) { | ||
1216 | ath_print(common, ATH_DBG_CALIBRATE, | ||
1217 | "offset calibration failed to " | ||
1218 | "complete in 1ms; noisy environment?\n"); | ||
1219 | return false; | ||
1220 | } | ||
1221 | |||
1222 | if (AR_SREV_9280_10_OR_LATER(ah)) { | ||
1223 | if (!AR_SREV_9287_10_OR_LATER(ah)) | ||
1224 | REG_SET_BIT(ah, AR_PHY_ADC_CTL, | ||
1225 | AR_PHY_ADC_CTL_OFF_PWDADC); | ||
1226 | REG_CLR_BIT(ah, AR_PHY_AGC_CONTROL, | ||
1227 | AR_PHY_AGC_CONTROL_FLTR_CAL); | ||
1228 | } | ||
1229 | } | ||
1230 | |||
1231 | /* Do PA Calibration */ | ||
1232 | if (AR_SREV_9271(ah)) | ||
1233 | ath9k_hw_9271_pa_cal(ah, true); | ||
1234 | else if (AR_SREV_9285_11_OR_LATER(ah)) | ||
1235 | ath9k_hw_9285_pa_cal(ah, true); | ||
1236 | |||
1237 | /* Do NF Calibration after DC offset and other calibrations */ | ||
1238 | REG_WRITE(ah, AR_PHY_AGC_CONTROL, | ||
1239 | REG_READ(ah, AR_PHY_AGC_CONTROL) | AR_PHY_AGC_CONTROL_NF); | ||
1240 | |||
1241 | ah->cal_list = ah->cal_list_last = ah->cal_list_curr = NULL; | ||
1242 | |||
1243 | /* Enable IQ, ADC Gain and ADC DC offset CALs */ | ||
1244 | if (AR_SREV_9100(ah) || AR_SREV_9160_10_OR_LATER(ah)) { | ||
1245 | if (ath9k_hw_iscal_supported(ah, ADC_GAIN_CAL)) { | ||
1246 | INIT_CAL(&ah->adcgain_caldata); | ||
1247 | INSERT_CAL(ah, &ah->adcgain_caldata); | ||
1248 | ath_print(common, ATH_DBG_CALIBRATE, | ||
1249 | "enabling ADC Gain Calibration.\n"); | ||
1250 | } | ||
1251 | if (ath9k_hw_iscal_supported(ah, ADC_DC_CAL)) { | ||
1252 | INIT_CAL(&ah->adcdc_caldata); | ||
1253 | INSERT_CAL(ah, &ah->adcdc_caldata); | ||
1254 | ath_print(common, ATH_DBG_CALIBRATE, | ||
1255 | "enabling ADC DC Calibration.\n"); | ||
1256 | } | ||
1257 | if (ath9k_hw_iscal_supported(ah, IQ_MISMATCH_CAL)) { | ||
1258 | INIT_CAL(&ah->iq_caldata); | ||
1259 | INSERT_CAL(ah, &ah->iq_caldata); | ||
1260 | ath_print(common, ATH_DBG_CALIBRATE, | ||
1261 | "enabling IQ Calibration.\n"); | ||
1262 | } | ||
1263 | |||
1264 | ah->cal_list_curr = ah->cal_list; | ||
1265 | |||
1266 | if (ah->cal_list_curr) | ||
1267 | ath9k_hw_reset_calibration(ah, ah->cal_list_curr); | ||
1268 | } | ||
1269 | |||
1270 | chan->CalValid = 0; | ||
1271 | |||
1272 | return true; | ||
1273 | } | ||
1274 | |||
1275 | const struct ath9k_percal_data iq_cal_multi_sample = { | ||
1276 | IQ_MISMATCH_CAL, | ||
1277 | MAX_CAL_SAMPLES, | ||
1278 | PER_MIN_LOG_COUNT, | ||
1279 | ath9k_hw_iqcal_collect, | ||
1280 | ath9k_hw_iqcalibrate | ||
1281 | }; | ||
1282 | const struct ath9k_percal_data iq_cal_single_sample = { | ||
1283 | IQ_MISMATCH_CAL, | ||
1284 | MIN_CAL_SAMPLES, | ||
1285 | PER_MAX_LOG_COUNT, | ||
1286 | ath9k_hw_iqcal_collect, | ||
1287 | ath9k_hw_iqcalibrate | ||
1288 | }; | ||
1289 | const struct ath9k_percal_data adc_gain_cal_multi_sample = { | ||
1290 | ADC_GAIN_CAL, | ||
1291 | MAX_CAL_SAMPLES, | ||
1292 | PER_MIN_LOG_COUNT, | ||
1293 | ath9k_hw_adc_gaincal_collect, | ||
1294 | ath9k_hw_adc_gaincal_calibrate | ||
1295 | }; | ||
1296 | const struct ath9k_percal_data adc_gain_cal_single_sample = { | ||
1297 | ADC_GAIN_CAL, | ||
1298 | MIN_CAL_SAMPLES, | ||
1299 | PER_MAX_LOG_COUNT, | ||
1300 | ath9k_hw_adc_gaincal_collect, | ||
1301 | ath9k_hw_adc_gaincal_calibrate | ||
1302 | }; | ||
1303 | const struct ath9k_percal_data adc_dc_cal_multi_sample = { | ||
1304 | ADC_DC_CAL, | ||
1305 | MAX_CAL_SAMPLES, | ||
1306 | PER_MIN_LOG_COUNT, | ||
1307 | ath9k_hw_adc_dccal_collect, | ||
1308 | ath9k_hw_adc_dccal_calibrate | ||
1309 | }; | ||
1310 | const struct ath9k_percal_data adc_dc_cal_single_sample = { | ||
1311 | ADC_DC_CAL, | ||
1312 | MIN_CAL_SAMPLES, | ||
1313 | PER_MAX_LOG_COUNT, | ||
1314 | ath9k_hw_adc_dccal_collect, | ||
1315 | ath9k_hw_adc_dccal_calibrate | ||
1316 | }; | ||
1317 | const struct ath9k_percal_data adc_init_dc_cal = { | ||
1318 | ADC_DC_INIT_CAL, | ||
1319 | MIN_CAL_SAMPLES, | ||
1320 | INIT_LOG_COUNT, | ||
1321 | ath9k_hw_adc_dccal_collect, | ||
1322 | ath9k_hw_adc_dccal_calibrate | ||
1323 | }; | ||
diff --git a/drivers/net/wireless/ath/ath9k/calib.h b/drivers/net/wireless/ath/ath9k/calib.h index b2c873e97485..24538bdb9126 100644 --- a/drivers/net/wireless/ath/ath9k/calib.h +++ b/drivers/net/wireless/ath/ath9k/calib.h | |||
@@ -19,14 +19,6 @@ | |||
19 | 19 | ||
20 | #include "hw.h" | 20 | #include "hw.h" |
21 | 21 | ||
22 | extern const struct ath9k_percal_data iq_cal_multi_sample; | ||
23 | extern const struct ath9k_percal_data iq_cal_single_sample; | ||
24 | extern const struct ath9k_percal_data adc_gain_cal_multi_sample; | ||
25 | extern const struct ath9k_percal_data adc_gain_cal_single_sample; | ||
26 | extern const struct ath9k_percal_data adc_dc_cal_multi_sample; | ||
27 | extern const struct ath9k_percal_data adc_dc_cal_single_sample; | ||
28 | extern const struct ath9k_percal_data adc_init_dc_cal; | ||
29 | |||
30 | #define AR_PHY_CCA_MAX_AR5416_GOOD_VALUE -85 | 22 | #define AR_PHY_CCA_MAX_AR5416_GOOD_VALUE -85 |
31 | #define AR_PHY_CCA_MAX_AR9280_GOOD_VALUE -112 | 23 | #define AR_PHY_CCA_MAX_AR9280_GOOD_VALUE -112 |
32 | #define AR_PHY_CCA_MAX_AR9285_GOOD_VALUE -118 | 24 | #define AR_PHY_CCA_MAX_AR9285_GOOD_VALUE -118 |
@@ -76,7 +68,8 @@ enum ath9k_cal_types { | |||
76 | ADC_DC_INIT_CAL = 0x1, | 68 | ADC_DC_INIT_CAL = 0x1, |
77 | ADC_GAIN_CAL = 0x2, | 69 | ADC_GAIN_CAL = 0x2, |
78 | ADC_DC_CAL = 0x4, | 70 | ADC_DC_CAL = 0x4, |
79 | IQ_MISMATCH_CAL = 0x8 | 71 | IQ_MISMATCH_CAL = 0x8, |
72 | TEMP_COMP_CAL = 0x10, | ||
80 | }; | 73 | }; |
81 | 74 | ||
82 | enum ath9k_cal_state { | 75 | enum ath9k_cal_state { |
@@ -122,14 +115,12 @@ struct ath9k_pacal_info{ | |||
122 | 115 | ||
123 | bool ath9k_hw_reset_calvalid(struct ath_hw *ah); | 116 | bool ath9k_hw_reset_calvalid(struct ath_hw *ah); |
124 | void ath9k_hw_start_nfcal(struct ath_hw *ah); | 117 | void ath9k_hw_start_nfcal(struct ath_hw *ah); |
125 | void ath9k_hw_loadnf(struct ath_hw *ah, struct ath9k_channel *chan); | ||
126 | int16_t ath9k_hw_getnf(struct ath_hw *ah, | 118 | int16_t ath9k_hw_getnf(struct ath_hw *ah, |
127 | struct ath9k_channel *chan); | 119 | struct ath9k_channel *chan); |
128 | void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah); | 120 | void ath9k_init_nfcal_hist_buffer(struct ath_hw *ah); |
129 | s16 ath9k_hw_getchan_noise(struct ath_hw *ah, struct ath9k_channel *chan); | 121 | s16 ath9k_hw_getchan_noise(struct ath_hw *ah, struct ath9k_channel *chan); |
130 | bool ath9k_hw_calibrate(struct ath_hw *ah, struct ath9k_channel *chan, | 122 | void ath9k_hw_reset_calibration(struct ath_hw *ah, |
131 | u8 rxchainmask, bool longcal); | 123 | struct ath9k_cal_list *currCal); |
132 | bool ath9k_hw_init_cal(struct ath_hw *ah, | 124 | |
133 | struct ath9k_channel *chan); | ||
134 | 125 | ||
135 | #endif /* CALIB_H */ | 126 | #endif /* CALIB_H */ |
diff --git a/drivers/net/wireless/ath/ath9k/common.h b/drivers/net/wireless/ath/ath9k/common.h index 72a835d9e97f..e08f7e5a26e0 100644 --- a/drivers/net/wireless/ath/ath9k/common.h +++ b/drivers/net/wireless/ath/ath9k/common.h | |||
@@ -20,6 +20,7 @@ | |||
20 | #include "../debug.h" | 20 | #include "../debug.h" |
21 | 21 | ||
22 | #include "hw.h" | 22 | #include "hw.h" |
23 | #include "hw-ops.h" | ||
23 | 24 | ||
24 | /* Common header for Atheros 802.11n base driver cores */ | 25 | /* Common header for Atheros 802.11n base driver cores */ |
25 | 26 | ||
@@ -76,11 +77,12 @@ struct ath_buf { | |||
76 | an aggregate) */ | 77 | an aggregate) */ |
77 | struct ath_buf *bf_next; /* next subframe in the aggregate */ | 78 | struct ath_buf *bf_next; /* next subframe in the aggregate */ |
78 | struct sk_buff *bf_mpdu; /* enclosing frame structure */ | 79 | struct sk_buff *bf_mpdu; /* enclosing frame structure */ |
79 | struct ath_desc *bf_desc; /* virtual addr of desc */ | 80 | void *bf_desc; /* virtual addr of desc */ |
80 | dma_addr_t bf_daddr; /* physical addr of desc */ | 81 | dma_addr_t bf_daddr; /* physical addr of desc */ |
81 | dma_addr_t bf_buf_addr; /* physical addr of data buffer */ | 82 | dma_addr_t bf_buf_addr; /* physical addr of data buffer */ |
82 | bool bf_stale; | 83 | bool bf_stale; |
83 | bool bf_isnullfunc; | 84 | bool bf_isnullfunc; |
85 | bool bf_tx_aborted; | ||
84 | u16 bf_flags; | 86 | u16 bf_flags; |
85 | struct ath_buf_state bf_state; | 87 | struct ath_buf_state bf_state; |
86 | dma_addr_t bf_dmacontext; | 88 | dma_addr_t bf_dmacontext; |
diff --git a/drivers/net/wireless/ath/ath9k/debug.c b/drivers/net/wireless/ath/ath9k/debug.c index 9a8e419398f9..64e30cd45d05 100644 --- a/drivers/net/wireless/ath/ath9k/debug.c +++ b/drivers/net/wireless/ath/ath9k/debug.c | |||
@@ -180,8 +180,15 @@ void ath_debug_stat_interrupt(struct ath_softc *sc, enum ath9k_int status) | |||
180 | { | 180 | { |
181 | if (status) | 181 | if (status) |
182 | sc->debug.stats.istats.total++; | 182 | sc->debug.stats.istats.total++; |
183 | if (status & ATH9K_INT_RX) | 183 | if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { |
184 | sc->debug.stats.istats.rxok++; | 184 | if (status & ATH9K_INT_RXLP) |
185 | sc->debug.stats.istats.rxlp++; | ||
186 | if (status & ATH9K_INT_RXHP) | ||
187 | sc->debug.stats.istats.rxhp++; | ||
188 | } else { | ||
189 | if (status & ATH9K_INT_RX) | ||
190 | sc->debug.stats.istats.rxok++; | ||
191 | } | ||
185 | if (status & ATH9K_INT_RXEOL) | 192 | if (status & ATH9K_INT_RXEOL) |
186 | sc->debug.stats.istats.rxeol++; | 193 | sc->debug.stats.istats.rxeol++; |
187 | if (status & ATH9K_INT_RXORN) | 194 | if (status & ATH9K_INT_RXORN) |
@@ -223,8 +230,15 @@ static ssize_t read_file_interrupt(struct file *file, char __user *user_buf, | |||
223 | char buf[512]; | 230 | char buf[512]; |
224 | unsigned int len = 0; | 231 | unsigned int len = 0; |
225 | 232 | ||
226 | len += snprintf(buf + len, sizeof(buf) - len, | 233 | if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { |
227 | "%8s: %10u\n", "RX", sc->debug.stats.istats.rxok); | 234 | len += snprintf(buf + len, sizeof(buf) - len, |
235 | "%8s: %10u\n", "RXLP", sc->debug.stats.istats.rxlp); | ||
236 | len += snprintf(buf + len, sizeof(buf) - len, | ||
237 | "%8s: %10u\n", "RXHP", sc->debug.stats.istats.rxhp); | ||
238 | } else { | ||
239 | len += snprintf(buf + len, sizeof(buf) - len, | ||
240 | "%8s: %10u\n", "RX", sc->debug.stats.istats.rxok); | ||
241 | } | ||
228 | len += snprintf(buf + len, sizeof(buf) - len, | 242 | len += snprintf(buf + len, sizeof(buf) - len, |
229 | "%8s: %10u\n", "RXEOL", sc->debug.stats.istats.rxeol); | 243 | "%8s: %10u\n", "RXEOL", sc->debug.stats.istats.rxeol); |
230 | len += snprintf(buf + len, sizeof(buf) - len, | 244 | len += snprintf(buf + len, sizeof(buf) - len, |
diff --git a/drivers/net/wireless/ath/ath9k/debug.h b/drivers/net/wireless/ath/ath9k/debug.h index b2af9de755e6..c545960e7ec5 100644 --- a/drivers/net/wireless/ath/ath9k/debug.h +++ b/drivers/net/wireless/ath/ath9k/debug.h | |||
@@ -35,6 +35,8 @@ struct ath_buf; | |||
35 | * struct ath_interrupt_stats - Contains statistics about interrupts | 35 | * struct ath_interrupt_stats - Contains statistics about interrupts |
36 | * @total: Total no. of interrupts generated so far | 36 | * @total: Total no. of interrupts generated so far |
37 | * @rxok: RX with no errors | 37 | * @rxok: RX with no errors |
38 | * @rxlp: RX with low priority RX | ||
39 | * @rxhp: RX with high priority, uapsd only | ||
38 | * @rxeol: RX with no more RXDESC available | 40 | * @rxeol: RX with no more RXDESC available |
39 | * @rxorn: RX FIFO overrun | 41 | * @rxorn: RX FIFO overrun |
40 | * @txok: TX completed at the requested rate | 42 | * @txok: TX completed at the requested rate |
@@ -55,6 +57,8 @@ struct ath_buf; | |||
55 | struct ath_interrupt_stats { | 57 | struct ath_interrupt_stats { |
56 | u32 total; | 58 | u32 total; |
57 | u32 rxok; | 59 | u32 rxok; |
60 | u32 rxlp; | ||
61 | u32 rxhp; | ||
58 | u32 rxeol; | 62 | u32 rxeol; |
59 | u32 rxorn; | 63 | u32 rxorn; |
60 | u32 txok; | 64 | u32 txok; |
diff --git a/drivers/net/wireless/ath/ath9k/eeprom.c b/drivers/net/wireless/ath/ath9k/eeprom.c index dacaae934148..bd9dff3293dc 100644 --- a/drivers/net/wireless/ath/ath9k/eeprom.c +++ b/drivers/net/wireless/ath/ath9k/eeprom.c | |||
@@ -256,14 +256,13 @@ int ath9k_hw_eeprom_init(struct ath_hw *ah) | |||
256 | { | 256 | { |
257 | int status; | 257 | int status; |
258 | 258 | ||
259 | if (AR_SREV_9287(ah)) { | 259 | if (AR_SREV_9300_20_OR_LATER(ah)) |
260 | ah->eep_map = EEP_MAP_AR9287; | 260 | ah->eep_ops = &eep_ar9300_ops; |
261 | ah->eep_ops = &eep_AR9287_ops; | 261 | else if (AR_SREV_9287(ah)) { |
262 | ah->eep_ops = &eep_ar9287_ops; | ||
262 | } else if (AR_SREV_9285(ah) || AR_SREV_9271(ah)) { | 263 | } else if (AR_SREV_9285(ah) || AR_SREV_9271(ah)) { |
263 | ah->eep_map = EEP_MAP_4KBITS; | ||
264 | ah->eep_ops = &eep_4k_ops; | 264 | ah->eep_ops = &eep_4k_ops; |
265 | } else { | 265 | } else { |
266 | ah->eep_map = EEP_MAP_DEFAULT; | ||
267 | ah->eep_ops = &eep_def_ops; | 266 | ah->eep_ops = &eep_def_ops; |
268 | } | 267 | } |
269 | 268 | ||
diff --git a/drivers/net/wireless/ath/ath9k/eeprom.h b/drivers/net/wireless/ath/ath9k/eeprom.h index 2f2993b50e2f..fb9c8c92eabe 100644 --- a/drivers/net/wireless/ath/ath9k/eeprom.h +++ b/drivers/net/wireless/ath/ath9k/eeprom.h | |||
@@ -19,6 +19,7 @@ | |||
19 | 19 | ||
20 | #include "../ath.h" | 20 | #include "../ath.h" |
21 | #include <net/cfg80211.h> | 21 | #include <net/cfg80211.h> |
22 | #include "ar9003_eeprom.h" | ||
22 | 23 | ||
23 | #define AH_USE_EEPROM 0x1 | 24 | #define AH_USE_EEPROM 0x1 |
24 | 25 | ||
@@ -93,7 +94,6 @@ | |||
93 | */ | 94 | */ |
94 | #define AR9285_RDEXT_DEFAULT 0x1F | 95 | #define AR9285_RDEXT_DEFAULT 0x1F |
95 | 96 | ||
96 | #define AR_EEPROM_MAC(i) (0x1d+(i)) | ||
97 | #define ATH9K_POW_SM(_r, _s) (((_r) & 0x3f) << (_s)) | 97 | #define ATH9K_POW_SM(_r, _s) (((_r) & 0x3f) << (_s)) |
98 | #define FREQ2FBIN(x, y) ((y) ? ((x) - 2300) : (((x) - 4800) / 5)) | 98 | #define FREQ2FBIN(x, y) ((y) ? ((x) - 2300) : (((x) - 4800) / 5)) |
99 | #define ath9k_hw_use_flash(_ah) (!(_ah->ah_flags & AH_USE_EEPROM)) | 99 | #define ath9k_hw_use_flash(_ah) (!(_ah->ah_flags & AH_USE_EEPROM)) |
@@ -155,6 +155,7 @@ | |||
155 | #define AR5416_BCHAN_UNUSED 0xFF | 155 | #define AR5416_BCHAN_UNUSED 0xFF |
156 | #define AR5416_MAX_PWR_RANGE_IN_HALF_DB 64 | 156 | #define AR5416_MAX_PWR_RANGE_IN_HALF_DB 64 |
157 | #define AR5416_MAX_CHAINS 3 | 157 | #define AR5416_MAX_CHAINS 3 |
158 | #define AR9300_MAX_CHAINS 3 | ||
158 | #define AR5416_PWR_TABLE_OFFSET_DB -5 | 159 | #define AR5416_PWR_TABLE_OFFSET_DB -5 |
159 | 160 | ||
160 | /* Rx gain type values */ | 161 | /* Rx gain type values */ |
@@ -249,16 +250,20 @@ enum eeprom_param { | |||
249 | EEP_MINOR_REV, | 250 | EEP_MINOR_REV, |
250 | EEP_TX_MASK, | 251 | EEP_TX_MASK, |
251 | EEP_RX_MASK, | 252 | EEP_RX_MASK, |
253 | EEP_FSTCLK_5G, | ||
252 | EEP_RXGAIN_TYPE, | 254 | EEP_RXGAIN_TYPE, |
253 | EEP_TXGAIN_TYPE, | ||
254 | EEP_OL_PWRCTRL, | 255 | EEP_OL_PWRCTRL, |
256 | EEP_TXGAIN_TYPE, | ||
255 | EEP_RC_CHAIN_MASK, | 257 | EEP_RC_CHAIN_MASK, |
256 | EEP_DAC_HPWR_5G, | 258 | EEP_DAC_HPWR_5G, |
257 | EEP_FRAC_N_5G, | 259 | EEP_FRAC_N_5G, |
258 | EEP_DEV_TYPE, | 260 | EEP_DEV_TYPE, |
259 | EEP_TEMPSENSE_SLOPE, | 261 | EEP_TEMPSENSE_SLOPE, |
260 | EEP_TEMPSENSE_SLOPE_PAL_ON, | 262 | EEP_TEMPSENSE_SLOPE_PAL_ON, |
261 | EEP_PWR_TABLE_OFFSET | 263 | EEP_PWR_TABLE_OFFSET, |
264 | EEP_DRIVE_STRENGTH, | ||
265 | EEP_INTERNAL_REGULATOR, | ||
266 | EEP_SWREG | ||
262 | }; | 267 | }; |
263 | 268 | ||
264 | enum ar5416_rates { | 269 | enum ar5416_rates { |
@@ -656,13 +661,6 @@ struct ath9k_country_entry { | |||
656 | u8 iso[3]; | 661 | u8 iso[3]; |
657 | }; | 662 | }; |
658 | 663 | ||
659 | enum ath9k_eep_map { | ||
660 | EEP_MAP_DEFAULT = 0x0, | ||
661 | EEP_MAP_4KBITS, | ||
662 | EEP_MAP_AR9287, | ||
663 | EEP_MAP_MAX | ||
664 | }; | ||
665 | |||
666 | struct eeprom_ops { | 664 | struct eeprom_ops { |
667 | int (*check_eeprom)(struct ath_hw *hw); | 665 | int (*check_eeprom)(struct ath_hw *hw); |
668 | u32 (*get_eeprom)(struct ath_hw *hw, enum eeprom_param param); | 666 | u32 (*get_eeprom)(struct ath_hw *hw, enum eeprom_param param); |
@@ -713,6 +711,8 @@ int ath9k_hw_eeprom_init(struct ath_hw *ah); | |||
713 | 711 | ||
714 | extern const struct eeprom_ops eep_def_ops; | 712 | extern const struct eeprom_ops eep_def_ops; |
715 | extern const struct eeprom_ops eep_4k_ops; | 713 | extern const struct eeprom_ops eep_4k_ops; |
716 | extern const struct eeprom_ops eep_AR9287_ops; | 714 | extern const struct eeprom_ops eep_ar9287_ops; |
715 | extern const struct eeprom_ops eep_ar9287_ops; | ||
716 | extern const struct eeprom_ops eep_ar9300_ops; | ||
717 | 717 | ||
718 | #endif /* EEPROM_H */ | 718 | #endif /* EEPROM_H */ |
diff --git a/drivers/net/wireless/ath/ath9k/eeprom_4k.c b/drivers/net/wireless/ath/ath9k/eeprom_4k.c index 0354fe50f8e0..41a77d1bd439 100644 --- a/drivers/net/wireless/ath/ath9k/eeprom_4k.c +++ b/drivers/net/wireless/ath/ath9k/eeprom_4k.c | |||
@@ -15,6 +15,7 @@ | |||
15 | */ | 15 | */ |
16 | 16 | ||
17 | #include "hw.h" | 17 | #include "hw.h" |
18 | #include "ar9002_phy.h" | ||
18 | 19 | ||
19 | static int ath9k_hw_4k_get_eeprom_ver(struct ath_hw *ah) | 20 | static int ath9k_hw_4k_get_eeprom_ver(struct ath_hw *ah) |
20 | { | 21 | { |
@@ -182,11 +183,11 @@ static u32 ath9k_hw_4k_get_eeprom(struct ath_hw *ah, | |||
182 | switch (param) { | 183 | switch (param) { |
183 | case EEP_NFTHRESH_2: | 184 | case EEP_NFTHRESH_2: |
184 | return pModal->noiseFloorThreshCh[0]; | 185 | return pModal->noiseFloorThreshCh[0]; |
185 | case AR_EEPROM_MAC(0): | 186 | case EEP_MAC_LSW: |
186 | return pBase->macAddr[0] << 8 | pBase->macAddr[1]; | 187 | return pBase->macAddr[0] << 8 | pBase->macAddr[1]; |
187 | case AR_EEPROM_MAC(1): | 188 | case EEP_MAC_MID: |
188 | return pBase->macAddr[2] << 8 | pBase->macAddr[3]; | 189 | return pBase->macAddr[2] << 8 | pBase->macAddr[3]; |
189 | case AR_EEPROM_MAC(2): | 190 | case EEP_MAC_MSW: |
190 | return pBase->macAddr[4] << 8 | pBase->macAddr[5]; | 191 | return pBase->macAddr[4] << 8 | pBase->macAddr[5]; |
191 | case EEP_REG_0: | 192 | case EEP_REG_0: |
192 | return pBase->regDmn[0]; | 193 | return pBase->regDmn[0]; |
@@ -453,6 +454,8 @@ static void ath9k_hw_set_4k_power_cal_table(struct ath_hw *ah, | |||
453 | &tMinCalPower, gainBoundaries, | 454 | &tMinCalPower, gainBoundaries, |
454 | pdadcValues, numXpdGain); | 455 | pdadcValues, numXpdGain); |
455 | 456 | ||
457 | ENABLE_REGWRITE_BUFFER(ah); | ||
458 | |||
456 | if ((i == 0) || AR_SREV_5416_20_OR_LATER(ah)) { | 459 | if ((i == 0) || AR_SREV_5416_20_OR_LATER(ah)) { |
457 | REG_WRITE(ah, AR_PHY_TPCRG5 + regChainOffset, | 460 | REG_WRITE(ah, AR_PHY_TPCRG5 + regChainOffset, |
458 | SM(pdGainOverlap_t2, | 461 | SM(pdGainOverlap_t2, |
@@ -493,6 +496,9 @@ static void ath9k_hw_set_4k_power_cal_table(struct ath_hw *ah, | |||
493 | 496 | ||
494 | regOffset += 4; | 497 | regOffset += 4; |
495 | } | 498 | } |
499 | |||
500 | REGWRITE_BUFFER_FLUSH(ah); | ||
501 | DISABLE_REGWRITE_BUFFER(ah); | ||
496 | } | 502 | } |
497 | } | 503 | } |
498 | 504 | ||
@@ -758,6 +764,8 @@ static void ath9k_hw_4k_set_txpower(struct ath_hw *ah, | |||
758 | ratesArray[i] -= AR5416_PWR_TABLE_OFFSET_DB * 2; | 764 | ratesArray[i] -= AR5416_PWR_TABLE_OFFSET_DB * 2; |
759 | } | 765 | } |
760 | 766 | ||
767 | ENABLE_REGWRITE_BUFFER(ah); | ||
768 | |||
761 | /* OFDM power per rate */ | 769 | /* OFDM power per rate */ |
762 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE1, | 770 | REG_WRITE(ah, AR_PHY_POWER_TX_RATE1, |
763 | ATH9K_POW_SM(ratesArray[rate18mb], 24) | 771 | ATH9K_POW_SM(ratesArray[rate18mb], 24) |
@@ -820,6 +828,9 @@ static void ath9k_hw_4k_set_txpower(struct ath_hw *ah, | |||
820 | | ATH9K_POW_SM(ratesArray[rateDupOfdm], 8) | 828 | | ATH9K_POW_SM(ratesArray[rateDupOfdm], 8) |
821 | | ATH9K_POW_SM(ratesArray[rateDupCck], 0)); | 829 | | ATH9K_POW_SM(ratesArray[rateDupCck], 0)); |
822 | } | 830 | } |
831 | |||
832 | REGWRITE_BUFFER_FLUSH(ah); | ||
833 | DISABLE_REGWRITE_BUFFER(ah); | ||
823 | } | 834 | } |
824 | 835 | ||
825 | 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/eeprom_9287.c b/drivers/net/wireless/ath/ath9k/eeprom_9287.c index d8ca94c3fa0c..b471db5fb82d 100644 --- a/drivers/net/wireless/ath/ath9k/eeprom_9287.c +++ b/drivers/net/wireless/ath/ath9k/eeprom_9287.c | |||
@@ -15,6 +15,7 @@ | |||
15 | */ | 15 | */ |
16 | 16 | ||
17 | #include "hw.h" | 17 | #include "hw.h" |
18 | #include "ar9002_phy.h" | ||
18 | 19 | ||
19 | static int ath9k_hw_AR9287_get_eeprom_ver(struct ath_hw *ah) | 20 | static int ath9k_hw_AR9287_get_eeprom_ver(struct ath_hw *ah) |
20 | { | 21 | { |
@@ -172,11 +173,11 @@ static u32 ath9k_hw_AR9287_get_eeprom(struct ath_hw *ah, | |||
172 | switch (param) { | 173 | switch (param) { |
173 | case EEP_NFTHRESH_2: | 174 | case EEP_NFTHRESH_2: |
174 | return pModal->noiseFloorThreshCh[0]; | 175 | return pModal->noiseFloorThreshCh[0]; |
175 | case AR_EEPROM_MAC(0): | 176 | case EEP_MAC_LSW: |
176 | return pBase->macAddr[0] << 8 | pBase->macAddr[1]; | 177 | return pBase->macAddr[0] << 8 | pBase->macAddr[1]; |
177 | case AR_EEPROM_MAC(1): | 178 | case EEP_MAC_MID: |
178 | return pBase->macAddr[2] << 8 | pBase->macAddr[3]; | 179 | return pBase->macAddr[2] << 8 | pBase->macAddr[3]; |
179 | case AR_EEPROM_MAC(2): | 180 | case EEP_MAC_MSW: |
180 | return pBase->macAddr[4] << 8 | pBase->macAddr[5]; | 181 | return pBase->macAddr[4] << 8 | pBase->macAddr[5]; |
181 | case EEP_REG_0: | 182 | case EEP_REG_0: |
182 | return pBase->regDmn[0]; | 183 | return pBase->regDmn[0]; |
@@ -1169,7 +1170,7 @@ static u16 ath9k_hw_AR9287_get_spur_channel(struct ath_hw *ah, | |||
1169 | #undef EEP_MAP9287_SPURCHAN | 1170 | #undef EEP_MAP9287_SPURCHAN |
1170 | } | 1171 | } |
1171 | 1172 | ||
1172 | const struct eeprom_ops eep_AR9287_ops = { | 1173 | const struct eeprom_ops eep_ar9287_ops = { |
1173 | .check_eeprom = ath9k_hw_AR9287_check_eeprom, | 1174 | .check_eeprom = ath9k_hw_AR9287_check_eeprom, |
1174 | .get_eeprom = ath9k_hw_AR9287_get_eeprom, | 1175 | .get_eeprom = ath9k_hw_AR9287_get_eeprom, |
1175 | .fill_eeprom = ath9k_hw_AR9287_fill_eeprom, | 1176 | .fill_eeprom = ath9k_hw_AR9287_fill_eeprom, |
diff --git a/drivers/net/wireless/ath/ath9k/eeprom_def.c b/drivers/net/wireless/ath/ath9k/eeprom_def.c index 404a0341242c..cf59799ef307 100644 --- a/drivers/net/wireless/ath/ath9k/eeprom_def.c +++ b/drivers/net/wireless/ath/ath9k/eeprom_def.c | |||
@@ -15,6 +15,7 @@ | |||
15 | */ | 15 | */ |
16 | 16 | ||
17 | #include "hw.h" | 17 | #include "hw.h" |
18 | #include "ar9002_phy.h" | ||
18 | 19 | ||
19 | static void ath9k_get_txgain_index(struct ath_hw *ah, | 20 | static void ath9k_get_txgain_index(struct ath_hw *ah, |
20 | struct ath9k_channel *chan, | 21 | struct ath9k_channel *chan, |
@@ -222,6 +223,12 @@ static int ath9k_hw_def_check_eeprom(struct ath_hw *ah) | |||
222 | return -EINVAL; | 223 | return -EINVAL; |
223 | } | 224 | } |
224 | 225 | ||
226 | /* Enable fixup for AR_AN_TOP2 if necessary */ | ||
227 | if (AR_SREV_9280_10_OR_LATER(ah) && | ||
228 | (eep->baseEepHeader.version & 0xff) > 0x0a && | ||
229 | eep->baseEepHeader.pwdclkind == 0) | ||
230 | ah->need_an_top2_fixup = 1; | ||
231 | |||
225 | return 0; | 232 | return 0; |
226 | } | 233 | } |
227 | 234 | ||
@@ -237,11 +244,11 @@ static u32 ath9k_hw_def_get_eeprom(struct ath_hw *ah, | |||
237 | return pModal[0].noiseFloorThreshCh[0]; | 244 | return pModal[0].noiseFloorThreshCh[0]; |
238 | case EEP_NFTHRESH_2: | 245 | case EEP_NFTHRESH_2: |
239 | return pModal[1].noiseFloorThreshCh[0]; | 246 | return pModal[1].noiseFloorThreshCh[0]; |
240 | case AR_EEPROM_MAC(0): | 247 | case EEP_MAC_LSW: |
241 | return pBase->macAddr[0] << 8 | pBase->macAddr[1]; | 248 | return pBase->macAddr[0] << 8 | pBase->macAddr[1]; |
242 | case AR_EEPROM_MAC(1): | 249 | case EEP_MAC_MID: |
243 | return pBase->macAddr[2] << 8 | pBase->macAddr[3]; | 250 | return pBase->macAddr[2] << 8 | pBase->macAddr[3]; |
244 | case AR_EEPROM_MAC(2): | 251 | case EEP_MAC_MSW: |
245 | return pBase->macAddr[4] << 8 | pBase->macAddr[5]; | 252 | return pBase->macAddr[4] << 8 | pBase->macAddr[5]; |
246 | case EEP_REG_0: | 253 | case EEP_REG_0: |
247 | return pBase->regDmn[0]; | 254 | return pBase->regDmn[0]; |
diff --git a/drivers/net/wireless/ath/ath9k/hif_usb.c b/drivers/net/wireless/ath/ath9k/hif_usb.c index fe994e229898..3091bb3cef9b 100644 --- a/drivers/net/wireless/ath/ath9k/hif_usb.c +++ b/drivers/net/wireless/ath/ath9k/hif_usb.c | |||
@@ -129,6 +129,7 @@ static void hif_usb_tx_cb(struct urb *urb) | |||
129 | TX_STAT_INC(skb_completed); | 129 | TX_STAT_INC(skb_completed); |
130 | } else { | 130 | } else { |
131 | dev_kfree_skb_any(skb); | 131 | dev_kfree_skb_any(skb); |
132 | TX_STAT_INC(skb_dropped); | ||
132 | } | 133 | } |
133 | } | 134 | } |
134 | 135 | ||
@@ -149,11 +150,15 @@ static void hif_usb_tx_cb(struct urb *urb) | |||
149 | } | 150 | } |
150 | } | 151 | } |
151 | 152 | ||
152 | static inline void ath9k_skb_queue_purge(struct sk_buff_head *list) | 153 | static inline void ath9k_skb_queue_purge(struct hif_device_usb *hif_dev, |
154 | struct sk_buff_head *list) | ||
153 | { | 155 | { |
154 | struct sk_buff *skb; | 156 | struct sk_buff *skb; |
155 | while ((skb = __skb_dequeue(list)) != NULL) | 157 | |
158 | while ((skb = __skb_dequeue(list)) != NULL) { | ||
156 | dev_kfree_skb_any(skb); | 159 | dev_kfree_skb_any(skb); |
160 | TX_STAT_INC(skb_dropped); | ||
161 | } | ||
157 | } | 162 | } |
158 | 163 | ||
159 | /* TX lock has to be taken */ | 164 | /* TX lock has to be taken */ |
@@ -214,7 +219,7 @@ static int __hif_usb_tx(struct hif_device_usb *hif_dev) | |||
214 | ret = usb_submit_urb(tx_buf->urb, GFP_ATOMIC); | 219 | ret = usb_submit_urb(tx_buf->urb, GFP_ATOMIC); |
215 | if (ret) { | 220 | if (ret) { |
216 | tx_buf->len = tx_buf->offset = 0; | 221 | tx_buf->len = tx_buf->offset = 0; |
217 | ath9k_skb_queue_purge(&tx_buf->skb_queue); | 222 | ath9k_skb_queue_purge(hif_dev, &tx_buf->skb_queue); |
218 | __skb_queue_head_init(&tx_buf->skb_queue); | 223 | __skb_queue_head_init(&tx_buf->skb_queue); |
219 | list_move_tail(&tx_buf->list, &hif_dev->tx.tx_buf); | 224 | list_move_tail(&tx_buf->list, &hif_dev->tx.tx_buf); |
220 | hif_dev->tx.tx_buf_cnt++; | 225 | hif_dev->tx.tx_buf_cnt++; |
@@ -281,7 +286,7 @@ static void hif_usb_stop(void *hif_handle, u8 pipe_id) | |||
281 | unsigned long flags; | 286 | unsigned long flags; |
282 | 287 | ||
283 | spin_lock_irqsave(&hif_dev->tx.tx_lock, flags); | 288 | spin_lock_irqsave(&hif_dev->tx.tx_lock, flags); |
284 | ath9k_skb_queue_purge(&hif_dev->tx.tx_skb_queue); | 289 | ath9k_skb_queue_purge(hif_dev, &hif_dev->tx.tx_skb_queue); |
285 | hif_dev->tx.tx_skb_cnt = 0; | 290 | hif_dev->tx.tx_skb_cnt = 0; |
286 | hif_dev->tx.flags |= HIF_USB_TX_STOP; | 291 | hif_dev->tx.flags |= HIF_USB_TX_STOP; |
287 | spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags); | 292 | spin_unlock_irqrestore(&hif_dev->tx.tx_lock, flags); |
diff --git a/drivers/net/wireless/ath/ath9k/htc.h b/drivers/net/wireless/ath/ath9k/htc.h index 78213fc71b09..c765ff4a505c 100644 --- a/drivers/net/wireless/ath/ath9k/htc.h +++ b/drivers/net/wireless/ath/ath9k/htc.h | |||
@@ -124,13 +124,13 @@ struct ath9k_htc_cap_target { | |||
124 | struct ath9k_htc_target_vif { | 124 | struct ath9k_htc_target_vif { |
125 | u8 index; | 125 | u8 index; |
126 | u8 des_bssid[ETH_ALEN]; | 126 | u8 des_bssid[ETH_ALEN]; |
127 | enum htc_opmode opmode; | 127 | __be32 opmode; |
128 | u8 myaddr[ETH_ALEN]; | 128 | u8 myaddr[ETH_ALEN]; |
129 | u8 bssid[ETH_ALEN]; | 129 | u8 bssid[ETH_ALEN]; |
130 | u32 flags; | 130 | u32 flags; |
131 | u32 flags_ext; | 131 | u32 flags_ext; |
132 | u16 ps_sta; | 132 | u16 ps_sta; |
133 | u16 rtsthreshold; | 133 | __be16 rtsthreshold; |
134 | u8 ath_cap; | 134 | u8 ath_cap; |
135 | u8 node; | 135 | u8 node; |
136 | s8 mcast_rate; | 136 | s8 mcast_rate; |
@@ -151,7 +151,7 @@ struct ath9k_htc_target_sta { | |||
151 | u8 sta_index; | 151 | u8 sta_index; |
152 | u8 vif_index; | 152 | u8 vif_index; |
153 | u8 vif_sta; | 153 | u8 vif_sta; |
154 | u16 flags; /* ATH_HTC_STA_* */ | 154 | __be16 flags; /* ATH_HTC_STA_* */ |
155 | u16 htcap; | 155 | u16 htcap; |
156 | u8 valid; | 156 | u8 valid; |
157 | u16 capinfo; | 157 | u16 capinfo; |
@@ -191,16 +191,16 @@ struct ath9k_htc_rate { | |||
191 | struct ath9k_htc_target_rate { | 191 | struct ath9k_htc_target_rate { |
192 | u8 sta_index; | 192 | u8 sta_index; |
193 | u8 isnew; | 193 | u8 isnew; |
194 | u32 capflags; | 194 | __be32 capflags; |
195 | struct ath9k_htc_rate rates; | 195 | struct ath9k_htc_rate rates; |
196 | }; | 196 | }; |
197 | 197 | ||
198 | struct ath9k_htc_target_stats { | 198 | struct ath9k_htc_target_stats { |
199 | u32 tx_shortretry; | 199 | __be32 tx_shortretry; |
200 | u32 tx_longretry; | 200 | __be32 tx_longretry; |
201 | u32 tx_xretries; | 201 | __be32 tx_xretries; |
202 | u32 ht_txunaggr_xretry; | 202 | __be32 ht_txunaggr_xretry; |
203 | u32 ht_tx_xretries; | 203 | __be32 ht_tx_xretries; |
204 | } __packed; | 204 | } __packed; |
205 | 205 | ||
206 | struct ath9k_htc_vif { | 206 | struct ath9k_htc_vif { |
@@ -261,6 +261,7 @@ struct ath_tx_stats { | |||
261 | u32 buf_completed; | 261 | u32 buf_completed; |
262 | u32 skb_queued; | 262 | u32 skb_queued; |
263 | u32 skb_completed; | 263 | u32 skb_completed; |
264 | u32 skb_dropped; | ||
264 | }; | 265 | }; |
265 | 266 | ||
266 | struct ath_rx_stats { | 267 | struct ath_rx_stats { |
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c b/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c index 5e21f4d92ff5..7cb55f5b071c 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_beacon.c | |||
@@ -26,7 +26,8 @@ static void ath9k_htc_beacon_config_sta(struct ath9k_htc_priv *priv, | |||
26 | enum ath9k_int imask = 0; | 26 | enum ath9k_int imask = 0; |
27 | int dtimperiod, dtimcount, sleepduration; | 27 | int dtimperiod, dtimcount, sleepduration; |
28 | int cfpperiod, cfpcount, bmiss_timeout; | 28 | int cfpperiod, cfpcount, bmiss_timeout; |
29 | u32 nexttbtt = 0, intval, tsftu, htc_imask = 0; | 29 | u32 nexttbtt = 0, intval, tsftu; |
30 | __be32 htc_imask = 0; | ||
30 | u64 tsf; | 31 | u64 tsf; |
31 | int num_beacons, offset, dtim_dec_count, cfp_dec_count; | 32 | int num_beacons, offset, dtim_dec_count, cfp_dec_count; |
32 | int ret; | 33 | int ret; |
@@ -142,7 +143,8 @@ static void ath9k_htc_beacon_config_adhoc(struct ath9k_htc_priv *priv, | |||
142 | { | 143 | { |
143 | struct ath_common *common = ath9k_hw_common(priv->ah); | 144 | struct ath_common *common = ath9k_hw_common(priv->ah); |
144 | enum ath9k_int imask = 0; | 145 | enum ath9k_int imask = 0; |
145 | u32 nexttbtt, intval, htc_imask = 0; | 146 | u32 nexttbtt, intval; |
147 | __be32 htc_imask = 0; | ||
146 | int ret; | 148 | int ret; |
147 | u8 cmd_rsp; | 149 | u8 cmd_rsp; |
148 | 150 | ||
@@ -244,25 +246,20 @@ void ath9k_htc_beacon_config(struct ath9k_htc_priv *priv, | |||
244 | struct ieee80211_vif *vif) | 246 | struct ieee80211_vif *vif) |
245 | { | 247 | { |
246 | struct ath_common *common = ath9k_hw_common(priv->ah); | 248 | struct ath_common *common = ath9k_hw_common(priv->ah); |
247 | enum nl80211_iftype iftype; | ||
248 | struct htc_beacon_config *cur_conf = &priv->cur_beacon_conf; | 249 | struct htc_beacon_config *cur_conf = &priv->cur_beacon_conf; |
250 | struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; | ||
249 | 251 | ||
250 | if (vif) { | 252 | cur_conf->beacon_interval = bss_conf->beacon_int; |
251 | struct ieee80211_bss_conf *bss_conf = &vif->bss_conf; | ||
252 | iftype = vif->type; | ||
253 | cur_conf->beacon_interval = bss_conf->beacon_int; | ||
254 | cur_conf->dtim_period = bss_conf->dtim_period; | ||
255 | cur_conf->listen_interval = 1; | ||
256 | cur_conf->dtim_count = 1; | ||
257 | cur_conf->bmiss_timeout = | ||
258 | ATH_DEFAULT_BMISS_LIMIT * cur_conf->beacon_interval; | ||
259 | } else | ||
260 | iftype = priv->ah->opmode; | ||
261 | |||
262 | if (cur_conf->beacon_interval == 0) | 253 | if (cur_conf->beacon_interval == 0) |
263 | cur_conf->beacon_interval = 100; | 254 | cur_conf->beacon_interval = 100; |
264 | 255 | ||
265 | switch (iftype) { | 256 | cur_conf->dtim_period = bss_conf->dtim_period; |
257 | cur_conf->listen_interval = 1; | ||
258 | cur_conf->dtim_count = 1; | ||
259 | cur_conf->bmiss_timeout = | ||
260 | ATH_DEFAULT_BMISS_LIMIT * cur_conf->beacon_interval; | ||
261 | |||
262 | switch (vif->type) { | ||
266 | case NL80211_IFTYPE_STATION: | 263 | case NL80211_IFTYPE_STATION: |
267 | ath9k_htc_beacon_config_sta(priv, cur_conf); | 264 | ath9k_htc_beacon_config_sta(priv, cur_conf); |
268 | break; | 265 | break; |
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_init.c b/drivers/net/wireless/ath/ath9k/htc_drv_init.c index aed53573c547..a86189629d92 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_init.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_init.c | |||
@@ -213,7 +213,7 @@ static int ath9k_reg_notifier(struct wiphy *wiphy, | |||
213 | ath9k_hw_regulatory(priv->ah)); | 213 | ath9k_hw_regulatory(priv->ah)); |
214 | } | 214 | } |
215 | 215 | ||
216 | static unsigned int ath9k_ioread32(void *hw_priv, u32 reg_offset) | 216 | static unsigned int ath9k_regread(void *hw_priv, u32 reg_offset) |
217 | { | 217 | { |
218 | struct ath_hw *ah = (struct ath_hw *) hw_priv; | 218 | struct ath_hw *ah = (struct ath_hw *) hw_priv; |
219 | struct ath_common *common = ath9k_hw_common(ah); | 219 | struct ath_common *common = ath9k_hw_common(ah); |
@@ -235,7 +235,7 @@ static unsigned int ath9k_ioread32(void *hw_priv, u32 reg_offset) | |||
235 | return be32_to_cpu(val); | 235 | return be32_to_cpu(val); |
236 | } | 236 | } |
237 | 237 | ||
238 | static void ath9k_iowrite32(void *hw_priv, u32 val, u32 reg_offset) | 238 | static void ath9k_regwrite_single(void *hw_priv, u32 val, u32 reg_offset) |
239 | { | 239 | { |
240 | struct ath_hw *ah = (struct ath_hw *) hw_priv; | 240 | struct ath_hw *ah = (struct ath_hw *) hw_priv; |
241 | struct ath_common *common = ath9k_hw_common(ah); | 241 | struct ath_common *common = ath9k_hw_common(ah); |
@@ -257,9 +257,105 @@ static void ath9k_iowrite32(void *hw_priv, u32 val, u32 reg_offset) | |||
257 | } | 257 | } |
258 | } | 258 | } |
259 | 259 | ||
260 | static void ath9k_regwrite_buffer(void *hw_priv, u32 val, u32 reg_offset) | ||
261 | { | ||
262 | struct ath_hw *ah = (struct ath_hw *) hw_priv; | ||
263 | struct ath_common *common = ath9k_hw_common(ah); | ||
264 | struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv; | ||
265 | u32 rsp_status; | ||
266 | int r; | ||
267 | |||
268 | mutex_lock(&priv->wmi->multi_write_mutex); | ||
269 | |||
270 | /* Store the register/value */ | ||
271 | priv->wmi->multi_write[priv->wmi->multi_write_idx].reg = | ||
272 | cpu_to_be32(reg_offset); | ||
273 | priv->wmi->multi_write[priv->wmi->multi_write_idx].val = | ||
274 | cpu_to_be32(val); | ||
275 | |||
276 | priv->wmi->multi_write_idx++; | ||
277 | |||
278 | /* If the buffer is full, send it out. */ | ||
279 | if (priv->wmi->multi_write_idx == MAX_CMD_NUMBER) { | ||
280 | r = ath9k_wmi_cmd(priv->wmi, WMI_REG_WRITE_CMDID, | ||
281 | (u8 *) &priv->wmi->multi_write, | ||
282 | sizeof(struct register_write) * priv->wmi->multi_write_idx, | ||
283 | (u8 *) &rsp_status, sizeof(rsp_status), | ||
284 | 100); | ||
285 | if (unlikely(r)) { | ||
286 | ath_print(common, ATH_DBG_WMI, | ||
287 | "REGISTER WRITE FAILED, multi len: %d\n", | ||
288 | priv->wmi->multi_write_idx); | ||
289 | } | ||
290 | priv->wmi->multi_write_idx = 0; | ||
291 | } | ||
292 | |||
293 | mutex_unlock(&priv->wmi->multi_write_mutex); | ||
294 | } | ||
295 | |||
296 | static void ath9k_regwrite(void *hw_priv, u32 val, u32 reg_offset) | ||
297 | { | ||
298 | struct ath_hw *ah = (struct ath_hw *) hw_priv; | ||
299 | struct ath_common *common = ath9k_hw_common(ah); | ||
300 | struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv; | ||
301 | |||
302 | if (atomic_read(&priv->wmi->mwrite_cnt)) | ||
303 | ath9k_regwrite_buffer(hw_priv, val, reg_offset); | ||
304 | else | ||
305 | ath9k_regwrite_single(hw_priv, val, reg_offset); | ||
306 | } | ||
307 | |||
308 | static void ath9k_enable_regwrite_buffer(void *hw_priv) | ||
309 | { | ||
310 | struct ath_hw *ah = (struct ath_hw *) hw_priv; | ||
311 | struct ath_common *common = ath9k_hw_common(ah); | ||
312 | struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv; | ||
313 | |||
314 | atomic_inc(&priv->wmi->mwrite_cnt); | ||
315 | } | ||
316 | |||
317 | static void ath9k_disable_regwrite_buffer(void *hw_priv) | ||
318 | { | ||
319 | struct ath_hw *ah = (struct ath_hw *) hw_priv; | ||
320 | struct ath_common *common = ath9k_hw_common(ah); | ||
321 | struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv; | ||
322 | |||
323 | atomic_dec(&priv->wmi->mwrite_cnt); | ||
324 | } | ||
325 | |||
326 | static void ath9k_regwrite_flush(void *hw_priv) | ||
327 | { | ||
328 | struct ath_hw *ah = (struct ath_hw *) hw_priv; | ||
329 | struct ath_common *common = ath9k_hw_common(ah); | ||
330 | struct ath9k_htc_priv *priv = (struct ath9k_htc_priv *) common->priv; | ||
331 | u32 rsp_status; | ||
332 | int r; | ||
333 | |||
334 | mutex_lock(&priv->wmi->multi_write_mutex); | ||
335 | |||
336 | if (priv->wmi->multi_write_idx) { | ||
337 | r = ath9k_wmi_cmd(priv->wmi, WMI_REG_WRITE_CMDID, | ||
338 | (u8 *) &priv->wmi->multi_write, | ||
339 | sizeof(struct register_write) * priv->wmi->multi_write_idx, | ||
340 | (u8 *) &rsp_status, sizeof(rsp_status), | ||
341 | 100); | ||
342 | if (unlikely(r)) { | ||
343 | ath_print(common, ATH_DBG_WMI, | ||
344 | "REGISTER WRITE FAILED, multi len: %d\n", | ||
345 | priv->wmi->multi_write_idx); | ||
346 | } | ||
347 | priv->wmi->multi_write_idx = 0; | ||
348 | } | ||
349 | |||
350 | mutex_unlock(&priv->wmi->multi_write_mutex); | ||
351 | } | ||
352 | |||
260 | static const struct ath_ops ath9k_common_ops = { | 353 | static const struct ath_ops ath9k_common_ops = { |
261 | .read = ath9k_ioread32, | 354 | .read = ath9k_regread, |
262 | .write = ath9k_iowrite32, | 355 | .write = ath9k_regwrite, |
356 | .enable_write_buffer = ath9k_enable_regwrite_buffer, | ||
357 | .disable_write_buffer = ath9k_disable_regwrite_buffer, | ||
358 | .write_flush = ath9k_regwrite_flush, | ||
263 | }; | 359 | }; |
264 | 360 | ||
265 | static void ath_usb_read_cachesize(struct ath_common *common, int *csz) | 361 | static void ath_usb_read_cachesize(struct ath_common *common, int *csz) |
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_main.c b/drivers/net/wireless/ath/ath9k/htc_drv_main.c index eb7722b2cfcc..ec7bcc8696ec 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_main.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_main.c | |||
@@ -125,7 +125,7 @@ static int ath9k_htc_set_channel(struct ath9k_htc_priv *priv, | |||
125 | bool fastcc = true; | 125 | bool fastcc = true; |
126 | struct ieee80211_channel *channel = hw->conf.channel; | 126 | struct ieee80211_channel *channel = hw->conf.channel; |
127 | enum htc_phymode mode; | 127 | enum htc_phymode mode; |
128 | u16 htc_mode; | 128 | __be16 htc_mode; |
129 | u8 cmd_rsp; | 129 | u8 cmd_rsp; |
130 | int ret; | 130 | int ret; |
131 | 131 | ||
@@ -378,7 +378,7 @@ static int ath9k_htc_init_rate(struct ath9k_htc_priv *priv, | |||
378 | priv->tgt_rate.sta_index = ista->index; | 378 | priv->tgt_rate.sta_index = ista->index; |
379 | priv->tgt_rate.isnew = 1; | 379 | priv->tgt_rate.isnew = 1; |
380 | trate = priv->tgt_rate; | 380 | trate = priv->tgt_rate; |
381 | priv->tgt_rate.capflags = caps; | 381 | priv->tgt_rate.capflags = cpu_to_be32(caps); |
382 | trate.capflags = cpu_to_be32(caps); | 382 | trate.capflags = cpu_to_be32(caps); |
383 | 383 | ||
384 | WMI_CMD_BUF(WMI_RC_RATE_UPDATE_CMDID, &trate); | 384 | WMI_CMD_BUF(WMI_RC_RATE_UPDATE_CMDID, &trate); |
@@ -426,6 +426,7 @@ static void ath9k_htc_rc_update(struct ath9k_htc_priv *priv, bool is_cw40) | |||
426 | struct ath9k_htc_target_rate trate; | 426 | struct ath9k_htc_target_rate trate; |
427 | struct ath_common *common = ath9k_hw_common(priv->ah); | 427 | struct ath_common *common = ath9k_hw_common(priv->ah); |
428 | int ret; | 428 | int ret; |
429 | u32 caps = be32_to_cpu(priv->tgt_rate.capflags); | ||
429 | u8 cmd_rsp; | 430 | u8 cmd_rsp; |
430 | 431 | ||
431 | memset(&trate, 0, sizeof(trate)); | 432 | memset(&trate, 0, sizeof(trate)); |
@@ -433,11 +434,12 @@ static void ath9k_htc_rc_update(struct ath9k_htc_priv *priv, bool is_cw40) | |||
433 | trate = priv->tgt_rate; | 434 | trate = priv->tgt_rate; |
434 | 435 | ||
435 | if (is_cw40) | 436 | if (is_cw40) |
436 | priv->tgt_rate.capflags |= WLAN_RC_40_FLAG; | 437 | caps |= WLAN_RC_40_FLAG; |
437 | else | 438 | else |
438 | priv->tgt_rate.capflags &= ~WLAN_RC_40_FLAG; | 439 | caps &= ~WLAN_RC_40_FLAG; |
439 | 440 | ||
440 | trate.capflags = cpu_to_be32(priv->tgt_rate.capflags); | 441 | priv->tgt_rate.capflags = cpu_to_be32(caps); |
442 | trate.capflags = cpu_to_be32(caps); | ||
441 | 443 | ||
442 | WMI_CMD_BUF(WMI_RC_RATE_UPDATE_CMDID, &trate); | 444 | WMI_CMD_BUF(WMI_RC_RATE_UPDATE_CMDID, &trate); |
443 | if (ret) { | 445 | if (ret) { |
@@ -609,6 +611,9 @@ static ssize_t read_file_xmit(struct file *file, char __user *user_buf, | |||
609 | len += snprintf(buf + len, sizeof(buf) - len, | 611 | len += snprintf(buf + len, sizeof(buf) - len, |
610 | "%20s : %10u\n", "SKBs completed", | 612 | "%20s : %10u\n", "SKBs completed", |
611 | priv->debug.tx_stats.skb_completed); | 613 | priv->debug.tx_stats.skb_completed); |
614 | len += snprintf(buf + len, sizeof(buf) - len, | ||
615 | "%20s : %10u\n", "SKBs dropped", | ||
616 | priv->debug.tx_stats.skb_dropped); | ||
612 | 617 | ||
613 | return simple_read_from_buffer(user_buf, count, ppos, buf, len); | 618 | return simple_read_from_buffer(user_buf, count, ppos, buf, len); |
614 | } | 619 | } |
@@ -960,7 +965,6 @@ void ath9k_deinit_leds(struct ath9k_htc_priv *priv) | |||
960 | ath9k_unregister_led(&priv->tx_led); | 965 | ath9k_unregister_led(&priv->tx_led); |
961 | ath9k_unregister_led(&priv->rx_led); | 966 | ath9k_unregister_led(&priv->rx_led); |
962 | ath9k_unregister_led(&priv->radio_led); | 967 | ath9k_unregister_led(&priv->radio_led); |
963 | ath9k_hw_set_gpio(priv->ah, priv->ah->led_pin, 1); | ||
964 | } | 968 | } |
965 | 969 | ||
966 | void ath9k_init_leds(struct ath9k_htc_priv *priv) | 970 | void ath9k_init_leds(struct ath9k_htc_priv *priv) |
@@ -1102,7 +1106,7 @@ static int ath9k_htc_start(struct ieee80211_hw *hw) | |||
1102 | struct ath9k_channel *init_channel; | 1106 | struct ath9k_channel *init_channel; |
1103 | int ret = 0; | 1107 | int ret = 0; |
1104 | enum htc_phymode mode; | 1108 | enum htc_phymode mode; |
1105 | u16 htc_mode; | 1109 | __be16 htc_mode; |
1106 | u8 cmd_rsp; | 1110 | u8 cmd_rsp; |
1107 | 1111 | ||
1108 | ath_print(common, ATH_DBG_CONFIG, | 1112 | ath_print(common, ATH_DBG_CONFIG, |
@@ -1687,7 +1691,7 @@ static void ath9k_htc_sw_scan_complete(struct ieee80211_hw *hw) | |||
1687 | spin_unlock_bh(&priv->beacon_lock); | 1691 | spin_unlock_bh(&priv->beacon_lock); |
1688 | priv->op_flags |= OP_FULL_RESET; | 1692 | priv->op_flags |= OP_FULL_RESET; |
1689 | if (priv->op_flags & OP_ASSOCIATED) | 1693 | if (priv->op_flags & OP_ASSOCIATED) |
1690 | ath9k_htc_beacon_config(priv, NULL); | 1694 | ath9k_htc_beacon_config(priv, priv->vif); |
1691 | ath_start_ani(priv); | 1695 | ath_start_ani(priv); |
1692 | mutex_unlock(&priv->mutex); | 1696 | mutex_unlock(&priv->mutex); |
1693 | ath9k_htc_ps_restore(priv); | 1697 | ath9k_htc_ps_restore(priv); |
diff --git a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c index 0a7cb30af5b4..2c3c51007dd3 100644 --- a/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c +++ b/drivers/net/wireless/ath/ath9k/htc_drv_txrx.c | |||
@@ -530,7 +530,7 @@ static bool ath9k_rx_prepare(struct ath9k_htc_priv *priv, | |||
530 | priv->ah->stats.avgbrssi = rxbuf->rxstatus.rs_rssi; | 530 | priv->ah->stats.avgbrssi = rxbuf->rxstatus.rs_rssi; |
531 | } | 531 | } |
532 | 532 | ||
533 | rx_status->mactime = rxbuf->rxstatus.rs_tstamp; | 533 | rx_status->mactime = be64_to_cpu(rxbuf->rxstatus.rs_tstamp); |
534 | rx_status->band = hw->conf.channel->band; | 534 | rx_status->band = hw->conf.channel->band; |
535 | rx_status->freq = hw->conf.channel->center_freq; | 535 | rx_status->freq = hw->conf.channel->center_freq; |
536 | rx_status->signal = rxbuf->rxstatus.rs_rssi + ATH_DEFAULT_NOISE_FLOOR; | 536 | rx_status->signal = rxbuf->rxstatus.rs_rssi + ATH_DEFAULT_NOISE_FLOOR; |
@@ -634,13 +634,8 @@ void ath9k_htc_rxep(void *drv_priv, struct sk_buff *skb, | |||
634 | 634 | ||
635 | rxstatus = (struct ath_htc_rx_status *)skb->data; | 635 | rxstatus = (struct ath_htc_rx_status *)skb->data; |
636 | 636 | ||
637 | rxstatus->rs_tstamp = be64_to_cpu(rxstatus->rs_tstamp); | 637 | if (be16_to_cpu(rxstatus->rs_datalen) - |
638 | rxstatus->rs_datalen = be16_to_cpu(rxstatus->rs_datalen); | 638 | (len - HTC_RX_FRAME_HEADER_SIZE) != 0) { |
639 | rxstatus->evm0 = be32_to_cpu(rxstatus->evm0); | ||
640 | rxstatus->evm1 = be32_to_cpu(rxstatus->evm1); | ||
641 | rxstatus->evm2 = be32_to_cpu(rxstatus->evm2); | ||
642 | |||
643 | if (rxstatus->rs_datalen - (len - HTC_RX_FRAME_HEADER_SIZE) != 0) { | ||
644 | ath_print(common, ATH_DBG_FATAL, | 639 | ath_print(common, ATH_DBG_FATAL, |
645 | "Corrupted RX data len, dropping " | 640 | "Corrupted RX data len, dropping " |
646 | "(epid: %d, dlen: %d, skblen: %d)\n", | 641 | "(epid: %d, dlen: %d, skblen: %d)\n", |
diff --git a/drivers/net/wireless/ath/ath9k/htc_hst.c b/drivers/net/wireless/ath/ath9k/htc_hst.c index 587d98ed0989..f2dca258bdc2 100644 --- a/drivers/net/wireless/ath/ath9k/htc_hst.c +++ b/drivers/net/wireless/ath/ath9k/htc_hst.c | |||
@@ -368,7 +368,7 @@ void ath9k_htc_rx_msg(struct htc_target *htc_handle, | |||
368 | struct htc_frame_hdr *htc_hdr; | 368 | struct htc_frame_hdr *htc_hdr; |
369 | enum htc_endpoint_id epid; | 369 | enum htc_endpoint_id epid; |
370 | struct htc_endpoint *endpoint; | 370 | struct htc_endpoint *endpoint; |
371 | u16 *msg_id; | 371 | __be16 *msg_id; |
372 | 372 | ||
373 | if (!htc_handle || !skb) | 373 | if (!htc_handle || !skb) |
374 | return; | 374 | return; |
@@ -388,14 +388,14 @@ void ath9k_htc_rx_msg(struct htc_target *htc_handle, | |||
388 | 388 | ||
389 | /* Handle trailer */ | 389 | /* Handle trailer */ |
390 | if (htc_hdr->flags & HTC_FLAGS_RECV_TRAILER) { | 390 | if (htc_hdr->flags & HTC_FLAGS_RECV_TRAILER) { |
391 | if (be32_to_cpu(*(u32 *) skb->data) == 0x00C60000) | 391 | if (be32_to_cpu(*(__be32 *) skb->data) == 0x00C60000) |
392 | /* Move past the Watchdog pattern */ | 392 | /* Move past the Watchdog pattern */ |
393 | htc_hdr = (struct htc_frame_hdr *)(skb->data + 4); | 393 | htc_hdr = (struct htc_frame_hdr *)(skb->data + 4); |
394 | } | 394 | } |
395 | 395 | ||
396 | /* Get the message ID */ | 396 | /* Get the message ID */ |
397 | msg_id = (u16 *) ((void *) htc_hdr + | 397 | msg_id = (__be16 *) ((void *) htc_hdr + |
398 | sizeof(struct htc_frame_hdr)); | 398 | sizeof(struct htc_frame_hdr)); |
399 | 399 | ||
400 | /* Now process HTC messages */ | 400 | /* Now process HTC messages */ |
401 | switch (be16_to_cpu(*msg_id)) { | 401 | switch (be16_to_cpu(*msg_id)) { |
diff --git a/drivers/net/wireless/ath/ath9k/htc_hst.h b/drivers/net/wireless/ath/ath9k/htc_hst.h index cd7048ffd239..ea50ab032d20 100644 --- a/drivers/net/wireless/ath/ath9k/htc_hst.h +++ b/drivers/net/wireless/ath/ath9k/htc_hst.h | |||
@@ -59,20 +59,20 @@ enum htc_endpoint_id { | |||
59 | struct htc_frame_hdr { | 59 | struct htc_frame_hdr { |
60 | u8 endpoint_id; | 60 | u8 endpoint_id; |
61 | u8 flags; | 61 | u8 flags; |
62 | u16 payload_len; | 62 | __be16 payload_len; |
63 | u8 control[4]; | 63 | u8 control[4]; |
64 | } __packed; | 64 | } __packed; |
65 | 65 | ||
66 | struct htc_ready_msg { | 66 | struct htc_ready_msg { |
67 | u16 message_id; | 67 | __be16 message_id; |
68 | u16 credits; | 68 | __be16 credits; |
69 | u16 credit_size; | 69 | __be16 credit_size; |
70 | u8 max_endpoints; | 70 | u8 max_endpoints; |
71 | u8 pad; | 71 | u8 pad; |
72 | } __packed; | 72 | } __packed; |
73 | 73 | ||
74 | struct htc_config_pipe_msg { | 74 | struct htc_config_pipe_msg { |
75 | u16 message_id; | 75 | __be16 message_id; |
76 | u8 pipe_id; | 76 | u8 pipe_id; |
77 | u8 credits; | 77 | u8 credits; |
78 | } __packed; | 78 | } __packed; |
@@ -192,9 +192,9 @@ enum htc_service_group_ids{ | |||
192 | #define WMI_DATA_BK_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP, 8) | 192 | #define WMI_DATA_BK_SVC MAKE_SERVICE_ID(WMI_SERVICE_GROUP, 8) |
193 | 193 | ||
194 | struct htc_conn_svc_msg { | 194 | struct htc_conn_svc_msg { |
195 | u16 msg_id; | 195 | __be16 msg_id; |
196 | u16 service_id; | 196 | __be16 service_id; |
197 | u16 con_flags; | 197 | __be16 con_flags; |
198 | u8 dl_pipeid; | 198 | u8 dl_pipeid; |
199 | u8 ul_pipeid; | 199 | u8 ul_pipeid; |
200 | u8 svc_meta_len; | 200 | u8 svc_meta_len; |
@@ -209,17 +209,17 @@ struct htc_conn_svc_msg { | |||
209 | #define HTC_SERVICE_NO_MORE_EP 4 | 209 | #define HTC_SERVICE_NO_MORE_EP 4 |
210 | 210 | ||
211 | struct htc_conn_svc_rspmsg { | 211 | struct htc_conn_svc_rspmsg { |
212 | u16 msg_id; | 212 | __be16 msg_id; |
213 | u16 service_id; | 213 | __be16 service_id; |
214 | u8 status; | 214 | u8 status; |
215 | u8 endpoint_id; | 215 | u8 endpoint_id; |
216 | u16 max_msg_len; | 216 | __be16 max_msg_len; |
217 | u8 svc_meta_len; | 217 | u8 svc_meta_len; |
218 | u8 pad; | 218 | u8 pad; |
219 | } __packed; | 219 | } __packed; |
220 | 220 | ||
221 | struct htc_comp_msg { | 221 | struct htc_comp_msg { |
222 | u16 msg_id; | 222 | __be16 msg_id; |
223 | } __packed; | 223 | } __packed; |
224 | 224 | ||
225 | int htc_init(struct htc_target *target); | 225 | int htc_init(struct htc_target *target); |
diff --git a/drivers/net/wireless/ath/ath9k/hw-ops.h b/drivers/net/wireless/ath/ath9k/hw-ops.h new file mode 100644 index 000000000000..624422a8169e --- /dev/null +++ b/drivers/net/wireless/ath/ath9k/hw-ops.h | |||
@@ -0,0 +1,280 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2010 Atheros Communications Inc. | ||
3 | * | ||
4 | * Permission to use, copy, modify, and/or distribute this software for any | ||
5 | * purpose with or without fee is hereby granted, provided that the above | ||
6 | * copyright notice and this permission notice appear in all copies. | ||
7 | * | ||
8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
15 | */ | ||
16 | |||
17 | #ifndef ATH9K_HW_OPS_H | ||
18 | #define ATH9K_HW_OPS_H | ||
19 | |||
20 | #include "hw.h" | ||
21 | |||
22 | /* Hardware core and driver accessible callbacks */ | ||
23 | |||
24 | static inline void ath9k_hw_configpcipowersave(struct ath_hw *ah, | ||
25 | int restore, | ||
26 | int power_off) | ||
27 | { | ||
28 | ath9k_hw_ops(ah)->config_pci_powersave(ah, restore, power_off); | ||
29 | } | ||
30 | |||
31 | static inline void ath9k_hw_rxena(struct ath_hw *ah) | ||
32 | { | ||
33 | ath9k_hw_ops(ah)->rx_enable(ah); | ||
34 | } | ||
35 | |||
36 | static inline void ath9k_hw_set_desc_link(struct ath_hw *ah, void *ds, | ||
37 | u32 link) | ||
38 | { | ||
39 | ath9k_hw_ops(ah)->set_desc_link(ds, link); | ||
40 | } | ||
41 | |||
42 | static inline void ath9k_hw_get_desc_link(struct ath_hw *ah, void *ds, | ||
43 | u32 **link) | ||
44 | { | ||
45 | ath9k_hw_ops(ah)->get_desc_link(ds, link); | ||
46 | } | ||
47 | static inline bool ath9k_hw_calibrate(struct ath_hw *ah, | ||
48 | struct ath9k_channel *chan, | ||
49 | u8 rxchainmask, | ||
50 | bool longcal) | ||
51 | { | ||
52 | return ath9k_hw_ops(ah)->calibrate(ah, chan, rxchainmask, longcal); | ||
53 | } | ||
54 | |||
55 | static inline bool ath9k_hw_getisr(struct ath_hw *ah, enum ath9k_int *masked) | ||
56 | { | ||
57 | return ath9k_hw_ops(ah)->get_isr(ah, masked); | ||
58 | } | ||
59 | |||
60 | static inline void ath9k_hw_filltxdesc(struct ath_hw *ah, void *ds, u32 seglen, | ||
61 | bool is_firstseg, bool is_lastseg, | ||
62 | const void *ds0, dma_addr_t buf_addr, | ||
63 | unsigned int qcu) | ||
64 | { | ||
65 | ath9k_hw_ops(ah)->fill_txdesc(ah, ds, seglen, is_firstseg, is_lastseg, | ||
66 | ds0, buf_addr, qcu); | ||
67 | } | ||
68 | |||
69 | static inline int ath9k_hw_txprocdesc(struct ath_hw *ah, void *ds, | ||
70 | struct ath_tx_status *ts) | ||
71 | { | ||
72 | return ath9k_hw_ops(ah)->proc_txdesc(ah, ds, ts); | ||
73 | } | ||
74 | |||
75 | static inline void ath9k_hw_set11n_txdesc(struct ath_hw *ah, void *ds, | ||
76 | u32 pktLen, enum ath9k_pkt_type type, | ||
77 | u32 txPower, u32 keyIx, | ||
78 | enum ath9k_key_type keyType, | ||
79 | u32 flags) | ||
80 | { | ||
81 | ath9k_hw_ops(ah)->set11n_txdesc(ah, ds, pktLen, type, txPower, keyIx, | ||
82 | keyType, flags); | ||
83 | } | ||
84 | |||
85 | static inline void ath9k_hw_set11n_ratescenario(struct ath_hw *ah, void *ds, | ||
86 | void *lastds, | ||
87 | u32 durUpdateEn, u32 rtsctsRate, | ||
88 | u32 rtsctsDuration, | ||
89 | struct ath9k_11n_rate_series series[], | ||
90 | u32 nseries, u32 flags) | ||
91 | { | ||
92 | ath9k_hw_ops(ah)->set11n_ratescenario(ah, ds, lastds, durUpdateEn, | ||
93 | rtsctsRate, rtsctsDuration, series, | ||
94 | nseries, flags); | ||
95 | } | ||
96 | |||
97 | static inline void ath9k_hw_set11n_aggr_first(struct ath_hw *ah, void *ds, | ||
98 | u32 aggrLen) | ||
99 | { | ||
100 | ath9k_hw_ops(ah)->set11n_aggr_first(ah, ds, aggrLen); | ||
101 | } | ||
102 | |||
103 | static inline void ath9k_hw_set11n_aggr_middle(struct ath_hw *ah, void *ds, | ||
104 | u32 numDelims) | ||
105 | { | ||
106 | ath9k_hw_ops(ah)->set11n_aggr_middle(ah, ds, numDelims); | ||
107 | } | ||
108 | |||
109 | static inline void ath9k_hw_set11n_aggr_last(struct ath_hw *ah, void *ds) | ||
110 | { | ||
111 | ath9k_hw_ops(ah)->set11n_aggr_last(ah, ds); | ||
112 | } | ||
113 | |||
114 | static inline void ath9k_hw_clr11n_aggr(struct ath_hw *ah, void *ds) | ||
115 | { | ||
116 | ath9k_hw_ops(ah)->clr11n_aggr(ah, ds); | ||
117 | } | ||
118 | |||
119 | static inline void ath9k_hw_set11n_burstduration(struct ath_hw *ah, void *ds, | ||
120 | u32 burstDuration) | ||
121 | { | ||
122 | ath9k_hw_ops(ah)->set11n_burstduration(ah, ds, burstDuration); | ||
123 | } | ||
124 | |||
125 | static inline void ath9k_hw_set11n_virtualmorefrag(struct ath_hw *ah, void *ds, | ||
126 | u32 vmf) | ||
127 | { | ||
128 | ath9k_hw_ops(ah)->set11n_virtualmorefrag(ah, ds, vmf); | ||
129 | } | ||
130 | |||
131 | /* Private hardware call ops */ | ||
132 | |||
133 | /* PHY ops */ | ||
134 | |||
135 | static inline int ath9k_hw_rf_set_freq(struct ath_hw *ah, | ||
136 | struct ath9k_channel *chan) | ||
137 | { | ||
138 | return ath9k_hw_private_ops(ah)->rf_set_freq(ah, chan); | ||
139 | } | ||
140 | |||
141 | static inline void ath9k_hw_spur_mitigate_freq(struct ath_hw *ah, | ||
142 | struct ath9k_channel *chan) | ||
143 | { | ||
144 | ath9k_hw_private_ops(ah)->spur_mitigate_freq(ah, chan); | ||
145 | } | ||
146 | |||
147 | static inline int ath9k_hw_rf_alloc_ext_banks(struct ath_hw *ah) | ||
148 | { | ||
149 | if (!ath9k_hw_private_ops(ah)->rf_alloc_ext_banks) | ||
150 | return 0; | ||
151 | |||
152 | return ath9k_hw_private_ops(ah)->rf_alloc_ext_banks(ah); | ||
153 | } | ||
154 | |||
155 | static inline void ath9k_hw_rf_free_ext_banks(struct ath_hw *ah) | ||
156 | { | ||
157 | if (!ath9k_hw_private_ops(ah)->rf_free_ext_banks) | ||
158 | return; | ||
159 | |||
160 | ath9k_hw_private_ops(ah)->rf_free_ext_banks(ah); | ||
161 | } | ||
162 | |||
163 | static inline bool ath9k_hw_set_rf_regs(struct ath_hw *ah, | ||
164 | struct ath9k_channel *chan, | ||
165 | u16 modesIndex) | ||
166 | { | ||
167 | if (!ath9k_hw_private_ops(ah)->set_rf_regs) | ||
168 | return true; | ||
169 | |||
170 | return ath9k_hw_private_ops(ah)->set_rf_regs(ah, chan, modesIndex); | ||
171 | } | ||
172 | |||
173 | static inline void ath9k_hw_init_bb(struct ath_hw *ah, | ||
174 | struct ath9k_channel *chan) | ||
175 | { | ||
176 | return ath9k_hw_private_ops(ah)->init_bb(ah, chan); | ||
177 | } | ||
178 | |||
179 | static inline void ath9k_hw_set_channel_regs(struct ath_hw *ah, | ||
180 | struct ath9k_channel *chan) | ||
181 | { | ||
182 | return ath9k_hw_private_ops(ah)->set_channel_regs(ah, chan); | ||
183 | } | ||
184 | |||
185 | static inline int ath9k_hw_process_ini(struct ath_hw *ah, | ||
186 | struct ath9k_channel *chan) | ||
187 | { | ||
188 | return ath9k_hw_private_ops(ah)->process_ini(ah, chan); | ||
189 | } | ||
190 | |||
191 | static inline void ath9k_olc_init(struct ath_hw *ah) | ||
192 | { | ||
193 | if (!ath9k_hw_private_ops(ah)->olc_init) | ||
194 | return; | ||
195 | |||
196 | return ath9k_hw_private_ops(ah)->olc_init(ah); | ||
197 | } | ||
198 | |||
199 | static inline void ath9k_hw_set_rfmode(struct ath_hw *ah, | ||
200 | struct ath9k_channel *chan) | ||
201 | { | ||
202 | return ath9k_hw_private_ops(ah)->set_rfmode(ah, chan); | ||
203 | } | ||
204 | |||
205 | static inline void ath9k_hw_mark_phy_inactive(struct ath_hw *ah) | ||
206 | { | ||
207 | return ath9k_hw_private_ops(ah)->mark_phy_inactive(ah); | ||
208 | } | ||
209 | |||
210 | static inline void ath9k_hw_set_delta_slope(struct ath_hw *ah, | ||
211 | struct ath9k_channel *chan) | ||
212 | { | ||
213 | return ath9k_hw_private_ops(ah)->set_delta_slope(ah, chan); | ||
214 | } | ||
215 | |||
216 | static inline bool ath9k_hw_rfbus_req(struct ath_hw *ah) | ||
217 | { | ||
218 | return ath9k_hw_private_ops(ah)->rfbus_req(ah); | ||
219 | } | ||
220 | |||
221 | static inline void ath9k_hw_rfbus_done(struct ath_hw *ah) | ||
222 | { | ||
223 | return ath9k_hw_private_ops(ah)->rfbus_done(ah); | ||
224 | } | ||
225 | |||
226 | static inline void ath9k_enable_rfkill(struct ath_hw *ah) | ||
227 | { | ||
228 | return ath9k_hw_private_ops(ah)->enable_rfkill(ah); | ||
229 | } | ||
230 | |||
231 | static inline void ath9k_hw_restore_chainmask(struct ath_hw *ah) | ||
232 | { | ||
233 | if (!ath9k_hw_private_ops(ah)->restore_chainmask) | ||
234 | return; | ||
235 | |||
236 | return ath9k_hw_private_ops(ah)->restore_chainmask(ah); | ||
237 | } | ||
238 | |||
239 | static inline void ath9k_hw_set_diversity(struct ath_hw *ah, bool value) | ||
240 | { | ||
241 | return ath9k_hw_private_ops(ah)->set_diversity(ah, value); | ||
242 | } | ||
243 | |||
244 | static inline bool ath9k_hw_ani_control(struct ath_hw *ah, | ||
245 | enum ath9k_ani_cmd cmd, int param) | ||
246 | { | ||
247 | return ath9k_hw_private_ops(ah)->ani_control(ah, cmd, param); | ||
248 | } | ||
249 | |||
250 | static inline void ath9k_hw_do_getnf(struct ath_hw *ah, | ||
251 | int16_t nfarray[NUM_NF_READINGS]) | ||
252 | { | ||
253 | ath9k_hw_private_ops(ah)->do_getnf(ah, nfarray); | ||
254 | } | ||
255 | |||
256 | static inline void ath9k_hw_loadnf(struct ath_hw *ah, | ||
257 | struct ath9k_channel *chan) | ||
258 | { | ||
259 | ath9k_hw_private_ops(ah)->loadnf(ah, chan); | ||
260 | } | ||
261 | |||
262 | static inline bool ath9k_hw_init_cal(struct ath_hw *ah, | ||
263 | struct ath9k_channel *chan) | ||
264 | { | ||
265 | return ath9k_hw_private_ops(ah)->init_cal(ah, chan); | ||
266 | } | ||
267 | |||
268 | static inline void ath9k_hw_setup_calibration(struct ath_hw *ah, | ||
269 | struct ath9k_cal_list *currCal) | ||
270 | { | ||
271 | ath9k_hw_private_ops(ah)->setup_calibration(ah, currCal); | ||
272 | } | ||
273 | |||
274 | static inline bool ath9k_hw_iscal_supported(struct ath_hw *ah, | ||
275 | enum ath9k_cal_types calType) | ||
276 | { | ||
277 | return ath9k_hw_private_ops(ah)->iscal_supported(ah, calType); | ||
278 | } | ||
279 | |||
280 | #endif /* ATH9K_HW_OPS_H */ | ||
diff --git a/drivers/net/wireless/ath/ath9k/hw.c b/drivers/net/wireless/ath/ath9k/hw.c index af730c7d50e6..5a29048db3b1 100644 --- a/drivers/net/wireless/ath/ath9k/hw.c +++ b/drivers/net/wireless/ath/ath9k/hw.c | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2008-2009 Atheros Communications Inc. | 2 | * Copyright (c) 2008-2010 Atheros Communications Inc. |
3 | * | 3 | * |
4 | * Permission to use, copy, modify, and/or distribute this software for any | 4 | * Permission to use, copy, modify, and/or distribute this software for any |
5 | * purpose with or without fee is hereby granted, provided that the above | 5 | * purpose with or without fee is hereby granted, provided that the above |
@@ -19,15 +19,15 @@ | |||
19 | #include <asm/unaligned.h> | 19 | #include <asm/unaligned.h> |
20 | 20 | ||
21 | #include "hw.h" | 21 | #include "hw.h" |
22 | #include "hw-ops.h" | ||
22 | #include "rc.h" | 23 | #include "rc.h" |
23 | #include "initvals.h" | 24 | #include "ar9003_mac.h" |
24 | 25 | ||
25 | #define ATH9K_CLOCK_RATE_CCK 22 | 26 | #define ATH9K_CLOCK_RATE_CCK 22 |
26 | #define ATH9K_CLOCK_RATE_5GHZ_OFDM 40 | 27 | #define ATH9K_CLOCK_RATE_5GHZ_OFDM 40 |
27 | #define ATH9K_CLOCK_RATE_2GHZ_OFDM 44 | 28 | #define ATH9K_CLOCK_RATE_2GHZ_OFDM 44 |
28 | 29 | ||
29 | static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type); | 30 | static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type); |
30 | static void ath9k_hw_set_regs(struct ath_hw *ah, struct ath9k_channel *chan); | ||
31 | 31 | ||
32 | MODULE_AUTHOR("Atheros Communications"); | 32 | MODULE_AUTHOR("Atheros Communications"); |
33 | MODULE_DESCRIPTION("Support for Atheros 802.11n wireless LAN cards."); | 33 | MODULE_DESCRIPTION("Support for Atheros 802.11n wireless LAN cards."); |
@@ -46,6 +46,39 @@ static void __exit ath9k_exit(void) | |||
46 | } | 46 | } |
47 | module_exit(ath9k_exit); | 47 | module_exit(ath9k_exit); |
48 | 48 | ||
49 | /* Private hardware callbacks */ | ||
50 | |||
51 | static void ath9k_hw_init_cal_settings(struct ath_hw *ah) | ||
52 | { | ||
53 | ath9k_hw_private_ops(ah)->init_cal_settings(ah); | ||
54 | } | ||
55 | |||
56 | static void ath9k_hw_init_mode_regs(struct ath_hw *ah) | ||
57 | { | ||
58 | ath9k_hw_private_ops(ah)->init_mode_regs(ah); | ||
59 | } | ||
60 | |||
61 | static bool ath9k_hw_macversion_supported(struct ath_hw *ah) | ||
62 | { | ||
63 | struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah); | ||
64 | |||
65 | return priv_ops->macversion_supported(ah->hw_version.macVersion); | ||
66 | } | ||
67 | |||
68 | static u32 ath9k_hw_compute_pll_control(struct ath_hw *ah, | ||
69 | struct ath9k_channel *chan) | ||
70 | { | ||
71 | return ath9k_hw_private_ops(ah)->compute_pll_control(ah, chan); | ||
72 | } | ||
73 | |||
74 | static void ath9k_hw_init_mode_gain_regs(struct ath_hw *ah) | ||
75 | { | ||
76 | if (!ath9k_hw_private_ops(ah)->init_mode_gain_regs) | ||
77 | return; | ||
78 | |||
79 | ath9k_hw_private_ops(ah)->init_mode_gain_regs(ah); | ||
80 | } | ||
81 | |||
49 | /********************/ | 82 | /********************/ |
50 | /* Helper Functions */ | 83 | /* Helper Functions */ |
51 | /********************/ | 84 | /********************/ |
@@ -233,21 +266,6 @@ static void ath9k_hw_read_revisions(struct ath_hw *ah) | |||
233 | } | 266 | } |
234 | } | 267 | } |
235 | 268 | ||
236 | static int ath9k_hw_get_radiorev(struct ath_hw *ah) | ||
237 | { | ||
238 | u32 val; | ||
239 | int i; | ||
240 | |||
241 | REG_WRITE(ah, AR_PHY(0x36), 0x00007058); | ||
242 | |||
243 | for (i = 0; i < 8; i++) | ||
244 | REG_WRITE(ah, AR_PHY(0x20), 0x00010000); | ||
245 | val = (REG_READ(ah, AR_PHY(256)) >> 24) & 0xff; | ||
246 | val = ((val & 0xf0) >> 4) | ((val & 0x0f) << 4); | ||
247 | |||
248 | return ath9k_hw_reverse_bits(val, 8); | ||
249 | } | ||
250 | |||
251 | /************************************/ | 269 | /************************************/ |
252 | /* HW Attach, Detach, Init Routines */ | 270 | /* HW Attach, Detach, Init Routines */ |
253 | /************************************/ | 271 | /************************************/ |
@@ -257,6 +275,8 @@ static void ath9k_hw_disablepcie(struct ath_hw *ah) | |||
257 | if (AR_SREV_9100(ah)) | 275 | if (AR_SREV_9100(ah)) |
258 | return; | 276 | return; |
259 | 277 | ||
278 | ENABLE_REGWRITE_BUFFER(ah); | ||
279 | |||
260 | REG_WRITE(ah, AR_PCIE_SERDES, 0x9248fc00); | 280 | REG_WRITE(ah, AR_PCIE_SERDES, 0x9248fc00); |
261 | REG_WRITE(ah, AR_PCIE_SERDES, 0x24924924); | 281 | REG_WRITE(ah, AR_PCIE_SERDES, 0x24924924); |
262 | REG_WRITE(ah, AR_PCIE_SERDES, 0x28000029); | 282 | REG_WRITE(ah, AR_PCIE_SERDES, 0x28000029); |
@@ -268,20 +288,30 @@ static void ath9k_hw_disablepcie(struct ath_hw *ah) | |||
268 | REG_WRITE(ah, AR_PCIE_SERDES, 0x000e1007); | 288 | REG_WRITE(ah, AR_PCIE_SERDES, 0x000e1007); |
269 | 289 | ||
270 | REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000); | 290 | REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000); |
291 | |||
292 | REGWRITE_BUFFER_FLUSH(ah); | ||
293 | DISABLE_REGWRITE_BUFFER(ah); | ||
271 | } | 294 | } |
272 | 295 | ||
296 | /* This should work for all families including legacy */ | ||
273 | static bool ath9k_hw_chip_test(struct ath_hw *ah) | 297 | static bool ath9k_hw_chip_test(struct ath_hw *ah) |
274 | { | 298 | { |
275 | struct ath_common *common = ath9k_hw_common(ah); | 299 | struct ath_common *common = ath9k_hw_common(ah); |
276 | u32 regAddr[2] = { AR_STA_ID0, AR_PHY_BASE + (8 << 2) }; | 300 | u32 regAddr[2] = { AR_STA_ID0 }; |
277 | u32 regHold[2]; | 301 | u32 regHold[2]; |
278 | u32 patternData[4] = { 0x55555555, | 302 | u32 patternData[4] = { 0x55555555, |
279 | 0xaaaaaaaa, | 303 | 0xaaaaaaaa, |
280 | 0x66666666, | 304 | 0x66666666, |
281 | 0x99999999 }; | 305 | 0x99999999 }; |
282 | int i, j; | 306 | int i, j, loop_max; |
307 | |||
308 | if (!AR_SREV_9300_20_OR_LATER(ah)) { | ||
309 | loop_max = 2; | ||
310 | regAddr[1] = AR_PHY_BASE + (8 << 2); | ||
311 | } else | ||
312 | loop_max = 1; | ||
283 | 313 | ||
284 | for (i = 0; i < 2; i++) { | 314 | for (i = 0; i < loop_max; i++) { |
285 | u32 addr = regAddr[i]; | 315 | u32 addr = regAddr[i]; |
286 | u32 wrData, rdData; | 316 | u32 wrData, rdData; |
287 | 317 | ||
@@ -336,7 +366,13 @@ static void ath9k_hw_init_config(struct ath_hw *ah) | |||
336 | ah->config.ofdm_trig_high = 500; | 366 | ah->config.ofdm_trig_high = 500; |
337 | ah->config.cck_trig_high = 200; | 367 | ah->config.cck_trig_high = 200; |
338 | ah->config.cck_trig_low = 100; | 368 | ah->config.cck_trig_low = 100; |
339 | ah->config.enable_ani = 1; | 369 | |
370 | /* | ||
371 | * For now ANI is disabled for AR9003, it is still | ||
372 | * being tested. | ||
373 | */ | ||
374 | if (!AR_SREV_9300_20_OR_LATER(ah)) | ||
375 | ah->config.enable_ani = 1; | ||
340 | 376 | ||
341 | for (i = 0; i < AR_EEPROM_MODAL_SPURS; i++) { | 377 | for (i = 0; i < AR_EEPROM_MODAL_SPURS; i++) { |
342 | ah->config.spurchans[i][0] = AR_NO_SPUR; | 378 | ah->config.spurchans[i][0] = AR_NO_SPUR; |
@@ -369,7 +405,6 @@ static void ath9k_hw_init_config(struct ath_hw *ah) | |||
369 | if (num_possible_cpus() > 1) | 405 | if (num_possible_cpus() > 1) |
370 | ah->config.serialize_regmode = SER_REG_MODE_AUTO; | 406 | ah->config.serialize_regmode = SER_REG_MODE_AUTO; |
371 | } | 407 | } |
372 | EXPORT_SYMBOL(ath9k_hw_init); | ||
373 | 408 | ||
374 | static void ath9k_hw_init_defaults(struct ath_hw *ah) | 409 | static void ath9k_hw_init_defaults(struct ath_hw *ah) |
375 | { | 410 | { |
@@ -383,8 +418,6 @@ static void ath9k_hw_init_defaults(struct ath_hw *ah) | |||
383 | ah->hw_version.subvendorid = 0; | 418 | ah->hw_version.subvendorid = 0; |
384 | 419 | ||
385 | ah->ah_flags = 0; | 420 | ah->ah_flags = 0; |
386 | if (ah->hw_version.devid == AR5416_AR9100_DEVID) | ||
387 | ah->hw_version.macVersion = AR_SREV_VERSION_9100; | ||
388 | if (!AR_SREV_9100(ah)) | 421 | if (!AR_SREV_9100(ah)) |
389 | ah->ah_flags = AH_USE_EEPROM; | 422 | ah->ah_flags = AH_USE_EEPROM; |
390 | 423 | ||
@@ -397,44 +430,17 @@ static void ath9k_hw_init_defaults(struct ath_hw *ah) | |||
397 | ah->power_mode = ATH9K_PM_UNDEFINED; | 430 | ah->power_mode = ATH9K_PM_UNDEFINED; |
398 | } | 431 | } |
399 | 432 | ||
400 | static int ath9k_hw_rf_claim(struct ath_hw *ah) | ||
401 | { | ||
402 | u32 val; | ||
403 | |||
404 | REG_WRITE(ah, AR_PHY(0), 0x00000007); | ||
405 | |||
406 | val = ath9k_hw_get_radiorev(ah); | ||
407 | switch (val & AR_RADIO_SREV_MAJOR) { | ||
408 | case 0: | ||
409 | val = AR_RAD5133_SREV_MAJOR; | ||
410 | break; | ||
411 | case AR_RAD5133_SREV_MAJOR: | ||
412 | case AR_RAD5122_SREV_MAJOR: | ||
413 | case AR_RAD2133_SREV_MAJOR: | ||
414 | case AR_RAD2122_SREV_MAJOR: | ||
415 | break; | ||
416 | default: | ||
417 | ath_print(ath9k_hw_common(ah), ATH_DBG_FATAL, | ||
418 | "Radio Chip Rev 0x%02X not supported\n", | ||
419 | val & AR_RADIO_SREV_MAJOR); | ||
420 | return -EOPNOTSUPP; | ||
421 | } | ||
422 | |||
423 | ah->hw_version.analog5GhzRev = val; | ||
424 | |||
425 | return 0; | ||
426 | } | ||
427 | |||
428 | static int ath9k_hw_init_macaddr(struct ath_hw *ah) | 433 | static int ath9k_hw_init_macaddr(struct ath_hw *ah) |
429 | { | 434 | { |
430 | struct ath_common *common = ath9k_hw_common(ah); | 435 | struct ath_common *common = ath9k_hw_common(ah); |
431 | u32 sum; | 436 | u32 sum; |
432 | int i; | 437 | int i; |
433 | u16 eeval; | 438 | u16 eeval; |
439 | u32 EEP_MAC[] = { EEP_MAC_LSW, EEP_MAC_MID, EEP_MAC_MSW }; | ||
434 | 440 | ||
435 | sum = 0; | 441 | sum = 0; |
436 | for (i = 0; i < 3; i++) { | 442 | for (i = 0; i < 3; i++) { |
437 | eeval = ah->eep_ops->get_eeprom(ah, AR_EEPROM_MAC(i)); | 443 | eeval = ah->eep_ops->get_eeprom(ah, EEP_MAC[i]); |
438 | sum += eeval; | 444 | sum += eeval; |
439 | common->macaddr[2 * i] = eeval >> 8; | 445 | common->macaddr[2 * i] = eeval >> 8; |
440 | common->macaddr[2 * i + 1] = eeval & 0xff; | 446 | common->macaddr[2 * i + 1] = eeval & 0xff; |
@@ -445,54 +451,6 @@ static int ath9k_hw_init_macaddr(struct ath_hw *ah) | |||
445 | return 0; | 451 | return 0; |
446 | } | 452 | } |
447 | 453 | ||
448 | static void ath9k_hw_init_rxgain_ini(struct ath_hw *ah) | ||
449 | { | ||
450 | u32 rxgain_type; | ||
451 | |||
452 | if (ah->eep_ops->get_eeprom(ah, EEP_MINOR_REV) >= AR5416_EEP_MINOR_VER_17) { | ||
453 | rxgain_type = ah->eep_ops->get_eeprom(ah, EEP_RXGAIN_TYPE); | ||
454 | |||
455 | if (rxgain_type == AR5416_EEP_RXGAIN_13DB_BACKOFF) | ||
456 | INIT_INI_ARRAY(&ah->iniModesRxGain, | ||
457 | ar9280Modes_backoff_13db_rxgain_9280_2, | ||
458 | ARRAY_SIZE(ar9280Modes_backoff_13db_rxgain_9280_2), 6); | ||
459 | else if (rxgain_type == AR5416_EEP_RXGAIN_23DB_BACKOFF) | ||
460 | INIT_INI_ARRAY(&ah->iniModesRxGain, | ||
461 | ar9280Modes_backoff_23db_rxgain_9280_2, | ||
462 | ARRAY_SIZE(ar9280Modes_backoff_23db_rxgain_9280_2), 6); | ||
463 | else | ||
464 | INIT_INI_ARRAY(&ah->iniModesRxGain, | ||
465 | ar9280Modes_original_rxgain_9280_2, | ||
466 | ARRAY_SIZE(ar9280Modes_original_rxgain_9280_2), 6); | ||
467 | } else { | ||
468 | INIT_INI_ARRAY(&ah->iniModesRxGain, | ||
469 | ar9280Modes_original_rxgain_9280_2, | ||
470 | ARRAY_SIZE(ar9280Modes_original_rxgain_9280_2), 6); | ||
471 | } | ||
472 | } | ||
473 | |||
474 | static void ath9k_hw_init_txgain_ini(struct ath_hw *ah) | ||
475 | { | ||
476 | u32 txgain_type; | ||
477 | |||
478 | if (ah->eep_ops->get_eeprom(ah, EEP_MINOR_REV) >= AR5416_EEP_MINOR_VER_19) { | ||
479 | txgain_type = ah->eep_ops->get_eeprom(ah, EEP_TXGAIN_TYPE); | ||
480 | |||
481 | if (txgain_type == AR5416_EEP_TXGAIN_HIGH_POWER) | ||
482 | INIT_INI_ARRAY(&ah->iniModesTxGain, | ||
483 | ar9280Modes_high_power_tx_gain_9280_2, | ||
484 | ARRAY_SIZE(ar9280Modes_high_power_tx_gain_9280_2), 6); | ||
485 | else | ||
486 | INIT_INI_ARRAY(&ah->iniModesTxGain, | ||
487 | ar9280Modes_original_tx_gain_9280_2, | ||
488 | ARRAY_SIZE(ar9280Modes_original_tx_gain_9280_2), 6); | ||
489 | } else { | ||
490 | INIT_INI_ARRAY(&ah->iniModesTxGain, | ||
491 | ar9280Modes_original_tx_gain_9280_2, | ||
492 | ARRAY_SIZE(ar9280Modes_original_tx_gain_9280_2), 6); | ||
493 | } | ||
494 | } | ||
495 | |||
496 | static int ath9k_hw_post_init(struct ath_hw *ah) | 454 | static int ath9k_hw_post_init(struct ath_hw *ah) |
497 | { | 455 | { |
498 | int ecode; | 456 | int ecode; |
@@ -502,9 +460,11 @@ static int ath9k_hw_post_init(struct ath_hw *ah) | |||
502 | return -ENODEV; | 460 | return -ENODEV; |
503 | } | 461 | } |
504 | 462 | ||
505 | ecode = ath9k_hw_rf_claim(ah); | 463 | if (!AR_SREV_9300_20_OR_LATER(ah)) { |
506 | if (ecode != 0) | 464 | ecode = ar9002_hw_rf_claim(ah); |
507 | return ecode; | 465 | if (ecode != 0) |
466 | return ecode; | ||
467 | } | ||
508 | 468 | ||
509 | ecode = ath9k_hw_eeprom_init(ah); | 469 | ecode = ath9k_hw_eeprom_init(ah); |
510 | if (ecode != 0) | 470 | if (ecode != 0) |
@@ -515,14 +475,12 @@ static int ath9k_hw_post_init(struct ath_hw *ah) | |||
515 | ah->eep_ops->get_eeprom_ver(ah), | 475 | ah->eep_ops->get_eeprom_ver(ah), |
516 | ah->eep_ops->get_eeprom_rev(ah)); | 476 | ah->eep_ops->get_eeprom_rev(ah)); |
517 | 477 | ||
518 | if (!AR_SREV_9280_10_OR_LATER(ah)) { | 478 | ecode = ath9k_hw_rf_alloc_ext_banks(ah); |
519 | ecode = ath9k_hw_rf_alloc_ext_banks(ah); | 479 | if (ecode) { |
520 | if (ecode) { | 480 | ath_print(ath9k_hw_common(ah), ATH_DBG_FATAL, |
521 | ath_print(ath9k_hw_common(ah), ATH_DBG_FATAL, | 481 | "Failed allocating banks for " |
522 | "Failed allocating banks for " | 482 | "external radio\n"); |
523 | "external radio\n"); | 483 | return ecode; |
524 | return ecode; | ||
525 | } | ||
526 | } | 484 | } |
527 | 485 | ||
528 | if (!AR_SREV_9100(ah)) { | 486 | if (!AR_SREV_9100(ah)) { |
@@ -533,344 +491,22 @@ static int ath9k_hw_post_init(struct ath_hw *ah) | |||
533 | return 0; | 491 | return 0; |
534 | } | 492 | } |
535 | 493 | ||
536 | static bool ath9k_hw_devid_supported(u16 devid) | 494 | static void ath9k_hw_attach_ops(struct ath_hw *ah) |
537 | { | ||
538 | switch (devid) { | ||
539 | case AR5416_DEVID_PCI: | ||
540 | case AR5416_DEVID_PCIE: | ||
541 | case AR5416_AR9100_DEVID: | ||
542 | case AR9160_DEVID_PCI: | ||
543 | case AR9280_DEVID_PCI: | ||
544 | case AR9280_DEVID_PCIE: | ||
545 | case AR9285_DEVID_PCIE: | ||
546 | case AR5416_DEVID_AR9287_PCI: | ||
547 | case AR5416_DEVID_AR9287_PCIE: | ||
548 | case AR2427_DEVID_PCIE: | ||
549 | return true; | ||
550 | default: | ||
551 | break; | ||
552 | } | ||
553 | return false; | ||
554 | } | ||
555 | |||
556 | static bool ath9k_hw_macversion_supported(u32 macversion) | ||
557 | { | ||
558 | switch (macversion) { | ||
559 | case AR_SREV_VERSION_5416_PCI: | ||
560 | case AR_SREV_VERSION_5416_PCIE: | ||
561 | case AR_SREV_VERSION_9160: | ||
562 | case AR_SREV_VERSION_9100: | ||
563 | case AR_SREV_VERSION_9280: | ||
564 | case AR_SREV_VERSION_9285: | ||
565 | case AR_SREV_VERSION_9287: | ||
566 | case AR_SREV_VERSION_9271: | ||
567 | return true; | ||
568 | default: | ||
569 | break; | ||
570 | } | ||
571 | return false; | ||
572 | } | ||
573 | |||
574 | static void ath9k_hw_init_cal_settings(struct ath_hw *ah) | ||
575 | { | ||
576 | if (AR_SREV_9160_10_OR_LATER(ah)) { | ||
577 | if (AR_SREV_9280_10_OR_LATER(ah)) { | ||
578 | ah->iq_caldata.calData = &iq_cal_single_sample; | ||
579 | ah->adcgain_caldata.calData = | ||
580 | &adc_gain_cal_single_sample; | ||
581 | ah->adcdc_caldata.calData = | ||
582 | &adc_dc_cal_single_sample; | ||
583 | ah->adcdc_calinitdata.calData = | ||
584 | &adc_init_dc_cal; | ||
585 | } else { | ||
586 | ah->iq_caldata.calData = &iq_cal_multi_sample; | ||
587 | ah->adcgain_caldata.calData = | ||
588 | &adc_gain_cal_multi_sample; | ||
589 | ah->adcdc_caldata.calData = | ||
590 | &adc_dc_cal_multi_sample; | ||
591 | ah->adcdc_calinitdata.calData = | ||
592 | &adc_init_dc_cal; | ||
593 | } | ||
594 | ah->supp_cals = ADC_GAIN_CAL | ADC_DC_CAL | IQ_MISMATCH_CAL; | ||
595 | } | ||
596 | } | ||
597 | |||
598 | static void ath9k_hw_init_mode_regs(struct ath_hw *ah) | ||
599 | { | ||
600 | if (AR_SREV_9271(ah)) { | ||
601 | INIT_INI_ARRAY(&ah->iniModes, ar9271Modes_9271, | ||
602 | ARRAY_SIZE(ar9271Modes_9271), 6); | ||
603 | INIT_INI_ARRAY(&ah->iniCommon, ar9271Common_9271, | ||
604 | ARRAY_SIZE(ar9271Common_9271), 2); | ||
605 | INIT_INI_ARRAY(&ah->iniCommon_normal_cck_fir_coeff_9271, | ||
606 | ar9271Common_normal_cck_fir_coeff_9271, | ||
607 | ARRAY_SIZE(ar9271Common_normal_cck_fir_coeff_9271), 2); | ||
608 | INIT_INI_ARRAY(&ah->iniCommon_japan_2484_cck_fir_coeff_9271, | ||
609 | ar9271Common_japan_2484_cck_fir_coeff_9271, | ||
610 | ARRAY_SIZE(ar9271Common_japan_2484_cck_fir_coeff_9271), 2); | ||
611 | INIT_INI_ARRAY(&ah->iniModes_9271_1_0_only, | ||
612 | ar9271Modes_9271_1_0_only, | ||
613 | ARRAY_SIZE(ar9271Modes_9271_1_0_only), 6); | ||
614 | INIT_INI_ARRAY(&ah->iniModes_9271_ANI_reg, ar9271Modes_9271_ANI_reg, | ||
615 | ARRAY_SIZE(ar9271Modes_9271_ANI_reg), 6); | ||
616 | INIT_INI_ARRAY(&ah->iniModes_high_power_tx_gain_9271, | ||
617 | ar9271Modes_high_power_tx_gain_9271, | ||
618 | ARRAY_SIZE(ar9271Modes_high_power_tx_gain_9271), 6); | ||
619 | INIT_INI_ARRAY(&ah->iniModes_normal_power_tx_gain_9271, | ||
620 | ar9271Modes_normal_power_tx_gain_9271, | ||
621 | ARRAY_SIZE(ar9271Modes_normal_power_tx_gain_9271), 6); | ||
622 | return; | ||
623 | } | ||
624 | |||
625 | if (AR_SREV_9287_11_OR_LATER(ah)) { | ||
626 | INIT_INI_ARRAY(&ah->iniModes, ar9287Modes_9287_1_1, | ||
627 | ARRAY_SIZE(ar9287Modes_9287_1_1), 6); | ||
628 | INIT_INI_ARRAY(&ah->iniCommon, ar9287Common_9287_1_1, | ||
629 | ARRAY_SIZE(ar9287Common_9287_1_1), 2); | ||
630 | if (ah->config.pcie_clock_req) | ||
631 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | ||
632 | ar9287PciePhy_clkreq_off_L1_9287_1_1, | ||
633 | ARRAY_SIZE(ar9287PciePhy_clkreq_off_L1_9287_1_1), 2); | ||
634 | else | ||
635 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | ||
636 | ar9287PciePhy_clkreq_always_on_L1_9287_1_1, | ||
637 | ARRAY_SIZE(ar9287PciePhy_clkreq_always_on_L1_9287_1_1), | ||
638 | 2); | ||
639 | } else if (AR_SREV_9287_10_OR_LATER(ah)) { | ||
640 | INIT_INI_ARRAY(&ah->iniModes, ar9287Modes_9287_1_0, | ||
641 | ARRAY_SIZE(ar9287Modes_9287_1_0), 6); | ||
642 | INIT_INI_ARRAY(&ah->iniCommon, ar9287Common_9287_1_0, | ||
643 | ARRAY_SIZE(ar9287Common_9287_1_0), 2); | ||
644 | |||
645 | if (ah->config.pcie_clock_req) | ||
646 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | ||
647 | ar9287PciePhy_clkreq_off_L1_9287_1_0, | ||
648 | ARRAY_SIZE(ar9287PciePhy_clkreq_off_L1_9287_1_0), 2); | ||
649 | else | ||
650 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | ||
651 | ar9287PciePhy_clkreq_always_on_L1_9287_1_0, | ||
652 | ARRAY_SIZE(ar9287PciePhy_clkreq_always_on_L1_9287_1_0), | ||
653 | 2); | ||
654 | } else if (AR_SREV_9285_12_OR_LATER(ah)) { | ||
655 | |||
656 | |||
657 | INIT_INI_ARRAY(&ah->iniModes, ar9285Modes_9285_1_2, | ||
658 | ARRAY_SIZE(ar9285Modes_9285_1_2), 6); | ||
659 | INIT_INI_ARRAY(&ah->iniCommon, ar9285Common_9285_1_2, | ||
660 | ARRAY_SIZE(ar9285Common_9285_1_2), 2); | ||
661 | |||
662 | if (ah->config.pcie_clock_req) { | ||
663 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | ||
664 | ar9285PciePhy_clkreq_off_L1_9285_1_2, | ||
665 | ARRAY_SIZE(ar9285PciePhy_clkreq_off_L1_9285_1_2), 2); | ||
666 | } else { | ||
667 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | ||
668 | ar9285PciePhy_clkreq_always_on_L1_9285_1_2, | ||
669 | ARRAY_SIZE(ar9285PciePhy_clkreq_always_on_L1_9285_1_2), | ||
670 | 2); | ||
671 | } | ||
672 | } else if (AR_SREV_9285_10_OR_LATER(ah)) { | ||
673 | INIT_INI_ARRAY(&ah->iniModes, ar9285Modes_9285, | ||
674 | ARRAY_SIZE(ar9285Modes_9285), 6); | ||
675 | INIT_INI_ARRAY(&ah->iniCommon, ar9285Common_9285, | ||
676 | ARRAY_SIZE(ar9285Common_9285), 2); | ||
677 | |||
678 | if (ah->config.pcie_clock_req) { | ||
679 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | ||
680 | ar9285PciePhy_clkreq_off_L1_9285, | ||
681 | ARRAY_SIZE(ar9285PciePhy_clkreq_off_L1_9285), 2); | ||
682 | } else { | ||
683 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | ||
684 | ar9285PciePhy_clkreq_always_on_L1_9285, | ||
685 | ARRAY_SIZE(ar9285PciePhy_clkreq_always_on_L1_9285), 2); | ||
686 | } | ||
687 | } else if (AR_SREV_9280_20_OR_LATER(ah)) { | ||
688 | INIT_INI_ARRAY(&ah->iniModes, ar9280Modes_9280_2, | ||
689 | ARRAY_SIZE(ar9280Modes_9280_2), 6); | ||
690 | INIT_INI_ARRAY(&ah->iniCommon, ar9280Common_9280_2, | ||
691 | ARRAY_SIZE(ar9280Common_9280_2), 2); | ||
692 | |||
693 | if (ah->config.pcie_clock_req) { | ||
694 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | ||
695 | ar9280PciePhy_clkreq_off_L1_9280, | ||
696 | ARRAY_SIZE(ar9280PciePhy_clkreq_off_L1_9280),2); | ||
697 | } else { | ||
698 | INIT_INI_ARRAY(&ah->iniPcieSerdes, | ||
699 | ar9280PciePhy_clkreq_always_on_L1_9280, | ||
700 | ARRAY_SIZE(ar9280PciePhy_clkreq_always_on_L1_9280), 2); | ||
701 | } | ||
702 | INIT_INI_ARRAY(&ah->iniModesAdditional, | ||
703 | ar9280Modes_fast_clock_9280_2, | ||
704 | ARRAY_SIZE(ar9280Modes_fast_clock_9280_2), 3); | ||
705 | } else if (AR_SREV_9280_10_OR_LATER(ah)) { | ||
706 | INIT_INI_ARRAY(&ah->iniModes, ar9280Modes_9280, | ||
707 | ARRAY_SIZE(ar9280Modes_9280), 6); | ||
708 | INIT_INI_ARRAY(&ah->iniCommon, ar9280Common_9280, | ||
709 | ARRAY_SIZE(ar9280Common_9280), 2); | ||
710 | } else if (AR_SREV_9160_10_OR_LATER(ah)) { | ||
711 | INIT_INI_ARRAY(&ah->iniModes, ar5416Modes_9160, | ||
712 | ARRAY_SIZE(ar5416Modes_9160), 6); | ||
713 | INIT_INI_ARRAY(&ah->iniCommon, ar5416Common_9160, | ||
714 | ARRAY_SIZE(ar5416Common_9160), 2); | ||
715 | INIT_INI_ARRAY(&ah->iniBank0, ar5416Bank0_9160, | ||
716 | ARRAY_SIZE(ar5416Bank0_9160), 2); | ||
717 | INIT_INI_ARRAY(&ah->iniBB_RfGain, ar5416BB_RfGain_9160, | ||
718 | ARRAY_SIZE(ar5416BB_RfGain_9160), 3); | ||
719 | INIT_INI_ARRAY(&ah->iniBank1, ar5416Bank1_9160, | ||
720 | ARRAY_SIZE(ar5416Bank1_9160), 2); | ||
721 | INIT_INI_ARRAY(&ah->iniBank2, ar5416Bank2_9160, | ||
722 | ARRAY_SIZE(ar5416Bank2_9160), 2); | ||
723 | INIT_INI_ARRAY(&ah->iniBank3, ar5416Bank3_9160, | ||
724 | ARRAY_SIZE(ar5416Bank3_9160), 3); | ||
725 | INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6_9160, | ||
726 | ARRAY_SIZE(ar5416Bank6_9160), 3); | ||
727 | INIT_INI_ARRAY(&ah->iniBank6TPC, ar5416Bank6TPC_9160, | ||
728 | ARRAY_SIZE(ar5416Bank6TPC_9160), 3); | ||
729 | INIT_INI_ARRAY(&ah->iniBank7, ar5416Bank7_9160, | ||
730 | ARRAY_SIZE(ar5416Bank7_9160), 2); | ||
731 | if (AR_SREV_9160_11(ah)) { | ||
732 | INIT_INI_ARRAY(&ah->iniAddac, | ||
733 | ar5416Addac_91601_1, | ||
734 | ARRAY_SIZE(ar5416Addac_91601_1), 2); | ||
735 | } else { | ||
736 | INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac_9160, | ||
737 | ARRAY_SIZE(ar5416Addac_9160), 2); | ||
738 | } | ||
739 | } else if (AR_SREV_9100_OR_LATER(ah)) { | ||
740 | INIT_INI_ARRAY(&ah->iniModes, ar5416Modes_9100, | ||
741 | ARRAY_SIZE(ar5416Modes_9100), 6); | ||
742 | INIT_INI_ARRAY(&ah->iniCommon, ar5416Common_9100, | ||
743 | ARRAY_SIZE(ar5416Common_9100), 2); | ||
744 | INIT_INI_ARRAY(&ah->iniBank0, ar5416Bank0_9100, | ||
745 | ARRAY_SIZE(ar5416Bank0_9100), 2); | ||
746 | INIT_INI_ARRAY(&ah->iniBB_RfGain, ar5416BB_RfGain_9100, | ||
747 | ARRAY_SIZE(ar5416BB_RfGain_9100), 3); | ||
748 | INIT_INI_ARRAY(&ah->iniBank1, ar5416Bank1_9100, | ||
749 | ARRAY_SIZE(ar5416Bank1_9100), 2); | ||
750 | INIT_INI_ARRAY(&ah->iniBank2, ar5416Bank2_9100, | ||
751 | ARRAY_SIZE(ar5416Bank2_9100), 2); | ||
752 | INIT_INI_ARRAY(&ah->iniBank3, ar5416Bank3_9100, | ||
753 | ARRAY_SIZE(ar5416Bank3_9100), 3); | ||
754 | INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6_9100, | ||
755 | ARRAY_SIZE(ar5416Bank6_9100), 3); | ||
756 | INIT_INI_ARRAY(&ah->iniBank6TPC, ar5416Bank6TPC_9100, | ||
757 | ARRAY_SIZE(ar5416Bank6TPC_9100), 3); | ||
758 | INIT_INI_ARRAY(&ah->iniBank7, ar5416Bank7_9100, | ||
759 | ARRAY_SIZE(ar5416Bank7_9100), 2); | ||
760 | INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac_9100, | ||
761 | ARRAY_SIZE(ar5416Addac_9100), 2); | ||
762 | } else { | ||
763 | INIT_INI_ARRAY(&ah->iniModes, ar5416Modes, | ||
764 | ARRAY_SIZE(ar5416Modes), 6); | ||
765 | INIT_INI_ARRAY(&ah->iniCommon, ar5416Common, | ||
766 | ARRAY_SIZE(ar5416Common), 2); | ||
767 | INIT_INI_ARRAY(&ah->iniBank0, ar5416Bank0, | ||
768 | ARRAY_SIZE(ar5416Bank0), 2); | ||
769 | INIT_INI_ARRAY(&ah->iniBB_RfGain, ar5416BB_RfGain, | ||
770 | ARRAY_SIZE(ar5416BB_RfGain), 3); | ||
771 | INIT_INI_ARRAY(&ah->iniBank1, ar5416Bank1, | ||
772 | ARRAY_SIZE(ar5416Bank1), 2); | ||
773 | INIT_INI_ARRAY(&ah->iniBank2, ar5416Bank2, | ||
774 | ARRAY_SIZE(ar5416Bank2), 2); | ||
775 | INIT_INI_ARRAY(&ah->iniBank3, ar5416Bank3, | ||
776 | ARRAY_SIZE(ar5416Bank3), 3); | ||
777 | INIT_INI_ARRAY(&ah->iniBank6, ar5416Bank6, | ||
778 | ARRAY_SIZE(ar5416Bank6), 3); | ||
779 | INIT_INI_ARRAY(&ah->iniBank6TPC, ar5416Bank6TPC, | ||
780 | ARRAY_SIZE(ar5416Bank6TPC), 3); | ||
781 | INIT_INI_ARRAY(&ah->iniBank7, ar5416Bank7, | ||
782 | ARRAY_SIZE(ar5416Bank7), 2); | ||
783 | INIT_INI_ARRAY(&ah->iniAddac, ar5416Addac, | ||
784 | ARRAY_SIZE(ar5416Addac), 2); | ||
785 | } | ||
786 | } | ||
787 | |||
788 | static void ath9k_hw_init_mode_gain_regs(struct ath_hw *ah) | ||
789 | { | ||
790 | if (AR_SREV_9287_11_OR_LATER(ah)) | ||
791 | INIT_INI_ARRAY(&ah->iniModesRxGain, | ||
792 | ar9287Modes_rx_gain_9287_1_1, | ||
793 | ARRAY_SIZE(ar9287Modes_rx_gain_9287_1_1), 6); | ||
794 | else if (AR_SREV_9287_10(ah)) | ||
795 | INIT_INI_ARRAY(&ah->iniModesRxGain, | ||
796 | ar9287Modes_rx_gain_9287_1_0, | ||
797 | ARRAY_SIZE(ar9287Modes_rx_gain_9287_1_0), 6); | ||
798 | else if (AR_SREV_9280_20(ah)) | ||
799 | ath9k_hw_init_rxgain_ini(ah); | ||
800 | |||
801 | if (AR_SREV_9287_11_OR_LATER(ah)) { | ||
802 | INIT_INI_ARRAY(&ah->iniModesTxGain, | ||
803 | ar9287Modes_tx_gain_9287_1_1, | ||
804 | ARRAY_SIZE(ar9287Modes_tx_gain_9287_1_1), 6); | ||
805 | } else if (AR_SREV_9287_10(ah)) { | ||
806 | INIT_INI_ARRAY(&ah->iniModesTxGain, | ||
807 | ar9287Modes_tx_gain_9287_1_0, | ||
808 | ARRAY_SIZE(ar9287Modes_tx_gain_9287_1_0), 6); | ||
809 | } else if (AR_SREV_9280_20(ah)) { | ||
810 | ath9k_hw_init_txgain_ini(ah); | ||
811 | } else if (AR_SREV_9285_12_OR_LATER(ah)) { | ||
812 | u32 txgain_type = ah->eep_ops->get_eeprom(ah, EEP_TXGAIN_TYPE); | ||
813 | |||
814 | /* txgain table */ | ||
815 | if (txgain_type == AR5416_EEP_TXGAIN_HIGH_POWER) { | ||
816 | if (AR_SREV_9285E_20(ah)) { | ||
817 | INIT_INI_ARRAY(&ah->iniModesTxGain, | ||
818 | ar9285Modes_XE2_0_high_power, | ||
819 | ARRAY_SIZE( | ||
820 | ar9285Modes_XE2_0_high_power), 6); | ||
821 | } else { | ||
822 | INIT_INI_ARRAY(&ah->iniModesTxGain, | ||
823 | ar9285Modes_high_power_tx_gain_9285_1_2, | ||
824 | ARRAY_SIZE( | ||
825 | ar9285Modes_high_power_tx_gain_9285_1_2), 6); | ||
826 | } | ||
827 | } else { | ||
828 | if (AR_SREV_9285E_20(ah)) { | ||
829 | INIT_INI_ARRAY(&ah->iniModesTxGain, | ||
830 | ar9285Modes_XE2_0_normal_power, | ||
831 | ARRAY_SIZE( | ||
832 | ar9285Modes_XE2_0_normal_power), 6); | ||
833 | } else { | ||
834 | INIT_INI_ARRAY(&ah->iniModesTxGain, | ||
835 | ar9285Modes_original_tx_gain_9285_1_2, | ||
836 | ARRAY_SIZE( | ||
837 | ar9285Modes_original_tx_gain_9285_1_2), 6); | ||
838 | } | ||
839 | } | ||
840 | } | ||
841 | } | ||
842 | |||
843 | static void ath9k_hw_init_eeprom_fix(struct ath_hw *ah) | ||
844 | { | 495 | { |
845 | struct base_eep_header *pBase = &(ah->eeprom.def.baseEepHeader); | 496 | if (AR_SREV_9300_20_OR_LATER(ah)) |
846 | struct ath_common *common = ath9k_hw_common(ah); | 497 | ar9003_hw_attach_ops(ah); |
847 | 498 | else | |
848 | ah->need_an_top2_fixup = (ah->hw_version.devid == AR9280_DEVID_PCI) && | 499 | ar9002_hw_attach_ops(ah); |
849 | (ah->eep_map != EEP_MAP_4KBITS) && | ||
850 | ((pBase->version & 0xff) > 0x0a) && | ||
851 | (pBase->pwdclkind == 0); | ||
852 | |||
853 | if (ah->need_an_top2_fixup) | ||
854 | ath_print(common, ATH_DBG_EEPROM, | ||
855 | "needs fixup for AR_AN_TOP2 register\n"); | ||
856 | } | 500 | } |
857 | 501 | ||
858 | int ath9k_hw_init(struct ath_hw *ah) | 502 | /* Called for all hardware families */ |
503 | static int __ath9k_hw_init(struct ath_hw *ah) | ||
859 | { | 504 | { |
860 | struct ath_common *common = ath9k_hw_common(ah); | 505 | struct ath_common *common = ath9k_hw_common(ah); |
861 | int r = 0; | 506 | int r = 0; |
862 | 507 | ||
863 | if (common->bus_ops->ath_bus_type != ATH_USB) { | 508 | if (ah->hw_version.devid == AR5416_AR9100_DEVID) |
864 | if (!ath9k_hw_devid_supported(ah->hw_version.devid)) { | 509 | ah->hw_version.macVersion = AR_SREV_VERSION_9100; |
865 | ath_print(common, ATH_DBG_FATAL, | ||
866 | "Unsupported device ID: 0x%0x\n", | ||
867 | ah->hw_version.devid); | ||
868 | return -EOPNOTSUPP; | ||
869 | } | ||
870 | } | ||
871 | |||
872 | ath9k_hw_init_defaults(ah); | ||
873 | ath9k_hw_init_config(ah); | ||
874 | 510 | ||
875 | if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON)) { | 511 | if (!ath9k_hw_set_reset_reg(ah, ATH9K_RESET_POWER_ON)) { |
876 | ath_print(common, ATH_DBG_FATAL, | 512 | ath_print(common, ATH_DBG_FATAL, |
@@ -878,6 +514,11 @@ int ath9k_hw_init(struct ath_hw *ah) | |||
878 | return -EIO; | 514 | return -EIO; |
879 | } | 515 | } |
880 | 516 | ||
517 | ath9k_hw_init_defaults(ah); | ||
518 | ath9k_hw_init_config(ah); | ||
519 | |||
520 | ath9k_hw_attach_ops(ah); | ||
521 | |||
881 | if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE)) { | 522 | if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE)) { |
882 | ath_print(common, ATH_DBG_FATAL, "Couldn't wakeup chip\n"); | 523 | ath_print(common, ATH_DBG_FATAL, "Couldn't wakeup chip\n"); |
883 | return -EIO; | 524 | return -EIO; |
@@ -902,7 +543,7 @@ int ath9k_hw_init(struct ath_hw *ah) | |||
902 | else | 543 | else |
903 | ah->config.max_txtrig_level = MAX_TX_FIFO_THRESHOLD; | 544 | ah->config.max_txtrig_level = MAX_TX_FIFO_THRESHOLD; |
904 | 545 | ||
905 | if (!ath9k_hw_macversion_supported(ah->hw_version.macVersion)) { | 546 | if (!ath9k_hw_macversion_supported(ah)) { |
906 | ath_print(common, ATH_DBG_FATAL, | 547 | ath_print(common, ATH_DBG_FATAL, |
907 | "Mac Chip Rev 0x%02x.%x is not supported by " | 548 | "Mac Chip Rev 0x%02x.%x is not supported by " |
908 | "this driver\n", ah->hw_version.macVersion, | 549 | "this driver\n", ah->hw_version.macVersion, |
@@ -910,28 +551,15 @@ int ath9k_hw_init(struct ath_hw *ah) | |||
910 | return -EOPNOTSUPP; | 551 | return -EOPNOTSUPP; |
911 | } | 552 | } |
912 | 553 | ||
913 | if (AR_SREV_9100(ah)) { | 554 | if (AR_SREV_9271(ah) || AR_SREV_9100(ah)) |
914 | ah->iq_caldata.calData = &iq_cal_multi_sample; | ||
915 | ah->supp_cals = IQ_MISMATCH_CAL; | ||
916 | ah->is_pciexpress = false; | ||
917 | } | ||
918 | |||
919 | if (AR_SREV_9271(ah)) | ||
920 | ah->is_pciexpress = false; | 555 | ah->is_pciexpress = false; |
921 | 556 | ||
922 | ah->hw_version.phyRev = REG_READ(ah, AR_PHY_CHIP_ID); | 557 | ah->hw_version.phyRev = REG_READ(ah, AR_PHY_CHIP_ID); |
923 | |||
924 | ath9k_hw_init_cal_settings(ah); | 558 | ath9k_hw_init_cal_settings(ah); |
925 | 559 | ||
926 | ah->ani_function = ATH9K_ANI_ALL; | 560 | ah->ani_function = ATH9K_ANI_ALL; |
927 | if (AR_SREV_9280_10_OR_LATER(ah)) { | 561 | if (AR_SREV_9280_10_OR_LATER(ah) && !AR_SREV_9300_20_OR_LATER(ah)) |
928 | ah->ani_function &= ~ATH9K_ANI_NOISE_IMMUNITY_LEVEL; | 562 | ah->ani_function &= ~ATH9K_ANI_NOISE_IMMUNITY_LEVEL; |
929 | ah->ath9k_hw_rf_set_freq = &ath9k_hw_ar9280_set_channel; | ||
930 | ah->ath9k_hw_spur_mitigate_freq = &ath9k_hw_9280_spur_mitigate; | ||
931 | } else { | ||
932 | ah->ath9k_hw_rf_set_freq = &ath9k_hw_set_channel; | ||
933 | ah->ath9k_hw_spur_mitigate_freq = &ath9k_hw_spur_mitigate; | ||
934 | } | ||
935 | 563 | ||
936 | ath9k_hw_init_mode_regs(ah); | 564 | ath9k_hw_init_mode_regs(ah); |
937 | 565 | ||
@@ -940,15 +568,8 @@ int ath9k_hw_init(struct ath_hw *ah) | |||
940 | else | 568 | else |
941 | ath9k_hw_disablepcie(ah); | 569 | ath9k_hw_disablepcie(ah); |
942 | 570 | ||
943 | /* Support for Japan ch.14 (2484) spread */ | 571 | if (!AR_SREV_9300_20_OR_LATER(ah)) |
944 | if (AR_SREV_9287_11_OR_LATER(ah)) { | 572 | ar9002_hw_cck_chan14_spread(ah); |
945 | INIT_INI_ARRAY(&ah->iniCckfirNormal, | ||
946 | ar9287Common_normal_cck_fir_coeff_92871_1, | ||
947 | ARRAY_SIZE(ar9287Common_normal_cck_fir_coeff_92871_1), 2); | ||
948 | INIT_INI_ARRAY(&ah->iniCckfirJapan2484, | ||
949 | ar9287Common_japan_2484_cck_fir_coeff_92871_1, | ||
950 | ARRAY_SIZE(ar9287Common_japan_2484_cck_fir_coeff_92871_1), 2); | ||
951 | } | ||
952 | 573 | ||
953 | r = ath9k_hw_post_init(ah); | 574 | r = ath9k_hw_post_init(ah); |
954 | if (r) | 575 | if (r) |
@@ -959,8 +580,6 @@ int ath9k_hw_init(struct ath_hw *ah) | |||
959 | if (r) | 580 | if (r) |
960 | return r; | 581 | return r; |
961 | 582 | ||
962 | ath9k_hw_init_eeprom_fix(ah); | ||
963 | |||
964 | r = ath9k_hw_init_macaddr(ah); | 583 | r = ath9k_hw_init_macaddr(ah); |
965 | if (r) { | 584 | if (r) { |
966 | ath_print(common, ATH_DBG_FATAL, | 585 | ath_print(common, ATH_DBG_FATAL, |
@@ -973,6 +592,9 @@ int ath9k_hw_init(struct ath_hw *ah) | |||
973 | else | 592 | else |
974 | ah->tx_trig_level = (AR_FTRIG_512B >> AR_FTRIG_S); | 593 | ah->tx_trig_level = (AR_FTRIG_512B >> AR_FTRIG_S); |
975 | 594 | ||
595 | if (AR_SREV_9300_20_OR_LATER(ah)) | ||
596 | ar9003_hw_set_nf_limits(ah); | ||
597 | |||
976 | ath9k_init_nfcal_hist_buffer(ah); | 598 | ath9k_init_nfcal_hist_buffer(ah); |
977 | 599 | ||
978 | common->state = ATH_HW_INITIALIZED; | 600 | common->state = ATH_HW_INITIALIZED; |
@@ -980,24 +602,50 @@ int ath9k_hw_init(struct ath_hw *ah) | |||
980 | return 0; | 602 | return 0; |
981 | } | 603 | } |
982 | 604 | ||
983 | static void ath9k_hw_init_bb(struct ath_hw *ah, | 605 | int ath9k_hw_init(struct ath_hw *ah) |
984 | struct ath9k_channel *chan) | ||
985 | { | 606 | { |
986 | u32 synthDelay; | 607 | int ret; |
608 | struct ath_common *common = ath9k_hw_common(ah); | ||
987 | 609 | ||
988 | synthDelay = REG_READ(ah, AR_PHY_RX_DELAY) & AR_PHY_RX_DELAY_DELAY; | 610 | /* These are all the AR5008/AR9001/AR9002 hardware family of chipsets */ |
989 | if (IS_CHAN_B(chan)) | 611 | switch (ah->hw_version.devid) { |
990 | synthDelay = (4 * synthDelay) / 22; | 612 | case AR5416_DEVID_PCI: |
991 | else | 613 | case AR5416_DEVID_PCIE: |
992 | synthDelay /= 10; | 614 | case AR5416_AR9100_DEVID: |
615 | case AR9160_DEVID_PCI: | ||
616 | case AR9280_DEVID_PCI: | ||
617 | case AR9280_DEVID_PCIE: | ||
618 | case AR9285_DEVID_PCIE: | ||
619 | case AR9287_DEVID_PCI: | ||
620 | case AR9287_DEVID_PCIE: | ||
621 | case AR2427_DEVID_PCIE: | ||
622 | case AR9300_DEVID_PCIE: | ||
623 | break; | ||
624 | default: | ||
625 | if (common->bus_ops->ath_bus_type == ATH_USB) | ||
626 | break; | ||
627 | ath_print(common, ATH_DBG_FATAL, | ||
628 | "Hardware device ID 0x%04x not supported\n", | ||
629 | ah->hw_version.devid); | ||
630 | return -EOPNOTSUPP; | ||
631 | } | ||
993 | 632 | ||
994 | REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_EN); | 633 | ret = __ath9k_hw_init(ah); |
634 | if (ret) { | ||
635 | ath_print(common, ATH_DBG_FATAL, | ||
636 | "Unable to initialize hardware; " | ||
637 | "initialization status: %d\n", ret); | ||
638 | return ret; | ||
639 | } | ||
995 | 640 | ||
996 | udelay(synthDelay + BASE_ACTIVATE_DELAY); | 641 | return 0; |
997 | } | 642 | } |
643 | EXPORT_SYMBOL(ath9k_hw_init); | ||
998 | 644 | ||
999 | static void ath9k_hw_init_qos(struct ath_hw *ah) | 645 | static void ath9k_hw_init_qos(struct ath_hw *ah) |
1000 | { | 646 | { |
647 | ENABLE_REGWRITE_BUFFER(ah); | ||
648 | |||
1001 | REG_WRITE(ah, AR_MIC_QOS_CONTROL, 0x100aa); | 649 | REG_WRITE(ah, AR_MIC_QOS_CONTROL, 0x100aa); |
1002 | REG_WRITE(ah, AR_MIC_QOS_SELECT, 0x3210); | 650 | REG_WRITE(ah, AR_MIC_QOS_SELECT, 0x3210); |
1003 | 651 | ||
@@ -1011,69 +659,16 @@ static void ath9k_hw_init_qos(struct ath_hw *ah) | |||
1011 | REG_WRITE(ah, AR_TXOP_4_7, 0xFFFFFFFF); | 659 | REG_WRITE(ah, AR_TXOP_4_7, 0xFFFFFFFF); |
1012 | REG_WRITE(ah, AR_TXOP_8_11, 0xFFFFFFFF); | 660 | REG_WRITE(ah, AR_TXOP_8_11, 0xFFFFFFFF); |
1013 | REG_WRITE(ah, AR_TXOP_12_15, 0xFFFFFFFF); | 661 | REG_WRITE(ah, AR_TXOP_12_15, 0xFFFFFFFF); |
662 | |||
663 | REGWRITE_BUFFER_FLUSH(ah); | ||
664 | DISABLE_REGWRITE_BUFFER(ah); | ||
1014 | } | 665 | } |
1015 | 666 | ||
1016 | static void ath9k_hw_init_pll(struct ath_hw *ah, | 667 | static void ath9k_hw_init_pll(struct ath_hw *ah, |
1017 | struct ath9k_channel *chan) | 668 | struct ath9k_channel *chan) |
1018 | { | 669 | { |
1019 | u32 pll; | 670 | u32 pll = ath9k_hw_compute_pll_control(ah, chan); |
1020 | |||
1021 | if (AR_SREV_9100(ah)) { | ||
1022 | if (chan && IS_CHAN_5GHZ(chan)) | ||
1023 | pll = 0x1450; | ||
1024 | else | ||
1025 | pll = 0x1458; | ||
1026 | } else { | ||
1027 | if (AR_SREV_9280_10_OR_LATER(ah)) { | ||
1028 | pll = SM(0x5, AR_RTC_9160_PLL_REFDIV); | ||
1029 | |||
1030 | if (chan && IS_CHAN_HALF_RATE(chan)) | ||
1031 | pll |= SM(0x1, AR_RTC_9160_PLL_CLKSEL); | ||
1032 | else if (chan && IS_CHAN_QUARTER_RATE(chan)) | ||
1033 | pll |= SM(0x2, AR_RTC_9160_PLL_CLKSEL); | ||
1034 | |||
1035 | if (chan && IS_CHAN_5GHZ(chan)) { | ||
1036 | pll |= SM(0x28, AR_RTC_9160_PLL_DIV); | ||
1037 | |||
1038 | |||
1039 | if (AR_SREV_9280_20(ah)) { | ||
1040 | if (((chan->channel % 20) == 0) | ||
1041 | || ((chan->channel % 10) == 0)) | ||
1042 | pll = 0x2850; | ||
1043 | else | ||
1044 | pll = 0x142c; | ||
1045 | } | ||
1046 | } else { | ||
1047 | pll |= SM(0x2c, AR_RTC_9160_PLL_DIV); | ||
1048 | } | ||
1049 | 671 | ||
1050 | } else if (AR_SREV_9160_10_OR_LATER(ah)) { | ||
1051 | |||
1052 | pll = SM(0x5, AR_RTC_9160_PLL_REFDIV); | ||
1053 | |||
1054 | if (chan && IS_CHAN_HALF_RATE(chan)) | ||
1055 | pll |= SM(0x1, AR_RTC_9160_PLL_CLKSEL); | ||
1056 | else if (chan && IS_CHAN_QUARTER_RATE(chan)) | ||
1057 | pll |= SM(0x2, AR_RTC_9160_PLL_CLKSEL); | ||
1058 | |||
1059 | if (chan && IS_CHAN_5GHZ(chan)) | ||
1060 | pll |= SM(0x50, AR_RTC_9160_PLL_DIV); | ||
1061 | else | ||
1062 | pll |= SM(0x58, AR_RTC_9160_PLL_DIV); | ||
1063 | } else { | ||
1064 | pll = AR_RTC_PLL_REFDIV_5 | AR_RTC_PLL_DIV2; | ||
1065 | |||
1066 | if (chan && IS_CHAN_HALF_RATE(chan)) | ||
1067 | pll |= SM(0x1, AR_RTC_PLL_CLKSEL); | ||
1068 | else if (chan && IS_CHAN_QUARTER_RATE(chan)) | ||
1069 | pll |= SM(0x2, AR_RTC_PLL_CLKSEL); | ||
1070 | |||
1071 | if (chan && IS_CHAN_5GHZ(chan)) | ||
1072 | pll |= SM(0xa, AR_RTC_PLL_DIV); | ||
1073 | else | ||
1074 | pll |= SM(0xb, AR_RTC_PLL_DIV); | ||
1075 | } | ||
1076 | } | ||
1077 | REG_WRITE(ah, AR_RTC_PLL_CONTROL, pll); | 672 | REG_WRITE(ah, AR_RTC_PLL_CONTROL, pll); |
1078 | 673 | ||
1079 | /* Switch the core clock for ar9271 to 117Mhz */ | 674 | /* Switch the core clock for ar9271 to 117Mhz */ |
@@ -1087,43 +682,6 @@ static void ath9k_hw_init_pll(struct ath_hw *ah, | |||
1087 | REG_WRITE(ah, AR_RTC_SLEEP_CLK, AR_RTC_FORCE_DERIVED_CLK); | 682 | REG_WRITE(ah, AR_RTC_SLEEP_CLK, AR_RTC_FORCE_DERIVED_CLK); |
1088 | } | 683 | } |
1089 | 684 | ||
1090 | static void ath9k_hw_init_chain_masks(struct ath_hw *ah) | ||
1091 | { | ||
1092 | int rx_chainmask, tx_chainmask; | ||
1093 | |||
1094 | rx_chainmask = ah->rxchainmask; | ||
1095 | tx_chainmask = ah->txchainmask; | ||
1096 | |||
1097 | switch (rx_chainmask) { | ||
1098 | case 0x5: | ||
1099 | REG_SET_BIT(ah, AR_PHY_ANALOG_SWAP, | ||
1100 | AR_PHY_SWAP_ALT_CHAIN); | ||
1101 | case 0x3: | ||
1102 | if (ah->hw_version.macVersion == AR_SREV_REVISION_5416_10) { | ||
1103 | REG_WRITE(ah, AR_PHY_RX_CHAINMASK, 0x7); | ||
1104 | REG_WRITE(ah, AR_PHY_CAL_CHAINMASK, 0x7); | ||
1105 | break; | ||
1106 | } | ||
1107 | case 0x1: | ||
1108 | case 0x2: | ||
1109 | case 0x7: | ||
1110 | REG_WRITE(ah, AR_PHY_RX_CHAINMASK, rx_chainmask); | ||
1111 | REG_WRITE(ah, AR_PHY_CAL_CHAINMASK, rx_chainmask); | ||
1112 | break; | ||
1113 | default: | ||
1114 | break; | ||
1115 | } | ||
1116 | |||
1117 | REG_WRITE(ah, AR_SELFGEN_MASK, tx_chainmask); | ||
1118 | if (tx_chainmask == 0x5) { | ||
1119 | REG_SET_BIT(ah, AR_PHY_ANALOG_SWAP, | ||
1120 | AR_PHY_SWAP_ALT_CHAIN); | ||
1121 | } | ||
1122 | if (AR_SREV_9100(ah)) | ||
1123 | REG_WRITE(ah, AR_PHY_ANALOG_SWAP, | ||
1124 | REG_READ(ah, AR_PHY_ANALOG_SWAP) | 0x00000001); | ||
1125 | } | ||
1126 | |||
1127 | static void ath9k_hw_init_interrupt_masks(struct ath_hw *ah, | 685 | static void ath9k_hw_init_interrupt_masks(struct ath_hw *ah, |
1128 | enum nl80211_iftype opmode) | 686 | enum nl80211_iftype opmode) |
1129 | { | 687 | { |
@@ -1133,16 +691,30 @@ static void ath9k_hw_init_interrupt_masks(struct ath_hw *ah, | |||
1133 | AR_IMR_RXORN | | 691 | AR_IMR_RXORN | |
1134 | AR_IMR_BCNMISC; | 692 | AR_IMR_BCNMISC; |
1135 | 693 | ||
1136 | if (ah->config.rx_intr_mitigation) | 694 | if (AR_SREV_9300_20_OR_LATER(ah)) { |
1137 | imr_reg |= AR_IMR_RXINTM | AR_IMR_RXMINTR; | 695 | imr_reg |= AR_IMR_RXOK_HP; |
1138 | else | 696 | if (ah->config.rx_intr_mitigation) |
1139 | imr_reg |= AR_IMR_RXOK; | 697 | imr_reg |= AR_IMR_RXINTM | AR_IMR_RXMINTR; |
698 | else | ||
699 | imr_reg |= AR_IMR_RXOK_LP; | ||
1140 | 700 | ||
1141 | imr_reg |= AR_IMR_TXOK; | 701 | } else { |
702 | if (ah->config.rx_intr_mitigation) | ||
703 | imr_reg |= AR_IMR_RXINTM | AR_IMR_RXMINTR; | ||
704 | else | ||
705 | imr_reg |= AR_IMR_RXOK; | ||
706 | } | ||
707 | |||
708 | if (ah->config.tx_intr_mitigation) | ||
709 | imr_reg |= AR_IMR_TXINTM | AR_IMR_TXMINTR; | ||
710 | else | ||
711 | imr_reg |= AR_IMR_TXOK; | ||
1142 | 712 | ||
1143 | if (opmode == NL80211_IFTYPE_AP) | 713 | if (opmode == NL80211_IFTYPE_AP) |
1144 | imr_reg |= AR_IMR_MIB; | 714 | imr_reg |= AR_IMR_MIB; |
1145 | 715 | ||
716 | ENABLE_REGWRITE_BUFFER(ah); | ||
717 | |||
1146 | REG_WRITE(ah, AR_IMR, imr_reg); | 718 | REG_WRITE(ah, AR_IMR, imr_reg); |
1147 | ah->imrs2_reg |= AR_IMR_S2_GTT; | 719 | ah->imrs2_reg |= AR_IMR_S2_GTT; |
1148 | REG_WRITE(ah, AR_IMR_S2, ah->imrs2_reg); | 720 | REG_WRITE(ah, AR_IMR_S2, ah->imrs2_reg); |
@@ -1152,6 +724,16 @@ static void ath9k_hw_init_interrupt_masks(struct ath_hw *ah, | |||
1152 | REG_WRITE(ah, AR_INTR_SYNC_ENABLE, AR_INTR_SYNC_DEFAULT); | 724 | REG_WRITE(ah, AR_INTR_SYNC_ENABLE, AR_INTR_SYNC_DEFAULT); |
1153 | REG_WRITE(ah, AR_INTR_SYNC_MASK, 0); | 725 | REG_WRITE(ah, AR_INTR_SYNC_MASK, 0); |
1154 | } | 726 | } |
727 | |||
728 | REGWRITE_BUFFER_FLUSH(ah); | ||
729 | DISABLE_REGWRITE_BUFFER(ah); | ||
730 | |||
731 | if (AR_SREV_9300_20_OR_LATER(ah)) { | ||
732 | REG_WRITE(ah, AR_INTR_PRIO_ASYNC_ENABLE, 0); | ||
733 | REG_WRITE(ah, AR_INTR_PRIO_ASYNC_MASK, 0); | ||
734 | REG_WRITE(ah, AR_INTR_PRIO_SYNC_ENABLE, 0); | ||
735 | REG_WRITE(ah, AR_INTR_PRIO_SYNC_MASK, 0); | ||
736 | } | ||
1155 | } | 737 | } |
1156 | 738 | ||
1157 | static void ath9k_hw_setslottime(struct ath_hw *ah, u32 us) | 739 | static void ath9k_hw_setslottime(struct ath_hw *ah, u32 us) |
@@ -1243,8 +825,7 @@ void ath9k_hw_deinit(struct ath_hw *ah) | |||
1243 | ath9k_hw_setpower(ah, ATH9K_PM_FULL_SLEEP); | 825 | ath9k_hw_setpower(ah, ATH9K_PM_FULL_SLEEP); |
1244 | 826 | ||
1245 | free_hw: | 827 | free_hw: |
1246 | if (!AR_SREV_9280_10_OR_LATER(ah)) | 828 | ath9k_hw_rf_free_ext_banks(ah); |
1247 | ath9k_hw_rf_free_ext_banks(ah); | ||
1248 | } | 829 | } |
1249 | EXPORT_SYMBOL(ath9k_hw_deinit); | 830 | EXPORT_SYMBOL(ath9k_hw_deinit); |
1250 | 831 | ||
@@ -1252,73 +833,7 @@ EXPORT_SYMBOL(ath9k_hw_deinit); | |||
1252 | /* INI */ | 833 | /* INI */ |
1253 | /*******/ | 834 | /*******/ |
1254 | 835 | ||
1255 | static void ath9k_hw_override_ini(struct ath_hw *ah, | 836 | u32 ath9k_regd_get_ctl(struct ath_regulatory *reg, struct ath9k_channel *chan) |
1256 | struct ath9k_channel *chan) | ||
1257 | { | ||
1258 | u32 val; | ||
1259 | |||
1260 | /* | ||
1261 | * Set the RX_ABORT and RX_DIS and clear if off only after | ||
1262 | * RXE is set for MAC. This prevents frames with corrupted | ||
1263 | * descriptor status. | ||
1264 | */ | ||
1265 | REG_SET_BIT(ah, AR_DIAG_SW, (AR_DIAG_RX_DIS | AR_DIAG_RX_ABORT)); | ||
1266 | |||
1267 | if (AR_SREV_9280_10_OR_LATER(ah)) { | ||
1268 | val = REG_READ(ah, AR_PCU_MISC_MODE2); | ||
1269 | |||
1270 | if (!AR_SREV_9271(ah)) | ||
1271 | val &= ~AR_PCU_MISC_MODE2_HWWAR1; | ||
1272 | |||
1273 | if (AR_SREV_9287_10_OR_LATER(ah)) | ||
1274 | val = val & (~AR_PCU_MISC_MODE2_HWWAR2); | ||
1275 | |||
1276 | REG_WRITE(ah, AR_PCU_MISC_MODE2, val); | ||
1277 | } | ||
1278 | |||
1279 | if (!AR_SREV_5416_20_OR_LATER(ah) || | ||
1280 | AR_SREV_9280_10_OR_LATER(ah)) | ||
1281 | return; | ||
1282 | /* | ||
1283 | * Disable BB clock gating | ||
1284 | * Necessary to avoid issues on AR5416 2.0 | ||
1285 | */ | ||
1286 | REG_WRITE(ah, 0x9800 + (651 << 2), 0x11); | ||
1287 | |||
1288 | /* | ||
1289 | * Disable RIFS search on some chips to avoid baseband | ||
1290 | * hang issues. | ||
1291 | */ | ||
1292 | if (AR_SREV_9100(ah) || AR_SREV_9160(ah)) { | ||
1293 | val = REG_READ(ah, AR_PHY_HEAVY_CLIP_FACTOR_RIFS); | ||
1294 | val &= ~AR_PHY_RIFS_INIT_DELAY; | ||
1295 | REG_WRITE(ah, AR_PHY_HEAVY_CLIP_FACTOR_RIFS, val); | ||
1296 | } | ||
1297 | } | ||
1298 | |||
1299 | static void ath9k_olc_init(struct ath_hw *ah) | ||
1300 | { | ||
1301 | u32 i; | ||
1302 | |||
1303 | if (OLC_FOR_AR9287_10_LATER) { | ||
1304 | REG_SET_BIT(ah, AR_PHY_TX_PWRCTRL9, | ||
1305 | AR_PHY_TX_PWRCTRL9_RES_DC_REMOVAL); | ||
1306 | ath9k_hw_analog_shift_rmw(ah, AR9287_AN_TXPC0, | ||
1307 | AR9287_AN_TXPC0_TXPCMODE, | ||
1308 | AR9287_AN_TXPC0_TXPCMODE_S, | ||
1309 | AR9287_AN_TXPC0_TXPCMODE_TEMPSENSE); | ||
1310 | udelay(100); | ||
1311 | } else { | ||
1312 | for (i = 0; i < AR9280_TX_GAIN_TABLE_SIZE; i++) | ||
1313 | ah->originalGain[i] = | ||
1314 | MS(REG_READ(ah, AR_PHY_TX_GAIN_TBL1 + i * 4), | ||
1315 | AR_PHY_TX_GAIN); | ||
1316 | ah->PDADCdelta = 0; | ||
1317 | } | ||
1318 | } | ||
1319 | |||
1320 | static u32 ath9k_regd_get_ctl(struct ath_regulatory *reg, | ||
1321 | struct ath9k_channel *chan) | ||
1322 | { | 837 | { |
1323 | u32 ctl = ath_regd_get_band_ctl(reg, chan->chan->band); | 838 | u32 ctl = ath_regd_get_band_ctl(reg, chan->chan->band); |
1324 | 839 | ||
@@ -1332,193 +847,24 @@ static u32 ath9k_regd_get_ctl(struct ath_regulatory *reg, | |||
1332 | return ctl; | 847 | return ctl; |
1333 | } | 848 | } |
1334 | 849 | ||
1335 | static int ath9k_hw_process_ini(struct ath_hw *ah, | ||
1336 | struct ath9k_channel *chan) | ||
1337 | { | ||
1338 | struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah); | ||
1339 | int i, regWrites = 0; | ||
1340 | struct ieee80211_channel *channel = chan->chan; | ||
1341 | u32 modesIndex, freqIndex; | ||
1342 | |||
1343 | switch (chan->chanmode) { | ||
1344 | case CHANNEL_A: | ||
1345 | case CHANNEL_A_HT20: | ||
1346 | modesIndex = 1; | ||
1347 | freqIndex = 1; | ||
1348 | break; | ||
1349 | case CHANNEL_A_HT40PLUS: | ||
1350 | case CHANNEL_A_HT40MINUS: | ||
1351 | modesIndex = 2; | ||
1352 | freqIndex = 1; | ||
1353 | break; | ||
1354 | case CHANNEL_G: | ||
1355 | case CHANNEL_G_HT20: | ||
1356 | case CHANNEL_B: | ||
1357 | modesIndex = 4; | ||
1358 | freqIndex = 2; | ||
1359 | break; | ||
1360 | case CHANNEL_G_HT40PLUS: | ||
1361 | case CHANNEL_G_HT40MINUS: | ||
1362 | modesIndex = 3; | ||
1363 | freqIndex = 2; | ||
1364 | break; | ||
1365 | |||
1366 | default: | ||
1367 | return -EINVAL; | ||
1368 | } | ||
1369 | |||
1370 | /* Set correct baseband to analog shift setting to access analog chips */ | ||
1371 | REG_WRITE(ah, AR_PHY(0), 0x00000007); | ||
1372 | |||
1373 | /* Write ADDAC shifts */ | ||
1374 | REG_WRITE(ah, AR_PHY_ADC_SERIAL_CTL, AR_PHY_SEL_EXTERNAL_RADIO); | ||
1375 | ah->eep_ops->set_addac(ah, chan); | ||
1376 | |||
1377 | if (AR_SREV_5416_22_OR_LATER(ah)) { | ||
1378 | REG_WRITE_ARRAY(&ah->iniAddac, 1, regWrites); | ||
1379 | } else { | ||
1380 | struct ar5416IniArray temp; | ||
1381 | u32 addacSize = | ||
1382 | sizeof(u32) * ah->iniAddac.ia_rows * | ||
1383 | ah->iniAddac.ia_columns; | ||
1384 | |||
1385 | /* For AR5416 2.0/2.1 */ | ||
1386 | memcpy(ah->addac5416_21, | ||
1387 | ah->iniAddac.ia_array, addacSize); | ||
1388 | |||
1389 | /* override CLKDRV value at [row, column] = [31, 1] */ | ||
1390 | (ah->addac5416_21)[31 * ah->iniAddac.ia_columns + 1] = 0; | ||
1391 | |||
1392 | temp.ia_array = ah->addac5416_21; | ||
1393 | temp.ia_columns = ah->iniAddac.ia_columns; | ||
1394 | temp.ia_rows = ah->iniAddac.ia_rows; | ||
1395 | REG_WRITE_ARRAY(&temp, 1, regWrites); | ||
1396 | } | ||
1397 | |||
1398 | REG_WRITE(ah, AR_PHY_ADC_SERIAL_CTL, AR_PHY_SEL_INTERNAL_ADDAC); | ||
1399 | |||
1400 | for (i = 0; i < ah->iniModes.ia_rows; i++) { | ||
1401 | u32 reg = INI_RA(&ah->iniModes, i, 0); | ||
1402 | u32 val = INI_RA(&ah->iniModes, i, modesIndex); | ||
1403 | |||
1404 | if (reg == AR_AN_TOP2 && ah->need_an_top2_fixup) | ||
1405 | val &= ~AR_AN_TOP2_PWDCLKIND; | ||
1406 | |||
1407 | REG_WRITE(ah, reg, val); | ||
1408 | |||
1409 | if (reg >= 0x7800 && reg < 0x78a0 | ||
1410 | && ah->config.analog_shiftreg) { | ||
1411 | udelay(100); | ||
1412 | } | ||
1413 | |||
1414 | DO_DELAY(regWrites); | ||
1415 | } | ||
1416 | |||
1417 | if (AR_SREV_9280(ah) || AR_SREV_9287_10_OR_LATER(ah)) | ||
1418 | REG_WRITE_ARRAY(&ah->iniModesRxGain, modesIndex, regWrites); | ||
1419 | |||
1420 | if (AR_SREV_9280(ah) || AR_SREV_9285_12_OR_LATER(ah) || | ||
1421 | AR_SREV_9287_10_OR_LATER(ah)) | ||
1422 | REG_WRITE_ARRAY(&ah->iniModesTxGain, modesIndex, regWrites); | ||
1423 | |||
1424 | if (AR_SREV_9271_10(ah)) | ||
1425 | REG_WRITE_ARRAY(&ah->iniModes_9271_1_0_only, | ||
1426 | modesIndex, regWrites); | ||
1427 | |||
1428 | /* Write common array parameters */ | ||
1429 | for (i = 0; i < ah->iniCommon.ia_rows; i++) { | ||
1430 | u32 reg = INI_RA(&ah->iniCommon, i, 0); | ||
1431 | u32 val = INI_RA(&ah->iniCommon, i, 1); | ||
1432 | |||
1433 | REG_WRITE(ah, reg, val); | ||
1434 | |||
1435 | if (reg >= 0x7800 && reg < 0x78a0 | ||
1436 | && ah->config.analog_shiftreg) { | ||
1437 | udelay(100); | ||
1438 | } | ||
1439 | |||
1440 | DO_DELAY(regWrites); | ||
1441 | } | ||
1442 | |||
1443 | if (AR_SREV_9271(ah)) { | ||
1444 | if (ah->eep_ops->get_eeprom(ah, EEP_TXGAIN_TYPE) == 1) | ||
1445 | REG_WRITE_ARRAY(&ah->iniModes_high_power_tx_gain_9271, | ||
1446 | modesIndex, regWrites); | ||
1447 | else | ||
1448 | REG_WRITE_ARRAY(&ah->iniModes_normal_power_tx_gain_9271, | ||
1449 | modesIndex, regWrites); | ||
1450 | } | ||
1451 | |||
1452 | ath9k_hw_write_regs(ah, freqIndex, regWrites); | ||
1453 | |||
1454 | if (AR_SREV_9280_20(ah) && IS_CHAN_A_5MHZ_SPACED(chan)) { | ||
1455 | REG_WRITE_ARRAY(&ah->iniModesAdditional, modesIndex, | ||
1456 | regWrites); | ||
1457 | } | ||
1458 | |||
1459 | ath9k_hw_override_ini(ah, chan); | ||
1460 | ath9k_hw_set_regs(ah, chan); | ||
1461 | ath9k_hw_init_chain_masks(ah); | ||
1462 | |||
1463 | if (OLC_FOR_AR9280_20_LATER) | ||
1464 | ath9k_olc_init(ah); | ||
1465 | |||
1466 | /* Set TX power */ | ||
1467 | ah->eep_ops->set_txpower(ah, chan, | ||
1468 | ath9k_regd_get_ctl(regulatory, chan), | ||
1469 | channel->max_antenna_gain * 2, | ||
1470 | channel->max_power * 2, | ||
1471 | min((u32) MAX_RATE_POWER, | ||
1472 | (u32) regulatory->power_limit)); | ||
1473 | |||
1474 | /* Write analog registers */ | ||
1475 | if (!ath9k_hw_set_rf_regs(ah, chan, freqIndex)) { | ||
1476 | ath_print(ath9k_hw_common(ah), ATH_DBG_FATAL, | ||
1477 | "ar5416SetRfRegs failed\n"); | ||
1478 | return -EIO; | ||
1479 | } | ||
1480 | |||
1481 | return 0; | ||
1482 | } | ||
1483 | |||
1484 | /****************************************/ | 850 | /****************************************/ |
1485 | /* Reset and Channel Switching Routines */ | 851 | /* Reset and Channel Switching Routines */ |
1486 | /****************************************/ | 852 | /****************************************/ |
1487 | 853 | ||
1488 | static void ath9k_hw_set_rfmode(struct ath_hw *ah, struct ath9k_channel *chan) | ||
1489 | { | ||
1490 | u32 rfMode = 0; | ||
1491 | |||
1492 | if (chan == NULL) | ||
1493 | return; | ||
1494 | |||
1495 | rfMode |= (IS_CHAN_B(chan) || IS_CHAN_G(chan)) | ||
1496 | ? AR_PHY_MODE_DYNAMIC : AR_PHY_MODE_OFDM; | ||
1497 | |||
1498 | if (!AR_SREV_9280_10_OR_LATER(ah)) | ||
1499 | rfMode |= (IS_CHAN_5GHZ(chan)) ? | ||
1500 | AR_PHY_MODE_RF5GHZ : AR_PHY_MODE_RF2GHZ; | ||
1501 | |||
1502 | if (AR_SREV_9280_20(ah) && IS_CHAN_A_5MHZ_SPACED(chan)) | ||
1503 | rfMode |= (AR_PHY_MODE_DYNAMIC | AR_PHY_MODE_DYN_CCK_DISABLE); | ||
1504 | |||
1505 | REG_WRITE(ah, AR_PHY_MODE, rfMode); | ||
1506 | } | ||
1507 | |||
1508 | static void ath9k_hw_mark_phy_inactive(struct ath_hw *ah) | ||
1509 | { | ||
1510 | REG_WRITE(ah, AR_PHY_ACTIVE, AR_PHY_ACTIVE_DIS); | ||
1511 | } | ||
1512 | |||
1513 | static inline void ath9k_hw_set_dma(struct ath_hw *ah) | 854 | static inline void ath9k_hw_set_dma(struct ath_hw *ah) |
1514 | { | 855 | { |
856 | struct ath_common *common = ath9k_hw_common(ah); | ||
1515 | u32 regval; | 857 | u32 regval; |
1516 | 858 | ||
859 | ENABLE_REGWRITE_BUFFER(ah); | ||
860 | |||
1517 | /* | 861 | /* |
1518 | * set AHB_MODE not to do cacheline prefetches | 862 | * set AHB_MODE not to do cacheline prefetches |
1519 | */ | 863 | */ |
1520 | regval = REG_READ(ah, AR_AHB_MODE); | 864 | if (!AR_SREV_9300_20_OR_LATER(ah)) { |
1521 | REG_WRITE(ah, AR_AHB_MODE, regval | AR_AHB_PREFETCH_RD_EN); | 865 | regval = REG_READ(ah, AR_AHB_MODE); |
866 | REG_WRITE(ah, AR_AHB_MODE, regval | AR_AHB_PREFETCH_RD_EN); | ||
867 | } | ||
1522 | 868 | ||
1523 | /* | 869 | /* |
1524 | * let mac dma reads be in 128 byte chunks | 870 | * let mac dma reads be in 128 byte chunks |
@@ -1526,12 +872,18 @@ static inline void ath9k_hw_set_dma(struct ath_hw *ah) | |||
1526 | regval = REG_READ(ah, AR_TXCFG) & ~AR_TXCFG_DMASZ_MASK; | 872 | regval = REG_READ(ah, AR_TXCFG) & ~AR_TXCFG_DMASZ_MASK; |
1527 | REG_WRITE(ah, AR_TXCFG, regval | AR_TXCFG_DMASZ_128B); | 873 | REG_WRITE(ah, AR_TXCFG, regval | AR_TXCFG_DMASZ_128B); |
1528 | 874 | ||
875 | REGWRITE_BUFFER_FLUSH(ah); | ||
876 | DISABLE_REGWRITE_BUFFER(ah); | ||
877 | |||
1529 | /* | 878 | /* |
1530 | * Restore TX Trigger Level to its pre-reset value. | 879 | * Restore TX Trigger Level to its pre-reset value. |
1531 | * The initial value depends on whether aggregation is enabled, and is | 880 | * The initial value depends on whether aggregation is enabled, and is |
1532 | * adjusted whenever underruns are detected. | 881 | * adjusted whenever underruns are detected. |
1533 | */ | 882 | */ |
1534 | REG_RMW_FIELD(ah, AR_TXCFG, AR_FTRIG, ah->tx_trig_level); | 883 | if (!AR_SREV_9300_20_OR_LATER(ah)) |
884 | REG_RMW_FIELD(ah, AR_TXCFG, AR_FTRIG, ah->tx_trig_level); | ||
885 | |||
886 | ENABLE_REGWRITE_BUFFER(ah); | ||
1535 | 887 | ||
1536 | /* | 888 | /* |
1537 | * let mac dma writes be in 128 byte chunks | 889 | * let mac dma writes be in 128 byte chunks |
@@ -1544,6 +896,14 @@ static inline void ath9k_hw_set_dma(struct ath_hw *ah) | |||
1544 | */ | 896 | */ |
1545 | REG_WRITE(ah, AR_RXFIFO_CFG, 0x200); | 897 | REG_WRITE(ah, AR_RXFIFO_CFG, 0x200); |
1546 | 898 | ||
899 | if (AR_SREV_9300_20_OR_LATER(ah)) { | ||
900 | REG_RMW_FIELD(ah, AR_RXBP_THRESH, AR_RXBP_THRESH_HP, 0x1); | ||
901 | REG_RMW_FIELD(ah, AR_RXBP_THRESH, AR_RXBP_THRESH_LP, 0x1); | ||
902 | |||
903 | ath9k_hw_set_rx_bufsize(ah, common->rx_bufsize - | ||
904 | ah->caps.rx_status_len); | ||
905 | } | ||
906 | |||
1547 | /* | 907 | /* |
1548 | * reduce the number of usable entries in PCU TXBUF to avoid | 908 | * reduce the number of usable entries in PCU TXBUF to avoid |
1549 | * wrap around issues. | 909 | * wrap around issues. |
@@ -1559,6 +919,12 @@ static inline void ath9k_hw_set_dma(struct ath_hw *ah) | |||
1559 | REG_WRITE(ah, AR_PCU_TXBUF_CTRL, | 919 | REG_WRITE(ah, AR_PCU_TXBUF_CTRL, |
1560 | AR_PCU_TXBUF_CTRL_USABLE_SIZE); | 920 | AR_PCU_TXBUF_CTRL_USABLE_SIZE); |
1561 | } | 921 | } |
922 | |||
923 | REGWRITE_BUFFER_FLUSH(ah); | ||
924 | DISABLE_REGWRITE_BUFFER(ah); | ||
925 | |||
926 | if (AR_SREV_9300_20_OR_LATER(ah)) | ||
927 | ath9k_hw_reset_txstatus_ring(ah); | ||
1562 | } | 928 | } |
1563 | 929 | ||
1564 | static void ath9k_hw_set_operating_mode(struct ath_hw *ah, int opmode) | 930 | static void ath9k_hw_set_operating_mode(struct ath_hw *ah, int opmode) |
@@ -1586,10 +952,8 @@ static void ath9k_hw_set_operating_mode(struct ath_hw *ah, int opmode) | |||
1586 | } | 952 | } |
1587 | } | 953 | } |
1588 | 954 | ||
1589 | static inline void ath9k_hw_get_delta_slope_vals(struct ath_hw *ah, | 955 | void ath9k_hw_get_delta_slope_vals(struct ath_hw *ah, u32 coef_scaled, |
1590 | u32 coef_scaled, | 956 | u32 *coef_mantissa, u32 *coef_exponent) |
1591 | u32 *coef_mantissa, | ||
1592 | u32 *coef_exponent) | ||
1593 | { | 957 | { |
1594 | u32 coef_exp, coef_man; | 958 | u32 coef_exp, coef_man; |
1595 | 959 | ||
@@ -1605,40 +969,6 @@ static inline void ath9k_hw_get_delta_slope_vals(struct ath_hw *ah, | |||
1605 | *coef_exponent = coef_exp - 16; | 969 | *coef_exponent = coef_exp - 16; |
1606 | } | 970 | } |
1607 | 971 | ||
1608 | static void ath9k_hw_set_delta_slope(struct ath_hw *ah, | ||
1609 | struct ath9k_channel *chan) | ||
1610 | { | ||
1611 | u32 coef_scaled, ds_coef_exp, ds_coef_man; | ||
1612 | u32 clockMhzScaled = 0x64000000; | ||
1613 | struct chan_centers centers; | ||
1614 | |||
1615 | if (IS_CHAN_HALF_RATE(chan)) | ||
1616 | clockMhzScaled = clockMhzScaled >> 1; | ||
1617 | else if (IS_CHAN_QUARTER_RATE(chan)) | ||
1618 | clockMhzScaled = clockMhzScaled >> 2; | ||
1619 | |||
1620 | ath9k_hw_get_channel_centers(ah, chan, ¢ers); | ||
1621 | coef_scaled = clockMhzScaled / centers.synth_center; | ||
1622 | |||
1623 | ath9k_hw_get_delta_slope_vals(ah, coef_scaled, &ds_coef_man, | ||
1624 | &ds_coef_exp); | ||
1625 | |||
1626 | REG_RMW_FIELD(ah, AR_PHY_TIMING3, | ||
1627 | AR_PHY_TIMING3_DSC_MAN, ds_coef_man); | ||
1628 | REG_RMW_FIELD(ah, AR_PHY_TIMING3, | ||
1629 | AR_PHY_TIMING3_DSC_EXP, ds_coef_exp); | ||
1630 | |||
1631 | coef_scaled = (9 * coef_scaled) / 10; | ||
1632 | |||
1633 | ath9k_hw_get_delta_slope_vals(ah, coef_scaled, &ds_coef_man, | ||
1634 | &ds_coef_exp); | ||
1635 | |||
1636 | REG_RMW_FIELD(ah, AR_PHY_HALFGI, | ||
1637 | AR_PHY_HALFGI_DSC_MAN, ds_coef_man); | ||
1638 | REG_RMW_FIELD(ah, AR_PHY_HALFGI, | ||
1639 | AR_PHY_HALFGI_DSC_EXP, ds_coef_exp); | ||
1640 | } | ||
1641 | |||
1642 | static bool ath9k_hw_set_reset(struct ath_hw *ah, int type) | 972 | static bool ath9k_hw_set_reset(struct ath_hw *ah, int type) |
1643 | { | 973 | { |
1644 | u32 rst_flags; | 974 | u32 rst_flags; |
@@ -1652,6 +982,8 @@ static bool ath9k_hw_set_reset(struct ath_hw *ah, int type) | |||
1652 | (void)REG_READ(ah, AR_RTC_DERIVED_CLK); | 982 | (void)REG_READ(ah, AR_RTC_DERIVED_CLK); |
1653 | } | 983 | } |
1654 | 984 | ||
985 | ENABLE_REGWRITE_BUFFER(ah); | ||
986 | |||
1655 | REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN | | 987 | REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN | |
1656 | AR_RTC_FORCE_WAKE_ON_INT); | 988 | AR_RTC_FORCE_WAKE_ON_INT); |
1657 | 989 | ||
@@ -1663,11 +995,16 @@ static bool ath9k_hw_set_reset(struct ath_hw *ah, int type) | |||
1663 | if (tmpReg & | 995 | if (tmpReg & |
1664 | (AR_INTR_SYNC_LOCAL_TIMEOUT | | 996 | (AR_INTR_SYNC_LOCAL_TIMEOUT | |
1665 | AR_INTR_SYNC_RADM_CPL_TIMEOUT)) { | 997 | AR_INTR_SYNC_RADM_CPL_TIMEOUT)) { |
998 | u32 val; | ||
1666 | REG_WRITE(ah, AR_INTR_SYNC_ENABLE, 0); | 999 | REG_WRITE(ah, AR_INTR_SYNC_ENABLE, 0); |
1667 | REG_WRITE(ah, AR_RC, AR_RC_AHB | AR_RC_HOSTIF); | 1000 | |
1668 | } else { | 1001 | val = AR_RC_HOSTIF; |
1002 | if (!AR_SREV_9300_20_OR_LATER(ah)) | ||
1003 | val |= AR_RC_AHB; | ||
1004 | REG_WRITE(ah, AR_RC, val); | ||
1005 | |||
1006 | } else if (!AR_SREV_9300_20_OR_LATER(ah)) | ||
1669 | REG_WRITE(ah, AR_RC, AR_RC_AHB); | 1007 | REG_WRITE(ah, AR_RC, AR_RC_AHB); |
1670 | } | ||
1671 | 1008 | ||
1672 | rst_flags = AR_RTC_RC_MAC_WARM; | 1009 | rst_flags = AR_RTC_RC_MAC_WARM; |
1673 | if (type == ATH9K_RESET_COLD) | 1010 | if (type == ATH9K_RESET_COLD) |
@@ -1675,6 +1012,10 @@ static bool ath9k_hw_set_reset(struct ath_hw *ah, int type) | |||
1675 | } | 1012 | } |
1676 | 1013 | ||
1677 | REG_WRITE(ah, AR_RTC_RC, rst_flags); | 1014 | REG_WRITE(ah, AR_RTC_RC, rst_flags); |
1015 | |||
1016 | REGWRITE_BUFFER_FLUSH(ah); | ||
1017 | DISABLE_REGWRITE_BUFFER(ah); | ||
1018 | |||
1678 | udelay(50); | 1019 | udelay(50); |
1679 | 1020 | ||
1680 | REG_WRITE(ah, AR_RTC_RC, 0); | 1021 | REG_WRITE(ah, AR_RTC_RC, 0); |
@@ -1695,16 +1036,23 @@ static bool ath9k_hw_set_reset(struct ath_hw *ah, int type) | |||
1695 | 1036 | ||
1696 | static bool ath9k_hw_set_reset_power_on(struct ath_hw *ah) | 1037 | static bool ath9k_hw_set_reset_power_on(struct ath_hw *ah) |
1697 | { | 1038 | { |
1039 | ENABLE_REGWRITE_BUFFER(ah); | ||
1040 | |||
1698 | REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN | | 1041 | REG_WRITE(ah, AR_RTC_FORCE_WAKE, AR_RTC_FORCE_WAKE_EN | |
1699 | AR_RTC_FORCE_WAKE_ON_INT); | 1042 | AR_RTC_FORCE_WAKE_ON_INT); |
1700 | 1043 | ||
1701 | if (!AR_SREV_9100(ah)) | 1044 | if (!AR_SREV_9100(ah) && !AR_SREV_9300_20_OR_LATER(ah)) |
1702 | REG_WRITE(ah, AR_RC, AR_RC_AHB); | 1045 | REG_WRITE(ah, AR_RC, AR_RC_AHB); |
1703 | 1046 | ||
1704 | REG_WRITE(ah, AR_RTC_RESET, 0); | 1047 | REG_WRITE(ah, AR_RTC_RESET, 0); |
1705 | udelay(2); | ||
1706 | 1048 | ||
1707 | if (!AR_SREV_9100(ah)) | 1049 | REGWRITE_BUFFER_FLUSH(ah); |
1050 | DISABLE_REGWRITE_BUFFER(ah); | ||
1051 | |||
1052 | if (!AR_SREV_9300_20_OR_LATER(ah)) | ||
1053 | udelay(2); | ||
1054 | |||
1055 | if (!AR_SREV_9100(ah) && !AR_SREV_9300_20_OR_LATER(ah)) | ||
1708 | REG_WRITE(ah, AR_RC, 0); | 1056 | REG_WRITE(ah, AR_RC, 0); |
1709 | 1057 | ||
1710 | REG_WRITE(ah, AR_RTC_RESET, 1); | 1058 | REG_WRITE(ah, AR_RTC_RESET, 1); |
@@ -1740,34 +1088,6 @@ static bool ath9k_hw_set_reset_reg(struct ath_hw *ah, u32 type) | |||
1740 | } | 1088 | } |
1741 | } | 1089 | } |
1742 | 1090 | ||
1743 | static void ath9k_hw_set_regs(struct ath_hw *ah, struct ath9k_channel *chan) | ||
1744 | { | ||
1745 | u32 phymode; | ||
1746 | u32 enableDacFifo = 0; | ||
1747 | |||
1748 | if (AR_SREV_9285_10_OR_LATER(ah)) | ||
1749 | enableDacFifo = (REG_READ(ah, AR_PHY_TURBO) & | ||
1750 | AR_PHY_FC_ENABLE_DAC_FIFO); | ||
1751 | |||
1752 | phymode = AR_PHY_FC_HT_EN | AR_PHY_FC_SHORT_GI_40 | ||
1753 | | AR_PHY_FC_SINGLE_HT_LTF1 | AR_PHY_FC_WALSH | enableDacFifo; | ||
1754 | |||
1755 | if (IS_CHAN_HT40(chan)) { | ||
1756 | phymode |= AR_PHY_FC_DYN2040_EN; | ||
1757 | |||
1758 | if ((chan->chanmode == CHANNEL_A_HT40PLUS) || | ||
1759 | (chan->chanmode == CHANNEL_G_HT40PLUS)) | ||
1760 | phymode |= AR_PHY_FC_DYN2040_PRI_CH; | ||
1761 | |||
1762 | } | ||
1763 | REG_WRITE(ah, AR_PHY_TURBO, phymode); | ||
1764 | |||
1765 | ath9k_hw_set11nmac2040(ah); | ||
1766 | |||
1767 | REG_WRITE(ah, AR_GTXTO, 25 << AR_GTXTO_TIMEOUT_LIMIT_S); | ||
1768 | REG_WRITE(ah, AR_CST, 0xF << AR_CST_TIMEOUT_LIMIT_S); | ||
1769 | } | ||
1770 | |||
1771 | static bool ath9k_hw_chip_reset(struct ath_hw *ah, | 1091 | static bool ath9k_hw_chip_reset(struct ath_hw *ah, |
1772 | struct ath9k_channel *chan) | 1092 | struct ath9k_channel *chan) |
1773 | { | 1093 | { |
@@ -1793,7 +1113,7 @@ static bool ath9k_hw_channel_change(struct ath_hw *ah, | |||
1793 | struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah); | 1113 | struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah); |
1794 | struct ath_common *common = ath9k_hw_common(ah); | 1114 | struct ath_common *common = ath9k_hw_common(ah); |
1795 | struct ieee80211_channel *channel = chan->chan; | 1115 | struct ieee80211_channel *channel = chan->chan; |
1796 | u32 synthDelay, qnum; | 1116 | u32 qnum; |
1797 | int r; | 1117 | int r; |
1798 | 1118 | ||
1799 | for (qnum = 0; qnum < AR_NUM_QCU; qnum++) { | 1119 | for (qnum = 0; qnum < AR_NUM_QCU; qnum++) { |
@@ -1805,17 +1125,15 @@ static bool ath9k_hw_channel_change(struct ath_hw *ah, | |||
1805 | } | 1125 | } |
1806 | } | 1126 | } |
1807 | 1127 | ||
1808 | REG_WRITE(ah, AR_PHY_RFBUS_REQ, AR_PHY_RFBUS_REQ_EN); | 1128 | if (!ath9k_hw_rfbus_req(ah)) { |
1809 | if (!ath9k_hw_wait(ah, AR_PHY_RFBUS_GRANT, AR_PHY_RFBUS_GRANT_EN, | ||
1810 | AR_PHY_RFBUS_GRANT_EN, AH_WAIT_TIMEOUT)) { | ||
1811 | ath_print(common, ATH_DBG_FATAL, | 1129 | ath_print(common, ATH_DBG_FATAL, |
1812 | "Could not kill baseband RX\n"); | 1130 | "Could not kill baseband RX\n"); |
1813 | return false; | 1131 | return false; |
1814 | } | 1132 | } |
1815 | 1133 | ||
1816 | ath9k_hw_set_regs(ah, chan); | 1134 | ath9k_hw_set_channel_regs(ah, chan); |
1817 | 1135 | ||
1818 | r = ah->ath9k_hw_rf_set_freq(ah, chan); | 1136 | r = ath9k_hw_rf_set_freq(ah, chan); |
1819 | if (r) { | 1137 | if (r) { |
1820 | ath_print(common, ATH_DBG_FATAL, | 1138 | ath_print(common, ATH_DBG_FATAL, |
1821 | "Failed to set channel\n"); | 1139 | "Failed to set channel\n"); |
@@ -1829,20 +1147,12 @@ static bool ath9k_hw_channel_change(struct ath_hw *ah, | |||
1829 | min((u32) MAX_RATE_POWER, | 1147 | min((u32) MAX_RATE_POWER, |
1830 | (u32) regulatory->power_limit)); | 1148 | (u32) regulatory->power_limit)); |
1831 | 1149 | ||
1832 | synthDelay = REG_READ(ah, AR_PHY_RX_DELAY) & AR_PHY_RX_DELAY_DELAY; | 1150 | ath9k_hw_rfbus_done(ah); |
1833 | if (IS_CHAN_B(chan)) | ||
1834 | synthDelay = (4 * synthDelay) / 22; | ||
1835 | else | ||
1836 | synthDelay /= 10; | ||
1837 | |||
1838 | udelay(synthDelay + BASE_ACTIVATE_DELAY); | ||
1839 | |||
1840 | REG_WRITE(ah, AR_PHY_RFBUS_REQ, 0); | ||
1841 | 1151 | ||
1842 | if (IS_CHAN_OFDM(chan) || IS_CHAN_HT(chan)) | 1152 | if (IS_CHAN_OFDM(chan) || IS_CHAN_HT(chan)) |
1843 | ath9k_hw_set_delta_slope(ah, chan); | 1153 | ath9k_hw_set_delta_slope(ah, chan); |
1844 | 1154 | ||
1845 | ah->ath9k_hw_spur_mitigate_freq(ah, chan); | 1155 | ath9k_hw_spur_mitigate_freq(ah, chan); |
1846 | 1156 | ||
1847 | if (!chan->oneTimeCalsDone) | 1157 | if (!chan->oneTimeCalsDone) |
1848 | chan->oneTimeCalsDone = true; | 1158 | chan->oneTimeCalsDone = true; |
@@ -1850,17 +1160,33 @@ static bool ath9k_hw_channel_change(struct ath_hw *ah, | |||
1850 | return true; | 1160 | return true; |
1851 | } | 1161 | } |
1852 | 1162 | ||
1853 | static void ath9k_enable_rfkill(struct ath_hw *ah) | 1163 | bool ath9k_hw_check_alive(struct ath_hw *ah) |
1854 | { | 1164 | { |
1855 | REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, | 1165 | int count = 50; |
1856 | AR_GPIO_INPUT_EN_VAL_RFSILENT_BB); | 1166 | u32 reg; |
1167 | |||
1168 | if (AR_SREV_9285_10_OR_LATER(ah)) | ||
1169 | return true; | ||
1170 | |||
1171 | do { | ||
1172 | reg = REG_READ(ah, AR_OBS_BUS_1); | ||
1857 | 1173 | ||
1858 | REG_CLR_BIT(ah, AR_GPIO_INPUT_MUX2, | 1174 | if ((reg & 0x7E7FFFEF) == 0x00702400) |
1859 | AR_GPIO_INPUT_MUX2_RFSILENT); | 1175 | continue; |
1176 | |||
1177 | switch (reg & 0x7E000B00) { | ||
1178 | case 0x1E000000: | ||
1179 | case 0x52000B00: | ||
1180 | case 0x18000B00: | ||
1181 | continue; | ||
1182 | default: | ||
1183 | return true; | ||
1184 | } | ||
1185 | } while (count-- > 0); | ||
1860 | 1186 | ||
1861 | ath9k_hw_cfg_gpio_input(ah, ah->rfkill_gpio); | 1187 | return false; |
1862 | REG_SET_BIT(ah, AR_PHY_TEST, RFSILENT_BB); | ||
1863 | } | 1188 | } |
1189 | EXPORT_SYMBOL(ath9k_hw_check_alive); | ||
1864 | 1190 | ||
1865 | int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, | 1191 | int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, |
1866 | bool bChannelChange) | 1192 | bool bChannelChange) |
@@ -1871,11 +1197,18 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, | |||
1871 | u32 saveDefAntenna; | 1197 | u32 saveDefAntenna; |
1872 | u32 macStaId1; | 1198 | u32 macStaId1; |
1873 | u64 tsf = 0; | 1199 | u64 tsf = 0; |
1874 | int i, rx_chainmask, r; | 1200 | int i, r; |
1875 | 1201 | ||
1876 | ah->txchainmask = common->tx_chainmask; | 1202 | ah->txchainmask = common->tx_chainmask; |
1877 | ah->rxchainmask = common->rx_chainmask; | 1203 | ah->rxchainmask = common->rx_chainmask; |
1878 | 1204 | ||
1205 | if (!ah->chip_fullsleep) { | ||
1206 | ath9k_hw_abortpcurecv(ah); | ||
1207 | if (!ath9k_hw_stopdmarecv(ah)) | ||
1208 | ath_print(common, ATH_DBG_XMIT, | ||
1209 | "Failed to stop receive dma\n"); | ||
1210 | } | ||
1211 | |||
1879 | if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE)) | 1212 | if (!ath9k_hw_setpower(ah, ATH9K_PM_AWAKE)) |
1880 | return -EIO; | 1213 | return -EIO; |
1881 | 1214 | ||
@@ -1943,16 +1276,6 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, | |||
1943 | if (AR_SREV_9280_10_OR_LATER(ah)) | 1276 | if (AR_SREV_9280_10_OR_LATER(ah)) |
1944 | REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, AR_GPIO_JTAG_DISABLE); | 1277 | REG_SET_BIT(ah, AR_GPIO_INPUT_EN_VAL, AR_GPIO_JTAG_DISABLE); |
1945 | 1278 | ||
1946 | if (AR_SREV_9287_12_OR_LATER(ah)) { | ||
1947 | /* Enable ASYNC FIFO */ | ||
1948 | REG_SET_BIT(ah, AR_MAC_PCU_ASYNC_FIFO_REG3, | ||
1949 | AR_MAC_PCU_ASYNC_FIFO_REG3_DATAPATH_SEL); | ||
1950 | REG_SET_BIT(ah, AR_PHY_MODE, AR_PHY_MODE_ASYNCFIFO); | ||
1951 | REG_CLR_BIT(ah, AR_MAC_PCU_ASYNC_FIFO_REG3, | ||
1952 | AR_MAC_PCU_ASYNC_FIFO_REG3_SOFT_RESET); | ||
1953 | REG_SET_BIT(ah, AR_MAC_PCU_ASYNC_FIFO_REG3, | ||
1954 | AR_MAC_PCU_ASYNC_FIFO_REG3_SOFT_RESET); | ||
1955 | } | ||
1956 | r = ath9k_hw_process_ini(ah, chan); | 1279 | r = ath9k_hw_process_ini(ah, chan); |
1957 | if (r) | 1280 | if (r) |
1958 | return r; | 1281 | return r; |
@@ -1977,9 +1300,13 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, | |||
1977 | if (IS_CHAN_OFDM(chan) || IS_CHAN_HT(chan)) | 1300 | if (IS_CHAN_OFDM(chan) || IS_CHAN_HT(chan)) |
1978 | ath9k_hw_set_delta_slope(ah, chan); | 1301 | ath9k_hw_set_delta_slope(ah, chan); |
1979 | 1302 | ||
1980 | ah->ath9k_hw_spur_mitigate_freq(ah, chan); | 1303 | ath9k_hw_spur_mitigate_freq(ah, chan); |
1981 | ah->eep_ops->set_board_values(ah, chan); | 1304 | ah->eep_ops->set_board_values(ah, chan); |
1982 | 1305 | ||
1306 | ath9k_hw_set_operating_mode(ah, ah->opmode); | ||
1307 | |||
1308 | ENABLE_REGWRITE_BUFFER(ah); | ||
1309 | |||
1983 | REG_WRITE(ah, AR_STA_ID0, get_unaligned_le32(common->macaddr)); | 1310 | REG_WRITE(ah, AR_STA_ID0, get_unaligned_le32(common->macaddr)); |
1984 | REG_WRITE(ah, AR_STA_ID1, get_unaligned_le16(common->macaddr + 4) | 1311 | REG_WRITE(ah, AR_STA_ID1, get_unaligned_le16(common->macaddr + 4) |
1985 | | macStaId1 | 1312 | | macStaId1 |
@@ -1987,25 +1314,27 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, | |||
1987 | | (ah->config. | 1314 | | (ah->config. |
1988 | ack_6mb ? AR_STA_ID1_ACKCTS_6MB : 0) | 1315 | ack_6mb ? AR_STA_ID1_ACKCTS_6MB : 0) |
1989 | | ah->sta_id1_defaults); | 1316 | | ah->sta_id1_defaults); |
1990 | ath9k_hw_set_operating_mode(ah, ah->opmode); | ||
1991 | |||
1992 | ath_hw_setbssidmask(common); | 1317 | ath_hw_setbssidmask(common); |
1993 | |||
1994 | REG_WRITE(ah, AR_DEF_ANTENNA, saveDefAntenna); | 1318 | REG_WRITE(ah, AR_DEF_ANTENNA, saveDefAntenna); |
1995 | |||
1996 | ath9k_hw_write_associd(ah); | 1319 | ath9k_hw_write_associd(ah); |
1997 | |||
1998 | REG_WRITE(ah, AR_ISR, ~0); | 1320 | REG_WRITE(ah, AR_ISR, ~0); |
1999 | |||
2000 | REG_WRITE(ah, AR_RSSI_THR, INIT_RSSI_THR); | 1321 | REG_WRITE(ah, AR_RSSI_THR, INIT_RSSI_THR); |
2001 | 1322 | ||
2002 | r = ah->ath9k_hw_rf_set_freq(ah, chan); | 1323 | REGWRITE_BUFFER_FLUSH(ah); |
1324 | DISABLE_REGWRITE_BUFFER(ah); | ||
1325 | |||
1326 | r = ath9k_hw_rf_set_freq(ah, chan); | ||
2003 | if (r) | 1327 | if (r) |
2004 | return r; | 1328 | return r; |
2005 | 1329 | ||
1330 | ENABLE_REGWRITE_BUFFER(ah); | ||
1331 | |||
2006 | for (i = 0; i < AR_NUM_DCU; i++) | 1332 | for (i = 0; i < AR_NUM_DCU; i++) |
2007 | REG_WRITE(ah, AR_DQCUMASK(i), 1 << i); | 1333 | REG_WRITE(ah, AR_DQCUMASK(i), 1 << i); |
2008 | 1334 | ||
1335 | REGWRITE_BUFFER_FLUSH(ah); | ||
1336 | DISABLE_REGWRITE_BUFFER(ah); | ||
1337 | |||
2009 | ah->intr_txqs = 0; | 1338 | ah->intr_txqs = 0; |
2010 | for (i = 0; i < ah->caps.total_queues; i++) | 1339 | for (i = 0; i < ah->caps.total_queues; i++) |
2011 | ath9k_hw_resettxqueue(ah, i); | 1340 | ath9k_hw_resettxqueue(ah, i); |
@@ -2018,25 +1347,9 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, | |||
2018 | 1347 | ||
2019 | ath9k_hw_init_global_settings(ah); | 1348 | ath9k_hw_init_global_settings(ah); |
2020 | 1349 | ||
2021 | if (AR_SREV_9287_12_OR_LATER(ah)) { | 1350 | if (!AR_SREV_9300_20_OR_LATER(ah)) { |
2022 | REG_WRITE(ah, AR_D_GBL_IFS_SIFS, | 1351 | ar9002_hw_enable_async_fifo(ah); |
2023 | AR_D_GBL_IFS_SIFS_ASYNC_FIFO_DUR); | 1352 | ar9002_hw_enable_wep_aggregation(ah); |
2024 | REG_WRITE(ah, AR_D_GBL_IFS_SLOT, | ||
2025 | AR_D_GBL_IFS_SLOT_ASYNC_FIFO_DUR); | ||
2026 | REG_WRITE(ah, AR_D_GBL_IFS_EIFS, | ||
2027 | AR_D_GBL_IFS_EIFS_ASYNC_FIFO_DUR); | ||
2028 | |||
2029 | REG_WRITE(ah, AR_TIME_OUT, AR_TIME_OUT_ACK_CTS_ASYNC_FIFO_DUR); | ||
2030 | REG_WRITE(ah, AR_USEC, AR_USEC_ASYNC_FIFO_DUR); | ||
2031 | |||
2032 | REG_SET_BIT(ah, AR_MAC_PCU_LOGIC_ANALYZER, | ||
2033 | AR_MAC_PCU_LOGIC_ANALYZER_DISBUG20768); | ||
2034 | REG_RMW_FIELD(ah, AR_AHB_MODE, AR_AHB_CUSTOM_BURST_EN, | ||
2035 | AR_AHB_CUSTOM_BURST_ASYNC_FIFO_VAL); | ||
2036 | } | ||
2037 | if (AR_SREV_9287_12_OR_LATER(ah)) { | ||
2038 | REG_SET_BIT(ah, AR_PCU_MISC_MODE2, | ||
2039 | AR_PCU_MISC_MODE2_ENABLE_AGGWEP); | ||
2040 | } | 1353 | } |
2041 | 1354 | ||
2042 | REG_WRITE(ah, AR_STA_ID1, | 1355 | REG_WRITE(ah, AR_STA_ID1, |
@@ -2051,19 +1364,24 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, | |||
2051 | REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_FIRST, 2000); | 1364 | REG_RMW_FIELD(ah, AR_RIMT, AR_RIMT_FIRST, 2000); |
2052 | } | 1365 | } |
2053 | 1366 | ||
1367 | if (ah->config.tx_intr_mitigation) { | ||
1368 | REG_RMW_FIELD(ah, AR_TIMT, AR_TIMT_LAST, 300); | ||
1369 | REG_RMW_FIELD(ah, AR_TIMT, AR_TIMT_FIRST, 750); | ||
1370 | } | ||
1371 | |||
2054 | ath9k_hw_init_bb(ah, chan); | 1372 | ath9k_hw_init_bb(ah, chan); |
2055 | 1373 | ||
2056 | if (!ath9k_hw_init_cal(ah, chan)) | 1374 | if (!ath9k_hw_init_cal(ah, chan)) |
2057 | return -EIO; | 1375 | return -EIO; |
2058 | 1376 | ||
2059 | rx_chainmask = ah->rxchainmask; | 1377 | ENABLE_REGWRITE_BUFFER(ah); |
2060 | if ((rx_chainmask == 0x5) || (rx_chainmask == 0x3)) { | ||
2061 | REG_WRITE(ah, AR_PHY_RX_CHAINMASK, rx_chainmask); | ||
2062 | REG_WRITE(ah, AR_PHY_CAL_CHAINMASK, rx_chainmask); | ||
2063 | } | ||
2064 | 1378 | ||
1379 | ath9k_hw_restore_chainmask(ah); | ||
2065 | REG_WRITE(ah, AR_CFG_LED, saveLedState | AR_CFG_SCLK_32KHZ); | 1380 | REG_WRITE(ah, AR_CFG_LED, saveLedState | AR_CFG_SCLK_32KHZ); |
2066 | 1381 | ||
1382 | REGWRITE_BUFFER_FLUSH(ah); | ||
1383 | DISABLE_REGWRITE_BUFFER(ah); | ||
1384 | |||
2067 | /* | 1385 | /* |
2068 | * For big endian systems turn on swapping for descriptors | 1386 | * For big endian systems turn on swapping for descriptors |
2069 | */ | 1387 | */ |
@@ -2093,6 +1411,11 @@ int ath9k_hw_reset(struct ath_hw *ah, struct ath9k_channel *chan, | |||
2093 | if (ah->btcoex_hw.enabled) | 1411 | if (ah->btcoex_hw.enabled) |
2094 | ath9k_hw_btcoex_enable(ah); | 1412 | ath9k_hw_btcoex_enable(ah); |
2095 | 1413 | ||
1414 | if (AR_SREV_9300_20_OR_LATER(ah)) { | ||
1415 | ath9k_hw_loadnf(ah, curchan); | ||
1416 | ath9k_hw_start_nfcal(ah); | ||
1417 | } | ||
1418 | |||
2096 | return 0; | 1419 | return 0; |
2097 | } | 1420 | } |
2098 | EXPORT_SYMBOL(ath9k_hw_reset); | 1421 | EXPORT_SYMBOL(ath9k_hw_reset); |
@@ -2379,21 +1702,35 @@ EXPORT_SYMBOL(ath9k_hw_keyisvalid); | |||
2379 | /* Power Management (Chipset) */ | 1702 | /* Power Management (Chipset) */ |
2380 | /******************************/ | 1703 | /******************************/ |
2381 | 1704 | ||
1705 | /* | ||
1706 | * Notify Power Mgt is disabled in self-generated frames. | ||
1707 | * If requested, force chip to sleep. | ||
1708 | */ | ||
2382 | static void ath9k_set_power_sleep(struct ath_hw *ah, int setChip) | 1709 | static void ath9k_set_power_sleep(struct ath_hw *ah, int setChip) |
2383 | { | 1710 | { |
2384 | REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV); | 1711 | REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV); |
2385 | if (setChip) { | 1712 | if (setChip) { |
1713 | /* | ||
1714 | * Clear the RTC force wake bit to allow the | ||
1715 | * mac to go to sleep. | ||
1716 | */ | ||
2386 | REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE, | 1717 | REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE, |
2387 | AR_RTC_FORCE_WAKE_EN); | 1718 | AR_RTC_FORCE_WAKE_EN); |
2388 | if (!AR_SREV_9100(ah)) | 1719 | if (!AR_SREV_9100(ah) && !AR_SREV_9300_20_OR_LATER(ah)) |
2389 | REG_WRITE(ah, AR_RC, AR_RC_AHB | AR_RC_HOSTIF); | 1720 | REG_WRITE(ah, AR_RC, AR_RC_AHB | AR_RC_HOSTIF); |
2390 | 1721 | ||
1722 | /* Shutdown chip. Active low */ | ||
2391 | if (!AR_SREV_5416(ah) && !AR_SREV_9271(ah)) | 1723 | if (!AR_SREV_5416(ah) && !AR_SREV_9271(ah)) |
2392 | REG_CLR_BIT(ah, (AR_RTC_RESET), | 1724 | REG_CLR_BIT(ah, (AR_RTC_RESET), |
2393 | AR_RTC_RESET_EN); | 1725 | AR_RTC_RESET_EN); |
2394 | } | 1726 | } |
2395 | } | 1727 | } |
2396 | 1728 | ||
1729 | /* | ||
1730 | * Notify Power Management is enabled in self-generating | ||
1731 | * frames. If request, set power mode of chip to | ||
1732 | * auto/normal. Duration in units of 128us (1/8 TU). | ||
1733 | */ | ||
2397 | static void ath9k_set_power_network_sleep(struct ath_hw *ah, int setChip) | 1734 | static void ath9k_set_power_network_sleep(struct ath_hw *ah, int setChip) |
2398 | { | 1735 | { |
2399 | REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV); | 1736 | REG_SET_BIT(ah, AR_STA_ID1, AR_STA_ID1_PWR_SAV); |
@@ -2401,9 +1738,14 @@ static void ath9k_set_power_network_sleep(struct ath_hw *ah, int setChip) | |||
2401 | struct ath9k_hw_capabilities *pCap = &ah->caps; | 1738 | struct ath9k_hw_capabilities *pCap = &ah->caps; |
2402 | 1739 | ||
2403 | if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) { | 1740 | if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) { |
1741 | /* Set WakeOnInterrupt bit; clear ForceWake bit */ | ||
2404 | REG_WRITE(ah, AR_RTC_FORCE_WAKE, | 1742 | REG_WRITE(ah, AR_RTC_FORCE_WAKE, |
2405 | AR_RTC_FORCE_WAKE_ON_INT); | 1743 | AR_RTC_FORCE_WAKE_ON_INT); |
2406 | } else { | 1744 | } else { |
1745 | /* | ||
1746 | * Clear the RTC force wake bit to allow the | ||
1747 | * mac to go to sleep. | ||
1748 | */ | ||
2407 | REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE, | 1749 | REG_CLR_BIT(ah, AR_RTC_FORCE_WAKE, |
2408 | AR_RTC_FORCE_WAKE_EN); | 1750 | AR_RTC_FORCE_WAKE_EN); |
2409 | } | 1751 | } |
@@ -2422,7 +1764,8 @@ static bool ath9k_hw_set_power_awake(struct ath_hw *ah, int setChip) | |||
2422 | ATH9K_RESET_POWER_ON) != true) { | 1764 | ATH9K_RESET_POWER_ON) != true) { |
2423 | return false; | 1765 | return false; |
2424 | } | 1766 | } |
2425 | ath9k_hw_init_pll(ah, NULL); | 1767 | if (!AR_SREV_9300_20_OR_LATER(ah)) |
1768 | ath9k_hw_init_pll(ah, NULL); | ||
2426 | } | 1769 | } |
2427 | if (AR_SREV_9100(ah)) | 1770 | if (AR_SREV_9100(ah)) |
2428 | REG_SET_BIT(ah, AR_RTC_RESET, | 1771 | REG_SET_BIT(ah, AR_RTC_RESET, |
@@ -2492,420 +1835,6 @@ bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode) | |||
2492 | } | 1835 | } |
2493 | EXPORT_SYMBOL(ath9k_hw_setpower); | 1836 | EXPORT_SYMBOL(ath9k_hw_setpower); |
2494 | 1837 | ||
2495 | /* | ||
2496 | * Helper for ASPM support. | ||
2497 | * | ||
2498 | * Disable PLL when in L0s as well as receiver clock when in L1. | ||
2499 | * This power saving option must be enabled through the SerDes. | ||
2500 | * | ||
2501 | * Programming the SerDes must go through the same 288 bit serial shift | ||
2502 | * register as the other analog registers. Hence the 9 writes. | ||
2503 | */ | ||
2504 | void ath9k_hw_configpcipowersave(struct ath_hw *ah, int restore, int power_off) | ||
2505 | { | ||
2506 | u8 i; | ||
2507 | u32 val; | ||
2508 | |||
2509 | if (ah->is_pciexpress != true) | ||
2510 | return; | ||
2511 | |||
2512 | /* Do not touch SerDes registers */ | ||
2513 | if (ah->config.pcie_powersave_enable == 2) | ||
2514 | return; | ||
2515 | |||
2516 | /* Nothing to do on restore for 11N */ | ||
2517 | if (!restore) { | ||
2518 | if (AR_SREV_9280_20_OR_LATER(ah)) { | ||
2519 | /* | ||
2520 | * AR9280 2.0 or later chips use SerDes values from the | ||
2521 | * initvals.h initialized depending on chipset during | ||
2522 | * ath9k_hw_init() | ||
2523 | */ | ||
2524 | for (i = 0; i < ah->iniPcieSerdes.ia_rows; i++) { | ||
2525 | REG_WRITE(ah, INI_RA(&ah->iniPcieSerdes, i, 0), | ||
2526 | INI_RA(&ah->iniPcieSerdes, i, 1)); | ||
2527 | } | ||
2528 | } else if (AR_SREV_9280(ah) && | ||
2529 | (ah->hw_version.macRev == AR_SREV_REVISION_9280_10)) { | ||
2530 | REG_WRITE(ah, AR_PCIE_SERDES, 0x9248fd00); | ||
2531 | REG_WRITE(ah, AR_PCIE_SERDES, 0x24924924); | ||
2532 | |||
2533 | /* RX shut off when elecidle is asserted */ | ||
2534 | REG_WRITE(ah, AR_PCIE_SERDES, 0xa8000019); | ||
2535 | REG_WRITE(ah, AR_PCIE_SERDES, 0x13160820); | ||
2536 | REG_WRITE(ah, AR_PCIE_SERDES, 0xe5980560); | ||
2537 | |||
2538 | /* Shut off CLKREQ active in L1 */ | ||
2539 | if (ah->config.pcie_clock_req) | ||
2540 | REG_WRITE(ah, AR_PCIE_SERDES, 0x401deffc); | ||
2541 | else | ||
2542 | REG_WRITE(ah, AR_PCIE_SERDES, 0x401deffd); | ||
2543 | |||
2544 | REG_WRITE(ah, AR_PCIE_SERDES, 0x1aaabe40); | ||
2545 | REG_WRITE(ah, AR_PCIE_SERDES, 0xbe105554); | ||
2546 | REG_WRITE(ah, AR_PCIE_SERDES, 0x00043007); | ||
2547 | |||
2548 | /* Load the new settings */ | ||
2549 | REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000); | ||
2550 | |||
2551 | } else { | ||
2552 | REG_WRITE(ah, AR_PCIE_SERDES, 0x9248fc00); | ||
2553 | REG_WRITE(ah, AR_PCIE_SERDES, 0x24924924); | ||
2554 | |||
2555 | /* RX shut off when elecidle is asserted */ | ||
2556 | REG_WRITE(ah, AR_PCIE_SERDES, 0x28000039); | ||
2557 | REG_WRITE(ah, AR_PCIE_SERDES, 0x53160824); | ||
2558 | REG_WRITE(ah, AR_PCIE_SERDES, 0xe5980579); | ||
2559 | |||
2560 | /* | ||
2561 | * Ignore ah->ah_config.pcie_clock_req setting for | ||
2562 | * pre-AR9280 11n | ||
2563 | */ | ||
2564 | REG_WRITE(ah, AR_PCIE_SERDES, 0x001defff); | ||
2565 | |||
2566 | REG_WRITE(ah, AR_PCIE_SERDES, 0x1aaabe40); | ||
2567 | REG_WRITE(ah, AR_PCIE_SERDES, 0xbe105554); | ||
2568 | REG_WRITE(ah, AR_PCIE_SERDES, 0x000e3007); | ||
2569 | |||
2570 | /* Load the new settings */ | ||
2571 | REG_WRITE(ah, AR_PCIE_SERDES2, 0x00000000); | ||
2572 | } | ||
2573 | |||
2574 | udelay(1000); | ||
2575 | |||
2576 | /* set bit 19 to allow forcing of pcie core into L1 state */ | ||
2577 | REG_SET_BIT(ah, AR_PCIE_PM_CTRL, AR_PCIE_PM_CTRL_ENA); | ||
2578 | |||
2579 | /* Several PCIe massages to ensure proper behaviour */ | ||
2580 | if (ah->config.pcie_waen) { | ||
2581 | val = ah->config.pcie_waen; | ||
2582 | if (!power_off) | ||
2583 | val &= (~AR_WA_D3_L1_DISABLE); | ||
2584 | } else { | ||
2585 | if (AR_SREV_9285(ah) || AR_SREV_9271(ah) || | ||
2586 | AR_SREV_9287(ah)) { | ||
2587 | val = AR9285_WA_DEFAULT; | ||
2588 | if (!power_off) | ||
2589 | val &= (~AR_WA_D3_L1_DISABLE); | ||
2590 | } else if (AR_SREV_9280(ah)) { | ||
2591 | /* | ||
2592 | * On AR9280 chips bit 22 of 0x4004 needs to be | ||
2593 | * set otherwise card may disappear. | ||
2594 | */ | ||
2595 | val = AR9280_WA_DEFAULT; | ||
2596 | if (!power_off) | ||
2597 | val &= (~AR_WA_D3_L1_DISABLE); | ||
2598 | } else | ||
2599 | val = AR_WA_DEFAULT; | ||
2600 | } | ||
2601 | |||
2602 | REG_WRITE(ah, AR_WA, val); | ||
2603 | } | ||
2604 | |||
2605 | if (power_off) { | ||
2606 | /* | ||
2607 | * Set PCIe workaround bits | ||
2608 | * bit 14 in WA register (disable L1) should only | ||
2609 | * be set when device enters D3 and be cleared | ||
2610 | * when device comes back to D0. | ||
2611 | */ | ||
2612 | if (ah->config.pcie_waen) { | ||
2613 | if (ah->config.pcie_waen & AR_WA_D3_L1_DISABLE) | ||
2614 | REG_SET_BIT(ah, AR_WA, AR_WA_D3_L1_DISABLE); | ||
2615 | } else { | ||
2616 | if (((AR_SREV_9285(ah) || AR_SREV_9271(ah) || | ||
2617 | AR_SREV_9287(ah)) && | ||
2618 | (AR9285_WA_DEFAULT & AR_WA_D3_L1_DISABLE)) || | ||
2619 | (AR_SREV_9280(ah) && | ||
2620 | (AR9280_WA_DEFAULT & AR_WA_D3_L1_DISABLE))) { | ||
2621 | REG_SET_BIT(ah, AR_WA, AR_WA_D3_L1_DISABLE); | ||
2622 | } | ||
2623 | } | ||
2624 | } | ||
2625 | } | ||
2626 | EXPORT_SYMBOL(ath9k_hw_configpcipowersave); | ||
2627 | |||
2628 | /**********************/ | ||
2629 | /* Interrupt Handling */ | ||
2630 | /**********************/ | ||
2631 | |||
2632 | bool ath9k_hw_intrpend(struct ath_hw *ah) | ||
2633 | { | ||
2634 | u32 host_isr; | ||
2635 | |||
2636 | if (AR_SREV_9100(ah)) | ||
2637 | return true; | ||
2638 | |||
2639 | host_isr = REG_READ(ah, AR_INTR_ASYNC_CAUSE); | ||
2640 | if ((host_isr & AR_INTR_MAC_IRQ) && (host_isr != AR_INTR_SPURIOUS)) | ||
2641 | return true; | ||
2642 | |||
2643 | host_isr = REG_READ(ah, AR_INTR_SYNC_CAUSE); | ||
2644 | if ((host_isr & AR_INTR_SYNC_DEFAULT) | ||
2645 | && (host_isr != AR_INTR_SPURIOUS)) | ||
2646 | return true; | ||
2647 | |||
2648 | return false; | ||
2649 | } | ||
2650 | EXPORT_SYMBOL(ath9k_hw_intrpend); | ||
2651 | |||
2652 | bool ath9k_hw_getisr(struct ath_hw *ah, enum ath9k_int *masked) | ||
2653 | { | ||
2654 | u32 isr = 0; | ||
2655 | u32 mask2 = 0; | ||
2656 | struct ath9k_hw_capabilities *pCap = &ah->caps; | ||
2657 | u32 sync_cause = 0; | ||
2658 | bool fatal_int = false; | ||
2659 | struct ath_common *common = ath9k_hw_common(ah); | ||
2660 | |||
2661 | if (!AR_SREV_9100(ah)) { | ||
2662 | if (REG_READ(ah, AR_INTR_ASYNC_CAUSE) & AR_INTR_MAC_IRQ) { | ||
2663 | if ((REG_READ(ah, AR_RTC_STATUS) & AR_RTC_STATUS_M) | ||
2664 | == AR_RTC_STATUS_ON) { | ||
2665 | isr = REG_READ(ah, AR_ISR); | ||
2666 | } | ||
2667 | } | ||
2668 | |||
2669 | sync_cause = REG_READ(ah, AR_INTR_SYNC_CAUSE) & | ||
2670 | AR_INTR_SYNC_DEFAULT; | ||
2671 | |||
2672 | *masked = 0; | ||
2673 | |||
2674 | if (!isr && !sync_cause) | ||
2675 | return false; | ||
2676 | } else { | ||
2677 | *masked = 0; | ||
2678 | isr = REG_READ(ah, AR_ISR); | ||
2679 | } | ||
2680 | |||
2681 | if (isr) { | ||
2682 | if (isr & AR_ISR_BCNMISC) { | ||
2683 | u32 isr2; | ||
2684 | isr2 = REG_READ(ah, AR_ISR_S2); | ||
2685 | if (isr2 & AR_ISR_S2_TIM) | ||
2686 | mask2 |= ATH9K_INT_TIM; | ||
2687 | if (isr2 & AR_ISR_S2_DTIM) | ||
2688 | mask2 |= ATH9K_INT_DTIM; | ||
2689 | if (isr2 & AR_ISR_S2_DTIMSYNC) | ||
2690 | mask2 |= ATH9K_INT_DTIMSYNC; | ||
2691 | if (isr2 & (AR_ISR_S2_CABEND)) | ||
2692 | mask2 |= ATH9K_INT_CABEND; | ||
2693 | if (isr2 & AR_ISR_S2_GTT) | ||
2694 | mask2 |= ATH9K_INT_GTT; | ||
2695 | if (isr2 & AR_ISR_S2_CST) | ||
2696 | mask2 |= ATH9K_INT_CST; | ||
2697 | if (isr2 & AR_ISR_S2_TSFOOR) | ||
2698 | mask2 |= ATH9K_INT_TSFOOR; | ||
2699 | } | ||
2700 | |||
2701 | isr = REG_READ(ah, AR_ISR_RAC); | ||
2702 | if (isr == 0xffffffff) { | ||
2703 | *masked = 0; | ||
2704 | return false; | ||
2705 | } | ||
2706 | |||
2707 | *masked = isr & ATH9K_INT_COMMON; | ||
2708 | |||
2709 | if (ah->config.rx_intr_mitigation) { | ||
2710 | if (isr & (AR_ISR_RXMINTR | AR_ISR_RXINTM)) | ||
2711 | *masked |= ATH9K_INT_RX; | ||
2712 | } | ||
2713 | |||
2714 | if (isr & (AR_ISR_RXOK | AR_ISR_RXERR)) | ||
2715 | *masked |= ATH9K_INT_RX; | ||
2716 | if (isr & | ||
2717 | (AR_ISR_TXOK | AR_ISR_TXDESC | AR_ISR_TXERR | | ||
2718 | AR_ISR_TXEOL)) { | ||
2719 | u32 s0_s, s1_s; | ||
2720 | |||
2721 | *masked |= ATH9K_INT_TX; | ||
2722 | |||
2723 | s0_s = REG_READ(ah, AR_ISR_S0_S); | ||
2724 | ah->intr_txqs |= MS(s0_s, AR_ISR_S0_QCU_TXOK); | ||
2725 | ah->intr_txqs |= MS(s0_s, AR_ISR_S0_QCU_TXDESC); | ||
2726 | |||
2727 | s1_s = REG_READ(ah, AR_ISR_S1_S); | ||
2728 | ah->intr_txqs |= MS(s1_s, AR_ISR_S1_QCU_TXERR); | ||
2729 | ah->intr_txqs |= MS(s1_s, AR_ISR_S1_QCU_TXEOL); | ||
2730 | } | ||
2731 | |||
2732 | if (isr & AR_ISR_RXORN) { | ||
2733 | ath_print(common, ATH_DBG_INTERRUPT, | ||
2734 | "receive FIFO overrun interrupt\n"); | ||
2735 | } | ||
2736 | |||
2737 | if (!AR_SREV_9100(ah)) { | ||
2738 | if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) { | ||
2739 | u32 isr5 = REG_READ(ah, AR_ISR_S5_S); | ||
2740 | if (isr5 & AR_ISR_S5_TIM_TIMER) | ||
2741 | *masked |= ATH9K_INT_TIM_TIMER; | ||
2742 | } | ||
2743 | } | ||
2744 | |||
2745 | *masked |= mask2; | ||
2746 | } | ||
2747 | |||
2748 | if (AR_SREV_9100(ah)) | ||
2749 | return true; | ||
2750 | |||
2751 | if (isr & AR_ISR_GENTMR) { | ||
2752 | u32 s5_s; | ||
2753 | |||
2754 | s5_s = REG_READ(ah, AR_ISR_S5_S); | ||
2755 | if (isr & AR_ISR_GENTMR) { | ||
2756 | ah->intr_gen_timer_trigger = | ||
2757 | MS(s5_s, AR_ISR_S5_GENTIMER_TRIG); | ||
2758 | |||
2759 | ah->intr_gen_timer_thresh = | ||
2760 | MS(s5_s, AR_ISR_S5_GENTIMER_THRESH); | ||
2761 | |||
2762 | if (ah->intr_gen_timer_trigger) | ||
2763 | *masked |= ATH9K_INT_GENTIMER; | ||
2764 | |||
2765 | } | ||
2766 | } | ||
2767 | |||
2768 | if (sync_cause) { | ||
2769 | fatal_int = | ||
2770 | (sync_cause & | ||
2771 | (AR_INTR_SYNC_HOST1_FATAL | AR_INTR_SYNC_HOST1_PERR)) | ||
2772 | ? true : false; | ||
2773 | |||
2774 | if (fatal_int) { | ||
2775 | if (sync_cause & AR_INTR_SYNC_HOST1_FATAL) { | ||
2776 | ath_print(common, ATH_DBG_ANY, | ||
2777 | "received PCI FATAL interrupt\n"); | ||
2778 | } | ||
2779 | if (sync_cause & AR_INTR_SYNC_HOST1_PERR) { | ||
2780 | ath_print(common, ATH_DBG_ANY, | ||
2781 | "received PCI PERR interrupt\n"); | ||
2782 | } | ||
2783 | *masked |= ATH9K_INT_FATAL; | ||
2784 | } | ||
2785 | if (sync_cause & AR_INTR_SYNC_RADM_CPL_TIMEOUT) { | ||
2786 | ath_print(common, ATH_DBG_INTERRUPT, | ||
2787 | "AR_INTR_SYNC_RADM_CPL_TIMEOUT\n"); | ||
2788 | REG_WRITE(ah, AR_RC, AR_RC_HOSTIF); | ||
2789 | REG_WRITE(ah, AR_RC, 0); | ||
2790 | *masked |= ATH9K_INT_FATAL; | ||
2791 | } | ||
2792 | if (sync_cause & AR_INTR_SYNC_LOCAL_TIMEOUT) { | ||
2793 | ath_print(common, ATH_DBG_INTERRUPT, | ||
2794 | "AR_INTR_SYNC_LOCAL_TIMEOUT\n"); | ||
2795 | } | ||
2796 | |||
2797 | REG_WRITE(ah, AR_INTR_SYNC_CAUSE_CLR, sync_cause); | ||
2798 | (void) REG_READ(ah, AR_INTR_SYNC_CAUSE_CLR); | ||
2799 | } | ||
2800 | |||
2801 | return true; | ||
2802 | } | ||
2803 | EXPORT_SYMBOL(ath9k_hw_getisr); | ||
2804 | |||
2805 | enum ath9k_int ath9k_hw_set_interrupts(struct ath_hw *ah, enum ath9k_int ints) | ||
2806 | { | ||
2807 | enum ath9k_int omask = ah->imask; | ||
2808 | u32 mask, mask2; | ||
2809 | struct ath9k_hw_capabilities *pCap = &ah->caps; | ||
2810 | struct ath_common *common = ath9k_hw_common(ah); | ||
2811 | |||
2812 | ath_print(common, ATH_DBG_INTERRUPT, "0x%x => 0x%x\n", omask, ints); | ||
2813 | |||
2814 | if (omask & ATH9K_INT_GLOBAL) { | ||
2815 | ath_print(common, ATH_DBG_INTERRUPT, "disable IER\n"); | ||
2816 | REG_WRITE(ah, AR_IER, AR_IER_DISABLE); | ||
2817 | (void) REG_READ(ah, AR_IER); | ||
2818 | if (!AR_SREV_9100(ah)) { | ||
2819 | REG_WRITE(ah, AR_INTR_ASYNC_ENABLE, 0); | ||
2820 | (void) REG_READ(ah, AR_INTR_ASYNC_ENABLE); | ||
2821 | |||
2822 | REG_WRITE(ah, AR_INTR_SYNC_ENABLE, 0); | ||
2823 | (void) REG_READ(ah, AR_INTR_SYNC_ENABLE); | ||
2824 | } | ||
2825 | } | ||
2826 | |||
2827 | mask = ints & ATH9K_INT_COMMON; | ||
2828 | mask2 = 0; | ||
2829 | |||
2830 | if (ints & ATH9K_INT_TX) { | ||
2831 | if (ah->txok_interrupt_mask) | ||
2832 | mask |= AR_IMR_TXOK; | ||
2833 | if (ah->txdesc_interrupt_mask) | ||
2834 | mask |= AR_IMR_TXDESC; | ||
2835 | if (ah->txerr_interrupt_mask) | ||
2836 | mask |= AR_IMR_TXERR; | ||
2837 | if (ah->txeol_interrupt_mask) | ||
2838 | mask |= AR_IMR_TXEOL; | ||
2839 | } | ||
2840 | if (ints & ATH9K_INT_RX) { | ||
2841 | mask |= AR_IMR_RXERR; | ||
2842 | if (ah->config.rx_intr_mitigation) | ||
2843 | mask |= AR_IMR_RXMINTR | AR_IMR_RXINTM; | ||
2844 | else | ||
2845 | mask |= AR_IMR_RXOK | AR_IMR_RXDESC; | ||
2846 | if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) | ||
2847 | mask |= AR_IMR_GENTMR; | ||
2848 | } | ||
2849 | |||
2850 | if (ints & (ATH9K_INT_BMISC)) { | ||
2851 | mask |= AR_IMR_BCNMISC; | ||
2852 | if (ints & ATH9K_INT_TIM) | ||
2853 | mask2 |= AR_IMR_S2_TIM; | ||
2854 | if (ints & ATH9K_INT_DTIM) | ||
2855 | mask2 |= AR_IMR_S2_DTIM; | ||
2856 | if (ints & ATH9K_INT_DTIMSYNC) | ||
2857 | mask2 |= AR_IMR_S2_DTIMSYNC; | ||
2858 | if (ints & ATH9K_INT_CABEND) | ||
2859 | mask2 |= AR_IMR_S2_CABEND; | ||
2860 | if (ints & ATH9K_INT_TSFOOR) | ||
2861 | mask2 |= AR_IMR_S2_TSFOOR; | ||
2862 | } | ||
2863 | |||
2864 | if (ints & (ATH9K_INT_GTT | ATH9K_INT_CST)) { | ||
2865 | mask |= AR_IMR_BCNMISC; | ||
2866 | if (ints & ATH9K_INT_GTT) | ||
2867 | mask2 |= AR_IMR_S2_GTT; | ||
2868 | if (ints & ATH9K_INT_CST) | ||
2869 | mask2 |= AR_IMR_S2_CST; | ||
2870 | } | ||
2871 | |||
2872 | ath_print(common, ATH_DBG_INTERRUPT, "new IMR 0x%x\n", mask); | ||
2873 | REG_WRITE(ah, AR_IMR, mask); | ||
2874 | ah->imrs2_reg &= ~(AR_IMR_S2_TIM | AR_IMR_S2_DTIM | AR_IMR_S2_DTIMSYNC | | ||
2875 | AR_IMR_S2_CABEND | AR_IMR_S2_CABTO | | ||
2876 | AR_IMR_S2_TSFOOR | AR_IMR_S2_GTT | AR_IMR_S2_CST); | ||
2877 | ah->imrs2_reg |= mask2; | ||
2878 | REG_WRITE(ah, AR_IMR_S2, ah->imrs2_reg); | ||
2879 | |||
2880 | if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) { | ||
2881 | if (ints & ATH9K_INT_TIM_TIMER) | ||
2882 | REG_SET_BIT(ah, AR_IMR_S5, AR_IMR_S5_TIM_TIMER); | ||
2883 | else | ||
2884 | REG_CLR_BIT(ah, AR_IMR_S5, AR_IMR_S5_TIM_TIMER); | ||
2885 | } | ||
2886 | |||
2887 | if (ints & ATH9K_INT_GLOBAL) { | ||
2888 | ath_print(common, ATH_DBG_INTERRUPT, "enable IER\n"); | ||
2889 | REG_WRITE(ah, AR_IER, AR_IER_ENABLE); | ||
2890 | if (!AR_SREV_9100(ah)) { | ||
2891 | REG_WRITE(ah, AR_INTR_ASYNC_ENABLE, | ||
2892 | AR_INTR_MAC_IRQ); | ||
2893 | REG_WRITE(ah, AR_INTR_ASYNC_MASK, AR_INTR_MAC_IRQ); | ||
2894 | |||
2895 | |||
2896 | REG_WRITE(ah, AR_INTR_SYNC_ENABLE, | ||
2897 | AR_INTR_SYNC_DEFAULT); | ||
2898 | REG_WRITE(ah, AR_INTR_SYNC_MASK, | ||
2899 | AR_INTR_SYNC_DEFAULT); | ||
2900 | } | ||
2901 | ath_print(common, ATH_DBG_INTERRUPT, "AR_IMR 0x%x IER 0x%x\n", | ||
2902 | REG_READ(ah, AR_IMR), REG_READ(ah, AR_IER)); | ||
2903 | } | ||
2904 | |||
2905 | return omask; | ||
2906 | } | ||
2907 | EXPORT_SYMBOL(ath9k_hw_set_interrupts); | ||
2908 | |||
2909 | /*******************/ | 1838 | /*******************/ |
2910 | /* Beacon Handling */ | 1839 | /* Beacon Handling */ |
2911 | /*******************/ | 1840 | /*******************/ |
@@ -2916,6 +1845,8 @@ void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period) | |||
2916 | 1845 | ||
2917 | ah->beacon_interval = beacon_period; | 1846 | ah->beacon_interval = beacon_period; |
2918 | 1847 | ||
1848 | ENABLE_REGWRITE_BUFFER(ah); | ||
1849 | |||
2919 | switch (ah->opmode) { | 1850 | switch (ah->opmode) { |
2920 | case NL80211_IFTYPE_STATION: | 1851 | case NL80211_IFTYPE_STATION: |
2921 | case NL80211_IFTYPE_MONITOR: | 1852 | case NL80211_IFTYPE_MONITOR: |
@@ -2959,6 +1890,9 @@ void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period) | |||
2959 | REG_WRITE(ah, AR_SWBA_PERIOD, TU_TO_USEC(beacon_period)); | 1890 | REG_WRITE(ah, AR_SWBA_PERIOD, TU_TO_USEC(beacon_period)); |
2960 | REG_WRITE(ah, AR_NDP_PERIOD, TU_TO_USEC(beacon_period)); | 1891 | REG_WRITE(ah, AR_NDP_PERIOD, TU_TO_USEC(beacon_period)); |
2961 | 1892 | ||
1893 | REGWRITE_BUFFER_FLUSH(ah); | ||
1894 | DISABLE_REGWRITE_BUFFER(ah); | ||
1895 | |||
2962 | beacon_period &= ~ATH9K_BEACON_ENA; | 1896 | beacon_period &= ~ATH9K_BEACON_ENA; |
2963 | if (beacon_period & ATH9K_BEACON_RESET_TSF) { | 1897 | if (beacon_period & ATH9K_BEACON_RESET_TSF) { |
2964 | ath9k_hw_reset_tsf(ah); | 1898 | ath9k_hw_reset_tsf(ah); |
@@ -2975,6 +1909,8 @@ void ath9k_hw_set_sta_beacon_timers(struct ath_hw *ah, | |||
2975 | struct ath9k_hw_capabilities *pCap = &ah->caps; | 1909 | struct ath9k_hw_capabilities *pCap = &ah->caps; |
2976 | struct ath_common *common = ath9k_hw_common(ah); | 1910 | struct ath_common *common = ath9k_hw_common(ah); |
2977 | 1911 | ||
1912 | ENABLE_REGWRITE_BUFFER(ah); | ||
1913 | |||
2978 | REG_WRITE(ah, AR_NEXT_TBTT_TIMER, TU_TO_USEC(bs->bs_nexttbtt)); | 1914 | REG_WRITE(ah, AR_NEXT_TBTT_TIMER, TU_TO_USEC(bs->bs_nexttbtt)); |
2979 | 1915 | ||
2980 | REG_WRITE(ah, AR_BEACON_PERIOD, | 1916 | REG_WRITE(ah, AR_BEACON_PERIOD, |
@@ -2982,6 +1918,9 @@ void ath9k_hw_set_sta_beacon_timers(struct ath_hw *ah, | |||
2982 | REG_WRITE(ah, AR_DMA_BEACON_PERIOD, | 1918 | REG_WRITE(ah, AR_DMA_BEACON_PERIOD, |
2983 | TU_TO_USEC(bs->bs_intval & ATH9K_BEACON_PERIOD)); | 1919 | TU_TO_USEC(bs->bs_intval & ATH9K_BEACON_PERIOD)); |
2984 | 1920 | ||
1921 | REGWRITE_BUFFER_FLUSH(ah); | ||
1922 | DISABLE_REGWRITE_BUFFER(ah); | ||
1923 | |||
2985 | REG_RMW_FIELD(ah, AR_RSSI_THR, | 1924 | REG_RMW_FIELD(ah, AR_RSSI_THR, |
2986 | AR_RSSI_THR_BM_THR, bs->bs_bmissthreshold); | 1925 | AR_RSSI_THR_BM_THR, bs->bs_bmissthreshold); |
2987 | 1926 | ||
@@ -3004,6 +1943,8 @@ void ath9k_hw_set_sta_beacon_timers(struct ath_hw *ah, | |||
3004 | ath_print(common, ATH_DBG_BEACON, "beacon period %d\n", beaconintval); | 1943 | ath_print(common, ATH_DBG_BEACON, "beacon period %d\n", beaconintval); |
3005 | ath_print(common, ATH_DBG_BEACON, "DTIM period %d\n", dtimperiod); | 1944 | ath_print(common, ATH_DBG_BEACON, "DTIM period %d\n", dtimperiod); |
3006 | 1945 | ||
1946 | ENABLE_REGWRITE_BUFFER(ah); | ||
1947 | |||
3007 | REG_WRITE(ah, AR_NEXT_DTIM, | 1948 | REG_WRITE(ah, AR_NEXT_DTIM, |
3008 | TU_TO_USEC(bs->bs_nextdtim - SLEEP_SLOP)); | 1949 | TU_TO_USEC(bs->bs_nextdtim - SLEEP_SLOP)); |
3009 | REG_WRITE(ah, AR_NEXT_TIM, TU_TO_USEC(nextTbtt - SLEEP_SLOP)); | 1950 | REG_WRITE(ah, AR_NEXT_TIM, TU_TO_USEC(nextTbtt - SLEEP_SLOP)); |
@@ -3023,6 +1964,9 @@ void ath9k_hw_set_sta_beacon_timers(struct ath_hw *ah, | |||
3023 | REG_WRITE(ah, AR_TIM_PERIOD, TU_TO_USEC(beaconintval)); | 1964 | REG_WRITE(ah, AR_TIM_PERIOD, TU_TO_USEC(beaconintval)); |
3024 | REG_WRITE(ah, AR_DTIM_PERIOD, TU_TO_USEC(dtimperiod)); | 1965 | REG_WRITE(ah, AR_DTIM_PERIOD, TU_TO_USEC(dtimperiod)); |
3025 | 1966 | ||
1967 | REGWRITE_BUFFER_FLUSH(ah); | ||
1968 | DISABLE_REGWRITE_BUFFER(ah); | ||
1969 | |||
3026 | REG_SET_BIT(ah, AR_TIMER_MODE, | 1970 | REG_SET_BIT(ah, AR_TIMER_MODE, |
3027 | AR_TBTT_TIMER_EN | AR_TIM_TIMER_EN | | 1971 | AR_TBTT_TIMER_EN | AR_TIM_TIMER_EN | |
3028 | AR_DTIM_TIMER_EN); | 1972 | AR_DTIM_TIMER_EN); |
@@ -3241,6 +2185,20 @@ int ath9k_hw_fill_cap_info(struct ath_hw *ah) | |||
3241 | btcoex_hw->scheme = ATH_BTCOEX_CFG_NONE; | 2185 | btcoex_hw->scheme = ATH_BTCOEX_CFG_NONE; |
3242 | } | 2186 | } |
3243 | 2187 | ||
2188 | if (AR_SREV_9300_20_OR_LATER(ah)) { | ||
2189 | pCap->hw_caps |= ATH9K_HW_CAP_EDMA | ATH9K_HW_CAP_LDPC; | ||
2190 | pCap->rx_hp_qdepth = ATH9K_HW_RX_HP_QDEPTH; | ||
2191 | pCap->rx_lp_qdepth = ATH9K_HW_RX_LP_QDEPTH; | ||
2192 | pCap->rx_status_len = sizeof(struct ar9003_rxs); | ||
2193 | pCap->tx_desc_len = sizeof(struct ar9003_txc); | ||
2194 | pCap->txs_len = sizeof(struct ar9003_txs); | ||
2195 | } else { | ||
2196 | pCap->tx_desc_len = sizeof(struct ath_desc); | ||
2197 | } | ||
2198 | |||
2199 | if (AR_SREV_9300_20_OR_LATER(ah)) | ||
2200 | pCap->hw_caps |= ATH9K_HW_CAP_RAC_SUPPORTED; | ||
2201 | |||
3244 | return 0; | 2202 | return 0; |
3245 | } | 2203 | } |
3246 | 2204 | ||
@@ -3273,10 +2231,6 @@ bool ath9k_hw_getcapability(struct ath_hw *ah, enum ath9k_capability_type type, | |||
3273 | case ATH9K_CAP_TKIP_SPLIT: | 2231 | case ATH9K_CAP_TKIP_SPLIT: |
3274 | return (ah->misc_mode & AR_PCU_MIC_NEW_LOC_ENA) ? | 2232 | return (ah->misc_mode & AR_PCU_MIC_NEW_LOC_ENA) ? |
3275 | false : true; | 2233 | false : true; |
3276 | case ATH9K_CAP_DIVERSITY: | ||
3277 | return (REG_READ(ah, AR_PHY_CCK_DETECT) & | ||
3278 | AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV) ? | ||
3279 | true : false; | ||
3280 | case ATH9K_CAP_MCAST_KEYSRCH: | 2234 | case ATH9K_CAP_MCAST_KEYSRCH: |
3281 | switch (capability) { | 2235 | switch (capability) { |
3282 | case 0: | 2236 | case 0: |
@@ -3319,8 +2273,6 @@ EXPORT_SYMBOL(ath9k_hw_getcapability); | |||
3319 | bool ath9k_hw_setcapability(struct ath_hw *ah, enum ath9k_capability_type type, | 2273 | bool ath9k_hw_setcapability(struct ath_hw *ah, enum ath9k_capability_type type, |
3320 | u32 capability, u32 setting, int *status) | 2274 | u32 capability, u32 setting, int *status) |
3321 | { | 2275 | { |
3322 | u32 v; | ||
3323 | |||
3324 | switch (type) { | 2276 | switch (type) { |
3325 | case ATH9K_CAP_TKIP_MIC: | 2277 | case ATH9K_CAP_TKIP_MIC: |
3326 | if (setting) | 2278 | if (setting) |
@@ -3330,14 +2282,6 @@ bool ath9k_hw_setcapability(struct ath_hw *ah, enum ath9k_capability_type type, | |||
3330 | ah->sta_id1_defaults &= | 2282 | ah->sta_id1_defaults &= |
3331 | ~AR_STA_ID1_CRPT_MIC_ENABLE; | 2283 | ~AR_STA_ID1_CRPT_MIC_ENABLE; |
3332 | return true; | 2284 | return true; |
3333 | case ATH9K_CAP_DIVERSITY: | ||
3334 | v = REG_READ(ah, AR_PHY_CCK_DETECT); | ||
3335 | if (setting) | ||
3336 | v |= AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV; | ||
3337 | else | ||
3338 | v &= ~AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV; | ||
3339 | REG_WRITE(ah, AR_PHY_CCK_DETECT, v); | ||
3340 | return true; | ||
3341 | case ATH9K_CAP_MCAST_KEYSRCH: | 2285 | case ATH9K_CAP_MCAST_KEYSRCH: |
3342 | if (setting) | 2286 | if (setting) |
3343 | ah->sta_id1_defaults |= AR_STA_ID1_MCAST_KSRCH; | 2287 | ah->sta_id1_defaults |= AR_STA_ID1_MCAST_KSRCH; |
@@ -3405,7 +2349,9 @@ u32 ath9k_hw_gpio_get(struct ath_hw *ah, u32 gpio) | |||
3405 | if (gpio >= ah->caps.num_gpio_pins) | 2349 | if (gpio >= ah->caps.num_gpio_pins) |
3406 | return 0xffffffff; | 2350 | return 0xffffffff; |
3407 | 2351 | ||
3408 | if (AR_SREV_9271(ah)) | 2352 | if (AR_SREV_9300_20_OR_LATER(ah)) |
2353 | return MS_REG_READ(AR9300, gpio) != 0; | ||
2354 | else if (AR_SREV_9271(ah)) | ||
3409 | return MS_REG_READ(AR9271, gpio) != 0; | 2355 | return MS_REG_READ(AR9271, gpio) != 0; |
3410 | else if (AR_SREV_9287_10_OR_LATER(ah)) | 2356 | else if (AR_SREV_9287_10_OR_LATER(ah)) |
3411 | return MS_REG_READ(AR9287, gpio) != 0; | 2357 | return MS_REG_READ(AR9287, gpio) != 0; |
@@ -3478,6 +2424,8 @@ void ath9k_hw_setrxfilter(struct ath_hw *ah, u32 bits) | |||
3478 | { | 2424 | { |
3479 | u32 phybits; | 2425 | u32 phybits; |
3480 | 2426 | ||
2427 | ENABLE_REGWRITE_BUFFER(ah); | ||
2428 | |||
3481 | REG_WRITE(ah, AR_RX_FILTER, bits); | 2429 | REG_WRITE(ah, AR_RX_FILTER, bits); |
3482 | 2430 | ||
3483 | phybits = 0; | 2431 | phybits = 0; |
@@ -3493,6 +2441,9 @@ void ath9k_hw_setrxfilter(struct ath_hw *ah, u32 bits) | |||
3493 | else | 2441 | else |
3494 | REG_WRITE(ah, AR_RXCFG, | 2442 | REG_WRITE(ah, AR_RXCFG, |
3495 | REG_READ(ah, AR_RXCFG) & ~AR_RXCFG_ZLFDMA); | 2443 | REG_READ(ah, AR_RXCFG) & ~AR_RXCFG_ZLFDMA); |
2444 | |||
2445 | REGWRITE_BUFFER_FLUSH(ah); | ||
2446 | DISABLE_REGWRITE_BUFFER(ah); | ||
3496 | } | 2447 | } |
3497 | EXPORT_SYMBOL(ath9k_hw_setrxfilter); | 2448 | EXPORT_SYMBOL(ath9k_hw_setrxfilter); |
3498 | 2449 | ||
@@ -3565,14 +2516,25 @@ void ath9k_hw_write_associd(struct ath_hw *ah) | |||
3565 | } | 2516 | } |
3566 | EXPORT_SYMBOL(ath9k_hw_write_associd); | 2517 | EXPORT_SYMBOL(ath9k_hw_write_associd); |
3567 | 2518 | ||
2519 | #define ATH9K_MAX_TSF_READ 10 | ||
2520 | |||
3568 | u64 ath9k_hw_gettsf64(struct ath_hw *ah) | 2521 | u64 ath9k_hw_gettsf64(struct ath_hw *ah) |
3569 | { | 2522 | { |
3570 | u64 tsf; | 2523 | u32 tsf_lower, tsf_upper1, tsf_upper2; |
2524 | int i; | ||
2525 | |||
2526 | tsf_upper1 = REG_READ(ah, AR_TSF_U32); | ||
2527 | for (i = 0; i < ATH9K_MAX_TSF_READ; i++) { | ||
2528 | tsf_lower = REG_READ(ah, AR_TSF_L32); | ||
2529 | tsf_upper2 = REG_READ(ah, AR_TSF_U32); | ||
2530 | if (tsf_upper2 == tsf_upper1) | ||
2531 | break; | ||
2532 | tsf_upper1 = tsf_upper2; | ||
2533 | } | ||
3571 | 2534 | ||
3572 | tsf = REG_READ(ah, AR_TSF_U32); | 2535 | WARN_ON( i == ATH9K_MAX_TSF_READ ); |
3573 | tsf = (tsf << 32) | REG_READ(ah, AR_TSF_L32); | ||
3574 | 2536 | ||
3575 | return tsf; | 2537 | return (((u64)tsf_upper1 << 32) | tsf_lower); |
3576 | } | 2538 | } |
3577 | EXPORT_SYMBOL(ath9k_hw_gettsf64); | 2539 | EXPORT_SYMBOL(ath9k_hw_gettsf64); |
3578 | 2540 | ||
@@ -3847,6 +2809,7 @@ static struct { | |||
3847 | { AR_SREV_VERSION_9285, "9285" }, | 2809 | { AR_SREV_VERSION_9285, "9285" }, |
3848 | { AR_SREV_VERSION_9287, "9287" }, | 2810 | { AR_SREV_VERSION_9287, "9287" }, |
3849 | { AR_SREV_VERSION_9271, "9271" }, | 2811 | { AR_SREV_VERSION_9271, "9271" }, |
2812 | { AR_SREV_VERSION_9300, "9300" }, | ||
3850 | }; | 2813 | }; |
3851 | 2814 | ||
3852 | /* For devices with external radios */ | 2815 | /* For devices with external radios */ |
diff --git a/drivers/net/wireless/ath/ath9k/hw.h b/drivers/net/wireless/ath/ath9k/hw.h index f4821cf33b87..a78e09bab431 100644 --- a/drivers/net/wireless/ath/ath9k/hw.h +++ b/drivers/net/wireless/ath/ath9k/hw.h | |||
@@ -1,5 +1,5 @@ | |||
1 | /* | 1 | /* |
2 | * Copyright (c) 2008-2009 Atheros Communications Inc. | 2 | * Copyright (c) 2008-2010 Atheros Communications Inc. |
3 | * | 3 | * |
4 | * Permission to use, copy, modify, and/or distribute this software for any | 4 | * Permission to use, copy, modify, and/or distribute this software for any |
5 | * purpose with or without fee is hereby granted, provided that the above | 5 | * purpose with or without fee is hereby granted, provided that the above |
@@ -41,6 +41,9 @@ | |||
41 | #define AR9280_DEVID_PCIE 0x002a | 41 | #define AR9280_DEVID_PCIE 0x002a |
42 | #define AR9285_DEVID_PCIE 0x002b | 42 | #define AR9285_DEVID_PCIE 0x002b |
43 | #define AR2427_DEVID_PCIE 0x002c | 43 | #define AR2427_DEVID_PCIE 0x002c |
44 | #define AR9287_DEVID_PCI 0x002d | ||
45 | #define AR9287_DEVID_PCIE 0x002e | ||
46 | #define AR9300_DEVID_PCIE 0x0030 | ||
44 | 47 | ||
45 | #define AR5416_AR9100_DEVID 0x000b | 48 | #define AR5416_AR9100_DEVID 0x000b |
46 | 49 | ||
@@ -48,9 +51,6 @@ | |||
48 | #define AR_SUBVENDOR_ID_NEW_A 0x7065 | 51 | #define AR_SUBVENDOR_ID_NEW_A 0x7065 |
49 | #define AR5416_MAGIC 0x19641014 | 52 | #define AR5416_MAGIC 0x19641014 |
50 | 53 | ||
51 | #define AR5416_DEVID_AR9287_PCI 0x002D | ||
52 | #define AR5416_DEVID_AR9287_PCIE 0x002E | ||
53 | |||
54 | #define AR9280_COEX2WIRE_SUBSYSID 0x309b | 54 | #define AR9280_COEX2WIRE_SUBSYSID 0x309b |
55 | #define AT9285_COEX3WIRE_SA_SUBSYSID 0x30aa | 55 | #define AT9285_COEX3WIRE_SA_SUBSYSID 0x30aa |
56 | #define AT9285_COEX3WIRE_DA_SUBSYSID 0x30ab | 56 | #define AT9285_COEX3WIRE_DA_SUBSYSID 0x30ab |
@@ -68,6 +68,24 @@ | |||
68 | #define REG_READ(_ah, _reg) \ | 68 | #define REG_READ(_ah, _reg) \ |
69 | ath9k_hw_common(_ah)->ops->read((_ah), (_reg)) | 69 | ath9k_hw_common(_ah)->ops->read((_ah), (_reg)) |
70 | 70 | ||
71 | #define ENABLE_REGWRITE_BUFFER(_ah) \ | ||
72 | do { \ | ||
73 | if (AR_SREV_9271(_ah)) \ | ||
74 | ath9k_hw_common(_ah)->ops->enable_write_buffer((_ah)); \ | ||
75 | } while (0) | ||
76 | |||
77 | #define DISABLE_REGWRITE_BUFFER(_ah) \ | ||
78 | do { \ | ||
79 | if (AR_SREV_9271(_ah)) \ | ||
80 | ath9k_hw_common(_ah)->ops->disable_write_buffer((_ah)); \ | ||
81 | } while (0) | ||
82 | |||
83 | #define REGWRITE_BUFFER_FLUSH(_ah) \ | ||
84 | do { \ | ||
85 | if (AR_SREV_9271(_ah)) \ | ||
86 | ath9k_hw_common(_ah)->ops->write_flush((_ah)); \ | ||
87 | } while (0) | ||
88 | |||
71 | #define SM(_v, _f) (((_v) << _f##_S) & _f) | 89 | #define SM(_v, _f) (((_v) << _f##_S) & _f) |
72 | #define MS(_v, _f) (((_v) & _f) >> _f##_S) | 90 | #define MS(_v, _f) (((_v) & _f) >> _f##_S) |
73 | #define REG_RMW(_a, _r, _set, _clr) \ | 91 | #define REG_RMW(_a, _r, _set, _clr) \ |
@@ -75,6 +93,8 @@ | |||
75 | #define REG_RMW_FIELD(_a, _r, _f, _v) \ | 93 | #define REG_RMW_FIELD(_a, _r, _f, _v) \ |
76 | REG_WRITE(_a, _r, \ | 94 | REG_WRITE(_a, _r, \ |
77 | (REG_READ(_a, _r) & ~_f) | (((_v) << _f##_S) & _f)) | 95 | (REG_READ(_a, _r) & ~_f) | (((_v) << _f##_S) & _f)) |
96 | #define REG_READ_FIELD(_a, _r, _f) \ | ||
97 | (((REG_READ(_a, _r) & _f) >> _f##_S)) | ||
78 | #define REG_SET_BIT(_a, _r, _f) \ | 98 | #define REG_SET_BIT(_a, _r, _f) \ |
79 | REG_WRITE(_a, _r, REG_READ(_a, _r) | _f) | 99 | REG_WRITE(_a, _r, REG_READ(_a, _r) | _f) |
80 | #define REG_CLR_BIT(_a, _r, _f) \ | 100 | #define REG_CLR_BIT(_a, _r, _f) \ |
@@ -135,6 +155,16 @@ | |||
135 | 155 | ||
136 | #define TU_TO_USEC(_tu) ((_tu) << 10) | 156 | #define TU_TO_USEC(_tu) ((_tu) << 10) |
137 | 157 | ||
158 | #define ATH9K_HW_RX_HP_QDEPTH 16 | ||
159 | #define ATH9K_HW_RX_LP_QDEPTH 128 | ||
160 | |||
161 | enum ath_ini_subsys { | ||
162 | ATH_INI_PRE = 0, | ||
163 | ATH_INI_CORE, | ||
164 | ATH_INI_POST, | ||
165 | ATH_INI_NUM_SPLIT, | ||
166 | }; | ||
167 | |||
138 | enum wireless_mode { | 168 | enum wireless_mode { |
139 | ATH9K_MODE_11A = 0, | 169 | ATH9K_MODE_11A = 0, |
140 | ATH9K_MODE_11G, | 170 | ATH9K_MODE_11G, |
@@ -165,13 +195,15 @@ enum ath9k_hw_caps { | |||
165 | ATH9K_HW_CAP_ENHANCEDPM = BIT(14), | 195 | ATH9K_HW_CAP_ENHANCEDPM = BIT(14), |
166 | ATH9K_HW_CAP_AUTOSLEEP = BIT(15), | 196 | ATH9K_HW_CAP_AUTOSLEEP = BIT(15), |
167 | ATH9K_HW_CAP_4KB_SPLITTRANS = BIT(16), | 197 | ATH9K_HW_CAP_4KB_SPLITTRANS = BIT(16), |
198 | ATH9K_HW_CAP_EDMA = BIT(17), | ||
199 | ATH9K_HW_CAP_RAC_SUPPORTED = BIT(18), | ||
200 | ATH9K_HW_CAP_LDPC = BIT(19), | ||
168 | }; | 201 | }; |
169 | 202 | ||
170 | enum ath9k_capability_type { | 203 | enum ath9k_capability_type { |
171 | ATH9K_CAP_CIPHER = 0, | 204 | ATH9K_CAP_CIPHER = 0, |
172 | ATH9K_CAP_TKIP_MIC, | 205 | ATH9K_CAP_TKIP_MIC, |
173 | ATH9K_CAP_TKIP_SPLIT, | 206 | ATH9K_CAP_TKIP_SPLIT, |
174 | ATH9K_CAP_DIVERSITY, | ||
175 | ATH9K_CAP_TXPOW, | 207 | ATH9K_CAP_TXPOW, |
176 | ATH9K_CAP_MCAST_KEYSRCH, | 208 | ATH9K_CAP_MCAST_KEYSRCH, |
177 | ATH9K_CAP_DS | 209 | ATH9K_CAP_DS |
@@ -192,6 +224,11 @@ struct ath9k_hw_capabilities { | |||
192 | u8 num_gpio_pins; | 224 | u8 num_gpio_pins; |
193 | u8 num_antcfg_2ghz; | 225 | u8 num_antcfg_2ghz; |
194 | u8 num_antcfg_5ghz; | 226 | u8 num_antcfg_5ghz; |
227 | u8 rx_hp_qdepth; | ||
228 | u8 rx_lp_qdepth; | ||
229 | u8 rx_status_len; | ||
230 | u8 tx_desc_len; | ||
231 | u8 txs_len; | ||
195 | }; | 232 | }; |
196 | 233 | ||
197 | struct ath9k_ops_config { | 234 | struct ath9k_ops_config { |
@@ -212,6 +249,7 @@ struct ath9k_ops_config { | |||
212 | u32 enable_ani; | 249 | u32 enable_ani; |
213 | int serialize_regmode; | 250 | int serialize_regmode; |
214 | bool rx_intr_mitigation; | 251 | bool rx_intr_mitigation; |
252 | bool tx_intr_mitigation; | ||
215 | #define SPUR_DISABLE 0 | 253 | #define SPUR_DISABLE 0 |
216 | #define SPUR_ENABLE_IOCTL 1 | 254 | #define SPUR_ENABLE_IOCTL 1 |
217 | #define SPUR_ENABLE_EEPROM 2 | 255 | #define SPUR_ENABLE_EEPROM 2 |
@@ -231,6 +269,8 @@ struct ath9k_ops_config { | |||
231 | enum ath9k_int { | 269 | enum ath9k_int { |
232 | ATH9K_INT_RX = 0x00000001, | 270 | ATH9K_INT_RX = 0x00000001, |
233 | ATH9K_INT_RXDESC = 0x00000002, | 271 | ATH9K_INT_RXDESC = 0x00000002, |
272 | ATH9K_INT_RXHP = 0x00000001, | ||
273 | ATH9K_INT_RXLP = 0x00000002, | ||
234 | ATH9K_INT_RXNOFRM = 0x00000008, | 274 | ATH9K_INT_RXNOFRM = 0x00000008, |
235 | ATH9K_INT_RXEOL = 0x00000010, | 275 | ATH9K_INT_RXEOL = 0x00000010, |
236 | ATH9K_INT_RXORN = 0x00000020, | 276 | ATH9K_INT_RXORN = 0x00000020, |
@@ -363,6 +403,12 @@ enum ser_reg_mode { | |||
363 | SER_REG_MODE_AUTO = 2, | 403 | SER_REG_MODE_AUTO = 2, |
364 | }; | 404 | }; |
365 | 405 | ||
406 | enum ath9k_rx_qtype { | ||
407 | ATH9K_RX_QUEUE_HP, | ||
408 | ATH9K_RX_QUEUE_LP, | ||
409 | ATH9K_RX_QUEUE_MAX, | ||
410 | }; | ||
411 | |||
366 | struct ath9k_beacon_state { | 412 | struct ath9k_beacon_state { |
367 | u32 bs_nexttbtt; | 413 | u32 bs_nexttbtt; |
368 | u32 bs_nextdtim; | 414 | u32 bs_nextdtim; |
@@ -440,6 +486,124 @@ struct ath_gen_timer_table { | |||
440 | } timer_mask; | 486 | } timer_mask; |
441 | }; | 487 | }; |
442 | 488 | ||
489 | /** | ||
490 | * struct ath_hw_private_ops - callbacks used internally by hardware code | ||
491 | * | ||
492 | * This structure contains private callbacks designed to only be used internally | ||
493 | * by the hardware core. | ||
494 | * | ||
495 | * @init_cal_settings: setup types of calibrations supported | ||
496 | * @init_cal: starts actual calibration | ||
497 | * | ||
498 | * @init_mode_regs: Initializes mode registers | ||
499 | * @init_mode_gain_regs: Initialize TX/RX gain registers | ||
500 | * @macversion_supported: If this specific mac revision is supported | ||
501 | * | ||
502 | * @rf_set_freq: change frequency | ||
503 | * @spur_mitigate_freq: spur mitigation | ||
504 | * @rf_alloc_ext_banks: | ||
505 | * @rf_free_ext_banks: | ||
506 | * @set_rf_regs: | ||
507 | * @compute_pll_control: compute the PLL control value to use for | ||
508 | * AR_RTC_PLL_CONTROL for a given channel | ||
509 | * @setup_calibration: set up calibration | ||
510 | * @iscal_supported: used to query if a type of calibration is supported | ||
511 | * @loadnf: load noise floor read from each chain on the CCA registers | ||
512 | */ | ||
513 | struct ath_hw_private_ops { | ||
514 | /* Calibration ops */ | ||
515 | void (*init_cal_settings)(struct ath_hw *ah); | ||
516 | bool (*init_cal)(struct ath_hw *ah, struct ath9k_channel *chan); | ||
517 | |||
518 | void (*init_mode_regs)(struct ath_hw *ah); | ||
519 | void (*init_mode_gain_regs)(struct ath_hw *ah); | ||
520 | bool (*macversion_supported)(u32 macversion); | ||
521 | void (*setup_calibration)(struct ath_hw *ah, | ||
522 | struct ath9k_cal_list *currCal); | ||
523 | bool (*iscal_supported)(struct ath_hw *ah, | ||
524 | enum ath9k_cal_types calType); | ||
525 | |||
526 | /* PHY ops */ | ||
527 | int (*rf_set_freq)(struct ath_hw *ah, | ||
528 | struct ath9k_channel *chan); | ||
529 | void (*spur_mitigate_freq)(struct ath_hw *ah, | ||
530 | struct ath9k_channel *chan); | ||
531 | int (*rf_alloc_ext_banks)(struct ath_hw *ah); | ||
532 | void (*rf_free_ext_banks)(struct ath_hw *ah); | ||
533 | bool (*set_rf_regs)(struct ath_hw *ah, | ||
534 | struct ath9k_channel *chan, | ||
535 | u16 modesIndex); | ||
536 | void (*set_channel_regs)(struct ath_hw *ah, struct ath9k_channel *chan); | ||
537 | void (*init_bb)(struct ath_hw *ah, | ||
538 | struct ath9k_channel *chan); | ||
539 | int (*process_ini)(struct ath_hw *ah, struct ath9k_channel *chan); | ||
540 | void (*olc_init)(struct ath_hw *ah); | ||
541 | void (*set_rfmode)(struct ath_hw *ah, struct ath9k_channel *chan); | ||
542 | void (*mark_phy_inactive)(struct ath_hw *ah); | ||
543 | void (*set_delta_slope)(struct ath_hw *ah, struct ath9k_channel *chan); | ||
544 | bool (*rfbus_req)(struct ath_hw *ah); | ||
545 | void (*rfbus_done)(struct ath_hw *ah); | ||
546 | void (*enable_rfkill)(struct ath_hw *ah); | ||
547 | void (*restore_chainmask)(struct ath_hw *ah); | ||
548 | void (*set_diversity)(struct ath_hw *ah, bool value); | ||
549 | u32 (*compute_pll_control)(struct ath_hw *ah, | ||
550 | struct ath9k_channel *chan); | ||
551 | bool (*ani_control)(struct ath_hw *ah, enum ath9k_ani_cmd cmd, | ||
552 | int param); | ||
553 | void (*do_getnf)(struct ath_hw *ah, int16_t nfarray[NUM_NF_READINGS]); | ||
554 | void (*loadnf)(struct ath_hw *ah, struct ath9k_channel *chan); | ||
555 | }; | ||
556 | |||
557 | /** | ||
558 | * struct ath_hw_ops - callbacks used by hardware code and driver code | ||
559 | * | ||
560 | * This structure contains callbacks designed to to be used internally by | ||
561 | * hardware code and also by the lower level driver. | ||
562 | * | ||
563 | * @config_pci_powersave: | ||
564 | * @calibrate: periodic calibration for NF, ANI, IQ, ADC gain, ADC-DC | ||
565 | */ | ||
566 | struct ath_hw_ops { | ||
567 | void (*config_pci_powersave)(struct ath_hw *ah, | ||
568 | int restore, | ||
569 | int power_off); | ||
570 | void (*rx_enable)(struct ath_hw *ah); | ||
571 | void (*set_desc_link)(void *ds, u32 link); | ||
572 | void (*get_desc_link)(void *ds, u32 **link); | ||
573 | bool (*calibrate)(struct ath_hw *ah, | ||
574 | struct ath9k_channel *chan, | ||
575 | u8 rxchainmask, | ||
576 | bool longcal); | ||
577 | bool (*get_isr)(struct ath_hw *ah, enum ath9k_int *masked); | ||
578 | void (*fill_txdesc)(struct ath_hw *ah, void *ds, u32 seglen, | ||
579 | bool is_firstseg, bool is_is_lastseg, | ||
580 | const void *ds0, dma_addr_t buf_addr, | ||
581 | unsigned int qcu); | ||
582 | int (*proc_txdesc)(struct ath_hw *ah, void *ds, | ||
583 | struct ath_tx_status *ts); | ||
584 | void (*set11n_txdesc)(struct ath_hw *ah, void *ds, | ||
585 | u32 pktLen, enum ath9k_pkt_type type, | ||
586 | u32 txPower, u32 keyIx, | ||
587 | enum ath9k_key_type keyType, | ||
588 | u32 flags); | ||
589 | void (*set11n_ratescenario)(struct ath_hw *ah, void *ds, | ||
590 | void *lastds, | ||
591 | u32 durUpdateEn, u32 rtsctsRate, | ||
592 | u32 rtsctsDuration, | ||
593 | struct ath9k_11n_rate_series series[], | ||
594 | u32 nseries, u32 flags); | ||
595 | void (*set11n_aggr_first)(struct ath_hw *ah, void *ds, | ||
596 | u32 aggrLen); | ||
597 | void (*set11n_aggr_middle)(struct ath_hw *ah, void *ds, | ||
598 | u32 numDelims); | ||
599 | void (*set11n_aggr_last)(struct ath_hw *ah, void *ds); | ||
600 | void (*clr11n_aggr)(struct ath_hw *ah, void *ds); | ||
601 | void (*set11n_burstduration)(struct ath_hw *ah, void *ds, | ||
602 | u32 burstDuration); | ||
603 | void (*set11n_virtualmorefrag)(struct ath_hw *ah, void *ds, | ||
604 | u32 vmf); | ||
605 | }; | ||
606 | |||
443 | struct ath_hw { | 607 | struct ath_hw { |
444 | struct ieee80211_hw *hw; | 608 | struct ieee80211_hw *hw; |
445 | struct ath_common common; | 609 | struct ath_common common; |
@@ -453,14 +617,18 @@ struct ath_hw { | |||
453 | struct ar5416_eeprom_def def; | 617 | struct ar5416_eeprom_def def; |
454 | struct ar5416_eeprom_4k map4k; | 618 | struct ar5416_eeprom_4k map4k; |
455 | struct ar9287_eeprom map9287; | 619 | struct ar9287_eeprom map9287; |
620 | struct ar9300_eeprom ar9300_eep; | ||
456 | } eeprom; | 621 | } eeprom; |
457 | const struct eeprom_ops *eep_ops; | 622 | const struct eeprom_ops *eep_ops; |
458 | enum ath9k_eep_map eep_map; | ||
459 | 623 | ||
460 | bool sw_mgmt_crypto; | 624 | bool sw_mgmt_crypto; |
461 | bool is_pciexpress; | 625 | bool is_pciexpress; |
462 | bool need_an_top2_fixup; | 626 | bool need_an_top2_fixup; |
463 | u16 tx_trig_level; | 627 | u16 tx_trig_level; |
628 | s16 nf_2g_max; | ||
629 | s16 nf_2g_min; | ||
630 | s16 nf_5g_max; | ||
631 | s16 nf_5g_min; | ||
464 | u16 rfsilent; | 632 | u16 rfsilent; |
465 | u32 rfkill_gpio; | 633 | u32 rfkill_gpio; |
466 | u32 rfkill_polarity; | 634 | u32 rfkill_polarity; |
@@ -493,6 +661,7 @@ struct ath_hw { | |||
493 | struct ath9k_cal_list adcgain_caldata; | 661 | struct ath9k_cal_list adcgain_caldata; |
494 | struct ath9k_cal_list adcdc_calinitdata; | 662 | struct ath9k_cal_list adcdc_calinitdata; |
495 | struct ath9k_cal_list adcdc_caldata; | 663 | struct ath9k_cal_list adcdc_caldata; |
664 | struct ath9k_cal_list tempCompCalData; | ||
496 | struct ath9k_cal_list *cal_list; | 665 | struct ath9k_cal_list *cal_list; |
497 | struct ath9k_cal_list *cal_list_last; | 666 | struct ath9k_cal_list *cal_list_last; |
498 | struct ath9k_cal_list *cal_list_curr; | 667 | struct ath9k_cal_list *cal_list_curr; |
@@ -533,12 +702,10 @@ struct ath_hw { | |||
533 | DONT_USE_32KHZ, | 702 | DONT_USE_32KHZ, |
534 | } enable_32kHz_clock; | 703 | } enable_32kHz_clock; |
535 | 704 | ||
536 | /* Callback for radio frequency change */ | 705 | /* Private to hardware code */ |
537 | int (*ath9k_hw_rf_set_freq)(struct ath_hw *ah, struct ath9k_channel *chan); | 706 | struct ath_hw_private_ops private_ops; |
538 | 707 | /* Accessed by the lower level driver */ | |
539 | /* Callback for baseband spur frequency */ | 708 | struct ath_hw_ops ops; |
540 | void (*ath9k_hw_spur_mitigate_freq)(struct ath_hw *ah, | ||
541 | struct ath9k_channel *chan); | ||
542 | 709 | ||
543 | /* Used to program the radio on non single-chip devices */ | 710 | /* Used to program the radio on non single-chip devices */ |
544 | u32 *analogBank0Data; | 711 | u32 *analogBank0Data; |
@@ -592,6 +759,7 @@ struct ath_hw { | |||
592 | struct ar5416IniArray iniBank7; | 759 | struct ar5416IniArray iniBank7; |
593 | struct ar5416IniArray iniAddac; | 760 | struct ar5416IniArray iniAddac; |
594 | struct ar5416IniArray iniPcieSerdes; | 761 | struct ar5416IniArray iniPcieSerdes; |
762 | struct ar5416IniArray iniPcieSerdesLowPower; | ||
595 | struct ar5416IniArray iniModesAdditional; | 763 | struct ar5416IniArray iniModesAdditional; |
596 | struct ar5416IniArray iniModesRxGain; | 764 | struct ar5416IniArray iniModesRxGain; |
597 | struct ar5416IniArray iniModesTxGain; | 765 | struct ar5416IniArray iniModesTxGain; |
@@ -604,9 +772,21 @@ struct ath_hw { | |||
604 | struct ar5416IniArray iniModes_high_power_tx_gain_9271; | 772 | struct ar5416IniArray iniModes_high_power_tx_gain_9271; |
605 | struct ar5416IniArray iniModes_normal_power_tx_gain_9271; | 773 | struct ar5416IniArray iniModes_normal_power_tx_gain_9271; |
606 | 774 | ||
775 | struct ar5416IniArray iniMac[ATH_INI_NUM_SPLIT]; | ||
776 | struct ar5416IniArray iniBB[ATH_INI_NUM_SPLIT]; | ||
777 | struct ar5416IniArray iniRadio[ATH_INI_NUM_SPLIT]; | ||
778 | struct ar5416IniArray iniSOC[ATH_INI_NUM_SPLIT]; | ||
779 | |||
607 | u32 intr_gen_timer_trigger; | 780 | u32 intr_gen_timer_trigger; |
608 | u32 intr_gen_timer_thresh; | 781 | u32 intr_gen_timer_thresh; |
609 | struct ath_gen_timer_table hw_gen_timers; | 782 | struct ath_gen_timer_table hw_gen_timers; |
783 | |||
784 | struct ar9003_txs *ts_ring; | ||
785 | void *ts_start; | ||
786 | u32 ts_paddr_start; | ||
787 | u32 ts_paddr_end; | ||
788 | u16 ts_tail; | ||
789 | u8 ts_size; | ||
610 | }; | 790 | }; |
611 | 791 | ||
612 | static inline struct ath_common *ath9k_hw_common(struct ath_hw *ah) | 792 | static inline struct ath_common *ath9k_hw_common(struct ath_hw *ah) |
@@ -619,6 +799,16 @@ static inline struct ath_regulatory *ath9k_hw_regulatory(struct ath_hw *ah) | |||
619 | return &(ath9k_hw_common(ah)->regulatory); | 799 | return &(ath9k_hw_common(ah)->regulatory); |
620 | } | 800 | } |
621 | 801 | ||
802 | static inline struct ath_hw_private_ops *ath9k_hw_private_ops(struct ath_hw *ah) | ||
803 | { | ||
804 | return &ah->private_ops; | ||
805 | } | ||
806 | |||
807 | static inline struct ath_hw_ops *ath9k_hw_ops(struct ath_hw *ah) | ||
808 | { | ||
809 | return &ah->ops; | ||
810 | } | ||
811 | |||
622 | /* Initialization, Detach, Reset */ | 812 | /* Initialization, Detach, Reset */ |
623 | const char *ath9k_hw_probe(u16 vendorid, u16 devid); | 813 | const char *ath9k_hw_probe(u16 vendorid, u16 devid); |
624 | void ath9k_hw_deinit(struct ath_hw *ah); | 814 | void ath9k_hw_deinit(struct ath_hw *ah); |
@@ -630,6 +820,7 @@ bool ath9k_hw_getcapability(struct ath_hw *ah, enum ath9k_capability_type type, | |||
630 | u32 capability, u32 *result); | 820 | u32 capability, u32 *result); |
631 | bool ath9k_hw_setcapability(struct ath_hw *ah, enum ath9k_capability_type type, | 821 | bool ath9k_hw_setcapability(struct ath_hw *ah, enum ath9k_capability_type type, |
632 | u32 capability, u32 setting, int *status); | 822 | u32 capability, u32 setting, int *status); |
823 | u32 ath9k_regd_get_ctl(struct ath_regulatory *reg, struct ath9k_channel *chan); | ||
633 | 824 | ||
634 | /* Key Cache Management */ | 825 | /* Key Cache Management */ |
635 | bool ath9k_hw_keyreset(struct ath_hw *ah, u16 entry); | 826 | bool ath9k_hw_keyreset(struct ath_hw *ah, u16 entry); |
@@ -678,16 +869,10 @@ void ath9k_hw_set11nmac2040(struct ath_hw *ah); | |||
678 | void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period); | 869 | void ath9k_hw_beaconinit(struct ath_hw *ah, u32 next_beacon, u32 beacon_period); |
679 | void ath9k_hw_set_sta_beacon_timers(struct ath_hw *ah, | 870 | void ath9k_hw_set_sta_beacon_timers(struct ath_hw *ah, |
680 | const struct ath9k_beacon_state *bs); | 871 | const struct ath9k_beacon_state *bs); |
872 | bool ath9k_hw_check_alive(struct ath_hw *ah); | ||
681 | 873 | ||
682 | bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode); | 874 | bool ath9k_hw_setpower(struct ath_hw *ah, enum ath9k_power_mode mode); |
683 | 875 | ||
684 | void ath9k_hw_configpcipowersave(struct ath_hw *ah, int restore, int power_off); | ||
685 | |||
686 | /* Interrupt Handling */ | ||
687 | bool ath9k_hw_intrpend(struct ath_hw *ah); | ||
688 | bool ath9k_hw_getisr(struct ath_hw *ah, enum ath9k_int *masked); | ||
689 | enum ath9k_int ath9k_hw_set_interrupts(struct ath_hw *ah, enum ath9k_int ints); | ||
690 | |||
691 | /* Generic hw timer primitives */ | 876 | /* Generic hw timer primitives */ |
692 | struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah, | 877 | struct ath_gen_timer *ath_gen_timer_alloc(struct ath_hw *ah, |
693 | void (*trigger)(void *), | 878 | void (*trigger)(void *), |
@@ -709,6 +894,36 @@ void ath9k_hw_name(struct ath_hw *ah, char *hw_name, size_t len); | |||
709 | /* HTC */ | 894 | /* HTC */ |
710 | void ath9k_hw_htc_resetinit(struct ath_hw *ah); | 895 | void ath9k_hw_htc_resetinit(struct ath_hw *ah); |
711 | 896 | ||
897 | /* PHY */ | ||
898 | void ath9k_hw_get_delta_slope_vals(struct ath_hw *ah, u32 coef_scaled, | ||
899 | u32 *coef_mantissa, u32 *coef_exponent); | ||
900 | |||
901 | /* | ||
902 | * Code Specific to AR5008, AR9001 or AR9002, | ||
903 | * we stuff these here to avoid callbacks for AR9003. | ||
904 | */ | ||
905 | void ar9002_hw_cck_chan14_spread(struct ath_hw *ah); | ||
906 | int ar9002_hw_rf_claim(struct ath_hw *ah); | ||
907 | void ar9002_hw_enable_async_fifo(struct ath_hw *ah); | ||
908 | void ar9002_hw_enable_wep_aggregation(struct ath_hw *ah); | ||
909 | |||
910 | /* | ||
911 | * Code specifric to AR9003, we stuff these here to avoid callbacks | ||
912 | * for older families | ||
913 | */ | ||
914 | void ar9003_hw_set_nf_limits(struct ath_hw *ah); | ||
915 | |||
916 | /* Hardware family op attach helpers */ | ||
917 | void ar5008_hw_attach_phy_ops(struct ath_hw *ah); | ||
918 | void ar9002_hw_attach_phy_ops(struct ath_hw *ah); | ||
919 | void ar9003_hw_attach_phy_ops(struct ath_hw *ah); | ||
920 | |||
921 | void ar9002_hw_attach_calib_ops(struct ath_hw *ah); | ||
922 | void ar9003_hw_attach_calib_ops(struct ath_hw *ah); | ||
923 | |||
924 | void ar9002_hw_attach_ops(struct ath_hw *ah); | ||
925 | void ar9003_hw_attach_ops(struct ath_hw *ah); | ||
926 | |||
712 | #define ATH_PCIE_CAP_LINK_CTRL 0x70 | 927 | #define ATH_PCIE_CAP_LINK_CTRL 0x70 |
713 | #define ATH_PCIE_CAP_LINK_L0S 1 | 928 | #define ATH_PCIE_CAP_LINK_L0S 1 |
714 | #define ATH_PCIE_CAP_LINK_L1 2 | 929 | #define ATH_PCIE_CAP_LINK_L1 2 |
diff --git a/drivers/net/wireless/ath/ath9k/init.c b/drivers/net/wireless/ath/ath9k/init.c index b78308c3c4d4..8c795488ebc3 100644 --- a/drivers/net/wireless/ath/ath9k/init.c +++ b/drivers/net/wireless/ath/ath9k/init.c | |||
@@ -175,6 +175,18 @@ static const struct ath_ops ath9k_common_ops = { | |||
175 | .write = ath9k_iowrite32, | 175 | .write = ath9k_iowrite32, |
176 | }; | 176 | }; |
177 | 177 | ||
178 | static int count_streams(unsigned int chainmask, int max) | ||
179 | { | ||
180 | int streams = 0; | ||
181 | |||
182 | do { | ||
183 | if (++streams == max) | ||
184 | break; | ||
185 | } while ((chainmask = chainmask & (chainmask - 1))); | ||
186 | |||
187 | return streams; | ||
188 | } | ||
189 | |||
178 | /**************************/ | 190 | /**************************/ |
179 | /* Initialization */ | 191 | /* Initialization */ |
180 | /**************************/ | 192 | /**************************/ |
@@ -182,8 +194,10 @@ static const struct ath_ops ath9k_common_ops = { | |||
182 | static void setup_ht_cap(struct ath_softc *sc, | 194 | static void setup_ht_cap(struct ath_softc *sc, |
183 | struct ieee80211_sta_ht_cap *ht_info) | 195 | struct ieee80211_sta_ht_cap *ht_info) |
184 | { | 196 | { |
185 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); | 197 | struct ath_hw *ah = sc->sc_ah; |
198 | struct ath_common *common = ath9k_hw_common(ah); | ||
186 | u8 tx_streams, rx_streams; | 199 | u8 tx_streams, rx_streams; |
200 | int i, max_streams; | ||
187 | 201 | ||
188 | ht_info->ht_supported = true; | 202 | ht_info->ht_supported = true; |
189 | ht_info->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 | | 203 | ht_info->cap = IEEE80211_HT_CAP_SUP_WIDTH_20_40 | |
@@ -191,28 +205,40 @@ static void setup_ht_cap(struct ath_softc *sc, | |||
191 | IEEE80211_HT_CAP_SGI_40 | | 205 | IEEE80211_HT_CAP_SGI_40 | |
192 | IEEE80211_HT_CAP_DSSSCCK40; | 206 | IEEE80211_HT_CAP_DSSSCCK40; |
193 | 207 | ||
208 | if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_LDPC) | ||
209 | ht_info->cap |= IEEE80211_HT_CAP_LDPC_CODING; | ||
210 | |||
194 | ht_info->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; | 211 | ht_info->ampdu_factor = IEEE80211_HT_MAX_AMPDU_64K; |
195 | ht_info->ampdu_density = IEEE80211_HT_MPDU_DENSITY_8; | 212 | ht_info->ampdu_density = IEEE80211_HT_MPDU_DENSITY_8; |
196 | 213 | ||
214 | if (AR_SREV_9300_20_OR_LATER(ah)) | ||
215 | max_streams = 3; | ||
216 | else | ||
217 | max_streams = 2; | ||
218 | |||
219 | if (AR_SREV_9280_10_OR_LATER(ah)) { | ||
220 | if (max_streams >= 2) | ||
221 | ht_info->cap |= IEEE80211_HT_CAP_TX_STBC; | ||
222 | ht_info->cap |= (1 << IEEE80211_HT_CAP_RX_STBC_SHIFT); | ||
223 | } | ||
224 | |||
197 | /* set up supported mcs set */ | 225 | /* set up supported mcs set */ |
198 | memset(&ht_info->mcs, 0, sizeof(ht_info->mcs)); | 226 | memset(&ht_info->mcs, 0, sizeof(ht_info->mcs)); |
199 | tx_streams = !(common->tx_chainmask & (common->tx_chainmask - 1)) ? | 227 | tx_streams = count_streams(common->tx_chainmask, max_streams); |
200 | 1 : 2; | 228 | rx_streams = count_streams(common->rx_chainmask, max_streams); |
201 | rx_streams = !(common->rx_chainmask & (common->rx_chainmask - 1)) ? | 229 | |
202 | 1 : 2; | 230 | ath_print(common, ATH_DBG_CONFIG, |
231 | "TX streams %d, RX streams: %d\n", | ||
232 | tx_streams, rx_streams); | ||
203 | 233 | ||
204 | if (tx_streams != rx_streams) { | 234 | if (tx_streams != rx_streams) { |
205 | ath_print(common, ATH_DBG_CONFIG, | ||
206 | "TX streams %d, RX streams: %d\n", | ||
207 | tx_streams, rx_streams); | ||
208 | ht_info->mcs.tx_params |= IEEE80211_HT_MCS_TX_RX_DIFF; | 235 | ht_info->mcs.tx_params |= IEEE80211_HT_MCS_TX_RX_DIFF; |
209 | ht_info->mcs.tx_params |= ((tx_streams - 1) << | 236 | ht_info->mcs.tx_params |= ((tx_streams - 1) << |
210 | IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT); | 237 | IEEE80211_HT_MCS_TX_MAX_STREAMS_SHIFT); |
211 | } | 238 | } |
212 | 239 | ||
213 | ht_info->mcs.rx_mask[0] = 0xff; | 240 | for (i = 0; i < rx_streams; i++) |
214 | if (rx_streams >= 2) | 241 | ht_info->mcs.rx_mask[i] = 0xff; |
215 | ht_info->mcs.rx_mask[1] = 0xff; | ||
216 | 242 | ||
217 | ht_info->mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED; | 243 | ht_info->mcs.tx_params |= IEEE80211_HT_MCS_TX_DEFINED; |
218 | } | 244 | } |
@@ -235,31 +261,37 @@ static int ath9k_reg_notifier(struct wiphy *wiphy, | |||
235 | */ | 261 | */ |
236 | int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd, | 262 | int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd, |
237 | struct list_head *head, const char *name, | 263 | struct list_head *head, const char *name, |
238 | int nbuf, int ndesc) | 264 | int nbuf, int ndesc, bool is_tx) |
239 | { | 265 | { |
240 | #define DS2PHYS(_dd, _ds) \ | 266 | #define DS2PHYS(_dd, _ds) \ |
241 | ((_dd)->dd_desc_paddr + ((caddr_t)(_ds) - (caddr_t)(_dd)->dd_desc)) | 267 | ((_dd)->dd_desc_paddr + ((caddr_t)(_ds) - (caddr_t)(_dd)->dd_desc)) |
242 | #define ATH_DESC_4KB_BOUND_CHECK(_daddr) ((((_daddr) & 0xFFF) > 0xF7F) ? 1 : 0) | 268 | #define ATH_DESC_4KB_BOUND_CHECK(_daddr) ((((_daddr) & 0xFFF) > 0xF7F) ? 1 : 0) |
243 | #define ATH_DESC_4KB_BOUND_NUM_SKIPPED(_len) ((_len) / 4096) | 269 | #define ATH_DESC_4KB_BOUND_NUM_SKIPPED(_len) ((_len) / 4096) |
244 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); | 270 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); |
245 | struct ath_desc *ds; | 271 | u8 *ds; |
246 | struct ath_buf *bf; | 272 | struct ath_buf *bf; |
247 | int i, bsize, error; | 273 | int i, bsize, error, desc_len; |
248 | 274 | ||
249 | ath_print(common, ATH_DBG_CONFIG, "%s DMA: %u buffers %u desc/buf\n", | 275 | ath_print(common, ATH_DBG_CONFIG, "%s DMA: %u buffers %u desc/buf\n", |
250 | name, nbuf, ndesc); | 276 | name, nbuf, ndesc); |
251 | 277 | ||
252 | INIT_LIST_HEAD(head); | 278 | INIT_LIST_HEAD(head); |
279 | |||
280 | if (is_tx) | ||
281 | desc_len = sc->sc_ah->caps.tx_desc_len; | ||
282 | else | ||
283 | desc_len = sizeof(struct ath_desc); | ||
284 | |||
253 | /* ath_desc must be a multiple of DWORDs */ | 285 | /* ath_desc must be a multiple of DWORDs */ |
254 | if ((sizeof(struct ath_desc) % 4) != 0) { | 286 | if ((desc_len % 4) != 0) { |
255 | ath_print(common, ATH_DBG_FATAL, | 287 | ath_print(common, ATH_DBG_FATAL, |
256 | "ath_desc not DWORD aligned\n"); | 288 | "ath_desc not DWORD aligned\n"); |
257 | BUG_ON((sizeof(struct ath_desc) % 4) != 0); | 289 | BUG_ON((desc_len % 4) != 0); |
258 | error = -ENOMEM; | 290 | error = -ENOMEM; |
259 | goto fail; | 291 | goto fail; |
260 | } | 292 | } |
261 | 293 | ||
262 | dd->dd_desc_len = sizeof(struct ath_desc) * nbuf * ndesc; | 294 | dd->dd_desc_len = desc_len * nbuf * ndesc; |
263 | 295 | ||
264 | /* | 296 | /* |
265 | * Need additional DMA memory because we can't use | 297 | * Need additional DMA memory because we can't use |
@@ -272,7 +304,7 @@ int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd, | |||
272 | u32 dma_len; | 304 | u32 dma_len; |
273 | 305 | ||
274 | while (ndesc_skipped) { | 306 | while (ndesc_skipped) { |
275 | dma_len = ndesc_skipped * sizeof(struct ath_desc); | 307 | dma_len = ndesc_skipped * desc_len; |
276 | dd->dd_desc_len += dma_len; | 308 | dd->dd_desc_len += dma_len; |
277 | 309 | ||
278 | ndesc_skipped = ATH_DESC_4KB_BOUND_NUM_SKIPPED(dma_len); | 310 | ndesc_skipped = ATH_DESC_4KB_BOUND_NUM_SKIPPED(dma_len); |
@@ -286,7 +318,7 @@ int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd, | |||
286 | error = -ENOMEM; | 318 | error = -ENOMEM; |
287 | goto fail; | 319 | goto fail; |
288 | } | 320 | } |
289 | ds = dd->dd_desc; | 321 | ds = (u8 *) dd->dd_desc; |
290 | ath_print(common, ATH_DBG_CONFIG, "%s DMA map: %p (%u) -> %llx (%u)\n", | 322 | ath_print(common, ATH_DBG_CONFIG, "%s DMA map: %p (%u) -> %llx (%u)\n", |
291 | name, ds, (u32) dd->dd_desc_len, | 323 | name, ds, (u32) dd->dd_desc_len, |
292 | ito64(dd->dd_desc_paddr), /*XXX*/(u32) dd->dd_desc_len); | 324 | ito64(dd->dd_desc_paddr), /*XXX*/(u32) dd->dd_desc_len); |
@@ -300,7 +332,7 @@ int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd, | |||
300 | } | 332 | } |
301 | dd->dd_bufptr = bf; | 333 | dd->dd_bufptr = bf; |
302 | 334 | ||
303 | for (i = 0; i < nbuf; i++, bf++, ds += ndesc) { | 335 | for (i = 0; i < nbuf; i++, bf++, ds += (desc_len * ndesc)) { |
304 | bf->bf_desc = ds; | 336 | bf->bf_desc = ds; |
305 | bf->bf_daddr = DS2PHYS(dd, ds); | 337 | bf->bf_daddr = DS2PHYS(dd, ds); |
306 | 338 | ||
@@ -316,7 +348,7 @@ int ath_descdma_setup(struct ath_softc *sc, struct ath_descdma *dd, | |||
316 | ((caddr_t) dd->dd_desc + | 348 | ((caddr_t) dd->dd_desc + |
317 | dd->dd_desc_len)); | 349 | dd->dd_desc_len)); |
318 | 350 | ||
319 | ds += ndesc; | 351 | ds += (desc_len * ndesc); |
320 | bf->bf_desc = ds; | 352 | bf->bf_desc = ds; |
321 | bf->bf_daddr = DS2PHYS(dd, ds); | 353 | bf->bf_daddr = DS2PHYS(dd, ds); |
322 | } | 354 | } |
@@ -514,7 +546,7 @@ static void ath9k_init_misc(struct ath_softc *sc) | |||
514 | common->tx_chainmask = sc->sc_ah->caps.tx_chainmask; | 546 | common->tx_chainmask = sc->sc_ah->caps.tx_chainmask; |
515 | common->rx_chainmask = sc->sc_ah->caps.rx_chainmask; | 547 | common->rx_chainmask = sc->sc_ah->caps.rx_chainmask; |
516 | 548 | ||
517 | ath9k_hw_setcapability(sc->sc_ah, ATH9K_CAP_DIVERSITY, 1, true, NULL); | 549 | ath9k_hw_set_diversity(sc->sc_ah, true); |
518 | sc->rx.defant = ath9k_hw_getdefantenna(sc->sc_ah); | 550 | sc->rx.defant = ath9k_hw_getdefantenna(sc->sc_ah); |
519 | 551 | ||
520 | if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_BSSIDMASK) | 552 | if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_BSSIDMASK) |
@@ -568,13 +600,10 @@ static int ath9k_init_softc(u16 devid, struct ath_softc *sc, u16 subsysid, | |||
568 | ath_read_cachesize(common, &csz); | 600 | ath_read_cachesize(common, &csz); |
569 | common->cachelsz = csz << 2; /* convert to bytes */ | 601 | common->cachelsz = csz << 2; /* convert to bytes */ |
570 | 602 | ||
603 | /* Initializes the hardware for all supported chipsets */ | ||
571 | ret = ath9k_hw_init(ah); | 604 | ret = ath9k_hw_init(ah); |
572 | if (ret) { | 605 | if (ret) |
573 | ath_print(common, ATH_DBG_FATAL, | ||
574 | "Unable to initialize hardware; " | ||
575 | "initialization status: %d\n", ret); | ||
576 | goto err_hw; | 606 | goto err_hw; |
577 | } | ||
578 | 607 | ||
579 | ret = ath9k_init_debug(ah); | 608 | ret = ath9k_init_debug(ah); |
580 | if (ret) { | 609 | if (ret) { |
diff --git a/drivers/net/wireless/ath/ath9k/mac.c b/drivers/net/wireless/ath/ath9k/mac.c index 4a2060e5a777..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) |
@@ -57,6 +62,18 @@ void ath9k_hw_txstart(struct ath_hw *ah, u32 q) | |||
57 | } | 62 | } |
58 | EXPORT_SYMBOL(ath9k_hw_txstart); | 63 | EXPORT_SYMBOL(ath9k_hw_txstart); |
59 | 64 | ||
65 | void ath9k_hw_cleartxdesc(struct ath_hw *ah, void *ds) | ||
66 | { | ||
67 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
68 | |||
69 | ads->ds_txstatus0 = ads->ds_txstatus1 = 0; | ||
70 | ads->ds_txstatus2 = ads->ds_txstatus3 = 0; | ||
71 | ads->ds_txstatus4 = ads->ds_txstatus5 = 0; | ||
72 | ads->ds_txstatus6 = ads->ds_txstatus7 = 0; | ||
73 | ads->ds_txstatus8 = ads->ds_txstatus9 = 0; | ||
74 | } | ||
75 | EXPORT_SYMBOL(ath9k_hw_cleartxdesc); | ||
76 | |||
60 | u32 ath9k_hw_numtxpending(struct ath_hw *ah, u32 q) | 77 | u32 ath9k_hw_numtxpending(struct ath_hw *ah, u32 q) |
61 | { | 78 | { |
62 | u32 npend; | 79 | u32 npend; |
@@ -207,281 +224,6 @@ bool ath9k_hw_stoptxdma(struct ath_hw *ah, u32 q) | |||
207 | } | 224 | } |
208 | EXPORT_SYMBOL(ath9k_hw_stoptxdma); | 225 | EXPORT_SYMBOL(ath9k_hw_stoptxdma); |
209 | 226 | ||
210 | void ath9k_hw_filltxdesc(struct ath_hw *ah, struct ath_desc *ds, | ||
211 | u32 segLen, bool firstSeg, | ||
212 | bool lastSeg, const struct ath_desc *ds0) | ||
213 | { | ||
214 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
215 | |||
216 | if (firstSeg) { | ||
217 | ads->ds_ctl1 |= segLen | (lastSeg ? 0 : AR_TxMore); | ||
218 | } else if (lastSeg) { | ||
219 | ads->ds_ctl0 = 0; | ||
220 | ads->ds_ctl1 = segLen; | ||
221 | ads->ds_ctl2 = AR5416DESC_CONST(ds0)->ds_ctl2; | ||
222 | ads->ds_ctl3 = AR5416DESC_CONST(ds0)->ds_ctl3; | ||
223 | } else { | ||
224 | ads->ds_ctl0 = 0; | ||
225 | ads->ds_ctl1 = segLen | AR_TxMore; | ||
226 | ads->ds_ctl2 = 0; | ||
227 | ads->ds_ctl3 = 0; | ||
228 | } | ||
229 | ads->ds_txstatus0 = ads->ds_txstatus1 = 0; | ||
230 | ads->ds_txstatus2 = ads->ds_txstatus3 = 0; | ||
231 | ads->ds_txstatus4 = ads->ds_txstatus5 = 0; | ||
232 | ads->ds_txstatus6 = ads->ds_txstatus7 = 0; | ||
233 | ads->ds_txstatus8 = ads->ds_txstatus9 = 0; | ||
234 | } | ||
235 | EXPORT_SYMBOL(ath9k_hw_filltxdesc); | ||
236 | |||
237 | void ath9k_hw_cleartxdesc(struct ath_hw *ah, struct ath_desc *ds) | ||
238 | { | ||
239 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
240 | |||
241 | ads->ds_txstatus0 = ads->ds_txstatus1 = 0; | ||
242 | ads->ds_txstatus2 = ads->ds_txstatus3 = 0; | ||
243 | ads->ds_txstatus4 = ads->ds_txstatus5 = 0; | ||
244 | ads->ds_txstatus6 = ads->ds_txstatus7 = 0; | ||
245 | ads->ds_txstatus8 = ads->ds_txstatus9 = 0; | ||
246 | } | ||
247 | EXPORT_SYMBOL(ath9k_hw_cleartxdesc); | ||
248 | |||
249 | int ath9k_hw_txprocdesc(struct ath_hw *ah, struct ath_desc *ds, | ||
250 | struct ath_tx_status *ts) | ||
251 | { | ||
252 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
253 | |||
254 | if ((ads->ds_txstatus9 & AR_TxDone) == 0) | ||
255 | return -EINPROGRESS; | ||
256 | |||
257 | ts->ts_seqnum = MS(ads->ds_txstatus9, AR_SeqNum); | ||
258 | ts->ts_tstamp = ads->AR_SendTimestamp; | ||
259 | ts->ts_status = 0; | ||
260 | ts->ts_flags = 0; | ||
261 | |||
262 | if (ads->ds_txstatus1 & AR_FrmXmitOK) | ||
263 | ts->ts_status |= ATH9K_TX_ACKED; | ||
264 | if (ads->ds_txstatus1 & AR_ExcessiveRetries) | ||
265 | ts->ts_status |= ATH9K_TXERR_XRETRY; | ||
266 | if (ads->ds_txstatus1 & AR_Filtered) | ||
267 | ts->ts_status |= ATH9K_TXERR_FILT; | ||
268 | if (ads->ds_txstatus1 & AR_FIFOUnderrun) { | ||
269 | ts->ts_status |= ATH9K_TXERR_FIFO; | ||
270 | ath9k_hw_updatetxtriglevel(ah, true); | ||
271 | } | ||
272 | if (ads->ds_txstatus9 & AR_TxOpExceeded) | ||
273 | ts->ts_status |= ATH9K_TXERR_XTXOP; | ||
274 | if (ads->ds_txstatus1 & AR_TxTimerExpired) | ||
275 | ts->ts_status |= ATH9K_TXERR_TIMER_EXPIRED; | ||
276 | |||
277 | if (ads->ds_txstatus1 & AR_DescCfgErr) | ||
278 | ts->ts_flags |= ATH9K_TX_DESC_CFG_ERR; | ||
279 | if (ads->ds_txstatus1 & AR_TxDataUnderrun) { | ||
280 | ts->ts_flags |= ATH9K_TX_DATA_UNDERRUN; | ||
281 | ath9k_hw_updatetxtriglevel(ah, true); | ||
282 | } | ||
283 | if (ads->ds_txstatus1 & AR_TxDelimUnderrun) { | ||
284 | ts->ts_flags |= ATH9K_TX_DELIM_UNDERRUN; | ||
285 | ath9k_hw_updatetxtriglevel(ah, true); | ||
286 | } | ||
287 | if (ads->ds_txstatus0 & AR_TxBaStatus) { | ||
288 | ts->ts_flags |= ATH9K_TX_BA; | ||
289 | ts->ba_low = ads->AR_BaBitmapLow; | ||
290 | ts->ba_high = ads->AR_BaBitmapHigh; | ||
291 | } | ||
292 | |||
293 | ts->ts_rateindex = MS(ads->ds_txstatus9, AR_FinalTxIdx); | ||
294 | switch (ts->ts_rateindex) { | ||
295 | case 0: | ||
296 | ts->ts_ratecode = MS(ads->ds_ctl3, AR_XmitRate0); | ||
297 | break; | ||
298 | case 1: | ||
299 | ts->ts_ratecode = MS(ads->ds_ctl3, AR_XmitRate1); | ||
300 | break; | ||
301 | case 2: | ||
302 | ts->ts_ratecode = MS(ads->ds_ctl3, AR_XmitRate2); | ||
303 | break; | ||
304 | case 3: | ||
305 | ts->ts_ratecode = MS(ads->ds_ctl3, AR_XmitRate3); | ||
306 | break; | ||
307 | } | ||
308 | |||
309 | ts->ts_rssi = MS(ads->ds_txstatus5, AR_TxRSSICombined); | ||
310 | ts->ts_rssi_ctl0 = MS(ads->ds_txstatus0, AR_TxRSSIAnt00); | ||
311 | ts->ts_rssi_ctl1 = MS(ads->ds_txstatus0, AR_TxRSSIAnt01); | ||
312 | ts->ts_rssi_ctl2 = MS(ads->ds_txstatus0, AR_TxRSSIAnt02); | ||
313 | ts->ts_rssi_ext0 = MS(ads->ds_txstatus5, AR_TxRSSIAnt10); | ||
314 | ts->ts_rssi_ext1 = MS(ads->ds_txstatus5, AR_TxRSSIAnt11); | ||
315 | ts->ts_rssi_ext2 = MS(ads->ds_txstatus5, AR_TxRSSIAnt12); | ||
316 | ts->evm0 = ads->AR_TxEVM0; | ||
317 | ts->evm1 = ads->AR_TxEVM1; | ||
318 | ts->evm2 = ads->AR_TxEVM2; | ||
319 | ts->ts_shortretry = MS(ads->ds_txstatus1, AR_RTSFailCnt); | ||
320 | ts->ts_longretry = MS(ads->ds_txstatus1, AR_DataFailCnt); | ||
321 | ts->ts_virtcol = MS(ads->ds_txstatus1, AR_VirtRetryCnt); | ||
322 | ts->ts_antenna = 0; | ||
323 | |||
324 | return 0; | ||
325 | } | ||
326 | EXPORT_SYMBOL(ath9k_hw_txprocdesc); | ||
327 | |||
328 | void ath9k_hw_set11n_txdesc(struct ath_hw *ah, struct ath_desc *ds, | ||
329 | u32 pktLen, enum ath9k_pkt_type type, u32 txPower, | ||
330 | u32 keyIx, enum ath9k_key_type keyType, u32 flags) | ||
331 | { | ||
332 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
333 | |||
334 | txPower += ah->txpower_indexoffset; | ||
335 | if (txPower > 63) | ||
336 | txPower = 63; | ||
337 | |||
338 | ads->ds_ctl0 = (pktLen & AR_FrameLen) | ||
339 | | (flags & ATH9K_TXDESC_VMF ? AR_VirtMoreFrag : 0) | ||
340 | | SM(txPower, AR_XmitPower) | ||
341 | | (flags & ATH9K_TXDESC_VEOL ? AR_VEOL : 0) | ||
342 | | (flags & ATH9K_TXDESC_CLRDMASK ? AR_ClrDestMask : 0) | ||
343 | | (flags & ATH9K_TXDESC_INTREQ ? AR_TxIntrReq : 0) | ||
344 | | (keyIx != ATH9K_TXKEYIX_INVALID ? AR_DestIdxValid : 0); | ||
345 | |||
346 | ads->ds_ctl1 = | ||
347 | (keyIx != ATH9K_TXKEYIX_INVALID ? SM(keyIx, AR_DestIdx) : 0) | ||
348 | | SM(type, AR_FrameType) | ||
349 | | (flags & ATH9K_TXDESC_NOACK ? AR_NoAck : 0) | ||
350 | | (flags & ATH9K_TXDESC_EXT_ONLY ? AR_ExtOnly : 0) | ||
351 | | (flags & ATH9K_TXDESC_EXT_AND_CTL ? AR_ExtAndCtl : 0); | ||
352 | |||
353 | ads->ds_ctl6 = SM(keyType, AR_EncrType); | ||
354 | |||
355 | if (AR_SREV_9285(ah) || AR_SREV_9271(ah)) { | ||
356 | ads->ds_ctl8 = 0; | ||
357 | ads->ds_ctl9 = 0; | ||
358 | ads->ds_ctl10 = 0; | ||
359 | ads->ds_ctl11 = 0; | ||
360 | } | ||
361 | } | ||
362 | EXPORT_SYMBOL(ath9k_hw_set11n_txdesc); | ||
363 | |||
364 | void ath9k_hw_set11n_ratescenario(struct ath_hw *ah, struct ath_desc *ds, | ||
365 | struct ath_desc *lastds, | ||
366 | u32 durUpdateEn, u32 rtsctsRate, | ||
367 | u32 rtsctsDuration, | ||
368 | struct ath9k_11n_rate_series series[], | ||
369 | u32 nseries, u32 flags) | ||
370 | { | ||
371 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
372 | struct ar5416_desc *last_ads = AR5416DESC(lastds); | ||
373 | u32 ds_ctl0; | ||
374 | |||
375 | if (flags & (ATH9K_TXDESC_RTSENA | ATH9K_TXDESC_CTSENA)) { | ||
376 | ds_ctl0 = ads->ds_ctl0; | ||
377 | |||
378 | if (flags & ATH9K_TXDESC_RTSENA) { | ||
379 | ds_ctl0 &= ~AR_CTSEnable; | ||
380 | ds_ctl0 |= AR_RTSEnable; | ||
381 | } else { | ||
382 | ds_ctl0 &= ~AR_RTSEnable; | ||
383 | ds_ctl0 |= AR_CTSEnable; | ||
384 | } | ||
385 | |||
386 | ads->ds_ctl0 = ds_ctl0; | ||
387 | } else { | ||
388 | ads->ds_ctl0 = | ||
389 | (ads->ds_ctl0 & ~(AR_RTSEnable | AR_CTSEnable)); | ||
390 | } | ||
391 | |||
392 | ads->ds_ctl2 = set11nTries(series, 0) | ||
393 | | set11nTries(series, 1) | ||
394 | | set11nTries(series, 2) | ||
395 | | set11nTries(series, 3) | ||
396 | | (durUpdateEn ? AR_DurUpdateEna : 0) | ||
397 | | SM(0, AR_BurstDur); | ||
398 | |||
399 | ads->ds_ctl3 = set11nRate(series, 0) | ||
400 | | set11nRate(series, 1) | ||
401 | | set11nRate(series, 2) | ||
402 | | set11nRate(series, 3); | ||
403 | |||
404 | ads->ds_ctl4 = set11nPktDurRTSCTS(series, 0) | ||
405 | | set11nPktDurRTSCTS(series, 1); | ||
406 | |||
407 | ads->ds_ctl5 = set11nPktDurRTSCTS(series, 2) | ||
408 | | set11nPktDurRTSCTS(series, 3); | ||
409 | |||
410 | ads->ds_ctl7 = set11nRateFlags(series, 0) | ||
411 | | set11nRateFlags(series, 1) | ||
412 | | set11nRateFlags(series, 2) | ||
413 | | set11nRateFlags(series, 3) | ||
414 | | SM(rtsctsRate, AR_RTSCTSRate); | ||
415 | last_ads->ds_ctl2 = ads->ds_ctl2; | ||
416 | last_ads->ds_ctl3 = ads->ds_ctl3; | ||
417 | } | ||
418 | EXPORT_SYMBOL(ath9k_hw_set11n_ratescenario); | ||
419 | |||
420 | void ath9k_hw_set11n_aggr_first(struct ath_hw *ah, struct ath_desc *ds, | ||
421 | u32 aggrLen) | ||
422 | { | ||
423 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
424 | |||
425 | ads->ds_ctl1 |= (AR_IsAggr | AR_MoreAggr); | ||
426 | ads->ds_ctl6 &= ~AR_AggrLen; | ||
427 | ads->ds_ctl6 |= SM(aggrLen, AR_AggrLen); | ||
428 | } | ||
429 | EXPORT_SYMBOL(ath9k_hw_set11n_aggr_first); | ||
430 | |||
431 | void ath9k_hw_set11n_aggr_middle(struct ath_hw *ah, struct ath_desc *ds, | ||
432 | u32 numDelims) | ||
433 | { | ||
434 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
435 | unsigned int ctl6; | ||
436 | |||
437 | ads->ds_ctl1 |= (AR_IsAggr | AR_MoreAggr); | ||
438 | |||
439 | ctl6 = ads->ds_ctl6; | ||
440 | ctl6 &= ~AR_PadDelim; | ||
441 | ctl6 |= SM(numDelims, AR_PadDelim); | ||
442 | ads->ds_ctl6 = ctl6; | ||
443 | } | ||
444 | EXPORT_SYMBOL(ath9k_hw_set11n_aggr_middle); | ||
445 | |||
446 | void ath9k_hw_set11n_aggr_last(struct ath_hw *ah, struct ath_desc *ds) | ||
447 | { | ||
448 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
449 | |||
450 | ads->ds_ctl1 |= AR_IsAggr; | ||
451 | ads->ds_ctl1 &= ~AR_MoreAggr; | ||
452 | ads->ds_ctl6 &= ~AR_PadDelim; | ||
453 | } | ||
454 | EXPORT_SYMBOL(ath9k_hw_set11n_aggr_last); | ||
455 | |||
456 | void ath9k_hw_clr11n_aggr(struct ath_hw *ah, struct ath_desc *ds) | ||
457 | { | ||
458 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
459 | |||
460 | ads->ds_ctl1 &= (~AR_IsAggr & ~AR_MoreAggr); | ||
461 | } | ||
462 | EXPORT_SYMBOL(ath9k_hw_clr11n_aggr); | ||
463 | |||
464 | void ath9k_hw_set11n_burstduration(struct ath_hw *ah, struct ath_desc *ds, | ||
465 | u32 burstDuration) | ||
466 | { | ||
467 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
468 | |||
469 | ads->ds_ctl2 &= ~AR_BurstDur; | ||
470 | ads->ds_ctl2 |= SM(burstDuration, AR_BurstDur); | ||
471 | } | ||
472 | EXPORT_SYMBOL(ath9k_hw_set11n_burstduration); | ||
473 | |||
474 | void ath9k_hw_set11n_virtualmorefrag(struct ath_hw *ah, struct ath_desc *ds, | ||
475 | u32 vmf) | ||
476 | { | ||
477 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
478 | |||
479 | if (vmf) | ||
480 | ads->ds_ctl0 |= AR_VirtMoreFrag; | ||
481 | else | ||
482 | ads->ds_ctl0 &= ~AR_VirtMoreFrag; | ||
483 | } | ||
484 | |||
485 | void ath9k_hw_gettxintrtxqs(struct ath_hw *ah, u32 *txqs) | 227 | void ath9k_hw_gettxintrtxqs(struct ath_hw *ah, u32 *txqs) |
486 | { | 228 | { |
487 | *txqs &= ah->intr_txqs; | 229 | *txqs &= ah->intr_txqs; |
@@ -733,6 +475,8 @@ bool ath9k_hw_resettxqueue(struct ath_hw *ah, u32 q) | |||
733 | } else | 475 | } else |
734 | cwMin = qi->tqi_cwmin; | 476 | cwMin = qi->tqi_cwmin; |
735 | 477 | ||
478 | ENABLE_REGWRITE_BUFFER(ah); | ||
479 | |||
736 | REG_WRITE(ah, AR_DLCL_IFS(q), | 480 | REG_WRITE(ah, AR_DLCL_IFS(q), |
737 | SM(cwMin, AR_D_LCL_IFS_CWMIN) | | 481 | SM(cwMin, AR_D_LCL_IFS_CWMIN) | |
738 | SM(qi->tqi_cwmax, AR_D_LCL_IFS_CWMAX) | | 482 | SM(qi->tqi_cwmax, AR_D_LCL_IFS_CWMAX) | |
@@ -747,6 +491,8 @@ bool ath9k_hw_resettxqueue(struct ath_hw *ah, u32 q) | |||
747 | REG_WRITE(ah, AR_DMISC(q), | 491 | REG_WRITE(ah, AR_DMISC(q), |
748 | 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); |
749 | 493 | ||
494 | REGWRITE_BUFFER_FLUSH(ah); | ||
495 | |||
750 | if (qi->tqi_cbrPeriod) { | 496 | if (qi->tqi_cbrPeriod) { |
751 | REG_WRITE(ah, AR_QCBRCFG(q), | 497 | REG_WRITE(ah, AR_QCBRCFG(q), |
752 | SM(qi->tqi_cbrPeriod, AR_Q_CBRCFG_INTERVAL) | | 498 | SM(qi->tqi_cbrPeriod, AR_Q_CBRCFG_INTERVAL) | |
@@ -762,6 +508,8 @@ bool ath9k_hw_resettxqueue(struct ath_hw *ah, u32 q) | |||
762 | AR_Q_RDYTIMECFG_EN); | 508 | AR_Q_RDYTIMECFG_EN); |
763 | } | 509 | } |
764 | 510 | ||
511 | REGWRITE_BUFFER_FLUSH(ah); | ||
512 | |||
765 | REG_WRITE(ah, AR_DCHNTIME(q), | 513 | REG_WRITE(ah, AR_DCHNTIME(q), |
766 | SM(qi->tqi_burstTime, AR_D_CHNTIME_DUR) | | 514 | SM(qi->tqi_burstTime, AR_D_CHNTIME_DUR) | |
767 | (qi->tqi_burstTime ? AR_D_CHNTIME_EN : 0)); | 515 | (qi->tqi_burstTime ? AR_D_CHNTIME_EN : 0)); |
@@ -779,6 +527,10 @@ bool ath9k_hw_resettxqueue(struct ath_hw *ah, u32 q) | |||
779 | REG_READ(ah, AR_DMISC(q)) | | 527 | REG_READ(ah, AR_DMISC(q)) | |
780 | AR_D_MISC_POST_FR_BKOFF_DIS); | 528 | AR_D_MISC_POST_FR_BKOFF_DIS); |
781 | } | 529 | } |
530 | |||
531 | REGWRITE_BUFFER_FLUSH(ah); | ||
532 | DISABLE_REGWRITE_BUFFER(ah); | ||
533 | |||
782 | if (qi->tqi_qflags & TXQ_FLAG_FRAG_BURST_BACKOFF_ENABLE) { | 534 | if (qi->tqi_qflags & TXQ_FLAG_FRAG_BURST_BACKOFF_ENABLE) { |
783 | REG_WRITE(ah, AR_DMISC(q), | 535 | REG_WRITE(ah, AR_DMISC(q), |
784 | REG_READ(ah, AR_DMISC(q)) | | 536 | REG_READ(ah, AR_DMISC(q)) | |
@@ -786,6 +538,8 @@ bool ath9k_hw_resettxqueue(struct ath_hw *ah, u32 q) | |||
786 | } | 538 | } |
787 | switch (qi->tqi_type) { | 539 | switch (qi->tqi_type) { |
788 | case ATH9K_TX_QUEUE_BEACON: | 540 | case ATH9K_TX_QUEUE_BEACON: |
541 | ENABLE_REGWRITE_BUFFER(ah); | ||
542 | |||
789 | 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)) |
790 | | AR_Q_MISC_FSP_DBA_GATED | 544 | | AR_Q_MISC_FSP_DBA_GATED |
791 | | AR_Q_MISC_BEACON_USE | 545 | | AR_Q_MISC_BEACON_USE |
@@ -796,8 +550,20 @@ bool ath9k_hw_resettxqueue(struct ath_hw *ah, u32 q) | |||
796 | AR_D_MISC_ARB_LOCKOUT_CNTRL_S) | 550 | AR_D_MISC_ARB_LOCKOUT_CNTRL_S) |
797 | | AR_D_MISC_BEACON_USE | 551 | | AR_D_MISC_BEACON_USE |
798 | | 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 | |||
557 | /* cwmin and cwmax should be 0 for beacon queue */ | ||
558 | if (AR_SREV_9300_20_OR_LATER(ah)) { | ||
559 | REG_WRITE(ah, AR_DLCL_IFS(q), SM(0, AR_D_LCL_IFS_CWMIN) | ||
560 | | SM(0, AR_D_LCL_IFS_CWMAX) | ||
561 | | SM(qi->tqi_aifs, AR_D_LCL_IFS_AIFS)); | ||
562 | } | ||
799 | break; | 563 | break; |
800 | case ATH9K_TX_QUEUE_CAB: | 564 | case ATH9K_TX_QUEUE_CAB: |
565 | ENABLE_REGWRITE_BUFFER(ah); | ||
566 | |||
801 | 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)) |
802 | | AR_Q_MISC_FSP_DBA_GATED | 568 | | AR_Q_MISC_FSP_DBA_GATED |
803 | | AR_Q_MISC_CBR_INCR_DIS1 | 569 | | AR_Q_MISC_CBR_INCR_DIS1 |
@@ -811,6 +577,10 @@ bool ath9k_hw_resettxqueue(struct ath_hw *ah, u32 q) | |||
811 | 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)) |
812 | | (AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL << | 578 | | (AR_D_MISC_ARB_LOCKOUT_CNTRL_GLOBAL << |
813 | 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 | |||
814 | break; | 584 | break; |
815 | case ATH9K_TX_QUEUE_PSPOLL: | 585 | case ATH9K_TX_QUEUE_PSPOLL: |
816 | REG_WRITE(ah, AR_QMISC(q), | 586 | REG_WRITE(ah, AR_QMISC(q), |
@@ -832,6 +602,9 @@ bool ath9k_hw_resettxqueue(struct ath_hw *ah, u32 q) | |||
832 | AR_D_MISC_POST_FR_BKOFF_DIS); | 602 | AR_D_MISC_POST_FR_BKOFF_DIS); |
833 | } | 603 | } |
834 | 604 | ||
605 | if (AR_SREV_9300_20_OR_LATER(ah)) | ||
606 | REG_WRITE(ah, AR_Q_DESC_CRCCHK, AR_Q_DESC_CRCCHK_EN); | ||
607 | |||
835 | if (qi->tqi_qflags & TXQ_FLAG_TXOKINT_ENABLE) | 608 | if (qi->tqi_qflags & TXQ_FLAG_TXOKINT_ENABLE) |
836 | ah->txok_interrupt_mask |= 1 << q; | 609 | ah->txok_interrupt_mask |= 1 << q; |
837 | else | 610 | else |
@@ -940,22 +713,6 @@ int ath9k_hw_rxprocdesc(struct ath_hw *ah, struct ath_desc *ds, | |||
940 | } | 713 | } |
941 | EXPORT_SYMBOL(ath9k_hw_rxprocdesc); | 714 | EXPORT_SYMBOL(ath9k_hw_rxprocdesc); |
942 | 715 | ||
943 | void ath9k_hw_setuprxdesc(struct ath_hw *ah, struct ath_desc *ds, | ||
944 | u32 size, u32 flags) | ||
945 | { | ||
946 | struct ar5416_desc *ads = AR5416DESC(ds); | ||
947 | struct ath9k_hw_capabilities *pCap = &ah->caps; | ||
948 | |||
949 | ads->ds_ctl1 = size & AR_BufLen; | ||
950 | if (flags & ATH9K_RXDESC_INTREQ) | ||
951 | ads->ds_ctl1 |= AR_RxIntrReq; | ||
952 | |||
953 | ads->ds_rxstatus8 &= ~AR_RxDone; | ||
954 | if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) | ||
955 | memset(&(ads->u), 0, sizeof(ads->u)); | ||
956 | } | ||
957 | EXPORT_SYMBOL(ath9k_hw_setuprxdesc); | ||
958 | |||
959 | /* | 716 | /* |
960 | * This can stop or re-enables RX. | 717 | * This can stop or re-enables RX. |
961 | * | 718 | * |
@@ -999,12 +756,6 @@ void ath9k_hw_putrxbuf(struct ath_hw *ah, u32 rxdp) | |||
999 | } | 756 | } |
1000 | EXPORT_SYMBOL(ath9k_hw_putrxbuf); | 757 | EXPORT_SYMBOL(ath9k_hw_putrxbuf); |
1001 | 758 | ||
1002 | void ath9k_hw_rxena(struct ath_hw *ah) | ||
1003 | { | ||
1004 | REG_WRITE(ah, AR_CR, AR_CR_RXE); | ||
1005 | } | ||
1006 | EXPORT_SYMBOL(ath9k_hw_rxena); | ||
1007 | |||
1008 | void ath9k_hw_startpcureceive(struct ath_hw *ah) | 759 | void ath9k_hw_startpcureceive(struct ath_hw *ah) |
1009 | { | 760 | { |
1010 | ath9k_enable_mib_counters(ah); | 761 | ath9k_enable_mib_counters(ah); |
@@ -1023,6 +774,14 @@ void ath9k_hw_stoppcurecv(struct ath_hw *ah) | |||
1023 | } | 774 | } |
1024 | EXPORT_SYMBOL(ath9k_hw_stoppcurecv); | 775 | EXPORT_SYMBOL(ath9k_hw_stoppcurecv); |
1025 | 776 | ||
777 | void ath9k_hw_abortpcurecv(struct ath_hw *ah) | ||
778 | { | ||
779 | REG_SET_BIT(ah, AR_DIAG_SW, AR_DIAG_RX_ABORT | AR_DIAG_RX_DIS); | ||
780 | |||
781 | ath9k_hw_disable_mib_counters(ah); | ||
782 | } | ||
783 | EXPORT_SYMBOL(ath9k_hw_abortpcurecv); | ||
784 | |||
1026 | bool ath9k_hw_stopdmarecv(struct ath_hw *ah) | 785 | bool ath9k_hw_stopdmarecv(struct ath_hw *ah) |
1027 | { | 786 | { |
1028 | #define AH_RX_STOP_DMA_TIMEOUT 10000 /* usec */ | 787 | #define AH_RX_STOP_DMA_TIMEOUT 10000 /* usec */ |
@@ -1068,3 +827,140 @@ int ath9k_hw_beaconq_setup(struct ath_hw *ah) | |||
1068 | return ath9k_hw_setuptxqueue(ah, ATH9K_TX_QUEUE_BEACON, &qi); | 827 | return ath9k_hw_setuptxqueue(ah, ATH9K_TX_QUEUE_BEACON, &qi); |
1069 | } | 828 | } |
1070 | EXPORT_SYMBOL(ath9k_hw_beaconq_setup); | 829 | EXPORT_SYMBOL(ath9k_hw_beaconq_setup); |
830 | |||
831 | bool ath9k_hw_intrpend(struct ath_hw *ah) | ||
832 | { | ||
833 | u32 host_isr; | ||
834 | |||
835 | if (AR_SREV_9100(ah)) | ||
836 | return true; | ||
837 | |||
838 | host_isr = REG_READ(ah, AR_INTR_ASYNC_CAUSE); | ||
839 | if ((host_isr & AR_INTR_MAC_IRQ) && (host_isr != AR_INTR_SPURIOUS)) | ||
840 | return true; | ||
841 | |||
842 | host_isr = REG_READ(ah, AR_INTR_SYNC_CAUSE); | ||
843 | if ((host_isr & AR_INTR_SYNC_DEFAULT) | ||
844 | && (host_isr != AR_INTR_SPURIOUS)) | ||
845 | return true; | ||
846 | |||
847 | return false; | ||
848 | } | ||
849 | EXPORT_SYMBOL(ath9k_hw_intrpend); | ||
850 | |||
851 | enum ath9k_int ath9k_hw_set_interrupts(struct ath_hw *ah, | ||
852 | enum ath9k_int ints) | ||
853 | { | ||
854 | enum ath9k_int omask = ah->imask; | ||
855 | u32 mask, mask2; | ||
856 | struct ath9k_hw_capabilities *pCap = &ah->caps; | ||
857 | struct ath_common *common = ath9k_hw_common(ah); | ||
858 | |||
859 | ath_print(common, ATH_DBG_INTERRUPT, "0x%x => 0x%x\n", omask, ints); | ||
860 | |||
861 | if (omask & ATH9K_INT_GLOBAL) { | ||
862 | ath_print(common, ATH_DBG_INTERRUPT, "disable IER\n"); | ||
863 | REG_WRITE(ah, AR_IER, AR_IER_DISABLE); | ||
864 | (void) REG_READ(ah, AR_IER); | ||
865 | if (!AR_SREV_9100(ah)) { | ||
866 | REG_WRITE(ah, AR_INTR_ASYNC_ENABLE, 0); | ||
867 | (void) REG_READ(ah, AR_INTR_ASYNC_ENABLE); | ||
868 | |||
869 | REG_WRITE(ah, AR_INTR_SYNC_ENABLE, 0); | ||
870 | (void) REG_READ(ah, AR_INTR_SYNC_ENABLE); | ||
871 | } | ||
872 | } | ||
873 | |||
874 | /* TODO: global int Ref count */ | ||
875 | mask = ints & ATH9K_INT_COMMON; | ||
876 | mask2 = 0; | ||
877 | |||
878 | if (ints & ATH9K_INT_TX) { | ||
879 | if (ah->config.tx_intr_mitigation) | ||
880 | mask |= AR_IMR_TXMINTR | AR_IMR_TXINTM; | ||
881 | if (ah->txok_interrupt_mask) | ||
882 | mask |= AR_IMR_TXOK; | ||
883 | if (ah->txdesc_interrupt_mask) | ||
884 | mask |= AR_IMR_TXDESC; | ||
885 | if (ah->txerr_interrupt_mask) | ||
886 | mask |= AR_IMR_TXERR; | ||
887 | if (ah->txeol_interrupt_mask) | ||
888 | mask |= AR_IMR_TXEOL; | ||
889 | } | ||
890 | if (ints & ATH9K_INT_RX) { | ||
891 | if (AR_SREV_9300_20_OR_LATER(ah)) { | ||
892 | mask |= AR_IMR_RXERR | AR_IMR_RXOK_HP; | ||
893 | if (ah->config.rx_intr_mitigation) { | ||
894 | mask &= ~AR_IMR_RXOK_LP; | ||
895 | mask |= AR_IMR_RXMINTR | AR_IMR_RXINTM; | ||
896 | } else { | ||
897 | mask |= AR_IMR_RXOK_LP; | ||
898 | } | ||
899 | } else { | ||
900 | if (ah->config.rx_intr_mitigation) | ||
901 | mask |= AR_IMR_RXMINTR | AR_IMR_RXINTM; | ||
902 | else | ||
903 | mask |= AR_IMR_RXOK | AR_IMR_RXDESC; | ||
904 | } | ||
905 | if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) | ||
906 | mask |= AR_IMR_GENTMR; | ||
907 | } | ||
908 | |||
909 | if (ints & (ATH9K_INT_BMISC)) { | ||
910 | mask |= AR_IMR_BCNMISC; | ||
911 | if (ints & ATH9K_INT_TIM) | ||
912 | mask2 |= AR_IMR_S2_TIM; | ||
913 | if (ints & ATH9K_INT_DTIM) | ||
914 | mask2 |= AR_IMR_S2_DTIM; | ||
915 | if (ints & ATH9K_INT_DTIMSYNC) | ||
916 | mask2 |= AR_IMR_S2_DTIMSYNC; | ||
917 | if (ints & ATH9K_INT_CABEND) | ||
918 | mask2 |= AR_IMR_S2_CABEND; | ||
919 | if (ints & ATH9K_INT_TSFOOR) | ||
920 | mask2 |= AR_IMR_S2_TSFOOR; | ||
921 | } | ||
922 | |||
923 | if (ints & (ATH9K_INT_GTT | ATH9K_INT_CST)) { | ||
924 | mask |= AR_IMR_BCNMISC; | ||
925 | if (ints & ATH9K_INT_GTT) | ||
926 | mask2 |= AR_IMR_S2_GTT; | ||
927 | if (ints & ATH9K_INT_CST) | ||
928 | mask2 |= AR_IMR_S2_CST; | ||
929 | } | ||
930 | |||
931 | ath_print(common, ATH_DBG_INTERRUPT, "new IMR 0x%x\n", mask); | ||
932 | REG_WRITE(ah, AR_IMR, mask); | ||
933 | ah->imrs2_reg &= ~(AR_IMR_S2_TIM | AR_IMR_S2_DTIM | AR_IMR_S2_DTIMSYNC | | ||
934 | AR_IMR_S2_CABEND | AR_IMR_S2_CABTO | | ||
935 | AR_IMR_S2_TSFOOR | AR_IMR_S2_GTT | AR_IMR_S2_CST); | ||
936 | ah->imrs2_reg |= mask2; | ||
937 | REG_WRITE(ah, AR_IMR_S2, ah->imrs2_reg); | ||
938 | |||
939 | if (!(pCap->hw_caps & ATH9K_HW_CAP_AUTOSLEEP)) { | ||
940 | if (ints & ATH9K_INT_TIM_TIMER) | ||
941 | REG_SET_BIT(ah, AR_IMR_S5, AR_IMR_S5_TIM_TIMER); | ||
942 | else | ||
943 | REG_CLR_BIT(ah, AR_IMR_S5, AR_IMR_S5_TIM_TIMER); | ||
944 | } | ||
945 | |||
946 | if (ints & ATH9K_INT_GLOBAL) { | ||
947 | ath_print(common, ATH_DBG_INTERRUPT, "enable IER\n"); | ||
948 | REG_WRITE(ah, AR_IER, AR_IER_ENABLE); | ||
949 | if (!AR_SREV_9100(ah)) { | ||
950 | REG_WRITE(ah, AR_INTR_ASYNC_ENABLE, | ||
951 | AR_INTR_MAC_IRQ); | ||
952 | REG_WRITE(ah, AR_INTR_ASYNC_MASK, AR_INTR_MAC_IRQ); | ||
953 | |||
954 | |||
955 | REG_WRITE(ah, AR_INTR_SYNC_ENABLE, | ||
956 | AR_INTR_SYNC_DEFAULT); | ||
957 | REG_WRITE(ah, AR_INTR_SYNC_MASK, | ||
958 | AR_INTR_SYNC_DEFAULT); | ||
959 | } | ||
960 | ath_print(common, ATH_DBG_INTERRUPT, "AR_IMR 0x%x IER 0x%x\n", | ||
961 | REG_READ(ah, AR_IMR), REG_READ(ah, AR_IER)); | ||
962 | } | ||
963 | |||
964 | return omask; | ||
965 | } | ||
966 | EXPORT_SYMBOL(ath9k_hw_set_interrupts); | ||
diff --git a/drivers/net/wireless/ath/ath9k/mac.h b/drivers/net/wireless/ath/ath9k/mac.h index 68dbd7a8ddca..00f3e0c7528a 100644 --- a/drivers/net/wireless/ath/ath9k/mac.h +++ b/drivers/net/wireless/ath/ath9k/mac.h | |||
@@ -37,6 +37,8 @@ | |||
37 | AR_2040_##_index : 0) \ | 37 | AR_2040_##_index : 0) \ |
38 | |((_series)[_index].RateFlags & ATH9K_RATESERIES_HALFGI ? \ | 38 | |((_series)[_index].RateFlags & ATH9K_RATESERIES_HALFGI ? \ |
39 | AR_GI##_index : 0) \ | 39 | AR_GI##_index : 0) \ |
40 | |((_series)[_index].RateFlags & ATH9K_RATESERIES_STBC ? \ | ||
41 | AR_STBC##_index : 0) \ | ||
40 | |SM((_series)[_index].ChSel, AR_ChainSel##_index)) | 42 | |SM((_series)[_index].ChSel, AR_ChainSel##_index)) |
41 | 43 | ||
42 | #define CCK_SIFS_TIME 10 | 44 | #define CCK_SIFS_TIME 10 |
@@ -86,7 +88,6 @@ | |||
86 | #define ATH9K_TX_DESC_CFG_ERR 0x04 | 88 | #define ATH9K_TX_DESC_CFG_ERR 0x04 |
87 | #define ATH9K_TX_DATA_UNDERRUN 0x08 | 89 | #define ATH9K_TX_DATA_UNDERRUN 0x08 |
88 | #define ATH9K_TX_DELIM_UNDERRUN 0x10 | 90 | #define ATH9K_TX_DELIM_UNDERRUN 0x10 |
89 | #define ATH9K_TX_SW_ABORTED 0x40 | ||
90 | #define ATH9K_TX_SW_FILTERED 0x80 | 91 | #define ATH9K_TX_SW_FILTERED 0x80 |
91 | 92 | ||
92 | /* 64 bytes */ | 93 | /* 64 bytes */ |
@@ -117,7 +118,10 @@ struct ath_tx_status { | |||
117 | int8_t ts_rssi_ext0; | 118 | int8_t ts_rssi_ext0; |
118 | int8_t ts_rssi_ext1; | 119 | int8_t ts_rssi_ext1; |
119 | int8_t ts_rssi_ext2; | 120 | int8_t ts_rssi_ext2; |
120 | u8 pad[3]; | 121 | u8 qid; |
122 | u16 desc_id; | ||
123 | u8 tid; | ||
124 | u8 pad[2]; | ||
121 | u32 ba_low; | 125 | u32 ba_low; |
122 | u32 ba_high; | 126 | u32 ba_high; |
123 | u32 evm0; | 127 | u32 evm0; |
@@ -148,11 +152,13 @@ struct ath_rx_status { | |||
148 | u32 evm0; | 152 | u32 evm0; |
149 | u32 evm1; | 153 | u32 evm1; |
150 | u32 evm2; | 154 | u32 evm2; |
155 | u32 evm3; | ||
156 | u32 evm4; | ||
151 | }; | 157 | }; |
152 | 158 | ||
153 | struct ath_htc_rx_status { | 159 | struct ath_htc_rx_status { |
154 | u64 rs_tstamp; | 160 | __be64 rs_tstamp; |
155 | u16 rs_datalen; | 161 | __be16 rs_datalen; |
156 | u8 rs_status; | 162 | u8 rs_status; |
157 | u8 rs_phyerr; | 163 | u8 rs_phyerr; |
158 | int8_t rs_rssi; | 164 | int8_t rs_rssi; |
@@ -171,9 +177,9 @@ struct ath_htc_rx_status { | |||
171 | u8 rs_num_delims; | 177 | u8 rs_num_delims; |
172 | u8 rs_flags; | 178 | u8 rs_flags; |
173 | u8 rs_dummy; | 179 | u8 rs_dummy; |
174 | u32 evm0; | 180 | __be32 evm0; |
175 | u32 evm1; | 181 | __be32 evm1; |
176 | u32 evm2; | 182 | __be32 evm2; |
177 | }; | 183 | }; |
178 | 184 | ||
179 | #define ATH9K_RXERR_CRC 0x01 | 185 | #define ATH9K_RXERR_CRC 0x01 |
@@ -259,7 +265,8 @@ struct ath_desc { | |||
259 | #define ATH9K_TXDESC_EXT_AND_CTL 0x0080 | 265 | #define ATH9K_TXDESC_EXT_AND_CTL 0x0080 |
260 | #define ATH9K_TXDESC_VMF 0x0100 | 266 | #define ATH9K_TXDESC_VMF 0x0100 |
261 | #define ATH9K_TXDESC_FRAG_IS_ON 0x0200 | 267 | #define ATH9K_TXDESC_FRAG_IS_ON 0x0200 |
262 | #define ATH9K_TXDESC_CAB 0x0400 | 268 | #define ATH9K_TXDESC_LOWRXCHAIN 0x0400 |
269 | #define ATH9K_TXDESC_LDPC 0x00010000 | ||
263 | 270 | ||
264 | #define ATH9K_RXDESC_INTREQ 0x0020 | 271 | #define ATH9K_RXDESC_INTREQ 0x0020 |
265 | 272 | ||
@@ -353,7 +360,6 @@ struct ar5416_desc { | |||
353 | #define AR_DestIdxValid 0x40000000 | 360 | #define AR_DestIdxValid 0x40000000 |
354 | #define AR_CTSEnable 0x80000000 | 361 | #define AR_CTSEnable 0x80000000 |
355 | 362 | ||
356 | #define AR_BufLen 0x00000fff | ||
357 | #define AR_TxMore 0x00001000 | 363 | #define AR_TxMore 0x00001000 |
358 | #define AR_DestIdx 0x000fe000 | 364 | #define AR_DestIdx 0x000fe000 |
359 | #define AR_DestIdx_S 13 | 365 | #define AR_DestIdx_S 13 |
@@ -410,6 +416,7 @@ struct ar5416_desc { | |||
410 | #define AR_EncrType 0x0c000000 | 416 | #define AR_EncrType 0x0c000000 |
411 | #define AR_EncrType_S 26 | 417 | #define AR_EncrType_S 26 |
412 | #define AR_TxCtlRsvd61 0xf0000000 | 418 | #define AR_TxCtlRsvd61 0xf0000000 |
419 | #define AR_LDPC 0x80000000 | ||
413 | 420 | ||
414 | #define AR_2040_0 0x00000001 | 421 | #define AR_2040_0 0x00000001 |
415 | #define AR_GI0 0x00000002 | 422 | #define AR_GI0 0x00000002 |
@@ -429,7 +436,10 @@ struct ar5416_desc { | |||
429 | #define AR_ChainSel3_S 17 | 436 | #define AR_ChainSel3_S 17 |
430 | #define AR_RTSCTSRate 0x0ff00000 | 437 | #define AR_RTSCTSRate 0x0ff00000 |
431 | #define AR_RTSCTSRate_S 20 | 438 | #define AR_RTSCTSRate_S 20 |
432 | #define AR_TxCtlRsvd70 0xf0000000 | 439 | #define AR_STBC0 0x10000000 |
440 | #define AR_STBC1 0x20000000 | ||
441 | #define AR_STBC2 0x40000000 | ||
442 | #define AR_STBC3 0x80000000 | ||
433 | 443 | ||
434 | #define AR_TxRSSIAnt00 0x000000ff | 444 | #define AR_TxRSSIAnt00 0x000000ff |
435 | #define AR_TxRSSIAnt00_S 0 | 445 | #define AR_TxRSSIAnt00_S 0 |
@@ -493,7 +503,6 @@ struct ar5416_desc { | |||
493 | 503 | ||
494 | #define AR_RxCTLRsvd00 0xffffffff | 504 | #define AR_RxCTLRsvd00 0xffffffff |
495 | 505 | ||
496 | #define AR_BufLen 0x00000fff | ||
497 | #define AR_RxCtlRsvd00 0x00001000 | 506 | #define AR_RxCtlRsvd00 0x00001000 |
498 | #define AR_RxIntrReq 0x00002000 | 507 | #define AR_RxIntrReq 0x00002000 |
499 | #define AR_RxCtlRsvd01 0xffffc000 | 508 | #define AR_RxCtlRsvd01 0xffffc000 |
@@ -643,6 +652,7 @@ enum ath9k_rx_filter { | |||
643 | #define ATH9K_RATESERIES_RTS_CTS 0x0001 | 652 | #define ATH9K_RATESERIES_RTS_CTS 0x0001 |
644 | #define ATH9K_RATESERIES_2040 0x0002 | 653 | #define ATH9K_RATESERIES_2040 0x0002 |
645 | #define ATH9K_RATESERIES_HALFGI 0x0004 | 654 | #define ATH9K_RATESERIES_HALFGI 0x0004 |
655 | #define ATH9K_RATESERIES_STBC 0x0008 | ||
646 | 656 | ||
647 | struct ath9k_11n_rate_series { | 657 | struct ath9k_11n_rate_series { |
648 | u32 Tries; | 658 | u32 Tries; |
@@ -686,34 +696,10 @@ struct ath9k_channel; | |||
686 | u32 ath9k_hw_gettxbuf(struct ath_hw *ah, u32 q); | 696 | u32 ath9k_hw_gettxbuf(struct ath_hw *ah, u32 q); |
687 | void ath9k_hw_puttxbuf(struct ath_hw *ah, u32 q, u32 txdp); | 697 | void ath9k_hw_puttxbuf(struct ath_hw *ah, u32 q, u32 txdp); |
688 | void ath9k_hw_txstart(struct ath_hw *ah, u32 q); | 698 | void ath9k_hw_txstart(struct ath_hw *ah, u32 q); |
699 | void ath9k_hw_cleartxdesc(struct ath_hw *ah, void *ds); | ||
689 | u32 ath9k_hw_numtxpending(struct ath_hw *ah, u32 q); | 700 | u32 ath9k_hw_numtxpending(struct ath_hw *ah, u32 q); |
690 | bool ath9k_hw_updatetxtriglevel(struct ath_hw *ah, bool bIncTrigLevel); | 701 | bool ath9k_hw_updatetxtriglevel(struct ath_hw *ah, bool bIncTrigLevel); |
691 | bool ath9k_hw_stoptxdma(struct ath_hw *ah, u32 q); | 702 | bool ath9k_hw_stoptxdma(struct ath_hw *ah, u32 q); |
692 | void ath9k_hw_filltxdesc(struct ath_hw *ah, struct ath_desc *ds, | ||
693 | u32 segLen, bool firstSeg, | ||
694 | bool lastSeg, const struct ath_desc *ds0); | ||
695 | void ath9k_hw_cleartxdesc(struct ath_hw *ah, struct ath_desc *ds); | ||
696 | int ath9k_hw_txprocdesc(struct ath_hw *ah, struct ath_desc *ds, | ||
697 | struct ath_tx_status *ts); | ||
698 | void ath9k_hw_set11n_txdesc(struct ath_hw *ah, struct ath_desc *ds, | ||
699 | u32 pktLen, enum ath9k_pkt_type type, u32 txPower, | ||
700 | u32 keyIx, enum ath9k_key_type keyType, u32 flags); | ||
701 | void ath9k_hw_set11n_ratescenario(struct ath_hw *ah, struct ath_desc *ds, | ||
702 | struct ath_desc *lastds, | ||
703 | u32 durUpdateEn, u32 rtsctsRate, | ||
704 | u32 rtsctsDuration, | ||
705 | struct ath9k_11n_rate_series series[], | ||
706 | u32 nseries, u32 flags); | ||
707 | void ath9k_hw_set11n_aggr_first(struct ath_hw *ah, struct ath_desc *ds, | ||
708 | u32 aggrLen); | ||
709 | void ath9k_hw_set11n_aggr_middle(struct ath_hw *ah, struct ath_desc *ds, | ||
710 | u32 numDelims); | ||
711 | void ath9k_hw_set11n_aggr_last(struct ath_hw *ah, struct ath_desc *ds); | ||
712 | void ath9k_hw_clr11n_aggr(struct ath_hw *ah, struct ath_desc *ds); | ||
713 | void ath9k_hw_set11n_burstduration(struct ath_hw *ah, struct ath_desc *ds, | ||
714 | u32 burstDuration); | ||
715 | void ath9k_hw_set11n_virtualmorefrag(struct ath_hw *ah, struct ath_desc *ds, | ||
716 | u32 vmf); | ||
717 | void ath9k_hw_gettxintrtxqs(struct ath_hw *ah, u32 *txqs); | 703 | void ath9k_hw_gettxintrtxqs(struct ath_hw *ah, u32 *txqs); |
718 | bool ath9k_hw_set_txq_props(struct ath_hw *ah, int q, | 704 | bool ath9k_hw_set_txq_props(struct ath_hw *ah, int q, |
719 | const struct ath9k_tx_queue_info *qinfo); | 705 | const struct ath9k_tx_queue_info *qinfo); |
@@ -729,10 +715,17 @@ void ath9k_hw_setuprxdesc(struct ath_hw *ah, struct ath_desc *ds, | |||
729 | u32 size, u32 flags); | 715 | u32 size, u32 flags); |
730 | bool ath9k_hw_setrxabort(struct ath_hw *ah, bool set); | 716 | bool ath9k_hw_setrxabort(struct ath_hw *ah, bool set); |
731 | void ath9k_hw_putrxbuf(struct ath_hw *ah, u32 rxdp); | 717 | void ath9k_hw_putrxbuf(struct ath_hw *ah, u32 rxdp); |
732 | void ath9k_hw_rxena(struct ath_hw *ah); | ||
733 | void ath9k_hw_startpcureceive(struct ath_hw *ah); | 718 | void ath9k_hw_startpcureceive(struct ath_hw *ah); |
734 | void ath9k_hw_stoppcurecv(struct ath_hw *ah); | 719 | void ath9k_hw_stoppcurecv(struct ath_hw *ah); |
720 | void ath9k_hw_abortpcurecv(struct ath_hw *ah); | ||
735 | bool ath9k_hw_stopdmarecv(struct ath_hw *ah); | 721 | bool ath9k_hw_stopdmarecv(struct ath_hw *ah); |
736 | int ath9k_hw_beaconq_setup(struct ath_hw *ah); | 722 | int ath9k_hw_beaconq_setup(struct ath_hw *ah); |
737 | 723 | ||
724 | /* Interrupt Handling */ | ||
725 | bool ath9k_hw_intrpend(struct ath_hw *ah); | ||
726 | enum ath9k_int ath9k_hw_set_interrupts(struct ath_hw *ah, | ||
727 | enum ath9k_int ints); | ||
728 | |||
729 | void ar9002_hw_attach_mac_ops(struct ath_hw *ah); | ||
730 | |||
738 | #endif /* MAC_H */ | 731 | #endif /* MAC_H */ |
diff --git a/drivers/net/wireless/ath/ath9k/main.c b/drivers/net/wireless/ath/ath9k/main.c index f7ef11407e27..aad370a7f95b 100644 --- a/drivers/net/wireless/ath/ath9k/main.c +++ b/drivers/net/wireless/ath/ath9k/main.c | |||
@@ -401,23 +401,41 @@ void ath9k_tasklet(unsigned long data) | |||
401 | struct ath_common *common = ath9k_hw_common(ah); | 401 | struct ath_common *common = ath9k_hw_common(ah); |
402 | 402 | ||
403 | u32 status = sc->intrstatus; | 403 | u32 status = sc->intrstatus; |
404 | u32 rxmask; | ||
404 | 405 | ||
405 | ath9k_ps_wakeup(sc); | 406 | ath9k_ps_wakeup(sc); |
406 | 407 | ||
407 | if (status & ATH9K_INT_FATAL) { | 408 | if ((status & ATH9K_INT_FATAL) || |
409 | !ath9k_hw_check_alive(ah)) { | ||
408 | ath_reset(sc, false); | 410 | ath_reset(sc, false); |
409 | ath9k_ps_restore(sc); | 411 | ath9k_ps_restore(sc); |
410 | return; | 412 | return; |
411 | } | 413 | } |
412 | 414 | ||
413 | if (status & (ATH9K_INT_RX | ATH9K_INT_RXEOL | ATH9K_INT_RXORN)) { | 415 | if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) |
416 | rxmask = (ATH9K_INT_RXHP | ATH9K_INT_RXLP | ATH9K_INT_RXEOL | | ||
417 | ATH9K_INT_RXORN); | ||
418 | else | ||
419 | rxmask = (ATH9K_INT_RX | ATH9K_INT_RXEOL | ATH9K_INT_RXORN); | ||
420 | |||
421 | if (status & rxmask) { | ||
414 | spin_lock_bh(&sc->rx.rxflushlock); | 422 | spin_lock_bh(&sc->rx.rxflushlock); |
415 | ath_rx_tasklet(sc, 0); | 423 | |
424 | /* Check for high priority Rx first */ | ||
425 | if ((ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) && | ||
426 | (status & ATH9K_INT_RXHP)) | ||
427 | ath_rx_tasklet(sc, 0, true); | ||
428 | |||
429 | ath_rx_tasklet(sc, 0, false); | ||
416 | spin_unlock_bh(&sc->rx.rxflushlock); | 430 | spin_unlock_bh(&sc->rx.rxflushlock); |
417 | } | 431 | } |
418 | 432 | ||
419 | if (status & ATH9K_INT_TX) | 433 | if (status & ATH9K_INT_TX) { |
420 | ath_tx_tasklet(sc); | 434 | if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) |
435 | ath_tx_edma_tasklet(sc); | ||
436 | else | ||
437 | ath_tx_tasklet(sc); | ||
438 | } | ||
421 | 439 | ||
422 | if ((status & ATH9K_INT_TSFOOR) && sc->ps_enabled) { | 440 | if ((status & ATH9K_INT_TSFOOR) && sc->ps_enabled) { |
423 | /* | 441 | /* |
@@ -445,6 +463,8 @@ irqreturn_t ath_isr(int irq, void *dev) | |||
445 | ATH9K_INT_RXORN | \ | 463 | ATH9K_INT_RXORN | \ |
446 | ATH9K_INT_RXEOL | \ | 464 | ATH9K_INT_RXEOL | \ |
447 | ATH9K_INT_RX | \ | 465 | ATH9K_INT_RX | \ |
466 | ATH9K_INT_RXLP | \ | ||
467 | ATH9K_INT_RXHP | \ | ||
448 | ATH9K_INT_TX | \ | 468 | ATH9K_INT_TX | \ |
449 | ATH9K_INT_BMISS | \ | 469 | ATH9K_INT_BMISS | \ |
450 | ATH9K_INT_CST | \ | 470 | ATH9K_INT_CST | \ |
@@ -496,7 +516,8 @@ irqreturn_t ath_isr(int irq, void *dev) | |||
496 | * If a FATAL or RXORN interrupt is received, we have to reset the | 516 | * If a FATAL or RXORN interrupt is received, we have to reset the |
497 | * chip immediately. | 517 | * chip immediately. |
498 | */ | 518 | */ |
499 | if (status & (ATH9K_INT_FATAL | ATH9K_INT_RXORN)) | 519 | if ((status & ATH9K_INT_FATAL) || ((status & ATH9K_INT_RXORN) && |
520 | !(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA))) | ||
500 | goto chip_reset; | 521 | goto chip_reset; |
501 | 522 | ||
502 | if (status & ATH9K_INT_SWBA) | 523 | if (status & ATH9K_INT_SWBA) |
@@ -505,6 +526,13 @@ irqreturn_t ath_isr(int irq, void *dev) | |||
505 | if (status & ATH9K_INT_TXURN) | 526 | if (status & ATH9K_INT_TXURN) |
506 | ath9k_hw_updatetxtriglevel(ah, true); | 527 | ath9k_hw_updatetxtriglevel(ah, true); |
507 | 528 | ||
529 | if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { | ||
530 | if (status & ATH9K_INT_RXEOL) { | ||
531 | ah->imask &= ~(ATH9K_INT_RXEOL | ATH9K_INT_RXORN); | ||
532 | ath9k_hw_set_interrupts(ah, ah->imask); | ||
533 | } | ||
534 | } | ||
535 | |||
508 | if (status & ATH9K_INT_MIB) { | 536 | if (status & ATH9K_INT_MIB) { |
509 | /* | 537 | /* |
510 | * Disable interrupts until we service the MIB | 538 | * Disable interrupts until we service the MIB |
@@ -724,6 +752,7 @@ static int ath_key_config(struct ath_common *common, | |||
724 | struct ath_hw *ah = common->ah; | 752 | struct ath_hw *ah = common->ah; |
725 | struct ath9k_keyval hk; | 753 | struct ath9k_keyval hk; |
726 | const u8 *mac = NULL; | 754 | const u8 *mac = NULL; |
755 | u8 gmac[ETH_ALEN]; | ||
727 | int ret = 0; | 756 | int ret = 0; |
728 | int idx; | 757 | int idx; |
729 | 758 | ||
@@ -747,9 +776,30 @@ static int ath_key_config(struct ath_common *common, | |||
747 | memcpy(hk.kv_val, key->key, key->keylen); | 776 | memcpy(hk.kv_val, key->key, key->keylen); |
748 | 777 | ||
749 | if (!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) { | 778 | if (!(key->flags & IEEE80211_KEY_FLAG_PAIRWISE)) { |
750 | /* For now, use the default keys for broadcast keys. This may | 779 | |
751 | * need to change with virtual interfaces. */ | 780 | if (key->ap_addr) { |
752 | idx = key->keyidx; | 781 | /* |
782 | * Group keys on hardware that supports multicast frame | ||
783 | * key search use a mac that is the sender's address with | ||
784 | * the high bit set instead of the app-specified address. | ||
785 | */ | ||
786 | memcpy(gmac, key->ap_addr, ETH_ALEN); | ||
787 | gmac[0] |= 0x80; | ||
788 | mac = gmac; | ||
789 | |||
790 | if (key->alg == ALG_TKIP) | ||
791 | idx = ath_reserve_key_cache_slot_tkip(common); | ||
792 | else | ||
793 | idx = ath_reserve_key_cache_slot(common); | ||
794 | if (idx < 0) | ||
795 | mac = NULL; /* no free key cache entries */ | ||
796 | } | ||
797 | |||
798 | if (!mac) { | ||
799 | /* For now, use the default keys for broadcast keys. This may | ||
800 | * need to change with virtual interfaces. */ | ||
801 | idx = key->keyidx; | ||
802 | } | ||
753 | } else if (key->keyidx) { | 803 | } else if (key->keyidx) { |
754 | if (WARN_ON(!sta)) | 804 | if (WARN_ON(!sta)) |
755 | return -EOPNOTSUPP; | 805 | return -EOPNOTSUPP; |
@@ -1162,9 +1212,14 @@ static int ath9k_start(struct ieee80211_hw *hw) | |||
1162 | } | 1212 | } |
1163 | 1213 | ||
1164 | /* Setup our intr mask. */ | 1214 | /* Setup our intr mask. */ |
1165 | ah->imask = ATH9K_INT_RX | ATH9K_INT_TX | 1215 | ah->imask = ATH9K_INT_TX | ATH9K_INT_RXEOL | |
1166 | | ATH9K_INT_RXEOL | ATH9K_INT_RXORN | 1216 | ATH9K_INT_RXORN | ATH9K_INT_FATAL | |
1167 | | ATH9K_INT_FATAL | ATH9K_INT_GLOBAL; | 1217 | ATH9K_INT_GLOBAL; |
1218 | |||
1219 | if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) | ||
1220 | ah->imask |= ATH9K_INT_RXHP | ATH9K_INT_RXLP; | ||
1221 | else | ||
1222 | ah->imask |= ATH9K_INT_RX; | ||
1168 | 1223 | ||
1169 | if (ah->caps.hw_caps & ATH9K_HW_CAP_GTT) | 1224 | if (ah->caps.hw_caps & ATH9K_HW_CAP_GTT) |
1170 | ah->imask |= ATH9K_INT_GTT; | 1225 | ah->imask |= ATH9K_INT_GTT; |
@@ -1436,7 +1491,8 @@ static int ath9k_add_interface(struct ieee80211_hw *hw, | |||
1436 | if ((vif->type == NL80211_IFTYPE_STATION) || | 1491 | if ((vif->type == NL80211_IFTYPE_STATION) || |
1437 | (vif->type == NL80211_IFTYPE_ADHOC) || | 1492 | (vif->type == NL80211_IFTYPE_ADHOC) || |
1438 | (vif->type == NL80211_IFTYPE_MESH_POINT)) { | 1493 | (vif->type == NL80211_IFTYPE_MESH_POINT)) { |
1439 | ah->imask |= ATH9K_INT_MIB; | 1494 | if (ah->config.enable_ani) |
1495 | ah->imask |= ATH9K_INT_MIB; | ||
1440 | ah->imask |= ATH9K_INT_TSFOOR; | 1496 | ah->imask |= ATH9K_INT_TSFOOR; |
1441 | } | 1497 | } |
1442 | 1498 | ||
diff --git a/drivers/net/wireless/ath/ath9k/pci.c b/drivers/net/wireless/ath/ath9k/pci.c index 1ec836cf1c0d..257b10ba6f57 100644 --- a/drivers/net/wireless/ath/ath9k/pci.c +++ b/drivers/net/wireless/ath/ath9k/pci.c | |||
@@ -28,6 +28,7 @@ static DEFINE_PCI_DEVICE_TABLE(ath_pci_id_table) = { | |||
28 | { PCI_VDEVICE(ATHEROS, 0x002C) }, /* PCI-E 802.11n bonded out */ | 28 | { PCI_VDEVICE(ATHEROS, 0x002C) }, /* PCI-E 802.11n bonded out */ |
29 | { PCI_VDEVICE(ATHEROS, 0x002D) }, /* PCI */ | 29 | { PCI_VDEVICE(ATHEROS, 0x002D) }, /* PCI */ |
30 | { PCI_VDEVICE(ATHEROS, 0x002E) }, /* PCI-E */ | 30 | { PCI_VDEVICE(ATHEROS, 0x002E) }, /* PCI-E */ |
31 | { PCI_VDEVICE(ATHEROS, 0x0030) }, /* PCI-E AR9300 */ | ||
31 | { 0 } | 32 | { 0 } |
32 | }; | 33 | }; |
33 | 34 | ||
diff --git a/drivers/net/wireless/ath/ath9k/phy.c b/drivers/net/wireless/ath/ath9k/phy.c deleted file mode 100644 index 2547b3c4a26c..000000000000 --- a/drivers/net/wireless/ath/ath9k/phy.c +++ /dev/null | |||
@@ -1,978 +0,0 @@ | |||
1 | /* | ||
2 | * Copyright (c) 2008-2009 Atheros Communications Inc. | ||
3 | * | ||
4 | * Permission to use, copy, modify, and/or distribute this software for any | ||
5 | * purpose with or without fee is hereby granted, provided that the above | ||
6 | * copyright notice and this permission notice appear in all copies. | ||
7 | * | ||
8 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES | ||
9 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF | ||
10 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR | ||
11 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES | ||
12 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN | ||
13 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF | ||
14 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. | ||
15 | */ | ||
16 | |||
17 | /** | ||
18 | * DOC: Programming Atheros 802.11n analog front end radios | ||
19 | * | ||
20 | * AR5416 MAC based PCI devices and AR518 MAC based PCI-Express | ||
21 | * devices have either an external AR2133 analog front end radio for single | ||
22 | * band 2.4 GHz communication or an AR5133 analog front end radio for dual | ||
23 | * band 2.4 GHz / 5 GHz communication. | ||
24 | * | ||
25 | * All devices after the AR5416 and AR5418 family starting with the AR9280 | ||
26 | * have their analog front radios, MAC/BB and host PCIe/USB interface embedded | ||
27 | * into a single-chip and require less programming. | ||
28 | * | ||
29 | * The following single-chips exist with a respective embedded radio: | ||
30 | * | ||
31 | * AR9280 - 11n dual-band 2x2 MIMO for PCIe | ||
32 | * AR9281 - 11n single-band 1x2 MIMO for PCIe | ||
33 | * AR9285 - 11n single-band 1x1 for PCIe | ||
34 | * AR9287 - 11n single-band 2x2 MIMO for PCIe | ||
35 | * | ||
36 | * AR9220 - 11n dual-band 2x2 MIMO for PCI | ||
37 | * AR9223 - 11n single-band 2x2 MIMO for PCI | ||
38 | * | ||
39 | * AR9287 - 11n single-band 1x1 MIMO for USB | ||
40 | */ | ||
41 | |||
42 | #include <linux/slab.h> | ||
43 | |||
44 | #include "hw.h" | ||
45 | |||
46 | /** | ||
47 | * ath9k_hw_write_regs - ?? | ||
48 | * | ||
49 | * @ah: atheros hardware structure | ||
50 | * @freqIndex: | ||
51 | * @regWrites: | ||
52 | * | ||
53 | * Used for both the chipsets with an external AR2133/AR5133 radios and | ||
54 | * single-chip devices. | ||
55 | */ | ||
56 | void ath9k_hw_write_regs(struct ath_hw *ah, u32 freqIndex, int regWrites) | ||
57 | { | ||
58 | REG_WRITE_ARRAY(&ah->iniBB_RfGain, freqIndex, regWrites); | ||
59 | } | ||
60 | |||
61 | /** | ||
62 | * ath9k_hw_ar9280_set_channel - set channel on single-chip device | ||
63 | * @ah: atheros hardware structure | ||
64 | * @chan: | ||
65 | * | ||
66 | * This is the function to change channel on single-chip devices, that is | ||
67 | * all devices after ar9280. | ||
68 | * | ||
69 | * This function takes the channel value in MHz and sets | ||
70 | * hardware channel value. Assumes writes have been enabled to analog bus. | ||
71 | * | ||
72 | * Actual Expression, | ||
73 | * | ||
74 | * For 2GHz channel, | ||
75 | * Channel Frequency = (3/4) * freq_ref * (chansel[8:0] + chanfrac[16:0]/2^17) | ||
76 | * (freq_ref = 40MHz) | ||
77 | * | ||
78 | * For 5GHz channel, | ||
79 | * Channel Frequency = (3/2) * freq_ref * (chansel[8:0] + chanfrac[16:0]/2^10) | ||
80 | * (freq_ref = 40MHz/(24>>amodeRefSel)) | ||
81 | */ | ||
82 | int ath9k_hw_ar9280_set_channel(struct ath_hw *ah, struct ath9k_channel *chan) | ||
83 | { | ||
84 | u16 bMode, fracMode, aModeRefSel = 0; | ||
85 | u32 freq, ndiv, channelSel = 0, channelFrac = 0, reg32 = 0; | ||
86 | struct chan_centers centers; | ||
87 | u32 refDivA = 24; | ||
88 | |||
89 | ath9k_hw_get_channel_centers(ah, chan, ¢ers); | ||
90 | freq = centers.synth_center; | ||
91 | |||
92 | reg32 = REG_READ(ah, AR_PHY_SYNTH_CONTROL); | ||
93 | reg32 &= 0xc0000000; | ||
94 | |||
95 | if (freq < 4800) { /* 2 GHz, fractional mode */ | ||
96 | u32 txctl; | ||
97 | int regWrites = 0; | ||
98 | |||
99 | bMode = 1; | ||
100 | fracMode = 1; | ||
101 | aModeRefSel = 0; | ||
102 | channelSel = (freq * 0x10000) / 15; | ||
103 | |||
104 | if (AR_SREV_9287_11_OR_LATER(ah)) { | ||
105 | if (freq == 2484) { | ||
106 | /* Enable channel spreading for channel 14 */ | ||
107 | REG_WRITE_ARRAY(&ah->iniCckfirJapan2484, | ||
108 | 1, regWrites); | ||
109 | } else { | ||
110 | REG_WRITE_ARRAY(&ah->iniCckfirNormal, | ||
111 | 1, regWrites); | ||
112 | } | ||
113 | } else { | ||
114 | txctl = REG_READ(ah, AR_PHY_CCK_TX_CTRL); | ||
115 | if (freq == 2484) { | ||
116 | /* Enable channel spreading for channel 14 */ | ||
117 | REG_WRITE(ah, AR_PHY_CCK_TX_CTRL, | ||
118 | txctl | AR_PHY_CCK_TX_CTRL_JAPAN); | ||
119 | } else { | ||
120 | REG_WRITE(ah, AR_PHY_CCK_TX_CTRL, | ||
121 | txctl &~ AR_PHY_CCK_TX_CTRL_JAPAN); | ||
122 | } | ||
123 | } | ||
124 | } else { | ||
125 | bMode = 0; | ||
126 | fracMode = 0; | ||
127 | |||
128 | switch(ah->eep_ops->get_eeprom(ah, EEP_FRAC_N_5G)) { | ||
129 | case 0: | ||
130 | if ((freq % 20) == 0) { | ||
131 | aModeRefSel = 3; | ||
132 | } else if ((freq % 10) == 0) { | ||
133 | aModeRefSel = 2; | ||
134 | } | ||
135 | if (aModeRefSel) | ||
136 | break; | ||
137 | case 1: | ||
138 | default: | ||
139 | aModeRefSel = 0; | ||
140 | /* | ||
141 | * Enable 2G (fractional) mode for channels | ||
142 | * which are 5MHz spaced. | ||
143 | */ | ||
144 | fracMode = 1; | ||
145 | refDivA = 1; | ||
146 | channelSel = (freq * 0x8000) / 15; | ||
147 | |||
148 | /* RefDivA setting */ | ||
149 | REG_RMW_FIELD(ah, AR_AN_SYNTH9, | ||
150 | AR_AN_SYNTH9_REFDIVA, refDivA); | ||
151 | |||
152 | } | ||
153 | |||
154 | if (!fracMode) { | ||
155 | ndiv = (freq * (refDivA >> aModeRefSel)) / 60; | ||
156 | channelSel = ndiv & 0x1ff; | ||
157 | channelFrac = (ndiv & 0xfffffe00) * 2; | ||
158 | channelSel = (channelSel << 17) | channelFrac; | ||
159 | } | ||
160 | } | ||
161 | |||
162 | reg32 = reg32 | | ||
163 | (bMode << 29) | | ||
164 | (fracMode << 28) | (aModeRefSel << 26) | (channelSel); | ||
165 | |||
166 | REG_WRITE(ah, AR_PHY_SYNTH_CONTROL, reg32); | ||
167 | |||
168 | ah->curchan = chan; | ||
169 | ah->curchan_rad_index = -1; | ||
170 | |||
171 | return 0; | ||
172 | } | ||
173 | |||
174 | /** | ||
175 | * ath9k_hw_9280_spur_mitigate - convert baseband spur frequency | ||
176 | * @ah: atheros hardware structure | ||
177 | * @chan: | ||
178 | * | ||
179 | * For single-chip solutions. Converts to baseband spur frequency given the | ||
180 | * input channel frequency and compute register settings below. | ||
181 | */ | ||
182 | void ath9k_hw_9280_spur_mitigate(struct ath_hw *ah, struct ath9k_channel *chan) | ||
183 | { | ||
184 | int bb_spur = AR_NO_SPUR; | ||
185 | int freq; | ||
186 | int bin, cur_bin; | ||
187 | int bb_spur_off, spur_subchannel_sd; | ||
188 | int spur_freq_sd; | ||
189 | int spur_delta_phase; | ||
190 | int denominator; | ||
191 | int upper, lower, cur_vit_mask; | ||
192 | int tmp, newVal; | ||
193 | int i; | ||
194 | int pilot_mask_reg[4] = { AR_PHY_TIMING7, AR_PHY_TIMING8, | ||
195 | AR_PHY_PILOT_MASK_01_30, AR_PHY_PILOT_MASK_31_60 | ||
196 | }; | ||
197 | int chan_mask_reg[4] = { AR_PHY_TIMING9, AR_PHY_TIMING10, | ||
198 | AR_PHY_CHANNEL_MASK_01_30, AR_PHY_CHANNEL_MASK_31_60 | ||
199 | }; | ||
200 | int inc[4] = { 0, 100, 0, 0 }; | ||
201 | struct chan_centers centers; | ||
202 | |||
203 | int8_t mask_m[123]; | ||
204 | int8_t mask_p[123]; | ||
205 | int8_t mask_amt; | ||
206 | int tmp_mask; | ||
207 | int cur_bb_spur; | ||
208 | bool is2GHz = IS_CHAN_2GHZ(chan); | ||
209 | |||
210 | memset(&mask_m, 0, sizeof(int8_t) * 123); | ||
211 | memset(&mask_p, 0, sizeof(int8_t) * 123); | ||
212 | |||
213 | ath9k_hw_get_channel_centers(ah, chan, ¢ers); | ||
214 | freq = centers.synth_center; | ||
215 | |||
216 | ah->config.spurmode = SPUR_ENABLE_EEPROM; | ||
217 | for (i = 0; i < AR_EEPROM_MODAL_SPURS; i++) { | ||
218 | cur_bb_spur = ah->eep_ops->get_spur_channel(ah, i, is2GHz); | ||
219 | |||
220 | if (is2GHz) | ||
221 | cur_bb_spur = (cur_bb_spur / 10) + AR_BASE_FREQ_2GHZ; | ||
222 | else | ||
223 | cur_bb_spur = (cur_bb_spur / 10) + AR_BASE_FREQ_5GHZ; | ||
224 | |||
225 | if (AR_NO_SPUR == cur_bb_spur) | ||
226 | break; | ||
227 | cur_bb_spur = cur_bb_spur - freq; | ||
228 | |||
229 | if (IS_CHAN_HT40(chan)) { | ||
230 | if ((cur_bb_spur > -AR_SPUR_FEEQ_BOUND_HT40) && | ||
231 | (cur_bb_spur < AR_SPUR_FEEQ_BOUND_HT40)) { | ||
232 | bb_spur = cur_bb_spur; | ||
233 | break; | ||
234 | } | ||
235 | } else if ((cur_bb_spur > -AR_SPUR_FEEQ_BOUND_HT20) && | ||
236 | (cur_bb_spur < AR_SPUR_FEEQ_BOUND_HT20)) { | ||
237 | bb_spur = cur_bb_spur; | ||
238 | break; | ||
239 | } | ||
240 | } | ||
241 | |||
242 | if (AR_NO_SPUR == bb_spur) { | ||
243 | REG_CLR_BIT(ah, AR_PHY_FORCE_CLKEN_CCK, | ||
244 | AR_PHY_FORCE_CLKEN_CCK_MRC_MUX); | ||
245 | return; | ||
246 | } else { | ||
247 | REG_CLR_BIT(ah, AR_PHY_FORCE_CLKEN_CCK, | ||
248 | AR_PHY_FORCE_CLKEN_CCK_MRC_MUX); | ||
249 | } | ||
250 | |||
251 | bin = bb_spur * 320; | ||
252 | |||
253 | tmp = REG_READ(ah, AR_PHY_TIMING_CTRL4(0)); | ||
254 | |||
255 | newVal = tmp | (AR_PHY_TIMING_CTRL4_ENABLE_SPUR_RSSI | | ||
256 | AR_PHY_TIMING_CTRL4_ENABLE_SPUR_FILTER | | ||
257 | AR_PHY_TIMING_CTRL4_ENABLE_CHAN_MASK | | ||
258 | AR_PHY_TIMING_CTRL4_ENABLE_PILOT_MASK); | ||
259 | REG_WRITE(ah, AR_PHY_TIMING_CTRL4(0), newVal); | ||
260 | |||
261 | newVal = (AR_PHY_SPUR_REG_MASK_RATE_CNTL | | ||
262 | AR_PHY_SPUR_REG_ENABLE_MASK_PPM | | ||
263 | AR_PHY_SPUR_REG_MASK_RATE_SELECT | | ||
264 | AR_PHY_SPUR_REG_ENABLE_VIT_SPUR_RSSI | | ||
265 | SM(SPUR_RSSI_THRESH, AR_PHY_SPUR_REG_SPUR_RSSI_THRESH)); | ||
266 | REG_WRITE(ah, AR_PHY_SPUR_REG, newVal); | ||
267 | |||
268 | if (IS_CHAN_HT40(chan)) { | ||
269 | if (bb_spur < 0) { | ||
270 | spur_subchannel_sd = 1; | ||
271 | bb_spur_off = bb_spur + 10; | ||
272 | } else { | ||
273 | spur_subchannel_sd = 0; | ||
274 | bb_spur_off = bb_spur - 10; | ||
275 | } | ||
276 | } else { | ||
277 | spur_subchannel_sd = 0; | ||
278 | bb_spur_off = bb_spur; | ||
279 | } | ||
280 | |||
281 | if (IS_CHAN_HT40(chan)) | ||
282 | spur_delta_phase = | ||
283 | ((bb_spur * 262144) / | ||
284 | 10) & AR_PHY_TIMING11_SPUR_DELTA_PHASE; | ||
285 | else | ||
286 | spur_delta_phase = | ||
287 | ((bb_spur * 524288) / | ||
288 | 10) & AR_PHY_TIMING11_SPUR_DELTA_PHASE; | ||
289 | |||
290 | denominator = IS_CHAN_2GHZ(chan) ? 44 : 40; | ||
291 | spur_freq_sd = ((bb_spur_off * 2048) / denominator) & 0x3ff; | ||
292 | |||
293 | newVal = (AR_PHY_TIMING11_USE_SPUR_IN_AGC | | ||
294 | SM(spur_freq_sd, AR_PHY_TIMING11_SPUR_FREQ_SD) | | ||
295 | SM(spur_delta_phase, AR_PHY_TIMING11_SPUR_DELTA_PHASE)); | ||
296 | REG_WRITE(ah, AR_PHY_TIMING11, newVal); | ||
297 | |||
298 | newVal = spur_subchannel_sd << AR_PHY_SFCORR_SPUR_SUBCHNL_SD_S; | ||
299 | REG_WRITE(ah, AR_PHY_SFCORR_EXT, newVal); | ||
300 | |||
301 | cur_bin = -6000; | ||
302 | upper = bin + 100; | ||
303 | lower = bin - 100; | ||
304 | |||
305 | for (i = 0; i < 4; i++) { | ||
306 | int pilot_mask = 0; | ||
307 | int chan_mask = 0; | ||
308 | int bp = 0; | ||
309 | for (bp = 0; bp < 30; bp++) { | ||
310 | if ((cur_bin > lower) && (cur_bin < upper)) { | ||
311 | pilot_mask = pilot_mask | 0x1 << bp; | ||
312 | chan_mask = chan_mask | 0x1 << bp; | ||
313 | } | ||
314 | cur_bin += 100; | ||
315 | } | ||
316 | cur_bin += inc[i]; | ||
317 | REG_WRITE(ah, pilot_mask_reg[i], pilot_mask); | ||
318 | REG_WRITE(ah, chan_mask_reg[i], chan_mask); | ||
319 | } | ||
320 | |||
321 | cur_vit_mask = 6100; | ||
322 | upper = bin + 120; | ||
323 | lower = bin - 120; | ||
324 | |||
325 | for (i = 0; i < 123; i++) { | ||
326 | if ((cur_vit_mask > lower) && (cur_vit_mask < upper)) { | ||
327 | |||
328 | /* workaround for gcc bug #37014 */ | ||
329 | volatile int tmp_v = abs(cur_vit_mask - bin); | ||
330 | |||
331 | if (tmp_v < 75) | ||
332 | mask_amt = 1; | ||
333 | else | ||
334 | mask_amt = 0; | ||
335 | if (cur_vit_mask < 0) | ||
336 | mask_m[abs(cur_vit_mask / 100)] = mask_amt; | ||
337 | else | ||
338 | mask_p[cur_vit_mask / 100] = mask_amt; | ||
339 | } | ||
340 | cur_vit_mask -= 100; | ||
341 | } | ||
342 | |||
343 | tmp_mask = (mask_m[46] << 30) | (mask_m[47] << 28) | ||
344 | | (mask_m[48] << 26) | (mask_m[49] << 24) | ||
345 | | (mask_m[50] << 22) | (mask_m[51] << 20) | ||
346 | | (mask_m[52] << 18) | (mask_m[53] << 16) | ||
347 | | (mask_m[54] << 14) | (mask_m[55] << 12) | ||
348 | | (mask_m[56] << 10) | (mask_m[57] << 8) | ||
349 | | (mask_m[58] << 6) | (mask_m[59] << 4) | ||
350 | | (mask_m[60] << 2) | (mask_m[61] << 0); | ||
351 | REG_WRITE(ah, AR_PHY_BIN_MASK_1, tmp_mask); | ||
352 | REG_WRITE(ah, AR_PHY_VIT_MASK2_M_46_61, tmp_mask); | ||
353 | |||
354 | tmp_mask = (mask_m[31] << 28) | ||
355 | | (mask_m[32] << 26) | (mask_m[33] << 24) | ||
356 | | (mask_m[34] << 22) | (mask_m[35] << 20) | ||
357 | | (mask_m[36] << 18) | (mask_m[37] << 16) | ||
358 | | (mask_m[48] << 14) | (mask_m[39] << 12) | ||
359 | | (mask_m[40] << 10) | (mask_m[41] << 8) | ||
360 | | (mask_m[42] << 6) | (mask_m[43] << 4) | ||
361 | | (mask_m[44] << 2) | (mask_m[45] << 0); | ||
362 | REG_WRITE(ah, AR_PHY_BIN_MASK_2, tmp_mask); | ||
363 | REG_WRITE(ah, AR_PHY_MASK2_M_31_45, tmp_mask); | ||
364 | |||
365 | tmp_mask = (mask_m[16] << 30) | (mask_m[16] << 28) | ||
366 | | (mask_m[18] << 26) | (mask_m[18] << 24) | ||
367 | | (mask_m[20] << 22) | (mask_m[20] << 20) | ||
368 | | (mask_m[22] << 18) | (mask_m[22] << 16) | ||
369 | | (mask_m[24] << 14) | (mask_m[24] << 12) | ||
370 | | (mask_m[25] << 10) | (mask_m[26] << 8) | ||
371 | | (mask_m[27] << 6) | (mask_m[28] << 4) | ||
372 | | (mask_m[29] << 2) | (mask_m[30] << 0); | ||
373 | REG_WRITE(ah, AR_PHY_BIN_MASK_3, tmp_mask); | ||
374 | REG_WRITE(ah, AR_PHY_MASK2_M_16_30, tmp_mask); | ||
375 | |||
376 | tmp_mask = (mask_m[0] << 30) | (mask_m[1] << 28) | ||
377 | | (mask_m[2] << 26) | (mask_m[3] << 24) | ||
378 | | (mask_m[4] << 22) | (mask_m[5] << 20) | ||
379 | | (mask_m[6] << 18) | (mask_m[7] << 16) | ||
380 | | (mask_m[8] << 14) | (mask_m[9] << 12) | ||
381 | | (mask_m[10] << 10) | (mask_m[11] << 8) | ||
382 | | (mask_m[12] << 6) | (mask_m[13] << 4) | ||
383 | | (mask_m[14] << 2) | (mask_m[15] << 0); | ||
384 | REG_WRITE(ah, AR_PHY_MASK_CTL, tmp_mask); | ||
385 | REG_WRITE(ah, AR_PHY_MASK2_M_00_15, tmp_mask); | ||
386 | |||
387 | tmp_mask = (mask_p[15] << 28) | ||
388 | | (mask_p[14] << 26) | (mask_p[13] << 24) | ||
389 | | (mask_p[12] << 22) | (mask_p[11] << 20) | ||
390 | | (mask_p[10] << 18) | (mask_p[9] << 16) | ||
391 | | (mask_p[8] << 14) | (mask_p[7] << 12) | ||
392 | | (mask_p[6] << 10) | (mask_p[5] << 8) | ||
393 | | (mask_p[4] << 6) | (mask_p[3] << 4) | ||
394 | | (mask_p[2] << 2) | (mask_p[1] << 0); | ||
395 | REG_WRITE(ah, AR_PHY_BIN_MASK2_1, tmp_mask); | ||
396 | REG_WRITE(ah, AR_PHY_MASK2_P_15_01, tmp_mask); | ||
397 | |||
398 | tmp_mask = (mask_p[30] << 28) | ||
399 | | (mask_p[29] << 26) | (mask_p[28] << 24) | ||
400 | | (mask_p[27] << 22) | (mask_p[26] << 20) | ||
401 | | (mask_p[25] << 18) | (mask_p[24] << 16) | ||
402 | | (mask_p[23] << 14) | (mask_p[22] << 12) | ||
403 | | (mask_p[21] << 10) | (mask_p[20] << 8) | ||
404 | | (mask_p[19] << 6) | (mask_p[18] << 4) | ||
405 | | (mask_p[17] << 2) | (mask_p[16] << 0); | ||
406 | REG_WRITE(ah, AR_PHY_BIN_MASK2_2, tmp_mask); | ||
407 | REG_WRITE(ah, AR_PHY_MASK2_P_30_16, tmp_mask); | ||
408 | |||
409 | tmp_mask = (mask_p[45] << 28) | ||
410 | | (mask_p[44] << 26) | (mask_p[43] << 24) | ||
411 | | (mask_p[42] << 22) | (mask_p[41] << 20) | ||
412 | | (mask_p[40] << 18) | (mask_p[39] << 16) | ||
413 | | (mask_p[38] << 14) | (mask_p[37] << 12) | ||
414 | | (mask_p[36] << 10) | (mask_p[35] << 8) | ||
415 | | (mask_p[34] << 6) | (mask_p[33] << 4) | ||
416 | | (mask_p[32] << 2) | (mask_p[31] << 0); | ||
417 | REG_WRITE(ah, AR_PHY_BIN_MASK2_3, tmp_mask); | ||
418 | REG_WRITE(ah, AR_PHY_MASK2_P_45_31, tmp_mask); | ||
419 | |||
420 | tmp_mask = (mask_p[61] << 30) | (mask_p[60] << 28) | ||
421 | | (mask_p[59] << 26) | (mask_p[58] << 24) | ||
422 | | (mask_p[57] << 22) | (mask_p[56] << 20) | ||
423 | | (mask_p[55] << 18) | (mask_p[54] << 16) | ||
424 | | (mask_p[53] << 14) | (mask_p[52] << 12) | ||
425 | | (mask_p[51] << 10) | (mask_p[50] << 8) | ||
426 | | (mask_p[49] << 6) | (mask_p[48] << 4) | ||
427 | | (mask_p[47] << 2) | (mask_p[46] << 0); | ||
428 | REG_WRITE(ah, AR_PHY_BIN_MASK2_4, tmp_mask); | ||
429 | REG_WRITE(ah, AR_PHY_MASK2_P_61_45, tmp_mask); | ||
430 | } | ||
431 | |||
432 | /* All code below is for non single-chip solutions */ | ||
433 | |||
434 | /** | ||
435 | * ath9k_phy_modify_rx_buffer() - perform analog swizzling of parameters | ||
436 | * @rfbuf: | ||
437 | * @reg32: | ||
438 | * @numBits: | ||
439 | * @firstBit: | ||
440 | * @column: | ||
441 | * | ||
442 | * Performs analog "swizzling" of parameters into their location. | ||
443 | * Used on external AR2133/AR5133 radios. | ||
444 | */ | ||
445 | static void ath9k_phy_modify_rx_buffer(u32 *rfBuf, u32 reg32, | ||
446 | u32 numBits, u32 firstBit, | ||
447 | u32 column) | ||
448 | { | ||
449 | u32 tmp32, mask, arrayEntry, lastBit; | ||
450 | int32_t bitPosition, bitsLeft; | ||
451 | |||
452 | tmp32 = ath9k_hw_reverse_bits(reg32, numBits); | ||
453 | arrayEntry = (firstBit - 1) / 8; | ||
454 | bitPosition = (firstBit - 1) % 8; | ||
455 | bitsLeft = numBits; | ||
456 | while (bitsLeft > 0) { | ||
457 | lastBit = (bitPosition + bitsLeft > 8) ? | ||
458 | 8 : bitPosition + bitsLeft; | ||
459 | mask = (((1 << lastBit) - 1) ^ ((1 << bitPosition) - 1)) << | ||
460 | (column * 8); | ||
461 | rfBuf[arrayEntry] &= ~mask; | ||
462 | rfBuf[arrayEntry] |= ((tmp32 << bitPosition) << | ||
463 | (column * 8)) & mask; | ||
464 | bitsLeft -= 8 - bitPosition; | ||
465 | tmp32 = tmp32 >> (8 - bitPosition); | ||
466 | bitPosition = 0; | ||
467 | arrayEntry++; | ||
468 | } | ||
469 | } | ||
470 | |||
471 | /* | ||
472 | * Fix on 2.4 GHz band for orientation sensitivity issue by increasing | ||
473 | * rf_pwd_icsyndiv. | ||
474 | * | ||
475 | * Theoretical Rules: | ||
476 | * if 2 GHz band | ||
477 | * if forceBiasAuto | ||
478 | * if synth_freq < 2412 | ||
479 | * bias = 0 | ||
480 | * else if 2412 <= synth_freq <= 2422 | ||
481 | * bias = 1 | ||
482 | * else // synth_freq > 2422 | ||
483 | * bias = 2 | ||
484 | * else if forceBias > 0 | ||
485 | * bias = forceBias & 7 | ||
486 | * else | ||
487 | * no change, use value from ini file | ||
488 | * else | ||
489 | * no change, invalid band | ||
490 | * | ||
491 | * 1st Mod: | ||
492 | * 2422 also uses value of 2 | ||
493 | * <approved> | ||
494 | * | ||
495 | * 2nd Mod: | ||
496 | * Less than 2412 uses value of 0, 2412 and above uses value of 2 | ||
497 | */ | ||
498 | static void ath9k_hw_force_bias(struct ath_hw *ah, u16 synth_freq) | ||
499 | { | ||
500 | struct ath_common *common = ath9k_hw_common(ah); | ||
501 | u32 tmp_reg; | ||
502 | int reg_writes = 0; | ||
503 | u32 new_bias = 0; | ||
504 | |||
505 | if (!AR_SREV_5416(ah) || synth_freq >= 3000) { | ||
506 | return; | ||
507 | } | ||
508 | |||
509 | BUG_ON(AR_SREV_9280_10_OR_LATER(ah)); | ||
510 | |||
511 | if (synth_freq < 2412) | ||
512 | new_bias = 0; | ||
513 | else if (synth_freq < 2422) | ||
514 | new_bias = 1; | ||
515 | else | ||
516 | new_bias = 2; | ||
517 | |||
518 | /* pre-reverse this field */ | ||
519 | tmp_reg = ath9k_hw_reverse_bits(new_bias, 3); | ||
520 | |||
521 | ath_print(common, ATH_DBG_CONFIG, | ||
522 | "Force rf_pwd_icsyndiv to %1d on %4d\n", | ||
523 | new_bias, synth_freq); | ||
524 | |||
525 | /* swizzle rf_pwd_icsyndiv */ | ||
526 | ath9k_phy_modify_rx_buffer(ah->analogBank6Data, tmp_reg, 3, 181, 3); | ||
527 | |||
528 | /* write Bank 6 with new params */ | ||
529 | REG_WRITE_RF_ARRAY(&ah->iniBank6, ah->analogBank6Data, reg_writes); | ||
530 | } | ||
531 | |||
532 | /** | ||
533 | * ath9k_hw_set_channel - tune to a channel on the external AR2133/AR5133 radios | ||
534 | * @ah: atheros hardware stucture | ||
535 | * @chan: | ||
536 | * | ||
537 | * For the external AR2133/AR5133 radios, takes the MHz channel value and set | ||
538 | * the channel value. Assumes writes enabled to analog bus and bank6 register | ||
539 | * cache in ah->analogBank6Data. | ||
540 | */ | ||
541 | int ath9k_hw_set_channel(struct ath_hw *ah, struct ath9k_channel *chan) | ||
542 | { | ||
543 | struct ath_common *common = ath9k_hw_common(ah); | ||
544 | u32 channelSel = 0; | ||
545 | u32 bModeSynth = 0; | ||
546 | u32 aModeRefSel = 0; | ||
547 | u32 reg32 = 0; | ||
548 | u16 freq; | ||
549 | struct chan_centers centers; | ||
550 | |||
551 | ath9k_hw_get_channel_centers(ah, chan, ¢ers); | ||
552 | freq = centers.synth_center; | ||
553 | |||
554 | if (freq < 4800) { | ||
555 | u32 txctl; | ||
556 | |||
557 | if (((freq - 2192) % 5) == 0) { | ||
558 | channelSel = ((freq - 672) * 2 - 3040) / 10; | ||
559 | bModeSynth = 0; | ||
560 | } else if (((freq - 2224) % 5) == 0) { | ||
561 | channelSel = ((freq - 704) * 2 - 3040) / 10; | ||
562 | bModeSynth = 1; | ||
563 | } else { | ||
564 | ath_print(common, ATH_DBG_FATAL, | ||
565 | "Invalid channel %u MHz\n", freq); | ||
566 | return -EINVAL; | ||
567 | } | ||
568 | |||
569 | channelSel = (channelSel << 2) & 0xff; | ||
570 | channelSel = ath9k_hw_reverse_bits(channelSel, 8); | ||
571 | |||
572 | txctl = REG_READ(ah, AR_PHY_CCK_TX_CTRL); | ||
573 | if (freq == 2484) { | ||
574 | |||
575 | REG_WRITE(ah, AR_PHY_CCK_TX_CTRL, | ||
576 | txctl | AR_PHY_CCK_TX_CTRL_JAPAN); | ||
577 | } else { | ||
578 | REG_WRITE(ah, AR_PHY_CCK_TX_CTRL, | ||
579 | txctl & ~AR_PHY_CCK_TX_CTRL_JAPAN); | ||
580 | } | ||
581 | |||
582 | } else if ((freq % 20) == 0 && freq >= 5120) { | ||
583 | channelSel = | ||
584 | ath9k_hw_reverse_bits(((freq - 4800) / 20 << 2), 8); | ||
585 | aModeRefSel = ath9k_hw_reverse_bits(1, 2); | ||
586 | } else if ((freq % 10) == 0) { | ||
587 | channelSel = | ||
588 | ath9k_hw_reverse_bits(((freq - 4800) / 10 << 1), 8); | ||
589 | if (AR_SREV_9100(ah) || AR_SREV_9160_10_OR_LATER(ah)) | ||
590 | aModeRefSel = ath9k_hw_reverse_bits(2, 2); | ||
591 | else | ||
592 | aModeRefSel = ath9k_hw_reverse_bits(1, 2); | ||
593 | } else if ((freq % 5) == 0) { | ||
594 | channelSel = ath9k_hw_reverse_bits((freq - 4800) / 5, 8); | ||
595 | aModeRefSel = ath9k_hw_reverse_bits(1, 2); | ||
596 | } else { | ||
597 | ath_print(common, ATH_DBG_FATAL, | ||
598 | "Invalid channel %u MHz\n", freq); | ||
599 | return -EINVAL; | ||
600 | } | ||
601 | |||
602 | ath9k_hw_force_bias(ah, freq); | ||
603 | |||
604 | reg32 = | ||
605 | (channelSel << 8) | (aModeRefSel << 2) | (bModeSynth << 1) | | ||
606 | (1 << 5) | 0x1; | ||
607 | |||
608 | REG_WRITE(ah, AR_PHY(0x37), reg32); | ||
609 | |||
610 | ah->curchan = chan; | ||
611 | ah->curchan_rad_index = -1; | ||
612 | |||
613 | return 0; | ||
614 | } | ||
615 | |||
616 | /** | ||
617 | * ath9k_hw_spur_mitigate - convert baseband spur frequency for external radios | ||
618 | * @ah: atheros hardware structure | ||
619 | * @chan: | ||
620 | * | ||
621 | * For non single-chip solutions. Converts to baseband spur frequency given the | ||
622 | * input channel frequency and compute register settings below. | ||
623 | */ | ||
624 | void ath9k_hw_spur_mitigate(struct ath_hw *ah, struct ath9k_channel *chan) | ||
625 | { | ||
626 | int bb_spur = AR_NO_SPUR; | ||
627 | int bin, cur_bin; | ||
628 | int spur_freq_sd; | ||
629 | int spur_delta_phase; | ||
630 | int denominator; | ||
631 | int upper, lower, cur_vit_mask; | ||
632 | int tmp, new; | ||
633 | int i; | ||
634 | int pilot_mask_reg[4] = { AR_PHY_TIMING7, AR_PHY_TIMING8, | ||
635 | AR_PHY_PILOT_MASK_01_30, AR_PHY_PILOT_MASK_31_60 | ||
636 | }; | ||
637 | int chan_mask_reg[4] = { AR_PHY_TIMING9, AR_PHY_TIMING10, | ||
638 | AR_PHY_CHANNEL_MASK_01_30, AR_PHY_CHANNEL_MASK_31_60 | ||
639 | }; | ||
640 | int inc[4] = { 0, 100, 0, 0 }; | ||
641 | |||
642 | int8_t mask_m[123]; | ||
643 | int8_t mask_p[123]; | ||
644 | int8_t mask_amt; | ||
645 | int tmp_mask; | ||
646 | int cur_bb_spur; | ||
647 | bool is2GHz = IS_CHAN_2GHZ(chan); | ||
648 | |||
649 | memset(&mask_m, 0, sizeof(int8_t) * 123); | ||
650 | memset(&mask_p, 0, sizeof(int8_t) * 123); | ||
651 | |||
652 | for (i = 0; i < AR_EEPROM_MODAL_SPURS; i++) { | ||
653 | cur_bb_spur = ah->eep_ops->get_spur_channel(ah, i, is2GHz); | ||
654 | if (AR_NO_SPUR == cur_bb_spur) | ||
655 | break; | ||
656 | cur_bb_spur = cur_bb_spur - (chan->channel * 10); | ||
657 | if ((cur_bb_spur > -95) && (cur_bb_spur < 95)) { | ||
658 | bb_spur = cur_bb_spur; | ||
659 | break; | ||
660 | } | ||
661 | } | ||
662 | |||
663 | if (AR_NO_SPUR == bb_spur) | ||
664 | return; | ||
665 | |||
666 | bin = bb_spur * 32; | ||
667 | |||
668 | tmp = REG_READ(ah, AR_PHY_TIMING_CTRL4(0)); | ||
669 | new = tmp | (AR_PHY_TIMING_CTRL4_ENABLE_SPUR_RSSI | | ||
670 | AR_PHY_TIMING_CTRL4_ENABLE_SPUR_FILTER | | ||
671 | AR_PHY_TIMING_CTRL4_ENABLE_CHAN_MASK | | ||
672 | AR_PHY_TIMING_CTRL4_ENABLE_PILOT_MASK); | ||
673 | |||
674 | REG_WRITE(ah, AR_PHY_TIMING_CTRL4(0), new); | ||
675 | |||
676 | new = (AR_PHY_SPUR_REG_MASK_RATE_CNTL | | ||
677 | AR_PHY_SPUR_REG_ENABLE_MASK_PPM | | ||
678 | AR_PHY_SPUR_REG_MASK_RATE_SELECT | | ||
679 | AR_PHY_SPUR_REG_ENABLE_VIT_SPUR_RSSI | | ||
680 | SM(SPUR_RSSI_THRESH, AR_PHY_SPUR_REG_SPUR_RSSI_THRESH)); | ||
681 | REG_WRITE(ah, AR_PHY_SPUR_REG, new); | ||
682 | |||
683 | spur_delta_phase = ((bb_spur * 524288) / 100) & | ||
684 | AR_PHY_TIMING11_SPUR_DELTA_PHASE; | ||
685 | |||
686 | denominator = IS_CHAN_2GHZ(chan) ? 440 : 400; | ||
687 | spur_freq_sd = ((bb_spur * 2048) / denominator) & 0x3ff; | ||
688 | |||
689 | new = (AR_PHY_TIMING11_USE_SPUR_IN_AGC | | ||
690 | SM(spur_freq_sd, AR_PHY_TIMING11_SPUR_FREQ_SD) | | ||
691 | SM(spur_delta_phase, AR_PHY_TIMING11_SPUR_DELTA_PHASE)); | ||
692 | REG_WRITE(ah, AR_PHY_TIMING11, new); | ||
693 | |||
694 | cur_bin = -6000; | ||
695 | upper = bin + 100; | ||
696 | lower = bin - 100; | ||
697 | |||
698 | for (i = 0; i < 4; i++) { | ||
699 | int pilot_mask = 0; | ||
700 | int chan_mask = 0; | ||
701 | int bp = 0; | ||
702 | for (bp = 0; bp < 30; bp++) { | ||
703 | if ((cur_bin > lower) && (cur_bin < upper)) { | ||
704 | pilot_mask = pilot_mask | 0x1 << bp; | ||
705 | chan_mask = chan_mask | 0x1 << bp; | ||
706 | } | ||
707 | cur_bin += 100; | ||
708 | } | ||
709 | cur_bin += inc[i]; | ||
710 | REG_WRITE(ah, pilot_mask_reg[i], pilot_mask); | ||
711 | REG_WRITE(ah, chan_mask_reg[i], chan_mask); | ||
712 | } | ||
713 | |||
714 | cur_vit_mask = 6100; | ||
715 | upper = bin + 120; | ||
716 | lower = bin - 120; | ||
717 | |||
718 | for (i = 0; i < 123; i++) { | ||
719 | if ((cur_vit_mask > lower) && (cur_vit_mask < upper)) { | ||
720 | |||
721 | /* workaround for gcc bug #37014 */ | ||
722 | volatile int tmp_v = abs(cur_vit_mask - bin); | ||
723 | |||
724 | if (tmp_v < 75) | ||
725 | mask_amt = 1; | ||
726 | else | ||
727 | mask_amt = 0; | ||
728 | if (cur_vit_mask < 0) | ||
729 | mask_m[abs(cur_vit_mask / 100)] = mask_amt; | ||
730 | else | ||
731 | mask_p[cur_vit_mask / 100] = mask_amt; | ||
732 | } | ||
733 | cur_vit_mask -= 100; | ||
734 | } | ||
735 | |||
736 | tmp_mask = (mask_m[46] << 30) | (mask_m[47] << 28) | ||
737 | | (mask_m[48] << 26) | (mask_m[49] << 24) | ||
738 | | (mask_m[50] << 22) | (mask_m[51] << 20) | ||
739 | | (mask_m[52] << 18) | (mask_m[53] << 16) | ||
740 | | (mask_m[54] << 14) | (mask_m[55] << 12) | ||
741 | | (mask_m[56] << 10) | (mask_m[57] << 8) | ||
742 | | (mask_m[58] << 6) | (mask_m[59] << 4) | ||
743 | | (mask_m[60] << 2) | (mask_m[61] << 0); | ||
744 | REG_WRITE(ah, AR_PHY_BIN_MASK_1, tmp_mask); | ||
745 | REG_WRITE(ah, AR_PHY_VIT_MASK2_M_46_61, tmp_mask); | ||
746 | |||
747 | tmp_mask = (mask_m[31] << 28) | ||
748 | | (mask_m[32] << 26) | (mask_m[33] << 24) | ||
749 | | (mask_m[34] << 22) | (mask_m[35] << 20) | ||
750 | | (mask_m[36] << 18) | (mask_m[37] << 16) | ||
751 | | (mask_m[48] << 14) | (mask_m[39] << 12) | ||
752 | | (mask_m[40] << 10) | (mask_m[41] << 8) | ||
753 | | (mask_m[42] << 6) | (mask_m[43] << 4) | ||
754 | | (mask_m[44] << 2) | (mask_m[45] << 0); | ||
755 | REG_WRITE(ah, AR_PHY_BIN_MASK_2, tmp_mask); | ||
756 | REG_WRITE(ah, AR_PHY_MASK2_M_31_45, tmp_mask); | ||
757 | |||
758 | tmp_mask = (mask_m[16] << 30) | (mask_m[16] << 28) | ||
759 | | (mask_m[18] << 26) | (mask_m[18] << 24) | ||
760 | | (mask_m[20] << 22) | (mask_m[20] << 20) | ||
761 | | (mask_m[22] << 18) | (mask_m[22] << 16) | ||
762 | | (mask_m[24] << 14) | (mask_m[24] << 12) | ||
763 | | (mask_m[25] << 10) | (mask_m[26] << 8) | ||
764 | | (mask_m[27] << 6) | (mask_m[28] << 4) | ||
765 | | (mask_m[29] << 2) | (mask_m[30] << 0); | ||
766 | REG_WRITE(ah, AR_PHY_BIN_MASK_3, tmp_mask); | ||
767 | REG_WRITE(ah, AR_PHY_MASK2_M_16_30, tmp_mask); | ||
768 | |||
769 | tmp_mask = (mask_m[0] << 30) | (mask_m[1] << 28) | ||
770 | | (mask_m[2] << 26) | (mask_m[3] << 24) | ||
771 | | (mask_m[4] << 22) | (mask_m[5] << 20) | ||
772 | | (mask_m[6] << 18) | (mask_m[7] << 16) | ||
773 | | (mask_m[8] << 14) | (mask_m[9] << 12) | ||
774 | | (mask_m[10] << 10) | (mask_m[11] << 8) | ||
775 | | (mask_m[12] << 6) | (mask_m[13] << 4) | ||
776 | | (mask_m[14] << 2) | (mask_m[15] << 0); | ||
777 | REG_WRITE(ah, AR_PHY_MASK_CTL, tmp_mask); | ||
778 | REG_WRITE(ah, AR_PHY_MASK2_M_00_15, tmp_mask); | ||
779 | |||
780 | tmp_mask = (mask_p[15] << 28) | ||
781 | | (mask_p[14] << 26) | (mask_p[13] << 24) | ||
782 | | (mask_p[12] << 22) | (mask_p[11] << 20) | ||
783 | | (mask_p[10] << 18) | (mask_p[9] << 16) | ||
784 | | (mask_p[8] << 14) | (mask_p[7] << 12) | ||
785 | | (mask_p[6] << 10) | (mask_p[5] << 8) | ||
786 | | (mask_p[4] << 6) | (mask_p[3] << 4) | ||
787 | | (mask_p[2] << 2) | (mask_p[1] << 0); | ||
788 | REG_WRITE(ah, AR_PHY_BIN_MASK2_1, tmp_mask); | ||
789 | REG_WRITE(ah, AR_PHY_MASK2_P_15_01, tmp_mask); | ||
790 | |||
791 | tmp_mask = (mask_p[30] << 28) | ||
792 | | (mask_p[29] << 26) | (mask_p[28] << 24) | ||
793 | | (mask_p[27] << 22) | (mask_p[26] << 20) | ||
794 | | (mask_p[25] << 18) | (mask_p[24] << 16) | ||
795 | | (mask_p[23] << 14) | (mask_p[22] << 12) | ||
796 | | (mask_p[21] << 10) | (mask_p[20] << 8) | ||
797 | | (mask_p[19] << 6) | (mask_p[18] << 4) | ||
798 | | (mask_p[17] << 2) | (mask_p[16] << 0); | ||
799 | REG_WRITE(ah, AR_PHY_BIN_MASK2_2, tmp_mask); | ||
800 | REG_WRITE(ah, AR_PHY_MASK2_P_30_16, tmp_mask); | ||
801 | |||
802 | tmp_mask = (mask_p[45] << 28) | ||
803 | | (mask_p[44] << 26) | (mask_p[43] << 24) | ||
804 | | (mask_p[42] << 22) | (mask_p[41] << 20) | ||
805 | | (mask_p[40] << 18) | (mask_p[39] << 16) | ||
806 | | (mask_p[38] << 14) | (mask_p[37] << 12) | ||
807 | | (mask_p[36] << 10) | (mask_p[35] << 8) | ||
808 | | (mask_p[34] << 6) | (mask_p[33] << 4) | ||
809 | | (mask_p[32] << 2) | (mask_p[31] << 0); | ||
810 | REG_WRITE(ah, AR_PHY_BIN_MASK2_3, tmp_mask); | ||
811 | REG_WRITE(ah, AR_PHY_MASK2_P_45_31, tmp_mask); | ||
812 | |||
813 | tmp_mask = (mask_p[61] << 30) | (mask_p[60] << 28) | ||
814 | | (mask_p[59] << 26) | (mask_p[58] << 24) | ||
815 | | (mask_p[57] << 22) | (mask_p[56] << 20) | ||
816 | | (mask_p[55] << 18) | (mask_p[54] << 16) | ||
817 | | (mask_p[53] << 14) | (mask_p[52] << 12) | ||
818 | | (mask_p[51] << 10) | (mask_p[50] << 8) | ||
819 | | (mask_p[49] << 6) | (mask_p[48] << 4) | ||
820 | | (mask_p[47] << 2) | (mask_p[46] << 0); | ||
821 | REG_WRITE(ah, AR_PHY_BIN_MASK2_4, tmp_mask); | ||
822 | REG_WRITE(ah, AR_PHY_MASK2_P_61_45, tmp_mask); | ||
823 | } | ||
824 | |||
825 | /** | ||
826 | * ath9k_hw_rf_alloc_ext_banks - allocates banks for external radio programming | ||
827 | * @ah: atheros hardware structure | ||
828 | * | ||
829 | * Only required for older devices with external AR2133/AR5133 radios. | ||
830 | */ | ||
831 | int ath9k_hw_rf_alloc_ext_banks(struct ath_hw *ah) | ||
832 | { | ||
833 | #define ATH_ALLOC_BANK(bank, size) do { \ | ||
834 | bank = kzalloc((sizeof(u32) * size), GFP_KERNEL); \ | ||
835 | if (!bank) { \ | ||
836 | ath_print(common, ATH_DBG_FATAL, \ | ||
837 | "Cannot allocate RF banks\n"); \ | ||
838 | return -ENOMEM; \ | ||
839 | } \ | ||
840 | } while (0); | ||
841 | |||
842 | struct ath_common *common = ath9k_hw_common(ah); | ||
843 | |||
844 | BUG_ON(AR_SREV_9280_10_OR_LATER(ah)); | ||
845 | |||
846 | ATH_ALLOC_BANK(ah->analogBank0Data, ah->iniBank0.ia_rows); | ||
847 | ATH_ALLOC_BANK(ah->analogBank1Data, ah->iniBank1.ia_rows); | ||
848 | ATH_ALLOC_BANK(ah->analogBank2Data, ah->iniBank2.ia_rows); | ||
849 | ATH_ALLOC_BANK(ah->analogBank3Data, ah->iniBank3.ia_rows); | ||
850 | ATH_ALLOC_BANK(ah->analogBank6Data, ah->iniBank6.ia_rows); | ||
851 | ATH_ALLOC_BANK(ah->analogBank6TPCData, ah->iniBank6TPC.ia_rows); | ||
852 | ATH_ALLOC_BANK(ah->analogBank7Data, ah->iniBank7.ia_rows); | ||
853 | ATH_ALLOC_BANK(ah->addac5416_21, | ||
854 | ah->iniAddac.ia_rows * ah->iniAddac.ia_columns); | ||
855 | ATH_ALLOC_BANK(ah->bank6Temp, ah->iniBank6.ia_rows); | ||
856 | |||
857 | return 0; | ||
858 | #undef ATH_ALLOC_BANK | ||
859 | } | ||
860 | |||
861 | |||
862 | /** | ||
863 | * ath9k_hw_rf_free_ext_banks - Free memory for analog bank scratch buffers | ||
864 | * @ah: atheros hardware struture | ||
865 | * For the external AR2133/AR5133 radios banks. | ||
866 | */ | ||
867 | void | ||
868 | ath9k_hw_rf_free_ext_banks(struct ath_hw *ah) | ||
869 | { | ||
870 | #define ATH_FREE_BANK(bank) do { \ | ||
871 | kfree(bank); \ | ||
872 | bank = NULL; \ | ||
873 | } while (0); | ||
874 | |||
875 | BUG_ON(AR_SREV_9280_10_OR_LATER(ah)); | ||
876 | |||
877 | ATH_FREE_BANK(ah->analogBank0Data); | ||
878 | ATH_FREE_BANK(ah->analogBank1Data); | ||
879 | ATH_FREE_BANK(ah->analogBank2Data); | ||
880 | ATH_FREE_BANK(ah->analogBank3Data); | ||
881 | ATH_FREE_BANK(ah->analogBank6Data); | ||
882 | ATH_FREE_BANK(ah->analogBank6TPCData); | ||
883 | ATH_FREE_BANK(ah->analogBank7Data); | ||
884 | ATH_FREE_BANK(ah->addac5416_21); | ||
885 | ATH_FREE_BANK(ah->bank6Temp); | ||
886 | |||
887 | #undef ATH_FREE_BANK | ||
888 | } | ||
889 | |||
890 | /* * | ||
891 | * ath9k_hw_set_rf_regs - programs rf registers based on EEPROM | ||
892 | * @ah: atheros hardware structure | ||
893 | * @chan: | ||
894 | * @modesIndex: | ||
895 | * | ||
896 | * Used for the external AR2133/AR5133 radios. | ||
897 | * | ||
898 | * Reads the EEPROM header info from the device structure and programs | ||
899 | * all rf registers. This routine requires access to the analog | ||
900 | * rf device. This is not required for single-chip devices. | ||
901 | */ | ||
902 | bool ath9k_hw_set_rf_regs(struct ath_hw *ah, struct ath9k_channel *chan, | ||
903 | u16 modesIndex) | ||
904 | { | ||
905 | u32 eepMinorRev; | ||
906 | u32 ob5GHz = 0, db5GHz = 0; | ||
907 | u32 ob2GHz = 0, db2GHz = 0; | ||
908 | int regWrites = 0; | ||
909 | |||
910 | /* | ||
911 | * Software does not need to program bank data | ||
912 | * for single chip devices, that is AR9280 or anything | ||
913 | * after that. | ||
914 | */ | ||
915 | if (AR_SREV_9280_10_OR_LATER(ah)) | ||
916 | return true; | ||
917 | |||
918 | /* Setup rf parameters */ | ||
919 | eepMinorRev = ah->eep_ops->get_eeprom(ah, EEP_MINOR_REV); | ||
920 | |||
921 | /* Setup Bank 0 Write */ | ||
922 | RF_BANK_SETUP(ah->analogBank0Data, &ah->iniBank0, 1); | ||
923 | |||
924 | /* Setup Bank 1 Write */ | ||
925 | RF_BANK_SETUP(ah->analogBank1Data, &ah->iniBank1, 1); | ||
926 | |||
927 | /* Setup Bank 2 Write */ | ||
928 | RF_BANK_SETUP(ah->analogBank2Data, &ah->iniBank2, 1); | ||
929 | |||
930 | /* Setup Bank 6 Write */ | ||
931 | RF_BANK_SETUP(ah->analogBank3Data, &ah->iniBank3, | ||
932 | modesIndex); | ||
933 | { | ||
934 | int i; | ||
935 | for (i = 0; i < ah->iniBank6TPC.ia_rows; i++) { | ||
936 | ah->analogBank6Data[i] = | ||
937 | INI_RA(&ah->iniBank6TPC, i, modesIndex); | ||
938 | } | ||
939 | } | ||
940 | |||
941 | /* Only the 5 or 2 GHz OB/DB need to be set for a mode */ | ||
942 | if (eepMinorRev >= 2) { | ||
943 | if (IS_CHAN_2GHZ(chan)) { | ||
944 | ob2GHz = ah->eep_ops->get_eeprom(ah, EEP_OB_2); | ||
945 | db2GHz = ah->eep_ops->get_eeprom(ah, EEP_DB_2); | ||
946 | ath9k_phy_modify_rx_buffer(ah->analogBank6Data, | ||
947 | ob2GHz, 3, 197, 0); | ||
948 | ath9k_phy_modify_rx_buffer(ah->analogBank6Data, | ||
949 | db2GHz, 3, 194, 0); | ||
950 | } else { | ||
951 | ob5GHz = ah->eep_ops->get_eeprom(ah, EEP_OB_5); | ||
952 | db5GHz = ah->eep_ops->get_eeprom(ah, EEP_DB_5); | ||
953 | ath9k_phy_modify_rx_buffer(ah->analogBank6Data, | ||
954 | ob5GHz, 3, 203, 0); | ||
955 | ath9k_phy_modify_rx_buffer(ah->analogBank6Data, | ||
956 | db5GHz, 3, 200, 0); | ||
957 | } | ||
958 | } | ||
959 | |||
960 | /* Setup Bank 7 Setup */ | ||
961 | RF_BANK_SETUP(ah->analogBank7Data, &ah->iniBank7, 1); | ||
962 | |||
963 | /* Write Analog registers */ | ||
964 | REG_WRITE_RF_ARRAY(&ah->iniBank0, ah->analogBank0Data, | ||
965 | regWrites); | ||
966 | REG_WRITE_RF_ARRAY(&ah->iniBank1, ah->analogBank1Data, | ||
967 | regWrites); | ||
968 | REG_WRITE_RF_ARRAY(&ah->iniBank2, ah->analogBank2Data, | ||
969 | regWrites); | ||
970 | REG_WRITE_RF_ARRAY(&ah->iniBank3, ah->analogBank3Data, | ||
971 | regWrites); | ||
972 | REG_WRITE_RF_ARRAY(&ah->iniBank6TPC, ah->analogBank6Data, | ||
973 | regWrites); | ||
974 | REG_WRITE_RF_ARRAY(&ah->iniBank7, ah->analogBank7Data, | ||
975 | regWrites); | ||
976 | |||
977 | return true; | ||
978 | } | ||
diff --git a/drivers/net/wireless/ath/ath9k/phy.h b/drivers/net/wireless/ath/ath9k/phy.h index 0132e4c9a9f9..e724c2c1ae2a 100644 --- a/drivers/net/wireless/ath/ath9k/phy.h +++ b/drivers/net/wireless/ath/ath9k/phy.h | |||
@@ -17,504 +17,15 @@ | |||
17 | #ifndef PHY_H | 17 | #ifndef PHY_H |
18 | #define PHY_H | 18 | #define PHY_H |
19 | 19 | ||
20 | /* Common between single chip and non single-chip solutions */ | 20 | #define CHANSEL_DIV 15 |
21 | void ath9k_hw_write_regs(struct ath_hw *ah, u32 freqIndex, int regWrites); | 21 | #define CHANSEL_2G(_freq) (((_freq) * 0x10000) / CHANSEL_DIV) |
22 | 22 | #define CHANSEL_5G(_freq) (((_freq) * 0x8000) / CHANSEL_DIV) | |
23 | /* Single chip radio settings */ | ||
24 | int ath9k_hw_ar9280_set_channel(struct ath_hw *ah, struct ath9k_channel *chan); | ||
25 | void ath9k_hw_9280_spur_mitigate(struct ath_hw *ah, struct ath9k_channel *chan); | ||
26 | |||
27 | /* Routines below are for non single-chip solutions */ | ||
28 | int ath9k_hw_set_channel(struct ath_hw *ah, struct ath9k_channel *chan); | ||
29 | void ath9k_hw_spur_mitigate(struct ath_hw *ah, struct ath9k_channel *chan); | ||
30 | |||
31 | int ath9k_hw_rf_alloc_ext_banks(struct ath_hw *ah); | ||
32 | void ath9k_hw_rf_free_ext_banks(struct ath_hw *ah); | ||
33 | |||
34 | bool ath9k_hw_set_rf_regs(struct ath_hw *ah, | ||
35 | struct ath9k_channel *chan, | ||
36 | u16 modesIndex); | ||
37 | 23 | ||
38 | #define AR_PHY_BASE 0x9800 | 24 | #define AR_PHY_BASE 0x9800 |
39 | #define AR_PHY(_n) (AR_PHY_BASE + ((_n)<<2)) | 25 | #define AR_PHY(_n) (AR_PHY_BASE + ((_n)<<2)) |
40 | 26 | ||
41 | #define AR_PHY_TEST 0x9800 | ||
42 | #define PHY_AGC_CLR 0x10000000 | ||
43 | #define RFSILENT_BB 0x00002000 | ||
44 | |||
45 | #define AR_PHY_TURBO 0x9804 | ||
46 | #define AR_PHY_FC_TURBO_MODE 0x00000001 | ||
47 | #define AR_PHY_FC_TURBO_SHORT 0x00000002 | ||
48 | #define AR_PHY_FC_DYN2040_EN 0x00000004 | ||
49 | #define AR_PHY_FC_DYN2040_PRI_ONLY 0x00000008 | ||
50 | #define AR_PHY_FC_DYN2040_PRI_CH 0x00000010 | ||
51 | /* For 25 MHz channel spacing -- not used but supported by hw */ | ||
52 | #define AR_PHY_FC_DYN2040_EXT_CH 0x00000020 | ||
53 | #define AR_PHY_FC_HT_EN 0x00000040 | ||
54 | #define AR_PHY_FC_SHORT_GI_40 0x00000080 | ||
55 | #define AR_PHY_FC_WALSH 0x00000100 | ||
56 | #define AR_PHY_FC_SINGLE_HT_LTF1 0x00000200 | ||
57 | #define AR_PHY_FC_ENABLE_DAC_FIFO 0x00000800 | ||
58 | |||
59 | #define AR_PHY_TEST2 0x9808 | ||
60 | |||
61 | #define AR_PHY_TIMING2 0x9810 | ||
62 | #define AR_PHY_TIMING3 0x9814 | ||
63 | #define AR_PHY_TIMING3_DSC_MAN 0xFFFE0000 | ||
64 | #define AR_PHY_TIMING3_DSC_MAN_S 17 | ||
65 | #define AR_PHY_TIMING3_DSC_EXP 0x0001E000 | ||
66 | #define AR_PHY_TIMING3_DSC_EXP_S 13 | ||
67 | |||
68 | #define AR_PHY_CHIP_ID 0x9818 | ||
69 | #define AR_PHY_CHIP_ID_REV_0 0x80 | ||
70 | #define AR_PHY_CHIP_ID_REV_1 0x81 | ||
71 | #define AR_PHY_CHIP_ID_9160_REV_0 0xb0 | ||
72 | |||
73 | #define AR_PHY_ACTIVE 0x981C | ||
74 | #define AR_PHY_ACTIVE_EN 0x00000001 | ||
75 | #define AR_PHY_ACTIVE_DIS 0x00000000 | ||
76 | |||
77 | #define AR_PHY_RF_CTL2 0x9824 | ||
78 | #define AR_PHY_TX_END_DATA_START 0x000000FF | ||
79 | #define AR_PHY_TX_END_DATA_START_S 0 | ||
80 | #define AR_PHY_TX_END_PA_ON 0x0000FF00 | ||
81 | #define AR_PHY_TX_END_PA_ON_S 8 | ||
82 | |||
83 | #define AR_PHY_RF_CTL3 0x9828 | ||
84 | #define AR_PHY_TX_END_TO_A2_RX_ON 0x00FF0000 | ||
85 | #define AR_PHY_TX_END_TO_A2_RX_ON_S 16 | ||
86 | |||
87 | #define AR_PHY_ADC_CTL 0x982C | ||
88 | #define AR_PHY_ADC_CTL_OFF_INBUFGAIN 0x00000003 | ||
89 | #define AR_PHY_ADC_CTL_OFF_INBUFGAIN_S 0 | ||
90 | #define AR_PHY_ADC_CTL_OFF_PWDDAC 0x00002000 | ||
91 | #define AR_PHY_ADC_CTL_OFF_PWDBANDGAP 0x00004000 | ||
92 | #define AR_PHY_ADC_CTL_OFF_PWDADC 0x00008000 | ||
93 | #define AR_PHY_ADC_CTL_ON_INBUFGAIN 0x00030000 | ||
94 | #define AR_PHY_ADC_CTL_ON_INBUFGAIN_S 16 | ||
95 | |||
96 | #define AR_PHY_ADC_SERIAL_CTL 0x9830 | ||
97 | #define AR_PHY_SEL_INTERNAL_ADDAC 0x00000000 | ||
98 | #define AR_PHY_SEL_EXTERNAL_RADIO 0x00000001 | ||
99 | |||
100 | #define AR_PHY_RF_CTL4 0x9834 | ||
101 | #define AR_PHY_RF_CTL4_TX_END_XPAB_OFF 0xFF000000 | ||
102 | #define AR_PHY_RF_CTL4_TX_END_XPAB_OFF_S 24 | ||
103 | #define AR_PHY_RF_CTL4_TX_END_XPAA_OFF 0x00FF0000 | ||
104 | #define AR_PHY_RF_CTL4_TX_END_XPAA_OFF_S 16 | ||
105 | #define AR_PHY_RF_CTL4_FRAME_XPAB_ON 0x0000FF00 | ||
106 | #define AR_PHY_RF_CTL4_FRAME_XPAB_ON_S 8 | ||
107 | #define AR_PHY_RF_CTL4_FRAME_XPAA_ON 0x000000FF | ||
108 | #define AR_PHY_RF_CTL4_FRAME_XPAA_ON_S 0 | ||
109 | |||
110 | #define AR_PHY_TSTDAC_CONST 0x983c | ||
111 | |||
112 | #define AR_PHY_SETTLING 0x9844 | ||
113 | #define AR_PHY_SETTLING_SWITCH 0x00003F80 | ||
114 | #define AR_PHY_SETTLING_SWITCH_S 7 | ||
115 | |||
116 | #define AR_PHY_RXGAIN 0x9848 | ||
117 | #define AR_PHY_RXGAIN_TXRX_ATTEN 0x0003F000 | ||
118 | #define AR_PHY_RXGAIN_TXRX_ATTEN_S 12 | ||
119 | #define AR_PHY_RXGAIN_TXRX_RF_MAX 0x007C0000 | ||
120 | #define AR_PHY_RXGAIN_TXRX_RF_MAX_S 18 | ||
121 | #define AR9280_PHY_RXGAIN_TXRX_ATTEN 0x00003F80 | ||
122 | #define AR9280_PHY_RXGAIN_TXRX_ATTEN_S 7 | ||
123 | #define AR9280_PHY_RXGAIN_TXRX_MARGIN 0x001FC000 | ||
124 | #define AR9280_PHY_RXGAIN_TXRX_MARGIN_S 14 | ||
125 | |||
126 | #define AR_PHY_DESIRED_SZ 0x9850 | ||
127 | #define AR_PHY_DESIRED_SZ_ADC 0x000000FF | ||
128 | #define AR_PHY_DESIRED_SZ_ADC_S 0 | ||
129 | #define AR_PHY_DESIRED_SZ_PGA 0x0000FF00 | ||
130 | #define AR_PHY_DESIRED_SZ_PGA_S 8 | ||
131 | #define AR_PHY_DESIRED_SZ_TOT_DES 0x0FF00000 | ||
132 | #define AR_PHY_DESIRED_SZ_TOT_DES_S 20 | ||
133 | |||
134 | #define AR_PHY_FIND_SIG 0x9858 | ||
135 | #define AR_PHY_FIND_SIG_FIRSTEP 0x0003F000 | ||
136 | #define AR_PHY_FIND_SIG_FIRSTEP_S 12 | ||
137 | #define AR_PHY_FIND_SIG_FIRPWR 0x03FC0000 | ||
138 | #define AR_PHY_FIND_SIG_FIRPWR_S 18 | ||
139 | |||
140 | #define AR_PHY_AGC_CTL1 0x985C | ||
141 | #define AR_PHY_AGC_CTL1_COARSE_LOW 0x00007F80 | ||
142 | #define AR_PHY_AGC_CTL1_COARSE_LOW_S 7 | ||
143 | #define AR_PHY_AGC_CTL1_COARSE_HIGH 0x003F8000 | ||
144 | #define AR_PHY_AGC_CTL1_COARSE_HIGH_S 15 | ||
145 | |||
146 | #define AR_PHY_AGC_CONTROL 0x9860 | ||
147 | #define AR_PHY_AGC_CONTROL_CAL 0x00000001 | ||
148 | #define AR_PHY_AGC_CONTROL_NF 0x00000002 | ||
149 | #define AR_PHY_AGC_CONTROL_ENABLE_NF 0x00008000 | ||
150 | #define AR_PHY_AGC_CONTROL_FLTR_CAL 0x00010000 | ||
151 | #define AR_PHY_AGC_CONTROL_NO_UPDATE_NF 0x00020000 | ||
152 | |||
153 | #define AR_PHY_CCA 0x9864 | ||
154 | #define AR_PHY_MINCCA_PWR 0x0FF80000 | ||
155 | #define AR_PHY_MINCCA_PWR_S 19 | ||
156 | #define AR_PHY_CCA_THRESH62 0x0007F000 | ||
157 | #define AR_PHY_CCA_THRESH62_S 12 | ||
158 | #define AR9280_PHY_MINCCA_PWR 0x1FF00000 | ||
159 | #define AR9280_PHY_MINCCA_PWR_S 20 | ||
160 | #define AR9280_PHY_CCA_THRESH62 0x000FF000 | ||
161 | #define AR9280_PHY_CCA_THRESH62_S 12 | ||
162 | |||
163 | #define AR_PHY_SFCORR_LOW 0x986C | ||
164 | #define AR_PHY_SFCORR_LOW_USE_SELF_CORR_LOW 0x00000001 | ||
165 | #define AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW 0x00003F00 | ||
166 | #define AR_PHY_SFCORR_LOW_M2COUNT_THR_LOW_S 8 | ||
167 | #define AR_PHY_SFCORR_LOW_M1_THRESH_LOW 0x001FC000 | ||
168 | #define AR_PHY_SFCORR_LOW_M1_THRESH_LOW_S 14 | ||
169 | #define AR_PHY_SFCORR_LOW_M2_THRESH_LOW 0x0FE00000 | ||
170 | #define AR_PHY_SFCORR_LOW_M2_THRESH_LOW_S 21 | ||
171 | |||
172 | #define AR_PHY_SFCORR 0x9868 | ||
173 | #define AR_PHY_SFCORR_M2COUNT_THR 0x0000001F | ||
174 | #define AR_PHY_SFCORR_M2COUNT_THR_S 0 | ||
175 | #define AR_PHY_SFCORR_M1_THRESH 0x00FE0000 | ||
176 | #define AR_PHY_SFCORR_M1_THRESH_S 17 | ||
177 | #define AR_PHY_SFCORR_M2_THRESH 0x7F000000 | ||
178 | #define AR_PHY_SFCORR_M2_THRESH_S 24 | ||
179 | |||
180 | #define AR_PHY_SLEEP_CTR_CONTROL 0x9870 | ||
181 | #define AR_PHY_SLEEP_CTR_LIMIT 0x9874 | ||
182 | #define AR_PHY_SYNTH_CONTROL 0x9874 | ||
183 | #define AR_PHY_SLEEP_SCAL 0x9878 | ||
184 | |||
185 | #define AR_PHY_PLL_CTL 0x987c | ||
186 | #define AR_PHY_PLL_CTL_40 0xaa | ||
187 | #define AR_PHY_PLL_CTL_40_5413 0x04 | ||
188 | #define AR_PHY_PLL_CTL_44 0xab | ||
189 | #define AR_PHY_PLL_CTL_44_2133 0xeb | ||
190 | #define AR_PHY_PLL_CTL_40_2133 0xea | ||
191 | |||
192 | #define AR_PHY_SPECTRAL_SCAN 0x9910 /* AR9280 spectral scan configuration register */ | ||
193 | #define AR_PHY_SPECTRAL_SCAN_ENABLE 0x1 | ||
194 | #define AR_PHY_SPECTRAL_SCAN_ENA 0x00000001 /* Enable spectral scan, reg 68, bit 0 */ | ||
195 | #define AR_PHY_SPECTRAL_SCAN_ENA_S 0 /* Enable spectral scan, reg 68, bit 0 */ | ||
196 | #define AR_PHY_SPECTRAL_SCAN_ACTIVE 0x00000002 /* Activate spectral scan reg 68, bit 1*/ | ||
197 | #define AR_PHY_SPECTRAL_SCAN_ACTIVE_S 1 /* Activate spectral scan reg 68, bit 1*/ | ||
198 | #define AR_PHY_SPECTRAL_SCAN_FFT_PERIOD 0x000000F0 /* Interval for FFT reports, reg 68, bits 4-7*/ | ||
199 | #define AR_PHY_SPECTRAL_SCAN_FFT_PERIOD_S 4 | ||
200 | #define AR_PHY_SPECTRAL_SCAN_PERIOD 0x0000FF00 /* Interval for FFT reports, reg 68, bits 8-15*/ | ||
201 | #define AR_PHY_SPECTRAL_SCAN_PERIOD_S 8 | ||
202 | #define AR_PHY_SPECTRAL_SCAN_COUNT 0x00FF0000 /* Number of reports, reg 68, bits 16-23*/ | ||
203 | #define AR_PHY_SPECTRAL_SCAN_COUNT_S 16 | ||
204 | #define AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT 0x01000000 /* Short repeat, reg 68, bit 24*/ | ||
205 | #define AR_PHY_SPECTRAL_SCAN_SHORT_REPEAT_S 24 /* Short repeat, reg 68, bit 24*/ | ||
206 | |||
207 | #define AR_PHY_RX_DELAY 0x9914 | ||
208 | #define AR_PHY_SEARCH_START_DELAY 0x9918 | ||
209 | #define AR_PHY_RX_DELAY_DELAY 0x00003FFF | ||
210 | |||
211 | #define AR_PHY_TIMING_CTRL4(_i) (0x9920 + ((_i) << 12)) | ||
212 | #define AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF 0x01F | ||
213 | #define AR_PHY_TIMING_CTRL4_IQCORR_Q_Q_COFF_S 0 | ||
214 | #define AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF 0x7E0 | ||
215 | #define AR_PHY_TIMING_CTRL4_IQCORR_Q_I_COFF_S 5 | ||
216 | #define AR_PHY_TIMING_CTRL4_IQCORR_ENABLE 0x800 | ||
217 | #define AR_PHY_TIMING_CTRL4_IQCAL_LOG_COUNT_MAX 0xF000 | ||
218 | #define AR_PHY_TIMING_CTRL4_IQCAL_LOG_COUNT_MAX_S 12 | ||
219 | #define AR_PHY_TIMING_CTRL4_DO_CAL 0x10000 | ||
220 | |||
221 | #define AR_PHY_TIMING_CTRL4_ENABLE_SPUR_RSSI 0x80000000 | ||
222 | #define AR_PHY_TIMING_CTRL4_ENABLE_SPUR_FILTER 0x40000000 | ||
223 | #define AR_PHY_TIMING_CTRL4_ENABLE_CHAN_MASK 0x20000000 | ||
224 | #define AR_PHY_TIMING_CTRL4_ENABLE_PILOT_MASK 0x10000000 | ||
225 | |||
226 | #define AR_PHY_TIMING5 0x9924 | ||
227 | #define AR_PHY_TIMING5_CYCPWR_THR1 0x000000FE | ||
228 | #define AR_PHY_TIMING5_CYCPWR_THR1_S 1 | ||
229 | |||
230 | #define AR_PHY_POWER_TX_RATE1 0x9934 | ||
231 | #define AR_PHY_POWER_TX_RATE2 0x9938 | ||
232 | #define AR_PHY_POWER_TX_RATE_MAX 0x993c | ||
233 | #define AR_PHY_POWER_TX_RATE_MAX_TPC_ENABLE 0x00000040 | ||
234 | |||
235 | #define AR_PHY_FRAME_CTL 0x9944 | ||
236 | #define AR_PHY_FRAME_CTL_TX_CLIP 0x00000038 | ||
237 | #define AR_PHY_FRAME_CTL_TX_CLIP_S 3 | ||
238 | |||
239 | #define AR_PHY_TXPWRADJ 0x994C | ||
240 | #define AR_PHY_TXPWRADJ_CCK_GAIN_DELTA 0x00000FC0 | ||
241 | #define AR_PHY_TXPWRADJ_CCK_GAIN_DELTA_S 6 | ||
242 | #define AR_PHY_TXPWRADJ_CCK_PCDAC_INDEX 0x00FC0000 | ||
243 | #define AR_PHY_TXPWRADJ_CCK_PCDAC_INDEX_S 18 | ||
244 | |||
245 | #define AR_PHY_RADAR_EXT 0x9940 | ||
246 | #define AR_PHY_RADAR_EXT_ENA 0x00004000 | ||
247 | |||
248 | #define AR_PHY_RADAR_0 0x9954 | ||
249 | #define AR_PHY_RADAR_0_ENA 0x00000001 | ||
250 | #define AR_PHY_RADAR_0_FFT_ENA 0x80000000 | ||
251 | #define AR_PHY_RADAR_0_INBAND 0x0000003e | ||
252 | #define AR_PHY_RADAR_0_INBAND_S 1 | ||
253 | #define AR_PHY_RADAR_0_PRSSI 0x00000FC0 | ||
254 | #define AR_PHY_RADAR_0_PRSSI_S 6 | ||
255 | #define AR_PHY_RADAR_0_HEIGHT 0x0003F000 | ||
256 | #define AR_PHY_RADAR_0_HEIGHT_S 12 | ||
257 | #define AR_PHY_RADAR_0_RRSSI 0x00FC0000 | ||
258 | #define AR_PHY_RADAR_0_RRSSI_S 18 | ||
259 | #define AR_PHY_RADAR_0_FIRPWR 0x7F000000 | ||
260 | #define AR_PHY_RADAR_0_FIRPWR_S 24 | ||
261 | |||
262 | #define AR_PHY_RADAR_1 0x9958 | ||
263 | #define AR_PHY_RADAR_1_RELPWR_ENA 0x00800000 | ||
264 | #define AR_PHY_RADAR_1_USE_FIR128 0x00400000 | ||
265 | #define AR_PHY_RADAR_1_RELPWR_THRESH 0x003F0000 | ||
266 | #define AR_PHY_RADAR_1_RELPWR_THRESH_S 16 | ||
267 | #define AR_PHY_RADAR_1_BLOCK_CHECK 0x00008000 | ||
268 | #define AR_PHY_RADAR_1_MAX_RRSSI 0x00004000 | ||
269 | #define AR_PHY_RADAR_1_RELSTEP_CHECK 0x00002000 | ||
270 | #define AR_PHY_RADAR_1_RELSTEP_THRESH 0x00001F00 | ||
271 | #define AR_PHY_RADAR_1_RELSTEP_THRESH_S 8 | ||
272 | #define AR_PHY_RADAR_1_MAXLEN 0x000000FF | ||
273 | #define AR_PHY_RADAR_1_MAXLEN_S 0 | ||
274 | |||
275 | #define AR_PHY_SWITCH_CHAIN_0 0x9960 | ||
276 | #define AR_PHY_SWITCH_COM 0x9964 | ||
277 | |||
278 | #define AR_PHY_SIGMA_DELTA 0x996C | ||
279 | #define AR_PHY_SIGMA_DELTA_ADC_SEL 0x00000003 | ||
280 | #define AR_PHY_SIGMA_DELTA_ADC_SEL_S 0 | ||
281 | #define AR_PHY_SIGMA_DELTA_FILT2 0x000000F8 | ||
282 | #define AR_PHY_SIGMA_DELTA_FILT2_S 3 | ||
283 | #define AR_PHY_SIGMA_DELTA_FILT1 0x00001F00 | ||
284 | #define AR_PHY_SIGMA_DELTA_FILT1_S 8 | ||
285 | #define AR_PHY_SIGMA_DELTA_ADC_CLIP 0x01FFE000 | ||
286 | #define AR_PHY_SIGMA_DELTA_ADC_CLIP_S 13 | ||
287 | |||
288 | #define AR_PHY_RESTART 0x9970 | ||
289 | #define AR_PHY_RESTART_DIV_GC 0x001C0000 | ||
290 | #define AR_PHY_RESTART_DIV_GC_S 18 | ||
291 | |||
292 | #define AR_PHY_RFBUS_REQ 0x997C | ||
293 | #define AR_PHY_RFBUS_REQ_EN 0x00000001 | ||
294 | |||
295 | #define AR_PHY_TIMING7 0x9980 | ||
296 | #define AR_PHY_TIMING8 0x9984 | ||
297 | #define AR_PHY_TIMING8_PILOT_MASK_2 0x000FFFFF | ||
298 | #define AR_PHY_TIMING8_PILOT_MASK_2_S 0 | ||
299 | |||
300 | #define AR_PHY_BIN_MASK2_1 0x9988 | ||
301 | #define AR_PHY_BIN_MASK2_2 0x998c | ||
302 | #define AR_PHY_BIN_MASK2_3 0x9990 | ||
303 | #define AR_PHY_BIN_MASK2_4 0x9994 | ||
304 | |||
305 | #define AR_PHY_BIN_MASK_1 0x9900 | ||
306 | #define AR_PHY_BIN_MASK_2 0x9904 | ||
307 | #define AR_PHY_BIN_MASK_3 0x9908 | ||
308 | |||
309 | #define AR_PHY_MASK_CTL 0x990c | ||
310 | |||
311 | #define AR_PHY_BIN_MASK2_4_MASK_4 0x00003FFF | ||
312 | #define AR_PHY_BIN_MASK2_4_MASK_4_S 0 | ||
313 | |||
314 | #define AR_PHY_TIMING9 0x9998 | ||
315 | #define AR_PHY_TIMING10 0x999c | ||
316 | #define AR_PHY_TIMING10_PILOT_MASK_2 0x000FFFFF | ||
317 | #define AR_PHY_TIMING10_PILOT_MASK_2_S 0 | ||
318 | |||
319 | #define AR_PHY_TIMING11 0x99a0 | ||
320 | #define AR_PHY_TIMING11_SPUR_DELTA_PHASE 0x000FFFFF | ||
321 | #define AR_PHY_TIMING11_SPUR_DELTA_PHASE_S 0 | ||
322 | #define AR_PHY_TIMING11_SPUR_FREQ_SD 0x3FF00000 | ||
323 | #define AR_PHY_TIMING11_SPUR_FREQ_SD_S 20 | ||
324 | #define AR_PHY_TIMING11_USE_SPUR_IN_AGC 0x40000000 | ||
325 | #define AR_PHY_TIMING11_USE_SPUR_IN_SELFCOR 0x80000000 | ||
326 | |||
327 | #define AR_PHY_RX_CHAINMASK 0x99a4 | ||
328 | #define AR_PHY_NEW_ADC_DC_GAIN_CORR(_i) (0x99b4 + ((_i) << 12)) | ||
329 | #define AR_PHY_NEW_ADC_GAIN_CORR_ENABLE 0x40000000 | ||
330 | #define AR_PHY_NEW_ADC_DC_OFFSET_CORR_ENABLE 0x80000000 | ||
331 | |||
332 | #define AR_PHY_MULTICHAIN_GAIN_CTL 0x99ac | ||
333 | #define AR_PHY_9285_ANT_DIV_CTL_ALL 0x7f000000 | ||
334 | #define AR_PHY_9285_ANT_DIV_CTL 0x01000000 | ||
335 | #define AR_PHY_9285_ANT_DIV_CTL_S 24 | ||
336 | #define AR_PHY_9285_ANT_DIV_ALT_LNACONF 0x06000000 | ||
337 | #define AR_PHY_9285_ANT_DIV_ALT_LNACONF_S 25 | ||
338 | #define AR_PHY_9285_ANT_DIV_MAIN_LNACONF 0x18000000 | ||
339 | #define AR_PHY_9285_ANT_DIV_MAIN_LNACONF_S 27 | ||
340 | #define AR_PHY_9285_ANT_DIV_ALT_GAINTB 0x20000000 | ||
341 | #define AR_PHY_9285_ANT_DIV_ALT_GAINTB_S 29 | ||
342 | #define AR_PHY_9285_ANT_DIV_MAIN_GAINTB 0x40000000 | ||
343 | #define AR_PHY_9285_ANT_DIV_MAIN_GAINTB_S 30 | ||
344 | #define AR_PHY_9285_ANT_DIV_LNA1 2 | ||
345 | #define AR_PHY_9285_ANT_DIV_LNA2 1 | ||
346 | #define AR_PHY_9285_ANT_DIV_LNA1_PLUS_LNA2 3 | ||
347 | #define AR_PHY_9285_ANT_DIV_LNA1_MINUS_LNA2 0 | ||
348 | #define AR_PHY_9285_ANT_DIV_GAINTB_0 0 | ||
349 | #define AR_PHY_9285_ANT_DIV_GAINTB_1 1 | ||
350 | |||
351 | #define AR_PHY_EXT_CCA0 0x99b8 | ||
352 | #define AR_PHY_EXT_CCA0_THRESH62 0x000000FF | ||
353 | #define AR_PHY_EXT_CCA0_THRESH62_S 0 | ||
354 | |||
355 | #define AR_PHY_EXT_CCA 0x99bc | ||
356 | #define AR_PHY_EXT_CCA_CYCPWR_THR1 0x0000FE00 | ||
357 | #define AR_PHY_EXT_CCA_CYCPWR_THR1_S 9 | ||
358 | #define AR_PHY_EXT_CCA_THRESH62 0x007F0000 | ||
359 | #define AR_PHY_EXT_CCA_THRESH62_S 16 | ||
360 | #define AR_PHY_EXT_MINCCA_PWR 0xFF800000 | ||
361 | #define AR_PHY_EXT_MINCCA_PWR_S 23 | ||
362 | #define AR9280_PHY_EXT_MINCCA_PWR 0x01FF0000 | ||
363 | #define AR9280_PHY_EXT_MINCCA_PWR_S 16 | ||
364 | |||
365 | #define AR_PHY_SFCORR_EXT 0x99c0 | ||
366 | #define AR_PHY_SFCORR_EXT_M1_THRESH 0x0000007F | ||
367 | #define AR_PHY_SFCORR_EXT_M1_THRESH_S 0 | ||
368 | #define AR_PHY_SFCORR_EXT_M2_THRESH 0x00003F80 | ||
369 | #define AR_PHY_SFCORR_EXT_M2_THRESH_S 7 | ||
370 | #define AR_PHY_SFCORR_EXT_M1_THRESH_LOW 0x001FC000 | ||
371 | #define AR_PHY_SFCORR_EXT_M1_THRESH_LOW_S 14 | ||
372 | #define AR_PHY_SFCORR_EXT_M2_THRESH_LOW 0x0FE00000 | ||
373 | #define AR_PHY_SFCORR_EXT_M2_THRESH_LOW_S 21 | ||
374 | #define AR_PHY_SFCORR_SPUR_SUBCHNL_SD_S 28 | ||
375 | |||
376 | #define AR_PHY_HALFGI 0x99D0 | ||
377 | #define AR_PHY_HALFGI_DSC_MAN 0x0007FFF0 | ||
378 | #define AR_PHY_HALFGI_DSC_MAN_S 4 | ||
379 | #define AR_PHY_HALFGI_DSC_EXP 0x0000000F | ||
380 | #define AR_PHY_HALFGI_DSC_EXP_S 0 | ||
381 | |||
382 | #define AR_PHY_CHAN_INFO_MEMORY 0x99DC | ||
383 | #define AR_PHY_CHAN_INFO_MEMORY_CAPTURE_MASK 0x0001 | ||
384 | |||
385 | #define AR_PHY_HEAVY_CLIP_ENABLE 0x99E0 | ||
386 | |||
387 | #define AR_PHY_HEAVY_CLIP_FACTOR_RIFS 0x99EC | ||
388 | #define AR_PHY_RIFS_INIT_DELAY 0x03ff0000 | ||
389 | |||
390 | #define AR_PHY_M_SLEEP 0x99f0 | ||
391 | #define AR_PHY_REFCLKDLY 0x99f4 | ||
392 | #define AR_PHY_REFCLKPD 0x99f8 | ||
393 | |||
394 | #define AR_PHY_CALMODE 0x99f0 | ||
395 | |||
396 | #define AR_PHY_CALMODE_IQ 0x00000000 | ||
397 | #define AR_PHY_CALMODE_ADC_GAIN 0x00000001 | ||
398 | #define AR_PHY_CALMODE_ADC_DC_PER 0x00000002 | ||
399 | #define AR_PHY_CALMODE_ADC_DC_INIT 0x00000003 | ||
400 | |||
401 | #define AR_PHY_CAL_MEAS_0(_i) (0x9c10 + ((_i) << 12)) | ||
402 | #define AR_PHY_CAL_MEAS_1(_i) (0x9c14 + ((_i) << 12)) | ||
403 | #define AR_PHY_CAL_MEAS_2(_i) (0x9c18 + ((_i) << 12)) | ||
404 | #define AR_PHY_CAL_MEAS_3(_i) (0x9c1c + ((_i) << 12)) | ||
405 | |||
406 | #define AR_PHY_CURRENT_RSSI 0x9c1c | ||
407 | #define AR9280_PHY_CURRENT_RSSI 0x9c3c | ||
408 | |||
409 | #define AR_PHY_RFBUS_GRANT 0x9C20 | ||
410 | #define AR_PHY_RFBUS_GRANT_EN 0x00000001 | ||
411 | |||
412 | #define AR_PHY_CHAN_INFO_GAIN_DIFF 0x9CF4 | ||
413 | #define AR_PHY_CHAN_INFO_GAIN_DIFF_UPPER_LIMIT 320 | ||
414 | |||
415 | #define AR_PHY_CHAN_INFO_GAIN 0x9CFC | ||
416 | |||
417 | #define AR_PHY_MODE 0xA200 | ||
418 | #define AR_PHY_MODE_ASYNCFIFO 0x80 | ||
419 | #define AR_PHY_MODE_AR2133 0x08 | ||
420 | #define AR_PHY_MODE_AR5111 0x00 | ||
421 | #define AR_PHY_MODE_AR5112 0x08 | ||
422 | #define AR_PHY_MODE_DYNAMIC 0x04 | ||
423 | #define AR_PHY_MODE_RF2GHZ 0x02 | ||
424 | #define AR_PHY_MODE_RF5GHZ 0x00 | ||
425 | #define AR_PHY_MODE_CCK 0x01 | ||
426 | #define AR_PHY_MODE_OFDM 0x00 | ||
427 | #define AR_PHY_MODE_DYN_CCK_DISABLE 0x100 | ||
428 | |||
429 | #define AR_PHY_CCK_TX_CTRL 0xA204 | ||
430 | #define AR_PHY_CCK_TX_CTRL_JAPAN 0x00000010 | ||
431 | #define AR_PHY_CCK_TX_CTRL_TX_DAC_SCALE_CCK 0x0000000C | ||
432 | #define AR_PHY_CCK_TX_CTRL_TX_DAC_SCALE_CCK_S 2 | ||
433 | |||
434 | #define AR_PHY_CCK_DETECT 0xA208 | ||
435 | #define AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK 0x0000003F | ||
436 | #define AR_PHY_CCK_DETECT_WEAK_SIG_THR_CCK_S 0 | ||
437 | /* [12:6] settling time for antenna switch */ | ||
438 | #define AR_PHY_CCK_DETECT_ANT_SWITCH_TIME 0x00001FC0 | ||
439 | #define AR_PHY_CCK_DETECT_ANT_SWITCH_TIME_S 6 | ||
440 | #define AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV 0x2000 | ||
441 | #define AR_PHY_CCK_DETECT_BB_ENABLE_ANT_FAST_DIV_S 13 | ||
442 | |||
443 | #define AR_PHY_GAIN_2GHZ 0xA20C | ||
444 | #define AR_PHY_GAIN_2GHZ_RXTX_MARGIN 0x00FC0000 | ||
445 | #define AR_PHY_GAIN_2GHZ_RXTX_MARGIN_S 18 | ||
446 | #define AR_PHY_GAIN_2GHZ_BSW_MARGIN 0x00003C00 | ||
447 | #define AR_PHY_GAIN_2GHZ_BSW_MARGIN_S 10 | ||
448 | #define AR_PHY_GAIN_2GHZ_BSW_ATTEN 0x0000001F | ||
449 | #define AR_PHY_GAIN_2GHZ_BSW_ATTEN_S 0 | ||
450 | |||
451 | #define AR_PHY_GAIN_2GHZ_XATTEN2_MARGIN 0x003E0000 | ||
452 | #define AR_PHY_GAIN_2GHZ_XATTEN2_MARGIN_S 17 | ||
453 | #define AR_PHY_GAIN_2GHZ_XATTEN1_MARGIN 0x0001F000 | ||
454 | #define AR_PHY_GAIN_2GHZ_XATTEN1_MARGIN_S 12 | ||
455 | #define AR_PHY_GAIN_2GHZ_XATTEN2_DB 0x00000FC0 | ||
456 | #define AR_PHY_GAIN_2GHZ_XATTEN2_DB_S 6 | ||
457 | #define AR_PHY_GAIN_2GHZ_XATTEN1_DB 0x0000003F | ||
458 | #define AR_PHY_GAIN_2GHZ_XATTEN1_DB_S 0 | ||
459 | |||
460 | #define AR_PHY_CCK_RXCTRL4 0xA21C | ||
461 | #define AR_PHY_CCK_RXCTRL4_FREQ_EST_SHORT 0x01F80000 | ||
462 | #define AR_PHY_CCK_RXCTRL4_FREQ_EST_SHORT_S 19 | ||
463 | |||
464 | #define AR_PHY_DAG_CTRLCCK 0xA228 | ||
465 | #define AR_PHY_DAG_CTRLCCK_EN_RSSI_THR 0x00000200 | ||
466 | #define AR_PHY_DAG_CTRLCCK_RSSI_THR 0x0001FC00 | ||
467 | #define AR_PHY_DAG_CTRLCCK_RSSI_THR_S 10 | ||
468 | |||
469 | #define AR_PHY_FORCE_CLKEN_CCK 0xA22C | ||
470 | #define AR_PHY_FORCE_CLKEN_CCK_MRC_MUX 0x00000040 | ||
471 | |||
472 | #define AR_PHY_POWER_TX_RATE3 0xA234 | ||
473 | #define AR_PHY_POWER_TX_RATE4 0xA238 | ||
474 | |||
475 | #define AR_PHY_SCRM_SEQ_XR 0xA23C | ||
476 | #define AR_PHY_HEADER_DETECT_XR 0xA240 | ||
477 | #define AR_PHY_CHIRP_DETECTED_XR 0xA244 | ||
478 | #define AR_PHY_BLUETOOTH 0xA254 | ||
479 | |||
480 | #define AR_PHY_TPCRG1 0xA258 | ||
481 | #define AR_PHY_TPCRG1_NUM_PD_GAIN 0x0000c000 | ||
482 | #define AR_PHY_TPCRG1_NUM_PD_GAIN_S 14 | ||
483 | |||
484 | #define AR_PHY_TPCRG1_PD_GAIN_1 0x00030000 | ||
485 | #define AR_PHY_TPCRG1_PD_GAIN_1_S 16 | ||
486 | #define AR_PHY_TPCRG1_PD_GAIN_2 0x000C0000 | ||
487 | #define AR_PHY_TPCRG1_PD_GAIN_2_S 18 | ||
488 | #define AR_PHY_TPCRG1_PD_GAIN_3 0x00300000 | ||
489 | #define AR_PHY_TPCRG1_PD_GAIN_3_S 20 | ||
490 | |||
491 | #define AR_PHY_TPCRG1_PD_CAL_ENABLE 0x00400000 | ||
492 | #define AR_PHY_TPCRG1_PD_CAL_ENABLE_S 22 | ||
493 | |||
494 | #define AR_PHY_TX_PWRCTRL4 0xa264 | ||
495 | #define AR_PHY_TX_PWRCTRL_PD_AVG_VALID 0x00000001 | ||
496 | #define AR_PHY_TX_PWRCTRL_PD_AVG_VALID_S 0 | ||
497 | #define AR_PHY_TX_PWRCTRL_PD_AVG_OUT 0x000001FE | ||
498 | #define AR_PHY_TX_PWRCTRL_PD_AVG_OUT_S 1 | ||
499 | |||
500 | #define AR_PHY_TX_PWRCTRL6_0 0xa270 | ||
501 | #define AR_PHY_TX_PWRCTRL6_1 0xb270 | ||
502 | #define AR_PHY_TX_PWRCTRL_ERR_EST_MODE 0x03000000 | ||
503 | #define AR_PHY_TX_PWRCTRL_ERR_EST_MODE_S 24 | ||
504 | |||
505 | #define AR_PHY_TX_PWRCTRL7 0xa274 | ||
506 | #define AR_PHY_TX_PWRCTRL_TX_GAIN_TAB_MAX 0x0007E000 | 27 | #define AR_PHY_TX_PWRCTRL_TX_GAIN_TAB_MAX 0x0007E000 |
507 | #define AR_PHY_TX_PWRCTRL_TX_GAIN_TAB_MAX_S 13 | 28 | #define AR_PHY_TX_PWRCTRL_TX_GAIN_TAB_MAX_S 13 |
508 | #define AR_PHY_TX_PWRCTRL_INIT_TX_GAIN 0x01F80000 | ||
509 | #define AR_PHY_TX_PWRCTRL_INIT_TX_GAIN_S 19 | ||
510 | |||
511 | #define AR_PHY_TX_PWRCTRL9 0xa27C | ||
512 | #define AR_PHY_TX_DESIRED_SCALE_CCK 0x00007C00 | ||
513 | #define AR_PHY_TX_DESIRED_SCALE_CCK_S 10 | ||
514 | #define AR_PHY_TX_PWRCTRL9_RES_DC_REMOVAL 0x80000000 | ||
515 | #define AR_PHY_TX_PWRCTRL9_RES_DC_REMOVAL_S 31 | ||
516 | |||
517 | #define AR_PHY_TX_GAIN_TBL1 0xa300 | ||
518 | #define AR_PHY_TX_GAIN_CLC 0x0000001E | 29 | #define AR_PHY_TX_GAIN_CLC 0x0000001E |
519 | #define AR_PHY_TX_GAIN_CLC_S 1 | 30 | #define AR_PHY_TX_GAIN_CLC_S 1 |
520 | #define AR_PHY_TX_GAIN 0x0007F000 | 31 | #define AR_PHY_TX_GAIN 0x0007F000 |
@@ -526,91 +37,6 @@ bool ath9k_hw_set_rf_regs(struct ath_hw *ah, | |||
526 | #define AR_PHY_CLC_Q0 0x0000ffd0 | 37 | #define AR_PHY_CLC_Q0 0x0000ffd0 |
527 | #define AR_PHY_CLC_Q0_S 5 | 38 | #define AR_PHY_CLC_Q0_S 5 |
528 | 39 | ||
529 | #define AR_PHY_CH0_TX_PWRCTRL11 0xa398 | ||
530 | #define AR_PHY_CH1_TX_PWRCTRL11 0xb398 | ||
531 | #define AR_PHY_TX_PWRCTRL_OLPC_TEMP_COMP 0x0000FC00 | ||
532 | #define AR_PHY_TX_PWRCTRL_OLPC_TEMP_COMP_S 10 | ||
533 | |||
534 | #define AR_PHY_VIT_MASK2_M_46_61 0xa3a0 | ||
535 | #define AR_PHY_MASK2_M_31_45 0xa3a4 | ||
536 | #define AR_PHY_MASK2_M_16_30 0xa3a8 | ||
537 | #define AR_PHY_MASK2_M_00_15 0xa3ac | ||
538 | #define AR_PHY_MASK2_P_15_01 0xa3b8 | ||
539 | #define AR_PHY_MASK2_P_30_16 0xa3bc | ||
540 | #define AR_PHY_MASK2_P_45_31 0xa3c0 | ||
541 | #define AR_PHY_MASK2_P_61_45 0xa3c4 | ||
542 | #define AR_PHY_SPUR_REG 0x994c | ||
543 | |||
544 | #define AR_PHY_SPUR_REG_MASK_RATE_CNTL (0xFF << 18) | ||
545 | #define AR_PHY_SPUR_REG_MASK_RATE_CNTL_S 18 | ||
546 | |||
547 | #define AR_PHY_SPUR_REG_ENABLE_MASK_PPM 0x20000 | ||
548 | #define AR_PHY_SPUR_REG_MASK_RATE_SELECT (0xFF << 9) | ||
549 | #define AR_PHY_SPUR_REG_MASK_RATE_SELECT_S 9 | ||
550 | #define AR_PHY_SPUR_REG_ENABLE_VIT_SPUR_RSSI 0x100 | ||
551 | #define AR_PHY_SPUR_REG_SPUR_RSSI_THRESH 0x7F | ||
552 | #define AR_PHY_SPUR_REG_SPUR_RSSI_THRESH_S 0 | ||
553 | |||
554 | #define AR_PHY_PILOT_MASK_01_30 0xa3b0 | ||
555 | #define AR_PHY_PILOT_MASK_31_60 0xa3b4 | ||
556 | |||
557 | #define AR_PHY_CHANNEL_MASK_01_30 0x99d4 | ||
558 | #define AR_PHY_CHANNEL_MASK_31_60 0x99d8 | ||
559 | |||
560 | #define AR_PHY_ANALOG_SWAP 0xa268 | ||
561 | #define AR_PHY_SWAP_ALT_CHAIN 0x00000040 | ||
562 | |||
563 | #define AR_PHY_TPCRG5 0xA26C | ||
564 | #define AR_PHY_TPCRG5_PD_GAIN_OVERLAP 0x0000000F | ||
565 | #define AR_PHY_TPCRG5_PD_GAIN_OVERLAP_S 0 | ||
566 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_1 0x000003F0 | ||
567 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_1_S 4 | ||
568 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_2 0x0000FC00 | ||
569 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_2_S 10 | ||
570 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_3 0x003F0000 | ||
571 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_3_S 16 | ||
572 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_4 0x0FC00000 | ||
573 | #define AR_PHY_TPCRG5_PD_GAIN_BOUNDARY_4_S 22 | ||
574 | |||
575 | /* Carrier leak calibration control, do it after AGC calibration */ | ||
576 | #define AR_PHY_CL_CAL_CTL 0xA358 | ||
577 | #define AR_PHY_CL_CAL_ENABLE 0x00000002 | ||
578 | #define AR_PHY_PARALLEL_CAL_ENABLE 0x00000001 | ||
579 | |||
580 | #define AR_PHY_POWER_TX_RATE5 0xA38C | ||
581 | #define AR_PHY_POWER_TX_RATE6 0xA390 | ||
582 | |||
583 | #define AR_PHY_CAL_CHAINMASK 0xA39C | ||
584 | |||
585 | #define AR_PHY_POWER_TX_SUB 0xA3C8 | ||
586 | #define AR_PHY_POWER_TX_RATE7 0xA3CC | ||
587 | #define AR_PHY_POWER_TX_RATE8 0xA3D0 | ||
588 | #define AR_PHY_POWER_TX_RATE9 0xA3D4 | ||
589 | |||
590 | #define AR_PHY_XPA_CFG 0xA3D8 | ||
591 | #define AR_PHY_FORCE_XPA_CFG 0x000000001 | ||
592 | #define AR_PHY_FORCE_XPA_CFG_S 0 | ||
593 | |||
594 | #define AR_PHY_CH1_CCA 0xa864 | ||
595 | #define AR_PHY_CH1_MINCCA_PWR 0x0FF80000 | ||
596 | #define AR_PHY_CH1_MINCCA_PWR_S 19 | ||
597 | #define AR9280_PHY_CH1_MINCCA_PWR 0x1FF00000 | ||
598 | #define AR9280_PHY_CH1_MINCCA_PWR_S 20 | ||
599 | |||
600 | #define AR_PHY_CH2_CCA 0xb864 | ||
601 | #define AR_PHY_CH2_MINCCA_PWR 0x0FF80000 | ||
602 | #define AR_PHY_CH2_MINCCA_PWR_S 19 | ||
603 | |||
604 | #define AR_PHY_CH1_EXT_CCA 0xa9bc | ||
605 | #define AR_PHY_CH1_EXT_MINCCA_PWR 0xFF800000 | ||
606 | #define AR_PHY_CH1_EXT_MINCCA_PWR_S 23 | ||
607 | #define AR9280_PHY_CH1_EXT_MINCCA_PWR 0x01FF0000 | ||
608 | #define AR9280_PHY_CH1_EXT_MINCCA_PWR_S 16 | ||
609 | |||
610 | #define AR_PHY_CH2_EXT_CCA 0xb9bc | ||
611 | #define AR_PHY_CH2_EXT_MINCCA_PWR 0xFF800000 | ||
612 | #define AR_PHY_CH2_EXT_MINCCA_PWR_S 23 | ||
613 | |||
614 | #define REG_WRITE_RF_ARRAY(iniarray, regData, regWr) do { \ | 40 | #define REG_WRITE_RF_ARRAY(iniarray, regData, regWr) do { \ |
615 | int r; \ | 41 | int r; \ |
616 | for (r = 0; r < ((iniarray)->ia_rows); r++) { \ | 42 | for (r = 0; r < ((iniarray)->ia_rows); r++) { \ |
@@ -625,6 +51,7 @@ bool ath9k_hw_set_rf_regs(struct ath_hw *ah, | |||
625 | #define ANTSWAP_AB 0x0001 | 51 | #define ANTSWAP_AB 0x0001 |
626 | #define REDUCE_CHAIN_0 0x00000050 | 52 | #define REDUCE_CHAIN_0 0x00000050 |
627 | #define REDUCE_CHAIN_1 0x00000051 | 53 | #define REDUCE_CHAIN_1 0x00000051 |
54 | #define AR_PHY_CHIP_ID 0x9818 | ||
628 | 55 | ||
629 | #define RF_BANK_SETUP(_bank, _iniarray, _col) do { \ | 56 | #define RF_BANK_SETUP(_bank, _iniarray, _col) do { \ |
630 | int i; \ | 57 | int i; \ |
@@ -632,4 +59,7 @@ bool ath9k_hw_set_rf_regs(struct ath_hw *ah, | |||
632 | (_bank)[i] = INI_RA((_iniarray), i, _col);; \ | 59 | (_bank)[i] = INI_RA((_iniarray), i, _col);; \ |
633 | } while (0) | 60 | } while (0) |
634 | 61 | ||
62 | #define AR_PHY_TIMING11_SPUR_FREQ_SD 0x3FF00000 | ||
63 | #define AR_PHY_TIMING11_SPUR_FREQ_SD_S 20 | ||
64 | |||
635 | #endif | 65 | #endif |
diff --git a/drivers/net/wireless/ath/ath9k/rc.c b/drivers/net/wireless/ath/ath9k/rc.c index ee81291f2fba..8519452c95f1 100644 --- a/drivers/net/wireless/ath/ath9k/rc.c +++ b/drivers/net/wireless/ath/ath9k/rc.c | |||
@@ -691,6 +691,19 @@ static void ath_get_rate(void *priv, struct ieee80211_sta *sta, void *priv_sta, | |||
691 | rate_table = sc->cur_rate_table; | 691 | rate_table = sc->cur_rate_table; |
692 | rix = ath_rc_get_highest_rix(sc, ath_rc_priv, rate_table, &is_probe); | 692 | rix = ath_rc_get_highest_rix(sc, ath_rc_priv, rate_table, &is_probe); |
693 | 693 | ||
694 | /* | ||
695 | * If we're in HT mode and both us and our peer supports LDPC. | ||
696 | * We don't need to check our own device's capabilities as our own | ||
697 | * ht capabilities would have already been intersected with our peer's. | ||
698 | */ | ||
699 | if (conf_is_ht(&sc->hw->conf) && | ||
700 | (sta->ht_cap.cap & IEEE80211_HT_CAP_LDPC_CODING)) | ||
701 | tx_info->flags |= IEEE80211_TX_CTL_LDPC; | ||
702 | |||
703 | if (conf_is_ht(&sc->hw->conf) && | ||
704 | (sta->ht_cap.cap & IEEE80211_HT_CAP_TX_STBC)) | ||
705 | tx_info->flags |= (1 << IEEE80211_TX_CTL_STBC_SHIFT); | ||
706 | |||
694 | if (is_probe) { | 707 | if (is_probe) { |
695 | /* set one try for probe rates. For the | 708 | /* set one try for probe rates. For the |
696 | * probes don't enable rts */ | 709 | * probes don't enable rts */ |
diff --git a/drivers/net/wireless/ath/ath9k/recv.c b/drivers/net/wireless/ath/ath9k/recv.c index 94560e2fe376..ac60c4ee62d3 100644 --- a/drivers/net/wireless/ath/ath9k/recv.c +++ b/drivers/net/wireless/ath/ath9k/recv.c | |||
@@ -15,6 +15,9 @@ | |||
15 | */ | 15 | */ |
16 | 16 | ||
17 | #include "ath9k.h" | 17 | #include "ath9k.h" |
18 | #include "ar9003_mac.h" | ||
19 | |||
20 | #define SKB_CB_ATHBUF(__skb) (*((struct ath_buf **)__skb->cb)) | ||
18 | 21 | ||
19 | static struct ieee80211_hw * ath_get_virt_hw(struct ath_softc *sc, | 22 | static struct ieee80211_hw * ath_get_virt_hw(struct ath_softc *sc, |
20 | struct ieee80211_hdr *hdr) | 23 | struct ieee80211_hdr *hdr) |
@@ -115,56 +118,246 @@ static void ath_opmode_init(struct ath_softc *sc) | |||
115 | ath9k_hw_setmcastfilter(ah, mfilt[0], mfilt[1]); | 118 | ath9k_hw_setmcastfilter(ah, mfilt[0], mfilt[1]); |
116 | } | 119 | } |
117 | 120 | ||
118 | int ath_rx_init(struct ath_softc *sc, int nbufs) | 121 | static bool ath_rx_edma_buf_link(struct ath_softc *sc, |
122 | enum ath9k_rx_qtype qtype) | ||
119 | { | 123 | { |
120 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); | 124 | struct ath_hw *ah = sc->sc_ah; |
125 | struct ath_rx_edma *rx_edma; | ||
121 | struct sk_buff *skb; | 126 | struct sk_buff *skb; |
122 | struct ath_buf *bf; | 127 | struct ath_buf *bf; |
123 | int error = 0; | ||
124 | 128 | ||
125 | spin_lock_init(&sc->rx.rxflushlock); | 129 | rx_edma = &sc->rx.rx_edma[qtype]; |
126 | sc->sc_flags &= ~SC_OP_RXFLUSH; | 130 | if (skb_queue_len(&rx_edma->rx_fifo) >= rx_edma->rx_fifo_hwsize) |
127 | spin_lock_init(&sc->rx.rxbuflock); | 131 | return false; |
128 | 132 | ||
129 | common->rx_bufsize = roundup(IEEE80211_MAX_MPDU_LEN, | 133 | bf = list_first_entry(&sc->rx.rxbuf, struct ath_buf, list); |
130 | min(common->cachelsz, (u16)64)); | 134 | list_del_init(&bf->list); |
131 | 135 | ||
132 | ath_print(common, ATH_DBG_CONFIG, "cachelsz %u rxbufsize %u\n", | 136 | skb = bf->bf_mpdu; |
133 | common->cachelsz, common->rx_bufsize); | 137 | |
138 | ATH_RXBUF_RESET(bf); | ||
139 | memset(skb->data, 0, ah->caps.rx_status_len); | ||
140 | dma_sync_single_for_device(sc->dev, bf->bf_buf_addr, | ||
141 | ah->caps.rx_status_len, DMA_TO_DEVICE); | ||
134 | 142 | ||
135 | /* Initialize rx descriptors */ | 143 | SKB_CB_ATHBUF(skb) = bf; |
144 | ath9k_hw_addrxbuf_edma(ah, bf->bf_buf_addr, qtype); | ||
145 | skb_queue_tail(&rx_edma->rx_fifo, skb); | ||
136 | 146 | ||
137 | error = ath_descdma_setup(sc, &sc->rx.rxdma, &sc->rx.rxbuf, | 147 | return true; |
138 | "rx", nbufs, 1); | 148 | } |
139 | if (error != 0) { | 149 | |
140 | ath_print(common, ATH_DBG_FATAL, | 150 | static void ath_rx_addbuffer_edma(struct ath_softc *sc, |
141 | "failed to allocate rx descriptors: %d\n", error); | 151 | enum ath9k_rx_qtype qtype, int size) |
142 | goto err; | 152 | { |
153 | struct ath_rx_edma *rx_edma; | ||
154 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); | ||
155 | u32 nbuf = 0; | ||
156 | |||
157 | rx_edma = &sc->rx.rx_edma[qtype]; | ||
158 | if (list_empty(&sc->rx.rxbuf)) { | ||
159 | ath_print(common, ATH_DBG_QUEUE, "No free rx buf available\n"); | ||
160 | return; | ||
143 | } | 161 | } |
144 | 162 | ||
163 | while (!list_empty(&sc->rx.rxbuf)) { | ||
164 | nbuf++; | ||
165 | |||
166 | if (!ath_rx_edma_buf_link(sc, qtype)) | ||
167 | break; | ||
168 | |||
169 | if (nbuf >= size) | ||
170 | break; | ||
171 | } | ||
172 | } | ||
173 | |||
174 | static void ath_rx_remove_buffer(struct ath_softc *sc, | ||
175 | enum ath9k_rx_qtype qtype) | ||
176 | { | ||
177 | struct ath_buf *bf; | ||
178 | struct ath_rx_edma *rx_edma; | ||
179 | struct sk_buff *skb; | ||
180 | |||
181 | rx_edma = &sc->rx.rx_edma[qtype]; | ||
182 | |||
183 | while ((skb = skb_dequeue(&rx_edma->rx_fifo)) != NULL) { | ||
184 | bf = SKB_CB_ATHBUF(skb); | ||
185 | BUG_ON(!bf); | ||
186 | list_add_tail(&bf->list, &sc->rx.rxbuf); | ||
187 | } | ||
188 | } | ||
189 | |||
190 | static void ath_rx_edma_cleanup(struct ath_softc *sc) | ||
191 | { | ||
192 | struct ath_buf *bf; | ||
193 | |||
194 | ath_rx_remove_buffer(sc, ATH9K_RX_QUEUE_LP); | ||
195 | ath_rx_remove_buffer(sc, ATH9K_RX_QUEUE_HP); | ||
196 | |||
145 | list_for_each_entry(bf, &sc->rx.rxbuf, list) { | 197 | list_for_each_entry(bf, &sc->rx.rxbuf, list) { |
198 | if (bf->bf_mpdu) | ||
199 | dev_kfree_skb_any(bf->bf_mpdu); | ||
200 | } | ||
201 | |||
202 | INIT_LIST_HEAD(&sc->rx.rxbuf); | ||
203 | |||
204 | kfree(sc->rx.rx_bufptr); | ||
205 | sc->rx.rx_bufptr = NULL; | ||
206 | } | ||
207 | |||
208 | static void ath_rx_edma_init_queue(struct ath_rx_edma *rx_edma, int size) | ||
209 | { | ||
210 | skb_queue_head_init(&rx_edma->rx_fifo); | ||
211 | skb_queue_head_init(&rx_edma->rx_buffers); | ||
212 | rx_edma->rx_fifo_hwsize = size; | ||
213 | } | ||
214 | |||
215 | static int ath_rx_edma_init(struct ath_softc *sc, int nbufs) | ||
216 | { | ||
217 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); | ||
218 | struct ath_hw *ah = sc->sc_ah; | ||
219 | struct sk_buff *skb; | ||
220 | struct ath_buf *bf; | ||
221 | int error = 0, i; | ||
222 | u32 size; | ||
223 | |||
224 | |||
225 | common->rx_bufsize = roundup(IEEE80211_MAX_MPDU_LEN + | ||
226 | ah->caps.rx_status_len, | ||
227 | min(common->cachelsz, (u16)64)); | ||
228 | |||
229 | ath9k_hw_set_rx_bufsize(ah, common->rx_bufsize - | ||
230 | ah->caps.rx_status_len); | ||
231 | |||
232 | ath_rx_edma_init_queue(&sc->rx.rx_edma[ATH9K_RX_QUEUE_LP], | ||
233 | ah->caps.rx_lp_qdepth); | ||
234 | ath_rx_edma_init_queue(&sc->rx.rx_edma[ATH9K_RX_QUEUE_HP], | ||
235 | ah->caps.rx_hp_qdepth); | ||
236 | |||
237 | size = sizeof(struct ath_buf) * nbufs; | ||
238 | bf = kzalloc(size, GFP_KERNEL); | ||
239 | if (!bf) | ||
240 | return -ENOMEM; | ||
241 | |||
242 | INIT_LIST_HEAD(&sc->rx.rxbuf); | ||
243 | sc->rx.rx_bufptr = bf; | ||
244 | |||
245 | for (i = 0; i < nbufs; i++, bf++) { | ||
146 | skb = ath_rxbuf_alloc(common, common->rx_bufsize, GFP_KERNEL); | 246 | skb = ath_rxbuf_alloc(common, common->rx_bufsize, GFP_KERNEL); |
147 | if (skb == NULL) { | 247 | if (!skb) { |
148 | error = -ENOMEM; | 248 | error = -ENOMEM; |
149 | goto err; | 249 | goto rx_init_fail; |
150 | } | 250 | } |
151 | 251 | ||
252 | memset(skb->data, 0, common->rx_bufsize); | ||
152 | bf->bf_mpdu = skb; | 253 | bf->bf_mpdu = skb; |
254 | |||
153 | bf->bf_buf_addr = dma_map_single(sc->dev, skb->data, | 255 | bf->bf_buf_addr = dma_map_single(sc->dev, skb->data, |
154 | common->rx_bufsize, | 256 | common->rx_bufsize, |
155 | DMA_FROM_DEVICE); | 257 | DMA_BIDIRECTIONAL); |
156 | if (unlikely(dma_mapping_error(sc->dev, | 258 | if (unlikely(dma_mapping_error(sc->dev, |
157 | bf->bf_buf_addr))) { | 259 | bf->bf_buf_addr))) { |
158 | dev_kfree_skb_any(skb); | 260 | dev_kfree_skb_any(skb); |
159 | bf->bf_mpdu = NULL; | 261 | bf->bf_mpdu = NULL; |
262 | ath_print(common, ATH_DBG_FATAL, | ||
263 | "dma_mapping_error() on RX init\n"); | ||
264 | error = -ENOMEM; | ||
265 | goto rx_init_fail; | ||
266 | } | ||
267 | |||
268 | list_add_tail(&bf->list, &sc->rx.rxbuf); | ||
269 | } | ||
270 | |||
271 | return 0; | ||
272 | |||
273 | rx_init_fail: | ||
274 | ath_rx_edma_cleanup(sc); | ||
275 | return error; | ||
276 | } | ||
277 | |||
278 | static void ath_edma_start_recv(struct ath_softc *sc) | ||
279 | { | ||
280 | spin_lock_bh(&sc->rx.rxbuflock); | ||
281 | |||
282 | ath9k_hw_rxena(sc->sc_ah); | ||
283 | |||
284 | ath_rx_addbuffer_edma(sc, ATH9K_RX_QUEUE_HP, | ||
285 | sc->rx.rx_edma[ATH9K_RX_QUEUE_HP].rx_fifo_hwsize); | ||
286 | |||
287 | ath_rx_addbuffer_edma(sc, ATH9K_RX_QUEUE_LP, | ||
288 | sc->rx.rx_edma[ATH9K_RX_QUEUE_LP].rx_fifo_hwsize); | ||
289 | |||
290 | spin_unlock_bh(&sc->rx.rxbuflock); | ||
291 | |||
292 | ath_opmode_init(sc); | ||
293 | |||
294 | ath9k_hw_startpcureceive(sc->sc_ah); | ||
295 | } | ||
296 | |||
297 | static void ath_edma_stop_recv(struct ath_softc *sc) | ||
298 | { | ||
299 | spin_lock_bh(&sc->rx.rxbuflock); | ||
300 | ath_rx_remove_buffer(sc, ATH9K_RX_QUEUE_HP); | ||
301 | ath_rx_remove_buffer(sc, ATH9K_RX_QUEUE_LP); | ||
302 | spin_unlock_bh(&sc->rx.rxbuflock); | ||
303 | } | ||
304 | |||
305 | int ath_rx_init(struct ath_softc *sc, int nbufs) | ||
306 | { | ||
307 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); | ||
308 | struct sk_buff *skb; | ||
309 | struct ath_buf *bf; | ||
310 | int error = 0; | ||
311 | |||
312 | spin_lock_init(&sc->rx.rxflushlock); | ||
313 | sc->sc_flags &= ~SC_OP_RXFLUSH; | ||
314 | spin_lock_init(&sc->rx.rxbuflock); | ||
315 | |||
316 | if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { | ||
317 | return ath_rx_edma_init(sc, nbufs); | ||
318 | } else { | ||
319 | common->rx_bufsize = roundup(IEEE80211_MAX_MPDU_LEN, | ||
320 | min(common->cachelsz, (u16)64)); | ||
321 | |||
322 | ath_print(common, ATH_DBG_CONFIG, "cachelsz %u rxbufsize %u\n", | ||
323 | common->cachelsz, common->rx_bufsize); | ||
324 | |||
325 | /* Initialize rx descriptors */ | ||
326 | |||
327 | error = ath_descdma_setup(sc, &sc->rx.rxdma, &sc->rx.rxbuf, | ||
328 | "rx", nbufs, 1, 0); | ||
329 | if (error != 0) { | ||
160 | ath_print(common, ATH_DBG_FATAL, | 330 | ath_print(common, ATH_DBG_FATAL, |
161 | "dma_mapping_error() on RX init\n"); | 331 | "failed to allocate rx descriptors: %d\n", |
162 | error = -ENOMEM; | 332 | error); |
163 | goto err; | 333 | goto err; |
164 | } | 334 | } |
165 | bf->bf_dmacontext = bf->bf_buf_addr; | 335 | |
336 | list_for_each_entry(bf, &sc->rx.rxbuf, list) { | ||
337 | skb = ath_rxbuf_alloc(common, common->rx_bufsize, | ||
338 | GFP_KERNEL); | ||
339 | if (skb == NULL) { | ||
340 | error = -ENOMEM; | ||
341 | goto err; | ||
342 | } | ||
343 | |||
344 | bf->bf_mpdu = skb; | ||
345 | bf->bf_buf_addr = dma_map_single(sc->dev, skb->data, | ||
346 | common->rx_bufsize, | ||
347 | DMA_FROM_DEVICE); | ||
348 | if (unlikely(dma_mapping_error(sc->dev, | ||
349 | bf->bf_buf_addr))) { | ||
350 | dev_kfree_skb_any(skb); | ||
351 | bf->bf_mpdu = NULL; | ||
352 | ath_print(common, ATH_DBG_FATAL, | ||
353 | "dma_mapping_error() on RX init\n"); | ||
354 | error = -ENOMEM; | ||
355 | goto err; | ||
356 | } | ||
357 | bf->bf_dmacontext = bf->bf_buf_addr; | ||
358 | } | ||
359 | sc->rx.rxlink = NULL; | ||
166 | } | 360 | } |
167 | sc->rx.rxlink = NULL; | ||
168 | 361 | ||
169 | err: | 362 | err: |
170 | if (error) | 363 | if (error) |
@@ -180,17 +373,23 @@ void ath_rx_cleanup(struct ath_softc *sc) | |||
180 | struct sk_buff *skb; | 373 | struct sk_buff *skb; |
181 | struct ath_buf *bf; | 374 | struct ath_buf *bf; |
182 | 375 | ||
183 | list_for_each_entry(bf, &sc->rx.rxbuf, list) { | 376 | if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { |
184 | skb = bf->bf_mpdu; | 377 | ath_rx_edma_cleanup(sc); |
185 | if (skb) { | 378 | return; |
186 | dma_unmap_single(sc->dev, bf->bf_buf_addr, | 379 | } else { |
187 | common->rx_bufsize, DMA_FROM_DEVICE); | 380 | list_for_each_entry(bf, &sc->rx.rxbuf, list) { |
188 | dev_kfree_skb(skb); | 381 | skb = bf->bf_mpdu; |
382 | if (skb) { | ||
383 | dma_unmap_single(sc->dev, bf->bf_buf_addr, | ||
384 | common->rx_bufsize, | ||
385 | DMA_FROM_DEVICE); | ||
386 | dev_kfree_skb(skb); | ||
387 | } | ||
189 | } | 388 | } |
190 | } | ||
191 | 389 | ||
192 | if (sc->rx.rxdma.dd_desc_len != 0) | 390 | if (sc->rx.rxdma.dd_desc_len != 0) |
193 | ath_descdma_cleanup(sc, &sc->rx.rxdma, &sc->rx.rxbuf); | 391 | ath_descdma_cleanup(sc, &sc->rx.rxdma, &sc->rx.rxbuf); |
392 | } | ||
194 | } | 393 | } |
195 | 394 | ||
196 | /* | 395 | /* |
@@ -273,6 +472,11 @@ int ath_startrecv(struct ath_softc *sc) | |||
273 | struct ath_hw *ah = sc->sc_ah; | 472 | struct ath_hw *ah = sc->sc_ah; |
274 | struct ath_buf *bf, *tbf; | 473 | struct ath_buf *bf, *tbf; |
275 | 474 | ||
475 | if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { | ||
476 | ath_edma_start_recv(sc); | ||
477 | return 0; | ||
478 | } | ||
479 | |||
276 | spin_lock_bh(&sc->rx.rxbuflock); | 480 | spin_lock_bh(&sc->rx.rxbuflock); |
277 | if (list_empty(&sc->rx.rxbuf)) | 481 | if (list_empty(&sc->rx.rxbuf)) |
278 | goto start_recv; | 482 | goto start_recv; |
@@ -306,7 +510,11 @@ bool ath_stoprecv(struct ath_softc *sc) | |||
306 | ath9k_hw_stoppcurecv(ah); | 510 | ath9k_hw_stoppcurecv(ah); |
307 | ath9k_hw_setrxfilter(ah, 0); | 511 | ath9k_hw_setrxfilter(ah, 0); |
308 | stopped = ath9k_hw_stopdmarecv(ah); | 512 | stopped = ath9k_hw_stopdmarecv(ah); |
309 | sc->rx.rxlink = NULL; | 513 | |
514 | if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) | ||
515 | ath_edma_stop_recv(sc); | ||
516 | else | ||
517 | sc->rx.rxlink = NULL; | ||
310 | 518 | ||
311 | return stopped; | 519 | return stopped; |
312 | } | 520 | } |
@@ -315,7 +523,9 @@ void ath_flushrecv(struct ath_softc *sc) | |||
315 | { | 523 | { |
316 | spin_lock_bh(&sc->rx.rxflushlock); | 524 | spin_lock_bh(&sc->rx.rxflushlock); |
317 | sc->sc_flags |= SC_OP_RXFLUSH; | 525 | sc->sc_flags |= SC_OP_RXFLUSH; |
318 | ath_rx_tasklet(sc, 1); | 526 | if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) |
527 | ath_rx_tasklet(sc, 1, true); | ||
528 | ath_rx_tasklet(sc, 1, false); | ||
319 | sc->sc_flags &= ~SC_OP_RXFLUSH; | 529 | sc->sc_flags &= ~SC_OP_RXFLUSH; |
320 | spin_unlock_bh(&sc->rx.rxflushlock); | 530 | spin_unlock_bh(&sc->rx.rxflushlock); |
321 | } | 531 | } |
@@ -469,14 +679,147 @@ static void ath_rx_send_to_mac80211(struct ieee80211_hw *hw, | |||
469 | ieee80211_rx(hw, skb); | 679 | ieee80211_rx(hw, skb); |
470 | } | 680 | } |
471 | 681 | ||
472 | int ath_rx_tasklet(struct ath_softc *sc, int flush) | 682 | static bool ath_edma_get_buffers(struct ath_softc *sc, |
683 | enum ath9k_rx_qtype qtype) | ||
473 | { | 684 | { |
474 | #define PA2DESC(_sc, _pa) \ | 685 | struct ath_rx_edma *rx_edma = &sc->rx.rx_edma[qtype]; |
475 | ((struct ath_desc *)((caddr_t)(_sc)->rx.rxdma.dd_desc + \ | 686 | struct ath_hw *ah = sc->sc_ah; |
476 | ((_pa) - (_sc)->rx.rxdma.dd_desc_paddr))) | 687 | struct ath_common *common = ath9k_hw_common(ah); |
688 | struct sk_buff *skb; | ||
689 | struct ath_buf *bf; | ||
690 | int ret; | ||
691 | |||
692 | skb = skb_peek(&rx_edma->rx_fifo); | ||
693 | if (!skb) | ||
694 | return false; | ||
695 | |||
696 | bf = SKB_CB_ATHBUF(skb); | ||
697 | BUG_ON(!bf); | ||
698 | |||
699 | dma_sync_single_for_device(sc->dev, bf->bf_buf_addr, | ||
700 | common->rx_bufsize, DMA_FROM_DEVICE); | ||
701 | |||
702 | ret = ath9k_hw_process_rxdesc_edma(ah, NULL, skb->data); | ||
703 | if (ret == -EINPROGRESS) | ||
704 | return false; | ||
705 | |||
706 | __skb_unlink(skb, &rx_edma->rx_fifo); | ||
707 | if (ret == -EINVAL) { | ||
708 | /* corrupt descriptor, skip this one and the following one */ | ||
709 | list_add_tail(&bf->list, &sc->rx.rxbuf); | ||
710 | ath_rx_edma_buf_link(sc, qtype); | ||
711 | skb = skb_peek(&rx_edma->rx_fifo); | ||
712 | if (!skb) | ||
713 | return true; | ||
714 | |||
715 | bf = SKB_CB_ATHBUF(skb); | ||
716 | BUG_ON(!bf); | ||
717 | |||
718 | __skb_unlink(skb, &rx_edma->rx_fifo); | ||
719 | list_add_tail(&bf->list, &sc->rx.rxbuf); | ||
720 | ath_rx_edma_buf_link(sc, qtype); | ||
721 | } | ||
722 | skb_queue_tail(&rx_edma->rx_buffers, skb); | ||
723 | |||
724 | return true; | ||
725 | } | ||
477 | 726 | ||
727 | static struct ath_buf *ath_edma_get_next_rx_buf(struct ath_softc *sc, | ||
728 | struct ath_rx_status *rs, | ||
729 | enum ath9k_rx_qtype qtype) | ||
730 | { | ||
731 | struct ath_rx_edma *rx_edma = &sc->rx.rx_edma[qtype]; | ||
732 | struct sk_buff *skb; | ||
478 | struct ath_buf *bf; | 733 | struct ath_buf *bf; |
734 | |||
735 | while (ath_edma_get_buffers(sc, qtype)); | ||
736 | skb = __skb_dequeue(&rx_edma->rx_buffers); | ||
737 | if (!skb) | ||
738 | return NULL; | ||
739 | |||
740 | bf = SKB_CB_ATHBUF(skb); | ||
741 | ath9k_hw_process_rxdesc_edma(sc->sc_ah, rs, skb->data); | ||
742 | return bf; | ||
743 | } | ||
744 | |||
745 | static struct ath_buf *ath_get_next_rx_buf(struct ath_softc *sc, | ||
746 | struct ath_rx_status *rs) | ||
747 | { | ||
748 | struct ath_hw *ah = sc->sc_ah; | ||
749 | struct ath_common *common = ath9k_hw_common(ah); | ||
479 | struct ath_desc *ds; | 750 | struct ath_desc *ds; |
751 | struct ath_buf *bf; | ||
752 | int ret; | ||
753 | |||
754 | if (list_empty(&sc->rx.rxbuf)) { | ||
755 | sc->rx.rxlink = NULL; | ||
756 | return NULL; | ||
757 | } | ||
758 | |||
759 | bf = list_first_entry(&sc->rx.rxbuf, struct ath_buf, list); | ||
760 | ds = bf->bf_desc; | ||
761 | |||
762 | /* | ||
763 | * Must provide the virtual address of the current | ||
764 | * descriptor, the physical address, and the virtual | ||
765 | * address of the next descriptor in the h/w chain. | ||
766 | * This allows the HAL to look ahead to see if the | ||
767 | * hardware is done with a descriptor by checking the | ||
768 | * done bit in the following descriptor and the address | ||
769 | * of the current descriptor the DMA engine is working | ||
770 | * on. All this is necessary because of our use of | ||
771 | * a self-linked list to avoid rx overruns. | ||
772 | */ | ||
773 | ret = ath9k_hw_rxprocdesc(ah, ds, rs, 0); | ||
774 | if (ret == -EINPROGRESS) { | ||
775 | struct ath_rx_status trs; | ||
776 | struct ath_buf *tbf; | ||
777 | struct ath_desc *tds; | ||
778 | |||
779 | memset(&trs, 0, sizeof(trs)); | ||
780 | if (list_is_last(&bf->list, &sc->rx.rxbuf)) { | ||
781 | sc->rx.rxlink = NULL; | ||
782 | return NULL; | ||
783 | } | ||
784 | |||
785 | tbf = list_entry(bf->list.next, struct ath_buf, list); | ||
786 | |||
787 | /* | ||
788 | * On some hardware the descriptor status words could | ||
789 | * get corrupted, including the done bit. Because of | ||
790 | * this, check if the next descriptor's done bit is | ||
791 | * set or not. | ||
792 | * | ||
793 | * If the next descriptor's done bit is set, the current | ||
794 | * descriptor has been corrupted. Force s/w to discard | ||
795 | * this descriptor and continue... | ||
796 | */ | ||
797 | |||
798 | tds = tbf->bf_desc; | ||
799 | ret = ath9k_hw_rxprocdesc(ah, tds, &trs, 0); | ||
800 | if (ret == -EINPROGRESS) | ||
801 | return NULL; | ||
802 | } | ||
803 | |||
804 | if (!bf->bf_mpdu) | ||
805 | return bf; | ||
806 | |||
807 | /* | ||
808 | * Synchronize the DMA transfer with CPU before | ||
809 | * 1. accessing the frame | ||
810 | * 2. requeueing the same buffer to h/w | ||
811 | */ | ||
812 | dma_sync_single_for_device(sc->dev, bf->bf_buf_addr, | ||
813 | common->rx_bufsize, | ||
814 | DMA_FROM_DEVICE); | ||
815 | |||
816 | return bf; | ||
817 | } | ||
818 | |||
819 | |||
820 | int ath_rx_tasklet(struct ath_softc *sc, int flush, bool hp) | ||
821 | { | ||
822 | struct ath_buf *bf; | ||
480 | struct sk_buff *skb = NULL, *requeue_skb; | 823 | struct sk_buff *skb = NULL, *requeue_skb; |
481 | struct ieee80211_rx_status *rxs; | 824 | struct ieee80211_rx_status *rxs; |
482 | struct ath_hw *ah = sc->sc_ah; | 825 | struct ath_hw *ah = sc->sc_ah; |
@@ -491,7 +834,16 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush) | |||
491 | int retval; | 834 | int retval; |
492 | bool decrypt_error = false; | 835 | bool decrypt_error = false; |
493 | struct ath_rx_status rs; | 836 | struct ath_rx_status rs; |
837 | enum ath9k_rx_qtype qtype; | ||
838 | bool edma = !!(ah->caps.hw_caps & ATH9K_HW_CAP_EDMA); | ||
839 | int dma_type; | ||
494 | 840 | ||
841 | if (edma) | ||
842 | dma_type = DMA_FROM_DEVICE; | ||
843 | else | ||
844 | dma_type = DMA_BIDIRECTIONAL; | ||
845 | |||
846 | qtype = hp ? ATH9K_RX_QUEUE_HP : ATH9K_RX_QUEUE_LP; | ||
495 | spin_lock_bh(&sc->rx.rxbuflock); | 847 | spin_lock_bh(&sc->rx.rxbuflock); |
496 | 848 | ||
497 | do { | 849 | do { |
@@ -499,71 +851,19 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush) | |||
499 | if ((sc->sc_flags & SC_OP_RXFLUSH) && (flush == 0)) | 851 | if ((sc->sc_flags & SC_OP_RXFLUSH) && (flush == 0)) |
500 | break; | 852 | break; |
501 | 853 | ||
502 | if (list_empty(&sc->rx.rxbuf)) { | ||
503 | sc->rx.rxlink = NULL; | ||
504 | break; | ||
505 | } | ||
506 | |||
507 | bf = list_first_entry(&sc->rx.rxbuf, struct ath_buf, list); | ||
508 | ds = bf->bf_desc; | ||
509 | |||
510 | /* | ||
511 | * Must provide the virtual address of the current | ||
512 | * descriptor, the physical address, and the virtual | ||
513 | * address of the next descriptor in the h/w chain. | ||
514 | * This allows the HAL to look ahead to see if the | ||
515 | * hardware is done with a descriptor by checking the | ||
516 | * done bit in the following descriptor and the address | ||
517 | * of the current descriptor the DMA engine is working | ||
518 | * on. All this is necessary because of our use of | ||
519 | * a self-linked list to avoid rx overruns. | ||
520 | */ | ||
521 | memset(&rs, 0, sizeof(rs)); | 854 | memset(&rs, 0, sizeof(rs)); |
522 | retval = ath9k_hw_rxprocdesc(ah, ds, &rs, 0); | 855 | if (edma) |
523 | if (retval == -EINPROGRESS) { | 856 | bf = ath_edma_get_next_rx_buf(sc, &rs, qtype); |
524 | struct ath_rx_status trs; | 857 | else |
525 | struct ath_buf *tbf; | 858 | bf = ath_get_next_rx_buf(sc, &rs); |
526 | struct ath_desc *tds; | ||
527 | |||
528 | memset(&trs, 0, sizeof(trs)); | ||
529 | if (list_is_last(&bf->list, &sc->rx.rxbuf)) { | ||
530 | sc->rx.rxlink = NULL; | ||
531 | break; | ||
532 | } | ||
533 | 859 | ||
534 | tbf = list_entry(bf->list.next, struct ath_buf, list); | 860 | if (!bf) |
535 | 861 | break; | |
536 | /* | ||
537 | * On some hardware the descriptor status words could | ||
538 | * get corrupted, including the done bit. Because of | ||
539 | * this, check if the next descriptor's done bit is | ||
540 | * set or not. | ||
541 | * | ||
542 | * If the next descriptor's done bit is set, the current | ||
543 | * descriptor has been corrupted. Force s/w to discard | ||
544 | * this descriptor and continue... | ||
545 | */ | ||
546 | |||
547 | tds = tbf->bf_desc; | ||
548 | retval = ath9k_hw_rxprocdesc(ah, tds, &trs, 0); | ||
549 | if (retval == -EINPROGRESS) { | ||
550 | break; | ||
551 | } | ||
552 | } | ||
553 | 862 | ||
554 | skb = bf->bf_mpdu; | 863 | skb = bf->bf_mpdu; |
555 | if (!skb) | 864 | if (!skb) |
556 | continue; | 865 | continue; |
557 | 866 | ||
558 | /* | ||
559 | * Synchronize the DMA transfer with CPU before | ||
560 | * 1. accessing the frame | ||
561 | * 2. requeueing the same buffer to h/w | ||
562 | */ | ||
563 | dma_sync_single_for_cpu(sc->dev, bf->bf_buf_addr, | ||
564 | common->rx_bufsize, | ||
565 | DMA_FROM_DEVICE); | ||
566 | |||
567 | hdr = (struct ieee80211_hdr *) skb->data; | 867 | hdr = (struct ieee80211_hdr *) skb->data; |
568 | rxs = IEEE80211_SKB_RXCB(skb); | 868 | rxs = IEEE80211_SKB_RXCB(skb); |
569 | 869 | ||
@@ -597,9 +897,11 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush) | |||
597 | /* Unmap the frame */ | 897 | /* Unmap the frame */ |
598 | dma_unmap_single(sc->dev, bf->bf_buf_addr, | 898 | dma_unmap_single(sc->dev, bf->bf_buf_addr, |
599 | common->rx_bufsize, | 899 | common->rx_bufsize, |
600 | DMA_FROM_DEVICE); | 900 | dma_type); |
601 | 901 | ||
602 | skb_put(skb, rs.rs_datalen); | 902 | skb_put(skb, rs.rs_datalen + ah->caps.rx_status_len); |
903 | if (ah->caps.rx_status_len) | ||
904 | skb_pull(skb, ah->caps.rx_status_len); | ||
603 | 905 | ||
604 | ath9k_cmn_rx_skb_postprocess(common, skb, &rs, | 906 | ath9k_cmn_rx_skb_postprocess(common, skb, &rs, |
605 | rxs, decrypt_error); | 907 | rxs, decrypt_error); |
@@ -608,7 +910,7 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush) | |||
608 | bf->bf_mpdu = requeue_skb; | 910 | bf->bf_mpdu = requeue_skb; |
609 | bf->bf_buf_addr = dma_map_single(sc->dev, requeue_skb->data, | 911 | bf->bf_buf_addr = dma_map_single(sc->dev, requeue_skb->data, |
610 | common->rx_bufsize, | 912 | common->rx_bufsize, |
611 | DMA_FROM_DEVICE); | 913 | dma_type); |
612 | if (unlikely(dma_mapping_error(sc->dev, | 914 | if (unlikely(dma_mapping_error(sc->dev, |
613 | bf->bf_buf_addr))) { | 915 | bf->bf_buf_addr))) { |
614 | dev_kfree_skb_any(requeue_skb); | 916 | dev_kfree_skb_any(requeue_skb); |
@@ -639,12 +941,16 @@ int ath_rx_tasklet(struct ath_softc *sc, int flush) | |||
639 | ath_rx_send_to_mac80211(hw, sc, skb, rxs); | 941 | ath_rx_send_to_mac80211(hw, sc, skb, rxs); |
640 | 942 | ||
641 | requeue: | 943 | requeue: |
642 | list_move_tail(&bf->list, &sc->rx.rxbuf); | 944 | if (edma) { |
643 | ath_rx_buf_link(sc, bf); | 945 | list_add_tail(&bf->list, &sc->rx.rxbuf); |
946 | ath_rx_edma_buf_link(sc, qtype); | ||
947 | } else { | ||
948 | list_move_tail(&bf->list, &sc->rx.rxbuf); | ||
949 | ath_rx_buf_link(sc, bf); | ||
950 | } | ||
644 | } while (1); | 951 | } while (1); |
645 | 952 | ||
646 | spin_unlock_bh(&sc->rx.rxbuflock); | 953 | spin_unlock_bh(&sc->rx.rxbuflock); |
647 | 954 | ||
648 | return 0; | 955 | return 0; |
649 | #undef PA2DESC | ||
650 | } | 956 | } |
diff --git a/drivers/net/wireless/ath/ath9k/reg.h b/drivers/net/wireless/ath/ath9k/reg.h index 7e36ad7421b7..d4371a43bdaa 100644 --- a/drivers/net/wireless/ath/ath9k/reg.h +++ b/drivers/net/wireless/ath/ath9k/reg.h | |||
@@ -20,7 +20,7 @@ | |||
20 | #include "../reg.h" | 20 | #include "../reg.h" |
21 | 21 | ||
22 | #define AR_CR 0x0008 | 22 | #define AR_CR 0x0008 |
23 | #define AR_CR_RXE 0x00000004 | 23 | #define AR_CR_RXE (AR_SREV_9300_20_OR_LATER(ah) ? 0x0000000c : 0x00000004) |
24 | #define AR_CR_RXD 0x00000020 | 24 | #define AR_CR_RXD 0x00000020 |
25 | #define AR_CR_SWI 0x00000040 | 25 | #define AR_CR_SWI 0x00000040 |
26 | 26 | ||
@@ -39,6 +39,12 @@ | |||
39 | #define AR_CFG_PCI_MASTER_REQ_Q_THRESH 0x00060000 | 39 | #define AR_CFG_PCI_MASTER_REQ_Q_THRESH 0x00060000 |
40 | #define AR_CFG_PCI_MASTER_REQ_Q_THRESH_S 17 | 40 | #define AR_CFG_PCI_MASTER_REQ_Q_THRESH_S 17 |
41 | 41 | ||
42 | #define AR_RXBP_THRESH 0x0018 | ||
43 | #define AR_RXBP_THRESH_HP 0x0000000f | ||
44 | #define AR_RXBP_THRESH_HP_S 0 | ||
45 | #define AR_RXBP_THRESH_LP 0x00003f00 | ||
46 | #define AR_RXBP_THRESH_LP_S 8 | ||
47 | |||
42 | #define AR_MIRT 0x0020 | 48 | #define AR_MIRT 0x0020 |
43 | #define AR_MIRT_VAL 0x0000ffff | 49 | #define AR_MIRT_VAL 0x0000ffff |
44 | #define AR_MIRT_VAL_S 16 | 50 | #define AR_MIRT_VAL_S 16 |
@@ -144,6 +150,9 @@ | |||
144 | #define AR_MACMISC_MISC_OBS_BUS_MSB_S 15 | 150 | #define AR_MACMISC_MISC_OBS_BUS_MSB_S 15 |
145 | #define AR_MACMISC_MISC_OBS_BUS_1 1 | 151 | #define AR_MACMISC_MISC_OBS_BUS_1 1 |
146 | 152 | ||
153 | #define AR_DATABUF_SIZE 0x0060 | ||
154 | #define AR_DATABUF_SIZE_MASK 0x00000FFF | ||
155 | |||
147 | #define AR_GTXTO 0x0064 | 156 | #define AR_GTXTO 0x0064 |
148 | #define AR_GTXTO_TIMEOUT_COUNTER 0x0000FFFF | 157 | #define AR_GTXTO_TIMEOUT_COUNTER 0x0000FFFF |
149 | #define AR_GTXTO_TIMEOUT_LIMIT 0xFFFF0000 | 158 | #define AR_GTXTO_TIMEOUT_LIMIT 0xFFFF0000 |
@@ -160,9 +169,14 @@ | |||
160 | #define AR_CST_TIMEOUT_LIMIT 0xFFFF0000 | 169 | #define AR_CST_TIMEOUT_LIMIT 0xFFFF0000 |
161 | #define AR_CST_TIMEOUT_LIMIT_S 16 | 170 | #define AR_CST_TIMEOUT_LIMIT_S 16 |
162 | 171 | ||
172 | #define AR_HP_RXDP 0x0074 | ||
173 | #define AR_LP_RXDP 0x0078 | ||
174 | |||
163 | #define AR_ISR 0x0080 | 175 | #define AR_ISR 0x0080 |
164 | #define AR_ISR_RXOK 0x00000001 | 176 | #define AR_ISR_RXOK 0x00000001 |
165 | #define AR_ISR_RXDESC 0x00000002 | 177 | #define AR_ISR_RXDESC 0x00000002 |
178 | #define AR_ISR_HP_RXOK 0x00000001 | ||
179 | #define AR_ISR_LP_RXOK 0x00000002 | ||
166 | #define AR_ISR_RXERR 0x00000004 | 180 | #define AR_ISR_RXERR 0x00000004 |
167 | #define AR_ISR_RXNOPKT 0x00000008 | 181 | #define AR_ISR_RXNOPKT 0x00000008 |
168 | #define AR_ISR_RXEOL 0x00000010 | 182 | #define AR_ISR_RXEOL 0x00000010 |
@@ -232,7 +246,6 @@ | |||
232 | #define AR_ISR_S5_TIMER_THRESH 0x0007FE00 | 246 | #define AR_ISR_S5_TIMER_THRESH 0x0007FE00 |
233 | #define AR_ISR_S5_TIM_TIMER 0x00000010 | 247 | #define AR_ISR_S5_TIM_TIMER 0x00000010 |
234 | #define AR_ISR_S5_DTIM_TIMER 0x00000020 | 248 | #define AR_ISR_S5_DTIM_TIMER 0x00000020 |
235 | #define AR_ISR_S5_S 0x00d8 | ||
236 | #define AR_IMR_S5 0x00b8 | 249 | #define AR_IMR_S5 0x00b8 |
237 | #define AR_IMR_S5_TIM_TIMER 0x00000010 | 250 | #define AR_IMR_S5_TIM_TIMER 0x00000010 |
238 | #define AR_IMR_S5_DTIM_TIMER 0x00000020 | 251 | #define AR_IMR_S5_DTIM_TIMER 0x00000020 |
@@ -240,7 +253,6 @@ | |||
240 | #define AR_ISR_S5_GENTIMER_TRIG_S 0 | 253 | #define AR_ISR_S5_GENTIMER_TRIG_S 0 |
241 | #define AR_ISR_S5_GENTIMER_THRESH 0xFF800000 | 254 | #define AR_ISR_S5_GENTIMER_THRESH 0xFF800000 |
242 | #define AR_ISR_S5_GENTIMER_THRESH_S 16 | 255 | #define AR_ISR_S5_GENTIMER_THRESH_S 16 |
243 | #define AR_ISR_S5_S 0x00d8 | ||
244 | #define AR_IMR_S5_GENTIMER_TRIG 0x0000FF80 | 256 | #define AR_IMR_S5_GENTIMER_TRIG 0x0000FF80 |
245 | #define AR_IMR_S5_GENTIMER_TRIG_S 0 | 257 | #define AR_IMR_S5_GENTIMER_TRIG_S 0 |
246 | #define AR_IMR_S5_GENTIMER_THRESH 0xFF800000 | 258 | #define AR_IMR_S5_GENTIMER_THRESH 0xFF800000 |
@@ -249,6 +261,8 @@ | |||
249 | #define AR_IMR 0x00a0 | 261 | #define AR_IMR 0x00a0 |
250 | #define AR_IMR_RXOK 0x00000001 | 262 | #define AR_IMR_RXOK 0x00000001 |
251 | #define AR_IMR_RXDESC 0x00000002 | 263 | #define AR_IMR_RXDESC 0x00000002 |
264 | #define AR_IMR_RXOK_HP 0x00000001 | ||
265 | #define AR_IMR_RXOK_LP 0x00000002 | ||
252 | #define AR_IMR_RXERR 0x00000004 | 266 | #define AR_IMR_RXERR 0x00000004 |
253 | #define AR_IMR_RXNOPKT 0x00000008 | 267 | #define AR_IMR_RXNOPKT 0x00000008 |
254 | #define AR_IMR_RXEOL 0x00000010 | 268 | #define AR_IMR_RXEOL 0x00000010 |
@@ -332,10 +346,10 @@ | |||
332 | #define AR_ISR_S1_QCU_TXEOL 0x03FF0000 | 346 | #define AR_ISR_S1_QCU_TXEOL 0x03FF0000 |
333 | #define AR_ISR_S1_QCU_TXEOL_S 16 | 347 | #define AR_ISR_S1_QCU_TXEOL_S 16 |
334 | 348 | ||
335 | #define AR_ISR_S2_S 0x00cc | 349 | #define AR_ISR_S2_S (AR_SREV_9300_20_OR_LATER(ah) ? 0x00d0 : 0x00cc) |
336 | #define AR_ISR_S3_S 0x00d0 | 350 | #define AR_ISR_S3_S (AR_SREV_9300_20_OR_LATER(ah) ? 0x00d4 : 0x00d0) |
337 | #define AR_ISR_S4_S 0x00d4 | 351 | #define AR_ISR_S4_S (AR_SREV_9300_20_OR_LATER(ah) ? 0x00d8 : 0x00d4) |
338 | #define AR_ISR_S5_S 0x00d8 | 352 | #define AR_ISR_S5_S (AR_SREV_9300_20_OR_LATER(ah) ? 0x00dc : 0x00d8) |
339 | #define AR_DMADBG_0 0x00e0 | 353 | #define AR_DMADBG_0 0x00e0 |
340 | #define AR_DMADBG_1 0x00e4 | 354 | #define AR_DMADBG_1 0x00e4 |
341 | #define AR_DMADBG_2 0x00e8 | 355 | #define AR_DMADBG_2 0x00e8 |
@@ -369,6 +383,9 @@ | |||
369 | #define AR_Q9_TXDP 0x0824 | 383 | #define AR_Q9_TXDP 0x0824 |
370 | #define AR_QTXDP(_i) (AR_Q0_TXDP + ((_i)<<2)) | 384 | #define AR_QTXDP(_i) (AR_Q0_TXDP + ((_i)<<2)) |
371 | 385 | ||
386 | #define AR_Q_STATUS_RING_START 0x830 | ||
387 | #define AR_Q_STATUS_RING_END 0x834 | ||
388 | |||
372 | #define AR_Q_TXE 0x0840 | 389 | #define AR_Q_TXE 0x0840 |
373 | #define AR_Q_TXE_M 0x000003FF | 390 | #define AR_Q_TXE_M 0x000003FF |
374 | 391 | ||
@@ -461,6 +478,10 @@ | |||
461 | #define AR_Q_RDYTIMESHDN 0x0a40 | 478 | #define AR_Q_RDYTIMESHDN 0x0a40 |
462 | #define AR_Q_RDYTIMESHDN_M 0x000003FF | 479 | #define AR_Q_RDYTIMESHDN_M 0x000003FF |
463 | 480 | ||
481 | /* MAC Descriptor CRC check */ | ||
482 | #define AR_Q_DESC_CRCCHK 0xa44 | ||
483 | /* Enable CRC check on the descriptor fetched from host */ | ||
484 | #define AR_Q_DESC_CRCCHK_EN 1 | ||
464 | 485 | ||
465 | #define AR_NUM_DCU 10 | 486 | #define AR_NUM_DCU 10 |
466 | #define AR_DCU_0 0x0001 | 487 | #define AR_DCU_0 0x0001 |
@@ -759,6 +780,8 @@ | |||
759 | #define AR_SREV_VERSION_9271 0x140 | 780 | #define AR_SREV_VERSION_9271 0x140 |
760 | #define AR_SREV_REVISION_9271_10 0 | 781 | #define AR_SREV_REVISION_9271_10 0 |
761 | #define AR_SREV_REVISION_9271_11 1 | 782 | #define AR_SREV_REVISION_9271_11 1 |
783 | #define AR_SREV_VERSION_9300 0x1c0 | ||
784 | #define AR_SREV_REVISION_9300_20 2 /* 2.0 and 2.1 */ | ||
762 | 785 | ||
763 | #define AR_SREV_5416(_ah) \ | 786 | #define AR_SREV_5416(_ah) \ |
764 | (((_ah)->hw_version.macVersion == AR_SREV_VERSION_5416_PCI) || \ | 787 | (((_ah)->hw_version.macVersion == AR_SREV_VERSION_5416_PCI) || \ |
@@ -844,6 +867,15 @@ | |||
844 | #define AR_SREV_9271_11(_ah) \ | 867 | #define AR_SREV_9271_11(_ah) \ |
845 | (AR_SREV_9271(_ah) && \ | 868 | (AR_SREV_9271(_ah) && \ |
846 | ((_ah)->hw_version.macRev == AR_SREV_REVISION_9271_11)) | 869 | ((_ah)->hw_version.macRev == AR_SREV_REVISION_9271_11)) |
870 | #define AR_SREV_9300(_ah) \ | ||
871 | (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9300)) | ||
872 | #define AR_SREV_9300_20(_ah) \ | ||
873 | (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9300) && \ | ||
874 | ((_ah)->hw_version.macRev == AR_SREV_REVISION_9300_20)) | ||
875 | #define AR_SREV_9300_20_OR_LATER(_ah) \ | ||
876 | (((_ah)->hw_version.macVersion > AR_SREV_VERSION_9300) || \ | ||
877 | (((_ah)->hw_version.macVersion == AR_SREV_VERSION_9300) && \ | ||
878 | ((_ah)->hw_version.macRev >= AR_SREV_REVISION_9300_20))) | ||
847 | 879 | ||
848 | #define AR_SREV_9285E_20(_ah) \ | 880 | #define AR_SREV_9285E_20(_ah) \ |
849 | (AR_SREV_9285_12_OR_LATER(_ah) && \ | 881 | (AR_SREV_9285_12_OR_LATER(_ah) && \ |
@@ -945,6 +977,7 @@ enum { | |||
945 | #define AR9285_NUM_GPIO 12 | 977 | #define AR9285_NUM_GPIO 12 |
946 | #define AR9287_NUM_GPIO 11 | 978 | #define AR9287_NUM_GPIO 11 |
947 | #define AR9271_NUM_GPIO 16 | 979 | #define AR9271_NUM_GPIO 16 |
980 | #define AR9300_NUM_GPIO 17 | ||
948 | 981 | ||
949 | #define AR_GPIO_IN_OUT 0x4048 | 982 | #define AR_GPIO_IN_OUT 0x4048 |
950 | #define AR_GPIO_IN_VAL 0x0FFFC000 | 983 | #define AR_GPIO_IN_VAL 0x0FFFC000 |
@@ -957,19 +990,21 @@ enum { | |||
957 | #define AR9287_GPIO_IN_VAL_S 11 | 990 | #define AR9287_GPIO_IN_VAL_S 11 |
958 | #define AR9271_GPIO_IN_VAL 0xFFFF0000 | 991 | #define AR9271_GPIO_IN_VAL 0xFFFF0000 |
959 | #define AR9271_GPIO_IN_VAL_S 16 | 992 | #define AR9271_GPIO_IN_VAL_S 16 |
993 | #define AR9300_GPIO_IN_VAL 0x0001FFFF | ||
994 | #define AR9300_GPIO_IN_VAL_S 0 | ||
960 | 995 | ||
961 | #define AR_GPIO_OE_OUT 0x404c | 996 | #define AR_GPIO_OE_OUT (AR_SREV_9300_20_OR_LATER(ah) ? 0x4050 : 0x404c) |
962 | #define AR_GPIO_OE_OUT_DRV 0x3 | 997 | #define AR_GPIO_OE_OUT_DRV 0x3 |
963 | #define AR_GPIO_OE_OUT_DRV_NO 0x0 | 998 | #define AR_GPIO_OE_OUT_DRV_NO 0x0 |
964 | #define AR_GPIO_OE_OUT_DRV_LOW 0x1 | 999 | #define AR_GPIO_OE_OUT_DRV_LOW 0x1 |
965 | #define AR_GPIO_OE_OUT_DRV_HI 0x2 | 1000 | #define AR_GPIO_OE_OUT_DRV_HI 0x2 |
966 | #define AR_GPIO_OE_OUT_DRV_ALL 0x3 | 1001 | #define AR_GPIO_OE_OUT_DRV_ALL 0x3 |
967 | 1002 | ||
968 | #define AR_GPIO_INTR_POL 0x4050 | 1003 | #define AR_GPIO_INTR_POL (AR_SREV_9300_20_OR_LATER(ah) ? 0x4058 : 0x4050) |
969 | #define AR_GPIO_INTR_POL_VAL 0x00001FFF | 1004 | #define AR_GPIO_INTR_POL_VAL 0x0001FFFF |
970 | #define AR_GPIO_INTR_POL_VAL_S 0 | 1005 | #define AR_GPIO_INTR_POL_VAL_S 0 |
971 | 1006 | ||
972 | #define AR_GPIO_INPUT_EN_VAL 0x4054 | 1007 | #define AR_GPIO_INPUT_EN_VAL (AR_SREV_9300_20_OR_LATER(ah) ? 0x405c : 0x4054) |
973 | #define AR_GPIO_INPUT_EN_VAL_BT_PRIORITY_DEF 0x00000004 | 1008 | #define AR_GPIO_INPUT_EN_VAL_BT_PRIORITY_DEF 0x00000004 |
974 | #define AR_GPIO_INPUT_EN_VAL_BT_PRIORITY_S 2 | 1009 | #define AR_GPIO_INPUT_EN_VAL_BT_PRIORITY_S 2 |
975 | #define AR_GPIO_INPUT_EN_VAL_BT_FREQUENCY_DEF 0x00000008 | 1010 | #define AR_GPIO_INPUT_EN_VAL_BT_FREQUENCY_DEF 0x00000008 |
@@ -987,13 +1022,13 @@ enum { | |||
987 | #define AR_GPIO_RTC_RESET_OVERRIDE_ENABLE 0x00010000 | 1022 | #define AR_GPIO_RTC_RESET_OVERRIDE_ENABLE 0x00010000 |
988 | #define AR_GPIO_JTAG_DISABLE 0x00020000 | 1023 | #define AR_GPIO_JTAG_DISABLE 0x00020000 |
989 | 1024 | ||
990 | #define AR_GPIO_INPUT_MUX1 0x4058 | 1025 | #define AR_GPIO_INPUT_MUX1 (AR_SREV_9300_20_OR_LATER(ah) ? 0x4060 : 0x4058) |
991 | #define AR_GPIO_INPUT_MUX1_BT_ACTIVE 0x000f0000 | 1026 | #define AR_GPIO_INPUT_MUX1_BT_ACTIVE 0x000f0000 |
992 | #define AR_GPIO_INPUT_MUX1_BT_ACTIVE_S 16 | 1027 | #define AR_GPIO_INPUT_MUX1_BT_ACTIVE_S 16 |
993 | #define AR_GPIO_INPUT_MUX1_BT_PRIORITY 0x00000f00 | 1028 | #define AR_GPIO_INPUT_MUX1_BT_PRIORITY 0x00000f00 |
994 | #define AR_GPIO_INPUT_MUX1_BT_PRIORITY_S 8 | 1029 | #define AR_GPIO_INPUT_MUX1_BT_PRIORITY_S 8 |
995 | 1030 | ||
996 | #define AR_GPIO_INPUT_MUX2 0x405c | 1031 | #define AR_GPIO_INPUT_MUX2 (AR_SREV_9300_20_OR_LATER(ah) ? 0x4064 : 0x405c) |
997 | #define AR_GPIO_INPUT_MUX2_CLK25 0x0000000f | 1032 | #define AR_GPIO_INPUT_MUX2_CLK25 0x0000000f |
998 | #define AR_GPIO_INPUT_MUX2_CLK25_S 0 | 1033 | #define AR_GPIO_INPUT_MUX2_CLK25_S 0 |
999 | #define AR_GPIO_INPUT_MUX2_RFSILENT 0x000000f0 | 1034 | #define AR_GPIO_INPUT_MUX2_RFSILENT 0x000000f0 |
@@ -1001,13 +1036,13 @@ enum { | |||
1001 | #define AR_GPIO_INPUT_MUX2_RTC_RESET 0x00000f00 | 1036 | #define AR_GPIO_INPUT_MUX2_RTC_RESET 0x00000f00 |
1002 | #define AR_GPIO_INPUT_MUX2_RTC_RESET_S 8 | 1037 | #define AR_GPIO_INPUT_MUX2_RTC_RESET_S 8 |
1003 | 1038 | ||
1004 | #define AR_GPIO_OUTPUT_MUX1 0x4060 | 1039 | #define AR_GPIO_OUTPUT_MUX1 (AR_SREV_9300_20_OR_LATER(ah) ? 0x4068 : 0x4060) |
1005 | #define AR_GPIO_OUTPUT_MUX2 0x4064 | 1040 | #define AR_GPIO_OUTPUT_MUX2 (AR_SREV_9300_20_OR_LATER(ah) ? 0x406c : 0x4064) |
1006 | #define AR_GPIO_OUTPUT_MUX3 0x4068 | 1041 | #define AR_GPIO_OUTPUT_MUX3 (AR_SREV_9300_20_OR_LATER(ah) ? 0x4070 : 0x4068) |
1007 | 1042 | ||
1008 | #define AR_INPUT_STATE 0x406c | 1043 | #define AR_INPUT_STATE (AR_SREV_9300_20_OR_LATER(ah) ? 0x4074 : 0x406c) |
1009 | 1044 | ||
1010 | #define AR_EEPROM_STATUS_DATA 0x407c | 1045 | #define AR_EEPROM_STATUS_DATA (AR_SREV_9300_20_OR_LATER(ah) ? 0x4084 : 0x407c) |
1011 | #define AR_EEPROM_STATUS_DATA_VAL 0x0000ffff | 1046 | #define AR_EEPROM_STATUS_DATA_VAL 0x0000ffff |
1012 | #define AR_EEPROM_STATUS_DATA_VAL_S 0 | 1047 | #define AR_EEPROM_STATUS_DATA_VAL_S 0 |
1013 | #define AR_EEPROM_STATUS_DATA_BUSY 0x00010000 | 1048 | #define AR_EEPROM_STATUS_DATA_BUSY 0x00010000 |
@@ -1015,13 +1050,24 @@ enum { | |||
1015 | #define AR_EEPROM_STATUS_DATA_PROT_ACCESS 0x00040000 | 1050 | #define AR_EEPROM_STATUS_DATA_PROT_ACCESS 0x00040000 |
1016 | #define AR_EEPROM_STATUS_DATA_ABSENT_ACCESS 0x00080000 | 1051 | #define AR_EEPROM_STATUS_DATA_ABSENT_ACCESS 0x00080000 |
1017 | 1052 | ||
1018 | #define AR_OBS 0x4080 | 1053 | #define AR_OBS (AR_SREV_9300_20_OR_LATER(ah) ? 0x4088 : 0x4080) |
1019 | 1054 | ||
1020 | #define AR_GPIO_PDPU 0x4088 | 1055 | #define AR_GPIO_PDPU (AR_SREV_9300_20_OR_LATER(ah) ? 0x4090 : 0x4088) |
1021 | 1056 | ||
1022 | #define AR_PCIE_MSI 0x4094 | 1057 | #define AR_PCIE_MSI (AR_SREV_9300_20_OR_LATER(ah) ? 0x40a4 : 0x4094) |
1023 | #define AR_PCIE_MSI_ENABLE 0x00000001 | 1058 | #define AR_PCIE_MSI_ENABLE 0x00000001 |
1024 | 1059 | ||
1060 | #define AR_INTR_PRIO_SYNC_ENABLE 0x40c4 | ||
1061 | #define AR_INTR_PRIO_ASYNC_MASK 0x40c8 | ||
1062 | #define AR_INTR_PRIO_SYNC_MASK 0x40cc | ||
1063 | #define AR_INTR_PRIO_ASYNC_ENABLE 0x40d4 | ||
1064 | |||
1065 | #define AR_RTC_9300_PLL_DIV 0x000003ff | ||
1066 | #define AR_RTC_9300_PLL_DIV_S 0 | ||
1067 | #define AR_RTC_9300_PLL_REFDIV 0x00003C00 | ||
1068 | #define AR_RTC_9300_PLL_REFDIV_S 10 | ||
1069 | #define AR_RTC_9300_PLL_CLKSEL 0x0000C000 | ||
1070 | #define AR_RTC_9300_PLL_CLKSEL_S 14 | ||
1025 | 1071 | ||
1026 | #define AR_RTC_9160_PLL_DIV 0x000003ff | 1072 | #define AR_RTC_9160_PLL_DIV 0x000003ff |
1027 | #define AR_RTC_9160_PLL_DIV_S 0 | 1073 | #define AR_RTC_9160_PLL_DIV_S 0 |
@@ -1039,6 +1085,16 @@ enum { | |||
1039 | #define AR_RTC_RC_COLD_RESET 0x00000004 | 1085 | #define AR_RTC_RC_COLD_RESET 0x00000004 |
1040 | #define AR_RTC_RC_WARM_RESET 0x00000008 | 1086 | #define AR_RTC_RC_WARM_RESET 0x00000008 |
1041 | 1087 | ||
1088 | /* Crystal Control */ | ||
1089 | #define AR_RTC_XTAL_CONTROL 0x7004 | ||
1090 | |||
1091 | /* Reg Control 0 */ | ||
1092 | #define AR_RTC_REG_CONTROL0 0x7008 | ||
1093 | |||
1094 | /* Reg Control 1 */ | ||
1095 | #define AR_RTC_REG_CONTROL1 0x700c | ||
1096 | #define AR_RTC_REG_CONTROL1_SWREG_PROGRAM 0x00000001 | ||
1097 | |||
1042 | #define AR_RTC_PLL_CONTROL \ | 1098 | #define AR_RTC_PLL_CONTROL \ |
1043 | ((AR_SREV_9100(ah)) ? (AR_RTC_BASE + 0x0014) : 0x7014) | 1099 | ((AR_SREV_9100(ah)) ? (AR_RTC_BASE + 0x0014) : 0x7014) |
1044 | 1100 | ||
@@ -1069,6 +1125,7 @@ enum { | |||
1069 | #define AR_RTC_SLEEP_CLK \ | 1125 | #define AR_RTC_SLEEP_CLK \ |
1070 | ((AR_SREV_9100(ah)) ? (AR_RTC_BASE + 0x0048) : 0x7048) | 1126 | ((AR_SREV_9100(ah)) ? (AR_RTC_BASE + 0x0048) : 0x7048) |
1071 | #define AR_RTC_FORCE_DERIVED_CLK 0x2 | 1127 | #define AR_RTC_FORCE_DERIVED_CLK 0x2 |
1128 | #define AR_RTC_FORCE_SWREG_PRD 0x00000004 | ||
1072 | 1129 | ||
1073 | #define AR_RTC_FORCE_WAKE \ | 1130 | #define AR_RTC_FORCE_WAKE \ |
1074 | ((AR_SREV_9100(ah)) ? (AR_RTC_BASE + 0x004c) : 0x704c) | 1131 | ((AR_SREV_9100(ah)) ? (AR_RTC_BASE + 0x004c) : 0x704c) |
@@ -1533,7 +1590,7 @@ enum { | |||
1533 | #define AR_TSFOOR_THRESHOLD 0x813c | 1590 | #define AR_TSFOOR_THRESHOLD 0x813c |
1534 | #define AR_TSFOOR_THRESHOLD_VAL 0x0000FFFF | 1591 | #define AR_TSFOOR_THRESHOLD_VAL 0x0000FFFF |
1535 | 1592 | ||
1536 | #define AR_PHY_ERR_EIFS_MASK 8144 | 1593 | #define AR_PHY_ERR_EIFS_MASK 0x8144 |
1537 | 1594 | ||
1538 | #define AR_PHY_ERR_3 0x8168 | 1595 | #define AR_PHY_ERR_3 0x8168 |
1539 | #define AR_PHY_ERR_3_COUNT 0x00FFFFFF | 1596 | #define AR_PHY_ERR_3_COUNT 0x00FFFFFF |
@@ -1599,24 +1656,26 @@ enum { | |||
1599 | #define AR_FIRST_NDP_TIMER 7 | 1656 | #define AR_FIRST_NDP_TIMER 7 |
1600 | #define AR_NDP2_PERIOD 0x81a0 | 1657 | #define AR_NDP2_PERIOD 0x81a0 |
1601 | #define AR_NDP2_TIMER_MODE 0x81c0 | 1658 | #define AR_NDP2_TIMER_MODE 0x81c0 |
1602 | #define AR_NEXT_TBTT_TIMER 0x8200 | 1659 | |
1603 | #define AR_NEXT_DMA_BEACON_ALERT 0x8204 | 1660 | #define AR_GEN_TIMERS(_i) (0x8200 + ((_i) << 2)) |
1604 | #define AR_NEXT_SWBA 0x8208 | 1661 | #define AR_NEXT_TBTT_TIMER AR_GEN_TIMERS(0) |
1605 | #define AR_NEXT_CFP 0x8208 | 1662 | #define AR_NEXT_DMA_BEACON_ALERT AR_GEN_TIMERS(1) |
1606 | #define AR_NEXT_HCF 0x820C | 1663 | #define AR_NEXT_SWBA AR_GEN_TIMERS(2) |
1607 | #define AR_NEXT_TIM 0x8210 | 1664 | #define AR_NEXT_CFP AR_GEN_TIMERS(2) |
1608 | #define AR_NEXT_DTIM 0x8214 | 1665 | #define AR_NEXT_HCF AR_GEN_TIMERS(3) |
1609 | #define AR_NEXT_QUIET_TIMER 0x8218 | 1666 | #define AR_NEXT_TIM AR_GEN_TIMERS(4) |
1610 | #define AR_NEXT_NDP_TIMER 0x821C | 1667 | #define AR_NEXT_DTIM AR_GEN_TIMERS(5) |
1611 | 1668 | #define AR_NEXT_QUIET_TIMER AR_GEN_TIMERS(6) | |
1612 | #define AR_BEACON_PERIOD 0x8220 | 1669 | #define AR_NEXT_NDP_TIMER AR_GEN_TIMERS(7) |
1613 | #define AR_DMA_BEACON_PERIOD 0x8224 | 1670 | |
1614 | #define AR_SWBA_PERIOD 0x8228 | 1671 | #define AR_BEACON_PERIOD AR_GEN_TIMERS(8) |
1615 | #define AR_HCF_PERIOD 0x822C | 1672 | #define AR_DMA_BEACON_PERIOD AR_GEN_TIMERS(9) |
1616 | #define AR_TIM_PERIOD 0x8230 | 1673 | #define AR_SWBA_PERIOD AR_GEN_TIMERS(10) |
1617 | #define AR_DTIM_PERIOD 0x8234 | 1674 | #define AR_HCF_PERIOD AR_GEN_TIMERS(11) |
1618 | #define AR_QUIET_PERIOD 0x8238 | 1675 | #define AR_TIM_PERIOD AR_GEN_TIMERS(12) |
1619 | #define AR_NDP_PERIOD 0x823C | 1676 | #define AR_DTIM_PERIOD AR_GEN_TIMERS(13) |
1677 | #define AR_QUIET_PERIOD AR_GEN_TIMERS(14) | ||
1678 | #define AR_NDP_PERIOD AR_GEN_TIMERS(15) | ||
1620 | 1679 | ||
1621 | #define AR_TIMER_MODE 0x8240 | 1680 | #define AR_TIMER_MODE 0x8240 |
1622 | #define AR_TBTT_TIMER_EN 0x00000001 | 1681 | #define AR_TBTT_TIMER_EN 0x00000001 |
@@ -1730,4 +1789,32 @@ enum { | |||
1730 | #define AR9271_CORE_CLOCK 117 /* clock to 117Mhz */ | 1789 | #define AR9271_CORE_CLOCK 117 /* clock to 117Mhz */ |
1731 | #define AR9271_TARGET_BAUD_RATE 19200 /* 115200 */ | 1790 | #define AR9271_TARGET_BAUD_RATE 19200 /* 115200 */ |
1732 | 1791 | ||
1792 | #define AR_AGG_WEP_ENABLE_FIX 0x00000008 /* This allows the use of AR_AGG_WEP_ENABLE */ | ||
1793 | #define AR_ADHOC_MCAST_KEYID_ENABLE 0x00000040 /* This bit enables the Multicast search | ||
1794 | * based on both MAC Address and Key ID. | ||
1795 | * If bit is 0, then Multicast search is | ||
1796 | * based on MAC address only. | ||
1797 | * For Merlin and above only. | ||
1798 | */ | ||
1799 | #define AR_AGG_WEP_ENABLE 0x00020000 /* This field enables AGG_WEP feature, | ||
1800 | * when it is enable, AGG_WEP would takes | ||
1801 | * charge of the encryption interface of | ||
1802 | * pcu_txsm. | ||
1803 | */ | ||
1804 | |||
1805 | #define AR9300_SM_BASE 0xa200 | ||
1806 | #define AR9002_PHY_AGC_CONTROL 0x9860 | ||
1807 | #define AR9003_PHY_AGC_CONTROL AR9300_SM_BASE + 0xc4 | ||
1808 | #define AR_PHY_AGC_CONTROL (AR_SREV_9300_20_OR_LATER(ah) ? AR9003_PHY_AGC_CONTROL : AR9002_PHY_AGC_CONTROL) | ||
1809 | #define AR_PHY_AGC_CONTROL_CAL 0x00000001 /* do internal calibration */ | ||
1810 | #define AR_PHY_AGC_CONTROL_NF 0x00000002 /* do noise-floor calibration */ | ||
1811 | #define AR_PHY_AGC_CONTROL_OFFSET_CAL 0x00000800 /* allow offset calibration */ | ||
1812 | #define AR_PHY_AGC_CONTROL_ENABLE_NF 0x00008000 /* enable noise floor calibration to happen */ | ||
1813 | #define AR_PHY_AGC_CONTROL_FLTR_CAL 0x00010000 /* allow tx filter calibration */ | ||
1814 | #define AR_PHY_AGC_CONTROL_NO_UPDATE_NF 0x00020000 /* don't update noise floor automatically */ | ||
1815 | #define AR_PHY_AGC_CONTROL_EXT_NF_PWR_MEAS 0x00040000 /* extend noise floor power measurement */ | ||
1816 | #define AR_PHY_AGC_CONTROL_CLC_SUCCESS 0x00080000 /* carrier leak calibration done */ | ||
1817 | #define AR_PHY_AGC_CONTROL_YCOK_MAX 0x000003c0 | ||
1818 | #define AR_PHY_AGC_CONTROL_YCOK_MAX_S 6 | ||
1819 | |||
1733 | #endif | 1820 | #endif |
diff --git a/drivers/net/wireless/ath/ath9k/wmi.c b/drivers/net/wireless/ath/ath9k/wmi.c index f2ff18cf3e60..dc6c6fc2e095 100644 --- a/drivers/net/wireless/ath/ath9k/wmi.c +++ b/drivers/net/wireless/ath/ath9k/wmi.c | |||
@@ -101,6 +101,7 @@ struct wmi *ath9k_init_wmi(struct ath9k_htc_priv *priv) | |||
101 | wmi->drv_priv = priv; | 101 | wmi->drv_priv = priv; |
102 | wmi->stopped = false; | 102 | wmi->stopped = false; |
103 | mutex_init(&wmi->op_mutex); | 103 | mutex_init(&wmi->op_mutex); |
104 | mutex_init(&wmi->multi_write_mutex); | ||
104 | init_completion(&wmi->cmd_wait); | 105 | init_completion(&wmi->cmd_wait); |
105 | 106 | ||
106 | return wmi; | 107 | return wmi; |
@@ -128,7 +129,7 @@ void ath9k_wmi_tasklet(unsigned long data) | |||
128 | void *wmi_event; | 129 | void *wmi_event; |
129 | unsigned long flags; | 130 | unsigned long flags; |
130 | #ifdef CONFIG_ATH9K_HTC_DEBUGFS | 131 | #ifdef CONFIG_ATH9K_HTC_DEBUGFS |
131 | u32 txrate; | 132 | __be32 txrate; |
132 | #endif | 133 | #endif |
133 | 134 | ||
134 | spin_lock_irqsave(&priv->wmi->wmi_lock, flags); | 135 | spin_lock_irqsave(&priv->wmi->wmi_lock, flags); |
@@ -203,6 +204,14 @@ static void ath9k_wmi_ctrl_rx(void *priv, struct sk_buff *skb, | |||
203 | return; | 204 | return; |
204 | } | 205 | } |
205 | 206 | ||
207 | /* Check if there has been a timeout. */ | ||
208 | spin_lock(&wmi->wmi_lock); | ||
209 | if (cmd_id != wmi->last_cmd_id) { | ||
210 | spin_unlock(&wmi->wmi_lock); | ||
211 | goto free_skb; | ||
212 | } | ||
213 | spin_unlock(&wmi->wmi_lock); | ||
214 | |||
206 | /* WMI command response */ | 215 | /* WMI command response */ |
207 | ath9k_wmi_rsp_callback(wmi, skb); | 216 | ath9k_wmi_rsp_callback(wmi, skb); |
208 | 217 | ||
@@ -265,6 +274,7 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id, | |||
265 | struct sk_buff *skb; | 274 | struct sk_buff *skb; |
266 | u8 *data; | 275 | u8 *data; |
267 | int time_left, ret = 0; | 276 | int time_left, ret = 0; |
277 | unsigned long flags; | ||
268 | 278 | ||
269 | if (!wmi) | 279 | if (!wmi) |
270 | return -EINVAL; | 280 | return -EINVAL; |
@@ -296,6 +306,10 @@ int ath9k_wmi_cmd(struct wmi *wmi, enum wmi_cmd_id cmd_id, | |||
296 | if (ret) | 306 | if (ret) |
297 | goto out; | 307 | goto out; |
298 | 308 | ||
309 | spin_lock_irqsave(&wmi->wmi_lock, flags); | ||
310 | wmi->last_cmd_id = cmd_id; | ||
311 | spin_unlock_irqrestore(&wmi->wmi_lock, flags); | ||
312 | |||
299 | time_left = wait_for_completion_timeout(&wmi->cmd_wait, timeout); | 313 | time_left = wait_for_completion_timeout(&wmi->cmd_wait, timeout); |
300 | if (!time_left) { | 314 | if (!time_left) { |
301 | ath_print(common, ATH_DBG_WMI, | 315 | ath_print(common, ATH_DBG_WMI, |
diff --git a/drivers/net/wireless/ath/ath9k/wmi.h b/drivers/net/wireless/ath/ath9k/wmi.h index 39ef926f27c2..167e15c50062 100644 --- a/drivers/net/wireless/ath/ath9k/wmi.h +++ b/drivers/net/wireless/ath/ath9k/wmi.h | |||
@@ -19,7 +19,7 @@ | |||
19 | 19 | ||
20 | 20 | ||
21 | struct wmi_event_txrate { | 21 | struct wmi_event_txrate { |
22 | u32 txrate; | 22 | __be32 txrate; |
23 | struct { | 23 | struct { |
24 | u8 rssi_thresh; | 24 | u8 rssi_thresh; |
25 | u8 per; | 25 | u8 per; |
@@ -27,8 +27,8 @@ struct wmi_event_txrate { | |||
27 | } __packed; | 27 | } __packed; |
28 | 28 | ||
29 | struct wmi_cmd_hdr { | 29 | struct wmi_cmd_hdr { |
30 | u16 command_id; | 30 | __be16 command_id; |
31 | u16 seq_no; | 31 | __be16 seq_no; |
32 | } __packed; | 32 | } __packed; |
33 | 33 | ||
34 | struct wmi_swba { | 34 | struct wmi_swba { |
@@ -84,12 +84,20 @@ enum wmi_event_id { | |||
84 | WMI_TXRATE_EVENTID, | 84 | WMI_TXRATE_EVENTID, |
85 | }; | 85 | }; |
86 | 86 | ||
87 | #define MAX_CMD_NUMBER 62 | ||
88 | |||
89 | struct register_write { | ||
90 | __be32 reg; | ||
91 | __be32 val; | ||
92 | }; | ||
93 | |||
87 | struct wmi { | 94 | struct wmi { |
88 | struct ath9k_htc_priv *drv_priv; | 95 | struct ath9k_htc_priv *drv_priv; |
89 | struct htc_target *htc; | 96 | struct htc_target *htc; |
90 | enum htc_endpoint_id ctrl_epid; | 97 | enum htc_endpoint_id ctrl_epid; |
91 | struct mutex op_mutex; | 98 | struct mutex op_mutex; |
92 | struct completion cmd_wait; | 99 | struct completion cmd_wait; |
100 | enum wmi_cmd_id last_cmd_id; | ||
93 | u16 tx_seq_id; | 101 | u16 tx_seq_id; |
94 | u8 *cmd_rsp_buf; | 102 | u8 *cmd_rsp_buf; |
95 | u32 cmd_rsp_len; | 103 | u32 cmd_rsp_len; |
@@ -97,6 +105,11 @@ struct wmi { | |||
97 | 105 | ||
98 | struct sk_buff *wmi_skb; | 106 | struct sk_buff *wmi_skb; |
99 | spinlock_t wmi_lock; | 107 | spinlock_t wmi_lock; |
108 | |||
109 | atomic_t mwrite_cnt; | ||
110 | struct register_write multi_write[MAX_CMD_NUMBER]; | ||
111 | u32 multi_write_idx; | ||
112 | struct mutex multi_write_mutex; | ||
100 | }; | 113 | }; |
101 | 114 | ||
102 | struct wmi *ath9k_init_wmi(struct ath9k_htc_priv *priv); | 115 | struct wmi *ath9k_init_wmi(struct ath9k_htc_priv *priv); |
diff --git a/drivers/net/wireless/ath/ath9k/xmit.c b/drivers/net/wireless/ath/ath9k/xmit.c index 02df4cbf179f..b0d345a675fe 100644 --- a/drivers/net/wireless/ath/ath9k/xmit.c +++ b/drivers/net/wireless/ath/ath9k/xmit.c | |||
@@ -15,10 +15,11 @@ | |||
15 | */ | 15 | */ |
16 | 16 | ||
17 | #include "ath9k.h" | 17 | #include "ath9k.h" |
18 | #include "ar9003_mac.h" | ||
18 | 19 | ||
19 | #define BITS_PER_BYTE 8 | 20 | #define BITS_PER_BYTE 8 |
20 | #define OFDM_PLCP_BITS 22 | 21 | #define OFDM_PLCP_BITS 22 |
21 | #define HT_RC_2_MCS(_rc) ((_rc) & 0x0f) | 22 | #define HT_RC_2_MCS(_rc) ((_rc) & 0x1f) |
22 | #define HT_RC_2_STREAMS(_rc) ((((_rc) & 0x78) >> 3) + 1) | 23 | #define HT_RC_2_STREAMS(_rc) ((((_rc) & 0x78) >> 3) + 1) |
23 | #define L_STF 8 | 24 | #define L_STF 8 |
24 | #define L_LTF 8 | 25 | #define L_LTF 8 |
@@ -33,7 +34,7 @@ | |||
33 | 34 | ||
34 | #define OFDM_SIFS_TIME 16 | 35 | #define OFDM_SIFS_TIME 16 |
35 | 36 | ||
36 | static u32 bits_per_symbol[][2] = { | 37 | static u16 bits_per_symbol[][2] = { |
37 | /* 20MHz 40MHz */ | 38 | /* 20MHz 40MHz */ |
38 | { 26, 54 }, /* 0: BPSK */ | 39 | { 26, 54 }, /* 0: BPSK */ |
39 | { 52, 108 }, /* 1: QPSK 1/2 */ | 40 | { 52, 108 }, /* 1: QPSK 1/2 */ |
@@ -43,14 +44,6 @@ static u32 bits_per_symbol[][2] = { | |||
43 | { 208, 432 }, /* 5: 64-QAM 2/3 */ | 44 | { 208, 432 }, /* 5: 64-QAM 2/3 */ |
44 | { 234, 486 }, /* 6: 64-QAM 3/4 */ | 45 | { 234, 486 }, /* 6: 64-QAM 3/4 */ |
45 | { 260, 540 }, /* 7: 64-QAM 5/6 */ | 46 | { 260, 540 }, /* 7: 64-QAM 5/6 */ |
46 | { 52, 108 }, /* 8: BPSK */ | ||
47 | { 104, 216 }, /* 9: QPSK 1/2 */ | ||
48 | { 156, 324 }, /* 10: QPSK 3/4 */ | ||
49 | { 208, 432 }, /* 11: 16-QAM 1/2 */ | ||
50 | { 312, 648 }, /* 12: 16-QAM 3/4 */ | ||
51 | { 416, 864 }, /* 13: 64-QAM 2/3 */ | ||
52 | { 468, 972 }, /* 14: 64-QAM 3/4 */ | ||
53 | { 520, 1080 }, /* 15: 64-QAM 5/6 */ | ||
54 | }; | 47 | }; |
55 | 48 | ||
56 | #define IS_HT_RATE(_rate) ((_rate) & 0x80) | 49 | #define IS_HT_RATE(_rate) ((_rate) & 0x80) |
@@ -70,28 +63,39 @@ static void ath_tx_rc_status(struct ath_buf *bf, struct ath_tx_status *ts, | |||
70 | int nbad, int txok, bool update_rc); | 63 | int nbad, int txok, bool update_rc); |
71 | 64 | ||
72 | enum { | 65 | enum { |
73 | MCS_DEFAULT, | 66 | MCS_HT20, |
67 | MCS_HT20_SGI, | ||
74 | MCS_HT40, | 68 | MCS_HT40, |
75 | MCS_HT40_SGI, | 69 | MCS_HT40_SGI, |
76 | }; | 70 | }; |
77 | 71 | ||
78 | static int ath_max_4ms_framelen[3][16] = { | 72 | static int ath_max_4ms_framelen[4][32] = { |
79 | [MCS_DEFAULT] = { | 73 | [MCS_HT20] = { |
80 | 3216, 6434, 9650, 12868, 19304, 25740, 28956, 32180, | 74 | 3212, 6432, 9648, 12864, 19300, 25736, 28952, 32172, |
81 | 6430, 12860, 19300, 25736, 38600, 51472, 57890, 64320, | 75 | 6424, 12852, 19280, 25708, 38568, 51424, 57852, 64280, |
76 | 9628, 19260, 28896, 38528, 57792, 65532, 65532, 65532, | ||
77 | 12828, 25656, 38488, 51320, 65532, 65532, 65532, 65532, | ||
78 | }, | ||
79 | [MCS_HT20_SGI] = { | ||
80 | 3572, 7144, 10720, 14296, 21444, 28596, 32172, 35744, | ||
81 | 7140, 14284, 21428, 28568, 42856, 57144, 64288, 65532, | ||
82 | 10700, 21408, 32112, 42816, 64228, 65532, 65532, 65532, | ||
83 | 14256, 28516, 42780, 57040, 65532, 65532, 65532, 65532, | ||
82 | }, | 84 | }, |
83 | [MCS_HT40] = { | 85 | [MCS_HT40] = { |
84 | 6684, 13368, 20052, 26738, 40104, 53476, 60156, 66840, | 86 | 6680, 13360, 20044, 26724, 40092, 53456, 60140, 65532, |
85 | 13360, 26720, 40080, 53440, 80160, 106880, 120240, 133600, | 87 | 13348, 26700, 40052, 53400, 65532, 65532, 65532, 65532, |
88 | 20004, 40008, 60016, 65532, 65532, 65532, 65532, 65532, | ||
89 | 26644, 53292, 65532, 65532, 65532, 65532, 65532, 65532, | ||
86 | }, | 90 | }, |
87 | [MCS_HT40_SGI] = { | 91 | [MCS_HT40_SGI] = { |
88 | /* TODO: Only MCS 7 and 15 updated, recalculate the rest */ | 92 | 7420, 14844, 22272, 29696, 44544, 59396, 65532, 65532, |
89 | 6684, 13368, 20052, 26738, 40104, 53476, 60156, 74200, | 93 | 14832, 29668, 44504, 59340, 65532, 65532, 65532, 65532, |
90 | 13360, 26720, 40080, 53440, 80160, 106880, 120240, 148400, | 94 | 22232, 44464, 65532, 65532, 65532, 65532, 65532, 65532, |
95 | 29616, 59232, 65532, 65532, 65532, 65532, 65532, 65532, | ||
91 | } | 96 | } |
92 | }; | 97 | }; |
93 | 98 | ||
94 | |||
95 | /*********************/ | 99 | /*********************/ |
96 | /* Aggregation logic */ | 100 | /* Aggregation logic */ |
97 | /*********************/ | 101 | /*********************/ |
@@ -261,25 +265,46 @@ static void ath_tx_set_retry(struct ath_softc *sc, struct ath_txq *txq, | |||
261 | hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_RETRY); | 265 | hdr->frame_control |= cpu_to_le16(IEEE80211_FCTL_RETRY); |
262 | } | 266 | } |
263 | 267 | ||
264 | static struct ath_buf* ath_clone_txbuf(struct ath_softc *sc, struct ath_buf *bf) | 268 | static struct ath_buf *ath_tx_get_buffer(struct ath_softc *sc) |
265 | { | 269 | { |
266 | struct ath_buf *tbf; | 270 | struct ath_buf *bf = NULL; |
267 | 271 | ||
268 | spin_lock_bh(&sc->tx.txbuflock); | 272 | spin_lock_bh(&sc->tx.txbuflock); |
269 | if (WARN_ON(list_empty(&sc->tx.txbuf))) { | 273 | |
274 | if (unlikely(list_empty(&sc->tx.txbuf))) { | ||
270 | spin_unlock_bh(&sc->tx.txbuflock); | 275 | spin_unlock_bh(&sc->tx.txbuflock); |
271 | return NULL; | 276 | return NULL; |
272 | } | 277 | } |
273 | tbf = list_first_entry(&sc->tx.txbuf, struct ath_buf, list); | 278 | |
274 | list_del(&tbf->list); | 279 | bf = list_first_entry(&sc->tx.txbuf, struct ath_buf, list); |
280 | list_del(&bf->list); | ||
281 | |||
275 | spin_unlock_bh(&sc->tx.txbuflock); | 282 | spin_unlock_bh(&sc->tx.txbuflock); |
276 | 283 | ||
284 | return bf; | ||
285 | } | ||
286 | |||
287 | static void ath_tx_return_buffer(struct ath_softc *sc, struct ath_buf *bf) | ||
288 | { | ||
289 | spin_lock_bh(&sc->tx.txbuflock); | ||
290 | list_add_tail(&bf->list, &sc->tx.txbuf); | ||
291 | spin_unlock_bh(&sc->tx.txbuflock); | ||
292 | } | ||
293 | |||
294 | static struct ath_buf* ath_clone_txbuf(struct ath_softc *sc, struct ath_buf *bf) | ||
295 | { | ||
296 | struct ath_buf *tbf; | ||
297 | |||
298 | tbf = ath_tx_get_buffer(sc); | ||
299 | if (WARN_ON(!tbf)) | ||
300 | return NULL; | ||
301 | |||
277 | ATH_TXBUF_RESET(tbf); | 302 | ATH_TXBUF_RESET(tbf); |
278 | 303 | ||
279 | tbf->aphy = bf->aphy; | 304 | tbf->aphy = bf->aphy; |
280 | tbf->bf_mpdu = bf->bf_mpdu; | 305 | tbf->bf_mpdu = bf->bf_mpdu; |
281 | tbf->bf_buf_addr = bf->bf_buf_addr; | 306 | tbf->bf_buf_addr = bf->bf_buf_addr; |
282 | *(tbf->bf_desc) = *(bf->bf_desc); | 307 | memcpy(tbf->bf_desc, bf->bf_desc, sc->sc_ah->caps.tx_desc_len); |
283 | tbf->bf_state = bf->bf_state; | 308 | tbf->bf_state = bf->bf_state; |
284 | tbf->bf_dmacontext = bf->bf_dmacontext; | 309 | tbf->bf_dmacontext = bf->bf_dmacontext; |
285 | 310 | ||
@@ -359,7 +384,7 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq, | |||
359 | acked_cnt++; | 384 | acked_cnt++; |
360 | } else { | 385 | } else { |
361 | if (!(tid->state & AGGR_CLEANUP) && | 386 | if (!(tid->state & AGGR_CLEANUP) && |
362 | ts->ts_flags != ATH9K_TX_SW_ABORTED) { | 387 | !bf_last->bf_tx_aborted) { |
363 | if (bf->bf_retries < ATH_MAX_SW_RETRIES) { | 388 | if (bf->bf_retries < ATH_MAX_SW_RETRIES) { |
364 | ath_tx_set_retry(sc, txq, bf); | 389 | ath_tx_set_retry(sc, txq, bf); |
365 | txpending = 1; | 390 | txpending = 1; |
@@ -378,7 +403,8 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq, | |||
378 | } | 403 | } |
379 | } | 404 | } |
380 | 405 | ||
381 | if (bf_next == NULL) { | 406 | if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) && |
407 | bf_next == NULL) { | ||
382 | /* | 408 | /* |
383 | * Make sure the last desc is reclaimed if it | 409 | * Make sure the last desc is reclaimed if it |
384 | * not a holding desc. | 410 | * not a holding desc. |
@@ -412,36 +438,43 @@ static void ath_tx_complete_aggr(struct ath_softc *sc, struct ath_txq *txq, | |||
412 | !txfail, sendbar); | 438 | !txfail, sendbar); |
413 | } else { | 439 | } else { |
414 | /* retry the un-acked ones */ | 440 | /* retry the un-acked ones */ |
415 | if (bf->bf_next == NULL && bf_last->bf_stale) { | 441 | if (!(sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA)) { |
416 | struct ath_buf *tbf; | 442 | if (bf->bf_next == NULL && bf_last->bf_stale) { |
417 | 443 | struct ath_buf *tbf; | |
418 | tbf = ath_clone_txbuf(sc, bf_last); | 444 | |
419 | /* | 445 | tbf = ath_clone_txbuf(sc, bf_last); |
420 | * Update tx baw and complete the frame with | 446 | /* |
421 | * failed status if we run out of tx buf | 447 | * Update tx baw and complete the |
422 | */ | 448 | * frame with failed status if we |
423 | if (!tbf) { | 449 | * run out of tx buf. |
424 | spin_lock_bh(&txq->axq_lock); | 450 | */ |
425 | ath_tx_update_baw(sc, tid, | 451 | if (!tbf) { |
426 | bf->bf_seqno); | 452 | spin_lock_bh(&txq->axq_lock); |
427 | spin_unlock_bh(&txq->axq_lock); | 453 | ath_tx_update_baw(sc, tid, |
428 | 454 | bf->bf_seqno); | |
429 | bf->bf_state.bf_type |= BUF_XRETRY; | 455 | spin_unlock_bh(&txq->axq_lock); |
430 | ath_tx_rc_status(bf, ts, nbad, | 456 | |
431 | 0, false); | 457 | bf->bf_state.bf_type |= |
432 | ath_tx_complete_buf(sc, bf, txq, | 458 | BUF_XRETRY; |
433 | &bf_head, ts, 0, 0); | 459 | ath_tx_rc_status(bf, ts, nbad, |
434 | break; | 460 | 0, false); |
461 | ath_tx_complete_buf(sc, bf, txq, | ||
462 | &bf_head, | ||
463 | ts, 0, 0); | ||
464 | break; | ||
465 | } | ||
466 | |||
467 | ath9k_hw_cleartxdesc(sc->sc_ah, | ||
468 | tbf->bf_desc); | ||
469 | list_add_tail(&tbf->list, &bf_head); | ||
470 | } else { | ||
471 | /* | ||
472 | * Clear descriptor status words for | ||
473 | * software retry | ||
474 | */ | ||
475 | ath9k_hw_cleartxdesc(sc->sc_ah, | ||
476 | bf->bf_desc); | ||
435 | } | 477 | } |
436 | |||
437 | ath9k_hw_cleartxdesc(sc->sc_ah, tbf->bf_desc); | ||
438 | list_add_tail(&tbf->list, &bf_head); | ||
439 | } else { | ||
440 | /* | ||
441 | * Clear descriptor status words for | ||
442 | * software retry | ||
443 | */ | ||
444 | ath9k_hw_cleartxdesc(sc->sc_ah, bf->bf_desc); | ||
445 | } | 478 | } |
446 | 479 | ||
447 | /* | 480 | /* |
@@ -509,12 +542,13 @@ static u32 ath_lookup_rate(struct ath_softc *sc, struct ath_buf *bf, | |||
509 | break; | 542 | break; |
510 | } | 543 | } |
511 | 544 | ||
512 | if (rates[i].flags & IEEE80211_TX_RC_SHORT_GI) | 545 | if (rates[i].flags & IEEE80211_TX_RC_40_MHZ_WIDTH) |
513 | modeidx = MCS_HT40_SGI; | ||
514 | else if (rates[i].flags & IEEE80211_TX_RC_40_MHZ_WIDTH) | ||
515 | modeidx = MCS_HT40; | 546 | modeidx = MCS_HT40; |
516 | else | 547 | else |
517 | modeidx = MCS_DEFAULT; | 548 | modeidx = MCS_HT20; |
549 | |||
550 | if (rates[i].flags & IEEE80211_TX_RC_SHORT_GI) | ||
551 | modeidx++; | ||
518 | 552 | ||
519 | frmlen = ath_max_4ms_framelen[modeidx][rates[i].idx]; | 553 | frmlen = ath_max_4ms_framelen[modeidx][rates[i].idx]; |
520 | max_4ms_framelen = min(max_4ms_framelen, frmlen); | 554 | max_4ms_framelen = min(max_4ms_framelen, frmlen); |
@@ -559,7 +593,7 @@ static int ath_compute_num_delims(struct ath_softc *sc, struct ath_atx_tid *tid, | |||
559 | u32 nsymbits, nsymbols; | 593 | u32 nsymbits, nsymbols; |
560 | u16 minlen; | 594 | u16 minlen; |
561 | u8 flags, rix; | 595 | u8 flags, rix; |
562 | int width, half_gi, ndelim, mindelim; | 596 | int width, streams, half_gi, ndelim, mindelim; |
563 | 597 | ||
564 | /* Select standard number of delimiters based on frame length alone */ | 598 | /* Select standard number of delimiters based on frame length alone */ |
565 | ndelim = ATH_AGGR_GET_NDELIM(frmlen); | 599 | ndelim = ATH_AGGR_GET_NDELIM(frmlen); |
@@ -599,7 +633,8 @@ static int ath_compute_num_delims(struct ath_softc *sc, struct ath_atx_tid *tid, | |||
599 | if (nsymbols == 0) | 633 | if (nsymbols == 0) |
600 | nsymbols = 1; | 634 | nsymbols = 1; |
601 | 635 | ||
602 | nsymbits = bits_per_symbol[rix][width]; | 636 | streams = HT_RC_2_STREAMS(rix); |
637 | nsymbits = bits_per_symbol[rix % 8][width] * streams; | ||
603 | minlen = (nsymbols * nsymbits) / BITS_PER_BYTE; | 638 | minlen = (nsymbols * nsymbits) / BITS_PER_BYTE; |
604 | 639 | ||
605 | if (frmlen < minlen) { | 640 | if (frmlen < minlen) { |
@@ -665,7 +700,7 @@ static enum ATH_AGGR_STATUS ath_tx_form_aggr(struct ath_softc *sc, | |||
665 | bpad = PADBYTES(al_delta) + (ndelim << 2); | 700 | bpad = PADBYTES(al_delta) + (ndelim << 2); |
666 | 701 | ||
667 | bf->bf_next = NULL; | 702 | bf->bf_next = NULL; |
668 | bf->bf_desc->ds_link = 0; | 703 | ath9k_hw_set_desc_link(sc->sc_ah, bf->bf_desc, 0); |
669 | 704 | ||
670 | /* link buffers of this frame to the aggregate */ | 705 | /* link buffers of this frame to the aggregate */ |
671 | ath_tx_addto_baw(sc, tid, bf); | 706 | ath_tx_addto_baw(sc, tid, bf); |
@@ -673,7 +708,8 @@ static enum ATH_AGGR_STATUS ath_tx_form_aggr(struct ath_softc *sc, | |||
673 | list_move_tail(&bf->list, bf_q); | 708 | list_move_tail(&bf->list, bf_q); |
674 | if (bf_prev) { | 709 | if (bf_prev) { |
675 | bf_prev->bf_next = bf; | 710 | bf_prev->bf_next = bf; |
676 | bf_prev->bf_desc->ds_link = bf->bf_daddr; | 711 | ath9k_hw_set_desc_link(sc->sc_ah, bf_prev->bf_desc, |
712 | bf->bf_daddr); | ||
677 | } | 713 | } |
678 | bf_prev = bf; | 714 | bf_prev = bf; |
679 | 715 | ||
@@ -853,7 +889,7 @@ struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype) | |||
853 | struct ath_hw *ah = sc->sc_ah; | 889 | struct ath_hw *ah = sc->sc_ah; |
854 | struct ath_common *common = ath9k_hw_common(ah); | 890 | struct ath_common *common = ath9k_hw_common(ah); |
855 | struct ath9k_tx_queue_info qi; | 891 | struct ath9k_tx_queue_info qi; |
856 | int qnum; | 892 | int qnum, i; |
857 | 893 | ||
858 | memset(&qi, 0, sizeof(qi)); | 894 | memset(&qi, 0, sizeof(qi)); |
859 | qi.tqi_subtype = subtype; | 895 | qi.tqi_subtype = subtype; |
@@ -877,11 +913,16 @@ struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype) | |||
877 | * The UAPSD queue is an exception, since we take a desc- | 913 | * The UAPSD queue is an exception, since we take a desc- |
878 | * based intr on the EOSP frames. | 914 | * based intr on the EOSP frames. |
879 | */ | 915 | */ |
880 | if (qtype == ATH9K_TX_QUEUE_UAPSD) | 916 | if (ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { |
881 | qi.tqi_qflags = TXQ_FLAG_TXDESCINT_ENABLE; | 917 | qi.tqi_qflags = TXQ_FLAG_TXOKINT_ENABLE | |
882 | else | 918 | TXQ_FLAG_TXERRINT_ENABLE; |
883 | qi.tqi_qflags = TXQ_FLAG_TXEOLINT_ENABLE | | 919 | } else { |
884 | TXQ_FLAG_TXDESCINT_ENABLE; | 920 | if (qtype == ATH9K_TX_QUEUE_UAPSD) |
921 | qi.tqi_qflags = TXQ_FLAG_TXDESCINT_ENABLE; | ||
922 | else | ||
923 | qi.tqi_qflags = TXQ_FLAG_TXEOLINT_ENABLE | | ||
924 | TXQ_FLAG_TXDESCINT_ENABLE; | ||
925 | } | ||
885 | qnum = ath9k_hw_setuptxqueue(ah, qtype, &qi); | 926 | qnum = ath9k_hw_setuptxqueue(ah, qtype, &qi); |
886 | if (qnum == -1) { | 927 | if (qnum == -1) { |
887 | /* | 928 | /* |
@@ -908,6 +949,11 @@ struct ath_txq *ath_txq_setup(struct ath_softc *sc, int qtype, int subtype) | |||
908 | txq->axq_depth = 0; | 949 | txq->axq_depth = 0; |
909 | txq->axq_tx_inprogress = false; | 950 | txq->axq_tx_inprogress = false; |
910 | sc->tx.txqsetup |= 1<<qnum; | 951 | sc->tx.txqsetup |= 1<<qnum; |
952 | |||
953 | txq->txq_headidx = txq->txq_tailidx = 0; | ||
954 | for (i = 0; i < ATH_TXFIFO_DEPTH; i++) | ||
955 | INIT_LIST_HEAD(&txq->txq_fifo[i]); | ||
956 | INIT_LIST_HEAD(&txq->txq_fifo_pending); | ||
911 | } | 957 | } |
912 | return &sc->tx.txq[qnum]; | 958 | return &sc->tx.txq[qnum]; |
913 | } | 959 | } |
@@ -1035,36 +1081,52 @@ void ath_draintxq(struct ath_softc *sc, struct ath_txq *txq, bool retry_tx) | |||
1035 | struct ath_tx_status ts; | 1081 | struct ath_tx_status ts; |
1036 | 1082 | ||
1037 | memset(&ts, 0, sizeof(ts)); | 1083 | memset(&ts, 0, sizeof(ts)); |
1038 | if (!retry_tx) | ||
1039 | ts.ts_flags = ATH9K_TX_SW_ABORTED; | ||
1040 | |||
1041 | INIT_LIST_HEAD(&bf_head); | 1084 | INIT_LIST_HEAD(&bf_head); |
1042 | 1085 | ||
1043 | for (;;) { | 1086 | for (;;) { |
1044 | spin_lock_bh(&txq->axq_lock); | 1087 | spin_lock_bh(&txq->axq_lock); |
1045 | 1088 | ||
1046 | if (list_empty(&txq->axq_q)) { | 1089 | if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { |
1047 | txq->axq_link = NULL; | 1090 | if (list_empty(&txq->txq_fifo[txq->txq_tailidx])) { |
1048 | spin_unlock_bh(&txq->axq_lock); | 1091 | txq->txq_headidx = txq->txq_tailidx = 0; |
1049 | break; | 1092 | spin_unlock_bh(&txq->axq_lock); |
1050 | } | 1093 | break; |
1051 | 1094 | } else { | |
1052 | bf = list_first_entry(&txq->axq_q, struct ath_buf, list); | 1095 | bf = list_first_entry(&txq->txq_fifo[txq->txq_tailidx], |
1096 | struct ath_buf, list); | ||
1097 | } | ||
1098 | } else { | ||
1099 | if (list_empty(&txq->axq_q)) { | ||
1100 | txq->axq_link = NULL; | ||
1101 | spin_unlock_bh(&txq->axq_lock); | ||
1102 | break; | ||
1103 | } | ||
1104 | bf = list_first_entry(&txq->axq_q, struct ath_buf, | ||
1105 | list); | ||
1053 | 1106 | ||
1054 | if (bf->bf_stale) { | 1107 | if (bf->bf_stale) { |
1055 | list_del(&bf->list); | 1108 | list_del(&bf->list); |
1056 | spin_unlock_bh(&txq->axq_lock); | 1109 | spin_unlock_bh(&txq->axq_lock); |
1057 | 1110 | ||
1058 | spin_lock_bh(&sc->tx.txbuflock); | 1111 | ath_tx_return_buffer(sc, bf); |
1059 | list_add_tail(&bf->list, &sc->tx.txbuf); | 1112 | continue; |
1060 | spin_unlock_bh(&sc->tx.txbuflock); | 1113 | } |
1061 | continue; | ||
1062 | } | 1114 | } |
1063 | 1115 | ||
1064 | lastbf = bf->bf_lastbf; | 1116 | lastbf = bf->bf_lastbf; |
1117 | if (!retry_tx) | ||
1118 | lastbf->bf_tx_aborted = true; | ||
1119 | |||
1120 | if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { | ||
1121 | list_cut_position(&bf_head, | ||
1122 | &txq->txq_fifo[txq->txq_tailidx], | ||
1123 | &lastbf->list); | ||
1124 | INCR(txq->txq_tailidx, ATH_TXFIFO_DEPTH); | ||
1125 | } else { | ||
1126 | /* remove ath_buf's of the same mpdu from txq */ | ||
1127 | list_cut_position(&bf_head, &txq->axq_q, &lastbf->list); | ||
1128 | } | ||
1065 | 1129 | ||
1066 | /* remove ath_buf's of the same mpdu from txq */ | ||
1067 | list_cut_position(&bf_head, &txq->axq_q, &lastbf->list); | ||
1068 | txq->axq_depth--; | 1130 | txq->axq_depth--; |
1069 | 1131 | ||
1070 | spin_unlock_bh(&txq->axq_lock); | 1132 | spin_unlock_bh(&txq->axq_lock); |
@@ -1087,6 +1149,27 @@ void ath_draintxq(struct ath_softc *sc, struct ath_txq *txq, bool retry_tx) | |||
1087 | spin_unlock_bh(&txq->axq_lock); | 1149 | spin_unlock_bh(&txq->axq_lock); |
1088 | } | 1150 | } |
1089 | } | 1151 | } |
1152 | |||
1153 | if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { | ||
1154 | spin_lock_bh(&txq->axq_lock); | ||
1155 | while (!list_empty(&txq->txq_fifo_pending)) { | ||
1156 | bf = list_first_entry(&txq->txq_fifo_pending, | ||
1157 | struct ath_buf, list); | ||
1158 | list_cut_position(&bf_head, | ||
1159 | &txq->txq_fifo_pending, | ||
1160 | &bf->bf_lastbf->list); | ||
1161 | spin_unlock_bh(&txq->axq_lock); | ||
1162 | |||
1163 | if (bf_isampdu(bf)) | ||
1164 | ath_tx_complete_aggr(sc, txq, bf, &bf_head, | ||
1165 | &ts, 0); | ||
1166 | else | ||
1167 | ath_tx_complete_buf(sc, bf, txq, &bf_head, | ||
1168 | &ts, 0, 0); | ||
1169 | spin_lock_bh(&txq->axq_lock); | ||
1170 | } | ||
1171 | spin_unlock_bh(&txq->axq_lock); | ||
1172 | } | ||
1090 | } | 1173 | } |
1091 | 1174 | ||
1092 | void ath_drain_all_txq(struct ath_softc *sc, bool retry_tx) | 1175 | void ath_drain_all_txq(struct ath_softc *sc, bool retry_tx) |
@@ -1224,44 +1307,47 @@ static void ath_tx_txqaddbuf(struct ath_softc *sc, struct ath_txq *txq, | |||
1224 | 1307 | ||
1225 | bf = list_first_entry(head, struct ath_buf, list); | 1308 | bf = list_first_entry(head, struct ath_buf, list); |
1226 | 1309 | ||
1227 | list_splice_tail_init(head, &txq->axq_q); | ||
1228 | txq->axq_depth++; | ||
1229 | |||
1230 | ath_print(common, ATH_DBG_QUEUE, | 1310 | ath_print(common, ATH_DBG_QUEUE, |
1231 | "qnum: %d, txq depth: %d\n", txq->axq_qnum, txq->axq_depth); | 1311 | "qnum: %d, txq depth: %d\n", txq->axq_qnum, txq->axq_depth); |
1232 | 1312 | ||
1233 | if (txq->axq_link == NULL) { | 1313 | if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { |
1314 | if (txq->axq_depth >= ATH_TXFIFO_DEPTH) { | ||
1315 | list_splice_tail_init(head, &txq->txq_fifo_pending); | ||
1316 | return; | ||
1317 | } | ||
1318 | if (!list_empty(&txq->txq_fifo[txq->txq_headidx])) | ||
1319 | ath_print(common, ATH_DBG_XMIT, | ||
1320 | "Initializing tx fifo %d which " | ||
1321 | "is non-empty\n", | ||
1322 | txq->txq_headidx); | ||
1323 | INIT_LIST_HEAD(&txq->txq_fifo[txq->txq_headidx]); | ||
1324 | list_splice_init(head, &txq->txq_fifo[txq->txq_headidx]); | ||
1325 | INCR(txq->txq_headidx, ATH_TXFIFO_DEPTH); | ||
1234 | ath9k_hw_puttxbuf(ah, txq->axq_qnum, bf->bf_daddr); | 1326 | ath9k_hw_puttxbuf(ah, txq->axq_qnum, bf->bf_daddr); |
1235 | ath_print(common, ATH_DBG_XMIT, | 1327 | ath_print(common, ATH_DBG_XMIT, |
1236 | "TXDP[%u] = %llx (%p)\n", | 1328 | "TXDP[%u] = %llx (%p)\n", |
1237 | txq->axq_qnum, ito64(bf->bf_daddr), bf->bf_desc); | 1329 | txq->axq_qnum, ito64(bf->bf_daddr), bf->bf_desc); |
1238 | } else { | 1330 | } else { |
1239 | *txq->axq_link = bf->bf_daddr; | 1331 | list_splice_tail_init(head, &txq->axq_q); |
1240 | ath_print(common, ATH_DBG_XMIT, "link[%u] (%p)=%llx (%p)\n", | ||
1241 | txq->axq_qnum, txq->axq_link, | ||
1242 | ito64(bf->bf_daddr), bf->bf_desc); | ||
1243 | } | ||
1244 | txq->axq_link = &(bf->bf_lastbf->bf_desc->ds_link); | ||
1245 | ath9k_hw_txstart(ah, txq->axq_qnum); | ||
1246 | } | ||
1247 | 1332 | ||
1248 | static struct ath_buf *ath_tx_get_buffer(struct ath_softc *sc) | 1333 | if (txq->axq_link == NULL) { |
1249 | { | 1334 | ath9k_hw_puttxbuf(ah, txq->axq_qnum, bf->bf_daddr); |
1250 | struct ath_buf *bf = NULL; | 1335 | ath_print(common, ATH_DBG_XMIT, |
1251 | 1336 | "TXDP[%u] = %llx (%p)\n", | |
1252 | spin_lock_bh(&sc->tx.txbuflock); | 1337 | txq->axq_qnum, ito64(bf->bf_daddr), |
1253 | 1338 | bf->bf_desc); | |
1254 | if (unlikely(list_empty(&sc->tx.txbuf))) { | 1339 | } else { |
1255 | spin_unlock_bh(&sc->tx.txbuflock); | 1340 | *txq->axq_link = bf->bf_daddr; |
1256 | return NULL; | 1341 | ath_print(common, ATH_DBG_XMIT, |
1342 | "link[%u] (%p)=%llx (%p)\n", | ||
1343 | txq->axq_qnum, txq->axq_link, | ||
1344 | ito64(bf->bf_daddr), bf->bf_desc); | ||
1345 | } | ||
1346 | ath9k_hw_get_desc_link(ah, bf->bf_lastbf->bf_desc, | ||
1347 | &txq->axq_link); | ||
1348 | ath9k_hw_txstart(ah, txq->axq_qnum); | ||
1257 | } | 1349 | } |
1258 | 1350 | txq->axq_depth++; | |
1259 | bf = list_first_entry(&sc->tx.txbuf, struct ath_buf, list); | ||
1260 | list_del(&bf->list); | ||
1261 | |||
1262 | spin_unlock_bh(&sc->tx.txbuflock); | ||
1263 | |||
1264 | return bf; | ||
1265 | } | 1351 | } |
1266 | 1352 | ||
1267 | static void ath_tx_send_ampdu(struct ath_softc *sc, struct ath_atx_tid *tid, | 1353 | static void ath_tx_send_ampdu(struct ath_softc *sc, struct ath_atx_tid *tid, |
@@ -1408,8 +1494,7 @@ static void assign_aggr_tid_seqno(struct sk_buff *skb, | |||
1408 | INCR(tid->seq_next, IEEE80211_SEQ_MAX); | 1494 | INCR(tid->seq_next, IEEE80211_SEQ_MAX); |
1409 | } | 1495 | } |
1410 | 1496 | ||
1411 | static int setup_tx_flags(struct ath_softc *sc, struct sk_buff *skb, | 1497 | static int setup_tx_flags(struct sk_buff *skb, bool use_ldpc) |
1412 | struct ath_txq *txq) | ||
1413 | { | 1498 | { |
1414 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); | 1499 | struct ieee80211_tx_info *tx_info = IEEE80211_SKB_CB(skb); |
1415 | int flags = 0; | 1500 | int flags = 0; |
@@ -1420,6 +1505,9 @@ static int setup_tx_flags(struct ath_softc *sc, struct sk_buff *skb, | |||
1420 | if (tx_info->flags & IEEE80211_TX_CTL_NO_ACK) | 1505 | if (tx_info->flags & IEEE80211_TX_CTL_NO_ACK) |
1421 | flags |= ATH9K_TXDESC_NOACK; | 1506 | flags |= ATH9K_TXDESC_NOACK; |
1422 | 1507 | ||
1508 | if (use_ldpc) | ||
1509 | flags |= ATH9K_TXDESC_LDPC; | ||
1510 | |||
1423 | return flags; | 1511 | return flags; |
1424 | } | 1512 | } |
1425 | 1513 | ||
@@ -1438,8 +1526,9 @@ static u32 ath_pkt_duration(struct ath_softc *sc, u8 rix, struct ath_buf *bf, | |||
1438 | pktlen = bf_isaggr(bf) ? bf->bf_al : bf->bf_frmlen; | 1526 | pktlen = bf_isaggr(bf) ? bf->bf_al : bf->bf_frmlen; |
1439 | 1527 | ||
1440 | /* find number of symbols: PLCP + data */ | 1528 | /* find number of symbols: PLCP + data */ |
1529 | streams = HT_RC_2_STREAMS(rix); | ||
1441 | nbits = (pktlen << 3) + OFDM_PLCP_BITS; | 1530 | nbits = (pktlen << 3) + OFDM_PLCP_BITS; |
1442 | nsymbits = bits_per_symbol[rix][width]; | 1531 | nsymbits = bits_per_symbol[rix % 8][width] * streams; |
1443 | nsymbols = (nbits + nsymbits - 1) / nsymbits; | 1532 | nsymbols = (nbits + nsymbits - 1) / nsymbits; |
1444 | 1533 | ||
1445 | if (!half_gi) | 1534 | if (!half_gi) |
@@ -1448,7 +1537,6 @@ static u32 ath_pkt_duration(struct ath_softc *sc, u8 rix, struct ath_buf *bf, | |||
1448 | duration = SYMBOL_TIME_HALFGI(nsymbols); | 1537 | duration = SYMBOL_TIME_HALFGI(nsymbols); |
1449 | 1538 | ||
1450 | /* addup duration for legacy/ht training and signal fields */ | 1539 | /* addup duration for legacy/ht training and signal fields */ |
1451 | streams = HT_RC_2_STREAMS(rix); | ||
1452 | duration += L_STF + L_LTF + L_SIG + HT_SIG + HT_STF + HT_LTF(streams); | 1540 | duration += L_STF + L_LTF + L_SIG + HT_SIG + HT_STF + HT_LTF(streams); |
1453 | 1541 | ||
1454 | return duration; | 1542 | return duration; |
@@ -1519,6 +1607,8 @@ static void ath_buf_set_rate(struct ath_softc *sc, struct ath_buf *bf) | |||
1519 | series[i].Rate = rix | 0x80; | 1607 | series[i].Rate = rix | 0x80; |
1520 | series[i].PktDuration = ath_pkt_duration(sc, rix, bf, | 1608 | series[i].PktDuration = ath_pkt_duration(sc, rix, bf, |
1521 | is_40, is_sgi, is_sp); | 1609 | is_40, is_sgi, is_sp); |
1610 | if (rix < 8 && (tx_info->flags & IEEE80211_TX_CTL_STBC)) | ||
1611 | series[i].RateFlags |= ATH9K_RATESERIES_STBC; | ||
1522 | continue; | 1612 | continue; |
1523 | } | 1613 | } |
1524 | 1614 | ||
@@ -1571,6 +1661,7 @@ static int ath_tx_setup_buffer(struct ieee80211_hw *hw, struct ath_buf *bf, | |||
1571 | int hdrlen; | 1661 | int hdrlen; |
1572 | __le16 fc; | 1662 | __le16 fc; |
1573 | int padpos, padsize; | 1663 | int padpos, padsize; |
1664 | bool use_ldpc = false; | ||
1574 | 1665 | ||
1575 | tx_info->pad[0] = 0; | 1666 | tx_info->pad[0] = 0; |
1576 | switch (txctl->frame_type) { | 1667 | switch (txctl->frame_type) { |
@@ -1597,10 +1688,13 @@ static int ath_tx_setup_buffer(struct ieee80211_hw *hw, struct ath_buf *bf, | |||
1597 | bf->bf_frmlen -= padsize; | 1688 | bf->bf_frmlen -= padsize; |
1598 | } | 1689 | } |
1599 | 1690 | ||
1600 | if (conf_is_ht(&hw->conf)) | 1691 | if (conf_is_ht(&hw->conf)) { |
1601 | bf->bf_state.bf_type |= BUF_HT; | 1692 | bf->bf_state.bf_type |= BUF_HT; |
1693 | if (tx_info->flags & IEEE80211_TX_CTL_LDPC) | ||
1694 | use_ldpc = true; | ||
1695 | } | ||
1602 | 1696 | ||
1603 | bf->bf_flags = setup_tx_flags(sc, skb, txctl->txq); | 1697 | bf->bf_flags = setup_tx_flags(skb, use_ldpc); |
1604 | 1698 | ||
1605 | bf->bf_keytype = get_hw_crypto_keytype(skb); | 1699 | bf->bf_keytype = get_hw_crypto_keytype(skb); |
1606 | if (bf->bf_keytype != ATH9K_KEY_TYPE_CLEAR) { | 1700 | if (bf->bf_keytype != ATH9K_KEY_TYPE_CLEAR) { |
@@ -1659,8 +1753,7 @@ static void ath_tx_start_dma(struct ath_softc *sc, struct ath_buf *bf, | |||
1659 | list_add_tail(&bf->list, &bf_head); | 1753 | list_add_tail(&bf->list, &bf_head); |
1660 | 1754 | ||
1661 | ds = bf->bf_desc; | 1755 | ds = bf->bf_desc; |
1662 | ds->ds_link = 0; | 1756 | ath9k_hw_set_desc_link(ah, ds, 0); |
1663 | ds->ds_data = bf->bf_buf_addr; | ||
1664 | 1757 | ||
1665 | ath9k_hw_set11n_txdesc(ah, ds, bf->bf_frmlen, frm_type, MAX_RATE_POWER, | 1758 | ath9k_hw_set11n_txdesc(ah, ds, bf->bf_frmlen, frm_type, MAX_RATE_POWER, |
1666 | bf->bf_keyix, bf->bf_keytype, bf->bf_flags); | 1759 | bf->bf_keyix, bf->bf_keytype, bf->bf_flags); |
@@ -1669,7 +1762,9 @@ static void ath_tx_start_dma(struct ath_softc *sc, struct ath_buf *bf, | |||
1669 | skb->len, /* segment length */ | 1762 | skb->len, /* segment length */ |
1670 | true, /* first segment */ | 1763 | true, /* first segment */ |
1671 | true, /* last segment */ | 1764 | true, /* last segment */ |
1672 | ds); /* first descriptor */ | 1765 | ds, /* first descriptor */ |
1766 | bf->bf_buf_addr, | ||
1767 | txctl->txq->axq_qnum); | ||
1673 | 1768 | ||
1674 | spin_lock_bh(&txctl->txq->axq_lock); | 1769 | spin_lock_bh(&txctl->txq->axq_lock); |
1675 | 1770 | ||
@@ -1738,9 +1833,7 @@ int ath_tx_start(struct ieee80211_hw *hw, struct sk_buff *skb, | |||
1738 | } | 1833 | } |
1739 | spin_unlock_bh(&txq->axq_lock); | 1834 | spin_unlock_bh(&txq->axq_lock); |
1740 | 1835 | ||
1741 | spin_lock_bh(&sc->tx.txbuflock); | 1836 | ath_tx_return_buffer(sc, bf); |
1742 | list_add_tail(&bf->list, &sc->tx.txbuf); | ||
1743 | spin_unlock_bh(&sc->tx.txbuflock); | ||
1744 | 1837 | ||
1745 | return r; | 1838 | return r; |
1746 | } | 1839 | } |
@@ -1896,7 +1989,7 @@ static int ath_tx_num_badfrms(struct ath_softc *sc, struct ath_buf *bf, | |||
1896 | int nbad = 0; | 1989 | int nbad = 0; |
1897 | int isaggr = 0; | 1990 | int isaggr = 0; |
1898 | 1991 | ||
1899 | if (ts->ts_flags == ATH9K_TX_SW_ABORTED) | 1992 | if (bf->bf_tx_aborted) |
1900 | return 0; | 1993 | return 0; |
1901 | 1994 | ||
1902 | isaggr = bf_isaggr(bf); | 1995 | isaggr = bf_isaggr(bf); |
@@ -2054,13 +2147,12 @@ static void ath_tx_processq(struct ath_softc *sc, struct ath_txq *txq) | |||
2054 | txq->axq_depth--; | 2147 | txq->axq_depth--; |
2055 | txok = !(ts.ts_status & ATH9K_TXERR_MASK); | 2148 | txok = !(ts.ts_status & ATH9K_TXERR_MASK); |
2056 | txq->axq_tx_inprogress = false; | 2149 | txq->axq_tx_inprogress = false; |
2150 | if (bf_held) | ||
2151 | list_del(&bf_held->list); | ||
2057 | spin_unlock_bh(&txq->axq_lock); | 2152 | spin_unlock_bh(&txq->axq_lock); |
2058 | 2153 | ||
2059 | if (bf_held) { | 2154 | if (bf_held) |
2060 | spin_lock_bh(&sc->tx.txbuflock); | 2155 | ath_tx_return_buffer(sc, bf_held); |
2061 | list_move_tail(&bf_held->list, &sc->tx.txbuf); | ||
2062 | spin_unlock_bh(&sc->tx.txbuflock); | ||
2063 | } | ||
2064 | 2156 | ||
2065 | if (!bf_isampdu(bf)) { | 2157 | if (!bf_isampdu(bf)) { |
2066 | /* | 2158 | /* |
@@ -2138,10 +2230,119 @@ void ath_tx_tasklet(struct ath_softc *sc) | |||
2138 | } | 2230 | } |
2139 | } | 2231 | } |
2140 | 2232 | ||
2233 | void ath_tx_edma_tasklet(struct ath_softc *sc) | ||
2234 | { | ||
2235 | struct ath_tx_status txs; | ||
2236 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); | ||
2237 | struct ath_hw *ah = sc->sc_ah; | ||
2238 | struct ath_txq *txq; | ||
2239 | struct ath_buf *bf, *lastbf; | ||
2240 | struct list_head bf_head; | ||
2241 | int status; | ||
2242 | int txok; | ||
2243 | |||
2244 | for (;;) { | ||
2245 | status = ath9k_hw_txprocdesc(ah, NULL, (void *)&txs); | ||
2246 | if (status == -EINPROGRESS) | ||
2247 | break; | ||
2248 | if (status == -EIO) { | ||
2249 | ath_print(common, ATH_DBG_XMIT, | ||
2250 | "Error processing tx status\n"); | ||
2251 | break; | ||
2252 | } | ||
2253 | |||
2254 | /* Skip beacon completions */ | ||
2255 | if (txs.qid == sc->beacon.beaconq) | ||
2256 | continue; | ||
2257 | |||
2258 | txq = &sc->tx.txq[txs.qid]; | ||
2259 | |||
2260 | spin_lock_bh(&txq->axq_lock); | ||
2261 | if (list_empty(&txq->txq_fifo[txq->txq_tailidx])) { | ||
2262 | spin_unlock_bh(&txq->axq_lock); | ||
2263 | return; | ||
2264 | } | ||
2265 | |||
2266 | bf = list_first_entry(&txq->txq_fifo[txq->txq_tailidx], | ||
2267 | struct ath_buf, list); | ||
2268 | lastbf = bf->bf_lastbf; | ||
2269 | |||
2270 | INIT_LIST_HEAD(&bf_head); | ||
2271 | list_cut_position(&bf_head, &txq->txq_fifo[txq->txq_tailidx], | ||
2272 | &lastbf->list); | ||
2273 | INCR(txq->txq_tailidx, ATH_TXFIFO_DEPTH); | ||
2274 | txq->axq_depth--; | ||
2275 | txq->axq_tx_inprogress = false; | ||
2276 | spin_unlock_bh(&txq->axq_lock); | ||
2277 | |||
2278 | txok = !(txs.ts_status & ATH9K_TXERR_MASK); | ||
2279 | |||
2280 | if (!bf_isampdu(bf)) { | ||
2281 | bf->bf_retries = txs.ts_longretry; | ||
2282 | if (txs.ts_status & ATH9K_TXERR_XRETRY) | ||
2283 | bf->bf_state.bf_type |= BUF_XRETRY; | ||
2284 | ath_tx_rc_status(bf, &txs, 0, txok, true); | ||
2285 | } | ||
2286 | |||
2287 | if (bf_isampdu(bf)) | ||
2288 | ath_tx_complete_aggr(sc, txq, bf, &bf_head, &txs, txok); | ||
2289 | else | ||
2290 | ath_tx_complete_buf(sc, bf, txq, &bf_head, | ||
2291 | &txs, txok, 0); | ||
2292 | |||
2293 | spin_lock_bh(&txq->axq_lock); | ||
2294 | if (!list_empty(&txq->txq_fifo_pending)) { | ||
2295 | INIT_LIST_HEAD(&bf_head); | ||
2296 | bf = list_first_entry(&txq->txq_fifo_pending, | ||
2297 | struct ath_buf, list); | ||
2298 | list_cut_position(&bf_head, &txq->txq_fifo_pending, | ||
2299 | &bf->bf_lastbf->list); | ||
2300 | ath_tx_txqaddbuf(sc, txq, &bf_head); | ||
2301 | } else if (sc->sc_flags & SC_OP_TXAGGR) | ||
2302 | ath_txq_schedule(sc, txq); | ||
2303 | spin_unlock_bh(&txq->axq_lock); | ||
2304 | } | ||
2305 | } | ||
2306 | |||
2141 | /*****************/ | 2307 | /*****************/ |
2142 | /* Init, Cleanup */ | 2308 | /* Init, Cleanup */ |
2143 | /*****************/ | 2309 | /*****************/ |
2144 | 2310 | ||
2311 | static int ath_txstatus_setup(struct ath_softc *sc, int size) | ||
2312 | { | ||
2313 | struct ath_descdma *dd = &sc->txsdma; | ||
2314 | u8 txs_len = sc->sc_ah->caps.txs_len; | ||
2315 | |||
2316 | dd->dd_desc_len = size * txs_len; | ||
2317 | dd->dd_desc = dma_alloc_coherent(sc->dev, dd->dd_desc_len, | ||
2318 | &dd->dd_desc_paddr, GFP_KERNEL); | ||
2319 | if (!dd->dd_desc) | ||
2320 | return -ENOMEM; | ||
2321 | |||
2322 | return 0; | ||
2323 | } | ||
2324 | |||
2325 | static int ath_tx_edma_init(struct ath_softc *sc) | ||
2326 | { | ||
2327 | int err; | ||
2328 | |||
2329 | err = ath_txstatus_setup(sc, ATH_TXSTATUS_RING_SIZE); | ||
2330 | if (!err) | ||
2331 | ath9k_hw_setup_statusring(sc->sc_ah, sc->txsdma.dd_desc, | ||
2332 | sc->txsdma.dd_desc_paddr, | ||
2333 | ATH_TXSTATUS_RING_SIZE); | ||
2334 | |||
2335 | return err; | ||
2336 | } | ||
2337 | |||
2338 | static void ath_tx_edma_cleanup(struct ath_softc *sc) | ||
2339 | { | ||
2340 | struct ath_descdma *dd = &sc->txsdma; | ||
2341 | |||
2342 | dma_free_coherent(sc->dev, dd->dd_desc_len, dd->dd_desc, | ||
2343 | dd->dd_desc_paddr); | ||
2344 | } | ||
2345 | |||
2145 | int ath_tx_init(struct ath_softc *sc, int nbufs) | 2346 | int ath_tx_init(struct ath_softc *sc, int nbufs) |
2146 | { | 2347 | { |
2147 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); | 2348 | struct ath_common *common = ath9k_hw_common(sc->sc_ah); |
@@ -2150,7 +2351,7 @@ int ath_tx_init(struct ath_softc *sc, int nbufs) | |||
2150 | spin_lock_init(&sc->tx.txbuflock); | 2351 | spin_lock_init(&sc->tx.txbuflock); |
2151 | 2352 | ||
2152 | error = ath_descdma_setup(sc, &sc->tx.txdma, &sc->tx.txbuf, | 2353 | error = ath_descdma_setup(sc, &sc->tx.txdma, &sc->tx.txbuf, |
2153 | "tx", nbufs, 1); | 2354 | "tx", nbufs, 1, 1); |
2154 | if (error != 0) { | 2355 | if (error != 0) { |
2155 | ath_print(common, ATH_DBG_FATAL, | 2356 | ath_print(common, ATH_DBG_FATAL, |
2156 | "Failed to allocate tx descriptors: %d\n", error); | 2357 | "Failed to allocate tx descriptors: %d\n", error); |
@@ -2158,7 +2359,7 @@ int ath_tx_init(struct ath_softc *sc, int nbufs) | |||
2158 | } | 2359 | } |
2159 | 2360 | ||
2160 | error = ath_descdma_setup(sc, &sc->beacon.bdma, &sc->beacon.bbuf, | 2361 | error = ath_descdma_setup(sc, &sc->beacon.bdma, &sc->beacon.bbuf, |
2161 | "beacon", ATH_BCBUF, 1); | 2362 | "beacon", ATH_BCBUF, 1, 1); |
2162 | if (error != 0) { | 2363 | if (error != 0) { |
2163 | ath_print(common, ATH_DBG_FATAL, | 2364 | ath_print(common, ATH_DBG_FATAL, |
2164 | "Failed to allocate beacon descriptors: %d\n", error); | 2365 | "Failed to allocate beacon descriptors: %d\n", error); |
@@ -2167,6 +2368,12 @@ int ath_tx_init(struct ath_softc *sc, int nbufs) | |||
2167 | 2368 | ||
2168 | INIT_DELAYED_WORK(&sc->tx_complete_work, ath_tx_complete_poll_work); | 2369 | INIT_DELAYED_WORK(&sc->tx_complete_work, ath_tx_complete_poll_work); |
2169 | 2370 | ||
2371 | if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) { | ||
2372 | error = ath_tx_edma_init(sc); | ||
2373 | if (error) | ||
2374 | goto err; | ||
2375 | } | ||
2376 | |||
2170 | err: | 2377 | err: |
2171 | if (error != 0) | 2378 | if (error != 0) |
2172 | ath_tx_cleanup(sc); | 2379 | ath_tx_cleanup(sc); |
@@ -2181,6 +2388,9 @@ void ath_tx_cleanup(struct ath_softc *sc) | |||
2181 | 2388 | ||
2182 | if (sc->tx.txdma.dd_desc_len != 0) | 2389 | if (sc->tx.txdma.dd_desc_len != 0) |
2183 | ath_descdma_cleanup(sc, &sc->tx.txdma, &sc->tx.txbuf); | 2390 | ath_descdma_cleanup(sc, &sc->tx.txdma, &sc->tx.txbuf); |
2391 | |||
2392 | if (sc->sc_ah->caps.hw_caps & ATH9K_HW_CAP_EDMA) | ||
2393 | ath_tx_edma_cleanup(sc); | ||
2184 | } | 2394 | } |
2185 | 2395 | ||
2186 | void ath_tx_node_init(struct ath_softc *sc, struct ath_node *an) | 2396 | void ath_tx_node_init(struct ath_softc *sc, struct ath_node *an) |
diff --git a/drivers/net/wireless/iwlwifi/Makefile b/drivers/net/wireless/iwlwifi/Makefile index a684a72eb6e9..5ed2dcbe6d01 100644 --- a/drivers/net/wireless/iwlwifi/Makefile +++ b/drivers/net/wireless/iwlwifi/Makefile | |||
@@ -12,6 +12,7 @@ obj-$(CONFIG_IWLAGN) += iwlagn.o | |||
12 | iwlagn-objs := iwl-agn.o iwl-agn-rs.o iwl-agn-led.o iwl-agn-ict.o | 12 | iwlagn-objs := iwl-agn.o iwl-agn-rs.o iwl-agn-led.o iwl-agn-ict.o |
13 | iwlagn-objs += iwl-agn-ucode.o iwl-agn-hcmd.o iwl-agn-tx.o | 13 | iwlagn-objs += iwl-agn-ucode.o iwl-agn-hcmd.o iwl-agn-tx.o |
14 | iwlagn-objs += iwl-agn-lib.o | 14 | iwlagn-objs += iwl-agn-lib.o |
15 | iwlagn-$(CONFIG_IWLWIFI_DEBUGFS) += iwl-agn-debugfs.o | ||
15 | 16 | ||
16 | iwlagn-$(CONFIG_IWL4965) += iwl-4965.o | 17 | iwlagn-$(CONFIG_IWL4965) += iwl-4965.o |
17 | iwlagn-$(CONFIG_IWL5000) += iwl-5000.o | 18 | iwlagn-$(CONFIG_IWL5000) += iwl-5000.o |
diff --git a/drivers/net/wireless/iwlwifi/iwl-1000.c b/drivers/net/wireless/iwlwifi/iwl-1000.c index 9a0191a5ea35..8431ffce37d3 100644 --- a/drivers/net/wireless/iwlwifi/iwl-1000.c +++ b/drivers/net/wireless/iwlwifi/iwl-1000.c | |||
@@ -46,6 +46,7 @@ | |||
46 | #include "iwl-helpers.h" | 46 | #include "iwl-helpers.h" |
47 | #include "iwl-agn-hw.h" | 47 | #include "iwl-agn-hw.h" |
48 | #include "iwl-agn-led.h" | 48 | #include "iwl-agn-led.h" |
49 | #include "iwl-agn-debugfs.h" | ||
49 | 50 | ||
50 | /* Highest firmware API version supported */ | 51 | /* Highest firmware API version supported */ |
51 | #define IWL1000_UCODE_API_MAX 3 | 52 | #define IWL1000_UCODE_API_MAX 3 |
@@ -212,6 +213,11 @@ static struct iwl_lib_ops iwl1000_lib = { | |||
212 | .set_ct_kill = iwl1000_set_ct_threshold, | 213 | .set_ct_kill = iwl1000_set_ct_threshold, |
213 | }, | 214 | }, |
214 | .add_bcast_station = iwl_add_bcast_station, | 215 | .add_bcast_station = iwl_add_bcast_station, |
216 | .debugfs_ops = { | ||
217 | .rx_stats_read = iwl_ucode_rx_stats_read, | ||
218 | .tx_stats_read = iwl_ucode_tx_stats_read, | ||
219 | .general_stats_read = iwl_ucode_general_stats_read, | ||
220 | }, | ||
215 | .recover_from_tx_stall = iwl_bg_monitor_recover, | 221 | .recover_from_tx_stall = iwl_bg_monitor_recover, |
216 | .check_plcp_health = iwl_good_plcp_health, | 222 | .check_plcp_health = iwl_good_plcp_health, |
217 | .check_ack_health = iwl_good_ack_health, | 223 | .check_ack_health = iwl_good_ack_health, |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.c b/drivers/net/wireless/iwlwifi/iwl-3945.c index bde3b4cbab9d..59af2594c9c5 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.c +++ b/drivers/net/wireless/iwlwifi/iwl-3945.c | |||
@@ -2688,6 +2688,7 @@ IWL3945_UCODE_GET(boot_size); | |||
2688 | static struct iwl_hcmd_ops iwl3945_hcmd = { | 2688 | static struct iwl_hcmd_ops iwl3945_hcmd = { |
2689 | .rxon_assoc = iwl3945_send_rxon_assoc, | 2689 | .rxon_assoc = iwl3945_send_rxon_assoc, |
2690 | .commit_rxon = iwl3945_commit_rxon, | 2690 | .commit_rxon = iwl3945_commit_rxon, |
2691 | .send_bt_config = iwl_send_bt_config, | ||
2691 | }; | 2692 | }; |
2692 | 2693 | ||
2693 | static struct iwl_ucode_ops iwl3945_ucode = { | 2694 | static struct iwl_ucode_ops iwl3945_ucode = { |
@@ -2741,6 +2742,7 @@ static struct iwl_hcmd_utils_ops iwl3945_hcmd_utils = { | |||
2741 | .get_hcmd_size = iwl3945_get_hcmd_size, | 2742 | .get_hcmd_size = iwl3945_get_hcmd_size, |
2742 | .build_addsta_hcmd = iwl3945_build_addsta_hcmd, | 2743 | .build_addsta_hcmd = iwl3945_build_addsta_hcmd, |
2743 | .rts_tx_cmd_flag = iwlcore_rts_tx_cmd_flag, | 2744 | .rts_tx_cmd_flag = iwlcore_rts_tx_cmd_flag, |
2745 | .request_scan = iwl3945_request_scan, | ||
2744 | }; | 2746 | }; |
2745 | 2747 | ||
2746 | static const struct iwl_ops iwl3945_ops = { | 2748 | static const struct iwl_ops iwl3945_ops = { |
diff --git a/drivers/net/wireless/iwlwifi/iwl-3945.h b/drivers/net/wireless/iwlwifi/iwl-3945.h index b89219573b91..e9674f0a1e94 100644 --- a/drivers/net/wireless/iwlwifi/iwl-3945.h +++ b/drivers/net/wireless/iwlwifi/iwl-3945.h | |||
@@ -294,6 +294,9 @@ extern const struct iwl_channel_info *iwl3945_get_channel_info( | |||
294 | 294 | ||
295 | extern int iwl3945_rs_next_rate(struct iwl_priv *priv, int rate); | 295 | extern int iwl3945_rs_next_rate(struct iwl_priv *priv, int rate); |
296 | 296 | ||
297 | /* scanning */ | ||
298 | void iwl3945_request_scan(struct iwl_priv *priv); | ||
299 | |||
297 | /* Requires full declaration of iwl_priv before including */ | 300 | /* Requires full declaration of iwl_priv before including */ |
298 | #include "iwl-io.h" | 301 | #include "iwl-io.h" |
299 | 302 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-4965.c b/drivers/net/wireless/iwlwifi/iwl-4965.c index 2e3cda75f3ad..136c29067489 100644 --- a/drivers/net/wireless/iwlwifi/iwl-4965.c +++ b/drivers/net/wireless/iwlwifi/iwl-4965.c | |||
@@ -47,6 +47,7 @@ | |||
47 | #include "iwl-sta.h" | 47 | #include "iwl-sta.h" |
48 | #include "iwl-agn-led.h" | 48 | #include "iwl-agn-led.h" |
49 | #include "iwl-agn.h" | 49 | #include "iwl-agn.h" |
50 | #include "iwl-agn-debugfs.h" | ||
50 | 51 | ||
51 | static int iwl4965_send_tx_power(struct iwl_priv *priv); | 52 | static int iwl4965_send_tx_power(struct iwl_priv *priv); |
52 | static int iwl4965_hw_get_temperature(struct iwl_priv *priv); | 53 | static int iwl4965_hw_get_temperature(struct iwl_priv *priv); |
@@ -2143,6 +2144,7 @@ static struct iwl_hcmd_ops iwl4965_hcmd = { | |||
2143 | .rxon_assoc = iwl4965_send_rxon_assoc, | 2144 | .rxon_assoc = iwl4965_send_rxon_assoc, |
2144 | .commit_rxon = iwl_commit_rxon, | 2145 | .commit_rxon = iwl_commit_rxon, |
2145 | .set_rxon_chain = iwl_set_rxon_chain, | 2146 | .set_rxon_chain = iwl_set_rxon_chain, |
2147 | .send_bt_config = iwl_send_bt_config, | ||
2146 | }; | 2148 | }; |
2147 | 2149 | ||
2148 | static struct iwl_ucode_ops iwl4965_ucode = { | 2150 | static struct iwl_ucode_ops iwl4965_ucode = { |
@@ -2162,6 +2164,7 @@ static struct iwl_hcmd_utils_ops iwl4965_hcmd_utils = { | |||
2162 | .gain_computation = iwl4965_gain_computation, | 2164 | .gain_computation = iwl4965_gain_computation, |
2163 | .rts_tx_cmd_flag = iwlcore_rts_tx_cmd_flag, | 2165 | .rts_tx_cmd_flag = iwlcore_rts_tx_cmd_flag, |
2164 | .calc_rssi = iwl4965_calc_rssi, | 2166 | .calc_rssi = iwl4965_calc_rssi, |
2167 | .request_scan = iwlagn_request_scan, | ||
2165 | }; | 2168 | }; |
2166 | 2169 | ||
2167 | static struct iwl_lib_ops iwl4965_lib = { | 2170 | static struct iwl_lib_ops iwl4965_lib = { |
@@ -2216,6 +2219,11 @@ static struct iwl_lib_ops iwl4965_lib = { | |||
2216 | .set_ct_kill = iwl4965_set_ct_threshold, | 2219 | .set_ct_kill = iwl4965_set_ct_threshold, |
2217 | }, | 2220 | }, |
2218 | .add_bcast_station = iwl_add_bcast_station, | 2221 | .add_bcast_station = iwl_add_bcast_station, |
2222 | .debugfs_ops = { | ||
2223 | .rx_stats_read = iwl_ucode_rx_stats_read, | ||
2224 | .tx_stats_read = iwl_ucode_tx_stats_read, | ||
2225 | .general_stats_read = iwl_ucode_general_stats_read, | ||
2226 | }, | ||
2219 | .check_plcp_health = iwl_good_plcp_health, | 2227 | .check_plcp_health = iwl_good_plcp_health, |
2220 | }; | 2228 | }; |
2221 | 2229 | ||
@@ -2253,8 +2261,13 @@ struct iwl_cfg iwl4965_agn_cfg = { | |||
2253 | .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF, | 2261 | .plcp_delta_threshold = IWL_MAX_PLCP_ERR_THRESHOLD_DEF, |
2254 | .monitor_recover_period = IWL_MONITORING_PERIOD, | 2262 | .monitor_recover_period = IWL_MONITORING_PERIOD, |
2255 | .temperature_kelvin = true, | 2263 | .temperature_kelvin = true, |
2256 | .off_channel_workaround = true, | ||
2257 | .max_event_log_size = 512, | 2264 | .max_event_log_size = 512, |
2265 | |||
2266 | /* | ||
2267 | * Force use of chains B and C for scan RX on 5 GHz band | ||
2268 | * because the device has off-channel reception on chain A. | ||
2269 | */ | ||
2270 | .scan_antennas[IEEE80211_BAND_5GHZ] = ANT_BC, | ||
2258 | }; | 2271 | }; |
2259 | 2272 | ||
2260 | /* Module firmware */ | 2273 | /* Module firmware */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-5000.c b/drivers/net/wireless/iwlwifi/iwl-5000.c index e967cfcac224..e43493685271 100644 --- a/drivers/net/wireless/iwlwifi/iwl-5000.c +++ b/drivers/net/wireless/iwlwifi/iwl-5000.c | |||
@@ -48,6 +48,7 @@ | |||
48 | #include "iwl-agn-led.h" | 48 | #include "iwl-agn-led.h" |
49 | #include "iwl-agn-hw.h" | 49 | #include "iwl-agn-hw.h" |
50 | #include "iwl-5000-hw.h" | 50 | #include "iwl-5000-hw.h" |
51 | #include "iwl-agn-debugfs.h" | ||
51 | 52 | ||
52 | /* Highest firmware API version supported */ | 53 | /* Highest firmware API version supported */ |
53 | #define IWL5000_UCODE_API_MAX 2 | 54 | #define IWL5000_UCODE_API_MAX 2 |
@@ -320,6 +321,11 @@ static struct iwl_lib_ops iwl5000_lib = { | |||
320 | .set_ct_kill = iwl5000_set_ct_threshold, | 321 | .set_ct_kill = iwl5000_set_ct_threshold, |
321 | }, | 322 | }, |
322 | .add_bcast_station = iwl_add_bcast_station, | 323 | .add_bcast_station = iwl_add_bcast_station, |
324 | .debugfs_ops = { | ||
325 | .rx_stats_read = iwl_ucode_rx_stats_read, | ||
326 | .tx_stats_read = iwl_ucode_tx_stats_read, | ||
327 | .general_stats_read = iwl_ucode_general_stats_read, | ||
328 | }, | ||
323 | .recover_from_tx_stall = iwl_bg_monitor_recover, | 329 | .recover_from_tx_stall = iwl_bg_monitor_recover, |
324 | .check_plcp_health = iwl_good_plcp_health, | 330 | .check_plcp_health = iwl_good_plcp_health, |
325 | .check_ack_health = iwl_good_ack_health, | 331 | .check_ack_health = iwl_good_ack_health, |
@@ -377,6 +383,11 @@ static struct iwl_lib_ops iwl5150_lib = { | |||
377 | .set_ct_kill = iwl5150_set_ct_threshold, | 383 | .set_ct_kill = iwl5150_set_ct_threshold, |
378 | }, | 384 | }, |
379 | .add_bcast_station = iwl_add_bcast_station, | 385 | .add_bcast_station = iwl_add_bcast_station, |
386 | .debugfs_ops = { | ||
387 | .rx_stats_read = iwl_ucode_rx_stats_read, | ||
388 | .tx_stats_read = iwl_ucode_tx_stats_read, | ||
389 | .general_stats_read = iwl_ucode_general_stats_read, | ||
390 | }, | ||
380 | .recover_from_tx_stall = iwl_bg_monitor_recover, | 391 | .recover_from_tx_stall = iwl_bg_monitor_recover, |
381 | .check_plcp_health = iwl_good_plcp_health, | 392 | .check_plcp_health = iwl_good_plcp_health, |
382 | .check_ack_health = iwl_good_ack_health, | 393 | .check_ack_health = iwl_good_ack_health, |
diff --git a/drivers/net/wireless/iwlwifi/iwl-6000.c b/drivers/net/wireless/iwlwifi/iwl-6000.c index 3e32693d1c2f..7da23d3ff7b6 100644 --- a/drivers/net/wireless/iwlwifi/iwl-6000.c +++ b/drivers/net/wireless/iwlwifi/iwl-6000.c | |||
@@ -47,17 +47,19 @@ | |||
47 | #include "iwl-agn-hw.h" | 47 | #include "iwl-agn-hw.h" |
48 | #include "iwl-6000-hw.h" | 48 | #include "iwl-6000-hw.h" |
49 | #include "iwl-agn-led.h" | 49 | #include "iwl-agn-led.h" |
50 | #include "iwl-agn-debugfs.h" | ||
50 | 51 | ||
51 | /* Highest firmware API version supported */ | 52 | /* Highest firmware API version supported */ |
52 | #define IWL6000_UCODE_API_MAX 4 | 53 | #define IWL6000_UCODE_API_MAX 4 |
53 | #define IWL6050_UCODE_API_MAX 4 | 54 | #define IWL6050_UCODE_API_MAX 4 |
55 | #define IWL6000G2_UCODE_API_MAX 4 | ||
54 | 56 | ||
55 | /* Lowest firmware API version supported */ | 57 | /* Lowest firmware API version supported */ |
56 | #define IWL6000_UCODE_API_MIN 4 | 58 | #define IWL6000_UCODE_API_MIN 4 |
57 | #define IWL6050_UCODE_API_MIN 4 | 59 | #define IWL6050_UCODE_API_MIN 4 |
60 | #define IWL6000G2_UCODE_API_MIN 4 | ||
58 | 61 | ||
59 | #define IWL6000_FW_PRE "iwlwifi-6000-" | 62 | #define IWL6000_FW_PRE "iwlwifi-6000-" |
60 | #define IWL6000_G2_FW_PRE "iwlwifi-6005-" | ||
61 | #define _IWL6000_MODULE_FIRMWARE(api) IWL6000_FW_PRE #api ".ucode" | 63 | #define _IWL6000_MODULE_FIRMWARE(api) IWL6000_FW_PRE #api ".ucode" |
62 | #define IWL6000_MODULE_FIRMWARE(api) _IWL6000_MODULE_FIRMWARE(api) | 64 | #define IWL6000_MODULE_FIRMWARE(api) _IWL6000_MODULE_FIRMWARE(api) |
63 | 65 | ||
@@ -65,6 +67,10 @@ | |||
65 | #define _IWL6050_MODULE_FIRMWARE(api) IWL6050_FW_PRE #api ".ucode" | 67 | #define _IWL6050_MODULE_FIRMWARE(api) IWL6050_FW_PRE #api ".ucode" |
66 | #define IWL6050_MODULE_FIRMWARE(api) _IWL6050_MODULE_FIRMWARE(api) | 68 | #define IWL6050_MODULE_FIRMWARE(api) _IWL6050_MODULE_FIRMWARE(api) |
67 | 69 | ||
70 | #define IWL6000G2_FW_PRE "iwlwifi-6005-" | ||
71 | #define _IWL6000G2_MODULE_FIRMWARE(api) IWL6000G2_FW_PRE #api ".ucode" | ||
72 | #define IWL6000G2_MODULE_FIRMWARE(api) _IWL6000G2_MODULE_FIRMWARE(api) | ||
73 | |||
68 | static void iwl6000_set_ct_threshold(struct iwl_priv *priv) | 74 | static void iwl6000_set_ct_threshold(struct iwl_priv *priv) |
69 | { | 75 | { |
70 | /* want Celsius */ | 76 | /* want Celsius */ |
@@ -261,7 +267,6 @@ static struct iwl_lib_ops iwl6000_lib = { | |||
261 | EEPROM_REG_BAND_3_CHANNELS, | 267 | EEPROM_REG_BAND_3_CHANNELS, |
262 | EEPROM_REG_BAND_4_CHANNELS, | 268 | EEPROM_REG_BAND_4_CHANNELS, |
263 | EEPROM_REG_BAND_5_CHANNELS, | 269 | EEPROM_REG_BAND_5_CHANNELS, |
264 | EEPROM_REG_BAND_24_HT40_CHANNELS, | ||
265 | EEPROM_6000_REG_BAND_24_HT40_CHANNELS, | 270 | EEPROM_6000_REG_BAND_24_HT40_CHANNELS, |
266 | EEPROM_REG_BAND_52_HT40_CHANNELS | 271 | EEPROM_REG_BAND_52_HT40_CHANNELS |
267 | }, | 272 | }, |
@@ -280,6 +285,11 @@ static struct iwl_lib_ops iwl6000_lib = { | |||
280 | .set_ct_kill = iwl6000_set_ct_threshold, | 285 | .set_ct_kill = iwl6000_set_ct_threshold, |
281 | }, | 286 | }, |
282 | .add_bcast_station = iwl_add_bcast_station, | 287 | .add_bcast_station = iwl_add_bcast_station, |
288 | .debugfs_ops = { | ||
289 | .rx_stats_read = iwl_ucode_rx_stats_read, | ||
290 | .tx_stats_read = iwl_ucode_tx_stats_read, | ||
291 | .general_stats_read = iwl_ucode_general_stats_read, | ||
292 | }, | ||
283 | .recover_from_tx_stall = iwl_bg_monitor_recover, | 293 | .recover_from_tx_stall = iwl_bg_monitor_recover, |
284 | .check_plcp_health = iwl_good_plcp_health, | 294 | .check_plcp_health = iwl_good_plcp_health, |
285 | .check_ack_health = iwl_good_ack_health, | 295 | .check_ack_health = iwl_good_ack_health, |
@@ -348,6 +358,11 @@ static struct iwl_lib_ops iwl6050_lib = { | |||
348 | .set_calib_version = iwl6050_set_calib_version, | 358 | .set_calib_version = iwl6050_set_calib_version, |
349 | }, | 359 | }, |
350 | .add_bcast_station = iwl_add_bcast_station, | 360 | .add_bcast_station = iwl_add_bcast_station, |
361 | .debugfs_ops = { | ||
362 | .rx_stats_read = iwl_ucode_rx_stats_read, | ||
363 | .tx_stats_read = iwl_ucode_tx_stats_read, | ||
364 | .general_stats_read = iwl_ucode_general_stats_read, | ||
365 | }, | ||
351 | .recover_from_tx_stall = iwl_bg_monitor_recover, | 366 | .recover_from_tx_stall = iwl_bg_monitor_recover, |
352 | .check_plcp_health = iwl_good_plcp_health, | 367 | .check_plcp_health = iwl_good_plcp_health, |
353 | .check_ack_health = iwl_good_ack_health, | 368 | .check_ack_health = iwl_good_ack_health, |
@@ -364,16 +379,16 @@ static const struct iwl_ops iwl6050_ops = { | |||
364 | /* | 379 | /* |
365 | * "i": Internal configuration, use internal Power Amplifier | 380 | * "i": Internal configuration, use internal Power Amplifier |
366 | */ | 381 | */ |
367 | struct iwl_cfg iwl6000i_g2_2agn_cfg = { | 382 | struct iwl_cfg iwl6000g2_2agn_cfg = { |
368 | .name = "6000 Series 2x2 AGN Gen2", | 383 | .name = "6000 Series 2x2 AGN Gen2", |
369 | .fw_name_pre = IWL6000_G2_FW_PRE, | 384 | .fw_name_pre = IWL6000G2_FW_PRE, |
370 | .ucode_api_max = IWL6000_UCODE_API_MAX, | 385 | .ucode_api_max = IWL6000G2_UCODE_API_MAX, |
371 | .ucode_api_min = IWL6000_UCODE_API_MIN, | 386 | .ucode_api_min = IWL6000G2_UCODE_API_MIN, |
372 | .sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N, | 387 | .sku = IWL_SKU_A|IWL_SKU_G|IWL_SKU_N, |
373 | .ops = &iwl6000_ops, | 388 | .ops = &iwl6000_ops, |
374 | .eeprom_size = OTP_LOW_IMAGE_SIZE, | 389 | .eeprom_size = OTP_LOW_IMAGE_SIZE, |
375 | .eeprom_ver = EEPROM_6000_EEPROM_VERSION, | 390 | .eeprom_ver = EEPROM_6000G2_EEPROM_VERSION, |
376 | .eeprom_calib_ver = EEPROM_6000_TX_POWER_VERSION, | 391 | .eeprom_calib_ver = EEPROM_6000G2_TX_POWER_VERSION, |
377 | .num_of_queues = IWLAGN_NUM_QUEUES, | 392 | .num_of_queues = IWLAGN_NUM_QUEUES, |
378 | .num_of_ampdu_queues = IWLAGN_NUM_AMPDU_QUEUES, | 393 | .num_of_ampdu_queues = IWLAGN_NUM_AMPDU_QUEUES, |
379 | .mod_params = &iwlagn_mod_params, | 394 | .mod_params = &iwlagn_mod_params, |
@@ -382,7 +397,7 @@ struct iwl_cfg iwl6000i_g2_2agn_cfg = { | |||
382 | .pll_cfg_val = 0, | 397 | .pll_cfg_val = 0, |
383 | .set_l0s = true, | 398 | .set_l0s = true, |
384 | .use_bsm = false, | 399 | .use_bsm = false, |
385 | .pa_type = IWL_PA_INTERNAL, | 400 | .pa_type = IWL_PA_SYSTEM, |
386 | .max_ll_items = OTP_MAX_LL_ITEMS_6x00, | 401 | .max_ll_items = OTP_MAX_LL_ITEMS_6x00, |
387 | .shadow_ram_support = true, | 402 | .shadow_ram_support = true, |
388 | .ht_greenfield_support = true, | 403 | .ht_greenfield_support = true, |
@@ -601,3 +616,4 @@ struct iwl_cfg iwl6000_3agn_cfg = { | |||
601 | 616 | ||
602 | MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX)); | 617 | MODULE_FIRMWARE(IWL6000_MODULE_FIRMWARE(IWL6000_UCODE_API_MAX)); |
603 | MODULE_FIRMWARE(IWL6050_MODULE_FIRMWARE(IWL6050_UCODE_API_MAX)); | 618 | MODULE_FIRMWARE(IWL6050_MODULE_FIRMWARE(IWL6050_UCODE_API_MAX)); |
619 | MODULE_FIRMWARE(IWL6000G2_MODULE_FIRMWARE(IWL6000G2_UCODE_API_MAX)); | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-debugfs.c b/drivers/net/wireless/iwlwifi/iwl-agn-debugfs.c new file mode 100644 index 000000000000..f249b706bf17 --- /dev/null +++ b/drivers/net/wireless/iwlwifi/iwl-agn-debugfs.c | |||
@@ -0,0 +1,834 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * GPL LICENSE SUMMARY | ||
4 | * | ||
5 | * Copyright(c) 2008 - 2010 Intel Corporation. All rights reserved. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of version 2 of the GNU General Public License as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, but | ||
12 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
14 | * General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, | ||
19 | * USA | ||
20 | * | ||
21 | * The full GNU General Public License is included in this distribution | ||
22 | * in the file called LICENSE.GPL. | ||
23 | * | ||
24 | * Contact Information: | ||
25 | * Intel Linux Wireless <ilw@linux.intel.com> | ||
26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | ||
27 | *****************************************************************************/ | ||
28 | |||
29 | #include "iwl-agn-debugfs.h" | ||
30 | |||
31 | ssize_t iwl_ucode_rx_stats_read(struct file *file, char __user *user_buf, | ||
32 | size_t count, loff_t *ppos) | ||
33 | { | ||
34 | struct iwl_priv *priv = file->private_data; | ||
35 | int pos = 0; | ||
36 | char *buf; | ||
37 | int bufsz = sizeof(struct statistics_rx_phy) * 40 + | ||
38 | sizeof(struct statistics_rx_non_phy) * 40 + | ||
39 | sizeof(struct statistics_rx_ht_phy) * 40 + 400; | ||
40 | ssize_t ret; | ||
41 | struct statistics_rx_phy *ofdm, *accum_ofdm, *delta_ofdm, *max_ofdm; | ||
42 | struct statistics_rx_phy *cck, *accum_cck, *delta_cck, *max_cck; | ||
43 | struct statistics_rx_non_phy *general, *accum_general; | ||
44 | struct statistics_rx_non_phy *delta_general, *max_general; | ||
45 | struct statistics_rx_ht_phy *ht, *accum_ht, *delta_ht, *max_ht; | ||
46 | |||
47 | if (!iwl_is_alive(priv)) | ||
48 | return -EAGAIN; | ||
49 | |||
50 | buf = kzalloc(bufsz, GFP_KERNEL); | ||
51 | if (!buf) { | ||
52 | IWL_ERR(priv, "Can not allocate Buffer\n"); | ||
53 | return -ENOMEM; | ||
54 | } | ||
55 | |||
56 | /* | ||
57 | * the statistic information display here is based on | ||
58 | * the last statistics notification from uCode | ||
59 | * might not reflect the current uCode activity | ||
60 | */ | ||
61 | ofdm = &priv->statistics.rx.ofdm; | ||
62 | cck = &priv->statistics.rx.cck; | ||
63 | general = &priv->statistics.rx.general; | ||
64 | ht = &priv->statistics.rx.ofdm_ht; | ||
65 | accum_ofdm = &priv->accum_statistics.rx.ofdm; | ||
66 | accum_cck = &priv->accum_statistics.rx.cck; | ||
67 | accum_general = &priv->accum_statistics.rx.general; | ||
68 | accum_ht = &priv->accum_statistics.rx.ofdm_ht; | ||
69 | delta_ofdm = &priv->delta_statistics.rx.ofdm; | ||
70 | delta_cck = &priv->delta_statistics.rx.cck; | ||
71 | delta_general = &priv->delta_statistics.rx.general; | ||
72 | delta_ht = &priv->delta_statistics.rx.ofdm_ht; | ||
73 | max_ofdm = &priv->max_delta.rx.ofdm; | ||
74 | max_cck = &priv->max_delta.rx.cck; | ||
75 | max_general = &priv->max_delta.rx.general; | ||
76 | max_ht = &priv->max_delta.rx.ofdm_ht; | ||
77 | |||
78 | pos += iwl_dbgfs_statistics_flag(priv, buf, bufsz); | ||
79 | pos += scnprintf(buf + pos, bufsz - pos, "%-32s current" | ||
80 | "acumulative delta max\n", | ||
81 | "Statistics_Rx - OFDM:"); | ||
82 | pos += scnprintf(buf + pos, bufsz - pos, | ||
83 | " %-30s %10u %10u %10u %10u\n", | ||
84 | "ina_cnt:", le32_to_cpu(ofdm->ina_cnt), | ||
85 | accum_ofdm->ina_cnt, | ||
86 | delta_ofdm->ina_cnt, max_ofdm->ina_cnt); | ||
87 | pos += scnprintf(buf + pos, bufsz - pos, | ||
88 | " %-30s %10u %10u %10u %10u\n", | ||
89 | "fina_cnt:", | ||
90 | le32_to_cpu(ofdm->fina_cnt), accum_ofdm->fina_cnt, | ||
91 | delta_ofdm->fina_cnt, max_ofdm->fina_cnt); | ||
92 | pos += scnprintf(buf + pos, bufsz - pos, | ||
93 | " %-30s %10u %10u %10u %10u\n", | ||
94 | "plcp_err:", | ||
95 | le32_to_cpu(ofdm->plcp_err), accum_ofdm->plcp_err, | ||
96 | delta_ofdm->plcp_err, max_ofdm->plcp_err); | ||
97 | pos += scnprintf(buf + pos, bufsz - pos, | ||
98 | " %-30s %10u %10u %10u %10u\n", "crc32_err:", | ||
99 | le32_to_cpu(ofdm->crc32_err), accum_ofdm->crc32_err, | ||
100 | delta_ofdm->crc32_err, max_ofdm->crc32_err); | ||
101 | pos += scnprintf(buf + pos, bufsz - pos, | ||
102 | " %-30s %10u %10u %10u %10u\n", "overrun_err:", | ||
103 | le32_to_cpu(ofdm->overrun_err), | ||
104 | accum_ofdm->overrun_err, delta_ofdm->overrun_err, | ||
105 | max_ofdm->overrun_err); | ||
106 | pos += scnprintf(buf + pos, bufsz - pos, | ||
107 | " %-30s %10u %10u %10u %10u\n", | ||
108 | "early_overrun_err:", | ||
109 | le32_to_cpu(ofdm->early_overrun_err), | ||
110 | accum_ofdm->early_overrun_err, | ||
111 | delta_ofdm->early_overrun_err, | ||
112 | max_ofdm->early_overrun_err); | ||
113 | pos += scnprintf(buf + pos, bufsz - pos, | ||
114 | " %-30s %10u %10u %10u %10u\n", | ||
115 | "crc32_good:", le32_to_cpu(ofdm->crc32_good), | ||
116 | accum_ofdm->crc32_good, delta_ofdm->crc32_good, | ||
117 | max_ofdm->crc32_good); | ||
118 | pos += scnprintf(buf + pos, bufsz - pos, | ||
119 | " %-30s %10u %10u %10u %10u\n", "false_alarm_cnt:", | ||
120 | le32_to_cpu(ofdm->false_alarm_cnt), | ||
121 | accum_ofdm->false_alarm_cnt, | ||
122 | delta_ofdm->false_alarm_cnt, | ||
123 | max_ofdm->false_alarm_cnt); | ||
124 | pos += scnprintf(buf + pos, bufsz - pos, | ||
125 | " %-30s %10u %10u %10u %10u\n", | ||
126 | "fina_sync_err_cnt:", | ||
127 | le32_to_cpu(ofdm->fina_sync_err_cnt), | ||
128 | accum_ofdm->fina_sync_err_cnt, | ||
129 | delta_ofdm->fina_sync_err_cnt, | ||
130 | max_ofdm->fina_sync_err_cnt); | ||
131 | pos += scnprintf(buf + pos, bufsz - pos, | ||
132 | " %-30s %10u %10u %10u %10u\n", "sfd_timeout:", | ||
133 | le32_to_cpu(ofdm->sfd_timeout), | ||
134 | accum_ofdm->sfd_timeout, delta_ofdm->sfd_timeout, | ||
135 | max_ofdm->sfd_timeout); | ||
136 | pos += scnprintf(buf + pos, bufsz - pos, | ||
137 | " %-30s %10u %10u %10u %10u\n", "fina_timeout:", | ||
138 | le32_to_cpu(ofdm->fina_timeout), | ||
139 | accum_ofdm->fina_timeout, delta_ofdm->fina_timeout, | ||
140 | max_ofdm->fina_timeout); | ||
141 | pos += scnprintf(buf + pos, bufsz - pos, | ||
142 | " %-30s %10u %10u %10u %10u\n", | ||
143 | "unresponded_rts:", | ||
144 | le32_to_cpu(ofdm->unresponded_rts), | ||
145 | accum_ofdm->unresponded_rts, | ||
146 | delta_ofdm->unresponded_rts, | ||
147 | max_ofdm->unresponded_rts); | ||
148 | pos += scnprintf(buf + pos, bufsz - pos, | ||
149 | " %-30s %10u %10u %10u %10u\n", | ||
150 | "rxe_frame_lmt_ovrun:", | ||
151 | le32_to_cpu(ofdm->rxe_frame_limit_overrun), | ||
152 | accum_ofdm->rxe_frame_limit_overrun, | ||
153 | delta_ofdm->rxe_frame_limit_overrun, | ||
154 | max_ofdm->rxe_frame_limit_overrun); | ||
155 | pos += scnprintf(buf + pos, bufsz - pos, | ||
156 | " %-30s %10u %10u %10u %10u\n", "sent_ack_cnt:", | ||
157 | le32_to_cpu(ofdm->sent_ack_cnt), | ||
158 | accum_ofdm->sent_ack_cnt, delta_ofdm->sent_ack_cnt, | ||
159 | max_ofdm->sent_ack_cnt); | ||
160 | pos += scnprintf(buf + pos, bufsz - pos, | ||
161 | " %-30s %10u %10u %10u %10u\n", "sent_cts_cnt:", | ||
162 | le32_to_cpu(ofdm->sent_cts_cnt), | ||
163 | accum_ofdm->sent_cts_cnt, delta_ofdm->sent_cts_cnt, | ||
164 | max_ofdm->sent_cts_cnt); | ||
165 | pos += scnprintf(buf + pos, bufsz - pos, | ||
166 | " %-30s %10u %10u %10u %10u\n", | ||
167 | "sent_ba_rsp_cnt:", | ||
168 | le32_to_cpu(ofdm->sent_ba_rsp_cnt), | ||
169 | accum_ofdm->sent_ba_rsp_cnt, | ||
170 | delta_ofdm->sent_ba_rsp_cnt, | ||
171 | max_ofdm->sent_ba_rsp_cnt); | ||
172 | pos += scnprintf(buf + pos, bufsz - pos, | ||
173 | " %-30s %10u %10u %10u %10u\n", "dsp_self_kill:", | ||
174 | le32_to_cpu(ofdm->dsp_self_kill), | ||
175 | accum_ofdm->dsp_self_kill, | ||
176 | delta_ofdm->dsp_self_kill, | ||
177 | max_ofdm->dsp_self_kill); | ||
178 | pos += scnprintf(buf + pos, bufsz - pos, | ||
179 | " %-30s %10u %10u %10u %10u\n", | ||
180 | "mh_format_err:", | ||
181 | le32_to_cpu(ofdm->mh_format_err), | ||
182 | accum_ofdm->mh_format_err, | ||
183 | delta_ofdm->mh_format_err, | ||
184 | max_ofdm->mh_format_err); | ||
185 | pos += scnprintf(buf + pos, bufsz - pos, | ||
186 | " %-30s %10u %10u %10u %10u\n", | ||
187 | "re_acq_main_rssi_sum:", | ||
188 | le32_to_cpu(ofdm->re_acq_main_rssi_sum), | ||
189 | accum_ofdm->re_acq_main_rssi_sum, | ||
190 | delta_ofdm->re_acq_main_rssi_sum, | ||
191 | max_ofdm->re_acq_main_rssi_sum); | ||
192 | |||
193 | pos += scnprintf(buf + pos, bufsz - pos, "%-32s current" | ||
194 | "acumulative delta max\n", | ||
195 | "Statistics_Rx - CCK:"); | ||
196 | pos += scnprintf(buf + pos, bufsz - pos, | ||
197 | " %-30s %10u %10u %10u %10u\n", | ||
198 | "ina_cnt:", | ||
199 | le32_to_cpu(cck->ina_cnt), accum_cck->ina_cnt, | ||
200 | delta_cck->ina_cnt, max_cck->ina_cnt); | ||
201 | pos += scnprintf(buf + pos, bufsz - pos, | ||
202 | " %-30s %10u %10u %10u %10u\n", | ||
203 | "fina_cnt:", | ||
204 | le32_to_cpu(cck->fina_cnt), accum_cck->fina_cnt, | ||
205 | delta_cck->fina_cnt, max_cck->fina_cnt); | ||
206 | pos += scnprintf(buf + pos, bufsz - pos, | ||
207 | " %-30s %10u %10u %10u %10u\n", | ||
208 | "plcp_err:", | ||
209 | le32_to_cpu(cck->plcp_err), accum_cck->plcp_err, | ||
210 | delta_cck->plcp_err, max_cck->plcp_err); | ||
211 | pos += scnprintf(buf + pos, bufsz - pos, | ||
212 | " %-30s %10u %10u %10u %10u\n", | ||
213 | "crc32_err:", | ||
214 | le32_to_cpu(cck->crc32_err), accum_cck->crc32_err, | ||
215 | delta_cck->crc32_err, max_cck->crc32_err); | ||
216 | pos += scnprintf(buf + pos, bufsz - pos, | ||
217 | " %-30s %10u %10u %10u %10u\n", | ||
218 | "overrun_err:", | ||
219 | le32_to_cpu(cck->overrun_err), | ||
220 | accum_cck->overrun_err, delta_cck->overrun_err, | ||
221 | max_cck->overrun_err); | ||
222 | pos += scnprintf(buf + pos, bufsz - pos, | ||
223 | " %-30s %10u %10u %10u %10u\n", | ||
224 | "early_overrun_err:", | ||
225 | le32_to_cpu(cck->early_overrun_err), | ||
226 | accum_cck->early_overrun_err, | ||
227 | delta_cck->early_overrun_err, | ||
228 | max_cck->early_overrun_err); | ||
229 | pos += scnprintf(buf + pos, bufsz - pos, | ||
230 | " %-30s %10u %10u %10u %10u\n", | ||
231 | "crc32_good:", | ||
232 | le32_to_cpu(cck->crc32_good), accum_cck->crc32_good, | ||
233 | delta_cck->crc32_good, max_cck->crc32_good); | ||
234 | pos += scnprintf(buf + pos, bufsz - pos, | ||
235 | " %-30s %10u %10u %10u %10u\n", | ||
236 | "false_alarm_cnt:", | ||
237 | le32_to_cpu(cck->false_alarm_cnt), | ||
238 | accum_cck->false_alarm_cnt, | ||
239 | delta_cck->false_alarm_cnt, max_cck->false_alarm_cnt); | ||
240 | pos += scnprintf(buf + pos, bufsz - pos, | ||
241 | " %-30s %10u %10u %10u %10u\n", | ||
242 | "fina_sync_err_cnt:", | ||
243 | le32_to_cpu(cck->fina_sync_err_cnt), | ||
244 | accum_cck->fina_sync_err_cnt, | ||
245 | delta_cck->fina_sync_err_cnt, | ||
246 | max_cck->fina_sync_err_cnt); | ||
247 | pos += scnprintf(buf + pos, bufsz - pos, | ||
248 | " %-30s %10u %10u %10u %10u\n", | ||
249 | "sfd_timeout:", | ||
250 | le32_to_cpu(cck->sfd_timeout), | ||
251 | accum_cck->sfd_timeout, delta_cck->sfd_timeout, | ||
252 | max_cck->sfd_timeout); | ||
253 | pos += scnprintf(buf + pos, bufsz - pos, | ||
254 | " %-30s %10u %10u %10u %10u\n", "fina_timeout:", | ||
255 | le32_to_cpu(cck->fina_timeout), | ||
256 | accum_cck->fina_timeout, delta_cck->fina_timeout, | ||
257 | max_cck->fina_timeout); | ||
258 | pos += scnprintf(buf + pos, bufsz - pos, | ||
259 | " %-30s %10u %10u %10u %10u\n", | ||
260 | "unresponded_rts:", | ||
261 | le32_to_cpu(cck->unresponded_rts), | ||
262 | accum_cck->unresponded_rts, delta_cck->unresponded_rts, | ||
263 | max_cck->unresponded_rts); | ||
264 | pos += scnprintf(buf + pos, bufsz - pos, | ||
265 | " %-30s %10u %10u %10u %10u\n", | ||
266 | "rxe_frame_lmt_ovrun:", | ||
267 | le32_to_cpu(cck->rxe_frame_limit_overrun), | ||
268 | accum_cck->rxe_frame_limit_overrun, | ||
269 | delta_cck->rxe_frame_limit_overrun, | ||
270 | max_cck->rxe_frame_limit_overrun); | ||
271 | pos += scnprintf(buf + pos, bufsz - pos, | ||
272 | " %-30s %10u %10u %10u %10u\n", "sent_ack_cnt:", | ||
273 | le32_to_cpu(cck->sent_ack_cnt), | ||
274 | accum_cck->sent_ack_cnt, delta_cck->sent_ack_cnt, | ||
275 | max_cck->sent_ack_cnt); | ||
276 | pos += scnprintf(buf + pos, bufsz - pos, | ||
277 | " %-30s %10u %10u %10u %10u\n", "sent_cts_cnt:", | ||
278 | le32_to_cpu(cck->sent_cts_cnt), | ||
279 | accum_cck->sent_cts_cnt, delta_cck->sent_cts_cnt, | ||
280 | max_cck->sent_cts_cnt); | ||
281 | pos += scnprintf(buf + pos, bufsz - pos, | ||
282 | " %-30s %10u %10u %10u %10u\n", "sent_ba_rsp_cnt:", | ||
283 | le32_to_cpu(cck->sent_ba_rsp_cnt), | ||
284 | accum_cck->sent_ba_rsp_cnt, | ||
285 | delta_cck->sent_ba_rsp_cnt, | ||
286 | max_cck->sent_ba_rsp_cnt); | ||
287 | pos += scnprintf(buf + pos, bufsz - pos, | ||
288 | " %-30s %10u %10u %10u %10u\n", "dsp_self_kill:", | ||
289 | le32_to_cpu(cck->dsp_self_kill), | ||
290 | accum_cck->dsp_self_kill, delta_cck->dsp_self_kill, | ||
291 | max_cck->dsp_self_kill); | ||
292 | pos += scnprintf(buf + pos, bufsz - pos, | ||
293 | " %-30s %10u %10u %10u %10u\n", "mh_format_err:", | ||
294 | le32_to_cpu(cck->mh_format_err), | ||
295 | accum_cck->mh_format_err, delta_cck->mh_format_err, | ||
296 | max_cck->mh_format_err); | ||
297 | pos += scnprintf(buf + pos, bufsz - pos, | ||
298 | " %-30s %10u %10u %10u %10u\n", | ||
299 | "re_acq_main_rssi_sum:", | ||
300 | le32_to_cpu(cck->re_acq_main_rssi_sum), | ||
301 | accum_cck->re_acq_main_rssi_sum, | ||
302 | delta_cck->re_acq_main_rssi_sum, | ||
303 | max_cck->re_acq_main_rssi_sum); | ||
304 | |||
305 | pos += scnprintf(buf + pos, bufsz - pos, "%-32s current" | ||
306 | "acumulative delta max\n", | ||
307 | "Statistics_Rx - GENERAL:"); | ||
308 | pos += scnprintf(buf + pos, bufsz - pos, | ||
309 | " %-30s %10u %10u %10u %10u\n", "bogus_cts:", | ||
310 | le32_to_cpu(general->bogus_cts), | ||
311 | accum_general->bogus_cts, delta_general->bogus_cts, | ||
312 | max_general->bogus_cts); | ||
313 | pos += scnprintf(buf + pos, bufsz - pos, | ||
314 | " %-30s %10u %10u %10u %10u\n", "bogus_ack:", | ||
315 | le32_to_cpu(general->bogus_ack), | ||
316 | accum_general->bogus_ack, delta_general->bogus_ack, | ||
317 | max_general->bogus_ack); | ||
318 | pos += scnprintf(buf + pos, bufsz - pos, | ||
319 | " %-30s %10u %10u %10u %10u\n", | ||
320 | "non_bssid_frames:", | ||
321 | le32_to_cpu(general->non_bssid_frames), | ||
322 | accum_general->non_bssid_frames, | ||
323 | delta_general->non_bssid_frames, | ||
324 | max_general->non_bssid_frames); | ||
325 | pos += scnprintf(buf + pos, bufsz - pos, | ||
326 | " %-30s %10u %10u %10u %10u\n", | ||
327 | "filtered_frames:", | ||
328 | le32_to_cpu(general->filtered_frames), | ||
329 | accum_general->filtered_frames, | ||
330 | delta_general->filtered_frames, | ||
331 | max_general->filtered_frames); | ||
332 | pos += scnprintf(buf + pos, bufsz - pos, | ||
333 | " %-30s %10u %10u %10u %10u\n", | ||
334 | "non_channel_beacons:", | ||
335 | le32_to_cpu(general->non_channel_beacons), | ||
336 | accum_general->non_channel_beacons, | ||
337 | delta_general->non_channel_beacons, | ||
338 | max_general->non_channel_beacons); | ||
339 | pos += scnprintf(buf + pos, bufsz - pos, | ||
340 | " %-30s %10u %10u %10u %10u\n", | ||
341 | "channel_beacons:", | ||
342 | le32_to_cpu(general->channel_beacons), | ||
343 | accum_general->channel_beacons, | ||
344 | delta_general->channel_beacons, | ||
345 | max_general->channel_beacons); | ||
346 | pos += scnprintf(buf + pos, bufsz - pos, | ||
347 | " %-30s %10u %10u %10u %10u\n", | ||
348 | "num_missed_bcon:", | ||
349 | le32_to_cpu(general->num_missed_bcon), | ||
350 | accum_general->num_missed_bcon, | ||
351 | delta_general->num_missed_bcon, | ||
352 | max_general->num_missed_bcon); | ||
353 | pos += scnprintf(buf + pos, bufsz - pos, | ||
354 | " %-30s %10u %10u %10u %10u\n", | ||
355 | "adc_rx_saturation_time:", | ||
356 | le32_to_cpu(general->adc_rx_saturation_time), | ||
357 | accum_general->adc_rx_saturation_time, | ||
358 | delta_general->adc_rx_saturation_time, | ||
359 | max_general->adc_rx_saturation_time); | ||
360 | pos += scnprintf(buf + pos, bufsz - pos, | ||
361 | " %-30s %10u %10u %10u %10u\n", | ||
362 | "ina_detect_search_tm:", | ||
363 | le32_to_cpu(general->ina_detection_search_time), | ||
364 | accum_general->ina_detection_search_time, | ||
365 | delta_general->ina_detection_search_time, | ||
366 | max_general->ina_detection_search_time); | ||
367 | pos += scnprintf(buf + pos, bufsz - pos, | ||
368 | " %-30s %10u %10u %10u %10u\n", | ||
369 | "beacon_silence_rssi_a:", | ||
370 | le32_to_cpu(general->beacon_silence_rssi_a), | ||
371 | accum_general->beacon_silence_rssi_a, | ||
372 | delta_general->beacon_silence_rssi_a, | ||
373 | max_general->beacon_silence_rssi_a); | ||
374 | pos += scnprintf(buf + pos, bufsz - pos, | ||
375 | " %-30s %10u %10u %10u %10u\n", | ||
376 | "beacon_silence_rssi_b:", | ||
377 | le32_to_cpu(general->beacon_silence_rssi_b), | ||
378 | accum_general->beacon_silence_rssi_b, | ||
379 | delta_general->beacon_silence_rssi_b, | ||
380 | max_general->beacon_silence_rssi_b); | ||
381 | pos += scnprintf(buf + pos, bufsz - pos, | ||
382 | " %-30s %10u %10u %10u %10u\n", | ||
383 | "beacon_silence_rssi_c:", | ||
384 | le32_to_cpu(general->beacon_silence_rssi_c), | ||
385 | accum_general->beacon_silence_rssi_c, | ||
386 | delta_general->beacon_silence_rssi_c, | ||
387 | max_general->beacon_silence_rssi_c); | ||
388 | pos += scnprintf(buf + pos, bufsz - pos, | ||
389 | " %-30s %10u %10u %10u %10u\n", | ||
390 | "interference_data_flag:", | ||
391 | le32_to_cpu(general->interference_data_flag), | ||
392 | accum_general->interference_data_flag, | ||
393 | delta_general->interference_data_flag, | ||
394 | max_general->interference_data_flag); | ||
395 | pos += scnprintf(buf + pos, bufsz - pos, | ||
396 | " %-30s %10u %10u %10u %10u\n", | ||
397 | "channel_load:", | ||
398 | le32_to_cpu(general->channel_load), | ||
399 | accum_general->channel_load, | ||
400 | delta_general->channel_load, | ||
401 | max_general->channel_load); | ||
402 | pos += scnprintf(buf + pos, bufsz - pos, | ||
403 | " %-30s %10u %10u %10u %10u\n", | ||
404 | "dsp_false_alarms:", | ||
405 | le32_to_cpu(general->dsp_false_alarms), | ||
406 | accum_general->dsp_false_alarms, | ||
407 | delta_general->dsp_false_alarms, | ||
408 | max_general->dsp_false_alarms); | ||
409 | pos += scnprintf(buf + pos, bufsz - pos, | ||
410 | " %-30s %10u %10u %10u %10u\n", | ||
411 | "beacon_rssi_a:", | ||
412 | le32_to_cpu(general->beacon_rssi_a), | ||
413 | accum_general->beacon_rssi_a, | ||
414 | delta_general->beacon_rssi_a, | ||
415 | max_general->beacon_rssi_a); | ||
416 | pos += scnprintf(buf + pos, bufsz - pos, | ||
417 | " %-30s %10u %10u %10u %10u\n", | ||
418 | "beacon_rssi_b:", | ||
419 | le32_to_cpu(general->beacon_rssi_b), | ||
420 | accum_general->beacon_rssi_b, | ||
421 | delta_general->beacon_rssi_b, | ||
422 | max_general->beacon_rssi_b); | ||
423 | pos += scnprintf(buf + pos, bufsz - pos, | ||
424 | " %-30s %10u %10u %10u %10u\n", | ||
425 | "beacon_rssi_c:", | ||
426 | le32_to_cpu(general->beacon_rssi_c), | ||
427 | accum_general->beacon_rssi_c, | ||
428 | delta_general->beacon_rssi_c, | ||
429 | max_general->beacon_rssi_c); | ||
430 | pos += scnprintf(buf + pos, bufsz - pos, | ||
431 | " %-30s %10u %10u %10u %10u\n", | ||
432 | "beacon_energy_a:", | ||
433 | le32_to_cpu(general->beacon_energy_a), | ||
434 | accum_general->beacon_energy_a, | ||
435 | delta_general->beacon_energy_a, | ||
436 | max_general->beacon_energy_a); | ||
437 | pos += scnprintf(buf + pos, bufsz - pos, | ||
438 | " %-30s %10u %10u %10u %10u\n", | ||
439 | "beacon_energy_b:", | ||
440 | le32_to_cpu(general->beacon_energy_b), | ||
441 | accum_general->beacon_energy_b, | ||
442 | delta_general->beacon_energy_b, | ||
443 | max_general->beacon_energy_b); | ||
444 | pos += scnprintf(buf + pos, bufsz - pos, | ||
445 | " %-30s %10u %10u %10u %10u\n", | ||
446 | "beacon_energy_c:", | ||
447 | le32_to_cpu(general->beacon_energy_c), | ||
448 | accum_general->beacon_energy_c, | ||
449 | delta_general->beacon_energy_c, | ||
450 | max_general->beacon_energy_c); | ||
451 | |||
452 | pos += scnprintf(buf + pos, bufsz - pos, "Statistics_Rx - OFDM_HT:\n"); | ||
453 | pos += scnprintf(buf + pos, bufsz - pos, "%-32s current" | ||
454 | "acumulative delta max\n", | ||
455 | "Statistics_Rx - OFDM_HT:"); | ||
456 | pos += scnprintf(buf + pos, bufsz - pos, | ||
457 | " %-30s %10u %10u %10u %10u\n", | ||
458 | "plcp_err:", | ||
459 | le32_to_cpu(ht->plcp_err), accum_ht->plcp_err, | ||
460 | delta_ht->plcp_err, max_ht->plcp_err); | ||
461 | pos += scnprintf(buf + pos, bufsz - pos, | ||
462 | " %-30s %10u %10u %10u %10u\n", | ||
463 | "overrun_err:", | ||
464 | le32_to_cpu(ht->overrun_err), accum_ht->overrun_err, | ||
465 | delta_ht->overrun_err, max_ht->overrun_err); | ||
466 | pos += scnprintf(buf + pos, bufsz - pos, | ||
467 | " %-30s %10u %10u %10u %10u\n", | ||
468 | "early_overrun_err:", | ||
469 | le32_to_cpu(ht->early_overrun_err), | ||
470 | accum_ht->early_overrun_err, | ||
471 | delta_ht->early_overrun_err, | ||
472 | max_ht->early_overrun_err); | ||
473 | pos += scnprintf(buf + pos, bufsz - pos, | ||
474 | " %-30s %10u %10u %10u %10u\n", | ||
475 | "crc32_good:", | ||
476 | le32_to_cpu(ht->crc32_good), accum_ht->crc32_good, | ||
477 | delta_ht->crc32_good, max_ht->crc32_good); | ||
478 | pos += scnprintf(buf + pos, bufsz - pos, | ||
479 | " %-30s %10u %10u %10u %10u\n", | ||
480 | "crc32_err:", | ||
481 | le32_to_cpu(ht->crc32_err), accum_ht->crc32_err, | ||
482 | delta_ht->crc32_err, max_ht->crc32_err); | ||
483 | pos += scnprintf(buf + pos, bufsz - pos, | ||
484 | " %-30s %10u %10u %10u %10u\n", | ||
485 | "mh_format_err:", | ||
486 | le32_to_cpu(ht->mh_format_err), | ||
487 | accum_ht->mh_format_err, | ||
488 | delta_ht->mh_format_err, max_ht->mh_format_err); | ||
489 | pos += scnprintf(buf + pos, bufsz - pos, | ||
490 | " %-30s %10u %10u %10u %10u\n", | ||
491 | "agg_crc32_good:", | ||
492 | le32_to_cpu(ht->agg_crc32_good), | ||
493 | accum_ht->agg_crc32_good, | ||
494 | delta_ht->agg_crc32_good, max_ht->agg_crc32_good); | ||
495 | pos += scnprintf(buf + pos, bufsz - pos, | ||
496 | " %-30s %10u %10u %10u %10u\n", | ||
497 | "agg_mpdu_cnt:", | ||
498 | le32_to_cpu(ht->agg_mpdu_cnt), | ||
499 | accum_ht->agg_mpdu_cnt, | ||
500 | delta_ht->agg_mpdu_cnt, max_ht->agg_mpdu_cnt); | ||
501 | pos += scnprintf(buf + pos, bufsz - pos, | ||
502 | " %-30s %10u %10u %10u %10u\n", | ||
503 | "agg_cnt:", | ||
504 | le32_to_cpu(ht->agg_cnt), accum_ht->agg_cnt, | ||
505 | delta_ht->agg_cnt, max_ht->agg_cnt); | ||
506 | pos += scnprintf(buf + pos, bufsz - pos, | ||
507 | " %-30s %10u %10u %10u %10u\n", | ||
508 | "unsupport_mcs:", | ||
509 | le32_to_cpu(ht->unsupport_mcs), | ||
510 | accum_ht->unsupport_mcs, | ||
511 | delta_ht->unsupport_mcs, max_ht->unsupport_mcs); | ||
512 | |||
513 | ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); | ||
514 | kfree(buf); | ||
515 | return ret; | ||
516 | } | ||
517 | |||
518 | ssize_t iwl_ucode_tx_stats_read(struct file *file, | ||
519 | char __user *user_buf, | ||
520 | size_t count, loff_t *ppos) | ||
521 | { | ||
522 | struct iwl_priv *priv = file->private_data; | ||
523 | int pos = 0; | ||
524 | char *buf; | ||
525 | int bufsz = (sizeof(struct statistics_tx) * 48) + 250; | ||
526 | ssize_t ret; | ||
527 | struct statistics_tx *tx, *accum_tx, *delta_tx, *max_tx; | ||
528 | |||
529 | if (!iwl_is_alive(priv)) | ||
530 | return -EAGAIN; | ||
531 | |||
532 | buf = kzalloc(bufsz, GFP_KERNEL); | ||
533 | if (!buf) { | ||
534 | IWL_ERR(priv, "Can not allocate Buffer\n"); | ||
535 | return -ENOMEM; | ||
536 | } | ||
537 | |||
538 | /* the statistic information display here is based on | ||
539 | * the last statistics notification from uCode | ||
540 | * might not reflect the current uCode activity | ||
541 | */ | ||
542 | tx = &priv->statistics.tx; | ||
543 | accum_tx = &priv->accum_statistics.tx; | ||
544 | delta_tx = &priv->delta_statistics.tx; | ||
545 | max_tx = &priv->max_delta.tx; | ||
546 | pos += iwl_dbgfs_statistics_flag(priv, buf, bufsz); | ||
547 | pos += scnprintf(buf + pos, bufsz - pos, "%-32s current" | ||
548 | "acumulative delta max\n", | ||
549 | "Statistics_Tx:"); | ||
550 | pos += scnprintf(buf + pos, bufsz - pos, | ||
551 | " %-30s %10u %10u %10u %10u\n", | ||
552 | "preamble:", | ||
553 | le32_to_cpu(tx->preamble_cnt), | ||
554 | accum_tx->preamble_cnt, | ||
555 | delta_tx->preamble_cnt, max_tx->preamble_cnt); | ||
556 | pos += scnprintf(buf + pos, bufsz - pos, | ||
557 | " %-30s %10u %10u %10u %10u\n", | ||
558 | "rx_detected_cnt:", | ||
559 | le32_to_cpu(tx->rx_detected_cnt), | ||
560 | accum_tx->rx_detected_cnt, | ||
561 | delta_tx->rx_detected_cnt, max_tx->rx_detected_cnt); | ||
562 | pos += scnprintf(buf + pos, bufsz - pos, | ||
563 | " %-30s %10u %10u %10u %10u\n", | ||
564 | "bt_prio_defer_cnt:", | ||
565 | le32_to_cpu(tx->bt_prio_defer_cnt), | ||
566 | accum_tx->bt_prio_defer_cnt, | ||
567 | delta_tx->bt_prio_defer_cnt, | ||
568 | max_tx->bt_prio_defer_cnt); | ||
569 | pos += scnprintf(buf + pos, bufsz - pos, | ||
570 | " %-30s %10u %10u %10u %10u\n", | ||
571 | "bt_prio_kill_cnt:", | ||
572 | le32_to_cpu(tx->bt_prio_kill_cnt), | ||
573 | accum_tx->bt_prio_kill_cnt, | ||
574 | delta_tx->bt_prio_kill_cnt, | ||
575 | max_tx->bt_prio_kill_cnt); | ||
576 | pos += scnprintf(buf + pos, bufsz - pos, | ||
577 | " %-30s %10u %10u %10u %10u\n", | ||
578 | "few_bytes_cnt:", | ||
579 | le32_to_cpu(tx->few_bytes_cnt), | ||
580 | accum_tx->few_bytes_cnt, | ||
581 | delta_tx->few_bytes_cnt, max_tx->few_bytes_cnt); | ||
582 | pos += scnprintf(buf + pos, bufsz - pos, | ||
583 | " %-30s %10u %10u %10u %10u\n", | ||
584 | "cts_timeout:", | ||
585 | le32_to_cpu(tx->cts_timeout), accum_tx->cts_timeout, | ||
586 | delta_tx->cts_timeout, max_tx->cts_timeout); | ||
587 | pos += scnprintf(buf + pos, bufsz - pos, | ||
588 | " %-30s %10u %10u %10u %10u\n", | ||
589 | "ack_timeout:", | ||
590 | le32_to_cpu(tx->ack_timeout), | ||
591 | accum_tx->ack_timeout, | ||
592 | delta_tx->ack_timeout, max_tx->ack_timeout); | ||
593 | pos += scnprintf(buf + pos, bufsz - pos, | ||
594 | " %-30s %10u %10u %10u %10u\n", | ||
595 | "expected_ack_cnt:", | ||
596 | le32_to_cpu(tx->expected_ack_cnt), | ||
597 | accum_tx->expected_ack_cnt, | ||
598 | delta_tx->expected_ack_cnt, | ||
599 | max_tx->expected_ack_cnt); | ||
600 | pos += scnprintf(buf + pos, bufsz - pos, | ||
601 | " %-30s %10u %10u %10u %10u\n", | ||
602 | "actual_ack_cnt:", | ||
603 | le32_to_cpu(tx->actual_ack_cnt), | ||
604 | accum_tx->actual_ack_cnt, | ||
605 | delta_tx->actual_ack_cnt, | ||
606 | max_tx->actual_ack_cnt); | ||
607 | pos += scnprintf(buf + pos, bufsz - pos, | ||
608 | " %-30s %10u %10u %10u %10u\n", | ||
609 | "dump_msdu_cnt:", | ||
610 | le32_to_cpu(tx->dump_msdu_cnt), | ||
611 | accum_tx->dump_msdu_cnt, | ||
612 | delta_tx->dump_msdu_cnt, | ||
613 | max_tx->dump_msdu_cnt); | ||
614 | pos += scnprintf(buf + pos, bufsz - pos, | ||
615 | " %-30s %10u %10u %10u %10u\n", | ||
616 | "abort_nxt_frame_mismatch:", | ||
617 | le32_to_cpu(tx->burst_abort_next_frame_mismatch_cnt), | ||
618 | accum_tx->burst_abort_next_frame_mismatch_cnt, | ||
619 | delta_tx->burst_abort_next_frame_mismatch_cnt, | ||
620 | max_tx->burst_abort_next_frame_mismatch_cnt); | ||
621 | pos += scnprintf(buf + pos, bufsz - pos, | ||
622 | " %-30s %10u %10u %10u %10u\n", | ||
623 | "abort_missing_nxt_frame:", | ||
624 | le32_to_cpu(tx->burst_abort_missing_next_frame_cnt), | ||
625 | accum_tx->burst_abort_missing_next_frame_cnt, | ||
626 | delta_tx->burst_abort_missing_next_frame_cnt, | ||
627 | max_tx->burst_abort_missing_next_frame_cnt); | ||
628 | pos += scnprintf(buf + pos, bufsz - pos, | ||
629 | " %-30s %10u %10u %10u %10u\n", | ||
630 | "cts_timeout_collision:", | ||
631 | le32_to_cpu(tx->cts_timeout_collision), | ||
632 | accum_tx->cts_timeout_collision, | ||
633 | delta_tx->cts_timeout_collision, | ||
634 | max_tx->cts_timeout_collision); | ||
635 | pos += scnprintf(buf + pos, bufsz - pos, | ||
636 | " %-30s %10u %10u %10u %10u\n", | ||
637 | "ack_ba_timeout_collision:", | ||
638 | le32_to_cpu(tx->ack_or_ba_timeout_collision), | ||
639 | accum_tx->ack_or_ba_timeout_collision, | ||
640 | delta_tx->ack_or_ba_timeout_collision, | ||
641 | max_tx->ack_or_ba_timeout_collision); | ||
642 | pos += scnprintf(buf + pos, bufsz - pos, | ||
643 | " %-30s %10u %10u %10u %10u\n", | ||
644 | "agg ba_timeout:", | ||
645 | le32_to_cpu(tx->agg.ba_timeout), | ||
646 | accum_tx->agg.ba_timeout, | ||
647 | delta_tx->agg.ba_timeout, | ||
648 | max_tx->agg.ba_timeout); | ||
649 | pos += scnprintf(buf + pos, bufsz - pos, | ||
650 | " %-30s %10u %10u %10u %10u\n", | ||
651 | "agg ba_resched_frames:", | ||
652 | le32_to_cpu(tx->agg.ba_reschedule_frames), | ||
653 | accum_tx->agg.ba_reschedule_frames, | ||
654 | delta_tx->agg.ba_reschedule_frames, | ||
655 | max_tx->agg.ba_reschedule_frames); | ||
656 | pos += scnprintf(buf + pos, bufsz - pos, | ||
657 | " %-30s %10u %10u %10u %10u\n", | ||
658 | "agg scd_query_agg_frame:", | ||
659 | le32_to_cpu(tx->agg.scd_query_agg_frame_cnt), | ||
660 | accum_tx->agg.scd_query_agg_frame_cnt, | ||
661 | delta_tx->agg.scd_query_agg_frame_cnt, | ||
662 | max_tx->agg.scd_query_agg_frame_cnt); | ||
663 | pos += scnprintf(buf + pos, bufsz - pos, | ||
664 | " %-30s %10u %10u %10u %10u\n", | ||
665 | "agg scd_query_no_agg:", | ||
666 | le32_to_cpu(tx->agg.scd_query_no_agg), | ||
667 | accum_tx->agg.scd_query_no_agg, | ||
668 | delta_tx->agg.scd_query_no_agg, | ||
669 | max_tx->agg.scd_query_no_agg); | ||
670 | pos += scnprintf(buf + pos, bufsz - pos, | ||
671 | " %-30s %10u %10u %10u %10u\n", | ||
672 | "agg scd_query_agg:", | ||
673 | le32_to_cpu(tx->agg.scd_query_agg), | ||
674 | accum_tx->agg.scd_query_agg, | ||
675 | delta_tx->agg.scd_query_agg, | ||
676 | max_tx->agg.scd_query_agg); | ||
677 | pos += scnprintf(buf + pos, bufsz - pos, | ||
678 | " %-30s %10u %10u %10u %10u\n", | ||
679 | "agg scd_query_mismatch:", | ||
680 | le32_to_cpu(tx->agg.scd_query_mismatch), | ||
681 | accum_tx->agg.scd_query_mismatch, | ||
682 | delta_tx->agg.scd_query_mismatch, | ||
683 | max_tx->agg.scd_query_mismatch); | ||
684 | pos += scnprintf(buf + pos, bufsz - pos, | ||
685 | " %-30s %10u %10u %10u %10u\n", | ||
686 | "agg frame_not_ready:", | ||
687 | le32_to_cpu(tx->agg.frame_not_ready), | ||
688 | accum_tx->agg.frame_not_ready, | ||
689 | delta_tx->agg.frame_not_ready, | ||
690 | max_tx->agg.frame_not_ready); | ||
691 | pos += scnprintf(buf + pos, bufsz - pos, | ||
692 | " %-30s %10u %10u %10u %10u\n", | ||
693 | "agg underrun:", | ||
694 | le32_to_cpu(tx->agg.underrun), | ||
695 | accum_tx->agg.underrun, | ||
696 | delta_tx->agg.underrun, max_tx->agg.underrun); | ||
697 | pos += scnprintf(buf + pos, bufsz - pos, | ||
698 | " %-30s %10u %10u %10u %10u\n", | ||
699 | "agg bt_prio_kill:", | ||
700 | le32_to_cpu(tx->agg.bt_prio_kill), | ||
701 | accum_tx->agg.bt_prio_kill, | ||
702 | delta_tx->agg.bt_prio_kill, | ||
703 | max_tx->agg.bt_prio_kill); | ||
704 | pos += scnprintf(buf + pos, bufsz - pos, | ||
705 | " %-30s %10u %10u %10u %10u\n", | ||
706 | "agg rx_ba_rsp_cnt:", | ||
707 | le32_to_cpu(tx->agg.rx_ba_rsp_cnt), | ||
708 | accum_tx->agg.rx_ba_rsp_cnt, | ||
709 | delta_tx->agg.rx_ba_rsp_cnt, | ||
710 | max_tx->agg.rx_ba_rsp_cnt); | ||
711 | |||
712 | ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); | ||
713 | kfree(buf); | ||
714 | return ret; | ||
715 | } | ||
716 | |||
717 | ssize_t iwl_ucode_general_stats_read(struct file *file, char __user *user_buf, | ||
718 | size_t count, loff_t *ppos) | ||
719 | { | ||
720 | struct iwl_priv *priv = file->private_data; | ||
721 | int pos = 0; | ||
722 | char *buf; | ||
723 | int bufsz = sizeof(struct statistics_general) * 10 + 300; | ||
724 | ssize_t ret; | ||
725 | struct statistics_general *general, *accum_general; | ||
726 | struct statistics_general *delta_general, *max_general; | ||
727 | struct statistics_dbg *dbg, *accum_dbg, *delta_dbg, *max_dbg; | ||
728 | struct statistics_div *div, *accum_div, *delta_div, *max_div; | ||
729 | |||
730 | if (!iwl_is_alive(priv)) | ||
731 | return -EAGAIN; | ||
732 | |||
733 | buf = kzalloc(bufsz, GFP_KERNEL); | ||
734 | if (!buf) { | ||
735 | IWL_ERR(priv, "Can not allocate Buffer\n"); | ||
736 | return -ENOMEM; | ||
737 | } | ||
738 | |||
739 | /* the statistic information display here is based on | ||
740 | * the last statistics notification from uCode | ||
741 | * might not reflect the current uCode activity | ||
742 | */ | ||
743 | general = &priv->statistics.general; | ||
744 | dbg = &priv->statistics.general.dbg; | ||
745 | div = &priv->statistics.general.div; | ||
746 | accum_general = &priv->accum_statistics.general; | ||
747 | delta_general = &priv->delta_statistics.general; | ||
748 | max_general = &priv->max_delta.general; | ||
749 | accum_dbg = &priv->accum_statistics.general.dbg; | ||
750 | delta_dbg = &priv->delta_statistics.general.dbg; | ||
751 | max_dbg = &priv->max_delta.general.dbg; | ||
752 | accum_div = &priv->accum_statistics.general.div; | ||
753 | delta_div = &priv->delta_statistics.general.div; | ||
754 | max_div = &priv->max_delta.general.div; | ||
755 | pos += iwl_dbgfs_statistics_flag(priv, buf, bufsz); | ||
756 | pos += scnprintf(buf + pos, bufsz - pos, "%-32s current" | ||
757 | "acumulative delta max\n", | ||
758 | "Statistics_General:"); | ||
759 | pos += scnprintf(buf + pos, bufsz - pos, " %-30s %10u\n", | ||
760 | "temperature:", | ||
761 | le32_to_cpu(general->temperature)); | ||
762 | pos += scnprintf(buf + pos, bufsz - pos, " %-30s %10u\n", | ||
763 | "temperature_m:", | ||
764 | le32_to_cpu(general->temperature_m)); | ||
765 | pos += scnprintf(buf + pos, bufsz - pos, | ||
766 | " %-30s %10u %10u %10u %10u\n", | ||
767 | "burst_check:", | ||
768 | le32_to_cpu(dbg->burst_check), | ||
769 | accum_dbg->burst_check, | ||
770 | delta_dbg->burst_check, max_dbg->burst_check); | ||
771 | pos += scnprintf(buf + pos, bufsz - pos, | ||
772 | " %-30s %10u %10u %10u %10u\n", | ||
773 | "burst_count:", | ||
774 | le32_to_cpu(dbg->burst_count), | ||
775 | accum_dbg->burst_count, | ||
776 | delta_dbg->burst_count, max_dbg->burst_count); | ||
777 | pos += scnprintf(buf + pos, bufsz - pos, | ||
778 | " %-30s %10u %10u %10u %10u\n", | ||
779 | "sleep_time:", | ||
780 | le32_to_cpu(general->sleep_time), | ||
781 | accum_general->sleep_time, | ||
782 | delta_general->sleep_time, max_general->sleep_time); | ||
783 | pos += scnprintf(buf + pos, bufsz - pos, | ||
784 | " %-30s %10u %10u %10u %10u\n", | ||
785 | "slots_out:", | ||
786 | le32_to_cpu(general->slots_out), | ||
787 | accum_general->slots_out, | ||
788 | delta_general->slots_out, max_general->slots_out); | ||
789 | pos += scnprintf(buf + pos, bufsz - pos, | ||
790 | " %-30s %10u %10u %10u %10u\n", | ||
791 | "slots_idle:", | ||
792 | le32_to_cpu(general->slots_idle), | ||
793 | accum_general->slots_idle, | ||
794 | delta_general->slots_idle, max_general->slots_idle); | ||
795 | pos += scnprintf(buf + pos, bufsz - pos, "ttl_timestamp:\t\t\t%u\n", | ||
796 | le32_to_cpu(general->ttl_timestamp)); | ||
797 | pos += scnprintf(buf + pos, bufsz - pos, | ||
798 | " %-30s %10u %10u %10u %10u\n", | ||
799 | "tx_on_a:", | ||
800 | le32_to_cpu(div->tx_on_a), accum_div->tx_on_a, | ||
801 | delta_div->tx_on_a, max_div->tx_on_a); | ||
802 | pos += scnprintf(buf + pos, bufsz - pos, | ||
803 | " %-30s %10u %10u %10u %10u\n", | ||
804 | "tx_on_b:", | ||
805 | le32_to_cpu(div->tx_on_b), accum_div->tx_on_b, | ||
806 | delta_div->tx_on_b, max_div->tx_on_b); | ||
807 | pos += scnprintf(buf + pos, bufsz - pos, | ||
808 | " %-30s %10u %10u %10u %10u\n", | ||
809 | "exec_time:", | ||
810 | le32_to_cpu(div->exec_time), accum_div->exec_time, | ||
811 | delta_div->exec_time, max_div->exec_time); | ||
812 | pos += scnprintf(buf + pos, bufsz - pos, | ||
813 | " %-30s %10u %10u %10u %10u\n", | ||
814 | "probe_time:", | ||
815 | le32_to_cpu(div->probe_time), accum_div->probe_time, | ||
816 | delta_div->probe_time, max_div->probe_time); | ||
817 | pos += scnprintf(buf + pos, bufsz - pos, | ||
818 | " %-30s %10u %10u %10u %10u\n", | ||
819 | "rx_enable_counter:", | ||
820 | le32_to_cpu(general->rx_enable_counter), | ||
821 | accum_general->rx_enable_counter, | ||
822 | delta_general->rx_enable_counter, | ||
823 | max_general->rx_enable_counter); | ||
824 | pos += scnprintf(buf + pos, bufsz - pos, | ||
825 | " %-30s %10u %10u %10u %10u\n", | ||
826 | "num_of_sos_states:", | ||
827 | le32_to_cpu(general->num_of_sos_states), | ||
828 | accum_general->num_of_sos_states, | ||
829 | delta_general->num_of_sos_states, | ||
830 | max_general->num_of_sos_states); | ||
831 | ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); | ||
832 | kfree(buf); | ||
833 | return ret; | ||
834 | } | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-debugfs.h b/drivers/net/wireless/iwlwifi/iwl-agn-debugfs.h new file mode 100644 index 000000000000..59b1f25f0d85 --- /dev/null +++ b/drivers/net/wireless/iwlwifi/iwl-agn-debugfs.h | |||
@@ -0,0 +1,56 @@ | |||
1 | /****************************************************************************** | ||
2 | * | ||
3 | * GPL LICENSE SUMMARY | ||
4 | * | ||
5 | * Copyright(c) 2008 - 2010 Intel Corporation. All rights reserved. | ||
6 | * | ||
7 | * This program is free software; you can redistribute it and/or modify | ||
8 | * it under the terms of version 2 of the GNU General Public License as | ||
9 | * published by the Free Software Foundation. | ||
10 | * | ||
11 | * This program is distributed in the hope that it will be useful, but | ||
12 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
13 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
14 | * General Public License for more details. | ||
15 | * | ||
16 | * You should have received a copy of the GNU General Public License | ||
17 | * along with this program; if not, write to the Free Software | ||
18 | * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110, | ||
19 | * USA | ||
20 | * | ||
21 | * The full GNU General Public License is included in this distribution | ||
22 | * in the file called LICENSE.GPL. | ||
23 | * | ||
24 | * Contact Information: | ||
25 | * Intel Linux Wireless <ilw@linux.intel.com> | ||
26 | * Intel Corporation, 5200 N.E. Elam Young Parkway, Hillsboro, OR 97124-6497 | ||
27 | *****************************************************************************/ | ||
28 | |||
29 | #include "iwl-dev.h" | ||
30 | #include "iwl-core.h" | ||
31 | #include "iwl-debug.h" | ||
32 | |||
33 | #ifdef CONFIG_IWLWIFI_DEBUGFS | ||
34 | ssize_t iwl_ucode_rx_stats_read(struct file *file, char __user *user_buf, | ||
35 | size_t count, loff_t *ppos); | ||
36 | ssize_t iwl_ucode_tx_stats_read(struct file *file, char __user *user_buf, | ||
37 | size_t count, loff_t *ppos); | ||
38 | ssize_t iwl_ucode_general_stats_read(struct file *file, char __user *user_buf, | ||
39 | size_t count, loff_t *ppos); | ||
40 | #else | ||
41 | static ssize_t iwl_ucode_rx_stats_read(struct file *file, char __user *user_buf, | ||
42 | size_t count, loff_t *ppos) | ||
43 | { | ||
44 | return 0; | ||
45 | } | ||
46 | static ssize_t iwl_ucode_tx_stats_read(struct file *file, char __user *user_buf, | ||
47 | size_t count, loff_t *ppos) | ||
48 | { | ||
49 | return 0; | ||
50 | } | ||
51 | static ssize_t iwl_ucode_general_stats_read(struct file *file, char __user *user_buf, | ||
52 | size_t count, loff_t *ppos) | ||
53 | { | ||
54 | return 0; | ||
55 | } | ||
56 | #endif | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c b/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c index 28bc8f8ba981..44ef5d93befc 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-hcmd.c | |||
@@ -262,6 +262,7 @@ struct iwl_hcmd_ops iwlagn_hcmd = { | |||
262 | .commit_rxon = iwl_commit_rxon, | 262 | .commit_rxon = iwl_commit_rxon, |
263 | .set_rxon_chain = iwl_set_rxon_chain, | 263 | .set_rxon_chain = iwl_set_rxon_chain, |
264 | .set_tx_ant = iwlagn_send_tx_ant_config, | 264 | .set_tx_ant = iwlagn_send_tx_ant_config, |
265 | .send_bt_config = iwl_send_bt_config, | ||
265 | }; | 266 | }; |
266 | 267 | ||
267 | struct iwl_hcmd_utils_ops iwlagn_hcmd_utils = { | 268 | struct iwl_hcmd_utils_ops iwlagn_hcmd_utils = { |
@@ -271,4 +272,5 @@ struct iwl_hcmd_utils_ops iwlagn_hcmd_utils = { | |||
271 | .chain_noise_reset = iwlagn_chain_noise_reset, | 272 | .chain_noise_reset = iwlagn_chain_noise_reset, |
272 | .rts_tx_cmd_flag = iwlagn_rts_tx_cmd_flag, | 273 | .rts_tx_cmd_flag = iwlagn_rts_tx_cmd_flag, |
273 | .calc_rssi = iwlagn_calc_rssi, | 274 | .calc_rssi = iwlagn_calc_rssi, |
275 | .request_scan = iwlagn_request_scan, | ||
274 | }; | 276 | }; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c index c465c8590833..4bd0aecc7713 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-lib.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-lib.c | |||
@@ -331,7 +331,7 @@ u16 iwlagn_eeprom_calib_version(struct iwl_priv *priv) | |||
331 | } *hdr; | 331 | } *hdr; |
332 | 332 | ||
333 | hdr = (struct iwl_eeprom_calib_hdr *)iwl_eeprom_query_addr(priv, | 333 | hdr = (struct iwl_eeprom_calib_hdr *)iwl_eeprom_query_addr(priv, |
334 | EEPROM_5000_CALIB_ALL); | 334 | EEPROM_CALIB_ALL); |
335 | return hdr->version; | 335 | return hdr->version; |
336 | 336 | ||
337 | } | 337 | } |
@@ -348,22 +348,22 @@ static u32 eeprom_indirect_address(const struct iwl_priv *priv, u32 address) | |||
348 | 348 | ||
349 | switch (address & INDIRECT_TYPE_MSK) { | 349 | switch (address & INDIRECT_TYPE_MSK) { |
350 | case INDIRECT_HOST: | 350 | case INDIRECT_HOST: |
351 | offset = iwl_eeprom_query16(priv, EEPROM_5000_LINK_HOST); | 351 | offset = iwl_eeprom_query16(priv, EEPROM_LINK_HOST); |
352 | break; | 352 | break; |
353 | case INDIRECT_GENERAL: | 353 | case INDIRECT_GENERAL: |
354 | offset = iwl_eeprom_query16(priv, EEPROM_5000_LINK_GENERAL); | 354 | offset = iwl_eeprom_query16(priv, EEPROM_LINK_GENERAL); |
355 | break; | 355 | break; |
356 | case INDIRECT_REGULATORY: | 356 | case INDIRECT_REGULATORY: |
357 | offset = iwl_eeprom_query16(priv, EEPROM_5000_LINK_REGULATORY); | 357 | offset = iwl_eeprom_query16(priv, EEPROM_LINK_REGULATORY); |
358 | break; | 358 | break; |
359 | case INDIRECT_CALIBRATION: | 359 | case INDIRECT_CALIBRATION: |
360 | offset = iwl_eeprom_query16(priv, EEPROM_5000_LINK_CALIBRATION); | 360 | offset = iwl_eeprom_query16(priv, EEPROM_LINK_CALIBRATION); |
361 | break; | 361 | break; |
362 | case INDIRECT_PROCESS_ADJST: | 362 | case INDIRECT_PROCESS_ADJST: |
363 | offset = iwl_eeprom_query16(priv, EEPROM_5000_LINK_PROCESS_ADJST); | 363 | offset = iwl_eeprom_query16(priv, EEPROM_LINK_PROCESS_ADJST); |
364 | break; | 364 | break; |
365 | case INDIRECT_OTHERS: | 365 | case INDIRECT_OTHERS: |
366 | offset = iwl_eeprom_query16(priv, EEPROM_5000_LINK_OTHERS); | 366 | offset = iwl_eeprom_query16(priv, EEPROM_LINK_OTHERS); |
367 | break; | 367 | break; |
368 | default: | 368 | default: |
369 | IWL_ERR(priv, "illegal indirect type: 0x%X\n", | 369 | IWL_ERR(priv, "illegal indirect type: 0x%X\n", |
@@ -1111,3 +1111,392 @@ void iwlagn_rx_reply_rx_phy(struct iwl_priv *priv, | |||
1111 | memcpy(&priv->_agn.last_phy_res, pkt->u.raw, | 1111 | memcpy(&priv->_agn.last_phy_res, pkt->u.raw, |
1112 | sizeof(struct iwl_rx_phy_res)); | 1112 | sizeof(struct iwl_rx_phy_res)); |
1113 | } | 1113 | } |
1114 | |||
1115 | static int iwl_get_single_channel_for_scan(struct iwl_priv *priv, | ||
1116 | enum ieee80211_band band, | ||
1117 | struct iwl_scan_channel *scan_ch) | ||
1118 | { | ||
1119 | const struct ieee80211_supported_band *sband; | ||
1120 | const struct iwl_channel_info *ch_info; | ||
1121 | u16 passive_dwell = 0; | ||
1122 | u16 active_dwell = 0; | ||
1123 | int i, added = 0; | ||
1124 | u16 channel = 0; | ||
1125 | |||
1126 | sband = iwl_get_hw_mode(priv, band); | ||
1127 | if (!sband) { | ||
1128 | IWL_ERR(priv, "invalid band\n"); | ||
1129 | return added; | ||
1130 | } | ||
1131 | |||
1132 | active_dwell = iwl_get_active_dwell_time(priv, band, 0); | ||
1133 | passive_dwell = iwl_get_passive_dwell_time(priv, band); | ||
1134 | |||
1135 | if (passive_dwell <= active_dwell) | ||
1136 | passive_dwell = active_dwell + 1; | ||
1137 | |||
1138 | /* only scan single channel, good enough to reset the RF */ | ||
1139 | /* pick the first valid not in-use channel */ | ||
1140 | if (band == IEEE80211_BAND_5GHZ) { | ||
1141 | for (i = 14; i < priv->channel_count; i++) { | ||
1142 | if (priv->channel_info[i].channel != | ||
1143 | le16_to_cpu(priv->staging_rxon.channel)) { | ||
1144 | channel = priv->channel_info[i].channel; | ||
1145 | ch_info = iwl_get_channel_info(priv, | ||
1146 | band, channel); | ||
1147 | if (is_channel_valid(ch_info)) | ||
1148 | break; | ||
1149 | } | ||
1150 | } | ||
1151 | } else { | ||
1152 | for (i = 0; i < 14; i++) { | ||
1153 | if (priv->channel_info[i].channel != | ||
1154 | le16_to_cpu(priv->staging_rxon.channel)) { | ||
1155 | channel = | ||
1156 | priv->channel_info[i].channel; | ||
1157 | ch_info = iwl_get_channel_info(priv, | ||
1158 | band, channel); | ||
1159 | if (is_channel_valid(ch_info)) | ||
1160 | break; | ||
1161 | } | ||
1162 | } | ||
1163 | } | ||
1164 | if (channel) { | ||
1165 | scan_ch->channel = cpu_to_le16(channel); | ||
1166 | scan_ch->type = SCAN_CHANNEL_TYPE_PASSIVE; | ||
1167 | scan_ch->active_dwell = cpu_to_le16(active_dwell); | ||
1168 | scan_ch->passive_dwell = cpu_to_le16(passive_dwell); | ||
1169 | /* Set txpower levels to defaults */ | ||
1170 | scan_ch->dsp_atten = 110; | ||
1171 | if (band == IEEE80211_BAND_5GHZ) | ||
1172 | scan_ch->tx_gain = ((1 << 5) | (3 << 3)) | 3; | ||
1173 | else | ||
1174 | scan_ch->tx_gain = ((1 << 5) | (5 << 3)); | ||
1175 | added++; | ||
1176 | } else | ||
1177 | IWL_ERR(priv, "no valid channel found\n"); | ||
1178 | return added; | ||
1179 | } | ||
1180 | |||
1181 | static int iwl_get_channels_for_scan(struct iwl_priv *priv, | ||
1182 | enum ieee80211_band band, | ||
1183 | u8 is_active, u8 n_probes, | ||
1184 | struct iwl_scan_channel *scan_ch) | ||
1185 | { | ||
1186 | struct ieee80211_channel *chan; | ||
1187 | const struct ieee80211_supported_band *sband; | ||
1188 | const struct iwl_channel_info *ch_info; | ||
1189 | u16 passive_dwell = 0; | ||
1190 | u16 active_dwell = 0; | ||
1191 | int added, i; | ||
1192 | u16 channel; | ||
1193 | |||
1194 | sband = iwl_get_hw_mode(priv, band); | ||
1195 | if (!sband) | ||
1196 | return 0; | ||
1197 | |||
1198 | active_dwell = iwl_get_active_dwell_time(priv, band, n_probes); | ||
1199 | passive_dwell = iwl_get_passive_dwell_time(priv, band); | ||
1200 | |||
1201 | if (passive_dwell <= active_dwell) | ||
1202 | passive_dwell = active_dwell + 1; | ||
1203 | |||
1204 | for (i = 0, added = 0; i < priv->scan_request->n_channels; i++) { | ||
1205 | chan = priv->scan_request->channels[i]; | ||
1206 | |||
1207 | if (chan->band != band) | ||
1208 | continue; | ||
1209 | |||
1210 | channel = ieee80211_frequency_to_channel(chan->center_freq); | ||
1211 | scan_ch->channel = cpu_to_le16(channel); | ||
1212 | |||
1213 | ch_info = iwl_get_channel_info(priv, band, channel); | ||
1214 | if (!is_channel_valid(ch_info)) { | ||
1215 | IWL_DEBUG_SCAN(priv, "Channel %d is INVALID for this band.\n", | ||
1216 | channel); | ||
1217 | continue; | ||
1218 | } | ||
1219 | |||
1220 | if (!is_active || is_channel_passive(ch_info) || | ||
1221 | (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN)) | ||
1222 | scan_ch->type = SCAN_CHANNEL_TYPE_PASSIVE; | ||
1223 | else | ||
1224 | scan_ch->type = SCAN_CHANNEL_TYPE_ACTIVE; | ||
1225 | |||
1226 | if (n_probes) | ||
1227 | scan_ch->type |= IWL_SCAN_PROBE_MASK(n_probes); | ||
1228 | |||
1229 | scan_ch->active_dwell = cpu_to_le16(active_dwell); | ||
1230 | scan_ch->passive_dwell = cpu_to_le16(passive_dwell); | ||
1231 | |||
1232 | /* Set txpower levels to defaults */ | ||
1233 | scan_ch->dsp_atten = 110; | ||
1234 | |||
1235 | /* NOTE: if we were doing 6Mb OFDM for scans we'd use | ||
1236 | * power level: | ||
1237 | * scan_ch->tx_gain = ((1 << 5) | (2 << 3)) | 3; | ||
1238 | */ | ||
1239 | if (band == IEEE80211_BAND_5GHZ) | ||
1240 | scan_ch->tx_gain = ((1 << 5) | (3 << 3)) | 3; | ||
1241 | else | ||
1242 | scan_ch->tx_gain = ((1 << 5) | (5 << 3)); | ||
1243 | |||
1244 | IWL_DEBUG_SCAN(priv, "Scanning ch=%d prob=0x%X [%s %d]\n", | ||
1245 | channel, le32_to_cpu(scan_ch->type), | ||
1246 | (scan_ch->type & SCAN_CHANNEL_TYPE_ACTIVE) ? | ||
1247 | "ACTIVE" : "PASSIVE", | ||
1248 | (scan_ch->type & SCAN_CHANNEL_TYPE_ACTIVE) ? | ||
1249 | active_dwell : passive_dwell); | ||
1250 | |||
1251 | scan_ch++; | ||
1252 | added++; | ||
1253 | } | ||
1254 | |||
1255 | IWL_DEBUG_SCAN(priv, "total channels to scan %d\n", added); | ||
1256 | return added; | ||
1257 | } | ||
1258 | |||
1259 | void iwlagn_request_scan(struct iwl_priv *priv) | ||
1260 | { | ||
1261 | struct iwl_host_cmd cmd = { | ||
1262 | .id = REPLY_SCAN_CMD, | ||
1263 | .len = sizeof(struct iwl_scan_cmd), | ||
1264 | .flags = CMD_SIZE_HUGE, | ||
1265 | }; | ||
1266 | struct iwl_scan_cmd *scan; | ||
1267 | struct ieee80211_conf *conf = NULL; | ||
1268 | u32 rate_flags = 0; | ||
1269 | u16 cmd_len; | ||
1270 | u16 rx_chain = 0; | ||
1271 | enum ieee80211_band band; | ||
1272 | u8 n_probes = 0; | ||
1273 | u8 rx_ant = priv->hw_params.valid_rx_ant; | ||
1274 | u8 rate; | ||
1275 | bool is_active = false; | ||
1276 | int chan_mod; | ||
1277 | u8 active_chains; | ||
1278 | |||
1279 | conf = ieee80211_get_hw_conf(priv->hw); | ||
1280 | |||
1281 | cancel_delayed_work(&priv->scan_check); | ||
1282 | |||
1283 | if (!iwl_is_ready(priv)) { | ||
1284 | IWL_WARN(priv, "request scan called when driver not ready.\n"); | ||
1285 | goto done; | ||
1286 | } | ||
1287 | |||
1288 | /* Make sure the scan wasn't canceled before this queued work | ||
1289 | * was given the chance to run... */ | ||
1290 | if (!test_bit(STATUS_SCANNING, &priv->status)) | ||
1291 | goto done; | ||
1292 | |||
1293 | /* This should never be called or scheduled if there is currently | ||
1294 | * a scan active in the hardware. */ | ||
1295 | if (test_bit(STATUS_SCAN_HW, &priv->status)) { | ||
1296 | IWL_DEBUG_INFO(priv, "Multiple concurrent scan requests in parallel. " | ||
1297 | "Ignoring second request.\n"); | ||
1298 | goto done; | ||
1299 | } | ||
1300 | |||
1301 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) { | ||
1302 | IWL_DEBUG_SCAN(priv, "Aborting scan due to device shutdown\n"); | ||
1303 | goto done; | ||
1304 | } | ||
1305 | |||
1306 | if (test_bit(STATUS_SCAN_ABORTING, &priv->status)) { | ||
1307 | IWL_DEBUG_HC(priv, "Scan request while abort pending. Queuing.\n"); | ||
1308 | goto done; | ||
1309 | } | ||
1310 | |||
1311 | if (iwl_is_rfkill(priv)) { | ||
1312 | IWL_DEBUG_HC(priv, "Aborting scan due to RF Kill activation\n"); | ||
1313 | goto done; | ||
1314 | } | ||
1315 | |||
1316 | if (!test_bit(STATUS_READY, &priv->status)) { | ||
1317 | IWL_DEBUG_HC(priv, "Scan request while uninitialized. Queuing.\n"); | ||
1318 | goto done; | ||
1319 | } | ||
1320 | |||
1321 | if (!priv->scan_cmd) { | ||
1322 | priv->scan_cmd = kmalloc(sizeof(struct iwl_scan_cmd) + | ||
1323 | IWL_MAX_SCAN_SIZE, GFP_KERNEL); | ||
1324 | if (!priv->scan_cmd) { | ||
1325 | IWL_DEBUG_SCAN(priv, | ||
1326 | "fail to allocate memory for scan\n"); | ||
1327 | goto done; | ||
1328 | } | ||
1329 | } | ||
1330 | scan = priv->scan_cmd; | ||
1331 | memset(scan, 0, sizeof(struct iwl_scan_cmd) + IWL_MAX_SCAN_SIZE); | ||
1332 | |||
1333 | scan->quiet_plcp_th = IWL_PLCP_QUIET_THRESH; | ||
1334 | scan->quiet_time = IWL_ACTIVE_QUIET_TIME; | ||
1335 | |||
1336 | if (iwl_is_associated(priv)) { | ||
1337 | u16 interval = 0; | ||
1338 | u32 extra; | ||
1339 | u32 suspend_time = 100; | ||
1340 | u32 scan_suspend_time = 100; | ||
1341 | unsigned long flags; | ||
1342 | |||
1343 | IWL_DEBUG_INFO(priv, "Scanning while associated...\n"); | ||
1344 | spin_lock_irqsave(&priv->lock, flags); | ||
1345 | interval = priv->beacon_int; | ||
1346 | spin_unlock_irqrestore(&priv->lock, flags); | ||
1347 | |||
1348 | scan->suspend_time = 0; | ||
1349 | scan->max_out_time = cpu_to_le32(200 * 1024); | ||
1350 | if (!interval) | ||
1351 | interval = suspend_time; | ||
1352 | |||
1353 | extra = (suspend_time / interval) << 22; | ||
1354 | scan_suspend_time = (extra | | ||
1355 | ((suspend_time % interval) * 1024)); | ||
1356 | scan->suspend_time = cpu_to_le32(scan_suspend_time); | ||
1357 | IWL_DEBUG_SCAN(priv, "suspend_time 0x%X beacon interval %d\n", | ||
1358 | scan_suspend_time, interval); | ||
1359 | } | ||
1360 | |||
1361 | if (priv->is_internal_short_scan) { | ||
1362 | IWL_DEBUG_SCAN(priv, "Start internal passive scan.\n"); | ||
1363 | } else if (priv->scan_request->n_ssids) { | ||
1364 | int i, p = 0; | ||
1365 | IWL_DEBUG_SCAN(priv, "Kicking off active scan\n"); | ||
1366 | for (i = 0; i < priv->scan_request->n_ssids; i++) { | ||
1367 | /* always does wildcard anyway */ | ||
1368 | if (!priv->scan_request->ssids[i].ssid_len) | ||
1369 | continue; | ||
1370 | scan->direct_scan[p].id = WLAN_EID_SSID; | ||
1371 | scan->direct_scan[p].len = | ||
1372 | priv->scan_request->ssids[i].ssid_len; | ||
1373 | memcpy(scan->direct_scan[p].ssid, | ||
1374 | priv->scan_request->ssids[i].ssid, | ||
1375 | priv->scan_request->ssids[i].ssid_len); | ||
1376 | n_probes++; | ||
1377 | p++; | ||
1378 | } | ||
1379 | is_active = true; | ||
1380 | } else | ||
1381 | IWL_DEBUG_SCAN(priv, "Start passive scan.\n"); | ||
1382 | |||
1383 | scan->tx_cmd.tx_flags = TX_CMD_FLG_SEQ_CTL_MSK; | ||
1384 | scan->tx_cmd.sta_id = priv->hw_params.bcast_sta_id; | ||
1385 | scan->tx_cmd.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE; | ||
1386 | |||
1387 | switch (priv->scan_band) { | ||
1388 | case IEEE80211_BAND_2GHZ: | ||
1389 | scan->flags = RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK; | ||
1390 | chan_mod = le32_to_cpu(priv->active_rxon.flags & RXON_FLG_CHANNEL_MODE_MSK) | ||
1391 | >> RXON_FLG_CHANNEL_MODE_POS; | ||
1392 | if (chan_mod == CHANNEL_MODE_PURE_40) { | ||
1393 | rate = IWL_RATE_6M_PLCP; | ||
1394 | } else { | ||
1395 | rate = IWL_RATE_1M_PLCP; | ||
1396 | rate_flags = RATE_MCS_CCK_MSK; | ||
1397 | } | ||
1398 | scan->good_CRC_th = 0; | ||
1399 | break; | ||
1400 | case IEEE80211_BAND_5GHZ: | ||
1401 | rate = IWL_RATE_6M_PLCP; | ||
1402 | /* | ||
1403 | * If active scaning is requested but a certain channel | ||
1404 | * is marked passive, we can do active scanning if we | ||
1405 | * detect transmissions. | ||
1406 | */ | ||
1407 | scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH : 0; | ||
1408 | break; | ||
1409 | default: | ||
1410 | IWL_WARN(priv, "Invalid scan band count\n"); | ||
1411 | goto done; | ||
1412 | } | ||
1413 | |||
1414 | band = priv->scan_band; | ||
1415 | |||
1416 | if (priv->cfg->scan_antennas[band]) | ||
1417 | rx_ant = priv->cfg->scan_antennas[band]; | ||
1418 | |||
1419 | priv->scan_tx_ant[band] = | ||
1420 | iwl_toggle_tx_ant(priv, priv->scan_tx_ant[band]); | ||
1421 | rate_flags |= iwl_ant_idx_to_flags(priv->scan_tx_ant[band]); | ||
1422 | scan->tx_cmd.rate_n_flags = iwl_hw_set_rate_n_flags(rate, rate_flags); | ||
1423 | |||
1424 | /* In power save mode use one chain, otherwise use all chains */ | ||
1425 | if (test_bit(STATUS_POWER_PMI, &priv->status)) { | ||
1426 | /* rx_ant has been set to all valid chains previously */ | ||
1427 | active_chains = rx_ant & | ||
1428 | ((u8)(priv->chain_noise_data.active_chains)); | ||
1429 | if (!active_chains) | ||
1430 | active_chains = rx_ant; | ||
1431 | |||
1432 | IWL_DEBUG_SCAN(priv, "chain_noise_data.active_chains: %u\n", | ||
1433 | priv->chain_noise_data.active_chains); | ||
1434 | |||
1435 | rx_ant = first_antenna(active_chains); | ||
1436 | } | ||
1437 | /* MIMO is not used here, but value is required */ | ||
1438 | rx_chain |= priv->hw_params.valid_rx_ant << RXON_RX_CHAIN_VALID_POS; | ||
1439 | rx_chain |= rx_ant << RXON_RX_CHAIN_FORCE_MIMO_SEL_POS; | ||
1440 | rx_chain |= rx_ant << RXON_RX_CHAIN_FORCE_SEL_POS; | ||
1441 | rx_chain |= 0x1 << RXON_RX_CHAIN_DRIVER_FORCE_POS; | ||
1442 | scan->rx_chain = cpu_to_le16(rx_chain); | ||
1443 | if (!priv->is_internal_short_scan) { | ||
1444 | cmd_len = iwl_fill_probe_req(priv, | ||
1445 | (struct ieee80211_mgmt *)scan->data, | ||
1446 | priv->scan_request->ie, | ||
1447 | priv->scan_request->ie_len, | ||
1448 | IWL_MAX_SCAN_SIZE - sizeof(*scan)); | ||
1449 | } else { | ||
1450 | cmd_len = iwl_fill_probe_req(priv, | ||
1451 | (struct ieee80211_mgmt *)scan->data, | ||
1452 | NULL, 0, | ||
1453 | IWL_MAX_SCAN_SIZE - sizeof(*scan)); | ||
1454 | |||
1455 | } | ||
1456 | scan->tx_cmd.len = cpu_to_le16(cmd_len); | ||
1457 | |||
1458 | scan->filter_flags |= (RXON_FILTER_ACCEPT_GRP_MSK | | ||
1459 | RXON_FILTER_BCON_AWARE_MSK); | ||
1460 | |||
1461 | if (priv->is_internal_short_scan) { | ||
1462 | scan->channel_count = | ||
1463 | iwl_get_single_channel_for_scan(priv, band, | ||
1464 | (void *)&scan->data[le16_to_cpu( | ||
1465 | scan->tx_cmd.len)]); | ||
1466 | } else { | ||
1467 | scan->channel_count = | ||
1468 | iwl_get_channels_for_scan(priv, band, | ||
1469 | is_active, n_probes, | ||
1470 | (void *)&scan->data[le16_to_cpu( | ||
1471 | scan->tx_cmd.len)]); | ||
1472 | } | ||
1473 | if (scan->channel_count == 0) { | ||
1474 | IWL_DEBUG_SCAN(priv, "channel count %d\n", scan->channel_count); | ||
1475 | goto done; | ||
1476 | } | ||
1477 | |||
1478 | cmd.len += le16_to_cpu(scan->tx_cmd.len) + | ||
1479 | scan->channel_count * sizeof(struct iwl_scan_channel); | ||
1480 | cmd.data = scan; | ||
1481 | scan->len = cpu_to_le16(cmd.len); | ||
1482 | |||
1483 | set_bit(STATUS_SCAN_HW, &priv->status); | ||
1484 | if (iwl_send_cmd_sync(priv, &cmd)) | ||
1485 | goto done; | ||
1486 | |||
1487 | queue_delayed_work(priv->workqueue, &priv->scan_check, | ||
1488 | IWL_SCAN_CHECK_WATCHDOG); | ||
1489 | |||
1490 | return; | ||
1491 | |||
1492 | done: | ||
1493 | /* Cannot perform scan. Make sure we clear scanning | ||
1494 | * bits from status so next scan request can be performed. | ||
1495 | * If we don't clear scanning status bit here all next scan | ||
1496 | * will fail | ||
1497 | */ | ||
1498 | clear_bit(STATUS_SCAN_HW, &priv->status); | ||
1499 | clear_bit(STATUS_SCANNING, &priv->status); | ||
1500 | /* inform mac80211 scan aborted */ | ||
1501 | queue_work(priv->workqueue, &priv->scan_completed); | ||
1502 | } | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c index f7d85a2173c8..0e6161d7c764 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-rs.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-rs.c | |||
@@ -295,11 +295,11 @@ static u32 rs_tl_get_load(struct iwl_lq_sta *lq_data, u8 tid) | |||
295 | return tl->total; | 295 | return tl->total; |
296 | } | 296 | } |
297 | 297 | ||
298 | static void rs_tl_turn_on_agg_for_tid(struct iwl_priv *priv, | 298 | static int rs_tl_turn_on_agg_for_tid(struct iwl_priv *priv, |
299 | struct iwl_lq_sta *lq_data, u8 tid, | 299 | struct iwl_lq_sta *lq_data, u8 tid, |
300 | struct ieee80211_sta *sta) | 300 | struct ieee80211_sta *sta) |
301 | { | 301 | { |
302 | int ret; | 302 | int ret = -EAGAIN; |
303 | 303 | ||
304 | if (rs_tl_get_load(lq_data, tid) > IWL_AGG_LOAD_THRESHOLD) { | 304 | if (rs_tl_get_load(lq_data, tid) > IWL_AGG_LOAD_THRESHOLD) { |
305 | IWL_DEBUG_HT(priv, "Starting Tx agg: STA: %pM tid: %d\n", | 305 | IWL_DEBUG_HT(priv, "Starting Tx agg: STA: %pM tid: %d\n", |
@@ -313,29 +313,29 @@ static void rs_tl_turn_on_agg_for_tid(struct iwl_priv *priv, | |||
313 | */ | 313 | */ |
314 | IWL_DEBUG_HT(priv, "Fail start Tx agg on tid: %d\n", | 314 | IWL_DEBUG_HT(priv, "Fail start Tx agg on tid: %d\n", |
315 | tid); | 315 | tid); |
316 | ret = ieee80211_stop_tx_ba_session(sta, tid, | 316 | ieee80211_stop_tx_ba_session(sta, tid, |
317 | WLAN_BACK_INITIATOR); | 317 | WLAN_BACK_INITIATOR); |
318 | } | 318 | } |
319 | } | 319 | } else |
320 | IWL_ERR(priv, "Fail finding valid aggregation tid: %d\n", tid); | ||
321 | return ret; | ||
320 | } | 322 | } |
321 | 323 | ||
322 | static void rs_tl_turn_on_agg(struct iwl_priv *priv, u8 tid, | 324 | static void rs_tl_turn_on_agg(struct iwl_priv *priv, u8 tid, |
323 | struct iwl_lq_sta *lq_data, | 325 | struct iwl_lq_sta *lq_data, |
324 | struct ieee80211_sta *sta) | 326 | struct ieee80211_sta *sta) |
325 | { | 327 | { |
326 | if ((tid < TID_MAX_LOAD_COUNT)) | 328 | if ((tid < TID_MAX_LOAD_COUNT) && |
327 | rs_tl_turn_on_agg_for_tid(priv, lq_data, tid, sta); | 329 | !rs_tl_turn_on_agg_for_tid(priv, lq_data, tid, sta)) { |
328 | else if (tid == IWL_AGG_ALL_TID) | 330 | if (priv->cfg->use_rts_for_ht) { |
329 | for (tid = 0; tid < TID_MAX_LOAD_COUNT; tid++) | 331 | /* |
330 | rs_tl_turn_on_agg_for_tid(priv, lq_data, tid, sta); | 332 | * switch to RTS/CTS if it is the prefer protection |
331 | if (priv->cfg->use_rts_for_ht) { | 333 | * method for HT traffic |
332 | /* | 334 | */ |
333 | * switch to RTS/CTS if it is the prefer protection method | 335 | IWL_DEBUG_HT(priv, "use RTS/CTS protection for HT\n"); |
334 | * for HT traffic | 336 | priv->staging_rxon.flags &= ~RXON_FLG_SELF_CTS_EN; |
335 | */ | 337 | iwlcore_commit_rxon(priv); |
336 | IWL_DEBUG_HT(priv, "use RTS/CTS protection for HT\n"); | 338 | } |
337 | priv->staging_rxon.flags &= ~RXON_FLG_SELF_CTS_EN; | ||
338 | iwlcore_commit_rxon(priv); | ||
339 | } | 339 | } |
340 | } | 340 | } |
341 | 341 | ||
@@ -2558,8 +2558,17 @@ void iwl_rs_rate_init(struct iwl_priv *priv, struct ieee80211_sta *sta, u8 sta_i | |||
2558 | lq_sta->active_mimo3_rate); | 2558 | lq_sta->active_mimo3_rate); |
2559 | 2559 | ||
2560 | /* These values will be overridden later */ | 2560 | /* These values will be overridden later */ |
2561 | lq_sta->lq.general_params.single_stream_ant_msk = ANT_A; | 2561 | lq_sta->lq.general_params.single_stream_ant_msk = |
2562 | lq_sta->lq.general_params.dual_stream_ant_msk = ANT_AB; | 2562 | first_antenna(priv->hw_params.valid_tx_ant); |
2563 | lq_sta->lq.general_params.dual_stream_ant_msk = | ||
2564 | priv->hw_params.valid_tx_ant & | ||
2565 | ~first_antenna(priv->hw_params.valid_tx_ant); | ||
2566 | if (!lq_sta->lq.general_params.dual_stream_ant_msk) { | ||
2567 | lq_sta->lq.general_params.dual_stream_ant_msk = ANT_AB; | ||
2568 | } else if (num_of_ant(priv->hw_params.valid_tx_ant) == 2) { | ||
2569 | lq_sta->lq.general_params.dual_stream_ant_msk = | ||
2570 | priv->hw_params.valid_tx_ant; | ||
2571 | } | ||
2563 | 2572 | ||
2564 | /* as default allow aggregation for all tids */ | 2573 | /* as default allow aggregation for all tids */ |
2565 | lq_sta->tx_agg_tid_en = IWL_AGG_ALL_TID; | 2574 | lq_sta->tx_agg_tid_en = IWL_AGG_ALL_TID; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c index 3077eac58880..11661fa28f21 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-tx.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-tx.c | |||
@@ -167,7 +167,7 @@ static int iwlagn_tx_queue_set_q2ratid(struct iwl_priv *priv, u16 ra_tid, | |||
167 | scd_q2ratid = ra_tid & IWL_SCD_QUEUE_RA_TID_MAP_RATID_MSK; | 167 | scd_q2ratid = ra_tid & IWL_SCD_QUEUE_RA_TID_MAP_RATID_MSK; |
168 | 168 | ||
169 | tbl_dw_addr = priv->scd_base_addr + | 169 | tbl_dw_addr = priv->scd_base_addr + |
170 | IWL50_SCD_TRANSLATE_TBL_OFFSET_QUEUE(txq_id); | 170 | IWLAGN_SCD_TRANSLATE_TBL_OFFSET_QUEUE(txq_id); |
171 | 171 | ||
172 | tbl_dw = iwl_read_targ_mem(priv, tbl_dw_addr); | 172 | tbl_dw = iwl_read_targ_mem(priv, tbl_dw_addr); |
173 | 173 | ||
@@ -186,9 +186,9 @@ static void iwlagn_tx_queue_stop_scheduler(struct iwl_priv *priv, u16 txq_id) | |||
186 | /* Simply stop the queue, but don't change any configuration; | 186 | /* Simply stop the queue, but don't change any configuration; |
187 | * the SCD_ACT_EN bit is the write-enable mask for the ACTIVE bit. */ | 187 | * the SCD_ACT_EN bit is the write-enable mask for the ACTIVE bit. */ |
188 | iwl_write_prph(priv, | 188 | iwl_write_prph(priv, |
189 | IWL50_SCD_QUEUE_STATUS_BITS(txq_id), | 189 | IWLAGN_SCD_QUEUE_STATUS_BITS(txq_id), |
190 | (0 << IWL50_SCD_QUEUE_STTS_REG_POS_ACTIVE)| | 190 | (0 << IWLAGN_SCD_QUEUE_STTS_REG_POS_ACTIVE)| |
191 | (1 << IWL50_SCD_QUEUE_STTS_REG_POS_SCD_ACT_EN)); | 191 | (1 << IWLAGN_SCD_QUEUE_STTS_REG_POS_SCD_ACT_EN)); |
192 | } | 192 | } |
193 | 193 | ||
194 | void iwlagn_set_wr_ptrs(struct iwl_priv *priv, | 194 | void iwlagn_set_wr_ptrs(struct iwl_priv *priv, |
@@ -196,7 +196,7 @@ void iwlagn_set_wr_ptrs(struct iwl_priv *priv, | |||
196 | { | 196 | { |
197 | iwl_write_direct32(priv, HBUS_TARG_WRPTR, | 197 | iwl_write_direct32(priv, HBUS_TARG_WRPTR, |
198 | (index & 0xff) | (txq_id << 8)); | 198 | (index & 0xff) | (txq_id << 8)); |
199 | iwl_write_prph(priv, IWL50_SCD_QUEUE_RDPTR(txq_id), index); | 199 | iwl_write_prph(priv, IWLAGN_SCD_QUEUE_RDPTR(txq_id), index); |
200 | } | 200 | } |
201 | 201 | ||
202 | void iwlagn_tx_queue_set_status(struct iwl_priv *priv, | 202 | void iwlagn_tx_queue_set_status(struct iwl_priv *priv, |
@@ -206,11 +206,11 @@ void iwlagn_tx_queue_set_status(struct iwl_priv *priv, | |||
206 | int txq_id = txq->q.id; | 206 | int txq_id = txq->q.id; |
207 | int active = test_bit(txq_id, &priv->txq_ctx_active_msk) ? 1 : 0; | 207 | int active = test_bit(txq_id, &priv->txq_ctx_active_msk) ? 1 : 0; |
208 | 208 | ||
209 | iwl_write_prph(priv, IWL50_SCD_QUEUE_STATUS_BITS(txq_id), | 209 | iwl_write_prph(priv, IWLAGN_SCD_QUEUE_STATUS_BITS(txq_id), |
210 | (active << IWL50_SCD_QUEUE_STTS_REG_POS_ACTIVE) | | 210 | (active << IWLAGN_SCD_QUEUE_STTS_REG_POS_ACTIVE) | |
211 | (tx_fifo_id << IWL50_SCD_QUEUE_STTS_REG_POS_TXF) | | 211 | (tx_fifo_id << IWLAGN_SCD_QUEUE_STTS_REG_POS_TXF) | |
212 | (1 << IWL50_SCD_QUEUE_STTS_REG_POS_WSL) | | 212 | (1 << IWLAGN_SCD_QUEUE_STTS_REG_POS_WSL) | |
213 | IWL50_SCD_QUEUE_STTS_REG_MSK); | 213 | IWLAGN_SCD_QUEUE_STTS_REG_MSK); |
214 | 214 | ||
215 | txq->sched_retry = scd_retry; | 215 | txq->sched_retry = scd_retry; |
216 | 216 | ||
@@ -250,10 +250,10 @@ int iwlagn_txq_agg_enable(struct iwl_priv *priv, int txq_id, | |||
250 | iwlagn_tx_queue_set_q2ratid(priv, ra_tid, txq_id); | 250 | iwlagn_tx_queue_set_q2ratid(priv, ra_tid, txq_id); |
251 | 251 | ||
252 | /* Set this queue as a chain-building queue */ | 252 | /* Set this queue as a chain-building queue */ |
253 | iwl_set_bits_prph(priv, IWL50_SCD_QUEUECHAIN_SEL, (1<<txq_id)); | 253 | iwl_set_bits_prph(priv, IWLAGN_SCD_QUEUECHAIN_SEL, (1<<txq_id)); |
254 | 254 | ||
255 | /* enable aggregations for the queue */ | 255 | /* enable aggregations for the queue */ |
256 | iwl_set_bits_prph(priv, IWL50_SCD_AGGR_SEL, (1<<txq_id)); | 256 | iwl_set_bits_prph(priv, IWLAGN_SCD_AGGR_SEL, (1<<txq_id)); |
257 | 257 | ||
258 | /* Place first TFD at index corresponding to start sequence number. | 258 | /* Place first TFD at index corresponding to start sequence number. |
259 | * Assumes that ssn_idx is valid (!= 0xFFF) */ | 259 | * Assumes that ssn_idx is valid (!= 0xFFF) */ |
@@ -263,16 +263,16 @@ int iwlagn_txq_agg_enable(struct iwl_priv *priv, int txq_id, | |||
263 | 263 | ||
264 | /* Set up Tx window size and frame limit for this queue */ | 264 | /* Set up Tx window size and frame limit for this queue */ |
265 | iwl_write_targ_mem(priv, priv->scd_base_addr + | 265 | iwl_write_targ_mem(priv, priv->scd_base_addr + |
266 | IWL50_SCD_CONTEXT_QUEUE_OFFSET(txq_id) + | 266 | IWLAGN_SCD_CONTEXT_QUEUE_OFFSET(txq_id) + |
267 | sizeof(u32), | 267 | sizeof(u32), |
268 | ((SCD_WIN_SIZE << | 268 | ((SCD_WIN_SIZE << |
269 | IWL50_SCD_QUEUE_CTX_REG2_WIN_SIZE_POS) & | 269 | IWLAGN_SCD_QUEUE_CTX_REG2_WIN_SIZE_POS) & |
270 | IWL50_SCD_QUEUE_CTX_REG2_WIN_SIZE_MSK) | | 270 | IWLAGN_SCD_QUEUE_CTX_REG2_WIN_SIZE_MSK) | |
271 | ((SCD_FRAME_LIMIT << | 271 | ((SCD_FRAME_LIMIT << |
272 | IWL50_SCD_QUEUE_CTX_REG2_FRAME_LIMIT_POS) & | 272 | IWLAGN_SCD_QUEUE_CTX_REG2_FRAME_LIMIT_POS) & |
273 | IWL50_SCD_QUEUE_CTX_REG2_FRAME_LIMIT_MSK)); | 273 | IWLAGN_SCD_QUEUE_CTX_REG2_FRAME_LIMIT_MSK)); |
274 | 274 | ||
275 | iwl_set_bits_prph(priv, IWL50_SCD_INTERRUPT_MASK, (1 << txq_id)); | 275 | iwl_set_bits_prph(priv, IWLAGN_SCD_INTERRUPT_MASK, (1 << txq_id)); |
276 | 276 | ||
277 | /* Set up Status area in SRAM, map to Tx DMA/FIFO, activate the queue */ | 277 | /* Set up Status area in SRAM, map to Tx DMA/FIFO, activate the queue */ |
278 | iwlagn_tx_queue_set_status(priv, &priv->txq[txq_id], tx_fifo, 1); | 278 | iwlagn_tx_queue_set_status(priv, &priv->txq[txq_id], tx_fifo, 1); |
@@ -298,14 +298,14 @@ int iwlagn_txq_agg_disable(struct iwl_priv *priv, u16 txq_id, | |||
298 | 298 | ||
299 | iwlagn_tx_queue_stop_scheduler(priv, txq_id); | 299 | iwlagn_tx_queue_stop_scheduler(priv, txq_id); |
300 | 300 | ||
301 | iwl_clear_bits_prph(priv, IWL50_SCD_AGGR_SEL, (1 << txq_id)); | 301 | iwl_clear_bits_prph(priv, IWLAGN_SCD_AGGR_SEL, (1 << txq_id)); |
302 | 302 | ||
303 | priv->txq[txq_id].q.read_ptr = (ssn_idx & 0xff); | 303 | priv->txq[txq_id].q.read_ptr = (ssn_idx & 0xff); |
304 | priv->txq[txq_id].q.write_ptr = (ssn_idx & 0xff); | 304 | priv->txq[txq_id].q.write_ptr = (ssn_idx & 0xff); |
305 | /* supposes that ssn_idx is valid (!= 0xFFF) */ | 305 | /* supposes that ssn_idx is valid (!= 0xFFF) */ |
306 | iwlagn_set_wr_ptrs(priv, txq_id, ssn_idx); | 306 | iwlagn_set_wr_ptrs(priv, txq_id, ssn_idx); |
307 | 307 | ||
308 | iwl_clear_bits_prph(priv, IWL50_SCD_INTERRUPT_MASK, (1 << txq_id)); | 308 | iwl_clear_bits_prph(priv, IWLAGN_SCD_INTERRUPT_MASK, (1 << txq_id)); |
309 | iwl_txq_ctx_deactivate(priv, txq_id); | 309 | iwl_txq_ctx_deactivate(priv, txq_id); |
310 | iwlagn_tx_queue_set_status(priv, &priv->txq[txq_id], tx_fifo, 0); | 310 | iwlagn_tx_queue_set_status(priv, &priv->txq[txq_id], tx_fifo, 0); |
311 | 311 | ||
@@ -318,7 +318,7 @@ int iwlagn_txq_agg_disable(struct iwl_priv *priv, u16 txq_id, | |||
318 | */ | 318 | */ |
319 | void iwlagn_txq_set_sched(struct iwl_priv *priv, u32 mask) | 319 | void iwlagn_txq_set_sched(struct iwl_priv *priv, u32 mask) |
320 | { | 320 | { |
321 | iwl_write_prph(priv, IWL50_SCD_TXFACT, mask); | 321 | iwl_write_prph(priv, IWLAGN_SCD_TXFACT, mask); |
322 | } | 322 | } |
323 | 323 | ||
324 | static inline int get_queue_from_ac(u16 ac) | 324 | static inline int get_queue_from_ac(u16 ac) |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c b/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c index 52ae157968b2..ae476c234a7c 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn-ucode.c | |||
@@ -207,7 +207,7 @@ static int iwlagn_set_Xtal_calib(struct iwl_priv *priv) | |||
207 | { | 207 | { |
208 | struct iwl_calib_xtal_freq_cmd cmd; | 208 | struct iwl_calib_xtal_freq_cmd cmd; |
209 | __le16 *xtal_calib = | 209 | __le16 *xtal_calib = |
210 | (__le16 *)iwl_eeprom_query_addr(priv, EEPROM_5000_XTAL); | 210 | (__le16 *)iwl_eeprom_query_addr(priv, EEPROM_XTAL); |
211 | 211 | ||
212 | cmd.hdr.op_code = IWL_PHY_CALIBRATE_CRYSTAL_FRQ_CMD; | 212 | cmd.hdr.op_code = IWL_PHY_CALIBRATE_CRYSTAL_FRQ_CMD; |
213 | cmd.hdr.first_group = 0; | 213 | cmd.hdr.first_group = 0; |
@@ -329,19 +329,19 @@ int iwlagn_alive_notify(struct iwl_priv *priv) | |||
329 | 329 | ||
330 | spin_lock_irqsave(&priv->lock, flags); | 330 | spin_lock_irqsave(&priv->lock, flags); |
331 | 331 | ||
332 | priv->scd_base_addr = iwl_read_prph(priv, IWL50_SCD_SRAM_BASE_ADDR); | 332 | priv->scd_base_addr = iwl_read_prph(priv, IWLAGN_SCD_SRAM_BASE_ADDR); |
333 | a = priv->scd_base_addr + IWL50_SCD_CONTEXT_DATA_OFFSET; | 333 | a = priv->scd_base_addr + IWLAGN_SCD_CONTEXT_DATA_OFFSET; |
334 | for (; a < priv->scd_base_addr + IWL50_SCD_TX_STTS_BITMAP_OFFSET; | 334 | for (; a < priv->scd_base_addr + IWLAGN_SCD_TX_STTS_BITMAP_OFFSET; |
335 | a += 4) | 335 | a += 4) |
336 | iwl_write_targ_mem(priv, a, 0); | 336 | iwl_write_targ_mem(priv, a, 0); |
337 | for (; a < priv->scd_base_addr + IWL50_SCD_TRANSLATE_TBL_OFFSET; | 337 | for (; a < priv->scd_base_addr + IWLAGN_SCD_TRANSLATE_TBL_OFFSET; |
338 | a += 4) | 338 | a += 4) |
339 | iwl_write_targ_mem(priv, a, 0); | 339 | iwl_write_targ_mem(priv, a, 0); |
340 | for (; a < priv->scd_base_addr + | 340 | for (; a < priv->scd_base_addr + |
341 | IWL50_SCD_TRANSLATE_TBL_OFFSET_QUEUE(priv->hw_params.max_txq_num); a += 4) | 341 | IWLAGN_SCD_TRANSLATE_TBL_OFFSET_QUEUE(priv->hw_params.max_txq_num); a += 4) |
342 | iwl_write_targ_mem(priv, a, 0); | 342 | iwl_write_targ_mem(priv, a, 0); |
343 | 343 | ||
344 | iwl_write_prph(priv, IWL50_SCD_DRAM_BASE_ADDR, | 344 | iwl_write_prph(priv, IWLAGN_SCD_DRAM_BASE_ADDR, |
345 | priv->scd_bc_tbls.dma >> 10); | 345 | priv->scd_bc_tbls.dma >> 10); |
346 | 346 | ||
347 | /* Enable DMA channel */ | 347 | /* Enable DMA channel */ |
@@ -355,28 +355,28 @@ int iwlagn_alive_notify(struct iwl_priv *priv) | |||
355 | iwl_write_direct32(priv, FH_TX_CHICKEN_BITS_REG, | 355 | iwl_write_direct32(priv, FH_TX_CHICKEN_BITS_REG, |
356 | reg_val | FH_TX_CHICKEN_BITS_SCD_AUTO_RETRY_EN); | 356 | reg_val | FH_TX_CHICKEN_BITS_SCD_AUTO_RETRY_EN); |
357 | 357 | ||
358 | iwl_write_prph(priv, IWL50_SCD_QUEUECHAIN_SEL, | 358 | iwl_write_prph(priv, IWLAGN_SCD_QUEUECHAIN_SEL, |
359 | IWL50_SCD_QUEUECHAIN_SEL_ALL(priv->hw_params.max_txq_num)); | 359 | IWLAGN_SCD_QUEUECHAIN_SEL_ALL(priv->hw_params.max_txq_num)); |
360 | iwl_write_prph(priv, IWL50_SCD_AGGR_SEL, 0); | 360 | iwl_write_prph(priv, IWLAGN_SCD_AGGR_SEL, 0); |
361 | 361 | ||
362 | /* initiate the queues */ | 362 | /* initiate the queues */ |
363 | for (i = 0; i < priv->hw_params.max_txq_num; i++) { | 363 | for (i = 0; i < priv->hw_params.max_txq_num; i++) { |
364 | iwl_write_prph(priv, IWL50_SCD_QUEUE_RDPTR(i), 0); | 364 | iwl_write_prph(priv, IWLAGN_SCD_QUEUE_RDPTR(i), 0); |
365 | iwl_write_direct32(priv, HBUS_TARG_WRPTR, 0 | (i << 8)); | 365 | iwl_write_direct32(priv, HBUS_TARG_WRPTR, 0 | (i << 8)); |
366 | iwl_write_targ_mem(priv, priv->scd_base_addr + | 366 | iwl_write_targ_mem(priv, priv->scd_base_addr + |
367 | IWL50_SCD_CONTEXT_QUEUE_OFFSET(i), 0); | 367 | IWLAGN_SCD_CONTEXT_QUEUE_OFFSET(i), 0); |
368 | iwl_write_targ_mem(priv, priv->scd_base_addr + | 368 | iwl_write_targ_mem(priv, priv->scd_base_addr + |
369 | IWL50_SCD_CONTEXT_QUEUE_OFFSET(i) + | 369 | IWLAGN_SCD_CONTEXT_QUEUE_OFFSET(i) + |
370 | sizeof(u32), | 370 | sizeof(u32), |
371 | ((SCD_WIN_SIZE << | 371 | ((SCD_WIN_SIZE << |
372 | IWL50_SCD_QUEUE_CTX_REG2_WIN_SIZE_POS) & | 372 | IWLAGN_SCD_QUEUE_CTX_REG2_WIN_SIZE_POS) & |
373 | IWL50_SCD_QUEUE_CTX_REG2_WIN_SIZE_MSK) | | 373 | IWLAGN_SCD_QUEUE_CTX_REG2_WIN_SIZE_MSK) | |
374 | ((SCD_FRAME_LIMIT << | 374 | ((SCD_FRAME_LIMIT << |
375 | IWL50_SCD_QUEUE_CTX_REG2_FRAME_LIMIT_POS) & | 375 | IWLAGN_SCD_QUEUE_CTX_REG2_FRAME_LIMIT_POS) & |
376 | IWL50_SCD_QUEUE_CTX_REG2_FRAME_LIMIT_MSK)); | 376 | IWLAGN_SCD_QUEUE_CTX_REG2_FRAME_LIMIT_MSK)); |
377 | } | 377 | } |
378 | 378 | ||
379 | iwl_write_prph(priv, IWL50_SCD_INTERRUPT_MASK, | 379 | iwl_write_prph(priv, IWLAGN_SCD_INTERRUPT_MASK, |
380 | IWL_MASK(0, priv->hw_params.max_txq_num)); | 380 | IWL_MASK(0, priv->hw_params.max_txq_num)); |
381 | 381 | ||
382 | /* Activate all Tx DMA/FIFO channels */ | 382 | /* Activate all Tx DMA/FIFO channels */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.c b/drivers/net/wireless/iwlwifi/iwl-agn.c index 310bc6aeb99b..00344d64635c 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.c +++ b/drivers/net/wireless/iwlwifi/iwl-agn.c | |||
@@ -2174,7 +2174,7 @@ static void iwl_alive_start(struct iwl_priv *priv) | |||
2174 | } | 2174 | } |
2175 | 2175 | ||
2176 | /* Configure Bluetooth device coexistence support */ | 2176 | /* Configure Bluetooth device coexistence support */ |
2177 | iwl_send_bt_config(priv); | 2177 | priv->cfg->ops->hcmd->send_bt_config(priv); |
2178 | 2178 | ||
2179 | iwl_reset_run_time_calib(priv); | 2179 | iwl_reset_run_time_calib(priv); |
2180 | 2180 | ||
@@ -3178,44 +3178,6 @@ static ssize_t store_tx_power(struct device *d, | |||
3178 | 3178 | ||
3179 | static DEVICE_ATTR(tx_power, S_IWUSR | S_IRUGO, show_tx_power, store_tx_power); | 3179 | static DEVICE_ATTR(tx_power, S_IWUSR | S_IRUGO, show_tx_power, store_tx_power); |
3180 | 3180 | ||
3181 | static ssize_t show_statistics(struct device *d, | ||
3182 | struct device_attribute *attr, char *buf) | ||
3183 | { | ||
3184 | struct iwl_priv *priv = dev_get_drvdata(d); | ||
3185 | u32 size = sizeof(struct iwl_notif_statistics); | ||
3186 | u32 len = 0, ofs = 0; | ||
3187 | u8 *data = (u8 *)&priv->statistics; | ||
3188 | int rc = 0; | ||
3189 | |||
3190 | if (!iwl_is_alive(priv)) | ||
3191 | return -EAGAIN; | ||
3192 | |||
3193 | mutex_lock(&priv->mutex); | ||
3194 | rc = iwl_send_statistics_request(priv, CMD_SYNC, false); | ||
3195 | mutex_unlock(&priv->mutex); | ||
3196 | |||
3197 | if (rc) { | ||
3198 | len = sprintf(buf, | ||
3199 | "Error sending statistics request: 0x%08X\n", rc); | ||
3200 | return len; | ||
3201 | } | ||
3202 | |||
3203 | while (size && (PAGE_SIZE - len)) { | ||
3204 | hex_dump_to_buffer(data + ofs, size, 16, 1, buf + len, | ||
3205 | PAGE_SIZE - len, 1); | ||
3206 | len = strlen(buf); | ||
3207 | if (PAGE_SIZE - len) | ||
3208 | buf[len++] = '\n'; | ||
3209 | |||
3210 | ofs += 16; | ||
3211 | size -= min(size, 16U); | ||
3212 | } | ||
3213 | |||
3214 | return len; | ||
3215 | } | ||
3216 | |||
3217 | static DEVICE_ATTR(statistics, S_IRUGO, show_statistics, NULL); | ||
3218 | |||
3219 | static ssize_t show_rts_ht_protection(struct device *d, | 3181 | static ssize_t show_rts_ht_protection(struct device *d, |
3220 | struct device_attribute *attr, char *buf) | 3182 | struct device_attribute *attr, char *buf) |
3221 | { | 3183 | { |
@@ -3401,11 +3363,10 @@ static void iwl_uninit_drv(struct iwl_priv *priv) | |||
3401 | iwl_calib_free_results(priv); | 3363 | iwl_calib_free_results(priv); |
3402 | iwlcore_free_geos(priv); | 3364 | iwlcore_free_geos(priv); |
3403 | iwl_free_channel_map(priv); | 3365 | iwl_free_channel_map(priv); |
3404 | kfree(priv->scan); | 3366 | kfree(priv->scan_cmd); |
3405 | } | 3367 | } |
3406 | 3368 | ||
3407 | static struct attribute *iwl_sysfs_entries[] = { | 3369 | static struct attribute *iwl_sysfs_entries[] = { |
3408 | &dev_attr_statistics.attr, | ||
3409 | &dev_attr_temperature.attr, | 3370 | &dev_attr_temperature.attr, |
3410 | &dev_attr_tx_power.attr, | 3371 | &dev_attr_tx_power.attr, |
3411 | &dev_attr_rts_ht_protection.attr, | 3372 | &dev_attr_rts_ht_protection.attr, |
@@ -3836,7 +3797,12 @@ static DEFINE_PCI_DEVICE_TABLE(iwl_hw_card_ids) = { | |||
3836 | {IWL_PCI_DEVICE(0x4238, 0x1111, iwl6000_3agn_cfg)}, | 3797 | {IWL_PCI_DEVICE(0x4238, 0x1111, iwl6000_3agn_cfg)}, |
3837 | {IWL_PCI_DEVICE(0x4239, 0x1311, iwl6000i_2agn_cfg)}, | 3798 | {IWL_PCI_DEVICE(0x4239, 0x1311, iwl6000i_2agn_cfg)}, |
3838 | {IWL_PCI_DEVICE(0x4239, 0x1316, iwl6000i_2abg_cfg)}, | 3799 | {IWL_PCI_DEVICE(0x4239, 0x1316, iwl6000i_2abg_cfg)}, |
3839 | {IWL_PCI_DEVICE(0x0082, 0x1201, iwl6000i_g2_2agn_cfg)}, | 3800 | |
3801 | /* 6x00 Series Gen2 */ | ||
3802 | {IWL_PCI_DEVICE(0x0082, 0x1201, iwl6000g2_2agn_cfg)}, | ||
3803 | {IWL_PCI_DEVICE(0x0082, 0x1301, iwl6000g2_2agn_cfg)}, | ||
3804 | {IWL_PCI_DEVICE(0x0082, 0x1321, iwl6000g2_2agn_cfg)}, | ||
3805 | {IWL_PCI_DEVICE(0x0085, 0x1311, iwl6000g2_2agn_cfg)}, | ||
3840 | 3806 | ||
3841 | /* 6x50 WiFi/WiMax Series */ | 3807 | /* 6x50 WiFi/WiMax Series */ |
3842 | {IWL_PCI_DEVICE(0x0087, 0x1301, iwl6050_2agn_cfg)}, | 3808 | {IWL_PCI_DEVICE(0x0087, 0x1301, iwl6050_2agn_cfg)}, |
diff --git a/drivers/net/wireless/iwlwifi/iwl-agn.h b/drivers/net/wireless/iwlwifi/iwl-agn.h index 5d3142287e14..cfee9994383e 100644 --- a/drivers/net/wireless/iwlwifi/iwl-agn.h +++ b/drivers/net/wireless/iwlwifi/iwl-agn.h | |||
@@ -171,4 +171,7 @@ static inline bool iwl_is_tx_success(u32 status) | |||
171 | (status == TX_STATUS_DIRECT_DONE); | 171 | (status == TX_STATUS_DIRECT_DONE); |
172 | } | 172 | } |
173 | 173 | ||
174 | /* scan */ | ||
175 | void iwlagn_request_scan(struct iwl_priv *priv); | ||
176 | |||
174 | #endif /* __iwl_agn_h__ */ | 177 | #endif /* __iwl_agn_h__ */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-commands.h b/drivers/net/wireless/iwlwifi/iwl-commands.h index d830086ca195..67c723cc32d2 100644 --- a/drivers/net/wireless/iwlwifi/iwl-commands.h +++ b/drivers/net/wireless/iwlwifi/iwl-commands.h | |||
@@ -1443,7 +1443,7 @@ struct iwl4965_rx_mpdu_res_start { | |||
1443 | 1443 | ||
1444 | /* 1: Ignore Bluetooth priority for this frame. | 1444 | /* 1: Ignore Bluetooth priority for this frame. |
1445 | * 0: Delay Tx until Bluetooth device is done (normal usage). */ | 1445 | * 0: Delay Tx until Bluetooth device is done (normal usage). */ |
1446 | #define TX_CMD_FLG_BT_DIS_MSK cpu_to_le32(1 << 12) | 1446 | #define TX_CMD_FLG_IGNORE_BT cpu_to_le32(1 << 12) |
1447 | 1447 | ||
1448 | /* 1: uCode overrides sequence control field in MAC header. | 1448 | /* 1: uCode overrides sequence control field in MAC header. |
1449 | * 0: Driver provides sequence control field in MAC header. | 1449 | * 0: Driver provides sequence control field in MAC header. |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.c b/drivers/net/wireless/iwlwifi/iwl-core.c index b75808aad1ef..56a9f1741419 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.c +++ b/drivers/net/wireless/iwlwifi/iwl-core.c | |||
@@ -829,19 +829,6 @@ static u8 iwl_count_chain_bitmap(u32 chain_bitmap) | |||
829 | } | 829 | } |
830 | 830 | ||
831 | /** | 831 | /** |
832 | * iwl_is_monitor_mode - Determine if interface in monitor mode | ||
833 | * | ||
834 | * priv->iw_mode is set in add_interface, but add_interface is | ||
835 | * never called for monitor mode. The only way mac80211 informs us about | ||
836 | * monitor mode is through configuring filters (call to configure_filter). | ||
837 | */ | ||
838 | bool iwl_is_monitor_mode(struct iwl_priv *priv) | ||
839 | { | ||
840 | return !!(priv->staging_rxon.filter_flags & RXON_FILTER_PROMISC_MSK); | ||
841 | } | ||
842 | EXPORT_SYMBOL(iwl_is_monitor_mode); | ||
843 | |||
844 | /** | ||
845 | * iwl_set_rxon_chain - Set up Rx chain usage in "staging" RXON image | 832 | * iwl_set_rxon_chain - Set up Rx chain usage in "staging" RXON image |
846 | * | 833 | * |
847 | * Selects how many and which Rx receivers/antennas/chains to use. | 834 | * Selects how many and which Rx receivers/antennas/chains to use. |
@@ -884,19 +871,6 @@ void iwl_set_rxon_chain(struct iwl_priv *priv) | |||
884 | rx_chain |= active_rx_cnt << RXON_RX_CHAIN_MIMO_CNT_POS; | 871 | rx_chain |= active_rx_cnt << RXON_RX_CHAIN_MIMO_CNT_POS; |
885 | rx_chain |= idle_rx_cnt << RXON_RX_CHAIN_CNT_POS; | 872 | rx_chain |= idle_rx_cnt << RXON_RX_CHAIN_CNT_POS; |
886 | 873 | ||
887 | /* copied from 'iwl_bg_request_scan()' */ | ||
888 | /* Force use of chains B and C (0x6) for Rx | ||
889 | * Avoid A (0x1) for the device has off-channel reception on A-band. | ||
890 | * MIMO is not used here, but value is required */ | ||
891 | if (iwl_is_monitor_mode(priv) && | ||
892 | !(priv->staging_rxon.flags & RXON_FLG_BAND_24G_MSK) && | ||
893 | priv->cfg->off_channel_workaround) { | ||
894 | rx_chain = ANT_ABC << RXON_RX_CHAIN_VALID_POS; | ||
895 | rx_chain |= ANT_BC << RXON_RX_CHAIN_FORCE_SEL_POS; | ||
896 | rx_chain |= ANT_ABC << RXON_RX_CHAIN_FORCE_MIMO_SEL_POS; | ||
897 | rx_chain |= 0x1 << RXON_RX_CHAIN_DRIVER_FORCE_POS; | ||
898 | } | ||
899 | |||
900 | priv->staging_rxon.rx_chain = cpu_to_le16(rx_chain); | 874 | priv->staging_rxon.rx_chain = cpu_to_le16(rx_chain); |
901 | 875 | ||
902 | if (!is_single && (active_rx_cnt >= IWL_NUM_RX_CHAINS_SINGLE) && is_cam) | 876 | if (!is_single && (active_rx_cnt >= IWL_NUM_RX_CHAINS_SINGLE) && is_cam) |
@@ -1480,7 +1454,7 @@ irqreturn_t iwl_isr_legacy(int irq, void *data) | |||
1480 | } | 1454 | } |
1481 | EXPORT_SYMBOL(iwl_isr_legacy); | 1455 | EXPORT_SYMBOL(iwl_isr_legacy); |
1482 | 1456 | ||
1483 | int iwl_send_bt_config(struct iwl_priv *priv) | 1457 | void iwl_send_bt_config(struct iwl_priv *priv) |
1484 | { | 1458 | { |
1485 | struct iwl_bt_cmd bt_cmd = { | 1459 | struct iwl_bt_cmd bt_cmd = { |
1486 | .lead_time = BT_LEAD_TIME_DEF, | 1460 | .lead_time = BT_LEAD_TIME_DEF, |
@@ -1497,8 +1471,9 @@ int iwl_send_bt_config(struct iwl_priv *priv) | |||
1497 | IWL_DEBUG_INFO(priv, "BT coex %s\n", | 1471 | IWL_DEBUG_INFO(priv, "BT coex %s\n", |
1498 | (bt_cmd.flags == BT_COEX_DISABLE) ? "disable" : "active"); | 1472 | (bt_cmd.flags == BT_COEX_DISABLE) ? "disable" : "active"); |
1499 | 1473 | ||
1500 | return iwl_send_cmd_pdu(priv, REPLY_BT_CONFIG, | 1474 | if (iwl_send_cmd_pdu(priv, REPLY_BT_CONFIG, |
1501 | sizeof(struct iwl_bt_cmd), &bt_cmd); | 1475 | sizeof(struct iwl_bt_cmd), &bt_cmd)) |
1476 | IWL_ERR(priv, "failed to send BT Coex Config\n"); | ||
1502 | } | 1477 | } |
1503 | EXPORT_SYMBOL(iwl_send_bt_config); | 1478 | EXPORT_SYMBOL(iwl_send_bt_config); |
1504 | 1479 | ||
@@ -1868,7 +1843,6 @@ static inline void iwl_set_no_assoc(struct iwl_priv *priv) | |||
1868 | iwlcore_commit_rxon(priv); | 1843 | iwlcore_commit_rxon(priv); |
1869 | } | 1844 | } |
1870 | 1845 | ||
1871 | #define IWL_DELAY_NEXT_SCAN_AFTER_ASSOC (HZ*6) | ||
1872 | void iwl_bss_info_changed(struct ieee80211_hw *hw, | 1846 | void iwl_bss_info_changed(struct ieee80211_hw *hw, |
1873 | struct ieee80211_vif *vif, | 1847 | struct ieee80211_vif *vif, |
1874 | struct ieee80211_bss_conf *bss_conf, | 1848 | struct ieee80211_bss_conf *bss_conf, |
@@ -1989,14 +1963,6 @@ void iwl_bss_info_changed(struct ieee80211_hw *hw, | |||
1989 | 1963 | ||
1990 | iwl_led_associate(priv); | 1964 | iwl_led_associate(priv); |
1991 | 1965 | ||
1992 | /* | ||
1993 | * We have just associated, don't start scan too early | ||
1994 | * leave time for EAPOL exchange to complete. | ||
1995 | * | ||
1996 | * XXX: do this in mac80211 | ||
1997 | */ | ||
1998 | priv->next_scan_jiffies = jiffies + | ||
1999 | IWL_DELAY_NEXT_SCAN_AFTER_ASSOC; | ||
2000 | if (!iwl_is_rfkill(priv)) | 1966 | if (!iwl_is_rfkill(priv)) |
2001 | priv->cfg->ops->lib->post_associate(priv); | 1967 | priv->cfg->ops->lib->post_associate(priv); |
2002 | } else | 1968 | } else |
@@ -2383,11 +2349,11 @@ EXPORT_SYMBOL(iwl_free_txq_mem); | |||
2383 | 2349 | ||
2384 | int iwl_send_wimax_coex(struct iwl_priv *priv) | 2350 | int iwl_send_wimax_coex(struct iwl_priv *priv) |
2385 | { | 2351 | { |
2386 | struct iwl_wimax_coex_cmd uninitialized_var(coex_cmd); | 2352 | struct iwl_wimax_coex_cmd coex_cmd; |
2387 | 2353 | ||
2388 | if (priv->cfg->support_wimax_coexist) { | 2354 | if (priv->cfg->support_wimax_coexist) { |
2389 | /* UnMask wake up src at associated sleep */ | 2355 | /* UnMask wake up src at associated sleep */ |
2390 | coex_cmd.flags |= COEX_FLAGS_ASSOC_WA_UNMASK_MSK; | 2356 | coex_cmd.flags = COEX_FLAGS_ASSOC_WA_UNMASK_MSK; |
2391 | 2357 | ||
2392 | /* UnMask wake up src at unassociated sleep */ | 2358 | /* UnMask wake up src at unassociated sleep */ |
2393 | coex_cmd.flags |= COEX_FLAGS_UNASSOC_WA_UNMASK_MSK; | 2359 | coex_cmd.flags |= COEX_FLAGS_UNASSOC_WA_UNMASK_MSK; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-core.h b/drivers/net/wireless/iwlwifi/iwl-core.h index 6c3f0127f743..a0cc11ecbe93 100644 --- a/drivers/net/wireless/iwlwifi/iwl-core.h +++ b/drivers/net/wireless/iwlwifi/iwl-core.h | |||
@@ -90,6 +90,7 @@ struct iwl_hcmd_ops { | |||
90 | int (*commit_rxon)(struct iwl_priv *priv); | 90 | int (*commit_rxon)(struct iwl_priv *priv); |
91 | void (*set_rxon_chain)(struct iwl_priv *priv); | 91 | void (*set_rxon_chain)(struct iwl_priv *priv); |
92 | int (*set_tx_ant)(struct iwl_priv *priv, u8 valid_tx_ant); | 92 | int (*set_tx_ant)(struct iwl_priv *priv, u8 valid_tx_ant); |
93 | void (*send_bt_config)(struct iwl_priv *priv); | ||
93 | }; | 94 | }; |
94 | 95 | ||
95 | struct iwl_hcmd_utils_ops { | 96 | struct iwl_hcmd_utils_ops { |
@@ -105,6 +106,7 @@ struct iwl_hcmd_utils_ops { | |||
105 | __le32 *tx_flags); | 106 | __le32 *tx_flags); |
106 | int (*calc_rssi)(struct iwl_priv *priv, | 107 | int (*calc_rssi)(struct iwl_priv *priv, |
107 | struct iwl_rx_phy_res *rx_resp); | 108 | struct iwl_rx_phy_res *rx_resp); |
109 | void (*request_scan)(struct iwl_priv *priv); | ||
108 | }; | 110 | }; |
109 | 111 | ||
110 | struct iwl_apm_ops { | 112 | struct iwl_apm_ops { |
@@ -114,6 +116,15 @@ struct iwl_apm_ops { | |||
114 | int (*set_pwr_src)(struct iwl_priv *priv, enum iwl_pwr_src src); | 116 | int (*set_pwr_src)(struct iwl_priv *priv, enum iwl_pwr_src src); |
115 | }; | 117 | }; |
116 | 118 | ||
119 | struct iwl_debugfs_ops { | ||
120 | ssize_t (*rx_stats_read)(struct file *file, char __user *user_buf, | ||
121 | size_t count, loff_t *ppos); | ||
122 | ssize_t (*tx_stats_read)(struct file *file, char __user *user_buf, | ||
123 | size_t count, loff_t *ppos); | ||
124 | ssize_t (*general_stats_read)(struct file *file, char __user *user_buf, | ||
125 | size_t count, loff_t *ppos); | ||
126 | }; | ||
127 | |||
117 | struct iwl_temp_ops { | 128 | struct iwl_temp_ops { |
118 | void (*temperature)(struct iwl_priv *priv); | 129 | void (*temperature)(struct iwl_priv *priv); |
119 | void (*set_ct_kill)(struct iwl_priv *priv); | 130 | void (*set_ct_kill)(struct iwl_priv *priv); |
@@ -199,6 +210,7 @@ struct iwl_lib_ops { | |||
199 | /* check for ack health */ | 210 | /* check for ack health */ |
200 | bool (*check_ack_health)(struct iwl_priv *priv, | 211 | bool (*check_ack_health)(struct iwl_priv *priv, |
201 | struct iwl_rx_packet *pkt); | 212 | struct iwl_rx_packet *pkt); |
213 | struct iwl_debugfs_ops debugfs_ops; | ||
202 | }; | 214 | }; |
203 | 215 | ||
204 | struct iwl_led_ops { | 216 | struct iwl_led_ops { |
@@ -306,8 +318,8 @@ struct iwl_cfg { | |||
306 | /* timer period for monitor the driver queues */ | 318 | /* timer period for monitor the driver queues */ |
307 | u32 monitor_recover_period; | 319 | u32 monitor_recover_period; |
308 | bool temperature_kelvin; | 320 | bool temperature_kelvin; |
309 | bool off_channel_workaround; | ||
310 | u32 max_event_log_size; | 321 | u32 max_event_log_size; |
322 | u8 scan_antennas[IEEE80211_NUM_BANDS]; | ||
311 | }; | 323 | }; |
312 | 324 | ||
313 | /*************************** | 325 | /*************************** |
@@ -339,7 +351,6 @@ void iwl_configure_filter(struct ieee80211_hw *hw, | |||
339 | unsigned int changed_flags, | 351 | unsigned int changed_flags, |
340 | unsigned int *total_flags, u64 multicast); | 352 | unsigned int *total_flags, u64 multicast); |
341 | int iwl_set_hw_params(struct iwl_priv *priv); | 353 | int iwl_set_hw_params(struct iwl_priv *priv); |
342 | bool iwl_is_monitor_mode(struct iwl_priv *priv); | ||
343 | void iwl_post_associate(struct iwl_priv *priv); | 354 | void iwl_post_associate(struct iwl_priv *priv); |
344 | void iwl_bss_info_changed(struct ieee80211_hw *hw, | 355 | void iwl_bss_info_changed(struct ieee80211_hw *hw, |
345 | struct ieee80211_vif *vif, | 356 | struct ieee80211_vif *vif, |
@@ -526,6 +537,7 @@ void iwl_setup_scan_deferred_work(struct iwl_priv *priv); | |||
526 | #define IWL_ACTIVE_QUIET_TIME cpu_to_le16(10) /* msec */ | 537 | #define IWL_ACTIVE_QUIET_TIME cpu_to_le16(10) /* msec */ |
527 | #define IWL_PLCP_QUIET_THRESH cpu_to_le16(1) /* packets */ | 538 | #define IWL_PLCP_QUIET_THRESH cpu_to_le16(1) /* packets */ |
528 | 539 | ||
540 | #define IWL_SCAN_CHECK_WATCHDOG (HZ * 7) | ||
529 | 541 | ||
530 | /******************************************************************************* | 542 | /******************************************************************************* |
531 | * Calibrations - implemented in iwl-calib.c | 543 | * Calibrations - implemented in iwl-calib.c |
@@ -665,7 +677,7 @@ static inline int iwl_is_ready_rf(struct iwl_priv *priv) | |||
665 | } | 677 | } |
666 | 678 | ||
667 | extern void iwl_rf_kill_ct_config(struct iwl_priv *priv); | 679 | extern void iwl_rf_kill_ct_config(struct iwl_priv *priv); |
668 | extern int iwl_send_bt_config(struct iwl_priv *priv); | 680 | extern void iwl_send_bt_config(struct iwl_priv *priv); |
669 | extern int iwl_send_statistics_request(struct iwl_priv *priv, | 681 | extern int iwl_send_statistics_request(struct iwl_priv *priv, |
670 | u8 flags, bool clear); | 682 | u8 flags, bool clear); |
671 | extern int iwl_verify_ucode(struct iwl_priv *priv); | 683 | extern int iwl_verify_ucode(struct iwl_priv *priv); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-csr.h b/drivers/net/wireless/iwlwifi/iwl-csr.h index 808b7146bead..254c35ae8b38 100644 --- a/drivers/net/wireless/iwlwifi/iwl-csr.h +++ b/drivers/net/wireless/iwlwifi/iwl-csr.h | |||
@@ -298,6 +298,7 @@ | |||
298 | #define CSR_HW_REV_TYPE_1000 (0x0000060) | 298 | #define CSR_HW_REV_TYPE_1000 (0x0000060) |
299 | #define CSR_HW_REV_TYPE_6x00 (0x0000070) | 299 | #define CSR_HW_REV_TYPE_6x00 (0x0000070) |
300 | #define CSR_HW_REV_TYPE_6x50 (0x0000080) | 300 | #define CSR_HW_REV_TYPE_6x50 (0x0000080) |
301 | #define CSR_HW_REV_TYPE_6x00g2 (0x00000B0) | ||
301 | #define CSR_HW_REV_TYPE_NONE (0x00000F0) | 302 | #define CSR_HW_REV_TYPE_NONE (0x00000F0) |
302 | 303 | ||
303 | /* EEPROM REG */ | 304 | /* EEPROM REG */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-debug.h b/drivers/net/wireless/iwlwifi/iwl-debug.h index 1c7b53d511c7..5c2bcef5df0c 100644 --- a/drivers/net/wireless/iwlwifi/iwl-debug.h +++ b/drivers/net/wireless/iwlwifi/iwl-debug.h | |||
@@ -78,6 +78,8 @@ static inline void iwl_print_hex_dump(struct iwl_priv *priv, int level, | |||
78 | #ifdef CONFIG_IWLWIFI_DEBUGFS | 78 | #ifdef CONFIG_IWLWIFI_DEBUGFS |
79 | int iwl_dbgfs_register(struct iwl_priv *priv, const char *name); | 79 | int iwl_dbgfs_register(struct iwl_priv *priv, const char *name); |
80 | void iwl_dbgfs_unregister(struct iwl_priv *priv); | 80 | void iwl_dbgfs_unregister(struct iwl_priv *priv); |
81 | extern int iwl_dbgfs_statistics_flag(struct iwl_priv *priv, char *buf, | ||
82 | int bufsz); | ||
81 | #else | 83 | #else |
82 | static inline int iwl_dbgfs_register(struct iwl_priv *priv, const char *name) | 84 | static inline int iwl_dbgfs_register(struct iwl_priv *priv, const char *name) |
83 | { | 85 | { |
diff --git a/drivers/net/wireless/iwlwifi/iwl-debugfs.c b/drivers/net/wireless/iwlwifi/iwl-debugfs.c index 607a91f3eb6b..61faf2dd7fbe 100644 --- a/drivers/net/wireless/iwlwifi/iwl-debugfs.c +++ b/drivers/net/wireless/iwlwifi/iwl-debugfs.c | |||
@@ -106,6 +106,26 @@ static const struct file_operations iwl_dbgfs_##name##_ops = { \ | |||
106 | .open = iwl_dbgfs_open_file_generic, \ | 106 | .open = iwl_dbgfs_open_file_generic, \ |
107 | }; | 107 | }; |
108 | 108 | ||
109 | int iwl_dbgfs_statistics_flag(struct iwl_priv *priv, char *buf, int bufsz) | ||
110 | { | ||
111 | int p = 0; | ||
112 | |||
113 | p += scnprintf(buf + p, bufsz - p, "Statistics Flag(0x%X):\n", | ||
114 | le32_to_cpu(priv->statistics.flag)); | ||
115 | if (le32_to_cpu(priv->statistics.flag) & UCODE_STATISTICS_CLEAR_MSK) | ||
116 | p += scnprintf(buf + p, bufsz - p, | ||
117 | "\tStatistics have been cleared\n"); | ||
118 | p += scnprintf(buf + p, bufsz - p, "\tOperational Frequency: %s\n", | ||
119 | (le32_to_cpu(priv->statistics.flag) & | ||
120 | UCODE_STATISTICS_FREQUENCY_MSK) | ||
121 | ? "2.4 GHz" : "5.2 GHz"); | ||
122 | p += scnprintf(buf + p, bufsz - p, "\tTGj Narrow Band: %s\n", | ||
123 | (le32_to_cpu(priv->statistics.flag) & | ||
124 | UCODE_STATISTICS_NARROW_BAND_MSK) | ||
125 | ? "enabled" : "disabled"); | ||
126 | return p; | ||
127 | } | ||
128 | EXPORT_SYMBOL(iwl_dbgfs_statistics_flag); | ||
109 | 129 | ||
110 | static ssize_t iwl_dbgfs_tx_statistics_read(struct file *file, | 130 | static ssize_t iwl_dbgfs_tx_statistics_read(struct file *file, |
111 | char __user *user_buf, | 131 | char __user *user_buf, |
@@ -1034,474 +1054,15 @@ static ssize_t iwl_dbgfs_rx_queue_read(struct file *file, | |||
1034 | return simple_read_from_buffer(user_buf, count, ppos, buf, pos); | 1054 | return simple_read_from_buffer(user_buf, count, ppos, buf, pos); |
1035 | } | 1055 | } |
1036 | 1056 | ||
1037 | static int iwl_dbgfs_statistics_flag(struct iwl_priv *priv, char *buf, | ||
1038 | int bufsz) | ||
1039 | { | ||
1040 | int p = 0; | ||
1041 | |||
1042 | p += scnprintf(buf + p, bufsz - p, | ||
1043 | "Statistics Flag(0x%X):\n", | ||
1044 | le32_to_cpu(priv->statistics.flag)); | ||
1045 | if (le32_to_cpu(priv->statistics.flag) & UCODE_STATISTICS_CLEAR_MSK) | ||
1046 | p += scnprintf(buf + p, bufsz - p, | ||
1047 | "\tStatistics have been cleared\n"); | ||
1048 | p += scnprintf(buf + p, bufsz - p, | ||
1049 | "\tOperational Frequency: %s\n", | ||
1050 | (le32_to_cpu(priv->statistics.flag) & | ||
1051 | UCODE_STATISTICS_FREQUENCY_MSK) | ||
1052 | ? "2.4 GHz" : "5.2 GHz"); | ||
1053 | p += scnprintf(buf + p, bufsz - p, | ||
1054 | "\tTGj Narrow Band: %s\n", | ||
1055 | (le32_to_cpu(priv->statistics.flag) & | ||
1056 | UCODE_STATISTICS_NARROW_BAND_MSK) | ||
1057 | ? "enabled" : "disabled"); | ||
1058 | return p; | ||
1059 | } | ||
1060 | |||
1061 | static const char ucode_stats_header[] = | ||
1062 | "%-32s current acumulative delta max\n"; | ||
1063 | static const char ucode_stats_short_format[] = | ||
1064 | " %-30s %10u\n"; | ||
1065 | static const char ucode_stats_format[] = | ||
1066 | " %-30s %10u %10u %10u %10u\n"; | ||
1067 | |||
1068 | static ssize_t iwl_dbgfs_ucode_rx_stats_read(struct file *file, | 1057 | static ssize_t iwl_dbgfs_ucode_rx_stats_read(struct file *file, |
1069 | char __user *user_buf, | 1058 | char __user *user_buf, |
1070 | size_t count, loff_t *ppos) | 1059 | size_t count, loff_t *ppos) |
1071 | { | 1060 | { |
1072 | struct iwl_priv *priv = file->private_data; | 1061 | struct iwl_priv *priv = file->private_data; |
1073 | int pos = 0; | 1062 | if (priv->cfg->ops->lib->debugfs_ops.rx_stats_read) |
1074 | char *buf; | 1063 | return priv->cfg->ops->lib->debugfs_ops.rx_stats_read(file, |
1075 | int bufsz = sizeof(struct statistics_rx_phy) * 40 + | 1064 | user_buf, count, ppos); |
1076 | sizeof(struct statistics_rx_non_phy) * 40 + | 1065 | return 0; |
1077 | sizeof(struct statistics_rx_ht_phy) * 40 + 400; | ||
1078 | ssize_t ret; | ||
1079 | struct statistics_rx_phy *ofdm, *accum_ofdm, *delta_ofdm, *max_ofdm; | ||
1080 | struct statistics_rx_phy *cck, *accum_cck, *delta_cck, *max_cck; | ||
1081 | struct statistics_rx_non_phy *general, *accum_general; | ||
1082 | struct statistics_rx_non_phy *delta_general, *max_general; | ||
1083 | struct statistics_rx_ht_phy *ht, *accum_ht, *delta_ht, *max_ht; | ||
1084 | |||
1085 | if (!iwl_is_alive(priv)) | ||
1086 | return -EAGAIN; | ||
1087 | |||
1088 | buf = kzalloc(bufsz, GFP_KERNEL); | ||
1089 | if (!buf) { | ||
1090 | IWL_ERR(priv, "Can not allocate Buffer\n"); | ||
1091 | return -ENOMEM; | ||
1092 | } | ||
1093 | |||
1094 | /* the statistic information display here is based on | ||
1095 | * the last statistics notification from uCode | ||
1096 | * might not reflect the current uCode activity | ||
1097 | */ | ||
1098 | ofdm = &priv->statistics.rx.ofdm; | ||
1099 | cck = &priv->statistics.rx.cck; | ||
1100 | general = &priv->statistics.rx.general; | ||
1101 | ht = &priv->statistics.rx.ofdm_ht; | ||
1102 | accum_ofdm = &priv->accum_statistics.rx.ofdm; | ||
1103 | accum_cck = &priv->accum_statistics.rx.cck; | ||
1104 | accum_general = &priv->accum_statistics.rx.general; | ||
1105 | accum_ht = &priv->accum_statistics.rx.ofdm_ht; | ||
1106 | delta_ofdm = &priv->delta_statistics.rx.ofdm; | ||
1107 | delta_cck = &priv->delta_statistics.rx.cck; | ||
1108 | delta_general = &priv->delta_statistics.rx.general; | ||
1109 | delta_ht = &priv->delta_statistics.rx.ofdm_ht; | ||
1110 | max_ofdm = &priv->max_delta.rx.ofdm; | ||
1111 | max_cck = &priv->max_delta.rx.cck; | ||
1112 | max_general = &priv->max_delta.rx.general; | ||
1113 | max_ht = &priv->max_delta.rx.ofdm_ht; | ||
1114 | |||
1115 | pos += iwl_dbgfs_statistics_flag(priv, buf, bufsz); | ||
1116 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_header, | ||
1117 | "Statistics_Rx - OFDM:"); | ||
1118 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1119 | "ina_cnt:", le32_to_cpu(ofdm->ina_cnt), | ||
1120 | accum_ofdm->ina_cnt, | ||
1121 | delta_ofdm->ina_cnt, max_ofdm->ina_cnt); | ||
1122 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1123 | "fina_cnt:", | ||
1124 | le32_to_cpu(ofdm->fina_cnt), accum_ofdm->fina_cnt, | ||
1125 | delta_ofdm->fina_cnt, max_ofdm->fina_cnt); | ||
1126 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1127 | "plcp_err:", | ||
1128 | le32_to_cpu(ofdm->plcp_err), accum_ofdm->plcp_err, | ||
1129 | delta_ofdm->plcp_err, max_ofdm->plcp_err); | ||
1130 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1131 | "crc32_err:", | ||
1132 | le32_to_cpu(ofdm->crc32_err), accum_ofdm->crc32_err, | ||
1133 | delta_ofdm->crc32_err, max_ofdm->crc32_err); | ||
1134 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1135 | "overrun_err:", | ||
1136 | le32_to_cpu(ofdm->overrun_err), | ||
1137 | accum_ofdm->overrun_err, | ||
1138 | delta_ofdm->overrun_err, max_ofdm->overrun_err); | ||
1139 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1140 | "early_overrun_err:", | ||
1141 | le32_to_cpu(ofdm->early_overrun_err), | ||
1142 | accum_ofdm->early_overrun_err, | ||
1143 | delta_ofdm->early_overrun_err, | ||
1144 | max_ofdm->early_overrun_err); | ||
1145 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1146 | "crc32_good:", | ||
1147 | le32_to_cpu(ofdm->crc32_good), | ||
1148 | accum_ofdm->crc32_good, | ||
1149 | delta_ofdm->crc32_good, max_ofdm->crc32_good); | ||
1150 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1151 | "false_alarm_cnt:", | ||
1152 | le32_to_cpu(ofdm->false_alarm_cnt), | ||
1153 | accum_ofdm->false_alarm_cnt, | ||
1154 | delta_ofdm->false_alarm_cnt, | ||
1155 | max_ofdm->false_alarm_cnt); | ||
1156 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1157 | "fina_sync_err_cnt:", | ||
1158 | le32_to_cpu(ofdm->fina_sync_err_cnt), | ||
1159 | accum_ofdm->fina_sync_err_cnt, | ||
1160 | delta_ofdm->fina_sync_err_cnt, | ||
1161 | max_ofdm->fina_sync_err_cnt); | ||
1162 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1163 | "sfd_timeout:", | ||
1164 | le32_to_cpu(ofdm->sfd_timeout), | ||
1165 | accum_ofdm->sfd_timeout, | ||
1166 | delta_ofdm->sfd_timeout, | ||
1167 | max_ofdm->sfd_timeout); | ||
1168 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1169 | "fina_timeout:", | ||
1170 | le32_to_cpu(ofdm->fina_timeout), | ||
1171 | accum_ofdm->fina_timeout, | ||
1172 | delta_ofdm->fina_timeout, | ||
1173 | max_ofdm->fina_timeout); | ||
1174 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1175 | "unresponded_rts:", | ||
1176 | le32_to_cpu(ofdm->unresponded_rts), | ||
1177 | accum_ofdm->unresponded_rts, | ||
1178 | delta_ofdm->unresponded_rts, | ||
1179 | max_ofdm->unresponded_rts); | ||
1180 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1181 | "rxe_frame_lmt_ovrun:", | ||
1182 | le32_to_cpu(ofdm->rxe_frame_limit_overrun), | ||
1183 | accum_ofdm->rxe_frame_limit_overrun, | ||
1184 | delta_ofdm->rxe_frame_limit_overrun, | ||
1185 | max_ofdm->rxe_frame_limit_overrun); | ||
1186 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1187 | "sent_ack_cnt:", | ||
1188 | le32_to_cpu(ofdm->sent_ack_cnt), | ||
1189 | accum_ofdm->sent_ack_cnt, | ||
1190 | delta_ofdm->sent_ack_cnt, | ||
1191 | max_ofdm->sent_ack_cnt); | ||
1192 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1193 | "sent_cts_cnt:", | ||
1194 | le32_to_cpu(ofdm->sent_cts_cnt), | ||
1195 | accum_ofdm->sent_cts_cnt, | ||
1196 | delta_ofdm->sent_cts_cnt, max_ofdm->sent_cts_cnt); | ||
1197 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1198 | "sent_ba_rsp_cnt:", | ||
1199 | le32_to_cpu(ofdm->sent_ba_rsp_cnt), | ||
1200 | accum_ofdm->sent_ba_rsp_cnt, | ||
1201 | delta_ofdm->sent_ba_rsp_cnt, | ||
1202 | max_ofdm->sent_ba_rsp_cnt); | ||
1203 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1204 | "dsp_self_kill:", | ||
1205 | le32_to_cpu(ofdm->dsp_self_kill), | ||
1206 | accum_ofdm->dsp_self_kill, | ||
1207 | delta_ofdm->dsp_self_kill, | ||
1208 | max_ofdm->dsp_self_kill); | ||
1209 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1210 | "mh_format_err:", | ||
1211 | le32_to_cpu(ofdm->mh_format_err), | ||
1212 | accum_ofdm->mh_format_err, | ||
1213 | delta_ofdm->mh_format_err, | ||
1214 | max_ofdm->mh_format_err); | ||
1215 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1216 | "re_acq_main_rssi_sum:", | ||
1217 | le32_to_cpu(ofdm->re_acq_main_rssi_sum), | ||
1218 | accum_ofdm->re_acq_main_rssi_sum, | ||
1219 | delta_ofdm->re_acq_main_rssi_sum, | ||
1220 | max_ofdm->re_acq_main_rssi_sum); | ||
1221 | |||
1222 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_header, | ||
1223 | "Statistics_Rx - CCK:"); | ||
1224 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1225 | "ina_cnt:", | ||
1226 | le32_to_cpu(cck->ina_cnt), accum_cck->ina_cnt, | ||
1227 | delta_cck->ina_cnt, max_cck->ina_cnt); | ||
1228 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1229 | "fina_cnt:", | ||
1230 | le32_to_cpu(cck->fina_cnt), accum_cck->fina_cnt, | ||
1231 | delta_cck->fina_cnt, max_cck->fina_cnt); | ||
1232 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1233 | "plcp_err:", | ||
1234 | le32_to_cpu(cck->plcp_err), accum_cck->plcp_err, | ||
1235 | delta_cck->plcp_err, max_cck->plcp_err); | ||
1236 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1237 | "crc32_err:", | ||
1238 | le32_to_cpu(cck->crc32_err), accum_cck->crc32_err, | ||
1239 | delta_cck->crc32_err, max_cck->crc32_err); | ||
1240 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1241 | "overrun_err:", | ||
1242 | le32_to_cpu(cck->overrun_err), | ||
1243 | accum_cck->overrun_err, | ||
1244 | delta_cck->overrun_err, max_cck->overrun_err); | ||
1245 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1246 | "early_overrun_err:", | ||
1247 | le32_to_cpu(cck->early_overrun_err), | ||
1248 | accum_cck->early_overrun_err, | ||
1249 | delta_cck->early_overrun_err, | ||
1250 | max_cck->early_overrun_err); | ||
1251 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1252 | "crc32_good:", | ||
1253 | le32_to_cpu(cck->crc32_good), accum_cck->crc32_good, | ||
1254 | delta_cck->crc32_good, | ||
1255 | max_cck->crc32_good); | ||
1256 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1257 | "false_alarm_cnt:", | ||
1258 | le32_to_cpu(cck->false_alarm_cnt), | ||
1259 | accum_cck->false_alarm_cnt, | ||
1260 | delta_cck->false_alarm_cnt, max_cck->false_alarm_cnt); | ||
1261 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1262 | "fina_sync_err_cnt:", | ||
1263 | le32_to_cpu(cck->fina_sync_err_cnt), | ||
1264 | accum_cck->fina_sync_err_cnt, | ||
1265 | delta_cck->fina_sync_err_cnt, | ||
1266 | max_cck->fina_sync_err_cnt); | ||
1267 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1268 | "sfd_timeout:", | ||
1269 | le32_to_cpu(cck->sfd_timeout), | ||
1270 | accum_cck->sfd_timeout, | ||
1271 | delta_cck->sfd_timeout, max_cck->sfd_timeout); | ||
1272 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1273 | "fina_timeout:", | ||
1274 | le32_to_cpu(cck->fina_timeout), | ||
1275 | accum_cck->fina_timeout, | ||
1276 | delta_cck->fina_timeout, max_cck->fina_timeout); | ||
1277 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1278 | "unresponded_rts:", | ||
1279 | le32_to_cpu(cck->unresponded_rts), | ||
1280 | accum_cck->unresponded_rts, | ||
1281 | delta_cck->unresponded_rts, | ||
1282 | max_cck->unresponded_rts); | ||
1283 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1284 | "rxe_frame_lmt_ovrun:", | ||
1285 | le32_to_cpu(cck->rxe_frame_limit_overrun), | ||
1286 | accum_cck->rxe_frame_limit_overrun, | ||
1287 | delta_cck->rxe_frame_limit_overrun, | ||
1288 | max_cck->rxe_frame_limit_overrun); | ||
1289 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1290 | "sent_ack_cnt:", | ||
1291 | le32_to_cpu(cck->sent_ack_cnt), | ||
1292 | accum_cck->sent_ack_cnt, | ||
1293 | delta_cck->sent_ack_cnt, | ||
1294 | max_cck->sent_ack_cnt); | ||
1295 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1296 | "sent_cts_cnt:", | ||
1297 | le32_to_cpu(cck->sent_cts_cnt), | ||
1298 | accum_cck->sent_cts_cnt, | ||
1299 | delta_cck->sent_cts_cnt, | ||
1300 | max_cck->sent_cts_cnt); | ||
1301 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1302 | "sent_ba_rsp_cnt:", | ||
1303 | le32_to_cpu(cck->sent_ba_rsp_cnt), | ||
1304 | accum_cck->sent_ba_rsp_cnt, | ||
1305 | delta_cck->sent_ba_rsp_cnt, | ||
1306 | max_cck->sent_ba_rsp_cnt); | ||
1307 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1308 | "dsp_self_kill:", | ||
1309 | le32_to_cpu(cck->dsp_self_kill), | ||
1310 | accum_cck->dsp_self_kill, | ||
1311 | delta_cck->dsp_self_kill, | ||
1312 | max_cck->dsp_self_kill); | ||
1313 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1314 | "mh_format_err:", | ||
1315 | le32_to_cpu(cck->mh_format_err), | ||
1316 | accum_cck->mh_format_err, | ||
1317 | delta_cck->mh_format_err, max_cck->mh_format_err); | ||
1318 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1319 | "re_acq_main_rssi_sum:", | ||
1320 | le32_to_cpu(cck->re_acq_main_rssi_sum), | ||
1321 | accum_cck->re_acq_main_rssi_sum, | ||
1322 | delta_cck->re_acq_main_rssi_sum, | ||
1323 | max_cck->re_acq_main_rssi_sum); | ||
1324 | |||
1325 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_header, | ||
1326 | "Statistics_Rx - GENERAL:"); | ||
1327 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1328 | "bogus_cts:", | ||
1329 | le32_to_cpu(general->bogus_cts), | ||
1330 | accum_general->bogus_cts, | ||
1331 | delta_general->bogus_cts, max_general->bogus_cts); | ||
1332 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1333 | "bogus_ack:", | ||
1334 | le32_to_cpu(general->bogus_ack), | ||
1335 | accum_general->bogus_ack, | ||
1336 | delta_general->bogus_ack, max_general->bogus_ack); | ||
1337 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1338 | "non_bssid_frames:", | ||
1339 | le32_to_cpu(general->non_bssid_frames), | ||
1340 | accum_general->non_bssid_frames, | ||
1341 | delta_general->non_bssid_frames, | ||
1342 | max_general->non_bssid_frames); | ||
1343 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1344 | "filtered_frames:", | ||
1345 | le32_to_cpu(general->filtered_frames), | ||
1346 | accum_general->filtered_frames, | ||
1347 | delta_general->filtered_frames, | ||
1348 | max_general->filtered_frames); | ||
1349 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1350 | "non_channel_beacons:", | ||
1351 | le32_to_cpu(general->non_channel_beacons), | ||
1352 | accum_general->non_channel_beacons, | ||
1353 | delta_general->non_channel_beacons, | ||
1354 | max_general->non_channel_beacons); | ||
1355 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1356 | "channel_beacons:", | ||
1357 | le32_to_cpu(general->channel_beacons), | ||
1358 | accum_general->channel_beacons, | ||
1359 | delta_general->channel_beacons, | ||
1360 | max_general->channel_beacons); | ||
1361 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1362 | "num_missed_bcon:", | ||
1363 | le32_to_cpu(general->num_missed_bcon), | ||
1364 | accum_general->num_missed_bcon, | ||
1365 | delta_general->num_missed_bcon, | ||
1366 | max_general->num_missed_bcon); | ||
1367 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1368 | "adc_rx_saturation_time:", | ||
1369 | le32_to_cpu(general->adc_rx_saturation_time), | ||
1370 | accum_general->adc_rx_saturation_time, | ||
1371 | delta_general->adc_rx_saturation_time, | ||
1372 | max_general->adc_rx_saturation_time); | ||
1373 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1374 | "ina_detect_search_tm:", | ||
1375 | le32_to_cpu(general->ina_detection_search_time), | ||
1376 | accum_general->ina_detection_search_time, | ||
1377 | delta_general->ina_detection_search_time, | ||
1378 | max_general->ina_detection_search_time); | ||
1379 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1380 | "beacon_silence_rssi_a:", | ||
1381 | le32_to_cpu(general->beacon_silence_rssi_a), | ||
1382 | accum_general->beacon_silence_rssi_a, | ||
1383 | delta_general->beacon_silence_rssi_a, | ||
1384 | max_general->beacon_silence_rssi_a); | ||
1385 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1386 | "beacon_silence_rssi_b:", | ||
1387 | le32_to_cpu(general->beacon_silence_rssi_b), | ||
1388 | accum_general->beacon_silence_rssi_b, | ||
1389 | delta_general->beacon_silence_rssi_b, | ||
1390 | max_general->beacon_silence_rssi_b); | ||
1391 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1392 | "beacon_silence_rssi_c:", | ||
1393 | le32_to_cpu(general->beacon_silence_rssi_c), | ||
1394 | accum_general->beacon_silence_rssi_c, | ||
1395 | delta_general->beacon_silence_rssi_c, | ||
1396 | max_general->beacon_silence_rssi_c); | ||
1397 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1398 | "interference_data_flag:", | ||
1399 | le32_to_cpu(general->interference_data_flag), | ||
1400 | accum_general->interference_data_flag, | ||
1401 | delta_general->interference_data_flag, | ||
1402 | max_general->interference_data_flag); | ||
1403 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1404 | "channel_load:", | ||
1405 | le32_to_cpu(general->channel_load), | ||
1406 | accum_general->channel_load, | ||
1407 | delta_general->channel_load, | ||
1408 | max_general->channel_load); | ||
1409 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1410 | "dsp_false_alarms:", | ||
1411 | le32_to_cpu(general->dsp_false_alarms), | ||
1412 | accum_general->dsp_false_alarms, | ||
1413 | delta_general->dsp_false_alarms, | ||
1414 | max_general->dsp_false_alarms); | ||
1415 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1416 | "beacon_rssi_a:", | ||
1417 | le32_to_cpu(general->beacon_rssi_a), | ||
1418 | accum_general->beacon_rssi_a, | ||
1419 | delta_general->beacon_rssi_a, | ||
1420 | max_general->beacon_rssi_a); | ||
1421 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1422 | "beacon_rssi_b:", | ||
1423 | le32_to_cpu(general->beacon_rssi_b), | ||
1424 | accum_general->beacon_rssi_b, | ||
1425 | delta_general->beacon_rssi_b, | ||
1426 | max_general->beacon_rssi_b); | ||
1427 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1428 | "beacon_rssi_c:", | ||
1429 | le32_to_cpu(general->beacon_rssi_c), | ||
1430 | accum_general->beacon_rssi_c, | ||
1431 | delta_general->beacon_rssi_c, | ||
1432 | max_general->beacon_rssi_c); | ||
1433 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1434 | "beacon_energy_a:", | ||
1435 | le32_to_cpu(general->beacon_energy_a), | ||
1436 | accum_general->beacon_energy_a, | ||
1437 | delta_general->beacon_energy_a, | ||
1438 | max_general->beacon_energy_a); | ||
1439 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1440 | "beacon_energy_b:", | ||
1441 | le32_to_cpu(general->beacon_energy_b), | ||
1442 | accum_general->beacon_energy_b, | ||
1443 | delta_general->beacon_energy_b, | ||
1444 | max_general->beacon_energy_b); | ||
1445 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1446 | "beacon_energy_c:", | ||
1447 | le32_to_cpu(general->beacon_energy_c), | ||
1448 | accum_general->beacon_energy_c, | ||
1449 | delta_general->beacon_energy_c, | ||
1450 | max_general->beacon_energy_c); | ||
1451 | |||
1452 | pos += scnprintf(buf + pos, bufsz - pos, "Statistics_Rx - OFDM_HT:\n"); | ||
1453 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_header, | ||
1454 | "Statistics_Rx - OFDM_HT:"); | ||
1455 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1456 | "plcp_err:", | ||
1457 | le32_to_cpu(ht->plcp_err), accum_ht->plcp_err, | ||
1458 | delta_ht->plcp_err, max_ht->plcp_err); | ||
1459 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1460 | "overrun_err:", | ||
1461 | le32_to_cpu(ht->overrun_err), accum_ht->overrun_err, | ||
1462 | delta_ht->overrun_err, max_ht->overrun_err); | ||
1463 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1464 | "early_overrun_err:", | ||
1465 | le32_to_cpu(ht->early_overrun_err), | ||
1466 | accum_ht->early_overrun_err, | ||
1467 | delta_ht->early_overrun_err, | ||
1468 | max_ht->early_overrun_err); | ||
1469 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1470 | "crc32_good:", | ||
1471 | le32_to_cpu(ht->crc32_good), accum_ht->crc32_good, | ||
1472 | delta_ht->crc32_good, max_ht->crc32_good); | ||
1473 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1474 | "crc32_err:", | ||
1475 | le32_to_cpu(ht->crc32_err), accum_ht->crc32_err, | ||
1476 | delta_ht->crc32_err, max_ht->crc32_err); | ||
1477 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1478 | "mh_format_err:", | ||
1479 | le32_to_cpu(ht->mh_format_err), | ||
1480 | accum_ht->mh_format_err, | ||
1481 | delta_ht->mh_format_err, max_ht->mh_format_err); | ||
1482 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1483 | "agg_crc32_good:", | ||
1484 | le32_to_cpu(ht->agg_crc32_good), | ||
1485 | accum_ht->agg_crc32_good, | ||
1486 | delta_ht->agg_crc32_good, max_ht->agg_crc32_good); | ||
1487 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1488 | "agg_mpdu_cnt:", | ||
1489 | le32_to_cpu(ht->agg_mpdu_cnt), | ||
1490 | accum_ht->agg_mpdu_cnt, | ||
1491 | delta_ht->agg_mpdu_cnt, max_ht->agg_mpdu_cnt); | ||
1492 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1493 | "agg_cnt:", | ||
1494 | le32_to_cpu(ht->agg_cnt), accum_ht->agg_cnt, | ||
1495 | delta_ht->agg_cnt, max_ht->agg_cnt); | ||
1496 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1497 | "unsupport_mcs:", | ||
1498 | le32_to_cpu(ht->unsupport_mcs), | ||
1499 | accum_ht->unsupport_mcs, | ||
1500 | delta_ht->unsupport_mcs, max_ht->unsupport_mcs); | ||
1501 | |||
1502 | ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); | ||
1503 | kfree(buf); | ||
1504 | return ret; | ||
1505 | } | 1066 | } |
1506 | 1067 | ||
1507 | static ssize_t iwl_dbgfs_ucode_tx_stats_read(struct file *file, | 1068 | static ssize_t iwl_dbgfs_ucode_tx_stats_read(struct file *file, |
@@ -1509,173 +1070,10 @@ static ssize_t iwl_dbgfs_ucode_tx_stats_read(struct file *file, | |||
1509 | size_t count, loff_t *ppos) | 1070 | size_t count, loff_t *ppos) |
1510 | { | 1071 | { |
1511 | struct iwl_priv *priv = file->private_data; | 1072 | struct iwl_priv *priv = file->private_data; |
1512 | int pos = 0; | 1073 | if (priv->cfg->ops->lib->debugfs_ops.tx_stats_read) |
1513 | char *buf; | 1074 | return priv->cfg->ops->lib->debugfs_ops.tx_stats_read(file, |
1514 | int bufsz = (sizeof(struct statistics_tx) * 48) + 250; | 1075 | user_buf, count, ppos); |
1515 | ssize_t ret; | 1076 | return 0; |
1516 | struct statistics_tx *tx, *accum_tx, *delta_tx, *max_tx; | ||
1517 | |||
1518 | if (!iwl_is_alive(priv)) | ||
1519 | return -EAGAIN; | ||
1520 | |||
1521 | buf = kzalloc(bufsz, GFP_KERNEL); | ||
1522 | if (!buf) { | ||
1523 | IWL_ERR(priv, "Can not allocate Buffer\n"); | ||
1524 | return -ENOMEM; | ||
1525 | } | ||
1526 | |||
1527 | /* the statistic information display here is based on | ||
1528 | * the last statistics notification from uCode | ||
1529 | * might not reflect the current uCode activity | ||
1530 | */ | ||
1531 | tx = &priv->statistics.tx; | ||
1532 | accum_tx = &priv->accum_statistics.tx; | ||
1533 | delta_tx = &priv->delta_statistics.tx; | ||
1534 | max_tx = &priv->max_delta.tx; | ||
1535 | pos += iwl_dbgfs_statistics_flag(priv, buf, bufsz); | ||
1536 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_header, | ||
1537 | "Statistics_Tx:"); | ||
1538 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1539 | "preamble:", | ||
1540 | le32_to_cpu(tx->preamble_cnt), | ||
1541 | accum_tx->preamble_cnt, | ||
1542 | delta_tx->preamble_cnt, max_tx->preamble_cnt); | ||
1543 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1544 | "rx_detected_cnt:", | ||
1545 | le32_to_cpu(tx->rx_detected_cnt), | ||
1546 | accum_tx->rx_detected_cnt, | ||
1547 | delta_tx->rx_detected_cnt, max_tx->rx_detected_cnt); | ||
1548 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1549 | "bt_prio_defer_cnt:", | ||
1550 | le32_to_cpu(tx->bt_prio_defer_cnt), | ||
1551 | accum_tx->bt_prio_defer_cnt, | ||
1552 | delta_tx->bt_prio_defer_cnt, | ||
1553 | max_tx->bt_prio_defer_cnt); | ||
1554 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1555 | "bt_prio_kill_cnt:", | ||
1556 | le32_to_cpu(tx->bt_prio_kill_cnt), | ||
1557 | accum_tx->bt_prio_kill_cnt, | ||
1558 | delta_tx->bt_prio_kill_cnt, | ||
1559 | max_tx->bt_prio_kill_cnt); | ||
1560 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1561 | "few_bytes_cnt:", | ||
1562 | le32_to_cpu(tx->few_bytes_cnt), | ||
1563 | accum_tx->few_bytes_cnt, | ||
1564 | delta_tx->few_bytes_cnt, max_tx->few_bytes_cnt); | ||
1565 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1566 | "cts_timeout:", | ||
1567 | le32_to_cpu(tx->cts_timeout), accum_tx->cts_timeout, | ||
1568 | delta_tx->cts_timeout, max_tx->cts_timeout); | ||
1569 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1570 | "ack_timeout:", | ||
1571 | le32_to_cpu(tx->ack_timeout), | ||
1572 | accum_tx->ack_timeout, | ||
1573 | delta_tx->ack_timeout, max_tx->ack_timeout); | ||
1574 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1575 | "expected_ack_cnt:", | ||
1576 | le32_to_cpu(tx->expected_ack_cnt), | ||
1577 | accum_tx->expected_ack_cnt, | ||
1578 | delta_tx->expected_ack_cnt, | ||
1579 | max_tx->expected_ack_cnt); | ||
1580 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1581 | "actual_ack_cnt:", | ||
1582 | le32_to_cpu(tx->actual_ack_cnt), | ||
1583 | accum_tx->actual_ack_cnt, | ||
1584 | delta_tx->actual_ack_cnt, | ||
1585 | max_tx->actual_ack_cnt); | ||
1586 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1587 | "dump_msdu_cnt:", | ||
1588 | le32_to_cpu(tx->dump_msdu_cnt), | ||
1589 | accum_tx->dump_msdu_cnt, | ||
1590 | delta_tx->dump_msdu_cnt, | ||
1591 | max_tx->dump_msdu_cnt); | ||
1592 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1593 | "abort_nxt_frame_mismatch:", | ||
1594 | le32_to_cpu(tx->burst_abort_next_frame_mismatch_cnt), | ||
1595 | accum_tx->burst_abort_next_frame_mismatch_cnt, | ||
1596 | delta_tx->burst_abort_next_frame_mismatch_cnt, | ||
1597 | max_tx->burst_abort_next_frame_mismatch_cnt); | ||
1598 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1599 | "abort_missing_nxt_frame:", | ||
1600 | le32_to_cpu(tx->burst_abort_missing_next_frame_cnt), | ||
1601 | accum_tx->burst_abort_missing_next_frame_cnt, | ||
1602 | delta_tx->burst_abort_missing_next_frame_cnt, | ||
1603 | max_tx->burst_abort_missing_next_frame_cnt); | ||
1604 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1605 | "cts_timeout_collision:", | ||
1606 | le32_to_cpu(tx->cts_timeout_collision), | ||
1607 | accum_tx->cts_timeout_collision, | ||
1608 | delta_tx->cts_timeout_collision, | ||
1609 | max_tx->cts_timeout_collision); | ||
1610 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1611 | "ack_ba_timeout_collision:", | ||
1612 | le32_to_cpu(tx->ack_or_ba_timeout_collision), | ||
1613 | accum_tx->ack_or_ba_timeout_collision, | ||
1614 | delta_tx->ack_or_ba_timeout_collision, | ||
1615 | max_tx->ack_or_ba_timeout_collision); | ||
1616 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1617 | "agg ba_timeout:", | ||
1618 | le32_to_cpu(tx->agg.ba_timeout), | ||
1619 | accum_tx->agg.ba_timeout, | ||
1620 | delta_tx->agg.ba_timeout, | ||
1621 | max_tx->agg.ba_timeout); | ||
1622 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1623 | "agg ba_resched_frames:", | ||
1624 | le32_to_cpu(tx->agg.ba_reschedule_frames), | ||
1625 | accum_tx->agg.ba_reschedule_frames, | ||
1626 | delta_tx->agg.ba_reschedule_frames, | ||
1627 | max_tx->agg.ba_reschedule_frames); | ||
1628 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1629 | "agg scd_query_agg_frame:", | ||
1630 | le32_to_cpu(tx->agg.scd_query_agg_frame_cnt), | ||
1631 | accum_tx->agg.scd_query_agg_frame_cnt, | ||
1632 | delta_tx->agg.scd_query_agg_frame_cnt, | ||
1633 | max_tx->agg.scd_query_agg_frame_cnt); | ||
1634 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1635 | "agg scd_query_no_agg:", | ||
1636 | le32_to_cpu(tx->agg.scd_query_no_agg), | ||
1637 | accum_tx->agg.scd_query_no_agg, | ||
1638 | delta_tx->agg.scd_query_no_agg, | ||
1639 | max_tx->agg.scd_query_no_agg); | ||
1640 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1641 | "agg scd_query_agg:", | ||
1642 | le32_to_cpu(tx->agg.scd_query_agg), | ||
1643 | accum_tx->agg.scd_query_agg, | ||
1644 | delta_tx->agg.scd_query_agg, | ||
1645 | max_tx->agg.scd_query_agg); | ||
1646 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1647 | "agg scd_query_mismatch:", | ||
1648 | le32_to_cpu(tx->agg.scd_query_mismatch), | ||
1649 | accum_tx->agg.scd_query_mismatch, | ||
1650 | delta_tx->agg.scd_query_mismatch, | ||
1651 | max_tx->agg.scd_query_mismatch); | ||
1652 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1653 | "agg frame_not_ready:", | ||
1654 | le32_to_cpu(tx->agg.frame_not_ready), | ||
1655 | accum_tx->agg.frame_not_ready, | ||
1656 | delta_tx->agg.frame_not_ready, | ||
1657 | max_tx->agg.frame_not_ready); | ||
1658 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1659 | "agg underrun:", | ||
1660 | le32_to_cpu(tx->agg.underrun), | ||
1661 | accum_tx->agg.underrun, | ||
1662 | delta_tx->agg.underrun, max_tx->agg.underrun); | ||
1663 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1664 | "agg bt_prio_kill:", | ||
1665 | le32_to_cpu(tx->agg.bt_prio_kill), | ||
1666 | accum_tx->agg.bt_prio_kill, | ||
1667 | delta_tx->agg.bt_prio_kill, | ||
1668 | max_tx->agg.bt_prio_kill); | ||
1669 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1670 | "agg rx_ba_rsp_cnt:", | ||
1671 | le32_to_cpu(tx->agg.rx_ba_rsp_cnt), | ||
1672 | accum_tx->agg.rx_ba_rsp_cnt, | ||
1673 | delta_tx->agg.rx_ba_rsp_cnt, | ||
1674 | max_tx->agg.rx_ba_rsp_cnt); | ||
1675 | |||
1676 | ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); | ||
1677 | kfree(buf); | ||
1678 | return ret; | ||
1679 | } | 1077 | } |
1680 | 1078 | ||
1681 | static ssize_t iwl_dbgfs_ucode_general_stats_read(struct file *file, | 1079 | static ssize_t iwl_dbgfs_ucode_general_stats_read(struct file *file, |
@@ -1683,107 +1081,10 @@ static ssize_t iwl_dbgfs_ucode_general_stats_read(struct file *file, | |||
1683 | size_t count, loff_t *ppos) | 1081 | size_t count, loff_t *ppos) |
1684 | { | 1082 | { |
1685 | struct iwl_priv *priv = file->private_data; | 1083 | struct iwl_priv *priv = file->private_data; |
1686 | int pos = 0; | 1084 | if (priv->cfg->ops->lib->debugfs_ops.general_stats_read) |
1687 | char *buf; | 1085 | return priv->cfg->ops->lib->debugfs_ops.general_stats_read(file, |
1688 | int bufsz = sizeof(struct statistics_general) * 10 + 300; | 1086 | user_buf, count, ppos); |
1689 | ssize_t ret; | 1087 | return 0; |
1690 | struct statistics_general *general, *accum_general; | ||
1691 | struct statistics_general *delta_general, *max_general; | ||
1692 | struct statistics_dbg *dbg, *accum_dbg, *delta_dbg, *max_dbg; | ||
1693 | struct statistics_div *div, *accum_div, *delta_div, *max_div; | ||
1694 | |||
1695 | if (!iwl_is_alive(priv)) | ||
1696 | return -EAGAIN; | ||
1697 | |||
1698 | buf = kzalloc(bufsz, GFP_KERNEL); | ||
1699 | if (!buf) { | ||
1700 | IWL_ERR(priv, "Can not allocate Buffer\n"); | ||
1701 | return -ENOMEM; | ||
1702 | } | ||
1703 | |||
1704 | /* the statistic information display here is based on | ||
1705 | * the last statistics notification from uCode | ||
1706 | * might not reflect the current uCode activity | ||
1707 | */ | ||
1708 | general = &priv->statistics.general; | ||
1709 | dbg = &priv->statistics.general.dbg; | ||
1710 | div = &priv->statistics.general.div; | ||
1711 | accum_general = &priv->accum_statistics.general; | ||
1712 | delta_general = &priv->delta_statistics.general; | ||
1713 | max_general = &priv->max_delta.general; | ||
1714 | accum_dbg = &priv->accum_statistics.general.dbg; | ||
1715 | delta_dbg = &priv->delta_statistics.general.dbg; | ||
1716 | max_dbg = &priv->max_delta.general.dbg; | ||
1717 | accum_div = &priv->accum_statistics.general.div; | ||
1718 | delta_div = &priv->delta_statistics.general.div; | ||
1719 | max_div = &priv->max_delta.general.div; | ||
1720 | pos += iwl_dbgfs_statistics_flag(priv, buf, bufsz); | ||
1721 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_header, | ||
1722 | "Statistics_General:"); | ||
1723 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_short_format, | ||
1724 | "temperature:", | ||
1725 | le32_to_cpu(general->temperature)); | ||
1726 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_short_format, | ||
1727 | "temperature_m:", | ||
1728 | le32_to_cpu(general->temperature_m)); | ||
1729 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1730 | "burst_check:", | ||
1731 | le32_to_cpu(dbg->burst_check), | ||
1732 | accum_dbg->burst_check, | ||
1733 | delta_dbg->burst_check, max_dbg->burst_check); | ||
1734 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1735 | "burst_count:", | ||
1736 | le32_to_cpu(dbg->burst_count), | ||
1737 | accum_dbg->burst_count, | ||
1738 | delta_dbg->burst_count, max_dbg->burst_count); | ||
1739 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1740 | "sleep_time:", | ||
1741 | le32_to_cpu(general->sleep_time), | ||
1742 | accum_general->sleep_time, | ||
1743 | delta_general->sleep_time, max_general->sleep_time); | ||
1744 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1745 | "slots_out:", | ||
1746 | le32_to_cpu(general->slots_out), | ||
1747 | accum_general->slots_out, | ||
1748 | delta_general->slots_out, max_general->slots_out); | ||
1749 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1750 | "slots_idle:", | ||
1751 | le32_to_cpu(general->slots_idle), | ||
1752 | accum_general->slots_idle, | ||
1753 | delta_general->slots_idle, max_general->slots_idle); | ||
1754 | pos += scnprintf(buf + pos, bufsz - pos, "ttl_timestamp:\t\t\t%u\n", | ||
1755 | le32_to_cpu(general->ttl_timestamp)); | ||
1756 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1757 | "tx_on_a:", | ||
1758 | le32_to_cpu(div->tx_on_a), accum_div->tx_on_a, | ||
1759 | delta_div->tx_on_a, max_div->tx_on_a); | ||
1760 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1761 | "tx_on_b:", | ||
1762 | le32_to_cpu(div->tx_on_b), accum_div->tx_on_b, | ||
1763 | delta_div->tx_on_b, max_div->tx_on_b); | ||
1764 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1765 | "exec_time:", | ||
1766 | le32_to_cpu(div->exec_time), accum_div->exec_time, | ||
1767 | delta_div->exec_time, max_div->exec_time); | ||
1768 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1769 | "probe_time:", | ||
1770 | le32_to_cpu(div->probe_time), accum_div->probe_time, | ||
1771 | delta_div->probe_time, max_div->probe_time); | ||
1772 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1773 | "rx_enable_counter:", | ||
1774 | le32_to_cpu(general->rx_enable_counter), | ||
1775 | accum_general->rx_enable_counter, | ||
1776 | delta_general->rx_enable_counter, | ||
1777 | max_general->rx_enable_counter); | ||
1778 | pos += scnprintf(buf + pos, bufsz - pos, ucode_stats_format, | ||
1779 | "num_of_sos_states:", | ||
1780 | le32_to_cpu(general->num_of_sos_states), | ||
1781 | accum_general->num_of_sos_states, | ||
1782 | delta_general->num_of_sos_states, | ||
1783 | max_general->num_of_sos_states); | ||
1784 | ret = simple_read_from_buffer(user_buf, count, ppos, buf, pos); | ||
1785 | kfree(buf); | ||
1786 | return ret; | ||
1787 | } | 1088 | } |
1788 | 1089 | ||
1789 | static ssize_t iwl_dbgfs_sensitivity_read(struct file *file, | 1090 | static ssize_t iwl_dbgfs_sensitivity_read(struct file *file, |
@@ -2341,10 +1642,11 @@ int iwl_dbgfs_register(struct iwl_priv *priv, const char *name) | |||
2341 | DEBUGFS_ADD_FILE(missed_beacon, dir_debug, S_IWUSR); | 1642 | DEBUGFS_ADD_FILE(missed_beacon, dir_debug, S_IWUSR); |
2342 | DEBUGFS_ADD_FILE(plcp_delta, dir_debug, S_IWUSR | S_IRUSR); | 1643 | DEBUGFS_ADD_FILE(plcp_delta, dir_debug, S_IWUSR | S_IRUSR); |
2343 | DEBUGFS_ADD_FILE(force_reset, dir_debug, S_IWUSR | S_IRUSR); | 1644 | DEBUGFS_ADD_FILE(force_reset, dir_debug, S_IWUSR | S_IRUSR); |
1645 | DEBUGFS_ADD_FILE(ucode_rx_stats, dir_debug, S_IRUSR); | ||
1646 | DEBUGFS_ADD_FILE(ucode_tx_stats, dir_debug, S_IRUSR); | ||
1647 | DEBUGFS_ADD_FILE(ucode_general_stats, dir_debug, S_IRUSR); | ||
1648 | |||
2344 | if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) != CSR_HW_REV_TYPE_3945) { | 1649 | if ((priv->hw_rev & CSR_HW_REV_TYPE_MSK) != CSR_HW_REV_TYPE_3945) { |
2345 | DEBUGFS_ADD_FILE(ucode_rx_stats, dir_debug, S_IRUSR); | ||
2346 | DEBUGFS_ADD_FILE(ucode_tx_stats, dir_debug, S_IRUSR); | ||
2347 | DEBUGFS_ADD_FILE(ucode_general_stats, dir_debug, S_IRUSR); | ||
2348 | DEBUGFS_ADD_FILE(sensitivity, dir_debug, S_IRUSR); | 1650 | DEBUGFS_ADD_FILE(sensitivity, dir_debug, S_IRUSR); |
2349 | DEBUGFS_ADD_FILE(chain_noise, dir_debug, S_IRUSR); | 1651 | DEBUGFS_ADD_FILE(chain_noise, dir_debug, S_IRUSR); |
2350 | DEBUGFS_ADD_FILE(ucode_tracing, dir_debug, S_IWUSR | S_IRUSR); | 1652 | DEBUGFS_ADD_FILE(ucode_tracing, dir_debug, S_IWUSR | S_IRUSR); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-dev.h b/drivers/net/wireless/iwlwifi/iwl-dev.h index b2d94c7c6457..bdc60aae75ec 100644 --- a/drivers/net/wireless/iwlwifi/iwl-dev.h +++ b/drivers/net/wireless/iwlwifi/iwl-dev.h | |||
@@ -58,7 +58,7 @@ extern struct iwl_cfg iwl5100_abg_cfg; | |||
58 | extern struct iwl_cfg iwl5150_agn_cfg; | 58 | extern struct iwl_cfg iwl5150_agn_cfg; |
59 | extern struct iwl_cfg iwl5150_abg_cfg; | 59 | extern struct iwl_cfg iwl5150_abg_cfg; |
60 | extern struct iwl_cfg iwl6000i_2agn_cfg; | 60 | extern struct iwl_cfg iwl6000i_2agn_cfg; |
61 | extern struct iwl_cfg iwl6000i_g2_2agn_cfg; | 61 | extern struct iwl_cfg iwl6000g2_2agn_cfg; |
62 | extern struct iwl_cfg iwl6000i_2abg_cfg; | 62 | extern struct iwl_cfg iwl6000i_2abg_cfg; |
63 | extern struct iwl_cfg iwl6000i_2bg_cfg; | 63 | extern struct iwl_cfg iwl6000i_2bg_cfg; |
64 | extern struct iwl_cfg iwl6000_3agn_cfg; | 64 | extern struct iwl_cfg iwl6000_3agn_cfg; |
@@ -1049,12 +1049,10 @@ struct iwl_priv { | |||
1049 | struct iwl_calib_result calib_results[IWL_CALIB_MAX]; | 1049 | struct iwl_calib_result calib_results[IWL_CALIB_MAX]; |
1050 | 1050 | ||
1051 | /* Scan related variables */ | 1051 | /* Scan related variables */ |
1052 | unsigned long next_scan_jiffies; | ||
1053 | unsigned long scan_start; | 1052 | unsigned long scan_start; |
1054 | unsigned long scan_pass_start; | ||
1055 | unsigned long scan_start_tsf; | 1053 | unsigned long scan_start_tsf; |
1056 | void *scan; | 1054 | void *scan_cmd; |
1057 | int scan_bands; | 1055 | enum ieee80211_band scan_band; |
1058 | struct cfg80211_scan_request *scan_request; | 1056 | struct cfg80211_scan_request *scan_request; |
1059 | bool is_internal_short_scan; | 1057 | bool is_internal_short_scan; |
1060 | u8 scan_tx_ant[IEEE80211_NUM_BANDS]; | 1058 | u8 scan_tx_ant[IEEE80211_NUM_BANDS]; |
@@ -1259,7 +1257,6 @@ struct iwl_priv { | |||
1259 | struct work_struct scan_completed; | 1257 | struct work_struct scan_completed; |
1260 | struct work_struct rx_replenish; | 1258 | struct work_struct rx_replenish; |
1261 | struct work_struct abort_scan; | 1259 | struct work_struct abort_scan; |
1262 | struct work_struct request_scan; | ||
1263 | struct work_struct beacon_update; | 1260 | struct work_struct beacon_update; |
1264 | struct work_struct tt_work; | 1261 | struct work_struct tt_work; |
1265 | struct work_struct ct_enter; | 1262 | struct work_struct ct_enter; |
diff --git a/drivers/net/wireless/iwlwifi/iwl-eeprom.h b/drivers/net/wireless/iwlwifi/iwl-eeprom.h index ef0e3256eec2..95aa202c85e3 100644 --- a/drivers/net/wireless/iwlwifi/iwl-eeprom.h +++ b/drivers/net/wireless/iwlwifi/iwl-eeprom.h | |||
@@ -172,22 +172,22 @@ struct iwl_eeprom_enhanced_txpwr { | |||
172 | #define EEPROM_5000_TX_POWER_VERSION (4) | 172 | #define EEPROM_5000_TX_POWER_VERSION (4) |
173 | #define EEPROM_5000_EEPROM_VERSION (0x11A) | 173 | #define EEPROM_5000_EEPROM_VERSION (0x11A) |
174 | 174 | ||
175 | /*5000 calibrations */ | 175 | /* 5000 and up calibration */ |
176 | #define EEPROM_5000_CALIB_ALL (INDIRECT_ADDRESS | INDIRECT_CALIBRATION) | 176 | #define EEPROM_CALIB_ALL (INDIRECT_ADDRESS | INDIRECT_CALIBRATION) |
177 | #define EEPROM_5000_XTAL ((2*0x128) | EEPROM_5000_CALIB_ALL) | 177 | #define EEPROM_XTAL ((2*0x128) | EEPROM_CALIB_ALL) |
178 | #define EEPROM_5000_TEMPERATURE ((2*0x12A) | EEPROM_5000_CALIB_ALL) | 178 | |
179 | 179 | /* 5000 temperature */ | |
180 | /* 5000 links */ | 180 | #define EEPROM_5000_TEMPERATURE ((2*0x12A) | EEPROM_CALIB_ALL) |
181 | #define EEPROM_5000_LINK_HOST (2*0x64) | 181 | |
182 | #define EEPROM_5000_LINK_GENERAL (2*0x65) | 182 | /* agn links */ |
183 | #define EEPROM_5000_LINK_REGULATORY (2*0x66) | 183 | #define EEPROM_LINK_HOST (2*0x64) |
184 | #define EEPROM_5000_LINK_CALIBRATION (2*0x67) | 184 | #define EEPROM_LINK_GENERAL (2*0x65) |
185 | #define EEPROM_5000_LINK_PROCESS_ADJST (2*0x68) | 185 | #define EEPROM_LINK_REGULATORY (2*0x66) |
186 | #define EEPROM_5000_LINK_OTHERS (2*0x69) | 186 | #define EEPROM_LINK_CALIBRATION (2*0x67) |
187 | 187 | #define EEPROM_LINK_PROCESS_ADJST (2*0x68) | |
188 | /* 5000 regulatory - indirect access */ | 188 | #define EEPROM_LINK_OTHERS (2*0x69) |
189 | #define EEPROM_5000_REG_SKU_ID ((0x02)\ | 189 | |
190 | | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 4 bytes */ | 190 | /* agn regulatory - indirect access */ |
191 | #define EEPROM_REG_BAND_1_CHANNELS ((0x08)\ | 191 | #define EEPROM_REG_BAND_1_CHANNELS ((0x08)\ |
192 | | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 28 bytes */ | 192 | | INDIRECT_ADDRESS | INDIRECT_REGULATORY) /* 28 bytes */ |
193 | #define EEPROM_REG_BAND_2_CHANNELS ((0x26)\ | 193 | #define EEPROM_REG_BAND_2_CHANNELS ((0x26)\ |
@@ -276,6 +276,10 @@ struct iwl_eeprom_enhanced_txpwr { | |||
276 | #define EEPROM_6050_TX_POWER_VERSION (4) | 276 | #define EEPROM_6050_TX_POWER_VERSION (4) |
277 | #define EEPROM_6050_EEPROM_VERSION (0x532) | 277 | #define EEPROM_6050_EEPROM_VERSION (0x532) |
278 | 278 | ||
279 | /* 6x00g2 Specific */ | ||
280 | #define EEPROM_6000G2_TX_POWER_VERSION (6) | ||
281 | #define EEPROM_6000G2_EEPROM_VERSION (0x709) | ||
282 | |||
279 | /* OTP */ | 283 | /* OTP */ |
280 | /* lower blocks contain EEPROM image and calibration data */ | 284 | /* lower blocks contain EEPROM image and calibration data */ |
281 | #define OTP_LOW_IMAGE_SIZE (2 * 512 * sizeof(u16)) /* 2 KB */ | 285 | #define OTP_LOW_IMAGE_SIZE (2 * 512 * sizeof(u16)) /* 2 KB */ |
diff --git a/drivers/net/wireless/iwlwifi/iwl-prph.h b/drivers/net/wireless/iwlwifi/iwl-prph.h index 5944de7a98a2..b1f101caf19d 100644 --- a/drivers/net/wireless/iwlwifi/iwl-prph.h +++ b/drivers/net/wireless/iwlwifi/iwl-prph.h | |||
@@ -529,48 +529,48 @@ | |||
529 | #define IWL_SCD_TXFIFO_POS_RA (4) | 529 | #define IWL_SCD_TXFIFO_POS_RA (4) |
530 | #define IWL_SCD_QUEUE_RA_TID_MAP_RATID_MSK (0x01FF) | 530 | #define IWL_SCD_QUEUE_RA_TID_MAP_RATID_MSK (0x01FF) |
531 | 531 | ||
532 | /* 5000 SCD */ | 532 | /* agn SCD */ |
533 | #define IWL50_SCD_QUEUE_STTS_REG_POS_TXF (0) | 533 | #define IWLAGN_SCD_QUEUE_STTS_REG_POS_TXF (0) |
534 | #define IWL50_SCD_QUEUE_STTS_REG_POS_ACTIVE (3) | 534 | #define IWLAGN_SCD_QUEUE_STTS_REG_POS_ACTIVE (3) |
535 | #define IWL50_SCD_QUEUE_STTS_REG_POS_WSL (4) | 535 | #define IWLAGN_SCD_QUEUE_STTS_REG_POS_WSL (4) |
536 | #define IWL50_SCD_QUEUE_STTS_REG_POS_SCD_ACT_EN (19) | 536 | #define IWLAGN_SCD_QUEUE_STTS_REG_POS_SCD_ACT_EN (19) |
537 | #define IWL50_SCD_QUEUE_STTS_REG_MSK (0x00FF0000) | 537 | #define IWLAGN_SCD_QUEUE_STTS_REG_MSK (0x00FF0000) |
538 | 538 | ||
539 | #define IWL50_SCD_QUEUE_CTX_REG1_CREDIT_POS (8) | 539 | #define IWLAGN_SCD_QUEUE_CTX_REG1_CREDIT_POS (8) |
540 | #define IWL50_SCD_QUEUE_CTX_REG1_CREDIT_MSK (0x00FFFF00) | 540 | #define IWLAGN_SCD_QUEUE_CTX_REG1_CREDIT_MSK (0x00FFFF00) |
541 | #define IWL50_SCD_QUEUE_CTX_REG1_SUPER_CREDIT_POS (24) | 541 | #define IWLAGN_SCD_QUEUE_CTX_REG1_SUPER_CREDIT_POS (24) |
542 | #define IWL50_SCD_QUEUE_CTX_REG1_SUPER_CREDIT_MSK (0xFF000000) | 542 | #define IWLAGN_SCD_QUEUE_CTX_REG1_SUPER_CREDIT_MSK (0xFF000000) |
543 | #define IWL50_SCD_QUEUE_CTX_REG2_WIN_SIZE_POS (0) | 543 | #define IWLAGN_SCD_QUEUE_CTX_REG2_WIN_SIZE_POS (0) |
544 | #define IWL50_SCD_QUEUE_CTX_REG2_WIN_SIZE_MSK (0x0000007F) | 544 | #define IWLAGN_SCD_QUEUE_CTX_REG2_WIN_SIZE_MSK (0x0000007F) |
545 | #define IWL50_SCD_QUEUE_CTX_REG2_FRAME_LIMIT_POS (16) | 545 | #define IWLAGN_SCD_QUEUE_CTX_REG2_FRAME_LIMIT_POS (16) |
546 | #define IWL50_SCD_QUEUE_CTX_REG2_FRAME_LIMIT_MSK (0x007F0000) | 546 | #define IWLAGN_SCD_QUEUE_CTX_REG2_FRAME_LIMIT_MSK (0x007F0000) |
547 | 547 | ||
548 | #define IWL50_SCD_CONTEXT_DATA_OFFSET (0x600) | 548 | #define IWLAGN_SCD_CONTEXT_DATA_OFFSET (0x600) |
549 | #define IWL50_SCD_TX_STTS_BITMAP_OFFSET (0x7B1) | 549 | #define IWLAGN_SCD_TX_STTS_BITMAP_OFFSET (0x7B1) |
550 | #define IWL50_SCD_TRANSLATE_TBL_OFFSET (0x7E0) | 550 | #define IWLAGN_SCD_TRANSLATE_TBL_OFFSET (0x7E0) |
551 | 551 | ||
552 | #define IWL50_SCD_CONTEXT_QUEUE_OFFSET(x)\ | 552 | #define IWLAGN_SCD_CONTEXT_QUEUE_OFFSET(x)\ |
553 | (IWL50_SCD_CONTEXT_DATA_OFFSET + ((x) * 8)) | 553 | (IWLAGN_SCD_CONTEXT_DATA_OFFSET + ((x) * 8)) |
554 | 554 | ||
555 | #define IWL50_SCD_TRANSLATE_TBL_OFFSET_QUEUE(x) \ | 555 | #define IWLAGN_SCD_TRANSLATE_TBL_OFFSET_QUEUE(x) \ |
556 | ((IWL50_SCD_TRANSLATE_TBL_OFFSET + ((x) * 2)) & 0xfffc) | 556 | ((IWLAGN_SCD_TRANSLATE_TBL_OFFSET + ((x) * 2)) & 0xfffc) |
557 | 557 | ||
558 | #define IWL50_SCD_QUEUECHAIN_SEL_ALL(x) (((1<<(x)) - 1) &\ | 558 | #define IWLAGN_SCD_QUEUECHAIN_SEL_ALL(x) (((1<<(x)) - 1) &\ |
559 | (~(1<<IWL_CMD_QUEUE_NUM))) | 559 | (~(1<<IWL_CMD_QUEUE_NUM))) |
560 | 560 | ||
561 | #define IWL50_SCD_BASE (PRPH_BASE + 0xa02c00) | 561 | #define IWLAGN_SCD_BASE (PRPH_BASE + 0xa02c00) |
562 | 562 | ||
563 | #define IWL50_SCD_SRAM_BASE_ADDR (IWL50_SCD_BASE + 0x0) | 563 | #define IWLAGN_SCD_SRAM_BASE_ADDR (IWLAGN_SCD_BASE + 0x0) |
564 | #define IWL50_SCD_DRAM_BASE_ADDR (IWL50_SCD_BASE + 0x8) | 564 | #define IWLAGN_SCD_DRAM_BASE_ADDR (IWLAGN_SCD_BASE + 0x8) |
565 | #define IWL50_SCD_AIT (IWL50_SCD_BASE + 0x0c) | 565 | #define IWLAGN_SCD_AIT (IWLAGN_SCD_BASE + 0x0c) |
566 | #define IWL50_SCD_TXFACT (IWL50_SCD_BASE + 0x10) | 566 | #define IWLAGN_SCD_TXFACT (IWLAGN_SCD_BASE + 0x10) |
567 | #define IWL50_SCD_ACTIVE (IWL50_SCD_BASE + 0x14) | 567 | #define IWLAGN_SCD_ACTIVE (IWLAGN_SCD_BASE + 0x14) |
568 | #define IWL50_SCD_QUEUE_WRPTR(x) (IWL50_SCD_BASE + 0x18 + (x) * 4) | 568 | #define IWLAGN_SCD_QUEUE_WRPTR(x) (IWLAGN_SCD_BASE + 0x18 + (x) * 4) |
569 | #define IWL50_SCD_QUEUE_RDPTR(x) (IWL50_SCD_BASE + 0x68 + (x) * 4) | 569 | #define IWLAGN_SCD_QUEUE_RDPTR(x) (IWLAGN_SCD_BASE + 0x68 + (x) * 4) |
570 | #define IWL50_SCD_QUEUECHAIN_SEL (IWL50_SCD_BASE + 0xe8) | 570 | #define IWLAGN_SCD_QUEUECHAIN_SEL (IWLAGN_SCD_BASE + 0xe8) |
571 | #define IWL50_SCD_AGGR_SEL (IWL50_SCD_BASE + 0x248) | 571 | #define IWLAGN_SCD_AGGR_SEL (IWLAGN_SCD_BASE + 0x248) |
572 | #define IWL50_SCD_INTERRUPT_MASK (IWL50_SCD_BASE + 0x108) | 572 | #define IWLAGN_SCD_INTERRUPT_MASK (IWLAGN_SCD_BASE + 0x108) |
573 | #define IWL50_SCD_QUEUE_STATUS_BITS(x) (IWL50_SCD_BASE + 0x10c + (x) * 4) | 573 | #define IWLAGN_SCD_QUEUE_STATUS_BITS(x) (IWLAGN_SCD_BASE + 0x10c + (x) * 4) |
574 | 574 | ||
575 | /*********************** END TX SCHEDULER *************************************/ | 575 | /*********************** END TX SCHEDULER *************************************/ |
576 | 576 | ||
diff --git a/drivers/net/wireless/iwlwifi/iwl-scan.c b/drivers/net/wireless/iwlwifi/iwl-scan.c index de0446d4bfe9..f4b897804a80 100644 --- a/drivers/net/wireless/iwlwifi/iwl-scan.c +++ b/drivers/net/wireless/iwlwifi/iwl-scan.c | |||
@@ -69,9 +69,8 @@ int iwl_scan_cancel(struct iwl_priv *priv) | |||
69 | } | 69 | } |
70 | 70 | ||
71 | if (test_bit(STATUS_SCANNING, &priv->status)) { | 71 | if (test_bit(STATUS_SCANNING, &priv->status)) { |
72 | if (!test_bit(STATUS_SCAN_ABORTING, &priv->status)) { | 72 | if (!test_and_set_bit(STATUS_SCAN_ABORTING, &priv->status)) { |
73 | IWL_DEBUG_SCAN(priv, "Queuing scan abort.\n"); | 73 | IWL_DEBUG_SCAN(priv, "Queuing scan abort.\n"); |
74 | set_bit(STATUS_SCAN_ABORTING, &priv->status); | ||
75 | queue_work(priv->workqueue, &priv->abort_scan); | 74 | queue_work(priv->workqueue, &priv->abort_scan); |
76 | 75 | ||
77 | } else | 76 | } else |
@@ -201,9 +200,6 @@ static void iwl_rx_scan_results_notif(struct iwl_priv *priv, | |||
201 | le32_to_cpu(notif->statistics[0]), | 200 | le32_to_cpu(notif->statistics[0]), |
202 | le32_to_cpu(notif->tsf_low) - priv->scan_start_tsf); | 201 | le32_to_cpu(notif->tsf_low) - priv->scan_start_tsf); |
203 | #endif | 202 | #endif |
204 | |||
205 | if (!priv->is_internal_short_scan) | ||
206 | priv->next_scan_jiffies = 0; | ||
207 | } | 203 | } |
208 | 204 | ||
209 | /* Service SCAN_COMPLETE_NOTIFICATION (0x84) */ | 205 | /* Service SCAN_COMPLETE_NOTIFICATION (0x84) */ |
@@ -223,49 +219,24 @@ static void iwl_rx_scan_complete_notif(struct iwl_priv *priv, | |||
223 | /* The HW is no longer scanning */ | 219 | /* The HW is no longer scanning */ |
224 | clear_bit(STATUS_SCAN_HW, &priv->status); | 220 | clear_bit(STATUS_SCAN_HW, &priv->status); |
225 | 221 | ||
226 | IWL_DEBUG_INFO(priv, "Scan pass on %sGHz took %dms\n", | 222 | IWL_DEBUG_INFO(priv, "Scan on %sGHz took %dms\n", |
227 | (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) ? | 223 | (priv->scan_band == IEEE80211_BAND_2GHZ) ? "2.4" : "5.2", |
228 | "2.4" : "5.2", | ||
229 | jiffies_to_msecs(elapsed_jiffies | 224 | jiffies_to_msecs(elapsed_jiffies |
230 | (priv->scan_pass_start, jiffies))); | 225 | (priv->scan_start, jiffies))); |
231 | |||
232 | /* Remove this scanned band from the list of pending | ||
233 | * bands to scan, band G precedes A in order of scanning | ||
234 | * as seen in iwl_bg_request_scan */ | ||
235 | if (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) | ||
236 | priv->scan_bands &= ~BIT(IEEE80211_BAND_2GHZ); | ||
237 | else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) | ||
238 | priv->scan_bands &= ~BIT(IEEE80211_BAND_5GHZ); | ||
239 | 226 | ||
240 | /* If a request to abort was given, or the scan did not succeed | 227 | /* |
228 | * If a request to abort was given, or the scan did not succeed | ||
241 | * then we reset the scan state machine and terminate, | 229 | * then we reset the scan state machine and terminate, |
242 | * re-queuing another scan if one has been requested */ | 230 | * re-queuing another scan if one has been requested |
243 | if (test_bit(STATUS_SCAN_ABORTING, &priv->status)) { | 231 | */ |
232 | if (test_and_clear_bit(STATUS_SCAN_ABORTING, &priv->status)) | ||
244 | IWL_DEBUG_INFO(priv, "Aborted scan completed.\n"); | 233 | IWL_DEBUG_INFO(priv, "Aborted scan completed.\n"); |
245 | clear_bit(STATUS_SCAN_ABORTING, &priv->status); | ||
246 | } else { | ||
247 | /* If there are more bands on this scan pass reschedule */ | ||
248 | if (priv->scan_bands) | ||
249 | goto reschedule; | ||
250 | } | ||
251 | |||
252 | if (!priv->is_internal_short_scan) | ||
253 | priv->next_scan_jiffies = 0; | ||
254 | 234 | ||
255 | IWL_DEBUG_INFO(priv, "Setting scan to off\n"); | 235 | IWL_DEBUG_INFO(priv, "Setting scan to off\n"); |
256 | 236 | ||
257 | clear_bit(STATUS_SCANNING, &priv->status); | 237 | clear_bit(STATUS_SCANNING, &priv->status); |
258 | 238 | ||
259 | IWL_DEBUG_INFO(priv, "Scan took %dms\n", | ||
260 | jiffies_to_msecs(elapsed_jiffies(priv->scan_start, jiffies))); | ||
261 | |||
262 | queue_work(priv->workqueue, &priv->scan_completed); | 239 | queue_work(priv->workqueue, &priv->scan_completed); |
263 | |||
264 | return; | ||
265 | |||
266 | reschedule: | ||
267 | priv->scan_pass_start = jiffies; | ||
268 | queue_work(priv->workqueue, &priv->request_scan); | ||
269 | } | 240 | } |
270 | 241 | ||
271 | void iwl_setup_rx_scan_handlers(struct iwl_priv *priv) | 242 | void iwl_setup_rx_scan_handlers(struct iwl_priv *priv) |
@@ -314,150 +285,6 @@ u16 iwl_get_passive_dwell_time(struct iwl_priv *priv, | |||
314 | } | 285 | } |
315 | EXPORT_SYMBOL(iwl_get_passive_dwell_time); | 286 | EXPORT_SYMBOL(iwl_get_passive_dwell_time); |
316 | 287 | ||
317 | static int iwl_get_single_channel_for_scan(struct iwl_priv *priv, | ||
318 | enum ieee80211_band band, | ||
319 | struct iwl_scan_channel *scan_ch) | ||
320 | { | ||
321 | const struct ieee80211_supported_band *sband; | ||
322 | const struct iwl_channel_info *ch_info; | ||
323 | u16 passive_dwell = 0; | ||
324 | u16 active_dwell = 0; | ||
325 | int i, added = 0; | ||
326 | u16 channel = 0; | ||
327 | |||
328 | sband = iwl_get_hw_mode(priv, band); | ||
329 | if (!sband) { | ||
330 | IWL_ERR(priv, "invalid band\n"); | ||
331 | return added; | ||
332 | } | ||
333 | |||
334 | active_dwell = iwl_get_active_dwell_time(priv, band, 0); | ||
335 | passive_dwell = iwl_get_passive_dwell_time(priv, band); | ||
336 | |||
337 | if (passive_dwell <= active_dwell) | ||
338 | passive_dwell = active_dwell + 1; | ||
339 | |||
340 | /* only scan single channel, good enough to reset the RF */ | ||
341 | /* pick the first valid not in-use channel */ | ||
342 | if (band == IEEE80211_BAND_5GHZ) { | ||
343 | for (i = 14; i < priv->channel_count; i++) { | ||
344 | if (priv->channel_info[i].channel != | ||
345 | le16_to_cpu(priv->staging_rxon.channel)) { | ||
346 | channel = priv->channel_info[i].channel; | ||
347 | ch_info = iwl_get_channel_info(priv, | ||
348 | band, channel); | ||
349 | if (is_channel_valid(ch_info)) | ||
350 | break; | ||
351 | } | ||
352 | } | ||
353 | } else { | ||
354 | for (i = 0; i < 14; i++) { | ||
355 | if (priv->channel_info[i].channel != | ||
356 | le16_to_cpu(priv->staging_rxon.channel)) { | ||
357 | channel = | ||
358 | priv->channel_info[i].channel; | ||
359 | ch_info = iwl_get_channel_info(priv, | ||
360 | band, channel); | ||
361 | if (is_channel_valid(ch_info)) | ||
362 | break; | ||
363 | } | ||
364 | } | ||
365 | } | ||
366 | if (channel) { | ||
367 | scan_ch->channel = cpu_to_le16(channel); | ||
368 | scan_ch->type = SCAN_CHANNEL_TYPE_PASSIVE; | ||
369 | scan_ch->active_dwell = cpu_to_le16(active_dwell); | ||
370 | scan_ch->passive_dwell = cpu_to_le16(passive_dwell); | ||
371 | /* Set txpower levels to defaults */ | ||
372 | scan_ch->dsp_atten = 110; | ||
373 | if (band == IEEE80211_BAND_5GHZ) | ||
374 | scan_ch->tx_gain = ((1 << 5) | (3 << 3)) | 3; | ||
375 | else | ||
376 | scan_ch->tx_gain = ((1 << 5) | (5 << 3)); | ||
377 | added++; | ||
378 | } else | ||
379 | IWL_ERR(priv, "no valid channel found\n"); | ||
380 | return added; | ||
381 | } | ||
382 | |||
383 | static int iwl_get_channels_for_scan(struct iwl_priv *priv, | ||
384 | enum ieee80211_band band, | ||
385 | u8 is_active, u8 n_probes, | ||
386 | struct iwl_scan_channel *scan_ch) | ||
387 | { | ||
388 | struct ieee80211_channel *chan; | ||
389 | const struct ieee80211_supported_band *sband; | ||
390 | const struct iwl_channel_info *ch_info; | ||
391 | u16 passive_dwell = 0; | ||
392 | u16 active_dwell = 0; | ||
393 | int added, i; | ||
394 | u16 channel; | ||
395 | |||
396 | sband = iwl_get_hw_mode(priv, band); | ||
397 | if (!sband) | ||
398 | return 0; | ||
399 | |||
400 | active_dwell = iwl_get_active_dwell_time(priv, band, n_probes); | ||
401 | passive_dwell = iwl_get_passive_dwell_time(priv, band); | ||
402 | |||
403 | if (passive_dwell <= active_dwell) | ||
404 | passive_dwell = active_dwell + 1; | ||
405 | |||
406 | for (i = 0, added = 0; i < priv->scan_request->n_channels; i++) { | ||
407 | chan = priv->scan_request->channels[i]; | ||
408 | |||
409 | if (chan->band != band) | ||
410 | continue; | ||
411 | |||
412 | channel = ieee80211_frequency_to_channel(chan->center_freq); | ||
413 | scan_ch->channel = cpu_to_le16(channel); | ||
414 | |||
415 | ch_info = iwl_get_channel_info(priv, band, channel); | ||
416 | if (!is_channel_valid(ch_info)) { | ||
417 | IWL_DEBUG_SCAN(priv, "Channel %d is INVALID for this band.\n", | ||
418 | channel); | ||
419 | continue; | ||
420 | } | ||
421 | |||
422 | if (!is_active || is_channel_passive(ch_info) || | ||
423 | (chan->flags & IEEE80211_CHAN_PASSIVE_SCAN)) | ||
424 | scan_ch->type = SCAN_CHANNEL_TYPE_PASSIVE; | ||
425 | else | ||
426 | scan_ch->type = SCAN_CHANNEL_TYPE_ACTIVE; | ||
427 | |||
428 | if (n_probes) | ||
429 | scan_ch->type |= IWL_SCAN_PROBE_MASK(n_probes); | ||
430 | |||
431 | scan_ch->active_dwell = cpu_to_le16(active_dwell); | ||
432 | scan_ch->passive_dwell = cpu_to_le16(passive_dwell); | ||
433 | |||
434 | /* Set txpower levels to defaults */ | ||
435 | scan_ch->dsp_atten = 110; | ||
436 | |||
437 | /* NOTE: if we were doing 6Mb OFDM for scans we'd use | ||
438 | * power level: | ||
439 | * scan_ch->tx_gain = ((1 << 5) | (2 << 3)) | 3; | ||
440 | */ | ||
441 | if (band == IEEE80211_BAND_5GHZ) | ||
442 | scan_ch->tx_gain = ((1 << 5) | (3 << 3)) | 3; | ||
443 | else | ||
444 | scan_ch->tx_gain = ((1 << 5) | (5 << 3)); | ||
445 | |||
446 | IWL_DEBUG_SCAN(priv, "Scanning ch=%d prob=0x%X [%s %d]\n", | ||
447 | channel, le32_to_cpu(scan_ch->type), | ||
448 | (scan_ch->type & SCAN_CHANNEL_TYPE_ACTIVE) ? | ||
449 | "ACTIVE" : "PASSIVE", | ||
450 | (scan_ch->type & SCAN_CHANNEL_TYPE_ACTIVE) ? | ||
451 | active_dwell : passive_dwell); | ||
452 | |||
453 | scan_ch++; | ||
454 | added++; | ||
455 | } | ||
456 | |||
457 | IWL_DEBUG_SCAN(priv, "total channels to scan %d\n", added); | ||
458 | return added; | ||
459 | } | ||
460 | |||
461 | void iwl_init_scan_params(struct iwl_priv *priv) | 288 | void iwl_init_scan_params(struct iwl_priv *priv) |
462 | { | 289 | { |
463 | u8 ant_idx = fls(priv->hw_params.valid_tx_ant) - 1; | 290 | u8 ant_idx = fls(priv->hw_params.valid_tx_ant) - 1; |
@@ -476,26 +303,27 @@ static int iwl_scan_initiate(struct iwl_priv *priv) | |||
476 | set_bit(STATUS_SCANNING, &priv->status); | 303 | set_bit(STATUS_SCANNING, &priv->status); |
477 | priv->is_internal_short_scan = false; | 304 | priv->is_internal_short_scan = false; |
478 | priv->scan_start = jiffies; | 305 | priv->scan_start = jiffies; |
479 | priv->scan_pass_start = priv->scan_start; | ||
480 | 306 | ||
481 | queue_work(priv->workqueue, &priv->request_scan); | 307 | if (WARN_ON(!priv->cfg->ops->utils->request_scan)) |
308 | return -EOPNOTSUPP; | ||
309 | |||
310 | priv->cfg->ops->utils->request_scan(priv); | ||
482 | 311 | ||
483 | return 0; | 312 | return 0; |
484 | } | 313 | } |
485 | 314 | ||
486 | #define IWL_DELAY_NEXT_SCAN (HZ*2) | ||
487 | |||
488 | int iwl_mac_hw_scan(struct ieee80211_hw *hw, | 315 | int iwl_mac_hw_scan(struct ieee80211_hw *hw, |
489 | struct cfg80211_scan_request *req) | 316 | struct cfg80211_scan_request *req) |
490 | { | 317 | { |
491 | unsigned long flags; | ||
492 | struct iwl_priv *priv = hw->priv; | 318 | struct iwl_priv *priv = hw->priv; |
493 | int ret, i; | 319 | int ret; |
494 | 320 | ||
495 | IWL_DEBUG_MAC80211(priv, "enter\n"); | 321 | IWL_DEBUG_MAC80211(priv, "enter\n"); |
496 | 322 | ||
323 | if (req->n_channels == 0) | ||
324 | return -EINVAL; | ||
325 | |||
497 | mutex_lock(&priv->mutex); | 326 | mutex_lock(&priv->mutex); |
498 | spin_lock_irqsave(&priv->lock, flags); | ||
499 | 327 | ||
500 | if (!iwl_is_ready_rf(priv)) { | 328 | if (!iwl_is_ready_rf(priv)) { |
501 | ret = -EIO; | 329 | ret = -EIO; |
@@ -515,22 +343,8 @@ int iwl_mac_hw_scan(struct ieee80211_hw *hw, | |||
515 | goto out_unlock; | 343 | goto out_unlock; |
516 | } | 344 | } |
517 | 345 | ||
518 | /* We don't schedule scan within next_scan_jiffies period. | 346 | /* mac80211 will only ask for one band at a time */ |
519 | * Avoid scanning during possible EAPOL exchange, return | 347 | priv->scan_band = req->channels[0]->band; |
520 | * success immediately. | ||
521 | */ | ||
522 | if (priv->next_scan_jiffies && | ||
523 | time_after(priv->next_scan_jiffies, jiffies)) { | ||
524 | IWL_DEBUG_SCAN(priv, "scan rejected: within next scan period\n"); | ||
525 | queue_work(priv->workqueue, &priv->scan_completed); | ||
526 | ret = 0; | ||
527 | goto out_unlock; | ||
528 | } | ||
529 | |||
530 | priv->scan_bands = 0; | ||
531 | for (i = 0; i < req->n_channels; i++) | ||
532 | priv->scan_bands |= BIT(req->channels[i]->band); | ||
533 | |||
534 | priv->scan_request = req; | 348 | priv->scan_request = req; |
535 | 349 | ||
536 | ret = iwl_scan_initiate(priv); | 350 | ret = iwl_scan_initiate(priv); |
@@ -538,7 +352,6 @@ int iwl_mac_hw_scan(struct ieee80211_hw *hw, | |||
538 | IWL_DEBUG_MAC80211(priv, "leave\n"); | 352 | IWL_DEBUG_MAC80211(priv, "leave\n"); |
539 | 353 | ||
540 | out_unlock: | 354 | out_unlock: |
541 | spin_unlock_irqrestore(&priv->lock, flags); | ||
542 | mutex_unlock(&priv->mutex); | 355 | mutex_unlock(&priv->mutex); |
543 | 356 | ||
544 | return ret; | 357 | return ret; |
@@ -576,22 +389,20 @@ static void iwl_bg_start_internal_scan(struct work_struct *work) | |||
576 | goto unlock; | 389 | goto unlock; |
577 | } | 390 | } |
578 | 391 | ||
579 | priv->scan_bands = 0; | 392 | priv->scan_band = priv->band; |
580 | if (priv->band == IEEE80211_BAND_5GHZ) | ||
581 | priv->scan_bands |= BIT(IEEE80211_BAND_5GHZ); | ||
582 | else | ||
583 | priv->scan_bands |= BIT(IEEE80211_BAND_2GHZ); | ||
584 | 393 | ||
585 | IWL_DEBUG_SCAN(priv, "Start internal short scan...\n"); | 394 | IWL_DEBUG_SCAN(priv, "Start internal short scan...\n"); |
586 | set_bit(STATUS_SCANNING, &priv->status); | 395 | set_bit(STATUS_SCANNING, &priv->status); |
587 | priv->is_internal_short_scan = true; | 396 | priv->is_internal_short_scan = true; |
588 | queue_work(priv->workqueue, &priv->request_scan); | 397 | |
398 | if (WARN_ON(!priv->cfg->ops->utils->request_scan)) | ||
399 | goto unlock; | ||
400 | |||
401 | priv->cfg->ops->utils->request_scan(priv); | ||
589 | unlock: | 402 | unlock: |
590 | mutex_unlock(&priv->mutex); | 403 | mutex_unlock(&priv->mutex); |
591 | } | 404 | } |
592 | 405 | ||
593 | #define IWL_SCAN_CHECK_WATCHDOG (7 * HZ) | ||
594 | |||
595 | void iwl_bg_scan_check(struct work_struct *data) | 406 | void iwl_bg_scan_check(struct work_struct *data) |
596 | { | 407 | { |
597 | struct iwl_priv *priv = | 408 | struct iwl_priv *priv = |
@@ -653,275 +464,15 @@ u16 iwl_fill_probe_req(struct iwl_priv *priv, struct ieee80211_mgmt *frame, | |||
653 | if (WARN_ON(left < ie_len)) | 464 | if (WARN_ON(left < ie_len)) |
654 | return len; | 465 | return len; |
655 | 466 | ||
656 | if (ies) | 467 | if (ies && ie_len) { |
657 | memcpy(pos, ies, ie_len); | 468 | memcpy(pos, ies, ie_len); |
658 | len += ie_len; | 469 | len += ie_len; |
659 | left -= ie_len; | 470 | } |
660 | 471 | ||
661 | return (u16)len; | 472 | return (u16)len; |
662 | } | 473 | } |
663 | EXPORT_SYMBOL(iwl_fill_probe_req); | 474 | EXPORT_SYMBOL(iwl_fill_probe_req); |
664 | 475 | ||
665 | static void iwl_bg_request_scan(struct work_struct *data) | ||
666 | { | ||
667 | struct iwl_priv *priv = | ||
668 | container_of(data, struct iwl_priv, request_scan); | ||
669 | struct iwl_host_cmd cmd = { | ||
670 | .id = REPLY_SCAN_CMD, | ||
671 | .len = sizeof(struct iwl_scan_cmd), | ||
672 | .flags = CMD_SIZE_HUGE, | ||
673 | }; | ||
674 | struct iwl_scan_cmd *scan; | ||
675 | struct ieee80211_conf *conf = NULL; | ||
676 | u32 rate_flags = 0; | ||
677 | u16 cmd_len; | ||
678 | u16 rx_chain = 0; | ||
679 | enum ieee80211_band band; | ||
680 | u8 n_probes = 0; | ||
681 | u8 rx_ant = priv->hw_params.valid_rx_ant; | ||
682 | u8 rate; | ||
683 | bool is_active = false; | ||
684 | int chan_mod; | ||
685 | u8 active_chains; | ||
686 | |||
687 | conf = ieee80211_get_hw_conf(priv->hw); | ||
688 | |||
689 | mutex_lock(&priv->mutex); | ||
690 | |||
691 | cancel_delayed_work(&priv->scan_check); | ||
692 | |||
693 | if (!iwl_is_ready(priv)) { | ||
694 | IWL_WARN(priv, "request scan called when driver not ready.\n"); | ||
695 | goto done; | ||
696 | } | ||
697 | |||
698 | /* Make sure the scan wasn't canceled before this queued work | ||
699 | * was given the chance to run... */ | ||
700 | if (!test_bit(STATUS_SCANNING, &priv->status)) | ||
701 | goto done; | ||
702 | |||
703 | /* This should never be called or scheduled if there is currently | ||
704 | * a scan active in the hardware. */ | ||
705 | if (test_bit(STATUS_SCAN_HW, &priv->status)) { | ||
706 | IWL_DEBUG_INFO(priv, "Multiple concurrent scan requests in parallel. " | ||
707 | "Ignoring second request.\n"); | ||
708 | goto done; | ||
709 | } | ||
710 | |||
711 | if (test_bit(STATUS_EXIT_PENDING, &priv->status)) { | ||
712 | IWL_DEBUG_SCAN(priv, "Aborting scan due to device shutdown\n"); | ||
713 | goto done; | ||
714 | } | ||
715 | |||
716 | if (test_bit(STATUS_SCAN_ABORTING, &priv->status)) { | ||
717 | IWL_DEBUG_HC(priv, "Scan request while abort pending. Queuing.\n"); | ||
718 | goto done; | ||
719 | } | ||
720 | |||
721 | if (iwl_is_rfkill(priv)) { | ||
722 | IWL_DEBUG_HC(priv, "Aborting scan due to RF Kill activation\n"); | ||
723 | goto done; | ||
724 | } | ||
725 | |||
726 | if (!test_bit(STATUS_READY, &priv->status)) { | ||
727 | IWL_DEBUG_HC(priv, "Scan request while uninitialized. Queuing.\n"); | ||
728 | goto done; | ||
729 | } | ||
730 | |||
731 | if (!priv->scan_bands) { | ||
732 | IWL_DEBUG_HC(priv, "Aborting scan due to no requested bands\n"); | ||
733 | goto done; | ||
734 | } | ||
735 | |||
736 | if (!priv->scan) { | ||
737 | priv->scan = kmalloc(sizeof(struct iwl_scan_cmd) + | ||
738 | IWL_MAX_SCAN_SIZE, GFP_KERNEL); | ||
739 | if (!priv->scan) { | ||
740 | IWL_DEBUG_SCAN(priv, | ||
741 | "fail to allocate memory for scan\n"); | ||
742 | goto done; | ||
743 | } | ||
744 | } | ||
745 | scan = priv->scan; | ||
746 | memset(scan, 0, sizeof(struct iwl_scan_cmd) + IWL_MAX_SCAN_SIZE); | ||
747 | |||
748 | scan->quiet_plcp_th = IWL_PLCP_QUIET_THRESH; | ||
749 | scan->quiet_time = IWL_ACTIVE_QUIET_TIME; | ||
750 | |||
751 | if (iwl_is_associated(priv)) { | ||
752 | u16 interval = 0; | ||
753 | u32 extra; | ||
754 | u32 suspend_time = 100; | ||
755 | u32 scan_suspend_time = 100; | ||
756 | unsigned long flags; | ||
757 | |||
758 | IWL_DEBUG_INFO(priv, "Scanning while associated...\n"); | ||
759 | spin_lock_irqsave(&priv->lock, flags); | ||
760 | interval = priv->beacon_int; | ||
761 | spin_unlock_irqrestore(&priv->lock, flags); | ||
762 | |||
763 | scan->suspend_time = 0; | ||
764 | scan->max_out_time = cpu_to_le32(200 * 1024); | ||
765 | if (!interval) | ||
766 | interval = suspend_time; | ||
767 | |||
768 | extra = (suspend_time / interval) << 22; | ||
769 | scan_suspend_time = (extra | | ||
770 | ((suspend_time % interval) * 1024)); | ||
771 | scan->suspend_time = cpu_to_le32(scan_suspend_time); | ||
772 | IWL_DEBUG_SCAN(priv, "suspend_time 0x%X beacon interval %d\n", | ||
773 | scan_suspend_time, interval); | ||
774 | } | ||
775 | |||
776 | if (priv->is_internal_short_scan) { | ||
777 | IWL_DEBUG_SCAN(priv, "Start internal passive scan.\n"); | ||
778 | } else if (priv->scan_request->n_ssids) { | ||
779 | int i, p = 0; | ||
780 | IWL_DEBUG_SCAN(priv, "Kicking off active scan\n"); | ||
781 | for (i = 0; i < priv->scan_request->n_ssids; i++) { | ||
782 | /* always does wildcard anyway */ | ||
783 | if (!priv->scan_request->ssids[i].ssid_len) | ||
784 | continue; | ||
785 | scan->direct_scan[p].id = WLAN_EID_SSID; | ||
786 | scan->direct_scan[p].len = | ||
787 | priv->scan_request->ssids[i].ssid_len; | ||
788 | memcpy(scan->direct_scan[p].ssid, | ||
789 | priv->scan_request->ssids[i].ssid, | ||
790 | priv->scan_request->ssids[i].ssid_len); | ||
791 | n_probes++; | ||
792 | p++; | ||
793 | } | ||
794 | is_active = true; | ||
795 | } else | ||
796 | IWL_DEBUG_SCAN(priv, "Start passive scan.\n"); | ||
797 | |||
798 | scan->tx_cmd.tx_flags = TX_CMD_FLG_SEQ_CTL_MSK; | ||
799 | scan->tx_cmd.sta_id = priv->hw_params.bcast_sta_id; | ||
800 | scan->tx_cmd.stop_time.life_time = TX_CMD_LIFE_TIME_INFINITE; | ||
801 | |||
802 | |||
803 | if (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) { | ||
804 | band = IEEE80211_BAND_2GHZ; | ||
805 | scan->flags = RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK; | ||
806 | chan_mod = le32_to_cpu(priv->active_rxon.flags & RXON_FLG_CHANNEL_MODE_MSK) | ||
807 | >> RXON_FLG_CHANNEL_MODE_POS; | ||
808 | if (chan_mod == CHANNEL_MODE_PURE_40) { | ||
809 | rate = IWL_RATE_6M_PLCP; | ||
810 | } else { | ||
811 | rate = IWL_RATE_1M_PLCP; | ||
812 | rate_flags = RATE_MCS_CCK_MSK; | ||
813 | } | ||
814 | scan->good_CRC_th = 0; | ||
815 | } else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) { | ||
816 | band = IEEE80211_BAND_5GHZ; | ||
817 | rate = IWL_RATE_6M_PLCP; | ||
818 | /* | ||
819 | * If active scaning is requested but a certain channel | ||
820 | * is marked passive, we can do active scanning if we | ||
821 | * detect transmissions. | ||
822 | */ | ||
823 | scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH : 0; | ||
824 | |||
825 | /* Force use of chains B and C (0x6) for scan Rx | ||
826 | * Avoid A (0x1) for the device has off-channel reception | ||
827 | * on A-band. | ||
828 | */ | ||
829 | if (priv->cfg->off_channel_workaround) | ||
830 | rx_ant = ANT_BC; | ||
831 | } else { | ||
832 | IWL_WARN(priv, "Invalid scan band count\n"); | ||
833 | goto done; | ||
834 | } | ||
835 | |||
836 | priv->scan_tx_ant[band] = | ||
837 | iwl_toggle_tx_ant(priv, priv->scan_tx_ant[band]); | ||
838 | rate_flags |= iwl_ant_idx_to_flags(priv->scan_tx_ant[band]); | ||
839 | scan->tx_cmd.rate_n_flags = iwl_hw_set_rate_n_flags(rate, rate_flags); | ||
840 | |||
841 | /* In power save mode use one chain, otherwise use all chains */ | ||
842 | if (test_bit(STATUS_POWER_PMI, &priv->status)) { | ||
843 | /* rx_ant has been set to all valid chains previously */ | ||
844 | active_chains = rx_ant & | ||
845 | ((u8)(priv->chain_noise_data.active_chains)); | ||
846 | if (!active_chains) | ||
847 | active_chains = rx_ant; | ||
848 | |||
849 | IWL_DEBUG_SCAN(priv, "chain_noise_data.active_chains: %u\n", | ||
850 | priv->chain_noise_data.active_chains); | ||
851 | |||
852 | rx_ant = first_antenna(active_chains); | ||
853 | } | ||
854 | /* MIMO is not used here, but value is required */ | ||
855 | rx_chain |= priv->hw_params.valid_rx_ant << RXON_RX_CHAIN_VALID_POS; | ||
856 | rx_chain |= rx_ant << RXON_RX_CHAIN_FORCE_MIMO_SEL_POS; | ||
857 | rx_chain |= rx_ant << RXON_RX_CHAIN_FORCE_SEL_POS; | ||
858 | rx_chain |= 0x1 << RXON_RX_CHAIN_DRIVER_FORCE_POS; | ||
859 | scan->rx_chain = cpu_to_le16(rx_chain); | ||
860 | if (!priv->is_internal_short_scan) { | ||
861 | cmd_len = iwl_fill_probe_req(priv, | ||
862 | (struct ieee80211_mgmt *)scan->data, | ||
863 | priv->scan_request->ie, | ||
864 | priv->scan_request->ie_len, | ||
865 | IWL_MAX_SCAN_SIZE - sizeof(*scan)); | ||
866 | } else { | ||
867 | cmd_len = iwl_fill_probe_req(priv, | ||
868 | (struct ieee80211_mgmt *)scan->data, | ||
869 | NULL, 0, | ||
870 | IWL_MAX_SCAN_SIZE - sizeof(*scan)); | ||
871 | |||
872 | } | ||
873 | scan->tx_cmd.len = cpu_to_le16(cmd_len); | ||
874 | if (iwl_is_monitor_mode(priv)) | ||
875 | scan->filter_flags = RXON_FILTER_PROMISC_MSK; | ||
876 | |||
877 | scan->filter_flags |= (RXON_FILTER_ACCEPT_GRP_MSK | | ||
878 | RXON_FILTER_BCON_AWARE_MSK); | ||
879 | |||
880 | if (priv->is_internal_short_scan) { | ||
881 | scan->channel_count = | ||
882 | iwl_get_single_channel_for_scan(priv, band, | ||
883 | (void *)&scan->data[le16_to_cpu( | ||
884 | scan->tx_cmd.len)]); | ||
885 | } else { | ||
886 | scan->channel_count = | ||
887 | iwl_get_channels_for_scan(priv, band, | ||
888 | is_active, n_probes, | ||
889 | (void *)&scan->data[le16_to_cpu( | ||
890 | scan->tx_cmd.len)]); | ||
891 | } | ||
892 | if (scan->channel_count == 0) { | ||
893 | IWL_DEBUG_SCAN(priv, "channel count %d\n", scan->channel_count); | ||
894 | goto done; | ||
895 | } | ||
896 | |||
897 | cmd.len += le16_to_cpu(scan->tx_cmd.len) + | ||
898 | scan->channel_count * sizeof(struct iwl_scan_channel); | ||
899 | cmd.data = scan; | ||
900 | scan->len = cpu_to_le16(cmd.len); | ||
901 | |||
902 | set_bit(STATUS_SCAN_HW, &priv->status); | ||
903 | if (iwl_send_cmd_sync(priv, &cmd)) | ||
904 | goto done; | ||
905 | |||
906 | queue_delayed_work(priv->workqueue, &priv->scan_check, | ||
907 | IWL_SCAN_CHECK_WATCHDOG); | ||
908 | |||
909 | mutex_unlock(&priv->mutex); | ||
910 | return; | ||
911 | |||
912 | done: | ||
913 | /* Cannot perform scan. Make sure we clear scanning | ||
914 | * bits from status so next scan request can be performed. | ||
915 | * If we don't clear scanning status bit here all next scan | ||
916 | * will fail | ||
917 | */ | ||
918 | clear_bit(STATUS_SCAN_HW, &priv->status); | ||
919 | clear_bit(STATUS_SCANNING, &priv->status); | ||
920 | /* inform mac80211 scan aborted */ | ||
921 | queue_work(priv->workqueue, &priv->scan_completed); | ||
922 | mutex_unlock(&priv->mutex); | ||
923 | } | ||
924 | |||
925 | void iwl_bg_abort_scan(struct work_struct *work) | 476 | void iwl_bg_abort_scan(struct work_struct *work) |
926 | { | 477 | { |
927 | struct iwl_priv *priv = container_of(work, struct iwl_priv, abort_scan); | 478 | struct iwl_priv *priv = container_of(work, struct iwl_priv, abort_scan); |
@@ -969,7 +520,6 @@ EXPORT_SYMBOL(iwl_bg_scan_completed); | |||
969 | void iwl_setup_scan_deferred_work(struct iwl_priv *priv) | 520 | void iwl_setup_scan_deferred_work(struct iwl_priv *priv) |
970 | { | 521 | { |
971 | INIT_WORK(&priv->scan_completed, iwl_bg_scan_completed); | 522 | INIT_WORK(&priv->scan_completed, iwl_bg_scan_completed); |
972 | INIT_WORK(&priv->request_scan, iwl_bg_request_scan); | ||
973 | INIT_WORK(&priv->abort_scan, iwl_bg_abort_scan); | 523 | INIT_WORK(&priv->abort_scan, iwl_bg_abort_scan); |
974 | INIT_WORK(&priv->start_internal_scan, iwl_bg_start_internal_scan); | 524 | INIT_WORK(&priv->start_internal_scan, iwl_bg_start_internal_scan); |
975 | INIT_DELAYED_WORK(&priv->scan_check, iwl_bg_scan_check); | 525 | INIT_DELAYED_WORK(&priv->scan_check, iwl_bg_scan_check); |
diff --git a/drivers/net/wireless/iwlwifi/iwl-sta.c b/drivers/net/wireless/iwlwifi/iwl-sta.c index d86ecd2f9ec2..db934476b5e9 100644 --- a/drivers/net/wireless/iwlwifi/iwl-sta.c +++ b/drivers/net/wireless/iwlwifi/iwl-sta.c | |||
@@ -451,7 +451,17 @@ static void iwl_sta_init_lq(struct iwl_priv *priv, const u8 *addr, bool is_ap) | |||
451 | 451 | ||
452 | link_cmd.general_params.single_stream_ant_msk = | 452 | link_cmd.general_params.single_stream_ant_msk = |
453 | first_antenna(priv->hw_params.valid_tx_ant); | 453 | first_antenna(priv->hw_params.valid_tx_ant); |
454 | link_cmd.general_params.dual_stream_ant_msk = 3; | 454 | |
455 | link_cmd.general_params.dual_stream_ant_msk = | ||
456 | priv->hw_params.valid_tx_ant & | ||
457 | ~first_antenna(priv->hw_params.valid_tx_ant); | ||
458 | if (!link_cmd.general_params.dual_stream_ant_msk) { | ||
459 | link_cmd.general_params.dual_stream_ant_msk = ANT_AB; | ||
460 | } else if (num_of_ant(priv->hw_params.valid_tx_ant) == 2) { | ||
461 | link_cmd.general_params.dual_stream_ant_msk = | ||
462 | priv->hw_params.valid_tx_ant; | ||
463 | } | ||
464 | |||
455 | link_cmd.agg_params.agg_dis_start_th = LINK_QUAL_AGG_DISABLE_START_DEF; | 465 | link_cmd.agg_params.agg_dis_start_th = LINK_QUAL_AGG_DISABLE_START_DEF; |
456 | link_cmd.agg_params.agg_time_limit = | 466 | link_cmd.agg_params.agg_time_limit = |
457 | cpu_to_le16(LINK_QUAL_AGG_TIME_LIMIT_DEF); | 467 | cpu_to_le16(LINK_QUAL_AGG_TIME_LIMIT_DEF); |
@@ -1196,7 +1206,6 @@ int iwl_send_lq_cmd(struct iwl_priv *priv, | |||
1196 | iwl_dump_lq_cmd(priv, lq); | 1206 | iwl_dump_lq_cmd(priv, lq); |
1197 | BUG_ON(init && (cmd.flags & CMD_ASYNC)); | 1207 | BUG_ON(init && (cmd.flags & CMD_ASYNC)); |
1198 | 1208 | ||
1199 | iwl_dump_lq_cmd(priv, lq); | ||
1200 | ret = iwl_send_cmd(priv, &cmd); | 1209 | ret = iwl_send_cmd(priv, &cmd); |
1201 | if (ret || (cmd.flags & CMD_ASYNC)) | 1210 | if (ret || (cmd.flags & CMD_ASYNC)) |
1202 | return ret; | 1211 | return ret; |
diff --git a/drivers/net/wireless/iwlwifi/iwl3945-base.c b/drivers/net/wireless/iwlwifi/iwl3945-base.c index 9f362024a29c..a41ba72ceb00 100644 --- a/drivers/net/wireless/iwlwifi/iwl3945-base.c +++ b/drivers/net/wireless/iwlwifi/iwl3945-base.c | |||
@@ -2527,7 +2527,7 @@ static void iwl3945_alive_start(struct iwl_priv *priv) | |||
2527 | } | 2527 | } |
2528 | 2528 | ||
2529 | /* Configure Bluetooth device coexistence support */ | 2529 | /* Configure Bluetooth device coexistence support */ |
2530 | iwl_send_bt_config(priv); | 2530 | priv->cfg->ops->hcmd->send_bt_config(priv); |
2531 | 2531 | ||
2532 | /* Configure the adapter for unassociated operation */ | 2532 | /* Configure the adapter for unassociated operation */ |
2533 | iwlcore_commit_rxon(priv); | 2533 | iwlcore_commit_rxon(priv); |
@@ -2791,11 +2791,8 @@ static void iwl3945_rfkill_poll(struct work_struct *data) | |||
2791 | 2791 | ||
2792 | } | 2792 | } |
2793 | 2793 | ||
2794 | #define IWL_SCAN_CHECK_WATCHDOG (7 * HZ) | 2794 | void iwl3945_request_scan(struct iwl_priv *priv) |
2795 | static void iwl3945_bg_request_scan(struct work_struct *data) | ||
2796 | { | 2795 | { |
2797 | struct iwl_priv *priv = | ||
2798 | container_of(data, struct iwl_priv, request_scan); | ||
2799 | struct iwl_host_cmd cmd = { | 2796 | struct iwl_host_cmd cmd = { |
2800 | .id = REPLY_SCAN_CMD, | 2797 | .id = REPLY_SCAN_CMD, |
2801 | .len = sizeof(struct iwl3945_scan_cmd), | 2798 | .len = sizeof(struct iwl3945_scan_cmd), |
@@ -2809,8 +2806,6 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
2809 | 2806 | ||
2810 | conf = ieee80211_get_hw_conf(priv->hw); | 2807 | conf = ieee80211_get_hw_conf(priv->hw); |
2811 | 2808 | ||
2812 | mutex_lock(&priv->mutex); | ||
2813 | |||
2814 | cancel_delayed_work(&priv->scan_check); | 2809 | cancel_delayed_work(&priv->scan_check); |
2815 | 2810 | ||
2816 | if (!iwl_is_ready(priv)) { | 2811 | if (!iwl_is_ready(priv)) { |
@@ -2853,20 +2848,15 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
2853 | goto done; | 2848 | goto done; |
2854 | } | 2849 | } |
2855 | 2850 | ||
2856 | if (!priv->scan_bands) { | 2851 | if (!priv->scan_cmd) { |
2857 | IWL_DEBUG_HC(priv, "Aborting scan due to no requested bands\n"); | 2852 | priv->scan_cmd = kmalloc(sizeof(struct iwl3945_scan_cmd) + |
2858 | goto done; | 2853 | IWL_MAX_SCAN_SIZE, GFP_KERNEL); |
2859 | } | 2854 | if (!priv->scan_cmd) { |
2860 | |||
2861 | if (!priv->scan) { | ||
2862 | priv->scan = kmalloc(sizeof(struct iwl3945_scan_cmd) + | ||
2863 | IWL_MAX_SCAN_SIZE, GFP_KERNEL); | ||
2864 | if (!priv->scan) { | ||
2865 | IWL_DEBUG_SCAN(priv, "Fail to allocate scan memory\n"); | 2855 | IWL_DEBUG_SCAN(priv, "Fail to allocate scan memory\n"); |
2866 | goto done; | 2856 | goto done; |
2867 | } | 2857 | } |
2868 | } | 2858 | } |
2869 | scan = priv->scan; | 2859 | scan = priv->scan_cmd; |
2870 | memset(scan, 0, sizeof(struct iwl3945_scan_cmd) + IWL_MAX_SCAN_SIZE); | 2860 | memset(scan, 0, sizeof(struct iwl3945_scan_cmd) + IWL_MAX_SCAN_SIZE); |
2871 | 2861 | ||
2872 | scan->quiet_plcp_th = IWL_PLCP_QUIET_THRESH; | 2862 | scan->quiet_plcp_th = IWL_PLCP_QUIET_THRESH; |
@@ -2935,12 +2925,14 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
2935 | 2925 | ||
2936 | /* flags + rate selection */ | 2926 | /* flags + rate selection */ |
2937 | 2927 | ||
2938 | if (priv->scan_bands & BIT(IEEE80211_BAND_2GHZ)) { | 2928 | switch (priv->scan_band) { |
2929 | case IEEE80211_BAND_2GHZ: | ||
2939 | scan->flags = RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK; | 2930 | scan->flags = RXON_FLG_BAND_24G_MSK | RXON_FLG_AUTO_DETECT_MSK; |
2940 | scan->tx_cmd.rate = IWL_RATE_1M_PLCP; | 2931 | scan->tx_cmd.rate = IWL_RATE_1M_PLCP; |
2941 | scan->good_CRC_th = 0; | 2932 | scan->good_CRC_th = 0; |
2942 | band = IEEE80211_BAND_2GHZ; | 2933 | band = IEEE80211_BAND_2GHZ; |
2943 | } else if (priv->scan_bands & BIT(IEEE80211_BAND_5GHZ)) { | 2934 | break; |
2935 | case IEEE80211_BAND_5GHZ: | ||
2944 | scan->tx_cmd.rate = IWL_RATE_6M_PLCP; | 2936 | scan->tx_cmd.rate = IWL_RATE_6M_PLCP; |
2945 | /* | 2937 | /* |
2946 | * If active scaning is requested but a certain channel | 2938 | * If active scaning is requested but a certain channel |
@@ -2949,8 +2941,9 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
2949 | */ | 2941 | */ |
2950 | scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH : 0; | 2942 | scan->good_CRC_th = is_active ? IWL_GOOD_CRC_TH : 0; |
2951 | band = IEEE80211_BAND_5GHZ; | 2943 | band = IEEE80211_BAND_5GHZ; |
2952 | } else { | 2944 | break; |
2953 | IWL_WARN(priv, "Invalid scan band count\n"); | 2945 | default: |
2946 | IWL_WARN(priv, "Invalid scan band\n"); | ||
2954 | goto done; | 2947 | goto done; |
2955 | } | 2948 | } |
2956 | 2949 | ||
@@ -2971,9 +2964,6 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
2971 | /* select Rx antennas */ | 2964 | /* select Rx antennas */ |
2972 | scan->flags |= iwl3945_get_antenna_flags(priv); | 2965 | scan->flags |= iwl3945_get_antenna_flags(priv); |
2973 | 2966 | ||
2974 | if (iwl_is_monitor_mode(priv)) | ||
2975 | scan->filter_flags = RXON_FILTER_PROMISC_MSK; | ||
2976 | |||
2977 | scan->channel_count = | 2967 | scan->channel_count = |
2978 | iwl3945_get_channels_for_scan(priv, band, is_active, n_probes, | 2968 | iwl3945_get_channels_for_scan(priv, band, is_active, n_probes, |
2979 | (void *)&scan->data[le16_to_cpu(scan->tx_cmd.len)]); | 2969 | (void *)&scan->data[le16_to_cpu(scan->tx_cmd.len)]); |
@@ -2995,7 +2985,6 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
2995 | queue_delayed_work(priv->workqueue, &priv->scan_check, | 2985 | queue_delayed_work(priv->workqueue, &priv->scan_check, |
2996 | IWL_SCAN_CHECK_WATCHDOG); | 2986 | IWL_SCAN_CHECK_WATCHDOG); |
2997 | 2987 | ||
2998 | mutex_unlock(&priv->mutex); | ||
2999 | return; | 2988 | return; |
3000 | 2989 | ||
3001 | done: | 2990 | done: |
@@ -3009,7 +2998,6 @@ static void iwl3945_bg_request_scan(struct work_struct *data) | |||
3009 | 2998 | ||
3010 | /* inform mac80211 scan aborted */ | 2999 | /* inform mac80211 scan aborted */ |
3011 | queue_work(priv->workqueue, &priv->scan_completed); | 3000 | queue_work(priv->workqueue, &priv->scan_completed); |
3012 | mutex_unlock(&priv->mutex); | ||
3013 | } | 3001 | } |
3014 | 3002 | ||
3015 | static void iwl3945_bg_restart(struct work_struct *data) | 3003 | static void iwl3945_bg_restart(struct work_struct *data) |
@@ -3051,8 +3039,6 @@ static void iwl3945_bg_rx_replenish(struct work_struct *data) | |||
3051 | mutex_unlock(&priv->mutex); | 3039 | mutex_unlock(&priv->mutex); |
3052 | } | 3040 | } |
3053 | 3041 | ||
3054 | #define IWL_DELAY_NEXT_SCAN (HZ*2) | ||
3055 | |||
3056 | void iwl3945_post_associate(struct iwl_priv *priv) | 3042 | void iwl3945_post_associate(struct iwl_priv *priv) |
3057 | { | 3043 | { |
3058 | int rc = 0; | 3044 | int rc = 0; |
@@ -3137,9 +3123,6 @@ void iwl3945_post_associate(struct iwl_priv *priv) | |||
3137 | __func__, priv->iw_mode); | 3123 | __func__, priv->iw_mode); |
3138 | break; | 3124 | break; |
3139 | } | 3125 | } |
3140 | |||
3141 | /* we have just associated, don't start scan too early */ | ||
3142 | priv->next_scan_jiffies = jiffies + IWL_DELAY_NEXT_SCAN; | ||
3143 | } | 3126 | } |
3144 | 3127 | ||
3145 | /***************************************************************************** | 3128 | /***************************************************************************** |
@@ -3672,44 +3655,6 @@ static ssize_t show_channels(struct device *d, | |||
3672 | 3655 | ||
3673 | static DEVICE_ATTR(channels, S_IRUSR, show_channels, NULL); | 3656 | static DEVICE_ATTR(channels, S_IRUSR, show_channels, NULL); |
3674 | 3657 | ||
3675 | static ssize_t show_statistics(struct device *d, | ||
3676 | struct device_attribute *attr, char *buf) | ||
3677 | { | ||
3678 | struct iwl_priv *priv = dev_get_drvdata(d); | ||
3679 | u32 size = sizeof(struct iwl3945_notif_statistics); | ||
3680 | u32 len = 0, ofs = 0; | ||
3681 | u8 *data = (u8 *)&priv->_3945.statistics; | ||
3682 | int rc = 0; | ||
3683 | |||
3684 | if (!iwl_is_alive(priv)) | ||
3685 | return -EAGAIN; | ||
3686 | |||
3687 | mutex_lock(&priv->mutex); | ||
3688 | rc = iwl_send_statistics_request(priv, CMD_SYNC, false); | ||
3689 | mutex_unlock(&priv->mutex); | ||
3690 | |||
3691 | if (rc) { | ||
3692 | len = sprintf(buf, | ||
3693 | "Error sending statistics request: 0x%08X\n", rc); | ||
3694 | return len; | ||
3695 | } | ||
3696 | |||
3697 | while (size && (PAGE_SIZE - len)) { | ||
3698 | hex_dump_to_buffer(data + ofs, size, 16, 1, buf + len, | ||
3699 | PAGE_SIZE - len, 1); | ||
3700 | len = strlen(buf); | ||
3701 | if (PAGE_SIZE - len) | ||
3702 | buf[len++] = '\n'; | ||
3703 | |||
3704 | ofs += 16; | ||
3705 | size -= min(size, 16U); | ||
3706 | } | ||
3707 | |||
3708 | return len; | ||
3709 | } | ||
3710 | |||
3711 | static DEVICE_ATTR(statistics, S_IRUGO, show_statistics, NULL); | ||
3712 | |||
3713 | static ssize_t show_antenna(struct device *d, | 3658 | static ssize_t show_antenna(struct device *d, |
3714 | struct device_attribute *attr, char *buf) | 3659 | struct device_attribute *attr, char *buf) |
3715 | { | 3660 | { |
@@ -3793,7 +3738,6 @@ static void iwl3945_setup_deferred_work(struct iwl_priv *priv) | |||
3793 | INIT_DELAYED_WORK(&priv->alive_start, iwl3945_bg_alive_start); | 3738 | INIT_DELAYED_WORK(&priv->alive_start, iwl3945_bg_alive_start); |
3794 | INIT_DELAYED_WORK(&priv->_3945.rfkill_poll, iwl3945_rfkill_poll); | 3739 | INIT_DELAYED_WORK(&priv->_3945.rfkill_poll, iwl3945_rfkill_poll); |
3795 | INIT_WORK(&priv->scan_completed, iwl_bg_scan_completed); | 3740 | INIT_WORK(&priv->scan_completed, iwl_bg_scan_completed); |
3796 | INIT_WORK(&priv->request_scan, iwl3945_bg_request_scan); | ||
3797 | INIT_WORK(&priv->abort_scan, iwl_bg_abort_scan); | 3741 | INIT_WORK(&priv->abort_scan, iwl_bg_abort_scan); |
3798 | INIT_DELAYED_WORK(&priv->scan_check, iwl_bg_scan_check); | 3742 | INIT_DELAYED_WORK(&priv->scan_check, iwl_bg_scan_check); |
3799 | 3743 | ||
@@ -3830,7 +3774,6 @@ static struct attribute *iwl3945_sysfs_entries[] = { | |||
3830 | &dev_attr_filter_flags.attr, | 3774 | &dev_attr_filter_flags.attr, |
3831 | &dev_attr_measurement.attr, | 3775 | &dev_attr_measurement.attr, |
3832 | &dev_attr_retry_rate.attr, | 3776 | &dev_attr_retry_rate.attr, |
3833 | &dev_attr_statistics.attr, | ||
3834 | &dev_attr_status.attr, | 3777 | &dev_attr_status.attr, |
3835 | &dev_attr_temperature.attr, | 3778 | &dev_attr_temperature.attr, |
3836 | &dev_attr_tx_power.attr, | 3779 | &dev_attr_tx_power.attr, |
@@ -4253,7 +4196,7 @@ static void __devexit iwl3945_pci_remove(struct pci_dev *pdev) | |||
4253 | 4196 | ||
4254 | iwl_free_channel_map(priv); | 4197 | iwl_free_channel_map(priv); |
4255 | iwlcore_free_geos(priv); | 4198 | iwlcore_free_geos(priv); |
4256 | kfree(priv->scan); | 4199 | kfree(priv->scan_cmd); |
4257 | if (priv->ibss_beacon) | 4200 | if (priv->ibss_beacon) |
4258 | dev_kfree_skb(priv->ibss_beacon); | 4201 | dev_kfree_skb(priv->ibss_beacon); |
4259 | 4202 | ||
diff --git a/drivers/net/wireless/iwmc3200wifi/Makefile b/drivers/net/wireless/iwmc3200wifi/Makefile index aeed5cd80819..cdc7e07ba113 100644 --- a/drivers/net/wireless/iwmc3200wifi/Makefile +++ b/drivers/net/wireless/iwmc3200wifi/Makefile | |||
@@ -6,3 +6,5 @@ iwmc3200wifi-$(CONFIG_IWM_DEBUG) += debugfs.o | |||
6 | iwmc3200wifi-$(CONFIG_IWM_TRACING) += trace.o | 6 | iwmc3200wifi-$(CONFIG_IWM_TRACING) += trace.o |
7 | 7 | ||
8 | CFLAGS_trace.o := -I$(src) | 8 | CFLAGS_trace.o := -I$(src) |
9 | |||
10 | ccflags-y += -D__CHECK_ENDIAN__ | ||
diff --git a/drivers/net/wireless/iwmc3200wifi/rx.c b/drivers/net/wireless/iwmc3200wifi/rx.c index ad5398779240..e1184deca559 100644 --- a/drivers/net/wireless/iwmc3200wifi/rx.c +++ b/drivers/net/wireless/iwmc3200wifi/rx.c | |||
@@ -431,7 +431,8 @@ static int iwm_ntf_rx_ticket(struct iwm_priv *iwm, u8 *buf, | |||
431 | return PTR_ERR(ticket_node); | 431 | return PTR_ERR(ticket_node); |
432 | 432 | ||
433 | IWM_DBG_RX(iwm, DBG, "TICKET %s(%d)\n", | 433 | IWM_DBG_RX(iwm, DBG, "TICKET %s(%d)\n", |
434 | ticket->action == IWM_RX_TICKET_RELEASE ? | 434 | __le16_to_cpu(ticket->action) == |
435 | IWM_RX_TICKET_RELEASE ? | ||
435 | "RELEASE" : "DROP", | 436 | "RELEASE" : "DROP", |
436 | ticket->id); | 437 | ticket->id); |
437 | spin_lock(&iwm->ticket_lock); | 438 | spin_lock(&iwm->ticket_lock); |
diff --git a/drivers/net/wireless/iwmc3200wifi/trace.h b/drivers/net/wireless/iwmc3200wifi/trace.h index 320e54fbb38c..abb4805fa8df 100644 --- a/drivers/net/wireless/iwmc3200wifi/trace.h +++ b/drivers/net/wireless/iwmc3200wifi/trace.h | |||
@@ -76,7 +76,7 @@ TRACE_EVENT(iwm_tx_wifi_cmd, | |||
76 | IWM_ASSIGN; | 76 | IWM_ASSIGN; |
77 | __entry->opcode = hdr->sw_hdr.cmd.cmd; | 77 | __entry->opcode = hdr->sw_hdr.cmd.cmd; |
78 | __entry->lmac = 0; | 78 | __entry->lmac = 0; |
79 | __entry->seq = hdr->sw_hdr.cmd.seq_num; | 79 | __entry->seq = __le16_to_cpu(hdr->sw_hdr.cmd.seq_num); |
80 | __entry->resp = GET_VAL8(hdr->sw_hdr.cmd.flags, UMAC_DEV_CMD_FLAGS_RESP_REQ); | 80 | __entry->resp = GET_VAL8(hdr->sw_hdr.cmd.flags, UMAC_DEV_CMD_FLAGS_RESP_REQ); |
81 | __entry->color = GET_VAL32(hdr->sw_hdr.meta_data, UMAC_FW_CMD_TX_STA_COLOR); | 81 | __entry->color = GET_VAL32(hdr->sw_hdr.meta_data, UMAC_FW_CMD_TX_STA_COLOR); |
82 | __entry->eot = GET_VAL32(hdr->hw_hdr.cmd, UMAC_HDI_OUT_CMD_EOT); | 82 | __entry->eot = GET_VAL32(hdr->hw_hdr.cmd, UMAC_HDI_OUT_CMD_EOT); |
@@ -123,7 +123,7 @@ TRACE_EVENT(iwm_tx_packets, | |||
123 | __entry->ra_tid = GET_VAL32(hdr->hw_hdr.meta_data, UMAC_HDI_OUT_RATID); | 123 | __entry->ra_tid = GET_VAL32(hdr->hw_hdr.meta_data, UMAC_HDI_OUT_RATID); |
124 | __entry->credit_group = GET_VAL32(hdr->hw_hdr.meta_data, UMAC_HDI_OUT_CREDIT_GRP); | 124 | __entry->credit_group = GET_VAL32(hdr->hw_hdr.meta_data, UMAC_HDI_OUT_CREDIT_GRP); |
125 | __entry->color = GET_VAL32(hdr->sw_hdr.meta_data, UMAC_FW_CMD_TX_STA_COLOR); | 125 | __entry->color = GET_VAL32(hdr->sw_hdr.meta_data, UMAC_FW_CMD_TX_STA_COLOR); |
126 | __entry->seq = hdr->sw_hdr.cmd.seq_num; | 126 | __entry->seq = __le16_to_cpu(hdr->sw_hdr.cmd.seq_num); |
127 | __entry->npkt = 1; | 127 | __entry->npkt = 1; |
128 | __entry->bytes = len; | 128 | __entry->bytes = len; |
129 | 129 | ||
diff --git a/drivers/net/wireless/iwmc3200wifi/tx.c b/drivers/net/wireless/iwmc3200wifi/tx.c index 9537cdb13d3f..3216621fc55a 100644 --- a/drivers/net/wireless/iwmc3200wifi/tx.c +++ b/drivers/net/wireless/iwmc3200wifi/tx.c | |||
@@ -302,8 +302,8 @@ void iwm_tx_credit_init_pools(struct iwm_priv *iwm, | |||
302 | 302 | ||
303 | #define IWM_UDMA_HDR_LEN sizeof(struct iwm_umac_wifi_out_hdr) | 303 | #define IWM_UDMA_HDR_LEN sizeof(struct iwm_umac_wifi_out_hdr) |
304 | 304 | ||
305 | static int iwm_tx_build_packet(struct iwm_priv *iwm, struct sk_buff *skb, | 305 | static __le16 iwm_tx_build_packet(struct iwm_priv *iwm, struct sk_buff *skb, |
306 | int pool_id, u8 *buf) | 306 | int pool_id, u8 *buf) |
307 | { | 307 | { |
308 | struct iwm_umac_wifi_out_hdr *hdr = (struct iwm_umac_wifi_out_hdr *)buf; | 308 | struct iwm_umac_wifi_out_hdr *hdr = (struct iwm_umac_wifi_out_hdr *)buf; |
309 | struct iwm_udma_wifi_cmd udma_cmd; | 309 | struct iwm_udma_wifi_cmd udma_cmd; |
diff --git a/drivers/net/wireless/libertas/if_sdio.c b/drivers/net/wireless/libertas/if_sdio.c index cd464a2589b9..13dfeda742bc 100644 --- a/drivers/net/wireless/libertas/if_sdio.c +++ b/drivers/net/wireless/libertas/if_sdio.c | |||
@@ -315,12 +315,28 @@ out: | |||
315 | return ret; | 315 | return ret; |
316 | } | 316 | } |
317 | 317 | ||
318 | static int if_sdio_wait_status(struct if_sdio_card *card, const u8 condition) | ||
319 | { | ||
320 | u8 status; | ||
321 | unsigned long timeout; | ||
322 | int ret = 0; | ||
323 | |||
324 | timeout = jiffies + HZ; | ||
325 | while (1) { | ||
326 | status = sdio_readb(card->func, IF_SDIO_STATUS, &ret); | ||
327 | if (ret || (status & condition)) | ||
328 | break; | ||
329 | if (time_after(jiffies, timeout)) | ||
330 | return -ETIMEDOUT; | ||
331 | mdelay(1); | ||
332 | } | ||
333 | return ret; | ||
334 | } | ||
335 | |||
318 | static int if_sdio_card_to_host(struct if_sdio_card *card) | 336 | static int if_sdio_card_to_host(struct if_sdio_card *card) |
319 | { | 337 | { |
320 | int ret; | 338 | int ret; |
321 | u8 status; | ||
322 | u16 size, type, chunk; | 339 | u16 size, type, chunk; |
323 | unsigned long timeout; | ||
324 | 340 | ||
325 | lbs_deb_enter(LBS_DEB_SDIO); | 341 | lbs_deb_enter(LBS_DEB_SDIO); |
326 | 342 | ||
@@ -335,19 +351,9 @@ static int if_sdio_card_to_host(struct if_sdio_card *card) | |||
335 | goto out; | 351 | goto out; |
336 | } | 352 | } |
337 | 353 | ||
338 | timeout = jiffies + HZ; | 354 | ret = if_sdio_wait_status(card, IF_SDIO_IO_RDY); |
339 | while (1) { | 355 | if (ret) |
340 | status = sdio_readb(card->func, IF_SDIO_STATUS, &ret); | 356 | goto out; |
341 | if (ret) | ||
342 | goto out; | ||
343 | if (status & IF_SDIO_IO_RDY) | ||
344 | break; | ||
345 | if (time_after(jiffies, timeout)) { | ||
346 | ret = -ETIMEDOUT; | ||
347 | goto out; | ||
348 | } | ||
349 | mdelay(1); | ||
350 | } | ||
351 | 357 | ||
352 | /* | 358 | /* |
353 | * The transfer must be in one transaction or the firmware | 359 | * The transfer must be in one transaction or the firmware |
@@ -414,8 +420,6 @@ static void if_sdio_host_to_card_worker(struct work_struct *work) | |||
414 | { | 420 | { |
415 | struct if_sdio_card *card; | 421 | struct if_sdio_card *card; |
416 | struct if_sdio_packet *packet; | 422 | struct if_sdio_packet *packet; |
417 | unsigned long timeout; | ||
418 | u8 status; | ||
419 | int ret; | 423 | int ret; |
420 | unsigned long flags; | 424 | unsigned long flags; |
421 | 425 | ||
@@ -435,25 +439,15 @@ static void if_sdio_host_to_card_worker(struct work_struct *work) | |||
435 | 439 | ||
436 | sdio_claim_host(card->func); | 440 | sdio_claim_host(card->func); |
437 | 441 | ||
438 | timeout = jiffies + HZ; | 442 | ret = if_sdio_wait_status(card, IF_SDIO_IO_RDY); |
439 | while (1) { | 443 | if (ret == 0) { |
440 | status = sdio_readb(card->func, IF_SDIO_STATUS, &ret); | 444 | ret = sdio_writesb(card->func, card->ioport, |
441 | if (ret) | 445 | packet->buffer, packet->nb); |
442 | goto release; | ||
443 | if (status & IF_SDIO_IO_RDY) | ||
444 | break; | ||
445 | if (time_after(jiffies, timeout)) { | ||
446 | ret = -ETIMEDOUT; | ||
447 | goto release; | ||
448 | } | ||
449 | mdelay(1); | ||
450 | } | 446 | } |
451 | 447 | ||
452 | ret = sdio_writesb(card->func, card->ioport, | ||
453 | packet->buffer, packet->nb); | ||
454 | if (ret) | 448 | if (ret) |
455 | goto release; | 449 | lbs_pr_err("error %d sending packet to firmware\n", ret); |
456 | release: | 450 | |
457 | sdio_release_host(card->func); | 451 | sdio_release_host(card->func); |
458 | 452 | ||
459 | kfree(packet); | 453 | kfree(packet); |
@@ -466,10 +460,11 @@ release: | |||
466 | /* Firmware */ | 460 | /* Firmware */ |
467 | /********************************************************************/ | 461 | /********************************************************************/ |
468 | 462 | ||
463 | #define FW_DL_READY_STATUS (IF_SDIO_IO_RDY | IF_SDIO_DL_RDY) | ||
464 | |||
469 | static int if_sdio_prog_helper(struct if_sdio_card *card) | 465 | static int if_sdio_prog_helper(struct if_sdio_card *card) |
470 | { | 466 | { |
471 | int ret; | 467 | int ret; |
472 | u8 status; | ||
473 | const struct firmware *fw; | 468 | const struct firmware *fw; |
474 | unsigned long timeout; | 469 | unsigned long timeout; |
475 | u8 *chunk_buffer; | 470 | u8 *chunk_buffer; |
@@ -501,20 +496,14 @@ static int if_sdio_prog_helper(struct if_sdio_card *card) | |||
501 | size = fw->size; | 496 | size = fw->size; |
502 | 497 | ||
503 | while (size) { | 498 | while (size) { |
504 | timeout = jiffies + HZ; | 499 | ret = if_sdio_wait_status(card, FW_DL_READY_STATUS); |
505 | while (1) { | 500 | if (ret) |
506 | status = sdio_readb(card->func, IF_SDIO_STATUS, &ret); | 501 | goto release; |
507 | if (ret) | 502 | |
508 | goto release; | 503 | /* On some platforms (like Davinci) the chip needs more time |
509 | if ((status & IF_SDIO_IO_RDY) && | 504 | * between helper blocks. |
510 | (status & IF_SDIO_DL_RDY)) | 505 | */ |
511 | break; | 506 | mdelay(2); |
512 | if (time_after(jiffies, timeout)) { | ||
513 | ret = -ETIMEDOUT; | ||
514 | goto release; | ||
515 | } | ||
516 | mdelay(1); | ||
517 | } | ||
518 | 507 | ||
519 | chunk_size = min(size, (size_t)60); | 508 | chunk_size = min(size, (size_t)60); |
520 | 509 | ||
@@ -584,7 +573,6 @@ out: | |||
584 | static int if_sdio_prog_real(struct if_sdio_card *card) | 573 | static int if_sdio_prog_real(struct if_sdio_card *card) |
585 | { | 574 | { |
586 | int ret; | 575 | int ret; |
587 | u8 status; | ||
588 | const struct firmware *fw; | 576 | const struct firmware *fw; |
589 | unsigned long timeout; | 577 | unsigned long timeout; |
590 | u8 *chunk_buffer; | 578 | u8 *chunk_buffer; |
@@ -616,20 +604,9 @@ static int if_sdio_prog_real(struct if_sdio_card *card) | |||
616 | size = fw->size; | 604 | size = fw->size; |
617 | 605 | ||
618 | while (size) { | 606 | while (size) { |
619 | timeout = jiffies + HZ; | 607 | ret = if_sdio_wait_status(card, FW_DL_READY_STATUS); |
620 | while (1) { | 608 | if (ret) |
621 | status = sdio_readb(card->func, IF_SDIO_STATUS, &ret); | 609 | goto release; |
622 | if (ret) | ||
623 | goto release; | ||
624 | if ((status & IF_SDIO_IO_RDY) && | ||
625 | (status & IF_SDIO_DL_RDY)) | ||
626 | break; | ||
627 | if (time_after(jiffies, timeout)) { | ||
628 | ret = -ETIMEDOUT; | ||
629 | goto release; | ||
630 | } | ||
631 | mdelay(1); | ||
632 | } | ||
633 | 610 | ||
634 | req_size = sdio_readb(card->func, IF_SDIO_RD_BASE, &ret); | 611 | req_size = sdio_readb(card->func, IF_SDIO_RD_BASE, &ret); |
635 | if (ret) | 612 | if (ret) |
diff --git a/drivers/net/wireless/mac80211_hwsim.c b/drivers/net/wireless/mac80211_hwsim.c index dfff02f5c86d..6f0d8c9fa933 100644 --- a/drivers/net/wireless/mac80211_hwsim.c +++ b/drivers/net/wireless/mac80211_hwsim.c | |||
@@ -830,6 +830,33 @@ static int mac80211_hwsim_conf_tx( | |||
830 | return 0; | 830 | return 0; |
831 | } | 831 | } |
832 | 832 | ||
833 | static int mac80211_hwsim_get_survey( | ||
834 | struct ieee80211_hw *hw, int idx, | ||
835 | struct survey_info *survey) | ||
836 | { | ||
837 | struct ieee80211_conf *conf = &hw->conf; | ||
838 | |||
839 | printk(KERN_DEBUG "%s:%s (idx=%d)\n", | ||
840 | wiphy_name(hw->wiphy), __func__, idx); | ||
841 | |||
842 | if (idx != 0) | ||
843 | return -ENOENT; | ||
844 | |||
845 | /* Current channel */ | ||
846 | survey->channel = conf->channel; | ||
847 | |||
848 | /* | ||
849 | * Magically conjured noise level --- this is only ok for simulated hardware. | ||
850 | * | ||
851 | * A real driver which cannot determine the real channel noise MUST NOT | ||
852 | * report any noise, especially not a magically conjured one :-) | ||
853 | */ | ||
854 | survey->filled = SURVEY_INFO_NOISE_DBM; | ||
855 | survey->noise = -92; | ||
856 | |||
857 | return 0; | ||
858 | } | ||
859 | |||
833 | #ifdef CONFIG_NL80211_TESTMODE | 860 | #ifdef CONFIG_NL80211_TESTMODE |
834 | /* | 861 | /* |
835 | * This section contains example code for using netlink | 862 | * This section contains example code for using netlink |
@@ -1013,6 +1040,7 @@ static struct ieee80211_ops mac80211_hwsim_ops = | |||
1013 | .sta_notify = mac80211_hwsim_sta_notify, | 1040 | .sta_notify = mac80211_hwsim_sta_notify, |
1014 | .set_tim = mac80211_hwsim_set_tim, | 1041 | .set_tim = mac80211_hwsim_set_tim, |
1015 | .conf_tx = mac80211_hwsim_conf_tx, | 1042 | .conf_tx = mac80211_hwsim_conf_tx, |
1043 | .get_survey = mac80211_hwsim_get_survey, | ||
1016 | CFG80211_TESTMODE_CMD(mac80211_hwsim_testmode_cmd) | 1044 | CFG80211_TESTMODE_CMD(mac80211_hwsim_testmode_cmd) |
1017 | .ampdu_action = mac80211_hwsim_ampdu_action, | 1045 | .ampdu_action = mac80211_hwsim_ampdu_action, |
1018 | .sw_scan_start = mac80211_hwsim_sw_scan, | 1046 | .sw_scan_start = mac80211_hwsim_sw_scan, |
diff --git a/drivers/net/wireless/orinoco/Makefile b/drivers/net/wireless/orinoco/Makefile index 9abd6329bcbd..e6452698eba9 100644 --- a/drivers/net/wireless/orinoco/Makefile +++ b/drivers/net/wireless/orinoco/Makefile | |||
@@ -11,3 +11,6 @@ obj-$(CONFIG_PCI_HERMES) += orinoco_pci.o | |||
11 | obj-$(CONFIG_TMD_HERMES) += orinoco_tmd.o | 11 | obj-$(CONFIG_TMD_HERMES) += orinoco_tmd.o |
12 | obj-$(CONFIG_NORTEL_HERMES) += orinoco_nortel.o | 12 | obj-$(CONFIG_NORTEL_HERMES) += orinoco_nortel.o |
13 | obj-$(CONFIG_PCMCIA_SPECTRUM) += spectrum_cs.o | 13 | obj-$(CONFIG_PCMCIA_SPECTRUM) += spectrum_cs.o |
14 | |||
15 | # Orinoco should be endian clean. | ||
16 | ccflags-y += -D__CHECK_ENDIAN__ | ||
diff --git a/drivers/net/wireless/orinoco/cfg.c b/drivers/net/wireless/orinoco/cfg.c index 27f2d3342645..90dd4d0595c3 100644 --- a/drivers/net/wireless/orinoco/cfg.c +++ b/drivers/net/wireless/orinoco/cfg.c | |||
@@ -88,7 +88,9 @@ int orinoco_wiphy_register(struct wiphy *wiphy) | |||
88 | 88 | ||
89 | wiphy->rts_threshold = priv->rts_thresh; | 89 | wiphy->rts_threshold = priv->rts_thresh; |
90 | if (!priv->has_mwo) | 90 | if (!priv->has_mwo) |
91 | wiphy->frag_threshold = priv->frag_thresh; | 91 | wiphy->frag_threshold = priv->frag_thresh + 1; |
92 | wiphy->retry_short = priv->short_retry_limit; | ||
93 | wiphy->retry_long = priv->long_retry_limit; | ||
92 | 94 | ||
93 | return wiphy_register(wiphy); | 95 | return wiphy_register(wiphy); |
94 | } | 96 | } |
@@ -196,8 +198,92 @@ static int orinoco_set_channel(struct wiphy *wiphy, | |||
196 | return err; | 198 | return err; |
197 | } | 199 | } |
198 | 200 | ||
201 | static int orinoco_set_wiphy_params(struct wiphy *wiphy, u32 changed) | ||
202 | { | ||
203 | struct orinoco_private *priv = wiphy_priv(wiphy); | ||
204 | int frag_value = -1; | ||
205 | int rts_value = -1; | ||
206 | int err = 0; | ||
207 | |||
208 | if (changed & WIPHY_PARAM_RETRY_SHORT) { | ||
209 | /* Setting short retry not supported */ | ||
210 | err = -EINVAL; | ||
211 | } | ||
212 | |||
213 | if (changed & WIPHY_PARAM_RETRY_LONG) { | ||
214 | /* Setting long retry not supported */ | ||
215 | err = -EINVAL; | ||
216 | } | ||
217 | |||
218 | if (changed & WIPHY_PARAM_FRAG_THRESHOLD) { | ||
219 | /* Set fragmentation */ | ||
220 | if (priv->has_mwo) { | ||
221 | if (wiphy->frag_threshold < 0) | ||
222 | frag_value = 0; | ||
223 | else { | ||
224 | printk(KERN_WARNING "%s: Fixed fragmentation " | ||
225 | "is not supported on this firmware. " | ||
226 | "Using MWO robust instead.\n", | ||
227 | priv->ndev->name); | ||
228 | frag_value = 1; | ||
229 | } | ||
230 | } else { | ||
231 | if (wiphy->frag_threshold < 0) | ||
232 | frag_value = 2346; | ||
233 | else if ((wiphy->frag_threshold < 257) || | ||
234 | (wiphy->frag_threshold > 2347)) | ||
235 | err = -EINVAL; | ||
236 | else | ||
237 | /* cfg80211 value is 257-2347 (odd only) | ||
238 | * orinoco rid has range 256-2346 (even only) */ | ||
239 | frag_value = wiphy->frag_threshold & ~0x1; | ||
240 | } | ||
241 | } | ||
242 | |||
243 | if (changed & WIPHY_PARAM_RTS_THRESHOLD) { | ||
244 | /* Set RTS. | ||
245 | * | ||
246 | * Prism documentation suggests default of 2432, | ||
247 | * and a range of 0-3000. | ||
248 | * | ||
249 | * Current implementation uses 2347 as the default and | ||
250 | * the upper limit. | ||
251 | */ | ||
252 | |||
253 | if (wiphy->rts_threshold < 0) | ||
254 | rts_value = 2347; | ||
255 | else if (wiphy->rts_threshold > 2347) | ||
256 | err = -EINVAL; | ||
257 | else | ||
258 | rts_value = wiphy->rts_threshold; | ||
259 | } | ||
260 | |||
261 | if (!err) { | ||
262 | unsigned long flags; | ||
263 | |||
264 | if (orinoco_lock(priv, &flags) != 0) | ||
265 | return -EBUSY; | ||
266 | |||
267 | if (frag_value >= 0) { | ||
268 | if (priv->has_mwo) | ||
269 | priv->mwo_robust = frag_value; | ||
270 | else | ||
271 | priv->frag_thresh = frag_value; | ||
272 | } | ||
273 | if (rts_value >= 0) | ||
274 | priv->rts_thresh = rts_value; | ||
275 | |||
276 | err = orinoco_commit(priv); | ||
277 | |||
278 | orinoco_unlock(priv, &flags); | ||
279 | } | ||
280 | |||
281 | return err; | ||
282 | } | ||
283 | |||
199 | const struct cfg80211_ops orinoco_cfg_ops = { | 284 | const struct cfg80211_ops orinoco_cfg_ops = { |
200 | .change_virtual_intf = orinoco_change_vif, | 285 | .change_virtual_intf = orinoco_change_vif, |
201 | .set_channel = orinoco_set_channel, | 286 | .set_channel = orinoco_set_channel, |
202 | .scan = orinoco_scan, | 287 | .scan = orinoco_scan, |
288 | .set_wiphy_params = orinoco_set_wiphy_params, | ||
203 | }; | 289 | }; |
diff --git a/drivers/net/wireless/orinoco/hw.c b/drivers/net/wireless/orinoco/hw.c index 9f657afaa3e5..741f8cea95b9 100644 --- a/drivers/net/wireless/orinoco/hw.c +++ b/drivers/net/wireless/orinoco/hw.c | |||
@@ -374,6 +374,32 @@ int orinoco_hw_read_card_settings(struct orinoco_private *priv, u8 *dev_addr) | |||
374 | err = hermes_read_wordrec(hw, USER_BAP, | 374 | err = hermes_read_wordrec(hw, USER_BAP, |
375 | HERMES_RID_CNFPREAMBLE_SYMBOL, | 375 | HERMES_RID_CNFPREAMBLE_SYMBOL, |
376 | &priv->preamble); | 376 | &priv->preamble); |
377 | if (err) { | ||
378 | dev_err(dev, "Failed to read preamble setup\n"); | ||
379 | goto out; | ||
380 | } | ||
381 | } | ||
382 | |||
383 | /* Retry settings */ | ||
384 | err = hermes_read_wordrec(hw, USER_BAP, HERMES_RID_SHORTRETRYLIMIT, | ||
385 | &priv->short_retry_limit); | ||
386 | if (err) { | ||
387 | dev_err(dev, "Failed to read short retry limit\n"); | ||
388 | goto out; | ||
389 | } | ||
390 | |||
391 | err = hermes_read_wordrec(hw, USER_BAP, HERMES_RID_LONGRETRYLIMIT, | ||
392 | &priv->long_retry_limit); | ||
393 | if (err) { | ||
394 | dev_err(dev, "Failed to read long retry limit\n"); | ||
395 | goto out; | ||
396 | } | ||
397 | |||
398 | err = hermes_read_wordrec(hw, USER_BAP, HERMES_RID_MAXTRANSMITLIFETIME, | ||
399 | &priv->retry_lifetime); | ||
400 | if (err) { | ||
401 | dev_err(dev, "Failed to read max retry lifetime\n"); | ||
402 | goto out; | ||
377 | } | 403 | } |
378 | 404 | ||
379 | out: | 405 | out: |
diff --git a/drivers/net/wireless/orinoco/main.h b/drivers/net/wireless/orinoco/main.h index 21ab36cd76c7..4dadf9880a97 100644 --- a/drivers/net/wireless/orinoco/main.h +++ b/drivers/net/wireless/orinoco/main.h | |||
@@ -33,18 +33,6 @@ int orinoco_commit(struct orinoco_private *priv); | |||
33 | void orinoco_reset(struct work_struct *work); | 33 | void orinoco_reset(struct work_struct *work); |
34 | 34 | ||
35 | /* Information element helpers - find a home for these... */ | 35 | /* Information element helpers - find a home for these... */ |
36 | static inline u8 *orinoco_get_ie(u8 *data, size_t len, | ||
37 | enum ieee80211_eid eid) | ||
38 | { | ||
39 | u8 *p = data; | ||
40 | while ((p + 2) < (data + len)) { | ||
41 | if (p[0] == eid) | ||
42 | return p; | ||
43 | p += p[1] + 2; | ||
44 | } | ||
45 | return NULL; | ||
46 | } | ||
47 | |||
48 | #define WPA_OUI_TYPE "\x00\x50\xF2\x01" | 36 | #define WPA_OUI_TYPE "\x00\x50\xF2\x01" |
49 | #define WPA_SELECTOR_LEN 4 | 37 | #define WPA_SELECTOR_LEN 4 |
50 | static inline u8 *orinoco_get_wpa_ie(u8 *data, size_t len) | 38 | static inline u8 *orinoco_get_wpa_ie(u8 *data, size_t len) |
diff --git a/drivers/net/wireless/orinoco/orinoco.h b/drivers/net/wireless/orinoco/orinoco.h index 665ef56f8382..ff6b7b1d421d 100644 --- a/drivers/net/wireless/orinoco/orinoco.h +++ b/drivers/net/wireless/orinoco/orinoco.h | |||
@@ -131,6 +131,8 @@ struct orinoco_private { | |||
131 | u16 ap_density, rts_thresh; | 131 | u16 ap_density, rts_thresh; |
132 | u16 pm_on, pm_mcast, pm_period, pm_timeout; | 132 | u16 pm_on, pm_mcast, pm_period, pm_timeout; |
133 | u16 preamble; | 133 | u16 preamble; |
134 | u16 short_retry_limit, long_retry_limit; | ||
135 | u16 retry_lifetime; | ||
134 | #ifdef WIRELESS_SPY | 136 | #ifdef WIRELESS_SPY |
135 | struct iw_spy_data spy_data; /* iwspy support */ | 137 | struct iw_spy_data spy_data; /* iwspy support */ |
136 | struct iw_public_data wireless_data; | 138 | struct iw_public_data wireless_data; |
diff --git a/drivers/net/wireless/orinoco/scan.c b/drivers/net/wireless/orinoco/scan.c index 330d42d45333..4300d9db7d8c 100644 --- a/drivers/net/wireless/orinoco/scan.c +++ b/drivers/net/wireless/orinoco/scan.c | |||
@@ -127,7 +127,7 @@ void orinoco_add_extscan_result(struct orinoco_private *priv, | |||
127 | { | 127 | { |
128 | struct wiphy *wiphy = priv_to_wiphy(priv); | 128 | struct wiphy *wiphy = priv_to_wiphy(priv); |
129 | struct ieee80211_channel *channel; | 129 | struct ieee80211_channel *channel; |
130 | u8 *ie; | 130 | const u8 *ie; |
131 | u64 timestamp; | 131 | u64 timestamp; |
132 | s32 signal; | 132 | s32 signal; |
133 | u16 capability; | 133 | u16 capability; |
@@ -136,7 +136,7 @@ void orinoco_add_extscan_result(struct orinoco_private *priv, | |||
136 | int chan, freq; | 136 | int chan, freq; |
137 | 137 | ||
138 | ie_len = len - sizeof(*bss); | 138 | ie_len = len - sizeof(*bss); |
139 | ie = orinoco_get_ie(bss->data, ie_len, WLAN_EID_DS_PARAMS); | 139 | ie = cfg80211_find_ie(WLAN_EID_DS_PARAMS, bss->data, ie_len); |
140 | chan = ie ? ie[2] : 0; | 140 | chan = ie ? ie[2] : 0; |
141 | freq = ieee80211_dsss_chan_to_freq(chan); | 141 | freq = ieee80211_dsss_chan_to_freq(chan); |
142 | channel = ieee80211_get_channel(wiphy, freq); | 142 | channel = ieee80211_get_channel(wiphy, freq); |
diff --git a/drivers/net/wireless/orinoco/wext.c b/drivers/net/wireless/orinoco/wext.c index 57b850ebfeb2..a1006bf430cc 100644 --- a/drivers/net/wireless/orinoco/wext.c +++ b/drivers/net/wireless/orinoco/wext.c | |||
@@ -538,125 +538,6 @@ static int orinoco_ioctl_setsens(struct net_device *dev, | |||
538 | return -EINPROGRESS; /* Call commit handler */ | 538 | return -EINPROGRESS; /* Call commit handler */ |
539 | } | 539 | } |
540 | 540 | ||
541 | static int orinoco_ioctl_setrts(struct net_device *dev, | ||
542 | struct iw_request_info *info, | ||
543 | struct iw_param *rrq, | ||
544 | char *extra) | ||
545 | { | ||
546 | struct orinoco_private *priv = ndev_priv(dev); | ||
547 | int val = rrq->value; | ||
548 | unsigned long flags; | ||
549 | |||
550 | if (rrq->disabled) | ||
551 | val = 2347; | ||
552 | |||
553 | if ((val < 0) || (val > 2347)) | ||
554 | return -EINVAL; | ||
555 | |||
556 | if (orinoco_lock(priv, &flags) != 0) | ||
557 | return -EBUSY; | ||
558 | |||
559 | priv->rts_thresh = val; | ||
560 | orinoco_unlock(priv, &flags); | ||
561 | |||
562 | return -EINPROGRESS; /* Call commit handler */ | ||
563 | } | ||
564 | |||
565 | static int orinoco_ioctl_getrts(struct net_device *dev, | ||
566 | struct iw_request_info *info, | ||
567 | struct iw_param *rrq, | ||
568 | char *extra) | ||
569 | { | ||
570 | struct orinoco_private *priv = ndev_priv(dev); | ||
571 | |||
572 | rrq->value = priv->rts_thresh; | ||
573 | rrq->disabled = (rrq->value == 2347); | ||
574 | rrq->fixed = 1; | ||
575 | |||
576 | return 0; | ||
577 | } | ||
578 | |||
579 | static int orinoco_ioctl_setfrag(struct net_device *dev, | ||
580 | struct iw_request_info *info, | ||
581 | struct iw_param *frq, | ||
582 | char *extra) | ||
583 | { | ||
584 | struct orinoco_private *priv = ndev_priv(dev); | ||
585 | int err = -EINPROGRESS; /* Call commit handler */ | ||
586 | unsigned long flags; | ||
587 | |||
588 | if (orinoco_lock(priv, &flags) != 0) | ||
589 | return -EBUSY; | ||
590 | |||
591 | if (priv->has_mwo) { | ||
592 | if (frq->disabled) | ||
593 | priv->mwo_robust = 0; | ||
594 | else { | ||
595 | if (frq->fixed) | ||
596 | printk(KERN_WARNING "%s: Fixed fragmentation " | ||
597 | "is not supported on this firmware. " | ||
598 | "Using MWO robust instead.\n", | ||
599 | dev->name); | ||
600 | priv->mwo_robust = 1; | ||
601 | } | ||
602 | } else { | ||
603 | if (frq->disabled) | ||
604 | priv->frag_thresh = 2346; | ||
605 | else { | ||
606 | if ((frq->value < 256) || (frq->value > 2346)) | ||
607 | err = -EINVAL; | ||
608 | else | ||
609 | /* must be even */ | ||
610 | priv->frag_thresh = frq->value & ~0x1; | ||
611 | } | ||
612 | } | ||
613 | |||
614 | orinoco_unlock(priv, &flags); | ||
615 | |||
616 | return err; | ||
617 | } | ||
618 | |||
619 | static int orinoco_ioctl_getfrag(struct net_device *dev, | ||
620 | struct iw_request_info *info, | ||
621 | struct iw_param *frq, | ||
622 | char *extra) | ||
623 | { | ||
624 | struct orinoco_private *priv = ndev_priv(dev); | ||
625 | hermes_t *hw = &priv->hw; | ||
626 | int err; | ||
627 | u16 val; | ||
628 | unsigned long flags; | ||
629 | |||
630 | if (orinoco_lock(priv, &flags) != 0) | ||
631 | return -EBUSY; | ||
632 | |||
633 | if (priv->has_mwo) { | ||
634 | err = hermes_read_wordrec(hw, USER_BAP, | ||
635 | HERMES_RID_CNFMWOROBUST_AGERE, | ||
636 | &val); | ||
637 | if (err) | ||
638 | val = 0; | ||
639 | |||
640 | frq->value = val ? 2347 : 0; | ||
641 | frq->disabled = !val; | ||
642 | frq->fixed = 0; | ||
643 | } else { | ||
644 | err = hermes_read_wordrec(hw, USER_BAP, | ||
645 | HERMES_RID_CNFFRAGMENTATIONTHRESHOLD, | ||
646 | &val); | ||
647 | if (err) | ||
648 | val = 0; | ||
649 | |||
650 | frq->value = val; | ||
651 | frq->disabled = (val >= 2346); | ||
652 | frq->fixed = 1; | ||
653 | } | ||
654 | |||
655 | orinoco_unlock(priv, &flags); | ||
656 | |||
657 | return err; | ||
658 | } | ||
659 | |||
660 | static int orinoco_ioctl_setrate(struct net_device *dev, | 541 | static int orinoco_ioctl_setrate(struct net_device *dev, |
661 | struct iw_request_info *info, | 542 | struct iw_request_info *info, |
662 | struct iw_param *rrq, | 543 | struct iw_param *rrq, |
@@ -1201,60 +1082,6 @@ static int orinoco_ioctl_set_mlme(struct net_device *dev, | |||
1201 | return ret; | 1082 | return ret; |
1202 | } | 1083 | } |
1203 | 1084 | ||
1204 | static int orinoco_ioctl_getretry(struct net_device *dev, | ||
1205 | struct iw_request_info *info, | ||
1206 | struct iw_param *rrq, | ||
1207 | char *extra) | ||
1208 | { | ||
1209 | struct orinoco_private *priv = ndev_priv(dev); | ||
1210 | hermes_t *hw = &priv->hw; | ||
1211 | int err = 0; | ||
1212 | u16 short_limit, long_limit, lifetime; | ||
1213 | unsigned long flags; | ||
1214 | |||
1215 | if (orinoco_lock(priv, &flags) != 0) | ||
1216 | return -EBUSY; | ||
1217 | |||
1218 | err = hermes_read_wordrec(hw, USER_BAP, HERMES_RID_SHORTRETRYLIMIT, | ||
1219 | &short_limit); | ||
1220 | if (err) | ||
1221 | goto out; | ||
1222 | |||
1223 | err = hermes_read_wordrec(hw, USER_BAP, HERMES_RID_LONGRETRYLIMIT, | ||
1224 | &long_limit); | ||
1225 | if (err) | ||
1226 | goto out; | ||
1227 | |||
1228 | err = hermes_read_wordrec(hw, USER_BAP, HERMES_RID_MAXTRANSMITLIFETIME, | ||
1229 | &lifetime); | ||
1230 | if (err) | ||
1231 | goto out; | ||
1232 | |||
1233 | rrq->disabled = 0; /* Can't be disabled */ | ||
1234 | |||
1235 | /* Note : by default, display the retry number */ | ||
1236 | if ((rrq->flags & IW_RETRY_TYPE) == IW_RETRY_LIFETIME) { | ||
1237 | rrq->flags = IW_RETRY_LIFETIME; | ||
1238 | rrq->value = lifetime * 1000; /* ??? */ | ||
1239 | } else { | ||
1240 | /* By default, display the min number */ | ||
1241 | if ((rrq->flags & IW_RETRY_LONG)) { | ||
1242 | rrq->flags = IW_RETRY_LIMIT | IW_RETRY_LONG; | ||
1243 | rrq->value = long_limit; | ||
1244 | } else { | ||
1245 | rrq->flags = IW_RETRY_LIMIT; | ||
1246 | rrq->value = short_limit; | ||
1247 | if (short_limit != long_limit) | ||
1248 | rrq->flags |= IW_RETRY_SHORT; | ||
1249 | } | ||
1250 | } | ||
1251 | |||
1252 | out: | ||
1253 | orinoco_unlock(priv, &flags); | ||
1254 | |||
1255 | return err; | ||
1256 | } | ||
1257 | |||
1258 | static int orinoco_ioctl_reset(struct net_device *dev, | 1085 | static int orinoco_ioctl_reset(struct net_device *dev, |
1259 | struct iw_request_info *info, | 1086 | struct iw_request_info *info, |
1260 | void *wrqu, | 1087 | void *wrqu, |
@@ -1528,11 +1355,11 @@ static const iw_handler orinoco_handler[] = { | |||
1528 | IW_HANDLER(SIOCGIWESSID, (iw_handler)orinoco_ioctl_getessid), | 1355 | IW_HANDLER(SIOCGIWESSID, (iw_handler)orinoco_ioctl_getessid), |
1529 | IW_HANDLER(SIOCSIWRATE, (iw_handler)orinoco_ioctl_setrate), | 1356 | IW_HANDLER(SIOCSIWRATE, (iw_handler)orinoco_ioctl_setrate), |
1530 | IW_HANDLER(SIOCGIWRATE, (iw_handler)orinoco_ioctl_getrate), | 1357 | IW_HANDLER(SIOCGIWRATE, (iw_handler)orinoco_ioctl_getrate), |
1531 | IW_HANDLER(SIOCSIWRTS, (iw_handler)orinoco_ioctl_setrts), | 1358 | IW_HANDLER(SIOCSIWRTS, (iw_handler)cfg80211_wext_siwrts), |
1532 | IW_HANDLER(SIOCGIWRTS, (iw_handler)orinoco_ioctl_getrts), | 1359 | IW_HANDLER(SIOCGIWRTS, (iw_handler)cfg80211_wext_giwrts), |
1533 | IW_HANDLER(SIOCSIWFRAG, (iw_handler)orinoco_ioctl_setfrag), | 1360 | IW_HANDLER(SIOCSIWFRAG, (iw_handler)cfg80211_wext_siwfrag), |
1534 | IW_HANDLER(SIOCGIWFRAG, (iw_handler)orinoco_ioctl_getfrag), | 1361 | IW_HANDLER(SIOCGIWFRAG, (iw_handler)cfg80211_wext_giwfrag), |
1535 | IW_HANDLER(SIOCGIWRETRY, (iw_handler)orinoco_ioctl_getretry), | 1362 | IW_HANDLER(SIOCGIWRETRY, (iw_handler)cfg80211_wext_giwretry), |
1536 | IW_HANDLER(SIOCSIWENCODE, (iw_handler)orinoco_ioctl_setiwencode), | 1363 | IW_HANDLER(SIOCSIWENCODE, (iw_handler)orinoco_ioctl_setiwencode), |
1537 | IW_HANDLER(SIOCGIWENCODE, (iw_handler)orinoco_ioctl_getiwencode), | 1364 | IW_HANDLER(SIOCGIWENCODE, (iw_handler)orinoco_ioctl_getiwencode), |
1538 | IW_HANDLER(SIOCSIWPOWER, (iw_handler)orinoco_ioctl_setpower), | 1365 | IW_HANDLER(SIOCSIWPOWER, (iw_handler)orinoco_ioctl_setpower), |
diff --git a/drivers/net/wireless/p54/p54pci.c b/drivers/net/wireless/p54/p54pci.c index 86f3e9ac4c7a..679da7e7522e 100644 --- a/drivers/net/wireless/p54/p54pci.c +++ b/drivers/net/wireless/p54/p54pci.c | |||
@@ -140,7 +140,7 @@ static void p54p_refill_rx_ring(struct ieee80211_hw *dev, | |||
140 | 140 | ||
141 | idx = le32_to_cpu(ring_control->host_idx[ring_index]); | 141 | idx = le32_to_cpu(ring_control->host_idx[ring_index]); |
142 | limit = idx; | 142 | limit = idx; |
143 | limit -= le32_to_cpu(index); | 143 | limit -= index; |
144 | limit = ring_limit - limit; | 144 | limit = ring_limit - limit; |
145 | 145 | ||
146 | i = idx % ring_limit; | 146 | i = idx % ring_limit; |
diff --git a/drivers/net/wireless/rt2x00/rt2800pci.c b/drivers/net/wireless/rt2x00/rt2800pci.c index 2131f8f0c502..0e52f174896c 100644 --- a/drivers/net/wireless/rt2x00/rt2800pci.c +++ b/drivers/net/wireless/rt2x00/rt2800pci.c | |||
@@ -613,15 +613,23 @@ static int rt2800pci_set_device_state(struct rt2x00_dev *rt2x00dev, | |||
613 | /* | 613 | /* |
614 | * TX descriptor initialization | 614 | * TX descriptor initialization |
615 | */ | 615 | */ |
616 | static void rt2800pci_write_tx_desc(struct rt2x00_dev *rt2x00dev, | 616 | static int rt2800pci_write_tx_data(struct queue_entry* entry, |
617 | struct sk_buff *skb, | 617 | struct txentry_desc *txdesc) |
618 | struct txentry_desc *txdesc) | ||
619 | { | 618 | { |
620 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); | 619 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; |
621 | __le32 *txd = skbdesc->desc; | 620 | struct sk_buff *skb = entry->skb; |
622 | __le32 *txwi = (__le32 *)(skb->data - rt2x00dev->ops->extra_tx_headroom); | 621 | struct skb_frame_desc *skbdesc; |
622 | int ret; | ||
623 | __le32 *txwi; | ||
623 | u32 word; | 624 | u32 word; |
624 | 625 | ||
626 | ret = rt2x00pci_write_tx_data(entry, txdesc); | ||
627 | if (ret) | ||
628 | return ret; | ||
629 | |||
630 | skbdesc = get_skb_frame_desc(skb); | ||
631 | txwi = (__le32 *)(skb->data - rt2x00dev->ops->extra_tx_headroom); | ||
632 | |||
625 | /* | 633 | /* |
626 | * Initialize TX Info descriptor | 634 | * Initialize TX Info descriptor |
627 | */ | 635 | */ |
@@ -670,6 +678,18 @@ static void rt2800pci_write_tx_desc(struct rt2x00_dev *rt2x00dev, | |||
670 | _rt2x00_desc_write(txwi, 2, 0 /* skbdesc->iv[0] */); | 678 | _rt2x00_desc_write(txwi, 2, 0 /* skbdesc->iv[0] */); |
671 | _rt2x00_desc_write(txwi, 3, 0 /* skbdesc->iv[1] */); | 679 | _rt2x00_desc_write(txwi, 3, 0 /* skbdesc->iv[1] */); |
672 | 680 | ||
681 | return 0; | ||
682 | } | ||
683 | |||
684 | |||
685 | static void rt2800pci_write_tx_desc(struct rt2x00_dev *rt2x00dev, | ||
686 | struct sk_buff *skb, | ||
687 | struct txentry_desc *txdesc) | ||
688 | { | ||
689 | struct skb_frame_desc *skbdesc = get_skb_frame_desc(skb); | ||
690 | __le32 *txd = skbdesc->desc; | ||
691 | u32 word; | ||
692 | |||
673 | /* | 693 | /* |
674 | * The buffers pointed by SD_PTR0/SD_LEN0 and SD_PTR1/SD_LEN1 | 694 | * The buffers pointed by SD_PTR0/SD_LEN0 and SD_PTR1/SD_LEN1 |
675 | * must contains a TXWI structure + 802.11 header + padding + 802.11 | 695 | * must contains a TXWI structure + 802.11 header + padding + 802.11 |
@@ -1135,7 +1155,7 @@ static const struct rt2x00lib_ops rt2800pci_rt2x00_ops = { | |||
1135 | .reset_tuner = rt2800_reset_tuner, | 1155 | .reset_tuner = rt2800_reset_tuner, |
1136 | .link_tuner = rt2800_link_tuner, | 1156 | .link_tuner = rt2800_link_tuner, |
1137 | .write_tx_desc = rt2800pci_write_tx_desc, | 1157 | .write_tx_desc = rt2800pci_write_tx_desc, |
1138 | .write_tx_data = rt2x00pci_write_tx_data, | 1158 | .write_tx_data = rt2800pci_write_tx_data, |
1139 | .write_beacon = rt2800pci_write_beacon, | 1159 | .write_beacon = rt2800pci_write_beacon, |
1140 | .kick_tx_queue = rt2800pci_kick_tx_queue, | 1160 | .kick_tx_queue = rt2800pci_kick_tx_queue, |
1141 | .kill_tx_queue = rt2800pci_kill_tx_queue, | 1161 | .kill_tx_queue = rt2800pci_kill_tx_queue, |
diff --git a/drivers/net/wireless/rt2x00/rt2800usb.c b/drivers/net/wireless/rt2x00/rt2800usb.c index 6b809ab42c61..95c8a6134ff8 100644 --- a/drivers/net/wireless/rt2x00/rt2800usb.c +++ b/drivers/net/wireless/rt2x00/rt2800usb.c | |||
@@ -806,6 +806,10 @@ static struct usb_device_id rt2800usb_device_table[] = { | |||
806 | { USB_DEVICE(0x07b8, 0x2870), USB_DEVICE_DATA(&rt2800usb_ops) }, | 806 | { USB_DEVICE(0x07b8, 0x2870), USB_DEVICE_DATA(&rt2800usb_ops) }, |
807 | { USB_DEVICE(0x07b8, 0x2770), USB_DEVICE_DATA(&rt2800usb_ops) }, | 807 | { USB_DEVICE(0x07b8, 0x2770), USB_DEVICE_DATA(&rt2800usb_ops) }, |
808 | { USB_DEVICE(0x1482, 0x3c09), USB_DEVICE_DATA(&rt2800usb_ops) }, | 808 | { USB_DEVICE(0x1482, 0x3c09), USB_DEVICE_DATA(&rt2800usb_ops) }, |
809 | /* Allwin */ | ||
810 | { USB_DEVICE(0x8516, 0x2070), USB_DEVICE_DATA(&rt2800usb_ops) }, | ||
811 | { USB_DEVICE(0x8516, 0x2770), USB_DEVICE_DATA(&rt2800usb_ops) }, | ||
812 | { USB_DEVICE(0x8516, 0x2870), USB_DEVICE_DATA(&rt2800usb_ops) }, | ||
809 | /* Amit */ | 813 | /* Amit */ |
810 | { USB_DEVICE(0x15c5, 0x0008), USB_DEVICE_DATA(&rt2800usb_ops) }, | 814 | { USB_DEVICE(0x15c5, 0x0008), USB_DEVICE_DATA(&rt2800usb_ops) }, |
811 | /* Askey */ | 815 | /* Askey */ |
@@ -848,6 +852,11 @@ static struct usb_device_id rt2800usb_device_table[] = { | |||
848 | /* Hawking */ | 852 | /* Hawking */ |
849 | { USB_DEVICE(0x0e66, 0x0001), USB_DEVICE_DATA(&rt2800usb_ops) }, | 853 | { USB_DEVICE(0x0e66, 0x0001), USB_DEVICE_DATA(&rt2800usb_ops) }, |
850 | { USB_DEVICE(0x0e66, 0x0003), USB_DEVICE_DATA(&rt2800usb_ops) }, | 854 | { USB_DEVICE(0x0e66, 0x0003), USB_DEVICE_DATA(&rt2800usb_ops) }, |
855 | { USB_DEVICE(0x0e66, 0x0009), USB_DEVICE_DATA(&rt2800usb_ops) }, | ||
856 | { USB_DEVICE(0x0e66, 0x000b), USB_DEVICE_DATA(&rt2800usb_ops) }, | ||
857 | { USB_DEVICE(0x0e66, 0x0013), USB_DEVICE_DATA(&rt2800usb_ops) }, | ||
858 | { USB_DEVICE(0x0e66, 0x0017), USB_DEVICE_DATA(&rt2800usb_ops) }, | ||
859 | { USB_DEVICE(0x0e66, 0x0018), USB_DEVICE_DATA(&rt2800usb_ops) }, | ||
851 | /* Linksys */ | 860 | /* Linksys */ |
852 | { USB_DEVICE(0x1737, 0x0070), USB_DEVICE_DATA(&rt2800usb_ops) }, | 861 | { USB_DEVICE(0x1737, 0x0070), USB_DEVICE_DATA(&rt2800usb_ops) }, |
853 | { USB_DEVICE(0x1737, 0x0071), USB_DEVICE_DATA(&rt2800usb_ops) }, | 862 | { USB_DEVICE(0x1737, 0x0071), USB_DEVICE_DATA(&rt2800usb_ops) }, |
@@ -907,6 +916,10 @@ static struct usb_device_id rt2800usb_device_table[] = { | |||
907 | { USB_DEVICE(0x07b8, 0x3072), USB_DEVICE_DATA(&rt2800usb_ops) }, | 916 | { USB_DEVICE(0x07b8, 0x3072), USB_DEVICE_DATA(&rt2800usb_ops) }, |
908 | /* AirTies */ | 917 | /* AirTies */ |
909 | { USB_DEVICE(0x1eda, 0x2310), USB_DEVICE_DATA(&rt2800usb_ops) }, | 918 | { USB_DEVICE(0x1eda, 0x2310), USB_DEVICE_DATA(&rt2800usb_ops) }, |
919 | /* Allwin */ | ||
920 | { USB_DEVICE(0x8516, 0x3070), USB_DEVICE_DATA(&rt2800usb_ops) }, | ||
921 | { USB_DEVICE(0x8516, 0x3071), USB_DEVICE_DATA(&rt2800usb_ops) }, | ||
922 | { USB_DEVICE(0x8516, 0x3072), USB_DEVICE_DATA(&rt2800usb_ops) }, | ||
910 | /* ASUS */ | 923 | /* ASUS */ |
911 | { USB_DEVICE(0x0b05, 0x1784), USB_DEVICE_DATA(&rt2800usb_ops) }, | 924 | { USB_DEVICE(0x0b05, 0x1784), USB_DEVICE_DATA(&rt2800usb_ops) }, |
912 | /* AzureWave */ | 925 | /* AzureWave */ |
@@ -991,6 +1004,8 @@ static struct usb_device_id rt2800usb_device_table[] = { | |||
991 | { USB_DEVICE(0x5a57, 0x5257), USB_DEVICE_DATA(&rt2800usb_ops) }, | 1004 | { USB_DEVICE(0x5a57, 0x5257), USB_DEVICE_DATA(&rt2800usb_ops) }, |
992 | #endif | 1005 | #endif |
993 | #ifdef CONFIG_RT2800USB_RT35XX | 1006 | #ifdef CONFIG_RT2800USB_RT35XX |
1007 | /* Allwin */ | ||
1008 | { USB_DEVICE(0x8516, 0x3572), USB_DEVICE_DATA(&rt2800usb_ops) }, | ||
994 | /* Askey */ | 1009 | /* Askey */ |
995 | { USB_DEVICE(0x1690, 0x0744), USB_DEVICE_DATA(&rt2800usb_ops) }, | 1010 | { USB_DEVICE(0x1690, 0x0744), USB_DEVICE_DATA(&rt2800usb_ops) }, |
996 | /* Cisco */ | 1011 | /* Cisco */ |
@@ -1014,14 +1029,6 @@ static struct usb_device_id rt2800usb_device_table[] = { | |||
1014 | * Unclear what kind of devices these are (they aren't supported by the | 1029 | * Unclear what kind of devices these are (they aren't supported by the |
1015 | * vendor driver). | 1030 | * vendor driver). |
1016 | */ | 1031 | */ |
1017 | /* Allwin */ | ||
1018 | { USB_DEVICE(0x8516, 0x2070), USB_DEVICE_DATA(&rt2800usb_ops) }, | ||
1019 | { USB_DEVICE(0x8516, 0x2770), USB_DEVICE_DATA(&rt2800usb_ops) }, | ||
1020 | { USB_DEVICE(0x8516, 0x2870), USB_DEVICE_DATA(&rt2800usb_ops) }, | ||
1021 | { USB_DEVICE(0x8516, 0x3070), USB_DEVICE_DATA(&rt2800usb_ops) }, | ||
1022 | { USB_DEVICE(0x8516, 0x3071), USB_DEVICE_DATA(&rt2800usb_ops) }, | ||
1023 | { USB_DEVICE(0x8516, 0x3072), USB_DEVICE_DATA(&rt2800usb_ops) }, | ||
1024 | { USB_DEVICE(0x8516, 0x3572), USB_DEVICE_DATA(&rt2800usb_ops) }, | ||
1025 | /* Amigo */ | 1032 | /* Amigo */ |
1026 | { USB_DEVICE(0x0e0b, 0x9031), USB_DEVICE_DATA(&rt2800usb_ops) }, | 1033 | { USB_DEVICE(0x0e0b, 0x9031), USB_DEVICE_DATA(&rt2800usb_ops) }, |
1027 | { USB_DEVICE(0x0e0b, 0x9041), USB_DEVICE_DATA(&rt2800usb_ops) }, | 1034 | { USB_DEVICE(0x0e0b, 0x9041), USB_DEVICE_DATA(&rt2800usb_ops) }, |
@@ -1057,9 +1064,6 @@ static struct usb_device_id rt2800usb_device_table[] = { | |||
1057 | { USB_DEVICE(0x15a9, 0x0010), USB_DEVICE_DATA(&rt2800usb_ops) }, | 1064 | { USB_DEVICE(0x15a9, 0x0010), USB_DEVICE_DATA(&rt2800usb_ops) }, |
1058 | /* Gigabyte */ | 1065 | /* Gigabyte */ |
1059 | { USB_DEVICE(0x1044, 0x800c), USB_DEVICE_DATA(&rt2800usb_ops) }, | 1066 | { USB_DEVICE(0x1044, 0x800c), USB_DEVICE_DATA(&rt2800usb_ops) }, |
1060 | /* Hawking */ | ||
1061 | { USB_DEVICE(0x0e66, 0x0009), USB_DEVICE_DATA(&rt2800usb_ops) }, | ||
1062 | { USB_DEVICE(0x0e66, 0x000b), USB_DEVICE_DATA(&rt2800usb_ops) }, | ||
1063 | /* LevelOne */ | 1067 | /* LevelOne */ |
1064 | { USB_DEVICE(0x1740, 0x0605), USB_DEVICE_DATA(&rt2800usb_ops) }, | 1068 | { USB_DEVICE(0x1740, 0x0605), USB_DEVICE_DATA(&rt2800usb_ops) }, |
1065 | { USB_DEVICE(0x1740, 0x0615), USB_DEVICE_DATA(&rt2800usb_ops) }, | 1069 | { USB_DEVICE(0x1740, 0x0615), USB_DEVICE_DATA(&rt2800usb_ops) }, |
diff --git a/drivers/net/wireless/rt2x00/rt2x00.h b/drivers/net/wireless/rt2x00/rt2x00.h index 4de505b98331..4f9b666f7a7f 100644 --- a/drivers/net/wireless/rt2x00/rt2x00.h +++ b/drivers/net/wireless/rt2x00/rt2x00.h | |||
@@ -549,7 +549,8 @@ struct rt2x00lib_ops { | |||
549 | void (*write_tx_desc) (struct rt2x00_dev *rt2x00dev, | 549 | void (*write_tx_desc) (struct rt2x00_dev *rt2x00dev, |
550 | struct sk_buff *skb, | 550 | struct sk_buff *skb, |
551 | struct txentry_desc *txdesc); | 551 | struct txentry_desc *txdesc); |
552 | int (*write_tx_data) (struct queue_entry *entry); | 552 | int (*write_tx_data) (struct queue_entry *entry, |
553 | struct txentry_desc *txdesc); | ||
553 | void (*write_beacon) (struct queue_entry *entry); | 554 | void (*write_beacon) (struct queue_entry *entry); |
554 | int (*get_tx_data_len) (struct queue_entry *entry); | 555 | int (*get_tx_data_len) (struct queue_entry *entry); |
555 | void (*kick_tx_queue) (struct rt2x00_dev *rt2x00dev, | 556 | void (*kick_tx_queue) (struct rt2x00_dev *rt2x00dev, |
diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.c b/drivers/net/wireless/rt2x00/rt2x00pci.c index cf3f1c0c4382..4b941e9c794e 100644 --- a/drivers/net/wireless/rt2x00/rt2x00pci.c +++ b/drivers/net/wireless/rt2x00/rt2x00pci.c | |||
@@ -63,7 +63,8 @@ EXPORT_SYMBOL_GPL(rt2x00pci_regbusy_read); | |||
63 | /* | 63 | /* |
64 | * TX data handlers. | 64 | * TX data handlers. |
65 | */ | 65 | */ |
66 | int rt2x00pci_write_tx_data(struct queue_entry *entry) | 66 | int rt2x00pci_write_tx_data(struct queue_entry *entry, |
67 | struct txentry_desc *txdesc) | ||
67 | { | 68 | { |
68 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; | 69 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; |
69 | struct queue_entry_priv_pci *entry_priv = entry->priv_data; | 70 | struct queue_entry_priv_pci *entry_priv = entry->priv_data; |
diff --git a/drivers/net/wireless/rt2x00/rt2x00pci.h b/drivers/net/wireless/rt2x00/rt2x00pci.h index 8149ff68410a..51bcef3839ce 100644 --- a/drivers/net/wireless/rt2x00/rt2x00pci.h +++ b/drivers/net/wireless/rt2x00/rt2x00pci.h | |||
@@ -92,7 +92,8 @@ int rt2x00pci_regbusy_read(struct rt2x00_dev *rt2x00dev, | |||
92 | * This function will initialize the DMA and skb descriptor | 92 | * This function will initialize the DMA and skb descriptor |
93 | * to prepare the entry for the actual TX operation. | 93 | * to prepare the entry for the actual TX operation. |
94 | */ | 94 | */ |
95 | int rt2x00pci_write_tx_data(struct queue_entry *entry); | 95 | int rt2x00pci_write_tx_data(struct queue_entry *entry, |
96 | struct txentry_desc *txdesc); | ||
96 | 97 | ||
97 | /** | 98 | /** |
98 | * struct queue_entry_priv_pci: Per entry PCI specific information | 99 | * struct queue_entry_priv_pci: Per entry PCI specific information |
diff --git a/drivers/net/wireless/rt2x00/rt2x00queue.c b/drivers/net/wireless/rt2x00/rt2x00queue.c index a0bd36fc4d2e..91b7fb99ceb4 100644 --- a/drivers/net/wireless/rt2x00/rt2x00queue.c +++ b/drivers/net/wireless/rt2x00/rt2x00queue.c | |||
@@ -526,7 +526,8 @@ int rt2x00queue_write_tx_frame(struct data_queue *queue, struct sk_buff *skb, | |||
526 | * call failed. Since we always return NETDEV_TX_OK to mac80211, | 526 | * call failed. Since we always return NETDEV_TX_OK to mac80211, |
527 | * this frame will simply be dropped. | 527 | * this frame will simply be dropped. |
528 | */ | 528 | */ |
529 | if (unlikely(queue->rt2x00dev->ops->lib->write_tx_data(entry))) { | 529 | if (unlikely(queue->rt2x00dev->ops->lib->write_tx_data(entry, |
530 | &txdesc))) { | ||
530 | clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags); | 531 | clear_bit(ENTRY_OWNER_DEVICE_DATA, &entry->flags); |
531 | entry->skb = NULL; | 532 | entry->skb = NULL; |
532 | return -EIO; | 533 | return -EIO; |
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.c b/drivers/net/wireless/rt2x00/rt2x00usb.c index f9a7f8b17411..da111c0c2928 100644 --- a/drivers/net/wireless/rt2x00/rt2x00usb.c +++ b/drivers/net/wireless/rt2x00/rt2x00usb.c | |||
@@ -216,7 +216,8 @@ static void rt2x00usb_interrupt_txdone(struct urb *urb) | |||
216 | rt2x00lib_txdone(entry, &txdesc); | 216 | rt2x00lib_txdone(entry, &txdesc); |
217 | } | 217 | } |
218 | 218 | ||
219 | int rt2x00usb_write_tx_data(struct queue_entry *entry) | 219 | int rt2x00usb_write_tx_data(struct queue_entry *entry, |
220 | struct txentry_desc *txdesc) | ||
220 | { | 221 | { |
221 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; | 222 | struct rt2x00_dev *rt2x00dev = entry->queue->rt2x00dev; |
222 | struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev); | 223 | struct usb_device *usb_dev = to_usb_device_intf(rt2x00dev->dev); |
diff --git a/drivers/net/wireless/rt2x00/rt2x00usb.h b/drivers/net/wireless/rt2x00/rt2x00usb.h index 3da6841b5d42..621d0f829251 100644 --- a/drivers/net/wireless/rt2x00/rt2x00usb.h +++ b/drivers/net/wireless/rt2x00/rt2x00usb.h | |||
@@ -376,7 +376,8 @@ void rt2x00usb_disable_radio(struct rt2x00_dev *rt2x00dev); | |||
376 | * This function will initialize the URB and skb descriptor | 376 | * This function will initialize the URB and skb descriptor |
377 | * to prepare the entry for the actual TX operation. | 377 | * to prepare the entry for the actual TX operation. |
378 | */ | 378 | */ |
379 | int rt2x00usb_write_tx_data(struct queue_entry *entry); | 379 | int rt2x00usb_write_tx_data(struct queue_entry *entry, |
380 | struct txentry_desc *txdesc); | ||
380 | 381 | ||
381 | /** | 382 | /** |
382 | * struct queue_entry_priv_usb: Per entry USB specific information | 383 | * struct queue_entry_priv_usb: Per entry USB specific information |
diff --git a/drivers/net/wireless/rtl818x/Kconfig b/drivers/net/wireless/rtl818x/Kconfig new file mode 100644 index 000000000000..17d80fe556de --- /dev/null +++ b/drivers/net/wireless/rtl818x/Kconfig | |||
@@ -0,0 +1,88 @@ | |||
1 | # | ||
2 | # RTL818X Wireless LAN device configuration | ||
3 | # | ||
4 | config RTL8180 | ||
5 | tristate "Realtek 8180/8185 PCI support" | ||
6 | depends on MAC80211 && PCI && EXPERIMENTAL | ||
7 | select EEPROM_93CX6 | ||
8 | ---help--- | ||
9 | This is a driver for RTL8180 and RTL8185 based cards. | ||
10 | These are PCI based chips found in cards such as: | ||
11 | |||
12 | (RTL8185 802.11g) | ||
13 | A-Link WL54PC | ||
14 | |||
15 | (RTL8180 802.11b) | ||
16 | Belkin F5D6020 v3 | ||
17 | Belkin F5D6020 v3 | ||
18 | Dlink DWL-610 | ||
19 | Dlink DWL-510 | ||
20 | Netgear MA521 | ||
21 | Level-One WPC-0101 | ||
22 | Acer Aspire 1357 LMi | ||
23 | VCTnet PC-11B1 | ||
24 | Ovislink AirLive WL-1120PCM | ||
25 | Mentor WL-PCI | ||
26 | Linksys WPC11 v4 | ||
27 | TrendNET TEW-288PI | ||
28 | D-Link DWL-520 Rev D | ||
29 | Repotec RP-WP7126 | ||
30 | TP-Link TL-WN250/251 | ||
31 | Zonet ZEW1000 | ||
32 | Longshine LCS-8031-R | ||
33 | HomeLine HLW-PCC200 | ||
34 | GigaFast WF721-AEX | ||
35 | Planet WL-3553 | ||
36 | Encore ENLWI-PCI1-NT | ||
37 | TrendNET TEW-266PC | ||
38 | Gigabyte GN-WLMR101 | ||
39 | Siemens-fujitsu Amilo D1840W | ||
40 | Edimax EW-7126 | ||
41 | PheeNet WL-11PCIR | ||
42 | Tonze PC-2100T | ||
43 | Planet WL-8303 | ||
44 | Dlink DWL-650 v M1 | ||
45 | Edimax EW-7106 | ||
46 | Q-Tec 770WC | ||
47 | Topcom Skyr@cer 4011b | ||
48 | Roper FreeLan 802.11b (edition 2004) | ||
49 | Wistron Neweb Corp CB-200B | ||
50 | Pentagram HorNET | ||
51 | QTec 775WC | ||
52 | TwinMOS Booming B Series | ||
53 | Micronet SP906BB | ||
54 | Sweex LC700010 | ||
55 | Surecom EP-9428 | ||
56 | Safecom SWLCR-1100 | ||
57 | |||
58 | Thanks to Realtek for their support! | ||
59 | |||
60 | config RTL8187 | ||
61 | tristate "Realtek 8187 and 8187B USB support" | ||
62 | depends on MAC80211 && USB | ||
63 | select EEPROM_93CX6 | ||
64 | ---help--- | ||
65 | This is a driver for RTL8187 and RTL8187B based cards. | ||
66 | These are USB based chips found in devices such as: | ||
67 | |||
68 | Netgear WG111v2 | ||
69 | Level 1 WNC-0301USB | ||
70 | Micronet SP907GK V5 | ||
71 | Encore ENUWI-G2 | ||
72 | Trendnet TEW-424UB | ||
73 | ASUS P5B Deluxe/P5K Premium motherboards | ||
74 | Toshiba Satellite Pro series of laptops | ||
75 | Asus Wireless Link | ||
76 | Linksys WUSB54GC-EU v2 | ||
77 | (v1 = rt73usb; v3 is rt2070-based, | ||
78 | use staging/rt3070 or try rt2800usb) | ||
79 | |||
80 | Thanks to Realtek for their support! | ||
81 | |||
82 | # If possible, automatically enable LEDs for RTL8187. | ||
83 | |||
84 | config RTL8187_LEDS | ||
85 | bool | ||
86 | depends on RTL8187 && MAC80211_LEDS && (LEDS_CLASS = y || LEDS_CLASS = RTL8187) | ||
87 | default y | ||
88 | |||
diff --git a/drivers/net/wireless/wl12xx/wl1251_main.c b/drivers/net/wireless/wl12xx/wl1251_main.c index 4d479708158d..51614d181ccb 100644 --- a/drivers/net/wireless/wl12xx/wl1251_main.c +++ b/drivers/net/wireless/wl12xx/wl1251_main.c | |||
@@ -1196,6 +1196,66 @@ static const struct ieee80211_ops wl1251_ops = { | |||
1196 | .conf_tx = wl1251_op_conf_tx, | 1196 | .conf_tx = wl1251_op_conf_tx, |
1197 | }; | 1197 | }; |
1198 | 1198 | ||
1199 | static int wl1251_read_eeprom_byte(struct wl1251 *wl, off_t offset, u8 *data) | ||
1200 | { | ||
1201 | unsigned long timeout; | ||
1202 | |||
1203 | wl1251_reg_write32(wl, EE_ADDR, offset); | ||
1204 | wl1251_reg_write32(wl, EE_CTL, EE_CTL_READ); | ||
1205 | |||
1206 | /* EE_CTL_READ clears when data is ready */ | ||
1207 | timeout = jiffies + msecs_to_jiffies(100); | ||
1208 | while (1) { | ||
1209 | if (!(wl1251_reg_read32(wl, EE_CTL) & EE_CTL_READ)) | ||
1210 | break; | ||
1211 | |||
1212 | if (time_after(jiffies, timeout)) | ||
1213 | return -ETIMEDOUT; | ||
1214 | |||
1215 | msleep(1); | ||
1216 | } | ||
1217 | |||
1218 | *data = wl1251_reg_read32(wl, EE_DATA); | ||
1219 | return 0; | ||
1220 | } | ||
1221 | |||
1222 | static int wl1251_read_eeprom(struct wl1251 *wl, off_t offset, | ||
1223 | u8 *data, size_t len) | ||
1224 | { | ||
1225 | size_t i; | ||
1226 | int ret; | ||
1227 | |||
1228 | wl1251_reg_write32(wl, EE_START, 0); | ||
1229 | |||
1230 | for (i = 0; i < len; i++) { | ||
1231 | ret = wl1251_read_eeprom_byte(wl, offset + i, &data[i]); | ||
1232 | if (ret < 0) | ||
1233 | return ret; | ||
1234 | } | ||
1235 | |||
1236 | return 0; | ||
1237 | } | ||
1238 | |||
1239 | static int wl1251_read_eeprom_mac(struct wl1251 *wl) | ||
1240 | { | ||
1241 | u8 mac[ETH_ALEN]; | ||
1242 | int i, ret; | ||
1243 | |||
1244 | wl1251_set_partition(wl, 0, 0, REGISTERS_BASE, REGISTERS_DOWN_SIZE); | ||
1245 | |||
1246 | ret = wl1251_read_eeprom(wl, 0x1c, mac, sizeof(mac)); | ||
1247 | if (ret < 0) { | ||
1248 | wl1251_warning("failed to read MAC address from EEPROM"); | ||
1249 | return ret; | ||
1250 | } | ||
1251 | |||
1252 | /* MAC is stored in reverse order */ | ||
1253 | for (i = 0; i < ETH_ALEN; i++) | ||
1254 | wl->mac_addr[i] = mac[ETH_ALEN - i - 1]; | ||
1255 | |||
1256 | return 0; | ||
1257 | } | ||
1258 | |||
1199 | static int wl1251_register_hw(struct wl1251 *wl) | 1259 | static int wl1251_register_hw(struct wl1251 *wl) |
1200 | { | 1260 | { |
1201 | int ret; | 1261 | int ret; |
@@ -1242,6 +1302,9 @@ int wl1251_init_ieee80211(struct wl1251 *wl) | |||
1242 | 1302 | ||
1243 | wl->hw->queues = 4; | 1303 | wl->hw->queues = 4; |
1244 | 1304 | ||
1305 | if (wl->use_eeprom) | ||
1306 | wl1251_read_eeprom_mac(wl); | ||
1307 | |||
1245 | ret = wl1251_register_hw(wl); | 1308 | ret = wl1251_register_hw(wl); |
1246 | if (ret) | 1309 | if (ret) |
1247 | goto out; | 1310 | goto out; |
diff --git a/drivers/net/wireless/wl12xx/wl1251_reg.h b/drivers/net/wireless/wl12xx/wl1251_reg.h index 0ca3b4326056..d16edd9bf06c 100644 --- a/drivers/net/wireless/wl12xx/wl1251_reg.h +++ b/drivers/net/wireless/wl12xx/wl1251_reg.h | |||
@@ -46,7 +46,14 @@ | |||
46 | #define SOR_CFG (REGISTERS_BASE + 0x0800) | 46 | #define SOR_CFG (REGISTERS_BASE + 0x0800) |
47 | #define ECPU_CTRL (REGISTERS_BASE + 0x0804) | 47 | #define ECPU_CTRL (REGISTERS_BASE + 0x0804) |
48 | #define HI_CFG (REGISTERS_BASE + 0x0808) | 48 | #define HI_CFG (REGISTERS_BASE + 0x0808) |
49 | |||
50 | /* EEPROM registers */ | ||
49 | #define EE_START (REGISTERS_BASE + 0x080C) | 51 | #define EE_START (REGISTERS_BASE + 0x080C) |
52 | #define EE_CTL (REGISTERS_BASE + 0x2000) | ||
53 | #define EE_DATA (REGISTERS_BASE + 0x2004) | ||
54 | #define EE_ADDR (REGISTERS_BASE + 0x2008) | ||
55 | |||
56 | #define EE_CTL_READ 2 | ||
50 | 57 | ||
51 | #define CHIP_ID_B (REGISTERS_BASE + 0x5674) | 58 | #define CHIP_ID_B (REGISTERS_BASE + 0x5674) |
52 | 59 | ||
diff --git a/drivers/net/wireless/wl12xx/wl1251_sdio.c b/drivers/net/wireless/wl12xx/wl1251_sdio.c index 2051ef06e9ec..d234285c2c81 100644 --- a/drivers/net/wireless/wl12xx/wl1251_sdio.c +++ b/drivers/net/wireless/wl12xx/wl1251_sdio.c | |||
@@ -23,6 +23,9 @@ | |||
23 | #include <linux/mod_devicetable.h> | 23 | #include <linux/mod_devicetable.h> |
24 | #include <linux/mmc/sdio_func.h> | 24 | #include <linux/mmc/sdio_func.h> |
25 | #include <linux/mmc/sdio_ids.h> | 25 | #include <linux/mmc/sdio_ids.h> |
26 | #include <linux/platform_device.h> | ||
27 | #include <linux/spi/wl12xx.h> | ||
28 | #include <linux/irq.h> | ||
26 | 29 | ||
27 | #include "wl1251.h" | 30 | #include "wl1251.h" |
28 | 31 | ||
@@ -34,6 +37,8 @@ | |||
34 | #define SDIO_DEVICE_ID_TI_WL1251 0x9066 | 37 | #define SDIO_DEVICE_ID_TI_WL1251 0x9066 |
35 | #endif | 38 | #endif |
36 | 39 | ||
40 | static struct wl12xx_platform_data *wl12xx_board_data; | ||
41 | |||
37 | static struct sdio_func *wl_to_func(struct wl1251 *wl) | 42 | static struct sdio_func *wl_to_func(struct wl1251 *wl) |
38 | { | 43 | { |
39 | return wl->if_priv; | 44 | return wl->if_priv; |
@@ -130,18 +135,60 @@ static void wl1251_sdio_disable_irq(struct wl1251 *wl) | |||
130 | sdio_release_host(func); | 135 | sdio_release_host(func); |
131 | } | 136 | } |
132 | 137 | ||
138 | /* Interrupts when using dedicated WLAN_IRQ pin */ | ||
139 | static irqreturn_t wl1251_line_irq(int irq, void *cookie) | ||
140 | { | ||
141 | struct wl1251 *wl = cookie; | ||
142 | |||
143 | ieee80211_queue_work(wl->hw, &wl->irq_work); | ||
144 | |||
145 | return IRQ_HANDLED; | ||
146 | } | ||
147 | |||
148 | static void wl1251_enable_line_irq(struct wl1251 *wl) | ||
149 | { | ||
150 | return enable_irq(wl->irq); | ||
151 | } | ||
152 | |||
153 | static void wl1251_disable_line_irq(struct wl1251 *wl) | ||
154 | { | ||
155 | return disable_irq(wl->irq); | ||
156 | } | ||
157 | |||
133 | static void wl1251_sdio_set_power(bool enable) | 158 | static void wl1251_sdio_set_power(bool enable) |
134 | { | 159 | { |
135 | } | 160 | } |
136 | 161 | ||
137 | static const struct wl1251_if_operations wl1251_sdio_ops = { | 162 | static struct wl1251_if_operations wl1251_sdio_ops = { |
138 | .read = wl1251_sdio_read, | 163 | .read = wl1251_sdio_read, |
139 | .write = wl1251_sdio_write, | 164 | .write = wl1251_sdio_write, |
140 | .write_elp = wl1251_sdio_write_elp, | 165 | .write_elp = wl1251_sdio_write_elp, |
141 | .read_elp = wl1251_sdio_read_elp, | 166 | .read_elp = wl1251_sdio_read_elp, |
142 | .reset = wl1251_sdio_reset, | 167 | .reset = wl1251_sdio_reset, |
143 | .enable_irq = wl1251_sdio_enable_irq, | 168 | }; |
144 | .disable_irq = wl1251_sdio_disable_irq, | 169 | |
170 | static int wl1251_platform_probe(struct platform_device *pdev) | ||
171 | { | ||
172 | if (pdev->id != -1) { | ||
173 | wl1251_error("can only handle single device"); | ||
174 | return -ENODEV; | ||
175 | } | ||
176 | |||
177 | wl12xx_board_data = pdev->dev.platform_data; | ||
178 | return 0; | ||
179 | } | ||
180 | |||
181 | /* | ||
182 | * Dummy platform_driver for passing platform_data to this driver, | ||
183 | * until we have a way to pass this through SDIO subsystem or | ||
184 | * some other way. | ||
185 | */ | ||
186 | static struct platform_driver wl1251_platform_driver = { | ||
187 | .driver = { | ||
188 | .name = "wl1251_data", | ||
189 | .owner = THIS_MODULE, | ||
190 | }, | ||
191 | .probe = wl1251_platform_probe, | ||
145 | }; | 192 | }; |
146 | 193 | ||
147 | static int wl1251_sdio_probe(struct sdio_func *func, | 194 | static int wl1251_sdio_probe(struct sdio_func *func, |
@@ -163,20 +210,50 @@ static int wl1251_sdio_probe(struct sdio_func *func, | |||
163 | goto release; | 210 | goto release; |
164 | 211 | ||
165 | sdio_set_block_size(func, 512); | 212 | sdio_set_block_size(func, 512); |
213 | sdio_release_host(func); | ||
166 | 214 | ||
167 | SET_IEEE80211_DEV(hw, &func->dev); | 215 | SET_IEEE80211_DEV(hw, &func->dev); |
168 | wl->if_priv = func; | 216 | wl->if_priv = func; |
169 | wl->if_ops = &wl1251_sdio_ops; | 217 | wl->if_ops = &wl1251_sdio_ops; |
170 | wl->set_power = wl1251_sdio_set_power; | 218 | wl->set_power = wl1251_sdio_set_power; |
171 | 219 | ||
172 | sdio_release_host(func); | 220 | if (wl12xx_board_data != NULL) { |
221 | wl->set_power = wl12xx_board_data->set_power; | ||
222 | wl->irq = wl12xx_board_data->irq; | ||
223 | wl->use_eeprom = wl12xx_board_data->use_eeprom; | ||
224 | } | ||
225 | |||
226 | if (wl->irq) { | ||
227 | ret = request_irq(wl->irq, wl1251_line_irq, 0, "wl1251", wl); | ||
228 | if (ret < 0) { | ||
229 | wl1251_error("request_irq() failed: %d", ret); | ||
230 | goto disable; | ||
231 | } | ||
232 | |||
233 | set_irq_type(wl->irq, IRQ_TYPE_EDGE_RISING); | ||
234 | disable_irq(wl->irq); | ||
235 | |||
236 | wl1251_sdio_ops.enable_irq = wl1251_enable_line_irq; | ||
237 | wl1251_sdio_ops.disable_irq = wl1251_disable_line_irq; | ||
238 | |||
239 | wl1251_info("using dedicated interrupt line"); | ||
240 | } else { | ||
241 | wl1251_sdio_ops.enable_irq = wl1251_sdio_enable_irq; | ||
242 | wl1251_sdio_ops.disable_irq = wl1251_sdio_disable_irq; | ||
243 | |||
244 | wl1251_info("using SDIO interrupt"); | ||
245 | } | ||
246 | |||
173 | ret = wl1251_init_ieee80211(wl); | 247 | ret = wl1251_init_ieee80211(wl); |
174 | if (ret) | 248 | if (ret) |
175 | goto disable; | 249 | goto out_free_irq; |
176 | 250 | ||
177 | sdio_set_drvdata(func, wl); | 251 | sdio_set_drvdata(func, wl); |
178 | return ret; | 252 | return ret; |
179 | 253 | ||
254 | out_free_irq: | ||
255 | if (wl->irq) | ||
256 | free_irq(wl->irq, wl); | ||
180 | disable: | 257 | disable: |
181 | sdio_claim_host(func); | 258 | sdio_claim_host(func); |
182 | sdio_disable_func(func); | 259 | sdio_disable_func(func); |
@@ -189,6 +266,8 @@ static void __devexit wl1251_sdio_remove(struct sdio_func *func) | |||
189 | { | 266 | { |
190 | struct wl1251 *wl = sdio_get_drvdata(func); | 267 | struct wl1251 *wl = sdio_get_drvdata(func); |
191 | 268 | ||
269 | if (wl->irq) | ||
270 | free_irq(wl->irq, wl); | ||
192 | wl1251_free_hw(wl); | 271 | wl1251_free_hw(wl); |
193 | 272 | ||
194 | sdio_claim_host(func); | 273 | sdio_claim_host(func); |
@@ -208,6 +287,12 @@ static int __init wl1251_sdio_init(void) | |||
208 | { | 287 | { |
209 | int err; | 288 | int err; |
210 | 289 | ||
290 | err = platform_driver_register(&wl1251_platform_driver); | ||
291 | if (err) { | ||
292 | wl1251_error("failed to register platform driver: %d", err); | ||
293 | return err; | ||
294 | } | ||
295 | |||
211 | err = sdio_register_driver(&wl1251_sdio_driver); | 296 | err = sdio_register_driver(&wl1251_sdio_driver); |
212 | if (err) | 297 | if (err) |
213 | wl1251_error("failed to register sdio driver: %d", err); | 298 | wl1251_error("failed to register sdio driver: %d", err); |
@@ -217,6 +302,7 @@ static int __init wl1251_sdio_init(void) | |||
217 | static void __exit wl1251_sdio_exit(void) | 302 | static void __exit wl1251_sdio_exit(void) |
218 | { | 303 | { |
219 | sdio_unregister_driver(&wl1251_sdio_driver); | 304 | sdio_unregister_driver(&wl1251_sdio_driver); |
305 | platform_driver_unregister(&wl1251_platform_driver); | ||
220 | wl1251_notice("unloaded"); | 306 | wl1251_notice("unloaded"); |
221 | } | 307 | } |
222 | 308 | ||
diff --git a/include/linux/ieee80211.h b/include/linux/ieee80211.h index 1252ba1fbff5..97b2eae6a22c 100644 --- a/include/linux/ieee80211.h +++ b/include/linux/ieee80211.h | |||
@@ -876,6 +876,7 @@ struct ieee80211_ht_cap { | |||
876 | #define IEEE80211_HT_CAP_SGI_40 0x0040 | 876 | #define IEEE80211_HT_CAP_SGI_40 0x0040 |
877 | #define IEEE80211_HT_CAP_TX_STBC 0x0080 | 877 | #define IEEE80211_HT_CAP_TX_STBC 0x0080 |
878 | #define IEEE80211_HT_CAP_RX_STBC 0x0300 | 878 | #define IEEE80211_HT_CAP_RX_STBC 0x0300 |
879 | #define IEEE80211_HT_CAP_RX_STBC_SHIFT 8 | ||
879 | #define IEEE80211_HT_CAP_DELAY_BA 0x0400 | 880 | #define IEEE80211_HT_CAP_DELAY_BA 0x0400 |
880 | #define IEEE80211_HT_CAP_MAX_AMSDU 0x0800 | 881 | #define IEEE80211_HT_CAP_MAX_AMSDU 0x0800 |
881 | #define IEEE80211_HT_CAP_DSSSCCK40 0x1000 | 882 | #define IEEE80211_HT_CAP_DSSSCCK40 0x1000 |
diff --git a/include/linux/spi/wl12xx.h b/include/linux/spi/wl12xx.h index aed64ed3dc8a..a223ecbc71ef 100644 --- a/include/linux/spi/wl12xx.h +++ b/include/linux/spi/wl12xx.h | |||
@@ -26,6 +26,8 @@ | |||
26 | 26 | ||
27 | struct wl12xx_platform_data { | 27 | struct wl12xx_platform_data { |
28 | void (*set_power)(bool enable); | 28 | void (*set_power)(bool enable); |
29 | /* SDIO only: IRQ number if WLAN_IRQ line is used, 0 for SDIO IRQs */ | ||
30 | int irq; | ||
29 | bool use_eeprom; | 31 | bool use_eeprom; |
30 | }; | 32 | }; |
31 | 33 | ||
diff --git a/include/net/cfg80211.h b/include/net/cfg80211.h index 37cebd3aa0f7..5a4efe54cffd 100644 --- a/include/net/cfg80211.h +++ b/include/net/cfg80211.h | |||
@@ -1643,7 +1643,7 @@ struct ieee80211_radiotap_iterator { | |||
1643 | const struct ieee80211_radiotap_namespace *current_namespace; | 1643 | const struct ieee80211_radiotap_namespace *current_namespace; |
1644 | 1644 | ||
1645 | unsigned char *_arg, *_next_ns_data; | 1645 | unsigned char *_arg, *_next_ns_data; |
1646 | uint32_t *_next_bitmap; | 1646 | __le32 *_next_bitmap; |
1647 | 1647 | ||
1648 | unsigned char *this_arg; | 1648 | unsigned char *this_arg; |
1649 | int this_arg_index; | 1649 | int this_arg_index; |
diff --git a/include/net/mac80211.h b/include/net/mac80211.h index 344e5bf72062..78908b516f42 100644 --- a/include/net/mac80211.h +++ b/include/net/mac80211.h | |||
@@ -274,6 +274,9 @@ struct ieee80211_bss_conf { | |||
274 | * @IEEE80211_TX_INTFL_NL80211_FRAME_TX: Frame was requested through nl80211 | 274 | * @IEEE80211_TX_INTFL_NL80211_FRAME_TX: Frame was requested through nl80211 |
275 | * MLME command (internal to mac80211 to figure out whether to send TX | 275 | * MLME command (internal to mac80211 to figure out whether to send TX |
276 | * status to user space) | 276 | * status to user space) |
277 | * @IEEE80211_TX_CTL_LDPC: tells the driver to use LDPC for this frame | ||
278 | * @IEEE80211_TX_CTL_STBC: Enables Space-Time Block Coding (STBC) for this | ||
279 | * frame and selects the maximum number of streams that it can use. | ||
277 | */ | 280 | */ |
278 | enum mac80211_tx_control_flags { | 281 | enum mac80211_tx_control_flags { |
279 | IEEE80211_TX_CTL_REQ_TX_STATUS = BIT(0), | 282 | IEEE80211_TX_CTL_REQ_TX_STATUS = BIT(0), |
@@ -297,6 +300,9 @@ enum mac80211_tx_control_flags { | |||
297 | IEEE80211_TX_INTFL_RETRANSMISSION = BIT(19), | 300 | IEEE80211_TX_INTFL_RETRANSMISSION = BIT(19), |
298 | IEEE80211_TX_INTFL_HAS_RADIOTAP = BIT(20), | 301 | IEEE80211_TX_INTFL_HAS_RADIOTAP = BIT(20), |
299 | IEEE80211_TX_INTFL_NL80211_FRAME_TX = BIT(21), | 302 | IEEE80211_TX_INTFL_NL80211_FRAME_TX = BIT(21), |
303 | IEEE80211_TX_CTL_LDPC = BIT(22), | ||
304 | IEEE80211_TX_CTL_STBC = BIT(23) | BIT(24), | ||
305 | #define IEEE80211_TX_CTL_STBC_SHIFT 23 | ||
300 | }; | 306 | }; |
301 | 307 | ||
302 | /** | 308 | /** |
@@ -395,11 +401,11 @@ struct ieee80211_tx_rate { | |||
395 | * @status: union for status data | 401 | * @status: union for status data |
396 | * @driver_data: array of driver_data pointers | 402 | * @driver_data: array of driver_data pointers |
397 | * @ampdu_ack_len: number of acked aggregated frames. | 403 | * @ampdu_ack_len: number of acked aggregated frames. |
398 | * relevant only if IEEE80211_TX_STATUS_AMPDU was set. | 404 | * relevant only if IEEE80211_TX_STAT_AMPDU was set. |
399 | * @ampdu_ack_map: block ack bit map for the aggregation. | 405 | * @ampdu_ack_map: block ack bit map for the aggregation. |
400 | * relevant only if IEEE80211_TX_STATUS_AMPDU was set. | 406 | * relevant only if IEEE80211_TX_STAT_AMPDU was set. |
401 | * @ampdu_len: number of aggregated frames. | 407 | * @ampdu_len: number of aggregated frames. |
402 | * relevant only if IEEE80211_TX_STATUS_AMPDU was set. | 408 | * relevant only if IEEE80211_TX_STAT_AMPDU was set. |
403 | * @ack_signal: signal strength of the ACK frame | 409 | * @ack_signal: signal strength of the ACK frame |
404 | */ | 410 | */ |
405 | struct ieee80211_tx_info { | 411 | struct ieee80211_tx_info { |
@@ -610,6 +616,7 @@ enum ieee80211_conf_flags { | |||
610 | * @IEEE80211_CONF_CHANGE_RETRY_LIMITS: retry limits changed | 616 | * @IEEE80211_CONF_CHANGE_RETRY_LIMITS: retry limits changed |
611 | * @IEEE80211_CONF_CHANGE_IDLE: Idle flag changed | 617 | * @IEEE80211_CONF_CHANGE_IDLE: Idle flag changed |
612 | * @IEEE80211_CONF_CHANGE_SMPS: Spatial multiplexing powersave mode changed | 618 | * @IEEE80211_CONF_CHANGE_SMPS: Spatial multiplexing powersave mode changed |
619 | * @IEEE80211_CONF_CHANGE_QOS: Quality of service was enabled or disabled | ||
613 | */ | 620 | */ |
614 | enum ieee80211_conf_changed { | 621 | enum ieee80211_conf_changed { |
615 | IEEE80211_CONF_CHANGE_SMPS = BIT(1), | 622 | IEEE80211_CONF_CHANGE_SMPS = BIT(1), |
@@ -791,6 +798,7 @@ struct ieee80211_key_conf { | |||
791 | u8 iv_len; | 798 | u8 iv_len; |
792 | u8 hw_key_idx; | 799 | u8 hw_key_idx; |
793 | u8 flags; | 800 | u8 flags; |
801 | u8 *ap_addr; | ||
794 | s8 keyidx; | 802 | s8 keyidx; |
795 | u8 keylen; | 803 | u8 keylen; |
796 | u8 key[0]; | 804 | u8 key[0]; |
@@ -1671,7 +1679,8 @@ struct ieee80211_ops { | |||
1671 | struct ieee80211_vif *vif, | 1679 | struct ieee80211_vif *vif, |
1672 | enum ieee80211_ampdu_mlme_action action, | 1680 | enum ieee80211_ampdu_mlme_action action, |
1673 | struct ieee80211_sta *sta, u16 tid, u16 *ssn); | 1681 | struct ieee80211_sta *sta, u16 tid, u16 *ssn); |
1674 | 1682 | int (*get_survey)(struct ieee80211_hw *hw, int idx, | |
1683 | struct survey_info *survey); | ||
1675 | void (*rfkill_poll)(struct ieee80211_hw *hw); | 1684 | void (*rfkill_poll)(struct ieee80211_hw *hw); |
1676 | void (*set_coverage_class)(struct ieee80211_hw *hw, u8 coverage_class); | 1685 | void (*set_coverage_class)(struct ieee80211_hw *hw, u8 coverage_class); |
1677 | #ifdef CONFIG_NL80211_TESTMODE | 1686 | #ifdef CONFIG_NL80211_TESTMODE |
diff --git a/net/mac80211/agg-rx.c b/net/mac80211/agg-rx.c index 9598fdb4ad01..6bb9a9a94960 100644 --- a/net/mac80211/agg-rx.c +++ b/net/mac80211/agg-rx.c | |||
@@ -19,8 +19,9 @@ | |||
19 | #include "ieee80211_i.h" | 19 | #include "ieee80211_i.h" |
20 | #include "driver-ops.h" | 20 | #include "driver-ops.h" |
21 | 21 | ||
22 | void __ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid, | 22 | static void ___ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid, |
23 | u16 initiator, u16 reason) | 23 | u16 initiator, u16 reason, |
24 | bool from_timer) | ||
24 | { | 25 | { |
25 | struct ieee80211_local *local = sta->local; | 26 | struct ieee80211_local *local = sta->local; |
26 | struct tid_ampdu_rx *tid_rx; | 27 | struct tid_ampdu_rx *tid_rx; |
@@ -70,10 +71,17 @@ void __ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid, | |||
70 | 71 | ||
71 | spin_unlock_bh(&sta->lock); | 72 | spin_unlock_bh(&sta->lock); |
72 | 73 | ||
73 | del_timer_sync(&tid_rx->session_timer); | 74 | if (!from_timer) |
75 | del_timer_sync(&tid_rx->session_timer); | ||
74 | kfree(tid_rx); | 76 | kfree(tid_rx); |
75 | } | 77 | } |
76 | 78 | ||
79 | void __ieee80211_stop_rx_ba_session(struct sta_info *sta, u16 tid, | ||
80 | u16 initiator, u16 reason) | ||
81 | { | ||
82 | ___ieee80211_stop_rx_ba_session(sta, tid, initiator, reason, false); | ||
83 | } | ||
84 | |||
77 | /* | 85 | /* |
78 | * After accepting the AddBA Request we activated a timer, | 86 | * After accepting the AddBA Request we activated a timer, |
79 | * resetting it after each frame that arrives from the originator. | 87 | * resetting it after each frame that arrives from the originator. |
@@ -92,8 +100,8 @@ static void sta_rx_agg_session_timer_expired(unsigned long data) | |||
92 | #ifdef CONFIG_MAC80211_HT_DEBUG | 100 | #ifdef CONFIG_MAC80211_HT_DEBUG |
93 | printk(KERN_DEBUG "rx session timer expired on tid %d\n", (u16)*ptid); | 101 | printk(KERN_DEBUG "rx session timer expired on tid %d\n", (u16)*ptid); |
94 | #endif | 102 | #endif |
95 | __ieee80211_stop_rx_ba_session(sta, *ptid, WLAN_BACK_RECIPIENT, | 103 | ___ieee80211_stop_rx_ba_session(sta, *ptid, WLAN_BACK_RECIPIENT, |
96 | WLAN_REASON_QSTA_TIMEOUT); | 104 | WLAN_REASON_QSTA_TIMEOUT, true); |
97 | } | 105 | } |
98 | 106 | ||
99 | static void ieee80211_send_addba_resp(struct ieee80211_sub_if_data *sdata, u8 *da, u16 tid, | 107 | static void ieee80211_send_addba_resp(struct ieee80211_sub_if_data *sdata, u8 *da, u16 tid, |
diff --git a/net/mac80211/agg-tx.c b/net/mac80211/agg-tx.c index 555c6a14a6fa..c163d0a149f4 100644 --- a/net/mac80211/agg-tx.c +++ b/net/mac80211/agg-tx.c | |||
@@ -186,7 +186,7 @@ static void sta_addba_resp_timer_expired(unsigned long data) | |||
186 | spin_unlock_bh(&sta->lock); | 186 | spin_unlock_bh(&sta->lock); |
187 | #ifdef CONFIG_MAC80211_HT_DEBUG | 187 | #ifdef CONFIG_MAC80211_HT_DEBUG |
188 | printk(KERN_DEBUG "timer expired on tid %d but we are not " | 188 | printk(KERN_DEBUG "timer expired on tid %d but we are not " |
189 | "(or no longer) expecting addBA response there", | 189 | "(or no longer) expecting addBA response there\n", |
190 | tid); | 190 | tid); |
191 | #endif | 191 | #endif |
192 | return; | 192 | return; |
diff --git a/net/mac80211/cfg.c b/net/mac80211/cfg.c index 7dd7cda75cfa..845a6e6b9d89 100644 --- a/net/mac80211/cfg.c +++ b/net/mac80211/cfg.c | |||
@@ -411,6 +411,17 @@ static int ieee80211_dump_station(struct wiphy *wiphy, struct net_device *dev, | |||
411 | return ret; | 411 | return ret; |
412 | } | 412 | } |
413 | 413 | ||
414 | static int ieee80211_dump_survey(struct wiphy *wiphy, struct net_device *dev, | ||
415 | int idx, struct survey_info *survey) | ||
416 | { | ||
417 | struct ieee80211_local *local = wdev_priv(dev->ieee80211_ptr); | ||
418 | |||
419 | if (!local->ops->get_survey) | ||
420 | return -EOPNOTSUPP; | ||
421 | |||
422 | return drv_get_survey(local, idx, survey); | ||
423 | } | ||
424 | |||
414 | static int ieee80211_get_station(struct wiphy *wiphy, struct net_device *dev, | 425 | static int ieee80211_get_station(struct wiphy *wiphy, struct net_device *dev, |
415 | u8 *mac, struct station_info *sinfo) | 426 | u8 *mac, struct station_info *sinfo) |
416 | { | 427 | { |
@@ -1508,6 +1519,7 @@ struct cfg80211_ops mac80211_config_ops = { | |||
1508 | .change_station = ieee80211_change_station, | 1519 | .change_station = ieee80211_change_station, |
1509 | .get_station = ieee80211_get_station, | 1520 | .get_station = ieee80211_get_station, |
1510 | .dump_station = ieee80211_dump_station, | 1521 | .dump_station = ieee80211_dump_station, |
1522 | .dump_survey = ieee80211_dump_survey, | ||
1511 | #ifdef CONFIG_MAC80211_MESH | 1523 | #ifdef CONFIG_MAC80211_MESH |
1512 | .add_mpath = ieee80211_add_mpath, | 1524 | .add_mpath = ieee80211_add_mpath, |
1513 | .del_mpath = ieee80211_del_mpath, | 1525 | .del_mpath = ieee80211_del_mpath, |
diff --git a/net/mac80211/driver-ops.h b/net/mac80211/driver-ops.h index 9179196da264..35e1e581e806 100644 --- a/net/mac80211/driver-ops.h +++ b/net/mac80211/driver-ops.h | |||
@@ -344,6 +344,15 @@ static inline int drv_ampdu_action(struct ieee80211_local *local, | |||
344 | return ret; | 344 | return ret; |
345 | } | 345 | } |
346 | 346 | ||
347 | static inline int drv_get_survey(struct ieee80211_local *local, int idx, | ||
348 | struct survey_info *survey) | ||
349 | { | ||
350 | int ret = -EOPNOTSUPP; | ||
351 | if (local->ops->conf_tx) | ||
352 | ret = local->ops->get_survey(&local->hw, idx, survey); | ||
353 | /* trace_drv_get_survey(local, idx, survey, ret); */ | ||
354 | return ret; | ||
355 | } | ||
347 | 356 | ||
348 | static inline void drv_rfkill_poll(struct ieee80211_local *local) | 357 | static inline void drv_rfkill_poll(struct ieee80211_local *local) |
349 | { | 358 | { |
diff --git a/net/mac80211/key.c b/net/mac80211/key.c index e8f6e3b252d8..8d4b41787dcf 100644 --- a/net/mac80211/key.c +++ b/net/mac80211/key.c | |||
@@ -140,6 +140,7 @@ static void ieee80211_key_enable_hw_accel(struct ieee80211_key *key) | |||
140 | struct ieee80211_sub_if_data, | 140 | struct ieee80211_sub_if_data, |
141 | u.ap); | 141 | u.ap); |
142 | 142 | ||
143 | key->conf.ap_addr = sdata->dev->dev_addr; | ||
143 | ret = drv_set_key(key->local, SET_KEY, sdata, sta, &key->conf); | 144 | ret = drv_set_key(key->local, SET_KEY, sdata, sta, &key->conf); |
144 | 145 | ||
145 | if (!ret) { | 146 | if (!ret) { |
diff --git a/net/mac80211/mlme.c b/net/mac80211/mlme.c index 3133681bdaa0..425f66c70013 100644 --- a/net/mac80211/mlme.c +++ b/net/mac80211/mlme.c | |||
@@ -1333,12 +1333,17 @@ static void ieee80211_rx_mgmt_probe_resp(struct ieee80211_sub_if_data *sdata, | |||
1333 | mutex_lock(&sdata->local->iflist_mtx); | 1333 | mutex_lock(&sdata->local->iflist_mtx); |
1334 | ieee80211_recalc_ps(sdata->local, -1); | 1334 | ieee80211_recalc_ps(sdata->local, -1); |
1335 | mutex_unlock(&sdata->local->iflist_mtx); | 1335 | mutex_unlock(&sdata->local->iflist_mtx); |
1336 | |||
1337 | if (sdata->local->hw.flags & IEEE80211_HW_CONNECTION_MONITOR) | ||
1338 | return; | ||
1339 | |||
1336 | /* | 1340 | /* |
1337 | * We've received a probe response, but are not sure whether | 1341 | * We've received a probe response, but are not sure whether |
1338 | * we have or will be receiving any beacons or data, so let's | 1342 | * we have or will be receiving any beacons or data, so let's |
1339 | * schedule the timers again, just in case. | 1343 | * schedule the timers again, just in case. |
1340 | */ | 1344 | */ |
1341 | mod_beacon_timer(sdata); | 1345 | mod_beacon_timer(sdata); |
1346 | |||
1342 | mod_timer(&ifmgd->conn_mon_timer, | 1347 | mod_timer(&ifmgd->conn_mon_timer, |
1343 | round_jiffies_up(jiffies + | 1348 | round_jiffies_up(jiffies + |
1344 | IEEE80211_CONNECTION_IDLE_TIME)); | 1349 | IEEE80211_CONNECTION_IDLE_TIME)); |
diff --git a/net/mac80211/sta_info.c b/net/mac80211/sta_info.c index ff0eb948917b..3de7a2260d65 100644 --- a/net/mac80211/sta_info.c +++ b/net/mac80211/sta_info.c | |||
@@ -575,7 +575,7 @@ static int sta_info_buffer_expired(struct sta_info *sta, | |||
575 | } | 575 | } |
576 | 576 | ||
577 | 577 | ||
578 | static void sta_info_cleanup_expire_buffered(struct ieee80211_local *local, | 578 | static bool sta_info_cleanup_expire_buffered(struct ieee80211_local *local, |
579 | struct sta_info *sta) | 579 | struct sta_info *sta) |
580 | { | 580 | { |
581 | unsigned long flags; | 581 | unsigned long flags; |
@@ -583,7 +583,7 @@ static void sta_info_cleanup_expire_buffered(struct ieee80211_local *local, | |||
583 | struct ieee80211_sub_if_data *sdata; | 583 | struct ieee80211_sub_if_data *sdata; |
584 | 584 | ||
585 | if (skb_queue_empty(&sta->ps_tx_buf)) | 585 | if (skb_queue_empty(&sta->ps_tx_buf)) |
586 | return; | 586 | return false; |
587 | 587 | ||
588 | for (;;) { | 588 | for (;;) { |
589 | spin_lock_irqsave(&sta->ps_tx_buf.lock, flags); | 589 | spin_lock_irqsave(&sta->ps_tx_buf.lock, flags); |
@@ -608,6 +608,8 @@ static void sta_info_cleanup_expire_buffered(struct ieee80211_local *local, | |||
608 | if (skb_queue_empty(&sta->ps_tx_buf)) | 608 | if (skb_queue_empty(&sta->ps_tx_buf)) |
609 | sta_info_clear_tim_bit(sta); | 609 | sta_info_clear_tim_bit(sta); |
610 | } | 610 | } |
611 | |||
612 | return true; | ||
611 | } | 613 | } |
612 | 614 | ||
613 | static int __must_check __sta_info_destroy(struct sta_info *sta) | 615 | static int __must_check __sta_info_destroy(struct sta_info *sta) |
@@ -755,15 +757,20 @@ static void sta_info_cleanup(unsigned long data) | |||
755 | { | 757 | { |
756 | struct ieee80211_local *local = (struct ieee80211_local *) data; | 758 | struct ieee80211_local *local = (struct ieee80211_local *) data; |
757 | struct sta_info *sta; | 759 | struct sta_info *sta; |
760 | bool timer_needed = false; | ||
758 | 761 | ||
759 | rcu_read_lock(); | 762 | rcu_read_lock(); |
760 | list_for_each_entry_rcu(sta, &local->sta_list, list) | 763 | list_for_each_entry_rcu(sta, &local->sta_list, list) |
761 | sta_info_cleanup_expire_buffered(local, sta); | 764 | if (sta_info_cleanup_expire_buffered(local, sta)) |
765 | timer_needed = true; | ||
762 | rcu_read_unlock(); | 766 | rcu_read_unlock(); |
763 | 767 | ||
764 | if (local->quiescing) | 768 | if (local->quiescing) |
765 | return; | 769 | return; |
766 | 770 | ||
771 | if (!timer_needed) | ||
772 | return; | ||
773 | |||
767 | local->sta_cleanup.expires = | 774 | local->sta_cleanup.expires = |
768 | round_jiffies(jiffies + STA_INFO_CLEANUP_INTERVAL); | 775 | round_jiffies(jiffies + STA_INFO_CLEANUP_INTERVAL); |
769 | add_timer(&local->sta_cleanup); | 776 | add_timer(&local->sta_cleanup); |
diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c index 2cb77267f733..e2aa972d584f 100644 --- a/net/mac80211/tx.c +++ b/net/mac80211/tx.c | |||
@@ -429,6 +429,7 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx) | |||
429 | struct sta_info *sta = tx->sta; | 429 | struct sta_info *sta = tx->sta; |
430 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); | 430 | struct ieee80211_tx_info *info = IEEE80211_SKB_CB(tx->skb); |
431 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data; | 431 | struct ieee80211_hdr *hdr = (struct ieee80211_hdr *)tx->skb->data; |
432 | struct ieee80211_local *local = tx->local; | ||
432 | u32 staflags; | 433 | u32 staflags; |
433 | 434 | ||
434 | if (unlikely(!sta || | 435 | if (unlikely(!sta || |
@@ -476,6 +477,12 @@ ieee80211_tx_h_unicast_ps_buf(struct ieee80211_tx_data *tx) | |||
476 | info->control.vif = &tx->sdata->vif; | 477 | info->control.vif = &tx->sdata->vif; |
477 | info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING; | 478 | info->flags |= IEEE80211_TX_INTFL_NEED_TXPROCESSING; |
478 | skb_queue_tail(&sta->ps_tx_buf, tx->skb); | 479 | skb_queue_tail(&sta->ps_tx_buf, tx->skb); |
480 | |||
481 | if (!timer_pending(&local->sta_cleanup)) | ||
482 | mod_timer(&local->sta_cleanup, | ||
483 | round_jiffies(jiffies + | ||
484 | STA_INFO_CLEANUP_INTERVAL)); | ||
485 | |||
479 | return TX_QUEUED; | 486 | return TX_QUEUED; |
480 | } | 487 | } |
481 | #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG | 488 | #ifdef CONFIG_MAC80211_VERBOSE_PS_DEBUG |
diff --git a/net/wireless/sme.c b/net/wireless/sme.c index c2735775ec19..8ddf5ae0dd03 100644 --- a/net/wireless/sme.c +++ b/net/wireless/sme.c | |||
@@ -518,12 +518,16 @@ void cfg80211_connect_result(struct net_device *dev, const u8 *bssid, | |||
518 | ev->type = EVENT_CONNECT_RESULT; | 518 | ev->type = EVENT_CONNECT_RESULT; |
519 | if (bssid) | 519 | if (bssid) |
520 | memcpy(ev->cr.bssid, bssid, ETH_ALEN); | 520 | memcpy(ev->cr.bssid, bssid, ETH_ALEN); |
521 | ev->cr.req_ie = ((u8 *)ev) + sizeof(*ev); | 521 | if (req_ie_len) { |
522 | ev->cr.req_ie_len = req_ie_len; | 522 | ev->cr.req_ie = ((u8 *)ev) + sizeof(*ev); |
523 | memcpy((void *)ev->cr.req_ie, req_ie, req_ie_len); | 523 | ev->cr.req_ie_len = req_ie_len; |
524 | ev->cr.resp_ie = ((u8 *)ev) + sizeof(*ev) + req_ie_len; | 524 | memcpy((void *)ev->cr.req_ie, req_ie, req_ie_len); |
525 | ev->cr.resp_ie_len = resp_ie_len; | 525 | } |
526 | memcpy((void *)ev->cr.resp_ie, resp_ie, resp_ie_len); | 526 | if (resp_ie_len) { |
527 | ev->cr.resp_ie = ((u8 *)ev) + sizeof(*ev) + req_ie_len; | ||
528 | ev->cr.resp_ie_len = resp_ie_len; | ||
529 | memcpy((void *)ev->cr.resp_ie, resp_ie, resp_ie_len); | ||
530 | } | ||
527 | ev->cr.status = status; | 531 | ev->cr.status = status; |
528 | 532 | ||
529 | spin_lock_irqsave(&wdev->event_lock, flags); | 533 | spin_lock_irqsave(&wdev->event_lock, flags); |