2 * Copyright (c) 2010-2011 Atheros Communications Inc.
4 * Permission to use, copy, modify, and/or distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 #include <asm/unaligned.h>
19 #include "ar9003_phy.h"
20 #include "ar9003_eeprom.h"
22 #define COMP_HDR_LEN 4
23 #define COMP_CKSUM_LEN 2
25 #define LE16(x) __constant_cpu_to_le16(x)
26 #define LE32(x) __constant_cpu_to_le32(x)
28 /* Local defines to distinguish between extension and control CTL's */
29 #define EXT_ADDITIVE (0x8000)
30 #define CTL_11A_EXT (CTL_11A | EXT_ADDITIVE)
31 #define CTL_11G_EXT (CTL_11G | EXT_ADDITIVE)
32 #define CTL_11B_EXT (CTL_11B | EXT_ADDITIVE)
33 #define PWRINCR_3_TO_1_CHAIN 9 /* 10*log(3)*2 */
34 #define PWRINCR_3_TO_2_CHAIN 3 /* floor(10*log(3/2)*2) */
35 #define PWRINCR_2_TO_1_CHAIN 6 /* 10*log(2)*2 */
37 #define SUB_NUM_CTL_MODES_AT_5G_40 2 /* excluding HT40, EXT-OFDM */
38 #define SUB_NUM_CTL_MODES_AT_2G_40 3 /* excluding HT40, EXT-OFDM, EXT-CCK */
40 #define CTL(_tpower, _flag) ((_tpower) | ((_flag) << 6))
42 #define EEPROM_DATA_LEN_9485 1088
44 static int ar9003_hw_power_interpolate(int32_t x,
45 int32_t *px, int32_t *py, u_int16_t np);
48 static const struct ar9300_eeprom ar9300_default = {
51 .macAddr = {0, 2, 3, 4, 5, 6},
52 .custData = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
53 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
55 .regDmn = { LE16(0), LE16(0x1f) },
56 .txrxMask = 0x77, /* 4 bits tx and 4 bits rx */
58 .opFlags = AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A,
62 .blueToothOptions = 0,
64 .deviceType = 5, /* takes lower byte in eeprom location */
65 .pwrTableOffset = AR9300_PWR_TABLE_OFFSET,
66 .params_for_tuning_caps = {0, 0},
67 .featureEnable = 0x0c,
69 * bit0 - enable tx temp comp - disabled
70 * bit1 - enable tx volt comp - disabled
71 * bit2 - enable fastClock - enabled
72 * bit3 - enable doubling - enabled
73 * bit4 - enable internal regulator - disabled
74 * bit5 - enable pa predistortion - disabled
76 .miscConfiguration = 0, /* bit0 - turn down drivestrength */
77 .eepromWriteEnableGpio = 3,
80 .rxBandSelectGpio = 0xff,
85 /* ar9300_modal_eep_header 2g */
86 /* 4 idle,t1,t2,b(4 bits per setting) */
87 .antCtrlCommon = LE32(0x110),
88 /* 4 ra1l1, ra2l1, ra1l2, ra2l2, ra12 */
89 .antCtrlCommon2 = LE32(0x22222),
92 * antCtrlChain[AR9300_MAX_CHAINS]; 6 idle, t, r,
93 * rx1, rx12, b (2 bits each)
95 .antCtrlChain = { LE16(0x150), LE16(0x150), LE16(0x150) },
98 * xatten1DB[AR9300_MAX_CHAINS]; 3 xatten1_db
99 * for ar9280 (0xa20c/b20c 5:0)
101 .xatten1DB = {0, 0, 0},
104 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
105 * for ar9280 (0xa20c/b20c 16:12
107 .xatten1Margin = {0, 0, 0},
112 * spurChans[OSPREY_EEPROM_MODAL_SPURS]; spur
113 * channels in usual fbin coding format
115 .spurChans = {0, 0, 0, 0, 0},
118 * noiseFloorThreshCh[AR9300_MAX_CHAINS]; 3 Check
119 * if the register is per chain
121 .noiseFloorThreshCh = {-1, 0, 0},
122 .reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
125 .txFrameToDataStart = 0x0e,
126 .txFrameToPaOn = 0x0e,
127 .txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
129 .switchSettling = 0x2c,
130 .adcDesiredSize = -30,
133 .txFrameToXpaOn = 0xe,
135 .papdRateMaskHt20 = LE32(0x0cf0e0e0),
136 .papdRateMaskHt40 = LE32(0x6cf0e0e0),
138 0, 0, 0, 0, 0, 0, 0, 0,
142 .ant_div_control = 0,
143 .future = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
150 /* ar9300_cal_data_per_freq_op_loop 2g */
152 { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
153 { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
154 { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
156 .calTarget_freqbin_Cck = {
160 .calTarget_freqbin_2G = {
165 .calTarget_freqbin_2GHT20 = {
170 .calTarget_freqbin_2GHT40 = {
175 .calTargetPowerCck = {
176 /* 1L-5L,5S,11L,11S */
177 { {36, 36, 36, 36} },
178 { {36, 36, 36, 36} },
180 .calTargetPower2G = {
182 { {32, 32, 28, 24} },
183 { {32, 32, 28, 24} },
184 { {32, 32, 28, 24} },
186 .calTargetPower2GHT20 = {
187 { {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
188 { {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
189 { {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
191 .calTargetPower2GHT40 = {
192 { {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
193 { {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
194 { {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
197 0x11, 0x12, 0x15, 0x17, 0x41, 0x42,
198 0x45, 0x47, 0x31, 0x32, 0x35, 0x37,
228 /* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
229 /* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
230 /* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
231 /* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(2484, 1),
235 /* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
236 /* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
237 /* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
242 /* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
243 /* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
249 /* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
250 /* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
251 /* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
252 /* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
256 /* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
257 /* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
258 /* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
262 /* Data[9].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
263 /* Data[9].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
264 /* Data[9].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
269 /* Data[10].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
270 /* Data[10].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
271 /* Data[10].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
276 /* Data[11].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
277 /* Data[11].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
278 /* Data[11].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
279 /* Data[11].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
283 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
284 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
285 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } },
287 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } },
288 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
289 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
291 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } },
292 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
293 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
295 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
296 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
297 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
300 /* 4 idle,t1,t2,b (4 bits per setting) */
301 .antCtrlCommon = LE32(0x110),
302 /* 4 ra1l1, ra2l1, ra1l2,ra2l2,ra12 */
303 .antCtrlCommon2 = LE32(0x22222),
304 /* antCtrlChain 6 idle, t,r,rx1,rx12,b (2 bits each) */
306 LE16(0x000), LE16(0x000), LE16(0x000),
308 /* xatten1DB 3 xatten1_db for AR9280 (0xa20c/b20c 5:0) */
309 .xatten1DB = {0, 0, 0},
312 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
313 * for merlin (0xa20c/b20c 16:12
315 .xatten1Margin = {0, 0, 0},
318 /* spurChans spur channels in usual fbin coding format */
319 .spurChans = {0, 0, 0, 0, 0},
320 /* noiseFloorThreshCh Check if the register is per chain */
321 .noiseFloorThreshCh = {-1, 0, 0},
322 .reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
325 .txFrameToDataStart = 0x0e,
326 .txFrameToPaOn = 0x0e,
327 .txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
329 .switchSettling = 0x2d,
330 .adcDesiredSize = -30,
333 .txFrameToXpaOn = 0xe,
335 .papdRateMaskHt20 = LE32(0x0c80c080),
336 .papdRateMaskHt40 = LE32(0x0080c080),
338 0, 0, 0, 0, 0, 0, 0, 0,
344 .xatten1DBLow = {0, 0, 0},
345 .xatten1MarginLow = {0, 0, 0},
346 .xatten1DBHigh = {0, 0, 0},
347 .xatten1MarginHigh = {0, 0, 0}
392 .calTarget_freqbin_5G = {
402 .calTarget_freqbin_5GHT20 = {
412 .calTarget_freqbin_5GHT40 = {
422 .calTargetPower5G = {
424 { {20, 20, 20, 10} },
425 { {20, 20, 20, 10} },
426 { {20, 20, 20, 10} },
427 { {20, 20, 20, 10} },
428 { {20, 20, 20, 10} },
429 { {20, 20, 20, 10} },
430 { {20, 20, 20, 10} },
431 { {20, 20, 20, 10} },
433 .calTargetPower5GHT20 = {
435 * 0_8_16,1-3_9-11_17-19,
436 * 4,5,6,7,12,13,14,15,20,21,22,23
438 { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
439 { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
440 { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
441 { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
442 { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
443 { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
444 { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
445 { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
447 .calTargetPower5GHT40 = {
449 * 0_8_16,1-3_9-11_17-19,
450 * 4,5,6,7,12,13,14,15,20,21,22,23
452 { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
453 { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
454 { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
455 { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
456 { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
457 { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
458 { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
459 { {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
462 0x10, 0x16, 0x18, 0x40, 0x46,
463 0x48, 0x30, 0x36, 0x38
467 /* Data[0].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
468 /* Data[0].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
469 /* Data[0].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
470 /* Data[0].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
471 /* Data[0].ctlEdges[4].bChannel */ FREQ2FBIN(5600, 0),
472 /* Data[0].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
473 /* Data[0].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
474 /* Data[0].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
477 /* Data[1].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
478 /* Data[1].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
479 /* Data[1].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
480 /* Data[1].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
481 /* Data[1].ctlEdges[4].bChannel */ FREQ2FBIN(5520, 0),
482 /* Data[1].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
483 /* Data[1].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
484 /* Data[1].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
488 /* Data[2].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
489 /* Data[2].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
490 /* Data[2].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
491 /* Data[2].ctlEdges[3].bChannel */ FREQ2FBIN(5310, 0),
492 /* Data[2].ctlEdges[4].bChannel */ FREQ2FBIN(5510, 0),
493 /* Data[2].ctlEdges[5].bChannel */ FREQ2FBIN(5550, 0),
494 /* Data[2].ctlEdges[6].bChannel */ FREQ2FBIN(5670, 0),
495 /* Data[2].ctlEdges[7].bChannel */ FREQ2FBIN(5755, 0)
499 /* Data[3].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
500 /* Data[3].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
501 /* Data[3].ctlEdges[2].bChannel */ FREQ2FBIN(5260, 0),
502 /* Data[3].ctlEdges[3].bChannel */ FREQ2FBIN(5320, 0),
503 /* Data[3].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
504 /* Data[3].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
505 /* Data[3].ctlEdges[6].bChannel */ 0xFF,
506 /* Data[3].ctlEdges[7].bChannel */ 0xFF,
510 /* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
511 /* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
512 /* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(5500, 0),
513 /* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(5700, 0),
514 /* Data[4].ctlEdges[4].bChannel */ 0xFF,
515 /* Data[4].ctlEdges[5].bChannel */ 0xFF,
516 /* Data[4].ctlEdges[6].bChannel */ 0xFF,
517 /* Data[4].ctlEdges[7].bChannel */ 0xFF,
521 /* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
522 /* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(5270, 0),
523 /* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(5310, 0),
524 /* Data[5].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
525 /* Data[5].ctlEdges[4].bChannel */ FREQ2FBIN(5590, 0),
526 /* Data[5].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
527 /* Data[5].ctlEdges[6].bChannel */ 0xFF,
528 /* Data[5].ctlEdges[7].bChannel */ 0xFF
532 /* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
533 /* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
534 /* Data[6].ctlEdges[2].bChannel */ FREQ2FBIN(5220, 0),
535 /* Data[6].ctlEdges[3].bChannel */ FREQ2FBIN(5260, 0),
536 /* Data[6].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
537 /* Data[6].ctlEdges[5].bChannel */ FREQ2FBIN(5600, 0),
538 /* Data[6].ctlEdges[6].bChannel */ FREQ2FBIN(5700, 0),
539 /* Data[6].ctlEdges[7].bChannel */ FREQ2FBIN(5745, 0)
543 /* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
544 /* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
545 /* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(5320, 0),
546 /* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
547 /* Data[7].ctlEdges[4].bChannel */ FREQ2FBIN(5560, 0),
548 /* Data[7].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
549 /* Data[7].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
550 /* Data[7].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
554 /* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
555 /* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
556 /* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
557 /* Data[8].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
558 /* Data[8].ctlEdges[4].bChannel */ FREQ2FBIN(5550, 0),
559 /* Data[8].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
560 /* Data[8].ctlEdges[6].bChannel */ FREQ2FBIN(5755, 0),
561 /* Data[8].ctlEdges[7].bChannel */ FREQ2FBIN(5795, 0)
567 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
568 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
573 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
574 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
579 CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 1),
580 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
585 CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0),
586 CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
591 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
592 CTL(60, 0), CTL(60, 0), CTL(60, 0), CTL(60, 0),
597 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
598 CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
603 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
604 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
609 CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
610 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
615 CTL(60, 1), CTL(60, 0), CTL(60, 1), CTL(60, 1),
616 CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
622 static const struct ar9300_eeprom ar9300_x113 = {
624 .templateVersion = 6,
625 .macAddr = {0x00, 0x03, 0x7f, 0x0, 0x0, 0x0},
626 .custData = {"x113-023-f0000"},
628 .regDmn = { LE16(0), LE16(0x1f) },
629 .txrxMask = 0x77, /* 4 bits tx and 4 bits rx */
631 .opFlags = AR5416_OPFLAGS_11A,
635 .blueToothOptions = 0,
637 .deviceType = 5, /* takes lower byte in eeprom location */
638 .pwrTableOffset = AR9300_PWR_TABLE_OFFSET,
639 .params_for_tuning_caps = {0, 0},
640 .featureEnable = 0x0d,
642 * bit0 - enable tx temp comp - disabled
643 * bit1 - enable tx volt comp - disabled
644 * bit2 - enable fastClock - enabled
645 * bit3 - enable doubling - enabled
646 * bit4 - enable internal regulator - disabled
647 * bit5 - enable pa predistortion - disabled
649 .miscConfiguration = 0, /* bit0 - turn down drivestrength */
650 .eepromWriteEnableGpio = 6,
651 .wlanDisableGpio = 0,
653 .rxBandSelectGpio = 0xff,
658 /* ar9300_modal_eep_header 2g */
659 /* 4 idle,t1,t2,b(4 bits per setting) */
660 .antCtrlCommon = LE32(0x110),
661 /* 4 ra1l1, ra2l1, ra1l2, ra2l2, ra12 */
662 .antCtrlCommon2 = LE32(0x44444),
665 * antCtrlChain[AR9300_MAX_CHAINS]; 6 idle, t, r,
666 * rx1, rx12, b (2 bits each)
668 .antCtrlChain = { LE16(0x150), LE16(0x150), LE16(0x150) },
671 * xatten1DB[AR9300_MAX_CHAINS]; 3 xatten1_db
672 * for ar9280 (0xa20c/b20c 5:0)
674 .xatten1DB = {0, 0, 0},
677 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
678 * for ar9280 (0xa20c/b20c 16:12
680 .xatten1Margin = {0, 0, 0},
685 * spurChans[OSPREY_EEPROM_MODAL_SPURS]; spur
686 * channels in usual fbin coding format
688 .spurChans = {FREQ2FBIN(2464, 1), 0, 0, 0, 0},
691 * noiseFloorThreshCh[AR9300_MAX_CHAINS]; 3 Check
692 * if the register is per chain
694 .noiseFloorThreshCh = {-1, 0, 0},
695 .reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
698 .txFrameToDataStart = 0x0e,
699 .txFrameToPaOn = 0x0e,
700 .txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
702 .switchSettling = 0x2c,
703 .adcDesiredSize = -30,
706 .txFrameToXpaOn = 0xe,
708 .papdRateMaskHt20 = LE32(0x0c80c080),
709 .papdRateMaskHt40 = LE32(0x0080c080),
711 0, 0, 0, 0, 0, 0, 0, 0,
715 .ant_div_control = 0,
716 .future = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
723 /* ar9300_cal_data_per_freq_op_loop 2g */
725 { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
726 { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
727 { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
729 .calTarget_freqbin_Cck = {
733 .calTarget_freqbin_2G = {
738 .calTarget_freqbin_2GHT20 = {
743 .calTarget_freqbin_2GHT40 = {
748 .calTargetPowerCck = {
749 /* 1L-5L,5S,11L,11S */
750 { {34, 34, 34, 34} },
751 { {34, 34, 34, 34} },
753 .calTargetPower2G = {
755 { {34, 34, 32, 32} },
756 { {34, 34, 32, 32} },
757 { {34, 34, 32, 32} },
759 .calTargetPower2GHT20 = {
760 { {32, 32, 32, 32, 32, 28, 32, 32, 30, 28, 0, 0, 0, 0} },
761 { {32, 32, 32, 32, 32, 28, 32, 32, 30, 28, 0, 0, 0, 0} },
762 { {32, 32, 32, 32, 32, 28, 32, 32, 30, 28, 0, 0, 0, 0} },
764 .calTargetPower2GHT40 = {
765 { {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 0, 0, 0, 0} },
766 { {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 0, 0, 0, 0} },
767 { {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 0, 0, 0, 0} },
770 0x11, 0x12, 0x15, 0x17, 0x41, 0x42,
771 0x45, 0x47, 0x31, 0x32, 0x35, 0x37,
801 /* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
802 /* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
803 /* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
804 /* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(2484, 1),
808 /* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
809 /* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
810 /* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
815 /* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
816 /* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
822 /* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
823 /* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
824 /* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
825 /* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
829 /* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
830 /* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
831 /* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
835 /* Data[9].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
836 /* Data[9].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
837 /* Data[9].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
842 /* Data[10].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
843 /* Data[10].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
844 /* Data[10].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
849 /* Data[11].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
850 /* Data[11].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
851 /* Data[11].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
852 /* Data[11].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
856 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
857 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
858 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } },
860 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } },
861 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
862 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
864 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } },
865 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
866 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
868 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
869 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
870 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
873 /* 4 idle,t1,t2,b (4 bits per setting) */
874 .antCtrlCommon = LE32(0x220),
875 /* 4 ra1l1, ra2l1, ra1l2,ra2l2,ra12 */
876 .antCtrlCommon2 = LE32(0x11111),
877 /* antCtrlChain 6 idle, t,r,rx1,rx12,b (2 bits each) */
879 LE16(0x150), LE16(0x150), LE16(0x150),
881 /* xatten1DB 3 xatten1_db for AR9280 (0xa20c/b20c 5:0) */
882 .xatten1DB = {0, 0, 0},
885 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
886 * for merlin (0xa20c/b20c 16:12
888 .xatten1Margin = {0, 0, 0},
891 /* spurChans spur channels in usual fbin coding format */
892 .spurChans = {FREQ2FBIN(5500, 0), 0, 0, 0, 0},
893 /* noiseFloorThreshCh Check if the register is per chain */
894 .noiseFloorThreshCh = {-1, 0, 0},
895 .reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
898 .txFrameToDataStart = 0x0e,
899 .txFrameToPaOn = 0x0e,
900 .txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
902 .switchSettling = 0x2d,
903 .adcDesiredSize = -30,
906 .txFrameToXpaOn = 0xe,
908 .papdRateMaskHt20 = LE32(0x0cf0e0e0),
909 .papdRateMaskHt40 = LE32(0x6cf0e0e0),
911 0, 0, 0, 0, 0, 0, 0, 0,
916 .tempSlopeHigh = 105,
917 .xatten1DBLow = {0, 0, 0},
918 .xatten1MarginLow = {0, 0, 0},
919 .xatten1DBHigh = {0, 0, 0},
920 .xatten1MarginHigh = {0, 0, 0}
965 .calTarget_freqbin_5G = {
975 .calTarget_freqbin_5GHT20 = {
985 .calTarget_freqbin_5GHT40 = {
995 .calTargetPower5G = {
997 { {42, 40, 40, 34} },
998 { {42, 40, 40, 34} },
999 { {42, 40, 40, 34} },
1000 { {42, 40, 40, 34} },
1001 { {42, 40, 40, 34} },
1002 { {42, 40, 40, 34} },
1003 { {42, 40, 40, 34} },
1004 { {42, 40, 40, 34} },
1006 .calTargetPower5GHT20 = {
1008 * 0_8_16,1-3_9-11_17-19,
1009 * 4,5,6,7,12,13,14,15,20,21,22,23
1011 { {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
1012 { {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
1013 { {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
1014 { {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
1015 { {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
1016 { {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
1017 { {38, 38, 38, 38, 32, 28, 38, 38, 32, 28, 38, 38, 32, 26} },
1018 { {36, 36, 36, 36, 32, 28, 36, 36, 32, 28, 36, 36, 32, 26} },
1020 .calTargetPower5GHT40 = {
1022 * 0_8_16,1-3_9-11_17-19,
1023 * 4,5,6,7,12,13,14,15,20,21,22,23
1025 { {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
1026 { {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
1027 { {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
1028 { {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
1029 { {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
1030 { {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
1031 { {36, 36, 36, 36, 30, 26, 36, 36, 30, 26, 36, 36, 30, 24} },
1032 { {34, 34, 34, 34, 30, 26, 34, 34, 30, 26, 34, 34, 30, 24} },
1035 0x10, 0x16, 0x18, 0x40, 0x46,
1036 0x48, 0x30, 0x36, 0x38
1040 /* Data[0].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
1041 /* Data[0].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
1042 /* Data[0].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
1043 /* Data[0].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
1044 /* Data[0].ctlEdges[4].bChannel */ FREQ2FBIN(5600, 0),
1045 /* Data[0].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
1046 /* Data[0].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
1047 /* Data[0].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
1050 /* Data[1].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
1051 /* Data[1].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
1052 /* Data[1].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
1053 /* Data[1].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
1054 /* Data[1].ctlEdges[4].bChannel */ FREQ2FBIN(5520, 0),
1055 /* Data[1].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
1056 /* Data[1].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
1057 /* Data[1].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
1061 /* Data[2].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
1062 /* Data[2].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
1063 /* Data[2].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
1064 /* Data[2].ctlEdges[3].bChannel */ FREQ2FBIN(5310, 0),
1065 /* Data[2].ctlEdges[4].bChannel */ FREQ2FBIN(5510, 0),
1066 /* Data[2].ctlEdges[5].bChannel */ FREQ2FBIN(5550, 0),
1067 /* Data[2].ctlEdges[6].bChannel */ FREQ2FBIN(5670, 0),
1068 /* Data[2].ctlEdges[7].bChannel */ FREQ2FBIN(5755, 0)
1072 /* Data[3].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
1073 /* Data[3].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
1074 /* Data[3].ctlEdges[2].bChannel */ FREQ2FBIN(5260, 0),
1075 /* Data[3].ctlEdges[3].bChannel */ FREQ2FBIN(5320, 0),
1076 /* Data[3].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
1077 /* Data[3].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
1078 /* Data[3].ctlEdges[6].bChannel */ 0xFF,
1079 /* Data[3].ctlEdges[7].bChannel */ 0xFF,
1083 /* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
1084 /* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
1085 /* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(5500, 0),
1086 /* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(5700, 0),
1087 /* Data[4].ctlEdges[4].bChannel */ 0xFF,
1088 /* Data[4].ctlEdges[5].bChannel */ 0xFF,
1089 /* Data[4].ctlEdges[6].bChannel */ 0xFF,
1090 /* Data[4].ctlEdges[7].bChannel */ 0xFF,
1094 /* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
1095 /* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(5270, 0),
1096 /* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(5310, 0),
1097 /* Data[5].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
1098 /* Data[5].ctlEdges[4].bChannel */ FREQ2FBIN(5590, 0),
1099 /* Data[5].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
1100 /* Data[5].ctlEdges[6].bChannel */ 0xFF,
1101 /* Data[5].ctlEdges[7].bChannel */ 0xFF
1105 /* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
1106 /* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
1107 /* Data[6].ctlEdges[2].bChannel */ FREQ2FBIN(5220, 0),
1108 /* Data[6].ctlEdges[3].bChannel */ FREQ2FBIN(5260, 0),
1109 /* Data[6].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
1110 /* Data[6].ctlEdges[5].bChannel */ FREQ2FBIN(5600, 0),
1111 /* Data[6].ctlEdges[6].bChannel */ FREQ2FBIN(5700, 0),
1112 /* Data[6].ctlEdges[7].bChannel */ FREQ2FBIN(5745, 0)
1116 /* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
1117 /* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
1118 /* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(5320, 0),
1119 /* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
1120 /* Data[7].ctlEdges[4].bChannel */ FREQ2FBIN(5560, 0),
1121 /* Data[7].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
1122 /* Data[7].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
1123 /* Data[7].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
1127 /* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
1128 /* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
1129 /* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
1130 /* Data[8].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
1131 /* Data[8].ctlEdges[4].bChannel */ FREQ2FBIN(5550, 0),
1132 /* Data[8].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
1133 /* Data[8].ctlEdges[6].bChannel */ FREQ2FBIN(5755, 0),
1134 /* Data[8].ctlEdges[7].bChannel */ FREQ2FBIN(5795, 0)
1137 .ctlPowerData_5G = {
1140 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
1141 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
1146 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
1147 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
1152 CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 1),
1153 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
1158 CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0),
1159 CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
1164 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
1165 CTL(60, 0), CTL(60, 0), CTL(60, 0), CTL(60, 0),
1170 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
1171 CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
1176 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
1177 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
1182 CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
1183 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
1188 CTL(60, 1), CTL(60, 0), CTL(60, 1), CTL(60, 1),
1189 CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
1196 static const struct ar9300_eeprom ar9300_h112 = {
1198 .templateVersion = 3,
1199 .macAddr = {0x00, 0x03, 0x7f, 0x0, 0x0, 0x0},
1200 .custData = {"h112-241-f0000"},
1202 .regDmn = { LE16(0), LE16(0x1f) },
1203 .txrxMask = 0x77, /* 4 bits tx and 4 bits rx */
1205 .opFlags = AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A,
1209 .blueToothOptions = 0,
1211 .deviceType = 5, /* takes lower byte in eeprom location */
1212 .pwrTableOffset = AR9300_PWR_TABLE_OFFSET,
1213 .params_for_tuning_caps = {0, 0},
1214 .featureEnable = 0x0d,
1216 * bit0 - enable tx temp comp - disabled
1217 * bit1 - enable tx volt comp - disabled
1218 * bit2 - enable fastClock - enabled
1219 * bit3 - enable doubling - enabled
1220 * bit4 - enable internal regulator - disabled
1221 * bit5 - enable pa predistortion - disabled
1223 .miscConfiguration = 0, /* bit0 - turn down drivestrength */
1224 .eepromWriteEnableGpio = 6,
1225 .wlanDisableGpio = 0,
1227 .rxBandSelectGpio = 0xff,
1232 /* ar9300_modal_eep_header 2g */
1233 /* 4 idle,t1,t2,b(4 bits per setting) */
1234 .antCtrlCommon = LE32(0x110),
1235 /* 4 ra1l1, ra2l1, ra1l2, ra2l2, ra12 */
1236 .antCtrlCommon2 = LE32(0x44444),
1239 * antCtrlChain[AR9300_MAX_CHAINS]; 6 idle, t, r,
1240 * rx1, rx12, b (2 bits each)
1242 .antCtrlChain = { LE16(0x150), LE16(0x150), LE16(0x150) },
1245 * xatten1DB[AR9300_MAX_CHAINS]; 3 xatten1_db
1246 * for ar9280 (0xa20c/b20c 5:0)
1248 .xatten1DB = {0, 0, 0},
1251 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
1252 * for ar9280 (0xa20c/b20c 16:12
1254 .xatten1Margin = {0, 0, 0},
1259 * spurChans[OSPREY_EEPROM_MODAL_SPURS]; spur
1260 * channels in usual fbin coding format
1262 .spurChans = {FREQ2FBIN(2464, 1), 0, 0, 0, 0},
1265 * noiseFloorThreshCh[AR9300_MAX_CHAINS]; 3 Check
1266 * if the register is per chain
1268 .noiseFloorThreshCh = {-1, 0, 0},
1269 .reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1272 .txFrameToDataStart = 0x0e,
1273 .txFrameToPaOn = 0x0e,
1274 .txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
1276 .switchSettling = 0x2c,
1277 .adcDesiredSize = -30,
1280 .txFrameToXpaOn = 0xe,
1282 .papdRateMaskHt20 = LE32(0x0c80c080),
1283 .papdRateMaskHt40 = LE32(0x0080c080),
1285 0, 0, 0, 0, 0, 0, 0, 0,
1289 .ant_div_control = 0,
1290 .future = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
1297 /* ar9300_cal_data_per_freq_op_loop 2g */
1299 { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
1300 { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
1301 { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
1303 .calTarget_freqbin_Cck = {
1307 .calTarget_freqbin_2G = {
1312 .calTarget_freqbin_2GHT20 = {
1317 .calTarget_freqbin_2GHT40 = {
1322 .calTargetPowerCck = {
1323 /* 1L-5L,5S,11L,11S */
1324 { {34, 34, 34, 34} },
1325 { {34, 34, 34, 34} },
1327 .calTargetPower2G = {
1329 { {34, 34, 32, 32} },
1330 { {34, 34, 32, 32} },
1331 { {34, 34, 32, 32} },
1333 .calTargetPower2GHT20 = {
1334 { {32, 32, 32, 32, 32, 30, 32, 32, 30, 28, 28, 28, 28, 24} },
1335 { {32, 32, 32, 32, 32, 30, 32, 32, 30, 28, 28, 28, 28, 24} },
1336 { {32, 32, 32, 32, 32, 30, 32, 32, 30, 28, 28, 28, 28, 24} },
1338 .calTargetPower2GHT40 = {
1339 { {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 26, 26, 26, 22} },
1340 { {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 26, 26, 26, 22} },
1341 { {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 26, 26, 26, 22} },
1344 0x11, 0x12, 0x15, 0x17, 0x41, 0x42,
1345 0x45, 0x47, 0x31, 0x32, 0x35, 0x37,
1375 /* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
1376 /* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
1377 /* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
1378 /* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(2484, 1),
1382 /* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
1383 /* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
1384 /* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
1389 /* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
1390 /* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
1396 /* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
1397 /* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
1398 /* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
1399 /* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
1403 /* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
1404 /* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
1405 /* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
1409 /* Data[9].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
1410 /* Data[9].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
1411 /* Data[9].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
1416 /* Data[10].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
1417 /* Data[10].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
1418 /* Data[10].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
1423 /* Data[11].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
1424 /* Data[11].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
1425 /* Data[11].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
1426 /* Data[11].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
1429 .ctlPowerData_2G = {
1430 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
1431 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
1432 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } },
1434 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } },
1435 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
1436 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
1438 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } },
1439 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
1440 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
1442 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
1443 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
1444 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
1447 /* 4 idle,t1,t2,b (4 bits per setting) */
1448 .antCtrlCommon = LE32(0x220),
1449 /* 4 ra1l1, ra2l1, ra1l2,ra2l2,ra12 */
1450 .antCtrlCommon2 = LE32(0x44444),
1451 /* antCtrlChain 6 idle, t,r,rx1,rx12,b (2 bits each) */
1453 LE16(0x150), LE16(0x150), LE16(0x150),
1455 /* xatten1DB 3 xatten1_db for AR9280 (0xa20c/b20c 5:0) */
1456 .xatten1DB = {0, 0, 0},
1459 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
1460 * for merlin (0xa20c/b20c 16:12
1462 .xatten1Margin = {0, 0, 0},
1465 /* spurChans spur channels in usual fbin coding format */
1466 .spurChans = {0, 0, 0, 0, 0},
1467 /* noiseFloorThreshCh Check if the register is per chain */
1468 .noiseFloorThreshCh = {-1, 0, 0},
1469 .reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1472 .txFrameToDataStart = 0x0e,
1473 .txFrameToPaOn = 0x0e,
1474 .txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
1476 .switchSettling = 0x2d,
1477 .adcDesiredSize = -30,
1480 .txFrameToXpaOn = 0xe,
1482 .papdRateMaskHt20 = LE32(0x0cf0e0e0),
1483 .papdRateMaskHt40 = LE32(0x6cf0e0e0),
1485 0, 0, 0, 0, 0, 0, 0, 0,
1490 .tempSlopeHigh = 50,
1491 .xatten1DBLow = {0, 0, 0},
1492 .xatten1MarginLow = {0, 0, 0},
1493 .xatten1DBHigh = {0, 0, 0},
1494 .xatten1MarginHigh = {0, 0, 0}
1539 .calTarget_freqbin_5G = {
1549 .calTarget_freqbin_5GHT20 = {
1559 .calTarget_freqbin_5GHT40 = {
1569 .calTargetPower5G = {
1571 { {30, 30, 28, 24} },
1572 { {30, 30, 28, 24} },
1573 { {30, 30, 28, 24} },
1574 { {30, 30, 28, 24} },
1575 { {30, 30, 28, 24} },
1576 { {30, 30, 28, 24} },
1577 { {30, 30, 28, 24} },
1578 { {30, 30, 28, 24} },
1580 .calTargetPower5GHT20 = {
1582 * 0_8_16,1-3_9-11_17-19,
1583 * 4,5,6,7,12,13,14,15,20,21,22,23
1585 { {30, 30, 30, 28, 24, 20, 30, 28, 24, 20, 20, 20, 20, 16} },
1586 { {30, 30, 30, 28, 24, 20, 30, 28, 24, 20, 20, 20, 20, 16} },
1587 { {30, 30, 30, 26, 22, 18, 30, 26, 22, 18, 18, 18, 18, 16} },
1588 { {30, 30, 30, 26, 22, 18, 30, 26, 22, 18, 18, 18, 18, 16} },
1589 { {30, 30, 30, 24, 20, 16, 30, 24, 20, 16, 16, 16, 16, 14} },
1590 { {30, 30, 30, 24, 20, 16, 30, 24, 20, 16, 16, 16, 16, 14} },
1591 { {30, 30, 30, 22, 18, 14, 30, 22, 18, 14, 14, 14, 14, 12} },
1592 { {30, 30, 30, 22, 18, 14, 30, 22, 18, 14, 14, 14, 14, 12} },
1594 .calTargetPower5GHT40 = {
1596 * 0_8_16,1-3_9-11_17-19,
1597 * 4,5,6,7,12,13,14,15,20,21,22,23
1599 { {28, 28, 28, 26, 22, 18, 28, 26, 22, 18, 18, 18, 18, 14} },
1600 { {28, 28, 28, 26, 22, 18, 28, 26, 22, 18, 18, 18, 18, 14} },
1601 { {28, 28, 28, 24, 20, 16, 28, 24, 20, 16, 16, 16, 16, 12} },
1602 { {28, 28, 28, 24, 20, 16, 28, 24, 20, 16, 16, 16, 16, 12} },
1603 { {28, 28, 28, 22, 18, 14, 28, 22, 18, 14, 14, 14, 14, 10} },
1604 { {28, 28, 28, 22, 18, 14, 28, 22, 18, 14, 14, 14, 14, 10} },
1605 { {28, 28, 28, 20, 16, 12, 28, 20, 16, 12, 12, 12, 12, 8} },
1606 { {28, 28, 28, 20, 16, 12, 28, 20, 16, 12, 12, 12, 12, 8} },
1609 0x10, 0x16, 0x18, 0x40, 0x46,
1610 0x48, 0x30, 0x36, 0x38
1614 /* Data[0].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
1615 /* Data[0].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
1616 /* Data[0].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
1617 /* Data[0].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
1618 /* Data[0].ctlEdges[4].bChannel */ FREQ2FBIN(5600, 0),
1619 /* Data[0].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
1620 /* Data[0].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
1621 /* Data[0].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
1624 /* Data[1].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
1625 /* Data[1].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
1626 /* Data[1].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
1627 /* Data[1].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
1628 /* Data[1].ctlEdges[4].bChannel */ FREQ2FBIN(5520, 0),
1629 /* Data[1].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
1630 /* Data[1].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
1631 /* Data[1].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
1635 /* Data[2].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
1636 /* Data[2].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
1637 /* Data[2].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
1638 /* Data[2].ctlEdges[3].bChannel */ FREQ2FBIN(5310, 0),
1639 /* Data[2].ctlEdges[4].bChannel */ FREQ2FBIN(5510, 0),
1640 /* Data[2].ctlEdges[5].bChannel */ FREQ2FBIN(5550, 0),
1641 /* Data[2].ctlEdges[6].bChannel */ FREQ2FBIN(5670, 0),
1642 /* Data[2].ctlEdges[7].bChannel */ FREQ2FBIN(5755, 0)
1646 /* Data[3].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
1647 /* Data[3].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
1648 /* Data[3].ctlEdges[2].bChannel */ FREQ2FBIN(5260, 0),
1649 /* Data[3].ctlEdges[3].bChannel */ FREQ2FBIN(5320, 0),
1650 /* Data[3].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
1651 /* Data[3].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
1652 /* Data[3].ctlEdges[6].bChannel */ 0xFF,
1653 /* Data[3].ctlEdges[7].bChannel */ 0xFF,
1657 /* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
1658 /* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
1659 /* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(5500, 0),
1660 /* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(5700, 0),
1661 /* Data[4].ctlEdges[4].bChannel */ 0xFF,
1662 /* Data[4].ctlEdges[5].bChannel */ 0xFF,
1663 /* Data[4].ctlEdges[6].bChannel */ 0xFF,
1664 /* Data[4].ctlEdges[7].bChannel */ 0xFF,
1668 /* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
1669 /* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(5270, 0),
1670 /* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(5310, 0),
1671 /* Data[5].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
1672 /* Data[5].ctlEdges[4].bChannel */ FREQ2FBIN(5590, 0),
1673 /* Data[5].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
1674 /* Data[5].ctlEdges[6].bChannel */ 0xFF,
1675 /* Data[5].ctlEdges[7].bChannel */ 0xFF
1679 /* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
1680 /* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
1681 /* Data[6].ctlEdges[2].bChannel */ FREQ2FBIN(5220, 0),
1682 /* Data[6].ctlEdges[3].bChannel */ FREQ2FBIN(5260, 0),
1683 /* Data[6].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
1684 /* Data[6].ctlEdges[5].bChannel */ FREQ2FBIN(5600, 0),
1685 /* Data[6].ctlEdges[6].bChannel */ FREQ2FBIN(5700, 0),
1686 /* Data[6].ctlEdges[7].bChannel */ FREQ2FBIN(5745, 0)
1690 /* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
1691 /* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
1692 /* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(5320, 0),
1693 /* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
1694 /* Data[7].ctlEdges[4].bChannel */ FREQ2FBIN(5560, 0),
1695 /* Data[7].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
1696 /* Data[7].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
1697 /* Data[7].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
1701 /* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
1702 /* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
1703 /* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
1704 /* Data[8].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
1705 /* Data[8].ctlEdges[4].bChannel */ FREQ2FBIN(5550, 0),
1706 /* Data[8].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
1707 /* Data[8].ctlEdges[6].bChannel */ FREQ2FBIN(5755, 0),
1708 /* Data[8].ctlEdges[7].bChannel */ FREQ2FBIN(5795, 0)
1711 .ctlPowerData_5G = {
1714 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
1715 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
1720 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
1721 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
1726 CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 1),
1727 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
1732 CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0),
1733 CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
1738 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
1739 CTL(60, 0), CTL(60, 0), CTL(60, 0), CTL(60, 0),
1744 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
1745 CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
1750 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
1751 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
1756 CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
1757 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
1762 CTL(60, 1), CTL(60, 0), CTL(60, 1), CTL(60, 1),
1763 CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
1770 static const struct ar9300_eeprom ar9300_x112 = {
1772 .templateVersion = 5,
1773 .macAddr = {0x00, 0x03, 0x7f, 0x0, 0x0, 0x0},
1774 .custData = {"x112-041-f0000"},
1776 .regDmn = { LE16(0), LE16(0x1f) },
1777 .txrxMask = 0x77, /* 4 bits tx and 4 bits rx */
1779 .opFlags = AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A,
1783 .blueToothOptions = 0,
1785 .deviceType = 5, /* takes lower byte in eeprom location */
1786 .pwrTableOffset = AR9300_PWR_TABLE_OFFSET,
1787 .params_for_tuning_caps = {0, 0},
1788 .featureEnable = 0x0d,
1790 * bit0 - enable tx temp comp - disabled
1791 * bit1 - enable tx volt comp - disabled
1792 * bit2 - enable fastclock - enabled
1793 * bit3 - enable doubling - enabled
1794 * bit4 - enable internal regulator - disabled
1795 * bit5 - enable pa predistortion - disabled
1797 .miscConfiguration = 0, /* bit0 - turn down drivestrength */
1798 .eepromWriteEnableGpio = 6,
1799 .wlanDisableGpio = 0,
1801 .rxBandSelectGpio = 0xff,
1806 /* ar9300_modal_eep_header 2g */
1807 /* 4 idle,t1,t2,b(4 bits per setting) */
1808 .antCtrlCommon = LE32(0x110),
1809 /* 4 ra1l1, ra2l1, ra1l2, ra2l2, ra12 */
1810 .antCtrlCommon2 = LE32(0x22222),
1813 * antCtrlChain[ar9300_max_chains]; 6 idle, t, r,
1814 * rx1, rx12, b (2 bits each)
1816 .antCtrlChain = { LE16(0x10), LE16(0x10), LE16(0x10) },
1819 * xatten1DB[AR9300_max_chains]; 3 xatten1_db
1820 * for ar9280 (0xa20c/b20c 5:0)
1822 .xatten1DB = {0x1b, 0x1b, 0x1b},
1825 * xatten1Margin[ar9300_max_chains]; 3 xatten1_margin
1826 * for ar9280 (0xa20c/b20c 16:12
1828 .xatten1Margin = {0x15, 0x15, 0x15},
1833 * spurChans[OSPrey_eeprom_modal_sPURS]; spur
1834 * channels in usual fbin coding format
1836 .spurChans = {FREQ2FBIN(2464, 1), 0, 0, 0, 0},
1839 * noiseFloorThreshch[ar9300_max_cHAINS]; 3 Check
1840 * if the register is per chain
1842 .noiseFloorThreshCh = {-1, 0, 0},
1843 .reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1846 .txFrameToDataStart = 0x0e,
1847 .txFrameToPaOn = 0x0e,
1848 .txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
1850 .switchSettling = 0x2c,
1851 .adcDesiredSize = -30,
1854 .txFrameToXpaOn = 0xe,
1856 .papdRateMaskHt20 = LE32(0x0c80c080),
1857 .papdRateMaskHt40 = LE32(0x0080c080),
1859 0, 0, 0, 0, 0, 0, 0, 0,
1863 .ant_div_control = 0,
1864 .future = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
1871 /* ar9300_cal_data_per_freq_op_loop 2g */
1873 { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
1874 { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
1875 { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
1877 .calTarget_freqbin_Cck = {
1881 .calTarget_freqbin_2G = {
1886 .calTarget_freqbin_2GHT20 = {
1891 .calTarget_freqbin_2GHT40 = {
1896 .calTargetPowerCck = {
1897 /* 1L-5L,5S,11L,11s */
1898 { {38, 38, 38, 38} },
1899 { {38, 38, 38, 38} },
1901 .calTargetPower2G = {
1903 { {38, 38, 36, 34} },
1904 { {38, 38, 36, 34} },
1905 { {38, 38, 34, 32} },
1907 .calTargetPower2GHT20 = {
1908 { {36, 36, 36, 36, 36, 34, 34, 32, 30, 28, 28, 28, 28, 26} },
1909 { {36, 36, 36, 36, 36, 34, 36, 34, 32, 30, 30, 30, 28, 26} },
1910 { {36, 36, 36, 36, 36, 34, 34, 32, 30, 28, 28, 28, 28, 26} },
1912 .calTargetPower2GHT40 = {
1913 { {36, 36, 36, 36, 34, 32, 32, 30, 28, 26, 26, 26, 26, 24} },
1914 { {36, 36, 36, 36, 34, 32, 34, 32, 30, 28, 28, 28, 28, 24} },
1915 { {36, 36, 36, 36, 34, 32, 32, 30, 28, 26, 26, 26, 26, 24} },
1918 0x11, 0x12, 0x15, 0x17, 0x41, 0x42,
1919 0x45, 0x47, 0x31, 0x32, 0x35, 0x37,
1949 /* Data[4].ctledges[0].bchannel */ FREQ2FBIN(2412, 1),
1950 /* Data[4].ctledges[1].bchannel */ FREQ2FBIN(2417, 1),
1951 /* Data[4].ctledges[2].bchannel */ FREQ2FBIN(2472, 1),
1952 /* Data[4].ctledges[3].bchannel */ FREQ2FBIN(2484, 1),
1956 /* Data[5].ctledges[0].bchannel */ FREQ2FBIN(2412, 1),
1957 /* Data[5].ctledges[1].bchannel */ FREQ2FBIN(2417, 1),
1958 /* Data[5].ctledges[2].bchannel */ FREQ2FBIN(2472, 1),
1963 /* Data[6].ctledges[0].bchannel */ FREQ2FBIN(2412, 1),
1964 /* Data[6].ctledges[1].bchannel */ FREQ2FBIN(2417, 1),
1970 /* Data[7].ctledges[0].bchannel */ FREQ2FBIN(2422, 1),
1971 /* Data[7].ctledges[1].bchannel */ FREQ2FBIN(2427, 1),
1972 /* Data[7].ctledges[2].bchannel */ FREQ2FBIN(2447, 1),
1973 /* Data[7].ctledges[3].bchannel */ FREQ2FBIN(2462, 1),
1977 /* Data[8].ctledges[0].bchannel */ FREQ2FBIN(2412, 1),
1978 /* Data[8].ctledges[1].bchannel */ FREQ2FBIN(2417, 1),
1979 /* Data[8].ctledges[2].bchannel */ FREQ2FBIN(2472, 1),
1983 /* Data[9].ctledges[0].bchannel */ FREQ2FBIN(2412, 1),
1984 /* Data[9].ctledges[1].bchannel */ FREQ2FBIN(2417, 1),
1985 /* Data[9].ctledges[2].bchannel */ FREQ2FBIN(2472, 1),
1990 /* Data[10].ctledges[0].bchannel */ FREQ2FBIN(2412, 1),
1991 /* Data[10].ctledges[1].bchannel */ FREQ2FBIN(2417, 1),
1992 /* Data[10].ctledges[2].bchannel */ FREQ2FBIN(2472, 1),
1997 /* Data[11].ctledges[0].bchannel */ FREQ2FBIN(2422, 1),
1998 /* Data[11].ctledges[1].bchannel */ FREQ2FBIN(2427, 1),
1999 /* Data[11].ctledges[2].bchannel */ FREQ2FBIN(2447, 1),
2000 /* Data[11].ctledges[3].bchannel */ FREQ2FBIN(2462, 1),
2003 .ctlPowerData_2G = {
2004 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2005 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2006 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } },
2008 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } },
2009 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2010 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2012 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } },
2013 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2014 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2016 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2017 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
2018 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
2021 /* 4 idle,t1,t2,b (4 bits per setting) */
2022 .antCtrlCommon = LE32(0x110),
2023 /* 4 ra1l1, ra2l1, ra1l2,ra2l2,ra12 */
2024 .antCtrlCommon2 = LE32(0x22222),
2025 /* antCtrlChain 6 idle, t,r,rx1,rx12,b (2 bits each) */
2027 LE16(0x0), LE16(0x0), LE16(0x0),
2029 /* xatten1DB 3 xatten1_db for ar9280 (0xa20c/b20c 5:0) */
2030 .xatten1DB = {0x13, 0x19, 0x17},
2033 * xatten1Margin[ar9300_max_chains]; 3 xatten1_margin
2034 * for merlin (0xa20c/b20c 16:12
2036 .xatten1Margin = {0x19, 0x19, 0x19},
2039 /* spurChans spur channels in usual fbin coding format */
2040 .spurChans = {0, 0, 0, 0, 0},
2041 /* noiseFloorThreshch check if the register is per chain */
2042 .noiseFloorThreshCh = {-1, 0, 0},
2043 .reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
2046 .txFrameToDataStart = 0x0e,
2047 .txFrameToPaOn = 0x0e,
2048 .txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
2050 .switchSettling = 0x2d,
2051 .adcDesiredSize = -30,
2054 .txFrameToXpaOn = 0xe,
2056 .papdRateMaskHt20 = LE32(0x0cf0e0e0),
2057 .papdRateMaskHt40 = LE32(0x6cf0e0e0),
2059 0, 0, 0, 0, 0, 0, 0, 0,
2064 .tempSlopeHigh = 105,
2065 .xatten1DBLow = {0x10, 0x14, 0x10},
2066 .xatten1MarginLow = {0x19, 0x19 , 0x19},
2067 .xatten1DBHigh = {0x1d, 0x20, 0x24},
2068 .xatten1MarginHigh = {0x10, 0x10, 0x10}
2113 .calTarget_freqbin_5G = {
2123 .calTarget_freqbin_5GHT20 = {
2133 .calTarget_freqbin_5GHT40 = {
2143 .calTargetPower5G = {
2145 { {32, 32, 28, 26} },
2146 { {32, 32, 28, 26} },
2147 { {32, 32, 28, 26} },
2148 { {32, 32, 26, 24} },
2149 { {32, 32, 26, 24} },
2150 { {32, 32, 24, 22} },
2151 { {30, 30, 24, 22} },
2152 { {30, 30, 24, 22} },
2154 .calTargetPower5GHT20 = {
2156 * 0_8_16,1-3_9-11_17-19,
2157 * 4,5,6,7,12,13,14,15,20,21,22,23
2159 { {32, 32, 32, 32, 28, 26, 32, 28, 26, 24, 24, 24, 22, 22} },
2160 { {32, 32, 32, 32, 28, 26, 32, 28, 26, 24, 24, 24, 22, 22} },
2161 { {32, 32, 32, 32, 28, 26, 32, 28, 26, 24, 24, 24, 22, 22} },
2162 { {32, 32, 32, 32, 28, 26, 32, 26, 24, 22, 22, 22, 20, 20} },
2163 { {32, 32, 32, 32, 28, 26, 32, 26, 24, 22, 20, 18, 16, 16} },
2164 { {32, 32, 32, 32, 28, 26, 32, 24, 20, 16, 18, 16, 14, 14} },
2165 { {30, 30, 30, 30, 28, 26, 30, 24, 20, 16, 18, 16, 14, 14} },
2166 { {30, 30, 30, 30, 28, 26, 30, 24, 20, 16, 18, 16, 14, 14} },
2168 .calTargetPower5GHT40 = {
2170 * 0_8_16,1-3_9-11_17-19,
2171 * 4,5,6,7,12,13,14,15,20,21,22,23
2173 { {32, 32, 32, 30, 28, 26, 30, 28, 26, 24, 24, 24, 22, 22} },
2174 { {32, 32, 32, 30, 28, 26, 30, 28, 26, 24, 24, 24, 22, 22} },
2175 { {32, 32, 32, 30, 28, 26, 30, 28, 26, 24, 24, 24, 22, 22} },
2176 { {32, 32, 32, 30, 28, 26, 30, 26, 24, 22, 22, 22, 20, 20} },
2177 { {32, 32, 32, 30, 28, 26, 30, 26, 24, 22, 20, 18, 16, 16} },
2178 { {32, 32, 32, 30, 28, 26, 30, 22, 20, 16, 18, 16, 14, 14} },
2179 { {30, 30, 30, 30, 28, 26, 30, 22, 20, 16, 18, 16, 14, 14} },
2180 { {30, 30, 30, 30, 28, 26, 30, 22, 20, 16, 18, 16, 14, 14} },
2183 0x10, 0x16, 0x18, 0x40, 0x46,
2184 0x48, 0x30, 0x36, 0x38
2188 /* Data[0].ctledges[0].bchannel */ FREQ2FBIN(5180, 0),
2189 /* Data[0].ctledges[1].bchannel */ FREQ2FBIN(5260, 0),
2190 /* Data[0].ctledges[2].bchannel */ FREQ2FBIN(5280, 0),
2191 /* Data[0].ctledges[3].bchannel */ FREQ2FBIN(5500, 0),
2192 /* Data[0].ctledges[4].bchannel */ FREQ2FBIN(5600, 0),
2193 /* Data[0].ctledges[5].bchannel */ FREQ2FBIN(5700, 0),
2194 /* Data[0].ctledges[6].bchannel */ FREQ2FBIN(5745, 0),
2195 /* Data[0].ctledges[7].bchannel */ FREQ2FBIN(5825, 0)
2198 /* Data[1].ctledges[0].bchannel */ FREQ2FBIN(5180, 0),
2199 /* Data[1].ctledges[1].bchannel */ FREQ2FBIN(5260, 0),
2200 /* Data[1].ctledges[2].bchannel */ FREQ2FBIN(5280, 0),
2201 /* Data[1].ctledges[3].bchannel */ FREQ2FBIN(5500, 0),
2202 /* Data[1].ctledges[4].bchannel */ FREQ2FBIN(5520, 0),
2203 /* Data[1].ctledges[5].bchannel */ FREQ2FBIN(5700, 0),
2204 /* Data[1].ctledges[6].bchannel */ FREQ2FBIN(5745, 0),
2205 /* Data[1].ctledges[7].bchannel */ FREQ2FBIN(5825, 0)
2209 /* Data[2].ctledges[0].bchannel */ FREQ2FBIN(5190, 0),
2210 /* Data[2].ctledges[1].bchannel */ FREQ2FBIN(5230, 0),
2211 /* Data[2].ctledges[2].bchannel */ FREQ2FBIN(5270, 0),
2212 /* Data[2].ctledges[3].bchannel */ FREQ2FBIN(5310, 0),
2213 /* Data[2].ctledges[4].bchannel */ FREQ2FBIN(5510, 0),
2214 /* Data[2].ctledges[5].bchannel */ FREQ2FBIN(5550, 0),
2215 /* Data[2].ctledges[6].bchannel */ FREQ2FBIN(5670, 0),
2216 /* Data[2].ctledges[7].bchannel */ FREQ2FBIN(5755, 0)
2220 /* Data[3].ctledges[0].bchannel */ FREQ2FBIN(5180, 0),
2221 /* Data[3].ctledges[1].bchannel */ FREQ2FBIN(5200, 0),
2222 /* Data[3].ctledges[2].bchannel */ FREQ2FBIN(5260, 0),
2223 /* Data[3].ctledges[3].bchannel */ FREQ2FBIN(5320, 0),
2224 /* Data[3].ctledges[4].bchannel */ FREQ2FBIN(5500, 0),
2225 /* Data[3].ctledges[5].bchannel */ FREQ2FBIN(5700, 0),
2226 /* Data[3].ctledges[6].bchannel */ 0xFF,
2227 /* Data[3].ctledges[7].bchannel */ 0xFF,
2231 /* Data[4].ctledges[0].bchannel */ FREQ2FBIN(5180, 0),
2232 /* Data[4].ctledges[1].bchannel */ FREQ2FBIN(5260, 0),
2233 /* Data[4].ctledges[2].bchannel */ FREQ2FBIN(5500, 0),
2234 /* Data[4].ctledges[3].bchannel */ FREQ2FBIN(5700, 0),
2235 /* Data[4].ctledges[4].bchannel */ 0xFF,
2236 /* Data[4].ctledges[5].bchannel */ 0xFF,
2237 /* Data[4].ctledges[6].bchannel */ 0xFF,
2238 /* Data[4].ctledges[7].bchannel */ 0xFF,
2242 /* Data[5].ctledges[0].bchannel */ FREQ2FBIN(5190, 0),
2243 /* Data[5].ctledges[1].bchannel */ FREQ2FBIN(5270, 0),
2244 /* Data[5].ctledges[2].bchannel */ FREQ2FBIN(5310, 0),
2245 /* Data[5].ctledges[3].bchannel */ FREQ2FBIN(5510, 0),
2246 /* Data[5].ctledges[4].bchannel */ FREQ2FBIN(5590, 0),
2247 /* Data[5].ctledges[5].bchannel */ FREQ2FBIN(5670, 0),
2248 /* Data[5].ctledges[6].bchannel */ 0xFF,
2249 /* Data[5].ctledges[7].bchannel */ 0xFF
2253 /* Data[6].ctledges[0].bchannel */ FREQ2FBIN(5180, 0),
2254 /* Data[6].ctledges[1].bchannel */ FREQ2FBIN(5200, 0),
2255 /* Data[6].ctledges[2].bchannel */ FREQ2FBIN(5220, 0),
2256 /* Data[6].ctledges[3].bchannel */ FREQ2FBIN(5260, 0),
2257 /* Data[6].ctledges[4].bchannel */ FREQ2FBIN(5500, 0),
2258 /* Data[6].ctledges[5].bchannel */ FREQ2FBIN(5600, 0),
2259 /* Data[6].ctledges[6].bchannel */ FREQ2FBIN(5700, 0),
2260 /* Data[6].ctledges[7].bchannel */ FREQ2FBIN(5745, 0)
2264 /* Data[7].ctledges[0].bchannel */ FREQ2FBIN(5180, 0),
2265 /* Data[7].ctledges[1].bchannel */ FREQ2FBIN(5260, 0),
2266 /* Data[7].ctledges[2].bchannel */ FREQ2FBIN(5320, 0),
2267 /* Data[7].ctledges[3].bchannel */ FREQ2FBIN(5500, 0),
2268 /* Data[7].ctledges[4].bchannel */ FREQ2FBIN(5560, 0),
2269 /* Data[7].ctledges[5].bchannel */ FREQ2FBIN(5700, 0),
2270 /* Data[7].ctledges[6].bchannel */ FREQ2FBIN(5745, 0),
2271 /* Data[7].ctledges[7].bchannel */ FREQ2FBIN(5825, 0)
2275 /* Data[8].ctledges[0].bchannel */ FREQ2FBIN(5190, 0),
2276 /* Data[8].ctledges[1].bchannel */ FREQ2FBIN(5230, 0),
2277 /* Data[8].ctledges[2].bchannel */ FREQ2FBIN(5270, 0),
2278 /* Data[8].ctledges[3].bchannel */ FREQ2FBIN(5510, 0),
2279 /* Data[8].ctledges[4].bchannel */ FREQ2FBIN(5550, 0),
2280 /* Data[8].ctledges[5].bchannel */ FREQ2FBIN(5670, 0),
2281 /* Data[8].ctledges[6].bchannel */ FREQ2FBIN(5755, 0),
2282 /* Data[8].ctledges[7].bchannel */ FREQ2FBIN(5795, 0)
2285 .ctlPowerData_5G = {
2288 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
2289 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
2294 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
2295 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
2300 CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 1),
2301 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
2306 CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0),
2307 CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
2312 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
2313 CTL(60, 0), CTL(60, 0), CTL(60, 0), CTL(60, 0),
2318 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
2319 CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
2324 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
2325 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
2330 CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
2331 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
2336 CTL(60, 1), CTL(60, 0), CTL(60, 1), CTL(60, 1),
2337 CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
2343 static const struct ar9300_eeprom ar9300_h116 = {
2345 .templateVersion = 4,
2346 .macAddr = {0x00, 0x03, 0x7f, 0x0, 0x0, 0x0},
2347 .custData = {"h116-041-f0000"},
2349 .regDmn = { LE16(0), LE16(0x1f) },
2350 .txrxMask = 0x33, /* 4 bits tx and 4 bits rx */
2352 .opFlags = AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A,
2356 .blueToothOptions = 0,
2358 .deviceType = 5, /* takes lower byte in eeprom location */
2359 .pwrTableOffset = AR9300_PWR_TABLE_OFFSET,
2360 .params_for_tuning_caps = {0, 0},
2361 .featureEnable = 0x0d,
2363 * bit0 - enable tx temp comp - disabled
2364 * bit1 - enable tx volt comp - disabled
2365 * bit2 - enable fastClock - enabled
2366 * bit3 - enable doubling - enabled
2367 * bit4 - enable internal regulator - disabled
2368 * bit5 - enable pa predistortion - disabled
2370 .miscConfiguration = 0, /* bit0 - turn down drivestrength */
2371 .eepromWriteEnableGpio = 6,
2372 .wlanDisableGpio = 0,
2374 .rxBandSelectGpio = 0xff,
2379 /* ar9300_modal_eep_header 2g */
2380 /* 4 idle,t1,t2,b(4 bits per setting) */
2381 .antCtrlCommon = LE32(0x110),
2382 /* 4 ra1l1, ra2l1, ra1l2, ra2l2, ra12 */
2383 .antCtrlCommon2 = LE32(0x44444),
2386 * antCtrlChain[AR9300_MAX_CHAINS]; 6 idle, t, r,
2387 * rx1, rx12, b (2 bits each)
2389 .antCtrlChain = { LE16(0x10), LE16(0x10), LE16(0x10) },
2392 * xatten1DB[AR9300_MAX_CHAINS]; 3 xatten1_db
2393 * for ar9280 (0xa20c/b20c 5:0)
2395 .xatten1DB = {0x1f, 0x1f, 0x1f},
2398 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
2399 * for ar9280 (0xa20c/b20c 16:12
2401 .xatten1Margin = {0x12, 0x12, 0x12},
2406 * spurChans[OSPREY_EEPROM_MODAL_SPURS]; spur
2407 * channels in usual fbin coding format
2409 .spurChans = {FREQ2FBIN(2464, 1), 0, 0, 0, 0},
2412 * noiseFloorThreshCh[AR9300_MAX_CHAINS]; 3 Check
2413 * if the register is per chain
2415 .noiseFloorThreshCh = {-1, 0, 0},
2416 .reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
2419 .txFrameToDataStart = 0x0e,
2420 .txFrameToPaOn = 0x0e,
2421 .txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
2423 .switchSettling = 0x2c,
2424 .adcDesiredSize = -30,
2427 .txFrameToXpaOn = 0xe,
2429 .papdRateMaskHt20 = LE32(0x0c80C080),
2430 .papdRateMaskHt40 = LE32(0x0080C080),
2432 0, 0, 0, 0, 0, 0, 0, 0,
2436 .ant_div_control = 0,
2437 .future = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0}
2444 /* ar9300_cal_data_per_freq_op_loop 2g */
2446 { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
2447 { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
2448 { {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
2450 .calTarget_freqbin_Cck = {
2454 .calTarget_freqbin_2G = {
2459 .calTarget_freqbin_2GHT20 = {
2464 .calTarget_freqbin_2GHT40 = {
2469 .calTargetPowerCck = {
2470 /* 1L-5L,5S,11L,11S */
2471 { {34, 34, 34, 34} },
2472 { {34, 34, 34, 34} },
2474 .calTargetPower2G = {
2476 { {34, 34, 32, 32} },
2477 { {34, 34, 32, 32} },
2478 { {34, 34, 32, 32} },
2480 .calTargetPower2GHT20 = {
2481 { {32, 32, 32, 32, 32, 30, 32, 32, 30, 28, 0, 0, 0, 0} },
2482 { {32, 32, 32, 32, 32, 30, 32, 32, 30, 28, 0, 0, 0, 0} },
2483 { {32, 32, 32, 32, 32, 30, 32, 32, 30, 28, 0, 0, 0, 0} },
2485 .calTargetPower2GHT40 = {
2486 { {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 0, 0, 0, 0} },
2487 { {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 0, 0, 0, 0} },
2488 { {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 0, 0, 0, 0} },
2491 0x11, 0x12, 0x15, 0x17, 0x41, 0x42,
2492 0x45, 0x47, 0x31, 0x32, 0x35, 0x37,
2522 /* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
2523 /* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
2524 /* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
2525 /* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(2484, 1),
2529 /* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
2530 /* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
2531 /* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
2536 /* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
2537 /* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
2543 /* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
2544 /* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
2545 /* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
2546 /* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
2550 /* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
2551 /* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
2552 /* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
2556 /* Data[9].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
2557 /* Data[9].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
2558 /* Data[9].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
2563 /* Data[10].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
2564 /* Data[10].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
2565 /* Data[10].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
2570 /* Data[11].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
2571 /* Data[11].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
2572 /* Data[11].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
2573 /* Data[11].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
2576 .ctlPowerData_2G = {
2577 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2578 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2579 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } },
2581 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } },
2582 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2583 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2585 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } },
2586 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2587 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2589 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2590 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
2591 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
2594 /* 4 idle,t1,t2,b (4 bits per setting) */
2595 .antCtrlCommon = LE32(0x220),
2596 /* 4 ra1l1, ra2l1, ra1l2,ra2l2,ra12 */
2597 .antCtrlCommon2 = LE32(0x44444),
2598 /* antCtrlChain 6 idle, t,r,rx1,rx12,b (2 bits each) */
2600 LE16(0x150), LE16(0x150), LE16(0x150),
2602 /* xatten1DB 3 xatten1_db for AR9280 (0xa20c/b20c 5:0) */
2603 .xatten1DB = {0x19, 0x19, 0x19},
2606 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
2607 * for merlin (0xa20c/b20c 16:12
2609 .xatten1Margin = {0x14, 0x14, 0x14},
2612 /* spurChans spur channels in usual fbin coding format */
2613 .spurChans = {0, 0, 0, 0, 0},
2614 /* noiseFloorThreshCh Check if the register is per chain */
2615 .noiseFloorThreshCh = {-1, 0, 0},
2616 .reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
2619 .txFrameToDataStart = 0x0e,
2620 .txFrameToPaOn = 0x0e,
2621 .txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
2623 .switchSettling = 0x2d,
2624 .adcDesiredSize = -30,
2627 .txFrameToXpaOn = 0xe,
2629 .papdRateMaskHt20 = LE32(0x0cf0e0e0),
2630 .papdRateMaskHt40 = LE32(0x6cf0e0e0),
2632 0, 0, 0, 0, 0, 0, 0, 0,
2637 .tempSlopeHigh = 50,
2638 .xatten1DBLow = {0, 0, 0},
2639 .xatten1MarginLow = {0, 0, 0},
2640 .xatten1DBHigh = {0, 0, 0},
2641 .xatten1MarginHigh = {0, 0, 0}
2686 .calTarget_freqbin_5G = {
2696 .calTarget_freqbin_5GHT20 = {
2706 .calTarget_freqbin_5GHT40 = {
2716 .calTargetPower5G = {
2718 { {30, 30, 28, 24} },
2719 { {30, 30, 28, 24} },
2720 { {30, 30, 28, 24} },
2721 { {30, 30, 28, 24} },
2722 { {30, 30, 28, 24} },
2723 { {30, 30, 28, 24} },
2724 { {30, 30, 28, 24} },
2725 { {30, 30, 28, 24} },
2727 .calTargetPower5GHT20 = {
2729 * 0_8_16,1-3_9-11_17-19,
2730 * 4,5,6,7,12,13,14,15,20,21,22,23
2732 { {30, 30, 30, 28, 24, 20, 30, 28, 24, 20, 0, 0, 0, 0} },
2733 { {30, 30, 30, 28, 24, 20, 30, 28, 24, 20, 0, 0, 0, 0} },
2734 { {30, 30, 30, 26, 22, 18, 30, 26, 22, 18, 0, 0, 0, 0} },
2735 { {30, 30, 30, 26, 22, 18, 30, 26, 22, 18, 0, 0, 0, 0} },
2736 { {30, 30, 30, 24, 20, 16, 30, 24, 20, 16, 0, 0, 0, 0} },
2737 { {30, 30, 30, 24, 20, 16, 30, 24, 20, 16, 0, 0, 0, 0} },
2738 { {30, 30, 30, 22, 18, 14, 30, 22, 18, 14, 0, 0, 0, 0} },
2739 { {30, 30, 30, 22, 18, 14, 30, 22, 18, 14, 0, 0, 0, 0} },
2741 .calTargetPower5GHT40 = {
2743 * 0_8_16,1-3_9-11_17-19,
2744 * 4,5,6,7,12,13,14,15,20,21,22,23
2746 { {28, 28, 28, 26, 22, 18, 28, 26, 22, 18, 0, 0, 0, 0} },
2747 { {28, 28, 28, 26, 22, 18, 28, 26, 22, 18, 0, 0, 0, 0} },
2748 { {28, 28, 28, 24, 20, 16, 28, 24, 20, 16, 0, 0, 0, 0} },
2749 { {28, 28, 28, 24, 20, 16, 28, 24, 20, 16, 0, 0, 0, 0} },
2750 { {28, 28, 28, 22, 18, 14, 28, 22, 18, 14, 0, 0, 0, 0} },
2751 { {28, 28, 28, 22, 18, 14, 28, 22, 18, 14, 0, 0, 0, 0} },
2752 { {28, 28, 28, 20, 16, 12, 28, 20, 16, 12, 0, 0, 0, 0} },
2753 { {28, 28, 28, 20, 16, 12, 28, 20, 16, 12, 0, 0, 0, 0} },
2756 0x10, 0x16, 0x18, 0x40, 0x46,
2757 0x48, 0x30, 0x36, 0x38
2761 /* Data[0].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
2762 /* Data[0].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
2763 /* Data[0].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
2764 /* Data[0].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
2765 /* Data[0].ctlEdges[4].bChannel */ FREQ2FBIN(5600, 0),
2766 /* Data[0].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
2767 /* Data[0].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
2768 /* Data[0].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
2771 /* Data[1].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
2772 /* Data[1].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
2773 /* Data[1].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
2774 /* Data[1].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
2775 /* Data[1].ctlEdges[4].bChannel */ FREQ2FBIN(5520, 0),
2776 /* Data[1].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
2777 /* Data[1].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
2778 /* Data[1].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
2782 /* Data[2].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
2783 /* Data[2].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
2784 /* Data[2].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
2785 /* Data[2].ctlEdges[3].bChannel */ FREQ2FBIN(5310, 0),
2786 /* Data[2].ctlEdges[4].bChannel */ FREQ2FBIN(5510, 0),
2787 /* Data[2].ctlEdges[5].bChannel */ FREQ2FBIN(5550, 0),
2788 /* Data[2].ctlEdges[6].bChannel */ FREQ2FBIN(5670, 0),
2789 /* Data[2].ctlEdges[7].bChannel */ FREQ2FBIN(5755, 0)
2793 /* Data[3].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
2794 /* Data[3].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
2795 /* Data[3].ctlEdges[2].bChannel */ FREQ2FBIN(5260, 0),
2796 /* Data[3].ctlEdges[3].bChannel */ FREQ2FBIN(5320, 0),
2797 /* Data[3].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
2798 /* Data[3].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
2799 /* Data[3].ctlEdges[6].bChannel */ 0xFF,
2800 /* Data[3].ctlEdges[7].bChannel */ 0xFF,
2804 /* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
2805 /* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
2806 /* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(5500, 0),
2807 /* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(5700, 0),
2808 /* Data[4].ctlEdges[4].bChannel */ 0xFF,
2809 /* Data[4].ctlEdges[5].bChannel */ 0xFF,
2810 /* Data[4].ctlEdges[6].bChannel */ 0xFF,
2811 /* Data[4].ctlEdges[7].bChannel */ 0xFF,
2815 /* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
2816 /* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(5270, 0),
2817 /* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(5310, 0),
2818 /* Data[5].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
2819 /* Data[5].ctlEdges[4].bChannel */ FREQ2FBIN(5590, 0),
2820 /* Data[5].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
2821 /* Data[5].ctlEdges[6].bChannel */ 0xFF,
2822 /* Data[5].ctlEdges[7].bChannel */ 0xFF
2826 /* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
2827 /* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
2828 /* Data[6].ctlEdges[2].bChannel */ FREQ2FBIN(5220, 0),
2829 /* Data[6].ctlEdges[3].bChannel */ FREQ2FBIN(5260, 0),
2830 /* Data[6].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
2831 /* Data[6].ctlEdges[5].bChannel */ FREQ2FBIN(5600, 0),
2832 /* Data[6].ctlEdges[6].bChannel */ FREQ2FBIN(5700, 0),
2833 /* Data[6].ctlEdges[7].bChannel */ FREQ2FBIN(5745, 0)
2837 /* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
2838 /* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
2839 /* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(5320, 0),
2840 /* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
2841 /* Data[7].ctlEdges[4].bChannel */ FREQ2FBIN(5560, 0),
2842 /* Data[7].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
2843 /* Data[7].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
2844 /* Data[7].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
2848 /* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
2849 /* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
2850 /* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
2851 /* Data[8].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
2852 /* Data[8].ctlEdges[4].bChannel */ FREQ2FBIN(5550, 0),
2853 /* Data[8].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
2854 /* Data[8].ctlEdges[6].bChannel */ FREQ2FBIN(5755, 0),
2855 /* Data[8].ctlEdges[7].bChannel */ FREQ2FBIN(5795, 0)
2858 .ctlPowerData_5G = {
2861 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
2862 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
2867 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
2868 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
2873 CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 1),
2874 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
2879 CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0),
2880 CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
2885 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
2886 CTL(60, 0), CTL(60, 0), CTL(60, 0), CTL(60, 0),
2891 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
2892 CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
2897 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
2898 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
2903 CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
2904 CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
2909 CTL(60, 1), CTL(60, 0), CTL(60, 1), CTL(60, 1),
2910 CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
2917 static const struct ar9300_eeprom *ar9300_eep_templates[] = {
2925 static const struct ar9300_eeprom *ar9003_eeprom_struct_find_by_id(int id)
2927 #define N_LOOP (sizeof(ar9300_eep_templates) / sizeof(ar9300_eep_templates[0]))
2930 for (it = 0; it < N_LOOP; it++)
2931 if (ar9300_eep_templates[it]->templateVersion == id)
2932 return ar9300_eep_templates[it];
2938 static u16 ath9k_hw_fbin2freq(u8 fbin, bool is2GHz)
2940 if (fbin == AR5416_BCHAN_UNUSED)
2943 return (u16) ((is2GHz) ? (2300 + fbin) : (4800 + 5 * fbin));
2946 static int ath9k_hw_ar9300_check_eeprom(struct ath_hw *ah)
2951 static int interpolate(int x, int xa, int xb, int ya, int yb)
2953 int bf, factor, plus;
2955 bf = 2 * (yb - ya) * (x - xa) / (xb - xa);
2958 return ya + factor + plus;
2961 static u32 ath9k_hw_ar9300_get_eeprom(struct ath_hw *ah,
2962 enum eeprom_param param)
2964 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
2965 struct ar9300_base_eep_hdr *pBase = &eep->baseEepHeader;
2969 return get_unaligned_be16(eep->macAddr);
2971 return get_unaligned_be16(eep->macAddr + 2);
2973 return get_unaligned_be16(eep->macAddr + 4);
2975 return le16_to_cpu(pBase->regDmn[0]);
2977 return pBase->deviceCap;
2979 return pBase->opCapFlags.opFlags;
2981 return pBase->rfSilent;
2983 return (pBase->txrxMask >> 4) & 0xf;
2985 return pBase->txrxMask & 0xf;
2986 case EEP_DRIVE_STRENGTH:
2987 #define AR9300_EEP_BASE_DRIV_STRENGTH 0x1
2988 return pBase->miscConfiguration & AR9300_EEP_BASE_DRIV_STRENGTH;
2989 case EEP_INTERNAL_REGULATOR:
2990 /* Bit 4 is internal regulator flag */
2991 return (pBase->featureEnable & 0x10) >> 4;
2993 return le32_to_cpu(pBase->swreg);
2995 return !!(pBase->featureEnable & BIT(5));
2996 case EEP_CHAIN_MASK_REDUCE:
2997 return (pBase->miscConfiguration >> 0x3) & 0x1;
2998 case EEP_ANT_DIV_CTL1:
2999 return eep->base_ext1.ant_div_control;
3000 case EEP_ANTENNA_GAIN_5G:
3001 return eep->modalHeader5G.antennaGain;
3002 case EEP_ANTENNA_GAIN_2G:
3003 return eep->modalHeader2G.antennaGain;
3004 case EEP_QUICK_DROP:
3005 return pBase->miscConfiguration & BIT(1);
3011 static bool ar9300_eeprom_read_byte(struct ath_common *common, int address,
3016 if (unlikely(!ath9k_hw_nvram_read(common, address / 2, &val)))
3019 *buffer = (val >> (8 * (address % 2))) & 0xff;
3023 static bool ar9300_eeprom_read_word(struct ath_common *common, int address,
3028 if (unlikely(!ath9k_hw_nvram_read(common, address / 2, &val)))
3031 buffer[0] = val >> 8;
3032 buffer[1] = val & 0xff;
3037 static bool ar9300_read_eeprom(struct ath_hw *ah, int address, u8 *buffer,
3040 struct ath_common *common = ath9k_hw_common(ah);
3043 if ((address < 0) || ((address + count) / 2 > AR9300_EEPROM_SIZE - 1)) {
3044 ath_dbg(common, EEPROM, "eeprom address not in range\n");
3049 * Since we're reading the bytes in reverse order from a little-endian
3050 * word stream, an even address means we only use the lower half of
3051 * the 16-bit word at that address
3053 if (address % 2 == 0) {
3054 if (!ar9300_eeprom_read_byte(common, address--, buffer++))
3060 for (i = 0; i < count / 2; i++) {
3061 if (!ar9300_eeprom_read_word(common, address, buffer))
3069 if (!ar9300_eeprom_read_byte(common, address, buffer))
3075 ath_dbg(common, EEPROM, "unable to read eeprom region at offset %d\n",
3080 static bool ar9300_otp_read_word(struct ath_hw *ah, int addr, u32 *data)
3082 REG_READ(ah, AR9300_OTP_BASE + (4 * addr));
3084 if (!ath9k_hw_wait(ah, AR9300_OTP_STATUS, AR9300_OTP_STATUS_TYPE,
3085 AR9300_OTP_STATUS_VALID, 1000))
3088 *data = REG_READ(ah, AR9300_OTP_READ_DATA);
3092 static bool ar9300_read_otp(struct ath_hw *ah, int address, u8 *buffer,
3098 for (i = 0; i < count; i++) {
3099 int offset = 8 * ((address - i) % 4);
3100 if (!ar9300_otp_read_word(ah, (address - i) / 4, &data))
3103 buffer[i] = (data >> offset) & 0xff;
3110 static void ar9300_comp_hdr_unpack(u8 *best, int *code, int *reference,
3111 int *length, int *major, int *minor)
3113 unsigned long value[4];
3119 *code = ((value[0] >> 5) & 0x0007);
3120 *reference = (value[0] & 0x001f) | ((value[1] >> 2) & 0x0020);
3121 *length = ((value[1] << 4) & 0x07f0) | ((value[2] >> 4) & 0x000f);
3122 *major = (value[2] & 0x000f);
3123 *minor = (value[3] & 0x00ff);
3126 static u16 ar9300_comp_cksum(u8 *data, int dsize)
3128 int it, checksum = 0;
3130 for (it = 0; it < dsize; it++) {
3131 checksum += data[it];
3138 static bool ar9300_uncompress_block(struct ath_hw *ah,
3148 struct ath_common *common = ath9k_hw_common(ah);
3152 for (it = 0; it < size; it += (length+2)) {
3156 length = block[it+1];
3159 if (length > 0 && spot >= 0 && spot+length <= mdataSize) {
3160 ath_dbg(common, EEPROM,
3161 "Restore at %d: spot=%d offset=%d length=%d\n",
3162 it, spot, offset, length);
3163 memcpy(&mptr[spot], &block[it+2], length);
3165 } else if (length > 0) {
3166 ath_dbg(common, EEPROM,
3167 "Bad restore at %d: spot=%d offset=%d length=%d\n",
3168 it, spot, offset, length);
3175 static int ar9300_compress_decision(struct ath_hw *ah,
3180 u8 *word, int length, int mdata_size)
3182 struct ath_common *common = ath9k_hw_common(ah);
3183 const struct ar9300_eeprom *eep = NULL;
3187 if (length != mdata_size) {
3188 ath_dbg(common, EEPROM,
3189 "EEPROM structure size mismatch memory=%d eeprom=%d\n",
3190 mdata_size, length);
3193 memcpy(mptr, (u8 *) (word + COMP_HDR_LEN), length);
3194 ath_dbg(common, EEPROM,
3195 "restored eeprom %d: uncompressed, length %d\n",
3198 case _CompressBlock:
3199 if (reference == 0) {
3201 eep = ar9003_eeprom_struct_find_by_id(reference);
3203 ath_dbg(common, EEPROM,
3204 "can't find reference eeprom struct %d\n",
3208 memcpy(mptr, eep, mdata_size);
3210 ath_dbg(common, EEPROM,
3211 "restore eeprom %d: block, reference %d, length %d\n",
3212 it, reference, length);
3213 ar9300_uncompress_block(ah, mptr, mdata_size,
3214 (u8 *) (word + COMP_HDR_LEN), length);
3217 ath_dbg(common, EEPROM, "unknown compression code %d\n", code);
3223 typedef bool (*eeprom_read_op)(struct ath_hw *ah, int address, u8 *buffer,
3226 static bool ar9300_check_header(void *data)
3229 return !(*word == 0 || *word == ~0);
3232 static bool ar9300_check_eeprom_header(struct ath_hw *ah, eeprom_read_op read,
3237 if (!read(ah, base_addr, header, 4))
3240 return ar9300_check_header(header);
3243 static int ar9300_eeprom_restore_flash(struct ath_hw *ah, u8 *mptr,
3246 struct ath_common *common = ath9k_hw_common(ah);
3247 u16 *data = (u16 *) mptr;
3250 for (i = 0; i < mdata_size / 2; i++, data++)
3251 ath9k_hw_nvram_read(common, i, data);
3256 * Read the configuration data from the eeprom.
3257 * The data can be put in any specified memory buffer.
3259 * Returns -1 on error.
3260 * Returns address of next memory location on success.
3262 static int ar9300_eeprom_restore_internal(struct ath_hw *ah,
3263 u8 *mptr, int mdata_size)
3270 int reference, length, major, minor;
3273 u16 checksum, mchecksum;
3274 struct ath_common *common = ath9k_hw_common(ah);
3275 eeprom_read_op read;
3277 if (ath9k_hw_use_flash(ah))
3278 return ar9300_eeprom_restore_flash(ah, mptr, mdata_size);
3280 word = kzalloc(2048, GFP_KERNEL);
3284 memcpy(mptr, &ar9300_default, mdata_size);
3286 read = ar9300_read_eeprom;
3287 if (AR_SREV_9485(ah))
3288 cptr = AR9300_BASE_ADDR_4K;
3289 else if (AR_SREV_9330(ah))
3290 cptr = AR9300_BASE_ADDR_512;
3292 cptr = AR9300_BASE_ADDR;
3293 ath_dbg(common, EEPROM, "Trying EEPROM access at Address 0x%04x\n",
3295 if (ar9300_check_eeprom_header(ah, read, cptr))
3298 cptr = AR9300_BASE_ADDR_512;
3299 ath_dbg(common, EEPROM, "Trying EEPROM access at Address 0x%04x\n",
3301 if (ar9300_check_eeprom_header(ah, read, cptr))
3304 read = ar9300_read_otp;
3305 cptr = AR9300_BASE_ADDR;
3306 ath_dbg(common, EEPROM, "Trying OTP access at Address 0x%04x\n", cptr);
3307 if (ar9300_check_eeprom_header(ah, read, cptr))
3310 cptr = AR9300_BASE_ADDR_512;
3311 ath_dbg(common, EEPROM, "Trying OTP access at Address 0x%04x\n", cptr);
3312 if (ar9300_check_eeprom_header(ah, read, cptr))
3318 ath_dbg(common, EEPROM, "Found valid EEPROM data\n");
3320 for (it = 0; it < MSTATE; it++) {
3321 if (!read(ah, cptr, word, COMP_HDR_LEN))
3324 if (!ar9300_check_header(word))
3327 ar9300_comp_hdr_unpack(word, &code, &reference,
3328 &length, &major, &minor);
3329 ath_dbg(common, EEPROM,
3330 "Found block at %x: code=%d ref=%d length=%d major=%d minor=%d\n",
3331 cptr, code, reference, length, major, minor);
3332 if ((!AR_SREV_9485(ah) && length >= 1024) ||
3333 (AR_SREV_9485(ah) && length > EEPROM_DATA_LEN_9485)) {
3334 ath_dbg(common, EEPROM, "Skipping bad header\n");
3335 cptr -= COMP_HDR_LEN;
3340 read(ah, cptr, word, COMP_HDR_LEN + osize + COMP_CKSUM_LEN);
3341 checksum = ar9300_comp_cksum(&word[COMP_HDR_LEN], length);
3342 mchecksum = get_unaligned_le16(&word[COMP_HDR_LEN + osize]);
3343 ath_dbg(common, EEPROM, "checksum %x %x\n",
3344 checksum, mchecksum);
3345 if (checksum == mchecksum) {
3346 ar9300_compress_decision(ah, it, code, reference, mptr,
3347 word, length, mdata_size);
3349 ath_dbg(common, EEPROM,
3350 "skipping block with bad checksum\n");
3352 cptr -= (COMP_HDR_LEN + osize + COMP_CKSUM_LEN);
3364 * Restore the configuration structure by reading the eeprom.
3365 * This function destroys any existing in-memory structure
3368 static bool ath9k_hw_ar9300_fill_eeprom(struct ath_hw *ah)
3370 u8 *mptr = (u8 *) &ah->eeprom.ar9300_eep;
3372 if (ar9300_eeprom_restore_internal(ah, mptr,
3373 sizeof(struct ar9300_eeprom)) < 0)
3379 #if defined(CONFIG_ATH9K_DEBUGFS) || defined(CONFIG_ATH9K_HTC_DEBUGFS)
3380 static u32 ar9003_dump_modal_eeprom(char *buf, u32 len, u32 size,
3381 struct ar9300_modal_eep_header *modal_hdr)
3383 PR_EEP("Chain0 Ant. Control", le16_to_cpu(modal_hdr->antCtrlChain[0]));
3384 PR_EEP("Chain1 Ant. Control", le16_to_cpu(modal_hdr->antCtrlChain[1]));
3385 PR_EEP("Chain2 Ant. Control", le16_to_cpu(modal_hdr->antCtrlChain[2]));
3386 PR_EEP("Ant. Common Control", le32_to_cpu(modal_hdr->antCtrlCommon));
3387 PR_EEP("Ant. Common Control2", le32_to_cpu(modal_hdr->antCtrlCommon2));
3388 PR_EEP("Ant. Gain", modal_hdr->antennaGain);
3389 PR_EEP("Switch Settle", modal_hdr->switchSettling);
3390 PR_EEP("Chain0 xatten1DB", modal_hdr->xatten1DB[0]);
3391 PR_EEP("Chain1 xatten1DB", modal_hdr->xatten1DB[1]);
3392 PR_EEP("Chain2 xatten1DB", modal_hdr->xatten1DB[2]);
3393 PR_EEP("Chain0 xatten1Margin", modal_hdr->xatten1Margin[0]);
3394 PR_EEP("Chain1 xatten1Margin", modal_hdr->xatten1Margin[1]);
3395 PR_EEP("Chain2 xatten1Margin", modal_hdr->xatten1Margin[2]);
3396 PR_EEP("Temp Slope", modal_hdr->tempSlope);
3397 PR_EEP("Volt Slope", modal_hdr->voltSlope);
3398 PR_EEP("spur Channels0", modal_hdr->spurChans[0]);
3399 PR_EEP("spur Channels1", modal_hdr->spurChans[1]);
3400 PR_EEP("spur Channels2", modal_hdr->spurChans[2]);
3401 PR_EEP("spur Channels3", modal_hdr->spurChans[3]);
3402 PR_EEP("spur Channels4", modal_hdr->spurChans[4]);
3403 PR_EEP("Chain0 NF Threshold", modal_hdr->noiseFloorThreshCh[0]);
3404 PR_EEP("Chain1 NF Threshold", modal_hdr->noiseFloorThreshCh[1]);
3405 PR_EEP("Chain2 NF Threshold", modal_hdr->noiseFloorThreshCh[2]);
3406 PR_EEP("Quick Drop", modal_hdr->quick_drop);
3407 PR_EEP("txEndToXpaOff", modal_hdr->txEndToXpaOff);
3408 PR_EEP("xPA Bias Level", modal_hdr->xpaBiasLvl);
3409 PR_EEP("txFrameToDataStart", modal_hdr->txFrameToDataStart);
3410 PR_EEP("txFrameToPaOn", modal_hdr->txFrameToPaOn);
3411 PR_EEP("txFrameToXpaOn", modal_hdr->txFrameToXpaOn);
3412 PR_EEP("txClip", modal_hdr->txClip);
3413 PR_EEP("ADC Desired size", modal_hdr->adcDesiredSize);
3418 static u32 ath9k_hw_ar9003_dump_eeprom(struct ath_hw *ah, bool dump_base_hdr,
3419 u8 *buf, u32 len, u32 size)
3421 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
3422 struct ar9300_base_eep_hdr *pBase;
3424 if (!dump_base_hdr) {
3425 len += snprintf(buf + len, size - len,
3426 "%20s :\n", "2GHz modal Header");
3427 len += ar9003_dump_modal_eeprom(buf, len, size,
3428 &eep->modalHeader2G);
3429 len += snprintf(buf + len, size - len,
3430 "%20s :\n", "5GHz modal Header");
3431 len += ar9003_dump_modal_eeprom(buf, len, size,
3432 &eep->modalHeader5G);
3436 pBase = &eep->baseEepHeader;
3438 PR_EEP("EEPROM Version", ah->eeprom.ar9300_eep.eepromVersion);
3439 PR_EEP("RegDomain1", le16_to_cpu(pBase->regDmn[0]));
3440 PR_EEP("RegDomain2", le16_to_cpu(pBase->regDmn[1]));
3441 PR_EEP("TX Mask", (pBase->txrxMask >> 4));
3442 PR_EEP("RX Mask", (pBase->txrxMask & 0x0f));
3443 PR_EEP("Allow 5GHz", !!(pBase->opCapFlags.opFlags &
3444 AR5416_OPFLAGS_11A));
3445 PR_EEP("Allow 2GHz", !!(pBase->opCapFlags.opFlags &
3446 AR5416_OPFLAGS_11G));
3447 PR_EEP("Disable 2GHz HT20", !!(pBase->opCapFlags.opFlags &
3448 AR5416_OPFLAGS_N_2G_HT20));
3449 PR_EEP("Disable 2GHz HT40", !!(pBase->opCapFlags.opFlags &
3450 AR5416_OPFLAGS_N_2G_HT40));
3451 PR_EEP("Disable 5Ghz HT20", !!(pBase->opCapFlags.opFlags &
3452 AR5416_OPFLAGS_N_5G_HT20));
3453 PR_EEP("Disable 5Ghz HT40", !!(pBase->opCapFlags.opFlags &
3454 AR5416_OPFLAGS_N_5G_HT40));
3455 PR_EEP("Big Endian", !!(pBase->opCapFlags.eepMisc & 0x01));
3456 PR_EEP("RF Silent", pBase->rfSilent);
3457 PR_EEP("BT option", pBase->blueToothOptions);
3458 PR_EEP("Device Cap", pBase->deviceCap);
3459 PR_EEP("Device Type", pBase->deviceType);
3460 PR_EEP("Power Table Offset", pBase->pwrTableOffset);
3461 PR_EEP("Tuning Caps1", pBase->params_for_tuning_caps[0]);
3462 PR_EEP("Tuning Caps2", pBase->params_for_tuning_caps[1]);
3463 PR_EEP("Enable Tx Temp Comp", !!(pBase->featureEnable & BIT(0)));
3464 PR_EEP("Enable Tx Volt Comp", !!(pBase->featureEnable & BIT(1)));
3465 PR_EEP("Enable fast clock", !!(pBase->featureEnable & BIT(2)));
3466 PR_EEP("Enable doubling", !!(pBase->featureEnable & BIT(3)));
3467 PR_EEP("Internal regulator", !!(pBase->featureEnable & BIT(4)));
3468 PR_EEP("Enable Paprd", !!(pBase->featureEnable & BIT(5)));
3469 PR_EEP("Driver Strength", !!(pBase->miscConfiguration & BIT(0)));
3470 PR_EEP("Quick Drop", !!(pBase->miscConfiguration & BIT(1)));
3471 PR_EEP("Chain mask Reduce", (pBase->miscConfiguration >> 0x3) & 0x1);
3472 PR_EEP("Write enable Gpio", pBase->eepromWriteEnableGpio);
3473 PR_EEP("WLAN Disable Gpio", pBase->wlanDisableGpio);
3474 PR_EEP("WLAN LED Gpio", pBase->wlanLedGpio);
3475 PR_EEP("Rx Band Select Gpio", pBase->rxBandSelectGpio);
3476 PR_EEP("Tx Gain", pBase->txrxgain >> 4);
3477 PR_EEP("Rx Gain", pBase->txrxgain & 0xf);
3478 PR_EEP("SW Reg", le32_to_cpu(pBase->swreg));
3480 len += snprintf(buf + len, size - len, "%20s : %pM\n", "MacAddress",
3481 ah->eeprom.ar9300_eep.macAddr);
3489 static u32 ath9k_hw_ar9003_dump_eeprom(struct ath_hw *ah, bool dump_base_hdr,
3490 u8 *buf, u32 len, u32 size)
3496 /* XXX: review hardware docs */
3497 static int ath9k_hw_ar9300_get_eeprom_ver(struct ath_hw *ah)
3499 return ah->eeprom.ar9300_eep.eepromVersion;
3502 /* XXX: could be read from the eepromVersion, not sure yet */
3503 static int ath9k_hw_ar9300_get_eeprom_rev(struct ath_hw *ah)
3508 static s32 ar9003_hw_xpa_bias_level_get(struct ath_hw *ah, bool is2ghz)
3510 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
3513 return eep->modalHeader2G.xpaBiasLvl;
3515 return eep->modalHeader5G.xpaBiasLvl;
3518 static void ar9003_hw_xpa_bias_level_apply(struct ath_hw *ah, bool is2ghz)
3520 int bias = ar9003_hw_xpa_bias_level_get(ah, is2ghz);
3522 if (AR_SREV_9485(ah) || AR_SREV_9330(ah) || AR_SREV_9340(ah))
3523 REG_RMW_FIELD(ah, AR_CH0_TOP2, AR_CH0_TOP2_XPABIASLVL, bias);
3524 else if (AR_SREV_9462(ah))
3525 REG_RMW_FIELD(ah, AR_CH0_TOP, AR_CH0_TOP_XPABIASLVL, bias);
3527 REG_RMW_FIELD(ah, AR_CH0_TOP, AR_CH0_TOP_XPABIASLVL, bias);
3528 REG_RMW_FIELD(ah, AR_CH0_THERM,
3529 AR_CH0_THERM_XPABIASLVL_MSB,
3531 REG_RMW_FIELD(ah, AR_CH0_THERM,
3532 AR_CH0_THERM_XPASHORT2GND, 1);
3536 static u16 ar9003_switch_com_spdt_get(struct ath_hw *ah, bool is_2ghz)
3538 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
3542 val = eep->modalHeader2G.switchcomspdt;
3544 val = eep->modalHeader5G.switchcomspdt;
3545 return le16_to_cpu(val);
3549 static u32 ar9003_hw_ant_ctrl_common_get(struct ath_hw *ah, bool is2ghz)
3551 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
3555 val = eep->modalHeader2G.antCtrlCommon;
3557 val = eep->modalHeader5G.antCtrlCommon;
3558 return le32_to_cpu(val);
3561 static u32 ar9003_hw_ant_ctrl_common_2_get(struct ath_hw *ah, bool is2ghz)
3563 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
3567 val = eep->modalHeader2G.antCtrlCommon2;
3569 val = eep->modalHeader5G.antCtrlCommon2;
3570 return le32_to_cpu(val);
3573 static u16 ar9003_hw_ant_ctrl_chain_get(struct ath_hw *ah,
3577 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
3580 if (chain >= 0 && chain < AR9300_MAX_CHAINS) {
3582 val = eep->modalHeader2G.antCtrlChain[chain];
3584 val = eep->modalHeader5G.antCtrlChain[chain];
3587 return le16_to_cpu(val);
3590 static void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz)
3595 static const u32 switch_chain_reg[AR9300_MAX_CHAINS] = {
3596 AR_PHY_SWITCH_CHAIN_0,
3597 AR_PHY_SWITCH_CHAIN_1,
3598 AR_PHY_SWITCH_CHAIN_2,
3601 u32 value = ar9003_hw_ant_ctrl_common_get(ah, is2ghz);
3603 if (AR_SREV_9462(ah)) {
3604 REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM,
3605 AR_SWITCH_TABLE_COM_AR9462_ALL, value);
3607 REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM,
3608 AR_SWITCH_TABLE_COM_ALL, value);
3612 * AR9462 defines new switch table for BT/WLAN,
3613 * here's new field name in XXX.ref for both 2G and 5G.
3614 * Register: [GLB_CONTROL] GLB_CONTROL (@0x20044)
3615 * 15:12 R/W SWITCH_TABLE_COM_SPDT_WLAN_RX
3616 * SWITCH_TABLE_COM_SPDT_WLAN_RX
3618 * 11:8 R/W SWITCH_TABLE_COM_SPDT_WLAN_TX
3619 * SWITCH_TABLE_COM_SPDT_WLAN_TX
3621 * 7:4 R/W SWITCH_TABLE_COM_SPDT_WLAN_IDLE
3622 * SWITCH_TABLE_COM_SPDT_WLAN_IDLE
3624 if (AR_SREV_9462_20_OR_LATER(ah)) {
3625 value = ar9003_switch_com_spdt_get(ah, is2ghz);
3626 REG_RMW_FIELD(ah, AR_PHY_GLB_CONTROL,
3627 AR_SWITCH_TABLE_COM_SPDT_ALL, value);
3630 value = ar9003_hw_ant_ctrl_common_2_get(ah, is2ghz);
3631 REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM_2, AR_SWITCH_TABLE_COM2_ALL, value);
3633 for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
3634 if ((ah->rxchainmask & BIT(chain)) ||
3635 (ah->txchainmask & BIT(chain))) {
3636 value = ar9003_hw_ant_ctrl_chain_get(ah, chain,
3638 REG_RMW_FIELD(ah, switch_chain_reg[chain],
3639 AR_SWITCH_TABLE_ALL, value);
3643 if (AR_SREV_9330(ah) || AR_SREV_9485(ah)) {
3644 value = ath9k_hw_ar9300_get_eeprom(ah, EEP_ANT_DIV_CTL1);
3646 * main_lnaconf, alt_lnaconf, main_tb, alt_tb
3647 * are the fields present
3649 regval = REG_READ(ah, AR_PHY_MC_GAIN_CTRL);
3650 regval &= (~AR_ANT_DIV_CTRL_ALL);
3651 regval |= (value & 0x3f) << AR_ANT_DIV_CTRL_ALL_S;
3653 regval &= (~AR_PHY_9485_ANT_DIV_LNADIV);
3654 regval |= ((value >> 6) & 0x1) <<
3655 AR_PHY_9485_ANT_DIV_LNADIV_S;
3656 REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval);
3658 /*enable fast_div */
3659 regval = REG_READ(ah, AR_PHY_CCK_DETECT);
3660 regval &= (~AR_FAST_DIV_ENABLE);
3661 regval |= ((value >> 7) & 0x1) <<
3662 AR_FAST_DIV_ENABLE_S;
3663 REG_WRITE(ah, AR_PHY_CCK_DETECT, regval);
3665 ah->eep_ops->get_eeprom(ah, EEP_ANT_DIV_CTL1);
3666 /* check whether antenna diversity is enabled */
3667 if ((ant_div_ctl1 >> 0x6) == 0x3) {
3668 regval = REG_READ(ah, AR_PHY_MC_GAIN_CTRL);
3670 * clear bits 25-30 main_lnaconf, alt_lnaconf,
3673 regval &= (~(AR_PHY_9485_ANT_DIV_MAIN_LNACONF |
3674 AR_PHY_9485_ANT_DIV_ALT_LNACONF |
3675 AR_PHY_9485_ANT_DIV_ALT_GAINTB |
3676 AR_PHY_9485_ANT_DIV_MAIN_GAINTB));
3677 /* by default use LNA1 for the main antenna */
3678 regval |= (AR_PHY_9485_ANT_DIV_LNA1 <<
3679 AR_PHY_9485_ANT_DIV_MAIN_LNACONF_S);
3680 regval |= (AR_PHY_9485_ANT_DIV_LNA2 <<
3681 AR_PHY_9485_ANT_DIV_ALT_LNACONF_S);
3682 REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval);
3690 static void ar9003_hw_drive_strength_apply(struct ath_hw *ah)
3695 drive_strength = ath9k_hw_ar9300_get_eeprom(ah, EEP_DRIVE_STRENGTH);
3697 if (!drive_strength)
3700 reg = REG_READ(ah, AR_PHY_65NM_CH0_BIAS1);
3708 REG_WRITE(ah, AR_PHY_65NM_CH0_BIAS1, reg);
3710 reg = REG_READ(ah, AR_PHY_65NM_CH0_BIAS2);
3721 REG_WRITE(ah, AR_PHY_65NM_CH0_BIAS2, reg);
3723 reg = REG_READ(ah, AR_PHY_65NM_CH0_BIAS4);
3728 REG_WRITE(ah, AR_PHY_65NM_CH0_BIAS4, reg);
3731 static u16 ar9003_hw_atten_chain_get(struct ath_hw *ah, int chain,
3732 struct ath9k_channel *chan)
3736 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
3738 if (chain >= 0 && chain < 3) {
3739 if (IS_CHAN_2GHZ(chan))
3740 return eep->modalHeader2G.xatten1DB[chain];
3741 else if (eep->base_ext2.xatten1DBLow[chain] != 0) {
3742 t[0] = eep->base_ext2.xatten1DBLow[chain];
3744 t[1] = eep->modalHeader5G.xatten1DB[chain];
3746 t[2] = eep->base_ext2.xatten1DBHigh[chain];
3748 value = ar9003_hw_power_interpolate((s32) chan->channel,
3752 return eep->modalHeader5G.xatten1DB[chain];
3759 static u16 ar9003_hw_atten_chain_get_margin(struct ath_hw *ah, int chain,
3760 struct ath9k_channel *chan)
3764 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
3766 if (chain >= 0 && chain < 3) {
3767 if (IS_CHAN_2GHZ(chan))
3768 return eep->modalHeader2G.xatten1Margin[chain];
3769 else if (eep->base_ext2.xatten1MarginLow[chain] != 0) {
3770 t[0] = eep->base_ext2.xatten1MarginLow[chain];
3772 t[1] = eep->modalHeader5G.xatten1Margin[chain];
3774 t[2] = eep->base_ext2.xatten1MarginHigh[chain];
3776 value = ar9003_hw_power_interpolate((s32) chan->channel,
3780 return eep->modalHeader5G.xatten1Margin[chain];
3786 static void ar9003_hw_atten_apply(struct ath_hw *ah, struct ath9k_channel *chan)
3790 unsigned long ext_atten_reg[3] = {AR_PHY_EXT_ATTEN_CTL_0,
3791 AR_PHY_EXT_ATTEN_CTL_1,
3792 AR_PHY_EXT_ATTEN_CTL_2,
3795 /* Test value. if 0 then attenuation is unused. Don't load anything. */
3796 for (i = 0; i < 3; i++) {
3797 if (ah->txchainmask & BIT(i)) {
3798 value = ar9003_hw_atten_chain_get(ah, i, chan);
3799 REG_RMW_FIELD(ah, ext_atten_reg[i],
3800 AR_PHY_EXT_ATTEN_CTL_XATTEN1_DB, value);
3802 value = ar9003_hw_atten_chain_get_margin(ah, i, chan);
3803 REG_RMW_FIELD(ah, ext_atten_reg[i],
3804 AR_PHY_EXT_ATTEN_CTL_XATTEN1_MARGIN,
3810 static bool is_pmu_set(struct ath_hw *ah, u32 pmu_reg, int pmu_set)
3814 while (pmu_set != REG_READ(ah, pmu_reg)) {
3817 REG_WRITE(ah, pmu_reg, pmu_set);
3824 static void ar9003_hw_internal_regulator_apply(struct ath_hw *ah)
3826 int internal_regulator =
3827 ath9k_hw_ar9300_get_eeprom(ah, EEP_INTERNAL_REGULATOR);
3830 if (internal_regulator) {
3831 if (AR_SREV_9330(ah) || AR_SREV_9485(ah)) {
3834 reg_pmu_set = REG_READ(ah, AR_PHY_PMU2) & ~AR_PHY_PMU2_PGM;
3835 REG_WRITE(ah, AR_PHY_PMU2, reg_pmu_set);
3836 if (!is_pmu_set(ah, AR_PHY_PMU2, reg_pmu_set))
3839 if (AR_SREV_9330(ah)) {
3840 if (ah->is_clk_25mhz) {
3841 reg_pmu_set = (3 << 1) | (8 << 4) |
3842 (3 << 8) | (1 << 14) |
3843 (6 << 17) | (1 << 20) |
3846 reg_pmu_set = (4 << 1) | (7 << 4) |
3847 (3 << 8) | (1 << 14) |
3848 (6 << 17) | (1 << 20) |
3852 reg_pmu_set = (5 << 1) | (7 << 4) |
3853 (2 << 8) | (2 << 14) |
3854 (6 << 17) | (1 << 20) |
3855 (3 << 24) | (1 << 28);
3858 REG_WRITE(ah, AR_PHY_PMU1, reg_pmu_set);
3859 if (!is_pmu_set(ah, AR_PHY_PMU1, reg_pmu_set))
3862 reg_pmu_set = (REG_READ(ah, AR_PHY_PMU2) & ~0xFFC00000)
3864 REG_WRITE(ah, AR_PHY_PMU2, reg_pmu_set);
3865 if (!is_pmu_set(ah, AR_PHY_PMU2, reg_pmu_set))
3868 reg_pmu_set = (REG_READ(ah, AR_PHY_PMU2) & ~0x00200000)
3870 REG_WRITE(ah, AR_PHY_PMU2, reg_pmu_set);
3871 if (!is_pmu_set(ah, AR_PHY_PMU2, reg_pmu_set))
3873 } else if (AR_SREV_9462(ah)) {
3874 reg_val = ath9k_hw_ar9300_get_eeprom(ah, EEP_SWREG);
3875 REG_WRITE(ah, AR_PHY_PMU1, reg_val);
3877 /* Internal regulator is ON. Write swreg register. */
3878 reg_val = ath9k_hw_ar9300_get_eeprom(ah, EEP_SWREG);
3879 REG_WRITE(ah, AR_RTC_REG_CONTROL1,
3880 REG_READ(ah, AR_RTC_REG_CONTROL1) &
3881 (~AR_RTC_REG_CONTROL1_SWREG_PROGRAM));
3882 REG_WRITE(ah, AR_RTC_REG_CONTROL0, reg_val);
3883 /* Set REG_CONTROL1.SWREG_PROGRAM */
3884 REG_WRITE(ah, AR_RTC_REG_CONTROL1,
3886 AR_RTC_REG_CONTROL1) |
3887 AR_RTC_REG_CONTROL1_SWREG_PROGRAM);
3890 if (AR_SREV_9330(ah) || AR_SREV_9485(ah)) {
3891 REG_RMW_FIELD(ah, AR_PHY_PMU2, AR_PHY_PMU2_PGM, 0);
3892 while (REG_READ_FIELD(ah, AR_PHY_PMU2,
3896 REG_RMW_FIELD(ah, AR_PHY_PMU1, AR_PHY_PMU1_PWD, 0x1);
3897 while (!REG_READ_FIELD(ah, AR_PHY_PMU1,
3900 REG_RMW_FIELD(ah, AR_PHY_PMU2, AR_PHY_PMU2_PGM, 0x1);
3901 while (!REG_READ_FIELD(ah, AR_PHY_PMU2,
3904 } else if (AR_SREV_9462(ah))
3905 REG_RMW_FIELD(ah, AR_PHY_PMU1, AR_PHY_PMU1_PWD, 0x1);
3907 reg_val = REG_READ(ah, AR_RTC_SLEEP_CLK) |
3908 AR_RTC_FORCE_SWREG_PRD;
3909 REG_WRITE(ah, AR_RTC_SLEEP_CLK, reg_val);
3915 static void ar9003_hw_apply_tuning_caps(struct ath_hw *ah)
3917 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
3918 u8 tuning_caps_param = eep->baseEepHeader.params_for_tuning_caps[0];
3920 if (eep->baseEepHeader.featureEnable & 0x40) {
3921 tuning_caps_param &= 0x7f;
3922 REG_RMW_FIELD(ah, AR_CH0_XTAL, AR_CH0_XTAL_CAPINDAC,
3924 REG_RMW_FIELD(ah, AR_CH0_XTAL, AR_CH0_XTAL_CAPOUTDAC,
3929 static void ar9003_hw_quick_drop_apply(struct ath_hw *ah, u16 freq)
3931 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
3932 int quick_drop = ath9k_hw_ar9300_get_eeprom(ah, EEP_QUICK_DROP);
3933 s32 t[3], f[3] = {5180, 5500, 5785};
3939 quick_drop = eep->modalHeader2G.quick_drop;
3941 t[0] = eep->base_ext1.quick_drop_low;
3942 t[1] = eep->modalHeader5G.quick_drop;
3943 t[2] = eep->base_ext1.quick_drop_high;
3944 quick_drop = ar9003_hw_power_interpolate(freq, f, t, 3);
3946 REG_RMW_FIELD(ah, AR_PHY_AGC, AR_PHY_AGC_QUICK_DROP, quick_drop);
3949 static void ar9003_hw_txend_to_xpa_off_apply(struct ath_hw *ah, u16 freq)
3951 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
3954 value = (freq < 4000) ? eep->modalHeader2G.txEndToXpaOff :
3955 eep->modalHeader5G.txEndToXpaOff;
3957 REG_RMW_FIELD(ah, AR_PHY_XPA_TIMING_CTL,
3958 AR_PHY_XPA_TIMING_CTL_TX_END_XPAB_OFF, value);
3959 REG_RMW_FIELD(ah, AR_PHY_XPA_TIMING_CTL,
3960 AR_PHY_XPA_TIMING_CTL_TX_END_XPAA_OFF, value);
3963 static void ath9k_hw_ar9300_set_board_values(struct ath_hw *ah,
3964 struct ath9k_channel *chan)
3966 ar9003_hw_xpa_bias_level_apply(ah, IS_CHAN_2GHZ(chan));
3967 ar9003_hw_ant_ctrl_apply(ah, IS_CHAN_2GHZ(chan));
3968 ar9003_hw_drive_strength_apply(ah);
3969 ar9003_hw_atten_apply(ah, chan);
3970 ar9003_hw_quick_drop_apply(ah, chan->channel);
3971 if (!AR_SREV_9330(ah) && !AR_SREV_9340(ah))
3972 ar9003_hw_internal_regulator_apply(ah);
3973 if (AR_SREV_9485(ah) || AR_SREV_9330(ah) || AR_SREV_9340(ah))
3974 ar9003_hw_apply_tuning_caps(ah);
3975 ar9003_hw_txend_to_xpa_off_apply(ah, chan->channel);
3978 static void ath9k_hw_ar9300_set_addac(struct ath_hw *ah,
3979 struct ath9k_channel *chan)
3984 * Returns the interpolated y value corresponding to the specified x value
3985 * from the np ordered pairs of data (px,py).
3986 * The pairs do not have to be in any order.
3987 * If the specified x value is less than any of the px,
3988 * the returned y value is equal to the py for the lowest px.
3989 * If the specified x value is greater than any of the px,
3990 * the returned y value is equal to the py for the highest px.
3992 static int ar9003_hw_power_interpolate(int32_t x,
3993 int32_t *px, int32_t *py, u_int16_t np)
3996 int lx = 0, ly = 0, lhave = 0;
3997 int hx = 0, hy = 0, hhave = 0;
4004 /* identify best lower and higher x calibration measurement */
4005 for (ip = 0; ip < np; ip++) {
4008 /* this measurement is higher than our desired x */
4010 if (!hhave || dx > (x - hx)) {
4011 /* new best higher x measurement */
4017 /* this measurement is lower than our desired x */
4019 if (!lhave || dx < (x - lx)) {
4020 /* new best lower x measurement */
4028 /* the low x is good */
4030 /* so is the high x */
4032 /* they're the same, so just pick one */
4035 else /* interpolate */
4036 y = interpolate(x, lx, hx, ly, hy);
4037 } else /* only low is good, use it */
4039 } else if (hhave) /* only high is good, use it */
4041 else /* nothing is good,this should never happen unless np=0, ???? */
4046 static u8 ar9003_hw_eeprom_get_tgt_pwr(struct ath_hw *ah,
4047 u16 rateIndex, u16 freq, bool is2GHz)
4050 s32 targetPowerArray[AR9300_NUM_5G_20_TARGET_POWERS];
4051 s32 freqArray[AR9300_NUM_5G_20_TARGET_POWERS];
4052 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
4053 struct cal_tgt_pow_legacy *pEepromTargetPwr;
4057 numPiers = AR9300_NUM_2G_20_TARGET_POWERS;
4058 pEepromTargetPwr = eep->calTargetPower2G;
4059 pFreqBin = eep->calTarget_freqbin_2G;
4061 numPiers = AR9300_NUM_5G_20_TARGET_POWERS;
4062 pEepromTargetPwr = eep->calTargetPower5G;
4063 pFreqBin = eep->calTarget_freqbin_5G;
4067 * create array of channels and targetpower from
4068 * targetpower piers stored on eeprom
4070 for (i = 0; i < numPiers; i++) {
4071 freqArray[i] = FBIN2FREQ(pFreqBin[i], is2GHz);
4072 targetPowerArray[i] = pEepromTargetPwr[i].tPow2x[rateIndex];
4075 /* interpolate to get target power for given frequency */
4076 return (u8) ar9003_hw_power_interpolate((s32) freq,
4078 targetPowerArray, numPiers);
4081 static u8 ar9003_hw_eeprom_get_ht20_tgt_pwr(struct ath_hw *ah,
4083 u16 freq, bool is2GHz)
4086 s32 targetPowerArray[AR9300_NUM_5G_20_TARGET_POWERS];
4087 s32 freqArray[AR9300_NUM_5G_20_TARGET_POWERS];
4088 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
4089 struct cal_tgt_pow_ht *pEepromTargetPwr;
4093 numPiers = AR9300_NUM_2G_20_TARGET_POWERS;
4094 pEepromTargetPwr = eep->calTargetPower2GHT20;
4095 pFreqBin = eep->calTarget_freqbin_2GHT20;
4097 numPiers = AR9300_NUM_5G_20_TARGET_POWERS;
4098 pEepromTargetPwr = eep->calTargetPower5GHT20;
4099 pFreqBin = eep->calTarget_freqbin_5GHT20;
4103 * create array of channels and targetpower
4104 * from targetpower piers stored on eeprom
4106 for (i = 0; i < numPiers; i++) {
4107 freqArray[i] = FBIN2FREQ(pFreqBin[i], is2GHz);
4108 targetPowerArray[i] = pEepromTargetPwr[i].tPow2x[rateIndex];
4111 /* interpolate to get target power for given frequency */
4112 return (u8) ar9003_hw_power_interpolate((s32) freq,
4114 targetPowerArray, numPiers);
4117 static u8 ar9003_hw_eeprom_get_ht40_tgt_pwr(struct ath_hw *ah,
4119 u16 freq, bool is2GHz)
4122 s32 targetPowerArray[AR9300_NUM_5G_40_TARGET_POWERS];
4123 s32 freqArray[AR9300_NUM_5G_40_TARGET_POWERS];
4124 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
4125 struct cal_tgt_pow_ht *pEepromTargetPwr;
4129 numPiers = AR9300_NUM_2G_40_TARGET_POWERS;
4130 pEepromTargetPwr = eep->calTargetPower2GHT40;
4131 pFreqBin = eep->calTarget_freqbin_2GHT40;
4133 numPiers = AR9300_NUM_5G_40_TARGET_POWERS;
4134 pEepromTargetPwr = eep->calTargetPower5GHT40;
4135 pFreqBin = eep->calTarget_freqbin_5GHT40;
4139 * create array of channels and targetpower from
4140 * targetpower piers stored on eeprom
4142 for (i = 0; i < numPiers; i++) {
4143 freqArray[i] = FBIN2FREQ(pFreqBin[i], is2GHz);
4144 targetPowerArray[i] = pEepromTargetPwr[i].tPow2x[rateIndex];
4147 /* interpolate to get target power for given frequency */
4148 return (u8) ar9003_hw_power_interpolate((s32) freq,
4150 targetPowerArray, numPiers);
4153 static u8 ar9003_hw_eeprom_get_cck_tgt_pwr(struct ath_hw *ah,
4154 u16 rateIndex, u16 freq)
4156 u16 numPiers = AR9300_NUM_2G_CCK_TARGET_POWERS, i;
4157 s32 targetPowerArray[AR9300_NUM_2G_CCK_TARGET_POWERS];
4158 s32 freqArray[AR9300_NUM_2G_CCK_TARGET_POWERS];
4159 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
4160 struct cal_tgt_pow_legacy *pEepromTargetPwr = eep->calTargetPowerCck;
4161 u8 *pFreqBin = eep->calTarget_freqbin_Cck;
4164 * create array of channels and targetpower from
4165 * targetpower piers stored on eeprom
4167 for (i = 0; i < numPiers; i++) {
4168 freqArray[i] = FBIN2FREQ(pFreqBin[i], 1);
4169 targetPowerArray[i] = pEepromTargetPwr[i].tPow2x[rateIndex];
4172 /* interpolate to get target power for given frequency */
4173 return (u8) ar9003_hw_power_interpolate((s32) freq,
4175 targetPowerArray, numPiers);
4178 /* Set tx power registers to array of values passed in */
4179 static int ar9003_hw_tx_power_regwrite(struct ath_hw *ah, u8 * pPwrArray)
4181 #define POW_SM(_r, _s) (((_r) & 0x3f) << (_s))
4182 /* make sure forced gain is not set */
4183 REG_WRITE(ah, AR_PHY_TX_FORCED_GAIN, 0);
4185 /* Write the OFDM power per rate set */
4187 /* 6 (LSB), 9, 12, 18 (MSB) */
4188 REG_WRITE(ah, AR_PHY_POWER_TX_RATE(0),
4189 POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 24) |
4190 POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 16) |
4191 POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 8) |
4192 POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 0));
4194 /* 24 (LSB), 36, 48, 54 (MSB) */
4195 REG_WRITE(ah, AR_PHY_POWER_TX_RATE(1),
4196 POW_SM(pPwrArray[ALL_TARGET_LEGACY_54], 24) |
4197 POW_SM(pPwrArray[ALL_TARGET_LEGACY_48], 16) |
4198 POW_SM(pPwrArray[ALL_TARGET_LEGACY_36], 8) |
4199 POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 0));
4201 /* Write the CCK power per rate set */
4203 /* 1L (LSB), reserved, 2L, 2S (MSB) */
4204 REG_WRITE(ah, AR_PHY_POWER_TX_RATE(2),
4205 POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 24) |
4206 POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 16) |
4207 /* POW_SM(txPowerTimes2, 8) | this is reserved for AR9003 */
4208 POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 0));
4210 /* 5.5L (LSB), 5.5S, 11L, 11S (MSB) */
4211 REG_WRITE(ah, AR_PHY_POWER_TX_RATE(3),
4212 POW_SM(pPwrArray[ALL_TARGET_LEGACY_11S], 24) |
4213 POW_SM(pPwrArray[ALL_TARGET_LEGACY_11L], 16) |
4214 POW_SM(pPwrArray[ALL_TARGET_LEGACY_5S], 8) |
4215 POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 0)
4218 /* Write the power for duplicated frames - HT40 */
4220 /* dup40_cck (LSB), dup40_ofdm, ext20_cck, ext20_ofdm (MSB) */
4221 REG_WRITE(ah, AR_PHY_POWER_TX_RATE(8),
4222 POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 24) |
4223 POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 16) |
4224 POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 8) |
4225 POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 0)
4228 /* Write the HT20 power per rate set */
4230 /* 0/8/16 (LSB), 1-3/9-11/17-19, 4, 5 (MSB) */
4231 REG_WRITE(ah, AR_PHY_POWER_TX_RATE(4),
4232 POW_SM(pPwrArray[ALL_TARGET_HT20_5], 24) |
4233 POW_SM(pPwrArray[ALL_TARGET_HT20_4], 16) |
4234 POW_SM(pPwrArray[ALL_TARGET_HT20_1_3_9_11_17_19], 8) |
4235 POW_SM(pPwrArray[ALL_TARGET_HT20_0_8_16], 0)
4238 /* 6 (LSB), 7, 12, 13 (MSB) */
4239 REG_WRITE(ah, AR_PHY_POWER_TX_RATE(5),
4240 POW_SM(pPwrArray[ALL_TARGET_HT20_13], 24) |
4241 POW_SM(pPwrArray[ALL_TARGET_HT20_12], 16) |
4242 POW_SM(pPwrArray[ALL_TARGET_HT20_7], 8) |
4243 POW_SM(pPwrArray[ALL_TARGET_HT20_6], 0)
4246 /* 14 (LSB), 15, 20, 21 */
4247 REG_WRITE(ah, AR_PHY_POWER_TX_RATE(9),
4248 POW_SM(pPwrArray[ALL_TARGET_HT20_21], 24) |
4249 POW_SM(pPwrArray[ALL_TARGET_HT20_20], 16) |
4250 POW_SM(pPwrArray[ALL_TARGET_HT20_15], 8) |
4251 POW_SM(pPwrArray[ALL_TARGET_HT20_14], 0)
4254 /* Mixed HT20 and HT40 rates */
4256 /* HT20 22 (LSB), HT20 23, HT40 22, HT40 23 (MSB) */
4257 REG_WRITE(ah, AR_PHY_POWER_TX_RATE(10),
4258 POW_SM(pPwrArray[ALL_TARGET_HT40_23], 24) |
4259 POW_SM(pPwrArray[ALL_TARGET_HT40_22], 16) |
4260 POW_SM(pPwrArray[ALL_TARGET_HT20_23], 8) |
4261 POW_SM(pPwrArray[ALL_TARGET_HT20_22], 0)
4265 * Write the HT40 power per rate set
4266 * correct PAR difference between HT40 and HT20/LEGACY
4267 * 0/8/16 (LSB), 1-3/9-11/17-19, 4, 5 (MSB)
4269 REG_WRITE(ah, AR_PHY_POWER_TX_RATE(6),
4270 POW_SM(pPwrArray[ALL_TARGET_HT40_5], 24) |
4271 POW_SM(pPwrArray[ALL_TARGET_HT40_4], 16) |
4272 POW_SM(pPwrArray[ALL_TARGET_HT40_1_3_9_11_17_19], 8) |
4273 POW_SM(pPwrArray[ALL_TARGET_HT40_0_8_16], 0)
4276 /* 6 (LSB), 7, 12, 13 (MSB) */
4277 REG_WRITE(ah, AR_PHY_POWER_TX_RATE(7),
4278 POW_SM(pPwrArray[ALL_TARGET_HT40_13], 24) |
4279 POW_SM(pPwrArray[ALL_TARGET_HT40_12], 16) |
4280 POW_SM(pPwrArray[ALL_TARGET_HT40_7], 8) |
4281 POW_SM(pPwrArray[ALL_TARGET_HT40_6], 0)
4284 /* 14 (LSB), 15, 20, 21 */
4285 REG_WRITE(ah, AR_PHY_POWER_TX_RATE(11),
4286 POW_SM(pPwrArray[ALL_TARGET_HT40_21], 24) |
4287 POW_SM(pPwrArray[ALL_TARGET_HT40_20], 16) |
4288 POW_SM(pPwrArray[ALL_TARGET_HT40_15], 8) |
4289 POW_SM(pPwrArray[ALL_TARGET_HT40_14], 0)
4296 static void ar9003_hw_set_target_power_eeprom(struct ath_hw *ah, u16 freq,
4297 u8 *targetPowerValT2)
4299 /* XXX: hard code for now, need to get from eeprom struct */
4300 u8 ht40PowerIncForPdadc = 0;
4301 bool is2GHz = false;
4303 struct ath_common *common = ath9k_hw_common(ah);
4308 targetPowerValT2[ALL_TARGET_LEGACY_6_24] =
4309 ar9003_hw_eeprom_get_tgt_pwr(ah, LEGACY_TARGET_RATE_6_24, freq,
4311 targetPowerValT2[ALL_TARGET_LEGACY_36] =
4312 ar9003_hw_eeprom_get_tgt_pwr(ah, LEGACY_TARGET_RATE_36, freq,
4314 targetPowerValT2[ALL_TARGET_LEGACY_48] =
4315 ar9003_hw_eeprom_get_tgt_pwr(ah, LEGACY_TARGET_RATE_48, freq,
4317 targetPowerValT2[ALL_TARGET_LEGACY_54] =
4318 ar9003_hw_eeprom_get_tgt_pwr(ah, LEGACY_TARGET_RATE_54, freq,
4320 targetPowerValT2[ALL_TARGET_LEGACY_1L_5L] =
4321 ar9003_hw_eeprom_get_cck_tgt_pwr(ah, LEGACY_TARGET_RATE_1L_5L,
4323 targetPowerValT2[ALL_TARGET_LEGACY_5S] =
4324 ar9003_hw_eeprom_get_cck_tgt_pwr(ah, LEGACY_TARGET_RATE_5S, freq);
4325 targetPowerValT2[ALL_TARGET_LEGACY_11L] =
4326 ar9003_hw_eeprom_get_cck_tgt_pwr(ah, LEGACY_TARGET_RATE_11L, freq);
4327 targetPowerValT2[ALL_TARGET_LEGACY_11S] =
4328 ar9003_hw_eeprom_get_cck_tgt_pwr(ah, LEGACY_TARGET_RATE_11S, freq);
4329 targetPowerValT2[ALL_TARGET_HT20_0_8_16] =
4330 ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_0_8_16, freq,
4332 targetPowerValT2[ALL_TARGET_HT20_1_3_9_11_17_19] =
4333 ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_1_3_9_11_17_19,
4335 targetPowerValT2[ALL_TARGET_HT20_4] =
4336 ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_4, freq,
4338 targetPowerValT2[ALL_TARGET_HT20_5] =
4339 ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_5, freq,
4341 targetPowerValT2[ALL_TARGET_HT20_6] =
4342 ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_6, freq,
4344 targetPowerValT2[ALL_TARGET_HT20_7] =
4345 ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_7, freq,
4347 targetPowerValT2[ALL_TARGET_HT20_12] =
4348 ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_12, freq,
4350 targetPowerValT2[ALL_TARGET_HT20_13] =
4351 ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_13, freq,
4353 targetPowerValT2[ALL_TARGET_HT20_14] =
4354 ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_14, freq,
4356 targetPowerValT2[ALL_TARGET_HT20_15] =
4357 ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_15, freq,
4359 targetPowerValT2[ALL_TARGET_HT20_20] =
4360 ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_20, freq,
4362 targetPowerValT2[ALL_TARGET_HT20_21] =
4363 ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_21, freq,
4365 targetPowerValT2[ALL_TARGET_HT20_22] =
4366 ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_22, freq,
4368 targetPowerValT2[ALL_TARGET_HT20_23] =
4369 ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_23, freq,
4371 targetPowerValT2[ALL_TARGET_HT40_0_8_16] =
4372 ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_0_8_16, freq,
4373 is2GHz) + ht40PowerIncForPdadc;
4374 targetPowerValT2[ALL_TARGET_HT40_1_3_9_11_17_19] =
4375 ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_1_3_9_11_17_19,
4377 is2GHz) + ht40PowerIncForPdadc;
4378 targetPowerValT2[ALL_TARGET_HT40_4] =
4379 ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_4, freq,
4380 is2GHz) + ht40PowerIncForPdadc;
4381 targetPowerValT2[ALL_TARGET_HT40_5] =
4382 ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_5, freq,
4383 is2GHz) + ht40PowerIncForPdadc;
4384 targetPowerValT2[ALL_TARGET_HT40_6] =
4385 ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_6, freq,
4386 is2GHz) + ht40PowerIncForPdadc;
4387 targetPowerValT2[ALL_TARGET_HT40_7] =
4388 ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_7, freq,
4389 is2GHz) + ht40PowerIncForPdadc;
4390 targetPowerValT2[ALL_TARGET_HT40_12] =
4391 ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_12, freq,
4392 is2GHz) + ht40PowerIncForPdadc;
4393 targetPowerValT2[ALL_TARGET_HT40_13] =
4394 ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_13, freq,
4395 is2GHz) + ht40PowerIncForPdadc;
4396 targetPowerValT2[ALL_TARGET_HT40_14] =
4397 ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_14, freq,
4398 is2GHz) + ht40PowerIncForPdadc;
4399 targetPowerValT2[ALL_TARGET_HT40_15] =
4400 ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_15, freq,
4401 is2GHz) + ht40PowerIncForPdadc;
4402 targetPowerValT2[ALL_TARGET_HT40_20] =
4403 ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_20, freq,
4404 is2GHz) + ht40PowerIncForPdadc;
4405 targetPowerValT2[ALL_TARGET_HT40_21] =
4406 ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_21, freq,
4407 is2GHz) + ht40PowerIncForPdadc;
4408 targetPowerValT2[ALL_TARGET_HT40_22] =
4409 ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_22, freq,
4410 is2GHz) + ht40PowerIncForPdadc;
4411 targetPowerValT2[ALL_TARGET_HT40_23] =
4412 ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_23, freq,
4413 is2GHz) + ht40PowerIncForPdadc;
4415 for (i = 0; i < ar9300RateSize; i++) {
4416 ath_dbg(common, EEPROM, "TPC[%02d] 0x%08x\n",
4417 i, targetPowerValT2[i]);
4421 static int ar9003_hw_cal_pier_get(struct ath_hw *ah,
4427 int *ptemperature, int *pvoltage)
4430 struct ar9300_cal_data_per_freq_op_loop *pCalPierStruct;
4432 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
4433 struct ath_common *common = ath9k_hw_common(ah);
4435 if (ichain >= AR9300_MAX_CHAINS) {
4436 ath_dbg(common, EEPROM,
4437 "Invalid chain index, must be less than %d\n",
4442 if (mode) { /* 5GHz */
4443 if (ipier >= AR9300_NUM_5G_CAL_PIERS) {
4444 ath_dbg(common, EEPROM,
4445 "Invalid 5GHz cal pier index, must be less than %d\n",
4446 AR9300_NUM_5G_CAL_PIERS);
4449 pCalPier = &(eep->calFreqPier5G[ipier]);
4450 pCalPierStruct = &(eep->calPierData5G[ichain][ipier]);
4453 if (ipier >= AR9300_NUM_2G_CAL_PIERS) {
4454 ath_dbg(common, EEPROM,
4455 "Invalid 2GHz cal pier index, must be less than %d\n",
4456 AR9300_NUM_2G_CAL_PIERS);
4460 pCalPier = &(eep->calFreqPier2G[ipier]);
4461 pCalPierStruct = &(eep->calPierData2G[ichain][ipier]);
4465 *pfrequency = FBIN2FREQ(*pCalPier, is2GHz);
4466 *pcorrection = pCalPierStruct->refPower;
4467 *ptemperature = pCalPierStruct->tempMeas;
4468 *pvoltage = pCalPierStruct->voltMeas;
4473 static int ar9003_hw_power_control_override(struct ath_hw *ah,
4476 int *voltage, int *temperature)
4479 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
4482 REG_RMW(ah, AR_PHY_TPC_11_B0,
4483 (correction[0] << AR_PHY_TPC_OLPC_GAIN_DELTA_S),
4484 AR_PHY_TPC_OLPC_GAIN_DELTA);
4485 if (ah->caps.tx_chainmask & BIT(1))
4486 REG_RMW(ah, AR_PHY_TPC_11_B1,
4487 (correction[1] << AR_PHY_TPC_OLPC_GAIN_DELTA_S),
4488 AR_PHY_TPC_OLPC_GAIN_DELTA);
4489 if (ah->caps.tx_chainmask & BIT(2))
4490 REG_RMW(ah, AR_PHY_TPC_11_B2,
4491 (correction[2] << AR_PHY_TPC_OLPC_GAIN_DELTA_S),
4492 AR_PHY_TPC_OLPC_GAIN_DELTA);
4494 /* enable open loop power control on chip */
4495 REG_RMW(ah, AR_PHY_TPC_6_B0,
4496 (3 << AR_PHY_TPC_6_ERROR_EST_MODE_S),
4497 AR_PHY_TPC_6_ERROR_EST_MODE);
4498 if (ah->caps.tx_chainmask & BIT(1))
4499 REG_RMW(ah, AR_PHY_TPC_6_B1,
4500 (3 << AR_PHY_TPC_6_ERROR_EST_MODE_S),
4501 AR_PHY_TPC_6_ERROR_EST_MODE);
4502 if (ah->caps.tx_chainmask & BIT(2))
4503 REG_RMW(ah, AR_PHY_TPC_6_B2,
4504 (3 << AR_PHY_TPC_6_ERROR_EST_MODE_S),
4505 AR_PHY_TPC_6_ERROR_EST_MODE);
4508 * enable temperature compensation
4509 * Need to use register names
4511 if (frequency < 4000)
4512 tempSlope = eep->modalHeader2G.tempSlope;
4513 else if (eep->base_ext2.tempSlopeLow != 0) {
4514 t[0] = eep->base_ext2.tempSlopeLow;
4516 t[1] = eep->modalHeader5G.tempSlope;
4518 t[2] = eep->base_ext2.tempSlopeHigh;
4520 tempSlope = ar9003_hw_power_interpolate((s32) frequency,
4523 tempSlope = eep->modalHeader5G.tempSlope;
4525 REG_RMW_FIELD(ah, AR_PHY_TPC_19, AR_PHY_TPC_19_ALPHA_THERM, tempSlope);
4527 if (AR_SREV_9462_20(ah))
4528 REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
4529 AR_PHY_TPC_19_B1_ALPHA_THERM, tempSlope);
4532 REG_RMW_FIELD(ah, AR_PHY_TPC_18, AR_PHY_TPC_18_THERM_CAL_VALUE,
4538 /* Apply the recorded correction values. */
4539 static int ar9003_hw_calibration_apply(struct ath_hw *ah, int frequency)
4541 int ichain, ipier, npier;
4543 int lfrequency[AR9300_MAX_CHAINS],
4544 lcorrection[AR9300_MAX_CHAINS],
4545 ltemperature[AR9300_MAX_CHAINS], lvoltage[AR9300_MAX_CHAINS];
4546 int hfrequency[AR9300_MAX_CHAINS],
4547 hcorrection[AR9300_MAX_CHAINS],
4548 htemperature[AR9300_MAX_CHAINS], hvoltage[AR9300_MAX_CHAINS];
4550 int correction[AR9300_MAX_CHAINS],
4551 voltage[AR9300_MAX_CHAINS], temperature[AR9300_MAX_CHAINS];
4552 int pfrequency, pcorrection, ptemperature, pvoltage;
4553 struct ath_common *common = ath9k_hw_common(ah);
4555 mode = (frequency >= 4000);
4557 npier = AR9300_NUM_5G_CAL_PIERS;
4559 npier = AR9300_NUM_2G_CAL_PIERS;
4561 for (ichain = 0; ichain < AR9300_MAX_CHAINS; ichain++) {
4562 lfrequency[ichain] = 0;
4563 hfrequency[ichain] = 100000;
4565 /* identify best lower and higher frequency calibration measurement */
4566 for (ichain = 0; ichain < AR9300_MAX_CHAINS; ichain++) {
4567 for (ipier = 0; ipier < npier; ipier++) {
4568 if (!ar9003_hw_cal_pier_get(ah, mode, ipier, ichain,
4569 &pfrequency, &pcorrection,
4570 &ptemperature, &pvoltage)) {
4571 fdiff = frequency - pfrequency;
4574 * this measurement is higher than
4575 * our desired frequency
4578 if (hfrequency[ichain] <= 0 ||
4579 hfrequency[ichain] >= 100000 ||
4581 (frequency - hfrequency[ichain])) {
4584 * frequency measurement
4586 hfrequency[ichain] = pfrequency;
4587 hcorrection[ichain] =
4589 htemperature[ichain] =
4591 hvoltage[ichain] = pvoltage;
4595 if (lfrequency[ichain] <= 0
4597 (frequency - lfrequency[ichain])) {
4600 * frequency measurement
4602 lfrequency[ichain] = pfrequency;
4603 lcorrection[ichain] =
4605 ltemperature[ichain] =
4607 lvoltage[ichain] = pvoltage;
4615 for (ichain = 0; ichain < AR9300_MAX_CHAINS; ichain++) {
4616 ath_dbg(common, EEPROM, "ch=%d f=%d low=%d %d h=%d %d\n",
4617 ichain, frequency, lfrequency[ichain],
4618 lcorrection[ichain], hfrequency[ichain],
4619 hcorrection[ichain]);
4620 /* they're the same, so just pick one */
4621 if (hfrequency[ichain] == lfrequency[ichain]) {
4622 correction[ichain] = lcorrection[ichain];
4623 voltage[ichain] = lvoltage[ichain];
4624 temperature[ichain] = ltemperature[ichain];
4626 /* the low frequency is good */
4627 else if (frequency - lfrequency[ichain] < 1000) {
4628 /* so is the high frequency, interpolate */
4629 if (hfrequency[ichain] - frequency < 1000) {
4631 correction[ichain] = interpolate(frequency,
4634 lcorrection[ichain],
4635 hcorrection[ichain]);
4637 temperature[ichain] = interpolate(frequency,
4640 ltemperature[ichain],
4641 htemperature[ichain]);
4643 voltage[ichain] = interpolate(frequency,
4649 /* only low is good, use it */
4651 correction[ichain] = lcorrection[ichain];
4652 temperature[ichain] = ltemperature[ichain];
4653 voltage[ichain] = lvoltage[ichain];
4656 /* only high is good, use it */
4657 else if (hfrequency[ichain] - frequency < 1000) {
4658 correction[ichain] = hcorrection[ichain];
4659 temperature[ichain] = htemperature[ichain];
4660 voltage[ichain] = hvoltage[ichain];
4661 } else { /* nothing is good, presume 0???? */
4662 correction[ichain] = 0;
4663 temperature[ichain] = 0;
4664 voltage[ichain] = 0;
4668 ar9003_hw_power_control_override(ah, frequency, correction, voltage,
4671 ath_dbg(common, EEPROM,
4672 "for frequency=%d, calibration correction = %d %d %d\n",
4673 frequency, correction[0], correction[1], correction[2]);
4678 static u16 ar9003_hw_get_direct_edge_power(struct ar9300_eeprom *eep,
4683 struct cal_ctl_data_2g *ctl_2g = eep->ctlPowerData_2G;
4684 struct cal_ctl_data_5g *ctl_5g = eep->ctlPowerData_5G;
4687 return CTL_EDGE_TPOWER(ctl_2g[idx].ctlEdges[edge]);
4689 return CTL_EDGE_TPOWER(ctl_5g[idx].ctlEdges[edge]);
4692 static u16 ar9003_hw_get_indirect_edge_power(struct ar9300_eeprom *eep,
4698 struct cal_ctl_data_2g *ctl_2g = eep->ctlPowerData_2G;
4699 struct cal_ctl_data_5g *ctl_5g = eep->ctlPowerData_5G;
4701 u8 *ctl_freqbin = is2GHz ?
4702 &eep->ctl_freqbin_2G[idx][0] :
4703 &eep->ctl_freqbin_5G[idx][0];
4706 if (ath9k_hw_fbin2freq(ctl_freqbin[edge - 1], 1) < freq &&
4707 CTL_EDGE_FLAGS(ctl_2g[idx].ctlEdges[edge - 1]))
4708 return CTL_EDGE_TPOWER(ctl_2g[idx].ctlEdges[edge - 1]);
4710 if (ath9k_hw_fbin2freq(ctl_freqbin[edge - 1], 0) < freq &&
4711 CTL_EDGE_FLAGS(ctl_5g[idx].ctlEdges[edge - 1]))
4712 return CTL_EDGE_TPOWER(ctl_5g[idx].ctlEdges[edge - 1]);
4715 return MAX_RATE_POWER;
4719 * Find the maximum conformance test limit for the given channel and CTL info
4721 static u16 ar9003_hw_get_max_edge_power(struct ar9300_eeprom *eep,
4722 u16 freq, int idx, bool is2GHz)
4724 u16 twiceMaxEdgePower = MAX_RATE_POWER;
4725 u8 *ctl_freqbin = is2GHz ?
4726 &eep->ctl_freqbin_2G[idx][0] :
4727 &eep->ctl_freqbin_5G[idx][0];
4728 u16 num_edges = is2GHz ?
4729 AR9300_NUM_BAND_EDGES_2G : AR9300_NUM_BAND_EDGES_5G;
4732 /* Get the edge power */
4734 (edge < num_edges) && (ctl_freqbin[edge] != AR5416_BCHAN_UNUSED);
4737 * If there's an exact channel match or an inband flag set
4738 * on the lower channel use the given rdEdgePower
4740 if (freq == ath9k_hw_fbin2freq(ctl_freqbin[edge], is2GHz)) {
4742 ar9003_hw_get_direct_edge_power(eep, idx,
4745 } else if ((edge > 0) &&
4746 (freq < ath9k_hw_fbin2freq(ctl_freqbin[edge],
4749 ar9003_hw_get_indirect_edge_power(eep, idx,
4753 * Leave loop - no more affecting edges possible in
4754 * this monotonic increasing list
4759 return twiceMaxEdgePower;
4762 static void ar9003_hw_set_power_per_rate_table(struct ath_hw *ah,
4763 struct ath9k_channel *chan,
4764 u8 *pPwrArray, u16 cfgCtl,
4765 u8 antenna_reduction,
4768 struct ath_common *common = ath9k_hw_common(ah);
4769 struct ar9300_eeprom *pEepData = &ah->eeprom.ar9300_eep;
4770 u16 twiceMaxEdgePower;
4772 u16 scaledPower = 0, minCtlPower;
4773 static const u16 ctlModesFor11a[] = {
4774 CTL_11A, CTL_5GHT20, CTL_11A_EXT, CTL_5GHT40
4776 static const u16 ctlModesFor11g[] = {
4777 CTL_11B, CTL_11G, CTL_2GHT20, CTL_11B_EXT,
4778 CTL_11G_EXT, CTL_2GHT40
4781 const u16 *pCtlMode;
4783 struct chan_centers centers;
4786 u16 twiceMinEdgePower;
4787 bool is2ghz = IS_CHAN_2GHZ(chan);
4789 ath9k_hw_get_channel_centers(ah, chan, ¢ers);
4790 scaledPower = ath9k_hw_get_scaled_power(ah, powerLimit,
4794 * Get target powers from EEPROM - our baseline for TX Power
4797 /* Setup for CTL modes */
4798 /* CTL_11B, CTL_11G, CTL_2GHT20 */
4800 ARRAY_SIZE(ctlModesFor11g) -
4801 SUB_NUM_CTL_MODES_AT_2G_40;
4802 pCtlMode = ctlModesFor11g;
4803 if (IS_CHAN_HT40(chan))
4805 numCtlModes = ARRAY_SIZE(ctlModesFor11g);
4807 /* Setup for CTL modes */
4808 /* CTL_11A, CTL_5GHT20 */
4809 numCtlModes = ARRAY_SIZE(ctlModesFor11a) -
4810 SUB_NUM_CTL_MODES_AT_5G_40;
4811 pCtlMode = ctlModesFor11a;
4812 if (IS_CHAN_HT40(chan))
4814 numCtlModes = ARRAY_SIZE(ctlModesFor11a);
4818 * For MIMO, need to apply regulatory caps individually across
4819 * dynamically running modes: CCK, OFDM, HT20, HT40
4821 * The outer loop walks through each possible applicable runtime mode.
4822 * The inner loop walks through each ctlIndex entry in EEPROM.
4823 * The ctl value is encoded as [7:4] == test group, [3:0] == test mode.
4825 for (ctlMode = 0; ctlMode < numCtlModes; ctlMode++) {
4826 bool isHt40CtlMode = (pCtlMode[ctlMode] == CTL_5GHT40) ||
4827 (pCtlMode[ctlMode] == CTL_2GHT40);
4829 freq = centers.synth_center;
4830 else if (pCtlMode[ctlMode] & EXT_ADDITIVE)
4831 freq = centers.ext_center;
4833 freq = centers.ctl_center;
4835 ath_dbg(common, REGULATORY,
4836 "LOOP-Mode ctlMode %d < %d, isHt40CtlMode %d, EXT_ADDITIVE %d\n",
4837 ctlMode, numCtlModes, isHt40CtlMode,
4838 (pCtlMode[ctlMode] & EXT_ADDITIVE));
4840 /* walk through each CTL index stored in EEPROM */
4842 ctlIndex = pEepData->ctlIndex_2G;
4843 ctlNum = AR9300_NUM_CTLS_2G;
4845 ctlIndex = pEepData->ctlIndex_5G;
4846 ctlNum = AR9300_NUM_CTLS_5G;
4849 twiceMaxEdgePower = MAX_RATE_POWER;
4850 for (i = 0; (i < ctlNum) && ctlIndex[i]; i++) {
4851 ath_dbg(common, REGULATORY,
4852 "LOOP-Ctlidx %d: cfgCtl 0x%2.2x pCtlMode 0x%2.2x ctlIndex 0x%2.2x chan %d\n",
4853 i, cfgCtl, pCtlMode[ctlMode], ctlIndex[i],
4857 * compare test group from regulatory
4858 * channel list with test mode from pCtlMode
4861 if ((((cfgCtl & ~CTL_MODE_M) |
4862 (pCtlMode[ctlMode] & CTL_MODE_M)) ==
4864 (((cfgCtl & ~CTL_MODE_M) |
4865 (pCtlMode[ctlMode] & CTL_MODE_M)) ==
4866 ((ctlIndex[i] & CTL_MODE_M) |
4869 ar9003_hw_get_max_edge_power(pEepData,
4873 if ((cfgCtl & ~CTL_MODE_M) == SD_NO_CTL)
4875 * Find the minimum of all CTL
4876 * edge powers that apply to
4880 min(twiceMaxEdgePower,
4891 minCtlPower = (u8)min(twiceMaxEdgePower, scaledPower);
4893 ath_dbg(common, REGULATORY,
4894 "SEL-Min ctlMode %d pCtlMode %d 2xMaxEdge %d sP %d minCtlPwr %d\n",
4895 ctlMode, pCtlMode[ctlMode], twiceMaxEdgePower,
4896 scaledPower, minCtlPower);
4898 /* Apply ctl mode to correct target power set */
4899 switch (pCtlMode[ctlMode]) {
4901 for (i = ALL_TARGET_LEGACY_1L_5L;
4902 i <= ALL_TARGET_LEGACY_11S; i++)
4904 (u8)min((u16)pPwrArray[i],
4909 for (i = ALL_TARGET_LEGACY_6_24;
4910 i <= ALL_TARGET_LEGACY_54; i++)
4912 (u8)min((u16)pPwrArray[i],
4917 for (i = ALL_TARGET_HT20_0_8_16;
4918 i <= ALL_TARGET_HT20_21; i++)
4920 (u8)min((u16)pPwrArray[i],
4922 pPwrArray[ALL_TARGET_HT20_22] =
4923 (u8)min((u16)pPwrArray[ALL_TARGET_HT20_22],
4925 pPwrArray[ALL_TARGET_HT20_23] =
4926 (u8)min((u16)pPwrArray[ALL_TARGET_HT20_23],
4931 for (i = ALL_TARGET_HT40_0_8_16;
4932 i <= ALL_TARGET_HT40_23; i++)
4934 (u8)min((u16)pPwrArray[i],
4940 } /* end ctl mode checking */
4943 static inline u8 mcsidx_to_tgtpwridx(unsigned int mcs_idx, u8 base_pwridx)
4945 u8 mod_idx = mcs_idx % 8;
4948 return mod_idx ? (base_pwridx + 1) : base_pwridx;
4950 return base_pwridx + 4 * (mcs_idx / 8) + mod_idx - 2;
4953 static void ath9k_hw_ar9300_set_txpower(struct ath_hw *ah,
4954 struct ath9k_channel *chan, u16 cfgCtl,
4955 u8 twiceAntennaReduction,
4956 u8 powerLimit, bool test)
4958 struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
4959 struct ath_common *common = ath9k_hw_common(ah);
4960 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
4961 struct ar9300_modal_eep_header *modal_hdr;
4962 u8 targetPowerValT2[ar9300RateSize];
4963 u8 target_power_val_t2_eep[ar9300RateSize];
4964 unsigned int i = 0, paprd_scale_factor = 0;
4965 u8 pwr_idx, min_pwridx = 0;
4967 ar9003_hw_set_target_power_eeprom(ah, chan->channel, targetPowerValT2);
4969 if (ah->eep_ops->get_eeprom(ah, EEP_PAPRD)) {
4970 if (IS_CHAN_2GHZ(chan))
4971 modal_hdr = &eep->modalHeader2G;
4973 modal_hdr = &eep->modalHeader5G;
4975 ah->paprd_ratemask =
4976 le32_to_cpu(modal_hdr->papdRateMaskHt20) &
4977 AR9300_PAPRD_RATE_MASK;
4979 ah->paprd_ratemask_ht40 =
4980 le32_to_cpu(modal_hdr->papdRateMaskHt40) &
4981 AR9300_PAPRD_RATE_MASK;
4983 paprd_scale_factor = ar9003_get_paprd_scale_factor(ah, chan);
4984 min_pwridx = IS_CHAN_HT40(chan) ? ALL_TARGET_HT40_0_8_16 :
4985 ALL_TARGET_HT20_0_8_16;
4987 if (!ah->paprd_table_write_done) {
4988 memcpy(target_power_val_t2_eep, targetPowerValT2,
4989 sizeof(targetPowerValT2));
4990 for (i = 0; i < 24; i++) {
4991 pwr_idx = mcsidx_to_tgtpwridx(i, min_pwridx);
4992 if (ah->paprd_ratemask & (1 << i)) {
4993 if (targetPowerValT2[pwr_idx] &&
4994 targetPowerValT2[pwr_idx] ==
4995 target_power_val_t2_eep[pwr_idx])
4996 targetPowerValT2[pwr_idx] -=
5001 memcpy(target_power_val_t2_eep, targetPowerValT2,
5002 sizeof(targetPowerValT2));
5005 ar9003_hw_set_power_per_rate_table(ah, chan,
5006 targetPowerValT2, cfgCtl,
5007 twiceAntennaReduction,
5010 if (ah->eep_ops->get_eeprom(ah, EEP_PAPRD)) {
5011 for (i = 0; i < ar9300RateSize; i++) {
5012 if ((ah->paprd_ratemask & (1 << i)) &&
5013 (abs(targetPowerValT2[i] -
5014 target_power_val_t2_eep[i]) >
5015 paprd_scale_factor)) {
5016 ah->paprd_ratemask &= ~(1 << i);
5017 ath_dbg(common, EEPROM,
5018 "paprd disabled for mcs %d\n", i);
5023 regulatory->max_power_level = 0;
5024 for (i = 0; i < ar9300RateSize; i++) {
5025 if (targetPowerValT2[i] > regulatory->max_power_level)
5026 regulatory->max_power_level = targetPowerValT2[i];
5029 ath9k_hw_update_regulatory_maxpower(ah);
5034 for (i = 0; i < ar9300RateSize; i++) {
5035 ath_dbg(common, EEPROM, "TPC[%02d] 0x%08x\n",
5036 i, targetPowerValT2[i]);
5039 /* Write target power array to registers */
5040 ar9003_hw_tx_power_regwrite(ah, targetPowerValT2);
5041 ar9003_hw_calibration_apply(ah, chan->channel);
5043 if (IS_CHAN_2GHZ(chan)) {
5044 if (IS_CHAN_HT40(chan))
5045 i = ALL_TARGET_HT40_0_8_16;
5047 i = ALL_TARGET_HT20_0_8_16;
5049 if (IS_CHAN_HT40(chan))
5050 i = ALL_TARGET_HT40_7;
5052 i = ALL_TARGET_HT20_7;
5054 ah->paprd_target_power = targetPowerValT2[i];
5057 static u16 ath9k_hw_ar9300_get_spur_channel(struct ath_hw *ah,
5063 s32 ar9003_hw_get_tx_gain_idx(struct ath_hw *ah)
5065 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
5067 return (eep->baseEepHeader.txrxgain >> 4) & 0xf; /* bits 7:4 */
5070 s32 ar9003_hw_get_rx_gain_idx(struct ath_hw *ah)
5072 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
5074 return (eep->baseEepHeader.txrxgain) & 0xf; /* bits 3:0 */
5077 u8 *ar9003_get_spur_chan_ptr(struct ath_hw *ah, bool is_2ghz)
5079 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
5082 return eep->modalHeader2G.spurChans;
5084 return eep->modalHeader5G.spurChans;
5087 unsigned int ar9003_get_paprd_scale_factor(struct ath_hw *ah,
5088 struct ath9k_channel *chan)
5090 struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
5092 if (IS_CHAN_2GHZ(chan))
5093 return MS(le32_to_cpu(eep->modalHeader2G.papdRateMaskHt20),
5094 AR9300_PAPRD_SCALE_1);
5096 if (chan->channel >= 5700)
5097 return MS(le32_to_cpu(eep->modalHeader5G.papdRateMaskHt20),
5098 AR9300_PAPRD_SCALE_1);
5099 else if (chan->channel >= 5400)
5100 return MS(le32_to_cpu(eep->modalHeader5G.papdRateMaskHt40),
5101 AR9300_PAPRD_SCALE_2);
5103 return MS(le32_to_cpu(eep->modalHeader5G.papdRateMaskHt40),
5104 AR9300_PAPRD_SCALE_1);
5108 const struct eeprom_ops eep_ar9300_ops = {
5109 .check_eeprom = ath9k_hw_ar9300_check_eeprom,
5110 .get_eeprom = ath9k_hw_ar9300_get_eeprom,
5111 .fill_eeprom = ath9k_hw_ar9300_fill_eeprom,
5112 .dump_eeprom = ath9k_hw_ar9003_dump_eeprom,
5113 .get_eeprom_ver = ath9k_hw_ar9300_get_eeprom_ver,
5114 .get_eeprom_rev = ath9k_hw_ar9300_get_eeprom_rev,
5115 .set_board_values = ath9k_hw_ar9300_set_board_values,
5116 .set_addac = ath9k_hw_ar9300_set_addac,
5117 .set_txpower = ath9k_hw_ar9300_set_txpower,
5118 .get_spur_channel = ath9k_hw_ar9300_get_spur_channel