]> git.kernelconcepts.de Git - karo-tx-linux.git/blob - drivers/net/wireless/ath/ath9k/ar9003_hw.c
Merge tag 'efi-urgent' of git://git.kernel.org/pub/scm/linux/kernel/git/mfleming...
[karo-tx-linux.git] / drivers / net / wireless / ath / ath9k / ar9003_hw.c
1 /*
2  * Copyright (c) 2008-2011 Atheros Communications Inc.
3  *
4  * Permission to use, copy, modify, and/or distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16
17 #include "hw.h"
18 #include "ar9003_mac.h"
19 #include "ar9003_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"
33
34 /* General hardware code for the AR9003 hadware family */
35
36 /*
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.
40  */
41 static void ar9003_hw_init_mode_regs(struct ath_hw *ah)
42 {
43         if (AR_SREV_9330_11(ah)) {
44                 /* mac */
45                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
46                                 ar9331_1p1_mac_core);
47                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
48                                 ar9331_1p1_mac_postamble);
49
50                 /* bb */
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);
55
56                 /* radio */
57                 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
58                                 ar9331_1p1_radio_core);
59
60                 /* soc */
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);
65
66                 /* rx/tx gain */
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);
71
72                 /* Japan 2484 Mhz CCK */
73                 INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
74                                ar9331_1p1_baseband_core_txfir_coeff_japan_2484);
75
76                 /* additional clock settings */
77                 if (ah->is_clk_25mhz)
78                         INIT_INI_ARRAY(&ah->iniAdditional,
79                                         ar9331_1p1_xtal_25M);
80                 else
81                         INIT_INI_ARRAY(&ah->iniAdditional,
82                                         ar9331_1p1_xtal_40M);
83         } else if (AR_SREV_9330_12(ah)) {
84                 /* mac */
85                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
86                                 ar9331_1p2_mac_core);
87                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
88                                 ar9331_1p2_mac_postamble);
89
90                 /* bb */
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);
95
96                 /* radio */
97                 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
98                                 ar9331_1p2_radio_core);
99
100                 /* soc */
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);
105
106                 /* rx/tx gain */
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);
111
112                 /* Japan 2484 Mhz CCK */
113                 INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
114                                ar9331_1p2_baseband_core_txfir_coeff_japan_2484);
115
116                 /* additional clock settings */
117                 if (ah->is_clk_25mhz)
118                         INIT_INI_ARRAY(&ah->iniAdditional,
119                                         ar9331_1p2_xtal_25M);
120                 else
121                         INIT_INI_ARRAY(&ah->iniAdditional,
122                                         ar9331_1p2_xtal_40M);
123         } else if (AR_SREV_9340(ah)) {
124                 /* mac */
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);
129
130                 /* bb */
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);
135
136                 /* radio */
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);
141
142                 /* soc */
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);
147
148                 /* rx/tx gain */
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);
153
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);
160
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)) {
165                 /* mac */
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);
170
171                 /* bb */
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);
177
178                 /* radio */
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);
183
184                 /* soc */
185                 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
186                                 ar9485_1_1_soc_preamble);
187
188                 /* rx/tx gain */
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);
193
194                 /* Japan 2484 Mhz CCK */
195                 INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
196                                ar9485_1_1_baseband_core_txfir_coeff_japan_2484);
197
198                 if (ah->config.no_pll_pwrsave) {
199                         INIT_INI_ARRAY(&ah->iniPcieSerdes,
200                                        ar9485_1_1_pcie_phy_clkreq_disable_L1);
201                         INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
202                                        ar9485_1_1_pcie_phy_clkreq_disable_L1);
203                 } else {
204                         INIT_INI_ARRAY(&ah->iniPcieSerdes,
205                                        ar9485_1_1_pll_on_cdr_on_clkreq_disable_L1);
206                         INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
207                                        ar9485_1_1_pll_on_cdr_on_clkreq_disable_L1);
208                 }
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);
234                 INIT_INI_ARRAY(&ah->iniPcieSerdes,
235                                ar9462_2p1_pciephy_clkreq_disable_L1);
236                 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
237                                ar9462_2p1_pciephy_clkreq_disable_L1);
238         } else if (AR_SREV_9462_20(ah)) {
239
240                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], ar9462_2p0_mac_core);
241                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
242                                 ar9462_2p0_mac_postamble);
243
244                 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
245                                 ar9462_2p0_baseband_core);
246                 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
247                                 ar9462_2p0_baseband_postamble);
248
249                 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
250                                 ar9462_2p0_radio_core);
251                 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
252                                 ar9462_2p0_radio_postamble);
253                 INIT_INI_ARRAY(&ah->ini_radio_post_sys2ant,
254                                 ar9462_2p0_radio_postamble_sys2ant);
255
256                 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
257                                 ar9462_2p0_soc_preamble);
258                 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
259                                 ar9462_2p0_soc_postamble);
260
261                 INIT_INI_ARRAY(&ah->iniModesRxGain,
262                                 ar9462_2p0_common_rx_gain);
263
264                 /* Awake -> Sleep Setting */
265                 INIT_INI_ARRAY(&ah->iniPcieSerdes,
266                                ar9462_2p0_pciephy_clkreq_disable_L1);
267                 /* Sleep -> Awake Setting */
268                 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
269                                ar9462_2p0_pciephy_clkreq_disable_L1);
270
271                 /* Fast clock modal settings */
272                 INIT_INI_ARRAY(&ah->iniModesFastClock,
273                                 ar9462_2p0_modes_fast_clock);
274
275                 INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
276                                ar9462_2p0_baseband_core_txfir_coeff_japan_2484);
277         } else if (AR_SREV_9550(ah)) {
278                 /* mac */
279                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
280                                 ar955x_1p0_mac_core);
281                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
282                                 ar955x_1p0_mac_postamble);
283
284                 /* bb */
285                 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
286                                 ar955x_1p0_baseband_core);
287                 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
288                                 ar955x_1p0_baseband_postamble);
289
290                 /* radio */
291                 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
292                                 ar955x_1p0_radio_core);
293                 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
294                                 ar955x_1p0_radio_postamble);
295
296                 /* soc */
297                 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
298                                 ar955x_1p0_soc_preamble);
299                 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
300                                 ar955x_1p0_soc_postamble);
301
302                 /* rx/tx gain */
303                 INIT_INI_ARRAY(&ah->iniModesRxGain,
304                         ar955x_1p0_common_wo_xlna_rx_gain_table);
305                 INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
306                         ar955x_1p0_common_wo_xlna_rx_gain_bounds);
307                 INIT_INI_ARRAY(&ah->iniModesTxGain,
308                                 ar955x_1p0_modes_xpa_tx_gain_table);
309
310                 /* Fast clock modal settings */
311                 INIT_INI_ARRAY(&ah->iniModesFastClock,
312                                 ar955x_1p0_modes_fast_clock);
313         } else if (AR_SREV_9531(ah)) {
314                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
315                                qca953x_1p0_mac_core);
316                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
317                                qca953x_1p0_mac_postamble);
318                 if (AR_SREV_9531_20(ah)) {
319                         INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
320                                        qca953x_2p0_baseband_core);
321                         INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
322                                        qca953x_2p0_baseband_postamble);
323                 } else {
324                         INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
325                                        qca953x_1p0_baseband_core);
326                         INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
327                                        qca953x_1p0_baseband_postamble);
328                 }
329                 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
330                                qca953x_1p0_radio_core);
331                 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
332                                qca953x_1p0_radio_postamble);
333                 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
334                                qca953x_1p0_soc_preamble);
335                 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
336                                qca953x_1p0_soc_postamble);
337
338                 if (AR_SREV_9531_20(ah)) {
339                         INIT_INI_ARRAY(&ah->iniModesRxGain,
340                                        qca953x_2p0_common_wo_xlna_rx_gain_table);
341                         INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
342                                        qca953x_2p0_common_wo_xlna_rx_gain_bounds);
343                 } else {
344                         INIT_INI_ARRAY(&ah->iniModesRxGain,
345                                        qca953x_1p0_common_wo_xlna_rx_gain_table);
346                         INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
347                                        qca953x_1p0_common_wo_xlna_rx_gain_bounds);
348                 }
349
350                 if (AR_SREV_9531_20(ah))
351                         INIT_INI_ARRAY(&ah->iniModesTxGain,
352                                        qca953x_2p0_modes_no_xpa_tx_gain_table);
353                 else if (AR_SREV_9531_11(ah))
354                         INIT_INI_ARRAY(&ah->iniModesTxGain,
355                                        qca953x_1p1_modes_no_xpa_tx_gain_table);
356                 else
357                         INIT_INI_ARRAY(&ah->iniModesTxGain,
358                                        qca953x_1p0_modes_no_xpa_tx_gain_table);
359
360                 INIT_INI_ARRAY(&ah->iniModesFastClock,
361                                qca953x_1p0_modes_fast_clock);
362         } else if (AR_SREV_9561(ah)) {
363                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
364                                qca956x_1p0_mac_core);
365                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
366                                qca956x_1p0_mac_postamble);
367
368                 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
369                                qca956x_1p0_baseband_core);
370                 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
371                                qca956x_1p0_baseband_postamble);
372
373                 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
374                                qca956x_1p0_radio_core);
375                 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
376                                qca956x_1p0_radio_postamble);
377
378                 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
379                                qca956x_1p0_soc_preamble);
380                 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
381                                qca956x_1p0_soc_postamble);
382
383                 INIT_INI_ARRAY(&ah->iniModesRxGain,
384                                qca956x_1p0_common_wo_xlna_rx_gain_table);
385                 INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
386                                qca956x_1p0_common_wo_xlna_rx_gain_bounds);
387                 INIT_INI_ARRAY(&ah->iniModesTxGain,
388                                qca956x_1p0_modes_no_xpa_tx_gain_table);
389
390                 INIT_INI_ARRAY(&ah->ini_dfs,
391                                qca956x_1p0_baseband_postamble_dfs_channel);
392                 INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
393                                qca956x_1p0_baseband_core_txfir_coeff_japan_2484);
394                 INIT_INI_ARRAY(&ah->iniModesFastClock,
395                                qca956x_1p0_modes_fast_clock);
396         } else if (AR_SREV_9580(ah)) {
397                 /* mac */
398                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
399                                 ar9580_1p0_mac_core);
400                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
401                                 ar9580_1p0_mac_postamble);
402
403                 /* bb */
404                 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
405                                 ar9580_1p0_baseband_core);
406                 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
407                                 ar9580_1p0_baseband_postamble);
408
409                 /* radio */
410                 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
411                                 ar9580_1p0_radio_core);
412                 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
413                                 ar9580_1p0_radio_postamble);
414
415                 /* soc */
416                 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
417                                 ar9580_1p0_soc_preamble);
418                 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
419                                 ar9580_1p0_soc_postamble);
420
421                 /* rx/tx gain */
422                 INIT_INI_ARRAY(&ah->iniModesRxGain,
423                                 ar9580_1p0_rx_gain_table);
424                 INIT_INI_ARRAY(&ah->iniModesTxGain,
425                                 ar9580_1p0_low_ob_db_tx_gain_table);
426
427                 INIT_INI_ARRAY(&ah->iniModesFastClock,
428                                ar9580_1p0_modes_fast_clock);
429                 INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
430                                ar9580_1p0_baseband_core_txfir_coeff_japan_2484);
431                 INIT_INI_ARRAY(&ah->ini_dfs,
432                                ar9580_1p0_baseband_postamble_dfs_channel);
433         } else if (AR_SREV_9565_11_OR_LATER(ah)) {
434                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
435                                ar9565_1p1_mac_core);
436                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
437                                ar9565_1p1_mac_postamble);
438
439                 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
440                                ar9565_1p1_baseband_core);
441                 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
442                                ar9565_1p1_baseband_postamble);
443
444                 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
445                                ar9565_1p1_radio_core);
446                 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
447                                ar9565_1p1_radio_postamble);
448
449                 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
450                                ar9565_1p1_soc_preamble);
451                 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
452                                ar9565_1p1_soc_postamble);
453
454                 INIT_INI_ARRAY(&ah->iniModesRxGain,
455                                ar9565_1p1_Common_rx_gain_table);
456                 INIT_INI_ARRAY(&ah->iniModesTxGain,
457                                ar9565_1p1_Modes_lowest_ob_db_tx_gain_table);
458
459                 INIT_INI_ARRAY(&ah->iniPcieSerdes,
460                                ar9565_1p1_pciephy_clkreq_disable_L1);
461                 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
462                                ar9565_1p1_pciephy_clkreq_disable_L1);
463
464                 INIT_INI_ARRAY(&ah->iniModesFastClock,
465                                 ar9565_1p1_modes_fast_clock);
466                 INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
467                                ar9565_1p1_baseband_core_txfir_coeff_japan_2484);
468         } else if (AR_SREV_9565(ah)) {
469                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
470                                ar9565_1p0_mac_core);
471                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
472                                ar9565_1p0_mac_postamble);
473
474                 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
475                                ar9565_1p0_baseband_core);
476                 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
477                                ar9565_1p0_baseband_postamble);
478
479                 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
480                                ar9565_1p0_radio_core);
481                 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
482                                ar9565_1p0_radio_postamble);
483
484                 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
485                                ar9565_1p0_soc_preamble);
486                 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
487                                ar9565_1p0_soc_postamble);
488
489                 INIT_INI_ARRAY(&ah->iniModesRxGain,
490                                ar9565_1p0_Common_rx_gain_table);
491                 INIT_INI_ARRAY(&ah->iniModesTxGain,
492                                ar9565_1p0_Modes_lowest_ob_db_tx_gain_table);
493
494                 INIT_INI_ARRAY(&ah->iniPcieSerdes,
495                                ar9565_1p0_pciephy_clkreq_disable_L1);
496                 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
497                                ar9565_1p0_pciephy_clkreq_disable_L1);
498
499                 INIT_INI_ARRAY(&ah->iniModesFastClock,
500                                 ar9565_1p0_modes_fast_clock);
501                 INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
502                                ar9565_1p0_baseband_core_txfir_coeff_japan_2484);
503         } else {
504                 /* mac */
505                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
506                                 ar9300_2p2_mac_core);
507                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
508                                 ar9300_2p2_mac_postamble);
509
510                 /* bb */
511                 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
512                                 ar9300_2p2_baseband_core);
513                 INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
514                                 ar9300_2p2_baseband_postamble);
515
516                 /* radio */
517                 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
518                                 ar9300_2p2_radio_core);
519                 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
520                                 ar9300_2p2_radio_postamble);
521
522                 /* soc */
523                 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
524                                 ar9300_2p2_soc_preamble);
525                 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
526                                 ar9300_2p2_soc_postamble);
527
528                 /* rx/tx gain */
529                 INIT_INI_ARRAY(&ah->iniModesRxGain,
530                                 ar9300Common_rx_gain_table_2p2);
531                 INIT_INI_ARRAY(&ah->iniModesTxGain,
532                                 ar9300Modes_lowest_ob_db_tx_gain_table_2p2);
533
534                 /* Load PCIE SERDES settings from INI */
535
536                 /* Awake Setting */
537
538                 INIT_INI_ARRAY(&ah->iniPcieSerdes,
539                                 ar9300PciePhy_pll_on_clkreq_disable_L1_2p2);
540
541                 /* Sleep Setting */
542
543                 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
544                                 ar9300PciePhy_pll_on_clkreq_disable_L1_2p2);
545
546                 /* Fast clock modal settings */
547                 INIT_INI_ARRAY(&ah->iniModesFastClock,
548                                ar9300Modes_fast_clock_2p2);
549                 INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
550                                ar9300_2p2_baseband_core_txfir_coeff_japan_2484);
551                 INIT_INI_ARRAY(&ah->ini_dfs,
552                                ar9300_2p2_baseband_postamble_dfs_channel);
553         }
554 }
555
556 static void ar9003_tx_gain_table_mode0(struct ath_hw *ah)
557 {
558         if (AR_SREV_9330_12(ah))
559                 INIT_INI_ARRAY(&ah->iniModesTxGain,
560                         ar9331_modes_lowest_ob_db_tx_gain_1p2);
561         else if (AR_SREV_9330_11(ah))
562                 INIT_INI_ARRAY(&ah->iniModesTxGain,
563                         ar9331_modes_lowest_ob_db_tx_gain_1p1);
564         else if (AR_SREV_9340(ah))
565                 INIT_INI_ARRAY(&ah->iniModesTxGain,
566                         ar9340Modes_lowest_ob_db_tx_gain_table_1p0);
567         else if (AR_SREV_9485_11_OR_LATER(ah))
568                 INIT_INI_ARRAY(&ah->iniModesTxGain,
569                         ar9485_modes_lowest_ob_db_tx_gain_1_1);
570         else if (AR_SREV_9550(ah))
571                 INIT_INI_ARRAY(&ah->iniModesTxGain,
572                         ar955x_1p0_modes_xpa_tx_gain_table);
573         else if (AR_SREV_9531_10(ah))
574                 INIT_INI_ARRAY(&ah->iniModesTxGain,
575                                qca953x_1p0_modes_xpa_tx_gain_table);
576         else if (AR_SREV_9531_11(ah))
577                 INIT_INI_ARRAY(&ah->iniModesTxGain,
578                                qca953x_1p1_modes_xpa_tx_gain_table);
579         else if (AR_SREV_9531_20(ah))
580                 INIT_INI_ARRAY(&ah->iniModesTxGain,
581                                qca953x_2p0_modes_xpa_tx_gain_table);
582         else if (AR_SREV_9561(ah))
583                 INIT_INI_ARRAY(&ah->iniModesTxGain,
584                                qca956x_1p0_modes_xpa_tx_gain_table);
585         else if (AR_SREV_9580(ah))
586                 INIT_INI_ARRAY(&ah->iniModesTxGain,
587                         ar9580_1p0_lowest_ob_db_tx_gain_table);
588         else if (AR_SREV_9462_21(ah))
589                 INIT_INI_ARRAY(&ah->iniModesTxGain,
590                         ar9462_2p1_modes_low_ob_db_tx_gain);
591         else if (AR_SREV_9462_20(ah))
592                 INIT_INI_ARRAY(&ah->iniModesTxGain,
593                         ar9462_2p0_modes_low_ob_db_tx_gain);
594         else if (AR_SREV_9565_11(ah))
595                 INIT_INI_ARRAY(&ah->iniModesTxGain,
596                                ar9565_1p1_modes_low_ob_db_tx_gain_table);
597         else if (AR_SREV_9565(ah))
598                 INIT_INI_ARRAY(&ah->iniModesTxGain,
599                                ar9565_1p0_modes_low_ob_db_tx_gain_table);
600         else
601                 INIT_INI_ARRAY(&ah->iniModesTxGain,
602                         ar9300Modes_lowest_ob_db_tx_gain_table_2p2);
603 }
604
605 static void ar9003_tx_gain_table_mode1(struct ath_hw *ah)
606 {
607         if (AR_SREV_9330_12(ah))
608                 INIT_INI_ARRAY(&ah->iniModesTxGain,
609                         ar9331_modes_high_ob_db_tx_gain_1p2);
610         else if (AR_SREV_9330_11(ah))
611                 INIT_INI_ARRAY(&ah->iniModesTxGain,
612                         ar9331_modes_high_ob_db_tx_gain_1p1);
613         else if (AR_SREV_9340(ah))
614                 INIT_INI_ARRAY(&ah->iniModesTxGain,
615                         ar9340Modes_high_ob_db_tx_gain_table_1p0);
616         else if (AR_SREV_9485_11_OR_LATER(ah))
617                 INIT_INI_ARRAY(&ah->iniModesTxGain,
618                         ar9485Modes_high_ob_db_tx_gain_1_1);
619         else if (AR_SREV_9580(ah))
620                 INIT_INI_ARRAY(&ah->iniModesTxGain,
621                         ar9580_1p0_high_ob_db_tx_gain_table);
622         else if (AR_SREV_9550(ah))
623                 INIT_INI_ARRAY(&ah->iniModesTxGain,
624                         ar955x_1p0_modes_no_xpa_tx_gain_table);
625         else if (AR_SREV_9531(ah)) {
626                 if (AR_SREV_9531_20(ah))
627                         INIT_INI_ARRAY(&ah->iniModesTxGain,
628                                        qca953x_2p0_modes_no_xpa_tx_gain_table);
629                 else if (AR_SREV_9531_11(ah))
630                         INIT_INI_ARRAY(&ah->iniModesTxGain,
631                                        qca953x_1p1_modes_no_xpa_tx_gain_table);
632                 else
633                         INIT_INI_ARRAY(&ah->iniModesTxGain,
634                                        qca953x_1p0_modes_no_xpa_tx_gain_table);
635         } else if (AR_SREV_9561(ah))
636                 INIT_INI_ARRAY(&ah->iniModesTxGain,
637                                qca956x_1p0_modes_no_xpa_tx_gain_table);
638         else if (AR_SREV_9462_21(ah))
639                 INIT_INI_ARRAY(&ah->iniModesTxGain,
640                         ar9462_2p1_modes_high_ob_db_tx_gain);
641         else if (AR_SREV_9462_20(ah))
642                 INIT_INI_ARRAY(&ah->iniModesTxGain,
643                         ar9462_2p0_modes_high_ob_db_tx_gain);
644         else if (AR_SREV_9565_11(ah))
645                 INIT_INI_ARRAY(&ah->iniModesTxGain,
646                                ar9565_1p1_modes_high_ob_db_tx_gain_table);
647         else if (AR_SREV_9565(ah))
648                 INIT_INI_ARRAY(&ah->iniModesTxGain,
649                                ar9565_1p0_modes_high_ob_db_tx_gain_table);
650         else
651                 INIT_INI_ARRAY(&ah->iniModesTxGain,
652                         ar9300Modes_high_ob_db_tx_gain_table_2p2);
653 }
654
655 static void ar9003_tx_gain_table_mode2(struct ath_hw *ah)
656 {
657         if (AR_SREV_9330_12(ah))
658                 INIT_INI_ARRAY(&ah->iniModesTxGain,
659                         ar9331_modes_low_ob_db_tx_gain_1p2);
660         else if (AR_SREV_9330_11(ah))
661                 INIT_INI_ARRAY(&ah->iniModesTxGain,
662                         ar9331_modes_low_ob_db_tx_gain_1p1);
663         else if (AR_SREV_9340(ah))
664                 INIT_INI_ARRAY(&ah->iniModesTxGain,
665                         ar9340Modes_low_ob_db_tx_gain_table_1p0);
666         else if (AR_SREV_9485_11_OR_LATER(ah))
667                 INIT_INI_ARRAY(&ah->iniModesTxGain,
668                         ar9485Modes_low_ob_db_tx_gain_1_1);
669         else if (AR_SREV_9580(ah))
670                 INIT_INI_ARRAY(&ah->iniModesTxGain,
671                         ar9580_1p0_low_ob_db_tx_gain_table);
672         else if (AR_SREV_9561(ah))
673                 INIT_INI_ARRAY(&ah->iniModesTxGain,
674                                qca956x_1p0_modes_no_xpa_low_ob_db_tx_gain_table);
675         else if (AR_SREV_9565_11(ah))
676                 INIT_INI_ARRAY(&ah->iniModesTxGain,
677                                ar9565_1p1_modes_low_ob_db_tx_gain_table);
678         else if (AR_SREV_9565(ah))
679                 INIT_INI_ARRAY(&ah->iniModesTxGain,
680                                ar9565_1p0_modes_low_ob_db_tx_gain_table);
681         else
682                 INIT_INI_ARRAY(&ah->iniModesTxGain,
683                         ar9300Modes_low_ob_db_tx_gain_table_2p2);
684 }
685
686 static void ar9003_tx_gain_table_mode3(struct ath_hw *ah)
687 {
688         if (AR_SREV_9330_12(ah))
689                 INIT_INI_ARRAY(&ah->iniModesTxGain,
690                         ar9331_modes_high_power_tx_gain_1p2);
691         else if (AR_SREV_9330_11(ah))
692                 INIT_INI_ARRAY(&ah->iniModesTxGain,
693                         ar9331_modes_high_power_tx_gain_1p1);
694         else if (AR_SREV_9340(ah))
695                 INIT_INI_ARRAY(&ah->iniModesTxGain,
696                         ar9340Modes_high_power_tx_gain_table_1p0);
697         else if (AR_SREV_9485_11_OR_LATER(ah))
698                 INIT_INI_ARRAY(&ah->iniModesTxGain,
699                         ar9485Modes_high_power_tx_gain_1_1);
700         else if (AR_SREV_9580(ah))
701                 INIT_INI_ARRAY(&ah->iniModesTxGain,
702                         ar9580_1p0_high_power_tx_gain_table);
703         else if (AR_SREV_9565_11(ah))
704                 INIT_INI_ARRAY(&ah->iniModesTxGain,
705                                ar9565_1p1_modes_high_power_tx_gain_table);
706         else if (AR_SREV_9565(ah))
707                 INIT_INI_ARRAY(&ah->iniModesTxGain,
708                                ar9565_1p0_modes_high_power_tx_gain_table);
709         else {
710                 if (ah->config.tx_gain_buffalo)
711                         INIT_INI_ARRAY(&ah->iniModesTxGain,
712                                        ar9300Modes_high_power_tx_gain_table_buffalo);
713                 else
714                         INIT_INI_ARRAY(&ah->iniModesTxGain,
715                                        ar9300Modes_high_power_tx_gain_table_2p2);
716         }
717 }
718
719 static void ar9003_tx_gain_table_mode4(struct ath_hw *ah)
720 {
721         if (AR_SREV_9340(ah))
722                 INIT_INI_ARRAY(&ah->iniModesTxGain,
723                         ar9340Modes_mixed_ob_db_tx_gain_table_1p0);
724         else if (AR_SREV_9580(ah))
725                 INIT_INI_ARRAY(&ah->iniModesTxGain,
726                         ar9580_1p0_mixed_ob_db_tx_gain_table);
727         else if (AR_SREV_9462_21(ah))
728                 INIT_INI_ARRAY(&ah->iniModesTxGain,
729                        ar9462_2p1_modes_mix_ob_db_tx_gain);
730         else if (AR_SREV_9462_20(ah))
731                 INIT_INI_ARRAY(&ah->iniModesTxGain,
732                        ar9462_2p0_modes_mix_ob_db_tx_gain);
733         else
734                 INIT_INI_ARRAY(&ah->iniModesTxGain,
735                         ar9300Modes_mixed_ob_db_tx_gain_table_2p2);
736 }
737
738 static void ar9003_tx_gain_table_mode5(struct ath_hw *ah)
739 {
740         if (AR_SREV_9485_11_OR_LATER(ah))
741                 INIT_INI_ARRAY(&ah->iniModesTxGain,
742                         ar9485Modes_green_ob_db_tx_gain_1_1);
743         else if (AR_SREV_9580(ah))
744                 INIT_INI_ARRAY(&ah->iniModesTxGain,
745                         ar9580_1p0_type5_tx_gain_table);
746         else if (AR_SREV_9561(ah))
747                 INIT_INI_ARRAY(&ah->iniModesTxGain,
748                                qca956x_1p0_modes_no_xpa_green_tx_gain_table);
749         else if (AR_SREV_9300_22(ah))
750                 INIT_INI_ARRAY(&ah->iniModesTxGain,
751                         ar9300Modes_type5_tx_gain_table_2p2);
752 }
753
754 static void ar9003_tx_gain_table_mode6(struct ath_hw *ah)
755 {
756         if (AR_SREV_9340(ah))
757                 INIT_INI_ARRAY(&ah->iniModesTxGain,
758                         ar9340Modes_low_ob_db_and_spur_tx_gain_table_1p0);
759         else if (AR_SREV_9485_11_OR_LATER(ah))
760                 INIT_INI_ARRAY(&ah->iniModesTxGain,
761                         ar9485Modes_green_spur_ob_db_tx_gain_1_1);
762         else if (AR_SREV_9580(ah))
763                 INIT_INI_ARRAY(&ah->iniModesTxGain,
764                         ar9580_1p0_type6_tx_gain_table);
765 }
766
767 static void ar9003_tx_gain_table_mode7(struct ath_hw *ah)
768 {
769         if (AR_SREV_9340(ah))
770                 INIT_INI_ARRAY(&ah->iniModesTxGain,
771                                ar9340_cus227_tx_gain_table_1p0);
772 }
773
774 typedef void (*ath_txgain_tab)(struct ath_hw *ah);
775
776 static void ar9003_tx_gain_table_apply(struct ath_hw *ah)
777 {
778         static const ath_txgain_tab modes[] = {
779                 ar9003_tx_gain_table_mode0,
780                 ar9003_tx_gain_table_mode1,
781                 ar9003_tx_gain_table_mode2,
782                 ar9003_tx_gain_table_mode3,
783                 ar9003_tx_gain_table_mode4,
784                 ar9003_tx_gain_table_mode5,
785                 ar9003_tx_gain_table_mode6,
786                 ar9003_tx_gain_table_mode7,
787         };
788         int idx = ar9003_hw_get_tx_gain_idx(ah);
789
790         if (idx >= ARRAY_SIZE(modes))
791                 idx = 0;
792
793         modes[idx](ah);
794 }
795
796 static void ar9003_rx_gain_table_mode0(struct ath_hw *ah)
797 {
798         if (AR_SREV_9330_12(ah))
799                 INIT_INI_ARRAY(&ah->iniModesRxGain,
800                                 ar9331_common_rx_gain_1p2);
801         else if (AR_SREV_9330_11(ah))
802                 INIT_INI_ARRAY(&ah->iniModesRxGain,
803                                 ar9331_common_rx_gain_1p1);
804         else if (AR_SREV_9340(ah))
805                 INIT_INI_ARRAY(&ah->iniModesRxGain,
806                                 ar9340Common_rx_gain_table_1p0);
807         else if (AR_SREV_9485_11_OR_LATER(ah))
808                 INIT_INI_ARRAY(&ah->iniModesRxGain,
809                                ar9485_common_rx_gain_1_1);
810         else if (AR_SREV_9550(ah)) {
811                 INIT_INI_ARRAY(&ah->iniModesRxGain,
812                                 ar955x_1p0_common_rx_gain_table);
813                 INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
814                                 ar955x_1p0_common_rx_gain_bounds);
815         } else if (AR_SREV_9531(ah)) {
816                 INIT_INI_ARRAY(&ah->iniModesRxGain,
817                                qca953x_1p0_common_rx_gain_table);
818                 INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
819                                qca953x_1p0_common_rx_gain_bounds);
820         } else if (AR_SREV_9561(ah)) {
821                 INIT_INI_ARRAY(&ah->iniModesRxGain,
822                                qca956x_1p0_common_rx_gain_table);
823                 INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
824                                qca956x_1p0_common_rx_gain_bounds);
825                 INIT_INI_ARRAY(&ah->ini_modes_rxgain_5g_xlna,
826                                qca956x_1p0_xlna_only);
827         } else if (AR_SREV_9580(ah))
828                 INIT_INI_ARRAY(&ah->iniModesRxGain,
829                                 ar9580_1p0_rx_gain_table);
830         else if (AR_SREV_9462_21(ah))
831                 INIT_INI_ARRAY(&ah->iniModesRxGain,
832                                 ar9462_2p1_common_rx_gain);
833         else if (AR_SREV_9462_20(ah))
834                 INIT_INI_ARRAY(&ah->iniModesRxGain,
835                                 ar9462_2p0_common_rx_gain);
836         else if (AR_SREV_9565_11(ah))
837                 INIT_INI_ARRAY(&ah->iniModesRxGain,
838                                ar9565_1p1_Common_rx_gain_table);
839         else if (AR_SREV_9565(ah))
840                 INIT_INI_ARRAY(&ah->iniModesRxGain,
841                                ar9565_1p0_Common_rx_gain_table);
842         else
843                 INIT_INI_ARRAY(&ah->iniModesRxGain,
844                                 ar9300Common_rx_gain_table_2p2);
845 }
846
847 static void ar9003_rx_gain_table_mode1(struct ath_hw *ah)
848 {
849         if (AR_SREV_9330_12(ah))
850                 INIT_INI_ARRAY(&ah->iniModesRxGain,
851                         ar9331_common_wo_xlna_rx_gain_1p2);
852         else if (AR_SREV_9330_11(ah))
853                 INIT_INI_ARRAY(&ah->iniModesRxGain,
854                         ar9331_common_wo_xlna_rx_gain_1p1);
855         else if (AR_SREV_9340(ah))
856                 INIT_INI_ARRAY(&ah->iniModesRxGain,
857                         ar9340Common_wo_xlna_rx_gain_table_1p0);
858         else if (AR_SREV_9485_11_OR_LATER(ah))
859                 INIT_INI_ARRAY(&ah->iniModesRxGain,
860                         ar9485Common_wo_xlna_rx_gain_1_1);
861         else if (AR_SREV_9462_21(ah))
862                 INIT_INI_ARRAY(&ah->iniModesRxGain,
863                         ar9462_2p1_common_wo_xlna_rx_gain);
864         else if (AR_SREV_9462_20(ah))
865                 INIT_INI_ARRAY(&ah->iniModesRxGain,
866                         ar9462_2p0_common_wo_xlna_rx_gain);
867         else if (AR_SREV_9550(ah)) {
868                 INIT_INI_ARRAY(&ah->iniModesRxGain,
869                         ar955x_1p0_common_wo_xlna_rx_gain_table);
870                 INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
871                         ar955x_1p0_common_wo_xlna_rx_gain_bounds);
872         } else if (AR_SREV_9531_10(ah) || AR_SREV_9531_11(ah)) {
873                 INIT_INI_ARRAY(&ah->iniModesRxGain,
874                                qca953x_1p0_common_wo_xlna_rx_gain_table);
875                 INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
876                                qca953x_1p0_common_wo_xlna_rx_gain_bounds);
877         } else if (AR_SREV_9531_20(ah)) {
878                 INIT_INI_ARRAY(&ah->iniModesRxGain,
879                                qca953x_2p0_common_wo_xlna_rx_gain_table);
880                 INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
881                                qca953x_2p0_common_wo_xlna_rx_gain_bounds);
882         } else if (AR_SREV_9561(ah)) {
883                 INIT_INI_ARRAY(&ah->iniModesRxGain,
884                                qca956x_1p0_common_wo_xlna_rx_gain_table);
885                 INIT_INI_ARRAY(&ah->ini_modes_rx_gain_bounds,
886                                qca956x_1p0_common_wo_xlna_rx_gain_bounds);
887         } else if (AR_SREV_9580(ah))
888                 INIT_INI_ARRAY(&ah->iniModesRxGain,
889                         ar9580_1p0_wo_xlna_rx_gain_table);
890         else if (AR_SREV_9565_11(ah))
891                 INIT_INI_ARRAY(&ah->iniModesRxGain,
892                                ar9565_1p1_common_wo_xlna_rx_gain_table);
893         else if (AR_SREV_9565(ah))
894                 INIT_INI_ARRAY(&ah->iniModesRxGain,
895                                ar9565_1p0_common_wo_xlna_rx_gain_table);
896         else
897                 INIT_INI_ARRAY(&ah->iniModesRxGain,
898                         ar9300Common_wo_xlna_rx_gain_table_2p2);
899 }
900
901 static void ar9003_rx_gain_table_mode2(struct ath_hw *ah)
902 {
903         if (AR_SREV_9462_21(ah)) {
904                 INIT_INI_ARRAY(&ah->iniModesRxGain,
905                                ar9462_2p1_common_mixed_rx_gain);
906                 INIT_INI_ARRAY(&ah->ini_modes_rxgain_bb_core,
907                                ar9462_2p1_baseband_core_mix_rxgain);
908                 INIT_INI_ARRAY(&ah->ini_modes_rxgain_bb_postamble,
909                                ar9462_2p1_baseband_postamble_mix_rxgain);
910                 INIT_INI_ARRAY(&ah->ini_modes_rxgain_5g_xlna,
911                                ar9462_2p1_baseband_postamble_5g_xlna);
912         } else if (AR_SREV_9462_20(ah)) {
913                 INIT_INI_ARRAY(&ah->iniModesRxGain,
914                                ar9462_2p0_common_mixed_rx_gain);
915                 INIT_INI_ARRAY(&ah->ini_modes_rxgain_bb_core,
916                                ar9462_2p0_baseband_core_mix_rxgain);
917                 INIT_INI_ARRAY(&ah->ini_modes_rxgain_bb_postamble,
918                                ar9462_2p0_baseband_postamble_mix_rxgain);
919                 INIT_INI_ARRAY(&ah->ini_modes_rxgain_5g_xlna,
920                                ar9462_2p0_baseband_postamble_5g_xlna);
921         }
922 }
923
924 static void ar9003_rx_gain_table_mode3(struct ath_hw *ah)
925 {
926         if (AR_SREV_9462_21(ah)) {
927                 INIT_INI_ARRAY(&ah->iniModesRxGain,
928                                ar9462_2p1_common_5g_xlna_only_rxgain);
929                 INIT_INI_ARRAY(&ah->ini_modes_rxgain_5g_xlna,
930                                ar9462_2p1_baseband_postamble_5g_xlna);
931         } else if (AR_SREV_9462_20(ah)) {
932                 INIT_INI_ARRAY(&ah->iniModesRxGain,
933                                ar9462_2p0_common_5g_xlna_only_rxgain);
934                 INIT_INI_ARRAY(&ah->ini_modes_rxgain_5g_xlna,
935                                ar9462_2p0_baseband_postamble_5g_xlna);
936         }
937 }
938
939 static void ar9003_rx_gain_table_apply(struct ath_hw *ah)
940 {
941         switch (ar9003_hw_get_rx_gain_idx(ah)) {
942         case 0:
943         default:
944                 ar9003_rx_gain_table_mode0(ah);
945                 break;
946         case 1:
947                 ar9003_rx_gain_table_mode1(ah);
948                 break;
949         case 2:
950                 ar9003_rx_gain_table_mode2(ah);
951                 break;
952         case 3:
953                 ar9003_rx_gain_table_mode3(ah);
954                 break;
955         }
956 }
957
958 /* set gain table pointers according to values read from the eeprom */
959 static void ar9003_hw_init_mode_gain_regs(struct ath_hw *ah)
960 {
961         ar9003_tx_gain_table_apply(ah);
962         ar9003_rx_gain_table_apply(ah);
963 }
964
965 /*
966  * Helper for ASPM support.
967  *
968  * Disable PLL when in L0s as well as receiver clock when in L1.
969  * This power saving option must be enabled through the SerDes.
970  *
971  * Programming the SerDes must go through the same 288 bit serial shift
972  * register as the other analog registers.  Hence the 9 writes.
973  */
974 static void ar9003_hw_configpcipowersave(struct ath_hw *ah,
975                                          bool power_off)
976 {
977         unsigned int i;
978         struct ar5416IniArray *array;
979
980         /*
981          * Increase L1 Entry Latency. Some WB222 boards don't have
982          * this change in eeprom/OTP.
983          *
984          */
985         if (AR_SREV_9462(ah)) {
986                 u32 val = ah->config.aspm_l1_fix;
987                 if ((val & 0xff000000) == 0x17000000) {
988                         val &= 0x00ffffff;
989                         val |= 0x27000000;
990                         REG_WRITE(ah, 0x570c, val);
991                 }
992         }
993
994         /* Nothing to do on restore for 11N */
995         if (!power_off /* !restore */) {
996                 /* set bit 19 to allow forcing of pcie core into L1 state */
997                 REG_SET_BIT(ah, AR_PCIE_PM_CTRL, AR_PCIE_PM_CTRL_ENA);
998                 REG_WRITE(ah, AR_WA, ah->WARegVal);
999         }
1000
1001         /*
1002          * Configire PCIE after Ini init. SERDES values now come from ini file
1003          * This enables PCIe low power mode.
1004          */
1005         array = power_off ? &ah->iniPcieSerdes :
1006                 &ah->iniPcieSerdesLowPower;
1007
1008         for (i = 0; i < array->ia_rows; i++) {
1009                 REG_WRITE(ah,
1010                           INI_RA(array, i, 0),
1011                           INI_RA(array, i, 1));
1012         }
1013 }
1014
1015 static void ar9003_hw_init_hang_checks(struct ath_hw *ah)
1016 {
1017         /*
1018          * All chips support detection of BB/MAC hangs.
1019          */
1020         ah->config.hw_hang_checks |= HW_BB_WATCHDOG;
1021         ah->config.hw_hang_checks |= HW_MAC_HANG;
1022
1023         /*
1024          * This is not required for AR9580 1.0
1025          */
1026         if (AR_SREV_9300_22(ah))
1027                 ah->config.hw_hang_checks |= HW_PHYRESTART_CLC_WAR;
1028
1029         if (AR_SREV_9330(ah))
1030                 ah->bb_watchdog_timeout_ms = 85;
1031         else
1032                 ah->bb_watchdog_timeout_ms = 25;
1033 }
1034
1035 /*
1036  * MAC HW hang check
1037  * =================
1038  *
1039  * Signature: dcu_chain_state is 0x6 and dcu_complete_state is 0x1.
1040  *
1041  * The state of each DCU chain (mapped to TX queues) is available from these
1042  * DMA debug registers:
1043  *
1044  * Chain 0 state : Bits 4:0   of AR_DMADBG_4
1045  * Chain 1 state : Bits 9:5   of AR_DMADBG_4
1046  * Chain 2 state : Bits 14:10 of AR_DMADBG_4
1047  * Chain 3 state : Bits 19:15 of AR_DMADBG_4
1048  * Chain 4 state : Bits 24:20 of AR_DMADBG_4
1049  * Chain 5 state : Bits 29:25 of AR_DMADBG_4
1050  * Chain 6 state : Bits 4:0   of AR_DMADBG_5
1051  * Chain 7 state : Bits 9:5   of AR_DMADBG_5
1052  * Chain 8 state : Bits 14:10 of AR_DMADBG_5
1053  * Chain 9 state : Bits 19:15 of AR_DMADBG_5
1054  *
1055  * The DCU chain state "0x6" means "WAIT_FRDONE" - wait for TX frame to be done.
1056  */
1057
1058 #define NUM_STATUS_READS 50
1059
1060 static bool ath9k_hw_verify_hang(struct ath_hw *ah, unsigned int queue)
1061 {
1062         u32 dma_dbg_chain, dma_dbg_complete;
1063         u8 dcu_chain_state, dcu_complete_state;
1064         int i;
1065
1066         for (i = 0; i < NUM_STATUS_READS; i++) {
1067                 if (queue < 6)
1068                         dma_dbg_chain = REG_READ(ah, AR_DMADBG_4);
1069                 else
1070                         dma_dbg_chain = REG_READ(ah, AR_DMADBG_5);
1071
1072                 dma_dbg_complete = REG_READ(ah, AR_DMADBG_6);
1073
1074                 dcu_chain_state = (dma_dbg_chain >> (5 * queue)) & 0x1f;
1075                 dcu_complete_state = dma_dbg_complete & 0x3;
1076
1077                 if ((dcu_chain_state != 0x6) || (dcu_complete_state != 0x1))
1078                         return false;
1079         }
1080
1081         ath_dbg(ath9k_hw_common(ah), RESET,
1082                 "MAC Hang signature found for queue: %d\n", queue);
1083
1084         return true;
1085 }
1086
1087 static bool ar9003_hw_detect_mac_hang(struct ath_hw *ah)
1088 {
1089         u32 dma_dbg_4, dma_dbg_5, dma_dbg_6, chk_dbg;
1090         u8 dcu_chain_state, dcu_complete_state;
1091         bool dcu_wait_frdone = false;
1092         unsigned long chk_dcu = 0;
1093         unsigned int i = 0;
1094
1095         dma_dbg_4 = REG_READ(ah, AR_DMADBG_4);
1096         dma_dbg_5 = REG_READ(ah, AR_DMADBG_5);
1097         dma_dbg_6 = REG_READ(ah, AR_DMADBG_6);
1098
1099         dcu_complete_state = dma_dbg_6 & 0x3;
1100         if (dcu_complete_state != 0x1)
1101                 goto exit;
1102
1103         for (i = 0; i < ATH9K_NUM_TX_QUEUES; i++) {
1104                 if (i < 6)
1105                         chk_dbg = dma_dbg_4;
1106                 else
1107                         chk_dbg = dma_dbg_5;
1108
1109                 dcu_chain_state = (chk_dbg >> (5 * i)) & 0x1f;
1110                 if (dcu_chain_state == 0x6) {
1111                         dcu_wait_frdone = true;
1112                         chk_dcu |= BIT(i);
1113                 }
1114         }
1115
1116         if ((dcu_complete_state == 0x1) && dcu_wait_frdone) {
1117                 for_each_set_bit(i, &chk_dcu, ATH9K_NUM_TX_QUEUES) {
1118                         if (ath9k_hw_verify_hang(ah, i))
1119                                 return true;
1120                 }
1121         }
1122 exit:
1123         return false;
1124 }
1125
1126 /* Sets up the AR9003 hardware familiy callbacks */
1127 void ar9003_hw_attach_ops(struct ath_hw *ah)
1128 {
1129         struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
1130         struct ath_hw_ops *ops = ath9k_hw_ops(ah);
1131
1132         ar9003_hw_init_mode_regs(ah);
1133         priv_ops->init_mode_gain_regs = ar9003_hw_init_mode_gain_regs;
1134         priv_ops->init_hang_checks = ar9003_hw_init_hang_checks;
1135         priv_ops->detect_mac_hang = ar9003_hw_detect_mac_hang;
1136
1137         ops->config_pci_powersave = ar9003_hw_configpcipowersave;
1138
1139         ar9003_hw_attach_phy_ops(ah);
1140         ar9003_hw_attach_calib_ops(ah);
1141         ar9003_hw_attach_mac_ops(ah);
1142 }