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"
33 /* General hardware code for the AR9003 hadware family */
36 * The AR9003 family uses a new INI format (pre, core, post
37 * arrays per subsystem). This provides support for the
38 * AR9003 2.2 chipsets.
40 static void ar9003_hw_init_mode_regs(struct ath_hw
*ah
)
42 if (AR_SREV_9330_11(ah
)) {
44 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
46 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
47 ar9331_1p1_mac_postamble
);
50 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
51 ar9331_1p1_baseband_core
);
52 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
53 ar9331_1p1_baseband_postamble
);
56 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
57 ar9331_1p1_radio_core
);
60 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
61 ar9331_1p1_soc_preamble
);
62 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
63 ar9331_1p1_soc_postamble
);
66 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
67 ar9331_common_rx_gain_1p1
);
68 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
69 ar9331_modes_lowest_ob_db_tx_gain_1p1
);
71 /* Japan 2484 Mhz CCK */
72 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
73 ar9331_1p1_baseband_core_txfir_coeff_japan_2484
);
75 /* additional clock settings */
77 INIT_INI_ARRAY(&ah
->iniAdditional
,
80 INIT_INI_ARRAY(&ah
->iniAdditional
,
82 } else if (AR_SREV_9330_12(ah
)) {
84 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
86 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
87 ar9331_1p2_mac_postamble
);
90 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
91 ar9331_1p2_baseband_core
);
92 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
93 ar9331_1p2_baseband_postamble
);
96 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
97 ar9331_1p2_radio_core
);
100 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
101 ar9331_1p2_soc_preamble
);
102 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
103 ar9331_1p2_soc_postamble
);
106 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
107 ar9331_common_rx_gain_1p2
);
108 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
109 ar9331_modes_lowest_ob_db_tx_gain_1p2
);
111 /* Japan 2484 Mhz CCK */
112 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
113 ar9331_1p2_baseband_core_txfir_coeff_japan_2484
);
115 /* additional clock settings */
116 if (ah
->is_clk_25mhz
)
117 INIT_INI_ARRAY(&ah
->iniAdditional
,
118 ar9331_1p2_xtal_25M
);
120 INIT_INI_ARRAY(&ah
->iniAdditional
,
121 ar9331_1p2_xtal_40M
);
122 } else if (AR_SREV_9340(ah
)) {
124 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
125 ar9340_1p0_mac_core
);
126 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
127 ar9340_1p0_mac_postamble
);
130 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
131 ar9340_1p0_baseband_core
);
132 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
133 ar9340_1p0_baseband_postamble
);
136 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
137 ar9340_1p0_radio_core
);
138 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
139 ar9340_1p0_radio_postamble
);
142 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
143 ar9340_1p0_soc_preamble
);
144 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
145 ar9340_1p0_soc_postamble
);
148 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
149 ar9340Common_wo_xlna_rx_gain_table_1p0
);
150 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
151 ar9340Modes_high_ob_db_tx_gain_table_1p0
);
153 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
154 ar9340Modes_fast_clock_1p0
);
155 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
156 ar9340_1p0_baseband_core_txfir_coeff_japan_2484
);
157 INIT_INI_ARRAY(&ah
->ini_dfs
,
158 ar9340_1p0_baseband_postamble_dfs_channel
);
160 if (!ah
->is_clk_25mhz
)
161 INIT_INI_ARRAY(&ah
->iniAdditional
,
162 ar9340_1p0_radio_core_40M
);
163 } else if (AR_SREV_9485_11_OR_LATER(ah
)) {
165 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
166 ar9485_1_1_mac_core
);
167 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
168 ar9485_1_1_mac_postamble
);
171 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_PRE
], ar9485_1_1
);
172 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
173 ar9485_1_1_baseband_core
);
174 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
175 ar9485_1_1_baseband_postamble
);
178 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
179 ar9485_1_1_radio_core
);
180 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
181 ar9485_1_1_radio_postamble
);
184 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
185 ar9485_1_1_soc_preamble
);
188 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
189 ar9485Common_wo_xlna_rx_gain_1_1
);
190 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
191 ar9485_modes_lowest_ob_db_tx_gain_1_1
);
193 /* Japan 2484 Mhz CCK */
194 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
195 ar9485_1_1_baseband_core_txfir_coeff_japan_2484
);
197 if (ah
->config
.no_pll_pwrsave
) {
198 INIT_INI_ARRAY(&ah
->iniPcieSerdes
,
199 ar9485_1_1_pcie_phy_clkreq_disable_L1
);
200 INIT_INI_ARRAY(&ah
->iniPcieSerdesLowPower
,
201 ar9485_1_1_pcie_phy_clkreq_disable_L1
);
203 INIT_INI_ARRAY(&ah
->iniPcieSerdes
,
204 ar9485_1_1_pll_on_cdr_on_clkreq_disable_L1
);
205 INIT_INI_ARRAY(&ah
->iniPcieSerdesLowPower
,
206 ar9485_1_1_pll_on_cdr_on_clkreq_disable_L1
);
208 } else if (AR_SREV_9462_21(ah
)) {
209 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
210 ar9462_2p1_mac_core
);
211 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
212 ar9462_2p1_mac_postamble
);
213 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
214 ar9462_2p1_baseband_core
);
215 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
216 ar9462_2p1_baseband_postamble
);
217 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
218 ar9462_2p1_radio_core
);
219 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
220 ar9462_2p1_radio_postamble
);
221 INIT_INI_ARRAY(&ah
->ini_radio_post_sys2ant
,
222 ar9462_2p1_radio_postamble_sys2ant
);
223 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
224 ar9462_2p1_soc_preamble
);
225 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
226 ar9462_2p1_soc_postamble
);
227 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
228 ar9462_2p1_common_rx_gain
);
229 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
230 ar9462_2p1_modes_fast_clock
);
231 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
232 ar9462_2p1_baseband_core_txfir_coeff_japan_2484
);
233 INIT_INI_ARRAY(&ah
->iniPcieSerdes
,
234 ar9462_2p1_pciephy_clkreq_disable_L1
);
235 INIT_INI_ARRAY(&ah
->iniPcieSerdesLowPower
,
236 ar9462_2p1_pciephy_clkreq_disable_L1
);
237 } else if (AR_SREV_9462_20(ah
)) {
239 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
], ar9462_2p0_mac_core
);
240 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
241 ar9462_2p0_mac_postamble
);
243 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
244 ar9462_2p0_baseband_core
);
245 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
246 ar9462_2p0_baseband_postamble
);
248 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
249 ar9462_2p0_radio_core
);
250 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
251 ar9462_2p0_radio_postamble
);
252 INIT_INI_ARRAY(&ah
->ini_radio_post_sys2ant
,
253 ar9462_2p0_radio_postamble_sys2ant
);
255 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
256 ar9462_2p0_soc_preamble
);
257 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
258 ar9462_2p0_soc_postamble
);
260 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
261 ar9462_2p0_common_rx_gain
);
263 /* Awake -> Sleep Setting */
264 INIT_INI_ARRAY(&ah
->iniPcieSerdes
,
265 ar9462_2p0_pciephy_clkreq_disable_L1
);
266 /* Sleep -> Awake Setting */
267 INIT_INI_ARRAY(&ah
->iniPcieSerdesLowPower
,
268 ar9462_2p0_pciephy_clkreq_disable_L1
);
270 /* Fast clock modal settings */
271 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
272 ar9462_2p0_modes_fast_clock
);
274 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
275 ar9462_2p0_baseband_core_txfir_coeff_japan_2484
);
276 } else if (AR_SREV_9550(ah
)) {
278 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
279 ar955x_1p0_mac_core
);
280 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
281 ar955x_1p0_mac_postamble
);
284 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
285 ar955x_1p0_baseband_core
);
286 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
287 ar955x_1p0_baseband_postamble
);
290 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
291 ar955x_1p0_radio_core
);
292 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
293 ar955x_1p0_radio_postamble
);
296 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
297 ar955x_1p0_soc_preamble
);
298 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
299 ar955x_1p0_soc_postamble
);
302 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
303 ar955x_1p0_common_wo_xlna_rx_gain_table
);
304 INIT_INI_ARRAY(&ah
->ini_modes_rx_gain_bounds
,
305 ar955x_1p0_common_wo_xlna_rx_gain_bounds
);
306 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
307 ar955x_1p0_modes_xpa_tx_gain_table
);
309 /* Fast clock modal settings */
310 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
311 ar955x_1p0_modes_fast_clock
);
312 } else if (AR_SREV_9531(ah
)) {
313 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
314 qca953x_1p0_mac_core
);
315 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
316 qca953x_1p0_mac_postamble
);
317 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
318 qca953x_1p0_baseband_core
);
319 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
320 qca953x_1p0_baseband_postamble
);
321 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
322 qca953x_1p0_radio_core
);
323 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
324 qca953x_1p0_radio_postamble
);
325 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
326 qca953x_1p0_soc_preamble
);
327 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
328 qca953x_1p0_soc_postamble
);
329 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
330 qca953x_1p0_common_wo_xlna_rx_gain_table
);
331 INIT_INI_ARRAY(&ah
->ini_modes_rx_gain_bounds
,
332 qca953x_1p0_common_wo_xlna_rx_gain_bounds
);
333 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
334 qca953x_1p0_modes_no_xpa_tx_gain_table
);
335 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
336 qca953x_1p0_modes_fast_clock
);
337 } else if (AR_SREV_9580(ah
)) {
339 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
340 ar9580_1p0_mac_core
);
341 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
342 ar9580_1p0_mac_postamble
);
345 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
346 ar9580_1p0_baseband_core
);
347 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
348 ar9580_1p0_baseband_postamble
);
351 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
352 ar9580_1p0_radio_core
);
353 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
354 ar9580_1p0_radio_postamble
);
357 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
358 ar9580_1p0_soc_preamble
);
359 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
360 ar9580_1p0_soc_postamble
);
363 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
364 ar9580_1p0_rx_gain_table
);
365 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
366 ar9580_1p0_low_ob_db_tx_gain_table
);
368 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
369 ar9580_1p0_modes_fast_clock
);
370 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
371 ar9580_1p0_baseband_core_txfir_coeff_japan_2484
);
372 INIT_INI_ARRAY(&ah
->ini_dfs
,
373 ar9580_1p0_baseband_postamble_dfs_channel
);
374 } else if (AR_SREV_9565_11_OR_LATER(ah
)) {
375 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
376 ar9565_1p1_mac_core
);
377 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
378 ar9565_1p1_mac_postamble
);
380 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
381 ar9565_1p1_baseband_core
);
382 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
383 ar9565_1p1_baseband_postamble
);
385 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
386 ar9565_1p1_radio_core
);
387 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
388 ar9565_1p1_radio_postamble
);
390 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
391 ar9565_1p1_soc_preamble
);
392 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
393 ar9565_1p1_soc_postamble
);
395 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
396 ar9565_1p1_Common_rx_gain_table
);
397 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
398 ar9565_1p1_Modes_lowest_ob_db_tx_gain_table
);
400 INIT_INI_ARRAY(&ah
->iniPcieSerdes
,
401 ar9565_1p1_pciephy_clkreq_disable_L1
);
402 INIT_INI_ARRAY(&ah
->iniPcieSerdesLowPower
,
403 ar9565_1p1_pciephy_clkreq_disable_L1
);
405 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
406 ar9565_1p1_modes_fast_clock
);
407 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
408 ar9565_1p1_baseband_core_txfir_coeff_japan_2484
);
409 } else if (AR_SREV_9565(ah
)) {
410 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
411 ar9565_1p0_mac_core
);
412 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
413 ar9565_1p0_mac_postamble
);
415 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
416 ar9565_1p0_baseband_core
);
417 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
418 ar9565_1p0_baseband_postamble
);
420 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
421 ar9565_1p0_radio_core
);
422 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
423 ar9565_1p0_radio_postamble
);
425 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
426 ar9565_1p0_soc_preamble
);
427 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
428 ar9565_1p0_soc_postamble
);
430 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
431 ar9565_1p0_Common_rx_gain_table
);
432 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
433 ar9565_1p0_Modes_lowest_ob_db_tx_gain_table
);
435 INIT_INI_ARRAY(&ah
->iniPcieSerdes
,
436 ar9565_1p0_pciephy_clkreq_disable_L1
);
437 INIT_INI_ARRAY(&ah
->iniPcieSerdesLowPower
,
438 ar9565_1p0_pciephy_clkreq_disable_L1
);
440 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
441 ar9565_1p0_modes_fast_clock
);
442 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
443 ar9565_1p0_baseband_core_txfir_coeff_japan_2484
);
446 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_CORE
],
447 ar9300_2p2_mac_core
);
448 INIT_INI_ARRAY(&ah
->iniMac
[ATH_INI_POST
],
449 ar9300_2p2_mac_postamble
);
452 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_CORE
],
453 ar9300_2p2_baseband_core
);
454 INIT_INI_ARRAY(&ah
->iniBB
[ATH_INI_POST
],
455 ar9300_2p2_baseband_postamble
);
458 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_CORE
],
459 ar9300_2p2_radio_core
);
460 INIT_INI_ARRAY(&ah
->iniRadio
[ATH_INI_POST
],
461 ar9300_2p2_radio_postamble
);
464 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_PRE
],
465 ar9300_2p2_soc_preamble
);
466 INIT_INI_ARRAY(&ah
->iniSOC
[ATH_INI_POST
],
467 ar9300_2p2_soc_postamble
);
470 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
471 ar9300Common_rx_gain_table_2p2
);
472 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
473 ar9300Modes_lowest_ob_db_tx_gain_table_2p2
);
475 /* Load PCIE SERDES settings from INI */
479 INIT_INI_ARRAY(&ah
->iniPcieSerdes
,
480 ar9300PciePhy_pll_on_clkreq_disable_L1_2p2
);
484 INIT_INI_ARRAY(&ah
->iniPcieSerdesLowPower
,
485 ar9300PciePhy_pll_on_clkreq_disable_L1_2p2
);
487 /* Fast clock modal settings */
488 INIT_INI_ARRAY(&ah
->iniModesFastClock
,
489 ar9300Modes_fast_clock_2p2
);
490 INIT_INI_ARRAY(&ah
->iniCckfirJapan2484
,
491 ar9300_2p2_baseband_core_txfir_coeff_japan_2484
);
492 INIT_INI_ARRAY(&ah
->ini_dfs
,
493 ar9300_2p2_baseband_postamble_dfs_channel
);
497 static void ar9003_tx_gain_table_mode0(struct ath_hw
*ah
)
499 if (AR_SREV_9330_12(ah
))
500 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
501 ar9331_modes_lowest_ob_db_tx_gain_1p2
);
502 else if (AR_SREV_9330_11(ah
))
503 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
504 ar9331_modes_lowest_ob_db_tx_gain_1p1
);
505 else if (AR_SREV_9340(ah
))
506 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
507 ar9340Modes_lowest_ob_db_tx_gain_table_1p0
);
508 else if (AR_SREV_9485_11_OR_LATER(ah
))
509 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
510 ar9485_modes_lowest_ob_db_tx_gain_1_1
);
511 else if (AR_SREV_9550(ah
))
512 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
513 ar955x_1p0_modes_xpa_tx_gain_table
);
514 else if (AR_SREV_9531(ah
))
515 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
516 qca953x_1p0_modes_xpa_tx_gain_table
);
517 else if (AR_SREV_9580(ah
))
518 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
519 ar9580_1p0_lowest_ob_db_tx_gain_table
);
520 else if (AR_SREV_9462_21(ah
))
521 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
522 ar9462_2p1_modes_low_ob_db_tx_gain
);
523 else if (AR_SREV_9462_20(ah
))
524 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
525 ar9462_2p0_modes_low_ob_db_tx_gain
);
526 else if (AR_SREV_9565_11(ah
))
527 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
528 ar9565_1p1_modes_low_ob_db_tx_gain_table
);
529 else if (AR_SREV_9565(ah
))
530 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
531 ar9565_1p0_modes_low_ob_db_tx_gain_table
);
533 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
534 ar9300Modes_lowest_ob_db_tx_gain_table_2p2
);
537 static void ar9003_tx_gain_table_mode1(struct ath_hw
*ah
)
539 if (AR_SREV_9330_12(ah
))
540 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
541 ar9331_modes_high_ob_db_tx_gain_1p2
);
542 else if (AR_SREV_9330_11(ah
))
543 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
544 ar9331_modes_high_ob_db_tx_gain_1p1
);
545 else if (AR_SREV_9340(ah
))
546 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
547 ar9340Modes_high_ob_db_tx_gain_table_1p0
);
548 else if (AR_SREV_9485_11_OR_LATER(ah
))
549 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
550 ar9485Modes_high_ob_db_tx_gain_1_1
);
551 else if (AR_SREV_9580(ah
))
552 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
553 ar9580_1p0_high_ob_db_tx_gain_table
);
554 else if (AR_SREV_9550(ah
))
555 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
556 ar955x_1p0_modes_no_xpa_tx_gain_table
);
557 else if (AR_SREV_9531(ah
)) {
558 if (AR_SREV_9531_11(ah
))
559 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
560 qca953x_1p1_modes_no_xpa_tx_gain_table
);
562 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
563 qca953x_1p0_modes_no_xpa_tx_gain_table
);
564 } else if (AR_SREV_9462_21(ah
))
565 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
566 ar9462_2p1_modes_high_ob_db_tx_gain
);
567 else if (AR_SREV_9462_20(ah
))
568 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
569 ar9462_2p0_modes_high_ob_db_tx_gain
);
570 else if (AR_SREV_9565_11(ah
))
571 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
572 ar9565_1p1_modes_high_ob_db_tx_gain_table
);
573 else if (AR_SREV_9565(ah
))
574 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
575 ar9565_1p0_modes_high_ob_db_tx_gain_table
);
577 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
578 ar9300Modes_high_ob_db_tx_gain_table_2p2
);
581 static void ar9003_tx_gain_table_mode2(struct ath_hw
*ah
)
583 if (AR_SREV_9330_12(ah
))
584 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
585 ar9331_modes_low_ob_db_tx_gain_1p2
);
586 else if (AR_SREV_9330_11(ah
))
587 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
588 ar9331_modes_low_ob_db_tx_gain_1p1
);
589 else if (AR_SREV_9340(ah
))
590 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
591 ar9340Modes_low_ob_db_tx_gain_table_1p0
);
592 else if (AR_SREV_9485_11_OR_LATER(ah
))
593 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
594 ar9485Modes_low_ob_db_tx_gain_1_1
);
595 else if (AR_SREV_9580(ah
))
596 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
597 ar9580_1p0_low_ob_db_tx_gain_table
);
598 else if (AR_SREV_9565_11(ah
))
599 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
600 ar9565_1p1_modes_low_ob_db_tx_gain_table
);
601 else if (AR_SREV_9565(ah
))
602 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
603 ar9565_1p0_modes_low_ob_db_tx_gain_table
);
605 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
606 ar9300Modes_low_ob_db_tx_gain_table_2p2
);
609 static void ar9003_tx_gain_table_mode3(struct ath_hw
*ah
)
611 if (AR_SREV_9330_12(ah
))
612 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
613 ar9331_modes_high_power_tx_gain_1p2
);
614 else if (AR_SREV_9330_11(ah
))
615 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
616 ar9331_modes_high_power_tx_gain_1p1
);
617 else if (AR_SREV_9340(ah
))
618 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
619 ar9340Modes_high_power_tx_gain_table_1p0
);
620 else if (AR_SREV_9485_11_OR_LATER(ah
))
621 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
622 ar9485Modes_high_power_tx_gain_1_1
);
623 else if (AR_SREV_9580(ah
))
624 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
625 ar9580_1p0_high_power_tx_gain_table
);
626 else if (AR_SREV_9565_11(ah
))
627 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
628 ar9565_1p1_modes_high_power_tx_gain_table
);
629 else if (AR_SREV_9565(ah
))
630 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
631 ar9565_1p0_modes_high_power_tx_gain_table
);
633 if (ah
->config
.tx_gain_buffalo
)
634 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
635 ar9300Modes_high_power_tx_gain_table_buffalo
);
637 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
638 ar9300Modes_high_power_tx_gain_table_2p2
);
642 static void ar9003_tx_gain_table_mode4(struct ath_hw
*ah
)
644 if (AR_SREV_9340(ah
))
645 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
646 ar9340Modes_mixed_ob_db_tx_gain_table_1p0
);
647 else if (AR_SREV_9580(ah
))
648 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
649 ar9580_1p0_mixed_ob_db_tx_gain_table
);
650 else if (AR_SREV_9462_21(ah
))
651 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
652 ar9462_2p1_modes_mix_ob_db_tx_gain
);
653 else if (AR_SREV_9462_20(ah
))
654 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
655 ar9462_2p0_modes_mix_ob_db_tx_gain
);
657 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
658 ar9300Modes_mixed_ob_db_tx_gain_table_2p2
);
661 static void ar9003_tx_gain_table_mode5(struct ath_hw
*ah
)
663 if (AR_SREV_9485_11_OR_LATER(ah
))
664 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
665 ar9485Modes_green_ob_db_tx_gain_1_1
);
666 else if (AR_SREV_9340(ah
))
667 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
668 ar9340Modes_ub124_tx_gain_table_1p0
);
669 else if (AR_SREV_9580(ah
))
670 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
671 ar9580_1p0_type5_tx_gain_table
);
672 else if (AR_SREV_9300_22(ah
))
673 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
674 ar9300Modes_type5_tx_gain_table_2p2
);
677 static void ar9003_tx_gain_table_mode6(struct ath_hw
*ah
)
679 if (AR_SREV_9340(ah
))
680 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
681 ar9340Modes_low_ob_db_and_spur_tx_gain_table_1p0
);
682 else if (AR_SREV_9485_11_OR_LATER(ah
))
683 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
684 ar9485Modes_green_spur_ob_db_tx_gain_1_1
);
685 else if (AR_SREV_9580(ah
))
686 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
687 ar9580_1p0_type6_tx_gain_table
);
690 static void ar9003_tx_gain_table_mode7(struct ath_hw
*ah
)
692 if (AR_SREV_9340(ah
))
693 INIT_INI_ARRAY(&ah
->iniModesTxGain
,
694 ar9340_cus227_tx_gain_table_1p0
);
697 typedef void (*ath_txgain_tab
)(struct ath_hw
*ah
);
699 static void ar9003_tx_gain_table_apply(struct ath_hw
*ah
)
701 static const ath_txgain_tab modes
[] = {
702 ar9003_tx_gain_table_mode0
,
703 ar9003_tx_gain_table_mode1
,
704 ar9003_tx_gain_table_mode2
,
705 ar9003_tx_gain_table_mode3
,
706 ar9003_tx_gain_table_mode4
,
707 ar9003_tx_gain_table_mode5
,
708 ar9003_tx_gain_table_mode6
,
709 ar9003_tx_gain_table_mode7
,
711 int idx
= ar9003_hw_get_tx_gain_idx(ah
);
713 if (idx
>= ARRAY_SIZE(modes
))
719 static void ar9003_rx_gain_table_mode0(struct ath_hw
*ah
)
721 if (AR_SREV_9330_12(ah
))
722 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
723 ar9331_common_rx_gain_1p2
);
724 else if (AR_SREV_9330_11(ah
))
725 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
726 ar9331_common_rx_gain_1p1
);
727 else if (AR_SREV_9340(ah
))
728 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
729 ar9340Common_rx_gain_table_1p0
);
730 else if (AR_SREV_9485_11_OR_LATER(ah
))
731 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
732 ar9485_common_rx_gain_1_1
);
733 else if (AR_SREV_9550(ah
)) {
734 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
735 ar955x_1p0_common_rx_gain_table
);
736 INIT_INI_ARRAY(&ah
->ini_modes_rx_gain_bounds
,
737 ar955x_1p0_common_rx_gain_bounds
);
738 } else if (AR_SREV_9531(ah
)) {
739 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
740 qca953x_1p0_common_rx_gain_table
);
741 INIT_INI_ARRAY(&ah
->ini_modes_rx_gain_bounds
,
742 qca953x_1p0_common_rx_gain_bounds
);
743 } else if (AR_SREV_9580(ah
))
744 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
745 ar9580_1p0_rx_gain_table
);
746 else if (AR_SREV_9462_21(ah
))
747 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
748 ar9462_2p1_common_rx_gain
);
749 else if (AR_SREV_9462_20(ah
))
750 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
751 ar9462_2p0_common_rx_gain
);
752 else if (AR_SREV_9565_11(ah
))
753 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
754 ar9565_1p1_Common_rx_gain_table
);
755 else if (AR_SREV_9565(ah
))
756 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
757 ar9565_1p0_Common_rx_gain_table
);
759 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
760 ar9300Common_rx_gain_table_2p2
);
763 static void ar9003_rx_gain_table_mode1(struct ath_hw
*ah
)
765 if (AR_SREV_9330_12(ah
))
766 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
767 ar9331_common_wo_xlna_rx_gain_1p2
);
768 else if (AR_SREV_9330_11(ah
))
769 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
770 ar9331_common_wo_xlna_rx_gain_1p1
);
771 else if (AR_SREV_9340(ah
))
772 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
773 ar9340Common_wo_xlna_rx_gain_table_1p0
);
774 else if (AR_SREV_9485_11_OR_LATER(ah
))
775 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
776 ar9485Common_wo_xlna_rx_gain_1_1
);
777 else if (AR_SREV_9462_21(ah
))
778 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
779 ar9462_2p1_common_wo_xlna_rx_gain
);
780 else if (AR_SREV_9462_20(ah
))
781 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
782 ar9462_2p0_common_wo_xlna_rx_gain
);
783 else if (AR_SREV_9550(ah
)) {
784 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
785 ar955x_1p0_common_wo_xlna_rx_gain_table
);
786 INIT_INI_ARRAY(&ah
->ini_modes_rx_gain_bounds
,
787 ar955x_1p0_common_wo_xlna_rx_gain_bounds
);
788 } else if (AR_SREV_9531(ah
)) {
789 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
790 qca953x_1p0_common_wo_xlna_rx_gain_table
);
791 INIT_INI_ARRAY(&ah
->ini_modes_rx_gain_bounds
,
792 qca953x_1p0_common_wo_xlna_rx_gain_bounds
);
793 } else if (AR_SREV_9580(ah
))
794 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
795 ar9580_1p0_wo_xlna_rx_gain_table
);
796 else if (AR_SREV_9565_11(ah
))
797 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
798 ar9565_1p1_common_wo_xlna_rx_gain_table
);
799 else if (AR_SREV_9565(ah
))
800 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
801 ar9565_1p0_common_wo_xlna_rx_gain_table
);
803 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
804 ar9300Common_wo_xlna_rx_gain_table_2p2
);
807 static void ar9003_rx_gain_table_mode2(struct ath_hw
*ah
)
809 if (AR_SREV_9462_21(ah
)) {
810 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
811 ar9462_2p1_common_mixed_rx_gain
);
812 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_bb_core
,
813 ar9462_2p1_baseband_core_mix_rxgain
);
814 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_bb_postamble
,
815 ar9462_2p1_baseband_postamble_mix_rxgain
);
816 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_5g_xlna
,
817 ar9462_2p1_baseband_postamble_5g_xlna
);
818 } else if (AR_SREV_9462_20(ah
)) {
819 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
820 ar9462_2p0_common_mixed_rx_gain
);
821 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_bb_core
,
822 ar9462_2p0_baseband_core_mix_rxgain
);
823 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_bb_postamble
,
824 ar9462_2p0_baseband_postamble_mix_rxgain
);
825 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_5g_xlna
,
826 ar9462_2p0_baseband_postamble_5g_xlna
);
830 static void ar9003_rx_gain_table_mode3(struct ath_hw
*ah
)
832 if (AR_SREV_9462_21(ah
)) {
833 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
834 ar9462_2p1_common_5g_xlna_only_rxgain
);
835 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_5g_xlna
,
836 ar9462_2p1_baseband_postamble_5g_xlna
);
837 } else if (AR_SREV_9462_20(ah
)) {
838 INIT_INI_ARRAY(&ah
->iniModesRxGain
,
839 ar9462_2p0_common_5g_xlna_only_rxgain
);
840 INIT_INI_ARRAY(&ah
->ini_modes_rxgain_5g_xlna
,
841 ar9462_2p0_baseband_postamble_5g_xlna
);
845 static void ar9003_rx_gain_table_apply(struct ath_hw
*ah
)
847 switch (ar9003_hw_get_rx_gain_idx(ah
)) {
850 ar9003_rx_gain_table_mode0(ah
);
853 ar9003_rx_gain_table_mode1(ah
);
856 ar9003_rx_gain_table_mode2(ah
);
859 ar9003_rx_gain_table_mode3(ah
);
864 /* set gain table pointers according to values read from the eeprom */
865 static void ar9003_hw_init_mode_gain_regs(struct ath_hw
*ah
)
867 ar9003_tx_gain_table_apply(ah
);
868 ar9003_rx_gain_table_apply(ah
);
872 * Helper for ASPM support.
874 * Disable PLL when in L0s as well as receiver clock when in L1.
875 * This power saving option must be enabled through the SerDes.
877 * Programming the SerDes must go through the same 288 bit serial shift
878 * register as the other analog registers. Hence the 9 writes.
880 static void ar9003_hw_configpcipowersave(struct ath_hw
*ah
,
884 struct ar5416IniArray
*array
;
887 * Increase L1 Entry Latency. Some WB222 boards don't have
888 * this change in eeprom/OTP.
891 if (AR_SREV_9462(ah
)) {
892 u32 val
= ah
->config
.aspm_l1_fix
;
893 if ((val
& 0xff000000) == 0x17000000) {
896 REG_WRITE(ah
, 0x570c, val
);
900 /* Nothing to do on restore for 11N */
901 if (!power_off
/* !restore */) {
902 /* set bit 19 to allow forcing of pcie core into L1 state */
903 REG_SET_BIT(ah
, AR_PCIE_PM_CTRL
, AR_PCIE_PM_CTRL_ENA
);
904 REG_WRITE(ah
, AR_WA
, ah
->WARegVal
);
908 * Configire PCIE after Ini init. SERDES values now come from ini file
909 * This enables PCIe low power mode.
911 array
= power_off
? &ah
->iniPcieSerdes
:
912 &ah
->iniPcieSerdesLowPower
;
914 for (i
= 0; i
< array
->ia_rows
; i
++) {
917 INI_RA(array
, i
, 1));
921 static void ar9003_hw_init_hang_checks(struct ath_hw
*ah
)
924 * All chips support detection of BB/MAC hangs.
926 ah
->config
.hw_hang_checks
|= HW_BB_WATCHDOG
;
927 ah
->config
.hw_hang_checks
|= HW_MAC_HANG
;
930 * This is not required for AR9580 1.0
932 if (AR_SREV_9300_22(ah
))
933 ah
->config
.hw_hang_checks
|= HW_PHYRESTART_CLC_WAR
;
935 if (AR_SREV_9330(ah
))
936 ah
->bb_watchdog_timeout_ms
= 85;
938 ah
->bb_watchdog_timeout_ms
= 25;
945 * Signature: dcu_chain_state is 0x6 and dcu_complete_state is 0x1.
947 * The state of each DCU chain (mapped to TX queues) is available from these
948 * DMA debug registers:
950 * Chain 0 state : Bits 4:0 of AR_DMADBG_4
951 * Chain 1 state : Bits 9:5 of AR_DMADBG_4
952 * Chain 2 state : Bits 14:10 of AR_DMADBG_4
953 * Chain 3 state : Bits 19:15 of AR_DMADBG_4
954 * Chain 4 state : Bits 24:20 of AR_DMADBG_4
955 * Chain 5 state : Bits 29:25 of AR_DMADBG_4
956 * Chain 6 state : Bits 4:0 of AR_DMADBG_5
957 * Chain 7 state : Bits 9:5 of AR_DMADBG_5
958 * Chain 8 state : Bits 14:10 of AR_DMADBG_5
959 * Chain 9 state : Bits 19:15 of AR_DMADBG_5
961 * The DCU chain state "0x6" means "WAIT_FRDONE" - wait for TX frame to be done.
964 #define NUM_STATUS_READS 50
966 static bool ath9k_hw_verify_hang(struct ath_hw
*ah
, unsigned int queue
)
968 u32 dma_dbg_chain
, dma_dbg_complete
;
969 u8 dcu_chain_state
, dcu_complete_state
;
972 for (i
= 0; i
< NUM_STATUS_READS
; i
++) {
974 dma_dbg_chain
= REG_READ(ah
, AR_DMADBG_4
);
976 dma_dbg_chain
= REG_READ(ah
, AR_DMADBG_5
);
978 dma_dbg_complete
= REG_READ(ah
, AR_DMADBG_6
);
980 dcu_chain_state
= (dma_dbg_chain
>> (5 * queue
)) & 0x1f;
981 dcu_complete_state
= dma_dbg_complete
& 0x3;
983 if ((dcu_chain_state
!= 0x6) || (dcu_complete_state
!= 0x1))
987 ath_dbg(ath9k_hw_common(ah
), RESET
,
988 "MAC Hang signature found for queue: %d\n", queue
);
993 static bool ar9003_hw_detect_mac_hang(struct ath_hw
*ah
)
995 u32 dma_dbg_4
, dma_dbg_5
, dma_dbg_6
, chk_dbg
;
996 u8 dcu_chain_state
, dcu_complete_state
;
997 bool dcu_wait_frdone
= false;
998 unsigned long chk_dcu
= 0;
1001 dma_dbg_4
= REG_READ(ah
, AR_DMADBG_4
);
1002 dma_dbg_5
= REG_READ(ah
, AR_DMADBG_5
);
1003 dma_dbg_6
= REG_READ(ah
, AR_DMADBG_6
);
1005 dcu_complete_state
= dma_dbg_6
& 0x3;
1006 if (dcu_complete_state
!= 0x1)
1009 for (i
= 0; i
< ATH9K_NUM_TX_QUEUES
; i
++) {
1011 chk_dbg
= dma_dbg_4
;
1013 chk_dbg
= dma_dbg_5
;
1015 dcu_chain_state
= (chk_dbg
>> (5 * i
)) & 0x1f;
1016 if (dcu_chain_state
== 0x6) {
1017 dcu_wait_frdone
= true;
1022 if ((dcu_complete_state
== 0x1) && dcu_wait_frdone
) {
1023 for_each_set_bit(i
, &chk_dcu
, ATH9K_NUM_TX_QUEUES
) {
1024 if (ath9k_hw_verify_hang(ah
, i
))
1032 /* Sets up the AR9003 hardware familiy callbacks */
1033 void ar9003_hw_attach_ops(struct ath_hw
*ah
)
1035 struct ath_hw_private_ops
*priv_ops
= ath9k_hw_private_ops(ah
);
1036 struct ath_hw_ops
*ops
= ath9k_hw_ops(ah
);
1038 ar9003_hw_init_mode_regs(ah
);
1039 priv_ops
->init_mode_gain_regs
= ar9003_hw_init_mode_gain_regs
;
1040 priv_ops
->init_hang_checks
= ar9003_hw_init_hang_checks
;
1041 priv_ops
->detect_mac_hang
= ar9003_hw_detect_mac_hang
;
1043 ops
->config_pci_powersave
= ar9003_hw_configpcipowersave
;
1045 ar9003_hw_attach_phy_ops(ah
);
1046 ar9003_hw_attach_calib_ops(ah
);
1047 ar9003_hw_attach_mac_ops(ah
);