xref: /linux/drivers/net/wireless/ath/ath9k/ar9003_hw.c (revision a508da6cc0093171833efb8376b00473f24221b9)
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 "ar9580_1p0_initvals.h"
25 #include "ar9462_2p0_initvals.h"
26 
27 /* General hardware code for the AR9003 hadware family */
28 
29 /*
30  * The AR9003 family uses a new INI format (pre, core, post
31  * arrays per subsystem). This provides support for the
32  * AR9003 2.2 chipsets.
33  */
34 static void ar9003_hw_init_mode_regs(struct ath_hw *ah)
35 {
36 #define PCIE_PLL_ON_CREQ_DIS_L1_2P0 \
37 		ar9462_pciephy_pll_on_clkreq_disable_L1_2p0
38 
39 #define AR9462_BB_CTX_COEFJ(x)	\
40 		ar9462_##x##_baseband_core_txfir_coeff_japan_2484
41 
42 #define AR9462_BBC_TXIFR_COEFFJ \
43 		ar9462_2p0_baseband_core_txfir_coeff_japan_2484
44 	if (AR_SREV_9330_11(ah)) {
45 		/* mac */
46 		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0);
47 		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
48 				ar9331_1p1_mac_core,
49 				ARRAY_SIZE(ar9331_1p1_mac_core), 2);
50 		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
51 				ar9331_1p1_mac_postamble,
52 				ARRAY_SIZE(ar9331_1p1_mac_postamble), 5);
53 
54 		/* bb */
55 		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], NULL, 0, 0);
56 		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
57 				ar9331_1p1_baseband_core,
58 				ARRAY_SIZE(ar9331_1p1_baseband_core), 2);
59 		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
60 				ar9331_1p1_baseband_postamble,
61 				ARRAY_SIZE(ar9331_1p1_baseband_postamble), 5);
62 
63 		/* radio */
64 		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_PRE], NULL, 0, 0);
65 		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
66 				ar9331_1p1_radio_core,
67 				ARRAY_SIZE(ar9331_1p1_radio_core), 2);
68 		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST], NULL, 0, 0);
69 
70 		/* soc */
71 		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
72 				ar9331_1p1_soc_preamble,
73 				ARRAY_SIZE(ar9331_1p1_soc_preamble), 2);
74 		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_CORE], NULL, 0, 0);
75 		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
76 				ar9331_1p1_soc_postamble,
77 				ARRAY_SIZE(ar9331_1p1_soc_postamble), 2);
78 
79 		/* rx/tx gain */
80 		INIT_INI_ARRAY(&ah->iniModesRxGain,
81 				ar9331_common_rx_gain_1p1,
82 				ARRAY_SIZE(ar9331_common_rx_gain_1p1), 2);
83 		INIT_INI_ARRAY(&ah->iniModesTxGain,
84 			ar9331_modes_lowest_ob_db_tx_gain_1p1,
85 			ARRAY_SIZE(ar9331_modes_lowest_ob_db_tx_gain_1p1),
86 			5);
87 
88 		/* additional clock settings */
89 		if (ah->is_clk_25mhz)
90 			INIT_INI_ARRAY(&ah->iniAdditional,
91 					ar9331_1p1_xtal_25M,
92 					ARRAY_SIZE(ar9331_1p1_xtal_25M), 2);
93 		else
94 			INIT_INI_ARRAY(&ah->iniAdditional,
95 					ar9331_1p1_xtal_40M,
96 					ARRAY_SIZE(ar9331_1p1_xtal_40M), 2);
97 	} else if (AR_SREV_9330_12(ah)) {
98 		/* mac */
99 		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0);
100 		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
101 				ar9331_1p2_mac_core,
102 				ARRAY_SIZE(ar9331_1p2_mac_core), 2);
103 		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
104 				ar9331_1p2_mac_postamble,
105 				ARRAY_SIZE(ar9331_1p2_mac_postamble), 5);
106 
107 		/* bb */
108 		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], NULL, 0, 0);
109 		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
110 				ar9331_1p2_baseband_core,
111 				ARRAY_SIZE(ar9331_1p2_baseband_core), 2);
112 		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
113 				ar9331_1p2_baseband_postamble,
114 				ARRAY_SIZE(ar9331_1p2_baseband_postamble), 5);
115 
116 		/* radio */
117 		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_PRE], NULL, 0, 0);
118 		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
119 				ar9331_1p2_radio_core,
120 				ARRAY_SIZE(ar9331_1p2_radio_core), 2);
121 		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST], NULL, 0, 0);
122 
123 		/* soc */
124 		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
125 				ar9331_1p2_soc_preamble,
126 				ARRAY_SIZE(ar9331_1p2_soc_preamble), 2);
127 		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_CORE], NULL, 0, 0);
128 		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
129 				ar9331_1p2_soc_postamble,
130 				ARRAY_SIZE(ar9331_1p2_soc_postamble), 2);
131 
132 		/* rx/tx gain */
133 		INIT_INI_ARRAY(&ah->iniModesRxGain,
134 				ar9331_common_rx_gain_1p2,
135 				ARRAY_SIZE(ar9331_common_rx_gain_1p2), 2);
136 		INIT_INI_ARRAY(&ah->iniModesTxGain,
137 			ar9331_modes_lowest_ob_db_tx_gain_1p2,
138 			ARRAY_SIZE(ar9331_modes_lowest_ob_db_tx_gain_1p2),
139 			5);
140 
141 		/* additional clock settings */
142 		if (ah->is_clk_25mhz)
143 			INIT_INI_ARRAY(&ah->iniAdditional,
144 					ar9331_1p2_xtal_25M,
145 					ARRAY_SIZE(ar9331_1p2_xtal_25M), 2);
146 		else
147 			INIT_INI_ARRAY(&ah->iniAdditional,
148 					ar9331_1p2_xtal_40M,
149 					ARRAY_SIZE(ar9331_1p2_xtal_40M), 2);
150 	} else if (AR_SREV_9340(ah)) {
151 		/* mac */
152 		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0);
153 		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
154 				ar9340_1p0_mac_core,
155 				ARRAY_SIZE(ar9340_1p0_mac_core), 2);
156 		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
157 				ar9340_1p0_mac_postamble,
158 				ARRAY_SIZE(ar9340_1p0_mac_postamble), 5);
159 
160 		/* bb */
161 		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], NULL, 0, 0);
162 		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
163 				ar9340_1p0_baseband_core,
164 				ARRAY_SIZE(ar9340_1p0_baseband_core), 2);
165 		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
166 				ar9340_1p0_baseband_postamble,
167 				ARRAY_SIZE(ar9340_1p0_baseband_postamble), 5);
168 
169 		/* radio */
170 		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_PRE], NULL, 0, 0);
171 		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
172 				ar9340_1p0_radio_core,
173 				ARRAY_SIZE(ar9340_1p0_radio_core), 2);
174 		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
175 				ar9340_1p0_radio_postamble,
176 				ARRAY_SIZE(ar9340_1p0_radio_postamble), 5);
177 
178 		/* soc */
179 		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
180 				ar9340_1p0_soc_preamble,
181 				ARRAY_SIZE(ar9340_1p0_soc_preamble), 2);
182 		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_CORE], NULL, 0, 0);
183 		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
184 				ar9340_1p0_soc_postamble,
185 				ARRAY_SIZE(ar9340_1p0_soc_postamble), 5);
186 
187 		/* rx/tx gain */
188 		INIT_INI_ARRAY(&ah->iniModesRxGain,
189 				ar9340Common_wo_xlna_rx_gain_table_1p0,
190 				ARRAY_SIZE(ar9340Common_wo_xlna_rx_gain_table_1p0),
191 				5);
192 		INIT_INI_ARRAY(&ah->iniModesTxGain,
193 				ar9340Modes_high_ob_db_tx_gain_table_1p0,
194 				ARRAY_SIZE(ar9340Modes_high_ob_db_tx_gain_table_1p0),
195 				5);
196 
197 		INIT_INI_ARRAY(&ah->iniModesFastClock,
198 				ar9340Modes_fast_clock_1p0,
199 				ARRAY_SIZE(ar9340Modes_fast_clock_1p0),
200 				3);
201 
202 		if (!ah->is_clk_25mhz)
203 			INIT_INI_ARRAY(&ah->iniAdditional,
204 				       ar9340_1p0_radio_core_40M,
205 				       ARRAY_SIZE(ar9340_1p0_radio_core_40M),
206 				       2);
207 	} else if (AR_SREV_9485_11(ah)) {
208 		/* mac */
209 		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0);
210 		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
211 				ar9485_1_1_mac_core,
212 				ARRAY_SIZE(ar9485_1_1_mac_core), 2);
213 		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
214 				ar9485_1_1_mac_postamble,
215 				ARRAY_SIZE(ar9485_1_1_mac_postamble), 5);
216 
217 		/* bb */
218 		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], ar9485_1_1,
219 				ARRAY_SIZE(ar9485_1_1), 2);
220 		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
221 				ar9485_1_1_baseband_core,
222 				ARRAY_SIZE(ar9485_1_1_baseband_core), 2);
223 		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
224 				ar9485_1_1_baseband_postamble,
225 				ARRAY_SIZE(ar9485_1_1_baseband_postamble), 5);
226 
227 		/* radio */
228 		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_PRE], NULL, 0, 0);
229 		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
230 				ar9485_1_1_radio_core,
231 				ARRAY_SIZE(ar9485_1_1_radio_core), 2);
232 		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
233 				ar9485_1_1_radio_postamble,
234 				ARRAY_SIZE(ar9485_1_1_radio_postamble), 2);
235 
236 		/* soc */
237 		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
238 				ar9485_1_1_soc_preamble,
239 				ARRAY_SIZE(ar9485_1_1_soc_preamble), 2);
240 		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_CORE], NULL, 0, 0);
241 		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST], NULL, 0, 0);
242 
243 		/* rx/tx gain */
244 		INIT_INI_ARRAY(&ah->iniModesRxGain,
245 				ar9485Common_wo_xlna_rx_gain_1_1,
246 				ARRAY_SIZE(ar9485Common_wo_xlna_rx_gain_1_1), 2);
247 		INIT_INI_ARRAY(&ah->iniModesTxGain,
248 				ar9485_modes_lowest_ob_db_tx_gain_1_1,
249 				ARRAY_SIZE(ar9485_modes_lowest_ob_db_tx_gain_1_1),
250 				5);
251 
252 		/* Load PCIE SERDES settings from INI */
253 
254 		/* Awake Setting */
255 
256 		INIT_INI_ARRAY(&ah->iniPcieSerdes,
257 				ar9485_1_1_pcie_phy_clkreq_disable_L1,
258 				ARRAY_SIZE(ar9485_1_1_pcie_phy_clkreq_disable_L1),
259 				2);
260 
261 		/* Sleep Setting */
262 
263 		INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
264 				ar9485_1_1_pcie_phy_clkreq_disable_L1,
265 				ARRAY_SIZE(ar9485_1_1_pcie_phy_clkreq_disable_L1),
266 				2);
267 	} else if (AR_SREV_9462_20(ah)) {
268 
269 		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0);
270 		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE], ar9462_2p0_mac_core,
271 				ARRAY_SIZE(ar9462_2p0_mac_core), 2);
272 		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
273 				ar9462_2p0_mac_postamble,
274 				ARRAY_SIZE(ar9462_2p0_mac_postamble), 5);
275 
276 		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], NULL, 0, 0);
277 		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
278 				ar9462_2p0_baseband_core,
279 				ARRAY_SIZE(ar9462_2p0_baseband_core), 2);
280 		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
281 				ar9462_2p0_baseband_postamble,
282 				ARRAY_SIZE(ar9462_2p0_baseband_postamble), 5);
283 
284 		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_PRE], NULL, 0, 0);
285 		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
286 				ar9462_2p0_radio_core,
287 				ARRAY_SIZE(ar9462_2p0_radio_core), 2);
288 		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
289 				ar9462_2p0_radio_postamble,
290 				ARRAY_SIZE(ar9462_2p0_radio_postamble), 5);
291 		INIT_INI_ARRAY(&ah->ini_radio_post_sys2ant,
292 				ar9462_2p0_radio_postamble_sys2ant,
293 				ARRAY_SIZE(ar9462_2p0_radio_postamble_sys2ant),
294 				5);
295 
296 		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
297 				ar9462_2p0_soc_preamble,
298 				ARRAY_SIZE(ar9462_2p0_soc_preamble), 2);
299 		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_CORE], NULL, 0, 0);
300 		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
301 				ar9462_2p0_soc_postamble,
302 				ARRAY_SIZE(ar9462_2p0_soc_postamble), 5);
303 
304 		INIT_INI_ARRAY(&ah->iniModesRxGain,
305 				ar9462_common_rx_gain_table_2p0,
306 				ARRAY_SIZE(ar9462_common_rx_gain_table_2p0), 2);
307 
308 		/* Awake -> Sleep Setting */
309 		INIT_INI_ARRAY(&ah->iniPcieSerdes,
310 				PCIE_PLL_ON_CREQ_DIS_L1_2P0,
311 				ARRAY_SIZE(PCIE_PLL_ON_CREQ_DIS_L1_2P0),
312 				2);
313 		/* Sleep -> Awake Setting */
314 		INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
315 				PCIE_PLL_ON_CREQ_DIS_L1_2P0,
316 				ARRAY_SIZE(PCIE_PLL_ON_CREQ_DIS_L1_2P0),
317 				2);
318 
319 		/* Fast clock modal settings */
320 		INIT_INI_ARRAY(&ah->iniModesFastClock,
321 				ar9462_modes_fast_clock_2p0,
322 				ARRAY_SIZE(ar9462_modes_fast_clock_2p0), 3);
323 
324 		INIT_INI_ARRAY(&ah->iniCckfirJapan2484,
325 				AR9462_BB_CTX_COEFJ(2p0),
326 				ARRAY_SIZE(AR9462_BB_CTX_COEFJ(2p0)), 2);
327 
328 		INIT_INI_ARRAY(&ah->ini_japan2484, AR9462_BBC_TXIFR_COEFFJ,
329 				ARRAY_SIZE(AR9462_BBC_TXIFR_COEFFJ), 2);
330 
331 	} else if (AR_SREV_9580(ah)) {
332 		/* mac */
333 		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0);
334 		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
335 				ar9580_1p0_mac_core,
336 				ARRAY_SIZE(ar9580_1p0_mac_core), 2);
337 		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
338 				ar9580_1p0_mac_postamble,
339 				ARRAY_SIZE(ar9580_1p0_mac_postamble), 5);
340 
341 		/* bb */
342 		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], NULL, 0, 0);
343 		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
344 				ar9580_1p0_baseband_core,
345 				ARRAY_SIZE(ar9580_1p0_baseband_core), 2);
346 		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
347 				ar9580_1p0_baseband_postamble,
348 				ARRAY_SIZE(ar9580_1p0_baseband_postamble), 5);
349 
350 		/* radio */
351 		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_PRE], NULL, 0, 0);
352 		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
353 				ar9580_1p0_radio_core,
354 				ARRAY_SIZE(ar9580_1p0_radio_core), 2);
355 		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
356 				ar9580_1p0_radio_postamble,
357 				ARRAY_SIZE(ar9580_1p0_radio_postamble), 5);
358 
359 		/* soc */
360 		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
361 				ar9580_1p0_soc_preamble,
362 				ARRAY_SIZE(ar9580_1p0_soc_preamble), 2);
363 		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_CORE], NULL, 0, 0);
364 		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
365 				ar9580_1p0_soc_postamble,
366 				ARRAY_SIZE(ar9580_1p0_soc_postamble), 5);
367 
368 		/* rx/tx gain */
369 		INIT_INI_ARRAY(&ah->iniModesRxGain,
370 				ar9580_1p0_rx_gain_table,
371 				ARRAY_SIZE(ar9580_1p0_rx_gain_table), 2);
372 		INIT_INI_ARRAY(&ah->iniModesTxGain,
373 				ar9580_1p0_low_ob_db_tx_gain_table,
374 				ARRAY_SIZE(ar9580_1p0_low_ob_db_tx_gain_table),
375 				5);
376 
377 		INIT_INI_ARRAY(&ah->iniModesFastClock,
378 				ar9580_1p0_modes_fast_clock,
379 				ARRAY_SIZE(ar9580_1p0_modes_fast_clock),
380 				3);
381 	} else {
382 		/* mac */
383 		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_PRE], NULL, 0, 0);
384 		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_CORE],
385 				ar9300_2p2_mac_core,
386 				ARRAY_SIZE(ar9300_2p2_mac_core), 2);
387 		INIT_INI_ARRAY(&ah->iniMac[ATH_INI_POST],
388 				ar9300_2p2_mac_postamble,
389 				ARRAY_SIZE(ar9300_2p2_mac_postamble), 5);
390 
391 		/* bb */
392 		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_PRE], NULL, 0, 0);
393 		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_CORE],
394 				ar9300_2p2_baseband_core,
395 				ARRAY_SIZE(ar9300_2p2_baseband_core), 2);
396 		INIT_INI_ARRAY(&ah->iniBB[ATH_INI_POST],
397 				ar9300_2p2_baseband_postamble,
398 				ARRAY_SIZE(ar9300_2p2_baseband_postamble), 5);
399 
400 		/* radio */
401 		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_PRE], NULL, 0, 0);
402 		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_CORE],
403 				ar9300_2p2_radio_core,
404 				ARRAY_SIZE(ar9300_2p2_radio_core), 2);
405 		INIT_INI_ARRAY(&ah->iniRadio[ATH_INI_POST],
406 				ar9300_2p2_radio_postamble,
407 				ARRAY_SIZE(ar9300_2p2_radio_postamble), 5);
408 
409 		/* soc */
410 		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_PRE],
411 				ar9300_2p2_soc_preamble,
412 				ARRAY_SIZE(ar9300_2p2_soc_preamble), 2);
413 		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_CORE], NULL, 0, 0);
414 		INIT_INI_ARRAY(&ah->iniSOC[ATH_INI_POST],
415 				ar9300_2p2_soc_postamble,
416 				ARRAY_SIZE(ar9300_2p2_soc_postamble), 5);
417 
418 		/* rx/tx gain */
419 		INIT_INI_ARRAY(&ah->iniModesRxGain,
420 				ar9300Common_rx_gain_table_2p2,
421 				ARRAY_SIZE(ar9300Common_rx_gain_table_2p2), 2);
422 		INIT_INI_ARRAY(&ah->iniModesTxGain,
423 				ar9300Modes_lowest_ob_db_tx_gain_table_2p2,
424 				ARRAY_SIZE(ar9300Modes_lowest_ob_db_tx_gain_table_2p2),
425 				5);
426 
427 		/* Load PCIE SERDES settings from INI */
428 
429 		/* Awake Setting */
430 
431 		INIT_INI_ARRAY(&ah->iniPcieSerdes,
432 				ar9300PciePhy_pll_on_clkreq_disable_L1_2p2,
433 				ARRAY_SIZE(ar9300PciePhy_pll_on_clkreq_disable_L1_2p2),
434 				2);
435 
436 		/* Sleep Setting */
437 
438 		INIT_INI_ARRAY(&ah->iniPcieSerdesLowPower,
439 				ar9300PciePhy_pll_on_clkreq_disable_L1_2p2,
440 				ARRAY_SIZE(ar9300PciePhy_pll_on_clkreq_disable_L1_2p2),
441 				2);
442 
443 		/* Fast clock modal settings */
444 		INIT_INI_ARRAY(&ah->iniModesFastClock,
445 				ar9300Modes_fast_clock_2p2,
446 				ARRAY_SIZE(ar9300Modes_fast_clock_2p2),
447 				3);
448 	}
449 }
450 
451 static void ar9003_tx_gain_table_mode0(struct ath_hw *ah)
452 {
453 	if (AR_SREV_9330_12(ah))
454 		INIT_INI_ARRAY(&ah->iniModesTxGain,
455 			ar9331_modes_lowest_ob_db_tx_gain_1p2,
456 			ARRAY_SIZE(ar9331_modes_lowest_ob_db_tx_gain_1p2),
457 			5);
458 	else if (AR_SREV_9330_11(ah))
459 		INIT_INI_ARRAY(&ah->iniModesTxGain,
460 			ar9331_modes_lowest_ob_db_tx_gain_1p1,
461 			ARRAY_SIZE(ar9331_modes_lowest_ob_db_tx_gain_1p1),
462 			5);
463 	else if (AR_SREV_9340(ah))
464 		INIT_INI_ARRAY(&ah->iniModesTxGain,
465 			ar9340Modes_lowest_ob_db_tx_gain_table_1p0,
466 			ARRAY_SIZE(ar9340Modes_lowest_ob_db_tx_gain_table_1p0),
467 			5);
468 	else if (AR_SREV_9485_11(ah))
469 		INIT_INI_ARRAY(&ah->iniModesTxGain,
470 			ar9485_modes_lowest_ob_db_tx_gain_1_1,
471 			ARRAY_SIZE(ar9485_modes_lowest_ob_db_tx_gain_1_1),
472 			5);
473 	else if (AR_SREV_9580(ah))
474 		INIT_INI_ARRAY(&ah->iniModesTxGain,
475 			ar9580_1p0_lowest_ob_db_tx_gain_table,
476 			ARRAY_SIZE(ar9580_1p0_lowest_ob_db_tx_gain_table),
477 			5);
478 	else if (AR_SREV_9462_20(ah))
479 		INIT_INI_ARRAY(&ah->iniModesTxGain,
480 			ar9462_modes_low_ob_db_tx_gain_table_2p0,
481 			ARRAY_SIZE(ar9462_modes_low_ob_db_tx_gain_table_2p0),
482 			5);
483 	else
484 		INIT_INI_ARRAY(&ah->iniModesTxGain,
485 			ar9300Modes_lowest_ob_db_tx_gain_table_2p2,
486 			ARRAY_SIZE(ar9300Modes_lowest_ob_db_tx_gain_table_2p2),
487 			5);
488 }
489 
490 static void ar9003_tx_gain_table_mode1(struct ath_hw *ah)
491 {
492 	if (AR_SREV_9330_12(ah))
493 		INIT_INI_ARRAY(&ah->iniModesTxGain,
494 			ar9331_modes_high_ob_db_tx_gain_1p2,
495 			ARRAY_SIZE(ar9331_modes_high_ob_db_tx_gain_1p2),
496 			5);
497 	else if (AR_SREV_9330_11(ah))
498 		INIT_INI_ARRAY(&ah->iniModesTxGain,
499 			ar9331_modes_high_ob_db_tx_gain_1p1,
500 			ARRAY_SIZE(ar9331_modes_high_ob_db_tx_gain_1p1),
501 			5);
502 	else if (AR_SREV_9340(ah))
503 		INIT_INI_ARRAY(&ah->iniModesTxGain,
504 			ar9340Modes_lowest_ob_db_tx_gain_table_1p0,
505 			ARRAY_SIZE(ar9340Modes_lowest_ob_db_tx_gain_table_1p0),
506 			5);
507 	else if (AR_SREV_9485_11(ah))
508 		INIT_INI_ARRAY(&ah->iniModesTxGain,
509 			ar9485Modes_high_ob_db_tx_gain_1_1,
510 			ARRAY_SIZE(ar9485Modes_high_ob_db_tx_gain_1_1),
511 			5);
512 	else if (AR_SREV_9580(ah))
513 		INIT_INI_ARRAY(&ah->iniModesTxGain,
514 			ar9580_1p0_high_ob_db_tx_gain_table,
515 			ARRAY_SIZE(ar9580_1p0_high_ob_db_tx_gain_table),
516 			5);
517 	else if (AR_SREV_9462_20(ah))
518 		INIT_INI_ARRAY(&ah->iniModesTxGain,
519 			ar9462_modes_high_ob_db_tx_gain_table_2p0,
520 			ARRAY_SIZE(ar9462_modes_high_ob_db_tx_gain_table_2p0),
521 			5);
522 	else
523 		INIT_INI_ARRAY(&ah->iniModesTxGain,
524 			ar9300Modes_high_ob_db_tx_gain_table_2p2,
525 			ARRAY_SIZE(ar9300Modes_high_ob_db_tx_gain_table_2p2),
526 			5);
527 }
528 
529 static void ar9003_tx_gain_table_mode2(struct ath_hw *ah)
530 {
531 	if (AR_SREV_9330_12(ah))
532 		INIT_INI_ARRAY(&ah->iniModesTxGain,
533 			ar9331_modes_low_ob_db_tx_gain_1p2,
534 			ARRAY_SIZE(ar9331_modes_low_ob_db_tx_gain_1p2),
535 			5);
536 	else if (AR_SREV_9330_11(ah))
537 		INIT_INI_ARRAY(&ah->iniModesTxGain,
538 			ar9331_modes_low_ob_db_tx_gain_1p1,
539 			ARRAY_SIZE(ar9331_modes_low_ob_db_tx_gain_1p1),
540 			5);
541 	else if (AR_SREV_9340(ah))
542 		INIT_INI_ARRAY(&ah->iniModesTxGain,
543 			ar9340Modes_lowest_ob_db_tx_gain_table_1p0,
544 			ARRAY_SIZE(ar9340Modes_lowest_ob_db_tx_gain_table_1p0),
545 			5);
546 	else if (AR_SREV_9485_11(ah))
547 		INIT_INI_ARRAY(&ah->iniModesTxGain,
548 			ar9485Modes_low_ob_db_tx_gain_1_1,
549 			ARRAY_SIZE(ar9485Modes_low_ob_db_tx_gain_1_1),
550 			5);
551 	else if (AR_SREV_9580(ah))
552 		INIT_INI_ARRAY(&ah->iniModesTxGain,
553 			ar9580_1p0_low_ob_db_tx_gain_table,
554 			ARRAY_SIZE(ar9580_1p0_low_ob_db_tx_gain_table),
555 			5);
556 	else
557 		INIT_INI_ARRAY(&ah->iniModesTxGain,
558 			ar9300Modes_low_ob_db_tx_gain_table_2p2,
559 			ARRAY_SIZE(ar9300Modes_low_ob_db_tx_gain_table_2p2),
560 			5);
561 }
562 
563 static void ar9003_tx_gain_table_mode3(struct ath_hw *ah)
564 {
565 	if (AR_SREV_9330_12(ah))
566 		INIT_INI_ARRAY(&ah->iniModesTxGain,
567 			ar9331_modes_high_power_tx_gain_1p2,
568 			ARRAY_SIZE(ar9331_modes_high_power_tx_gain_1p2),
569 			5);
570 	else if (AR_SREV_9330_11(ah))
571 		INIT_INI_ARRAY(&ah->iniModesTxGain,
572 			ar9331_modes_high_power_tx_gain_1p1,
573 			ARRAY_SIZE(ar9331_modes_high_power_tx_gain_1p1),
574 			5);
575 	else if (AR_SREV_9340(ah))
576 		INIT_INI_ARRAY(&ah->iniModesTxGain,
577 			ar9340Modes_lowest_ob_db_tx_gain_table_1p0,
578 			ARRAY_SIZE(ar9340Modes_lowest_ob_db_tx_gain_table_1p0),
579 			5);
580 	else if (AR_SREV_9485_11(ah))
581 		INIT_INI_ARRAY(&ah->iniModesTxGain,
582 			ar9485Modes_high_power_tx_gain_1_1,
583 			ARRAY_SIZE(ar9485Modes_high_power_tx_gain_1_1),
584 			5);
585 	else if (AR_SREV_9580(ah))
586 		INIT_INI_ARRAY(&ah->iniModesTxGain,
587 			ar9580_1p0_high_power_tx_gain_table,
588 			ARRAY_SIZE(ar9580_1p0_high_power_tx_gain_table),
589 			5);
590 	else
591 		INIT_INI_ARRAY(&ah->iniModesTxGain,
592 			ar9300Modes_high_power_tx_gain_table_2p2,
593 			ARRAY_SIZE(ar9300Modes_high_power_tx_gain_table_2p2),
594 			5);
595 }
596 
597 static void ar9003_tx_gain_table_apply(struct ath_hw *ah)
598 {
599 	switch (ar9003_hw_get_tx_gain_idx(ah)) {
600 	case 0:
601 	default:
602 		ar9003_tx_gain_table_mode0(ah);
603 		break;
604 	case 1:
605 		ar9003_tx_gain_table_mode1(ah);
606 		break;
607 	case 2:
608 		ar9003_tx_gain_table_mode2(ah);
609 		break;
610 	case 3:
611 		ar9003_tx_gain_table_mode3(ah);
612 		break;
613 	}
614 }
615 
616 static void ar9003_rx_gain_table_mode0(struct ath_hw *ah)
617 {
618 	if (AR_SREV_9330_12(ah))
619 		INIT_INI_ARRAY(&ah->iniModesRxGain,
620 				ar9331_common_rx_gain_1p2,
621 				ARRAY_SIZE(ar9331_common_rx_gain_1p2),
622 				2);
623 	else if (AR_SREV_9330_11(ah))
624 		INIT_INI_ARRAY(&ah->iniModesRxGain,
625 				ar9331_common_rx_gain_1p1,
626 				ARRAY_SIZE(ar9331_common_rx_gain_1p1),
627 				2);
628 	else if (AR_SREV_9340(ah))
629 		INIT_INI_ARRAY(&ah->iniModesRxGain,
630 				ar9340Common_rx_gain_table_1p0,
631 				ARRAY_SIZE(ar9340Common_rx_gain_table_1p0),
632 				2);
633 	else if (AR_SREV_9485_11(ah))
634 		INIT_INI_ARRAY(&ah->iniModesRxGain,
635 				ar9485Common_wo_xlna_rx_gain_1_1,
636 				ARRAY_SIZE(ar9485Common_wo_xlna_rx_gain_1_1),
637 				2);
638 	else if (AR_SREV_9580(ah))
639 		INIT_INI_ARRAY(&ah->iniModesRxGain,
640 				ar9580_1p0_rx_gain_table,
641 				ARRAY_SIZE(ar9580_1p0_rx_gain_table),
642 				2);
643 	else if (AR_SREV_9462_20(ah))
644 		INIT_INI_ARRAY(&ah->iniModesRxGain,
645 				ar9462_common_rx_gain_table_2p0,
646 				ARRAY_SIZE(ar9462_common_rx_gain_table_2p0),
647 				2);
648 	else
649 		INIT_INI_ARRAY(&ah->iniModesRxGain,
650 				ar9300Common_rx_gain_table_2p2,
651 				ARRAY_SIZE(ar9300Common_rx_gain_table_2p2),
652 				2);
653 }
654 
655 static void ar9003_rx_gain_table_mode1(struct ath_hw *ah)
656 {
657 	if (AR_SREV_9330_12(ah))
658 		INIT_INI_ARRAY(&ah->iniModesRxGain,
659 			ar9331_common_wo_xlna_rx_gain_1p2,
660 			ARRAY_SIZE(ar9331_common_wo_xlna_rx_gain_1p2),
661 			2);
662 	else if (AR_SREV_9330_11(ah))
663 		INIT_INI_ARRAY(&ah->iniModesRxGain,
664 			ar9331_common_wo_xlna_rx_gain_1p1,
665 			ARRAY_SIZE(ar9331_common_wo_xlna_rx_gain_1p1),
666 			2);
667 	else if (AR_SREV_9340(ah))
668 		INIT_INI_ARRAY(&ah->iniModesRxGain,
669 			ar9340Common_wo_xlna_rx_gain_table_1p0,
670 			ARRAY_SIZE(ar9340Common_wo_xlna_rx_gain_table_1p0),
671 			2);
672 	else if (AR_SREV_9485_11(ah))
673 		INIT_INI_ARRAY(&ah->iniModesRxGain,
674 			ar9485Common_wo_xlna_rx_gain_1_1,
675 			ARRAY_SIZE(ar9485Common_wo_xlna_rx_gain_1_1),
676 			2);
677 	else if (AR_SREV_9462_20(ah))
678 		INIT_INI_ARRAY(&ah->iniModesRxGain,
679 			ar9462_common_wo_xlna_rx_gain_table_2p0,
680 			ARRAY_SIZE(ar9462_common_wo_xlna_rx_gain_table_2p0),
681 			2);
682 	else if (AR_SREV_9580(ah))
683 		INIT_INI_ARRAY(&ah->iniModesRxGain,
684 			ar9580_1p0_wo_xlna_rx_gain_table,
685 			ARRAY_SIZE(ar9580_1p0_wo_xlna_rx_gain_table),
686 			2);
687 	else
688 		INIT_INI_ARRAY(&ah->iniModesRxGain,
689 			ar9300Common_wo_xlna_rx_gain_table_2p2,
690 			ARRAY_SIZE(ar9300Common_wo_xlna_rx_gain_table_2p2),
691 			2);
692 }
693 
694 static void ar9003_rx_gain_table_mode2(struct ath_hw *ah)
695 {
696 	if (AR_SREV_9462_20(ah))
697 		INIT_INI_ARRAY(&ah->iniModesRxGain,
698 			       ar9462_common_mixed_rx_gain_table_2p0,
699 			       ARRAY_SIZE(ar9462_common_mixed_rx_gain_table_2p0), 2);
700 }
701 
702 static void ar9003_rx_gain_table_apply(struct ath_hw *ah)
703 {
704 	switch (ar9003_hw_get_rx_gain_idx(ah)) {
705 	case 0:
706 	default:
707 		ar9003_rx_gain_table_mode0(ah);
708 		break;
709 	case 1:
710 		ar9003_rx_gain_table_mode1(ah);
711 		break;
712 	case 2:
713 		ar9003_rx_gain_table_mode2(ah);
714 		break;
715 	}
716 }
717 
718 /* set gain table pointers according to values read from the eeprom */
719 static void ar9003_hw_init_mode_gain_regs(struct ath_hw *ah)
720 {
721 	ar9003_tx_gain_table_apply(ah);
722 	ar9003_rx_gain_table_apply(ah);
723 }
724 
725 /*
726  * Helper for ASPM support.
727  *
728  * Disable PLL when in L0s as well as receiver clock when in L1.
729  * This power saving option must be enabled through the SerDes.
730  *
731  * Programming the SerDes must go through the same 288 bit serial shift
732  * register as the other analog registers.  Hence the 9 writes.
733  */
734 static void ar9003_hw_configpcipowersave(struct ath_hw *ah,
735 					 bool power_off)
736 {
737 	/* Nothing to do on restore for 11N */
738 	if (!power_off /* !restore */) {
739 		/* set bit 19 to allow forcing of pcie core into L1 state */
740 		REG_SET_BIT(ah, AR_PCIE_PM_CTRL, AR_PCIE_PM_CTRL_ENA);
741 
742 		/* Several PCIe massages to ensure proper behaviour */
743 		if (ah->config.pcie_waen)
744 			REG_WRITE(ah, AR_WA, ah->config.pcie_waen);
745 		else
746 			REG_WRITE(ah, AR_WA, ah->WARegVal);
747 	}
748 
749 	/*
750 	 * Configire PCIE after Ini init. SERDES values now come from ini file
751 	 * This enables PCIe low power mode.
752 	 */
753 	if (ah->config.pcieSerDesWrite) {
754 		unsigned int i;
755 		struct ar5416IniArray *array;
756 
757 		array = power_off ? &ah->iniPcieSerdes :
758 				    &ah->iniPcieSerdesLowPower;
759 
760 		for (i = 0; i < array->ia_rows; i++) {
761 			REG_WRITE(ah,
762 				  INI_RA(array, i, 0),
763 				  INI_RA(array, i, 1));
764 		}
765 	}
766 }
767 
768 /* Sets up the AR9003 hardware familiy callbacks */
769 void ar9003_hw_attach_ops(struct ath_hw *ah)
770 {
771 	struct ath_hw_private_ops *priv_ops = ath9k_hw_private_ops(ah);
772 	struct ath_hw_ops *ops = ath9k_hw_ops(ah);
773 
774 	priv_ops->init_mode_regs = ar9003_hw_init_mode_regs;
775 	priv_ops->init_mode_gain_regs = ar9003_hw_init_mode_gain_regs;
776 
777 	ops->config_pci_powersave = ar9003_hw_configpcipowersave;
778 
779 	ar9003_hw_attach_phy_ops(ah);
780 	ar9003_hw_attach_calib_ops(ah);
781 	ar9003_hw_attach_mac_ops(ah);
782 }
783