162306a36Sopenharmony_ci/*
262306a36Sopenharmony_ci * Copyright (c) 2010-2011 Atheros Communications Inc.
362306a36Sopenharmony_ci *
462306a36Sopenharmony_ci * Permission to use, copy, modify, and/or distribute this software for any
562306a36Sopenharmony_ci * purpose with or without fee is hereby granted, provided that the above
662306a36Sopenharmony_ci * copyright notice and this permission notice appear in all copies.
762306a36Sopenharmony_ci *
862306a36Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
962306a36Sopenharmony_ci * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1062306a36Sopenharmony_ci * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1162306a36Sopenharmony_ci * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1262306a36Sopenharmony_ci * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1362306a36Sopenharmony_ci * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1462306a36Sopenharmony_ci * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1562306a36Sopenharmony_ci */
1662306a36Sopenharmony_ci
1762306a36Sopenharmony_ci#include <asm/unaligned.h>
1862306a36Sopenharmony_ci#include <linux/kernel.h>
1962306a36Sopenharmony_ci#include "hw.h"
2062306a36Sopenharmony_ci#include "ar9003_phy.h"
2162306a36Sopenharmony_ci#include "ar9003_eeprom.h"
2262306a36Sopenharmony_ci#include "ar9003_mci.h"
2362306a36Sopenharmony_ci
2462306a36Sopenharmony_ci#define COMP_HDR_LEN 4
2562306a36Sopenharmony_ci#define COMP_CKSUM_LEN 2
2662306a36Sopenharmony_ci
2762306a36Sopenharmony_ci#define LE16(x) cpu_to_le16(x)
2862306a36Sopenharmony_ci#define LE32(x) cpu_to_le32(x)
2962306a36Sopenharmony_ci
3062306a36Sopenharmony_ci/* Local defines to distinguish between extension and control CTL's */
3162306a36Sopenharmony_ci#define EXT_ADDITIVE (0x8000)
3262306a36Sopenharmony_ci#define CTL_11A_EXT (CTL_11A | EXT_ADDITIVE)
3362306a36Sopenharmony_ci#define CTL_11G_EXT (CTL_11G | EXT_ADDITIVE)
3462306a36Sopenharmony_ci#define CTL_11B_EXT (CTL_11B | EXT_ADDITIVE)
3562306a36Sopenharmony_ci
3662306a36Sopenharmony_ci#define SUB_NUM_CTL_MODES_AT_5G_40 2    /* excluding HT40, EXT-OFDM */
3762306a36Sopenharmony_ci#define SUB_NUM_CTL_MODES_AT_2G_40 3    /* excluding HT40, EXT-OFDM, EXT-CCK */
3862306a36Sopenharmony_ci
3962306a36Sopenharmony_ci#define CTL(_tpower, _flag) ((_tpower) | ((_flag) << 6))
4062306a36Sopenharmony_ci
4162306a36Sopenharmony_ci#define EEPROM_DATA_LEN_9485	1088
4262306a36Sopenharmony_ci
4362306a36Sopenharmony_cistatic int ar9003_hw_power_interpolate(int32_t x,
4462306a36Sopenharmony_ci				       int32_t *px, int32_t *py, u_int16_t np);
4562306a36Sopenharmony_ci
4662306a36Sopenharmony_cistatic const struct ar9300_eeprom ar9300_default = {
4762306a36Sopenharmony_ci	.eepromVersion = 2,
4862306a36Sopenharmony_ci	.templateVersion = 2,
4962306a36Sopenharmony_ci	.macAddr = {0, 2, 3, 4, 5, 6},
5062306a36Sopenharmony_ci	.custData = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
5162306a36Sopenharmony_ci		     0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
5262306a36Sopenharmony_ci	.baseEepHeader = {
5362306a36Sopenharmony_ci		.regDmn = { LE16(0), LE16(0x1f) },
5462306a36Sopenharmony_ci		.txrxMask =  0x77, /* 4 bits tx and 4 bits rx */
5562306a36Sopenharmony_ci		.opCapFlags = {
5662306a36Sopenharmony_ci			.opFlags = AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A,
5762306a36Sopenharmony_ci			.eepMisc = AR9300_EEPMISC_LITTLE_ENDIAN,
5862306a36Sopenharmony_ci		},
5962306a36Sopenharmony_ci		.rfSilent = 0,
6062306a36Sopenharmony_ci		.blueToothOptions = 0,
6162306a36Sopenharmony_ci		.deviceCap = 0,
6262306a36Sopenharmony_ci		.deviceType = 5, /* takes lower byte in eeprom location */
6362306a36Sopenharmony_ci		.pwrTableOffset = AR9300_PWR_TABLE_OFFSET,
6462306a36Sopenharmony_ci		.params_for_tuning_caps = {0, 0},
6562306a36Sopenharmony_ci		.featureEnable = 0x0c,
6662306a36Sopenharmony_ci		 /*
6762306a36Sopenharmony_ci		  * bit0 - enable tx temp comp - disabled
6862306a36Sopenharmony_ci		  * bit1 - enable tx volt comp - disabled
6962306a36Sopenharmony_ci		  * bit2 - enable fastClock - enabled
7062306a36Sopenharmony_ci		  * bit3 - enable doubling - enabled
7162306a36Sopenharmony_ci		  * bit4 - enable internal regulator - disabled
7262306a36Sopenharmony_ci		  * bit5 - enable pa predistortion - disabled
7362306a36Sopenharmony_ci		  */
7462306a36Sopenharmony_ci		.miscConfiguration = 0, /* bit0 - turn down drivestrength */
7562306a36Sopenharmony_ci		.eepromWriteEnableGpio = 3,
7662306a36Sopenharmony_ci		.wlanDisableGpio = 0,
7762306a36Sopenharmony_ci		.wlanLedGpio = 8,
7862306a36Sopenharmony_ci		.rxBandSelectGpio = 0xff,
7962306a36Sopenharmony_ci		.txrxgain = 0,
8062306a36Sopenharmony_ci		.swreg = 0,
8162306a36Sopenharmony_ci	 },
8262306a36Sopenharmony_ci	.modalHeader2G = {
8362306a36Sopenharmony_ci	/* ar9300_modal_eep_header  2g */
8462306a36Sopenharmony_ci		/* 4 idle,t1,t2,b(4 bits per setting) */
8562306a36Sopenharmony_ci		.antCtrlCommon = LE32(0x110),
8662306a36Sopenharmony_ci		/* 4 ra1l1, ra2l1, ra1l2, ra2l2, ra12 */
8762306a36Sopenharmony_ci		.antCtrlCommon2 = LE32(0x22222),
8862306a36Sopenharmony_ci
8962306a36Sopenharmony_ci		/*
9062306a36Sopenharmony_ci		 * antCtrlChain[AR9300_MAX_CHAINS]; 6 idle, t, r,
9162306a36Sopenharmony_ci		 * rx1, rx12, b (2 bits each)
9262306a36Sopenharmony_ci		 */
9362306a36Sopenharmony_ci		.antCtrlChain = { LE16(0x150), LE16(0x150), LE16(0x150) },
9462306a36Sopenharmony_ci
9562306a36Sopenharmony_ci		/*
9662306a36Sopenharmony_ci		 * xatten1DB[AR9300_MAX_CHAINS];  3 xatten1_db
9762306a36Sopenharmony_ci		 * for ar9280 (0xa20c/b20c 5:0)
9862306a36Sopenharmony_ci		 */
9962306a36Sopenharmony_ci		.xatten1DB = {0, 0, 0},
10062306a36Sopenharmony_ci
10162306a36Sopenharmony_ci		/*
10262306a36Sopenharmony_ci		 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
10362306a36Sopenharmony_ci		 * for ar9280 (0xa20c/b20c 16:12
10462306a36Sopenharmony_ci		 */
10562306a36Sopenharmony_ci		.xatten1Margin = {0, 0, 0},
10662306a36Sopenharmony_ci		.tempSlope = 36,
10762306a36Sopenharmony_ci		.voltSlope = 0,
10862306a36Sopenharmony_ci
10962306a36Sopenharmony_ci		/*
11062306a36Sopenharmony_ci		 * spurChans[OSPREY_EEPROM_MODAL_SPURS]; spur
11162306a36Sopenharmony_ci		 * channels in usual fbin coding format
11262306a36Sopenharmony_ci		 */
11362306a36Sopenharmony_ci		.spurChans = {0, 0, 0, 0, 0},
11462306a36Sopenharmony_ci
11562306a36Sopenharmony_ci		/*
11662306a36Sopenharmony_ci		 * noiseFloorThreshCh[AR9300_MAX_CHAINS]; 3 Check
11762306a36Sopenharmony_ci		 * if the register is per chain
11862306a36Sopenharmony_ci		 */
11962306a36Sopenharmony_ci		.noiseFloorThreshCh = {-1, 0, 0},
12062306a36Sopenharmony_ci		.reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
12162306a36Sopenharmony_ci		.quick_drop = 0,
12262306a36Sopenharmony_ci		.xpaBiasLvl = 0,
12362306a36Sopenharmony_ci		.txFrameToDataStart = 0x0e,
12462306a36Sopenharmony_ci		.txFrameToPaOn = 0x0e,
12562306a36Sopenharmony_ci		.txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
12662306a36Sopenharmony_ci		.antennaGain = 0,
12762306a36Sopenharmony_ci		.switchSettling = 0x2c,
12862306a36Sopenharmony_ci		.adcDesiredSize = -30,
12962306a36Sopenharmony_ci		.txEndToXpaOff = 0,
13062306a36Sopenharmony_ci		.txEndToRxOn = 0x2,
13162306a36Sopenharmony_ci		.txFrameToXpaOn = 0xe,
13262306a36Sopenharmony_ci		.thresh62 = 28,
13362306a36Sopenharmony_ci		.papdRateMaskHt20 = LE32(0x0cf0e0e0),
13462306a36Sopenharmony_ci		.papdRateMaskHt40 = LE32(0x6cf0e0e0),
13562306a36Sopenharmony_ci		.switchcomspdt = 0,
13662306a36Sopenharmony_ci		.xlna_bias_strength = 0,
13762306a36Sopenharmony_ci		.futureModal = {
13862306a36Sopenharmony_ci			0, 0, 0, 0, 0, 0, 0,
13962306a36Sopenharmony_ci		},
14062306a36Sopenharmony_ci	 },
14162306a36Sopenharmony_ci	.base_ext1 = {
14262306a36Sopenharmony_ci		.ant_div_control = 0,
14362306a36Sopenharmony_ci		.future = {0, 0},
14462306a36Sopenharmony_ci		.tempslopextension = {0, 0, 0, 0, 0, 0, 0, 0}
14562306a36Sopenharmony_ci	},
14662306a36Sopenharmony_ci	.calFreqPier2G = {
14762306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
14862306a36Sopenharmony_ci		FREQ2FBIN(2437, 1),
14962306a36Sopenharmony_ci		FREQ2FBIN(2472, 1),
15062306a36Sopenharmony_ci	 },
15162306a36Sopenharmony_ci	/* ar9300_cal_data_per_freq_op_loop 2g */
15262306a36Sopenharmony_ci	.calPierData2G = {
15362306a36Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
15462306a36Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
15562306a36Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
15662306a36Sopenharmony_ci	 },
15762306a36Sopenharmony_ci	.calTarget_freqbin_Cck = {
15862306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
15962306a36Sopenharmony_ci		FREQ2FBIN(2484, 1),
16062306a36Sopenharmony_ci	 },
16162306a36Sopenharmony_ci	.calTarget_freqbin_2G = {
16262306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
16362306a36Sopenharmony_ci		FREQ2FBIN(2437, 1),
16462306a36Sopenharmony_ci		FREQ2FBIN(2472, 1)
16562306a36Sopenharmony_ci	 },
16662306a36Sopenharmony_ci	.calTarget_freqbin_2GHT20 = {
16762306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
16862306a36Sopenharmony_ci		FREQ2FBIN(2437, 1),
16962306a36Sopenharmony_ci		FREQ2FBIN(2472, 1)
17062306a36Sopenharmony_ci	 },
17162306a36Sopenharmony_ci	.calTarget_freqbin_2GHT40 = {
17262306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
17362306a36Sopenharmony_ci		FREQ2FBIN(2437, 1),
17462306a36Sopenharmony_ci		FREQ2FBIN(2472, 1)
17562306a36Sopenharmony_ci	 },
17662306a36Sopenharmony_ci	.calTargetPowerCck = {
17762306a36Sopenharmony_ci		 /* 1L-5L,5S,11L,11S */
17862306a36Sopenharmony_ci		 { {36, 36, 36, 36} },
17962306a36Sopenharmony_ci		 { {36, 36, 36, 36} },
18062306a36Sopenharmony_ci	},
18162306a36Sopenharmony_ci	.calTargetPower2G = {
18262306a36Sopenharmony_ci		 /* 6-24,36,48,54 */
18362306a36Sopenharmony_ci		 { {32, 32, 28, 24} },
18462306a36Sopenharmony_ci		 { {32, 32, 28, 24} },
18562306a36Sopenharmony_ci		 { {32, 32, 28, 24} },
18662306a36Sopenharmony_ci	},
18762306a36Sopenharmony_ci	.calTargetPower2GHT20 = {
18862306a36Sopenharmony_ci		{ {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
18962306a36Sopenharmony_ci		{ {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
19062306a36Sopenharmony_ci		{ {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
19162306a36Sopenharmony_ci	},
19262306a36Sopenharmony_ci	.calTargetPower2GHT40 = {
19362306a36Sopenharmony_ci		{ {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
19462306a36Sopenharmony_ci		{ {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
19562306a36Sopenharmony_ci		{ {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
19662306a36Sopenharmony_ci	},
19762306a36Sopenharmony_ci	.ctlIndex_2G =  {
19862306a36Sopenharmony_ci		0x11, 0x12, 0x15, 0x17, 0x41, 0x42,
19962306a36Sopenharmony_ci		0x45, 0x47, 0x31, 0x32, 0x35, 0x37,
20062306a36Sopenharmony_ci	},
20162306a36Sopenharmony_ci	.ctl_freqbin_2G = {
20262306a36Sopenharmony_ci		{
20362306a36Sopenharmony_ci			FREQ2FBIN(2412, 1),
20462306a36Sopenharmony_ci			FREQ2FBIN(2417, 1),
20562306a36Sopenharmony_ci			FREQ2FBIN(2457, 1),
20662306a36Sopenharmony_ci			FREQ2FBIN(2462, 1)
20762306a36Sopenharmony_ci		},
20862306a36Sopenharmony_ci		{
20962306a36Sopenharmony_ci			FREQ2FBIN(2412, 1),
21062306a36Sopenharmony_ci			FREQ2FBIN(2417, 1),
21162306a36Sopenharmony_ci			FREQ2FBIN(2462, 1),
21262306a36Sopenharmony_ci			0xFF,
21362306a36Sopenharmony_ci		},
21462306a36Sopenharmony_ci
21562306a36Sopenharmony_ci		{
21662306a36Sopenharmony_ci			FREQ2FBIN(2412, 1),
21762306a36Sopenharmony_ci			FREQ2FBIN(2417, 1),
21862306a36Sopenharmony_ci			FREQ2FBIN(2462, 1),
21962306a36Sopenharmony_ci			0xFF,
22062306a36Sopenharmony_ci		},
22162306a36Sopenharmony_ci		{
22262306a36Sopenharmony_ci			FREQ2FBIN(2422, 1),
22362306a36Sopenharmony_ci			FREQ2FBIN(2427, 1),
22462306a36Sopenharmony_ci			FREQ2FBIN(2447, 1),
22562306a36Sopenharmony_ci			FREQ2FBIN(2452, 1)
22662306a36Sopenharmony_ci		},
22762306a36Sopenharmony_ci
22862306a36Sopenharmony_ci		{
22962306a36Sopenharmony_ci			/* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
23062306a36Sopenharmony_ci			/* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
23162306a36Sopenharmony_ci			/* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
23262306a36Sopenharmony_ci			/* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(2484, 1),
23362306a36Sopenharmony_ci		},
23462306a36Sopenharmony_ci
23562306a36Sopenharmony_ci		{
23662306a36Sopenharmony_ci			/* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
23762306a36Sopenharmony_ci			/* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
23862306a36Sopenharmony_ci			/* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
23962306a36Sopenharmony_ci			0,
24062306a36Sopenharmony_ci		},
24162306a36Sopenharmony_ci
24262306a36Sopenharmony_ci		{
24362306a36Sopenharmony_ci			/* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
24462306a36Sopenharmony_ci			/* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
24562306a36Sopenharmony_ci			FREQ2FBIN(2472, 1),
24662306a36Sopenharmony_ci			0,
24762306a36Sopenharmony_ci		},
24862306a36Sopenharmony_ci
24962306a36Sopenharmony_ci		{
25062306a36Sopenharmony_ci			/* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
25162306a36Sopenharmony_ci			/* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
25262306a36Sopenharmony_ci			/* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
25362306a36Sopenharmony_ci			/* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
25462306a36Sopenharmony_ci		},
25562306a36Sopenharmony_ci
25662306a36Sopenharmony_ci		{
25762306a36Sopenharmony_ci			/* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
25862306a36Sopenharmony_ci			/* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
25962306a36Sopenharmony_ci			/* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
26062306a36Sopenharmony_ci		},
26162306a36Sopenharmony_ci
26262306a36Sopenharmony_ci		{
26362306a36Sopenharmony_ci			/* Data[9].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
26462306a36Sopenharmony_ci			/* Data[9].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
26562306a36Sopenharmony_ci			/* Data[9].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
26662306a36Sopenharmony_ci			0
26762306a36Sopenharmony_ci		},
26862306a36Sopenharmony_ci
26962306a36Sopenharmony_ci		{
27062306a36Sopenharmony_ci			/* Data[10].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
27162306a36Sopenharmony_ci			/* Data[10].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
27262306a36Sopenharmony_ci			/* Data[10].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
27362306a36Sopenharmony_ci			0
27462306a36Sopenharmony_ci		},
27562306a36Sopenharmony_ci
27662306a36Sopenharmony_ci		{
27762306a36Sopenharmony_ci			/* Data[11].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
27862306a36Sopenharmony_ci			/* Data[11].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
27962306a36Sopenharmony_ci			/* Data[11].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
28062306a36Sopenharmony_ci			/* Data[11].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
28162306a36Sopenharmony_ci		}
28262306a36Sopenharmony_ci	 },
28362306a36Sopenharmony_ci	.ctlPowerData_2G = {
28462306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
28562306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
28662306a36Sopenharmony_ci		 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } },
28762306a36Sopenharmony_ci
28862306a36Sopenharmony_ci		 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } },
28962306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
29062306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
29162306a36Sopenharmony_ci
29262306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } },
29362306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
29462306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
29562306a36Sopenharmony_ci
29662306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
29762306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
29862306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
29962306a36Sopenharmony_ci	 },
30062306a36Sopenharmony_ci	.modalHeader5G = {
30162306a36Sopenharmony_ci		/* 4 idle,t1,t2,b (4 bits per setting) */
30262306a36Sopenharmony_ci		.antCtrlCommon = LE32(0x110),
30362306a36Sopenharmony_ci		/* 4 ra1l1, ra2l1, ra1l2,ra2l2,ra12 */
30462306a36Sopenharmony_ci		.antCtrlCommon2 = LE32(0x22222),
30562306a36Sopenharmony_ci		 /* antCtrlChain 6 idle, t,r,rx1,rx12,b (2 bits each) */
30662306a36Sopenharmony_ci		.antCtrlChain = {
30762306a36Sopenharmony_ci			LE16(0x000), LE16(0x000), LE16(0x000),
30862306a36Sopenharmony_ci		},
30962306a36Sopenharmony_ci		 /* xatten1DB 3 xatten1_db for AR9280 (0xa20c/b20c 5:0) */
31062306a36Sopenharmony_ci		.xatten1DB = {0, 0, 0},
31162306a36Sopenharmony_ci
31262306a36Sopenharmony_ci		/*
31362306a36Sopenharmony_ci		 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
31462306a36Sopenharmony_ci		 * for merlin (0xa20c/b20c 16:12
31562306a36Sopenharmony_ci		 */
31662306a36Sopenharmony_ci		.xatten1Margin = {0, 0, 0},
31762306a36Sopenharmony_ci		.tempSlope = 68,
31862306a36Sopenharmony_ci		.voltSlope = 0,
31962306a36Sopenharmony_ci		/* spurChans spur channels in usual fbin coding format */
32062306a36Sopenharmony_ci		.spurChans = {0, 0, 0, 0, 0},
32162306a36Sopenharmony_ci		/* noiseFloorThreshCh Check if the register is per chain */
32262306a36Sopenharmony_ci		.noiseFloorThreshCh = {-1, 0, 0},
32362306a36Sopenharmony_ci		.reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
32462306a36Sopenharmony_ci		.quick_drop = 0,
32562306a36Sopenharmony_ci		.xpaBiasLvl = 0,
32662306a36Sopenharmony_ci		.txFrameToDataStart = 0x0e,
32762306a36Sopenharmony_ci		.txFrameToPaOn = 0x0e,
32862306a36Sopenharmony_ci		.txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
32962306a36Sopenharmony_ci		.antennaGain = 0,
33062306a36Sopenharmony_ci		.switchSettling = 0x2d,
33162306a36Sopenharmony_ci		.adcDesiredSize = -30,
33262306a36Sopenharmony_ci		.txEndToXpaOff = 0,
33362306a36Sopenharmony_ci		.txEndToRxOn = 0x2,
33462306a36Sopenharmony_ci		.txFrameToXpaOn = 0xe,
33562306a36Sopenharmony_ci		.thresh62 = 28,
33662306a36Sopenharmony_ci		.papdRateMaskHt20 = LE32(0x0c80c080),
33762306a36Sopenharmony_ci		.papdRateMaskHt40 = LE32(0x0080c080),
33862306a36Sopenharmony_ci		.switchcomspdt = 0,
33962306a36Sopenharmony_ci		.xlna_bias_strength = 0,
34062306a36Sopenharmony_ci		.futureModal = {
34162306a36Sopenharmony_ci			0, 0, 0, 0, 0, 0, 0,
34262306a36Sopenharmony_ci		},
34362306a36Sopenharmony_ci	 },
34462306a36Sopenharmony_ci	.base_ext2 = {
34562306a36Sopenharmony_ci		.tempSlopeLow = 0,
34662306a36Sopenharmony_ci		.tempSlopeHigh = 0,
34762306a36Sopenharmony_ci		.xatten1DBLow = {0, 0, 0},
34862306a36Sopenharmony_ci		.xatten1MarginLow = {0, 0, 0},
34962306a36Sopenharmony_ci		.xatten1DBHigh = {0, 0, 0},
35062306a36Sopenharmony_ci		.xatten1MarginHigh = {0, 0, 0}
35162306a36Sopenharmony_ci	},
35262306a36Sopenharmony_ci	.calFreqPier5G = {
35362306a36Sopenharmony_ci		FREQ2FBIN(5180, 0),
35462306a36Sopenharmony_ci		FREQ2FBIN(5220, 0),
35562306a36Sopenharmony_ci		FREQ2FBIN(5320, 0),
35662306a36Sopenharmony_ci		FREQ2FBIN(5400, 0),
35762306a36Sopenharmony_ci		FREQ2FBIN(5500, 0),
35862306a36Sopenharmony_ci		FREQ2FBIN(5600, 0),
35962306a36Sopenharmony_ci		FREQ2FBIN(5725, 0),
36062306a36Sopenharmony_ci		FREQ2FBIN(5825, 0)
36162306a36Sopenharmony_ci	},
36262306a36Sopenharmony_ci	.calPierData5G = {
36362306a36Sopenharmony_ci			{
36462306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
36562306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
36662306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
36762306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
36862306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
36962306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
37062306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
37162306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
37262306a36Sopenharmony_ci			},
37362306a36Sopenharmony_ci			{
37462306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
37562306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
37662306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
37762306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
37862306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
37962306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
38062306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
38162306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
38262306a36Sopenharmony_ci			},
38362306a36Sopenharmony_ci			{
38462306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
38562306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
38662306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
38762306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
38862306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
38962306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
39062306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
39162306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
39262306a36Sopenharmony_ci			},
39362306a36Sopenharmony_ci
39462306a36Sopenharmony_ci	},
39562306a36Sopenharmony_ci	.calTarget_freqbin_5G = {
39662306a36Sopenharmony_ci		FREQ2FBIN(5180, 0),
39762306a36Sopenharmony_ci		FREQ2FBIN(5220, 0),
39862306a36Sopenharmony_ci		FREQ2FBIN(5320, 0),
39962306a36Sopenharmony_ci		FREQ2FBIN(5400, 0),
40062306a36Sopenharmony_ci		FREQ2FBIN(5500, 0),
40162306a36Sopenharmony_ci		FREQ2FBIN(5600, 0),
40262306a36Sopenharmony_ci		FREQ2FBIN(5725, 0),
40362306a36Sopenharmony_ci		FREQ2FBIN(5825, 0)
40462306a36Sopenharmony_ci	},
40562306a36Sopenharmony_ci	.calTarget_freqbin_5GHT20 = {
40662306a36Sopenharmony_ci		FREQ2FBIN(5180, 0),
40762306a36Sopenharmony_ci		FREQ2FBIN(5240, 0),
40862306a36Sopenharmony_ci		FREQ2FBIN(5320, 0),
40962306a36Sopenharmony_ci		FREQ2FBIN(5500, 0),
41062306a36Sopenharmony_ci		FREQ2FBIN(5700, 0),
41162306a36Sopenharmony_ci		FREQ2FBIN(5745, 0),
41262306a36Sopenharmony_ci		FREQ2FBIN(5725, 0),
41362306a36Sopenharmony_ci		FREQ2FBIN(5825, 0)
41462306a36Sopenharmony_ci	},
41562306a36Sopenharmony_ci	.calTarget_freqbin_5GHT40 = {
41662306a36Sopenharmony_ci		FREQ2FBIN(5180, 0),
41762306a36Sopenharmony_ci		FREQ2FBIN(5240, 0),
41862306a36Sopenharmony_ci		FREQ2FBIN(5320, 0),
41962306a36Sopenharmony_ci		FREQ2FBIN(5500, 0),
42062306a36Sopenharmony_ci		FREQ2FBIN(5700, 0),
42162306a36Sopenharmony_ci		FREQ2FBIN(5745, 0),
42262306a36Sopenharmony_ci		FREQ2FBIN(5725, 0),
42362306a36Sopenharmony_ci		FREQ2FBIN(5825, 0)
42462306a36Sopenharmony_ci	 },
42562306a36Sopenharmony_ci	.calTargetPower5G = {
42662306a36Sopenharmony_ci		/* 6-24,36,48,54 */
42762306a36Sopenharmony_ci		{ {20, 20, 20, 10} },
42862306a36Sopenharmony_ci		{ {20, 20, 20, 10} },
42962306a36Sopenharmony_ci		{ {20, 20, 20, 10} },
43062306a36Sopenharmony_ci		{ {20, 20, 20, 10} },
43162306a36Sopenharmony_ci		{ {20, 20, 20, 10} },
43262306a36Sopenharmony_ci		{ {20, 20, 20, 10} },
43362306a36Sopenharmony_ci		{ {20, 20, 20, 10} },
43462306a36Sopenharmony_ci		{ {20, 20, 20, 10} },
43562306a36Sopenharmony_ci	 },
43662306a36Sopenharmony_ci	.calTargetPower5GHT20 = {
43762306a36Sopenharmony_ci		/*
43862306a36Sopenharmony_ci		 * 0_8_16,1-3_9-11_17-19,
43962306a36Sopenharmony_ci		 * 4,5,6,7,12,13,14,15,20,21,22,23
44062306a36Sopenharmony_ci		 */
44162306a36Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
44262306a36Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
44362306a36Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
44462306a36Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
44562306a36Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
44662306a36Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
44762306a36Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
44862306a36Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
44962306a36Sopenharmony_ci	 },
45062306a36Sopenharmony_ci	.calTargetPower5GHT40 =  {
45162306a36Sopenharmony_ci		/*
45262306a36Sopenharmony_ci		 * 0_8_16,1-3_9-11_17-19,
45362306a36Sopenharmony_ci		 * 4,5,6,7,12,13,14,15,20,21,22,23
45462306a36Sopenharmony_ci		 */
45562306a36Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
45662306a36Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
45762306a36Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
45862306a36Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
45962306a36Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
46062306a36Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
46162306a36Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
46262306a36Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
46362306a36Sopenharmony_ci	 },
46462306a36Sopenharmony_ci	.ctlIndex_5G =  {
46562306a36Sopenharmony_ci		0x10, 0x16, 0x18, 0x40, 0x46,
46662306a36Sopenharmony_ci		0x48, 0x30, 0x36, 0x38
46762306a36Sopenharmony_ci	},
46862306a36Sopenharmony_ci	.ctl_freqbin_5G =  {
46962306a36Sopenharmony_ci		{
47062306a36Sopenharmony_ci			/* Data[0].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
47162306a36Sopenharmony_ci			/* Data[0].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
47262306a36Sopenharmony_ci			/* Data[0].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
47362306a36Sopenharmony_ci			/* Data[0].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
47462306a36Sopenharmony_ci			/* Data[0].ctlEdges[4].bChannel */ FREQ2FBIN(5600, 0),
47562306a36Sopenharmony_ci			/* Data[0].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
47662306a36Sopenharmony_ci			/* Data[0].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
47762306a36Sopenharmony_ci			/* Data[0].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
47862306a36Sopenharmony_ci		},
47962306a36Sopenharmony_ci		{
48062306a36Sopenharmony_ci			/* Data[1].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
48162306a36Sopenharmony_ci			/* Data[1].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
48262306a36Sopenharmony_ci			/* Data[1].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
48362306a36Sopenharmony_ci			/* Data[1].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
48462306a36Sopenharmony_ci			/* Data[1].ctlEdges[4].bChannel */ FREQ2FBIN(5520, 0),
48562306a36Sopenharmony_ci			/* Data[1].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
48662306a36Sopenharmony_ci			/* Data[1].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
48762306a36Sopenharmony_ci			/* Data[1].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
48862306a36Sopenharmony_ci		},
48962306a36Sopenharmony_ci
49062306a36Sopenharmony_ci		{
49162306a36Sopenharmony_ci			/* Data[2].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
49262306a36Sopenharmony_ci			/* Data[2].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
49362306a36Sopenharmony_ci			/* Data[2].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
49462306a36Sopenharmony_ci			/* Data[2].ctlEdges[3].bChannel */ FREQ2FBIN(5310, 0),
49562306a36Sopenharmony_ci			/* Data[2].ctlEdges[4].bChannel */ FREQ2FBIN(5510, 0),
49662306a36Sopenharmony_ci			/* Data[2].ctlEdges[5].bChannel */ FREQ2FBIN(5550, 0),
49762306a36Sopenharmony_ci			/* Data[2].ctlEdges[6].bChannel */ FREQ2FBIN(5670, 0),
49862306a36Sopenharmony_ci			/* Data[2].ctlEdges[7].bChannel */ FREQ2FBIN(5755, 0)
49962306a36Sopenharmony_ci		},
50062306a36Sopenharmony_ci
50162306a36Sopenharmony_ci		{
50262306a36Sopenharmony_ci			/* Data[3].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
50362306a36Sopenharmony_ci			/* Data[3].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
50462306a36Sopenharmony_ci			/* Data[3].ctlEdges[2].bChannel */ FREQ2FBIN(5260, 0),
50562306a36Sopenharmony_ci			/* Data[3].ctlEdges[3].bChannel */ FREQ2FBIN(5320, 0),
50662306a36Sopenharmony_ci			/* Data[3].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
50762306a36Sopenharmony_ci			/* Data[3].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
50862306a36Sopenharmony_ci			/* Data[3].ctlEdges[6].bChannel */ 0xFF,
50962306a36Sopenharmony_ci			/* Data[3].ctlEdges[7].bChannel */ 0xFF,
51062306a36Sopenharmony_ci		},
51162306a36Sopenharmony_ci
51262306a36Sopenharmony_ci		{
51362306a36Sopenharmony_ci			/* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
51462306a36Sopenharmony_ci			/* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
51562306a36Sopenharmony_ci			/* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(5500, 0),
51662306a36Sopenharmony_ci			/* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(5700, 0),
51762306a36Sopenharmony_ci			/* Data[4].ctlEdges[4].bChannel */ 0xFF,
51862306a36Sopenharmony_ci			/* Data[4].ctlEdges[5].bChannel */ 0xFF,
51962306a36Sopenharmony_ci			/* Data[4].ctlEdges[6].bChannel */ 0xFF,
52062306a36Sopenharmony_ci			/* Data[4].ctlEdges[7].bChannel */ 0xFF,
52162306a36Sopenharmony_ci		},
52262306a36Sopenharmony_ci
52362306a36Sopenharmony_ci		{
52462306a36Sopenharmony_ci			/* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
52562306a36Sopenharmony_ci			/* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(5270, 0),
52662306a36Sopenharmony_ci			/* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(5310, 0),
52762306a36Sopenharmony_ci			/* Data[5].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
52862306a36Sopenharmony_ci			/* Data[5].ctlEdges[4].bChannel */ FREQ2FBIN(5590, 0),
52962306a36Sopenharmony_ci			/* Data[5].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
53062306a36Sopenharmony_ci			/* Data[5].ctlEdges[6].bChannel */ 0xFF,
53162306a36Sopenharmony_ci			/* Data[5].ctlEdges[7].bChannel */ 0xFF
53262306a36Sopenharmony_ci		},
53362306a36Sopenharmony_ci
53462306a36Sopenharmony_ci		{
53562306a36Sopenharmony_ci			/* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
53662306a36Sopenharmony_ci			/* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
53762306a36Sopenharmony_ci			/* Data[6].ctlEdges[2].bChannel */ FREQ2FBIN(5220, 0),
53862306a36Sopenharmony_ci			/* Data[6].ctlEdges[3].bChannel */ FREQ2FBIN(5260, 0),
53962306a36Sopenharmony_ci			/* Data[6].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
54062306a36Sopenharmony_ci			/* Data[6].ctlEdges[5].bChannel */ FREQ2FBIN(5600, 0),
54162306a36Sopenharmony_ci			/* Data[6].ctlEdges[6].bChannel */ FREQ2FBIN(5700, 0),
54262306a36Sopenharmony_ci			/* Data[6].ctlEdges[7].bChannel */ FREQ2FBIN(5745, 0)
54362306a36Sopenharmony_ci		},
54462306a36Sopenharmony_ci
54562306a36Sopenharmony_ci		{
54662306a36Sopenharmony_ci			/* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
54762306a36Sopenharmony_ci			/* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
54862306a36Sopenharmony_ci			/* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(5320, 0),
54962306a36Sopenharmony_ci			/* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
55062306a36Sopenharmony_ci			/* Data[7].ctlEdges[4].bChannel */ FREQ2FBIN(5560, 0),
55162306a36Sopenharmony_ci			/* Data[7].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
55262306a36Sopenharmony_ci			/* Data[7].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
55362306a36Sopenharmony_ci			/* Data[7].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
55462306a36Sopenharmony_ci		},
55562306a36Sopenharmony_ci
55662306a36Sopenharmony_ci		{
55762306a36Sopenharmony_ci			/* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
55862306a36Sopenharmony_ci			/* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
55962306a36Sopenharmony_ci			/* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
56062306a36Sopenharmony_ci			/* Data[8].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
56162306a36Sopenharmony_ci			/* Data[8].ctlEdges[4].bChannel */ FREQ2FBIN(5550, 0),
56262306a36Sopenharmony_ci			/* Data[8].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
56362306a36Sopenharmony_ci			/* Data[8].ctlEdges[6].bChannel */ FREQ2FBIN(5755, 0),
56462306a36Sopenharmony_ci			/* Data[8].ctlEdges[7].bChannel */ FREQ2FBIN(5795, 0)
56562306a36Sopenharmony_ci		}
56662306a36Sopenharmony_ci	 },
56762306a36Sopenharmony_ci	.ctlPowerData_5G = {
56862306a36Sopenharmony_ci		{
56962306a36Sopenharmony_ci			{
57062306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
57162306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
57262306a36Sopenharmony_ci			}
57362306a36Sopenharmony_ci		},
57462306a36Sopenharmony_ci		{
57562306a36Sopenharmony_ci			{
57662306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
57762306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
57862306a36Sopenharmony_ci			}
57962306a36Sopenharmony_ci		},
58062306a36Sopenharmony_ci		{
58162306a36Sopenharmony_ci			{
58262306a36Sopenharmony_ci				CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 1),
58362306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
58462306a36Sopenharmony_ci			}
58562306a36Sopenharmony_ci		},
58662306a36Sopenharmony_ci		{
58762306a36Sopenharmony_ci			{
58862306a36Sopenharmony_ci				CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0),
58962306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
59062306a36Sopenharmony_ci			}
59162306a36Sopenharmony_ci		},
59262306a36Sopenharmony_ci		{
59362306a36Sopenharmony_ci			{
59462306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
59562306a36Sopenharmony_ci				CTL(60, 0), CTL(60, 0), CTL(60, 0), CTL(60, 0),
59662306a36Sopenharmony_ci			}
59762306a36Sopenharmony_ci		},
59862306a36Sopenharmony_ci		{
59962306a36Sopenharmony_ci			{
60062306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
60162306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
60262306a36Sopenharmony_ci			}
60362306a36Sopenharmony_ci		},
60462306a36Sopenharmony_ci		{
60562306a36Sopenharmony_ci			{
60662306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
60762306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
60862306a36Sopenharmony_ci			}
60962306a36Sopenharmony_ci		},
61062306a36Sopenharmony_ci		{
61162306a36Sopenharmony_ci			{
61262306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
61362306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
61462306a36Sopenharmony_ci			}
61562306a36Sopenharmony_ci		},
61662306a36Sopenharmony_ci		{
61762306a36Sopenharmony_ci			{
61862306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 1), CTL(60, 1),
61962306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
62062306a36Sopenharmony_ci			}
62162306a36Sopenharmony_ci		},
62262306a36Sopenharmony_ci	 }
62362306a36Sopenharmony_ci};
62462306a36Sopenharmony_ci
62562306a36Sopenharmony_cistatic const struct ar9300_eeprom ar9300_x113 = {
62662306a36Sopenharmony_ci	.eepromVersion = 2,
62762306a36Sopenharmony_ci	.templateVersion = 6,
62862306a36Sopenharmony_ci	.macAddr = {0x00, 0x03, 0x7f, 0x0, 0x0, 0x0},
62962306a36Sopenharmony_ci	.custData = {"x113-023-f0000"},
63062306a36Sopenharmony_ci	.baseEepHeader = {
63162306a36Sopenharmony_ci		.regDmn = { LE16(0), LE16(0x1f) },
63262306a36Sopenharmony_ci		.txrxMask =  0x77, /* 4 bits tx and 4 bits rx */
63362306a36Sopenharmony_ci		.opCapFlags = {
63462306a36Sopenharmony_ci			.opFlags = AR5416_OPFLAGS_11A,
63562306a36Sopenharmony_ci			.eepMisc = AR9300_EEPMISC_LITTLE_ENDIAN,
63662306a36Sopenharmony_ci		},
63762306a36Sopenharmony_ci		.rfSilent = 0,
63862306a36Sopenharmony_ci		.blueToothOptions = 0,
63962306a36Sopenharmony_ci		.deviceCap = 0,
64062306a36Sopenharmony_ci		.deviceType = 5, /* takes lower byte in eeprom location */
64162306a36Sopenharmony_ci		.pwrTableOffset = AR9300_PWR_TABLE_OFFSET,
64262306a36Sopenharmony_ci		.params_for_tuning_caps = {0, 0},
64362306a36Sopenharmony_ci		.featureEnable = 0x0d,
64462306a36Sopenharmony_ci		 /*
64562306a36Sopenharmony_ci		  * bit0 - enable tx temp comp - disabled
64662306a36Sopenharmony_ci		  * bit1 - enable tx volt comp - disabled
64762306a36Sopenharmony_ci		  * bit2 - enable fastClock - enabled
64862306a36Sopenharmony_ci		  * bit3 - enable doubling - enabled
64962306a36Sopenharmony_ci		  * bit4 - enable internal regulator - disabled
65062306a36Sopenharmony_ci		  * bit5 - enable pa predistortion - disabled
65162306a36Sopenharmony_ci		  */
65262306a36Sopenharmony_ci		.miscConfiguration = 0, /* bit0 - turn down drivestrength */
65362306a36Sopenharmony_ci		.eepromWriteEnableGpio = 6,
65462306a36Sopenharmony_ci		.wlanDisableGpio = 0,
65562306a36Sopenharmony_ci		.wlanLedGpio = 8,
65662306a36Sopenharmony_ci		.rxBandSelectGpio = 0xff,
65762306a36Sopenharmony_ci		.txrxgain = 0x21,
65862306a36Sopenharmony_ci		.swreg = 0,
65962306a36Sopenharmony_ci	 },
66062306a36Sopenharmony_ci	.modalHeader2G = {
66162306a36Sopenharmony_ci	/* ar9300_modal_eep_header  2g */
66262306a36Sopenharmony_ci		/* 4 idle,t1,t2,b(4 bits per setting) */
66362306a36Sopenharmony_ci		.antCtrlCommon = LE32(0x110),
66462306a36Sopenharmony_ci		/* 4 ra1l1, ra2l1, ra1l2, ra2l2, ra12 */
66562306a36Sopenharmony_ci		.antCtrlCommon2 = LE32(0x44444),
66662306a36Sopenharmony_ci
66762306a36Sopenharmony_ci		/*
66862306a36Sopenharmony_ci		 * antCtrlChain[AR9300_MAX_CHAINS]; 6 idle, t, r,
66962306a36Sopenharmony_ci		 * rx1, rx12, b (2 bits each)
67062306a36Sopenharmony_ci		 */
67162306a36Sopenharmony_ci		.antCtrlChain = { LE16(0x150), LE16(0x150), LE16(0x150) },
67262306a36Sopenharmony_ci
67362306a36Sopenharmony_ci		/*
67462306a36Sopenharmony_ci		 * xatten1DB[AR9300_MAX_CHAINS];  3 xatten1_db
67562306a36Sopenharmony_ci		 * for ar9280 (0xa20c/b20c 5:0)
67662306a36Sopenharmony_ci		 */
67762306a36Sopenharmony_ci		.xatten1DB = {0, 0, 0},
67862306a36Sopenharmony_ci
67962306a36Sopenharmony_ci		/*
68062306a36Sopenharmony_ci		 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
68162306a36Sopenharmony_ci		 * for ar9280 (0xa20c/b20c 16:12
68262306a36Sopenharmony_ci		 */
68362306a36Sopenharmony_ci		.xatten1Margin = {0, 0, 0},
68462306a36Sopenharmony_ci		.tempSlope = 25,
68562306a36Sopenharmony_ci		.voltSlope = 0,
68662306a36Sopenharmony_ci
68762306a36Sopenharmony_ci		/*
68862306a36Sopenharmony_ci		 * spurChans[OSPREY_EEPROM_MODAL_SPURS]; spur
68962306a36Sopenharmony_ci		 * channels in usual fbin coding format
69062306a36Sopenharmony_ci		 */
69162306a36Sopenharmony_ci		.spurChans = {FREQ2FBIN(2464, 1), 0, 0, 0, 0},
69262306a36Sopenharmony_ci
69362306a36Sopenharmony_ci		/*
69462306a36Sopenharmony_ci		 * noiseFloorThreshCh[AR9300_MAX_CHAINS]; 3 Check
69562306a36Sopenharmony_ci		 * if the register is per chain
69662306a36Sopenharmony_ci		 */
69762306a36Sopenharmony_ci		.noiseFloorThreshCh = {-1, 0, 0},
69862306a36Sopenharmony_ci		.reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
69962306a36Sopenharmony_ci		.quick_drop = 0,
70062306a36Sopenharmony_ci		.xpaBiasLvl = 0,
70162306a36Sopenharmony_ci		.txFrameToDataStart = 0x0e,
70262306a36Sopenharmony_ci		.txFrameToPaOn = 0x0e,
70362306a36Sopenharmony_ci		.txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
70462306a36Sopenharmony_ci		.antennaGain = 0,
70562306a36Sopenharmony_ci		.switchSettling = 0x2c,
70662306a36Sopenharmony_ci		.adcDesiredSize = -30,
70762306a36Sopenharmony_ci		.txEndToXpaOff = 0,
70862306a36Sopenharmony_ci		.txEndToRxOn = 0x2,
70962306a36Sopenharmony_ci		.txFrameToXpaOn = 0xe,
71062306a36Sopenharmony_ci		.thresh62 = 28,
71162306a36Sopenharmony_ci		.papdRateMaskHt20 = LE32(0x0c80c080),
71262306a36Sopenharmony_ci		.papdRateMaskHt40 = LE32(0x0080c080),
71362306a36Sopenharmony_ci		.switchcomspdt = 0,
71462306a36Sopenharmony_ci		.xlna_bias_strength = 0,
71562306a36Sopenharmony_ci		.futureModal = {
71662306a36Sopenharmony_ci			0, 0, 0, 0, 0, 0, 0,
71762306a36Sopenharmony_ci		},
71862306a36Sopenharmony_ci	 },
71962306a36Sopenharmony_ci	 .base_ext1 = {
72062306a36Sopenharmony_ci		.ant_div_control = 0,
72162306a36Sopenharmony_ci		.future = {0, 0},
72262306a36Sopenharmony_ci		.tempslopextension = {0, 0, 0, 0, 0, 0, 0, 0}
72362306a36Sopenharmony_ci	 },
72462306a36Sopenharmony_ci	.calFreqPier2G = {
72562306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
72662306a36Sopenharmony_ci		FREQ2FBIN(2437, 1),
72762306a36Sopenharmony_ci		FREQ2FBIN(2472, 1),
72862306a36Sopenharmony_ci	 },
72962306a36Sopenharmony_ci	/* ar9300_cal_data_per_freq_op_loop 2g */
73062306a36Sopenharmony_ci	.calPierData2G = {
73162306a36Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
73262306a36Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
73362306a36Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
73462306a36Sopenharmony_ci	 },
73562306a36Sopenharmony_ci	.calTarget_freqbin_Cck = {
73662306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
73762306a36Sopenharmony_ci		FREQ2FBIN(2472, 1),
73862306a36Sopenharmony_ci	 },
73962306a36Sopenharmony_ci	.calTarget_freqbin_2G = {
74062306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
74162306a36Sopenharmony_ci		FREQ2FBIN(2437, 1),
74262306a36Sopenharmony_ci		FREQ2FBIN(2472, 1)
74362306a36Sopenharmony_ci	 },
74462306a36Sopenharmony_ci	.calTarget_freqbin_2GHT20 = {
74562306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
74662306a36Sopenharmony_ci		FREQ2FBIN(2437, 1),
74762306a36Sopenharmony_ci		FREQ2FBIN(2472, 1)
74862306a36Sopenharmony_ci	 },
74962306a36Sopenharmony_ci	.calTarget_freqbin_2GHT40 = {
75062306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
75162306a36Sopenharmony_ci		FREQ2FBIN(2437, 1),
75262306a36Sopenharmony_ci		FREQ2FBIN(2472, 1)
75362306a36Sopenharmony_ci	 },
75462306a36Sopenharmony_ci	.calTargetPowerCck = {
75562306a36Sopenharmony_ci		 /* 1L-5L,5S,11L,11S */
75662306a36Sopenharmony_ci		 { {34, 34, 34, 34} },
75762306a36Sopenharmony_ci		 { {34, 34, 34, 34} },
75862306a36Sopenharmony_ci	},
75962306a36Sopenharmony_ci	.calTargetPower2G = {
76062306a36Sopenharmony_ci		 /* 6-24,36,48,54 */
76162306a36Sopenharmony_ci		 { {34, 34, 32, 32} },
76262306a36Sopenharmony_ci		 { {34, 34, 32, 32} },
76362306a36Sopenharmony_ci		 { {34, 34, 32, 32} },
76462306a36Sopenharmony_ci	},
76562306a36Sopenharmony_ci	.calTargetPower2GHT20 = {
76662306a36Sopenharmony_ci		{ {32, 32, 32, 32, 32, 28, 32, 32, 30, 28, 0, 0, 0, 0} },
76762306a36Sopenharmony_ci		{ {32, 32, 32, 32, 32, 28, 32, 32, 30, 28, 0, 0, 0, 0} },
76862306a36Sopenharmony_ci		{ {32, 32, 32, 32, 32, 28, 32, 32, 30, 28, 0, 0, 0, 0} },
76962306a36Sopenharmony_ci	},
77062306a36Sopenharmony_ci	.calTargetPower2GHT40 = {
77162306a36Sopenharmony_ci		{ {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 0, 0, 0, 0} },
77262306a36Sopenharmony_ci		{ {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 0, 0, 0, 0} },
77362306a36Sopenharmony_ci		{ {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 0, 0, 0, 0} },
77462306a36Sopenharmony_ci	},
77562306a36Sopenharmony_ci	.ctlIndex_2G =  {
77662306a36Sopenharmony_ci		0x11, 0x12, 0x15, 0x17, 0x41, 0x42,
77762306a36Sopenharmony_ci		0x45, 0x47, 0x31, 0x32, 0x35, 0x37,
77862306a36Sopenharmony_ci	},
77962306a36Sopenharmony_ci	.ctl_freqbin_2G = {
78062306a36Sopenharmony_ci		{
78162306a36Sopenharmony_ci			FREQ2FBIN(2412, 1),
78262306a36Sopenharmony_ci			FREQ2FBIN(2417, 1),
78362306a36Sopenharmony_ci			FREQ2FBIN(2457, 1),
78462306a36Sopenharmony_ci			FREQ2FBIN(2462, 1)
78562306a36Sopenharmony_ci		},
78662306a36Sopenharmony_ci		{
78762306a36Sopenharmony_ci			FREQ2FBIN(2412, 1),
78862306a36Sopenharmony_ci			FREQ2FBIN(2417, 1),
78962306a36Sopenharmony_ci			FREQ2FBIN(2462, 1),
79062306a36Sopenharmony_ci			0xFF,
79162306a36Sopenharmony_ci		},
79262306a36Sopenharmony_ci
79362306a36Sopenharmony_ci		{
79462306a36Sopenharmony_ci			FREQ2FBIN(2412, 1),
79562306a36Sopenharmony_ci			FREQ2FBIN(2417, 1),
79662306a36Sopenharmony_ci			FREQ2FBIN(2462, 1),
79762306a36Sopenharmony_ci			0xFF,
79862306a36Sopenharmony_ci		},
79962306a36Sopenharmony_ci		{
80062306a36Sopenharmony_ci			FREQ2FBIN(2422, 1),
80162306a36Sopenharmony_ci			FREQ2FBIN(2427, 1),
80262306a36Sopenharmony_ci			FREQ2FBIN(2447, 1),
80362306a36Sopenharmony_ci			FREQ2FBIN(2452, 1)
80462306a36Sopenharmony_ci		},
80562306a36Sopenharmony_ci
80662306a36Sopenharmony_ci		{
80762306a36Sopenharmony_ci			/* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
80862306a36Sopenharmony_ci			/* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
80962306a36Sopenharmony_ci			/* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
81062306a36Sopenharmony_ci			/* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(2484, 1),
81162306a36Sopenharmony_ci		},
81262306a36Sopenharmony_ci
81362306a36Sopenharmony_ci		{
81462306a36Sopenharmony_ci			/* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
81562306a36Sopenharmony_ci			/* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
81662306a36Sopenharmony_ci			/* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
81762306a36Sopenharmony_ci			0,
81862306a36Sopenharmony_ci		},
81962306a36Sopenharmony_ci
82062306a36Sopenharmony_ci		{
82162306a36Sopenharmony_ci			/* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
82262306a36Sopenharmony_ci			/* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
82362306a36Sopenharmony_ci			FREQ2FBIN(2472, 1),
82462306a36Sopenharmony_ci			0,
82562306a36Sopenharmony_ci		},
82662306a36Sopenharmony_ci
82762306a36Sopenharmony_ci		{
82862306a36Sopenharmony_ci			/* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
82962306a36Sopenharmony_ci			/* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
83062306a36Sopenharmony_ci			/* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
83162306a36Sopenharmony_ci			/* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
83262306a36Sopenharmony_ci		},
83362306a36Sopenharmony_ci
83462306a36Sopenharmony_ci		{
83562306a36Sopenharmony_ci			/* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
83662306a36Sopenharmony_ci			/* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
83762306a36Sopenharmony_ci			/* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
83862306a36Sopenharmony_ci		},
83962306a36Sopenharmony_ci
84062306a36Sopenharmony_ci		{
84162306a36Sopenharmony_ci			/* Data[9].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
84262306a36Sopenharmony_ci			/* Data[9].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
84362306a36Sopenharmony_ci			/* Data[9].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
84462306a36Sopenharmony_ci			0
84562306a36Sopenharmony_ci		},
84662306a36Sopenharmony_ci
84762306a36Sopenharmony_ci		{
84862306a36Sopenharmony_ci			/* Data[10].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
84962306a36Sopenharmony_ci			/* Data[10].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
85062306a36Sopenharmony_ci			/* Data[10].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
85162306a36Sopenharmony_ci			0
85262306a36Sopenharmony_ci		},
85362306a36Sopenharmony_ci
85462306a36Sopenharmony_ci		{
85562306a36Sopenharmony_ci			/* Data[11].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
85662306a36Sopenharmony_ci			/* Data[11].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
85762306a36Sopenharmony_ci			/* Data[11].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
85862306a36Sopenharmony_ci			/* Data[11].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
85962306a36Sopenharmony_ci		}
86062306a36Sopenharmony_ci	 },
86162306a36Sopenharmony_ci	.ctlPowerData_2G = {
86262306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
86362306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
86462306a36Sopenharmony_ci		 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } },
86562306a36Sopenharmony_ci
86662306a36Sopenharmony_ci		 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } },
86762306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
86862306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
86962306a36Sopenharmony_ci
87062306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } },
87162306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
87262306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
87362306a36Sopenharmony_ci
87462306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
87562306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
87662306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
87762306a36Sopenharmony_ci	 },
87862306a36Sopenharmony_ci	.modalHeader5G = {
87962306a36Sopenharmony_ci		/* 4 idle,t1,t2,b (4 bits per setting) */
88062306a36Sopenharmony_ci		.antCtrlCommon = LE32(0x220),
88162306a36Sopenharmony_ci		/* 4 ra1l1, ra2l1, ra1l2,ra2l2,ra12 */
88262306a36Sopenharmony_ci		.antCtrlCommon2 = LE32(0x11111),
88362306a36Sopenharmony_ci		 /* antCtrlChain 6 idle, t,r,rx1,rx12,b (2 bits each) */
88462306a36Sopenharmony_ci		.antCtrlChain = {
88562306a36Sopenharmony_ci			LE16(0x150), LE16(0x150), LE16(0x150),
88662306a36Sopenharmony_ci		},
88762306a36Sopenharmony_ci		 /* xatten1DB 3 xatten1_db for AR9280 (0xa20c/b20c 5:0) */
88862306a36Sopenharmony_ci		.xatten1DB = {0, 0, 0},
88962306a36Sopenharmony_ci
89062306a36Sopenharmony_ci		/*
89162306a36Sopenharmony_ci		 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
89262306a36Sopenharmony_ci		 * for merlin (0xa20c/b20c 16:12
89362306a36Sopenharmony_ci		 */
89462306a36Sopenharmony_ci		.xatten1Margin = {0, 0, 0},
89562306a36Sopenharmony_ci		.tempSlope = 68,
89662306a36Sopenharmony_ci		.voltSlope = 0,
89762306a36Sopenharmony_ci		/* spurChans spur channels in usual fbin coding format */
89862306a36Sopenharmony_ci		.spurChans = {FREQ2FBIN(5500, 0), 0, 0, 0, 0},
89962306a36Sopenharmony_ci		/* noiseFloorThreshCh Check if the register is per chain */
90062306a36Sopenharmony_ci		.noiseFloorThreshCh = {-1, 0, 0},
90162306a36Sopenharmony_ci		.reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
90262306a36Sopenharmony_ci		.quick_drop = 0,
90362306a36Sopenharmony_ci		.xpaBiasLvl = 0xf,
90462306a36Sopenharmony_ci		.txFrameToDataStart = 0x0e,
90562306a36Sopenharmony_ci		.txFrameToPaOn = 0x0e,
90662306a36Sopenharmony_ci		.txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
90762306a36Sopenharmony_ci		.antennaGain = 0,
90862306a36Sopenharmony_ci		.switchSettling = 0x2d,
90962306a36Sopenharmony_ci		.adcDesiredSize = -30,
91062306a36Sopenharmony_ci		.txEndToXpaOff = 0,
91162306a36Sopenharmony_ci		.txEndToRxOn = 0x2,
91262306a36Sopenharmony_ci		.txFrameToXpaOn = 0xe,
91362306a36Sopenharmony_ci		.thresh62 = 28,
91462306a36Sopenharmony_ci		.papdRateMaskHt20 = LE32(0x0cf0e0e0),
91562306a36Sopenharmony_ci		.papdRateMaskHt40 = LE32(0x6cf0e0e0),
91662306a36Sopenharmony_ci		.switchcomspdt = 0,
91762306a36Sopenharmony_ci		.xlna_bias_strength = 0,
91862306a36Sopenharmony_ci		.futureModal = {
91962306a36Sopenharmony_ci			0, 0, 0, 0, 0, 0, 0,
92062306a36Sopenharmony_ci		},
92162306a36Sopenharmony_ci	 },
92262306a36Sopenharmony_ci	.base_ext2 = {
92362306a36Sopenharmony_ci		.tempSlopeLow = 72,
92462306a36Sopenharmony_ci		.tempSlopeHigh = 105,
92562306a36Sopenharmony_ci		.xatten1DBLow = {0, 0, 0},
92662306a36Sopenharmony_ci		.xatten1MarginLow = {0, 0, 0},
92762306a36Sopenharmony_ci		.xatten1DBHigh = {0, 0, 0},
92862306a36Sopenharmony_ci		.xatten1MarginHigh = {0, 0, 0}
92962306a36Sopenharmony_ci	 },
93062306a36Sopenharmony_ci	.calFreqPier5G = {
93162306a36Sopenharmony_ci		FREQ2FBIN(5180, 0),
93262306a36Sopenharmony_ci		FREQ2FBIN(5240, 0),
93362306a36Sopenharmony_ci		FREQ2FBIN(5320, 0),
93462306a36Sopenharmony_ci		FREQ2FBIN(5400, 0),
93562306a36Sopenharmony_ci		FREQ2FBIN(5500, 0),
93662306a36Sopenharmony_ci		FREQ2FBIN(5600, 0),
93762306a36Sopenharmony_ci		FREQ2FBIN(5745, 0),
93862306a36Sopenharmony_ci		FREQ2FBIN(5785, 0)
93962306a36Sopenharmony_ci	},
94062306a36Sopenharmony_ci	.calPierData5G = {
94162306a36Sopenharmony_ci			{
94262306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
94362306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
94462306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
94562306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
94662306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
94762306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
94862306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
94962306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
95062306a36Sopenharmony_ci			},
95162306a36Sopenharmony_ci			{
95262306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
95362306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
95462306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
95562306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
95662306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
95762306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
95862306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
95962306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
96062306a36Sopenharmony_ci			},
96162306a36Sopenharmony_ci			{
96262306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
96362306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
96462306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
96562306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
96662306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
96762306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
96862306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
96962306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
97062306a36Sopenharmony_ci			},
97162306a36Sopenharmony_ci
97262306a36Sopenharmony_ci	},
97362306a36Sopenharmony_ci	.calTarget_freqbin_5G = {
97462306a36Sopenharmony_ci		FREQ2FBIN(5180, 0),
97562306a36Sopenharmony_ci		FREQ2FBIN(5220, 0),
97662306a36Sopenharmony_ci		FREQ2FBIN(5320, 0),
97762306a36Sopenharmony_ci		FREQ2FBIN(5400, 0),
97862306a36Sopenharmony_ci		FREQ2FBIN(5500, 0),
97962306a36Sopenharmony_ci		FREQ2FBIN(5600, 0),
98062306a36Sopenharmony_ci		FREQ2FBIN(5745, 0),
98162306a36Sopenharmony_ci		FREQ2FBIN(5785, 0)
98262306a36Sopenharmony_ci	},
98362306a36Sopenharmony_ci	.calTarget_freqbin_5GHT20 = {
98462306a36Sopenharmony_ci		FREQ2FBIN(5180, 0),
98562306a36Sopenharmony_ci		FREQ2FBIN(5240, 0),
98662306a36Sopenharmony_ci		FREQ2FBIN(5320, 0),
98762306a36Sopenharmony_ci		FREQ2FBIN(5400, 0),
98862306a36Sopenharmony_ci		FREQ2FBIN(5500, 0),
98962306a36Sopenharmony_ci		FREQ2FBIN(5700, 0),
99062306a36Sopenharmony_ci		FREQ2FBIN(5745, 0),
99162306a36Sopenharmony_ci		FREQ2FBIN(5825, 0)
99262306a36Sopenharmony_ci	},
99362306a36Sopenharmony_ci	.calTarget_freqbin_5GHT40 = {
99462306a36Sopenharmony_ci		FREQ2FBIN(5190, 0),
99562306a36Sopenharmony_ci		FREQ2FBIN(5230, 0),
99662306a36Sopenharmony_ci		FREQ2FBIN(5320, 0),
99762306a36Sopenharmony_ci		FREQ2FBIN(5410, 0),
99862306a36Sopenharmony_ci		FREQ2FBIN(5510, 0),
99962306a36Sopenharmony_ci		FREQ2FBIN(5670, 0),
100062306a36Sopenharmony_ci		FREQ2FBIN(5755, 0),
100162306a36Sopenharmony_ci		FREQ2FBIN(5825, 0)
100262306a36Sopenharmony_ci	 },
100362306a36Sopenharmony_ci	.calTargetPower5G = {
100462306a36Sopenharmony_ci		/* 6-24,36,48,54 */
100562306a36Sopenharmony_ci		{ {42, 40, 40, 34} },
100662306a36Sopenharmony_ci		{ {42, 40, 40, 34} },
100762306a36Sopenharmony_ci		{ {42, 40, 40, 34} },
100862306a36Sopenharmony_ci		{ {42, 40, 40, 34} },
100962306a36Sopenharmony_ci		{ {42, 40, 40, 34} },
101062306a36Sopenharmony_ci		{ {42, 40, 40, 34} },
101162306a36Sopenharmony_ci		{ {42, 40, 40, 34} },
101262306a36Sopenharmony_ci		{ {42, 40, 40, 34} },
101362306a36Sopenharmony_ci	 },
101462306a36Sopenharmony_ci	.calTargetPower5GHT20 = {
101562306a36Sopenharmony_ci		/*
101662306a36Sopenharmony_ci		 * 0_8_16,1-3_9-11_17-19,
101762306a36Sopenharmony_ci		 * 4,5,6,7,12,13,14,15,20,21,22,23
101862306a36Sopenharmony_ci		 */
101962306a36Sopenharmony_ci		{ {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
102062306a36Sopenharmony_ci		{ {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
102162306a36Sopenharmony_ci		{ {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
102262306a36Sopenharmony_ci		{ {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
102362306a36Sopenharmony_ci		{ {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
102462306a36Sopenharmony_ci		{ {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
102562306a36Sopenharmony_ci		{ {38, 38, 38, 38, 32, 28, 38, 38, 32, 28, 38, 38, 32, 26} },
102662306a36Sopenharmony_ci		{ {36, 36, 36, 36, 32, 28, 36, 36, 32, 28, 36, 36, 32, 26} },
102762306a36Sopenharmony_ci	 },
102862306a36Sopenharmony_ci	.calTargetPower5GHT40 =  {
102962306a36Sopenharmony_ci		/*
103062306a36Sopenharmony_ci		 * 0_8_16,1-3_9-11_17-19,
103162306a36Sopenharmony_ci		 * 4,5,6,7,12,13,14,15,20,21,22,23
103262306a36Sopenharmony_ci		 */
103362306a36Sopenharmony_ci		{ {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
103462306a36Sopenharmony_ci		{ {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
103562306a36Sopenharmony_ci		{ {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
103662306a36Sopenharmony_ci		{ {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
103762306a36Sopenharmony_ci		{ {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
103862306a36Sopenharmony_ci		{ {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
103962306a36Sopenharmony_ci		{ {36, 36, 36, 36, 30, 26, 36, 36, 30, 26, 36, 36, 30, 24} },
104062306a36Sopenharmony_ci		{ {34, 34, 34, 34, 30, 26, 34, 34, 30, 26, 34, 34, 30, 24} },
104162306a36Sopenharmony_ci	 },
104262306a36Sopenharmony_ci	.ctlIndex_5G =  {
104362306a36Sopenharmony_ci		0x10, 0x16, 0x18, 0x40, 0x46,
104462306a36Sopenharmony_ci		0x48, 0x30, 0x36, 0x38
104562306a36Sopenharmony_ci	},
104662306a36Sopenharmony_ci	.ctl_freqbin_5G =  {
104762306a36Sopenharmony_ci		{
104862306a36Sopenharmony_ci			/* Data[0].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
104962306a36Sopenharmony_ci			/* Data[0].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
105062306a36Sopenharmony_ci			/* Data[0].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
105162306a36Sopenharmony_ci			/* Data[0].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
105262306a36Sopenharmony_ci			/* Data[0].ctlEdges[4].bChannel */ FREQ2FBIN(5600, 0),
105362306a36Sopenharmony_ci			/* Data[0].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
105462306a36Sopenharmony_ci			/* Data[0].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
105562306a36Sopenharmony_ci			/* Data[0].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
105662306a36Sopenharmony_ci		},
105762306a36Sopenharmony_ci		{
105862306a36Sopenharmony_ci			/* Data[1].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
105962306a36Sopenharmony_ci			/* Data[1].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
106062306a36Sopenharmony_ci			/* Data[1].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
106162306a36Sopenharmony_ci			/* Data[1].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
106262306a36Sopenharmony_ci			/* Data[1].ctlEdges[4].bChannel */ FREQ2FBIN(5520, 0),
106362306a36Sopenharmony_ci			/* Data[1].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
106462306a36Sopenharmony_ci			/* Data[1].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
106562306a36Sopenharmony_ci			/* Data[1].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
106662306a36Sopenharmony_ci		},
106762306a36Sopenharmony_ci
106862306a36Sopenharmony_ci		{
106962306a36Sopenharmony_ci			/* Data[2].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
107062306a36Sopenharmony_ci			/* Data[2].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
107162306a36Sopenharmony_ci			/* Data[2].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
107262306a36Sopenharmony_ci			/* Data[2].ctlEdges[3].bChannel */ FREQ2FBIN(5310, 0),
107362306a36Sopenharmony_ci			/* Data[2].ctlEdges[4].bChannel */ FREQ2FBIN(5510, 0),
107462306a36Sopenharmony_ci			/* Data[2].ctlEdges[5].bChannel */ FREQ2FBIN(5550, 0),
107562306a36Sopenharmony_ci			/* Data[2].ctlEdges[6].bChannel */ FREQ2FBIN(5670, 0),
107662306a36Sopenharmony_ci			/* Data[2].ctlEdges[7].bChannel */ FREQ2FBIN(5755, 0)
107762306a36Sopenharmony_ci		},
107862306a36Sopenharmony_ci
107962306a36Sopenharmony_ci		{
108062306a36Sopenharmony_ci			/* Data[3].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
108162306a36Sopenharmony_ci			/* Data[3].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
108262306a36Sopenharmony_ci			/* Data[3].ctlEdges[2].bChannel */ FREQ2FBIN(5260, 0),
108362306a36Sopenharmony_ci			/* Data[3].ctlEdges[3].bChannel */ FREQ2FBIN(5320, 0),
108462306a36Sopenharmony_ci			/* Data[3].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
108562306a36Sopenharmony_ci			/* Data[3].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
108662306a36Sopenharmony_ci			/* Data[3].ctlEdges[6].bChannel */ 0xFF,
108762306a36Sopenharmony_ci			/* Data[3].ctlEdges[7].bChannel */ 0xFF,
108862306a36Sopenharmony_ci		},
108962306a36Sopenharmony_ci
109062306a36Sopenharmony_ci		{
109162306a36Sopenharmony_ci			/* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
109262306a36Sopenharmony_ci			/* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
109362306a36Sopenharmony_ci			/* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(5500, 0),
109462306a36Sopenharmony_ci			/* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(5700, 0),
109562306a36Sopenharmony_ci			/* Data[4].ctlEdges[4].bChannel */ 0xFF,
109662306a36Sopenharmony_ci			/* Data[4].ctlEdges[5].bChannel */ 0xFF,
109762306a36Sopenharmony_ci			/* Data[4].ctlEdges[6].bChannel */ 0xFF,
109862306a36Sopenharmony_ci			/* Data[4].ctlEdges[7].bChannel */ 0xFF,
109962306a36Sopenharmony_ci		},
110062306a36Sopenharmony_ci
110162306a36Sopenharmony_ci		{
110262306a36Sopenharmony_ci			/* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
110362306a36Sopenharmony_ci			/* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(5270, 0),
110462306a36Sopenharmony_ci			/* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(5310, 0),
110562306a36Sopenharmony_ci			/* Data[5].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
110662306a36Sopenharmony_ci			/* Data[5].ctlEdges[4].bChannel */ FREQ2FBIN(5590, 0),
110762306a36Sopenharmony_ci			/* Data[5].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
110862306a36Sopenharmony_ci			/* Data[5].ctlEdges[6].bChannel */ 0xFF,
110962306a36Sopenharmony_ci			/* Data[5].ctlEdges[7].bChannel */ 0xFF
111062306a36Sopenharmony_ci		},
111162306a36Sopenharmony_ci
111262306a36Sopenharmony_ci		{
111362306a36Sopenharmony_ci			/* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
111462306a36Sopenharmony_ci			/* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
111562306a36Sopenharmony_ci			/* Data[6].ctlEdges[2].bChannel */ FREQ2FBIN(5220, 0),
111662306a36Sopenharmony_ci			/* Data[6].ctlEdges[3].bChannel */ FREQ2FBIN(5260, 0),
111762306a36Sopenharmony_ci			/* Data[6].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
111862306a36Sopenharmony_ci			/* Data[6].ctlEdges[5].bChannel */ FREQ2FBIN(5600, 0),
111962306a36Sopenharmony_ci			/* Data[6].ctlEdges[6].bChannel */ FREQ2FBIN(5700, 0),
112062306a36Sopenharmony_ci			/* Data[6].ctlEdges[7].bChannel */ FREQ2FBIN(5745, 0)
112162306a36Sopenharmony_ci		},
112262306a36Sopenharmony_ci
112362306a36Sopenharmony_ci		{
112462306a36Sopenharmony_ci			/* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
112562306a36Sopenharmony_ci			/* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
112662306a36Sopenharmony_ci			/* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(5320, 0),
112762306a36Sopenharmony_ci			/* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
112862306a36Sopenharmony_ci			/* Data[7].ctlEdges[4].bChannel */ FREQ2FBIN(5560, 0),
112962306a36Sopenharmony_ci			/* Data[7].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
113062306a36Sopenharmony_ci			/* Data[7].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
113162306a36Sopenharmony_ci			/* Data[7].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
113262306a36Sopenharmony_ci		},
113362306a36Sopenharmony_ci
113462306a36Sopenharmony_ci		{
113562306a36Sopenharmony_ci			/* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
113662306a36Sopenharmony_ci			/* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
113762306a36Sopenharmony_ci			/* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
113862306a36Sopenharmony_ci			/* Data[8].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
113962306a36Sopenharmony_ci			/* Data[8].ctlEdges[4].bChannel */ FREQ2FBIN(5550, 0),
114062306a36Sopenharmony_ci			/* Data[8].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
114162306a36Sopenharmony_ci			/* Data[8].ctlEdges[6].bChannel */ FREQ2FBIN(5755, 0),
114262306a36Sopenharmony_ci			/* Data[8].ctlEdges[7].bChannel */ FREQ2FBIN(5795, 0)
114362306a36Sopenharmony_ci		}
114462306a36Sopenharmony_ci	 },
114562306a36Sopenharmony_ci	.ctlPowerData_5G = {
114662306a36Sopenharmony_ci		{
114762306a36Sopenharmony_ci			{
114862306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
114962306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
115062306a36Sopenharmony_ci			}
115162306a36Sopenharmony_ci		},
115262306a36Sopenharmony_ci		{
115362306a36Sopenharmony_ci			{
115462306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
115562306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
115662306a36Sopenharmony_ci			}
115762306a36Sopenharmony_ci		},
115862306a36Sopenharmony_ci		{
115962306a36Sopenharmony_ci			{
116062306a36Sopenharmony_ci				CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 1),
116162306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
116262306a36Sopenharmony_ci			}
116362306a36Sopenharmony_ci		},
116462306a36Sopenharmony_ci		{
116562306a36Sopenharmony_ci			{
116662306a36Sopenharmony_ci				CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0),
116762306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
116862306a36Sopenharmony_ci			}
116962306a36Sopenharmony_ci		},
117062306a36Sopenharmony_ci		{
117162306a36Sopenharmony_ci			{
117262306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
117362306a36Sopenharmony_ci				CTL(60, 0), CTL(60, 0), CTL(60, 0), CTL(60, 0),
117462306a36Sopenharmony_ci			}
117562306a36Sopenharmony_ci		},
117662306a36Sopenharmony_ci		{
117762306a36Sopenharmony_ci			{
117862306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
117962306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
118062306a36Sopenharmony_ci			}
118162306a36Sopenharmony_ci		},
118262306a36Sopenharmony_ci		{
118362306a36Sopenharmony_ci			{
118462306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
118562306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
118662306a36Sopenharmony_ci			}
118762306a36Sopenharmony_ci		},
118862306a36Sopenharmony_ci		{
118962306a36Sopenharmony_ci			{
119062306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
119162306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
119262306a36Sopenharmony_ci			}
119362306a36Sopenharmony_ci		},
119462306a36Sopenharmony_ci		{
119562306a36Sopenharmony_ci			{
119662306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 1), CTL(60, 1),
119762306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
119862306a36Sopenharmony_ci			}
119962306a36Sopenharmony_ci		},
120062306a36Sopenharmony_ci	 }
120162306a36Sopenharmony_ci};
120262306a36Sopenharmony_ci
120362306a36Sopenharmony_ci
120462306a36Sopenharmony_cistatic const struct ar9300_eeprom ar9300_h112 = {
120562306a36Sopenharmony_ci	.eepromVersion = 2,
120662306a36Sopenharmony_ci	.templateVersion = 3,
120762306a36Sopenharmony_ci	.macAddr = {0x00, 0x03, 0x7f, 0x0, 0x0, 0x0},
120862306a36Sopenharmony_ci	.custData = {"h112-241-f0000"},
120962306a36Sopenharmony_ci	.baseEepHeader = {
121062306a36Sopenharmony_ci		.regDmn = { LE16(0), LE16(0x1f) },
121162306a36Sopenharmony_ci		.txrxMask =  0x77, /* 4 bits tx and 4 bits rx */
121262306a36Sopenharmony_ci		.opCapFlags = {
121362306a36Sopenharmony_ci			.opFlags = AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A,
121462306a36Sopenharmony_ci			.eepMisc = AR9300_EEPMISC_LITTLE_ENDIAN,
121562306a36Sopenharmony_ci		},
121662306a36Sopenharmony_ci		.rfSilent = 0,
121762306a36Sopenharmony_ci		.blueToothOptions = 0,
121862306a36Sopenharmony_ci		.deviceCap = 0,
121962306a36Sopenharmony_ci		.deviceType = 5, /* takes lower byte in eeprom location */
122062306a36Sopenharmony_ci		.pwrTableOffset = AR9300_PWR_TABLE_OFFSET,
122162306a36Sopenharmony_ci		.params_for_tuning_caps = {0, 0},
122262306a36Sopenharmony_ci		.featureEnable = 0x0d,
122362306a36Sopenharmony_ci		/*
122462306a36Sopenharmony_ci		 * bit0 - enable tx temp comp - disabled
122562306a36Sopenharmony_ci		 * bit1 - enable tx volt comp - disabled
122662306a36Sopenharmony_ci		 * bit2 - enable fastClock - enabled
122762306a36Sopenharmony_ci		 * bit3 - enable doubling - enabled
122862306a36Sopenharmony_ci		 * bit4 - enable internal regulator - disabled
122962306a36Sopenharmony_ci		 * bit5 - enable pa predistortion - disabled
123062306a36Sopenharmony_ci		 */
123162306a36Sopenharmony_ci		.miscConfiguration = 0, /* bit0 - turn down drivestrength */
123262306a36Sopenharmony_ci		.eepromWriteEnableGpio = 6,
123362306a36Sopenharmony_ci		.wlanDisableGpio = 0,
123462306a36Sopenharmony_ci		.wlanLedGpio = 8,
123562306a36Sopenharmony_ci		.rxBandSelectGpio = 0xff,
123662306a36Sopenharmony_ci		.txrxgain = 0x10,
123762306a36Sopenharmony_ci		.swreg = 0,
123862306a36Sopenharmony_ci	},
123962306a36Sopenharmony_ci	.modalHeader2G = {
124062306a36Sopenharmony_ci		/* ar9300_modal_eep_header  2g */
124162306a36Sopenharmony_ci		/* 4 idle,t1,t2,b(4 bits per setting) */
124262306a36Sopenharmony_ci		.antCtrlCommon = LE32(0x110),
124362306a36Sopenharmony_ci		/* 4 ra1l1, ra2l1, ra1l2, ra2l2, ra12 */
124462306a36Sopenharmony_ci		.antCtrlCommon2 = LE32(0x44444),
124562306a36Sopenharmony_ci
124662306a36Sopenharmony_ci		/*
124762306a36Sopenharmony_ci		 * antCtrlChain[AR9300_MAX_CHAINS]; 6 idle, t, r,
124862306a36Sopenharmony_ci		 * rx1, rx12, b (2 bits each)
124962306a36Sopenharmony_ci		 */
125062306a36Sopenharmony_ci		.antCtrlChain = { LE16(0x150), LE16(0x150), LE16(0x150) },
125162306a36Sopenharmony_ci
125262306a36Sopenharmony_ci		/*
125362306a36Sopenharmony_ci		 * xatten1DB[AR9300_MAX_CHAINS];  3 xatten1_db
125462306a36Sopenharmony_ci		 * for ar9280 (0xa20c/b20c 5:0)
125562306a36Sopenharmony_ci		 */
125662306a36Sopenharmony_ci		.xatten1DB = {0, 0, 0},
125762306a36Sopenharmony_ci
125862306a36Sopenharmony_ci		/*
125962306a36Sopenharmony_ci		 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
126062306a36Sopenharmony_ci		 * for ar9280 (0xa20c/b20c 16:12
126162306a36Sopenharmony_ci		 */
126262306a36Sopenharmony_ci		.xatten1Margin = {0, 0, 0},
126362306a36Sopenharmony_ci		.tempSlope = 25,
126462306a36Sopenharmony_ci		.voltSlope = 0,
126562306a36Sopenharmony_ci
126662306a36Sopenharmony_ci		/*
126762306a36Sopenharmony_ci		 * spurChans[OSPREY_EEPROM_MODAL_SPURS]; spur
126862306a36Sopenharmony_ci		 * channels in usual fbin coding format
126962306a36Sopenharmony_ci		 */
127062306a36Sopenharmony_ci		.spurChans = {FREQ2FBIN(2464, 1), 0, 0, 0, 0},
127162306a36Sopenharmony_ci
127262306a36Sopenharmony_ci		/*
127362306a36Sopenharmony_ci		 * noiseFloorThreshCh[AR9300_MAX_CHAINS]; 3 Check
127462306a36Sopenharmony_ci		 * if the register is per chain
127562306a36Sopenharmony_ci		 */
127662306a36Sopenharmony_ci		.noiseFloorThreshCh = {-1, 0, 0},
127762306a36Sopenharmony_ci		.reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
127862306a36Sopenharmony_ci		.quick_drop = 0,
127962306a36Sopenharmony_ci		.xpaBiasLvl = 0,
128062306a36Sopenharmony_ci		.txFrameToDataStart = 0x0e,
128162306a36Sopenharmony_ci		.txFrameToPaOn = 0x0e,
128262306a36Sopenharmony_ci		.txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
128362306a36Sopenharmony_ci		.antennaGain = 0,
128462306a36Sopenharmony_ci		.switchSettling = 0x2c,
128562306a36Sopenharmony_ci		.adcDesiredSize = -30,
128662306a36Sopenharmony_ci		.txEndToXpaOff = 0,
128762306a36Sopenharmony_ci		.txEndToRxOn = 0x2,
128862306a36Sopenharmony_ci		.txFrameToXpaOn = 0xe,
128962306a36Sopenharmony_ci		.thresh62 = 28,
129062306a36Sopenharmony_ci		.papdRateMaskHt20 = LE32(0x0c80c080),
129162306a36Sopenharmony_ci		.papdRateMaskHt40 = LE32(0x0080c080),
129262306a36Sopenharmony_ci		.switchcomspdt = 0,
129362306a36Sopenharmony_ci		.xlna_bias_strength = 0,
129462306a36Sopenharmony_ci		.futureModal = {
129562306a36Sopenharmony_ci			0, 0, 0, 0, 0, 0, 0,
129662306a36Sopenharmony_ci		},
129762306a36Sopenharmony_ci	},
129862306a36Sopenharmony_ci	.base_ext1 = {
129962306a36Sopenharmony_ci		.ant_div_control = 0,
130062306a36Sopenharmony_ci		.future = {0, 0},
130162306a36Sopenharmony_ci		.tempslopextension = {0, 0, 0, 0, 0, 0, 0, 0}
130262306a36Sopenharmony_ci	},
130362306a36Sopenharmony_ci	.calFreqPier2G = {
130462306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
130562306a36Sopenharmony_ci		FREQ2FBIN(2437, 1),
130662306a36Sopenharmony_ci		FREQ2FBIN(2462, 1),
130762306a36Sopenharmony_ci	},
130862306a36Sopenharmony_ci	/* ar9300_cal_data_per_freq_op_loop 2g */
130962306a36Sopenharmony_ci	.calPierData2G = {
131062306a36Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
131162306a36Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
131262306a36Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
131362306a36Sopenharmony_ci	},
131462306a36Sopenharmony_ci	.calTarget_freqbin_Cck = {
131562306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
131662306a36Sopenharmony_ci		FREQ2FBIN(2472, 1),
131762306a36Sopenharmony_ci	},
131862306a36Sopenharmony_ci	.calTarget_freqbin_2G = {
131962306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
132062306a36Sopenharmony_ci		FREQ2FBIN(2437, 1),
132162306a36Sopenharmony_ci		FREQ2FBIN(2472, 1)
132262306a36Sopenharmony_ci	},
132362306a36Sopenharmony_ci	.calTarget_freqbin_2GHT20 = {
132462306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
132562306a36Sopenharmony_ci		FREQ2FBIN(2437, 1),
132662306a36Sopenharmony_ci		FREQ2FBIN(2472, 1)
132762306a36Sopenharmony_ci	},
132862306a36Sopenharmony_ci	.calTarget_freqbin_2GHT40 = {
132962306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
133062306a36Sopenharmony_ci		FREQ2FBIN(2437, 1),
133162306a36Sopenharmony_ci		FREQ2FBIN(2472, 1)
133262306a36Sopenharmony_ci	},
133362306a36Sopenharmony_ci	.calTargetPowerCck = {
133462306a36Sopenharmony_ci		/* 1L-5L,5S,11L,11S */
133562306a36Sopenharmony_ci		{ {34, 34, 34, 34} },
133662306a36Sopenharmony_ci		{ {34, 34, 34, 34} },
133762306a36Sopenharmony_ci	},
133862306a36Sopenharmony_ci	.calTargetPower2G = {
133962306a36Sopenharmony_ci		/* 6-24,36,48,54 */
134062306a36Sopenharmony_ci		{ {34, 34, 32, 32} },
134162306a36Sopenharmony_ci		{ {34, 34, 32, 32} },
134262306a36Sopenharmony_ci		{ {34, 34, 32, 32} },
134362306a36Sopenharmony_ci	},
134462306a36Sopenharmony_ci	.calTargetPower2GHT20 = {
134562306a36Sopenharmony_ci		{ {32, 32, 32, 32, 32, 30, 32, 32, 30, 28, 28, 28, 28, 24} },
134662306a36Sopenharmony_ci		{ {32, 32, 32, 32, 32, 30, 32, 32, 30, 28, 28, 28, 28, 24} },
134762306a36Sopenharmony_ci		{ {32, 32, 32, 32, 32, 30, 32, 32, 30, 28, 28, 28, 28, 24} },
134862306a36Sopenharmony_ci	},
134962306a36Sopenharmony_ci	.calTargetPower2GHT40 = {
135062306a36Sopenharmony_ci		{ {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 26, 26, 26, 22} },
135162306a36Sopenharmony_ci		{ {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 26, 26, 26, 22} },
135262306a36Sopenharmony_ci		{ {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 26, 26, 26, 22} },
135362306a36Sopenharmony_ci	},
135462306a36Sopenharmony_ci	.ctlIndex_2G =  {
135562306a36Sopenharmony_ci		0x11, 0x12, 0x15, 0x17, 0x41, 0x42,
135662306a36Sopenharmony_ci		0x45, 0x47, 0x31, 0x32, 0x35, 0x37,
135762306a36Sopenharmony_ci	},
135862306a36Sopenharmony_ci	.ctl_freqbin_2G = {
135962306a36Sopenharmony_ci		{
136062306a36Sopenharmony_ci			FREQ2FBIN(2412, 1),
136162306a36Sopenharmony_ci			FREQ2FBIN(2417, 1),
136262306a36Sopenharmony_ci			FREQ2FBIN(2457, 1),
136362306a36Sopenharmony_ci			FREQ2FBIN(2462, 1)
136462306a36Sopenharmony_ci		},
136562306a36Sopenharmony_ci		{
136662306a36Sopenharmony_ci			FREQ2FBIN(2412, 1),
136762306a36Sopenharmony_ci			FREQ2FBIN(2417, 1),
136862306a36Sopenharmony_ci			FREQ2FBIN(2462, 1),
136962306a36Sopenharmony_ci			0xFF,
137062306a36Sopenharmony_ci		},
137162306a36Sopenharmony_ci
137262306a36Sopenharmony_ci		{
137362306a36Sopenharmony_ci			FREQ2FBIN(2412, 1),
137462306a36Sopenharmony_ci			FREQ2FBIN(2417, 1),
137562306a36Sopenharmony_ci			FREQ2FBIN(2462, 1),
137662306a36Sopenharmony_ci			0xFF,
137762306a36Sopenharmony_ci		},
137862306a36Sopenharmony_ci		{
137962306a36Sopenharmony_ci			FREQ2FBIN(2422, 1),
138062306a36Sopenharmony_ci			FREQ2FBIN(2427, 1),
138162306a36Sopenharmony_ci			FREQ2FBIN(2447, 1),
138262306a36Sopenharmony_ci			FREQ2FBIN(2452, 1)
138362306a36Sopenharmony_ci		},
138462306a36Sopenharmony_ci
138562306a36Sopenharmony_ci		{
138662306a36Sopenharmony_ci			/* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
138762306a36Sopenharmony_ci			/* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
138862306a36Sopenharmony_ci			/* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
138962306a36Sopenharmony_ci			/* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(2484, 1),
139062306a36Sopenharmony_ci		},
139162306a36Sopenharmony_ci
139262306a36Sopenharmony_ci		{
139362306a36Sopenharmony_ci			/* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
139462306a36Sopenharmony_ci			/* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
139562306a36Sopenharmony_ci			/* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
139662306a36Sopenharmony_ci			0,
139762306a36Sopenharmony_ci		},
139862306a36Sopenharmony_ci
139962306a36Sopenharmony_ci		{
140062306a36Sopenharmony_ci			/* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
140162306a36Sopenharmony_ci			/* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
140262306a36Sopenharmony_ci			FREQ2FBIN(2472, 1),
140362306a36Sopenharmony_ci			0,
140462306a36Sopenharmony_ci		},
140562306a36Sopenharmony_ci
140662306a36Sopenharmony_ci		{
140762306a36Sopenharmony_ci			/* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
140862306a36Sopenharmony_ci			/* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
140962306a36Sopenharmony_ci			/* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
141062306a36Sopenharmony_ci			/* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
141162306a36Sopenharmony_ci		},
141262306a36Sopenharmony_ci
141362306a36Sopenharmony_ci		{
141462306a36Sopenharmony_ci			/* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
141562306a36Sopenharmony_ci			/* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
141662306a36Sopenharmony_ci			/* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
141762306a36Sopenharmony_ci		},
141862306a36Sopenharmony_ci
141962306a36Sopenharmony_ci		{
142062306a36Sopenharmony_ci			/* Data[9].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
142162306a36Sopenharmony_ci			/* Data[9].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
142262306a36Sopenharmony_ci			/* Data[9].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
142362306a36Sopenharmony_ci			0
142462306a36Sopenharmony_ci		},
142562306a36Sopenharmony_ci
142662306a36Sopenharmony_ci		{
142762306a36Sopenharmony_ci			/* Data[10].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
142862306a36Sopenharmony_ci			/* Data[10].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
142962306a36Sopenharmony_ci			/* Data[10].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
143062306a36Sopenharmony_ci			0
143162306a36Sopenharmony_ci		},
143262306a36Sopenharmony_ci
143362306a36Sopenharmony_ci		{
143462306a36Sopenharmony_ci			/* Data[11].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
143562306a36Sopenharmony_ci			/* Data[11].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
143662306a36Sopenharmony_ci			/* Data[11].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
143762306a36Sopenharmony_ci			/* Data[11].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
143862306a36Sopenharmony_ci		}
143962306a36Sopenharmony_ci	},
144062306a36Sopenharmony_ci	.ctlPowerData_2G = {
144162306a36Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
144262306a36Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
144362306a36Sopenharmony_ci		{ { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } },
144462306a36Sopenharmony_ci
144562306a36Sopenharmony_ci		{ { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } },
144662306a36Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
144762306a36Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
144862306a36Sopenharmony_ci
144962306a36Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } },
145062306a36Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
145162306a36Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
145262306a36Sopenharmony_ci
145362306a36Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
145462306a36Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
145562306a36Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
145662306a36Sopenharmony_ci	},
145762306a36Sopenharmony_ci	.modalHeader5G = {
145862306a36Sopenharmony_ci		/* 4 idle,t1,t2,b (4 bits per setting) */
145962306a36Sopenharmony_ci		.antCtrlCommon = LE32(0x220),
146062306a36Sopenharmony_ci		/* 4 ra1l1, ra2l1, ra1l2,ra2l2,ra12 */
146162306a36Sopenharmony_ci		.antCtrlCommon2 = LE32(0x44444),
146262306a36Sopenharmony_ci		/* antCtrlChain 6 idle, t,r,rx1,rx12,b (2 bits each) */
146362306a36Sopenharmony_ci		.antCtrlChain = {
146462306a36Sopenharmony_ci			LE16(0x150), LE16(0x150), LE16(0x150),
146562306a36Sopenharmony_ci		},
146662306a36Sopenharmony_ci		/* xatten1DB 3 xatten1_db for AR9280 (0xa20c/b20c 5:0) */
146762306a36Sopenharmony_ci		.xatten1DB = {0, 0, 0},
146862306a36Sopenharmony_ci
146962306a36Sopenharmony_ci		/*
147062306a36Sopenharmony_ci		 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
147162306a36Sopenharmony_ci		 * for merlin (0xa20c/b20c 16:12
147262306a36Sopenharmony_ci		 */
147362306a36Sopenharmony_ci		.xatten1Margin = {0, 0, 0},
147462306a36Sopenharmony_ci		.tempSlope = 45,
147562306a36Sopenharmony_ci		.voltSlope = 0,
147662306a36Sopenharmony_ci		/* spurChans spur channels in usual fbin coding format */
147762306a36Sopenharmony_ci		.spurChans = {0, 0, 0, 0, 0},
147862306a36Sopenharmony_ci		/* noiseFloorThreshCh Check if the register is per chain */
147962306a36Sopenharmony_ci		.noiseFloorThreshCh = {-1, 0, 0},
148062306a36Sopenharmony_ci		.reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
148162306a36Sopenharmony_ci		.quick_drop = 0,
148262306a36Sopenharmony_ci		.xpaBiasLvl = 0,
148362306a36Sopenharmony_ci		.txFrameToDataStart = 0x0e,
148462306a36Sopenharmony_ci		.txFrameToPaOn = 0x0e,
148562306a36Sopenharmony_ci		.txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
148662306a36Sopenharmony_ci		.antennaGain = 0,
148762306a36Sopenharmony_ci		.switchSettling = 0x2d,
148862306a36Sopenharmony_ci		.adcDesiredSize = -30,
148962306a36Sopenharmony_ci		.txEndToXpaOff = 0,
149062306a36Sopenharmony_ci		.txEndToRxOn = 0x2,
149162306a36Sopenharmony_ci		.txFrameToXpaOn = 0xe,
149262306a36Sopenharmony_ci		.thresh62 = 28,
149362306a36Sopenharmony_ci		.papdRateMaskHt20 = LE32(0x0cf0e0e0),
149462306a36Sopenharmony_ci		.papdRateMaskHt40 = LE32(0x6cf0e0e0),
149562306a36Sopenharmony_ci		.switchcomspdt = 0,
149662306a36Sopenharmony_ci		.xlna_bias_strength = 0,
149762306a36Sopenharmony_ci		.futureModal = {
149862306a36Sopenharmony_ci			0, 0, 0, 0, 0, 0, 0,
149962306a36Sopenharmony_ci		},
150062306a36Sopenharmony_ci	},
150162306a36Sopenharmony_ci	.base_ext2 = {
150262306a36Sopenharmony_ci		.tempSlopeLow = 40,
150362306a36Sopenharmony_ci		.tempSlopeHigh = 50,
150462306a36Sopenharmony_ci		.xatten1DBLow = {0, 0, 0},
150562306a36Sopenharmony_ci		.xatten1MarginLow = {0, 0, 0},
150662306a36Sopenharmony_ci		.xatten1DBHigh = {0, 0, 0},
150762306a36Sopenharmony_ci		.xatten1MarginHigh = {0, 0, 0}
150862306a36Sopenharmony_ci	},
150962306a36Sopenharmony_ci	.calFreqPier5G = {
151062306a36Sopenharmony_ci		FREQ2FBIN(5180, 0),
151162306a36Sopenharmony_ci		FREQ2FBIN(5220, 0),
151262306a36Sopenharmony_ci		FREQ2FBIN(5320, 0),
151362306a36Sopenharmony_ci		FREQ2FBIN(5400, 0),
151462306a36Sopenharmony_ci		FREQ2FBIN(5500, 0),
151562306a36Sopenharmony_ci		FREQ2FBIN(5600, 0),
151662306a36Sopenharmony_ci		FREQ2FBIN(5700, 0),
151762306a36Sopenharmony_ci		FREQ2FBIN(5785, 0)
151862306a36Sopenharmony_ci	},
151962306a36Sopenharmony_ci	.calPierData5G = {
152062306a36Sopenharmony_ci		{
152162306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
152262306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
152362306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
152462306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
152562306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
152662306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
152762306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
152862306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
152962306a36Sopenharmony_ci		},
153062306a36Sopenharmony_ci		{
153162306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
153262306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
153362306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
153462306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
153562306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
153662306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
153762306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
153862306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
153962306a36Sopenharmony_ci		},
154062306a36Sopenharmony_ci		{
154162306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
154262306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
154362306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
154462306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
154562306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
154662306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
154762306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
154862306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
154962306a36Sopenharmony_ci		},
155062306a36Sopenharmony_ci
155162306a36Sopenharmony_ci	},
155262306a36Sopenharmony_ci	.calTarget_freqbin_5G = {
155362306a36Sopenharmony_ci		FREQ2FBIN(5180, 0),
155462306a36Sopenharmony_ci		FREQ2FBIN(5240, 0),
155562306a36Sopenharmony_ci		FREQ2FBIN(5320, 0),
155662306a36Sopenharmony_ci		FREQ2FBIN(5400, 0),
155762306a36Sopenharmony_ci		FREQ2FBIN(5500, 0),
155862306a36Sopenharmony_ci		FREQ2FBIN(5600, 0),
155962306a36Sopenharmony_ci		FREQ2FBIN(5700, 0),
156062306a36Sopenharmony_ci		FREQ2FBIN(5825, 0)
156162306a36Sopenharmony_ci	},
156262306a36Sopenharmony_ci	.calTarget_freqbin_5GHT20 = {
156362306a36Sopenharmony_ci		FREQ2FBIN(5180, 0),
156462306a36Sopenharmony_ci		FREQ2FBIN(5240, 0),
156562306a36Sopenharmony_ci		FREQ2FBIN(5320, 0),
156662306a36Sopenharmony_ci		FREQ2FBIN(5400, 0),
156762306a36Sopenharmony_ci		FREQ2FBIN(5500, 0),
156862306a36Sopenharmony_ci		FREQ2FBIN(5700, 0),
156962306a36Sopenharmony_ci		FREQ2FBIN(5745, 0),
157062306a36Sopenharmony_ci		FREQ2FBIN(5825, 0)
157162306a36Sopenharmony_ci	},
157262306a36Sopenharmony_ci	.calTarget_freqbin_5GHT40 = {
157362306a36Sopenharmony_ci		FREQ2FBIN(5180, 0),
157462306a36Sopenharmony_ci		FREQ2FBIN(5240, 0),
157562306a36Sopenharmony_ci		FREQ2FBIN(5320, 0),
157662306a36Sopenharmony_ci		FREQ2FBIN(5400, 0),
157762306a36Sopenharmony_ci		FREQ2FBIN(5500, 0),
157862306a36Sopenharmony_ci		FREQ2FBIN(5700, 0),
157962306a36Sopenharmony_ci		FREQ2FBIN(5745, 0),
158062306a36Sopenharmony_ci		FREQ2FBIN(5825, 0)
158162306a36Sopenharmony_ci	},
158262306a36Sopenharmony_ci	.calTargetPower5G = {
158362306a36Sopenharmony_ci		/* 6-24,36,48,54 */
158462306a36Sopenharmony_ci		{ {30, 30, 28, 24} },
158562306a36Sopenharmony_ci		{ {30, 30, 28, 24} },
158662306a36Sopenharmony_ci		{ {30, 30, 28, 24} },
158762306a36Sopenharmony_ci		{ {30, 30, 28, 24} },
158862306a36Sopenharmony_ci		{ {30, 30, 28, 24} },
158962306a36Sopenharmony_ci		{ {30, 30, 28, 24} },
159062306a36Sopenharmony_ci		{ {30, 30, 28, 24} },
159162306a36Sopenharmony_ci		{ {30, 30, 28, 24} },
159262306a36Sopenharmony_ci	},
159362306a36Sopenharmony_ci	.calTargetPower5GHT20 = {
159462306a36Sopenharmony_ci		/*
159562306a36Sopenharmony_ci		 * 0_8_16,1-3_9-11_17-19,
159662306a36Sopenharmony_ci		 * 4,5,6,7,12,13,14,15,20,21,22,23
159762306a36Sopenharmony_ci		 */
159862306a36Sopenharmony_ci		{ {30, 30, 30, 28, 24, 20, 30, 28, 24, 20, 20, 20, 20, 16} },
159962306a36Sopenharmony_ci		{ {30, 30, 30, 28, 24, 20, 30, 28, 24, 20, 20, 20, 20, 16} },
160062306a36Sopenharmony_ci		{ {30, 30, 30, 26, 22, 18, 30, 26, 22, 18, 18, 18, 18, 16} },
160162306a36Sopenharmony_ci		{ {30, 30, 30, 26, 22, 18, 30, 26, 22, 18, 18, 18, 18, 16} },
160262306a36Sopenharmony_ci		{ {30, 30, 30, 24, 20, 16, 30, 24, 20, 16, 16, 16, 16, 14} },
160362306a36Sopenharmony_ci		{ {30, 30, 30, 24, 20, 16, 30, 24, 20, 16, 16, 16, 16, 14} },
160462306a36Sopenharmony_ci		{ {30, 30, 30, 22, 18, 14, 30, 22, 18, 14, 14, 14, 14, 12} },
160562306a36Sopenharmony_ci		{ {30, 30, 30, 22, 18, 14, 30, 22, 18, 14, 14, 14, 14, 12} },
160662306a36Sopenharmony_ci	},
160762306a36Sopenharmony_ci	.calTargetPower5GHT40 =  {
160862306a36Sopenharmony_ci		/*
160962306a36Sopenharmony_ci		 * 0_8_16,1-3_9-11_17-19,
161062306a36Sopenharmony_ci		 * 4,5,6,7,12,13,14,15,20,21,22,23
161162306a36Sopenharmony_ci		 */
161262306a36Sopenharmony_ci		{ {28, 28, 28, 26, 22, 18, 28, 26, 22, 18, 18, 18, 18, 14} },
161362306a36Sopenharmony_ci		{ {28, 28, 28, 26, 22, 18, 28, 26, 22, 18, 18, 18, 18, 14} },
161462306a36Sopenharmony_ci		{ {28, 28, 28, 24, 20, 16, 28, 24, 20, 16, 16, 16, 16, 12} },
161562306a36Sopenharmony_ci		{ {28, 28, 28, 24, 20, 16, 28, 24, 20, 16, 16, 16, 16, 12} },
161662306a36Sopenharmony_ci		{ {28, 28, 28, 22, 18, 14, 28, 22, 18, 14, 14, 14, 14, 10} },
161762306a36Sopenharmony_ci		{ {28, 28, 28, 22, 18, 14, 28, 22, 18, 14, 14, 14, 14, 10} },
161862306a36Sopenharmony_ci		{ {28, 28, 28, 20, 16, 12, 28, 20, 16, 12, 12, 12, 12, 8} },
161962306a36Sopenharmony_ci		{ {28, 28, 28, 20, 16, 12, 28, 20, 16, 12, 12, 12, 12, 8} },
162062306a36Sopenharmony_ci	},
162162306a36Sopenharmony_ci	.ctlIndex_5G =  {
162262306a36Sopenharmony_ci		0x10, 0x16, 0x18, 0x40, 0x46,
162362306a36Sopenharmony_ci		0x48, 0x30, 0x36, 0x38
162462306a36Sopenharmony_ci	},
162562306a36Sopenharmony_ci	.ctl_freqbin_5G =  {
162662306a36Sopenharmony_ci		{
162762306a36Sopenharmony_ci			/* Data[0].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
162862306a36Sopenharmony_ci			/* Data[0].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
162962306a36Sopenharmony_ci			/* Data[0].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
163062306a36Sopenharmony_ci			/* Data[0].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
163162306a36Sopenharmony_ci			/* Data[0].ctlEdges[4].bChannel */ FREQ2FBIN(5600, 0),
163262306a36Sopenharmony_ci			/* Data[0].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
163362306a36Sopenharmony_ci			/* Data[0].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
163462306a36Sopenharmony_ci			/* Data[0].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
163562306a36Sopenharmony_ci		},
163662306a36Sopenharmony_ci		{
163762306a36Sopenharmony_ci			/* Data[1].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
163862306a36Sopenharmony_ci			/* Data[1].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
163962306a36Sopenharmony_ci			/* Data[1].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
164062306a36Sopenharmony_ci			/* Data[1].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
164162306a36Sopenharmony_ci			/* Data[1].ctlEdges[4].bChannel */ FREQ2FBIN(5520, 0),
164262306a36Sopenharmony_ci			/* Data[1].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
164362306a36Sopenharmony_ci			/* Data[1].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
164462306a36Sopenharmony_ci			/* Data[1].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
164562306a36Sopenharmony_ci		},
164662306a36Sopenharmony_ci
164762306a36Sopenharmony_ci		{
164862306a36Sopenharmony_ci			/* Data[2].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
164962306a36Sopenharmony_ci			/* Data[2].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
165062306a36Sopenharmony_ci			/* Data[2].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
165162306a36Sopenharmony_ci			/* Data[2].ctlEdges[3].bChannel */ FREQ2FBIN(5310, 0),
165262306a36Sopenharmony_ci			/* Data[2].ctlEdges[4].bChannel */ FREQ2FBIN(5510, 0),
165362306a36Sopenharmony_ci			/* Data[2].ctlEdges[5].bChannel */ FREQ2FBIN(5550, 0),
165462306a36Sopenharmony_ci			/* Data[2].ctlEdges[6].bChannel */ FREQ2FBIN(5670, 0),
165562306a36Sopenharmony_ci			/* Data[2].ctlEdges[7].bChannel */ FREQ2FBIN(5755, 0)
165662306a36Sopenharmony_ci		},
165762306a36Sopenharmony_ci
165862306a36Sopenharmony_ci		{
165962306a36Sopenharmony_ci			/* Data[3].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
166062306a36Sopenharmony_ci			/* Data[3].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
166162306a36Sopenharmony_ci			/* Data[3].ctlEdges[2].bChannel */ FREQ2FBIN(5260, 0),
166262306a36Sopenharmony_ci			/* Data[3].ctlEdges[3].bChannel */ FREQ2FBIN(5320, 0),
166362306a36Sopenharmony_ci			/* Data[3].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
166462306a36Sopenharmony_ci			/* Data[3].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
166562306a36Sopenharmony_ci			/* Data[3].ctlEdges[6].bChannel */ 0xFF,
166662306a36Sopenharmony_ci			/* Data[3].ctlEdges[7].bChannel */ 0xFF,
166762306a36Sopenharmony_ci		},
166862306a36Sopenharmony_ci
166962306a36Sopenharmony_ci		{
167062306a36Sopenharmony_ci			/* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
167162306a36Sopenharmony_ci			/* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
167262306a36Sopenharmony_ci			/* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(5500, 0),
167362306a36Sopenharmony_ci			/* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(5700, 0),
167462306a36Sopenharmony_ci			/* Data[4].ctlEdges[4].bChannel */ 0xFF,
167562306a36Sopenharmony_ci			/* Data[4].ctlEdges[5].bChannel */ 0xFF,
167662306a36Sopenharmony_ci			/* Data[4].ctlEdges[6].bChannel */ 0xFF,
167762306a36Sopenharmony_ci			/* Data[4].ctlEdges[7].bChannel */ 0xFF,
167862306a36Sopenharmony_ci		},
167962306a36Sopenharmony_ci
168062306a36Sopenharmony_ci		{
168162306a36Sopenharmony_ci			/* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
168262306a36Sopenharmony_ci			/* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(5270, 0),
168362306a36Sopenharmony_ci			/* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(5310, 0),
168462306a36Sopenharmony_ci			/* Data[5].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
168562306a36Sopenharmony_ci			/* Data[5].ctlEdges[4].bChannel */ FREQ2FBIN(5590, 0),
168662306a36Sopenharmony_ci			/* Data[5].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
168762306a36Sopenharmony_ci			/* Data[5].ctlEdges[6].bChannel */ 0xFF,
168862306a36Sopenharmony_ci			/* Data[5].ctlEdges[7].bChannel */ 0xFF
168962306a36Sopenharmony_ci		},
169062306a36Sopenharmony_ci
169162306a36Sopenharmony_ci		{
169262306a36Sopenharmony_ci			/* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
169362306a36Sopenharmony_ci			/* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
169462306a36Sopenharmony_ci			/* Data[6].ctlEdges[2].bChannel */ FREQ2FBIN(5220, 0),
169562306a36Sopenharmony_ci			/* Data[6].ctlEdges[3].bChannel */ FREQ2FBIN(5260, 0),
169662306a36Sopenharmony_ci			/* Data[6].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
169762306a36Sopenharmony_ci			/* Data[6].ctlEdges[5].bChannel */ FREQ2FBIN(5600, 0),
169862306a36Sopenharmony_ci			/* Data[6].ctlEdges[6].bChannel */ FREQ2FBIN(5700, 0),
169962306a36Sopenharmony_ci			/* Data[6].ctlEdges[7].bChannel */ FREQ2FBIN(5745, 0)
170062306a36Sopenharmony_ci		},
170162306a36Sopenharmony_ci
170262306a36Sopenharmony_ci		{
170362306a36Sopenharmony_ci			/* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
170462306a36Sopenharmony_ci			/* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
170562306a36Sopenharmony_ci			/* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(5320, 0),
170662306a36Sopenharmony_ci			/* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
170762306a36Sopenharmony_ci			/* Data[7].ctlEdges[4].bChannel */ FREQ2FBIN(5560, 0),
170862306a36Sopenharmony_ci			/* Data[7].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
170962306a36Sopenharmony_ci			/* Data[7].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
171062306a36Sopenharmony_ci			/* Data[7].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
171162306a36Sopenharmony_ci		},
171262306a36Sopenharmony_ci
171362306a36Sopenharmony_ci		{
171462306a36Sopenharmony_ci			/* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
171562306a36Sopenharmony_ci			/* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
171662306a36Sopenharmony_ci			/* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
171762306a36Sopenharmony_ci			/* Data[8].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
171862306a36Sopenharmony_ci			/* Data[8].ctlEdges[4].bChannel */ FREQ2FBIN(5550, 0),
171962306a36Sopenharmony_ci			/* Data[8].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
172062306a36Sopenharmony_ci			/* Data[8].ctlEdges[6].bChannel */ FREQ2FBIN(5755, 0),
172162306a36Sopenharmony_ci			/* Data[8].ctlEdges[7].bChannel */ FREQ2FBIN(5795, 0)
172262306a36Sopenharmony_ci		}
172362306a36Sopenharmony_ci	},
172462306a36Sopenharmony_ci	.ctlPowerData_5G = {
172562306a36Sopenharmony_ci		{
172662306a36Sopenharmony_ci			{
172762306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
172862306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
172962306a36Sopenharmony_ci			}
173062306a36Sopenharmony_ci		},
173162306a36Sopenharmony_ci		{
173262306a36Sopenharmony_ci			{
173362306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
173462306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
173562306a36Sopenharmony_ci			}
173662306a36Sopenharmony_ci		},
173762306a36Sopenharmony_ci		{
173862306a36Sopenharmony_ci			{
173962306a36Sopenharmony_ci				CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 1),
174062306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
174162306a36Sopenharmony_ci			}
174262306a36Sopenharmony_ci		},
174362306a36Sopenharmony_ci		{
174462306a36Sopenharmony_ci			{
174562306a36Sopenharmony_ci				CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0),
174662306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
174762306a36Sopenharmony_ci			}
174862306a36Sopenharmony_ci		},
174962306a36Sopenharmony_ci		{
175062306a36Sopenharmony_ci			{
175162306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
175262306a36Sopenharmony_ci				CTL(60, 0), CTL(60, 0), CTL(60, 0), CTL(60, 0),
175362306a36Sopenharmony_ci			}
175462306a36Sopenharmony_ci		},
175562306a36Sopenharmony_ci		{
175662306a36Sopenharmony_ci			{
175762306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
175862306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
175962306a36Sopenharmony_ci			}
176062306a36Sopenharmony_ci		},
176162306a36Sopenharmony_ci		{
176262306a36Sopenharmony_ci			{
176362306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
176462306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
176562306a36Sopenharmony_ci			}
176662306a36Sopenharmony_ci		},
176762306a36Sopenharmony_ci		{
176862306a36Sopenharmony_ci			{
176962306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
177062306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
177162306a36Sopenharmony_ci			}
177262306a36Sopenharmony_ci		},
177362306a36Sopenharmony_ci		{
177462306a36Sopenharmony_ci			{
177562306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 1), CTL(60, 1),
177662306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
177762306a36Sopenharmony_ci			}
177862306a36Sopenharmony_ci		},
177962306a36Sopenharmony_ci	}
178062306a36Sopenharmony_ci};
178162306a36Sopenharmony_ci
178262306a36Sopenharmony_ci
178362306a36Sopenharmony_cistatic const struct ar9300_eeprom ar9300_x112 = {
178462306a36Sopenharmony_ci	.eepromVersion = 2,
178562306a36Sopenharmony_ci	.templateVersion = 5,
178662306a36Sopenharmony_ci	.macAddr = {0x00, 0x03, 0x7f, 0x0, 0x0, 0x0},
178762306a36Sopenharmony_ci	.custData = {"x112-041-f0000"},
178862306a36Sopenharmony_ci	.baseEepHeader = {
178962306a36Sopenharmony_ci		.regDmn = { LE16(0), LE16(0x1f) },
179062306a36Sopenharmony_ci		.txrxMask =  0x77, /* 4 bits tx and 4 bits rx */
179162306a36Sopenharmony_ci		.opCapFlags = {
179262306a36Sopenharmony_ci			.opFlags = AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A,
179362306a36Sopenharmony_ci			.eepMisc = AR9300_EEPMISC_LITTLE_ENDIAN,
179462306a36Sopenharmony_ci		},
179562306a36Sopenharmony_ci		.rfSilent = 0,
179662306a36Sopenharmony_ci		.blueToothOptions = 0,
179762306a36Sopenharmony_ci		.deviceCap = 0,
179862306a36Sopenharmony_ci		.deviceType = 5, /* takes lower byte in eeprom location */
179962306a36Sopenharmony_ci		.pwrTableOffset = AR9300_PWR_TABLE_OFFSET,
180062306a36Sopenharmony_ci		.params_for_tuning_caps = {0, 0},
180162306a36Sopenharmony_ci		.featureEnable = 0x0d,
180262306a36Sopenharmony_ci		/*
180362306a36Sopenharmony_ci		 * bit0 - enable tx temp comp - disabled
180462306a36Sopenharmony_ci		 * bit1 - enable tx volt comp - disabled
180562306a36Sopenharmony_ci		 * bit2 - enable fastclock - enabled
180662306a36Sopenharmony_ci		 * bit3 - enable doubling - enabled
180762306a36Sopenharmony_ci		 * bit4 - enable internal regulator - disabled
180862306a36Sopenharmony_ci		 * bit5 - enable pa predistortion - disabled
180962306a36Sopenharmony_ci		 */
181062306a36Sopenharmony_ci		.miscConfiguration = 0, /* bit0 - turn down drivestrength */
181162306a36Sopenharmony_ci		.eepromWriteEnableGpio = 6,
181262306a36Sopenharmony_ci		.wlanDisableGpio = 0,
181362306a36Sopenharmony_ci		.wlanLedGpio = 8,
181462306a36Sopenharmony_ci		.rxBandSelectGpio = 0xff,
181562306a36Sopenharmony_ci		.txrxgain = 0x0,
181662306a36Sopenharmony_ci		.swreg = 0,
181762306a36Sopenharmony_ci	},
181862306a36Sopenharmony_ci	.modalHeader2G = {
181962306a36Sopenharmony_ci		/* ar9300_modal_eep_header  2g */
182062306a36Sopenharmony_ci		/* 4 idle,t1,t2,b(4 bits per setting) */
182162306a36Sopenharmony_ci		.antCtrlCommon = LE32(0x110),
182262306a36Sopenharmony_ci		/* 4 ra1l1, ra2l1, ra1l2, ra2l2, ra12 */
182362306a36Sopenharmony_ci		.antCtrlCommon2 = LE32(0x22222),
182462306a36Sopenharmony_ci
182562306a36Sopenharmony_ci		/*
182662306a36Sopenharmony_ci		 * antCtrlChain[ar9300_max_chains]; 6 idle, t, r,
182762306a36Sopenharmony_ci		 * rx1, rx12, b (2 bits each)
182862306a36Sopenharmony_ci		 */
182962306a36Sopenharmony_ci		.antCtrlChain = { LE16(0x10), LE16(0x10), LE16(0x10) },
183062306a36Sopenharmony_ci
183162306a36Sopenharmony_ci		/*
183262306a36Sopenharmony_ci		 * xatten1DB[AR9300_max_chains];  3 xatten1_db
183362306a36Sopenharmony_ci		 * for ar9280 (0xa20c/b20c 5:0)
183462306a36Sopenharmony_ci		 */
183562306a36Sopenharmony_ci		.xatten1DB = {0x1b, 0x1b, 0x1b},
183662306a36Sopenharmony_ci
183762306a36Sopenharmony_ci		/*
183862306a36Sopenharmony_ci		 * xatten1Margin[ar9300_max_chains]; 3 xatten1_margin
183962306a36Sopenharmony_ci		 * for ar9280 (0xa20c/b20c 16:12
184062306a36Sopenharmony_ci		 */
184162306a36Sopenharmony_ci		.xatten1Margin = {0x15, 0x15, 0x15},
184262306a36Sopenharmony_ci		.tempSlope = 50,
184362306a36Sopenharmony_ci		.voltSlope = 0,
184462306a36Sopenharmony_ci
184562306a36Sopenharmony_ci		/*
184662306a36Sopenharmony_ci		 * spurChans[OSPrey_eeprom_modal_sPURS]; spur
184762306a36Sopenharmony_ci		 * channels in usual fbin coding format
184862306a36Sopenharmony_ci		 */
184962306a36Sopenharmony_ci		.spurChans = {FREQ2FBIN(2464, 1), 0, 0, 0, 0},
185062306a36Sopenharmony_ci
185162306a36Sopenharmony_ci		/*
185262306a36Sopenharmony_ci		 * noiseFloorThreshch[ar9300_max_cHAINS]; 3 Check
185362306a36Sopenharmony_ci		 * if the register is per chain
185462306a36Sopenharmony_ci		 */
185562306a36Sopenharmony_ci		.noiseFloorThreshCh = {-1, 0, 0},
185662306a36Sopenharmony_ci		.reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
185762306a36Sopenharmony_ci		.quick_drop = 0,
185862306a36Sopenharmony_ci		.xpaBiasLvl = 0,
185962306a36Sopenharmony_ci		.txFrameToDataStart = 0x0e,
186062306a36Sopenharmony_ci		.txFrameToPaOn = 0x0e,
186162306a36Sopenharmony_ci		.txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
186262306a36Sopenharmony_ci		.antennaGain = 0,
186362306a36Sopenharmony_ci		.switchSettling = 0x2c,
186462306a36Sopenharmony_ci		.adcDesiredSize = -30,
186562306a36Sopenharmony_ci		.txEndToXpaOff = 0,
186662306a36Sopenharmony_ci		.txEndToRxOn = 0x2,
186762306a36Sopenharmony_ci		.txFrameToXpaOn = 0xe,
186862306a36Sopenharmony_ci		.thresh62 = 28,
186962306a36Sopenharmony_ci		.papdRateMaskHt20 = LE32(0x0c80c080),
187062306a36Sopenharmony_ci		.papdRateMaskHt40 = LE32(0x0080c080),
187162306a36Sopenharmony_ci		.switchcomspdt = 0,
187262306a36Sopenharmony_ci		.xlna_bias_strength = 0,
187362306a36Sopenharmony_ci		.futureModal = {
187462306a36Sopenharmony_ci			0, 0, 0, 0, 0, 0, 0,
187562306a36Sopenharmony_ci		},
187662306a36Sopenharmony_ci	},
187762306a36Sopenharmony_ci	.base_ext1 = {
187862306a36Sopenharmony_ci		.ant_div_control = 0,
187962306a36Sopenharmony_ci		.future = {0, 0},
188062306a36Sopenharmony_ci		.tempslopextension = {0, 0, 0, 0, 0, 0, 0, 0}
188162306a36Sopenharmony_ci	},
188262306a36Sopenharmony_ci	.calFreqPier2G = {
188362306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
188462306a36Sopenharmony_ci		FREQ2FBIN(2437, 1),
188562306a36Sopenharmony_ci		FREQ2FBIN(2472, 1),
188662306a36Sopenharmony_ci	},
188762306a36Sopenharmony_ci	/* ar9300_cal_data_per_freq_op_loop 2g */
188862306a36Sopenharmony_ci	.calPierData2G = {
188962306a36Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
189062306a36Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
189162306a36Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
189262306a36Sopenharmony_ci	},
189362306a36Sopenharmony_ci	.calTarget_freqbin_Cck = {
189462306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
189562306a36Sopenharmony_ci		FREQ2FBIN(2472, 1),
189662306a36Sopenharmony_ci	},
189762306a36Sopenharmony_ci	.calTarget_freqbin_2G = {
189862306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
189962306a36Sopenharmony_ci		FREQ2FBIN(2437, 1),
190062306a36Sopenharmony_ci		FREQ2FBIN(2472, 1)
190162306a36Sopenharmony_ci	},
190262306a36Sopenharmony_ci	.calTarget_freqbin_2GHT20 = {
190362306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
190462306a36Sopenharmony_ci		FREQ2FBIN(2437, 1),
190562306a36Sopenharmony_ci		FREQ2FBIN(2472, 1)
190662306a36Sopenharmony_ci	},
190762306a36Sopenharmony_ci	.calTarget_freqbin_2GHT40 = {
190862306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
190962306a36Sopenharmony_ci		FREQ2FBIN(2437, 1),
191062306a36Sopenharmony_ci		FREQ2FBIN(2472, 1)
191162306a36Sopenharmony_ci	},
191262306a36Sopenharmony_ci	.calTargetPowerCck = {
191362306a36Sopenharmony_ci		/* 1L-5L,5S,11L,11s */
191462306a36Sopenharmony_ci		{ {38, 38, 38, 38} },
191562306a36Sopenharmony_ci		{ {38, 38, 38, 38} },
191662306a36Sopenharmony_ci	},
191762306a36Sopenharmony_ci	.calTargetPower2G = {
191862306a36Sopenharmony_ci		/* 6-24,36,48,54 */
191962306a36Sopenharmony_ci		{ {38, 38, 36, 34} },
192062306a36Sopenharmony_ci		{ {38, 38, 36, 34} },
192162306a36Sopenharmony_ci		{ {38, 38, 34, 32} },
192262306a36Sopenharmony_ci	},
192362306a36Sopenharmony_ci	.calTargetPower2GHT20 = {
192462306a36Sopenharmony_ci		{ {36, 36, 36, 36, 36, 34, 34, 32, 30, 28, 28, 28, 28, 26} },
192562306a36Sopenharmony_ci		{ {36, 36, 36, 36, 36, 34, 36, 34, 32, 30, 30, 30, 28, 26} },
192662306a36Sopenharmony_ci		{ {36, 36, 36, 36, 36, 34, 34, 32, 30, 28, 28, 28, 28, 26} },
192762306a36Sopenharmony_ci	},
192862306a36Sopenharmony_ci	.calTargetPower2GHT40 = {
192962306a36Sopenharmony_ci		{ {36, 36, 36, 36, 34, 32, 32, 30, 28, 26, 26, 26, 26, 24} },
193062306a36Sopenharmony_ci		{ {36, 36, 36, 36, 34, 32, 34, 32, 30, 28, 28, 28, 28, 24} },
193162306a36Sopenharmony_ci		{ {36, 36, 36, 36, 34, 32, 32, 30, 28, 26, 26, 26, 26, 24} },
193262306a36Sopenharmony_ci	},
193362306a36Sopenharmony_ci	.ctlIndex_2G =  {
193462306a36Sopenharmony_ci		0x11, 0x12, 0x15, 0x17, 0x41, 0x42,
193562306a36Sopenharmony_ci		0x45, 0x47, 0x31, 0x32, 0x35, 0x37,
193662306a36Sopenharmony_ci	},
193762306a36Sopenharmony_ci	.ctl_freqbin_2G = {
193862306a36Sopenharmony_ci		{
193962306a36Sopenharmony_ci			FREQ2FBIN(2412, 1),
194062306a36Sopenharmony_ci			FREQ2FBIN(2417, 1),
194162306a36Sopenharmony_ci			FREQ2FBIN(2457, 1),
194262306a36Sopenharmony_ci			FREQ2FBIN(2462, 1)
194362306a36Sopenharmony_ci		},
194462306a36Sopenharmony_ci		{
194562306a36Sopenharmony_ci			FREQ2FBIN(2412, 1),
194662306a36Sopenharmony_ci			FREQ2FBIN(2417, 1),
194762306a36Sopenharmony_ci			FREQ2FBIN(2462, 1),
194862306a36Sopenharmony_ci			0xFF,
194962306a36Sopenharmony_ci		},
195062306a36Sopenharmony_ci
195162306a36Sopenharmony_ci		{
195262306a36Sopenharmony_ci			FREQ2FBIN(2412, 1),
195362306a36Sopenharmony_ci			FREQ2FBIN(2417, 1),
195462306a36Sopenharmony_ci			FREQ2FBIN(2462, 1),
195562306a36Sopenharmony_ci			0xFF,
195662306a36Sopenharmony_ci		},
195762306a36Sopenharmony_ci		{
195862306a36Sopenharmony_ci			FREQ2FBIN(2422, 1),
195962306a36Sopenharmony_ci			FREQ2FBIN(2427, 1),
196062306a36Sopenharmony_ci			FREQ2FBIN(2447, 1),
196162306a36Sopenharmony_ci			FREQ2FBIN(2452, 1)
196262306a36Sopenharmony_ci		},
196362306a36Sopenharmony_ci
196462306a36Sopenharmony_ci		{
196562306a36Sopenharmony_ci			/* Data[4].ctledges[0].bchannel */ FREQ2FBIN(2412, 1),
196662306a36Sopenharmony_ci			/* Data[4].ctledges[1].bchannel */ FREQ2FBIN(2417, 1),
196762306a36Sopenharmony_ci			/* Data[4].ctledges[2].bchannel */ FREQ2FBIN(2472, 1),
196862306a36Sopenharmony_ci			/* Data[4].ctledges[3].bchannel */ FREQ2FBIN(2484, 1),
196962306a36Sopenharmony_ci		},
197062306a36Sopenharmony_ci
197162306a36Sopenharmony_ci		{
197262306a36Sopenharmony_ci			/* Data[5].ctledges[0].bchannel */ FREQ2FBIN(2412, 1),
197362306a36Sopenharmony_ci			/* Data[5].ctledges[1].bchannel */ FREQ2FBIN(2417, 1),
197462306a36Sopenharmony_ci			/* Data[5].ctledges[2].bchannel */ FREQ2FBIN(2472, 1),
197562306a36Sopenharmony_ci			0,
197662306a36Sopenharmony_ci		},
197762306a36Sopenharmony_ci
197862306a36Sopenharmony_ci		{
197962306a36Sopenharmony_ci			/* Data[6].ctledges[0].bchannel */ FREQ2FBIN(2412, 1),
198062306a36Sopenharmony_ci			/* Data[6].ctledges[1].bchannel */ FREQ2FBIN(2417, 1),
198162306a36Sopenharmony_ci			FREQ2FBIN(2472, 1),
198262306a36Sopenharmony_ci			0,
198362306a36Sopenharmony_ci		},
198462306a36Sopenharmony_ci
198562306a36Sopenharmony_ci		{
198662306a36Sopenharmony_ci			/* Data[7].ctledges[0].bchannel */ FREQ2FBIN(2422, 1),
198762306a36Sopenharmony_ci			/* Data[7].ctledges[1].bchannel */ FREQ2FBIN(2427, 1),
198862306a36Sopenharmony_ci			/* Data[7].ctledges[2].bchannel */ FREQ2FBIN(2447, 1),
198962306a36Sopenharmony_ci			/* Data[7].ctledges[3].bchannel */ FREQ2FBIN(2462, 1),
199062306a36Sopenharmony_ci		},
199162306a36Sopenharmony_ci
199262306a36Sopenharmony_ci		{
199362306a36Sopenharmony_ci			/* Data[8].ctledges[0].bchannel */ FREQ2FBIN(2412, 1),
199462306a36Sopenharmony_ci			/* Data[8].ctledges[1].bchannel */ FREQ2FBIN(2417, 1),
199562306a36Sopenharmony_ci			/* Data[8].ctledges[2].bchannel */ FREQ2FBIN(2472, 1),
199662306a36Sopenharmony_ci		},
199762306a36Sopenharmony_ci
199862306a36Sopenharmony_ci		{
199962306a36Sopenharmony_ci			/* Data[9].ctledges[0].bchannel */ FREQ2FBIN(2412, 1),
200062306a36Sopenharmony_ci			/* Data[9].ctledges[1].bchannel */ FREQ2FBIN(2417, 1),
200162306a36Sopenharmony_ci			/* Data[9].ctledges[2].bchannel */ FREQ2FBIN(2472, 1),
200262306a36Sopenharmony_ci			0
200362306a36Sopenharmony_ci		},
200462306a36Sopenharmony_ci
200562306a36Sopenharmony_ci		{
200662306a36Sopenharmony_ci			/* Data[10].ctledges[0].bchannel */ FREQ2FBIN(2412, 1),
200762306a36Sopenharmony_ci			/* Data[10].ctledges[1].bchannel */ FREQ2FBIN(2417, 1),
200862306a36Sopenharmony_ci			/* Data[10].ctledges[2].bchannel */ FREQ2FBIN(2472, 1),
200962306a36Sopenharmony_ci			0
201062306a36Sopenharmony_ci		},
201162306a36Sopenharmony_ci
201262306a36Sopenharmony_ci		{
201362306a36Sopenharmony_ci			/* Data[11].ctledges[0].bchannel */ FREQ2FBIN(2422, 1),
201462306a36Sopenharmony_ci			/* Data[11].ctledges[1].bchannel */ FREQ2FBIN(2427, 1),
201562306a36Sopenharmony_ci			/* Data[11].ctledges[2].bchannel */ FREQ2FBIN(2447, 1),
201662306a36Sopenharmony_ci			/* Data[11].ctledges[3].bchannel */ FREQ2FBIN(2462, 1),
201762306a36Sopenharmony_ci		}
201862306a36Sopenharmony_ci	},
201962306a36Sopenharmony_ci	.ctlPowerData_2G = {
202062306a36Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
202162306a36Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
202262306a36Sopenharmony_ci		{ { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } },
202362306a36Sopenharmony_ci
202462306a36Sopenharmony_ci		{ { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } },
202562306a36Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
202662306a36Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
202762306a36Sopenharmony_ci
202862306a36Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } },
202962306a36Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
203062306a36Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
203162306a36Sopenharmony_ci
203262306a36Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
203362306a36Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
203462306a36Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
203562306a36Sopenharmony_ci	},
203662306a36Sopenharmony_ci	.modalHeader5G = {
203762306a36Sopenharmony_ci		/* 4 idle,t1,t2,b (4 bits per setting) */
203862306a36Sopenharmony_ci		.antCtrlCommon = LE32(0x110),
203962306a36Sopenharmony_ci		/* 4 ra1l1, ra2l1, ra1l2,ra2l2,ra12 */
204062306a36Sopenharmony_ci		.antCtrlCommon2 = LE32(0x22222),
204162306a36Sopenharmony_ci		/* antCtrlChain 6 idle, t,r,rx1,rx12,b (2 bits each) */
204262306a36Sopenharmony_ci		.antCtrlChain = {
204362306a36Sopenharmony_ci			LE16(0x0), LE16(0x0), LE16(0x0),
204462306a36Sopenharmony_ci		},
204562306a36Sopenharmony_ci		/* xatten1DB 3 xatten1_db for ar9280 (0xa20c/b20c 5:0) */
204662306a36Sopenharmony_ci		.xatten1DB = {0x13, 0x19, 0x17},
204762306a36Sopenharmony_ci
204862306a36Sopenharmony_ci		/*
204962306a36Sopenharmony_ci		 * xatten1Margin[ar9300_max_chains]; 3 xatten1_margin
205062306a36Sopenharmony_ci		 * for merlin (0xa20c/b20c 16:12
205162306a36Sopenharmony_ci		 */
205262306a36Sopenharmony_ci		.xatten1Margin = {0x19, 0x19, 0x19},
205362306a36Sopenharmony_ci		.tempSlope = 70,
205462306a36Sopenharmony_ci		.voltSlope = 15,
205562306a36Sopenharmony_ci		/* spurChans spur channels in usual fbin coding format */
205662306a36Sopenharmony_ci		.spurChans = {0, 0, 0, 0, 0},
205762306a36Sopenharmony_ci		/* noiseFloorThreshch check if the register is per chain */
205862306a36Sopenharmony_ci		.noiseFloorThreshCh = {-1, 0, 0},
205962306a36Sopenharmony_ci		.reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
206062306a36Sopenharmony_ci		.quick_drop = 0,
206162306a36Sopenharmony_ci		.xpaBiasLvl = 0,
206262306a36Sopenharmony_ci		.txFrameToDataStart = 0x0e,
206362306a36Sopenharmony_ci		.txFrameToPaOn = 0x0e,
206462306a36Sopenharmony_ci		.txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
206562306a36Sopenharmony_ci		.antennaGain = 0,
206662306a36Sopenharmony_ci		.switchSettling = 0x2d,
206762306a36Sopenharmony_ci		.adcDesiredSize = -30,
206862306a36Sopenharmony_ci		.txEndToXpaOff = 0,
206962306a36Sopenharmony_ci		.txEndToRxOn = 0x2,
207062306a36Sopenharmony_ci		.txFrameToXpaOn = 0xe,
207162306a36Sopenharmony_ci		.thresh62 = 28,
207262306a36Sopenharmony_ci		.papdRateMaskHt20 = LE32(0x0cf0e0e0),
207362306a36Sopenharmony_ci		.papdRateMaskHt40 = LE32(0x6cf0e0e0),
207462306a36Sopenharmony_ci		.switchcomspdt = 0,
207562306a36Sopenharmony_ci		.xlna_bias_strength = 0,
207662306a36Sopenharmony_ci		.futureModal = {
207762306a36Sopenharmony_ci			0, 0, 0, 0, 0, 0, 0,
207862306a36Sopenharmony_ci		},
207962306a36Sopenharmony_ci	},
208062306a36Sopenharmony_ci	.base_ext2 = {
208162306a36Sopenharmony_ci		.tempSlopeLow = 72,
208262306a36Sopenharmony_ci		.tempSlopeHigh = 105,
208362306a36Sopenharmony_ci		.xatten1DBLow = {0x10, 0x14, 0x10},
208462306a36Sopenharmony_ci		.xatten1MarginLow = {0x19, 0x19 , 0x19},
208562306a36Sopenharmony_ci		.xatten1DBHigh = {0x1d, 0x20, 0x24},
208662306a36Sopenharmony_ci		.xatten1MarginHigh = {0x10, 0x10, 0x10}
208762306a36Sopenharmony_ci	},
208862306a36Sopenharmony_ci	.calFreqPier5G = {
208962306a36Sopenharmony_ci		FREQ2FBIN(5180, 0),
209062306a36Sopenharmony_ci		FREQ2FBIN(5220, 0),
209162306a36Sopenharmony_ci		FREQ2FBIN(5320, 0),
209262306a36Sopenharmony_ci		FREQ2FBIN(5400, 0),
209362306a36Sopenharmony_ci		FREQ2FBIN(5500, 0),
209462306a36Sopenharmony_ci		FREQ2FBIN(5600, 0),
209562306a36Sopenharmony_ci		FREQ2FBIN(5700, 0),
209662306a36Sopenharmony_ci		FREQ2FBIN(5785, 0)
209762306a36Sopenharmony_ci	},
209862306a36Sopenharmony_ci	.calPierData5G = {
209962306a36Sopenharmony_ci		{
210062306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
210162306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
210262306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
210362306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
210462306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
210562306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
210662306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
210762306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
210862306a36Sopenharmony_ci		},
210962306a36Sopenharmony_ci		{
211062306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
211162306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
211262306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
211362306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
211462306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
211562306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
211662306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
211762306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
211862306a36Sopenharmony_ci		},
211962306a36Sopenharmony_ci		{
212062306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
212162306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
212262306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
212362306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
212462306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
212562306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
212662306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
212762306a36Sopenharmony_ci			{0, 0, 0, 0, 0},
212862306a36Sopenharmony_ci		},
212962306a36Sopenharmony_ci
213062306a36Sopenharmony_ci	},
213162306a36Sopenharmony_ci	.calTarget_freqbin_5G = {
213262306a36Sopenharmony_ci		FREQ2FBIN(5180, 0),
213362306a36Sopenharmony_ci		FREQ2FBIN(5220, 0),
213462306a36Sopenharmony_ci		FREQ2FBIN(5320, 0),
213562306a36Sopenharmony_ci		FREQ2FBIN(5400, 0),
213662306a36Sopenharmony_ci		FREQ2FBIN(5500, 0),
213762306a36Sopenharmony_ci		FREQ2FBIN(5600, 0),
213862306a36Sopenharmony_ci		FREQ2FBIN(5725, 0),
213962306a36Sopenharmony_ci		FREQ2FBIN(5825, 0)
214062306a36Sopenharmony_ci	},
214162306a36Sopenharmony_ci	.calTarget_freqbin_5GHT20 = {
214262306a36Sopenharmony_ci		FREQ2FBIN(5180, 0),
214362306a36Sopenharmony_ci		FREQ2FBIN(5220, 0),
214462306a36Sopenharmony_ci		FREQ2FBIN(5320, 0),
214562306a36Sopenharmony_ci		FREQ2FBIN(5400, 0),
214662306a36Sopenharmony_ci		FREQ2FBIN(5500, 0),
214762306a36Sopenharmony_ci		FREQ2FBIN(5600, 0),
214862306a36Sopenharmony_ci		FREQ2FBIN(5725, 0),
214962306a36Sopenharmony_ci		FREQ2FBIN(5825, 0)
215062306a36Sopenharmony_ci	},
215162306a36Sopenharmony_ci	.calTarget_freqbin_5GHT40 = {
215262306a36Sopenharmony_ci		FREQ2FBIN(5180, 0),
215362306a36Sopenharmony_ci		FREQ2FBIN(5220, 0),
215462306a36Sopenharmony_ci		FREQ2FBIN(5320, 0),
215562306a36Sopenharmony_ci		FREQ2FBIN(5400, 0),
215662306a36Sopenharmony_ci		FREQ2FBIN(5500, 0),
215762306a36Sopenharmony_ci		FREQ2FBIN(5600, 0),
215862306a36Sopenharmony_ci		FREQ2FBIN(5725, 0),
215962306a36Sopenharmony_ci		FREQ2FBIN(5825, 0)
216062306a36Sopenharmony_ci	},
216162306a36Sopenharmony_ci	.calTargetPower5G = {
216262306a36Sopenharmony_ci		/* 6-24,36,48,54 */
216362306a36Sopenharmony_ci		{ {32, 32, 28, 26} },
216462306a36Sopenharmony_ci		{ {32, 32, 28, 26} },
216562306a36Sopenharmony_ci		{ {32, 32, 28, 26} },
216662306a36Sopenharmony_ci		{ {32, 32, 26, 24} },
216762306a36Sopenharmony_ci		{ {32, 32, 26, 24} },
216862306a36Sopenharmony_ci		{ {32, 32, 24, 22} },
216962306a36Sopenharmony_ci		{ {30, 30, 24, 22} },
217062306a36Sopenharmony_ci		{ {30, 30, 24, 22} },
217162306a36Sopenharmony_ci	},
217262306a36Sopenharmony_ci	.calTargetPower5GHT20 = {
217362306a36Sopenharmony_ci		/*
217462306a36Sopenharmony_ci		 * 0_8_16,1-3_9-11_17-19,
217562306a36Sopenharmony_ci		 * 4,5,6,7,12,13,14,15,20,21,22,23
217662306a36Sopenharmony_ci		 */
217762306a36Sopenharmony_ci		{ {32, 32, 32, 32, 28, 26, 32, 28, 26, 24, 24, 24, 22, 22} },
217862306a36Sopenharmony_ci		{ {32, 32, 32, 32, 28, 26, 32, 28, 26, 24, 24, 24, 22, 22} },
217962306a36Sopenharmony_ci		{ {32, 32, 32, 32, 28, 26, 32, 28, 26, 24, 24, 24, 22, 22} },
218062306a36Sopenharmony_ci		{ {32, 32, 32, 32, 28, 26, 32, 26, 24, 22, 22, 22, 20, 20} },
218162306a36Sopenharmony_ci		{ {32, 32, 32, 32, 28, 26, 32, 26, 24, 22, 20, 18, 16, 16} },
218262306a36Sopenharmony_ci		{ {32, 32, 32, 32, 28, 26, 32, 24, 20, 16, 18, 16, 14, 14} },
218362306a36Sopenharmony_ci		{ {30, 30, 30, 30, 28, 26, 30, 24, 20, 16, 18, 16, 14, 14} },
218462306a36Sopenharmony_ci		{ {30, 30, 30, 30, 28, 26, 30, 24, 20, 16, 18, 16, 14, 14} },
218562306a36Sopenharmony_ci	},
218662306a36Sopenharmony_ci	.calTargetPower5GHT40 =  {
218762306a36Sopenharmony_ci		/*
218862306a36Sopenharmony_ci		 * 0_8_16,1-3_9-11_17-19,
218962306a36Sopenharmony_ci		 * 4,5,6,7,12,13,14,15,20,21,22,23
219062306a36Sopenharmony_ci		 */
219162306a36Sopenharmony_ci		{ {32, 32, 32, 30, 28, 26, 30, 28, 26, 24, 24, 24, 22, 22} },
219262306a36Sopenharmony_ci		{ {32, 32, 32, 30, 28, 26, 30, 28, 26, 24, 24, 24, 22, 22} },
219362306a36Sopenharmony_ci		{ {32, 32, 32, 30, 28, 26, 30, 28, 26, 24, 24, 24, 22, 22} },
219462306a36Sopenharmony_ci		{ {32, 32, 32, 30, 28, 26, 30, 26, 24, 22, 22, 22, 20, 20} },
219562306a36Sopenharmony_ci		{ {32, 32, 32, 30, 28, 26, 30, 26, 24, 22, 20, 18, 16, 16} },
219662306a36Sopenharmony_ci		{ {32, 32, 32, 30, 28, 26, 30, 22, 20, 16, 18, 16, 14, 14} },
219762306a36Sopenharmony_ci		{ {30, 30, 30, 30, 28, 26, 30, 22, 20, 16, 18, 16, 14, 14} },
219862306a36Sopenharmony_ci		{ {30, 30, 30, 30, 28, 26, 30, 22, 20, 16, 18, 16, 14, 14} },
219962306a36Sopenharmony_ci	},
220062306a36Sopenharmony_ci	.ctlIndex_5G =  {
220162306a36Sopenharmony_ci		0x10, 0x16, 0x18, 0x40, 0x46,
220262306a36Sopenharmony_ci		0x48, 0x30, 0x36, 0x38
220362306a36Sopenharmony_ci	},
220462306a36Sopenharmony_ci	.ctl_freqbin_5G =  {
220562306a36Sopenharmony_ci		{
220662306a36Sopenharmony_ci			/* Data[0].ctledges[0].bchannel */ FREQ2FBIN(5180, 0),
220762306a36Sopenharmony_ci			/* Data[0].ctledges[1].bchannel */ FREQ2FBIN(5260, 0),
220862306a36Sopenharmony_ci			/* Data[0].ctledges[2].bchannel */ FREQ2FBIN(5280, 0),
220962306a36Sopenharmony_ci			/* Data[0].ctledges[3].bchannel */ FREQ2FBIN(5500, 0),
221062306a36Sopenharmony_ci			/* Data[0].ctledges[4].bchannel */ FREQ2FBIN(5600, 0),
221162306a36Sopenharmony_ci			/* Data[0].ctledges[5].bchannel */ FREQ2FBIN(5700, 0),
221262306a36Sopenharmony_ci			/* Data[0].ctledges[6].bchannel */ FREQ2FBIN(5745, 0),
221362306a36Sopenharmony_ci			/* Data[0].ctledges[7].bchannel */ FREQ2FBIN(5825, 0)
221462306a36Sopenharmony_ci		},
221562306a36Sopenharmony_ci		{
221662306a36Sopenharmony_ci			/* Data[1].ctledges[0].bchannel */ FREQ2FBIN(5180, 0),
221762306a36Sopenharmony_ci			/* Data[1].ctledges[1].bchannel */ FREQ2FBIN(5260, 0),
221862306a36Sopenharmony_ci			/* Data[1].ctledges[2].bchannel */ FREQ2FBIN(5280, 0),
221962306a36Sopenharmony_ci			/* Data[1].ctledges[3].bchannel */ FREQ2FBIN(5500, 0),
222062306a36Sopenharmony_ci			/* Data[1].ctledges[4].bchannel */ FREQ2FBIN(5520, 0),
222162306a36Sopenharmony_ci			/* Data[1].ctledges[5].bchannel */ FREQ2FBIN(5700, 0),
222262306a36Sopenharmony_ci			/* Data[1].ctledges[6].bchannel */ FREQ2FBIN(5745, 0),
222362306a36Sopenharmony_ci			/* Data[1].ctledges[7].bchannel */ FREQ2FBIN(5825, 0)
222462306a36Sopenharmony_ci		},
222562306a36Sopenharmony_ci
222662306a36Sopenharmony_ci		{
222762306a36Sopenharmony_ci			/* Data[2].ctledges[0].bchannel */ FREQ2FBIN(5190, 0),
222862306a36Sopenharmony_ci			/* Data[2].ctledges[1].bchannel */ FREQ2FBIN(5230, 0),
222962306a36Sopenharmony_ci			/* Data[2].ctledges[2].bchannel */ FREQ2FBIN(5270, 0),
223062306a36Sopenharmony_ci			/* Data[2].ctledges[3].bchannel */ FREQ2FBIN(5310, 0),
223162306a36Sopenharmony_ci			/* Data[2].ctledges[4].bchannel */ FREQ2FBIN(5510, 0),
223262306a36Sopenharmony_ci			/* Data[2].ctledges[5].bchannel */ FREQ2FBIN(5550, 0),
223362306a36Sopenharmony_ci			/* Data[2].ctledges[6].bchannel */ FREQ2FBIN(5670, 0),
223462306a36Sopenharmony_ci			/* Data[2].ctledges[7].bchannel */ FREQ2FBIN(5755, 0)
223562306a36Sopenharmony_ci		},
223662306a36Sopenharmony_ci
223762306a36Sopenharmony_ci		{
223862306a36Sopenharmony_ci			/* Data[3].ctledges[0].bchannel */ FREQ2FBIN(5180, 0),
223962306a36Sopenharmony_ci			/* Data[3].ctledges[1].bchannel */ FREQ2FBIN(5200, 0),
224062306a36Sopenharmony_ci			/* Data[3].ctledges[2].bchannel */ FREQ2FBIN(5260, 0),
224162306a36Sopenharmony_ci			/* Data[3].ctledges[3].bchannel */ FREQ2FBIN(5320, 0),
224262306a36Sopenharmony_ci			/* Data[3].ctledges[4].bchannel */ FREQ2FBIN(5500, 0),
224362306a36Sopenharmony_ci			/* Data[3].ctledges[5].bchannel */ FREQ2FBIN(5700, 0),
224462306a36Sopenharmony_ci			/* Data[3].ctledges[6].bchannel */ 0xFF,
224562306a36Sopenharmony_ci			/* Data[3].ctledges[7].bchannel */ 0xFF,
224662306a36Sopenharmony_ci		},
224762306a36Sopenharmony_ci
224862306a36Sopenharmony_ci		{
224962306a36Sopenharmony_ci			/* Data[4].ctledges[0].bchannel */ FREQ2FBIN(5180, 0),
225062306a36Sopenharmony_ci			/* Data[4].ctledges[1].bchannel */ FREQ2FBIN(5260, 0),
225162306a36Sopenharmony_ci			/* Data[4].ctledges[2].bchannel */ FREQ2FBIN(5500, 0),
225262306a36Sopenharmony_ci			/* Data[4].ctledges[3].bchannel */ FREQ2FBIN(5700, 0),
225362306a36Sopenharmony_ci			/* Data[4].ctledges[4].bchannel */ 0xFF,
225462306a36Sopenharmony_ci			/* Data[4].ctledges[5].bchannel */ 0xFF,
225562306a36Sopenharmony_ci			/* Data[4].ctledges[6].bchannel */ 0xFF,
225662306a36Sopenharmony_ci			/* Data[4].ctledges[7].bchannel */ 0xFF,
225762306a36Sopenharmony_ci		},
225862306a36Sopenharmony_ci
225962306a36Sopenharmony_ci		{
226062306a36Sopenharmony_ci			/* Data[5].ctledges[0].bchannel */ FREQ2FBIN(5190, 0),
226162306a36Sopenharmony_ci			/* Data[5].ctledges[1].bchannel */ FREQ2FBIN(5270, 0),
226262306a36Sopenharmony_ci			/* Data[5].ctledges[2].bchannel */ FREQ2FBIN(5310, 0),
226362306a36Sopenharmony_ci			/* Data[5].ctledges[3].bchannel */ FREQ2FBIN(5510, 0),
226462306a36Sopenharmony_ci			/* Data[5].ctledges[4].bchannel */ FREQ2FBIN(5590, 0),
226562306a36Sopenharmony_ci			/* Data[5].ctledges[5].bchannel */ FREQ2FBIN(5670, 0),
226662306a36Sopenharmony_ci			/* Data[5].ctledges[6].bchannel */ 0xFF,
226762306a36Sopenharmony_ci			/* Data[5].ctledges[7].bchannel */ 0xFF
226862306a36Sopenharmony_ci		},
226962306a36Sopenharmony_ci
227062306a36Sopenharmony_ci		{
227162306a36Sopenharmony_ci			/* Data[6].ctledges[0].bchannel */ FREQ2FBIN(5180, 0),
227262306a36Sopenharmony_ci			/* Data[6].ctledges[1].bchannel */ FREQ2FBIN(5200, 0),
227362306a36Sopenharmony_ci			/* Data[6].ctledges[2].bchannel */ FREQ2FBIN(5220, 0),
227462306a36Sopenharmony_ci			/* Data[6].ctledges[3].bchannel */ FREQ2FBIN(5260, 0),
227562306a36Sopenharmony_ci			/* Data[6].ctledges[4].bchannel */ FREQ2FBIN(5500, 0),
227662306a36Sopenharmony_ci			/* Data[6].ctledges[5].bchannel */ FREQ2FBIN(5600, 0),
227762306a36Sopenharmony_ci			/* Data[6].ctledges[6].bchannel */ FREQ2FBIN(5700, 0),
227862306a36Sopenharmony_ci			/* Data[6].ctledges[7].bchannel */ FREQ2FBIN(5745, 0)
227962306a36Sopenharmony_ci		},
228062306a36Sopenharmony_ci
228162306a36Sopenharmony_ci		{
228262306a36Sopenharmony_ci			/* Data[7].ctledges[0].bchannel */ FREQ2FBIN(5180, 0),
228362306a36Sopenharmony_ci			/* Data[7].ctledges[1].bchannel */ FREQ2FBIN(5260, 0),
228462306a36Sopenharmony_ci			/* Data[7].ctledges[2].bchannel */ FREQ2FBIN(5320, 0),
228562306a36Sopenharmony_ci			/* Data[7].ctledges[3].bchannel */ FREQ2FBIN(5500, 0),
228662306a36Sopenharmony_ci			/* Data[7].ctledges[4].bchannel */ FREQ2FBIN(5560, 0),
228762306a36Sopenharmony_ci			/* Data[7].ctledges[5].bchannel */ FREQ2FBIN(5700, 0),
228862306a36Sopenharmony_ci			/* Data[7].ctledges[6].bchannel */ FREQ2FBIN(5745, 0),
228962306a36Sopenharmony_ci			/* Data[7].ctledges[7].bchannel */ FREQ2FBIN(5825, 0)
229062306a36Sopenharmony_ci		},
229162306a36Sopenharmony_ci
229262306a36Sopenharmony_ci		{
229362306a36Sopenharmony_ci			/* Data[8].ctledges[0].bchannel */ FREQ2FBIN(5190, 0),
229462306a36Sopenharmony_ci			/* Data[8].ctledges[1].bchannel */ FREQ2FBIN(5230, 0),
229562306a36Sopenharmony_ci			/* Data[8].ctledges[2].bchannel */ FREQ2FBIN(5270, 0),
229662306a36Sopenharmony_ci			/* Data[8].ctledges[3].bchannel */ FREQ2FBIN(5510, 0),
229762306a36Sopenharmony_ci			/* Data[8].ctledges[4].bchannel */ FREQ2FBIN(5550, 0),
229862306a36Sopenharmony_ci			/* Data[8].ctledges[5].bchannel */ FREQ2FBIN(5670, 0),
229962306a36Sopenharmony_ci			/* Data[8].ctledges[6].bchannel */ FREQ2FBIN(5755, 0),
230062306a36Sopenharmony_ci			/* Data[8].ctledges[7].bchannel */ FREQ2FBIN(5795, 0)
230162306a36Sopenharmony_ci		}
230262306a36Sopenharmony_ci	},
230362306a36Sopenharmony_ci	.ctlPowerData_5G = {
230462306a36Sopenharmony_ci		{
230562306a36Sopenharmony_ci			{
230662306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
230762306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
230862306a36Sopenharmony_ci			}
230962306a36Sopenharmony_ci		},
231062306a36Sopenharmony_ci		{
231162306a36Sopenharmony_ci			{
231262306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
231362306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
231462306a36Sopenharmony_ci			}
231562306a36Sopenharmony_ci		},
231662306a36Sopenharmony_ci		{
231762306a36Sopenharmony_ci			{
231862306a36Sopenharmony_ci				CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 1),
231962306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
232062306a36Sopenharmony_ci			}
232162306a36Sopenharmony_ci		},
232262306a36Sopenharmony_ci		{
232362306a36Sopenharmony_ci			{
232462306a36Sopenharmony_ci				CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0),
232562306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
232662306a36Sopenharmony_ci			}
232762306a36Sopenharmony_ci		},
232862306a36Sopenharmony_ci		{
232962306a36Sopenharmony_ci			{
233062306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
233162306a36Sopenharmony_ci				CTL(60, 0), CTL(60, 0), CTL(60, 0), CTL(60, 0),
233262306a36Sopenharmony_ci			}
233362306a36Sopenharmony_ci		},
233462306a36Sopenharmony_ci		{
233562306a36Sopenharmony_ci			{
233662306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
233762306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
233862306a36Sopenharmony_ci			}
233962306a36Sopenharmony_ci		},
234062306a36Sopenharmony_ci		{
234162306a36Sopenharmony_ci			{
234262306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
234362306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
234462306a36Sopenharmony_ci			}
234562306a36Sopenharmony_ci		},
234662306a36Sopenharmony_ci		{
234762306a36Sopenharmony_ci			{
234862306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
234962306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
235062306a36Sopenharmony_ci			}
235162306a36Sopenharmony_ci		},
235262306a36Sopenharmony_ci		{
235362306a36Sopenharmony_ci			{
235462306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 1), CTL(60, 1),
235562306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
235662306a36Sopenharmony_ci			}
235762306a36Sopenharmony_ci		},
235862306a36Sopenharmony_ci	}
235962306a36Sopenharmony_ci};
236062306a36Sopenharmony_ci
236162306a36Sopenharmony_cistatic const struct ar9300_eeprom ar9300_h116 = {
236262306a36Sopenharmony_ci	.eepromVersion = 2,
236362306a36Sopenharmony_ci	.templateVersion = 4,
236462306a36Sopenharmony_ci	.macAddr = {0x00, 0x03, 0x7f, 0x0, 0x0, 0x0},
236562306a36Sopenharmony_ci	.custData = {"h116-041-f0000"},
236662306a36Sopenharmony_ci	.baseEepHeader = {
236762306a36Sopenharmony_ci		.regDmn = { LE16(0), LE16(0x1f) },
236862306a36Sopenharmony_ci		.txrxMask =  0x33, /* 4 bits tx and 4 bits rx */
236962306a36Sopenharmony_ci		.opCapFlags = {
237062306a36Sopenharmony_ci			.opFlags = AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A,
237162306a36Sopenharmony_ci			.eepMisc = AR9300_EEPMISC_LITTLE_ENDIAN,
237262306a36Sopenharmony_ci		},
237362306a36Sopenharmony_ci		.rfSilent = 0,
237462306a36Sopenharmony_ci		.blueToothOptions = 0,
237562306a36Sopenharmony_ci		.deviceCap = 0,
237662306a36Sopenharmony_ci		.deviceType = 5, /* takes lower byte in eeprom location */
237762306a36Sopenharmony_ci		.pwrTableOffset = AR9300_PWR_TABLE_OFFSET,
237862306a36Sopenharmony_ci		.params_for_tuning_caps = {0, 0},
237962306a36Sopenharmony_ci		.featureEnable = 0x0d,
238062306a36Sopenharmony_ci		 /*
238162306a36Sopenharmony_ci		  * bit0 - enable tx temp comp - disabled
238262306a36Sopenharmony_ci		  * bit1 - enable tx volt comp - disabled
238362306a36Sopenharmony_ci		  * bit2 - enable fastClock - enabled
238462306a36Sopenharmony_ci		  * bit3 - enable doubling - enabled
238562306a36Sopenharmony_ci		  * bit4 - enable internal regulator - disabled
238662306a36Sopenharmony_ci		  * bit5 - enable pa predistortion - disabled
238762306a36Sopenharmony_ci		  */
238862306a36Sopenharmony_ci		.miscConfiguration = 0, /* bit0 - turn down drivestrength */
238962306a36Sopenharmony_ci		.eepromWriteEnableGpio = 6,
239062306a36Sopenharmony_ci		.wlanDisableGpio = 0,
239162306a36Sopenharmony_ci		.wlanLedGpio = 8,
239262306a36Sopenharmony_ci		.rxBandSelectGpio = 0xff,
239362306a36Sopenharmony_ci		.txrxgain = 0x10,
239462306a36Sopenharmony_ci		.swreg = 0,
239562306a36Sopenharmony_ci	 },
239662306a36Sopenharmony_ci	.modalHeader2G = {
239762306a36Sopenharmony_ci	/* ar9300_modal_eep_header  2g */
239862306a36Sopenharmony_ci		/* 4 idle,t1,t2,b(4 bits per setting) */
239962306a36Sopenharmony_ci		.antCtrlCommon = LE32(0x110),
240062306a36Sopenharmony_ci		/* 4 ra1l1, ra2l1, ra1l2, ra2l2, ra12 */
240162306a36Sopenharmony_ci		.antCtrlCommon2 = LE32(0x44444),
240262306a36Sopenharmony_ci
240362306a36Sopenharmony_ci		/*
240462306a36Sopenharmony_ci		 * antCtrlChain[AR9300_MAX_CHAINS]; 6 idle, t, r,
240562306a36Sopenharmony_ci		 * rx1, rx12, b (2 bits each)
240662306a36Sopenharmony_ci		 */
240762306a36Sopenharmony_ci		.antCtrlChain = { LE16(0x10), LE16(0x10), LE16(0x10) },
240862306a36Sopenharmony_ci
240962306a36Sopenharmony_ci		/*
241062306a36Sopenharmony_ci		 * xatten1DB[AR9300_MAX_CHAINS];  3 xatten1_db
241162306a36Sopenharmony_ci		 * for ar9280 (0xa20c/b20c 5:0)
241262306a36Sopenharmony_ci		 */
241362306a36Sopenharmony_ci		.xatten1DB = {0x1f, 0x1f, 0x1f},
241462306a36Sopenharmony_ci
241562306a36Sopenharmony_ci		/*
241662306a36Sopenharmony_ci		 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
241762306a36Sopenharmony_ci		 * for ar9280 (0xa20c/b20c 16:12
241862306a36Sopenharmony_ci		 */
241962306a36Sopenharmony_ci		.xatten1Margin = {0x12, 0x12, 0x12},
242062306a36Sopenharmony_ci		.tempSlope = 25,
242162306a36Sopenharmony_ci		.voltSlope = 0,
242262306a36Sopenharmony_ci
242362306a36Sopenharmony_ci		/*
242462306a36Sopenharmony_ci		 * spurChans[OSPREY_EEPROM_MODAL_SPURS]; spur
242562306a36Sopenharmony_ci		 * channels in usual fbin coding format
242662306a36Sopenharmony_ci		 */
242762306a36Sopenharmony_ci		.spurChans = {FREQ2FBIN(2464, 1), 0, 0, 0, 0},
242862306a36Sopenharmony_ci
242962306a36Sopenharmony_ci		/*
243062306a36Sopenharmony_ci		 * noiseFloorThreshCh[AR9300_MAX_CHAINS]; 3 Check
243162306a36Sopenharmony_ci		 * if the register is per chain
243262306a36Sopenharmony_ci		 */
243362306a36Sopenharmony_ci		.noiseFloorThreshCh = {-1, 0, 0},
243462306a36Sopenharmony_ci		.reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
243562306a36Sopenharmony_ci		.quick_drop = 0,
243662306a36Sopenharmony_ci		.xpaBiasLvl = 0,
243762306a36Sopenharmony_ci		.txFrameToDataStart = 0x0e,
243862306a36Sopenharmony_ci		.txFrameToPaOn = 0x0e,
243962306a36Sopenharmony_ci		.txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
244062306a36Sopenharmony_ci		.antennaGain = 0,
244162306a36Sopenharmony_ci		.switchSettling = 0x2c,
244262306a36Sopenharmony_ci		.adcDesiredSize = -30,
244362306a36Sopenharmony_ci		.txEndToXpaOff = 0,
244462306a36Sopenharmony_ci		.txEndToRxOn = 0x2,
244562306a36Sopenharmony_ci		.txFrameToXpaOn = 0xe,
244662306a36Sopenharmony_ci		.thresh62 = 28,
244762306a36Sopenharmony_ci		.papdRateMaskHt20 = LE32(0x0c80C080),
244862306a36Sopenharmony_ci		.papdRateMaskHt40 = LE32(0x0080C080),
244962306a36Sopenharmony_ci		.switchcomspdt = 0,
245062306a36Sopenharmony_ci		.xlna_bias_strength = 0,
245162306a36Sopenharmony_ci		.futureModal = {
245262306a36Sopenharmony_ci			0, 0, 0, 0, 0, 0, 0,
245362306a36Sopenharmony_ci		},
245462306a36Sopenharmony_ci	 },
245562306a36Sopenharmony_ci	 .base_ext1 = {
245662306a36Sopenharmony_ci		.ant_div_control = 0,
245762306a36Sopenharmony_ci		.future = {0, 0},
245862306a36Sopenharmony_ci		.tempslopextension = {0, 0, 0, 0, 0, 0, 0, 0}
245962306a36Sopenharmony_ci	 },
246062306a36Sopenharmony_ci	.calFreqPier2G = {
246162306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
246262306a36Sopenharmony_ci		FREQ2FBIN(2437, 1),
246362306a36Sopenharmony_ci		FREQ2FBIN(2462, 1),
246462306a36Sopenharmony_ci	 },
246562306a36Sopenharmony_ci	/* ar9300_cal_data_per_freq_op_loop 2g */
246662306a36Sopenharmony_ci	.calPierData2G = {
246762306a36Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
246862306a36Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
246962306a36Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
247062306a36Sopenharmony_ci	 },
247162306a36Sopenharmony_ci	.calTarget_freqbin_Cck = {
247262306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
247362306a36Sopenharmony_ci		FREQ2FBIN(2472, 1),
247462306a36Sopenharmony_ci	 },
247562306a36Sopenharmony_ci	.calTarget_freqbin_2G = {
247662306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
247762306a36Sopenharmony_ci		FREQ2FBIN(2437, 1),
247862306a36Sopenharmony_ci		FREQ2FBIN(2472, 1)
247962306a36Sopenharmony_ci	 },
248062306a36Sopenharmony_ci	.calTarget_freqbin_2GHT20 = {
248162306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
248262306a36Sopenharmony_ci		FREQ2FBIN(2437, 1),
248362306a36Sopenharmony_ci		FREQ2FBIN(2472, 1)
248462306a36Sopenharmony_ci	 },
248562306a36Sopenharmony_ci	.calTarget_freqbin_2GHT40 = {
248662306a36Sopenharmony_ci		FREQ2FBIN(2412, 1),
248762306a36Sopenharmony_ci		FREQ2FBIN(2437, 1),
248862306a36Sopenharmony_ci		FREQ2FBIN(2472, 1)
248962306a36Sopenharmony_ci	 },
249062306a36Sopenharmony_ci	.calTargetPowerCck = {
249162306a36Sopenharmony_ci		 /* 1L-5L,5S,11L,11S */
249262306a36Sopenharmony_ci		 { {34, 34, 34, 34} },
249362306a36Sopenharmony_ci		 { {34, 34, 34, 34} },
249462306a36Sopenharmony_ci	},
249562306a36Sopenharmony_ci	.calTargetPower2G = {
249662306a36Sopenharmony_ci		 /* 6-24,36,48,54 */
249762306a36Sopenharmony_ci		 { {34, 34, 32, 32} },
249862306a36Sopenharmony_ci		 { {34, 34, 32, 32} },
249962306a36Sopenharmony_ci		 { {34, 34, 32, 32} },
250062306a36Sopenharmony_ci	},
250162306a36Sopenharmony_ci	.calTargetPower2GHT20 = {
250262306a36Sopenharmony_ci		{ {32, 32, 32, 32, 32, 30, 32, 32, 30, 28, 0, 0, 0, 0} },
250362306a36Sopenharmony_ci		{ {32, 32, 32, 32, 32, 30, 32, 32, 30, 28, 0, 0, 0, 0} },
250462306a36Sopenharmony_ci		{ {32, 32, 32, 32, 32, 30, 32, 32, 30, 28, 0, 0, 0, 0} },
250562306a36Sopenharmony_ci	},
250662306a36Sopenharmony_ci	.calTargetPower2GHT40 = {
250762306a36Sopenharmony_ci		{ {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 0, 0, 0, 0} },
250862306a36Sopenharmony_ci		{ {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 0, 0, 0, 0} },
250962306a36Sopenharmony_ci		{ {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 0, 0, 0, 0} },
251062306a36Sopenharmony_ci	},
251162306a36Sopenharmony_ci	.ctlIndex_2G =  {
251262306a36Sopenharmony_ci		0x11, 0x12, 0x15, 0x17, 0x41, 0x42,
251362306a36Sopenharmony_ci		0x45, 0x47, 0x31, 0x32, 0x35, 0x37,
251462306a36Sopenharmony_ci	},
251562306a36Sopenharmony_ci	.ctl_freqbin_2G = {
251662306a36Sopenharmony_ci		{
251762306a36Sopenharmony_ci			FREQ2FBIN(2412, 1),
251862306a36Sopenharmony_ci			FREQ2FBIN(2417, 1),
251962306a36Sopenharmony_ci			FREQ2FBIN(2457, 1),
252062306a36Sopenharmony_ci			FREQ2FBIN(2462, 1)
252162306a36Sopenharmony_ci		},
252262306a36Sopenharmony_ci		{
252362306a36Sopenharmony_ci			FREQ2FBIN(2412, 1),
252462306a36Sopenharmony_ci			FREQ2FBIN(2417, 1),
252562306a36Sopenharmony_ci			FREQ2FBIN(2462, 1),
252662306a36Sopenharmony_ci			0xFF,
252762306a36Sopenharmony_ci		},
252862306a36Sopenharmony_ci
252962306a36Sopenharmony_ci		{
253062306a36Sopenharmony_ci			FREQ2FBIN(2412, 1),
253162306a36Sopenharmony_ci			FREQ2FBIN(2417, 1),
253262306a36Sopenharmony_ci			FREQ2FBIN(2462, 1),
253362306a36Sopenharmony_ci			0xFF,
253462306a36Sopenharmony_ci		},
253562306a36Sopenharmony_ci		{
253662306a36Sopenharmony_ci			FREQ2FBIN(2422, 1),
253762306a36Sopenharmony_ci			FREQ2FBIN(2427, 1),
253862306a36Sopenharmony_ci			FREQ2FBIN(2447, 1),
253962306a36Sopenharmony_ci			FREQ2FBIN(2452, 1)
254062306a36Sopenharmony_ci		},
254162306a36Sopenharmony_ci
254262306a36Sopenharmony_ci		{
254362306a36Sopenharmony_ci			/* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
254462306a36Sopenharmony_ci			/* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
254562306a36Sopenharmony_ci			/* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
254662306a36Sopenharmony_ci			/* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(2484, 1),
254762306a36Sopenharmony_ci		},
254862306a36Sopenharmony_ci
254962306a36Sopenharmony_ci		{
255062306a36Sopenharmony_ci			/* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
255162306a36Sopenharmony_ci			/* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
255262306a36Sopenharmony_ci			/* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
255362306a36Sopenharmony_ci			0,
255462306a36Sopenharmony_ci		},
255562306a36Sopenharmony_ci
255662306a36Sopenharmony_ci		{
255762306a36Sopenharmony_ci			/* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
255862306a36Sopenharmony_ci			/* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
255962306a36Sopenharmony_ci			FREQ2FBIN(2472, 1),
256062306a36Sopenharmony_ci			0,
256162306a36Sopenharmony_ci		},
256262306a36Sopenharmony_ci
256362306a36Sopenharmony_ci		{
256462306a36Sopenharmony_ci			/* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
256562306a36Sopenharmony_ci			/* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
256662306a36Sopenharmony_ci			/* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
256762306a36Sopenharmony_ci			/* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
256862306a36Sopenharmony_ci		},
256962306a36Sopenharmony_ci
257062306a36Sopenharmony_ci		{
257162306a36Sopenharmony_ci			/* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
257262306a36Sopenharmony_ci			/* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
257362306a36Sopenharmony_ci			/* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
257462306a36Sopenharmony_ci		},
257562306a36Sopenharmony_ci
257662306a36Sopenharmony_ci		{
257762306a36Sopenharmony_ci			/* Data[9].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
257862306a36Sopenharmony_ci			/* Data[9].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
257962306a36Sopenharmony_ci			/* Data[9].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
258062306a36Sopenharmony_ci			0
258162306a36Sopenharmony_ci		},
258262306a36Sopenharmony_ci
258362306a36Sopenharmony_ci		{
258462306a36Sopenharmony_ci			/* Data[10].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
258562306a36Sopenharmony_ci			/* Data[10].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
258662306a36Sopenharmony_ci			/* Data[10].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
258762306a36Sopenharmony_ci			0
258862306a36Sopenharmony_ci		},
258962306a36Sopenharmony_ci
259062306a36Sopenharmony_ci		{
259162306a36Sopenharmony_ci			/* Data[11].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
259262306a36Sopenharmony_ci			/* Data[11].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
259362306a36Sopenharmony_ci			/* Data[11].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
259462306a36Sopenharmony_ci			/* Data[11].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
259562306a36Sopenharmony_ci		}
259662306a36Sopenharmony_ci	 },
259762306a36Sopenharmony_ci	.ctlPowerData_2G = {
259862306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
259962306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
260062306a36Sopenharmony_ci		 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } },
260162306a36Sopenharmony_ci
260262306a36Sopenharmony_ci		 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } },
260362306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
260462306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
260562306a36Sopenharmony_ci
260662306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } },
260762306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
260862306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
260962306a36Sopenharmony_ci
261062306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
261162306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
261262306a36Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
261362306a36Sopenharmony_ci	 },
261462306a36Sopenharmony_ci	.modalHeader5G = {
261562306a36Sopenharmony_ci		/* 4 idle,t1,t2,b (4 bits per setting) */
261662306a36Sopenharmony_ci		.antCtrlCommon = LE32(0x220),
261762306a36Sopenharmony_ci		/* 4 ra1l1, ra2l1, ra1l2,ra2l2,ra12 */
261862306a36Sopenharmony_ci		.antCtrlCommon2 = LE32(0x44444),
261962306a36Sopenharmony_ci		 /* antCtrlChain 6 idle, t,r,rx1,rx12,b (2 bits each) */
262062306a36Sopenharmony_ci		.antCtrlChain = {
262162306a36Sopenharmony_ci			LE16(0x150), LE16(0x150), LE16(0x150),
262262306a36Sopenharmony_ci		},
262362306a36Sopenharmony_ci		 /* xatten1DB 3 xatten1_db for AR9280 (0xa20c/b20c 5:0) */
262462306a36Sopenharmony_ci		.xatten1DB = {0x19, 0x19, 0x19},
262562306a36Sopenharmony_ci
262662306a36Sopenharmony_ci		/*
262762306a36Sopenharmony_ci		 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
262862306a36Sopenharmony_ci		 * for merlin (0xa20c/b20c 16:12
262962306a36Sopenharmony_ci		 */
263062306a36Sopenharmony_ci		.xatten1Margin = {0x14, 0x14, 0x14},
263162306a36Sopenharmony_ci		.tempSlope = 70,
263262306a36Sopenharmony_ci		.voltSlope = 0,
263362306a36Sopenharmony_ci		/* spurChans spur channels in usual fbin coding format */
263462306a36Sopenharmony_ci		.spurChans = {0, 0, 0, 0, 0},
263562306a36Sopenharmony_ci		/* noiseFloorThreshCh Check if the register is per chain */
263662306a36Sopenharmony_ci		.noiseFloorThreshCh = {-1, 0, 0},
263762306a36Sopenharmony_ci		.reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
263862306a36Sopenharmony_ci		.quick_drop = 0,
263962306a36Sopenharmony_ci		.xpaBiasLvl = 0,
264062306a36Sopenharmony_ci		.txFrameToDataStart = 0x0e,
264162306a36Sopenharmony_ci		.txFrameToPaOn = 0x0e,
264262306a36Sopenharmony_ci		.txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
264362306a36Sopenharmony_ci		.antennaGain = 0,
264462306a36Sopenharmony_ci		.switchSettling = 0x2d,
264562306a36Sopenharmony_ci		.adcDesiredSize = -30,
264662306a36Sopenharmony_ci		.txEndToXpaOff = 0,
264762306a36Sopenharmony_ci		.txEndToRxOn = 0x2,
264862306a36Sopenharmony_ci		.txFrameToXpaOn = 0xe,
264962306a36Sopenharmony_ci		.thresh62 = 28,
265062306a36Sopenharmony_ci		.papdRateMaskHt20 = LE32(0x0cf0e0e0),
265162306a36Sopenharmony_ci		.papdRateMaskHt40 = LE32(0x6cf0e0e0),
265262306a36Sopenharmony_ci		.switchcomspdt = 0,
265362306a36Sopenharmony_ci		.xlna_bias_strength = 0,
265462306a36Sopenharmony_ci		.futureModal = {
265562306a36Sopenharmony_ci			0, 0, 0, 0, 0, 0, 0,
265662306a36Sopenharmony_ci		},
265762306a36Sopenharmony_ci	 },
265862306a36Sopenharmony_ci	.base_ext2 = {
265962306a36Sopenharmony_ci		.tempSlopeLow = 35,
266062306a36Sopenharmony_ci		.tempSlopeHigh = 50,
266162306a36Sopenharmony_ci		.xatten1DBLow = {0, 0, 0},
266262306a36Sopenharmony_ci		.xatten1MarginLow = {0, 0, 0},
266362306a36Sopenharmony_ci		.xatten1DBHigh = {0, 0, 0},
266462306a36Sopenharmony_ci		.xatten1MarginHigh = {0, 0, 0}
266562306a36Sopenharmony_ci	 },
266662306a36Sopenharmony_ci	.calFreqPier5G = {
266762306a36Sopenharmony_ci		FREQ2FBIN(5160, 0),
266862306a36Sopenharmony_ci		FREQ2FBIN(5220, 0),
266962306a36Sopenharmony_ci		FREQ2FBIN(5320, 0),
267062306a36Sopenharmony_ci		FREQ2FBIN(5400, 0),
267162306a36Sopenharmony_ci		FREQ2FBIN(5500, 0),
267262306a36Sopenharmony_ci		FREQ2FBIN(5600, 0),
267362306a36Sopenharmony_ci		FREQ2FBIN(5700, 0),
267462306a36Sopenharmony_ci		FREQ2FBIN(5785, 0)
267562306a36Sopenharmony_ci	},
267662306a36Sopenharmony_ci	.calPierData5G = {
267762306a36Sopenharmony_ci			{
267862306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
267962306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
268062306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
268162306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
268262306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
268362306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
268462306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
268562306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
268662306a36Sopenharmony_ci			},
268762306a36Sopenharmony_ci			{
268862306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
268962306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
269062306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
269162306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
269262306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
269362306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
269462306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
269562306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
269662306a36Sopenharmony_ci			},
269762306a36Sopenharmony_ci			{
269862306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
269962306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
270062306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
270162306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
270262306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
270362306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
270462306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
270562306a36Sopenharmony_ci				{0, 0, 0, 0, 0},
270662306a36Sopenharmony_ci			},
270762306a36Sopenharmony_ci
270862306a36Sopenharmony_ci	},
270962306a36Sopenharmony_ci	.calTarget_freqbin_5G = {
271062306a36Sopenharmony_ci		FREQ2FBIN(5180, 0),
271162306a36Sopenharmony_ci		FREQ2FBIN(5240, 0),
271262306a36Sopenharmony_ci		FREQ2FBIN(5320, 0),
271362306a36Sopenharmony_ci		FREQ2FBIN(5400, 0),
271462306a36Sopenharmony_ci		FREQ2FBIN(5500, 0),
271562306a36Sopenharmony_ci		FREQ2FBIN(5600, 0),
271662306a36Sopenharmony_ci		FREQ2FBIN(5700, 0),
271762306a36Sopenharmony_ci		FREQ2FBIN(5825, 0)
271862306a36Sopenharmony_ci	},
271962306a36Sopenharmony_ci	.calTarget_freqbin_5GHT20 = {
272062306a36Sopenharmony_ci		FREQ2FBIN(5180, 0),
272162306a36Sopenharmony_ci		FREQ2FBIN(5240, 0),
272262306a36Sopenharmony_ci		FREQ2FBIN(5320, 0),
272362306a36Sopenharmony_ci		FREQ2FBIN(5400, 0),
272462306a36Sopenharmony_ci		FREQ2FBIN(5500, 0),
272562306a36Sopenharmony_ci		FREQ2FBIN(5700, 0),
272662306a36Sopenharmony_ci		FREQ2FBIN(5745, 0),
272762306a36Sopenharmony_ci		FREQ2FBIN(5825, 0)
272862306a36Sopenharmony_ci	},
272962306a36Sopenharmony_ci	.calTarget_freqbin_5GHT40 = {
273062306a36Sopenharmony_ci		FREQ2FBIN(5180, 0),
273162306a36Sopenharmony_ci		FREQ2FBIN(5240, 0),
273262306a36Sopenharmony_ci		FREQ2FBIN(5320, 0),
273362306a36Sopenharmony_ci		FREQ2FBIN(5400, 0),
273462306a36Sopenharmony_ci		FREQ2FBIN(5500, 0),
273562306a36Sopenharmony_ci		FREQ2FBIN(5700, 0),
273662306a36Sopenharmony_ci		FREQ2FBIN(5745, 0),
273762306a36Sopenharmony_ci		FREQ2FBIN(5825, 0)
273862306a36Sopenharmony_ci	 },
273962306a36Sopenharmony_ci	.calTargetPower5G = {
274062306a36Sopenharmony_ci		/* 6-24,36,48,54 */
274162306a36Sopenharmony_ci		{ {30, 30, 28, 24} },
274262306a36Sopenharmony_ci		{ {30, 30, 28, 24} },
274362306a36Sopenharmony_ci		{ {30, 30, 28, 24} },
274462306a36Sopenharmony_ci		{ {30, 30, 28, 24} },
274562306a36Sopenharmony_ci		{ {30, 30, 28, 24} },
274662306a36Sopenharmony_ci		{ {30, 30, 28, 24} },
274762306a36Sopenharmony_ci		{ {30, 30, 28, 24} },
274862306a36Sopenharmony_ci		{ {30, 30, 28, 24} },
274962306a36Sopenharmony_ci	 },
275062306a36Sopenharmony_ci	.calTargetPower5GHT20 = {
275162306a36Sopenharmony_ci		/*
275262306a36Sopenharmony_ci		 * 0_8_16,1-3_9-11_17-19,
275362306a36Sopenharmony_ci		 * 4,5,6,7,12,13,14,15,20,21,22,23
275462306a36Sopenharmony_ci		 */
275562306a36Sopenharmony_ci		{ {30, 30, 30, 28, 24, 20, 30, 28, 24, 20, 0, 0, 0, 0} },
275662306a36Sopenharmony_ci		{ {30, 30, 30, 28, 24, 20, 30, 28, 24, 20, 0, 0, 0, 0} },
275762306a36Sopenharmony_ci		{ {30, 30, 30, 26, 22, 18, 30, 26, 22, 18, 0, 0, 0, 0} },
275862306a36Sopenharmony_ci		{ {30, 30, 30, 26, 22, 18, 30, 26, 22, 18, 0, 0, 0, 0} },
275962306a36Sopenharmony_ci		{ {30, 30, 30, 24, 20, 16, 30, 24, 20, 16, 0, 0, 0, 0} },
276062306a36Sopenharmony_ci		{ {30, 30, 30, 24, 20, 16, 30, 24, 20, 16, 0, 0, 0, 0} },
276162306a36Sopenharmony_ci		{ {30, 30, 30, 22, 18, 14, 30, 22, 18, 14, 0, 0, 0, 0} },
276262306a36Sopenharmony_ci		{ {30, 30, 30, 22, 18, 14, 30, 22, 18, 14, 0, 0, 0, 0} },
276362306a36Sopenharmony_ci	 },
276462306a36Sopenharmony_ci	.calTargetPower5GHT40 =  {
276562306a36Sopenharmony_ci		/*
276662306a36Sopenharmony_ci		 * 0_8_16,1-3_9-11_17-19,
276762306a36Sopenharmony_ci		 * 4,5,6,7,12,13,14,15,20,21,22,23
276862306a36Sopenharmony_ci		 */
276962306a36Sopenharmony_ci		{ {28, 28, 28, 26, 22, 18, 28, 26, 22, 18, 0, 0, 0, 0} },
277062306a36Sopenharmony_ci		{ {28, 28, 28, 26, 22, 18, 28, 26, 22, 18, 0, 0, 0, 0} },
277162306a36Sopenharmony_ci		{ {28, 28, 28, 24, 20, 16, 28, 24, 20, 16, 0, 0, 0, 0} },
277262306a36Sopenharmony_ci		{ {28, 28, 28, 24, 20, 16, 28, 24, 20, 16, 0, 0, 0, 0} },
277362306a36Sopenharmony_ci		{ {28, 28, 28, 22, 18, 14, 28, 22, 18, 14, 0, 0, 0, 0} },
277462306a36Sopenharmony_ci		{ {28, 28, 28, 22, 18, 14, 28, 22, 18, 14, 0, 0, 0, 0} },
277562306a36Sopenharmony_ci		{ {28, 28, 28, 20, 16, 12, 28, 20, 16, 12, 0, 0, 0, 0} },
277662306a36Sopenharmony_ci		{ {28, 28, 28, 20, 16, 12, 28, 20, 16, 12, 0, 0, 0, 0} },
277762306a36Sopenharmony_ci	 },
277862306a36Sopenharmony_ci	.ctlIndex_5G =  {
277962306a36Sopenharmony_ci		0x10, 0x16, 0x18, 0x40, 0x46,
278062306a36Sopenharmony_ci		0x48, 0x30, 0x36, 0x38
278162306a36Sopenharmony_ci	},
278262306a36Sopenharmony_ci	.ctl_freqbin_5G =  {
278362306a36Sopenharmony_ci		{
278462306a36Sopenharmony_ci			/* Data[0].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
278562306a36Sopenharmony_ci			/* Data[0].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
278662306a36Sopenharmony_ci			/* Data[0].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
278762306a36Sopenharmony_ci			/* Data[0].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
278862306a36Sopenharmony_ci			/* Data[0].ctlEdges[4].bChannel */ FREQ2FBIN(5600, 0),
278962306a36Sopenharmony_ci			/* Data[0].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
279062306a36Sopenharmony_ci			/* Data[0].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
279162306a36Sopenharmony_ci			/* Data[0].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
279262306a36Sopenharmony_ci		},
279362306a36Sopenharmony_ci		{
279462306a36Sopenharmony_ci			/* Data[1].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
279562306a36Sopenharmony_ci			/* Data[1].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
279662306a36Sopenharmony_ci			/* Data[1].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
279762306a36Sopenharmony_ci			/* Data[1].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
279862306a36Sopenharmony_ci			/* Data[1].ctlEdges[4].bChannel */ FREQ2FBIN(5520, 0),
279962306a36Sopenharmony_ci			/* Data[1].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
280062306a36Sopenharmony_ci			/* Data[1].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
280162306a36Sopenharmony_ci			/* Data[1].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
280262306a36Sopenharmony_ci		},
280362306a36Sopenharmony_ci
280462306a36Sopenharmony_ci		{
280562306a36Sopenharmony_ci			/* Data[2].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
280662306a36Sopenharmony_ci			/* Data[2].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
280762306a36Sopenharmony_ci			/* Data[2].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
280862306a36Sopenharmony_ci			/* Data[2].ctlEdges[3].bChannel */ FREQ2FBIN(5310, 0),
280962306a36Sopenharmony_ci			/* Data[2].ctlEdges[4].bChannel */ FREQ2FBIN(5510, 0),
281062306a36Sopenharmony_ci			/* Data[2].ctlEdges[5].bChannel */ FREQ2FBIN(5550, 0),
281162306a36Sopenharmony_ci			/* Data[2].ctlEdges[6].bChannel */ FREQ2FBIN(5670, 0),
281262306a36Sopenharmony_ci			/* Data[2].ctlEdges[7].bChannel */ FREQ2FBIN(5755, 0)
281362306a36Sopenharmony_ci		},
281462306a36Sopenharmony_ci
281562306a36Sopenharmony_ci		{
281662306a36Sopenharmony_ci			/* Data[3].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
281762306a36Sopenharmony_ci			/* Data[3].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
281862306a36Sopenharmony_ci			/* Data[3].ctlEdges[2].bChannel */ FREQ2FBIN(5260, 0),
281962306a36Sopenharmony_ci			/* Data[3].ctlEdges[3].bChannel */ FREQ2FBIN(5320, 0),
282062306a36Sopenharmony_ci			/* Data[3].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
282162306a36Sopenharmony_ci			/* Data[3].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
282262306a36Sopenharmony_ci			/* Data[3].ctlEdges[6].bChannel */ 0xFF,
282362306a36Sopenharmony_ci			/* Data[3].ctlEdges[7].bChannel */ 0xFF,
282462306a36Sopenharmony_ci		},
282562306a36Sopenharmony_ci
282662306a36Sopenharmony_ci		{
282762306a36Sopenharmony_ci			/* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
282862306a36Sopenharmony_ci			/* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
282962306a36Sopenharmony_ci			/* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(5500, 0),
283062306a36Sopenharmony_ci			/* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(5700, 0),
283162306a36Sopenharmony_ci			/* Data[4].ctlEdges[4].bChannel */ 0xFF,
283262306a36Sopenharmony_ci			/* Data[4].ctlEdges[5].bChannel */ 0xFF,
283362306a36Sopenharmony_ci			/* Data[4].ctlEdges[6].bChannel */ 0xFF,
283462306a36Sopenharmony_ci			/* Data[4].ctlEdges[7].bChannel */ 0xFF,
283562306a36Sopenharmony_ci		},
283662306a36Sopenharmony_ci
283762306a36Sopenharmony_ci		{
283862306a36Sopenharmony_ci			/* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
283962306a36Sopenharmony_ci			/* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(5270, 0),
284062306a36Sopenharmony_ci			/* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(5310, 0),
284162306a36Sopenharmony_ci			/* Data[5].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
284262306a36Sopenharmony_ci			/* Data[5].ctlEdges[4].bChannel */ FREQ2FBIN(5590, 0),
284362306a36Sopenharmony_ci			/* Data[5].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
284462306a36Sopenharmony_ci			/* Data[5].ctlEdges[6].bChannel */ 0xFF,
284562306a36Sopenharmony_ci			/* Data[5].ctlEdges[7].bChannel */ 0xFF
284662306a36Sopenharmony_ci		},
284762306a36Sopenharmony_ci
284862306a36Sopenharmony_ci		{
284962306a36Sopenharmony_ci			/* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
285062306a36Sopenharmony_ci			/* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
285162306a36Sopenharmony_ci			/* Data[6].ctlEdges[2].bChannel */ FREQ2FBIN(5220, 0),
285262306a36Sopenharmony_ci			/* Data[6].ctlEdges[3].bChannel */ FREQ2FBIN(5260, 0),
285362306a36Sopenharmony_ci			/* Data[6].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
285462306a36Sopenharmony_ci			/* Data[6].ctlEdges[5].bChannel */ FREQ2FBIN(5600, 0),
285562306a36Sopenharmony_ci			/* Data[6].ctlEdges[6].bChannel */ FREQ2FBIN(5700, 0),
285662306a36Sopenharmony_ci			/* Data[6].ctlEdges[7].bChannel */ FREQ2FBIN(5745, 0)
285762306a36Sopenharmony_ci		},
285862306a36Sopenharmony_ci
285962306a36Sopenharmony_ci		{
286062306a36Sopenharmony_ci			/* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
286162306a36Sopenharmony_ci			/* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
286262306a36Sopenharmony_ci			/* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(5320, 0),
286362306a36Sopenharmony_ci			/* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
286462306a36Sopenharmony_ci			/* Data[7].ctlEdges[4].bChannel */ FREQ2FBIN(5560, 0),
286562306a36Sopenharmony_ci			/* Data[7].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
286662306a36Sopenharmony_ci			/* Data[7].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
286762306a36Sopenharmony_ci			/* Data[7].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
286862306a36Sopenharmony_ci		},
286962306a36Sopenharmony_ci
287062306a36Sopenharmony_ci		{
287162306a36Sopenharmony_ci			/* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
287262306a36Sopenharmony_ci			/* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
287362306a36Sopenharmony_ci			/* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
287462306a36Sopenharmony_ci			/* Data[8].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
287562306a36Sopenharmony_ci			/* Data[8].ctlEdges[4].bChannel */ FREQ2FBIN(5550, 0),
287662306a36Sopenharmony_ci			/* Data[8].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
287762306a36Sopenharmony_ci			/* Data[8].ctlEdges[6].bChannel */ FREQ2FBIN(5755, 0),
287862306a36Sopenharmony_ci			/* Data[8].ctlEdges[7].bChannel */ FREQ2FBIN(5795, 0)
287962306a36Sopenharmony_ci		}
288062306a36Sopenharmony_ci	 },
288162306a36Sopenharmony_ci	.ctlPowerData_5G = {
288262306a36Sopenharmony_ci		{
288362306a36Sopenharmony_ci			{
288462306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
288562306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
288662306a36Sopenharmony_ci			}
288762306a36Sopenharmony_ci		},
288862306a36Sopenharmony_ci		{
288962306a36Sopenharmony_ci			{
289062306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
289162306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
289262306a36Sopenharmony_ci			}
289362306a36Sopenharmony_ci		},
289462306a36Sopenharmony_ci		{
289562306a36Sopenharmony_ci			{
289662306a36Sopenharmony_ci				CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 1),
289762306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
289862306a36Sopenharmony_ci			}
289962306a36Sopenharmony_ci		},
290062306a36Sopenharmony_ci		{
290162306a36Sopenharmony_ci			{
290262306a36Sopenharmony_ci				CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0),
290362306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
290462306a36Sopenharmony_ci			}
290562306a36Sopenharmony_ci		},
290662306a36Sopenharmony_ci		{
290762306a36Sopenharmony_ci			{
290862306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
290962306a36Sopenharmony_ci				CTL(60, 0), CTL(60, 0), CTL(60, 0), CTL(60, 0),
291062306a36Sopenharmony_ci			}
291162306a36Sopenharmony_ci		},
291262306a36Sopenharmony_ci		{
291362306a36Sopenharmony_ci			{
291462306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
291562306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
291662306a36Sopenharmony_ci			}
291762306a36Sopenharmony_ci		},
291862306a36Sopenharmony_ci		{
291962306a36Sopenharmony_ci			{
292062306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
292162306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
292262306a36Sopenharmony_ci			}
292362306a36Sopenharmony_ci		},
292462306a36Sopenharmony_ci		{
292562306a36Sopenharmony_ci			{
292662306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
292762306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
292862306a36Sopenharmony_ci			}
292962306a36Sopenharmony_ci		},
293062306a36Sopenharmony_ci		{
293162306a36Sopenharmony_ci			{
293262306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 1), CTL(60, 1),
293362306a36Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
293462306a36Sopenharmony_ci			}
293562306a36Sopenharmony_ci		},
293662306a36Sopenharmony_ci	 }
293762306a36Sopenharmony_ci};
293862306a36Sopenharmony_ci
293962306a36Sopenharmony_ci
294062306a36Sopenharmony_cistatic const struct ar9300_eeprom *ar9300_eep_templates[] = {
294162306a36Sopenharmony_ci	&ar9300_default,
294262306a36Sopenharmony_ci	&ar9300_x112,
294362306a36Sopenharmony_ci	&ar9300_h116,
294462306a36Sopenharmony_ci	&ar9300_h112,
294562306a36Sopenharmony_ci	&ar9300_x113,
294662306a36Sopenharmony_ci};
294762306a36Sopenharmony_ci
294862306a36Sopenharmony_cistatic const struct ar9300_eeprom *ar9003_eeprom_struct_find_by_id(int id)
294962306a36Sopenharmony_ci{
295062306a36Sopenharmony_ci	int it;
295162306a36Sopenharmony_ci
295262306a36Sopenharmony_ci	for (it = 0; it < ARRAY_SIZE(ar9300_eep_templates); it++)
295362306a36Sopenharmony_ci		if (ar9300_eep_templates[it]->templateVersion == id)
295462306a36Sopenharmony_ci			return ar9300_eep_templates[it];
295562306a36Sopenharmony_ci	return NULL;
295662306a36Sopenharmony_ci}
295762306a36Sopenharmony_ci
295862306a36Sopenharmony_cistatic int ath9k_hw_ar9300_check_eeprom(struct ath_hw *ah)
295962306a36Sopenharmony_ci{
296062306a36Sopenharmony_ci	return 0;
296162306a36Sopenharmony_ci}
296262306a36Sopenharmony_ci
296362306a36Sopenharmony_cistatic int interpolate(int x, int xa, int xb, int ya, int yb)
296462306a36Sopenharmony_ci{
296562306a36Sopenharmony_ci	int bf, factor, plus;
296662306a36Sopenharmony_ci
296762306a36Sopenharmony_ci	bf = 2 * (yb - ya) * (x - xa) / (xb - xa);
296862306a36Sopenharmony_ci	factor = bf / 2;
296962306a36Sopenharmony_ci	plus = bf % 2;
297062306a36Sopenharmony_ci	return ya + factor + plus;
297162306a36Sopenharmony_ci}
297262306a36Sopenharmony_ci
297362306a36Sopenharmony_cistatic u32 ath9k_hw_ar9300_get_eeprom(struct ath_hw *ah,
297462306a36Sopenharmony_ci				      enum eeprom_param param)
297562306a36Sopenharmony_ci{
297662306a36Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
297762306a36Sopenharmony_ci	struct ar9300_base_eep_hdr *pBase = &eep->baseEepHeader;
297862306a36Sopenharmony_ci
297962306a36Sopenharmony_ci	switch (param) {
298062306a36Sopenharmony_ci	case EEP_MAC_LSW:
298162306a36Sopenharmony_ci		return get_unaligned_be16(eep->macAddr);
298262306a36Sopenharmony_ci	case EEP_MAC_MID:
298362306a36Sopenharmony_ci		return get_unaligned_be16(eep->macAddr + 2);
298462306a36Sopenharmony_ci	case EEP_MAC_MSW:
298562306a36Sopenharmony_ci		return get_unaligned_be16(eep->macAddr + 4);
298662306a36Sopenharmony_ci	case EEP_REG_0:
298762306a36Sopenharmony_ci		return le16_to_cpu(pBase->regDmn[0]);
298862306a36Sopenharmony_ci	case EEP_OP_CAP:
298962306a36Sopenharmony_ci		return pBase->deviceCap;
299062306a36Sopenharmony_ci	case EEP_OP_MODE:
299162306a36Sopenharmony_ci		return pBase->opCapFlags.opFlags;
299262306a36Sopenharmony_ci	case EEP_RF_SILENT:
299362306a36Sopenharmony_ci		return pBase->rfSilent;
299462306a36Sopenharmony_ci	case EEP_TX_MASK:
299562306a36Sopenharmony_ci		return (pBase->txrxMask >> 4) & 0xf;
299662306a36Sopenharmony_ci	case EEP_RX_MASK:
299762306a36Sopenharmony_ci		return pBase->txrxMask & 0xf;
299862306a36Sopenharmony_ci	case EEP_PAPRD:
299962306a36Sopenharmony_ci		return !!(pBase->featureEnable & BIT(5));
300062306a36Sopenharmony_ci	case EEP_CHAIN_MASK_REDUCE:
300162306a36Sopenharmony_ci		return (pBase->miscConfiguration >> 0x3) & 0x1;
300262306a36Sopenharmony_ci	case EEP_ANT_DIV_CTL1:
300362306a36Sopenharmony_ci		if (AR_SREV_9565(ah))
300462306a36Sopenharmony_ci			return AR9300_EEP_ANTDIV_CONTROL_DEFAULT_VALUE;
300562306a36Sopenharmony_ci		else
300662306a36Sopenharmony_ci			return eep->base_ext1.ant_div_control;
300762306a36Sopenharmony_ci	case EEP_ANTENNA_GAIN_5G:
300862306a36Sopenharmony_ci		return eep->modalHeader5G.antennaGain;
300962306a36Sopenharmony_ci	case EEP_ANTENNA_GAIN_2G:
301062306a36Sopenharmony_ci		return eep->modalHeader2G.antennaGain;
301162306a36Sopenharmony_ci	default:
301262306a36Sopenharmony_ci		return 0;
301362306a36Sopenharmony_ci	}
301462306a36Sopenharmony_ci}
301562306a36Sopenharmony_ci
301662306a36Sopenharmony_cistatic bool ar9300_eeprom_read_byte(struct ath_hw *ah, int address,
301762306a36Sopenharmony_ci				    u8 *buffer)
301862306a36Sopenharmony_ci{
301962306a36Sopenharmony_ci	u16 val;
302062306a36Sopenharmony_ci
302162306a36Sopenharmony_ci	if (unlikely(!ath9k_hw_nvram_read(ah, address / 2, &val)))
302262306a36Sopenharmony_ci		return false;
302362306a36Sopenharmony_ci
302462306a36Sopenharmony_ci	*buffer = (val >> (8 * (address % 2))) & 0xff;
302562306a36Sopenharmony_ci	return true;
302662306a36Sopenharmony_ci}
302762306a36Sopenharmony_ci
302862306a36Sopenharmony_cistatic bool ar9300_eeprom_read_word(struct ath_hw *ah, int address,
302962306a36Sopenharmony_ci				    u8 *buffer)
303062306a36Sopenharmony_ci{
303162306a36Sopenharmony_ci	u16 val;
303262306a36Sopenharmony_ci
303362306a36Sopenharmony_ci	if (unlikely(!ath9k_hw_nvram_read(ah, address / 2, &val)))
303462306a36Sopenharmony_ci		return false;
303562306a36Sopenharmony_ci
303662306a36Sopenharmony_ci	buffer[0] = val >> 8;
303762306a36Sopenharmony_ci	buffer[1] = val & 0xff;
303862306a36Sopenharmony_ci
303962306a36Sopenharmony_ci	return true;
304062306a36Sopenharmony_ci}
304162306a36Sopenharmony_ci
304262306a36Sopenharmony_cistatic bool ar9300_read_eeprom(struct ath_hw *ah, int address, u8 *buffer,
304362306a36Sopenharmony_ci			       int count)
304462306a36Sopenharmony_ci{
304562306a36Sopenharmony_ci	struct ath_common *common = ath9k_hw_common(ah);
304662306a36Sopenharmony_ci	int i;
304762306a36Sopenharmony_ci
304862306a36Sopenharmony_ci	if ((address < 0) || ((address + count) / 2 > AR9300_EEPROM_SIZE - 1)) {
304962306a36Sopenharmony_ci		ath_dbg(common, EEPROM, "eeprom address not in range\n");
305062306a36Sopenharmony_ci		return false;
305162306a36Sopenharmony_ci	}
305262306a36Sopenharmony_ci
305362306a36Sopenharmony_ci	/*
305462306a36Sopenharmony_ci	 * Since we're reading the bytes in reverse order from a little-endian
305562306a36Sopenharmony_ci	 * word stream, an even address means we only use the lower half of
305662306a36Sopenharmony_ci	 * the 16-bit word at that address
305762306a36Sopenharmony_ci	 */
305862306a36Sopenharmony_ci	if (address % 2 == 0) {
305962306a36Sopenharmony_ci		if (!ar9300_eeprom_read_byte(ah, address--, buffer++))
306062306a36Sopenharmony_ci			goto error;
306162306a36Sopenharmony_ci
306262306a36Sopenharmony_ci		count--;
306362306a36Sopenharmony_ci	}
306462306a36Sopenharmony_ci
306562306a36Sopenharmony_ci	for (i = 0; i < count / 2; i++) {
306662306a36Sopenharmony_ci		if (!ar9300_eeprom_read_word(ah, address, buffer))
306762306a36Sopenharmony_ci			goto error;
306862306a36Sopenharmony_ci
306962306a36Sopenharmony_ci		address -= 2;
307062306a36Sopenharmony_ci		buffer += 2;
307162306a36Sopenharmony_ci	}
307262306a36Sopenharmony_ci
307362306a36Sopenharmony_ci	if (count % 2)
307462306a36Sopenharmony_ci		if (!ar9300_eeprom_read_byte(ah, address, buffer))
307562306a36Sopenharmony_ci			goto error;
307662306a36Sopenharmony_ci
307762306a36Sopenharmony_ci	return true;
307862306a36Sopenharmony_ci
307962306a36Sopenharmony_cierror:
308062306a36Sopenharmony_ci	ath_dbg(common, EEPROM, "unable to read eeprom region at offset %d\n",
308162306a36Sopenharmony_ci		address);
308262306a36Sopenharmony_ci	return false;
308362306a36Sopenharmony_ci}
308462306a36Sopenharmony_ci
308562306a36Sopenharmony_cistatic bool ar9300_otp_read_word(struct ath_hw *ah, int addr, u32 *data)
308662306a36Sopenharmony_ci{
308762306a36Sopenharmony_ci	REG_READ(ah, AR9300_OTP_BASE(ah) + (4 * addr));
308862306a36Sopenharmony_ci
308962306a36Sopenharmony_ci	if (!ath9k_hw_wait(ah, AR9300_OTP_STATUS(ah), AR9300_OTP_STATUS_TYPE,
309062306a36Sopenharmony_ci			   AR9300_OTP_STATUS_VALID, 1000))
309162306a36Sopenharmony_ci		return false;
309262306a36Sopenharmony_ci
309362306a36Sopenharmony_ci	*data = REG_READ(ah, AR9300_OTP_READ_DATA(ah));
309462306a36Sopenharmony_ci	return true;
309562306a36Sopenharmony_ci}
309662306a36Sopenharmony_ci
309762306a36Sopenharmony_cistatic bool ar9300_read_otp(struct ath_hw *ah, int address, u8 *buffer,
309862306a36Sopenharmony_ci			    int count)
309962306a36Sopenharmony_ci{
310062306a36Sopenharmony_ci	u32 data;
310162306a36Sopenharmony_ci	int i;
310262306a36Sopenharmony_ci
310362306a36Sopenharmony_ci	for (i = 0; i < count; i++) {
310462306a36Sopenharmony_ci		int offset = 8 * ((address - i) % 4);
310562306a36Sopenharmony_ci		if (!ar9300_otp_read_word(ah, (address - i) / 4, &data))
310662306a36Sopenharmony_ci			return false;
310762306a36Sopenharmony_ci
310862306a36Sopenharmony_ci		buffer[i] = (data >> offset) & 0xff;
310962306a36Sopenharmony_ci	}
311062306a36Sopenharmony_ci
311162306a36Sopenharmony_ci	return true;
311262306a36Sopenharmony_ci}
311362306a36Sopenharmony_ci
311462306a36Sopenharmony_ci
311562306a36Sopenharmony_cistatic void ar9300_comp_hdr_unpack(u8 *best, int *code, int *reference,
311662306a36Sopenharmony_ci				   int *length, int *major, int *minor)
311762306a36Sopenharmony_ci{
311862306a36Sopenharmony_ci	unsigned long value[4];
311962306a36Sopenharmony_ci
312062306a36Sopenharmony_ci	value[0] = best[0];
312162306a36Sopenharmony_ci	value[1] = best[1];
312262306a36Sopenharmony_ci	value[2] = best[2];
312362306a36Sopenharmony_ci	value[3] = best[3];
312462306a36Sopenharmony_ci	*code = ((value[0] >> 5) & 0x0007);
312562306a36Sopenharmony_ci	*reference = (value[0] & 0x001f) | ((value[1] >> 2) & 0x0020);
312662306a36Sopenharmony_ci	*length = ((value[1] << 4) & 0x07f0) | ((value[2] >> 4) & 0x000f);
312762306a36Sopenharmony_ci	*major = (value[2] & 0x000f);
312862306a36Sopenharmony_ci	*minor = (value[3] & 0x00ff);
312962306a36Sopenharmony_ci}
313062306a36Sopenharmony_ci
313162306a36Sopenharmony_cistatic u16 ar9300_comp_cksum(u8 *data, int dsize)
313262306a36Sopenharmony_ci{
313362306a36Sopenharmony_ci	int it, checksum = 0;
313462306a36Sopenharmony_ci
313562306a36Sopenharmony_ci	for (it = 0; it < dsize; it++) {
313662306a36Sopenharmony_ci		checksum += data[it];
313762306a36Sopenharmony_ci		checksum &= 0xffff;
313862306a36Sopenharmony_ci	}
313962306a36Sopenharmony_ci
314062306a36Sopenharmony_ci	return checksum;
314162306a36Sopenharmony_ci}
314262306a36Sopenharmony_ci
314362306a36Sopenharmony_cistatic bool ar9300_uncompress_block(struct ath_hw *ah,
314462306a36Sopenharmony_ci				    u8 *mptr,
314562306a36Sopenharmony_ci				    int mdataSize,
314662306a36Sopenharmony_ci				    u8 *block,
314762306a36Sopenharmony_ci				    int size)
314862306a36Sopenharmony_ci{
314962306a36Sopenharmony_ci	int it;
315062306a36Sopenharmony_ci	int spot;
315162306a36Sopenharmony_ci	int offset;
315262306a36Sopenharmony_ci	int length;
315362306a36Sopenharmony_ci	struct ath_common *common = ath9k_hw_common(ah);
315462306a36Sopenharmony_ci
315562306a36Sopenharmony_ci	spot = 0;
315662306a36Sopenharmony_ci
315762306a36Sopenharmony_ci	for (it = 0; it < size; it += (length+2)) {
315862306a36Sopenharmony_ci		offset = block[it];
315962306a36Sopenharmony_ci		offset &= 0xff;
316062306a36Sopenharmony_ci		spot += offset;
316162306a36Sopenharmony_ci		length = block[it+1];
316262306a36Sopenharmony_ci		length &= 0xff;
316362306a36Sopenharmony_ci
316462306a36Sopenharmony_ci		if (length > 0 && spot >= 0 && spot+length <= mdataSize) {
316562306a36Sopenharmony_ci			ath_dbg(common, EEPROM,
316662306a36Sopenharmony_ci				"Restore at %d: spot=%d offset=%d length=%d\n",
316762306a36Sopenharmony_ci				it, spot, offset, length);
316862306a36Sopenharmony_ci			memcpy(&mptr[spot], &block[it+2], length);
316962306a36Sopenharmony_ci			spot += length;
317062306a36Sopenharmony_ci		} else if (length > 0) {
317162306a36Sopenharmony_ci			ath_dbg(common, EEPROM,
317262306a36Sopenharmony_ci				"Bad restore at %d: spot=%d offset=%d length=%d\n",
317362306a36Sopenharmony_ci				it, spot, offset, length);
317462306a36Sopenharmony_ci			return false;
317562306a36Sopenharmony_ci		}
317662306a36Sopenharmony_ci	}
317762306a36Sopenharmony_ci	return true;
317862306a36Sopenharmony_ci}
317962306a36Sopenharmony_ci
318062306a36Sopenharmony_cistatic int ar9300_compress_decision(struct ath_hw *ah,
318162306a36Sopenharmony_ci				    int it,
318262306a36Sopenharmony_ci				    int code,
318362306a36Sopenharmony_ci				    int reference,
318462306a36Sopenharmony_ci				    u8 *mptr,
318562306a36Sopenharmony_ci				    u8 *word, int length, int mdata_size)
318662306a36Sopenharmony_ci{
318762306a36Sopenharmony_ci	struct ath_common *common = ath9k_hw_common(ah);
318862306a36Sopenharmony_ci	const struct ar9300_eeprom *eep = NULL;
318962306a36Sopenharmony_ci
319062306a36Sopenharmony_ci	switch (code) {
319162306a36Sopenharmony_ci	case _CompressNone:
319262306a36Sopenharmony_ci		if (length != mdata_size) {
319362306a36Sopenharmony_ci			ath_dbg(common, EEPROM,
319462306a36Sopenharmony_ci				"EEPROM structure size mismatch memory=%d eeprom=%d\n",
319562306a36Sopenharmony_ci				mdata_size, length);
319662306a36Sopenharmony_ci			return -1;
319762306a36Sopenharmony_ci		}
319862306a36Sopenharmony_ci		memcpy(mptr, word + COMP_HDR_LEN, length);
319962306a36Sopenharmony_ci		ath_dbg(common, EEPROM,
320062306a36Sopenharmony_ci			"restored eeprom %d: uncompressed, length %d\n",
320162306a36Sopenharmony_ci			it, length);
320262306a36Sopenharmony_ci		break;
320362306a36Sopenharmony_ci	case _CompressBlock:
320462306a36Sopenharmony_ci		if (reference != 0) {
320562306a36Sopenharmony_ci			eep = ar9003_eeprom_struct_find_by_id(reference);
320662306a36Sopenharmony_ci			if (eep == NULL) {
320762306a36Sopenharmony_ci				ath_dbg(common, EEPROM,
320862306a36Sopenharmony_ci					"can't find reference eeprom struct %d\n",
320962306a36Sopenharmony_ci					reference);
321062306a36Sopenharmony_ci				return -1;
321162306a36Sopenharmony_ci			}
321262306a36Sopenharmony_ci			memcpy(mptr, eep, mdata_size);
321362306a36Sopenharmony_ci		}
321462306a36Sopenharmony_ci		ath_dbg(common, EEPROM,
321562306a36Sopenharmony_ci			"restore eeprom %d: block, reference %d, length %d\n",
321662306a36Sopenharmony_ci			it, reference, length);
321762306a36Sopenharmony_ci		ar9300_uncompress_block(ah, mptr, mdata_size,
321862306a36Sopenharmony_ci					(word + COMP_HDR_LEN), length);
321962306a36Sopenharmony_ci		break;
322062306a36Sopenharmony_ci	default:
322162306a36Sopenharmony_ci		ath_dbg(common, EEPROM, "unknown compression code %d\n", code);
322262306a36Sopenharmony_ci		return -1;
322362306a36Sopenharmony_ci	}
322462306a36Sopenharmony_ci	return 0;
322562306a36Sopenharmony_ci}
322662306a36Sopenharmony_ci
322762306a36Sopenharmony_citypedef bool (*eeprom_read_op)(struct ath_hw *ah, int address, u8 *buffer,
322862306a36Sopenharmony_ci			       int count);
322962306a36Sopenharmony_ci
323062306a36Sopenharmony_cistatic bool ar9300_check_header(void *data)
323162306a36Sopenharmony_ci{
323262306a36Sopenharmony_ci	u32 *word = data;
323362306a36Sopenharmony_ci	return !(*word == 0 || *word == ~0);
323462306a36Sopenharmony_ci}
323562306a36Sopenharmony_ci
323662306a36Sopenharmony_cistatic bool ar9300_check_eeprom_header(struct ath_hw *ah, eeprom_read_op read,
323762306a36Sopenharmony_ci				       int base_addr)
323862306a36Sopenharmony_ci{
323962306a36Sopenharmony_ci	u8 header[4];
324062306a36Sopenharmony_ci
324162306a36Sopenharmony_ci	if (!read(ah, base_addr, header, 4))
324262306a36Sopenharmony_ci		return false;
324362306a36Sopenharmony_ci
324462306a36Sopenharmony_ci	return ar9300_check_header(header);
324562306a36Sopenharmony_ci}
324662306a36Sopenharmony_ci
324762306a36Sopenharmony_cistatic int ar9300_eeprom_restore_flash(struct ath_hw *ah, u8 *mptr,
324862306a36Sopenharmony_ci				       int mdata_size)
324962306a36Sopenharmony_ci{
325062306a36Sopenharmony_ci	u16 *data = (u16 *) mptr;
325162306a36Sopenharmony_ci	int i;
325262306a36Sopenharmony_ci
325362306a36Sopenharmony_ci	for (i = 0; i < mdata_size / 2; i++, data++)
325462306a36Sopenharmony_ci		if (!ath9k_hw_nvram_read(ah, i, data))
325562306a36Sopenharmony_ci			return -EIO;
325662306a36Sopenharmony_ci
325762306a36Sopenharmony_ci	return 0;
325862306a36Sopenharmony_ci}
325962306a36Sopenharmony_ci/*
326062306a36Sopenharmony_ci * Read the configuration data from the eeprom.
326162306a36Sopenharmony_ci * The data can be put in any specified memory buffer.
326262306a36Sopenharmony_ci *
326362306a36Sopenharmony_ci * Returns -1 on error.
326462306a36Sopenharmony_ci * Returns address of next memory location on success.
326562306a36Sopenharmony_ci */
326662306a36Sopenharmony_cistatic int ar9300_eeprom_restore_internal(struct ath_hw *ah,
326762306a36Sopenharmony_ci					  u8 *mptr, int mdata_size)
326862306a36Sopenharmony_ci{
326962306a36Sopenharmony_ci#define MDEFAULT 15
327062306a36Sopenharmony_ci#define MSTATE 100
327162306a36Sopenharmony_ci	int cptr;
327262306a36Sopenharmony_ci	u8 *word;
327362306a36Sopenharmony_ci	int code;
327462306a36Sopenharmony_ci	int reference, length, major, minor;
327562306a36Sopenharmony_ci	int osize;
327662306a36Sopenharmony_ci	int it;
327762306a36Sopenharmony_ci	u16 checksum, mchecksum;
327862306a36Sopenharmony_ci	struct ath_common *common = ath9k_hw_common(ah);
327962306a36Sopenharmony_ci	struct ar9300_eeprom *eep;
328062306a36Sopenharmony_ci	eeprom_read_op read;
328162306a36Sopenharmony_ci
328262306a36Sopenharmony_ci	if (ath9k_hw_use_flash(ah)) {
328362306a36Sopenharmony_ci		u8 txrx;
328462306a36Sopenharmony_ci
328562306a36Sopenharmony_ci		if (ar9300_eeprom_restore_flash(ah, mptr, mdata_size))
328662306a36Sopenharmony_ci			return -EIO;
328762306a36Sopenharmony_ci
328862306a36Sopenharmony_ci		/* check if eeprom contains valid data */
328962306a36Sopenharmony_ci		eep = (struct ar9300_eeprom *) mptr;
329062306a36Sopenharmony_ci		txrx = eep->baseEepHeader.txrxMask;
329162306a36Sopenharmony_ci		if (txrx != 0 && txrx != 0xff)
329262306a36Sopenharmony_ci			return 0;
329362306a36Sopenharmony_ci	}
329462306a36Sopenharmony_ci
329562306a36Sopenharmony_ci	word = kzalloc(2048, GFP_KERNEL);
329662306a36Sopenharmony_ci	if (!word)
329762306a36Sopenharmony_ci		return -ENOMEM;
329862306a36Sopenharmony_ci
329962306a36Sopenharmony_ci	memcpy(mptr, &ar9300_default, mdata_size);
330062306a36Sopenharmony_ci
330162306a36Sopenharmony_ci	read = ar9300_read_eeprom;
330262306a36Sopenharmony_ci	if (AR_SREV_9485(ah))
330362306a36Sopenharmony_ci		cptr = AR9300_BASE_ADDR_4K;
330462306a36Sopenharmony_ci	else if (AR_SREV_9330(ah))
330562306a36Sopenharmony_ci		cptr = AR9300_BASE_ADDR_512;
330662306a36Sopenharmony_ci	else
330762306a36Sopenharmony_ci		cptr = AR9300_BASE_ADDR;
330862306a36Sopenharmony_ci	ath_dbg(common, EEPROM, "Trying EEPROM access at Address 0x%04x\n",
330962306a36Sopenharmony_ci		cptr);
331062306a36Sopenharmony_ci	if (ar9300_check_eeprom_header(ah, read, cptr))
331162306a36Sopenharmony_ci		goto found;
331262306a36Sopenharmony_ci
331362306a36Sopenharmony_ci	cptr = AR9300_BASE_ADDR_4K;
331462306a36Sopenharmony_ci	ath_dbg(common, EEPROM, "Trying EEPROM access at Address 0x%04x\n",
331562306a36Sopenharmony_ci		cptr);
331662306a36Sopenharmony_ci	if (ar9300_check_eeprom_header(ah, read, cptr))
331762306a36Sopenharmony_ci		goto found;
331862306a36Sopenharmony_ci
331962306a36Sopenharmony_ci	cptr = AR9300_BASE_ADDR_512;
332062306a36Sopenharmony_ci	ath_dbg(common, EEPROM, "Trying EEPROM access at Address 0x%04x\n",
332162306a36Sopenharmony_ci		cptr);
332262306a36Sopenharmony_ci	if (ar9300_check_eeprom_header(ah, read, cptr))
332362306a36Sopenharmony_ci		goto found;
332462306a36Sopenharmony_ci
332562306a36Sopenharmony_ci	read = ar9300_read_otp;
332662306a36Sopenharmony_ci	cptr = AR9300_BASE_ADDR;
332762306a36Sopenharmony_ci	ath_dbg(common, EEPROM, "Trying OTP access at Address 0x%04x\n", cptr);
332862306a36Sopenharmony_ci	if (ar9300_check_eeprom_header(ah, read, cptr))
332962306a36Sopenharmony_ci		goto found;
333062306a36Sopenharmony_ci
333162306a36Sopenharmony_ci	cptr = AR9300_BASE_ADDR_512;
333262306a36Sopenharmony_ci	ath_dbg(common, EEPROM, "Trying OTP access at Address 0x%04x\n", cptr);
333362306a36Sopenharmony_ci	if (ar9300_check_eeprom_header(ah, read, cptr))
333462306a36Sopenharmony_ci		goto found;
333562306a36Sopenharmony_ci
333662306a36Sopenharmony_ci	goto fail;
333762306a36Sopenharmony_ci
333862306a36Sopenharmony_cifound:
333962306a36Sopenharmony_ci	ath_dbg(common, EEPROM, "Found valid EEPROM data\n");
334062306a36Sopenharmony_ci
334162306a36Sopenharmony_ci	for (it = 0; it < MSTATE; it++) {
334262306a36Sopenharmony_ci		if (!read(ah, cptr, word, COMP_HDR_LEN))
334362306a36Sopenharmony_ci			goto fail;
334462306a36Sopenharmony_ci
334562306a36Sopenharmony_ci		if (!ar9300_check_header(word))
334662306a36Sopenharmony_ci			break;
334762306a36Sopenharmony_ci
334862306a36Sopenharmony_ci		ar9300_comp_hdr_unpack(word, &code, &reference,
334962306a36Sopenharmony_ci				       &length, &major, &minor);
335062306a36Sopenharmony_ci		ath_dbg(common, EEPROM,
335162306a36Sopenharmony_ci			"Found block at %x: code=%d ref=%d length=%d major=%d minor=%d\n",
335262306a36Sopenharmony_ci			cptr, code, reference, length, major, minor);
335362306a36Sopenharmony_ci		if ((!AR_SREV_9485(ah) && length >= 1024) ||
335462306a36Sopenharmony_ci		    (AR_SREV_9485(ah) && length > EEPROM_DATA_LEN_9485) ||
335562306a36Sopenharmony_ci		    (length > cptr)) {
335662306a36Sopenharmony_ci			ath_dbg(common, EEPROM, "Skipping bad header\n");
335762306a36Sopenharmony_ci			cptr -= COMP_HDR_LEN;
335862306a36Sopenharmony_ci			continue;
335962306a36Sopenharmony_ci		}
336062306a36Sopenharmony_ci
336162306a36Sopenharmony_ci		osize = length;
336262306a36Sopenharmony_ci		read(ah, cptr, word, COMP_HDR_LEN + osize + COMP_CKSUM_LEN);
336362306a36Sopenharmony_ci		checksum = ar9300_comp_cksum(&word[COMP_HDR_LEN], length);
336462306a36Sopenharmony_ci		mchecksum = get_unaligned_le16(&word[COMP_HDR_LEN + osize]);
336562306a36Sopenharmony_ci		ath_dbg(common, EEPROM, "checksum %x %x\n",
336662306a36Sopenharmony_ci			checksum, mchecksum);
336762306a36Sopenharmony_ci		if (checksum == mchecksum) {
336862306a36Sopenharmony_ci			ar9300_compress_decision(ah, it, code, reference, mptr,
336962306a36Sopenharmony_ci						 word, length, mdata_size);
337062306a36Sopenharmony_ci		} else {
337162306a36Sopenharmony_ci			ath_dbg(common, EEPROM,
337262306a36Sopenharmony_ci				"skipping block with bad checksum\n");
337362306a36Sopenharmony_ci		}
337462306a36Sopenharmony_ci		cptr -= (COMP_HDR_LEN + osize + COMP_CKSUM_LEN);
337562306a36Sopenharmony_ci	}
337662306a36Sopenharmony_ci
337762306a36Sopenharmony_ci	kfree(word);
337862306a36Sopenharmony_ci	return cptr;
337962306a36Sopenharmony_ci
338062306a36Sopenharmony_cifail:
338162306a36Sopenharmony_ci	kfree(word);
338262306a36Sopenharmony_ci	return -1;
338362306a36Sopenharmony_ci}
338462306a36Sopenharmony_ci
338562306a36Sopenharmony_ci/*
338662306a36Sopenharmony_ci * Restore the configuration structure by reading the eeprom.
338762306a36Sopenharmony_ci * This function destroys any existing in-memory structure
338862306a36Sopenharmony_ci * content.
338962306a36Sopenharmony_ci */
339062306a36Sopenharmony_cistatic bool ath9k_hw_ar9300_fill_eeprom(struct ath_hw *ah)
339162306a36Sopenharmony_ci{
339262306a36Sopenharmony_ci	u8 *mptr = (u8 *) &ah->eeprom.ar9300_eep;
339362306a36Sopenharmony_ci
339462306a36Sopenharmony_ci	if (ar9300_eeprom_restore_internal(ah, mptr,
339562306a36Sopenharmony_ci			sizeof(struct ar9300_eeprom)) < 0)
339662306a36Sopenharmony_ci		return false;
339762306a36Sopenharmony_ci
339862306a36Sopenharmony_ci	return true;
339962306a36Sopenharmony_ci}
340062306a36Sopenharmony_ci
340162306a36Sopenharmony_ci#if defined(CONFIG_ATH9K_DEBUGFS) || defined(CONFIG_ATH9K_HTC_DEBUGFS)
340262306a36Sopenharmony_cistatic u32 ar9003_dump_modal_eeprom(char *buf, u32 len, u32 size,
340362306a36Sopenharmony_ci				    struct ar9300_modal_eep_header *modal_hdr)
340462306a36Sopenharmony_ci{
340562306a36Sopenharmony_ci	PR_EEP("Chain0 Ant. Control", le16_to_cpu(modal_hdr->antCtrlChain[0]));
340662306a36Sopenharmony_ci	PR_EEP("Chain1 Ant. Control", le16_to_cpu(modal_hdr->antCtrlChain[1]));
340762306a36Sopenharmony_ci	PR_EEP("Chain2 Ant. Control", le16_to_cpu(modal_hdr->antCtrlChain[2]));
340862306a36Sopenharmony_ci	PR_EEP("Ant. Common Control", le32_to_cpu(modal_hdr->antCtrlCommon));
340962306a36Sopenharmony_ci	PR_EEP("Ant. Common Control2", le32_to_cpu(modal_hdr->antCtrlCommon2));
341062306a36Sopenharmony_ci	PR_EEP("Ant. Gain", modal_hdr->antennaGain);
341162306a36Sopenharmony_ci	PR_EEP("Switch Settle", modal_hdr->switchSettling);
341262306a36Sopenharmony_ci	PR_EEP("Chain0 xatten1DB", modal_hdr->xatten1DB[0]);
341362306a36Sopenharmony_ci	PR_EEP("Chain1 xatten1DB", modal_hdr->xatten1DB[1]);
341462306a36Sopenharmony_ci	PR_EEP("Chain2 xatten1DB", modal_hdr->xatten1DB[2]);
341562306a36Sopenharmony_ci	PR_EEP("Chain0 xatten1Margin", modal_hdr->xatten1Margin[0]);
341662306a36Sopenharmony_ci	PR_EEP("Chain1 xatten1Margin", modal_hdr->xatten1Margin[1]);
341762306a36Sopenharmony_ci	PR_EEP("Chain2 xatten1Margin", modal_hdr->xatten1Margin[2]);
341862306a36Sopenharmony_ci	PR_EEP("Temp Slope", modal_hdr->tempSlope);
341962306a36Sopenharmony_ci	PR_EEP("Volt Slope", modal_hdr->voltSlope);
342062306a36Sopenharmony_ci	PR_EEP("spur Channels0", modal_hdr->spurChans[0]);
342162306a36Sopenharmony_ci	PR_EEP("spur Channels1", modal_hdr->spurChans[1]);
342262306a36Sopenharmony_ci	PR_EEP("spur Channels2", modal_hdr->spurChans[2]);
342362306a36Sopenharmony_ci	PR_EEP("spur Channels3", modal_hdr->spurChans[3]);
342462306a36Sopenharmony_ci	PR_EEP("spur Channels4", modal_hdr->spurChans[4]);
342562306a36Sopenharmony_ci	PR_EEP("Chain0 NF Threshold", modal_hdr->noiseFloorThreshCh[0]);
342662306a36Sopenharmony_ci	PR_EEP("Chain1 NF Threshold", modal_hdr->noiseFloorThreshCh[1]);
342762306a36Sopenharmony_ci	PR_EEP("Chain2 NF Threshold", modal_hdr->noiseFloorThreshCh[2]);
342862306a36Sopenharmony_ci	PR_EEP("Quick Drop", modal_hdr->quick_drop);
342962306a36Sopenharmony_ci	PR_EEP("txEndToXpaOff", modal_hdr->txEndToXpaOff);
343062306a36Sopenharmony_ci	PR_EEP("xPA Bias Level", modal_hdr->xpaBiasLvl);
343162306a36Sopenharmony_ci	PR_EEP("txFrameToDataStart", modal_hdr->txFrameToDataStart);
343262306a36Sopenharmony_ci	PR_EEP("txFrameToPaOn", modal_hdr->txFrameToPaOn);
343362306a36Sopenharmony_ci	PR_EEP("txFrameToXpaOn", modal_hdr->txFrameToXpaOn);
343462306a36Sopenharmony_ci	PR_EEP("txClip", modal_hdr->txClip);
343562306a36Sopenharmony_ci	PR_EEP("ADC Desired size", modal_hdr->adcDesiredSize);
343662306a36Sopenharmony_ci
343762306a36Sopenharmony_ci	return len;
343862306a36Sopenharmony_ci}
343962306a36Sopenharmony_ci
344062306a36Sopenharmony_cistatic u32 ar9003_dump_cal_data(struct ath_hw *ah, char *buf, u32 len, u32 size,
344162306a36Sopenharmony_ci				bool is_2g)
344262306a36Sopenharmony_ci{
344362306a36Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
344462306a36Sopenharmony_ci	struct ar9300_base_eep_hdr *pBase;
344562306a36Sopenharmony_ci	struct ar9300_cal_data_per_freq_op_loop *cal_pier;
344662306a36Sopenharmony_ci	int cal_pier_nr;
344762306a36Sopenharmony_ci	int freq;
344862306a36Sopenharmony_ci	int i, j;
344962306a36Sopenharmony_ci
345062306a36Sopenharmony_ci	pBase = &eep->baseEepHeader;
345162306a36Sopenharmony_ci
345262306a36Sopenharmony_ci	if (is_2g)
345362306a36Sopenharmony_ci		cal_pier_nr = AR9300_NUM_2G_CAL_PIERS;
345462306a36Sopenharmony_ci	else
345562306a36Sopenharmony_ci		cal_pier_nr = AR9300_NUM_5G_CAL_PIERS;
345662306a36Sopenharmony_ci
345762306a36Sopenharmony_ci	for (i = 0; i < AR9300_MAX_CHAINS; i++) {
345862306a36Sopenharmony_ci		if (!((pBase->txrxMask >> i) & 1))
345962306a36Sopenharmony_ci			continue;
346062306a36Sopenharmony_ci
346162306a36Sopenharmony_ci		len += scnprintf(buf + len, size - len, "Chain %d\n", i);
346262306a36Sopenharmony_ci
346362306a36Sopenharmony_ci		len += scnprintf(buf + len, size - len,
346462306a36Sopenharmony_ci			"Freq\t ref\tvolt\ttemp\tnf_cal\tnf_pow\trx_temp\n");
346562306a36Sopenharmony_ci
346662306a36Sopenharmony_ci		for (j = 0; j < cal_pier_nr; j++) {
346762306a36Sopenharmony_ci			if (is_2g) {
346862306a36Sopenharmony_ci				cal_pier = &eep->calPierData2G[i][j];
346962306a36Sopenharmony_ci				freq = 2300 + eep->calFreqPier2G[j];
347062306a36Sopenharmony_ci			} else {
347162306a36Sopenharmony_ci				cal_pier = &eep->calPierData5G[i][j];
347262306a36Sopenharmony_ci				freq = 4800 + eep->calFreqPier5G[j] * 5;
347362306a36Sopenharmony_ci			}
347462306a36Sopenharmony_ci
347562306a36Sopenharmony_ci			len += scnprintf(buf + len, size - len,
347662306a36Sopenharmony_ci				"%d\t", freq);
347762306a36Sopenharmony_ci
347862306a36Sopenharmony_ci			len += scnprintf(buf + len, size - len,
347962306a36Sopenharmony_ci				"%d\t%d\t%d\t%d\t%d\t%d\n",
348062306a36Sopenharmony_ci				cal_pier->refPower,
348162306a36Sopenharmony_ci				cal_pier->voltMeas,
348262306a36Sopenharmony_ci				cal_pier->tempMeas,
348362306a36Sopenharmony_ci				cal_pier->rxTempMeas ?
348462306a36Sopenharmony_ci				N2DBM(cal_pier->rxNoisefloorCal) : 0,
348562306a36Sopenharmony_ci				cal_pier->rxTempMeas ?
348662306a36Sopenharmony_ci				N2DBM(cal_pier->rxNoisefloorPower) : 0,
348762306a36Sopenharmony_ci				cal_pier->rxTempMeas);
348862306a36Sopenharmony_ci		}
348962306a36Sopenharmony_ci	}
349062306a36Sopenharmony_ci
349162306a36Sopenharmony_ci	return len;
349262306a36Sopenharmony_ci}
349362306a36Sopenharmony_ci
349462306a36Sopenharmony_cistatic u32 ath9k_hw_ar9003_dump_eeprom(struct ath_hw *ah, bool dump_base_hdr,
349562306a36Sopenharmony_ci				       u8 *buf, u32 len, u32 size)
349662306a36Sopenharmony_ci{
349762306a36Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
349862306a36Sopenharmony_ci	struct ar9300_base_eep_hdr *pBase;
349962306a36Sopenharmony_ci
350062306a36Sopenharmony_ci	if (!dump_base_hdr) {
350162306a36Sopenharmony_ci		len += scnprintf(buf + len, size - len,
350262306a36Sopenharmony_ci				 "%20s :\n", "2GHz modal Header");
350362306a36Sopenharmony_ci		len = ar9003_dump_modal_eeprom(buf, len, size,
350462306a36Sopenharmony_ci						&eep->modalHeader2G);
350562306a36Sopenharmony_ci
350662306a36Sopenharmony_ci		len += scnprintf(buf + len, size - len, "Calibration data\n");
350762306a36Sopenharmony_ci		len = ar9003_dump_cal_data(ah, buf, len, size, true);
350862306a36Sopenharmony_ci
350962306a36Sopenharmony_ci		len += scnprintf(buf + len, size - len,
351062306a36Sopenharmony_ci				 "%20s :\n", "5GHz modal Header");
351162306a36Sopenharmony_ci		len = ar9003_dump_modal_eeprom(buf, len, size,
351262306a36Sopenharmony_ci						&eep->modalHeader5G);
351362306a36Sopenharmony_ci
351462306a36Sopenharmony_ci		len += scnprintf(buf + len, size - len, "Calibration data\n");
351562306a36Sopenharmony_ci		len = ar9003_dump_cal_data(ah, buf, len, size, false);
351662306a36Sopenharmony_ci
351762306a36Sopenharmony_ci		goto out;
351862306a36Sopenharmony_ci	}
351962306a36Sopenharmony_ci
352062306a36Sopenharmony_ci	pBase = &eep->baseEepHeader;
352162306a36Sopenharmony_ci
352262306a36Sopenharmony_ci	PR_EEP("EEPROM Version", ah->eeprom.ar9300_eep.eepromVersion);
352362306a36Sopenharmony_ci	PR_EEP("RegDomain1", le16_to_cpu(pBase->regDmn[0]));
352462306a36Sopenharmony_ci	PR_EEP("RegDomain2", le16_to_cpu(pBase->regDmn[1]));
352562306a36Sopenharmony_ci	PR_EEP("TX Mask", (pBase->txrxMask >> 4));
352662306a36Sopenharmony_ci	PR_EEP("RX Mask", (pBase->txrxMask & 0x0f));
352762306a36Sopenharmony_ci	PR_EEP("Allow 5GHz", !!(pBase->opCapFlags.opFlags &
352862306a36Sopenharmony_ci				AR5416_OPFLAGS_11A));
352962306a36Sopenharmony_ci	PR_EEP("Allow 2GHz", !!(pBase->opCapFlags.opFlags &
353062306a36Sopenharmony_ci				AR5416_OPFLAGS_11G));
353162306a36Sopenharmony_ci	PR_EEP("Disable 2GHz HT20", !!(pBase->opCapFlags.opFlags &
353262306a36Sopenharmony_ci					AR5416_OPFLAGS_N_2G_HT20));
353362306a36Sopenharmony_ci	PR_EEP("Disable 2GHz HT40", !!(pBase->opCapFlags.opFlags &
353462306a36Sopenharmony_ci					AR5416_OPFLAGS_N_2G_HT40));
353562306a36Sopenharmony_ci	PR_EEP("Disable 5Ghz HT20", !!(pBase->opCapFlags.opFlags &
353662306a36Sopenharmony_ci					AR5416_OPFLAGS_N_5G_HT20));
353762306a36Sopenharmony_ci	PR_EEP("Disable 5Ghz HT40", !!(pBase->opCapFlags.opFlags &
353862306a36Sopenharmony_ci					AR5416_OPFLAGS_N_5G_HT40));
353962306a36Sopenharmony_ci	PR_EEP("Big Endian", !!(pBase->opCapFlags.eepMisc &
354062306a36Sopenharmony_ci				AR5416_EEPMISC_BIG_ENDIAN));
354162306a36Sopenharmony_ci	PR_EEP("RF Silent", pBase->rfSilent);
354262306a36Sopenharmony_ci	PR_EEP("BT option", pBase->blueToothOptions);
354362306a36Sopenharmony_ci	PR_EEP("Device Cap", pBase->deviceCap);
354462306a36Sopenharmony_ci	PR_EEP("Device Type", pBase->deviceType);
354562306a36Sopenharmony_ci	PR_EEP("Power Table Offset", pBase->pwrTableOffset);
354662306a36Sopenharmony_ci	PR_EEP("Tuning Caps1", pBase->params_for_tuning_caps[0]);
354762306a36Sopenharmony_ci	PR_EEP("Tuning Caps2", pBase->params_for_tuning_caps[1]);
354862306a36Sopenharmony_ci	PR_EEP("Enable Tx Temp Comp", !!(pBase->featureEnable & BIT(0)));
354962306a36Sopenharmony_ci	PR_EEP("Enable Tx Volt Comp", !!(pBase->featureEnable & BIT(1)));
355062306a36Sopenharmony_ci	PR_EEP("Enable fast clock", !!(pBase->featureEnable & BIT(2)));
355162306a36Sopenharmony_ci	PR_EEP("Enable doubling", !!(pBase->featureEnable & BIT(3)));
355262306a36Sopenharmony_ci	PR_EEP("Internal regulator", !!(pBase->featureEnable & BIT(4)));
355362306a36Sopenharmony_ci	PR_EEP("Enable Paprd", !!(pBase->featureEnable & BIT(5)));
355462306a36Sopenharmony_ci	PR_EEP("Driver Strength", !!(pBase->miscConfiguration & BIT(0)));
355562306a36Sopenharmony_ci	PR_EEP("Quick Drop", !!(pBase->miscConfiguration & BIT(1)));
355662306a36Sopenharmony_ci	PR_EEP("Chain mask Reduce", (pBase->miscConfiguration >> 0x3) & 0x1);
355762306a36Sopenharmony_ci	PR_EEP("Write enable Gpio", pBase->eepromWriteEnableGpio);
355862306a36Sopenharmony_ci	PR_EEP("WLAN Disable Gpio", pBase->wlanDisableGpio);
355962306a36Sopenharmony_ci	PR_EEP("WLAN LED Gpio", pBase->wlanLedGpio);
356062306a36Sopenharmony_ci	PR_EEP("Rx Band Select Gpio", pBase->rxBandSelectGpio);
356162306a36Sopenharmony_ci	PR_EEP("Tx Gain", pBase->txrxgain >> 4);
356262306a36Sopenharmony_ci	PR_EEP("Rx Gain", pBase->txrxgain & 0xf);
356362306a36Sopenharmony_ci	PR_EEP("SW Reg", le32_to_cpu(pBase->swreg));
356462306a36Sopenharmony_ci
356562306a36Sopenharmony_ci	len += scnprintf(buf + len, size - len, "%20s : %pM\n", "MacAddress",
356662306a36Sopenharmony_ci			 ah->eeprom.ar9300_eep.macAddr);
356762306a36Sopenharmony_ciout:
356862306a36Sopenharmony_ci	if (len > size)
356962306a36Sopenharmony_ci		len = size;
357062306a36Sopenharmony_ci
357162306a36Sopenharmony_ci	return len;
357262306a36Sopenharmony_ci}
357362306a36Sopenharmony_ci#else
357462306a36Sopenharmony_cistatic u32 ath9k_hw_ar9003_dump_eeprom(struct ath_hw *ah, bool dump_base_hdr,
357562306a36Sopenharmony_ci				       u8 *buf, u32 len, u32 size)
357662306a36Sopenharmony_ci{
357762306a36Sopenharmony_ci	return 0;
357862306a36Sopenharmony_ci}
357962306a36Sopenharmony_ci#endif
358062306a36Sopenharmony_ci
358162306a36Sopenharmony_ci/* XXX: review hardware docs */
358262306a36Sopenharmony_cistatic int ath9k_hw_ar9300_get_eeprom_ver(struct ath_hw *ah)
358362306a36Sopenharmony_ci{
358462306a36Sopenharmony_ci	return ah->eeprom.ar9300_eep.eepromVersion;
358562306a36Sopenharmony_ci}
358662306a36Sopenharmony_ci
358762306a36Sopenharmony_ci/* XXX: could be read from the eepromVersion, not sure yet */
358862306a36Sopenharmony_cistatic int ath9k_hw_ar9300_get_eeprom_rev(struct ath_hw *ah)
358962306a36Sopenharmony_ci{
359062306a36Sopenharmony_ci	return 0;
359162306a36Sopenharmony_ci}
359262306a36Sopenharmony_ci
359362306a36Sopenharmony_cistatic struct ar9300_modal_eep_header *ar9003_modal_header(struct ath_hw *ah,
359462306a36Sopenharmony_ci							   bool is2ghz)
359562306a36Sopenharmony_ci{
359662306a36Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
359762306a36Sopenharmony_ci
359862306a36Sopenharmony_ci	if (is2ghz)
359962306a36Sopenharmony_ci		return &eep->modalHeader2G;
360062306a36Sopenharmony_ci	else
360162306a36Sopenharmony_ci		return &eep->modalHeader5G;
360262306a36Sopenharmony_ci}
360362306a36Sopenharmony_ci
360462306a36Sopenharmony_cistatic void ar9003_hw_xpa_bias_level_apply(struct ath_hw *ah, bool is2ghz)
360562306a36Sopenharmony_ci{
360662306a36Sopenharmony_ci	int bias = ar9003_modal_header(ah, is2ghz)->xpaBiasLvl;
360762306a36Sopenharmony_ci
360862306a36Sopenharmony_ci	if (AR_SREV_9485(ah) || AR_SREV_9330(ah) || AR_SREV_9340(ah) ||
360962306a36Sopenharmony_ci	    AR_SREV_9531(ah) || AR_SREV_9561(ah))
361062306a36Sopenharmony_ci		REG_RMW_FIELD(ah, AR_CH0_TOP2(ah), AR_CH0_TOP2_XPABIASLVL, bias);
361162306a36Sopenharmony_ci	else if (AR_SREV_9462(ah) || AR_SREV_9550(ah) || AR_SREV_9565(ah))
361262306a36Sopenharmony_ci		REG_RMW_FIELD(ah, AR_CH0_TOP(ah), AR_CH0_TOP_XPABIASLVL, bias);
361362306a36Sopenharmony_ci	else {
361462306a36Sopenharmony_ci		REG_RMW_FIELD(ah, AR_CH0_TOP(ah), AR_CH0_TOP_XPABIASLVL, bias);
361562306a36Sopenharmony_ci		REG_RMW_FIELD(ah, AR_CH0_THERM(ah),
361662306a36Sopenharmony_ci				AR_CH0_THERM_XPABIASLVL_MSB,
361762306a36Sopenharmony_ci				bias >> 2);
361862306a36Sopenharmony_ci		REG_RMW_FIELD(ah, AR_CH0_THERM(ah),
361962306a36Sopenharmony_ci				AR_CH0_THERM_XPASHORT2GND, 1);
362062306a36Sopenharmony_ci	}
362162306a36Sopenharmony_ci}
362262306a36Sopenharmony_ci
362362306a36Sopenharmony_cistatic u16 ar9003_switch_com_spdt_get(struct ath_hw *ah, bool is2ghz)
362462306a36Sopenharmony_ci{
362562306a36Sopenharmony_ci	return le16_to_cpu(ar9003_modal_header(ah, is2ghz)->switchcomspdt);
362662306a36Sopenharmony_ci}
362762306a36Sopenharmony_ci
362862306a36Sopenharmony_ciu32 ar9003_hw_ant_ctrl_common_get(struct ath_hw *ah, bool is2ghz)
362962306a36Sopenharmony_ci{
363062306a36Sopenharmony_ci	return le32_to_cpu(ar9003_modal_header(ah, is2ghz)->antCtrlCommon);
363162306a36Sopenharmony_ci}
363262306a36Sopenharmony_ci
363362306a36Sopenharmony_ciu32 ar9003_hw_ant_ctrl_common_2_get(struct ath_hw *ah, bool is2ghz)
363462306a36Sopenharmony_ci{
363562306a36Sopenharmony_ci	return le32_to_cpu(ar9003_modal_header(ah, is2ghz)->antCtrlCommon2);
363662306a36Sopenharmony_ci}
363762306a36Sopenharmony_ci
363862306a36Sopenharmony_cistatic u16 ar9003_hw_ant_ctrl_chain_get(struct ath_hw *ah, int chain,
363962306a36Sopenharmony_ci					bool is2ghz)
364062306a36Sopenharmony_ci{
364162306a36Sopenharmony_ci	__le16 val = ar9003_modal_header(ah, is2ghz)->antCtrlChain[chain];
364262306a36Sopenharmony_ci	return le16_to_cpu(val);
364362306a36Sopenharmony_ci}
364462306a36Sopenharmony_ci
364562306a36Sopenharmony_cistatic void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz)
364662306a36Sopenharmony_ci{
364762306a36Sopenharmony_ci	struct ath_common *common = ath9k_hw_common(ah);
364862306a36Sopenharmony_ci	struct ath9k_hw_capabilities *pCap = &ah->caps;
364962306a36Sopenharmony_ci	int chain;
365062306a36Sopenharmony_ci	u32 regval, value, gpio;
365162306a36Sopenharmony_ci	static const u32 switch_chain_reg[AR9300_MAX_CHAINS] = {
365262306a36Sopenharmony_ci			AR_PHY_SWITCH_CHAIN_0,
365362306a36Sopenharmony_ci			AR_PHY_SWITCH_CHAIN_1,
365462306a36Sopenharmony_ci			AR_PHY_SWITCH_CHAIN_2,
365562306a36Sopenharmony_ci	};
365662306a36Sopenharmony_ci
365762306a36Sopenharmony_ci	if (AR_SREV_9485(ah) && (ar9003_hw_get_rx_gain_idx(ah) == 0)) {
365862306a36Sopenharmony_ci		if (ah->config.xlna_gpio)
365962306a36Sopenharmony_ci			gpio = ah->config.xlna_gpio;
366062306a36Sopenharmony_ci		else
366162306a36Sopenharmony_ci			gpio = AR9300_EXT_LNA_CTL_GPIO_AR9485;
366262306a36Sopenharmony_ci
366362306a36Sopenharmony_ci		ath9k_hw_gpio_request_out(ah, gpio, NULL,
366462306a36Sopenharmony_ci					  AR_GPIO_OUTPUT_MUX_AS_PCIE_ATTENTION_LED);
366562306a36Sopenharmony_ci	}
366662306a36Sopenharmony_ci
366762306a36Sopenharmony_ci	value = ar9003_hw_ant_ctrl_common_get(ah, is2ghz);
366862306a36Sopenharmony_ci
366962306a36Sopenharmony_ci	if (AR_SREV_9462(ah) || AR_SREV_9565(ah)) {
367062306a36Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM,
367162306a36Sopenharmony_ci				AR_SWITCH_TABLE_COM_AR9462_ALL, value);
367262306a36Sopenharmony_ci	} else if (AR_SREV_9550(ah) || AR_SREV_9531(ah) || AR_SREV_9561(ah)) {
367362306a36Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM,
367462306a36Sopenharmony_ci				AR_SWITCH_TABLE_COM_AR9550_ALL, value);
367562306a36Sopenharmony_ci	} else
367662306a36Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM,
367762306a36Sopenharmony_ci			      AR_SWITCH_TABLE_COM_ALL, value);
367862306a36Sopenharmony_ci
367962306a36Sopenharmony_ci
368062306a36Sopenharmony_ci	/*
368162306a36Sopenharmony_ci	 *   AR9462 defines new switch table for BT/WLAN,
368262306a36Sopenharmony_ci	 *       here's new field name in XXX.ref for both 2G and 5G.
368362306a36Sopenharmony_ci	 *   Register: [GLB_CONTROL] GLB_CONTROL (@0x20044)
368462306a36Sopenharmony_ci	 *   15:12   R/W     SWITCH_TABLE_COM_SPDT_WLAN_RX
368562306a36Sopenharmony_ci	 * SWITCH_TABLE_COM_SPDT_WLAN_RX
368662306a36Sopenharmony_ci	 *
368762306a36Sopenharmony_ci	 *   11:8     R/W     SWITCH_TABLE_COM_SPDT_WLAN_TX
368862306a36Sopenharmony_ci	 * SWITCH_TABLE_COM_SPDT_WLAN_TX
368962306a36Sopenharmony_ci	 *
369062306a36Sopenharmony_ci	 *   7:4 R/W  SWITCH_TABLE_COM_SPDT_WLAN_IDLE
369162306a36Sopenharmony_ci	 * SWITCH_TABLE_COM_SPDT_WLAN_IDLE
369262306a36Sopenharmony_ci	 */
369362306a36Sopenharmony_ci	if (AR_SREV_9462_20_OR_LATER(ah) || AR_SREV_9565(ah)) {
369462306a36Sopenharmony_ci		value = ar9003_switch_com_spdt_get(ah, is2ghz);
369562306a36Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_GLB_CONTROL,
369662306a36Sopenharmony_ci				AR_SWITCH_TABLE_COM_SPDT_ALL, value);
369762306a36Sopenharmony_ci		REG_SET_BIT(ah, AR_PHY_GLB_CONTROL, AR_BTCOEX_CTRL_SPDT_ENABLE);
369862306a36Sopenharmony_ci	}
369962306a36Sopenharmony_ci
370062306a36Sopenharmony_ci	value = ar9003_hw_ant_ctrl_common_2_get(ah, is2ghz);
370162306a36Sopenharmony_ci	if (AR_SREV_9485(ah) && common->bt_ant_diversity) {
370262306a36Sopenharmony_ci		value &= ~AR_SWITCH_TABLE_COM2_ALL;
370362306a36Sopenharmony_ci		value |= ah->config.ant_ctrl_comm2g_switch_enable;
370462306a36Sopenharmony_ci
370562306a36Sopenharmony_ci	}
370662306a36Sopenharmony_ci	REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM_2, AR_SWITCH_TABLE_COM2_ALL, value);
370762306a36Sopenharmony_ci
370862306a36Sopenharmony_ci	if ((AR_SREV_9462(ah)) && (ah->rxchainmask == 0x2)) {
370962306a36Sopenharmony_ci		value = ar9003_hw_ant_ctrl_chain_get(ah, 1, is2ghz);
371062306a36Sopenharmony_ci		REG_RMW_FIELD(ah, switch_chain_reg[0],
371162306a36Sopenharmony_ci			      AR_SWITCH_TABLE_ALL, value);
371262306a36Sopenharmony_ci	}
371362306a36Sopenharmony_ci
371462306a36Sopenharmony_ci	for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
371562306a36Sopenharmony_ci		if ((ah->rxchainmask & BIT(chain)) ||
371662306a36Sopenharmony_ci		    (ah->txchainmask & BIT(chain))) {
371762306a36Sopenharmony_ci			value = ar9003_hw_ant_ctrl_chain_get(ah, chain,
371862306a36Sopenharmony_ci							     is2ghz);
371962306a36Sopenharmony_ci			REG_RMW_FIELD(ah, switch_chain_reg[chain],
372062306a36Sopenharmony_ci				      AR_SWITCH_TABLE_ALL, value);
372162306a36Sopenharmony_ci		}
372262306a36Sopenharmony_ci	}
372362306a36Sopenharmony_ci
372462306a36Sopenharmony_ci	if (AR_SREV_9330(ah) || AR_SREV_9485(ah) || AR_SREV_9565(ah)) {
372562306a36Sopenharmony_ci		value = ath9k_hw_ar9300_get_eeprom(ah, EEP_ANT_DIV_CTL1);
372662306a36Sopenharmony_ci		/*
372762306a36Sopenharmony_ci		 * main_lnaconf, alt_lnaconf, main_tb, alt_tb
372862306a36Sopenharmony_ci		 * are the fields present
372962306a36Sopenharmony_ci		 */
373062306a36Sopenharmony_ci		regval = REG_READ(ah, AR_PHY_MC_GAIN_CTRL);
373162306a36Sopenharmony_ci		regval &= (~AR_ANT_DIV_CTRL_ALL);
373262306a36Sopenharmony_ci		regval |= (value & 0x3f) << AR_ANT_DIV_CTRL_ALL_S;
373362306a36Sopenharmony_ci		/* enable_lnadiv */
373462306a36Sopenharmony_ci		regval &= (~AR_PHY_ANT_DIV_LNADIV);
373562306a36Sopenharmony_ci		regval |= ((value >> 6) & 0x1) << AR_PHY_ANT_DIV_LNADIV_S;
373662306a36Sopenharmony_ci
373762306a36Sopenharmony_ci		if (AR_SREV_9485(ah) && common->bt_ant_diversity)
373862306a36Sopenharmony_ci			regval |= AR_ANT_DIV_ENABLE;
373962306a36Sopenharmony_ci
374062306a36Sopenharmony_ci		if (AR_SREV_9565(ah)) {
374162306a36Sopenharmony_ci			if (common->bt_ant_diversity) {
374262306a36Sopenharmony_ci				regval |= (1 << AR_PHY_ANT_SW_RX_PROT_S);
374362306a36Sopenharmony_ci
374462306a36Sopenharmony_ci				REG_SET_BIT(ah, AR_PHY_RESTART,
374562306a36Sopenharmony_ci					    AR_PHY_RESTART_ENABLE_DIV_M2FLAG);
374662306a36Sopenharmony_ci
374762306a36Sopenharmony_ci				/* Force WLAN LNA diversity ON */
374862306a36Sopenharmony_ci				REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV,
374962306a36Sopenharmony_ci					    AR_BTCOEX_WL_LNADIV_FORCE_ON);
375062306a36Sopenharmony_ci			} else {
375162306a36Sopenharmony_ci				regval &= ~(1 << AR_PHY_ANT_DIV_LNADIV_S);
375262306a36Sopenharmony_ci				regval &= ~(1 << AR_PHY_ANT_SW_RX_PROT_S);
375362306a36Sopenharmony_ci
375462306a36Sopenharmony_ci				REG_CLR_BIT(ah, AR_PHY_MC_GAIN_CTRL,
375562306a36Sopenharmony_ci					    (1 << AR_PHY_ANT_SW_RX_PROT_S));
375662306a36Sopenharmony_ci
375762306a36Sopenharmony_ci				/* Force WLAN LNA diversity OFF */
375862306a36Sopenharmony_ci				REG_CLR_BIT(ah, AR_BTCOEX_WL_LNADIV,
375962306a36Sopenharmony_ci					    AR_BTCOEX_WL_LNADIV_FORCE_ON);
376062306a36Sopenharmony_ci			}
376162306a36Sopenharmony_ci		}
376262306a36Sopenharmony_ci
376362306a36Sopenharmony_ci		REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval);
376462306a36Sopenharmony_ci
376562306a36Sopenharmony_ci		/* enable fast_div */
376662306a36Sopenharmony_ci		regval = REG_READ(ah, AR_PHY_CCK_DETECT);
376762306a36Sopenharmony_ci		regval &= (~AR_FAST_DIV_ENABLE);
376862306a36Sopenharmony_ci		regval |= ((value >> 7) & 0x1) << AR_FAST_DIV_ENABLE_S;
376962306a36Sopenharmony_ci
377062306a36Sopenharmony_ci		if ((AR_SREV_9485(ah) || AR_SREV_9565(ah))
377162306a36Sopenharmony_ci		    && common->bt_ant_diversity)
377262306a36Sopenharmony_ci			regval |= AR_FAST_DIV_ENABLE;
377362306a36Sopenharmony_ci
377462306a36Sopenharmony_ci		REG_WRITE(ah, AR_PHY_CCK_DETECT, regval);
377562306a36Sopenharmony_ci
377662306a36Sopenharmony_ci		if (pCap->hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB) {
377762306a36Sopenharmony_ci			regval = REG_READ(ah, AR_PHY_MC_GAIN_CTRL);
377862306a36Sopenharmony_ci			/*
377962306a36Sopenharmony_ci			 * clear bits 25-30 main_lnaconf, alt_lnaconf,
378062306a36Sopenharmony_ci			 * main_tb, alt_tb
378162306a36Sopenharmony_ci			 */
378262306a36Sopenharmony_ci			regval &= (~(AR_PHY_ANT_DIV_MAIN_LNACONF |
378362306a36Sopenharmony_ci				     AR_PHY_ANT_DIV_ALT_LNACONF |
378462306a36Sopenharmony_ci				     AR_PHY_ANT_DIV_ALT_GAINTB |
378562306a36Sopenharmony_ci				     AR_PHY_ANT_DIV_MAIN_GAINTB));
378662306a36Sopenharmony_ci			/* by default use LNA1 for the main antenna */
378762306a36Sopenharmony_ci			regval |= (ATH_ANT_DIV_COMB_LNA1 <<
378862306a36Sopenharmony_ci				   AR_PHY_ANT_DIV_MAIN_LNACONF_S);
378962306a36Sopenharmony_ci			regval |= (ATH_ANT_DIV_COMB_LNA2 <<
379062306a36Sopenharmony_ci				   AR_PHY_ANT_DIV_ALT_LNACONF_S);
379162306a36Sopenharmony_ci			REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval);
379262306a36Sopenharmony_ci		}
379362306a36Sopenharmony_ci	}
379462306a36Sopenharmony_ci}
379562306a36Sopenharmony_ci
379662306a36Sopenharmony_cistatic void ar9003_hw_drive_strength_apply(struct ath_hw *ah)
379762306a36Sopenharmony_ci{
379862306a36Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
379962306a36Sopenharmony_ci	struct ar9300_base_eep_hdr *pBase = &eep->baseEepHeader;
380062306a36Sopenharmony_ci	int drive_strength;
380162306a36Sopenharmony_ci	unsigned long reg;
380262306a36Sopenharmony_ci
380362306a36Sopenharmony_ci	drive_strength = pBase->miscConfiguration & BIT(0);
380462306a36Sopenharmony_ci	if (!drive_strength)
380562306a36Sopenharmony_ci		return;
380662306a36Sopenharmony_ci
380762306a36Sopenharmony_ci	reg = REG_READ(ah, AR_PHY_65NM_CH0_BIAS1);
380862306a36Sopenharmony_ci	reg &= ~0x00ffffc0;
380962306a36Sopenharmony_ci	reg |= 0x5 << 21;
381062306a36Sopenharmony_ci	reg |= 0x5 << 18;
381162306a36Sopenharmony_ci	reg |= 0x5 << 15;
381262306a36Sopenharmony_ci	reg |= 0x5 << 12;
381362306a36Sopenharmony_ci	reg |= 0x5 << 9;
381462306a36Sopenharmony_ci	reg |= 0x5 << 6;
381562306a36Sopenharmony_ci	REG_WRITE(ah, AR_PHY_65NM_CH0_BIAS1, reg);
381662306a36Sopenharmony_ci
381762306a36Sopenharmony_ci	reg = REG_READ(ah, AR_PHY_65NM_CH0_BIAS2);
381862306a36Sopenharmony_ci	reg &= ~0xffffffe0;
381962306a36Sopenharmony_ci	reg |= 0x5 << 29;
382062306a36Sopenharmony_ci	reg |= 0x5 << 26;
382162306a36Sopenharmony_ci	reg |= 0x5 << 23;
382262306a36Sopenharmony_ci	reg |= 0x5 << 20;
382362306a36Sopenharmony_ci	reg |= 0x5 << 17;
382462306a36Sopenharmony_ci	reg |= 0x5 << 14;
382562306a36Sopenharmony_ci	reg |= 0x5 << 11;
382662306a36Sopenharmony_ci	reg |= 0x5 << 8;
382762306a36Sopenharmony_ci	reg |= 0x5 << 5;
382862306a36Sopenharmony_ci	REG_WRITE(ah, AR_PHY_65NM_CH0_BIAS2, reg);
382962306a36Sopenharmony_ci
383062306a36Sopenharmony_ci	reg = REG_READ(ah, AR_PHY_65NM_CH0_BIAS4);
383162306a36Sopenharmony_ci	reg &= ~0xff800000;
383262306a36Sopenharmony_ci	reg |= 0x5 << 29;
383362306a36Sopenharmony_ci	reg |= 0x5 << 26;
383462306a36Sopenharmony_ci	reg |= 0x5 << 23;
383562306a36Sopenharmony_ci	REG_WRITE(ah, AR_PHY_65NM_CH0_BIAS4, reg);
383662306a36Sopenharmony_ci}
383762306a36Sopenharmony_ci
383862306a36Sopenharmony_cistatic u16 ar9003_hw_atten_chain_get(struct ath_hw *ah, int chain,
383962306a36Sopenharmony_ci				     struct ath9k_channel *chan)
384062306a36Sopenharmony_ci{
384162306a36Sopenharmony_ci	int f[3], t[3];
384262306a36Sopenharmony_ci	u16 value;
384362306a36Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
384462306a36Sopenharmony_ci
384562306a36Sopenharmony_ci	if (chain >= 0 && chain < 3) {
384662306a36Sopenharmony_ci		if (IS_CHAN_2GHZ(chan))
384762306a36Sopenharmony_ci			return eep->modalHeader2G.xatten1DB[chain];
384862306a36Sopenharmony_ci		else if (eep->base_ext2.xatten1DBLow[chain] != 0) {
384962306a36Sopenharmony_ci			t[0] = eep->base_ext2.xatten1DBLow[chain];
385062306a36Sopenharmony_ci			f[0] = 5180;
385162306a36Sopenharmony_ci			t[1] = eep->modalHeader5G.xatten1DB[chain];
385262306a36Sopenharmony_ci			f[1] = 5500;
385362306a36Sopenharmony_ci			t[2] = eep->base_ext2.xatten1DBHigh[chain];
385462306a36Sopenharmony_ci			f[2] = 5785;
385562306a36Sopenharmony_ci			value = ar9003_hw_power_interpolate((s32) chan->channel,
385662306a36Sopenharmony_ci							    f, t, 3);
385762306a36Sopenharmony_ci			return value;
385862306a36Sopenharmony_ci		} else
385962306a36Sopenharmony_ci			return eep->modalHeader5G.xatten1DB[chain];
386062306a36Sopenharmony_ci	}
386162306a36Sopenharmony_ci
386262306a36Sopenharmony_ci	return 0;
386362306a36Sopenharmony_ci}
386462306a36Sopenharmony_ci
386562306a36Sopenharmony_ci
386662306a36Sopenharmony_cistatic u16 ar9003_hw_atten_chain_get_margin(struct ath_hw *ah, int chain,
386762306a36Sopenharmony_ci					    struct ath9k_channel *chan)
386862306a36Sopenharmony_ci{
386962306a36Sopenharmony_ci	int f[3], t[3];
387062306a36Sopenharmony_ci	u16 value;
387162306a36Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
387262306a36Sopenharmony_ci
387362306a36Sopenharmony_ci	if (chain >= 0 && chain < 3) {
387462306a36Sopenharmony_ci		if (IS_CHAN_2GHZ(chan))
387562306a36Sopenharmony_ci			return eep->modalHeader2G.xatten1Margin[chain];
387662306a36Sopenharmony_ci		else if (eep->base_ext2.xatten1MarginLow[chain] != 0) {
387762306a36Sopenharmony_ci			t[0] = eep->base_ext2.xatten1MarginLow[chain];
387862306a36Sopenharmony_ci			f[0] = 5180;
387962306a36Sopenharmony_ci			t[1] = eep->modalHeader5G.xatten1Margin[chain];
388062306a36Sopenharmony_ci			f[1] = 5500;
388162306a36Sopenharmony_ci			t[2] = eep->base_ext2.xatten1MarginHigh[chain];
388262306a36Sopenharmony_ci			f[2] = 5785;
388362306a36Sopenharmony_ci			value = ar9003_hw_power_interpolate((s32) chan->channel,
388462306a36Sopenharmony_ci							    f, t, 3);
388562306a36Sopenharmony_ci			return value;
388662306a36Sopenharmony_ci		} else
388762306a36Sopenharmony_ci			return eep->modalHeader5G.xatten1Margin[chain];
388862306a36Sopenharmony_ci	}
388962306a36Sopenharmony_ci
389062306a36Sopenharmony_ci	return 0;
389162306a36Sopenharmony_ci}
389262306a36Sopenharmony_ci
389362306a36Sopenharmony_cistatic void ar9003_hw_atten_apply(struct ath_hw *ah, struct ath9k_channel *chan)
389462306a36Sopenharmony_ci{
389562306a36Sopenharmony_ci	int i;
389662306a36Sopenharmony_ci	u16 value;
389762306a36Sopenharmony_ci	unsigned long ext_atten_reg[3] = {AR_PHY_EXT_ATTEN_CTL_0,
389862306a36Sopenharmony_ci					  AR_PHY_EXT_ATTEN_CTL_1,
389962306a36Sopenharmony_ci					  AR_PHY_EXT_ATTEN_CTL_2,
390062306a36Sopenharmony_ci					 };
390162306a36Sopenharmony_ci
390262306a36Sopenharmony_ci	if ((AR_SREV_9462(ah)) && (ah->rxchainmask == 0x2)) {
390362306a36Sopenharmony_ci		value = ar9003_hw_atten_chain_get(ah, 1, chan);
390462306a36Sopenharmony_ci		REG_RMW_FIELD(ah, ext_atten_reg[0],
390562306a36Sopenharmony_ci			      AR_PHY_EXT_ATTEN_CTL_XATTEN1_DB, value);
390662306a36Sopenharmony_ci
390762306a36Sopenharmony_ci		value = ar9003_hw_atten_chain_get_margin(ah, 1, chan);
390862306a36Sopenharmony_ci		REG_RMW_FIELD(ah, ext_atten_reg[0],
390962306a36Sopenharmony_ci			      AR_PHY_EXT_ATTEN_CTL_XATTEN1_MARGIN,
391062306a36Sopenharmony_ci			      value);
391162306a36Sopenharmony_ci	}
391262306a36Sopenharmony_ci
391362306a36Sopenharmony_ci	/* Test value. if 0 then attenuation is unused. Don't load anything. */
391462306a36Sopenharmony_ci	for (i = 0; i < AR9300_MAX_CHAINS; i++) {
391562306a36Sopenharmony_ci		if (ah->txchainmask & BIT(i)) {
391662306a36Sopenharmony_ci			value = ar9003_hw_atten_chain_get(ah, i, chan);
391762306a36Sopenharmony_ci			REG_RMW_FIELD(ah, ext_atten_reg[i],
391862306a36Sopenharmony_ci				      AR_PHY_EXT_ATTEN_CTL_XATTEN1_DB, value);
391962306a36Sopenharmony_ci
392062306a36Sopenharmony_ci			if (AR_SREV_9485(ah) &&
392162306a36Sopenharmony_ci			    (ar9003_hw_get_rx_gain_idx(ah) == 0) &&
392262306a36Sopenharmony_ci			    ah->config.xatten_margin_cfg)
392362306a36Sopenharmony_ci				value = 5;
392462306a36Sopenharmony_ci			else
392562306a36Sopenharmony_ci				value = ar9003_hw_atten_chain_get_margin(ah, i, chan);
392662306a36Sopenharmony_ci
392762306a36Sopenharmony_ci			if (ah->config.alt_mingainidx)
392862306a36Sopenharmony_ci				REG_RMW_FIELD(ah, AR_PHY_EXT_ATTEN_CTL_0,
392962306a36Sopenharmony_ci					      AR_PHY_EXT_ATTEN_CTL_XATTEN1_MARGIN,
393062306a36Sopenharmony_ci					      value);
393162306a36Sopenharmony_ci
393262306a36Sopenharmony_ci			REG_RMW_FIELD(ah, ext_atten_reg[i],
393362306a36Sopenharmony_ci				      AR_PHY_EXT_ATTEN_CTL_XATTEN1_MARGIN,
393462306a36Sopenharmony_ci				      value);
393562306a36Sopenharmony_ci		}
393662306a36Sopenharmony_ci	}
393762306a36Sopenharmony_ci}
393862306a36Sopenharmony_ci
393962306a36Sopenharmony_cistatic bool is_pmu_set(struct ath_hw *ah, u32 pmu_reg, int pmu_set)
394062306a36Sopenharmony_ci{
394162306a36Sopenharmony_ci	int timeout = 100;
394262306a36Sopenharmony_ci
394362306a36Sopenharmony_ci	while (pmu_set != REG_READ(ah, pmu_reg)) {
394462306a36Sopenharmony_ci		if (timeout-- == 0)
394562306a36Sopenharmony_ci			return false;
394662306a36Sopenharmony_ci		REG_WRITE(ah, pmu_reg, pmu_set);
394762306a36Sopenharmony_ci		udelay(10);
394862306a36Sopenharmony_ci	}
394962306a36Sopenharmony_ci
395062306a36Sopenharmony_ci	return true;
395162306a36Sopenharmony_ci}
395262306a36Sopenharmony_ci
395362306a36Sopenharmony_civoid ar9003_hw_internal_regulator_apply(struct ath_hw *ah)
395462306a36Sopenharmony_ci{
395562306a36Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
395662306a36Sopenharmony_ci	struct ar9300_base_eep_hdr *pBase = &eep->baseEepHeader;
395762306a36Sopenharmony_ci	u32 reg_val;
395862306a36Sopenharmony_ci
395962306a36Sopenharmony_ci	if (pBase->featureEnable & BIT(4)) {
396062306a36Sopenharmony_ci		if (AR_SREV_9330(ah) || AR_SREV_9485(ah)) {
396162306a36Sopenharmony_ci			int reg_pmu_set;
396262306a36Sopenharmony_ci
396362306a36Sopenharmony_ci			reg_pmu_set = REG_READ(ah, AR_PHY_PMU2(ah)) & ~AR_PHY_PMU2_PGM;
396462306a36Sopenharmony_ci			REG_WRITE(ah, AR_PHY_PMU2(ah), reg_pmu_set);
396562306a36Sopenharmony_ci			if (!is_pmu_set(ah, AR_PHY_PMU2(ah), reg_pmu_set))
396662306a36Sopenharmony_ci				return;
396762306a36Sopenharmony_ci
396862306a36Sopenharmony_ci			if (AR_SREV_9330(ah)) {
396962306a36Sopenharmony_ci				if (ah->is_clk_25mhz) {
397062306a36Sopenharmony_ci					reg_pmu_set = (3 << 1) | (8 << 4) |
397162306a36Sopenharmony_ci						      (3 << 8) | (1 << 14) |
397262306a36Sopenharmony_ci						      (6 << 17) | (1 << 20) |
397362306a36Sopenharmony_ci						      (3 << 24);
397462306a36Sopenharmony_ci				} else {
397562306a36Sopenharmony_ci					reg_pmu_set = (4 << 1)  | (7 << 4) |
397662306a36Sopenharmony_ci						      (3 << 8)  | (1 << 14) |
397762306a36Sopenharmony_ci						      (6 << 17) | (1 << 20) |
397862306a36Sopenharmony_ci						      (3 << 24);
397962306a36Sopenharmony_ci				}
398062306a36Sopenharmony_ci			} else {
398162306a36Sopenharmony_ci				reg_pmu_set = (5 << 1) | (7 << 4) |
398262306a36Sopenharmony_ci					      (2 << 8) | (2 << 14) |
398362306a36Sopenharmony_ci					      (6 << 17) | (1 << 20) |
398462306a36Sopenharmony_ci					      (3 << 24) | (1 << 28);
398562306a36Sopenharmony_ci			}
398662306a36Sopenharmony_ci
398762306a36Sopenharmony_ci			REG_WRITE(ah, AR_PHY_PMU1(ah), reg_pmu_set);
398862306a36Sopenharmony_ci			if (!is_pmu_set(ah, AR_PHY_PMU1(ah), reg_pmu_set))
398962306a36Sopenharmony_ci				return;
399062306a36Sopenharmony_ci
399162306a36Sopenharmony_ci			reg_pmu_set = (REG_READ(ah, AR_PHY_PMU2(ah)) & ~0xFFC00000)
399262306a36Sopenharmony_ci					| (4 << 26);
399362306a36Sopenharmony_ci			REG_WRITE(ah, AR_PHY_PMU2(ah), reg_pmu_set);
399462306a36Sopenharmony_ci			if (!is_pmu_set(ah, AR_PHY_PMU2(ah), reg_pmu_set))
399562306a36Sopenharmony_ci				return;
399662306a36Sopenharmony_ci
399762306a36Sopenharmony_ci			reg_pmu_set = (REG_READ(ah, AR_PHY_PMU2(ah)) & ~0x00200000)
399862306a36Sopenharmony_ci					| (1 << 21);
399962306a36Sopenharmony_ci			REG_WRITE(ah, AR_PHY_PMU2(ah), reg_pmu_set);
400062306a36Sopenharmony_ci			if (!is_pmu_set(ah, AR_PHY_PMU2(ah), reg_pmu_set))
400162306a36Sopenharmony_ci				return;
400262306a36Sopenharmony_ci		} else if (AR_SREV_9462(ah) || AR_SREV_9565(ah) ||
400362306a36Sopenharmony_ci			   AR_SREV_9561(ah)) {
400462306a36Sopenharmony_ci			reg_val = le32_to_cpu(pBase->swreg);
400562306a36Sopenharmony_ci			REG_WRITE(ah, AR_PHY_PMU1(ah), reg_val);
400662306a36Sopenharmony_ci
400762306a36Sopenharmony_ci			if (AR_SREV_9561(ah))
400862306a36Sopenharmony_ci				REG_WRITE(ah, AR_PHY_PMU2(ah), 0x10200000);
400962306a36Sopenharmony_ci		} else {
401062306a36Sopenharmony_ci			/* Internal regulator is ON. Write swreg register. */
401162306a36Sopenharmony_ci			reg_val = le32_to_cpu(pBase->swreg);
401262306a36Sopenharmony_ci			REG_WRITE(ah, AR_RTC_REG_CONTROL1,
401362306a36Sopenharmony_ci				  REG_READ(ah, AR_RTC_REG_CONTROL1) &
401462306a36Sopenharmony_ci				  (~AR_RTC_REG_CONTROL1_SWREG_PROGRAM));
401562306a36Sopenharmony_ci			REG_WRITE(ah, AR_RTC_REG_CONTROL0, reg_val);
401662306a36Sopenharmony_ci			/* Set REG_CONTROL1.SWREG_PROGRAM */
401762306a36Sopenharmony_ci			REG_WRITE(ah, AR_RTC_REG_CONTROL1,
401862306a36Sopenharmony_ci				  REG_READ(ah,
401962306a36Sopenharmony_ci					   AR_RTC_REG_CONTROL1) |
402062306a36Sopenharmony_ci					   AR_RTC_REG_CONTROL1_SWREG_PROGRAM);
402162306a36Sopenharmony_ci		}
402262306a36Sopenharmony_ci	} else {
402362306a36Sopenharmony_ci		if (AR_SREV_9330(ah) || AR_SREV_9485(ah)) {
402462306a36Sopenharmony_ci			REG_RMW_FIELD(ah, AR_PHY_PMU2(ah), AR_PHY_PMU2_PGM, 0);
402562306a36Sopenharmony_ci			while (REG_READ_FIELD(ah, AR_PHY_PMU2(ah),
402662306a36Sopenharmony_ci						AR_PHY_PMU2_PGM))
402762306a36Sopenharmony_ci				udelay(10);
402862306a36Sopenharmony_ci
402962306a36Sopenharmony_ci			REG_RMW_FIELD(ah, AR_PHY_PMU1(ah), AR_PHY_PMU1_PWD, 0x1);
403062306a36Sopenharmony_ci			while (!REG_READ_FIELD(ah, AR_PHY_PMU1(ah),
403162306a36Sopenharmony_ci						AR_PHY_PMU1_PWD))
403262306a36Sopenharmony_ci				udelay(10);
403362306a36Sopenharmony_ci			REG_RMW_FIELD(ah, AR_PHY_PMU2(ah), AR_PHY_PMU2_PGM, 0x1);
403462306a36Sopenharmony_ci			while (!REG_READ_FIELD(ah, AR_PHY_PMU2(ah),
403562306a36Sopenharmony_ci						AR_PHY_PMU2_PGM))
403662306a36Sopenharmony_ci				udelay(10);
403762306a36Sopenharmony_ci		} else if (AR_SREV_9462(ah) || AR_SREV_9565(ah))
403862306a36Sopenharmony_ci			REG_RMW_FIELD(ah, AR_PHY_PMU1(ah), AR_PHY_PMU1_PWD, 0x1);
403962306a36Sopenharmony_ci		else {
404062306a36Sopenharmony_ci			reg_val = REG_READ(ah, AR_RTC_SLEEP_CLK(ah)) |
404162306a36Sopenharmony_ci				AR_RTC_FORCE_SWREG_PRD;
404262306a36Sopenharmony_ci			REG_WRITE(ah, AR_RTC_SLEEP_CLK(ah), reg_val);
404362306a36Sopenharmony_ci		}
404462306a36Sopenharmony_ci	}
404562306a36Sopenharmony_ci
404662306a36Sopenharmony_ci}
404762306a36Sopenharmony_ci
404862306a36Sopenharmony_cistatic void ar9003_hw_apply_tuning_caps(struct ath_hw *ah)
404962306a36Sopenharmony_ci{
405062306a36Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
405162306a36Sopenharmony_ci	u8 tuning_caps_param = eep->baseEepHeader.params_for_tuning_caps[0];
405262306a36Sopenharmony_ci
405362306a36Sopenharmony_ci	if (AR_SREV_9340(ah) || AR_SREV_9531(ah))
405462306a36Sopenharmony_ci		return;
405562306a36Sopenharmony_ci
405662306a36Sopenharmony_ci	if (eep->baseEepHeader.featureEnable & 0x40) {
405762306a36Sopenharmony_ci		tuning_caps_param &= 0x7f;
405862306a36Sopenharmony_ci		REG_RMW_FIELD(ah, AR_CH0_XTAL(ah), AR_CH0_XTAL_CAPINDAC,
405962306a36Sopenharmony_ci			      tuning_caps_param);
406062306a36Sopenharmony_ci		REG_RMW_FIELD(ah, AR_CH0_XTAL(ah), AR_CH0_XTAL_CAPOUTDAC,
406162306a36Sopenharmony_ci			      tuning_caps_param);
406262306a36Sopenharmony_ci	}
406362306a36Sopenharmony_ci}
406462306a36Sopenharmony_ci
406562306a36Sopenharmony_cistatic void ar9003_hw_quick_drop_apply(struct ath_hw *ah, u16 freq)
406662306a36Sopenharmony_ci{
406762306a36Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
406862306a36Sopenharmony_ci	struct ar9300_base_eep_hdr *pBase = &eep->baseEepHeader;
406962306a36Sopenharmony_ci	int quick_drop;
407062306a36Sopenharmony_ci	s32 t[3], f[3] = {5180, 5500, 5785};
407162306a36Sopenharmony_ci
407262306a36Sopenharmony_ci	if (!(pBase->miscConfiguration & BIT(4)))
407362306a36Sopenharmony_ci		return;
407462306a36Sopenharmony_ci
407562306a36Sopenharmony_ci	if (AR_SREV_9300(ah) || AR_SREV_9580(ah) || AR_SREV_9340(ah)) {
407662306a36Sopenharmony_ci		if (freq < 4000) {
407762306a36Sopenharmony_ci			quick_drop = eep->modalHeader2G.quick_drop;
407862306a36Sopenharmony_ci		} else {
407962306a36Sopenharmony_ci			t[0] = eep->base_ext1.quick_drop_low;
408062306a36Sopenharmony_ci			t[1] = eep->modalHeader5G.quick_drop;
408162306a36Sopenharmony_ci			t[2] = eep->base_ext1.quick_drop_high;
408262306a36Sopenharmony_ci			quick_drop = ar9003_hw_power_interpolate(freq, f, t, 3);
408362306a36Sopenharmony_ci		}
408462306a36Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_AGC, AR_PHY_AGC_QUICK_DROP, quick_drop);
408562306a36Sopenharmony_ci	}
408662306a36Sopenharmony_ci}
408762306a36Sopenharmony_ci
408862306a36Sopenharmony_cistatic void ar9003_hw_txend_to_xpa_off_apply(struct ath_hw *ah, bool is2ghz)
408962306a36Sopenharmony_ci{
409062306a36Sopenharmony_ci	u32 value;
409162306a36Sopenharmony_ci
409262306a36Sopenharmony_ci	value = ar9003_modal_header(ah, is2ghz)->txEndToXpaOff;
409362306a36Sopenharmony_ci
409462306a36Sopenharmony_ci	REG_RMW_FIELD(ah, AR_PHY_XPA_TIMING_CTL,
409562306a36Sopenharmony_ci		      AR_PHY_XPA_TIMING_CTL_TX_END_XPAB_OFF, value);
409662306a36Sopenharmony_ci	REG_RMW_FIELD(ah, AR_PHY_XPA_TIMING_CTL,
409762306a36Sopenharmony_ci		      AR_PHY_XPA_TIMING_CTL_TX_END_XPAA_OFF, value);
409862306a36Sopenharmony_ci}
409962306a36Sopenharmony_ci
410062306a36Sopenharmony_cistatic void ar9003_hw_xpa_timing_control_apply(struct ath_hw *ah, bool is2ghz)
410162306a36Sopenharmony_ci{
410262306a36Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
410362306a36Sopenharmony_ci	u8 xpa_ctl;
410462306a36Sopenharmony_ci
410562306a36Sopenharmony_ci	if (!(eep->baseEepHeader.featureEnable & 0x80))
410662306a36Sopenharmony_ci		return;
410762306a36Sopenharmony_ci
410862306a36Sopenharmony_ci	if (!AR_SREV_9300(ah) &&
410962306a36Sopenharmony_ci	    !AR_SREV_9340(ah) &&
411062306a36Sopenharmony_ci	    !AR_SREV_9580(ah) &&
411162306a36Sopenharmony_ci	    !AR_SREV_9531(ah) &&
411262306a36Sopenharmony_ci	    !AR_SREV_9561(ah))
411362306a36Sopenharmony_ci		return;
411462306a36Sopenharmony_ci
411562306a36Sopenharmony_ci	xpa_ctl = ar9003_modal_header(ah, is2ghz)->txFrameToXpaOn;
411662306a36Sopenharmony_ci	if (is2ghz)
411762306a36Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_XPA_TIMING_CTL,
411862306a36Sopenharmony_ci			      AR_PHY_XPA_TIMING_CTL_FRAME_XPAB_ON, xpa_ctl);
411962306a36Sopenharmony_ci	else
412062306a36Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_XPA_TIMING_CTL,
412162306a36Sopenharmony_ci			      AR_PHY_XPA_TIMING_CTL_FRAME_XPAA_ON, xpa_ctl);
412262306a36Sopenharmony_ci}
412362306a36Sopenharmony_ci
412462306a36Sopenharmony_cistatic void ar9003_hw_xlna_bias_strength_apply(struct ath_hw *ah, bool is2ghz)
412562306a36Sopenharmony_ci{
412662306a36Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
412762306a36Sopenharmony_ci	u8 bias;
412862306a36Sopenharmony_ci
412962306a36Sopenharmony_ci	if (!(eep->baseEepHeader.miscConfiguration & 0x40))
413062306a36Sopenharmony_ci		return;
413162306a36Sopenharmony_ci
413262306a36Sopenharmony_ci	if (!AR_SREV_9300(ah))
413362306a36Sopenharmony_ci		return;
413462306a36Sopenharmony_ci
413562306a36Sopenharmony_ci	bias = ar9003_modal_header(ah, is2ghz)->xlna_bias_strength;
413662306a36Sopenharmony_ci	REG_RMW_FIELD(ah, AR_PHY_65NM_CH0_RXTX4, AR_PHY_65NM_RXTX4_XLNA_BIAS,
413762306a36Sopenharmony_ci		      bias & 0x3);
413862306a36Sopenharmony_ci	bias >>= 2;
413962306a36Sopenharmony_ci	REG_RMW_FIELD(ah, AR_PHY_65NM_CH1_RXTX4, AR_PHY_65NM_RXTX4_XLNA_BIAS,
414062306a36Sopenharmony_ci		      bias & 0x3);
414162306a36Sopenharmony_ci	bias >>= 2;
414262306a36Sopenharmony_ci	REG_RMW_FIELD(ah, AR_PHY_65NM_CH2_RXTX4, AR_PHY_65NM_RXTX4_XLNA_BIAS,
414362306a36Sopenharmony_ci		      bias & 0x3);
414462306a36Sopenharmony_ci}
414562306a36Sopenharmony_ci
414662306a36Sopenharmony_cistatic int ar9003_hw_get_thermometer(struct ath_hw *ah)
414762306a36Sopenharmony_ci{
414862306a36Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
414962306a36Sopenharmony_ci	struct ar9300_base_eep_hdr *pBase = &eep->baseEepHeader;
415062306a36Sopenharmony_ci	int thermometer =  (pBase->miscConfiguration >> 1) & 0x3;
415162306a36Sopenharmony_ci
415262306a36Sopenharmony_ci	return --thermometer;
415362306a36Sopenharmony_ci}
415462306a36Sopenharmony_ci
415562306a36Sopenharmony_cistatic void ar9003_hw_thermometer_apply(struct ath_hw *ah)
415662306a36Sopenharmony_ci{
415762306a36Sopenharmony_ci	struct ath9k_hw_capabilities *pCap = &ah->caps;
415862306a36Sopenharmony_ci	int thermometer = ar9003_hw_get_thermometer(ah);
415962306a36Sopenharmony_ci	u8 therm_on = (thermometer < 0) ? 0 : 1;
416062306a36Sopenharmony_ci
416162306a36Sopenharmony_ci	REG_RMW_FIELD(ah, AR_PHY_65NM_CH0_RXTX4,
416262306a36Sopenharmony_ci		      AR_PHY_65NM_CH0_RXTX4_THERM_ON_OVR, therm_on);
416362306a36Sopenharmony_ci	if (pCap->chip_chainmask & BIT(1))
416462306a36Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_65NM_CH1_RXTX4,
416562306a36Sopenharmony_ci			      AR_PHY_65NM_CH0_RXTX4_THERM_ON_OVR, therm_on);
416662306a36Sopenharmony_ci	if (pCap->chip_chainmask & BIT(2))
416762306a36Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_65NM_CH2_RXTX4,
416862306a36Sopenharmony_ci			      AR_PHY_65NM_CH0_RXTX4_THERM_ON_OVR, therm_on);
416962306a36Sopenharmony_ci
417062306a36Sopenharmony_ci	therm_on = thermometer == 0;
417162306a36Sopenharmony_ci	REG_RMW_FIELD(ah, AR_PHY_65NM_CH0_RXTX4,
417262306a36Sopenharmony_ci		      AR_PHY_65NM_CH0_RXTX4_THERM_ON, therm_on);
417362306a36Sopenharmony_ci	if (pCap->chip_chainmask & BIT(1)) {
417462306a36Sopenharmony_ci		therm_on = thermometer == 1;
417562306a36Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_65NM_CH1_RXTX4,
417662306a36Sopenharmony_ci			      AR_PHY_65NM_CH0_RXTX4_THERM_ON, therm_on);
417762306a36Sopenharmony_ci	}
417862306a36Sopenharmony_ci	if (pCap->chip_chainmask & BIT(2)) {
417962306a36Sopenharmony_ci		therm_on = thermometer == 2;
418062306a36Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_65NM_CH2_RXTX4,
418162306a36Sopenharmony_ci			      AR_PHY_65NM_CH0_RXTX4_THERM_ON, therm_on);
418262306a36Sopenharmony_ci	}
418362306a36Sopenharmony_ci}
418462306a36Sopenharmony_ci
418562306a36Sopenharmony_cistatic void ar9003_hw_thermo_cal_apply(struct ath_hw *ah)
418662306a36Sopenharmony_ci{
418762306a36Sopenharmony_ci	u32 data = 0, ko, kg;
418862306a36Sopenharmony_ci
418962306a36Sopenharmony_ci	if (!AR_SREV_9462_20_OR_LATER(ah))
419062306a36Sopenharmony_ci		return;
419162306a36Sopenharmony_ci
419262306a36Sopenharmony_ci	ar9300_otp_read_word(ah, 1, &data);
419362306a36Sopenharmony_ci	ko = data & 0xff;
419462306a36Sopenharmony_ci	kg = (data >> 8) & 0xff;
419562306a36Sopenharmony_ci	if (ko || kg) {
419662306a36Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_BB_THERM_ADC_3,
419762306a36Sopenharmony_ci			      AR_PHY_BB_THERM_ADC_3_THERM_ADC_OFFSET, ko);
419862306a36Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_BB_THERM_ADC_3,
419962306a36Sopenharmony_ci			      AR_PHY_BB_THERM_ADC_3_THERM_ADC_SCALE_GAIN,
420062306a36Sopenharmony_ci			      kg + 256);
420162306a36Sopenharmony_ci	}
420262306a36Sopenharmony_ci}
420362306a36Sopenharmony_ci
420462306a36Sopenharmony_cistatic void ar9003_hw_apply_minccapwr_thresh(struct ath_hw *ah,
420562306a36Sopenharmony_ci					     bool is2ghz)
420662306a36Sopenharmony_ci{
420762306a36Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
420862306a36Sopenharmony_ci	const u_int32_t cca_ctrl[AR9300_MAX_CHAINS] = {
420962306a36Sopenharmony_ci		AR_PHY_CCA_CTRL_0,
421062306a36Sopenharmony_ci		AR_PHY_CCA_CTRL_1,
421162306a36Sopenharmony_ci		AR_PHY_CCA_CTRL_2,
421262306a36Sopenharmony_ci	};
421362306a36Sopenharmony_ci	int chain;
421462306a36Sopenharmony_ci	u32 val;
421562306a36Sopenharmony_ci
421662306a36Sopenharmony_ci	if (is2ghz) {
421762306a36Sopenharmony_ci		if (!(eep->base_ext1.misc_enable & BIT(2)))
421862306a36Sopenharmony_ci			return;
421962306a36Sopenharmony_ci	} else {
422062306a36Sopenharmony_ci		if (!(eep->base_ext1.misc_enable & BIT(3)))
422162306a36Sopenharmony_ci			return;
422262306a36Sopenharmony_ci	}
422362306a36Sopenharmony_ci
422462306a36Sopenharmony_ci	for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
422562306a36Sopenharmony_ci		if (!(ah->caps.tx_chainmask & BIT(chain)))
422662306a36Sopenharmony_ci			continue;
422762306a36Sopenharmony_ci
422862306a36Sopenharmony_ci		val = ar9003_modal_header(ah, is2ghz)->noiseFloorThreshCh[chain];
422962306a36Sopenharmony_ci		REG_RMW_FIELD(ah, cca_ctrl[chain],
423062306a36Sopenharmony_ci			      AR_PHY_EXT_CCA0_THRESH62_1, val);
423162306a36Sopenharmony_ci	}
423262306a36Sopenharmony_ci
423362306a36Sopenharmony_ci}
423462306a36Sopenharmony_ci
423562306a36Sopenharmony_cistatic void ath9k_hw_ar9300_set_board_values(struct ath_hw *ah,
423662306a36Sopenharmony_ci					     struct ath9k_channel *chan)
423762306a36Sopenharmony_ci{
423862306a36Sopenharmony_ci	bool is2ghz = IS_CHAN_2GHZ(chan);
423962306a36Sopenharmony_ci	ar9003_hw_xpa_timing_control_apply(ah, is2ghz);
424062306a36Sopenharmony_ci	ar9003_hw_xpa_bias_level_apply(ah, is2ghz);
424162306a36Sopenharmony_ci	ar9003_hw_ant_ctrl_apply(ah, is2ghz);
424262306a36Sopenharmony_ci	ar9003_hw_drive_strength_apply(ah);
424362306a36Sopenharmony_ci	ar9003_hw_xlna_bias_strength_apply(ah, is2ghz);
424462306a36Sopenharmony_ci	ar9003_hw_atten_apply(ah, chan);
424562306a36Sopenharmony_ci	ar9003_hw_quick_drop_apply(ah, chan->channel);
424662306a36Sopenharmony_ci	if (!AR_SREV_9330(ah) && !AR_SREV_9340(ah) && !AR_SREV_9531(ah))
424762306a36Sopenharmony_ci		ar9003_hw_internal_regulator_apply(ah);
424862306a36Sopenharmony_ci	ar9003_hw_apply_tuning_caps(ah);
424962306a36Sopenharmony_ci	ar9003_hw_apply_minccapwr_thresh(ah, is2ghz);
425062306a36Sopenharmony_ci	ar9003_hw_txend_to_xpa_off_apply(ah, is2ghz);
425162306a36Sopenharmony_ci	ar9003_hw_thermometer_apply(ah);
425262306a36Sopenharmony_ci	ar9003_hw_thermo_cal_apply(ah);
425362306a36Sopenharmony_ci}
425462306a36Sopenharmony_ci
425562306a36Sopenharmony_cistatic void ath9k_hw_ar9300_set_addac(struct ath_hw *ah,
425662306a36Sopenharmony_ci				      struct ath9k_channel *chan)
425762306a36Sopenharmony_ci{
425862306a36Sopenharmony_ci}
425962306a36Sopenharmony_ci
426062306a36Sopenharmony_ci/*
426162306a36Sopenharmony_ci * Returns the interpolated y value corresponding to the specified x value
426262306a36Sopenharmony_ci * from the np ordered pairs of data (px,py).
426362306a36Sopenharmony_ci * The pairs do not have to be in any order.
426462306a36Sopenharmony_ci * If the specified x value is less than any of the px,
426562306a36Sopenharmony_ci * the returned y value is equal to the py for the lowest px.
426662306a36Sopenharmony_ci * If the specified x value is greater than any of the px,
426762306a36Sopenharmony_ci * the returned y value is equal to the py for the highest px.
426862306a36Sopenharmony_ci */
426962306a36Sopenharmony_cistatic int ar9003_hw_power_interpolate(int32_t x,
427062306a36Sopenharmony_ci				       int32_t *px, int32_t *py, u_int16_t np)
427162306a36Sopenharmony_ci{
427262306a36Sopenharmony_ci	int ip = 0;
427362306a36Sopenharmony_ci	int lx = 0, ly = 0, lhave = 0;
427462306a36Sopenharmony_ci	int hx = 0, hy = 0, hhave = 0;
427562306a36Sopenharmony_ci	int dx = 0;
427662306a36Sopenharmony_ci	int y = 0;
427762306a36Sopenharmony_ci
427862306a36Sopenharmony_ci	lhave = 0;
427962306a36Sopenharmony_ci	hhave = 0;
428062306a36Sopenharmony_ci
428162306a36Sopenharmony_ci	/* identify best lower and higher x calibration measurement */
428262306a36Sopenharmony_ci	for (ip = 0; ip < np; ip++) {
428362306a36Sopenharmony_ci		dx = x - px[ip];
428462306a36Sopenharmony_ci
428562306a36Sopenharmony_ci		/* this measurement is higher than our desired x */
428662306a36Sopenharmony_ci		if (dx <= 0) {
428762306a36Sopenharmony_ci			if (!hhave || dx > (x - hx)) {
428862306a36Sopenharmony_ci				/* new best higher x measurement */
428962306a36Sopenharmony_ci				hx = px[ip];
429062306a36Sopenharmony_ci				hy = py[ip];
429162306a36Sopenharmony_ci				hhave = 1;
429262306a36Sopenharmony_ci			}
429362306a36Sopenharmony_ci		}
429462306a36Sopenharmony_ci		/* this measurement is lower than our desired x */
429562306a36Sopenharmony_ci		if (dx >= 0) {
429662306a36Sopenharmony_ci			if (!lhave || dx < (x - lx)) {
429762306a36Sopenharmony_ci				/* new best lower x measurement */
429862306a36Sopenharmony_ci				lx = px[ip];
429962306a36Sopenharmony_ci				ly = py[ip];
430062306a36Sopenharmony_ci				lhave = 1;
430162306a36Sopenharmony_ci			}
430262306a36Sopenharmony_ci		}
430362306a36Sopenharmony_ci	}
430462306a36Sopenharmony_ci
430562306a36Sopenharmony_ci	/* the low x is good */
430662306a36Sopenharmony_ci	if (lhave) {
430762306a36Sopenharmony_ci		/* so is the high x */
430862306a36Sopenharmony_ci		if (hhave) {
430962306a36Sopenharmony_ci			/* they're the same, so just pick one */
431062306a36Sopenharmony_ci			if (hx == lx)
431162306a36Sopenharmony_ci				y = ly;
431262306a36Sopenharmony_ci			else	/* interpolate  */
431362306a36Sopenharmony_ci				y = interpolate(x, lx, hx, ly, hy);
431462306a36Sopenharmony_ci		} else		/* only low is good, use it */
431562306a36Sopenharmony_ci			y = ly;
431662306a36Sopenharmony_ci	} else if (hhave)	/* only high is good, use it */
431762306a36Sopenharmony_ci		y = hy;
431862306a36Sopenharmony_ci	else /* nothing is good,this should never happen unless np=0, ???? */
431962306a36Sopenharmony_ci		y = -(1 << 30);
432062306a36Sopenharmony_ci	return y;
432162306a36Sopenharmony_ci}
432262306a36Sopenharmony_ci
432362306a36Sopenharmony_cistatic u8 ar9003_hw_eeprom_get_tgt_pwr(struct ath_hw *ah,
432462306a36Sopenharmony_ci				       u16 rateIndex, u16 freq, bool is2GHz)
432562306a36Sopenharmony_ci{
432662306a36Sopenharmony_ci	u16 numPiers, i;
432762306a36Sopenharmony_ci	s32 targetPowerArray[AR9300_NUM_5G_20_TARGET_POWERS];
432862306a36Sopenharmony_ci	s32 freqArray[AR9300_NUM_5G_20_TARGET_POWERS];
432962306a36Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
433062306a36Sopenharmony_ci	struct cal_tgt_pow_legacy *pEepromTargetPwr;
433162306a36Sopenharmony_ci	u8 *pFreqBin;
433262306a36Sopenharmony_ci
433362306a36Sopenharmony_ci	if (is2GHz) {
433462306a36Sopenharmony_ci		numPiers = AR9300_NUM_2G_20_TARGET_POWERS;
433562306a36Sopenharmony_ci		pEepromTargetPwr = eep->calTargetPower2G;
433662306a36Sopenharmony_ci		pFreqBin = eep->calTarget_freqbin_2G;
433762306a36Sopenharmony_ci	} else {
433862306a36Sopenharmony_ci		numPiers = AR9300_NUM_5G_20_TARGET_POWERS;
433962306a36Sopenharmony_ci		pEepromTargetPwr = eep->calTargetPower5G;
434062306a36Sopenharmony_ci		pFreqBin = eep->calTarget_freqbin_5G;
434162306a36Sopenharmony_ci	}
434262306a36Sopenharmony_ci
434362306a36Sopenharmony_ci	/*
434462306a36Sopenharmony_ci	 * create array of channels and targetpower from
434562306a36Sopenharmony_ci	 * targetpower piers stored on eeprom
434662306a36Sopenharmony_ci	 */
434762306a36Sopenharmony_ci	for (i = 0; i < numPiers; i++) {
434862306a36Sopenharmony_ci		freqArray[i] = ath9k_hw_fbin2freq(pFreqBin[i], is2GHz);
434962306a36Sopenharmony_ci		targetPowerArray[i] = pEepromTargetPwr[i].tPow2x[rateIndex];
435062306a36Sopenharmony_ci	}
435162306a36Sopenharmony_ci
435262306a36Sopenharmony_ci	/* interpolate to get target power for given frequency */
435362306a36Sopenharmony_ci	return (u8) ar9003_hw_power_interpolate((s32) freq,
435462306a36Sopenharmony_ci						 freqArray,
435562306a36Sopenharmony_ci						 targetPowerArray, numPiers);
435662306a36Sopenharmony_ci}
435762306a36Sopenharmony_ci
435862306a36Sopenharmony_cistatic u8 ar9003_hw_eeprom_get_ht20_tgt_pwr(struct ath_hw *ah,
435962306a36Sopenharmony_ci					    u16 rateIndex,
436062306a36Sopenharmony_ci					    u16 freq, bool is2GHz)
436162306a36Sopenharmony_ci{
436262306a36Sopenharmony_ci	u16 numPiers, i;
436362306a36Sopenharmony_ci	s32 targetPowerArray[AR9300_NUM_5G_20_TARGET_POWERS];
436462306a36Sopenharmony_ci	s32 freqArray[AR9300_NUM_5G_20_TARGET_POWERS];
436562306a36Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
436662306a36Sopenharmony_ci	struct cal_tgt_pow_ht *pEepromTargetPwr;
436762306a36Sopenharmony_ci	u8 *pFreqBin;
436862306a36Sopenharmony_ci
436962306a36Sopenharmony_ci	if (is2GHz) {
437062306a36Sopenharmony_ci		numPiers = AR9300_NUM_2G_20_TARGET_POWERS;
437162306a36Sopenharmony_ci		pEepromTargetPwr = eep->calTargetPower2GHT20;
437262306a36Sopenharmony_ci		pFreqBin = eep->calTarget_freqbin_2GHT20;
437362306a36Sopenharmony_ci	} else {
437462306a36Sopenharmony_ci		numPiers = AR9300_NUM_5G_20_TARGET_POWERS;
437562306a36Sopenharmony_ci		pEepromTargetPwr = eep->calTargetPower5GHT20;
437662306a36Sopenharmony_ci		pFreqBin = eep->calTarget_freqbin_5GHT20;
437762306a36Sopenharmony_ci	}
437862306a36Sopenharmony_ci
437962306a36Sopenharmony_ci	/*
438062306a36Sopenharmony_ci	 * create array of channels and targetpower
438162306a36Sopenharmony_ci	 * from targetpower piers stored on eeprom
438262306a36Sopenharmony_ci	 */
438362306a36Sopenharmony_ci	for (i = 0; i < numPiers; i++) {
438462306a36Sopenharmony_ci		freqArray[i] = ath9k_hw_fbin2freq(pFreqBin[i], is2GHz);
438562306a36Sopenharmony_ci		targetPowerArray[i] = pEepromTargetPwr[i].tPow2x[rateIndex];
438662306a36Sopenharmony_ci	}
438762306a36Sopenharmony_ci
438862306a36Sopenharmony_ci	/* interpolate to get target power for given frequency */
438962306a36Sopenharmony_ci	return (u8) ar9003_hw_power_interpolate((s32) freq,
439062306a36Sopenharmony_ci						 freqArray,
439162306a36Sopenharmony_ci						 targetPowerArray, numPiers);
439262306a36Sopenharmony_ci}
439362306a36Sopenharmony_ci
439462306a36Sopenharmony_cistatic u8 ar9003_hw_eeprom_get_ht40_tgt_pwr(struct ath_hw *ah,
439562306a36Sopenharmony_ci					    u16 rateIndex,
439662306a36Sopenharmony_ci					    u16 freq, bool is2GHz)
439762306a36Sopenharmony_ci{
439862306a36Sopenharmony_ci	u16 numPiers, i;
439962306a36Sopenharmony_ci	s32 targetPowerArray[AR9300_NUM_5G_40_TARGET_POWERS];
440062306a36Sopenharmony_ci	s32 freqArray[AR9300_NUM_5G_40_TARGET_POWERS];
440162306a36Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
440262306a36Sopenharmony_ci	struct cal_tgt_pow_ht *pEepromTargetPwr;
440362306a36Sopenharmony_ci	u8 *pFreqBin;
440462306a36Sopenharmony_ci
440562306a36Sopenharmony_ci	if (is2GHz) {
440662306a36Sopenharmony_ci		numPiers = AR9300_NUM_2G_40_TARGET_POWERS;
440762306a36Sopenharmony_ci		pEepromTargetPwr = eep->calTargetPower2GHT40;
440862306a36Sopenharmony_ci		pFreqBin = eep->calTarget_freqbin_2GHT40;
440962306a36Sopenharmony_ci	} else {
441062306a36Sopenharmony_ci		numPiers = AR9300_NUM_5G_40_TARGET_POWERS;
441162306a36Sopenharmony_ci		pEepromTargetPwr = eep->calTargetPower5GHT40;
441262306a36Sopenharmony_ci		pFreqBin = eep->calTarget_freqbin_5GHT40;
441362306a36Sopenharmony_ci	}
441462306a36Sopenharmony_ci
441562306a36Sopenharmony_ci	/*
441662306a36Sopenharmony_ci	 * create array of channels and targetpower from
441762306a36Sopenharmony_ci	 * targetpower piers stored on eeprom
441862306a36Sopenharmony_ci	 */
441962306a36Sopenharmony_ci	for (i = 0; i < numPiers; i++) {
442062306a36Sopenharmony_ci		freqArray[i] = ath9k_hw_fbin2freq(pFreqBin[i], is2GHz);
442162306a36Sopenharmony_ci		targetPowerArray[i] = pEepromTargetPwr[i].tPow2x[rateIndex];
442262306a36Sopenharmony_ci	}
442362306a36Sopenharmony_ci
442462306a36Sopenharmony_ci	/* interpolate to get target power for given frequency */
442562306a36Sopenharmony_ci	return (u8) ar9003_hw_power_interpolate((s32) freq,
442662306a36Sopenharmony_ci						 freqArray,
442762306a36Sopenharmony_ci						 targetPowerArray, numPiers);
442862306a36Sopenharmony_ci}
442962306a36Sopenharmony_ci
443062306a36Sopenharmony_cistatic u8 ar9003_hw_eeprom_get_cck_tgt_pwr(struct ath_hw *ah,
443162306a36Sopenharmony_ci					   u16 rateIndex, u16 freq)
443262306a36Sopenharmony_ci{
443362306a36Sopenharmony_ci	u16 numPiers = AR9300_NUM_2G_CCK_TARGET_POWERS, i;
443462306a36Sopenharmony_ci	s32 targetPowerArray[AR9300_NUM_2G_CCK_TARGET_POWERS];
443562306a36Sopenharmony_ci	s32 freqArray[AR9300_NUM_2G_CCK_TARGET_POWERS];
443662306a36Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
443762306a36Sopenharmony_ci	struct cal_tgt_pow_legacy *pEepromTargetPwr = eep->calTargetPowerCck;
443862306a36Sopenharmony_ci	u8 *pFreqBin = eep->calTarget_freqbin_Cck;
443962306a36Sopenharmony_ci
444062306a36Sopenharmony_ci	/*
444162306a36Sopenharmony_ci	 * create array of channels and targetpower from
444262306a36Sopenharmony_ci	 * targetpower piers stored on eeprom
444362306a36Sopenharmony_ci	 */
444462306a36Sopenharmony_ci	for (i = 0; i < numPiers; i++) {
444562306a36Sopenharmony_ci		freqArray[i] = ath9k_hw_fbin2freq(pFreqBin[i], 1);
444662306a36Sopenharmony_ci		targetPowerArray[i] = pEepromTargetPwr[i].tPow2x[rateIndex];
444762306a36Sopenharmony_ci	}
444862306a36Sopenharmony_ci
444962306a36Sopenharmony_ci	/* interpolate to get target power for given frequency */
445062306a36Sopenharmony_ci	return (u8) ar9003_hw_power_interpolate((s32) freq,
445162306a36Sopenharmony_ci						 freqArray,
445262306a36Sopenharmony_ci						 targetPowerArray, numPiers);
445362306a36Sopenharmony_ci}
445462306a36Sopenharmony_ci
445562306a36Sopenharmony_cistatic void ar9003_hw_selfgen_tpc_txpower(struct ath_hw *ah,
445662306a36Sopenharmony_ci					  struct ath9k_channel *chan,
445762306a36Sopenharmony_ci					  u8 *pwr_array)
445862306a36Sopenharmony_ci{
445962306a36Sopenharmony_ci	u32 val;
446062306a36Sopenharmony_ci
446162306a36Sopenharmony_ci	/* target power values for self generated frames (ACK,RTS/CTS) */
446262306a36Sopenharmony_ci	if (IS_CHAN_2GHZ(chan)) {
446362306a36Sopenharmony_ci		val = SM(pwr_array[ALL_TARGET_LEGACY_1L_5L], AR_TPC_ACK) |
446462306a36Sopenharmony_ci		      SM(pwr_array[ALL_TARGET_LEGACY_1L_5L], AR_TPC_CTS) |
446562306a36Sopenharmony_ci		      SM(0x3f, AR_TPC_CHIRP) | SM(0x3f, AR_TPC_RPT);
446662306a36Sopenharmony_ci	} else {
446762306a36Sopenharmony_ci		val = SM(pwr_array[ALL_TARGET_LEGACY_6_24], AR_TPC_ACK) |
446862306a36Sopenharmony_ci		      SM(pwr_array[ALL_TARGET_LEGACY_6_24], AR_TPC_CTS) |
446962306a36Sopenharmony_ci		      SM(0x3f, AR_TPC_CHIRP) | SM(0x3f, AR_TPC_RPT);
447062306a36Sopenharmony_ci	}
447162306a36Sopenharmony_ci	REG_WRITE(ah, AR_TPC, val);
447262306a36Sopenharmony_ci}
447362306a36Sopenharmony_ci
447462306a36Sopenharmony_ci/* Set tx power registers to array of values passed in */
447562306a36Sopenharmony_ciint ar9003_hw_tx_power_regwrite(struct ath_hw *ah, u8 * pPwrArray)
447662306a36Sopenharmony_ci{
447762306a36Sopenharmony_ci#define POW_SM(_r, _s)     (((_r) & 0x3f) << (_s))
447862306a36Sopenharmony_ci	/* make sure forced gain is not set */
447962306a36Sopenharmony_ci	REG_WRITE(ah, AR_PHY_TX_FORCED_GAIN, 0);
448062306a36Sopenharmony_ci
448162306a36Sopenharmony_ci	/* Write the OFDM power per rate set */
448262306a36Sopenharmony_ci
448362306a36Sopenharmony_ci	/* 6 (LSB), 9, 12, 18 (MSB) */
448462306a36Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(0),
448562306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 24) |
448662306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 16) |
448762306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 8) |
448862306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 0));
448962306a36Sopenharmony_ci
449062306a36Sopenharmony_ci	/* 24 (LSB), 36, 48, 54 (MSB) */
449162306a36Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(1),
449262306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_54], 24) |
449362306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_48], 16) |
449462306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_36], 8) |
449562306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 0));
449662306a36Sopenharmony_ci
449762306a36Sopenharmony_ci	/* Write the CCK power per rate set */
449862306a36Sopenharmony_ci
449962306a36Sopenharmony_ci	/* 1L (LSB), reserved, 2L, 2S (MSB) */
450062306a36Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(2),
450162306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 24) |
450262306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 16) |
450362306a36Sopenharmony_ci		  /* POW_SM(txPowerTimes2,  8) | this is reserved for AR9003 */
450462306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 0));
450562306a36Sopenharmony_ci
450662306a36Sopenharmony_ci	/* 5.5L (LSB), 5.5S, 11L, 11S (MSB) */
450762306a36Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(3),
450862306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_11S], 24) |
450962306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_11L], 16) |
451062306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_5S], 8) |
451162306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 0)
451262306a36Sopenharmony_ci	    );
451362306a36Sopenharmony_ci
451462306a36Sopenharmony_ci        /* Write the power for duplicated frames - HT40 */
451562306a36Sopenharmony_ci
451662306a36Sopenharmony_ci        /* dup40_cck (LSB), dup40_ofdm, ext20_cck, ext20_ofdm (MSB) */
451762306a36Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(8),
451862306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 24) |
451962306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 16) |
452062306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24],  8) |
452162306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L],  0)
452262306a36Sopenharmony_ci	    );
452362306a36Sopenharmony_ci
452462306a36Sopenharmony_ci	/* Write the HT20 power per rate set */
452562306a36Sopenharmony_ci
452662306a36Sopenharmony_ci	/* 0/8/16 (LSB), 1-3/9-11/17-19, 4, 5 (MSB) */
452762306a36Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(4),
452862306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_5], 24) |
452962306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_4], 16) |
453062306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_1_3_9_11_17_19], 8) |
453162306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_0_8_16], 0)
453262306a36Sopenharmony_ci	    );
453362306a36Sopenharmony_ci
453462306a36Sopenharmony_ci	/* 6 (LSB), 7, 12, 13 (MSB) */
453562306a36Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(5),
453662306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_13], 24) |
453762306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_12], 16) |
453862306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_7], 8) |
453962306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_6], 0)
454062306a36Sopenharmony_ci	    );
454162306a36Sopenharmony_ci
454262306a36Sopenharmony_ci	/* 14 (LSB), 15, 20, 21 */
454362306a36Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(9),
454462306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_21], 24) |
454562306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_20], 16) |
454662306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_15], 8) |
454762306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_14], 0)
454862306a36Sopenharmony_ci	    );
454962306a36Sopenharmony_ci
455062306a36Sopenharmony_ci	/* Mixed HT20 and HT40 rates */
455162306a36Sopenharmony_ci
455262306a36Sopenharmony_ci	/* HT20 22 (LSB), HT20 23, HT40 22, HT40 23 (MSB) */
455362306a36Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(10),
455462306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_23], 24) |
455562306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_22], 16) |
455662306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_23], 8) |
455762306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_22], 0)
455862306a36Sopenharmony_ci	    );
455962306a36Sopenharmony_ci
456062306a36Sopenharmony_ci	/*
456162306a36Sopenharmony_ci	 * Write the HT40 power per rate set
456262306a36Sopenharmony_ci	 * correct PAR difference between HT40 and HT20/LEGACY
456362306a36Sopenharmony_ci	 * 0/8/16 (LSB), 1-3/9-11/17-19, 4, 5 (MSB)
456462306a36Sopenharmony_ci	 */
456562306a36Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(6),
456662306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_5], 24) |
456762306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_4], 16) |
456862306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_1_3_9_11_17_19], 8) |
456962306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_0_8_16], 0)
457062306a36Sopenharmony_ci	    );
457162306a36Sopenharmony_ci
457262306a36Sopenharmony_ci	/* 6 (LSB), 7, 12, 13 (MSB) */
457362306a36Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(7),
457462306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_13], 24) |
457562306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_12], 16) |
457662306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_7], 8) |
457762306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_6], 0)
457862306a36Sopenharmony_ci	    );
457962306a36Sopenharmony_ci
458062306a36Sopenharmony_ci	/* 14 (LSB), 15, 20, 21 */
458162306a36Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(11),
458262306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_21], 24) |
458362306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_20], 16) |
458462306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_15], 8) |
458562306a36Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_14], 0)
458662306a36Sopenharmony_ci	    );
458762306a36Sopenharmony_ci
458862306a36Sopenharmony_ci	return 0;
458962306a36Sopenharmony_ci#undef POW_SM
459062306a36Sopenharmony_ci}
459162306a36Sopenharmony_ci
459262306a36Sopenharmony_cistatic void ar9003_hw_get_legacy_target_powers(struct ath_hw *ah, u16 freq,
459362306a36Sopenharmony_ci					       u8 *targetPowerValT2,
459462306a36Sopenharmony_ci					       bool is2GHz)
459562306a36Sopenharmony_ci{
459662306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_LEGACY_6_24] =
459762306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_tgt_pwr(ah, LEGACY_TARGET_RATE_6_24, freq,
459862306a36Sopenharmony_ci					 is2GHz);
459962306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_LEGACY_36] =
460062306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_tgt_pwr(ah, LEGACY_TARGET_RATE_36, freq,
460162306a36Sopenharmony_ci					 is2GHz);
460262306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_LEGACY_48] =
460362306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_tgt_pwr(ah, LEGACY_TARGET_RATE_48, freq,
460462306a36Sopenharmony_ci					 is2GHz);
460562306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_LEGACY_54] =
460662306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_tgt_pwr(ah, LEGACY_TARGET_RATE_54, freq,
460762306a36Sopenharmony_ci					 is2GHz);
460862306a36Sopenharmony_ci}
460962306a36Sopenharmony_ci
461062306a36Sopenharmony_cistatic void ar9003_hw_get_cck_target_powers(struct ath_hw *ah, u16 freq,
461162306a36Sopenharmony_ci					    u8 *targetPowerValT2)
461262306a36Sopenharmony_ci{
461362306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_LEGACY_1L_5L] =
461462306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_cck_tgt_pwr(ah, LEGACY_TARGET_RATE_1L_5L,
461562306a36Sopenharmony_ci					     freq);
461662306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_LEGACY_5S] =
461762306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_cck_tgt_pwr(ah, LEGACY_TARGET_RATE_5S, freq);
461862306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_LEGACY_11L] =
461962306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_cck_tgt_pwr(ah, LEGACY_TARGET_RATE_11L, freq);
462062306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_LEGACY_11S] =
462162306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_cck_tgt_pwr(ah, LEGACY_TARGET_RATE_11S, freq);
462262306a36Sopenharmony_ci}
462362306a36Sopenharmony_ci
462462306a36Sopenharmony_cistatic void ar9003_hw_get_ht20_target_powers(struct ath_hw *ah, u16 freq,
462562306a36Sopenharmony_ci					     u8 *targetPowerValT2, bool is2GHz)
462662306a36Sopenharmony_ci{
462762306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_0_8_16] =
462862306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_0_8_16, freq,
462962306a36Sopenharmony_ci					      is2GHz);
463062306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_1_3_9_11_17_19] =
463162306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_1_3_9_11_17_19,
463262306a36Sopenharmony_ci					      freq, is2GHz);
463362306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_4] =
463462306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_4, freq,
463562306a36Sopenharmony_ci					      is2GHz);
463662306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_5] =
463762306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_5, freq,
463862306a36Sopenharmony_ci					      is2GHz);
463962306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_6] =
464062306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_6, freq,
464162306a36Sopenharmony_ci					      is2GHz);
464262306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_7] =
464362306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_7, freq,
464462306a36Sopenharmony_ci					      is2GHz);
464562306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_12] =
464662306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_12, freq,
464762306a36Sopenharmony_ci					      is2GHz);
464862306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_13] =
464962306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_13, freq,
465062306a36Sopenharmony_ci					      is2GHz);
465162306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_14] =
465262306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_14, freq,
465362306a36Sopenharmony_ci					      is2GHz);
465462306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_15] =
465562306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_15, freq,
465662306a36Sopenharmony_ci					      is2GHz);
465762306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_20] =
465862306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_20, freq,
465962306a36Sopenharmony_ci					      is2GHz);
466062306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_21] =
466162306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_21, freq,
466262306a36Sopenharmony_ci					      is2GHz);
466362306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_22] =
466462306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_22, freq,
466562306a36Sopenharmony_ci					      is2GHz);
466662306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_23] =
466762306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_23, freq,
466862306a36Sopenharmony_ci					      is2GHz);
466962306a36Sopenharmony_ci}
467062306a36Sopenharmony_ci
467162306a36Sopenharmony_cistatic void ar9003_hw_get_ht40_target_powers(struct ath_hw *ah,
467262306a36Sopenharmony_ci						   u16 freq,
467362306a36Sopenharmony_ci						   u8 *targetPowerValT2,
467462306a36Sopenharmony_ci						   bool is2GHz)
467562306a36Sopenharmony_ci{
467662306a36Sopenharmony_ci	/* XXX: hard code for now, need to get from eeprom struct */
467762306a36Sopenharmony_ci	u8 ht40PowerIncForPdadc = 0;
467862306a36Sopenharmony_ci
467962306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_0_8_16] =
468062306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_0_8_16, freq,
468162306a36Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
468262306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_1_3_9_11_17_19] =
468362306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_1_3_9_11_17_19,
468462306a36Sopenharmony_ci					      freq,
468562306a36Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
468662306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_4] =
468762306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_4, freq,
468862306a36Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
468962306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_5] =
469062306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_5, freq,
469162306a36Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
469262306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_6] =
469362306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_6, freq,
469462306a36Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
469562306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_7] =
469662306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_7, freq,
469762306a36Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
469862306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_12] =
469962306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_12, freq,
470062306a36Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
470162306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_13] =
470262306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_13, freq,
470362306a36Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
470462306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_14] =
470562306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_14, freq,
470662306a36Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
470762306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_15] =
470862306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_15, freq,
470962306a36Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
471062306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_20] =
471162306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_20, freq,
471262306a36Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
471362306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_21] =
471462306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_21, freq,
471562306a36Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
471662306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_22] =
471762306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_22, freq,
471862306a36Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
471962306a36Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_23] =
472062306a36Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_23, freq,
472162306a36Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
472262306a36Sopenharmony_ci}
472362306a36Sopenharmony_ci
472462306a36Sopenharmony_cistatic void ar9003_hw_get_target_power_eeprom(struct ath_hw *ah,
472562306a36Sopenharmony_ci					      struct ath9k_channel *chan,
472662306a36Sopenharmony_ci					      u8 *targetPowerValT2)
472762306a36Sopenharmony_ci{
472862306a36Sopenharmony_ci	bool is2GHz = IS_CHAN_2GHZ(chan);
472962306a36Sopenharmony_ci	unsigned int i = 0;
473062306a36Sopenharmony_ci	struct ath_common *common = ath9k_hw_common(ah);
473162306a36Sopenharmony_ci	u16 freq = chan->channel;
473262306a36Sopenharmony_ci
473362306a36Sopenharmony_ci	if (is2GHz)
473462306a36Sopenharmony_ci		ar9003_hw_get_cck_target_powers(ah, freq, targetPowerValT2);
473562306a36Sopenharmony_ci
473662306a36Sopenharmony_ci	ar9003_hw_get_legacy_target_powers(ah, freq, targetPowerValT2, is2GHz);
473762306a36Sopenharmony_ci	ar9003_hw_get_ht20_target_powers(ah, freq, targetPowerValT2, is2GHz);
473862306a36Sopenharmony_ci
473962306a36Sopenharmony_ci	if (IS_CHAN_HT40(chan))
474062306a36Sopenharmony_ci		ar9003_hw_get_ht40_target_powers(ah, freq, targetPowerValT2,
474162306a36Sopenharmony_ci						 is2GHz);
474262306a36Sopenharmony_ci
474362306a36Sopenharmony_ci	for (i = 0; i < ar9300RateSize; i++) {
474462306a36Sopenharmony_ci		ath_dbg(common, REGULATORY, "TPC[%02d] 0x%08x\n",
474562306a36Sopenharmony_ci			i, targetPowerValT2[i]);
474662306a36Sopenharmony_ci	}
474762306a36Sopenharmony_ci}
474862306a36Sopenharmony_ci
474962306a36Sopenharmony_cistatic int ar9003_hw_cal_pier_get(struct ath_hw *ah,
475062306a36Sopenharmony_ci				  bool is2ghz,
475162306a36Sopenharmony_ci				  int ipier,
475262306a36Sopenharmony_ci				  int ichain,
475362306a36Sopenharmony_ci				  int *pfrequency,
475462306a36Sopenharmony_ci				  int *pcorrection,
475562306a36Sopenharmony_ci				  int *ptemperature, int *pvoltage,
475662306a36Sopenharmony_ci				  int *pnf_cal, int *pnf_power)
475762306a36Sopenharmony_ci{
475862306a36Sopenharmony_ci	u8 *pCalPier;
475962306a36Sopenharmony_ci	struct ar9300_cal_data_per_freq_op_loop *pCalPierStruct;
476062306a36Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
476162306a36Sopenharmony_ci	struct ath_common *common = ath9k_hw_common(ah);
476262306a36Sopenharmony_ci
476362306a36Sopenharmony_ci	if (ichain >= AR9300_MAX_CHAINS) {
476462306a36Sopenharmony_ci		ath_dbg(common, EEPROM,
476562306a36Sopenharmony_ci			"Invalid chain index, must be less than %d\n",
476662306a36Sopenharmony_ci			AR9300_MAX_CHAINS);
476762306a36Sopenharmony_ci		return -1;
476862306a36Sopenharmony_ci	}
476962306a36Sopenharmony_ci
477062306a36Sopenharmony_ci	if (is2ghz) {
477162306a36Sopenharmony_ci		if (ipier >= AR9300_NUM_2G_CAL_PIERS) {
477262306a36Sopenharmony_ci			ath_dbg(common, EEPROM,
477362306a36Sopenharmony_ci				"Invalid 2GHz cal pier index, must be less than %d\n",
477462306a36Sopenharmony_ci				AR9300_NUM_2G_CAL_PIERS);
477562306a36Sopenharmony_ci			return -1;
477662306a36Sopenharmony_ci		}
477762306a36Sopenharmony_ci
477862306a36Sopenharmony_ci		pCalPier = &(eep->calFreqPier2G[ipier]);
477962306a36Sopenharmony_ci		pCalPierStruct = &(eep->calPierData2G[ichain][ipier]);
478062306a36Sopenharmony_ci	} else {
478162306a36Sopenharmony_ci		if (ipier >= AR9300_NUM_5G_CAL_PIERS) {
478262306a36Sopenharmony_ci			ath_dbg(common, EEPROM,
478362306a36Sopenharmony_ci				"Invalid 5GHz cal pier index, must be less than %d\n",
478462306a36Sopenharmony_ci				AR9300_NUM_5G_CAL_PIERS);
478562306a36Sopenharmony_ci			return -1;
478662306a36Sopenharmony_ci		}
478762306a36Sopenharmony_ci		pCalPier = &(eep->calFreqPier5G[ipier]);
478862306a36Sopenharmony_ci		pCalPierStruct = &(eep->calPierData5G[ichain][ipier]);
478962306a36Sopenharmony_ci	}
479062306a36Sopenharmony_ci
479162306a36Sopenharmony_ci	*pfrequency = ath9k_hw_fbin2freq(*pCalPier, is2ghz);
479262306a36Sopenharmony_ci	*pcorrection = pCalPierStruct->refPower;
479362306a36Sopenharmony_ci	*ptemperature = pCalPierStruct->tempMeas;
479462306a36Sopenharmony_ci	*pvoltage = pCalPierStruct->voltMeas;
479562306a36Sopenharmony_ci	*pnf_cal = pCalPierStruct->rxTempMeas ?
479662306a36Sopenharmony_ci			N2DBM(pCalPierStruct->rxNoisefloorCal) : 0;
479762306a36Sopenharmony_ci	*pnf_power = pCalPierStruct->rxTempMeas ?
479862306a36Sopenharmony_ci			N2DBM(pCalPierStruct->rxNoisefloorPower) : 0;
479962306a36Sopenharmony_ci
480062306a36Sopenharmony_ci	return 0;
480162306a36Sopenharmony_ci}
480262306a36Sopenharmony_ci
480362306a36Sopenharmony_cistatic void ar9003_hw_power_control_override(struct ath_hw *ah,
480462306a36Sopenharmony_ci					     int frequency,
480562306a36Sopenharmony_ci					     int *correction,
480662306a36Sopenharmony_ci					     int *voltage, int *temperature)
480762306a36Sopenharmony_ci{
480862306a36Sopenharmony_ci	int temp_slope = 0, temp_slope1 = 0, temp_slope2 = 0;
480962306a36Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
481062306a36Sopenharmony_ci	int f[8], t[8], t1[3], t2[3], i;
481162306a36Sopenharmony_ci
481262306a36Sopenharmony_ci	REG_RMW(ah, AR_PHY_TPC_11_B0,
481362306a36Sopenharmony_ci		(correction[0] << AR_PHY_TPC_OLPC_GAIN_DELTA_S),
481462306a36Sopenharmony_ci		AR_PHY_TPC_OLPC_GAIN_DELTA);
481562306a36Sopenharmony_ci	if (ah->caps.tx_chainmask & BIT(1))
481662306a36Sopenharmony_ci		REG_RMW(ah, AR_PHY_TPC_11_B1,
481762306a36Sopenharmony_ci			(correction[1] << AR_PHY_TPC_OLPC_GAIN_DELTA_S),
481862306a36Sopenharmony_ci			AR_PHY_TPC_OLPC_GAIN_DELTA);
481962306a36Sopenharmony_ci	if (ah->caps.tx_chainmask & BIT(2))
482062306a36Sopenharmony_ci		REG_RMW(ah, AR_PHY_TPC_11_B2,
482162306a36Sopenharmony_ci			(correction[2] << AR_PHY_TPC_OLPC_GAIN_DELTA_S),
482262306a36Sopenharmony_ci			AR_PHY_TPC_OLPC_GAIN_DELTA);
482362306a36Sopenharmony_ci
482462306a36Sopenharmony_ci	/* enable open loop power control on chip */
482562306a36Sopenharmony_ci	REG_RMW(ah, AR_PHY_TPC_6_B0,
482662306a36Sopenharmony_ci		(3 << AR_PHY_TPC_6_ERROR_EST_MODE_S),
482762306a36Sopenharmony_ci		AR_PHY_TPC_6_ERROR_EST_MODE);
482862306a36Sopenharmony_ci	if (ah->caps.tx_chainmask & BIT(1))
482962306a36Sopenharmony_ci		REG_RMW(ah, AR_PHY_TPC_6_B1,
483062306a36Sopenharmony_ci			(3 << AR_PHY_TPC_6_ERROR_EST_MODE_S),
483162306a36Sopenharmony_ci			AR_PHY_TPC_6_ERROR_EST_MODE);
483262306a36Sopenharmony_ci	if (ah->caps.tx_chainmask & BIT(2))
483362306a36Sopenharmony_ci		REG_RMW(ah, AR_PHY_TPC_6_B2,
483462306a36Sopenharmony_ci			(3 << AR_PHY_TPC_6_ERROR_EST_MODE_S),
483562306a36Sopenharmony_ci			AR_PHY_TPC_6_ERROR_EST_MODE);
483662306a36Sopenharmony_ci
483762306a36Sopenharmony_ci	/*
483862306a36Sopenharmony_ci	 * enable temperature compensation
483962306a36Sopenharmony_ci	 * Need to use register names
484062306a36Sopenharmony_ci	 */
484162306a36Sopenharmony_ci	if (frequency < 4000) {
484262306a36Sopenharmony_ci		temp_slope = eep->modalHeader2G.tempSlope;
484362306a36Sopenharmony_ci	} else {
484462306a36Sopenharmony_ci		if (AR_SREV_9550(ah)) {
484562306a36Sopenharmony_ci			t[0] = eep->base_ext1.tempslopextension[2];
484662306a36Sopenharmony_ci			t1[0] = eep->base_ext1.tempslopextension[3];
484762306a36Sopenharmony_ci			t2[0] = eep->base_ext1.tempslopextension[4];
484862306a36Sopenharmony_ci			f[0] = 5180;
484962306a36Sopenharmony_ci
485062306a36Sopenharmony_ci			t[1] = eep->modalHeader5G.tempSlope;
485162306a36Sopenharmony_ci			t1[1] = eep->base_ext1.tempslopextension[0];
485262306a36Sopenharmony_ci			t2[1] = eep->base_ext1.tempslopextension[1];
485362306a36Sopenharmony_ci			f[1] = 5500;
485462306a36Sopenharmony_ci
485562306a36Sopenharmony_ci			t[2] = eep->base_ext1.tempslopextension[5];
485662306a36Sopenharmony_ci			t1[2] = eep->base_ext1.tempslopextension[6];
485762306a36Sopenharmony_ci			t2[2] = eep->base_ext1.tempslopextension[7];
485862306a36Sopenharmony_ci			f[2] = 5785;
485962306a36Sopenharmony_ci
486062306a36Sopenharmony_ci			temp_slope = ar9003_hw_power_interpolate(frequency,
486162306a36Sopenharmony_ci								 f, t, 3);
486262306a36Sopenharmony_ci			temp_slope1 = ar9003_hw_power_interpolate(frequency,
486362306a36Sopenharmony_ci								   f, t1, 3);
486462306a36Sopenharmony_ci			temp_slope2 = ar9003_hw_power_interpolate(frequency,
486562306a36Sopenharmony_ci								   f, t2, 3);
486662306a36Sopenharmony_ci
486762306a36Sopenharmony_ci			goto tempslope;
486862306a36Sopenharmony_ci		}
486962306a36Sopenharmony_ci
487062306a36Sopenharmony_ci		if ((eep->baseEepHeader.miscConfiguration & 0x20) != 0) {
487162306a36Sopenharmony_ci			for (i = 0; i < 8; i++) {
487262306a36Sopenharmony_ci				t[i] = eep->base_ext1.tempslopextension[i];
487362306a36Sopenharmony_ci				f[i] = FBIN2FREQ(eep->calFreqPier5G[i], 0);
487462306a36Sopenharmony_ci			}
487562306a36Sopenharmony_ci			temp_slope = ar9003_hw_power_interpolate((s32) frequency,
487662306a36Sopenharmony_ci								 f, t, 8);
487762306a36Sopenharmony_ci		} else if (eep->base_ext2.tempSlopeLow != 0) {
487862306a36Sopenharmony_ci			t[0] = eep->base_ext2.tempSlopeLow;
487962306a36Sopenharmony_ci			f[0] = 5180;
488062306a36Sopenharmony_ci			t[1] = eep->modalHeader5G.tempSlope;
488162306a36Sopenharmony_ci			f[1] = 5500;
488262306a36Sopenharmony_ci			t[2] = eep->base_ext2.tempSlopeHigh;
488362306a36Sopenharmony_ci			f[2] = 5785;
488462306a36Sopenharmony_ci			temp_slope = ar9003_hw_power_interpolate((s32) frequency,
488562306a36Sopenharmony_ci								 f, t, 3);
488662306a36Sopenharmony_ci		} else {
488762306a36Sopenharmony_ci			temp_slope = eep->modalHeader5G.tempSlope;
488862306a36Sopenharmony_ci		}
488962306a36Sopenharmony_ci	}
489062306a36Sopenharmony_ci
489162306a36Sopenharmony_citempslope:
489262306a36Sopenharmony_ci	if (AR_SREV_9550(ah) || AR_SREV_9531(ah) || AR_SREV_9561(ah)) {
489362306a36Sopenharmony_ci		u8 txmask = (eep->baseEepHeader.txrxMask & 0xf0) >> 4;
489462306a36Sopenharmony_ci
489562306a36Sopenharmony_ci		/*
489662306a36Sopenharmony_ci		 * AR955x has tempSlope register for each chain.
489762306a36Sopenharmony_ci		 * Check whether temp_compensation feature is enabled or not.
489862306a36Sopenharmony_ci		 */
489962306a36Sopenharmony_ci		if (eep->baseEepHeader.featureEnable & 0x1) {
490062306a36Sopenharmony_ci			if (frequency < 4000) {
490162306a36Sopenharmony_ci				if (txmask & BIT(0))
490262306a36Sopenharmony_ci					REG_RMW_FIELD(ah, AR_PHY_TPC_19,
490362306a36Sopenharmony_ci						      AR_PHY_TPC_19_ALPHA_THERM,
490462306a36Sopenharmony_ci						      eep->base_ext2.tempSlopeLow);
490562306a36Sopenharmony_ci				if (txmask & BIT(1))
490662306a36Sopenharmony_ci					REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
490762306a36Sopenharmony_ci						      AR_PHY_TPC_19_ALPHA_THERM,
490862306a36Sopenharmony_ci						      temp_slope);
490962306a36Sopenharmony_ci				if (txmask & BIT(2))
491062306a36Sopenharmony_ci					REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
491162306a36Sopenharmony_ci						      AR_PHY_TPC_19_ALPHA_THERM,
491262306a36Sopenharmony_ci						      eep->base_ext2.tempSlopeHigh);
491362306a36Sopenharmony_ci			} else {
491462306a36Sopenharmony_ci				if (txmask & BIT(0))
491562306a36Sopenharmony_ci					REG_RMW_FIELD(ah, AR_PHY_TPC_19,
491662306a36Sopenharmony_ci						      AR_PHY_TPC_19_ALPHA_THERM,
491762306a36Sopenharmony_ci						      temp_slope);
491862306a36Sopenharmony_ci				if (txmask & BIT(1))
491962306a36Sopenharmony_ci					REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
492062306a36Sopenharmony_ci						      AR_PHY_TPC_19_ALPHA_THERM,
492162306a36Sopenharmony_ci						      temp_slope1);
492262306a36Sopenharmony_ci				if (txmask & BIT(2))
492362306a36Sopenharmony_ci					REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
492462306a36Sopenharmony_ci						      AR_PHY_TPC_19_ALPHA_THERM,
492562306a36Sopenharmony_ci						      temp_slope2);
492662306a36Sopenharmony_ci			}
492762306a36Sopenharmony_ci		} else {
492862306a36Sopenharmony_ci			/*
492962306a36Sopenharmony_ci			 * If temp compensation is not enabled,
493062306a36Sopenharmony_ci			 * set all registers to 0.
493162306a36Sopenharmony_ci			 */
493262306a36Sopenharmony_ci			if (txmask & BIT(0))
493362306a36Sopenharmony_ci				REG_RMW_FIELD(ah, AR_PHY_TPC_19,
493462306a36Sopenharmony_ci					      AR_PHY_TPC_19_ALPHA_THERM, 0);
493562306a36Sopenharmony_ci			if (txmask & BIT(1))
493662306a36Sopenharmony_ci				REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
493762306a36Sopenharmony_ci					      AR_PHY_TPC_19_ALPHA_THERM, 0);
493862306a36Sopenharmony_ci			if (txmask & BIT(2))
493962306a36Sopenharmony_ci				REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
494062306a36Sopenharmony_ci					      AR_PHY_TPC_19_ALPHA_THERM, 0);
494162306a36Sopenharmony_ci		}
494262306a36Sopenharmony_ci	} else {
494362306a36Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_TPC_19,
494462306a36Sopenharmony_ci			      AR_PHY_TPC_19_ALPHA_THERM, temp_slope);
494562306a36Sopenharmony_ci	}
494662306a36Sopenharmony_ci
494762306a36Sopenharmony_ci	if (AR_SREV_9462_20_OR_LATER(ah))
494862306a36Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
494962306a36Sopenharmony_ci			      AR_PHY_TPC_19_B1_ALPHA_THERM, temp_slope);
495062306a36Sopenharmony_ci
495162306a36Sopenharmony_ci
495262306a36Sopenharmony_ci	REG_RMW_FIELD(ah, AR_PHY_TPC_18, AR_PHY_TPC_18_THERM_CAL_VALUE,
495362306a36Sopenharmony_ci		      temperature[0]);
495462306a36Sopenharmony_ci}
495562306a36Sopenharmony_ci
495662306a36Sopenharmony_ci/* Apply the recorded correction values. */
495762306a36Sopenharmony_cistatic int ar9003_hw_calibration_apply(struct ath_hw *ah, int frequency)
495862306a36Sopenharmony_ci{
495962306a36Sopenharmony_ci	int ichain, ipier, npier;
496062306a36Sopenharmony_ci	int lfrequency[AR9300_MAX_CHAINS],
496162306a36Sopenharmony_ci	    lcorrection[AR9300_MAX_CHAINS],
496262306a36Sopenharmony_ci	    ltemperature[AR9300_MAX_CHAINS], lvoltage[AR9300_MAX_CHAINS],
496362306a36Sopenharmony_ci	    lnf_cal[AR9300_MAX_CHAINS], lnf_pwr[AR9300_MAX_CHAINS];
496462306a36Sopenharmony_ci	int hfrequency[AR9300_MAX_CHAINS],
496562306a36Sopenharmony_ci	    hcorrection[AR9300_MAX_CHAINS],
496662306a36Sopenharmony_ci	    htemperature[AR9300_MAX_CHAINS], hvoltage[AR9300_MAX_CHAINS],
496762306a36Sopenharmony_ci	    hnf_cal[AR9300_MAX_CHAINS], hnf_pwr[AR9300_MAX_CHAINS];
496862306a36Sopenharmony_ci	int fdiff;
496962306a36Sopenharmony_ci	int correction[AR9300_MAX_CHAINS],
497062306a36Sopenharmony_ci	    voltage[AR9300_MAX_CHAINS], temperature[AR9300_MAX_CHAINS],
497162306a36Sopenharmony_ci	    nf_cal[AR9300_MAX_CHAINS], nf_pwr[AR9300_MAX_CHAINS];
497262306a36Sopenharmony_ci	int pfrequency, pcorrection, ptemperature, pvoltage,
497362306a36Sopenharmony_ci	    pnf_cal, pnf_pwr;
497462306a36Sopenharmony_ci	struct ath_common *common = ath9k_hw_common(ah);
497562306a36Sopenharmony_ci	bool is2ghz = frequency < 4000;
497662306a36Sopenharmony_ci
497762306a36Sopenharmony_ci	if (is2ghz)
497862306a36Sopenharmony_ci		npier = AR9300_NUM_2G_CAL_PIERS;
497962306a36Sopenharmony_ci	else
498062306a36Sopenharmony_ci		npier = AR9300_NUM_5G_CAL_PIERS;
498162306a36Sopenharmony_ci
498262306a36Sopenharmony_ci	for (ichain = 0; ichain < AR9300_MAX_CHAINS; ichain++) {
498362306a36Sopenharmony_ci		lfrequency[ichain] = 0;
498462306a36Sopenharmony_ci		hfrequency[ichain] = 100000;
498562306a36Sopenharmony_ci	}
498662306a36Sopenharmony_ci	/* identify best lower and higher frequency calibration measurement */
498762306a36Sopenharmony_ci	for (ichain = 0; ichain < AR9300_MAX_CHAINS; ichain++) {
498862306a36Sopenharmony_ci		for (ipier = 0; ipier < npier; ipier++) {
498962306a36Sopenharmony_ci			if (!ar9003_hw_cal_pier_get(ah, is2ghz, ipier, ichain,
499062306a36Sopenharmony_ci						    &pfrequency, &pcorrection,
499162306a36Sopenharmony_ci						    &ptemperature, &pvoltage,
499262306a36Sopenharmony_ci						    &pnf_cal, &pnf_pwr)) {
499362306a36Sopenharmony_ci				fdiff = frequency - pfrequency;
499462306a36Sopenharmony_ci
499562306a36Sopenharmony_ci				/*
499662306a36Sopenharmony_ci				 * this measurement is higher than
499762306a36Sopenharmony_ci				 * our desired frequency
499862306a36Sopenharmony_ci				 */
499962306a36Sopenharmony_ci				if (fdiff <= 0) {
500062306a36Sopenharmony_ci					if (hfrequency[ichain] <= 0 ||
500162306a36Sopenharmony_ci					    hfrequency[ichain] >= 100000 ||
500262306a36Sopenharmony_ci					    fdiff >
500362306a36Sopenharmony_ci					    (frequency - hfrequency[ichain])) {
500462306a36Sopenharmony_ci						/*
500562306a36Sopenharmony_ci						 * new best higher
500662306a36Sopenharmony_ci						 * frequency measurement
500762306a36Sopenharmony_ci						 */
500862306a36Sopenharmony_ci						hfrequency[ichain] = pfrequency;
500962306a36Sopenharmony_ci						hcorrection[ichain] =
501062306a36Sopenharmony_ci						    pcorrection;
501162306a36Sopenharmony_ci						htemperature[ichain] =
501262306a36Sopenharmony_ci						    ptemperature;
501362306a36Sopenharmony_ci						hvoltage[ichain] = pvoltage;
501462306a36Sopenharmony_ci						hnf_cal[ichain] = pnf_cal;
501562306a36Sopenharmony_ci						hnf_pwr[ichain] = pnf_pwr;
501662306a36Sopenharmony_ci					}
501762306a36Sopenharmony_ci				}
501862306a36Sopenharmony_ci				if (fdiff >= 0) {
501962306a36Sopenharmony_ci					if (lfrequency[ichain] <= 0
502062306a36Sopenharmony_ci					    || fdiff <
502162306a36Sopenharmony_ci					    (frequency - lfrequency[ichain])) {
502262306a36Sopenharmony_ci						/*
502362306a36Sopenharmony_ci						 * new best lower
502462306a36Sopenharmony_ci						 * frequency measurement
502562306a36Sopenharmony_ci						 */
502662306a36Sopenharmony_ci						lfrequency[ichain] = pfrequency;
502762306a36Sopenharmony_ci						lcorrection[ichain] =
502862306a36Sopenharmony_ci						    pcorrection;
502962306a36Sopenharmony_ci						ltemperature[ichain] =
503062306a36Sopenharmony_ci						    ptemperature;
503162306a36Sopenharmony_ci						lvoltage[ichain] = pvoltage;
503262306a36Sopenharmony_ci						lnf_cal[ichain] = pnf_cal;
503362306a36Sopenharmony_ci						lnf_pwr[ichain] = pnf_pwr;
503462306a36Sopenharmony_ci					}
503562306a36Sopenharmony_ci				}
503662306a36Sopenharmony_ci			}
503762306a36Sopenharmony_ci		}
503862306a36Sopenharmony_ci	}
503962306a36Sopenharmony_ci
504062306a36Sopenharmony_ci	/* interpolate  */
504162306a36Sopenharmony_ci	for (ichain = 0; ichain < AR9300_MAX_CHAINS; ichain++) {
504262306a36Sopenharmony_ci		ath_dbg(common, EEPROM,
504362306a36Sopenharmony_ci			"ch=%d f=%d low=%d %d h=%d %d n=%d %d p=%d %d\n",
504462306a36Sopenharmony_ci			ichain, frequency, lfrequency[ichain],
504562306a36Sopenharmony_ci			lcorrection[ichain], hfrequency[ichain],
504662306a36Sopenharmony_ci			hcorrection[ichain], lnf_cal[ichain],
504762306a36Sopenharmony_ci			hnf_cal[ichain], lnf_pwr[ichain],
504862306a36Sopenharmony_ci			hnf_pwr[ichain]);
504962306a36Sopenharmony_ci		/* they're the same, so just pick one */
505062306a36Sopenharmony_ci		if (hfrequency[ichain] == lfrequency[ichain]) {
505162306a36Sopenharmony_ci			correction[ichain] = lcorrection[ichain];
505262306a36Sopenharmony_ci			voltage[ichain] = lvoltage[ichain];
505362306a36Sopenharmony_ci			temperature[ichain] = ltemperature[ichain];
505462306a36Sopenharmony_ci			nf_cal[ichain] = lnf_cal[ichain];
505562306a36Sopenharmony_ci			nf_pwr[ichain] = lnf_pwr[ichain];
505662306a36Sopenharmony_ci		}
505762306a36Sopenharmony_ci		/* the low frequency is good */
505862306a36Sopenharmony_ci		else if (frequency - lfrequency[ichain] < 1000) {
505962306a36Sopenharmony_ci			/* so is the high frequency, interpolate */
506062306a36Sopenharmony_ci			if (hfrequency[ichain] - frequency < 1000) {
506162306a36Sopenharmony_ci
506262306a36Sopenharmony_ci				correction[ichain] = interpolate(frequency,
506362306a36Sopenharmony_ci						lfrequency[ichain],
506462306a36Sopenharmony_ci						hfrequency[ichain],
506562306a36Sopenharmony_ci						lcorrection[ichain],
506662306a36Sopenharmony_ci						hcorrection[ichain]);
506762306a36Sopenharmony_ci
506862306a36Sopenharmony_ci				temperature[ichain] = interpolate(frequency,
506962306a36Sopenharmony_ci						lfrequency[ichain],
507062306a36Sopenharmony_ci						hfrequency[ichain],
507162306a36Sopenharmony_ci						ltemperature[ichain],
507262306a36Sopenharmony_ci						htemperature[ichain]);
507362306a36Sopenharmony_ci
507462306a36Sopenharmony_ci				voltage[ichain] = interpolate(frequency,
507562306a36Sopenharmony_ci						lfrequency[ichain],
507662306a36Sopenharmony_ci						hfrequency[ichain],
507762306a36Sopenharmony_ci						lvoltage[ichain],
507862306a36Sopenharmony_ci						hvoltage[ichain]);
507962306a36Sopenharmony_ci
508062306a36Sopenharmony_ci				nf_cal[ichain] = interpolate(frequency,
508162306a36Sopenharmony_ci						lfrequency[ichain],
508262306a36Sopenharmony_ci						hfrequency[ichain],
508362306a36Sopenharmony_ci						lnf_cal[ichain],
508462306a36Sopenharmony_ci						hnf_cal[ichain]);
508562306a36Sopenharmony_ci
508662306a36Sopenharmony_ci				nf_pwr[ichain] = interpolate(frequency,
508762306a36Sopenharmony_ci						lfrequency[ichain],
508862306a36Sopenharmony_ci						hfrequency[ichain],
508962306a36Sopenharmony_ci						lnf_pwr[ichain],
509062306a36Sopenharmony_ci						hnf_pwr[ichain]);
509162306a36Sopenharmony_ci			}
509262306a36Sopenharmony_ci			/* only low is good, use it */
509362306a36Sopenharmony_ci			else {
509462306a36Sopenharmony_ci				correction[ichain] = lcorrection[ichain];
509562306a36Sopenharmony_ci				temperature[ichain] = ltemperature[ichain];
509662306a36Sopenharmony_ci				voltage[ichain] = lvoltage[ichain];
509762306a36Sopenharmony_ci				nf_cal[ichain] = lnf_cal[ichain];
509862306a36Sopenharmony_ci				nf_pwr[ichain] = lnf_pwr[ichain];
509962306a36Sopenharmony_ci			}
510062306a36Sopenharmony_ci		}
510162306a36Sopenharmony_ci		/* only high is good, use it */
510262306a36Sopenharmony_ci		else if (hfrequency[ichain] - frequency < 1000) {
510362306a36Sopenharmony_ci			correction[ichain] = hcorrection[ichain];
510462306a36Sopenharmony_ci			temperature[ichain] = htemperature[ichain];
510562306a36Sopenharmony_ci			voltage[ichain] = hvoltage[ichain];
510662306a36Sopenharmony_ci			nf_cal[ichain] = hnf_cal[ichain];
510762306a36Sopenharmony_ci			nf_pwr[ichain] = hnf_pwr[ichain];
510862306a36Sopenharmony_ci		} else {	/* nothing is good, presume 0???? */
510962306a36Sopenharmony_ci			correction[ichain] = 0;
511062306a36Sopenharmony_ci			temperature[ichain] = 0;
511162306a36Sopenharmony_ci			voltage[ichain] = 0;
511262306a36Sopenharmony_ci			nf_cal[ichain] = 0;
511362306a36Sopenharmony_ci			nf_pwr[ichain] = 0;
511462306a36Sopenharmony_ci		}
511562306a36Sopenharmony_ci	}
511662306a36Sopenharmony_ci
511762306a36Sopenharmony_ci	ar9003_hw_power_control_override(ah, frequency, correction, voltage,
511862306a36Sopenharmony_ci					 temperature);
511962306a36Sopenharmony_ci
512062306a36Sopenharmony_ci	ath_dbg(common, EEPROM,
512162306a36Sopenharmony_ci		"for frequency=%d, calibration correction = %d %d %d\n",
512262306a36Sopenharmony_ci		frequency, correction[0], correction[1], correction[2]);
512362306a36Sopenharmony_ci
512462306a36Sopenharmony_ci	/* Store calibrated noise floor values */
512562306a36Sopenharmony_ci	for (ichain = 0; ichain < AR9300_MAX_CHAINS; ichain++)
512662306a36Sopenharmony_ci		if (is2ghz) {
512762306a36Sopenharmony_ci			ah->nf_2g.cal[ichain] = nf_cal[ichain];
512862306a36Sopenharmony_ci			ah->nf_2g.pwr[ichain] = nf_pwr[ichain];
512962306a36Sopenharmony_ci		} else {
513062306a36Sopenharmony_ci			ah->nf_5g.cal[ichain] = nf_cal[ichain];
513162306a36Sopenharmony_ci			ah->nf_5g.pwr[ichain] = nf_pwr[ichain];
513262306a36Sopenharmony_ci		}
513362306a36Sopenharmony_ci
513462306a36Sopenharmony_ci	return 0;
513562306a36Sopenharmony_ci}
513662306a36Sopenharmony_ci
513762306a36Sopenharmony_cistatic u16 ar9003_hw_get_direct_edge_power(struct ar9300_eeprom *eep,
513862306a36Sopenharmony_ci					   int idx,
513962306a36Sopenharmony_ci					   int edge,
514062306a36Sopenharmony_ci					   bool is2GHz)
514162306a36Sopenharmony_ci{
514262306a36Sopenharmony_ci	struct cal_ctl_data_2g *ctl_2g = eep->ctlPowerData_2G;
514362306a36Sopenharmony_ci	struct cal_ctl_data_5g *ctl_5g = eep->ctlPowerData_5G;
514462306a36Sopenharmony_ci
514562306a36Sopenharmony_ci	if (is2GHz)
514662306a36Sopenharmony_ci		return CTL_EDGE_TPOWER(ctl_2g[idx].ctlEdges[edge]);
514762306a36Sopenharmony_ci	else
514862306a36Sopenharmony_ci		return CTL_EDGE_TPOWER(ctl_5g[idx].ctlEdges[edge]);
514962306a36Sopenharmony_ci}
515062306a36Sopenharmony_ci
515162306a36Sopenharmony_cistatic u16 ar9003_hw_get_indirect_edge_power(struct ar9300_eeprom *eep,
515262306a36Sopenharmony_ci					     int idx,
515362306a36Sopenharmony_ci					     unsigned int edge,
515462306a36Sopenharmony_ci					     u16 freq,
515562306a36Sopenharmony_ci					     bool is2GHz)
515662306a36Sopenharmony_ci{
515762306a36Sopenharmony_ci	struct cal_ctl_data_2g *ctl_2g = eep->ctlPowerData_2G;
515862306a36Sopenharmony_ci	struct cal_ctl_data_5g *ctl_5g = eep->ctlPowerData_5G;
515962306a36Sopenharmony_ci
516062306a36Sopenharmony_ci	u8 *ctl_freqbin = is2GHz ?
516162306a36Sopenharmony_ci		&eep->ctl_freqbin_2G[idx][0] :
516262306a36Sopenharmony_ci		&eep->ctl_freqbin_5G[idx][0];
516362306a36Sopenharmony_ci
516462306a36Sopenharmony_ci	if (is2GHz) {
516562306a36Sopenharmony_ci		if (ath9k_hw_fbin2freq(ctl_freqbin[edge - 1], 1) < freq &&
516662306a36Sopenharmony_ci		    CTL_EDGE_FLAGS(ctl_2g[idx].ctlEdges[edge - 1]))
516762306a36Sopenharmony_ci			return CTL_EDGE_TPOWER(ctl_2g[idx].ctlEdges[edge - 1]);
516862306a36Sopenharmony_ci	} else {
516962306a36Sopenharmony_ci		if (ath9k_hw_fbin2freq(ctl_freqbin[edge - 1], 0) < freq &&
517062306a36Sopenharmony_ci		    CTL_EDGE_FLAGS(ctl_5g[idx].ctlEdges[edge - 1]))
517162306a36Sopenharmony_ci			return CTL_EDGE_TPOWER(ctl_5g[idx].ctlEdges[edge - 1]);
517262306a36Sopenharmony_ci	}
517362306a36Sopenharmony_ci
517462306a36Sopenharmony_ci	return MAX_RATE_POWER;
517562306a36Sopenharmony_ci}
517662306a36Sopenharmony_ci
517762306a36Sopenharmony_ci/*
517862306a36Sopenharmony_ci * Find the maximum conformance test limit for the given channel and CTL info
517962306a36Sopenharmony_ci */
518062306a36Sopenharmony_cistatic u16 ar9003_hw_get_max_edge_power(struct ar9300_eeprom *eep,
518162306a36Sopenharmony_ci					u16 freq, int idx, bool is2GHz)
518262306a36Sopenharmony_ci{
518362306a36Sopenharmony_ci	u16 twiceMaxEdgePower = MAX_RATE_POWER;
518462306a36Sopenharmony_ci	u8 *ctl_freqbin = is2GHz ?
518562306a36Sopenharmony_ci		&eep->ctl_freqbin_2G[idx][0] :
518662306a36Sopenharmony_ci		&eep->ctl_freqbin_5G[idx][0];
518762306a36Sopenharmony_ci	u16 num_edges = is2GHz ?
518862306a36Sopenharmony_ci		AR9300_NUM_BAND_EDGES_2G : AR9300_NUM_BAND_EDGES_5G;
518962306a36Sopenharmony_ci	unsigned int edge;
519062306a36Sopenharmony_ci
519162306a36Sopenharmony_ci	/* Get the edge power */
519262306a36Sopenharmony_ci	for (edge = 0;
519362306a36Sopenharmony_ci	     (edge < num_edges) && (ctl_freqbin[edge] != AR5416_BCHAN_UNUSED);
519462306a36Sopenharmony_ci	     edge++) {
519562306a36Sopenharmony_ci		/*
519662306a36Sopenharmony_ci		 * If there's an exact channel match or an inband flag set
519762306a36Sopenharmony_ci		 * on the lower channel use the given rdEdgePower
519862306a36Sopenharmony_ci		 */
519962306a36Sopenharmony_ci		if (freq == ath9k_hw_fbin2freq(ctl_freqbin[edge], is2GHz)) {
520062306a36Sopenharmony_ci			twiceMaxEdgePower =
520162306a36Sopenharmony_ci				ar9003_hw_get_direct_edge_power(eep, idx,
520262306a36Sopenharmony_ci								edge, is2GHz);
520362306a36Sopenharmony_ci			break;
520462306a36Sopenharmony_ci		} else if ((edge > 0) &&
520562306a36Sopenharmony_ci			   (freq < ath9k_hw_fbin2freq(ctl_freqbin[edge],
520662306a36Sopenharmony_ci						      is2GHz))) {
520762306a36Sopenharmony_ci			twiceMaxEdgePower =
520862306a36Sopenharmony_ci				ar9003_hw_get_indirect_edge_power(eep, idx,
520962306a36Sopenharmony_ci								  edge, freq,
521062306a36Sopenharmony_ci								  is2GHz);
521162306a36Sopenharmony_ci			/*
521262306a36Sopenharmony_ci			 * Leave loop - no more affecting edges possible in
521362306a36Sopenharmony_ci			 * this monotonic increasing list
521462306a36Sopenharmony_ci			 */
521562306a36Sopenharmony_ci			break;
521662306a36Sopenharmony_ci		}
521762306a36Sopenharmony_ci	}
521862306a36Sopenharmony_ci
521962306a36Sopenharmony_ci	if (is2GHz && !twiceMaxEdgePower)
522062306a36Sopenharmony_ci		twiceMaxEdgePower = 60;
522162306a36Sopenharmony_ci
522262306a36Sopenharmony_ci	return twiceMaxEdgePower;
522362306a36Sopenharmony_ci}
522462306a36Sopenharmony_ci
522562306a36Sopenharmony_cistatic void ar9003_hw_set_power_per_rate_table(struct ath_hw *ah,
522662306a36Sopenharmony_ci					       struct ath9k_channel *chan,
522762306a36Sopenharmony_ci					       u8 *pPwrArray, u16 cfgCtl,
522862306a36Sopenharmony_ci					       u8 antenna_reduction,
522962306a36Sopenharmony_ci					       u16 powerLimit)
523062306a36Sopenharmony_ci{
523162306a36Sopenharmony_ci	struct ath_common *common = ath9k_hw_common(ah);
523262306a36Sopenharmony_ci	struct ar9300_eeprom *pEepData = &ah->eeprom.ar9300_eep;
523362306a36Sopenharmony_ci	u16 twiceMaxEdgePower;
523462306a36Sopenharmony_ci	int i;
523562306a36Sopenharmony_ci	u16 scaledPower = 0, minCtlPower;
523662306a36Sopenharmony_ci	static const u16 ctlModesFor11a[] = {
523762306a36Sopenharmony_ci		CTL_11A, CTL_5GHT20, CTL_11A_EXT, CTL_5GHT40
523862306a36Sopenharmony_ci	};
523962306a36Sopenharmony_ci	static const u16 ctlModesFor11g[] = {
524062306a36Sopenharmony_ci		CTL_11B, CTL_11G, CTL_2GHT20, CTL_11B_EXT,
524162306a36Sopenharmony_ci		CTL_11G_EXT, CTL_2GHT40
524262306a36Sopenharmony_ci	};
524362306a36Sopenharmony_ci	u16 numCtlModes;
524462306a36Sopenharmony_ci	const u16 *pCtlMode;
524562306a36Sopenharmony_ci	u16 ctlMode, freq;
524662306a36Sopenharmony_ci	struct chan_centers centers;
524762306a36Sopenharmony_ci	u8 *ctlIndex;
524862306a36Sopenharmony_ci	u8 ctlNum;
524962306a36Sopenharmony_ci	u16 twiceMinEdgePower;
525062306a36Sopenharmony_ci	bool is2ghz = IS_CHAN_2GHZ(chan);
525162306a36Sopenharmony_ci
525262306a36Sopenharmony_ci	ath9k_hw_get_channel_centers(ah, chan, &centers);
525362306a36Sopenharmony_ci	scaledPower = ath9k_hw_get_scaled_power(ah, powerLimit,
525462306a36Sopenharmony_ci						antenna_reduction);
525562306a36Sopenharmony_ci
525662306a36Sopenharmony_ci	if (is2ghz) {
525762306a36Sopenharmony_ci		/* Setup for CTL modes */
525862306a36Sopenharmony_ci		/* CTL_11B, CTL_11G, CTL_2GHT20 */
525962306a36Sopenharmony_ci		numCtlModes =
526062306a36Sopenharmony_ci			ARRAY_SIZE(ctlModesFor11g) -
526162306a36Sopenharmony_ci				   SUB_NUM_CTL_MODES_AT_2G_40;
526262306a36Sopenharmony_ci		pCtlMode = ctlModesFor11g;
526362306a36Sopenharmony_ci		if (IS_CHAN_HT40(chan))
526462306a36Sopenharmony_ci			/* All 2G CTL's */
526562306a36Sopenharmony_ci			numCtlModes = ARRAY_SIZE(ctlModesFor11g);
526662306a36Sopenharmony_ci	} else {
526762306a36Sopenharmony_ci		/* Setup for CTL modes */
526862306a36Sopenharmony_ci		/* CTL_11A, CTL_5GHT20 */
526962306a36Sopenharmony_ci		numCtlModes = ARRAY_SIZE(ctlModesFor11a) -
527062306a36Sopenharmony_ci					 SUB_NUM_CTL_MODES_AT_5G_40;
527162306a36Sopenharmony_ci		pCtlMode = ctlModesFor11a;
527262306a36Sopenharmony_ci		if (IS_CHAN_HT40(chan))
527362306a36Sopenharmony_ci			/* All 5G CTL's */
527462306a36Sopenharmony_ci			numCtlModes = ARRAY_SIZE(ctlModesFor11a);
527562306a36Sopenharmony_ci	}
527662306a36Sopenharmony_ci
527762306a36Sopenharmony_ci	/*
527862306a36Sopenharmony_ci	 * For MIMO, need to apply regulatory caps individually across
527962306a36Sopenharmony_ci	 * dynamically running modes: CCK, OFDM, HT20, HT40
528062306a36Sopenharmony_ci	 *
528162306a36Sopenharmony_ci	 * The outer loop walks through each possible applicable runtime mode.
528262306a36Sopenharmony_ci	 * The inner loop walks through each ctlIndex entry in EEPROM.
528362306a36Sopenharmony_ci	 * The ctl value is encoded as [7:4] == test group, [3:0] == test mode.
528462306a36Sopenharmony_ci	 */
528562306a36Sopenharmony_ci	for (ctlMode = 0; ctlMode < numCtlModes; ctlMode++) {
528662306a36Sopenharmony_ci		bool isHt40CtlMode = (pCtlMode[ctlMode] == CTL_5GHT40) ||
528762306a36Sopenharmony_ci			(pCtlMode[ctlMode] == CTL_2GHT40);
528862306a36Sopenharmony_ci		if (isHt40CtlMode)
528962306a36Sopenharmony_ci			freq = centers.synth_center;
529062306a36Sopenharmony_ci		else if (pCtlMode[ctlMode] & EXT_ADDITIVE)
529162306a36Sopenharmony_ci			freq = centers.ext_center;
529262306a36Sopenharmony_ci		else
529362306a36Sopenharmony_ci			freq = centers.ctl_center;
529462306a36Sopenharmony_ci
529562306a36Sopenharmony_ci		ath_dbg(common, REGULATORY,
529662306a36Sopenharmony_ci			"LOOP-Mode ctlMode %d < %d, isHt40CtlMode %d, EXT_ADDITIVE %d\n",
529762306a36Sopenharmony_ci			ctlMode, numCtlModes, isHt40CtlMode,
529862306a36Sopenharmony_ci			(pCtlMode[ctlMode] & EXT_ADDITIVE));
529962306a36Sopenharmony_ci
530062306a36Sopenharmony_ci		/* walk through each CTL index stored in EEPROM */
530162306a36Sopenharmony_ci		if (is2ghz) {
530262306a36Sopenharmony_ci			ctlIndex = pEepData->ctlIndex_2G;
530362306a36Sopenharmony_ci			ctlNum = AR9300_NUM_CTLS_2G;
530462306a36Sopenharmony_ci		} else {
530562306a36Sopenharmony_ci			ctlIndex = pEepData->ctlIndex_5G;
530662306a36Sopenharmony_ci			ctlNum = AR9300_NUM_CTLS_5G;
530762306a36Sopenharmony_ci		}
530862306a36Sopenharmony_ci
530962306a36Sopenharmony_ci		twiceMaxEdgePower = MAX_RATE_POWER;
531062306a36Sopenharmony_ci		for (i = 0; (i < ctlNum) && ctlIndex[i]; i++) {
531162306a36Sopenharmony_ci			ath_dbg(common, REGULATORY,
531262306a36Sopenharmony_ci				"LOOP-Ctlidx %d: cfgCtl 0x%2.2x pCtlMode 0x%2.2x ctlIndex 0x%2.2x chan %d\n",
531362306a36Sopenharmony_ci				i, cfgCtl, pCtlMode[ctlMode], ctlIndex[i],
531462306a36Sopenharmony_ci				chan->channel);
531562306a36Sopenharmony_ci
531662306a36Sopenharmony_ci			/*
531762306a36Sopenharmony_ci			 * compare test group from regulatory
531862306a36Sopenharmony_ci			 * channel list with test mode from pCtlMode
531962306a36Sopenharmony_ci			 * list
532062306a36Sopenharmony_ci			 */
532162306a36Sopenharmony_ci			if ((((cfgCtl & ~CTL_MODE_M) |
532262306a36Sopenharmony_ci			       (pCtlMode[ctlMode] & CTL_MODE_M)) ==
532362306a36Sopenharmony_ci				ctlIndex[i]) ||
532462306a36Sopenharmony_ci			    (((cfgCtl & ~CTL_MODE_M) |
532562306a36Sopenharmony_ci			       (pCtlMode[ctlMode] & CTL_MODE_M)) ==
532662306a36Sopenharmony_ci			     ((ctlIndex[i] & CTL_MODE_M) |
532762306a36Sopenharmony_ci			       SD_NO_CTL))) {
532862306a36Sopenharmony_ci				twiceMinEdgePower =
532962306a36Sopenharmony_ci				  ar9003_hw_get_max_edge_power(pEepData,
533062306a36Sopenharmony_ci							       freq, i,
533162306a36Sopenharmony_ci							       is2ghz);
533262306a36Sopenharmony_ci
533362306a36Sopenharmony_ci				if ((cfgCtl & ~CTL_MODE_M) == SD_NO_CTL)
533462306a36Sopenharmony_ci					/*
533562306a36Sopenharmony_ci					 * Find the minimum of all CTL
533662306a36Sopenharmony_ci					 * edge powers that apply to
533762306a36Sopenharmony_ci					 * this channel
533862306a36Sopenharmony_ci					 */
533962306a36Sopenharmony_ci					twiceMaxEdgePower =
534062306a36Sopenharmony_ci						min(twiceMaxEdgePower,
534162306a36Sopenharmony_ci						    twiceMinEdgePower);
534262306a36Sopenharmony_ci				else {
534362306a36Sopenharmony_ci					/* specific */
534462306a36Sopenharmony_ci					twiceMaxEdgePower = twiceMinEdgePower;
534562306a36Sopenharmony_ci					break;
534662306a36Sopenharmony_ci				}
534762306a36Sopenharmony_ci			}
534862306a36Sopenharmony_ci		}
534962306a36Sopenharmony_ci
535062306a36Sopenharmony_ci		minCtlPower = (u8)min(twiceMaxEdgePower, scaledPower);
535162306a36Sopenharmony_ci
535262306a36Sopenharmony_ci		ath_dbg(common, REGULATORY,
535362306a36Sopenharmony_ci			"SEL-Min ctlMode %d pCtlMode %d 2xMaxEdge %d sP %d minCtlPwr %d\n",
535462306a36Sopenharmony_ci			ctlMode, pCtlMode[ctlMode], twiceMaxEdgePower,
535562306a36Sopenharmony_ci			scaledPower, minCtlPower);
535662306a36Sopenharmony_ci
535762306a36Sopenharmony_ci		/* Apply ctl mode to correct target power set */
535862306a36Sopenharmony_ci		switch (pCtlMode[ctlMode]) {
535962306a36Sopenharmony_ci		case CTL_11B:
536062306a36Sopenharmony_ci			for (i = ALL_TARGET_LEGACY_1L_5L;
536162306a36Sopenharmony_ci			     i <= ALL_TARGET_LEGACY_11S; i++)
536262306a36Sopenharmony_ci				pPwrArray[i] = (u8)min((u16)pPwrArray[i],
536362306a36Sopenharmony_ci						       minCtlPower);
536462306a36Sopenharmony_ci			break;
536562306a36Sopenharmony_ci		case CTL_11A:
536662306a36Sopenharmony_ci		case CTL_11G:
536762306a36Sopenharmony_ci			for (i = ALL_TARGET_LEGACY_6_24;
536862306a36Sopenharmony_ci			     i <= ALL_TARGET_LEGACY_54; i++)
536962306a36Sopenharmony_ci				pPwrArray[i] = (u8)min((u16)pPwrArray[i],
537062306a36Sopenharmony_ci						       minCtlPower);
537162306a36Sopenharmony_ci			break;
537262306a36Sopenharmony_ci		case CTL_5GHT20:
537362306a36Sopenharmony_ci		case CTL_2GHT20:
537462306a36Sopenharmony_ci			for (i = ALL_TARGET_HT20_0_8_16;
537562306a36Sopenharmony_ci			     i <= ALL_TARGET_HT20_23; i++) {
537662306a36Sopenharmony_ci				pPwrArray[i] = (u8)min((u16)pPwrArray[i],
537762306a36Sopenharmony_ci						       minCtlPower);
537862306a36Sopenharmony_ci				if (ath9k_hw_mci_is_enabled(ah))
537962306a36Sopenharmony_ci					pPwrArray[i] =
538062306a36Sopenharmony_ci						(u8)min((u16)pPwrArray[i],
538162306a36Sopenharmony_ci						ar9003_mci_get_max_txpower(ah,
538262306a36Sopenharmony_ci							pCtlMode[ctlMode]));
538362306a36Sopenharmony_ci			}
538462306a36Sopenharmony_ci			break;
538562306a36Sopenharmony_ci		case CTL_5GHT40:
538662306a36Sopenharmony_ci		case CTL_2GHT40:
538762306a36Sopenharmony_ci			for (i = ALL_TARGET_HT40_0_8_16;
538862306a36Sopenharmony_ci			     i <= ALL_TARGET_HT40_23; i++) {
538962306a36Sopenharmony_ci				pPwrArray[i] = (u8)min((u16)pPwrArray[i],
539062306a36Sopenharmony_ci						       minCtlPower);
539162306a36Sopenharmony_ci				if (ath9k_hw_mci_is_enabled(ah))
539262306a36Sopenharmony_ci					pPwrArray[i] =
539362306a36Sopenharmony_ci						(u8)min((u16)pPwrArray[i],
539462306a36Sopenharmony_ci						ar9003_mci_get_max_txpower(ah,
539562306a36Sopenharmony_ci							pCtlMode[ctlMode]));
539662306a36Sopenharmony_ci			}
539762306a36Sopenharmony_ci			break;
539862306a36Sopenharmony_ci		default:
539962306a36Sopenharmony_ci			break;
540062306a36Sopenharmony_ci		}
540162306a36Sopenharmony_ci	} /* end ctl mode checking */
540262306a36Sopenharmony_ci}
540362306a36Sopenharmony_ci
540462306a36Sopenharmony_cistatic inline u8 mcsidx_to_tgtpwridx(unsigned int mcs_idx, u8 base_pwridx)
540562306a36Sopenharmony_ci{
540662306a36Sopenharmony_ci	u8 mod_idx = mcs_idx % 8;
540762306a36Sopenharmony_ci
540862306a36Sopenharmony_ci	if (mod_idx <= 3)
540962306a36Sopenharmony_ci		return mod_idx ? (base_pwridx + 1) : base_pwridx;
541062306a36Sopenharmony_ci	else
541162306a36Sopenharmony_ci		return base_pwridx + 4 * (mcs_idx / 8) + mod_idx - 2;
541262306a36Sopenharmony_ci}
541362306a36Sopenharmony_ci
541462306a36Sopenharmony_cistatic void ar9003_paprd_set_txpower(struct ath_hw *ah,
541562306a36Sopenharmony_ci				     struct ath9k_channel *chan,
541662306a36Sopenharmony_ci				     u8 *targetPowerValT2)
541762306a36Sopenharmony_ci{
541862306a36Sopenharmony_ci	int i;
541962306a36Sopenharmony_ci
542062306a36Sopenharmony_ci	if (!ar9003_is_paprd_enabled(ah))
542162306a36Sopenharmony_ci		return;
542262306a36Sopenharmony_ci
542362306a36Sopenharmony_ci	if (IS_CHAN_HT40(chan))
542462306a36Sopenharmony_ci		i = ALL_TARGET_HT40_7;
542562306a36Sopenharmony_ci	else
542662306a36Sopenharmony_ci		i = ALL_TARGET_HT20_7;
542762306a36Sopenharmony_ci
542862306a36Sopenharmony_ci	if (IS_CHAN_2GHZ(chan)) {
542962306a36Sopenharmony_ci		if (!AR_SREV_9330(ah) && !AR_SREV_9340(ah) &&
543062306a36Sopenharmony_ci		    !AR_SREV_9462(ah) && !AR_SREV_9565(ah)) {
543162306a36Sopenharmony_ci			if (IS_CHAN_HT40(chan))
543262306a36Sopenharmony_ci				i = ALL_TARGET_HT40_0_8_16;
543362306a36Sopenharmony_ci			else
543462306a36Sopenharmony_ci				i = ALL_TARGET_HT20_0_8_16;
543562306a36Sopenharmony_ci		}
543662306a36Sopenharmony_ci	}
543762306a36Sopenharmony_ci
543862306a36Sopenharmony_ci	ah->paprd_target_power = targetPowerValT2[i];
543962306a36Sopenharmony_ci}
544062306a36Sopenharmony_ci
544162306a36Sopenharmony_cistatic void ath9k_hw_ar9300_set_txpower(struct ath_hw *ah,
544262306a36Sopenharmony_ci					struct ath9k_channel *chan, u16 cfgCtl,
544362306a36Sopenharmony_ci					u8 twiceAntennaReduction,
544462306a36Sopenharmony_ci					u8 powerLimit, bool test)
544562306a36Sopenharmony_ci{
544662306a36Sopenharmony_ci	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
544762306a36Sopenharmony_ci	struct ath_common *common = ath9k_hw_common(ah);
544862306a36Sopenharmony_ci	u8 targetPowerValT2[ar9300RateSize];
544962306a36Sopenharmony_ci	u8 target_power_val_t2_eep[ar9300RateSize];
545062306a36Sopenharmony_ci	u8 targetPowerValT2_tpc[ar9300RateSize];
545162306a36Sopenharmony_ci	unsigned int i = 0, paprd_scale_factor = 0;
545262306a36Sopenharmony_ci	u8 pwr_idx, min_pwridx = 0;
545362306a36Sopenharmony_ci
545462306a36Sopenharmony_ci	memset(targetPowerValT2, 0 , sizeof(targetPowerValT2));
545562306a36Sopenharmony_ci
545662306a36Sopenharmony_ci	/*
545762306a36Sopenharmony_ci	 * Get target powers from EEPROM - our baseline for TX Power
545862306a36Sopenharmony_ci	 */
545962306a36Sopenharmony_ci	ar9003_hw_get_target_power_eeprom(ah, chan, targetPowerValT2);
546062306a36Sopenharmony_ci
546162306a36Sopenharmony_ci	if (ar9003_is_paprd_enabled(ah)) {
546262306a36Sopenharmony_ci		ah->paprd_ratemask =
546362306a36Sopenharmony_ci			ar9003_get_paprd_rate_mask_ht20(ah, IS_CHAN_2GHZ(chan)) &
546462306a36Sopenharmony_ci			AR9300_PAPRD_RATE_MASK;
546562306a36Sopenharmony_ci
546662306a36Sopenharmony_ci		ah->paprd_ratemask_ht40 =
546762306a36Sopenharmony_ci			ar9003_get_paprd_rate_mask_ht40(ah, IS_CHAN_2GHZ(chan)) &
546862306a36Sopenharmony_ci			AR9300_PAPRD_RATE_MASK;
546962306a36Sopenharmony_ci
547062306a36Sopenharmony_ci		paprd_scale_factor = ar9003_get_paprd_scale_factor(ah, chan);
547162306a36Sopenharmony_ci		min_pwridx = IS_CHAN_HT40(chan) ? ALL_TARGET_HT40_0_8_16 :
547262306a36Sopenharmony_ci						  ALL_TARGET_HT20_0_8_16;
547362306a36Sopenharmony_ci
547462306a36Sopenharmony_ci		if (!ah->paprd_table_write_done) {
547562306a36Sopenharmony_ci			memcpy(target_power_val_t2_eep, targetPowerValT2,
547662306a36Sopenharmony_ci			       sizeof(targetPowerValT2));
547762306a36Sopenharmony_ci			for (i = 0; i < 24; i++) {
547862306a36Sopenharmony_ci				pwr_idx = mcsidx_to_tgtpwridx(i, min_pwridx);
547962306a36Sopenharmony_ci				if (ah->paprd_ratemask & (1 << i)) {
548062306a36Sopenharmony_ci					if (targetPowerValT2[pwr_idx] &&
548162306a36Sopenharmony_ci					    targetPowerValT2[pwr_idx] ==
548262306a36Sopenharmony_ci					    target_power_val_t2_eep[pwr_idx])
548362306a36Sopenharmony_ci						targetPowerValT2[pwr_idx] -=
548462306a36Sopenharmony_ci							paprd_scale_factor;
548562306a36Sopenharmony_ci				}
548662306a36Sopenharmony_ci			}
548762306a36Sopenharmony_ci		}
548862306a36Sopenharmony_ci		memcpy(target_power_val_t2_eep, targetPowerValT2,
548962306a36Sopenharmony_ci		       sizeof(targetPowerValT2));
549062306a36Sopenharmony_ci	}
549162306a36Sopenharmony_ci
549262306a36Sopenharmony_ci	ar9003_hw_set_power_per_rate_table(ah, chan,
549362306a36Sopenharmony_ci					   targetPowerValT2, cfgCtl,
549462306a36Sopenharmony_ci					   twiceAntennaReduction,
549562306a36Sopenharmony_ci					   powerLimit);
549662306a36Sopenharmony_ci
549762306a36Sopenharmony_ci	memcpy(targetPowerValT2_tpc, targetPowerValT2,
549862306a36Sopenharmony_ci	       sizeof(targetPowerValT2));
549962306a36Sopenharmony_ci
550062306a36Sopenharmony_ci	if (ar9003_is_paprd_enabled(ah)) {
550162306a36Sopenharmony_ci		for (i = 0; i < ar9300RateSize; i++) {
550262306a36Sopenharmony_ci			if ((ah->paprd_ratemask & (1 << i)) &&
550362306a36Sopenharmony_ci			    (abs(targetPowerValT2[i] -
550462306a36Sopenharmony_ci				target_power_val_t2_eep[i]) >
550562306a36Sopenharmony_ci			    paprd_scale_factor)) {
550662306a36Sopenharmony_ci				ah->paprd_ratemask &= ~(1 << i);
550762306a36Sopenharmony_ci				ath_dbg(common, EEPROM,
550862306a36Sopenharmony_ci					"paprd disabled for mcs %d\n", i);
550962306a36Sopenharmony_ci			}
551062306a36Sopenharmony_ci		}
551162306a36Sopenharmony_ci	}
551262306a36Sopenharmony_ci
551362306a36Sopenharmony_ci	regulatory->max_power_level = 0;
551462306a36Sopenharmony_ci	for (i = 0; i < ar9300RateSize; i++) {
551562306a36Sopenharmony_ci		if (targetPowerValT2[i] > regulatory->max_power_level)
551662306a36Sopenharmony_ci			regulatory->max_power_level = targetPowerValT2[i];
551762306a36Sopenharmony_ci	}
551862306a36Sopenharmony_ci
551962306a36Sopenharmony_ci	ath9k_hw_update_regulatory_maxpower(ah);
552062306a36Sopenharmony_ci
552162306a36Sopenharmony_ci	if (test)
552262306a36Sopenharmony_ci		return;
552362306a36Sopenharmony_ci
552462306a36Sopenharmony_ci	for (i = 0; i < ar9300RateSize; i++) {
552562306a36Sopenharmony_ci		ath_dbg(common, REGULATORY, "TPC[%02d] 0x%08x\n",
552662306a36Sopenharmony_ci			i, targetPowerValT2[i]);
552762306a36Sopenharmony_ci	}
552862306a36Sopenharmony_ci
552962306a36Sopenharmony_ci	/* Write target power array to registers */
553062306a36Sopenharmony_ci	ar9003_hw_tx_power_regwrite(ah, targetPowerValT2);
553162306a36Sopenharmony_ci	ar9003_hw_calibration_apply(ah, chan->channel);
553262306a36Sopenharmony_ci	ar9003_paprd_set_txpower(ah, chan, targetPowerValT2);
553362306a36Sopenharmony_ci
553462306a36Sopenharmony_ci	ar9003_hw_selfgen_tpc_txpower(ah, chan, targetPowerValT2);
553562306a36Sopenharmony_ci
553662306a36Sopenharmony_ci	/* TPC initializations */
553762306a36Sopenharmony_ci	if (ah->tpc_enabled) {
553862306a36Sopenharmony_ci		u32 val;
553962306a36Sopenharmony_ci
554062306a36Sopenharmony_ci		ar9003_hw_init_rate_txpower(ah, targetPowerValT2_tpc, chan);
554162306a36Sopenharmony_ci
554262306a36Sopenharmony_ci		/* Enable TPC */
554362306a36Sopenharmony_ci		REG_WRITE(ah, AR_PHY_PWRTX_MAX,
554462306a36Sopenharmony_ci			  AR_PHY_POWER_TX_RATE_MAX_TPC_ENABLE);
554562306a36Sopenharmony_ci		/* Disable per chain power reduction */
554662306a36Sopenharmony_ci		val = REG_READ(ah, AR_PHY_POWER_TX_SUB);
554762306a36Sopenharmony_ci		if (AR_SREV_9340(ah))
554862306a36Sopenharmony_ci			REG_WRITE(ah, AR_PHY_POWER_TX_SUB,
554962306a36Sopenharmony_ci				  val & 0xFFFFFFC0);
555062306a36Sopenharmony_ci		else
555162306a36Sopenharmony_ci			REG_WRITE(ah, AR_PHY_POWER_TX_SUB,
555262306a36Sopenharmony_ci				  val & 0xFFFFF000);
555362306a36Sopenharmony_ci	} else {
555462306a36Sopenharmony_ci		/* Disable TPC */
555562306a36Sopenharmony_ci		REG_WRITE(ah, AR_PHY_PWRTX_MAX, 0);
555662306a36Sopenharmony_ci	}
555762306a36Sopenharmony_ci}
555862306a36Sopenharmony_ci
555962306a36Sopenharmony_cistatic u16 ath9k_hw_ar9300_get_spur_channel(struct ath_hw *ah,
556062306a36Sopenharmony_ci					    u16 i, bool is2GHz)
556162306a36Sopenharmony_ci{
556262306a36Sopenharmony_ci	return AR_NO_SPUR;
556362306a36Sopenharmony_ci}
556462306a36Sopenharmony_ci
556562306a36Sopenharmony_cis32 ar9003_hw_get_tx_gain_idx(struct ath_hw *ah)
556662306a36Sopenharmony_ci{
556762306a36Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
556862306a36Sopenharmony_ci
556962306a36Sopenharmony_ci	return (eep->baseEepHeader.txrxgain >> 4) & 0xf; /* bits 7:4 */
557062306a36Sopenharmony_ci}
557162306a36Sopenharmony_ci
557262306a36Sopenharmony_cis32 ar9003_hw_get_rx_gain_idx(struct ath_hw *ah)
557362306a36Sopenharmony_ci{
557462306a36Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
557562306a36Sopenharmony_ci
557662306a36Sopenharmony_ci	return (eep->baseEepHeader.txrxgain) & 0xf; /* bits 3:0 */
557762306a36Sopenharmony_ci}
557862306a36Sopenharmony_ci
557962306a36Sopenharmony_ciu8 *ar9003_get_spur_chan_ptr(struct ath_hw *ah, bool is2ghz)
558062306a36Sopenharmony_ci{
558162306a36Sopenharmony_ci	return ar9003_modal_header(ah, is2ghz)->spurChans;
558262306a36Sopenharmony_ci}
558362306a36Sopenharmony_ci
558462306a36Sopenharmony_ciu32 ar9003_get_paprd_rate_mask_ht20(struct ath_hw *ah, bool is2ghz)
558562306a36Sopenharmony_ci{
558662306a36Sopenharmony_ci	return le32_to_cpu(ar9003_modal_header(ah, is2ghz)->papdRateMaskHt20);
558762306a36Sopenharmony_ci}
558862306a36Sopenharmony_ci
558962306a36Sopenharmony_ciu32 ar9003_get_paprd_rate_mask_ht40(struct ath_hw *ah, bool is2ghz)
559062306a36Sopenharmony_ci{
559162306a36Sopenharmony_ci	return le32_to_cpu(ar9003_modal_header(ah, is2ghz)->papdRateMaskHt40);
559262306a36Sopenharmony_ci}
559362306a36Sopenharmony_ci
559462306a36Sopenharmony_ciunsigned int ar9003_get_paprd_scale_factor(struct ath_hw *ah,
559562306a36Sopenharmony_ci					   struct ath9k_channel *chan)
559662306a36Sopenharmony_ci{
559762306a36Sopenharmony_ci	bool is2ghz = IS_CHAN_2GHZ(chan);
559862306a36Sopenharmony_ci
559962306a36Sopenharmony_ci	if (is2ghz)
560062306a36Sopenharmony_ci		return MS(ar9003_get_paprd_rate_mask_ht20(ah, is2ghz),
560162306a36Sopenharmony_ci			  AR9300_PAPRD_SCALE_1);
560262306a36Sopenharmony_ci	else {
560362306a36Sopenharmony_ci		if (chan->channel >= 5700)
560462306a36Sopenharmony_ci			return MS(ar9003_get_paprd_rate_mask_ht20(ah, is2ghz),
560562306a36Sopenharmony_ci				  AR9300_PAPRD_SCALE_1);
560662306a36Sopenharmony_ci		else if (chan->channel >= 5400)
560762306a36Sopenharmony_ci			return MS(ar9003_get_paprd_rate_mask_ht40(ah, is2ghz),
560862306a36Sopenharmony_ci				  AR9300_PAPRD_SCALE_2);
560962306a36Sopenharmony_ci		else
561062306a36Sopenharmony_ci			return MS(ar9003_get_paprd_rate_mask_ht40(ah, is2ghz),
561162306a36Sopenharmony_ci				  AR9300_PAPRD_SCALE_1);
561262306a36Sopenharmony_ci	}
561362306a36Sopenharmony_ci}
561462306a36Sopenharmony_ci
561562306a36Sopenharmony_cistatic u8 ar9003_get_eepmisc(struct ath_hw *ah)
561662306a36Sopenharmony_ci{
561762306a36Sopenharmony_ci	return ah->eeprom.ar9300_eep.baseEepHeader.opCapFlags.eepMisc;
561862306a36Sopenharmony_ci}
561962306a36Sopenharmony_ci
562062306a36Sopenharmony_ciconst struct eeprom_ops eep_ar9300_ops = {
562162306a36Sopenharmony_ci	.check_eeprom = ath9k_hw_ar9300_check_eeprom,
562262306a36Sopenharmony_ci	.get_eeprom = ath9k_hw_ar9300_get_eeprom,
562362306a36Sopenharmony_ci	.fill_eeprom = ath9k_hw_ar9300_fill_eeprom,
562462306a36Sopenharmony_ci	.dump_eeprom = ath9k_hw_ar9003_dump_eeprom,
562562306a36Sopenharmony_ci	.get_eeprom_ver = ath9k_hw_ar9300_get_eeprom_ver,
562662306a36Sopenharmony_ci	.get_eeprom_rev = ath9k_hw_ar9300_get_eeprom_rev,
562762306a36Sopenharmony_ci	.set_board_values = ath9k_hw_ar9300_set_board_values,
562862306a36Sopenharmony_ci	.set_addac = ath9k_hw_ar9300_set_addac,
562962306a36Sopenharmony_ci	.set_txpower = ath9k_hw_ar9300_set_txpower,
563062306a36Sopenharmony_ci	.get_spur_channel = ath9k_hw_ar9300_get_spur_channel,
563162306a36Sopenharmony_ci	.get_eepmisc = ar9003_get_eepmisc
563262306a36Sopenharmony_ci};
5633