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 "ar9485_initvals.h"
21 #include "ar9340_initvals.h"
22 #include "ar9330_1p1_initvals.h"
23 #include "ar9330_1p2_initvals.h"
24 #include "ar955x_1p0_initvals.h"
25 #include "ar9580_1p0_initvals.h"
26 #include "ar9462_2p0_initvals.h"
27 #include "ar9462_2p1_initvals.h"
28 #include "ar9565_1p0_initvals.h"
30 /* General hardware code for the AR9003 hadware family */
33 * The AR9003 family uses a new INI format (pre, core, post
34 * arrays per subsystem). This provides support for the
35 * AR9003 2.2 chipsets.
37 static void ar9003_hw_init_mode_regs(struct ath_hw
*ah
)
39 if (AR_SREV_9330_11(ah
)) {
41 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
43 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
44 ar9331_1p1_mac_postamble
);
47 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
48 ar9331_1p1_baseband_core
);
49 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
50 ar9331_1p1_baseband_postamble
);
53 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
54 ar9331_1p1_radio_core
);
57 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
58 ar9331_1p1_soc_preamble
);
59 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
60 ar9331_1p1_soc_postamble
);
63 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
64 ar9331_common_rx_gain_1p1
);
65 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
66 ar9331_modes_lowest_ob_db_tx_gain_1p1
);
68 /* Japan 2484 Mhz CCK */
69 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
70 ar9331_1p1_baseband_core_txfir_coeff_japan_2484
);
72 /* additional clock settings */
74 INIT_INI_ARRAY(&ah
->iniAdditional
,
77 INIT_INI_ARRAY(&ah
->iniAdditional
,
79 } else if (AR_SREV_9330_12(ah
)) {
81 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
83 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
84 ar9331_1p2_mac_postamble
);
87 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
88 ar9331_1p2_baseband_core
);
89 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
90 ar9331_1p2_baseband_postamble
);
93 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
94 ar9331_1p2_radio_core
);
97 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
98 ar9331_1p2_soc_preamble
);
99 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
100 ar9331_1p2_soc_postamble
);
103 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
104 ar9331_common_rx_gain_1p2
);
105 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
106 ar9331_modes_lowest_ob_db_tx_gain_1p2
);
108 /* Japan 2484 Mhz CCK */
109 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
110 ar9331_1p2_baseband_core_txfir_coeff_japan_2484
);
112 /* additional clock settings */
113 if (ah
->is_clk_25mhz
)
114 INIT_INI_ARRAY(&ah
->iniAdditional
,
115 ar9331_1p2_xtal_25M
);
117 INIT_INI_ARRAY(&ah
->iniAdditional
,
118 ar9331_1p2_xtal_40M
);
119 } else if (AR_SREV_9340(ah
)) {
121 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
122 ar9340_1p0_mac_core
);
123 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
124 ar9340_1p0_mac_postamble
);
127 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
128 ar9340_1p0_baseband_core
);
129 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
130 ar9340_1p0_baseband_postamble
);
133 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
134 ar9340_1p0_radio_core
);
135 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
136 ar9340_1p0_radio_postamble
);
139 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
140 ar9340_1p0_soc_preamble
);
141 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
142 ar9340_1p0_soc_postamble
);
145 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
146 ar9340Common_wo_xlna_rx_gain_table_1p0
);
147 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
148 ar9340Modes_high_ob_db_tx_gain_table_1p0
);
150 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
151 ar9340Modes_fast_clock_1p0
);
153 if (!ah
->is_clk_25mhz
)
154 INIT_INI_ARRAY(&ah
->iniAdditional
,
155 ar9340_1p0_radio_core_40M
);
156 } else if (AR_SREV_9485_11_OR_LATER(ah
)) {
158 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
159 ar9485_1_1_mac_core
);
160 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
161 ar9485_1_1_mac_postamble
);
164 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_PRE
], ar9485_1_1
);
165 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
166 ar9485_1_1_baseband_core
);
167 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
168 ar9485_1_1_baseband_postamble
);
171 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
172 ar9485_1_1_radio_core
);
173 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
174 ar9485_1_1_radio_postamble
);
177 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
178 ar9485_1_1_soc_preamble
);
181 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
182 ar9485Common_wo_xlna_rx_gain_1_1
);
183 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
184 ar9485_modes_lowest_ob_db_tx_gain_1_1
);
186 /* Japan 2484 Mhz CCK */
187 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
188 ar9485_1_1_baseband_core_txfir_coeff_japan_2484
);
190 /* Load PCIE SERDES settings from INI */
194 INIT_INI_ARRAY(&ah
->iniPcieSerdes
,
195 ar9485_1_1_pcie_phy_clkreq_disable_L1
);
199 INIT_INI_ARRAY(&ah
->iniPcieSerdesLowPower
,
200 ar9485_1_1_pcie_phy_clkreq_disable_L1
);
201 } else if (AR_SREV_9462_21(ah
)) {
202 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
203 ar9462_2p1_mac_core
);
204 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
205 ar9462_2p1_mac_postamble
);
206 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
207 ar9462_2p1_baseband_core
);
208 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
209 ar9462_2p1_baseband_postamble
);
210 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
211 ar9462_2p1_radio_core
);
212 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
213 ar9462_2p1_radio_postamble
);
214 INIT_INI_ARRAY(&ah
->ini_radio_post_sys2ant
,
215 ar9462_2p1_radio_postamble_sys2ant
);
216 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
217 ar9462_2p1_soc_preamble
);
218 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
219 ar9462_2p1_soc_postamble
);
220 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
221 ar9462_2p1_common_rx_gain
);
222 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
223 ar9462_2p1_modes_fast_clock
);
224 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
225 ar9462_2p1_baseband_core_txfir_coeff_japan_2484
);
226 } else if (AR_SREV_9462_20(ah
)) {
228 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
], ar9462_2p0_mac_core
);
229 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
230 ar9462_2p0_mac_postamble
);
232 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
233 ar9462_2p0_baseband_core
);
234 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
235 ar9462_2p0_baseband_postamble
);
237 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
238 ar9462_2p0_radio_core
);
239 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
240 ar9462_2p0_radio_postamble
);
241 INIT_INI_ARRAY(&ah
->ini_radio_post_sys2ant
,
242 ar9462_2p0_radio_postamble_sys2ant
);
244 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
245 ar9462_2p0_soc_preamble
);
246 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
247 ar9462_2p0_soc_postamble
);
249 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
250 ar9462_common_rx_gain_table_2p0
);
252 /* Awake -> Sleep Setting */
253 INIT_INI_ARRAY(&ah
->iniPcieSerdes
,
254 ar9462_pciephy_clkreq_disable_L1_2p0
);
255 /* Sleep -> Awake Setting */
256 INIT_INI_ARRAY(&ah
->iniPcieSerdesLowPower
,
257 ar9462_pciephy_clkreq_disable_L1_2p0
);
259 /* Fast clock modal settings */
260 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
261 ar9462_modes_fast_clock_2p0
);
263 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
264 ar9462_2p0_baseband_core_txfir_coeff_japan_2484
);
265 } else if (AR_SREV_9550(ah
)) {
267 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
268 ar955x_1p0_mac_core
);
269 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
270 ar955x_1p0_mac_postamble
);
273 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
274 ar955x_1p0_baseband_core
);
275 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
276 ar955x_1p0_baseband_postamble
);
279 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
280 ar955x_1p0_radio_core
);
281 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
282 ar955x_1p0_radio_postamble
);
285 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
286 ar955x_1p0_soc_preamble
);
287 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
288 ar955x_1p0_soc_postamble
);
291 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
292 ar955x_1p0_common_wo_xlna_rx_gain_table
);
293 INIT_INI_ARRAY(&ah
->ini_modes_rx_gain_bounds
,
294 ar955x_1p0_common_wo_xlna_rx_gain_bounds
);
295 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
296 ar955x_1p0_modes_xpa_tx_gain_table
);
298 /* Fast clock modal settings */
299 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
300 ar955x_1p0_modes_fast_clock
);
301 } else if (AR_SREV_9580(ah
)) {
303 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
304 ar9580_1p0_mac_core
);
305 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
306 ar9580_1p0_mac_postamble
);
309 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
310 ar9580_1p0_baseband_core
);
311 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
312 ar9580_1p0_baseband_postamble
);
315 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
316 ar9580_1p0_radio_core
);
317 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
318 ar9580_1p0_radio_postamble
);
321 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
322 ar9580_1p0_soc_preamble
);
323 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
324 ar9580_1p0_soc_postamble
);
327 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
328 ar9580_1p0_rx_gain_table
);
329 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
330 ar9580_1p0_low_ob_db_tx_gain_table
);
332 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
333 ar9580_1p0_modes_fast_clock
);
334 } else if (AR_SREV_9565(ah
)) {
335 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
336 ar9565_1p0_mac_core
);
337 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
338 ar9565_1p0_mac_postamble
);
340 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
341 ar9565_1p0_baseband_core
);
342 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
343 ar9565_1p0_baseband_postamble
);
345 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
346 ar9565_1p0_radio_core
);
347 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
348 ar9565_1p0_radio_postamble
);
350 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
351 ar9565_1p0_soc_preamble
);
352 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
353 ar9565_1p0_soc_postamble
);
355 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
356 ar9565_1p0_Common_rx_gain_table
);
357 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
358 ar9565_1p0_Modes_lowest_ob_db_tx_gain_table
);
360 INIT_INI_ARRAY(&ah
->iniPcieSerdes
,
361 ar9565_1p0_pciephy_clkreq_disable_L1
);
362 INIT_INI_ARRAY(&ah
->iniPcieSerdesLowPower
,
363 ar9565_1p0_pciephy_clkreq_disable_L1
);
365 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
366 ar9565_1p0_modes_fast_clock
);
369 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
370 ar9300_2p2_mac_core
);
371 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
372 ar9300_2p2_mac_postamble
);
375 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
376 ar9300_2p2_baseband_core
);
377 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
378 ar9300_2p2_baseband_postamble
);
381 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
382 ar9300_2p2_radio_core
);
383 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
384 ar9300_2p2_radio_postamble
);
387 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
388 ar9300_2p2_soc_preamble
);
389 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
390 ar9300_2p2_soc_postamble
);
393 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
394 ar9300Common_rx_gain_table_2p2
);
395 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
396 ar9300Modes_lowest_ob_db_tx_gain_table_2p2
);
398 /* Load PCIE SERDES settings from INI */
402 INIT_INI_ARRAY(&ah
->iniPcieSerdes
,
403 ar9300PciePhy_pll_on_clkreq_disable_L1_2p2
);
407 INIT_INI_ARRAY(&ah
->iniPcieSerdesLowPower
,
408 ar9300PciePhy_pll_on_clkreq_disable_L1_2p2
);
410 /* Fast clock modal settings */
411 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
412 ar9300Modes_fast_clock_2p2
);
416 static void ar9003_tx_gain_table_mode0(struct ath_hw
*ah
)
418 if (AR_SREV_9330_12(ah
))
419 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
420 ar9331_modes_lowest_ob_db_tx_gain_1p2
);
421 else if (AR_SREV_9330_11(ah
))
422 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
423 ar9331_modes_lowest_ob_db_tx_gain_1p1
);
424 else if (AR_SREV_9340(ah
))
425 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
426 ar9340Modes_lowest_ob_db_tx_gain_table_1p0
);
427 else if (AR_SREV_9485_11_OR_LATER(ah
))
428 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
429 ar9485_modes_lowest_ob_db_tx_gain_1_1
);
430 else if (AR_SREV_9550(ah
))
431 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
432 ar955x_1p0_modes_xpa_tx_gain_table
);
433 else if (AR_SREV_9580(ah
))
434 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
435 ar9580_1p0_lowest_ob_db_tx_gain_table
);
436 else if (AR_SREV_9462_21(ah
))
437 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
438 ar9462_2p1_modes_low_ob_db_tx_gain
);
439 else if (AR_SREV_9462_20(ah
))
440 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
441 ar9462_modes_low_ob_db_tx_gain_table_2p0
);
442 else if (AR_SREV_9565(ah
))
443 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
444 ar9565_1p0_modes_low_ob_db_tx_gain_table
);
446 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
447 ar9300Modes_lowest_ob_db_tx_gain_table_2p2
);
450 static void ar9003_tx_gain_table_mode1(struct ath_hw
*ah
)
452 if (AR_SREV_9330_12(ah
))
453 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
454 ar9331_modes_high_ob_db_tx_gain_1p2
);
455 else if (AR_SREV_9330_11(ah
))
456 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
457 ar9331_modes_high_ob_db_tx_gain_1p1
);
458 else if (AR_SREV_9340(ah
))
459 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
460 ar9340Modes_high_ob_db_tx_gain_table_1p0
);
461 else if (AR_SREV_9485_11_OR_LATER(ah
))
462 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
463 ar9485Modes_high_ob_db_tx_gain_1_1
);
464 else if (AR_SREV_9580(ah
))
465 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
466 ar9580_1p0_high_ob_db_tx_gain_table
);
467 else if (AR_SREV_9550(ah
))
468 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
469 ar955x_1p0_modes_no_xpa_tx_gain_table
);
470 else if (AR_SREV_9462_21(ah
))
471 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
472 ar9462_2p1_modes_high_ob_db_tx_gain
);
473 else if (AR_SREV_9462_20(ah
))
474 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
475 ar9462_modes_high_ob_db_tx_gain_table_2p0
);
476 else if (AR_SREV_9565(ah
))
477 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
478 ar9565_1p0_modes_high_ob_db_tx_gain_table
);
480 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
481 ar9300Modes_high_ob_db_tx_gain_table_2p2
);
484 static void ar9003_tx_gain_table_mode2(struct ath_hw
*ah
)
486 if (AR_SREV_9330_12(ah
))
487 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
488 ar9331_modes_low_ob_db_tx_gain_1p2
);
489 else if (AR_SREV_9330_11(ah
))
490 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
491 ar9331_modes_low_ob_db_tx_gain_1p1
);
492 else if (AR_SREV_9340(ah
))
493 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
494 ar9340Modes_low_ob_db_tx_gain_table_1p0
);
495 else if (AR_SREV_9485_11_OR_LATER(ah
))
496 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
497 ar9485Modes_low_ob_db_tx_gain_1_1
);
498 else if (AR_SREV_9580(ah
))
499 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
500 ar9580_1p0_low_ob_db_tx_gain_table
);
501 else if (AR_SREV_9565(ah
))
502 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
503 ar9565_1p0_modes_low_ob_db_tx_gain_table
);
505 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
506 ar9300Modes_low_ob_db_tx_gain_table_2p2
);
509 static void ar9003_tx_gain_table_mode3(struct ath_hw
*ah
)
511 if (AR_SREV_9330_12(ah
))
512 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
513 ar9331_modes_high_power_tx_gain_1p2
);
514 else if (AR_SREV_9330_11(ah
))
515 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
516 ar9331_modes_high_power_tx_gain_1p1
);
517 else if (AR_SREV_9340(ah
))
518 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
519 ar9340Modes_high_power_tx_gain_table_1p0
);
520 else if (AR_SREV_9485_11_OR_LATER(ah
))
521 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
522 ar9485Modes_high_power_tx_gain_1_1
);
523 else if (AR_SREV_9580(ah
))
524 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
525 ar9580_1p0_high_power_tx_gain_table
);
526 else if (AR_SREV_9565(ah
))
527 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
528 ar9565_1p0_modes_high_power_tx_gain_table
);
530 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
531 ar9300Modes_high_power_tx_gain_table_2p2
);
534 static void ar9003_tx_gain_table_mode4(struct ath_hw
*ah
)
536 if (AR_SREV_9340(ah
))
537 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
538 ar9340Modes_mixed_ob_db_tx_gain_table_1p0
);
539 else if (AR_SREV_9580(ah
))
540 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
541 ar9580_1p0_mixed_ob_db_tx_gain_table
);
542 else if (AR_SREV_9462_21(ah
))
543 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
544 ar9462_2p1_modes_mix_ob_db_tx_gain
);
545 else if (AR_SREV_9462_20(ah
))
546 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
547 ar9462_modes_mix_ob_db_tx_gain_table_2p0
);
549 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
550 ar9300Modes_mixed_ob_db_tx_gain_table_2p2
);
553 static void ar9003_tx_gain_table_mode5(struct ath_hw
*ah
)
555 if (AR_SREV_9485_11_OR_LATER(ah
))
556 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
557 ar9485Modes_green_ob_db_tx_gain_1_1
);
558 else if (AR_SREV_9340(ah
))
559 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
560 ar9340Modes_ub124_tx_gain_table_1p0
);
561 else if (AR_SREV_9580(ah
))
562 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
563 ar9580_1p0_type5_tx_gain_table
);
564 else if (AR_SREV_9300_22(ah
))
565 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
566 ar9300Modes_type5_tx_gain_table_2p2
);
569 static void ar9003_tx_gain_table_mode6(struct ath_hw
*ah
)
571 if (AR_SREV_9340(ah
))
572 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
573 ar9340Modes_low_ob_db_and_spur_tx_gain_table_1p0
);
574 else if (AR_SREV_9485_11_OR_LATER(ah
))
575 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
576 ar9485Modes_green_spur_ob_db_tx_gain_1_1
);
577 else if (AR_SREV_9580(ah
))
578 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
579 ar9580_1p0_type6_tx_gain_table
);
582 typedef void (*ath_txgain_tab
)(struct ath_hw
*ah
);
584 static void ar9003_tx_gain_table_apply(struct ath_hw
*ah
)
586 static const ath_txgain_tab modes
[] = {
587 ar9003_tx_gain_table_mode0
,
588 ar9003_tx_gain_table_mode1
,
589 ar9003_tx_gain_table_mode2
,
590 ar9003_tx_gain_table_mode3
,
591 ar9003_tx_gain_table_mode4
,
592 ar9003_tx_gain_table_mode5
,
593 ar9003_tx_gain_table_mode6
,
595 int idx
= ar9003_hw_get_tx_gain_idx(ah
);
597 if (idx
>= ARRAY_SIZE(modes
))
603 static void ar9003_rx_gain_table_mode0(struct ath_hw
*ah
)
605 if (AR_SREV_9330_12(ah
))
606 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
607 ar9331_common_rx_gain_1p2
);
608 else if (AR_SREV_9330_11(ah
))
609 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
610 ar9331_common_rx_gain_1p1
);
611 else if (AR_SREV_9340(ah
))
612 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
613 ar9340Common_rx_gain_table_1p0
);
614 else if (AR_SREV_9485_11_OR_LATER(ah
))
615 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
616 ar9485_common_rx_gain_1_1
);
617 else if (AR_SREV_9550(ah
)) {
618 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
619 ar955x_1p0_common_rx_gain_table
);
620 INIT_INI_ARRAY(&ah
->ini_modes_rx_gain_bounds
,
621 ar955x_1p0_common_rx_gain_bounds
);
622 } else if (AR_SREV_9580(ah
))
623 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
624 ar9580_1p0_rx_gain_table
);
625 else if (AR_SREV_9462_21(ah
))
626 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
627 ar9462_2p1_common_rx_gain
);
628 else if (AR_SREV_9462_20(ah
))
629 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
630 ar9462_common_rx_gain_table_2p0
);
632 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
633 ar9300Common_rx_gain_table_2p2
);
636 static void ar9003_rx_gain_table_mode1(struct ath_hw
*ah
)
638 if (AR_SREV_9330_12(ah
))
639 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
640 ar9331_common_wo_xlna_rx_gain_1p2
);
641 else if (AR_SREV_9330_11(ah
))
642 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
643 ar9331_common_wo_xlna_rx_gain_1p1
);
644 else if (AR_SREV_9340(ah
))
645 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
646 ar9340Common_wo_xlna_rx_gain_table_1p0
);
647 else if (AR_SREV_9485_11_OR_LATER(ah
))
648 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
649 ar9485Common_wo_xlna_rx_gain_1_1
);
650 else if (AR_SREV_9462_21(ah
))
651 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
652 ar9462_2p1_common_wo_xlna_rx_gain
);
653 else if (AR_SREV_9462_20(ah
))
654 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
655 ar9462_common_wo_xlna_rx_gain_table_2p0
);
656 else if (AR_SREV_9550(ah
)) {
657 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
658 ar955x_1p0_common_wo_xlna_rx_gain_table
);
659 INIT_INI_ARRAY(&ah
->ini_modes_rx_gain_bounds
,
660 ar955x_1p0_common_wo_xlna_rx_gain_bounds
);
661 } else if (AR_SREV_9580(ah
))
662 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
663 ar9580_1p0_wo_xlna_rx_gain_table
);
664 else if (AR_SREV_9565(ah
))
665 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
666 ar9565_1p0_common_wo_xlna_rx_gain_table
);
668 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
669 ar9300Common_wo_xlna_rx_gain_table_2p2
);
672 static void ar9003_rx_gain_table_mode2(struct ath_hw
*ah
)
674 if (AR_SREV_9462_21(ah
)) {
675 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
676 ar9462_2p1_common_mixed_rx_gain
);
677 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_bb_core
,
678 ar9462_2p1_baseband_core_mix_rxgain
);
679 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_bb_postamble
,
680 ar9462_2p1_baseband_postamble_mix_rxgain
);
681 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_5g_xlna
,
682 ar9462_2p1_baseband_postamble_5g_xlna
);
683 } else if (AR_SREV_9462_20(ah
)) {
684 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
685 ar9462_common_mixed_rx_gain_table_2p0
);
686 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_bb_core
,
687 ar9462_2p0_baseband_core_mix_rxgain
);
688 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_bb_postamble
,
689 ar9462_2p0_baseband_postamble_mix_rxgain
);
690 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_5g_xlna
,
691 ar9462_2p0_baseband_postamble_5g_xlna
);
695 static void ar9003_rx_gain_table_mode3(struct ath_hw
*ah
)
697 if (AR_SREV_9462_21(ah
)) {
698 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
699 ar9462_2p1_common_5g_xlna_only_rx_gain
);
700 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_5g_xlna
,
701 ar9462_2p1_baseband_postamble_5g_xlna
);
702 } else if (AR_SREV_9462_20(ah
)) {
703 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
704 ar9462_2p0_5g_xlna_only_rxgain
);
705 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_5g_xlna
,
706 ar9462_2p0_baseband_postamble_5g_xlna
);
710 static void ar9003_rx_gain_table_apply(struct ath_hw
*ah
)
712 switch (ar9003_hw_get_rx_gain_idx(ah
)) {
715 ar9003_rx_gain_table_mode0(ah
);
718 ar9003_rx_gain_table_mode1(ah
);
721 ar9003_rx_gain_table_mode2(ah
);
724 ar9003_rx_gain_table_mode3(ah
);
729 /* set gain table pointers according to values read from the eeprom */
730 static void ar9003_hw_init_mode_gain_regs(struct ath_hw
*ah
)
732 ar9003_tx_gain_table_apply(ah
);
733 ar9003_rx_gain_table_apply(ah
);
737 * Helper for ASPM support.
739 * Disable PLL when in L0s as well as receiver clock when in L1.
740 * This power saving option must be enabled through the SerDes.
742 * Programming the SerDes must go through the same 288 bit serial shift
743 * register as the other analog registers. Hence the 9 writes.
745 static void ar9003_hw_configpcipowersave(struct ath_hw
*ah
,
749 * Increase L1 Entry Latency. Some WB222 boards don't have
750 * this change in eeprom/OTP.
753 if (AR_SREV_9462(ah
)) {
754 u32 val
= ah
->config
.aspm_l1_fix
;
755 if ((val
& 0xff000000) == 0x17000000) {
758 REG_WRITE(ah
, 0x570c, val
);
762 /* Nothing to do on restore for 11N */
763 if (!power_off
/* !restore */) {
764 /* set bit 19 to allow forcing of pcie core into L1 state */
765 REG_SET_BIT(ah
, AR_PCIE_PM_CTRL
, AR_PCIE_PM_CTRL_ENA
);
766 REG_WRITE(ah
, AR_WA
, ah
->WARegVal
);
770 * Configire PCIE after Ini init. SERDES values now come from ini file
771 * This enables PCIe low power mode.
773 if (ah
->config
.pcieSerDesWrite
) {
775 struct ar5416IniArray
*array
;
777 array
= power_off
? &ah
->iniPcieSerdes
:
778 &ah
->iniPcieSerdesLowPower
;
780 for (i
= 0; i
< array
->ia_rows
; i
++) {
783 INI_RA(array
, i
, 1));
788 /* Sets up the AR9003 hardware familiy callbacks */
789 void ar9003_hw_attach_ops(struct ath_hw
*ah
)
791 struct ath_hw_private_ops
*priv_ops
= ath9k_hw_private_ops(ah
);
792 struct ath_hw_ops
*ops
= ath9k_hw_ops(ah
);
794 ar9003_hw_init_mode_regs(ah
);
795 priv_ops
->init_mode_gain_regs
= ar9003_hw_init_mode_gain_regs
;
797 ops
->config_pci_powersave
= ar9003_hw_configpcipowersave
;
799 ar9003_hw_attach_phy_ops(ah
);
800 ar9003_hw_attach_calib_ops(ah
);
801 ar9003_hw_attach_mac_ops(ah
);