]> git.karo-electronics.de Git - karo-tx-linux.git/blob - drivers/net/wireless/ath/ath9k/ar9003_hw.c
Merge branch 'dice-driver-playback-only' of git://git.alsa-project.org/alsa-kprivate...
[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 "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"
29
30 /* General hardware code for the AR9003 hadware family */
31
32 /*
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.
36  */
37 static void ar9003_hw_init_mode_regs(struct ath_hw *ah)
38 {
39         if (AR_SREV_9330_11(ah)) {
40                 /* mac */
41                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
42                                 ar9331_1p1_mac_core);
43                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
44                                 ar9331_1p1_mac_postamble);
45
46                 /* bb */
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);
51
52                 /* radio */
53                 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
54                                 ar9331_1p1_radio_core);
55
56                 /* soc */
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);
61
62                 /* rx/tx gain */
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);
67
68                 /* Japan 2484 Mhz CCK */
69                 INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
70                                ar9331_1p1_baseband_core_txfir_coeff_japan_2484);
71
72                 /* additional clock settings */
73                 if (ah->is_clk_25mhz)
74                         INIT_INI_ARRAY(&ah->iniAdditional,
75                                         ar9331_1p1_xtal_25M);
76                 else
77                         INIT_INI_ARRAY(&ah->iniAdditional,
78                                         ar9331_1p1_xtal_40M);
79         } else if (AR_SREV_9330_12(ah)) {
80                 /* mac */
81                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
82                                 ar9331_1p2_mac_core);
83                 INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
84                                 ar9331_1p2_mac_postamble);
85
86                 /* bb */
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);
91
92                 /* radio */
93                 INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
94                                 ar9331_1p2_radio_core);
95
96                 /* soc */
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);
101
102                 /* rx/tx gain */
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);
107
108                 /* Japan 2484 Mhz CCK */
109                 INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
110                                ar9331_1p2_baseband_core_txfir_coeff_japan_2484);
111
112                 /* additional clock settings */
113                 if (ah->is_clk_25mhz)
114                         INIT_INI_ARRAY(&ah->iniAdditional,
115                                         ar9331_1p2_xtal_25M);
116                 else
117                         INIT_INI_ARRAY(&ah->iniAdditional,
118                                         ar9331_1p2_xtal_40M);
119         } else if (AR_SREV_9340(ah)) {
120                 /* mac */
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);
125
126                 /* bb */
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);
131
132                 /* radio */
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);
137
138                 /* soc */
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);
143
144                 /* rx/tx gain */
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);
149
150                 INIT_INI_ARRAY(&ah->iniModesFastClock,
151                                 ar9340Modes_fast_clock_1p0);
152
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)) {
157                 /* mac */
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);
162
163                 /* bb */
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);
169
170                 /* radio */
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);
175
176                 /* soc */
177                 INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
178                                 ar9485_1_1_soc_preamble);
179
180                 /* rx/tx gain */
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);
185
186                 /* Japan 2484 Mhz CCK */
187                 INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
188                                ar9485_1_1_baseband_core_txfir_coeff_japan_2484);
189
190                 /* Load PCIE SERDES settings from INI */
191
192                 /* Awake Setting */
193
194                 INIT_INI_ARRAY(&ah->iniPcieSerdes,
195                                 ar9485_1_1_pcie_phy_clkreq_disable_L1);
196
197                 /* Sleep Setting */
198
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)) {
227
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);
231
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);
236
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);
243
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);
248
249                 INIT_INI_ARRAY(&ah->iniModesRxGain,
250                                 ar9462_common_rx_gain_table_2p0);
251
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);
258
259                 /* Fast clock modal settings */
260                 INIT_INI_ARRAY(&ah->iniModesFastClock,
261                                 ar9462_modes_fast_clock_2p0);
262
263                 INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
264                                ar9462_2p0_baseband_core_txfir_coeff_japan_2484);
265         } else if (AR_SREV_9550(ah)) {
266                 /* mac */
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);
271
272                 /* bb */
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);
277
278                 /* radio */
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);
283
284                 /* soc */
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);
289
290                 /* rx/tx gain */
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);
297
298                 /* Fast clock modal settings */
299                 INIT_INI_ARRAY(&ah->iniModesFastClock,
300                                 ar955x_1p0_modes_fast_clock);
301         } else if (AR_SREV_9580(ah)) {
302                 /* mac */
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);
307
308                 /* bb */
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);
313
314                 /* radio */
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);
319
320                 /* soc */
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);
325
326                 /* rx/tx gain */
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);
331
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);
339
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);
344
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);
349
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);
354
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);
359
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);
364
365                 INIT_INI_ARRAY(&ah->iniModesFastClock,
366                                 ar9565_1p0_modes_fast_clock);
367         } else {
368                 /* mac */
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);
373
374                 /* bb */
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);
379
380                 /* radio */
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);
385
386                 /* soc */
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);
391
392                 /* rx/tx gain */
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);
397
398                 /* Load PCIE SERDES settings from INI */
399
400                 /* Awake Setting */
401
402                 INIT_INI_ARRAY(&ah->iniPcieSerdes,
403                                 ar9300PciePhy_pll_on_clkreq_disable_L1_2p2);
404
405                 /* Sleep Setting */
406
407                 INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
408                                 ar9300PciePhy_pll_on_clkreq_disable_L1_2p2);
409
410                 /* Fast clock modal settings */
411                 INIT_INI_ARRAY(&ah->iniModesFastClock,
412                                 ar9300Modes_fast_clock_2p2);
413         }
414 }
415
416 static void ar9003_tx_gain_table_mode0(struct ath_hw *ah)
417 {
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);
445         else
446                 INIT_INI_ARRAY(&ah->iniModesTxGain,
447                         ar9300Modes_lowest_ob_db_tx_gain_table_2p2);
448 }
449
450 static void ar9003_tx_gain_table_mode1(struct ath_hw *ah)
451 {
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);
479         else
480                 INIT_INI_ARRAY(&ah->iniModesTxGain,
481                         ar9300Modes_high_ob_db_tx_gain_table_2p2);
482 }
483
484 static void ar9003_tx_gain_table_mode2(struct ath_hw *ah)
485 {
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);
504         else
505                 INIT_INI_ARRAY(&ah->iniModesTxGain,
506                         ar9300Modes_low_ob_db_tx_gain_table_2p2);
507 }
508
509 static void ar9003_tx_gain_table_mode3(struct ath_hw *ah)
510 {
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);
529         else
530                 INIT_INI_ARRAY(&ah->iniModesTxGain,
531                         ar9300Modes_high_power_tx_gain_table_2p2);
532 }
533
534 static void ar9003_tx_gain_table_mode4(struct ath_hw *ah)
535 {
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);
548         else
549                 INIT_INI_ARRAY(&ah->iniModesTxGain,
550                         ar9300Modes_mixed_ob_db_tx_gain_table_2p2);
551 }
552
553 static void ar9003_tx_gain_table_mode5(struct ath_hw *ah)
554 {
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);
567 }
568
569 static void ar9003_tx_gain_table_mode6(struct ath_hw *ah)
570 {
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);
580 }
581
582 typedef void (*ath_txgain_tab)(struct ath_hw *ah);
583
584 static void ar9003_tx_gain_table_apply(struct ath_hw *ah)
585 {
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,
594         };
595         int idx = ar9003_hw_get_tx_gain_idx(ah);
596
597         if (idx >= ARRAY_SIZE(modes))
598                 idx = 0;
599
600         modes[idx](ah);
601 }
602
603 static void ar9003_rx_gain_table_mode0(struct ath_hw *ah)
604 {
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);
631         else
632                 INIT_INI_ARRAY(&ah->iniModesRxGain,
633                                 ar9300Common_rx_gain_table_2p2);
634 }
635
636 static void ar9003_rx_gain_table_mode1(struct ath_hw *ah)
637 {
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);
667         else
668                 INIT_INI_ARRAY(&ah->iniModesRxGain,
669                         ar9300Common_wo_xlna_rx_gain_table_2p2);
670 }
671
672 static void ar9003_rx_gain_table_mode2(struct ath_hw *ah)
673 {
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);
692         }
693 }
694
695 static void ar9003_rx_gain_table_mode3(struct ath_hw *ah)
696 {
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);
707         }
708 }
709
710 static void ar9003_rx_gain_table_apply(struct ath_hw *ah)
711 {
712         switch (ar9003_hw_get_rx_gain_idx(ah)) {
713         case 0:
714         default:
715                 ar9003_rx_gain_table_mode0(ah);
716                 break;
717         case 1:
718                 ar9003_rx_gain_table_mode1(ah);
719                 break;
720         case 2:
721                 ar9003_rx_gain_table_mode2(ah);
722                 break;
723         case 3:
724                 ar9003_rx_gain_table_mode3(ah);
725                 break;
726         }
727 }
728
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)
731 {
732         ar9003_tx_gain_table_apply(ah);
733         ar9003_rx_gain_table_apply(ah);
734 }
735
736 /*
737  * Helper for ASPM support.
738  *
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.
741  *
742  * Programming the SerDes must go through the same 288 bit serial shift
743  * register as the other analog registers.  Hence the 9 writes.
744  */
745 static void ar9003_hw_configpcipowersave(struct ath_hw *ah,
746                                          bool power_off)
747 {
748         /*
749          * Increase L1 Entry Latency. Some WB222 boards don't have
750          * this change in eeprom/OTP.
751          *
752          */
753         if (AR_SREV_9462(ah)) {
754                 u32 val = ah->config.aspm_l1_fix;
755                 if ((val & 0xff000000) == 0x17000000) {
756                         val &= 0x00ffffff;
757                         val |= 0x27000000;
758                         REG_WRITE(ah, 0x570c, val);
759                 }
760         }
761
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);
767         }
768
769         /*
770          * Configire PCIE after Ini init. SERDES values now come from ini file
771          * This enables PCIe low power mode.
772          */
773         if (ah->config.pcieSerDesWrite) {
774                 unsigned int i;
775                 struct ar5416IniArray *array;
776
777                 array = power_off ? &ah->iniPcieSerdes :
778                                     &ah->iniPcieSerdesLowPower;
779
780                 for (i = 0; i < array->ia_rows; i++) {
781                         REG_WRITE(ah,
782                                   INI_RA(array, i, 0),
783                                   INI_RA(array, i, 1));
784                 }
785         }
786 }
787
788 /* Sets up the AR9003 hardware familiy callbacks */
789 void ar9003_hw_attach_ops(struct ath_hw *ah)
790 {
791         struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
792         struct ath_hw_ops *ops = ath9k_hw_ops(ah);
793
794         ar9003_hw_init_mode_regs(ah);
795         priv_ops->init_mode_gain_regs = ar9003_hw_init_mode_gain_regs;
796
797         ops->config_pci_powersave = ar9003_hw_configpcipowersave;
798
799         ar9003_hw_attach_phy_ops(ah);
800         ar9003_hw_attach_calib_ops(ah);
801         ar9003_hw_attach_mac_ops(ah);
802 }