2 * Copyright (c) 2008-2011 Atheros Communications Inc.
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.
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.
18 #include "ar9003_mac.h"
19 #include "ar9003_2p2_initvals.h"
20 #include "ar9003_buffalo_initvals.h"
21 #include "ar9485_initvals.h"
22 #include "ar9340_initvals.h"
23 #include "ar9330_1p1_initvals.h"
24 #include "ar9330_1p2_initvals.h"
25 #include "ar955x_1p0_initvals.h"
26 #include "ar9580_1p0_initvals.h"
27 #include "ar9462_2p0_initvals.h"
28 #include "ar9462_2p1_initvals.h"
29 #include "ar9565_1p0_initvals.h"
30 #include "ar9565_1p1_initvals.h"
31 #include "ar953x_initvals.h"
32 #include "ar956x_initvals.h"
34 /* General hardware code for the AR9003 hadware family */
37 * The AR9003 family uses a new INI format (pre, core, post
38 * arrays per subsystem). This provides support for the
39 * AR9003 2.2 chipsets.
41 static void ar9003_hw_init_mode_regs(struct ath_hw
*ah
)
43 if (AR_SREV_9330_11(ah
)) {
45 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
47 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
48 ar9331_1p1_mac_postamble
);
51 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
52 ar9331_1p1_baseband_core
);
53 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
54 ar9331_1p1_baseband_postamble
);
57 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
58 ar9331_1p1_radio_core
);
61 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
62 ar9331_1p1_soc_preamble
);
63 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
64 ar9331_1p1_soc_postamble
);
67 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
68 ar9331_common_rx_gain_1p1
);
69 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
70 ar9331_modes_lowest_ob_db_tx_gain_1p1
);
72 /* Japan 2484 Mhz CCK */
73 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
74 ar9331_1p1_baseband_core_txfir_coeff_japan_2484
);
76 /* additional clock settings */
78 INIT_INI_ARRAY(&ah
->iniAdditional
,
81 INIT_INI_ARRAY(&ah
->iniAdditional
,
83 } else if (AR_SREV_9330_12(ah
)) {
85 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
87 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
88 ar9331_1p2_mac_postamble
);
91 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
92 ar9331_1p2_baseband_core
);
93 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
94 ar9331_1p2_baseband_postamble
);
97 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
98 ar9331_1p2_radio_core
);
101 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
102 ar9331_1p2_soc_preamble
);
103 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
104 ar9331_1p2_soc_postamble
);
107 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
108 ar9331_common_rx_gain_1p2
);
109 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
110 ar9331_modes_lowest_ob_db_tx_gain_1p2
);
112 /* Japan 2484 Mhz CCK */
113 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
114 ar9331_1p2_baseband_core_txfir_coeff_japan_2484
);
116 /* additional clock settings */
117 if (ah
->is_clk_25mhz
)
118 INIT_INI_ARRAY(&ah
->iniAdditional
,
119 ar9331_1p2_xtal_25M
);
121 INIT_INI_ARRAY(&ah
->iniAdditional
,
122 ar9331_1p2_xtal_40M
);
123 } else if (AR_SREV_9340(ah
)) {
125 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
126 ar9340_1p0_mac_core
);
127 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
128 ar9340_1p0_mac_postamble
);
131 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
132 ar9340_1p0_baseband_core
);
133 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
134 ar9340_1p0_baseband_postamble
);
137 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
138 ar9340_1p0_radio_core
);
139 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
140 ar9340_1p0_radio_postamble
);
143 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
144 ar9340_1p0_soc_preamble
);
145 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
146 ar9340_1p0_soc_postamble
);
149 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
150 ar9340Common_wo_xlna_rx_gain_table_1p0
);
151 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
152 ar9340Modes_high_ob_db_tx_gain_table_1p0
);
154 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
155 ar9340Modes_fast_clock_1p0
);
156 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
157 ar9340_1p0_baseband_core_txfir_coeff_japan_2484
);
158 INIT_INI_ARRAY(&ah
->ini_dfs
,
159 ar9340_1p0_baseband_postamble_dfs_channel
);
161 if (!ah
->is_clk_25mhz
)
162 INIT_INI_ARRAY(&ah
->iniAdditional
,
163 ar9340_1p0_radio_core_40M
);
164 } else if (AR_SREV_9485_11_OR_LATER(ah
)) {
166 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
167 ar9485_1_1_mac_core
);
168 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
169 ar9485_1_1_mac_postamble
);
172 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_PRE
], ar9485_1_1
);
173 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
174 ar9485_1_1_baseband_core
);
175 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
176 ar9485_1_1_baseband_postamble
);
179 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
180 ar9485_1_1_radio_core
);
181 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
182 ar9485_1_1_radio_postamble
);
185 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
186 ar9485_1_1_soc_preamble
);
189 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
190 ar9485Common_wo_xlna_rx_gain_1_1
);
191 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
192 ar9485_modes_lowest_ob_db_tx_gain_1_1
);
194 /* Japan 2484 Mhz CCK */
195 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
196 ar9485_1_1_baseband_core_txfir_coeff_japan_2484
);
198 if (ah
->config
.pll_pwrsave
& AR_PCIE_PLL_PWRSAVE_CONTROL
) {
199 INIT_INI_ARRAY(&ah
->iniPcieSerdes
,
200 ar9485_1_1_pll_on_cdr_on_clkreq_disable_L1
);
201 INIT_INI_ARRAY(&ah
->iniPcieSerdesLowPower
,
202 ar9485_1_1_pll_on_cdr_on_clkreq_disable_L1
);
204 INIT_INI_ARRAY(&ah
->iniPcieSerdes
,
205 ar9485_1_1_pcie_phy_clkreq_disable_L1
);
206 INIT_INI_ARRAY(&ah
->iniPcieSerdesLowPower
,
207 ar9485_1_1_pcie_phy_clkreq_disable_L1
);
209 } else if (AR_SREV_9462_21(ah
)) {
210 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
211 ar9462_2p1_mac_core
);
212 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
213 ar9462_2p1_mac_postamble
);
214 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
215 ar9462_2p1_baseband_core
);
216 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
217 ar9462_2p1_baseband_postamble
);
218 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
219 ar9462_2p1_radio_core
);
220 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
221 ar9462_2p1_radio_postamble
);
222 INIT_INI_ARRAY(&ah
->ini_radio_post_sys2ant
,
223 ar9462_2p1_radio_postamble_sys2ant
);
224 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
225 ar9462_2p1_soc_preamble
);
226 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
227 ar9462_2p1_soc_postamble
);
228 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
229 ar9462_2p1_common_rx_gain
);
230 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
231 ar9462_2p1_modes_fast_clock
);
232 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
233 ar9462_2p1_baseband_core_txfir_coeff_japan_2484
);
235 /* Awake -> Sleep Setting */
236 if ((ah
->config
.pll_pwrsave
& AR_PCIE_PLL_PWRSAVE_CONTROL
) &&
237 (ah
->config
.pll_pwrsave
& AR_PCIE_PLL_PWRSAVE_ON_D3
)) {
238 INIT_INI_ARRAY(&ah
->iniPcieSerdes
,
239 ar9462_2p1_pciephy_clkreq_disable_L1
);
242 /* Sleep -> Awake Setting */
243 if ((ah
->config
.pll_pwrsave
& AR_PCIE_PLL_PWRSAVE_CONTROL
) &&
244 (ah
->config
.pll_pwrsave
& AR_PCIE_PLL_PWRSAVE_ON_D0
)) {
245 INIT_INI_ARRAY(&ah
->iniPcieSerdesLowPower
,
246 ar9462_2p1_pciephy_clkreq_disable_L1
);
248 } else if (AR_SREV_9462_20(ah
)) {
250 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
], ar9462_2p0_mac_core
);
251 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
252 ar9462_2p0_mac_postamble
);
254 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
255 ar9462_2p0_baseband_core
);
256 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
257 ar9462_2p0_baseband_postamble
);
259 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
260 ar9462_2p0_radio_core
);
261 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
262 ar9462_2p0_radio_postamble
);
263 INIT_INI_ARRAY(&ah
->ini_radio_post_sys2ant
,
264 ar9462_2p0_radio_postamble_sys2ant
);
266 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
267 ar9462_2p0_soc_preamble
);
268 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
269 ar9462_2p0_soc_postamble
);
271 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
272 ar9462_2p0_common_rx_gain
);
274 /* Awake -> Sleep Setting */
275 if ((ah
->config
.pll_pwrsave
& AR_PCIE_PLL_PWRSAVE_CONTROL
) &&
276 (ah
->config
.pll_pwrsave
& AR_PCIE_PLL_PWRSAVE_ON_D3
)) {
277 INIT_INI_ARRAY(&ah
->iniPcieSerdes
,
278 ar9462_2p0_pciephy_clkreq_disable_L1
);
281 /* Sleep -> Awake Setting */
282 if ((ah
->config
.pll_pwrsave
& AR_PCIE_PLL_PWRSAVE_CONTROL
) &&
283 (ah
->config
.pll_pwrsave
& AR_PCIE_PLL_PWRSAVE_ON_D0
)) {
284 INIT_INI_ARRAY(&ah
->iniPcieSerdesLowPower
,
285 ar9462_2p0_pciephy_clkreq_disable_L1
);
288 /* Fast clock modal settings */
289 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
290 ar9462_2p0_modes_fast_clock
);
292 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
293 ar9462_2p0_baseband_core_txfir_coeff_japan_2484
);
294 } else if (AR_SREV_9550(ah
)) {
296 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
297 ar955x_1p0_mac_core
);
298 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
299 ar955x_1p0_mac_postamble
);
302 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
303 ar955x_1p0_baseband_core
);
304 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
305 ar955x_1p0_baseband_postamble
);
308 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
309 ar955x_1p0_radio_core
);
310 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
311 ar955x_1p0_radio_postamble
);
314 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
315 ar955x_1p0_soc_preamble
);
316 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
317 ar955x_1p0_soc_postamble
);
320 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
321 ar955x_1p0_common_wo_xlna_rx_gain_table
);
322 INIT_INI_ARRAY(&ah
->ini_modes_rx_gain_bounds
,
323 ar955x_1p0_common_wo_xlna_rx_gain_bounds
);
324 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
325 ar955x_1p0_modes_xpa_tx_gain_table
);
327 /* Fast clock modal settings */
328 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
329 ar955x_1p0_modes_fast_clock
);
330 } else if (AR_SREV_9531(ah
)) {
331 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
332 qca953x_1p0_mac_core
);
333 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
334 qca953x_1p0_mac_postamble
);
335 if (AR_SREV_9531_20(ah
)) {
336 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
337 qca953x_2p0_baseband_core
);
338 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
339 qca953x_2p0_baseband_postamble
);
341 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
342 qca953x_1p0_baseband_core
);
343 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
344 qca953x_1p0_baseband_postamble
);
346 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
347 qca953x_1p0_radio_core
);
348 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
349 qca953x_1p0_radio_postamble
);
350 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
351 qca953x_1p0_soc_preamble
);
352 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
353 qca953x_1p0_soc_postamble
);
355 if (AR_SREV_9531_20(ah
)) {
356 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
357 qca953x_2p0_common_wo_xlna_rx_gain_table
);
358 INIT_INI_ARRAY(&ah
->ini_modes_rx_gain_bounds
,
359 qca953x_2p0_common_wo_xlna_rx_gain_bounds
);
361 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
362 qca953x_1p0_common_wo_xlna_rx_gain_table
);
363 INIT_INI_ARRAY(&ah
->ini_modes_rx_gain_bounds
,
364 qca953x_1p0_common_wo_xlna_rx_gain_bounds
);
367 if (AR_SREV_9531_20(ah
))
368 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
369 qca953x_2p0_modes_no_xpa_tx_gain_table
);
370 else if (AR_SREV_9531_11(ah
))
371 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
372 qca953x_1p1_modes_no_xpa_tx_gain_table
);
374 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
375 qca953x_1p0_modes_no_xpa_tx_gain_table
);
377 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
378 qca953x_1p0_modes_fast_clock
);
379 } else if (AR_SREV_9561(ah
)) {
380 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
381 qca956x_1p0_mac_core
);
382 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
383 qca956x_1p0_mac_postamble
);
385 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
386 qca956x_1p0_baseband_core
);
387 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
388 qca956x_1p0_baseband_postamble
);
390 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
391 qca956x_1p0_radio_core
);
392 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
393 qca956x_1p0_radio_postamble
);
395 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
396 qca956x_1p0_soc_preamble
);
397 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
398 qca956x_1p0_soc_postamble
);
400 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
401 qca956x_1p0_common_wo_xlna_rx_gain_table
);
402 INIT_INI_ARRAY(&ah
->ini_modes_rx_gain_bounds
,
403 qca956x_1p0_common_wo_xlna_rx_gain_bounds
);
404 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
405 qca956x_1p0_modes_no_xpa_tx_gain_table
);
407 INIT_INI_ARRAY(&ah
->ini_dfs
,
408 qca956x_1p0_baseband_postamble_dfs_channel
);
409 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
410 qca956x_1p0_baseband_core_txfir_coeff_japan_2484
);
411 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
412 qca956x_1p0_modes_fast_clock
);
413 } else if (AR_SREV_9580(ah
)) {
415 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
416 ar9580_1p0_mac_core
);
417 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
418 ar9580_1p0_mac_postamble
);
421 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
422 ar9580_1p0_baseband_core
);
423 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
424 ar9580_1p0_baseband_postamble
);
427 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
428 ar9580_1p0_radio_core
);
429 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
430 ar9580_1p0_radio_postamble
);
433 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
434 ar9580_1p0_soc_preamble
);
435 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
436 ar9580_1p0_soc_postamble
);
439 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
440 ar9580_1p0_rx_gain_table
);
441 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
442 ar9580_1p0_low_ob_db_tx_gain_table
);
444 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
445 ar9580_1p0_modes_fast_clock
);
446 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
447 ar9580_1p0_baseband_core_txfir_coeff_japan_2484
);
448 INIT_INI_ARRAY(&ah
->ini_dfs
,
449 ar9580_1p0_baseband_postamble_dfs_channel
);
450 } else if (AR_SREV_9565_11_OR_LATER(ah
)) {
451 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
452 ar9565_1p1_mac_core
);
453 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
454 ar9565_1p1_mac_postamble
);
456 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
457 ar9565_1p1_baseband_core
);
458 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
459 ar9565_1p1_baseband_postamble
);
461 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
462 ar9565_1p1_radio_core
);
463 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
464 ar9565_1p1_radio_postamble
);
466 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
467 ar9565_1p1_soc_preamble
);
468 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
469 ar9565_1p1_soc_postamble
);
471 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
472 ar9565_1p1_Common_rx_gain_table
);
473 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
474 ar9565_1p1_Modes_lowest_ob_db_tx_gain_table
);
476 /* Awake -> Sleep Setting */
477 if ((ah
->config
.pll_pwrsave
& AR_PCIE_PLL_PWRSAVE_CONTROL
) &&
478 (ah
->config
.pll_pwrsave
& AR_PCIE_PLL_PWRSAVE_ON_D3
)) {
479 INIT_INI_ARRAY(&ah
->iniPcieSerdes
,
480 ar9565_1p1_pciephy_clkreq_disable_L1
);
483 /* Sleep -> Awake Setting */
484 if ((ah
->config
.pll_pwrsave
& AR_PCIE_PLL_PWRSAVE_CONTROL
) &&
485 (ah
->config
.pll_pwrsave
& AR_PCIE_PLL_PWRSAVE_ON_D0
)) {
486 INIT_INI_ARRAY(&ah
->iniPcieSerdesLowPower
,
487 ar9565_1p1_pciephy_clkreq_disable_L1
);
490 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
491 ar9565_1p1_modes_fast_clock
);
492 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
493 ar9565_1p1_baseband_core_txfir_coeff_japan_2484
);
494 } else if (AR_SREV_9565(ah
)) {
495 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
496 ar9565_1p0_mac_core
);
497 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
498 ar9565_1p0_mac_postamble
);
500 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
501 ar9565_1p0_baseband_core
);
502 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
503 ar9565_1p0_baseband_postamble
);
505 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
506 ar9565_1p0_radio_core
);
507 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
508 ar9565_1p0_radio_postamble
);
510 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
511 ar9565_1p0_soc_preamble
);
512 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
513 ar9565_1p0_soc_postamble
);
515 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
516 ar9565_1p0_Common_rx_gain_table
);
517 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
518 ar9565_1p0_Modes_lowest_ob_db_tx_gain_table
);
520 /* Awake -> Sleep Setting */
521 if ((ah
->config
.pll_pwrsave
& AR_PCIE_PLL_PWRSAVE_CONTROL
) &&
522 (ah
->config
.pll_pwrsave
& AR_PCIE_PLL_PWRSAVE_ON_D3
)) {
523 INIT_INI_ARRAY(&ah
->iniPcieSerdes
,
524 ar9565_1p0_pciephy_clkreq_disable_L1
);
527 /* Sleep -> Awake Setting */
528 if ((ah
->config
.pll_pwrsave
& AR_PCIE_PLL_PWRSAVE_CONTROL
) &&
529 (ah
->config
.pll_pwrsave
& AR_PCIE_PLL_PWRSAVE_ON_D0
)) {
530 INIT_INI_ARRAY(&ah
->iniPcieSerdesLowPower
,
531 ar9565_1p0_pciephy_clkreq_disable_L1
);
534 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
535 ar9565_1p0_modes_fast_clock
);
536 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
537 ar9565_1p0_baseband_core_txfir_coeff_japan_2484
);
540 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
541 ar9300_2p2_mac_core
);
542 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
543 ar9300_2p2_mac_postamble
);
546 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
547 ar9300_2p2_baseband_core
);
548 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
549 ar9300_2p2_baseband_postamble
);
552 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
553 ar9300_2p2_radio_core
);
554 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
555 ar9300_2p2_radio_postamble
);
558 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
559 ar9300_2p2_soc_preamble
);
560 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
561 ar9300_2p2_soc_postamble
);
564 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
565 ar9300Common_rx_gain_table_2p2
);
566 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
567 ar9300Modes_lowest_ob_db_tx_gain_table_2p2
);
569 /* Load PCIE SERDES settings from INI */
573 INIT_INI_ARRAY(&ah
->iniPcieSerdes
,
574 ar9300PciePhy_pll_on_clkreq_disable_L1_2p2
);
578 INIT_INI_ARRAY(&ah
->iniPcieSerdesLowPower
,
579 ar9300PciePhy_pll_on_clkreq_disable_L1_2p2
);
581 /* Fast clock modal settings */
582 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
583 ar9300Modes_fast_clock_2p2
);
584 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
585 ar9300_2p2_baseband_core_txfir_coeff_japan_2484
);
586 INIT_INI_ARRAY(&ah
->ini_dfs
,
587 ar9300_2p2_baseband_postamble_dfs_channel
);
591 static void ar9003_tx_gain_table_mode0(struct ath_hw
*ah
)
593 if (AR_SREV_9330_12(ah
))
594 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
595 ar9331_modes_lowest_ob_db_tx_gain_1p2
);
596 else if (AR_SREV_9330_11(ah
))
597 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
598 ar9331_modes_lowest_ob_db_tx_gain_1p1
);
599 else if (AR_SREV_9340(ah
))
600 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
601 ar9340Modes_lowest_ob_db_tx_gain_table_1p0
);
602 else if (AR_SREV_9485_11_OR_LATER(ah
))
603 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
604 ar9485_modes_lowest_ob_db_tx_gain_1_1
);
605 else if (AR_SREV_9550(ah
))
606 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
607 ar955x_1p0_modes_xpa_tx_gain_table
);
608 else if (AR_SREV_9531_10(ah
))
609 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
610 qca953x_1p0_modes_xpa_tx_gain_table
);
611 else if (AR_SREV_9531_11(ah
))
612 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
613 qca953x_1p1_modes_xpa_tx_gain_table
);
614 else if (AR_SREV_9531_20(ah
))
615 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
616 qca953x_2p0_modes_xpa_tx_gain_table
);
617 else if (AR_SREV_9561(ah
))
618 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
619 qca956x_1p0_modes_xpa_tx_gain_table
);
620 else if (AR_SREV_9580(ah
))
621 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
622 ar9580_1p0_lowest_ob_db_tx_gain_table
);
623 else if (AR_SREV_9462_21(ah
))
624 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
625 ar9462_2p1_modes_low_ob_db_tx_gain
);
626 else if (AR_SREV_9462_20(ah
))
627 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
628 ar9462_2p0_modes_low_ob_db_tx_gain
);
629 else if (AR_SREV_9565_11(ah
))
630 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
631 ar9565_1p1_modes_low_ob_db_tx_gain_table
);
632 else if (AR_SREV_9565(ah
))
633 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
634 ar9565_1p0_modes_low_ob_db_tx_gain_table
);
636 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
637 ar9300Modes_lowest_ob_db_tx_gain_table_2p2
);
640 static void ar9003_tx_gain_table_mode1(struct ath_hw
*ah
)
642 if (AR_SREV_9330_12(ah
))
643 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
644 ar9331_modes_high_ob_db_tx_gain_1p2
);
645 else if (AR_SREV_9330_11(ah
))
646 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
647 ar9331_modes_high_ob_db_tx_gain_1p1
);
648 else if (AR_SREV_9340(ah
))
649 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
650 ar9340Modes_high_ob_db_tx_gain_table_1p0
);
651 else if (AR_SREV_9485_11_OR_LATER(ah
))
652 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
653 ar9485Modes_high_ob_db_tx_gain_1_1
);
654 else if (AR_SREV_9580(ah
))
655 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
656 ar9580_1p0_high_ob_db_tx_gain_table
);
657 else if (AR_SREV_9550(ah
))
658 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
659 ar955x_1p0_modes_no_xpa_tx_gain_table
);
660 else if (AR_SREV_9531(ah
)) {
661 if (AR_SREV_9531_20(ah
))
662 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
663 qca953x_2p0_modes_no_xpa_tx_gain_table
);
664 else if (AR_SREV_9531_11(ah
))
665 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
666 qca953x_1p1_modes_no_xpa_tx_gain_table
);
668 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
669 qca953x_1p0_modes_no_xpa_tx_gain_table
);
670 } else if (AR_SREV_9561(ah
))
671 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
672 qca956x_1p0_modes_no_xpa_tx_gain_table
);
673 else if (AR_SREV_9462_21(ah
))
674 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
675 ar9462_2p1_modes_high_ob_db_tx_gain
);
676 else if (AR_SREV_9462_20(ah
))
677 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
678 ar9462_2p0_modes_high_ob_db_tx_gain
);
679 else if (AR_SREV_9565_11(ah
))
680 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
681 ar9565_1p1_modes_high_ob_db_tx_gain_table
);
682 else if (AR_SREV_9565(ah
))
683 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
684 ar9565_1p0_modes_high_ob_db_tx_gain_table
);
686 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
687 ar9300Modes_high_ob_db_tx_gain_table_2p2
);
690 static void ar9003_tx_gain_table_mode2(struct ath_hw
*ah
)
692 if (AR_SREV_9330_12(ah
))
693 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
694 ar9331_modes_low_ob_db_tx_gain_1p2
);
695 else if (AR_SREV_9330_11(ah
))
696 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
697 ar9331_modes_low_ob_db_tx_gain_1p1
);
698 else if (AR_SREV_9340(ah
))
699 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
700 ar9340Modes_low_ob_db_tx_gain_table_1p0
);
701 else if (AR_SREV_9531_11(ah
))
702 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
703 qca953x_1p1_modes_no_xpa_low_power_tx_gain_table
);
704 else if (AR_SREV_9485_11_OR_LATER(ah
))
705 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
706 ar9485Modes_low_ob_db_tx_gain_1_1
);
707 else if (AR_SREV_9580(ah
))
708 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
709 ar9580_1p0_low_ob_db_tx_gain_table
);
710 else if (AR_SREV_9561(ah
))
711 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
712 qca956x_1p0_modes_no_xpa_low_ob_db_tx_gain_table
);
713 else if (AR_SREV_9565_11(ah
))
714 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
715 ar9565_1p1_modes_low_ob_db_tx_gain_table
);
716 else if (AR_SREV_9565(ah
))
717 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
718 ar9565_1p0_modes_low_ob_db_tx_gain_table
);
720 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
721 ar9300Modes_low_ob_db_tx_gain_table_2p2
);
724 static void ar9003_tx_gain_table_mode3(struct ath_hw
*ah
)
726 if (AR_SREV_9330_12(ah
))
727 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
728 ar9331_modes_high_power_tx_gain_1p2
);
729 else if (AR_SREV_9330_11(ah
))
730 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
731 ar9331_modes_high_power_tx_gain_1p1
);
732 else if (AR_SREV_9340(ah
))
733 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
734 ar9340Modes_high_power_tx_gain_table_1p0
);
735 else if (AR_SREV_9485_11_OR_LATER(ah
))
736 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
737 ar9485Modes_high_power_tx_gain_1_1
);
738 else if (AR_SREV_9580(ah
))
739 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
740 ar9580_1p0_high_power_tx_gain_table
);
741 else if (AR_SREV_9565_11(ah
))
742 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
743 ar9565_1p1_modes_high_power_tx_gain_table
);
744 else if (AR_SREV_9565(ah
))
745 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
746 ar9565_1p0_modes_high_power_tx_gain_table
);
748 if (ah
->config
.tx_gain_buffalo
)
749 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
750 ar9300Modes_high_power_tx_gain_table_buffalo
);
752 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
753 ar9300Modes_high_power_tx_gain_table_2p2
);
757 static void ar9003_tx_gain_table_mode4(struct ath_hw
*ah
)
759 if (AR_SREV_9340(ah
))
760 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
761 ar9340Modes_mixed_ob_db_tx_gain_table_1p0
);
762 else if (AR_SREV_9580(ah
))
763 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
764 ar9580_1p0_mixed_ob_db_tx_gain_table
);
765 else if (AR_SREV_9462_21(ah
))
766 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
767 ar9462_2p1_modes_mix_ob_db_tx_gain
);
768 else if (AR_SREV_9462_20(ah
))
769 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
770 ar9462_2p0_modes_mix_ob_db_tx_gain
);
772 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
773 ar9300Modes_mixed_ob_db_tx_gain_table_2p2
);
776 static void ar9003_tx_gain_table_mode5(struct ath_hw
*ah
)
778 if (AR_SREV_9485_11_OR_LATER(ah
))
779 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
780 ar9485Modes_green_ob_db_tx_gain_1_1
);
781 else if (AR_SREV_9580(ah
))
782 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
783 ar9580_1p0_type5_tx_gain_table
);
784 else if (AR_SREV_9561(ah
))
785 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
786 qca956x_1p0_modes_no_xpa_green_tx_gain_table
);
787 else if (AR_SREV_9300_22(ah
))
788 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
789 ar9300Modes_type5_tx_gain_table_2p2
);
792 static void ar9003_tx_gain_table_mode6(struct ath_hw
*ah
)
794 if (AR_SREV_9340(ah
))
795 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
796 ar9340Modes_low_ob_db_and_spur_tx_gain_table_1p0
);
797 else if (AR_SREV_9485_11_OR_LATER(ah
))
798 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
799 ar9485Modes_green_spur_ob_db_tx_gain_1_1
);
800 else if (AR_SREV_9580(ah
))
801 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
802 ar9580_1p0_type6_tx_gain_table
);
805 static void ar9003_tx_gain_table_mode7(struct ath_hw
*ah
)
807 if (AR_SREV_9340(ah
))
808 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
809 ar9340_cus227_tx_gain_table_1p0
);
812 typedef void (*ath_txgain_tab
)(struct ath_hw
*ah
);
814 static void ar9003_tx_gain_table_apply(struct ath_hw
*ah
)
816 static const ath_txgain_tab modes
[] = {
817 ar9003_tx_gain_table_mode0
,
818 ar9003_tx_gain_table_mode1
,
819 ar9003_tx_gain_table_mode2
,
820 ar9003_tx_gain_table_mode3
,
821 ar9003_tx_gain_table_mode4
,
822 ar9003_tx_gain_table_mode5
,
823 ar9003_tx_gain_table_mode6
,
824 ar9003_tx_gain_table_mode7
,
826 int idx
= ar9003_hw_get_tx_gain_idx(ah
);
828 if (idx
>= ARRAY_SIZE(modes
))
834 static void ar9003_rx_gain_table_mode0(struct ath_hw
*ah
)
836 if (AR_SREV_9330_12(ah
))
837 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
838 ar9331_common_rx_gain_1p2
);
839 else if (AR_SREV_9330_11(ah
))
840 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
841 ar9331_common_rx_gain_1p1
);
842 else if (AR_SREV_9340(ah
))
843 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
844 ar9340Common_rx_gain_table_1p0
);
845 else if (AR_SREV_9485_11_OR_LATER(ah
))
846 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
847 ar9485_common_rx_gain_1_1
);
848 else if (AR_SREV_9550(ah
)) {
849 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
850 ar955x_1p0_common_rx_gain_table
);
851 INIT_INI_ARRAY(&ah
->ini_modes_rx_gain_bounds
,
852 ar955x_1p0_common_rx_gain_bounds
);
853 } else if (AR_SREV_9531(ah
)) {
854 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
855 qca953x_1p0_common_rx_gain_table
);
856 INIT_INI_ARRAY(&ah
->ini_modes_rx_gain_bounds
,
857 qca953x_1p0_common_rx_gain_bounds
);
858 } else if (AR_SREV_9561(ah
)) {
859 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
860 qca956x_1p0_common_rx_gain_table
);
861 INIT_INI_ARRAY(&ah
->ini_modes_rx_gain_bounds
,
862 qca956x_1p0_common_rx_gain_bounds
);
863 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_xlna
,
864 qca956x_1p0_xlna_only
);
865 } else if (AR_SREV_9580(ah
))
866 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
867 ar9580_1p0_rx_gain_table
);
868 else if (AR_SREV_9462_21(ah
))
869 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
870 ar9462_2p1_common_rx_gain
);
871 else if (AR_SREV_9462_20(ah
))
872 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
873 ar9462_2p0_common_rx_gain
);
874 else if (AR_SREV_9565_11(ah
))
875 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
876 ar9565_1p1_Common_rx_gain_table
);
877 else if (AR_SREV_9565(ah
))
878 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
879 ar9565_1p0_Common_rx_gain_table
);
881 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
882 ar9300Common_rx_gain_table_2p2
);
885 static void ar9003_rx_gain_table_mode1(struct ath_hw
*ah
)
887 if (AR_SREV_9330_12(ah
))
888 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
889 ar9331_common_wo_xlna_rx_gain_1p2
);
890 else if (AR_SREV_9330_11(ah
))
891 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
892 ar9331_common_wo_xlna_rx_gain_1p1
);
893 else if (AR_SREV_9340(ah
))
894 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
895 ar9340Common_wo_xlna_rx_gain_table_1p0
);
896 else if (AR_SREV_9485_11_OR_LATER(ah
))
897 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
898 ar9485Common_wo_xlna_rx_gain_1_1
);
899 else if (AR_SREV_9462_21(ah
))
900 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
901 ar9462_2p1_common_wo_xlna_rx_gain
);
902 else if (AR_SREV_9462_20(ah
))
903 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
904 ar9462_2p0_common_wo_xlna_rx_gain
);
905 else if (AR_SREV_9550(ah
)) {
906 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
907 ar955x_1p0_common_wo_xlna_rx_gain_table
);
908 INIT_INI_ARRAY(&ah
->ini_modes_rx_gain_bounds
,
909 ar955x_1p0_common_wo_xlna_rx_gain_bounds
);
910 } else if (AR_SREV_9531_10(ah
) || AR_SREV_9531_11(ah
)) {
911 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
912 qca953x_1p0_common_wo_xlna_rx_gain_table
);
913 INIT_INI_ARRAY(&ah
->ini_modes_rx_gain_bounds
,
914 qca953x_1p0_common_wo_xlna_rx_gain_bounds
);
915 } else if (AR_SREV_9531_20(ah
)) {
916 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
917 qca953x_2p0_common_wo_xlna_rx_gain_table
);
918 INIT_INI_ARRAY(&ah
->ini_modes_rx_gain_bounds
,
919 qca953x_2p0_common_wo_xlna_rx_gain_bounds
);
920 } else if (AR_SREV_9561(ah
)) {
921 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
922 qca956x_1p0_common_wo_xlna_rx_gain_table
);
923 INIT_INI_ARRAY(&ah
->ini_modes_rx_gain_bounds
,
924 qca956x_1p0_common_wo_xlna_rx_gain_bounds
);
925 } else if (AR_SREV_9580(ah
))
926 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
927 ar9580_1p0_wo_xlna_rx_gain_table
);
928 else if (AR_SREV_9565_11(ah
))
929 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
930 ar9565_1p1_common_wo_xlna_rx_gain_table
);
931 else if (AR_SREV_9565(ah
))
932 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
933 ar9565_1p0_common_wo_xlna_rx_gain_table
);
935 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
936 ar9300Common_wo_xlna_rx_gain_table_2p2
);
939 static void ar9003_rx_gain_table_mode2(struct ath_hw
*ah
)
941 if (AR_SREV_9462_21(ah
)) {
942 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
943 ar9462_2p1_common_mixed_rx_gain
);
944 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_bb_core
,
945 ar9462_2p1_baseband_core_mix_rxgain
);
946 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_bb_postamble
,
947 ar9462_2p1_baseband_postamble_mix_rxgain
);
948 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_xlna
,
949 ar9462_2p1_baseband_postamble_5g_xlna
);
950 } else if (AR_SREV_9462_20(ah
)) {
951 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
952 ar9462_2p0_common_mixed_rx_gain
);
953 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_bb_core
,
954 ar9462_2p0_baseband_core_mix_rxgain
);
955 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_bb_postamble
,
956 ar9462_2p0_baseband_postamble_mix_rxgain
);
957 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_xlna
,
958 ar9462_2p0_baseband_postamble_5g_xlna
);
962 static void ar9003_rx_gain_table_mode3(struct ath_hw
*ah
)
964 if (AR_SREV_9462_21(ah
)) {
965 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
966 ar9462_2p1_common_5g_xlna_only_rxgain
);
967 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_xlna
,
968 ar9462_2p1_baseband_postamble_5g_xlna
);
969 } else if (AR_SREV_9462_20(ah
)) {
970 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
971 ar9462_2p0_common_5g_xlna_only_rxgain
);
972 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_xlna
,
973 ar9462_2p0_baseband_postamble_5g_xlna
);
977 static void ar9003_rx_gain_table_apply(struct ath_hw
*ah
)
979 switch (ar9003_hw_get_rx_gain_idx(ah
)) {
982 ar9003_rx_gain_table_mode0(ah
);
985 ar9003_rx_gain_table_mode1(ah
);
988 ar9003_rx_gain_table_mode2(ah
);
991 ar9003_rx_gain_table_mode3(ah
);
996 /* set gain table pointers according to values read from the eeprom */
997 static void ar9003_hw_init_mode_gain_regs(struct ath_hw
*ah
)
999 ar9003_tx_gain_table_apply(ah
);
1000 ar9003_rx_gain_table_apply(ah
);
1004 * Helper for ASPM support.
1006 * Disable PLL when in L0s as well as receiver clock when in L1.
1007 * This power saving option must be enabled through the SerDes.
1009 * Programming the SerDes must go through the same 288 bit serial shift
1010 * register as the other analog registers. Hence the 9 writes.
1012 static void ar9003_hw_configpcipowersave(struct ath_hw
*ah
,
1016 struct ar5416IniArray
*array
;
1019 * Increase L1 Entry Latency. Some WB222 boards don't have
1020 * this change in eeprom/OTP.
1023 if (AR_SREV_9462(ah
)) {
1024 u32 val
= ah
->config
.aspm_l1_fix
;
1025 if ((val
& 0xff000000) == 0x17000000) {
1028 REG_WRITE(ah
, 0x570c, val
);
1032 /* Nothing to do on restore for 11N */
1033 if (!power_off
/* !restore */) {
1034 /* set bit 19 to allow forcing of pcie core into L1 state */
1035 REG_SET_BIT(ah
, AR_PCIE_PM_CTRL
, AR_PCIE_PM_CTRL_ENA
);
1036 REG_WRITE(ah
, AR_WA
, ah
->WARegVal
);
1040 * Configure PCIE after Ini init. SERDES values now come from ini file
1041 * This enables PCIe low power mode.
1043 array
= power_off
? &ah
->iniPcieSerdes
:
1044 &ah
->iniPcieSerdesLowPower
;
1046 for (i
= 0; i
< array
->ia_rows
; i
++) {
1048 INI_RA(array
, i
, 0),
1049 INI_RA(array
, i
, 1));
1053 static void ar9003_hw_init_hang_checks(struct ath_hw
*ah
)
1056 * All chips support detection of BB/MAC hangs.
1058 ah
->config
.hw_hang_checks
|= HW_BB_WATCHDOG
;
1059 ah
->config
.hw_hang_checks
|= HW_MAC_HANG
;
1062 * This is not required for AR9580 1.0
1064 if (AR_SREV_9300_22(ah
))
1065 ah
->config
.hw_hang_checks
|= HW_PHYRESTART_CLC_WAR
;
1067 if (AR_SREV_9330(ah
))
1068 ah
->bb_watchdog_timeout_ms
= 85;
1070 ah
->bb_watchdog_timeout_ms
= 25;
1077 * Signature: dcu_chain_state is 0x6 and dcu_complete_state is 0x1.
1079 * The state of each DCU chain (mapped to TX queues) is available from these
1080 * DMA debug registers:
1082 * Chain 0 state : Bits 4:0 of AR_DMADBG_4
1083 * Chain 1 state : Bits 9:5 of AR_DMADBG_4
1084 * Chain 2 state : Bits 14:10 of AR_DMADBG_4
1085 * Chain 3 state : Bits 19:15 of AR_DMADBG_4
1086 * Chain 4 state : Bits 24:20 of AR_DMADBG_4
1087 * Chain 5 state : Bits 29:25 of AR_DMADBG_4
1088 * Chain 6 state : Bits 4:0 of AR_DMADBG_5
1089 * Chain 7 state : Bits 9:5 of AR_DMADBG_5
1090 * Chain 8 state : Bits 14:10 of AR_DMADBG_5
1091 * Chain 9 state : Bits 19:15 of AR_DMADBG_5
1093 * The DCU chain state "0x6" means "WAIT_FRDONE" - wait for TX frame to be done.
1096 #define NUM_STATUS_READS 50
1098 static bool ath9k_hw_verify_hang(struct ath_hw
*ah
, unsigned int queue
)
1100 u32 dma_dbg_chain
, dma_dbg_complete
;
1101 u8 dcu_chain_state
, dcu_complete_state
;
1104 for (i
= 0; i
< NUM_STATUS_READS
; i
++) {
1106 dma_dbg_chain
= REG_READ(ah
, AR_DMADBG_4
);
1108 dma_dbg_chain
= REG_READ(ah
, AR_DMADBG_5
);
1110 dma_dbg_complete
= REG_READ(ah
, AR_DMADBG_6
);
1112 dcu_chain_state
= (dma_dbg_chain
>> (5 * queue
)) & 0x1f;
1113 dcu_complete_state
= dma_dbg_complete
& 0x3;
1115 if ((dcu_chain_state
!= 0x6) || (dcu_complete_state
!= 0x1))
1119 ath_dbg(ath9k_hw_common(ah
), RESET
,
1120 "MAC Hang signature found for queue: %d\n", queue
);
1125 static bool ar9003_hw_detect_mac_hang(struct ath_hw
*ah
)
1127 u32 dma_dbg_4
, dma_dbg_5
, dma_dbg_6
, chk_dbg
;
1128 u8 dcu_chain_state
, dcu_complete_state
;
1129 bool dcu_wait_frdone
= false;
1130 unsigned long chk_dcu
= 0;
1133 dma_dbg_4
= REG_READ(ah
, AR_DMADBG_4
);
1134 dma_dbg_5
= REG_READ(ah
, AR_DMADBG_5
);
1135 dma_dbg_6
= REG_READ(ah
, AR_DMADBG_6
);
1137 dcu_complete_state
= dma_dbg_6
& 0x3;
1138 if (dcu_complete_state
!= 0x1)
1141 for (i
= 0; i
< ATH9K_NUM_TX_QUEUES
; i
++) {
1143 chk_dbg
= dma_dbg_4
;
1145 chk_dbg
= dma_dbg_5
;
1147 dcu_chain_state
= (chk_dbg
>> (5 * i
)) & 0x1f;
1148 if (dcu_chain_state
== 0x6) {
1149 dcu_wait_frdone
= true;
1154 if ((dcu_complete_state
== 0x1) && dcu_wait_frdone
) {
1155 for_each_set_bit(i
, &chk_dcu
, ATH9K_NUM_TX_QUEUES
) {
1156 if (ath9k_hw_verify_hang(ah
, i
))
1164 /* Sets up the AR9003 hardware familiy callbacks */
1165 void ar9003_hw_attach_ops(struct ath_hw
*ah
)
1167 struct ath_hw_private_ops
*priv_ops
= ath9k_hw_private_ops(ah
);
1168 struct ath_hw_ops
*ops
= ath9k_hw_ops(ah
);
1170 ar9003_hw_init_mode_regs(ah
);
1172 if (AR_SREV_9003_PCOEM(ah
)) {
1173 WARN_ON(!ah
->iniPcieSerdes
.ia_array
);
1174 WARN_ON(!ah
->iniPcieSerdesLowPower
.ia_array
);
1177 priv_ops
->init_mode_gain_regs
= ar9003_hw_init_mode_gain_regs
;
1178 priv_ops
->init_hang_checks
= ar9003_hw_init_hang_checks
;
1179 priv_ops
->detect_mac_hang
= ar9003_hw_detect_mac_hang
;
1181 ops
->config_pci_powersave
= ar9003_hw_configpcipowersave
;
1183 ar9003_hw_attach_phy_ops(ah
);
1184 ar9003_hw_attach_calib_ops(ah
);
1185 ar9003_hw_attach_mac_ops(ah
);
1186 ar9003_hw_attach_aic_ops(ah
);