18c2ecf20Sopenharmony_ci/*
28c2ecf20Sopenharmony_ci * Copyright (c) 2010-2011 Atheros Communications Inc.
38c2ecf20Sopenharmony_ci *
48c2ecf20Sopenharmony_ci * Permission to use, copy, modify, and/or distribute this software for any
58c2ecf20Sopenharmony_ci * purpose with or without fee is hereby granted, provided that the above
68c2ecf20Sopenharmony_ci * copyright notice and this permission notice appear in all copies.
78c2ecf20Sopenharmony_ci *
88c2ecf20Sopenharmony_ci * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
98c2ecf20Sopenharmony_ci * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
108c2ecf20Sopenharmony_ci * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
118c2ecf20Sopenharmony_ci * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
128c2ecf20Sopenharmony_ci * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
138c2ecf20Sopenharmony_ci * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
148c2ecf20Sopenharmony_ci * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
158c2ecf20Sopenharmony_ci */
168c2ecf20Sopenharmony_ci
178c2ecf20Sopenharmony_ci#include <asm/unaligned.h>
188c2ecf20Sopenharmony_ci#include <linux/kernel.h>
198c2ecf20Sopenharmony_ci#include "hw.h"
208c2ecf20Sopenharmony_ci#include "ar9003_phy.h"
218c2ecf20Sopenharmony_ci#include "ar9003_eeprom.h"
228c2ecf20Sopenharmony_ci#include "ar9003_mci.h"
238c2ecf20Sopenharmony_ci
248c2ecf20Sopenharmony_ci#define COMP_HDR_LEN 4
258c2ecf20Sopenharmony_ci#define COMP_CKSUM_LEN 2
268c2ecf20Sopenharmony_ci
278c2ecf20Sopenharmony_ci#define LE16(x) cpu_to_le16(x)
288c2ecf20Sopenharmony_ci#define LE32(x) cpu_to_le32(x)
298c2ecf20Sopenharmony_ci
308c2ecf20Sopenharmony_ci/* Local defines to distinguish between extension and control CTL's */
318c2ecf20Sopenharmony_ci#define EXT_ADDITIVE (0x8000)
328c2ecf20Sopenharmony_ci#define CTL_11A_EXT (CTL_11A | EXT_ADDITIVE)
338c2ecf20Sopenharmony_ci#define CTL_11G_EXT (CTL_11G | EXT_ADDITIVE)
348c2ecf20Sopenharmony_ci#define CTL_11B_EXT (CTL_11B | EXT_ADDITIVE)
358c2ecf20Sopenharmony_ci
368c2ecf20Sopenharmony_ci#define SUB_NUM_CTL_MODES_AT_5G_40 2    /* excluding HT40, EXT-OFDM */
378c2ecf20Sopenharmony_ci#define SUB_NUM_CTL_MODES_AT_2G_40 3    /* excluding HT40, EXT-OFDM, EXT-CCK */
388c2ecf20Sopenharmony_ci
398c2ecf20Sopenharmony_ci#define CTL(_tpower, _flag) ((_tpower) | ((_flag) << 6))
408c2ecf20Sopenharmony_ci
418c2ecf20Sopenharmony_ci#define EEPROM_DATA_LEN_9485	1088
428c2ecf20Sopenharmony_ci
438c2ecf20Sopenharmony_cistatic int ar9003_hw_power_interpolate(int32_t x,
448c2ecf20Sopenharmony_ci				       int32_t *px, int32_t *py, u_int16_t np);
458c2ecf20Sopenharmony_ci
468c2ecf20Sopenharmony_cistatic const struct ar9300_eeprom ar9300_default = {
478c2ecf20Sopenharmony_ci	.eepromVersion = 2,
488c2ecf20Sopenharmony_ci	.templateVersion = 2,
498c2ecf20Sopenharmony_ci	.macAddr = {0, 2, 3, 4, 5, 6},
508c2ecf20Sopenharmony_ci	.custData = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
518c2ecf20Sopenharmony_ci		     0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
528c2ecf20Sopenharmony_ci	.baseEepHeader = {
538c2ecf20Sopenharmony_ci		.regDmn = { LE16(0), LE16(0x1f) },
548c2ecf20Sopenharmony_ci		.txrxMask =  0x77, /* 4 bits tx and 4 bits rx */
558c2ecf20Sopenharmony_ci		.opCapFlags = {
568c2ecf20Sopenharmony_ci			.opFlags = AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A,
578c2ecf20Sopenharmony_ci			.eepMisc = AR9300_EEPMISC_LITTLE_ENDIAN,
588c2ecf20Sopenharmony_ci		},
598c2ecf20Sopenharmony_ci		.rfSilent = 0,
608c2ecf20Sopenharmony_ci		.blueToothOptions = 0,
618c2ecf20Sopenharmony_ci		.deviceCap = 0,
628c2ecf20Sopenharmony_ci		.deviceType = 5, /* takes lower byte in eeprom location */
638c2ecf20Sopenharmony_ci		.pwrTableOffset = AR9300_PWR_TABLE_OFFSET,
648c2ecf20Sopenharmony_ci		.params_for_tuning_caps = {0, 0},
658c2ecf20Sopenharmony_ci		.featureEnable = 0x0c,
668c2ecf20Sopenharmony_ci		 /*
678c2ecf20Sopenharmony_ci		  * bit0 - enable tx temp comp - disabled
688c2ecf20Sopenharmony_ci		  * bit1 - enable tx volt comp - disabled
698c2ecf20Sopenharmony_ci		  * bit2 - enable fastClock - enabled
708c2ecf20Sopenharmony_ci		  * bit3 - enable doubling - enabled
718c2ecf20Sopenharmony_ci		  * bit4 - enable internal regulator - disabled
728c2ecf20Sopenharmony_ci		  * bit5 - enable pa predistortion - disabled
738c2ecf20Sopenharmony_ci		  */
748c2ecf20Sopenharmony_ci		.miscConfiguration = 0, /* bit0 - turn down drivestrength */
758c2ecf20Sopenharmony_ci		.eepromWriteEnableGpio = 3,
768c2ecf20Sopenharmony_ci		.wlanDisableGpio = 0,
778c2ecf20Sopenharmony_ci		.wlanLedGpio = 8,
788c2ecf20Sopenharmony_ci		.rxBandSelectGpio = 0xff,
798c2ecf20Sopenharmony_ci		.txrxgain = 0,
808c2ecf20Sopenharmony_ci		.swreg = 0,
818c2ecf20Sopenharmony_ci	 },
828c2ecf20Sopenharmony_ci	.modalHeader2G = {
838c2ecf20Sopenharmony_ci	/* ar9300_modal_eep_header  2g */
848c2ecf20Sopenharmony_ci		/* 4 idle,t1,t2,b(4 bits per setting) */
858c2ecf20Sopenharmony_ci		.antCtrlCommon = LE32(0x110),
868c2ecf20Sopenharmony_ci		/* 4 ra1l1, ra2l1, ra1l2, ra2l2, ra12 */
878c2ecf20Sopenharmony_ci		.antCtrlCommon2 = LE32(0x22222),
888c2ecf20Sopenharmony_ci
898c2ecf20Sopenharmony_ci		/*
908c2ecf20Sopenharmony_ci		 * antCtrlChain[AR9300_MAX_CHAINS]; 6 idle, t, r,
918c2ecf20Sopenharmony_ci		 * rx1, rx12, b (2 bits each)
928c2ecf20Sopenharmony_ci		 */
938c2ecf20Sopenharmony_ci		.antCtrlChain = { LE16(0x150), LE16(0x150), LE16(0x150) },
948c2ecf20Sopenharmony_ci
958c2ecf20Sopenharmony_ci		/*
968c2ecf20Sopenharmony_ci		 * xatten1DB[AR9300_MAX_CHAINS];  3 xatten1_db
978c2ecf20Sopenharmony_ci		 * for ar9280 (0xa20c/b20c 5:0)
988c2ecf20Sopenharmony_ci		 */
998c2ecf20Sopenharmony_ci		.xatten1DB = {0, 0, 0},
1008c2ecf20Sopenharmony_ci
1018c2ecf20Sopenharmony_ci		/*
1028c2ecf20Sopenharmony_ci		 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
1038c2ecf20Sopenharmony_ci		 * for ar9280 (0xa20c/b20c 16:12
1048c2ecf20Sopenharmony_ci		 */
1058c2ecf20Sopenharmony_ci		.xatten1Margin = {0, 0, 0},
1068c2ecf20Sopenharmony_ci		.tempSlope = 36,
1078c2ecf20Sopenharmony_ci		.voltSlope = 0,
1088c2ecf20Sopenharmony_ci
1098c2ecf20Sopenharmony_ci		/*
1108c2ecf20Sopenharmony_ci		 * spurChans[OSPREY_EEPROM_MODAL_SPURS]; spur
1118c2ecf20Sopenharmony_ci		 * channels in usual fbin coding format
1128c2ecf20Sopenharmony_ci		 */
1138c2ecf20Sopenharmony_ci		.spurChans = {0, 0, 0, 0, 0},
1148c2ecf20Sopenharmony_ci
1158c2ecf20Sopenharmony_ci		/*
1168c2ecf20Sopenharmony_ci		 * noiseFloorThreshCh[AR9300_MAX_CHAINS]; 3 Check
1178c2ecf20Sopenharmony_ci		 * if the register is per chain
1188c2ecf20Sopenharmony_ci		 */
1198c2ecf20Sopenharmony_ci		.noiseFloorThreshCh = {-1, 0, 0},
1208c2ecf20Sopenharmony_ci		.reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
1218c2ecf20Sopenharmony_ci		.quick_drop = 0,
1228c2ecf20Sopenharmony_ci		.xpaBiasLvl = 0,
1238c2ecf20Sopenharmony_ci		.txFrameToDataStart = 0x0e,
1248c2ecf20Sopenharmony_ci		.txFrameToPaOn = 0x0e,
1258c2ecf20Sopenharmony_ci		.txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
1268c2ecf20Sopenharmony_ci		.antennaGain = 0,
1278c2ecf20Sopenharmony_ci		.switchSettling = 0x2c,
1288c2ecf20Sopenharmony_ci		.adcDesiredSize = -30,
1298c2ecf20Sopenharmony_ci		.txEndToXpaOff = 0,
1308c2ecf20Sopenharmony_ci		.txEndToRxOn = 0x2,
1318c2ecf20Sopenharmony_ci		.txFrameToXpaOn = 0xe,
1328c2ecf20Sopenharmony_ci		.thresh62 = 28,
1338c2ecf20Sopenharmony_ci		.papdRateMaskHt20 = LE32(0x0cf0e0e0),
1348c2ecf20Sopenharmony_ci		.papdRateMaskHt40 = LE32(0x6cf0e0e0),
1358c2ecf20Sopenharmony_ci		.switchcomspdt = 0,
1368c2ecf20Sopenharmony_ci		.xlna_bias_strength = 0,
1378c2ecf20Sopenharmony_ci		.futureModal = {
1388c2ecf20Sopenharmony_ci			0, 0, 0, 0, 0, 0, 0,
1398c2ecf20Sopenharmony_ci		},
1408c2ecf20Sopenharmony_ci	 },
1418c2ecf20Sopenharmony_ci	.base_ext1 = {
1428c2ecf20Sopenharmony_ci		.ant_div_control = 0,
1438c2ecf20Sopenharmony_ci		.future = {0, 0},
1448c2ecf20Sopenharmony_ci		.tempslopextension = {0, 0, 0, 0, 0, 0, 0, 0}
1458c2ecf20Sopenharmony_ci	},
1468c2ecf20Sopenharmony_ci	.calFreqPier2G = {
1478c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
1488c2ecf20Sopenharmony_ci		FREQ2FBIN(2437, 1),
1498c2ecf20Sopenharmony_ci		FREQ2FBIN(2472, 1),
1508c2ecf20Sopenharmony_ci	 },
1518c2ecf20Sopenharmony_ci	/* ar9300_cal_data_per_freq_op_loop 2g */
1528c2ecf20Sopenharmony_ci	.calPierData2G = {
1538c2ecf20Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
1548c2ecf20Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
1558c2ecf20Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
1568c2ecf20Sopenharmony_ci	 },
1578c2ecf20Sopenharmony_ci	.calTarget_freqbin_Cck = {
1588c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
1598c2ecf20Sopenharmony_ci		FREQ2FBIN(2484, 1),
1608c2ecf20Sopenharmony_ci	 },
1618c2ecf20Sopenharmony_ci	.calTarget_freqbin_2G = {
1628c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
1638c2ecf20Sopenharmony_ci		FREQ2FBIN(2437, 1),
1648c2ecf20Sopenharmony_ci		FREQ2FBIN(2472, 1)
1658c2ecf20Sopenharmony_ci	 },
1668c2ecf20Sopenharmony_ci	.calTarget_freqbin_2GHT20 = {
1678c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
1688c2ecf20Sopenharmony_ci		FREQ2FBIN(2437, 1),
1698c2ecf20Sopenharmony_ci		FREQ2FBIN(2472, 1)
1708c2ecf20Sopenharmony_ci	 },
1718c2ecf20Sopenharmony_ci	.calTarget_freqbin_2GHT40 = {
1728c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
1738c2ecf20Sopenharmony_ci		FREQ2FBIN(2437, 1),
1748c2ecf20Sopenharmony_ci		FREQ2FBIN(2472, 1)
1758c2ecf20Sopenharmony_ci	 },
1768c2ecf20Sopenharmony_ci	.calTargetPowerCck = {
1778c2ecf20Sopenharmony_ci		 /* 1L-5L,5S,11L,11S */
1788c2ecf20Sopenharmony_ci		 { {36, 36, 36, 36} },
1798c2ecf20Sopenharmony_ci		 { {36, 36, 36, 36} },
1808c2ecf20Sopenharmony_ci	},
1818c2ecf20Sopenharmony_ci	.calTargetPower2G = {
1828c2ecf20Sopenharmony_ci		 /* 6-24,36,48,54 */
1838c2ecf20Sopenharmony_ci		 { {32, 32, 28, 24} },
1848c2ecf20Sopenharmony_ci		 { {32, 32, 28, 24} },
1858c2ecf20Sopenharmony_ci		 { {32, 32, 28, 24} },
1868c2ecf20Sopenharmony_ci	},
1878c2ecf20Sopenharmony_ci	.calTargetPower2GHT20 = {
1888c2ecf20Sopenharmony_ci		{ {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
1898c2ecf20Sopenharmony_ci		{ {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
1908c2ecf20Sopenharmony_ci		{ {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
1918c2ecf20Sopenharmony_ci	},
1928c2ecf20Sopenharmony_ci	.calTargetPower2GHT40 = {
1938c2ecf20Sopenharmony_ci		{ {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
1948c2ecf20Sopenharmony_ci		{ {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
1958c2ecf20Sopenharmony_ci		{ {32, 32, 32, 32, 28, 20, 32, 32, 28, 20, 32, 32, 28, 20} },
1968c2ecf20Sopenharmony_ci	},
1978c2ecf20Sopenharmony_ci	.ctlIndex_2G =  {
1988c2ecf20Sopenharmony_ci		0x11, 0x12, 0x15, 0x17, 0x41, 0x42,
1998c2ecf20Sopenharmony_ci		0x45, 0x47, 0x31, 0x32, 0x35, 0x37,
2008c2ecf20Sopenharmony_ci	},
2018c2ecf20Sopenharmony_ci	.ctl_freqbin_2G = {
2028c2ecf20Sopenharmony_ci		{
2038c2ecf20Sopenharmony_ci			FREQ2FBIN(2412, 1),
2048c2ecf20Sopenharmony_ci			FREQ2FBIN(2417, 1),
2058c2ecf20Sopenharmony_ci			FREQ2FBIN(2457, 1),
2068c2ecf20Sopenharmony_ci			FREQ2FBIN(2462, 1)
2078c2ecf20Sopenharmony_ci		},
2088c2ecf20Sopenharmony_ci		{
2098c2ecf20Sopenharmony_ci			FREQ2FBIN(2412, 1),
2108c2ecf20Sopenharmony_ci			FREQ2FBIN(2417, 1),
2118c2ecf20Sopenharmony_ci			FREQ2FBIN(2462, 1),
2128c2ecf20Sopenharmony_ci			0xFF,
2138c2ecf20Sopenharmony_ci		},
2148c2ecf20Sopenharmony_ci
2158c2ecf20Sopenharmony_ci		{
2168c2ecf20Sopenharmony_ci			FREQ2FBIN(2412, 1),
2178c2ecf20Sopenharmony_ci			FREQ2FBIN(2417, 1),
2188c2ecf20Sopenharmony_ci			FREQ2FBIN(2462, 1),
2198c2ecf20Sopenharmony_ci			0xFF,
2208c2ecf20Sopenharmony_ci		},
2218c2ecf20Sopenharmony_ci		{
2228c2ecf20Sopenharmony_ci			FREQ2FBIN(2422, 1),
2238c2ecf20Sopenharmony_ci			FREQ2FBIN(2427, 1),
2248c2ecf20Sopenharmony_ci			FREQ2FBIN(2447, 1),
2258c2ecf20Sopenharmony_ci			FREQ2FBIN(2452, 1)
2268c2ecf20Sopenharmony_ci		},
2278c2ecf20Sopenharmony_ci
2288c2ecf20Sopenharmony_ci		{
2298c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
2308c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
2318c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
2328c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(2484, 1),
2338c2ecf20Sopenharmony_ci		},
2348c2ecf20Sopenharmony_ci
2358c2ecf20Sopenharmony_ci		{
2368c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
2378c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
2388c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
2398c2ecf20Sopenharmony_ci			0,
2408c2ecf20Sopenharmony_ci		},
2418c2ecf20Sopenharmony_ci
2428c2ecf20Sopenharmony_ci		{
2438c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
2448c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
2458c2ecf20Sopenharmony_ci			FREQ2FBIN(2472, 1),
2468c2ecf20Sopenharmony_ci			0,
2478c2ecf20Sopenharmony_ci		},
2488c2ecf20Sopenharmony_ci
2498c2ecf20Sopenharmony_ci		{
2508c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
2518c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
2528c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
2538c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
2548c2ecf20Sopenharmony_ci		},
2558c2ecf20Sopenharmony_ci
2568c2ecf20Sopenharmony_ci		{
2578c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
2588c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
2598c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
2608c2ecf20Sopenharmony_ci		},
2618c2ecf20Sopenharmony_ci
2628c2ecf20Sopenharmony_ci		{
2638c2ecf20Sopenharmony_ci			/* Data[9].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
2648c2ecf20Sopenharmony_ci			/* Data[9].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
2658c2ecf20Sopenharmony_ci			/* Data[9].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
2668c2ecf20Sopenharmony_ci			0
2678c2ecf20Sopenharmony_ci		},
2688c2ecf20Sopenharmony_ci
2698c2ecf20Sopenharmony_ci		{
2708c2ecf20Sopenharmony_ci			/* Data[10].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
2718c2ecf20Sopenharmony_ci			/* Data[10].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
2728c2ecf20Sopenharmony_ci			/* Data[10].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
2738c2ecf20Sopenharmony_ci			0
2748c2ecf20Sopenharmony_ci		},
2758c2ecf20Sopenharmony_ci
2768c2ecf20Sopenharmony_ci		{
2778c2ecf20Sopenharmony_ci			/* Data[11].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
2788c2ecf20Sopenharmony_ci			/* Data[11].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
2798c2ecf20Sopenharmony_ci			/* Data[11].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
2808c2ecf20Sopenharmony_ci			/* Data[11].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
2818c2ecf20Sopenharmony_ci		}
2828c2ecf20Sopenharmony_ci	 },
2838c2ecf20Sopenharmony_ci	.ctlPowerData_2G = {
2848c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2858c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2868c2ecf20Sopenharmony_ci		 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } },
2878c2ecf20Sopenharmony_ci
2888c2ecf20Sopenharmony_ci		 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } },
2898c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2908c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2918c2ecf20Sopenharmony_ci
2928c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } },
2938c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2948c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2958c2ecf20Sopenharmony_ci
2968c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
2978c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
2988c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
2998c2ecf20Sopenharmony_ci	 },
3008c2ecf20Sopenharmony_ci	.modalHeader5G = {
3018c2ecf20Sopenharmony_ci		/* 4 idle,t1,t2,b (4 bits per setting) */
3028c2ecf20Sopenharmony_ci		.antCtrlCommon = LE32(0x110),
3038c2ecf20Sopenharmony_ci		/* 4 ra1l1, ra2l1, ra1l2,ra2l2,ra12 */
3048c2ecf20Sopenharmony_ci		.antCtrlCommon2 = LE32(0x22222),
3058c2ecf20Sopenharmony_ci		 /* antCtrlChain 6 idle, t,r,rx1,rx12,b (2 bits each) */
3068c2ecf20Sopenharmony_ci		.antCtrlChain = {
3078c2ecf20Sopenharmony_ci			LE16(0x000), LE16(0x000), LE16(0x000),
3088c2ecf20Sopenharmony_ci		},
3098c2ecf20Sopenharmony_ci		 /* xatten1DB 3 xatten1_db for AR9280 (0xa20c/b20c 5:0) */
3108c2ecf20Sopenharmony_ci		.xatten1DB = {0, 0, 0},
3118c2ecf20Sopenharmony_ci
3128c2ecf20Sopenharmony_ci		/*
3138c2ecf20Sopenharmony_ci		 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
3148c2ecf20Sopenharmony_ci		 * for merlin (0xa20c/b20c 16:12
3158c2ecf20Sopenharmony_ci		 */
3168c2ecf20Sopenharmony_ci		.xatten1Margin = {0, 0, 0},
3178c2ecf20Sopenharmony_ci		.tempSlope = 68,
3188c2ecf20Sopenharmony_ci		.voltSlope = 0,
3198c2ecf20Sopenharmony_ci		/* spurChans spur channels in usual fbin coding format */
3208c2ecf20Sopenharmony_ci		.spurChans = {0, 0, 0, 0, 0},
3218c2ecf20Sopenharmony_ci		/* noiseFloorThreshCh Check if the register is per chain */
3228c2ecf20Sopenharmony_ci		.noiseFloorThreshCh = {-1, 0, 0},
3238c2ecf20Sopenharmony_ci		.reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
3248c2ecf20Sopenharmony_ci		.quick_drop = 0,
3258c2ecf20Sopenharmony_ci		.xpaBiasLvl = 0,
3268c2ecf20Sopenharmony_ci		.txFrameToDataStart = 0x0e,
3278c2ecf20Sopenharmony_ci		.txFrameToPaOn = 0x0e,
3288c2ecf20Sopenharmony_ci		.txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
3298c2ecf20Sopenharmony_ci		.antennaGain = 0,
3308c2ecf20Sopenharmony_ci		.switchSettling = 0x2d,
3318c2ecf20Sopenharmony_ci		.adcDesiredSize = -30,
3328c2ecf20Sopenharmony_ci		.txEndToXpaOff = 0,
3338c2ecf20Sopenharmony_ci		.txEndToRxOn = 0x2,
3348c2ecf20Sopenharmony_ci		.txFrameToXpaOn = 0xe,
3358c2ecf20Sopenharmony_ci		.thresh62 = 28,
3368c2ecf20Sopenharmony_ci		.papdRateMaskHt20 = LE32(0x0c80c080),
3378c2ecf20Sopenharmony_ci		.papdRateMaskHt40 = LE32(0x0080c080),
3388c2ecf20Sopenharmony_ci		.switchcomspdt = 0,
3398c2ecf20Sopenharmony_ci		.xlna_bias_strength = 0,
3408c2ecf20Sopenharmony_ci		.futureModal = {
3418c2ecf20Sopenharmony_ci			0, 0, 0, 0, 0, 0, 0,
3428c2ecf20Sopenharmony_ci		},
3438c2ecf20Sopenharmony_ci	 },
3448c2ecf20Sopenharmony_ci	.base_ext2 = {
3458c2ecf20Sopenharmony_ci		.tempSlopeLow = 0,
3468c2ecf20Sopenharmony_ci		.tempSlopeHigh = 0,
3478c2ecf20Sopenharmony_ci		.xatten1DBLow = {0, 0, 0},
3488c2ecf20Sopenharmony_ci		.xatten1MarginLow = {0, 0, 0},
3498c2ecf20Sopenharmony_ci		.xatten1DBHigh = {0, 0, 0},
3508c2ecf20Sopenharmony_ci		.xatten1MarginHigh = {0, 0, 0}
3518c2ecf20Sopenharmony_ci	},
3528c2ecf20Sopenharmony_ci	.calFreqPier5G = {
3538c2ecf20Sopenharmony_ci		FREQ2FBIN(5180, 0),
3548c2ecf20Sopenharmony_ci		FREQ2FBIN(5220, 0),
3558c2ecf20Sopenharmony_ci		FREQ2FBIN(5320, 0),
3568c2ecf20Sopenharmony_ci		FREQ2FBIN(5400, 0),
3578c2ecf20Sopenharmony_ci		FREQ2FBIN(5500, 0),
3588c2ecf20Sopenharmony_ci		FREQ2FBIN(5600, 0),
3598c2ecf20Sopenharmony_ci		FREQ2FBIN(5725, 0),
3608c2ecf20Sopenharmony_ci		FREQ2FBIN(5825, 0)
3618c2ecf20Sopenharmony_ci	},
3628c2ecf20Sopenharmony_ci	.calPierData5G = {
3638c2ecf20Sopenharmony_ci			{
3648c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3658c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3668c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3678c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3688c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3698c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3708c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3718c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3728c2ecf20Sopenharmony_ci			},
3738c2ecf20Sopenharmony_ci			{
3748c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3758c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3768c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3778c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3788c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3798c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3808c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3818c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3828c2ecf20Sopenharmony_ci			},
3838c2ecf20Sopenharmony_ci			{
3848c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3858c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3868c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3878c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3888c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3898c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3908c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3918c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
3928c2ecf20Sopenharmony_ci			},
3938c2ecf20Sopenharmony_ci
3948c2ecf20Sopenharmony_ci	},
3958c2ecf20Sopenharmony_ci	.calTarget_freqbin_5G = {
3968c2ecf20Sopenharmony_ci		FREQ2FBIN(5180, 0),
3978c2ecf20Sopenharmony_ci		FREQ2FBIN(5220, 0),
3988c2ecf20Sopenharmony_ci		FREQ2FBIN(5320, 0),
3998c2ecf20Sopenharmony_ci		FREQ2FBIN(5400, 0),
4008c2ecf20Sopenharmony_ci		FREQ2FBIN(5500, 0),
4018c2ecf20Sopenharmony_ci		FREQ2FBIN(5600, 0),
4028c2ecf20Sopenharmony_ci		FREQ2FBIN(5725, 0),
4038c2ecf20Sopenharmony_ci		FREQ2FBIN(5825, 0)
4048c2ecf20Sopenharmony_ci	},
4058c2ecf20Sopenharmony_ci	.calTarget_freqbin_5GHT20 = {
4068c2ecf20Sopenharmony_ci		FREQ2FBIN(5180, 0),
4078c2ecf20Sopenharmony_ci		FREQ2FBIN(5240, 0),
4088c2ecf20Sopenharmony_ci		FREQ2FBIN(5320, 0),
4098c2ecf20Sopenharmony_ci		FREQ2FBIN(5500, 0),
4108c2ecf20Sopenharmony_ci		FREQ2FBIN(5700, 0),
4118c2ecf20Sopenharmony_ci		FREQ2FBIN(5745, 0),
4128c2ecf20Sopenharmony_ci		FREQ2FBIN(5725, 0),
4138c2ecf20Sopenharmony_ci		FREQ2FBIN(5825, 0)
4148c2ecf20Sopenharmony_ci	},
4158c2ecf20Sopenharmony_ci	.calTarget_freqbin_5GHT40 = {
4168c2ecf20Sopenharmony_ci		FREQ2FBIN(5180, 0),
4178c2ecf20Sopenharmony_ci		FREQ2FBIN(5240, 0),
4188c2ecf20Sopenharmony_ci		FREQ2FBIN(5320, 0),
4198c2ecf20Sopenharmony_ci		FREQ2FBIN(5500, 0),
4208c2ecf20Sopenharmony_ci		FREQ2FBIN(5700, 0),
4218c2ecf20Sopenharmony_ci		FREQ2FBIN(5745, 0),
4228c2ecf20Sopenharmony_ci		FREQ2FBIN(5725, 0),
4238c2ecf20Sopenharmony_ci		FREQ2FBIN(5825, 0)
4248c2ecf20Sopenharmony_ci	 },
4258c2ecf20Sopenharmony_ci	.calTargetPower5G = {
4268c2ecf20Sopenharmony_ci		/* 6-24,36,48,54 */
4278c2ecf20Sopenharmony_ci		{ {20, 20, 20, 10} },
4288c2ecf20Sopenharmony_ci		{ {20, 20, 20, 10} },
4298c2ecf20Sopenharmony_ci		{ {20, 20, 20, 10} },
4308c2ecf20Sopenharmony_ci		{ {20, 20, 20, 10} },
4318c2ecf20Sopenharmony_ci		{ {20, 20, 20, 10} },
4328c2ecf20Sopenharmony_ci		{ {20, 20, 20, 10} },
4338c2ecf20Sopenharmony_ci		{ {20, 20, 20, 10} },
4348c2ecf20Sopenharmony_ci		{ {20, 20, 20, 10} },
4358c2ecf20Sopenharmony_ci	 },
4368c2ecf20Sopenharmony_ci	.calTargetPower5GHT20 = {
4378c2ecf20Sopenharmony_ci		/*
4388c2ecf20Sopenharmony_ci		 * 0_8_16,1-3_9-11_17-19,
4398c2ecf20Sopenharmony_ci		 * 4,5,6,7,12,13,14,15,20,21,22,23
4408c2ecf20Sopenharmony_ci		 */
4418c2ecf20Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
4428c2ecf20Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
4438c2ecf20Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
4448c2ecf20Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
4458c2ecf20Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
4468c2ecf20Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
4478c2ecf20Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
4488c2ecf20Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
4498c2ecf20Sopenharmony_ci	 },
4508c2ecf20Sopenharmony_ci	.calTargetPower5GHT40 =  {
4518c2ecf20Sopenharmony_ci		/*
4528c2ecf20Sopenharmony_ci		 * 0_8_16,1-3_9-11_17-19,
4538c2ecf20Sopenharmony_ci		 * 4,5,6,7,12,13,14,15,20,21,22,23
4548c2ecf20Sopenharmony_ci		 */
4558c2ecf20Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
4568c2ecf20Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
4578c2ecf20Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
4588c2ecf20Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
4598c2ecf20Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
4608c2ecf20Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
4618c2ecf20Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
4628c2ecf20Sopenharmony_ci		{ {20, 20, 10, 10, 0, 0, 10, 10, 0, 0, 10, 10, 0, 0} },
4638c2ecf20Sopenharmony_ci	 },
4648c2ecf20Sopenharmony_ci	.ctlIndex_5G =  {
4658c2ecf20Sopenharmony_ci		0x10, 0x16, 0x18, 0x40, 0x46,
4668c2ecf20Sopenharmony_ci		0x48, 0x30, 0x36, 0x38
4678c2ecf20Sopenharmony_ci	},
4688c2ecf20Sopenharmony_ci	.ctl_freqbin_5G =  {
4698c2ecf20Sopenharmony_ci		{
4708c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
4718c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
4728c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
4738c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
4748c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[4].bChannel */ FREQ2FBIN(5600, 0),
4758c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
4768c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
4778c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
4788c2ecf20Sopenharmony_ci		},
4798c2ecf20Sopenharmony_ci		{
4808c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
4818c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
4828c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
4838c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
4848c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[4].bChannel */ FREQ2FBIN(5520, 0),
4858c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
4868c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
4878c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
4888c2ecf20Sopenharmony_ci		},
4898c2ecf20Sopenharmony_ci
4908c2ecf20Sopenharmony_ci		{
4918c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
4928c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
4938c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
4948c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[3].bChannel */ FREQ2FBIN(5310, 0),
4958c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[4].bChannel */ FREQ2FBIN(5510, 0),
4968c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[5].bChannel */ FREQ2FBIN(5550, 0),
4978c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[6].bChannel */ FREQ2FBIN(5670, 0),
4988c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[7].bChannel */ FREQ2FBIN(5755, 0)
4998c2ecf20Sopenharmony_ci		},
5008c2ecf20Sopenharmony_ci
5018c2ecf20Sopenharmony_ci		{
5028c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
5038c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
5048c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[2].bChannel */ FREQ2FBIN(5260, 0),
5058c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[3].bChannel */ FREQ2FBIN(5320, 0),
5068c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
5078c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
5088c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[6].bChannel */ 0xFF,
5098c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[7].bChannel */ 0xFF,
5108c2ecf20Sopenharmony_ci		},
5118c2ecf20Sopenharmony_ci
5128c2ecf20Sopenharmony_ci		{
5138c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
5148c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
5158c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(5500, 0),
5168c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(5700, 0),
5178c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[4].bChannel */ 0xFF,
5188c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[5].bChannel */ 0xFF,
5198c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[6].bChannel */ 0xFF,
5208c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[7].bChannel */ 0xFF,
5218c2ecf20Sopenharmony_ci		},
5228c2ecf20Sopenharmony_ci
5238c2ecf20Sopenharmony_ci		{
5248c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
5258c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(5270, 0),
5268c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(5310, 0),
5278c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
5288c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[4].bChannel */ FREQ2FBIN(5590, 0),
5298c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
5308c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[6].bChannel */ 0xFF,
5318c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[7].bChannel */ 0xFF
5328c2ecf20Sopenharmony_ci		},
5338c2ecf20Sopenharmony_ci
5348c2ecf20Sopenharmony_ci		{
5358c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
5368c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
5378c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[2].bChannel */ FREQ2FBIN(5220, 0),
5388c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[3].bChannel */ FREQ2FBIN(5260, 0),
5398c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
5408c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[5].bChannel */ FREQ2FBIN(5600, 0),
5418c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[6].bChannel */ FREQ2FBIN(5700, 0),
5428c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[7].bChannel */ FREQ2FBIN(5745, 0)
5438c2ecf20Sopenharmony_ci		},
5448c2ecf20Sopenharmony_ci
5458c2ecf20Sopenharmony_ci		{
5468c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
5478c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
5488c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(5320, 0),
5498c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
5508c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[4].bChannel */ FREQ2FBIN(5560, 0),
5518c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
5528c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
5538c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
5548c2ecf20Sopenharmony_ci		},
5558c2ecf20Sopenharmony_ci
5568c2ecf20Sopenharmony_ci		{
5578c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
5588c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
5598c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
5608c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
5618c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[4].bChannel */ FREQ2FBIN(5550, 0),
5628c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
5638c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[6].bChannel */ FREQ2FBIN(5755, 0),
5648c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[7].bChannel */ FREQ2FBIN(5795, 0)
5658c2ecf20Sopenharmony_ci		}
5668c2ecf20Sopenharmony_ci	 },
5678c2ecf20Sopenharmony_ci	.ctlPowerData_5G = {
5688c2ecf20Sopenharmony_ci		{
5698c2ecf20Sopenharmony_ci			{
5708c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
5718c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
5728c2ecf20Sopenharmony_ci			}
5738c2ecf20Sopenharmony_ci		},
5748c2ecf20Sopenharmony_ci		{
5758c2ecf20Sopenharmony_ci			{
5768c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
5778c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
5788c2ecf20Sopenharmony_ci			}
5798c2ecf20Sopenharmony_ci		},
5808c2ecf20Sopenharmony_ci		{
5818c2ecf20Sopenharmony_ci			{
5828c2ecf20Sopenharmony_ci				CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 1),
5838c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
5848c2ecf20Sopenharmony_ci			}
5858c2ecf20Sopenharmony_ci		},
5868c2ecf20Sopenharmony_ci		{
5878c2ecf20Sopenharmony_ci			{
5888c2ecf20Sopenharmony_ci				CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0),
5898c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
5908c2ecf20Sopenharmony_ci			}
5918c2ecf20Sopenharmony_ci		},
5928c2ecf20Sopenharmony_ci		{
5938c2ecf20Sopenharmony_ci			{
5948c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
5958c2ecf20Sopenharmony_ci				CTL(60, 0), CTL(60, 0), CTL(60, 0), CTL(60, 0),
5968c2ecf20Sopenharmony_ci			}
5978c2ecf20Sopenharmony_ci		},
5988c2ecf20Sopenharmony_ci		{
5998c2ecf20Sopenharmony_ci			{
6008c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
6018c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
6028c2ecf20Sopenharmony_ci			}
6038c2ecf20Sopenharmony_ci		},
6048c2ecf20Sopenharmony_ci		{
6058c2ecf20Sopenharmony_ci			{
6068c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
6078c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
6088c2ecf20Sopenharmony_ci			}
6098c2ecf20Sopenharmony_ci		},
6108c2ecf20Sopenharmony_ci		{
6118c2ecf20Sopenharmony_ci			{
6128c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
6138c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
6148c2ecf20Sopenharmony_ci			}
6158c2ecf20Sopenharmony_ci		},
6168c2ecf20Sopenharmony_ci		{
6178c2ecf20Sopenharmony_ci			{
6188c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 1), CTL(60, 1),
6198c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
6208c2ecf20Sopenharmony_ci			}
6218c2ecf20Sopenharmony_ci		},
6228c2ecf20Sopenharmony_ci	 }
6238c2ecf20Sopenharmony_ci};
6248c2ecf20Sopenharmony_ci
6258c2ecf20Sopenharmony_cistatic const struct ar9300_eeprom ar9300_x113 = {
6268c2ecf20Sopenharmony_ci	.eepromVersion = 2,
6278c2ecf20Sopenharmony_ci	.templateVersion = 6,
6288c2ecf20Sopenharmony_ci	.macAddr = {0x00, 0x03, 0x7f, 0x0, 0x0, 0x0},
6298c2ecf20Sopenharmony_ci	.custData = {"x113-023-f0000"},
6308c2ecf20Sopenharmony_ci	.baseEepHeader = {
6318c2ecf20Sopenharmony_ci		.regDmn = { LE16(0), LE16(0x1f) },
6328c2ecf20Sopenharmony_ci		.txrxMask =  0x77, /* 4 bits tx and 4 bits rx */
6338c2ecf20Sopenharmony_ci		.opCapFlags = {
6348c2ecf20Sopenharmony_ci			.opFlags = AR5416_OPFLAGS_11A,
6358c2ecf20Sopenharmony_ci			.eepMisc = AR9300_EEPMISC_LITTLE_ENDIAN,
6368c2ecf20Sopenharmony_ci		},
6378c2ecf20Sopenharmony_ci		.rfSilent = 0,
6388c2ecf20Sopenharmony_ci		.blueToothOptions = 0,
6398c2ecf20Sopenharmony_ci		.deviceCap = 0,
6408c2ecf20Sopenharmony_ci		.deviceType = 5, /* takes lower byte in eeprom location */
6418c2ecf20Sopenharmony_ci		.pwrTableOffset = AR9300_PWR_TABLE_OFFSET,
6428c2ecf20Sopenharmony_ci		.params_for_tuning_caps = {0, 0},
6438c2ecf20Sopenharmony_ci		.featureEnable = 0x0d,
6448c2ecf20Sopenharmony_ci		 /*
6458c2ecf20Sopenharmony_ci		  * bit0 - enable tx temp comp - disabled
6468c2ecf20Sopenharmony_ci		  * bit1 - enable tx volt comp - disabled
6478c2ecf20Sopenharmony_ci		  * bit2 - enable fastClock - enabled
6488c2ecf20Sopenharmony_ci		  * bit3 - enable doubling - enabled
6498c2ecf20Sopenharmony_ci		  * bit4 - enable internal regulator - disabled
6508c2ecf20Sopenharmony_ci		  * bit5 - enable pa predistortion - disabled
6518c2ecf20Sopenharmony_ci		  */
6528c2ecf20Sopenharmony_ci		.miscConfiguration = 0, /* bit0 - turn down drivestrength */
6538c2ecf20Sopenharmony_ci		.eepromWriteEnableGpio = 6,
6548c2ecf20Sopenharmony_ci		.wlanDisableGpio = 0,
6558c2ecf20Sopenharmony_ci		.wlanLedGpio = 8,
6568c2ecf20Sopenharmony_ci		.rxBandSelectGpio = 0xff,
6578c2ecf20Sopenharmony_ci		.txrxgain = 0x21,
6588c2ecf20Sopenharmony_ci		.swreg = 0,
6598c2ecf20Sopenharmony_ci	 },
6608c2ecf20Sopenharmony_ci	.modalHeader2G = {
6618c2ecf20Sopenharmony_ci	/* ar9300_modal_eep_header  2g */
6628c2ecf20Sopenharmony_ci		/* 4 idle,t1,t2,b(4 bits per setting) */
6638c2ecf20Sopenharmony_ci		.antCtrlCommon = LE32(0x110),
6648c2ecf20Sopenharmony_ci		/* 4 ra1l1, ra2l1, ra1l2, ra2l2, ra12 */
6658c2ecf20Sopenharmony_ci		.antCtrlCommon2 = LE32(0x44444),
6668c2ecf20Sopenharmony_ci
6678c2ecf20Sopenharmony_ci		/*
6688c2ecf20Sopenharmony_ci		 * antCtrlChain[AR9300_MAX_CHAINS]; 6 idle, t, r,
6698c2ecf20Sopenharmony_ci		 * rx1, rx12, b (2 bits each)
6708c2ecf20Sopenharmony_ci		 */
6718c2ecf20Sopenharmony_ci		.antCtrlChain = { LE16(0x150), LE16(0x150), LE16(0x150) },
6728c2ecf20Sopenharmony_ci
6738c2ecf20Sopenharmony_ci		/*
6748c2ecf20Sopenharmony_ci		 * xatten1DB[AR9300_MAX_CHAINS];  3 xatten1_db
6758c2ecf20Sopenharmony_ci		 * for ar9280 (0xa20c/b20c 5:0)
6768c2ecf20Sopenharmony_ci		 */
6778c2ecf20Sopenharmony_ci		.xatten1DB = {0, 0, 0},
6788c2ecf20Sopenharmony_ci
6798c2ecf20Sopenharmony_ci		/*
6808c2ecf20Sopenharmony_ci		 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
6818c2ecf20Sopenharmony_ci		 * for ar9280 (0xa20c/b20c 16:12
6828c2ecf20Sopenharmony_ci		 */
6838c2ecf20Sopenharmony_ci		.xatten1Margin = {0, 0, 0},
6848c2ecf20Sopenharmony_ci		.tempSlope = 25,
6858c2ecf20Sopenharmony_ci		.voltSlope = 0,
6868c2ecf20Sopenharmony_ci
6878c2ecf20Sopenharmony_ci		/*
6888c2ecf20Sopenharmony_ci		 * spurChans[OSPREY_EEPROM_MODAL_SPURS]; spur
6898c2ecf20Sopenharmony_ci		 * channels in usual fbin coding format
6908c2ecf20Sopenharmony_ci		 */
6918c2ecf20Sopenharmony_ci		.spurChans = {FREQ2FBIN(2464, 1), 0, 0, 0, 0},
6928c2ecf20Sopenharmony_ci
6938c2ecf20Sopenharmony_ci		/*
6948c2ecf20Sopenharmony_ci		 * noiseFloorThreshCh[AR9300_MAX_CHAINS]; 3 Check
6958c2ecf20Sopenharmony_ci		 * if the register is per chain
6968c2ecf20Sopenharmony_ci		 */
6978c2ecf20Sopenharmony_ci		.noiseFloorThreshCh = {-1, 0, 0},
6988c2ecf20Sopenharmony_ci		.reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
6998c2ecf20Sopenharmony_ci		.quick_drop = 0,
7008c2ecf20Sopenharmony_ci		.xpaBiasLvl = 0,
7018c2ecf20Sopenharmony_ci		.txFrameToDataStart = 0x0e,
7028c2ecf20Sopenharmony_ci		.txFrameToPaOn = 0x0e,
7038c2ecf20Sopenharmony_ci		.txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
7048c2ecf20Sopenharmony_ci		.antennaGain = 0,
7058c2ecf20Sopenharmony_ci		.switchSettling = 0x2c,
7068c2ecf20Sopenharmony_ci		.adcDesiredSize = -30,
7078c2ecf20Sopenharmony_ci		.txEndToXpaOff = 0,
7088c2ecf20Sopenharmony_ci		.txEndToRxOn = 0x2,
7098c2ecf20Sopenharmony_ci		.txFrameToXpaOn = 0xe,
7108c2ecf20Sopenharmony_ci		.thresh62 = 28,
7118c2ecf20Sopenharmony_ci		.papdRateMaskHt20 = LE32(0x0c80c080),
7128c2ecf20Sopenharmony_ci		.papdRateMaskHt40 = LE32(0x0080c080),
7138c2ecf20Sopenharmony_ci		.switchcomspdt = 0,
7148c2ecf20Sopenharmony_ci		.xlna_bias_strength = 0,
7158c2ecf20Sopenharmony_ci		.futureModal = {
7168c2ecf20Sopenharmony_ci			0, 0, 0, 0, 0, 0, 0,
7178c2ecf20Sopenharmony_ci		},
7188c2ecf20Sopenharmony_ci	 },
7198c2ecf20Sopenharmony_ci	 .base_ext1 = {
7208c2ecf20Sopenharmony_ci		.ant_div_control = 0,
7218c2ecf20Sopenharmony_ci		.future = {0, 0},
7228c2ecf20Sopenharmony_ci		.tempslopextension = {0, 0, 0, 0, 0, 0, 0, 0}
7238c2ecf20Sopenharmony_ci	 },
7248c2ecf20Sopenharmony_ci	.calFreqPier2G = {
7258c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
7268c2ecf20Sopenharmony_ci		FREQ2FBIN(2437, 1),
7278c2ecf20Sopenharmony_ci		FREQ2FBIN(2472, 1),
7288c2ecf20Sopenharmony_ci	 },
7298c2ecf20Sopenharmony_ci	/* ar9300_cal_data_per_freq_op_loop 2g */
7308c2ecf20Sopenharmony_ci	.calPierData2G = {
7318c2ecf20Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
7328c2ecf20Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
7338c2ecf20Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
7348c2ecf20Sopenharmony_ci	 },
7358c2ecf20Sopenharmony_ci	.calTarget_freqbin_Cck = {
7368c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
7378c2ecf20Sopenharmony_ci		FREQ2FBIN(2472, 1),
7388c2ecf20Sopenharmony_ci	 },
7398c2ecf20Sopenharmony_ci	.calTarget_freqbin_2G = {
7408c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
7418c2ecf20Sopenharmony_ci		FREQ2FBIN(2437, 1),
7428c2ecf20Sopenharmony_ci		FREQ2FBIN(2472, 1)
7438c2ecf20Sopenharmony_ci	 },
7448c2ecf20Sopenharmony_ci	.calTarget_freqbin_2GHT20 = {
7458c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
7468c2ecf20Sopenharmony_ci		FREQ2FBIN(2437, 1),
7478c2ecf20Sopenharmony_ci		FREQ2FBIN(2472, 1)
7488c2ecf20Sopenharmony_ci	 },
7498c2ecf20Sopenharmony_ci	.calTarget_freqbin_2GHT40 = {
7508c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
7518c2ecf20Sopenharmony_ci		FREQ2FBIN(2437, 1),
7528c2ecf20Sopenharmony_ci		FREQ2FBIN(2472, 1)
7538c2ecf20Sopenharmony_ci	 },
7548c2ecf20Sopenharmony_ci	.calTargetPowerCck = {
7558c2ecf20Sopenharmony_ci		 /* 1L-5L,5S,11L,11S */
7568c2ecf20Sopenharmony_ci		 { {34, 34, 34, 34} },
7578c2ecf20Sopenharmony_ci		 { {34, 34, 34, 34} },
7588c2ecf20Sopenharmony_ci	},
7598c2ecf20Sopenharmony_ci	.calTargetPower2G = {
7608c2ecf20Sopenharmony_ci		 /* 6-24,36,48,54 */
7618c2ecf20Sopenharmony_ci		 { {34, 34, 32, 32} },
7628c2ecf20Sopenharmony_ci		 { {34, 34, 32, 32} },
7638c2ecf20Sopenharmony_ci		 { {34, 34, 32, 32} },
7648c2ecf20Sopenharmony_ci	},
7658c2ecf20Sopenharmony_ci	.calTargetPower2GHT20 = {
7668c2ecf20Sopenharmony_ci		{ {32, 32, 32, 32, 32, 28, 32, 32, 30, 28, 0, 0, 0, 0} },
7678c2ecf20Sopenharmony_ci		{ {32, 32, 32, 32, 32, 28, 32, 32, 30, 28, 0, 0, 0, 0} },
7688c2ecf20Sopenharmony_ci		{ {32, 32, 32, 32, 32, 28, 32, 32, 30, 28, 0, 0, 0, 0} },
7698c2ecf20Sopenharmony_ci	},
7708c2ecf20Sopenharmony_ci	.calTargetPower2GHT40 = {
7718c2ecf20Sopenharmony_ci		{ {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 0, 0, 0, 0} },
7728c2ecf20Sopenharmony_ci		{ {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 0, 0, 0, 0} },
7738c2ecf20Sopenharmony_ci		{ {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 0, 0, 0, 0} },
7748c2ecf20Sopenharmony_ci	},
7758c2ecf20Sopenharmony_ci	.ctlIndex_2G =  {
7768c2ecf20Sopenharmony_ci		0x11, 0x12, 0x15, 0x17, 0x41, 0x42,
7778c2ecf20Sopenharmony_ci		0x45, 0x47, 0x31, 0x32, 0x35, 0x37,
7788c2ecf20Sopenharmony_ci	},
7798c2ecf20Sopenharmony_ci	.ctl_freqbin_2G = {
7808c2ecf20Sopenharmony_ci		{
7818c2ecf20Sopenharmony_ci			FREQ2FBIN(2412, 1),
7828c2ecf20Sopenharmony_ci			FREQ2FBIN(2417, 1),
7838c2ecf20Sopenharmony_ci			FREQ2FBIN(2457, 1),
7848c2ecf20Sopenharmony_ci			FREQ2FBIN(2462, 1)
7858c2ecf20Sopenharmony_ci		},
7868c2ecf20Sopenharmony_ci		{
7878c2ecf20Sopenharmony_ci			FREQ2FBIN(2412, 1),
7888c2ecf20Sopenharmony_ci			FREQ2FBIN(2417, 1),
7898c2ecf20Sopenharmony_ci			FREQ2FBIN(2462, 1),
7908c2ecf20Sopenharmony_ci			0xFF,
7918c2ecf20Sopenharmony_ci		},
7928c2ecf20Sopenharmony_ci
7938c2ecf20Sopenharmony_ci		{
7948c2ecf20Sopenharmony_ci			FREQ2FBIN(2412, 1),
7958c2ecf20Sopenharmony_ci			FREQ2FBIN(2417, 1),
7968c2ecf20Sopenharmony_ci			FREQ2FBIN(2462, 1),
7978c2ecf20Sopenharmony_ci			0xFF,
7988c2ecf20Sopenharmony_ci		},
7998c2ecf20Sopenharmony_ci		{
8008c2ecf20Sopenharmony_ci			FREQ2FBIN(2422, 1),
8018c2ecf20Sopenharmony_ci			FREQ2FBIN(2427, 1),
8028c2ecf20Sopenharmony_ci			FREQ2FBIN(2447, 1),
8038c2ecf20Sopenharmony_ci			FREQ2FBIN(2452, 1)
8048c2ecf20Sopenharmony_ci		},
8058c2ecf20Sopenharmony_ci
8068c2ecf20Sopenharmony_ci		{
8078c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
8088c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
8098c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
8108c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(2484, 1),
8118c2ecf20Sopenharmony_ci		},
8128c2ecf20Sopenharmony_ci
8138c2ecf20Sopenharmony_ci		{
8148c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
8158c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
8168c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
8178c2ecf20Sopenharmony_ci			0,
8188c2ecf20Sopenharmony_ci		},
8198c2ecf20Sopenharmony_ci
8208c2ecf20Sopenharmony_ci		{
8218c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
8228c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
8238c2ecf20Sopenharmony_ci			FREQ2FBIN(2472, 1),
8248c2ecf20Sopenharmony_ci			0,
8258c2ecf20Sopenharmony_ci		},
8268c2ecf20Sopenharmony_ci
8278c2ecf20Sopenharmony_ci		{
8288c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
8298c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
8308c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
8318c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
8328c2ecf20Sopenharmony_ci		},
8338c2ecf20Sopenharmony_ci
8348c2ecf20Sopenharmony_ci		{
8358c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
8368c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
8378c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
8388c2ecf20Sopenharmony_ci		},
8398c2ecf20Sopenharmony_ci
8408c2ecf20Sopenharmony_ci		{
8418c2ecf20Sopenharmony_ci			/* Data[9].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
8428c2ecf20Sopenharmony_ci			/* Data[9].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
8438c2ecf20Sopenharmony_ci			/* Data[9].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
8448c2ecf20Sopenharmony_ci			0
8458c2ecf20Sopenharmony_ci		},
8468c2ecf20Sopenharmony_ci
8478c2ecf20Sopenharmony_ci		{
8488c2ecf20Sopenharmony_ci			/* Data[10].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
8498c2ecf20Sopenharmony_ci			/* Data[10].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
8508c2ecf20Sopenharmony_ci			/* Data[10].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
8518c2ecf20Sopenharmony_ci			0
8528c2ecf20Sopenharmony_ci		},
8538c2ecf20Sopenharmony_ci
8548c2ecf20Sopenharmony_ci		{
8558c2ecf20Sopenharmony_ci			/* Data[11].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
8568c2ecf20Sopenharmony_ci			/* Data[11].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
8578c2ecf20Sopenharmony_ci			/* Data[11].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
8588c2ecf20Sopenharmony_ci			/* Data[11].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
8598c2ecf20Sopenharmony_ci		}
8608c2ecf20Sopenharmony_ci	 },
8618c2ecf20Sopenharmony_ci	.ctlPowerData_2G = {
8628c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
8638c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
8648c2ecf20Sopenharmony_ci		 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } },
8658c2ecf20Sopenharmony_ci
8668c2ecf20Sopenharmony_ci		 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } },
8678c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
8688c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
8698c2ecf20Sopenharmony_ci
8708c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } },
8718c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
8728c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
8738c2ecf20Sopenharmony_ci
8748c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
8758c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
8768c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
8778c2ecf20Sopenharmony_ci	 },
8788c2ecf20Sopenharmony_ci	.modalHeader5G = {
8798c2ecf20Sopenharmony_ci		/* 4 idle,t1,t2,b (4 bits per setting) */
8808c2ecf20Sopenharmony_ci		.antCtrlCommon = LE32(0x220),
8818c2ecf20Sopenharmony_ci		/* 4 ra1l1, ra2l1, ra1l2,ra2l2,ra12 */
8828c2ecf20Sopenharmony_ci		.antCtrlCommon2 = LE32(0x11111),
8838c2ecf20Sopenharmony_ci		 /* antCtrlChain 6 idle, t,r,rx1,rx12,b (2 bits each) */
8848c2ecf20Sopenharmony_ci		.antCtrlChain = {
8858c2ecf20Sopenharmony_ci			LE16(0x150), LE16(0x150), LE16(0x150),
8868c2ecf20Sopenharmony_ci		},
8878c2ecf20Sopenharmony_ci		 /* xatten1DB 3 xatten1_db for AR9280 (0xa20c/b20c 5:0) */
8888c2ecf20Sopenharmony_ci		.xatten1DB = {0, 0, 0},
8898c2ecf20Sopenharmony_ci
8908c2ecf20Sopenharmony_ci		/*
8918c2ecf20Sopenharmony_ci		 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
8928c2ecf20Sopenharmony_ci		 * for merlin (0xa20c/b20c 16:12
8938c2ecf20Sopenharmony_ci		 */
8948c2ecf20Sopenharmony_ci		.xatten1Margin = {0, 0, 0},
8958c2ecf20Sopenharmony_ci		.tempSlope = 68,
8968c2ecf20Sopenharmony_ci		.voltSlope = 0,
8978c2ecf20Sopenharmony_ci		/* spurChans spur channels in usual fbin coding format */
8988c2ecf20Sopenharmony_ci		.spurChans = {FREQ2FBIN(5500, 0), 0, 0, 0, 0},
8998c2ecf20Sopenharmony_ci		/* noiseFloorThreshCh Check if the register is per chain */
9008c2ecf20Sopenharmony_ci		.noiseFloorThreshCh = {-1, 0, 0},
9018c2ecf20Sopenharmony_ci		.reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
9028c2ecf20Sopenharmony_ci		.quick_drop = 0,
9038c2ecf20Sopenharmony_ci		.xpaBiasLvl = 0xf,
9048c2ecf20Sopenharmony_ci		.txFrameToDataStart = 0x0e,
9058c2ecf20Sopenharmony_ci		.txFrameToPaOn = 0x0e,
9068c2ecf20Sopenharmony_ci		.txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
9078c2ecf20Sopenharmony_ci		.antennaGain = 0,
9088c2ecf20Sopenharmony_ci		.switchSettling = 0x2d,
9098c2ecf20Sopenharmony_ci		.adcDesiredSize = -30,
9108c2ecf20Sopenharmony_ci		.txEndToXpaOff = 0,
9118c2ecf20Sopenharmony_ci		.txEndToRxOn = 0x2,
9128c2ecf20Sopenharmony_ci		.txFrameToXpaOn = 0xe,
9138c2ecf20Sopenharmony_ci		.thresh62 = 28,
9148c2ecf20Sopenharmony_ci		.papdRateMaskHt20 = LE32(0x0cf0e0e0),
9158c2ecf20Sopenharmony_ci		.papdRateMaskHt40 = LE32(0x6cf0e0e0),
9168c2ecf20Sopenharmony_ci		.switchcomspdt = 0,
9178c2ecf20Sopenharmony_ci		.xlna_bias_strength = 0,
9188c2ecf20Sopenharmony_ci		.futureModal = {
9198c2ecf20Sopenharmony_ci			0, 0, 0, 0, 0, 0, 0,
9208c2ecf20Sopenharmony_ci		},
9218c2ecf20Sopenharmony_ci	 },
9228c2ecf20Sopenharmony_ci	.base_ext2 = {
9238c2ecf20Sopenharmony_ci		.tempSlopeLow = 72,
9248c2ecf20Sopenharmony_ci		.tempSlopeHigh = 105,
9258c2ecf20Sopenharmony_ci		.xatten1DBLow = {0, 0, 0},
9268c2ecf20Sopenharmony_ci		.xatten1MarginLow = {0, 0, 0},
9278c2ecf20Sopenharmony_ci		.xatten1DBHigh = {0, 0, 0},
9288c2ecf20Sopenharmony_ci		.xatten1MarginHigh = {0, 0, 0}
9298c2ecf20Sopenharmony_ci	 },
9308c2ecf20Sopenharmony_ci	.calFreqPier5G = {
9318c2ecf20Sopenharmony_ci		FREQ2FBIN(5180, 0),
9328c2ecf20Sopenharmony_ci		FREQ2FBIN(5240, 0),
9338c2ecf20Sopenharmony_ci		FREQ2FBIN(5320, 0),
9348c2ecf20Sopenharmony_ci		FREQ2FBIN(5400, 0),
9358c2ecf20Sopenharmony_ci		FREQ2FBIN(5500, 0),
9368c2ecf20Sopenharmony_ci		FREQ2FBIN(5600, 0),
9378c2ecf20Sopenharmony_ci		FREQ2FBIN(5745, 0),
9388c2ecf20Sopenharmony_ci		FREQ2FBIN(5785, 0)
9398c2ecf20Sopenharmony_ci	},
9408c2ecf20Sopenharmony_ci	.calPierData5G = {
9418c2ecf20Sopenharmony_ci			{
9428c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9438c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9448c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9458c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9468c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9478c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9488c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9498c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9508c2ecf20Sopenharmony_ci			},
9518c2ecf20Sopenharmony_ci			{
9528c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9538c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9548c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9558c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9568c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9578c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9588c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9598c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9608c2ecf20Sopenharmony_ci			},
9618c2ecf20Sopenharmony_ci			{
9628c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9638c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9648c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9658c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9668c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9678c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9688c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9698c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
9708c2ecf20Sopenharmony_ci			},
9718c2ecf20Sopenharmony_ci
9728c2ecf20Sopenharmony_ci	},
9738c2ecf20Sopenharmony_ci	.calTarget_freqbin_5G = {
9748c2ecf20Sopenharmony_ci		FREQ2FBIN(5180, 0),
9758c2ecf20Sopenharmony_ci		FREQ2FBIN(5220, 0),
9768c2ecf20Sopenharmony_ci		FREQ2FBIN(5320, 0),
9778c2ecf20Sopenharmony_ci		FREQ2FBIN(5400, 0),
9788c2ecf20Sopenharmony_ci		FREQ2FBIN(5500, 0),
9798c2ecf20Sopenharmony_ci		FREQ2FBIN(5600, 0),
9808c2ecf20Sopenharmony_ci		FREQ2FBIN(5745, 0),
9818c2ecf20Sopenharmony_ci		FREQ2FBIN(5785, 0)
9828c2ecf20Sopenharmony_ci	},
9838c2ecf20Sopenharmony_ci	.calTarget_freqbin_5GHT20 = {
9848c2ecf20Sopenharmony_ci		FREQ2FBIN(5180, 0),
9858c2ecf20Sopenharmony_ci		FREQ2FBIN(5240, 0),
9868c2ecf20Sopenharmony_ci		FREQ2FBIN(5320, 0),
9878c2ecf20Sopenharmony_ci		FREQ2FBIN(5400, 0),
9888c2ecf20Sopenharmony_ci		FREQ2FBIN(5500, 0),
9898c2ecf20Sopenharmony_ci		FREQ2FBIN(5700, 0),
9908c2ecf20Sopenharmony_ci		FREQ2FBIN(5745, 0),
9918c2ecf20Sopenharmony_ci		FREQ2FBIN(5825, 0)
9928c2ecf20Sopenharmony_ci	},
9938c2ecf20Sopenharmony_ci	.calTarget_freqbin_5GHT40 = {
9948c2ecf20Sopenharmony_ci		FREQ2FBIN(5190, 0),
9958c2ecf20Sopenharmony_ci		FREQ2FBIN(5230, 0),
9968c2ecf20Sopenharmony_ci		FREQ2FBIN(5320, 0),
9978c2ecf20Sopenharmony_ci		FREQ2FBIN(5410, 0),
9988c2ecf20Sopenharmony_ci		FREQ2FBIN(5510, 0),
9998c2ecf20Sopenharmony_ci		FREQ2FBIN(5670, 0),
10008c2ecf20Sopenharmony_ci		FREQ2FBIN(5755, 0),
10018c2ecf20Sopenharmony_ci		FREQ2FBIN(5825, 0)
10028c2ecf20Sopenharmony_ci	 },
10038c2ecf20Sopenharmony_ci	.calTargetPower5G = {
10048c2ecf20Sopenharmony_ci		/* 6-24,36,48,54 */
10058c2ecf20Sopenharmony_ci		{ {42, 40, 40, 34} },
10068c2ecf20Sopenharmony_ci		{ {42, 40, 40, 34} },
10078c2ecf20Sopenharmony_ci		{ {42, 40, 40, 34} },
10088c2ecf20Sopenharmony_ci		{ {42, 40, 40, 34} },
10098c2ecf20Sopenharmony_ci		{ {42, 40, 40, 34} },
10108c2ecf20Sopenharmony_ci		{ {42, 40, 40, 34} },
10118c2ecf20Sopenharmony_ci		{ {42, 40, 40, 34} },
10128c2ecf20Sopenharmony_ci		{ {42, 40, 40, 34} },
10138c2ecf20Sopenharmony_ci	 },
10148c2ecf20Sopenharmony_ci	.calTargetPower5GHT20 = {
10158c2ecf20Sopenharmony_ci		/*
10168c2ecf20Sopenharmony_ci		 * 0_8_16,1-3_9-11_17-19,
10178c2ecf20Sopenharmony_ci		 * 4,5,6,7,12,13,14,15,20,21,22,23
10188c2ecf20Sopenharmony_ci		 */
10198c2ecf20Sopenharmony_ci		{ {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
10208c2ecf20Sopenharmony_ci		{ {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
10218c2ecf20Sopenharmony_ci		{ {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
10228c2ecf20Sopenharmony_ci		{ {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
10238c2ecf20Sopenharmony_ci		{ {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
10248c2ecf20Sopenharmony_ci		{ {40, 40, 40, 40, 32, 28, 40, 40, 32, 28, 40, 40, 32, 20} },
10258c2ecf20Sopenharmony_ci		{ {38, 38, 38, 38, 32, 28, 38, 38, 32, 28, 38, 38, 32, 26} },
10268c2ecf20Sopenharmony_ci		{ {36, 36, 36, 36, 32, 28, 36, 36, 32, 28, 36, 36, 32, 26} },
10278c2ecf20Sopenharmony_ci	 },
10288c2ecf20Sopenharmony_ci	.calTargetPower5GHT40 =  {
10298c2ecf20Sopenharmony_ci		/*
10308c2ecf20Sopenharmony_ci		 * 0_8_16,1-3_9-11_17-19,
10318c2ecf20Sopenharmony_ci		 * 4,5,6,7,12,13,14,15,20,21,22,23
10328c2ecf20Sopenharmony_ci		 */
10338c2ecf20Sopenharmony_ci		{ {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
10348c2ecf20Sopenharmony_ci		{ {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
10358c2ecf20Sopenharmony_ci		{ {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
10368c2ecf20Sopenharmony_ci		{ {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
10378c2ecf20Sopenharmony_ci		{ {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
10388c2ecf20Sopenharmony_ci		{ {40, 40, 40, 38, 30, 26, 40, 40, 30, 26, 40, 40, 30, 24} },
10398c2ecf20Sopenharmony_ci		{ {36, 36, 36, 36, 30, 26, 36, 36, 30, 26, 36, 36, 30, 24} },
10408c2ecf20Sopenharmony_ci		{ {34, 34, 34, 34, 30, 26, 34, 34, 30, 26, 34, 34, 30, 24} },
10418c2ecf20Sopenharmony_ci	 },
10428c2ecf20Sopenharmony_ci	.ctlIndex_5G =  {
10438c2ecf20Sopenharmony_ci		0x10, 0x16, 0x18, 0x40, 0x46,
10448c2ecf20Sopenharmony_ci		0x48, 0x30, 0x36, 0x38
10458c2ecf20Sopenharmony_ci	},
10468c2ecf20Sopenharmony_ci	.ctl_freqbin_5G =  {
10478c2ecf20Sopenharmony_ci		{
10488c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
10498c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
10508c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
10518c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
10528c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[4].bChannel */ FREQ2FBIN(5600, 0),
10538c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
10548c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
10558c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
10568c2ecf20Sopenharmony_ci		},
10578c2ecf20Sopenharmony_ci		{
10588c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
10598c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
10608c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
10618c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
10628c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[4].bChannel */ FREQ2FBIN(5520, 0),
10638c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
10648c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
10658c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
10668c2ecf20Sopenharmony_ci		},
10678c2ecf20Sopenharmony_ci
10688c2ecf20Sopenharmony_ci		{
10698c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
10708c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
10718c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
10728c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[3].bChannel */ FREQ2FBIN(5310, 0),
10738c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[4].bChannel */ FREQ2FBIN(5510, 0),
10748c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[5].bChannel */ FREQ2FBIN(5550, 0),
10758c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[6].bChannel */ FREQ2FBIN(5670, 0),
10768c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[7].bChannel */ FREQ2FBIN(5755, 0)
10778c2ecf20Sopenharmony_ci		},
10788c2ecf20Sopenharmony_ci
10798c2ecf20Sopenharmony_ci		{
10808c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
10818c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
10828c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[2].bChannel */ FREQ2FBIN(5260, 0),
10838c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[3].bChannel */ FREQ2FBIN(5320, 0),
10848c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
10858c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
10868c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[6].bChannel */ 0xFF,
10878c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[7].bChannel */ 0xFF,
10888c2ecf20Sopenharmony_ci		},
10898c2ecf20Sopenharmony_ci
10908c2ecf20Sopenharmony_ci		{
10918c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
10928c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
10938c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(5500, 0),
10948c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(5700, 0),
10958c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[4].bChannel */ 0xFF,
10968c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[5].bChannel */ 0xFF,
10978c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[6].bChannel */ 0xFF,
10988c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[7].bChannel */ 0xFF,
10998c2ecf20Sopenharmony_ci		},
11008c2ecf20Sopenharmony_ci
11018c2ecf20Sopenharmony_ci		{
11028c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
11038c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(5270, 0),
11048c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(5310, 0),
11058c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
11068c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[4].bChannel */ FREQ2FBIN(5590, 0),
11078c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
11088c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[6].bChannel */ 0xFF,
11098c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[7].bChannel */ 0xFF
11108c2ecf20Sopenharmony_ci		},
11118c2ecf20Sopenharmony_ci
11128c2ecf20Sopenharmony_ci		{
11138c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
11148c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
11158c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[2].bChannel */ FREQ2FBIN(5220, 0),
11168c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[3].bChannel */ FREQ2FBIN(5260, 0),
11178c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
11188c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[5].bChannel */ FREQ2FBIN(5600, 0),
11198c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[6].bChannel */ FREQ2FBIN(5700, 0),
11208c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[7].bChannel */ FREQ2FBIN(5745, 0)
11218c2ecf20Sopenharmony_ci		},
11228c2ecf20Sopenharmony_ci
11238c2ecf20Sopenharmony_ci		{
11248c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
11258c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
11268c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(5320, 0),
11278c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
11288c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[4].bChannel */ FREQ2FBIN(5560, 0),
11298c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
11308c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
11318c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
11328c2ecf20Sopenharmony_ci		},
11338c2ecf20Sopenharmony_ci
11348c2ecf20Sopenharmony_ci		{
11358c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
11368c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
11378c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
11388c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
11398c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[4].bChannel */ FREQ2FBIN(5550, 0),
11408c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
11418c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[6].bChannel */ FREQ2FBIN(5755, 0),
11428c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[7].bChannel */ FREQ2FBIN(5795, 0)
11438c2ecf20Sopenharmony_ci		}
11448c2ecf20Sopenharmony_ci	 },
11458c2ecf20Sopenharmony_ci	.ctlPowerData_5G = {
11468c2ecf20Sopenharmony_ci		{
11478c2ecf20Sopenharmony_ci			{
11488c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
11498c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
11508c2ecf20Sopenharmony_ci			}
11518c2ecf20Sopenharmony_ci		},
11528c2ecf20Sopenharmony_ci		{
11538c2ecf20Sopenharmony_ci			{
11548c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
11558c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
11568c2ecf20Sopenharmony_ci			}
11578c2ecf20Sopenharmony_ci		},
11588c2ecf20Sopenharmony_ci		{
11598c2ecf20Sopenharmony_ci			{
11608c2ecf20Sopenharmony_ci				CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 1),
11618c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
11628c2ecf20Sopenharmony_ci			}
11638c2ecf20Sopenharmony_ci		},
11648c2ecf20Sopenharmony_ci		{
11658c2ecf20Sopenharmony_ci			{
11668c2ecf20Sopenharmony_ci				CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0),
11678c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
11688c2ecf20Sopenharmony_ci			}
11698c2ecf20Sopenharmony_ci		},
11708c2ecf20Sopenharmony_ci		{
11718c2ecf20Sopenharmony_ci			{
11728c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
11738c2ecf20Sopenharmony_ci				CTL(60, 0), CTL(60, 0), CTL(60, 0), CTL(60, 0),
11748c2ecf20Sopenharmony_ci			}
11758c2ecf20Sopenharmony_ci		},
11768c2ecf20Sopenharmony_ci		{
11778c2ecf20Sopenharmony_ci			{
11788c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
11798c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
11808c2ecf20Sopenharmony_ci			}
11818c2ecf20Sopenharmony_ci		},
11828c2ecf20Sopenharmony_ci		{
11838c2ecf20Sopenharmony_ci			{
11848c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
11858c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
11868c2ecf20Sopenharmony_ci			}
11878c2ecf20Sopenharmony_ci		},
11888c2ecf20Sopenharmony_ci		{
11898c2ecf20Sopenharmony_ci			{
11908c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
11918c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
11928c2ecf20Sopenharmony_ci			}
11938c2ecf20Sopenharmony_ci		},
11948c2ecf20Sopenharmony_ci		{
11958c2ecf20Sopenharmony_ci			{
11968c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 1), CTL(60, 1),
11978c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
11988c2ecf20Sopenharmony_ci			}
11998c2ecf20Sopenharmony_ci		},
12008c2ecf20Sopenharmony_ci	 }
12018c2ecf20Sopenharmony_ci};
12028c2ecf20Sopenharmony_ci
12038c2ecf20Sopenharmony_ci
12048c2ecf20Sopenharmony_cistatic const struct ar9300_eeprom ar9300_h112 = {
12058c2ecf20Sopenharmony_ci	.eepromVersion = 2,
12068c2ecf20Sopenharmony_ci	.templateVersion = 3,
12078c2ecf20Sopenharmony_ci	.macAddr = {0x00, 0x03, 0x7f, 0x0, 0x0, 0x0},
12088c2ecf20Sopenharmony_ci	.custData = {"h112-241-f0000"},
12098c2ecf20Sopenharmony_ci	.baseEepHeader = {
12108c2ecf20Sopenharmony_ci		.regDmn = { LE16(0), LE16(0x1f) },
12118c2ecf20Sopenharmony_ci		.txrxMask =  0x77, /* 4 bits tx and 4 bits rx */
12128c2ecf20Sopenharmony_ci		.opCapFlags = {
12138c2ecf20Sopenharmony_ci			.opFlags = AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A,
12148c2ecf20Sopenharmony_ci			.eepMisc = AR9300_EEPMISC_LITTLE_ENDIAN,
12158c2ecf20Sopenharmony_ci		},
12168c2ecf20Sopenharmony_ci		.rfSilent = 0,
12178c2ecf20Sopenharmony_ci		.blueToothOptions = 0,
12188c2ecf20Sopenharmony_ci		.deviceCap = 0,
12198c2ecf20Sopenharmony_ci		.deviceType = 5, /* takes lower byte in eeprom location */
12208c2ecf20Sopenharmony_ci		.pwrTableOffset = AR9300_PWR_TABLE_OFFSET,
12218c2ecf20Sopenharmony_ci		.params_for_tuning_caps = {0, 0},
12228c2ecf20Sopenharmony_ci		.featureEnable = 0x0d,
12238c2ecf20Sopenharmony_ci		/*
12248c2ecf20Sopenharmony_ci		 * bit0 - enable tx temp comp - disabled
12258c2ecf20Sopenharmony_ci		 * bit1 - enable tx volt comp - disabled
12268c2ecf20Sopenharmony_ci		 * bit2 - enable fastClock - enabled
12278c2ecf20Sopenharmony_ci		 * bit3 - enable doubling - enabled
12288c2ecf20Sopenharmony_ci		 * bit4 - enable internal regulator - disabled
12298c2ecf20Sopenharmony_ci		 * bit5 - enable pa predistortion - disabled
12308c2ecf20Sopenharmony_ci		 */
12318c2ecf20Sopenharmony_ci		.miscConfiguration = 0, /* bit0 - turn down drivestrength */
12328c2ecf20Sopenharmony_ci		.eepromWriteEnableGpio = 6,
12338c2ecf20Sopenharmony_ci		.wlanDisableGpio = 0,
12348c2ecf20Sopenharmony_ci		.wlanLedGpio = 8,
12358c2ecf20Sopenharmony_ci		.rxBandSelectGpio = 0xff,
12368c2ecf20Sopenharmony_ci		.txrxgain = 0x10,
12378c2ecf20Sopenharmony_ci		.swreg = 0,
12388c2ecf20Sopenharmony_ci	},
12398c2ecf20Sopenharmony_ci	.modalHeader2G = {
12408c2ecf20Sopenharmony_ci		/* ar9300_modal_eep_header  2g */
12418c2ecf20Sopenharmony_ci		/* 4 idle,t1,t2,b(4 bits per setting) */
12428c2ecf20Sopenharmony_ci		.antCtrlCommon = LE32(0x110),
12438c2ecf20Sopenharmony_ci		/* 4 ra1l1, ra2l1, ra1l2, ra2l2, ra12 */
12448c2ecf20Sopenharmony_ci		.antCtrlCommon2 = LE32(0x44444),
12458c2ecf20Sopenharmony_ci
12468c2ecf20Sopenharmony_ci		/*
12478c2ecf20Sopenharmony_ci		 * antCtrlChain[AR9300_MAX_CHAINS]; 6 idle, t, r,
12488c2ecf20Sopenharmony_ci		 * rx1, rx12, b (2 bits each)
12498c2ecf20Sopenharmony_ci		 */
12508c2ecf20Sopenharmony_ci		.antCtrlChain = { LE16(0x150), LE16(0x150), LE16(0x150) },
12518c2ecf20Sopenharmony_ci
12528c2ecf20Sopenharmony_ci		/*
12538c2ecf20Sopenharmony_ci		 * xatten1DB[AR9300_MAX_CHAINS];  3 xatten1_db
12548c2ecf20Sopenharmony_ci		 * for ar9280 (0xa20c/b20c 5:0)
12558c2ecf20Sopenharmony_ci		 */
12568c2ecf20Sopenharmony_ci		.xatten1DB = {0, 0, 0},
12578c2ecf20Sopenharmony_ci
12588c2ecf20Sopenharmony_ci		/*
12598c2ecf20Sopenharmony_ci		 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
12608c2ecf20Sopenharmony_ci		 * for ar9280 (0xa20c/b20c 16:12
12618c2ecf20Sopenharmony_ci		 */
12628c2ecf20Sopenharmony_ci		.xatten1Margin = {0, 0, 0},
12638c2ecf20Sopenharmony_ci		.tempSlope = 25,
12648c2ecf20Sopenharmony_ci		.voltSlope = 0,
12658c2ecf20Sopenharmony_ci
12668c2ecf20Sopenharmony_ci		/*
12678c2ecf20Sopenharmony_ci		 * spurChans[OSPREY_EEPROM_MODAL_SPURS]; spur
12688c2ecf20Sopenharmony_ci		 * channels in usual fbin coding format
12698c2ecf20Sopenharmony_ci		 */
12708c2ecf20Sopenharmony_ci		.spurChans = {FREQ2FBIN(2464, 1), 0, 0, 0, 0},
12718c2ecf20Sopenharmony_ci
12728c2ecf20Sopenharmony_ci		/*
12738c2ecf20Sopenharmony_ci		 * noiseFloorThreshCh[AR9300_MAX_CHAINS]; 3 Check
12748c2ecf20Sopenharmony_ci		 * if the register is per chain
12758c2ecf20Sopenharmony_ci		 */
12768c2ecf20Sopenharmony_ci		.noiseFloorThreshCh = {-1, 0, 0},
12778c2ecf20Sopenharmony_ci		.reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
12788c2ecf20Sopenharmony_ci		.quick_drop = 0,
12798c2ecf20Sopenharmony_ci		.xpaBiasLvl = 0,
12808c2ecf20Sopenharmony_ci		.txFrameToDataStart = 0x0e,
12818c2ecf20Sopenharmony_ci		.txFrameToPaOn = 0x0e,
12828c2ecf20Sopenharmony_ci		.txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
12838c2ecf20Sopenharmony_ci		.antennaGain = 0,
12848c2ecf20Sopenharmony_ci		.switchSettling = 0x2c,
12858c2ecf20Sopenharmony_ci		.adcDesiredSize = -30,
12868c2ecf20Sopenharmony_ci		.txEndToXpaOff = 0,
12878c2ecf20Sopenharmony_ci		.txEndToRxOn = 0x2,
12888c2ecf20Sopenharmony_ci		.txFrameToXpaOn = 0xe,
12898c2ecf20Sopenharmony_ci		.thresh62 = 28,
12908c2ecf20Sopenharmony_ci		.papdRateMaskHt20 = LE32(0x0c80c080),
12918c2ecf20Sopenharmony_ci		.papdRateMaskHt40 = LE32(0x0080c080),
12928c2ecf20Sopenharmony_ci		.switchcomspdt = 0,
12938c2ecf20Sopenharmony_ci		.xlna_bias_strength = 0,
12948c2ecf20Sopenharmony_ci		.futureModal = {
12958c2ecf20Sopenharmony_ci			0, 0, 0, 0, 0, 0, 0,
12968c2ecf20Sopenharmony_ci		},
12978c2ecf20Sopenharmony_ci	},
12988c2ecf20Sopenharmony_ci	.base_ext1 = {
12998c2ecf20Sopenharmony_ci		.ant_div_control = 0,
13008c2ecf20Sopenharmony_ci		.future = {0, 0},
13018c2ecf20Sopenharmony_ci		.tempslopextension = {0, 0, 0, 0, 0, 0, 0, 0}
13028c2ecf20Sopenharmony_ci	},
13038c2ecf20Sopenharmony_ci	.calFreqPier2G = {
13048c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
13058c2ecf20Sopenharmony_ci		FREQ2FBIN(2437, 1),
13068c2ecf20Sopenharmony_ci		FREQ2FBIN(2462, 1),
13078c2ecf20Sopenharmony_ci	},
13088c2ecf20Sopenharmony_ci	/* ar9300_cal_data_per_freq_op_loop 2g */
13098c2ecf20Sopenharmony_ci	.calPierData2G = {
13108c2ecf20Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
13118c2ecf20Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
13128c2ecf20Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
13138c2ecf20Sopenharmony_ci	},
13148c2ecf20Sopenharmony_ci	.calTarget_freqbin_Cck = {
13158c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
13168c2ecf20Sopenharmony_ci		FREQ2FBIN(2472, 1),
13178c2ecf20Sopenharmony_ci	},
13188c2ecf20Sopenharmony_ci	.calTarget_freqbin_2G = {
13198c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
13208c2ecf20Sopenharmony_ci		FREQ2FBIN(2437, 1),
13218c2ecf20Sopenharmony_ci		FREQ2FBIN(2472, 1)
13228c2ecf20Sopenharmony_ci	},
13238c2ecf20Sopenharmony_ci	.calTarget_freqbin_2GHT20 = {
13248c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
13258c2ecf20Sopenharmony_ci		FREQ2FBIN(2437, 1),
13268c2ecf20Sopenharmony_ci		FREQ2FBIN(2472, 1)
13278c2ecf20Sopenharmony_ci	},
13288c2ecf20Sopenharmony_ci	.calTarget_freqbin_2GHT40 = {
13298c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
13308c2ecf20Sopenharmony_ci		FREQ2FBIN(2437, 1),
13318c2ecf20Sopenharmony_ci		FREQ2FBIN(2472, 1)
13328c2ecf20Sopenharmony_ci	},
13338c2ecf20Sopenharmony_ci	.calTargetPowerCck = {
13348c2ecf20Sopenharmony_ci		/* 1L-5L,5S,11L,11S */
13358c2ecf20Sopenharmony_ci		{ {34, 34, 34, 34} },
13368c2ecf20Sopenharmony_ci		{ {34, 34, 34, 34} },
13378c2ecf20Sopenharmony_ci	},
13388c2ecf20Sopenharmony_ci	.calTargetPower2G = {
13398c2ecf20Sopenharmony_ci		/* 6-24,36,48,54 */
13408c2ecf20Sopenharmony_ci		{ {34, 34, 32, 32} },
13418c2ecf20Sopenharmony_ci		{ {34, 34, 32, 32} },
13428c2ecf20Sopenharmony_ci		{ {34, 34, 32, 32} },
13438c2ecf20Sopenharmony_ci	},
13448c2ecf20Sopenharmony_ci	.calTargetPower2GHT20 = {
13458c2ecf20Sopenharmony_ci		{ {32, 32, 32, 32, 32, 30, 32, 32, 30, 28, 28, 28, 28, 24} },
13468c2ecf20Sopenharmony_ci		{ {32, 32, 32, 32, 32, 30, 32, 32, 30, 28, 28, 28, 28, 24} },
13478c2ecf20Sopenharmony_ci		{ {32, 32, 32, 32, 32, 30, 32, 32, 30, 28, 28, 28, 28, 24} },
13488c2ecf20Sopenharmony_ci	},
13498c2ecf20Sopenharmony_ci	.calTargetPower2GHT40 = {
13508c2ecf20Sopenharmony_ci		{ {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 26, 26, 26, 22} },
13518c2ecf20Sopenharmony_ci		{ {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 26, 26, 26, 22} },
13528c2ecf20Sopenharmony_ci		{ {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 26, 26, 26, 22} },
13538c2ecf20Sopenharmony_ci	},
13548c2ecf20Sopenharmony_ci	.ctlIndex_2G =  {
13558c2ecf20Sopenharmony_ci		0x11, 0x12, 0x15, 0x17, 0x41, 0x42,
13568c2ecf20Sopenharmony_ci		0x45, 0x47, 0x31, 0x32, 0x35, 0x37,
13578c2ecf20Sopenharmony_ci	},
13588c2ecf20Sopenharmony_ci	.ctl_freqbin_2G = {
13598c2ecf20Sopenharmony_ci		{
13608c2ecf20Sopenharmony_ci			FREQ2FBIN(2412, 1),
13618c2ecf20Sopenharmony_ci			FREQ2FBIN(2417, 1),
13628c2ecf20Sopenharmony_ci			FREQ2FBIN(2457, 1),
13638c2ecf20Sopenharmony_ci			FREQ2FBIN(2462, 1)
13648c2ecf20Sopenharmony_ci		},
13658c2ecf20Sopenharmony_ci		{
13668c2ecf20Sopenharmony_ci			FREQ2FBIN(2412, 1),
13678c2ecf20Sopenharmony_ci			FREQ2FBIN(2417, 1),
13688c2ecf20Sopenharmony_ci			FREQ2FBIN(2462, 1),
13698c2ecf20Sopenharmony_ci			0xFF,
13708c2ecf20Sopenharmony_ci		},
13718c2ecf20Sopenharmony_ci
13728c2ecf20Sopenharmony_ci		{
13738c2ecf20Sopenharmony_ci			FREQ2FBIN(2412, 1),
13748c2ecf20Sopenharmony_ci			FREQ2FBIN(2417, 1),
13758c2ecf20Sopenharmony_ci			FREQ2FBIN(2462, 1),
13768c2ecf20Sopenharmony_ci			0xFF,
13778c2ecf20Sopenharmony_ci		},
13788c2ecf20Sopenharmony_ci		{
13798c2ecf20Sopenharmony_ci			FREQ2FBIN(2422, 1),
13808c2ecf20Sopenharmony_ci			FREQ2FBIN(2427, 1),
13818c2ecf20Sopenharmony_ci			FREQ2FBIN(2447, 1),
13828c2ecf20Sopenharmony_ci			FREQ2FBIN(2452, 1)
13838c2ecf20Sopenharmony_ci		},
13848c2ecf20Sopenharmony_ci
13858c2ecf20Sopenharmony_ci		{
13868c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
13878c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
13888c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
13898c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(2484, 1),
13908c2ecf20Sopenharmony_ci		},
13918c2ecf20Sopenharmony_ci
13928c2ecf20Sopenharmony_ci		{
13938c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
13948c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
13958c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
13968c2ecf20Sopenharmony_ci			0,
13978c2ecf20Sopenharmony_ci		},
13988c2ecf20Sopenharmony_ci
13998c2ecf20Sopenharmony_ci		{
14008c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
14018c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
14028c2ecf20Sopenharmony_ci			FREQ2FBIN(2472, 1),
14038c2ecf20Sopenharmony_ci			0,
14048c2ecf20Sopenharmony_ci		},
14058c2ecf20Sopenharmony_ci
14068c2ecf20Sopenharmony_ci		{
14078c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
14088c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
14098c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
14108c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
14118c2ecf20Sopenharmony_ci		},
14128c2ecf20Sopenharmony_ci
14138c2ecf20Sopenharmony_ci		{
14148c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
14158c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
14168c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
14178c2ecf20Sopenharmony_ci		},
14188c2ecf20Sopenharmony_ci
14198c2ecf20Sopenharmony_ci		{
14208c2ecf20Sopenharmony_ci			/* Data[9].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
14218c2ecf20Sopenharmony_ci			/* Data[9].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
14228c2ecf20Sopenharmony_ci			/* Data[9].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
14238c2ecf20Sopenharmony_ci			0
14248c2ecf20Sopenharmony_ci		},
14258c2ecf20Sopenharmony_ci
14268c2ecf20Sopenharmony_ci		{
14278c2ecf20Sopenharmony_ci			/* Data[10].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
14288c2ecf20Sopenharmony_ci			/* Data[10].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
14298c2ecf20Sopenharmony_ci			/* Data[10].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
14308c2ecf20Sopenharmony_ci			0
14318c2ecf20Sopenharmony_ci		},
14328c2ecf20Sopenharmony_ci
14338c2ecf20Sopenharmony_ci		{
14348c2ecf20Sopenharmony_ci			/* Data[11].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
14358c2ecf20Sopenharmony_ci			/* Data[11].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
14368c2ecf20Sopenharmony_ci			/* Data[11].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
14378c2ecf20Sopenharmony_ci			/* Data[11].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
14388c2ecf20Sopenharmony_ci		}
14398c2ecf20Sopenharmony_ci	},
14408c2ecf20Sopenharmony_ci	.ctlPowerData_2G = {
14418c2ecf20Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
14428c2ecf20Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
14438c2ecf20Sopenharmony_ci		{ { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } },
14448c2ecf20Sopenharmony_ci
14458c2ecf20Sopenharmony_ci		{ { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } },
14468c2ecf20Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
14478c2ecf20Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
14488c2ecf20Sopenharmony_ci
14498c2ecf20Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } },
14508c2ecf20Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
14518c2ecf20Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
14528c2ecf20Sopenharmony_ci
14538c2ecf20Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
14548c2ecf20Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
14558c2ecf20Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
14568c2ecf20Sopenharmony_ci	},
14578c2ecf20Sopenharmony_ci	.modalHeader5G = {
14588c2ecf20Sopenharmony_ci		/* 4 idle,t1,t2,b (4 bits per setting) */
14598c2ecf20Sopenharmony_ci		.antCtrlCommon = LE32(0x220),
14608c2ecf20Sopenharmony_ci		/* 4 ra1l1, ra2l1, ra1l2,ra2l2,ra12 */
14618c2ecf20Sopenharmony_ci		.antCtrlCommon2 = LE32(0x44444),
14628c2ecf20Sopenharmony_ci		/* antCtrlChain 6 idle, t,r,rx1,rx12,b (2 bits each) */
14638c2ecf20Sopenharmony_ci		.antCtrlChain = {
14648c2ecf20Sopenharmony_ci			LE16(0x150), LE16(0x150), LE16(0x150),
14658c2ecf20Sopenharmony_ci		},
14668c2ecf20Sopenharmony_ci		/* xatten1DB 3 xatten1_db for AR9280 (0xa20c/b20c 5:0) */
14678c2ecf20Sopenharmony_ci		.xatten1DB = {0, 0, 0},
14688c2ecf20Sopenharmony_ci
14698c2ecf20Sopenharmony_ci		/*
14708c2ecf20Sopenharmony_ci		 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
14718c2ecf20Sopenharmony_ci		 * for merlin (0xa20c/b20c 16:12
14728c2ecf20Sopenharmony_ci		 */
14738c2ecf20Sopenharmony_ci		.xatten1Margin = {0, 0, 0},
14748c2ecf20Sopenharmony_ci		.tempSlope = 45,
14758c2ecf20Sopenharmony_ci		.voltSlope = 0,
14768c2ecf20Sopenharmony_ci		/* spurChans spur channels in usual fbin coding format */
14778c2ecf20Sopenharmony_ci		.spurChans = {0, 0, 0, 0, 0},
14788c2ecf20Sopenharmony_ci		/* noiseFloorThreshCh Check if the register is per chain */
14798c2ecf20Sopenharmony_ci		.noiseFloorThreshCh = {-1, 0, 0},
14808c2ecf20Sopenharmony_ci		.reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
14818c2ecf20Sopenharmony_ci		.quick_drop = 0,
14828c2ecf20Sopenharmony_ci		.xpaBiasLvl = 0,
14838c2ecf20Sopenharmony_ci		.txFrameToDataStart = 0x0e,
14848c2ecf20Sopenharmony_ci		.txFrameToPaOn = 0x0e,
14858c2ecf20Sopenharmony_ci		.txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
14868c2ecf20Sopenharmony_ci		.antennaGain = 0,
14878c2ecf20Sopenharmony_ci		.switchSettling = 0x2d,
14888c2ecf20Sopenharmony_ci		.adcDesiredSize = -30,
14898c2ecf20Sopenharmony_ci		.txEndToXpaOff = 0,
14908c2ecf20Sopenharmony_ci		.txEndToRxOn = 0x2,
14918c2ecf20Sopenharmony_ci		.txFrameToXpaOn = 0xe,
14928c2ecf20Sopenharmony_ci		.thresh62 = 28,
14938c2ecf20Sopenharmony_ci		.papdRateMaskHt20 = LE32(0x0cf0e0e0),
14948c2ecf20Sopenharmony_ci		.papdRateMaskHt40 = LE32(0x6cf0e0e0),
14958c2ecf20Sopenharmony_ci		.switchcomspdt = 0,
14968c2ecf20Sopenharmony_ci		.xlna_bias_strength = 0,
14978c2ecf20Sopenharmony_ci		.futureModal = {
14988c2ecf20Sopenharmony_ci			0, 0, 0, 0, 0, 0, 0,
14998c2ecf20Sopenharmony_ci		},
15008c2ecf20Sopenharmony_ci	},
15018c2ecf20Sopenharmony_ci	.base_ext2 = {
15028c2ecf20Sopenharmony_ci		.tempSlopeLow = 40,
15038c2ecf20Sopenharmony_ci		.tempSlopeHigh = 50,
15048c2ecf20Sopenharmony_ci		.xatten1DBLow = {0, 0, 0},
15058c2ecf20Sopenharmony_ci		.xatten1MarginLow = {0, 0, 0},
15068c2ecf20Sopenharmony_ci		.xatten1DBHigh = {0, 0, 0},
15078c2ecf20Sopenharmony_ci		.xatten1MarginHigh = {0, 0, 0}
15088c2ecf20Sopenharmony_ci	},
15098c2ecf20Sopenharmony_ci	.calFreqPier5G = {
15108c2ecf20Sopenharmony_ci		FREQ2FBIN(5180, 0),
15118c2ecf20Sopenharmony_ci		FREQ2FBIN(5220, 0),
15128c2ecf20Sopenharmony_ci		FREQ2FBIN(5320, 0),
15138c2ecf20Sopenharmony_ci		FREQ2FBIN(5400, 0),
15148c2ecf20Sopenharmony_ci		FREQ2FBIN(5500, 0),
15158c2ecf20Sopenharmony_ci		FREQ2FBIN(5600, 0),
15168c2ecf20Sopenharmony_ci		FREQ2FBIN(5700, 0),
15178c2ecf20Sopenharmony_ci		FREQ2FBIN(5785, 0)
15188c2ecf20Sopenharmony_ci	},
15198c2ecf20Sopenharmony_ci	.calPierData5G = {
15208c2ecf20Sopenharmony_ci		{
15218c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15228c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15238c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15248c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15258c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15268c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15278c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15288c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15298c2ecf20Sopenharmony_ci		},
15308c2ecf20Sopenharmony_ci		{
15318c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15328c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15338c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15348c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15358c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15368c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15378c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15388c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15398c2ecf20Sopenharmony_ci		},
15408c2ecf20Sopenharmony_ci		{
15418c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15428c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15438c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15448c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15458c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15468c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15478c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15488c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
15498c2ecf20Sopenharmony_ci		},
15508c2ecf20Sopenharmony_ci
15518c2ecf20Sopenharmony_ci	},
15528c2ecf20Sopenharmony_ci	.calTarget_freqbin_5G = {
15538c2ecf20Sopenharmony_ci		FREQ2FBIN(5180, 0),
15548c2ecf20Sopenharmony_ci		FREQ2FBIN(5240, 0),
15558c2ecf20Sopenharmony_ci		FREQ2FBIN(5320, 0),
15568c2ecf20Sopenharmony_ci		FREQ2FBIN(5400, 0),
15578c2ecf20Sopenharmony_ci		FREQ2FBIN(5500, 0),
15588c2ecf20Sopenharmony_ci		FREQ2FBIN(5600, 0),
15598c2ecf20Sopenharmony_ci		FREQ2FBIN(5700, 0),
15608c2ecf20Sopenharmony_ci		FREQ2FBIN(5825, 0)
15618c2ecf20Sopenharmony_ci	},
15628c2ecf20Sopenharmony_ci	.calTarget_freqbin_5GHT20 = {
15638c2ecf20Sopenharmony_ci		FREQ2FBIN(5180, 0),
15648c2ecf20Sopenharmony_ci		FREQ2FBIN(5240, 0),
15658c2ecf20Sopenharmony_ci		FREQ2FBIN(5320, 0),
15668c2ecf20Sopenharmony_ci		FREQ2FBIN(5400, 0),
15678c2ecf20Sopenharmony_ci		FREQ2FBIN(5500, 0),
15688c2ecf20Sopenharmony_ci		FREQ2FBIN(5700, 0),
15698c2ecf20Sopenharmony_ci		FREQ2FBIN(5745, 0),
15708c2ecf20Sopenharmony_ci		FREQ2FBIN(5825, 0)
15718c2ecf20Sopenharmony_ci	},
15728c2ecf20Sopenharmony_ci	.calTarget_freqbin_5GHT40 = {
15738c2ecf20Sopenharmony_ci		FREQ2FBIN(5180, 0),
15748c2ecf20Sopenharmony_ci		FREQ2FBIN(5240, 0),
15758c2ecf20Sopenharmony_ci		FREQ2FBIN(5320, 0),
15768c2ecf20Sopenharmony_ci		FREQ2FBIN(5400, 0),
15778c2ecf20Sopenharmony_ci		FREQ2FBIN(5500, 0),
15788c2ecf20Sopenharmony_ci		FREQ2FBIN(5700, 0),
15798c2ecf20Sopenharmony_ci		FREQ2FBIN(5745, 0),
15808c2ecf20Sopenharmony_ci		FREQ2FBIN(5825, 0)
15818c2ecf20Sopenharmony_ci	},
15828c2ecf20Sopenharmony_ci	.calTargetPower5G = {
15838c2ecf20Sopenharmony_ci		/* 6-24,36,48,54 */
15848c2ecf20Sopenharmony_ci		{ {30, 30, 28, 24} },
15858c2ecf20Sopenharmony_ci		{ {30, 30, 28, 24} },
15868c2ecf20Sopenharmony_ci		{ {30, 30, 28, 24} },
15878c2ecf20Sopenharmony_ci		{ {30, 30, 28, 24} },
15888c2ecf20Sopenharmony_ci		{ {30, 30, 28, 24} },
15898c2ecf20Sopenharmony_ci		{ {30, 30, 28, 24} },
15908c2ecf20Sopenharmony_ci		{ {30, 30, 28, 24} },
15918c2ecf20Sopenharmony_ci		{ {30, 30, 28, 24} },
15928c2ecf20Sopenharmony_ci	},
15938c2ecf20Sopenharmony_ci	.calTargetPower5GHT20 = {
15948c2ecf20Sopenharmony_ci		/*
15958c2ecf20Sopenharmony_ci		 * 0_8_16,1-3_9-11_17-19,
15968c2ecf20Sopenharmony_ci		 * 4,5,6,7,12,13,14,15,20,21,22,23
15978c2ecf20Sopenharmony_ci		 */
15988c2ecf20Sopenharmony_ci		{ {30, 30, 30, 28, 24, 20, 30, 28, 24, 20, 20, 20, 20, 16} },
15998c2ecf20Sopenharmony_ci		{ {30, 30, 30, 28, 24, 20, 30, 28, 24, 20, 20, 20, 20, 16} },
16008c2ecf20Sopenharmony_ci		{ {30, 30, 30, 26, 22, 18, 30, 26, 22, 18, 18, 18, 18, 16} },
16018c2ecf20Sopenharmony_ci		{ {30, 30, 30, 26, 22, 18, 30, 26, 22, 18, 18, 18, 18, 16} },
16028c2ecf20Sopenharmony_ci		{ {30, 30, 30, 24, 20, 16, 30, 24, 20, 16, 16, 16, 16, 14} },
16038c2ecf20Sopenharmony_ci		{ {30, 30, 30, 24, 20, 16, 30, 24, 20, 16, 16, 16, 16, 14} },
16048c2ecf20Sopenharmony_ci		{ {30, 30, 30, 22, 18, 14, 30, 22, 18, 14, 14, 14, 14, 12} },
16058c2ecf20Sopenharmony_ci		{ {30, 30, 30, 22, 18, 14, 30, 22, 18, 14, 14, 14, 14, 12} },
16068c2ecf20Sopenharmony_ci	},
16078c2ecf20Sopenharmony_ci	.calTargetPower5GHT40 =  {
16088c2ecf20Sopenharmony_ci		/*
16098c2ecf20Sopenharmony_ci		 * 0_8_16,1-3_9-11_17-19,
16108c2ecf20Sopenharmony_ci		 * 4,5,6,7,12,13,14,15,20,21,22,23
16118c2ecf20Sopenharmony_ci		 */
16128c2ecf20Sopenharmony_ci		{ {28, 28, 28, 26, 22, 18, 28, 26, 22, 18, 18, 18, 18, 14} },
16138c2ecf20Sopenharmony_ci		{ {28, 28, 28, 26, 22, 18, 28, 26, 22, 18, 18, 18, 18, 14} },
16148c2ecf20Sopenharmony_ci		{ {28, 28, 28, 24, 20, 16, 28, 24, 20, 16, 16, 16, 16, 12} },
16158c2ecf20Sopenharmony_ci		{ {28, 28, 28, 24, 20, 16, 28, 24, 20, 16, 16, 16, 16, 12} },
16168c2ecf20Sopenharmony_ci		{ {28, 28, 28, 22, 18, 14, 28, 22, 18, 14, 14, 14, 14, 10} },
16178c2ecf20Sopenharmony_ci		{ {28, 28, 28, 22, 18, 14, 28, 22, 18, 14, 14, 14, 14, 10} },
16188c2ecf20Sopenharmony_ci		{ {28, 28, 28, 20, 16, 12, 28, 20, 16, 12, 12, 12, 12, 8} },
16198c2ecf20Sopenharmony_ci		{ {28, 28, 28, 20, 16, 12, 28, 20, 16, 12, 12, 12, 12, 8} },
16208c2ecf20Sopenharmony_ci	},
16218c2ecf20Sopenharmony_ci	.ctlIndex_5G =  {
16228c2ecf20Sopenharmony_ci		0x10, 0x16, 0x18, 0x40, 0x46,
16238c2ecf20Sopenharmony_ci		0x48, 0x30, 0x36, 0x38
16248c2ecf20Sopenharmony_ci	},
16258c2ecf20Sopenharmony_ci	.ctl_freqbin_5G =  {
16268c2ecf20Sopenharmony_ci		{
16278c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
16288c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
16298c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
16308c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
16318c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[4].bChannel */ FREQ2FBIN(5600, 0),
16328c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
16338c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
16348c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
16358c2ecf20Sopenharmony_ci		},
16368c2ecf20Sopenharmony_ci		{
16378c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
16388c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
16398c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
16408c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
16418c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[4].bChannel */ FREQ2FBIN(5520, 0),
16428c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
16438c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
16448c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
16458c2ecf20Sopenharmony_ci		},
16468c2ecf20Sopenharmony_ci
16478c2ecf20Sopenharmony_ci		{
16488c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
16498c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
16508c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
16518c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[3].bChannel */ FREQ2FBIN(5310, 0),
16528c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[4].bChannel */ FREQ2FBIN(5510, 0),
16538c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[5].bChannel */ FREQ2FBIN(5550, 0),
16548c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[6].bChannel */ FREQ2FBIN(5670, 0),
16558c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[7].bChannel */ FREQ2FBIN(5755, 0)
16568c2ecf20Sopenharmony_ci		},
16578c2ecf20Sopenharmony_ci
16588c2ecf20Sopenharmony_ci		{
16598c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
16608c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
16618c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[2].bChannel */ FREQ2FBIN(5260, 0),
16628c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[3].bChannel */ FREQ2FBIN(5320, 0),
16638c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
16648c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
16658c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[6].bChannel */ 0xFF,
16668c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[7].bChannel */ 0xFF,
16678c2ecf20Sopenharmony_ci		},
16688c2ecf20Sopenharmony_ci
16698c2ecf20Sopenharmony_ci		{
16708c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
16718c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
16728c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(5500, 0),
16738c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(5700, 0),
16748c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[4].bChannel */ 0xFF,
16758c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[5].bChannel */ 0xFF,
16768c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[6].bChannel */ 0xFF,
16778c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[7].bChannel */ 0xFF,
16788c2ecf20Sopenharmony_ci		},
16798c2ecf20Sopenharmony_ci
16808c2ecf20Sopenharmony_ci		{
16818c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
16828c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(5270, 0),
16838c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(5310, 0),
16848c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
16858c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[4].bChannel */ FREQ2FBIN(5590, 0),
16868c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
16878c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[6].bChannel */ 0xFF,
16888c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[7].bChannel */ 0xFF
16898c2ecf20Sopenharmony_ci		},
16908c2ecf20Sopenharmony_ci
16918c2ecf20Sopenharmony_ci		{
16928c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
16938c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
16948c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[2].bChannel */ FREQ2FBIN(5220, 0),
16958c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[3].bChannel */ FREQ2FBIN(5260, 0),
16968c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
16978c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[5].bChannel */ FREQ2FBIN(5600, 0),
16988c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[6].bChannel */ FREQ2FBIN(5700, 0),
16998c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[7].bChannel */ FREQ2FBIN(5745, 0)
17008c2ecf20Sopenharmony_ci		},
17018c2ecf20Sopenharmony_ci
17028c2ecf20Sopenharmony_ci		{
17038c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
17048c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
17058c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(5320, 0),
17068c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
17078c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[4].bChannel */ FREQ2FBIN(5560, 0),
17088c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
17098c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
17108c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
17118c2ecf20Sopenharmony_ci		},
17128c2ecf20Sopenharmony_ci
17138c2ecf20Sopenharmony_ci		{
17148c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
17158c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
17168c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
17178c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
17188c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[4].bChannel */ FREQ2FBIN(5550, 0),
17198c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
17208c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[6].bChannel */ FREQ2FBIN(5755, 0),
17218c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[7].bChannel */ FREQ2FBIN(5795, 0)
17228c2ecf20Sopenharmony_ci		}
17238c2ecf20Sopenharmony_ci	},
17248c2ecf20Sopenharmony_ci	.ctlPowerData_5G = {
17258c2ecf20Sopenharmony_ci		{
17268c2ecf20Sopenharmony_ci			{
17278c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
17288c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
17298c2ecf20Sopenharmony_ci			}
17308c2ecf20Sopenharmony_ci		},
17318c2ecf20Sopenharmony_ci		{
17328c2ecf20Sopenharmony_ci			{
17338c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
17348c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
17358c2ecf20Sopenharmony_ci			}
17368c2ecf20Sopenharmony_ci		},
17378c2ecf20Sopenharmony_ci		{
17388c2ecf20Sopenharmony_ci			{
17398c2ecf20Sopenharmony_ci				CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 1),
17408c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
17418c2ecf20Sopenharmony_ci			}
17428c2ecf20Sopenharmony_ci		},
17438c2ecf20Sopenharmony_ci		{
17448c2ecf20Sopenharmony_ci			{
17458c2ecf20Sopenharmony_ci				CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0),
17468c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
17478c2ecf20Sopenharmony_ci			}
17488c2ecf20Sopenharmony_ci		},
17498c2ecf20Sopenharmony_ci		{
17508c2ecf20Sopenharmony_ci			{
17518c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
17528c2ecf20Sopenharmony_ci				CTL(60, 0), CTL(60, 0), CTL(60, 0), CTL(60, 0),
17538c2ecf20Sopenharmony_ci			}
17548c2ecf20Sopenharmony_ci		},
17558c2ecf20Sopenharmony_ci		{
17568c2ecf20Sopenharmony_ci			{
17578c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
17588c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
17598c2ecf20Sopenharmony_ci			}
17608c2ecf20Sopenharmony_ci		},
17618c2ecf20Sopenharmony_ci		{
17628c2ecf20Sopenharmony_ci			{
17638c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
17648c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
17658c2ecf20Sopenharmony_ci			}
17668c2ecf20Sopenharmony_ci		},
17678c2ecf20Sopenharmony_ci		{
17688c2ecf20Sopenharmony_ci			{
17698c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
17708c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
17718c2ecf20Sopenharmony_ci			}
17728c2ecf20Sopenharmony_ci		},
17738c2ecf20Sopenharmony_ci		{
17748c2ecf20Sopenharmony_ci			{
17758c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 1), CTL(60, 1),
17768c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
17778c2ecf20Sopenharmony_ci			}
17788c2ecf20Sopenharmony_ci		},
17798c2ecf20Sopenharmony_ci	}
17808c2ecf20Sopenharmony_ci};
17818c2ecf20Sopenharmony_ci
17828c2ecf20Sopenharmony_ci
17838c2ecf20Sopenharmony_cistatic const struct ar9300_eeprom ar9300_x112 = {
17848c2ecf20Sopenharmony_ci	.eepromVersion = 2,
17858c2ecf20Sopenharmony_ci	.templateVersion = 5,
17868c2ecf20Sopenharmony_ci	.macAddr = {0x00, 0x03, 0x7f, 0x0, 0x0, 0x0},
17878c2ecf20Sopenharmony_ci	.custData = {"x112-041-f0000"},
17888c2ecf20Sopenharmony_ci	.baseEepHeader = {
17898c2ecf20Sopenharmony_ci		.regDmn = { LE16(0), LE16(0x1f) },
17908c2ecf20Sopenharmony_ci		.txrxMask =  0x77, /* 4 bits tx and 4 bits rx */
17918c2ecf20Sopenharmony_ci		.opCapFlags = {
17928c2ecf20Sopenharmony_ci			.opFlags = AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A,
17938c2ecf20Sopenharmony_ci			.eepMisc = AR9300_EEPMISC_LITTLE_ENDIAN,
17948c2ecf20Sopenharmony_ci		},
17958c2ecf20Sopenharmony_ci		.rfSilent = 0,
17968c2ecf20Sopenharmony_ci		.blueToothOptions = 0,
17978c2ecf20Sopenharmony_ci		.deviceCap = 0,
17988c2ecf20Sopenharmony_ci		.deviceType = 5, /* takes lower byte in eeprom location */
17998c2ecf20Sopenharmony_ci		.pwrTableOffset = AR9300_PWR_TABLE_OFFSET,
18008c2ecf20Sopenharmony_ci		.params_for_tuning_caps = {0, 0},
18018c2ecf20Sopenharmony_ci		.featureEnable = 0x0d,
18028c2ecf20Sopenharmony_ci		/*
18038c2ecf20Sopenharmony_ci		 * bit0 - enable tx temp comp - disabled
18048c2ecf20Sopenharmony_ci		 * bit1 - enable tx volt comp - disabled
18058c2ecf20Sopenharmony_ci		 * bit2 - enable fastclock - enabled
18068c2ecf20Sopenharmony_ci		 * bit3 - enable doubling - enabled
18078c2ecf20Sopenharmony_ci		 * bit4 - enable internal regulator - disabled
18088c2ecf20Sopenharmony_ci		 * bit5 - enable pa predistortion - disabled
18098c2ecf20Sopenharmony_ci		 */
18108c2ecf20Sopenharmony_ci		.miscConfiguration = 0, /* bit0 - turn down drivestrength */
18118c2ecf20Sopenharmony_ci		.eepromWriteEnableGpio = 6,
18128c2ecf20Sopenharmony_ci		.wlanDisableGpio = 0,
18138c2ecf20Sopenharmony_ci		.wlanLedGpio = 8,
18148c2ecf20Sopenharmony_ci		.rxBandSelectGpio = 0xff,
18158c2ecf20Sopenharmony_ci		.txrxgain = 0x0,
18168c2ecf20Sopenharmony_ci		.swreg = 0,
18178c2ecf20Sopenharmony_ci	},
18188c2ecf20Sopenharmony_ci	.modalHeader2G = {
18198c2ecf20Sopenharmony_ci		/* ar9300_modal_eep_header  2g */
18208c2ecf20Sopenharmony_ci		/* 4 idle,t1,t2,b(4 bits per setting) */
18218c2ecf20Sopenharmony_ci		.antCtrlCommon = LE32(0x110),
18228c2ecf20Sopenharmony_ci		/* 4 ra1l1, ra2l1, ra1l2, ra2l2, ra12 */
18238c2ecf20Sopenharmony_ci		.antCtrlCommon2 = LE32(0x22222),
18248c2ecf20Sopenharmony_ci
18258c2ecf20Sopenharmony_ci		/*
18268c2ecf20Sopenharmony_ci		 * antCtrlChain[ar9300_max_chains]; 6 idle, t, r,
18278c2ecf20Sopenharmony_ci		 * rx1, rx12, b (2 bits each)
18288c2ecf20Sopenharmony_ci		 */
18298c2ecf20Sopenharmony_ci		.antCtrlChain = { LE16(0x10), LE16(0x10), LE16(0x10) },
18308c2ecf20Sopenharmony_ci
18318c2ecf20Sopenharmony_ci		/*
18328c2ecf20Sopenharmony_ci		 * xatten1DB[AR9300_max_chains];  3 xatten1_db
18338c2ecf20Sopenharmony_ci		 * for ar9280 (0xa20c/b20c 5:0)
18348c2ecf20Sopenharmony_ci		 */
18358c2ecf20Sopenharmony_ci		.xatten1DB = {0x1b, 0x1b, 0x1b},
18368c2ecf20Sopenharmony_ci
18378c2ecf20Sopenharmony_ci		/*
18388c2ecf20Sopenharmony_ci		 * xatten1Margin[ar9300_max_chains]; 3 xatten1_margin
18398c2ecf20Sopenharmony_ci		 * for ar9280 (0xa20c/b20c 16:12
18408c2ecf20Sopenharmony_ci		 */
18418c2ecf20Sopenharmony_ci		.xatten1Margin = {0x15, 0x15, 0x15},
18428c2ecf20Sopenharmony_ci		.tempSlope = 50,
18438c2ecf20Sopenharmony_ci		.voltSlope = 0,
18448c2ecf20Sopenharmony_ci
18458c2ecf20Sopenharmony_ci		/*
18468c2ecf20Sopenharmony_ci		 * spurChans[OSPrey_eeprom_modal_sPURS]; spur
18478c2ecf20Sopenharmony_ci		 * channels in usual fbin coding format
18488c2ecf20Sopenharmony_ci		 */
18498c2ecf20Sopenharmony_ci		.spurChans = {FREQ2FBIN(2464, 1), 0, 0, 0, 0},
18508c2ecf20Sopenharmony_ci
18518c2ecf20Sopenharmony_ci		/*
18528c2ecf20Sopenharmony_ci		 * noiseFloorThreshch[ar9300_max_cHAINS]; 3 Check
18538c2ecf20Sopenharmony_ci		 * if the register is per chain
18548c2ecf20Sopenharmony_ci		 */
18558c2ecf20Sopenharmony_ci		.noiseFloorThreshCh = {-1, 0, 0},
18568c2ecf20Sopenharmony_ci		.reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
18578c2ecf20Sopenharmony_ci		.quick_drop = 0,
18588c2ecf20Sopenharmony_ci		.xpaBiasLvl = 0,
18598c2ecf20Sopenharmony_ci		.txFrameToDataStart = 0x0e,
18608c2ecf20Sopenharmony_ci		.txFrameToPaOn = 0x0e,
18618c2ecf20Sopenharmony_ci		.txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
18628c2ecf20Sopenharmony_ci		.antennaGain = 0,
18638c2ecf20Sopenharmony_ci		.switchSettling = 0x2c,
18648c2ecf20Sopenharmony_ci		.adcDesiredSize = -30,
18658c2ecf20Sopenharmony_ci		.txEndToXpaOff = 0,
18668c2ecf20Sopenharmony_ci		.txEndToRxOn = 0x2,
18678c2ecf20Sopenharmony_ci		.txFrameToXpaOn = 0xe,
18688c2ecf20Sopenharmony_ci		.thresh62 = 28,
18698c2ecf20Sopenharmony_ci		.papdRateMaskHt20 = LE32(0x0c80c080),
18708c2ecf20Sopenharmony_ci		.papdRateMaskHt40 = LE32(0x0080c080),
18718c2ecf20Sopenharmony_ci		.switchcomspdt = 0,
18728c2ecf20Sopenharmony_ci		.xlna_bias_strength = 0,
18738c2ecf20Sopenharmony_ci		.futureModal = {
18748c2ecf20Sopenharmony_ci			0, 0, 0, 0, 0, 0, 0,
18758c2ecf20Sopenharmony_ci		},
18768c2ecf20Sopenharmony_ci	},
18778c2ecf20Sopenharmony_ci	.base_ext1 = {
18788c2ecf20Sopenharmony_ci		.ant_div_control = 0,
18798c2ecf20Sopenharmony_ci		.future = {0, 0},
18808c2ecf20Sopenharmony_ci		.tempslopextension = {0, 0, 0, 0, 0, 0, 0, 0}
18818c2ecf20Sopenharmony_ci	},
18828c2ecf20Sopenharmony_ci	.calFreqPier2G = {
18838c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
18848c2ecf20Sopenharmony_ci		FREQ2FBIN(2437, 1),
18858c2ecf20Sopenharmony_ci		FREQ2FBIN(2472, 1),
18868c2ecf20Sopenharmony_ci	},
18878c2ecf20Sopenharmony_ci	/* ar9300_cal_data_per_freq_op_loop 2g */
18888c2ecf20Sopenharmony_ci	.calPierData2G = {
18898c2ecf20Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
18908c2ecf20Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
18918c2ecf20Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
18928c2ecf20Sopenharmony_ci	},
18938c2ecf20Sopenharmony_ci	.calTarget_freqbin_Cck = {
18948c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
18958c2ecf20Sopenharmony_ci		FREQ2FBIN(2472, 1),
18968c2ecf20Sopenharmony_ci	},
18978c2ecf20Sopenharmony_ci	.calTarget_freqbin_2G = {
18988c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
18998c2ecf20Sopenharmony_ci		FREQ2FBIN(2437, 1),
19008c2ecf20Sopenharmony_ci		FREQ2FBIN(2472, 1)
19018c2ecf20Sopenharmony_ci	},
19028c2ecf20Sopenharmony_ci	.calTarget_freqbin_2GHT20 = {
19038c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
19048c2ecf20Sopenharmony_ci		FREQ2FBIN(2437, 1),
19058c2ecf20Sopenharmony_ci		FREQ2FBIN(2472, 1)
19068c2ecf20Sopenharmony_ci	},
19078c2ecf20Sopenharmony_ci	.calTarget_freqbin_2GHT40 = {
19088c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
19098c2ecf20Sopenharmony_ci		FREQ2FBIN(2437, 1),
19108c2ecf20Sopenharmony_ci		FREQ2FBIN(2472, 1)
19118c2ecf20Sopenharmony_ci	},
19128c2ecf20Sopenharmony_ci	.calTargetPowerCck = {
19138c2ecf20Sopenharmony_ci		/* 1L-5L,5S,11L,11s */
19148c2ecf20Sopenharmony_ci		{ {38, 38, 38, 38} },
19158c2ecf20Sopenharmony_ci		{ {38, 38, 38, 38} },
19168c2ecf20Sopenharmony_ci	},
19178c2ecf20Sopenharmony_ci	.calTargetPower2G = {
19188c2ecf20Sopenharmony_ci		/* 6-24,36,48,54 */
19198c2ecf20Sopenharmony_ci		{ {38, 38, 36, 34} },
19208c2ecf20Sopenharmony_ci		{ {38, 38, 36, 34} },
19218c2ecf20Sopenharmony_ci		{ {38, 38, 34, 32} },
19228c2ecf20Sopenharmony_ci	},
19238c2ecf20Sopenharmony_ci	.calTargetPower2GHT20 = {
19248c2ecf20Sopenharmony_ci		{ {36, 36, 36, 36, 36, 34, 34, 32, 30, 28, 28, 28, 28, 26} },
19258c2ecf20Sopenharmony_ci		{ {36, 36, 36, 36, 36, 34, 36, 34, 32, 30, 30, 30, 28, 26} },
19268c2ecf20Sopenharmony_ci		{ {36, 36, 36, 36, 36, 34, 34, 32, 30, 28, 28, 28, 28, 26} },
19278c2ecf20Sopenharmony_ci	},
19288c2ecf20Sopenharmony_ci	.calTargetPower2GHT40 = {
19298c2ecf20Sopenharmony_ci		{ {36, 36, 36, 36, 34, 32, 32, 30, 28, 26, 26, 26, 26, 24} },
19308c2ecf20Sopenharmony_ci		{ {36, 36, 36, 36, 34, 32, 34, 32, 30, 28, 28, 28, 28, 24} },
19318c2ecf20Sopenharmony_ci		{ {36, 36, 36, 36, 34, 32, 32, 30, 28, 26, 26, 26, 26, 24} },
19328c2ecf20Sopenharmony_ci	},
19338c2ecf20Sopenharmony_ci	.ctlIndex_2G =  {
19348c2ecf20Sopenharmony_ci		0x11, 0x12, 0x15, 0x17, 0x41, 0x42,
19358c2ecf20Sopenharmony_ci		0x45, 0x47, 0x31, 0x32, 0x35, 0x37,
19368c2ecf20Sopenharmony_ci	},
19378c2ecf20Sopenharmony_ci	.ctl_freqbin_2G = {
19388c2ecf20Sopenharmony_ci		{
19398c2ecf20Sopenharmony_ci			FREQ2FBIN(2412, 1),
19408c2ecf20Sopenharmony_ci			FREQ2FBIN(2417, 1),
19418c2ecf20Sopenharmony_ci			FREQ2FBIN(2457, 1),
19428c2ecf20Sopenharmony_ci			FREQ2FBIN(2462, 1)
19438c2ecf20Sopenharmony_ci		},
19448c2ecf20Sopenharmony_ci		{
19458c2ecf20Sopenharmony_ci			FREQ2FBIN(2412, 1),
19468c2ecf20Sopenharmony_ci			FREQ2FBIN(2417, 1),
19478c2ecf20Sopenharmony_ci			FREQ2FBIN(2462, 1),
19488c2ecf20Sopenharmony_ci			0xFF,
19498c2ecf20Sopenharmony_ci		},
19508c2ecf20Sopenharmony_ci
19518c2ecf20Sopenharmony_ci		{
19528c2ecf20Sopenharmony_ci			FREQ2FBIN(2412, 1),
19538c2ecf20Sopenharmony_ci			FREQ2FBIN(2417, 1),
19548c2ecf20Sopenharmony_ci			FREQ2FBIN(2462, 1),
19558c2ecf20Sopenharmony_ci			0xFF,
19568c2ecf20Sopenharmony_ci		},
19578c2ecf20Sopenharmony_ci		{
19588c2ecf20Sopenharmony_ci			FREQ2FBIN(2422, 1),
19598c2ecf20Sopenharmony_ci			FREQ2FBIN(2427, 1),
19608c2ecf20Sopenharmony_ci			FREQ2FBIN(2447, 1),
19618c2ecf20Sopenharmony_ci			FREQ2FBIN(2452, 1)
19628c2ecf20Sopenharmony_ci		},
19638c2ecf20Sopenharmony_ci
19648c2ecf20Sopenharmony_ci		{
19658c2ecf20Sopenharmony_ci			/* Data[4].ctledges[0].bchannel */ FREQ2FBIN(2412, 1),
19668c2ecf20Sopenharmony_ci			/* Data[4].ctledges[1].bchannel */ FREQ2FBIN(2417, 1),
19678c2ecf20Sopenharmony_ci			/* Data[4].ctledges[2].bchannel */ FREQ2FBIN(2472, 1),
19688c2ecf20Sopenharmony_ci			/* Data[4].ctledges[3].bchannel */ FREQ2FBIN(2484, 1),
19698c2ecf20Sopenharmony_ci		},
19708c2ecf20Sopenharmony_ci
19718c2ecf20Sopenharmony_ci		{
19728c2ecf20Sopenharmony_ci			/* Data[5].ctledges[0].bchannel */ FREQ2FBIN(2412, 1),
19738c2ecf20Sopenharmony_ci			/* Data[5].ctledges[1].bchannel */ FREQ2FBIN(2417, 1),
19748c2ecf20Sopenharmony_ci			/* Data[5].ctledges[2].bchannel */ FREQ2FBIN(2472, 1),
19758c2ecf20Sopenharmony_ci			0,
19768c2ecf20Sopenharmony_ci		},
19778c2ecf20Sopenharmony_ci
19788c2ecf20Sopenharmony_ci		{
19798c2ecf20Sopenharmony_ci			/* Data[6].ctledges[0].bchannel */ FREQ2FBIN(2412, 1),
19808c2ecf20Sopenharmony_ci			/* Data[6].ctledges[1].bchannel */ FREQ2FBIN(2417, 1),
19818c2ecf20Sopenharmony_ci			FREQ2FBIN(2472, 1),
19828c2ecf20Sopenharmony_ci			0,
19838c2ecf20Sopenharmony_ci		},
19848c2ecf20Sopenharmony_ci
19858c2ecf20Sopenharmony_ci		{
19868c2ecf20Sopenharmony_ci			/* Data[7].ctledges[0].bchannel */ FREQ2FBIN(2422, 1),
19878c2ecf20Sopenharmony_ci			/* Data[7].ctledges[1].bchannel */ FREQ2FBIN(2427, 1),
19888c2ecf20Sopenharmony_ci			/* Data[7].ctledges[2].bchannel */ FREQ2FBIN(2447, 1),
19898c2ecf20Sopenharmony_ci			/* Data[7].ctledges[3].bchannel */ FREQ2FBIN(2462, 1),
19908c2ecf20Sopenharmony_ci		},
19918c2ecf20Sopenharmony_ci
19928c2ecf20Sopenharmony_ci		{
19938c2ecf20Sopenharmony_ci			/* Data[8].ctledges[0].bchannel */ FREQ2FBIN(2412, 1),
19948c2ecf20Sopenharmony_ci			/* Data[8].ctledges[1].bchannel */ FREQ2FBIN(2417, 1),
19958c2ecf20Sopenharmony_ci			/* Data[8].ctledges[2].bchannel */ FREQ2FBIN(2472, 1),
19968c2ecf20Sopenharmony_ci		},
19978c2ecf20Sopenharmony_ci
19988c2ecf20Sopenharmony_ci		{
19998c2ecf20Sopenharmony_ci			/* Data[9].ctledges[0].bchannel */ FREQ2FBIN(2412, 1),
20008c2ecf20Sopenharmony_ci			/* Data[9].ctledges[1].bchannel */ FREQ2FBIN(2417, 1),
20018c2ecf20Sopenharmony_ci			/* Data[9].ctledges[2].bchannel */ FREQ2FBIN(2472, 1),
20028c2ecf20Sopenharmony_ci			0
20038c2ecf20Sopenharmony_ci		},
20048c2ecf20Sopenharmony_ci
20058c2ecf20Sopenharmony_ci		{
20068c2ecf20Sopenharmony_ci			/* Data[10].ctledges[0].bchannel */ FREQ2FBIN(2412, 1),
20078c2ecf20Sopenharmony_ci			/* Data[10].ctledges[1].bchannel */ FREQ2FBIN(2417, 1),
20088c2ecf20Sopenharmony_ci			/* Data[10].ctledges[2].bchannel */ FREQ2FBIN(2472, 1),
20098c2ecf20Sopenharmony_ci			0
20108c2ecf20Sopenharmony_ci		},
20118c2ecf20Sopenharmony_ci
20128c2ecf20Sopenharmony_ci		{
20138c2ecf20Sopenharmony_ci			/* Data[11].ctledges[0].bchannel */ FREQ2FBIN(2422, 1),
20148c2ecf20Sopenharmony_ci			/* Data[11].ctledges[1].bchannel */ FREQ2FBIN(2427, 1),
20158c2ecf20Sopenharmony_ci			/* Data[11].ctledges[2].bchannel */ FREQ2FBIN(2447, 1),
20168c2ecf20Sopenharmony_ci			/* Data[11].ctledges[3].bchannel */ FREQ2FBIN(2462, 1),
20178c2ecf20Sopenharmony_ci		}
20188c2ecf20Sopenharmony_ci	},
20198c2ecf20Sopenharmony_ci	.ctlPowerData_2G = {
20208c2ecf20Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
20218c2ecf20Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
20228c2ecf20Sopenharmony_ci		{ { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } },
20238c2ecf20Sopenharmony_ci
20248c2ecf20Sopenharmony_ci		{ { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } },
20258c2ecf20Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
20268c2ecf20Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
20278c2ecf20Sopenharmony_ci
20288c2ecf20Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } },
20298c2ecf20Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
20308c2ecf20Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
20318c2ecf20Sopenharmony_ci
20328c2ecf20Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
20338c2ecf20Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
20348c2ecf20Sopenharmony_ci		{ { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
20358c2ecf20Sopenharmony_ci	},
20368c2ecf20Sopenharmony_ci	.modalHeader5G = {
20378c2ecf20Sopenharmony_ci		/* 4 idle,t1,t2,b (4 bits per setting) */
20388c2ecf20Sopenharmony_ci		.antCtrlCommon = LE32(0x110),
20398c2ecf20Sopenharmony_ci		/* 4 ra1l1, ra2l1, ra1l2,ra2l2,ra12 */
20408c2ecf20Sopenharmony_ci		.antCtrlCommon2 = LE32(0x22222),
20418c2ecf20Sopenharmony_ci		/* antCtrlChain 6 idle, t,r,rx1,rx12,b (2 bits each) */
20428c2ecf20Sopenharmony_ci		.antCtrlChain = {
20438c2ecf20Sopenharmony_ci			LE16(0x0), LE16(0x0), LE16(0x0),
20448c2ecf20Sopenharmony_ci		},
20458c2ecf20Sopenharmony_ci		/* xatten1DB 3 xatten1_db for ar9280 (0xa20c/b20c 5:0) */
20468c2ecf20Sopenharmony_ci		.xatten1DB = {0x13, 0x19, 0x17},
20478c2ecf20Sopenharmony_ci
20488c2ecf20Sopenharmony_ci		/*
20498c2ecf20Sopenharmony_ci		 * xatten1Margin[ar9300_max_chains]; 3 xatten1_margin
20508c2ecf20Sopenharmony_ci		 * for merlin (0xa20c/b20c 16:12
20518c2ecf20Sopenharmony_ci		 */
20528c2ecf20Sopenharmony_ci		.xatten1Margin = {0x19, 0x19, 0x19},
20538c2ecf20Sopenharmony_ci		.tempSlope = 70,
20548c2ecf20Sopenharmony_ci		.voltSlope = 15,
20558c2ecf20Sopenharmony_ci		/* spurChans spur channels in usual fbin coding format */
20568c2ecf20Sopenharmony_ci		.spurChans = {0, 0, 0, 0, 0},
20578c2ecf20Sopenharmony_ci		/* noiseFloorThreshch check if the register is per chain */
20588c2ecf20Sopenharmony_ci		.noiseFloorThreshCh = {-1, 0, 0},
20598c2ecf20Sopenharmony_ci		.reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
20608c2ecf20Sopenharmony_ci		.quick_drop = 0,
20618c2ecf20Sopenharmony_ci		.xpaBiasLvl = 0,
20628c2ecf20Sopenharmony_ci		.txFrameToDataStart = 0x0e,
20638c2ecf20Sopenharmony_ci		.txFrameToPaOn = 0x0e,
20648c2ecf20Sopenharmony_ci		.txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
20658c2ecf20Sopenharmony_ci		.antennaGain = 0,
20668c2ecf20Sopenharmony_ci		.switchSettling = 0x2d,
20678c2ecf20Sopenharmony_ci		.adcDesiredSize = -30,
20688c2ecf20Sopenharmony_ci		.txEndToXpaOff = 0,
20698c2ecf20Sopenharmony_ci		.txEndToRxOn = 0x2,
20708c2ecf20Sopenharmony_ci		.txFrameToXpaOn = 0xe,
20718c2ecf20Sopenharmony_ci		.thresh62 = 28,
20728c2ecf20Sopenharmony_ci		.papdRateMaskHt20 = LE32(0x0cf0e0e0),
20738c2ecf20Sopenharmony_ci		.papdRateMaskHt40 = LE32(0x6cf0e0e0),
20748c2ecf20Sopenharmony_ci		.switchcomspdt = 0,
20758c2ecf20Sopenharmony_ci		.xlna_bias_strength = 0,
20768c2ecf20Sopenharmony_ci		.futureModal = {
20778c2ecf20Sopenharmony_ci			0, 0, 0, 0, 0, 0, 0,
20788c2ecf20Sopenharmony_ci		},
20798c2ecf20Sopenharmony_ci	},
20808c2ecf20Sopenharmony_ci	.base_ext2 = {
20818c2ecf20Sopenharmony_ci		.tempSlopeLow = 72,
20828c2ecf20Sopenharmony_ci		.tempSlopeHigh = 105,
20838c2ecf20Sopenharmony_ci		.xatten1DBLow = {0x10, 0x14, 0x10},
20848c2ecf20Sopenharmony_ci		.xatten1MarginLow = {0x19, 0x19 , 0x19},
20858c2ecf20Sopenharmony_ci		.xatten1DBHigh = {0x1d, 0x20, 0x24},
20868c2ecf20Sopenharmony_ci		.xatten1MarginHigh = {0x10, 0x10, 0x10}
20878c2ecf20Sopenharmony_ci	},
20888c2ecf20Sopenharmony_ci	.calFreqPier5G = {
20898c2ecf20Sopenharmony_ci		FREQ2FBIN(5180, 0),
20908c2ecf20Sopenharmony_ci		FREQ2FBIN(5220, 0),
20918c2ecf20Sopenharmony_ci		FREQ2FBIN(5320, 0),
20928c2ecf20Sopenharmony_ci		FREQ2FBIN(5400, 0),
20938c2ecf20Sopenharmony_ci		FREQ2FBIN(5500, 0),
20948c2ecf20Sopenharmony_ci		FREQ2FBIN(5600, 0),
20958c2ecf20Sopenharmony_ci		FREQ2FBIN(5700, 0),
20968c2ecf20Sopenharmony_ci		FREQ2FBIN(5785, 0)
20978c2ecf20Sopenharmony_ci	},
20988c2ecf20Sopenharmony_ci	.calPierData5G = {
20998c2ecf20Sopenharmony_ci		{
21008c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21018c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21028c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21038c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21048c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21058c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21068c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21078c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21088c2ecf20Sopenharmony_ci		},
21098c2ecf20Sopenharmony_ci		{
21108c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21118c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21128c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21138c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21148c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21158c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21168c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21178c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21188c2ecf20Sopenharmony_ci		},
21198c2ecf20Sopenharmony_ci		{
21208c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21218c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21228c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21238c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21248c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21258c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21268c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21278c2ecf20Sopenharmony_ci			{0, 0, 0, 0, 0},
21288c2ecf20Sopenharmony_ci		},
21298c2ecf20Sopenharmony_ci
21308c2ecf20Sopenharmony_ci	},
21318c2ecf20Sopenharmony_ci	.calTarget_freqbin_5G = {
21328c2ecf20Sopenharmony_ci		FREQ2FBIN(5180, 0),
21338c2ecf20Sopenharmony_ci		FREQ2FBIN(5220, 0),
21348c2ecf20Sopenharmony_ci		FREQ2FBIN(5320, 0),
21358c2ecf20Sopenharmony_ci		FREQ2FBIN(5400, 0),
21368c2ecf20Sopenharmony_ci		FREQ2FBIN(5500, 0),
21378c2ecf20Sopenharmony_ci		FREQ2FBIN(5600, 0),
21388c2ecf20Sopenharmony_ci		FREQ2FBIN(5725, 0),
21398c2ecf20Sopenharmony_ci		FREQ2FBIN(5825, 0)
21408c2ecf20Sopenharmony_ci	},
21418c2ecf20Sopenharmony_ci	.calTarget_freqbin_5GHT20 = {
21428c2ecf20Sopenharmony_ci		FREQ2FBIN(5180, 0),
21438c2ecf20Sopenharmony_ci		FREQ2FBIN(5220, 0),
21448c2ecf20Sopenharmony_ci		FREQ2FBIN(5320, 0),
21458c2ecf20Sopenharmony_ci		FREQ2FBIN(5400, 0),
21468c2ecf20Sopenharmony_ci		FREQ2FBIN(5500, 0),
21478c2ecf20Sopenharmony_ci		FREQ2FBIN(5600, 0),
21488c2ecf20Sopenharmony_ci		FREQ2FBIN(5725, 0),
21498c2ecf20Sopenharmony_ci		FREQ2FBIN(5825, 0)
21508c2ecf20Sopenharmony_ci	},
21518c2ecf20Sopenharmony_ci	.calTarget_freqbin_5GHT40 = {
21528c2ecf20Sopenharmony_ci		FREQ2FBIN(5180, 0),
21538c2ecf20Sopenharmony_ci		FREQ2FBIN(5220, 0),
21548c2ecf20Sopenharmony_ci		FREQ2FBIN(5320, 0),
21558c2ecf20Sopenharmony_ci		FREQ2FBIN(5400, 0),
21568c2ecf20Sopenharmony_ci		FREQ2FBIN(5500, 0),
21578c2ecf20Sopenharmony_ci		FREQ2FBIN(5600, 0),
21588c2ecf20Sopenharmony_ci		FREQ2FBIN(5725, 0),
21598c2ecf20Sopenharmony_ci		FREQ2FBIN(5825, 0)
21608c2ecf20Sopenharmony_ci	},
21618c2ecf20Sopenharmony_ci	.calTargetPower5G = {
21628c2ecf20Sopenharmony_ci		/* 6-24,36,48,54 */
21638c2ecf20Sopenharmony_ci		{ {32, 32, 28, 26} },
21648c2ecf20Sopenharmony_ci		{ {32, 32, 28, 26} },
21658c2ecf20Sopenharmony_ci		{ {32, 32, 28, 26} },
21668c2ecf20Sopenharmony_ci		{ {32, 32, 26, 24} },
21678c2ecf20Sopenharmony_ci		{ {32, 32, 26, 24} },
21688c2ecf20Sopenharmony_ci		{ {32, 32, 24, 22} },
21698c2ecf20Sopenharmony_ci		{ {30, 30, 24, 22} },
21708c2ecf20Sopenharmony_ci		{ {30, 30, 24, 22} },
21718c2ecf20Sopenharmony_ci	},
21728c2ecf20Sopenharmony_ci	.calTargetPower5GHT20 = {
21738c2ecf20Sopenharmony_ci		/*
21748c2ecf20Sopenharmony_ci		 * 0_8_16,1-3_9-11_17-19,
21758c2ecf20Sopenharmony_ci		 * 4,5,6,7,12,13,14,15,20,21,22,23
21768c2ecf20Sopenharmony_ci		 */
21778c2ecf20Sopenharmony_ci		{ {32, 32, 32, 32, 28, 26, 32, 28, 26, 24, 24, 24, 22, 22} },
21788c2ecf20Sopenharmony_ci		{ {32, 32, 32, 32, 28, 26, 32, 28, 26, 24, 24, 24, 22, 22} },
21798c2ecf20Sopenharmony_ci		{ {32, 32, 32, 32, 28, 26, 32, 28, 26, 24, 24, 24, 22, 22} },
21808c2ecf20Sopenharmony_ci		{ {32, 32, 32, 32, 28, 26, 32, 26, 24, 22, 22, 22, 20, 20} },
21818c2ecf20Sopenharmony_ci		{ {32, 32, 32, 32, 28, 26, 32, 26, 24, 22, 20, 18, 16, 16} },
21828c2ecf20Sopenharmony_ci		{ {32, 32, 32, 32, 28, 26, 32, 24, 20, 16, 18, 16, 14, 14} },
21838c2ecf20Sopenharmony_ci		{ {30, 30, 30, 30, 28, 26, 30, 24, 20, 16, 18, 16, 14, 14} },
21848c2ecf20Sopenharmony_ci		{ {30, 30, 30, 30, 28, 26, 30, 24, 20, 16, 18, 16, 14, 14} },
21858c2ecf20Sopenharmony_ci	},
21868c2ecf20Sopenharmony_ci	.calTargetPower5GHT40 =  {
21878c2ecf20Sopenharmony_ci		/*
21888c2ecf20Sopenharmony_ci		 * 0_8_16,1-3_9-11_17-19,
21898c2ecf20Sopenharmony_ci		 * 4,5,6,7,12,13,14,15,20,21,22,23
21908c2ecf20Sopenharmony_ci		 */
21918c2ecf20Sopenharmony_ci		{ {32, 32, 32, 30, 28, 26, 30, 28, 26, 24, 24, 24, 22, 22} },
21928c2ecf20Sopenharmony_ci		{ {32, 32, 32, 30, 28, 26, 30, 28, 26, 24, 24, 24, 22, 22} },
21938c2ecf20Sopenharmony_ci		{ {32, 32, 32, 30, 28, 26, 30, 28, 26, 24, 24, 24, 22, 22} },
21948c2ecf20Sopenharmony_ci		{ {32, 32, 32, 30, 28, 26, 30, 26, 24, 22, 22, 22, 20, 20} },
21958c2ecf20Sopenharmony_ci		{ {32, 32, 32, 30, 28, 26, 30, 26, 24, 22, 20, 18, 16, 16} },
21968c2ecf20Sopenharmony_ci		{ {32, 32, 32, 30, 28, 26, 30, 22, 20, 16, 18, 16, 14, 14} },
21978c2ecf20Sopenharmony_ci		{ {30, 30, 30, 30, 28, 26, 30, 22, 20, 16, 18, 16, 14, 14} },
21988c2ecf20Sopenharmony_ci		{ {30, 30, 30, 30, 28, 26, 30, 22, 20, 16, 18, 16, 14, 14} },
21998c2ecf20Sopenharmony_ci	},
22008c2ecf20Sopenharmony_ci	.ctlIndex_5G =  {
22018c2ecf20Sopenharmony_ci		0x10, 0x16, 0x18, 0x40, 0x46,
22028c2ecf20Sopenharmony_ci		0x48, 0x30, 0x36, 0x38
22038c2ecf20Sopenharmony_ci	},
22048c2ecf20Sopenharmony_ci	.ctl_freqbin_5G =  {
22058c2ecf20Sopenharmony_ci		{
22068c2ecf20Sopenharmony_ci			/* Data[0].ctledges[0].bchannel */ FREQ2FBIN(5180, 0),
22078c2ecf20Sopenharmony_ci			/* Data[0].ctledges[1].bchannel */ FREQ2FBIN(5260, 0),
22088c2ecf20Sopenharmony_ci			/* Data[0].ctledges[2].bchannel */ FREQ2FBIN(5280, 0),
22098c2ecf20Sopenharmony_ci			/* Data[0].ctledges[3].bchannel */ FREQ2FBIN(5500, 0),
22108c2ecf20Sopenharmony_ci			/* Data[0].ctledges[4].bchannel */ FREQ2FBIN(5600, 0),
22118c2ecf20Sopenharmony_ci			/* Data[0].ctledges[5].bchannel */ FREQ2FBIN(5700, 0),
22128c2ecf20Sopenharmony_ci			/* Data[0].ctledges[6].bchannel */ FREQ2FBIN(5745, 0),
22138c2ecf20Sopenharmony_ci			/* Data[0].ctledges[7].bchannel */ FREQ2FBIN(5825, 0)
22148c2ecf20Sopenharmony_ci		},
22158c2ecf20Sopenharmony_ci		{
22168c2ecf20Sopenharmony_ci			/* Data[1].ctledges[0].bchannel */ FREQ2FBIN(5180, 0),
22178c2ecf20Sopenharmony_ci			/* Data[1].ctledges[1].bchannel */ FREQ2FBIN(5260, 0),
22188c2ecf20Sopenharmony_ci			/* Data[1].ctledges[2].bchannel */ FREQ2FBIN(5280, 0),
22198c2ecf20Sopenharmony_ci			/* Data[1].ctledges[3].bchannel */ FREQ2FBIN(5500, 0),
22208c2ecf20Sopenharmony_ci			/* Data[1].ctledges[4].bchannel */ FREQ2FBIN(5520, 0),
22218c2ecf20Sopenharmony_ci			/* Data[1].ctledges[5].bchannel */ FREQ2FBIN(5700, 0),
22228c2ecf20Sopenharmony_ci			/* Data[1].ctledges[6].bchannel */ FREQ2FBIN(5745, 0),
22238c2ecf20Sopenharmony_ci			/* Data[1].ctledges[7].bchannel */ FREQ2FBIN(5825, 0)
22248c2ecf20Sopenharmony_ci		},
22258c2ecf20Sopenharmony_ci
22268c2ecf20Sopenharmony_ci		{
22278c2ecf20Sopenharmony_ci			/* Data[2].ctledges[0].bchannel */ FREQ2FBIN(5190, 0),
22288c2ecf20Sopenharmony_ci			/* Data[2].ctledges[1].bchannel */ FREQ2FBIN(5230, 0),
22298c2ecf20Sopenharmony_ci			/* Data[2].ctledges[2].bchannel */ FREQ2FBIN(5270, 0),
22308c2ecf20Sopenharmony_ci			/* Data[2].ctledges[3].bchannel */ FREQ2FBIN(5310, 0),
22318c2ecf20Sopenharmony_ci			/* Data[2].ctledges[4].bchannel */ FREQ2FBIN(5510, 0),
22328c2ecf20Sopenharmony_ci			/* Data[2].ctledges[5].bchannel */ FREQ2FBIN(5550, 0),
22338c2ecf20Sopenharmony_ci			/* Data[2].ctledges[6].bchannel */ FREQ2FBIN(5670, 0),
22348c2ecf20Sopenharmony_ci			/* Data[2].ctledges[7].bchannel */ FREQ2FBIN(5755, 0)
22358c2ecf20Sopenharmony_ci		},
22368c2ecf20Sopenharmony_ci
22378c2ecf20Sopenharmony_ci		{
22388c2ecf20Sopenharmony_ci			/* Data[3].ctledges[0].bchannel */ FREQ2FBIN(5180, 0),
22398c2ecf20Sopenharmony_ci			/* Data[3].ctledges[1].bchannel */ FREQ2FBIN(5200, 0),
22408c2ecf20Sopenharmony_ci			/* Data[3].ctledges[2].bchannel */ FREQ2FBIN(5260, 0),
22418c2ecf20Sopenharmony_ci			/* Data[3].ctledges[3].bchannel */ FREQ2FBIN(5320, 0),
22428c2ecf20Sopenharmony_ci			/* Data[3].ctledges[4].bchannel */ FREQ2FBIN(5500, 0),
22438c2ecf20Sopenharmony_ci			/* Data[3].ctledges[5].bchannel */ FREQ2FBIN(5700, 0),
22448c2ecf20Sopenharmony_ci			/* Data[3].ctledges[6].bchannel */ 0xFF,
22458c2ecf20Sopenharmony_ci			/* Data[3].ctledges[7].bchannel */ 0xFF,
22468c2ecf20Sopenharmony_ci		},
22478c2ecf20Sopenharmony_ci
22488c2ecf20Sopenharmony_ci		{
22498c2ecf20Sopenharmony_ci			/* Data[4].ctledges[0].bchannel */ FREQ2FBIN(5180, 0),
22508c2ecf20Sopenharmony_ci			/* Data[4].ctledges[1].bchannel */ FREQ2FBIN(5260, 0),
22518c2ecf20Sopenharmony_ci			/* Data[4].ctledges[2].bchannel */ FREQ2FBIN(5500, 0),
22528c2ecf20Sopenharmony_ci			/* Data[4].ctledges[3].bchannel */ FREQ2FBIN(5700, 0),
22538c2ecf20Sopenharmony_ci			/* Data[4].ctledges[4].bchannel */ 0xFF,
22548c2ecf20Sopenharmony_ci			/* Data[4].ctledges[5].bchannel */ 0xFF,
22558c2ecf20Sopenharmony_ci			/* Data[4].ctledges[6].bchannel */ 0xFF,
22568c2ecf20Sopenharmony_ci			/* Data[4].ctledges[7].bchannel */ 0xFF,
22578c2ecf20Sopenharmony_ci		},
22588c2ecf20Sopenharmony_ci
22598c2ecf20Sopenharmony_ci		{
22608c2ecf20Sopenharmony_ci			/* Data[5].ctledges[0].bchannel */ FREQ2FBIN(5190, 0),
22618c2ecf20Sopenharmony_ci			/* Data[5].ctledges[1].bchannel */ FREQ2FBIN(5270, 0),
22628c2ecf20Sopenharmony_ci			/* Data[5].ctledges[2].bchannel */ FREQ2FBIN(5310, 0),
22638c2ecf20Sopenharmony_ci			/* Data[5].ctledges[3].bchannel */ FREQ2FBIN(5510, 0),
22648c2ecf20Sopenharmony_ci			/* Data[5].ctledges[4].bchannel */ FREQ2FBIN(5590, 0),
22658c2ecf20Sopenharmony_ci			/* Data[5].ctledges[5].bchannel */ FREQ2FBIN(5670, 0),
22668c2ecf20Sopenharmony_ci			/* Data[5].ctledges[6].bchannel */ 0xFF,
22678c2ecf20Sopenharmony_ci			/* Data[5].ctledges[7].bchannel */ 0xFF
22688c2ecf20Sopenharmony_ci		},
22698c2ecf20Sopenharmony_ci
22708c2ecf20Sopenharmony_ci		{
22718c2ecf20Sopenharmony_ci			/* Data[6].ctledges[0].bchannel */ FREQ2FBIN(5180, 0),
22728c2ecf20Sopenharmony_ci			/* Data[6].ctledges[1].bchannel */ FREQ2FBIN(5200, 0),
22738c2ecf20Sopenharmony_ci			/* Data[6].ctledges[2].bchannel */ FREQ2FBIN(5220, 0),
22748c2ecf20Sopenharmony_ci			/* Data[6].ctledges[3].bchannel */ FREQ2FBIN(5260, 0),
22758c2ecf20Sopenharmony_ci			/* Data[6].ctledges[4].bchannel */ FREQ2FBIN(5500, 0),
22768c2ecf20Sopenharmony_ci			/* Data[6].ctledges[5].bchannel */ FREQ2FBIN(5600, 0),
22778c2ecf20Sopenharmony_ci			/* Data[6].ctledges[6].bchannel */ FREQ2FBIN(5700, 0),
22788c2ecf20Sopenharmony_ci			/* Data[6].ctledges[7].bchannel */ FREQ2FBIN(5745, 0)
22798c2ecf20Sopenharmony_ci		},
22808c2ecf20Sopenharmony_ci
22818c2ecf20Sopenharmony_ci		{
22828c2ecf20Sopenharmony_ci			/* Data[7].ctledges[0].bchannel */ FREQ2FBIN(5180, 0),
22838c2ecf20Sopenharmony_ci			/* Data[7].ctledges[1].bchannel */ FREQ2FBIN(5260, 0),
22848c2ecf20Sopenharmony_ci			/* Data[7].ctledges[2].bchannel */ FREQ2FBIN(5320, 0),
22858c2ecf20Sopenharmony_ci			/* Data[7].ctledges[3].bchannel */ FREQ2FBIN(5500, 0),
22868c2ecf20Sopenharmony_ci			/* Data[7].ctledges[4].bchannel */ FREQ2FBIN(5560, 0),
22878c2ecf20Sopenharmony_ci			/* Data[7].ctledges[5].bchannel */ FREQ2FBIN(5700, 0),
22888c2ecf20Sopenharmony_ci			/* Data[7].ctledges[6].bchannel */ FREQ2FBIN(5745, 0),
22898c2ecf20Sopenharmony_ci			/* Data[7].ctledges[7].bchannel */ FREQ2FBIN(5825, 0)
22908c2ecf20Sopenharmony_ci		},
22918c2ecf20Sopenharmony_ci
22928c2ecf20Sopenharmony_ci		{
22938c2ecf20Sopenharmony_ci			/* Data[8].ctledges[0].bchannel */ FREQ2FBIN(5190, 0),
22948c2ecf20Sopenharmony_ci			/* Data[8].ctledges[1].bchannel */ FREQ2FBIN(5230, 0),
22958c2ecf20Sopenharmony_ci			/* Data[8].ctledges[2].bchannel */ FREQ2FBIN(5270, 0),
22968c2ecf20Sopenharmony_ci			/* Data[8].ctledges[3].bchannel */ FREQ2FBIN(5510, 0),
22978c2ecf20Sopenharmony_ci			/* Data[8].ctledges[4].bchannel */ FREQ2FBIN(5550, 0),
22988c2ecf20Sopenharmony_ci			/* Data[8].ctledges[5].bchannel */ FREQ2FBIN(5670, 0),
22998c2ecf20Sopenharmony_ci			/* Data[8].ctledges[6].bchannel */ FREQ2FBIN(5755, 0),
23008c2ecf20Sopenharmony_ci			/* Data[8].ctledges[7].bchannel */ FREQ2FBIN(5795, 0)
23018c2ecf20Sopenharmony_ci		}
23028c2ecf20Sopenharmony_ci	},
23038c2ecf20Sopenharmony_ci	.ctlPowerData_5G = {
23048c2ecf20Sopenharmony_ci		{
23058c2ecf20Sopenharmony_ci			{
23068c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
23078c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
23088c2ecf20Sopenharmony_ci			}
23098c2ecf20Sopenharmony_ci		},
23108c2ecf20Sopenharmony_ci		{
23118c2ecf20Sopenharmony_ci			{
23128c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
23138c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
23148c2ecf20Sopenharmony_ci			}
23158c2ecf20Sopenharmony_ci		},
23168c2ecf20Sopenharmony_ci		{
23178c2ecf20Sopenharmony_ci			{
23188c2ecf20Sopenharmony_ci				CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 1),
23198c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
23208c2ecf20Sopenharmony_ci			}
23218c2ecf20Sopenharmony_ci		},
23228c2ecf20Sopenharmony_ci		{
23238c2ecf20Sopenharmony_ci			{
23248c2ecf20Sopenharmony_ci				CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0),
23258c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
23268c2ecf20Sopenharmony_ci			}
23278c2ecf20Sopenharmony_ci		},
23288c2ecf20Sopenharmony_ci		{
23298c2ecf20Sopenharmony_ci			{
23308c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
23318c2ecf20Sopenharmony_ci				CTL(60, 0), CTL(60, 0), CTL(60, 0), CTL(60, 0),
23328c2ecf20Sopenharmony_ci			}
23338c2ecf20Sopenharmony_ci		},
23348c2ecf20Sopenharmony_ci		{
23358c2ecf20Sopenharmony_ci			{
23368c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
23378c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
23388c2ecf20Sopenharmony_ci			}
23398c2ecf20Sopenharmony_ci		},
23408c2ecf20Sopenharmony_ci		{
23418c2ecf20Sopenharmony_ci			{
23428c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
23438c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
23448c2ecf20Sopenharmony_ci			}
23458c2ecf20Sopenharmony_ci		},
23468c2ecf20Sopenharmony_ci		{
23478c2ecf20Sopenharmony_ci			{
23488c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
23498c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
23508c2ecf20Sopenharmony_ci			}
23518c2ecf20Sopenharmony_ci		},
23528c2ecf20Sopenharmony_ci		{
23538c2ecf20Sopenharmony_ci			{
23548c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 1), CTL(60, 1),
23558c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
23568c2ecf20Sopenharmony_ci			}
23578c2ecf20Sopenharmony_ci		},
23588c2ecf20Sopenharmony_ci	}
23598c2ecf20Sopenharmony_ci};
23608c2ecf20Sopenharmony_ci
23618c2ecf20Sopenharmony_cistatic const struct ar9300_eeprom ar9300_h116 = {
23628c2ecf20Sopenharmony_ci	.eepromVersion = 2,
23638c2ecf20Sopenharmony_ci	.templateVersion = 4,
23648c2ecf20Sopenharmony_ci	.macAddr = {0x00, 0x03, 0x7f, 0x0, 0x0, 0x0},
23658c2ecf20Sopenharmony_ci	.custData = {"h116-041-f0000"},
23668c2ecf20Sopenharmony_ci	.baseEepHeader = {
23678c2ecf20Sopenharmony_ci		.regDmn = { LE16(0), LE16(0x1f) },
23688c2ecf20Sopenharmony_ci		.txrxMask =  0x33, /* 4 bits tx and 4 bits rx */
23698c2ecf20Sopenharmony_ci		.opCapFlags = {
23708c2ecf20Sopenharmony_ci			.opFlags = AR5416_OPFLAGS_11G | AR5416_OPFLAGS_11A,
23718c2ecf20Sopenharmony_ci			.eepMisc = AR9300_EEPMISC_LITTLE_ENDIAN,
23728c2ecf20Sopenharmony_ci		},
23738c2ecf20Sopenharmony_ci		.rfSilent = 0,
23748c2ecf20Sopenharmony_ci		.blueToothOptions = 0,
23758c2ecf20Sopenharmony_ci		.deviceCap = 0,
23768c2ecf20Sopenharmony_ci		.deviceType = 5, /* takes lower byte in eeprom location */
23778c2ecf20Sopenharmony_ci		.pwrTableOffset = AR9300_PWR_TABLE_OFFSET,
23788c2ecf20Sopenharmony_ci		.params_for_tuning_caps = {0, 0},
23798c2ecf20Sopenharmony_ci		.featureEnable = 0x0d,
23808c2ecf20Sopenharmony_ci		 /*
23818c2ecf20Sopenharmony_ci		  * bit0 - enable tx temp comp - disabled
23828c2ecf20Sopenharmony_ci		  * bit1 - enable tx volt comp - disabled
23838c2ecf20Sopenharmony_ci		  * bit2 - enable fastClock - enabled
23848c2ecf20Sopenharmony_ci		  * bit3 - enable doubling - enabled
23858c2ecf20Sopenharmony_ci		  * bit4 - enable internal regulator - disabled
23868c2ecf20Sopenharmony_ci		  * bit5 - enable pa predistortion - disabled
23878c2ecf20Sopenharmony_ci		  */
23888c2ecf20Sopenharmony_ci		.miscConfiguration = 0, /* bit0 - turn down drivestrength */
23898c2ecf20Sopenharmony_ci		.eepromWriteEnableGpio = 6,
23908c2ecf20Sopenharmony_ci		.wlanDisableGpio = 0,
23918c2ecf20Sopenharmony_ci		.wlanLedGpio = 8,
23928c2ecf20Sopenharmony_ci		.rxBandSelectGpio = 0xff,
23938c2ecf20Sopenharmony_ci		.txrxgain = 0x10,
23948c2ecf20Sopenharmony_ci		.swreg = 0,
23958c2ecf20Sopenharmony_ci	 },
23968c2ecf20Sopenharmony_ci	.modalHeader2G = {
23978c2ecf20Sopenharmony_ci	/* ar9300_modal_eep_header  2g */
23988c2ecf20Sopenharmony_ci		/* 4 idle,t1,t2,b(4 bits per setting) */
23998c2ecf20Sopenharmony_ci		.antCtrlCommon = LE32(0x110),
24008c2ecf20Sopenharmony_ci		/* 4 ra1l1, ra2l1, ra1l2, ra2l2, ra12 */
24018c2ecf20Sopenharmony_ci		.antCtrlCommon2 = LE32(0x44444),
24028c2ecf20Sopenharmony_ci
24038c2ecf20Sopenharmony_ci		/*
24048c2ecf20Sopenharmony_ci		 * antCtrlChain[AR9300_MAX_CHAINS]; 6 idle, t, r,
24058c2ecf20Sopenharmony_ci		 * rx1, rx12, b (2 bits each)
24068c2ecf20Sopenharmony_ci		 */
24078c2ecf20Sopenharmony_ci		.antCtrlChain = { LE16(0x10), LE16(0x10), LE16(0x10) },
24088c2ecf20Sopenharmony_ci
24098c2ecf20Sopenharmony_ci		/*
24108c2ecf20Sopenharmony_ci		 * xatten1DB[AR9300_MAX_CHAINS];  3 xatten1_db
24118c2ecf20Sopenharmony_ci		 * for ar9280 (0xa20c/b20c 5:0)
24128c2ecf20Sopenharmony_ci		 */
24138c2ecf20Sopenharmony_ci		.xatten1DB = {0x1f, 0x1f, 0x1f},
24148c2ecf20Sopenharmony_ci
24158c2ecf20Sopenharmony_ci		/*
24168c2ecf20Sopenharmony_ci		 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
24178c2ecf20Sopenharmony_ci		 * for ar9280 (0xa20c/b20c 16:12
24188c2ecf20Sopenharmony_ci		 */
24198c2ecf20Sopenharmony_ci		.xatten1Margin = {0x12, 0x12, 0x12},
24208c2ecf20Sopenharmony_ci		.tempSlope = 25,
24218c2ecf20Sopenharmony_ci		.voltSlope = 0,
24228c2ecf20Sopenharmony_ci
24238c2ecf20Sopenharmony_ci		/*
24248c2ecf20Sopenharmony_ci		 * spurChans[OSPREY_EEPROM_MODAL_SPURS]; spur
24258c2ecf20Sopenharmony_ci		 * channels in usual fbin coding format
24268c2ecf20Sopenharmony_ci		 */
24278c2ecf20Sopenharmony_ci		.spurChans = {FREQ2FBIN(2464, 1), 0, 0, 0, 0},
24288c2ecf20Sopenharmony_ci
24298c2ecf20Sopenharmony_ci		/*
24308c2ecf20Sopenharmony_ci		 * noiseFloorThreshCh[AR9300_MAX_CHAINS]; 3 Check
24318c2ecf20Sopenharmony_ci		 * if the register is per chain
24328c2ecf20Sopenharmony_ci		 */
24338c2ecf20Sopenharmony_ci		.noiseFloorThreshCh = {-1, 0, 0},
24348c2ecf20Sopenharmony_ci		.reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
24358c2ecf20Sopenharmony_ci		.quick_drop = 0,
24368c2ecf20Sopenharmony_ci		.xpaBiasLvl = 0,
24378c2ecf20Sopenharmony_ci		.txFrameToDataStart = 0x0e,
24388c2ecf20Sopenharmony_ci		.txFrameToPaOn = 0x0e,
24398c2ecf20Sopenharmony_ci		.txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
24408c2ecf20Sopenharmony_ci		.antennaGain = 0,
24418c2ecf20Sopenharmony_ci		.switchSettling = 0x2c,
24428c2ecf20Sopenharmony_ci		.adcDesiredSize = -30,
24438c2ecf20Sopenharmony_ci		.txEndToXpaOff = 0,
24448c2ecf20Sopenharmony_ci		.txEndToRxOn = 0x2,
24458c2ecf20Sopenharmony_ci		.txFrameToXpaOn = 0xe,
24468c2ecf20Sopenharmony_ci		.thresh62 = 28,
24478c2ecf20Sopenharmony_ci		.papdRateMaskHt20 = LE32(0x0c80C080),
24488c2ecf20Sopenharmony_ci		.papdRateMaskHt40 = LE32(0x0080C080),
24498c2ecf20Sopenharmony_ci		.switchcomspdt = 0,
24508c2ecf20Sopenharmony_ci		.xlna_bias_strength = 0,
24518c2ecf20Sopenharmony_ci		.futureModal = {
24528c2ecf20Sopenharmony_ci			0, 0, 0, 0, 0, 0, 0,
24538c2ecf20Sopenharmony_ci		},
24548c2ecf20Sopenharmony_ci	 },
24558c2ecf20Sopenharmony_ci	 .base_ext1 = {
24568c2ecf20Sopenharmony_ci		.ant_div_control = 0,
24578c2ecf20Sopenharmony_ci		.future = {0, 0},
24588c2ecf20Sopenharmony_ci		.tempslopextension = {0, 0, 0, 0, 0, 0, 0, 0}
24598c2ecf20Sopenharmony_ci	 },
24608c2ecf20Sopenharmony_ci	.calFreqPier2G = {
24618c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
24628c2ecf20Sopenharmony_ci		FREQ2FBIN(2437, 1),
24638c2ecf20Sopenharmony_ci		FREQ2FBIN(2462, 1),
24648c2ecf20Sopenharmony_ci	 },
24658c2ecf20Sopenharmony_ci	/* ar9300_cal_data_per_freq_op_loop 2g */
24668c2ecf20Sopenharmony_ci	.calPierData2G = {
24678c2ecf20Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
24688c2ecf20Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
24698c2ecf20Sopenharmony_ci		{ {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0}, {0, 0, 0, 0, 0, 0} },
24708c2ecf20Sopenharmony_ci	 },
24718c2ecf20Sopenharmony_ci	.calTarget_freqbin_Cck = {
24728c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
24738c2ecf20Sopenharmony_ci		FREQ2FBIN(2472, 1),
24748c2ecf20Sopenharmony_ci	 },
24758c2ecf20Sopenharmony_ci	.calTarget_freqbin_2G = {
24768c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
24778c2ecf20Sopenharmony_ci		FREQ2FBIN(2437, 1),
24788c2ecf20Sopenharmony_ci		FREQ2FBIN(2472, 1)
24798c2ecf20Sopenharmony_ci	 },
24808c2ecf20Sopenharmony_ci	.calTarget_freqbin_2GHT20 = {
24818c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
24828c2ecf20Sopenharmony_ci		FREQ2FBIN(2437, 1),
24838c2ecf20Sopenharmony_ci		FREQ2FBIN(2472, 1)
24848c2ecf20Sopenharmony_ci	 },
24858c2ecf20Sopenharmony_ci	.calTarget_freqbin_2GHT40 = {
24868c2ecf20Sopenharmony_ci		FREQ2FBIN(2412, 1),
24878c2ecf20Sopenharmony_ci		FREQ2FBIN(2437, 1),
24888c2ecf20Sopenharmony_ci		FREQ2FBIN(2472, 1)
24898c2ecf20Sopenharmony_ci	 },
24908c2ecf20Sopenharmony_ci	.calTargetPowerCck = {
24918c2ecf20Sopenharmony_ci		 /* 1L-5L,5S,11L,11S */
24928c2ecf20Sopenharmony_ci		 { {34, 34, 34, 34} },
24938c2ecf20Sopenharmony_ci		 { {34, 34, 34, 34} },
24948c2ecf20Sopenharmony_ci	},
24958c2ecf20Sopenharmony_ci	.calTargetPower2G = {
24968c2ecf20Sopenharmony_ci		 /* 6-24,36,48,54 */
24978c2ecf20Sopenharmony_ci		 { {34, 34, 32, 32} },
24988c2ecf20Sopenharmony_ci		 { {34, 34, 32, 32} },
24998c2ecf20Sopenharmony_ci		 { {34, 34, 32, 32} },
25008c2ecf20Sopenharmony_ci	},
25018c2ecf20Sopenharmony_ci	.calTargetPower2GHT20 = {
25028c2ecf20Sopenharmony_ci		{ {32, 32, 32, 32, 32, 30, 32, 32, 30, 28, 0, 0, 0, 0} },
25038c2ecf20Sopenharmony_ci		{ {32, 32, 32, 32, 32, 30, 32, 32, 30, 28, 0, 0, 0, 0} },
25048c2ecf20Sopenharmony_ci		{ {32, 32, 32, 32, 32, 30, 32, 32, 30, 28, 0, 0, 0, 0} },
25058c2ecf20Sopenharmony_ci	},
25068c2ecf20Sopenharmony_ci	.calTargetPower2GHT40 = {
25078c2ecf20Sopenharmony_ci		{ {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 0, 0, 0, 0} },
25088c2ecf20Sopenharmony_ci		{ {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 0, 0, 0, 0} },
25098c2ecf20Sopenharmony_ci		{ {30, 30, 30, 30, 30, 28, 30, 30, 28, 26, 0, 0, 0, 0} },
25108c2ecf20Sopenharmony_ci	},
25118c2ecf20Sopenharmony_ci	.ctlIndex_2G =  {
25128c2ecf20Sopenharmony_ci		0x11, 0x12, 0x15, 0x17, 0x41, 0x42,
25138c2ecf20Sopenharmony_ci		0x45, 0x47, 0x31, 0x32, 0x35, 0x37,
25148c2ecf20Sopenharmony_ci	},
25158c2ecf20Sopenharmony_ci	.ctl_freqbin_2G = {
25168c2ecf20Sopenharmony_ci		{
25178c2ecf20Sopenharmony_ci			FREQ2FBIN(2412, 1),
25188c2ecf20Sopenharmony_ci			FREQ2FBIN(2417, 1),
25198c2ecf20Sopenharmony_ci			FREQ2FBIN(2457, 1),
25208c2ecf20Sopenharmony_ci			FREQ2FBIN(2462, 1)
25218c2ecf20Sopenharmony_ci		},
25228c2ecf20Sopenharmony_ci		{
25238c2ecf20Sopenharmony_ci			FREQ2FBIN(2412, 1),
25248c2ecf20Sopenharmony_ci			FREQ2FBIN(2417, 1),
25258c2ecf20Sopenharmony_ci			FREQ2FBIN(2462, 1),
25268c2ecf20Sopenharmony_ci			0xFF,
25278c2ecf20Sopenharmony_ci		},
25288c2ecf20Sopenharmony_ci
25298c2ecf20Sopenharmony_ci		{
25308c2ecf20Sopenharmony_ci			FREQ2FBIN(2412, 1),
25318c2ecf20Sopenharmony_ci			FREQ2FBIN(2417, 1),
25328c2ecf20Sopenharmony_ci			FREQ2FBIN(2462, 1),
25338c2ecf20Sopenharmony_ci			0xFF,
25348c2ecf20Sopenharmony_ci		},
25358c2ecf20Sopenharmony_ci		{
25368c2ecf20Sopenharmony_ci			FREQ2FBIN(2422, 1),
25378c2ecf20Sopenharmony_ci			FREQ2FBIN(2427, 1),
25388c2ecf20Sopenharmony_ci			FREQ2FBIN(2447, 1),
25398c2ecf20Sopenharmony_ci			FREQ2FBIN(2452, 1)
25408c2ecf20Sopenharmony_ci		},
25418c2ecf20Sopenharmony_ci
25428c2ecf20Sopenharmony_ci		{
25438c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
25448c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
25458c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
25468c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(2484, 1),
25478c2ecf20Sopenharmony_ci		},
25488c2ecf20Sopenharmony_ci
25498c2ecf20Sopenharmony_ci		{
25508c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
25518c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
25528c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
25538c2ecf20Sopenharmony_ci			0,
25548c2ecf20Sopenharmony_ci		},
25558c2ecf20Sopenharmony_ci
25568c2ecf20Sopenharmony_ci		{
25578c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
25588c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
25598c2ecf20Sopenharmony_ci			FREQ2FBIN(2472, 1),
25608c2ecf20Sopenharmony_ci			0,
25618c2ecf20Sopenharmony_ci		},
25628c2ecf20Sopenharmony_ci
25638c2ecf20Sopenharmony_ci		{
25648c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
25658c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
25668c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
25678c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
25688c2ecf20Sopenharmony_ci		},
25698c2ecf20Sopenharmony_ci
25708c2ecf20Sopenharmony_ci		{
25718c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
25728c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
25738c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
25748c2ecf20Sopenharmony_ci		},
25758c2ecf20Sopenharmony_ci
25768c2ecf20Sopenharmony_ci		{
25778c2ecf20Sopenharmony_ci			/* Data[9].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
25788c2ecf20Sopenharmony_ci			/* Data[9].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
25798c2ecf20Sopenharmony_ci			/* Data[9].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
25808c2ecf20Sopenharmony_ci			0
25818c2ecf20Sopenharmony_ci		},
25828c2ecf20Sopenharmony_ci
25838c2ecf20Sopenharmony_ci		{
25848c2ecf20Sopenharmony_ci			/* Data[10].ctlEdges[0].bChannel */ FREQ2FBIN(2412, 1),
25858c2ecf20Sopenharmony_ci			/* Data[10].ctlEdges[1].bChannel */ FREQ2FBIN(2417, 1),
25868c2ecf20Sopenharmony_ci			/* Data[10].ctlEdges[2].bChannel */ FREQ2FBIN(2472, 1),
25878c2ecf20Sopenharmony_ci			0
25888c2ecf20Sopenharmony_ci		},
25898c2ecf20Sopenharmony_ci
25908c2ecf20Sopenharmony_ci		{
25918c2ecf20Sopenharmony_ci			/* Data[11].ctlEdges[0].bChannel */ FREQ2FBIN(2422, 1),
25928c2ecf20Sopenharmony_ci			/* Data[11].ctlEdges[1].bChannel */ FREQ2FBIN(2427, 1),
25938c2ecf20Sopenharmony_ci			/* Data[11].ctlEdges[2].bChannel */ FREQ2FBIN(2447, 1),
25948c2ecf20Sopenharmony_ci			/* Data[11].ctlEdges[3].bChannel */ FREQ2FBIN(2462, 1),
25958c2ecf20Sopenharmony_ci		}
25968c2ecf20Sopenharmony_ci	 },
25978c2ecf20Sopenharmony_ci	.ctlPowerData_2G = {
25988c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
25998c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
26008c2ecf20Sopenharmony_ci		 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 1) } },
26018c2ecf20Sopenharmony_ci
26028c2ecf20Sopenharmony_ci		 { { CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0) } },
26038c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
26048c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
26058c2ecf20Sopenharmony_ci
26068c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0) } },
26078c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
26088c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
26098c2ecf20Sopenharmony_ci
26108c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 0) } },
26118c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
26128c2ecf20Sopenharmony_ci		 { { CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 1) } },
26138c2ecf20Sopenharmony_ci	 },
26148c2ecf20Sopenharmony_ci	.modalHeader5G = {
26158c2ecf20Sopenharmony_ci		/* 4 idle,t1,t2,b (4 bits per setting) */
26168c2ecf20Sopenharmony_ci		.antCtrlCommon = LE32(0x220),
26178c2ecf20Sopenharmony_ci		/* 4 ra1l1, ra2l1, ra1l2,ra2l2,ra12 */
26188c2ecf20Sopenharmony_ci		.antCtrlCommon2 = LE32(0x44444),
26198c2ecf20Sopenharmony_ci		 /* antCtrlChain 6 idle, t,r,rx1,rx12,b (2 bits each) */
26208c2ecf20Sopenharmony_ci		.antCtrlChain = {
26218c2ecf20Sopenharmony_ci			LE16(0x150), LE16(0x150), LE16(0x150),
26228c2ecf20Sopenharmony_ci		},
26238c2ecf20Sopenharmony_ci		 /* xatten1DB 3 xatten1_db for AR9280 (0xa20c/b20c 5:0) */
26248c2ecf20Sopenharmony_ci		.xatten1DB = {0x19, 0x19, 0x19},
26258c2ecf20Sopenharmony_ci
26268c2ecf20Sopenharmony_ci		/*
26278c2ecf20Sopenharmony_ci		 * xatten1Margin[AR9300_MAX_CHAINS]; 3 xatten1_margin
26288c2ecf20Sopenharmony_ci		 * for merlin (0xa20c/b20c 16:12
26298c2ecf20Sopenharmony_ci		 */
26308c2ecf20Sopenharmony_ci		.xatten1Margin = {0x14, 0x14, 0x14},
26318c2ecf20Sopenharmony_ci		.tempSlope = 70,
26328c2ecf20Sopenharmony_ci		.voltSlope = 0,
26338c2ecf20Sopenharmony_ci		/* spurChans spur channels in usual fbin coding format */
26348c2ecf20Sopenharmony_ci		.spurChans = {0, 0, 0, 0, 0},
26358c2ecf20Sopenharmony_ci		/* noiseFloorThreshCh Check if the register is per chain */
26368c2ecf20Sopenharmony_ci		.noiseFloorThreshCh = {-1, 0, 0},
26378c2ecf20Sopenharmony_ci		.reserved = {0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0},
26388c2ecf20Sopenharmony_ci		.quick_drop = 0,
26398c2ecf20Sopenharmony_ci		.xpaBiasLvl = 0,
26408c2ecf20Sopenharmony_ci		.txFrameToDataStart = 0x0e,
26418c2ecf20Sopenharmony_ci		.txFrameToPaOn = 0x0e,
26428c2ecf20Sopenharmony_ci		.txClip = 3, /* 4 bits tx_clip, 4 bits dac_scale_cck */
26438c2ecf20Sopenharmony_ci		.antennaGain = 0,
26448c2ecf20Sopenharmony_ci		.switchSettling = 0x2d,
26458c2ecf20Sopenharmony_ci		.adcDesiredSize = -30,
26468c2ecf20Sopenharmony_ci		.txEndToXpaOff = 0,
26478c2ecf20Sopenharmony_ci		.txEndToRxOn = 0x2,
26488c2ecf20Sopenharmony_ci		.txFrameToXpaOn = 0xe,
26498c2ecf20Sopenharmony_ci		.thresh62 = 28,
26508c2ecf20Sopenharmony_ci		.papdRateMaskHt20 = LE32(0x0cf0e0e0),
26518c2ecf20Sopenharmony_ci		.papdRateMaskHt40 = LE32(0x6cf0e0e0),
26528c2ecf20Sopenharmony_ci		.switchcomspdt = 0,
26538c2ecf20Sopenharmony_ci		.xlna_bias_strength = 0,
26548c2ecf20Sopenharmony_ci		.futureModal = {
26558c2ecf20Sopenharmony_ci			0, 0, 0, 0, 0, 0, 0,
26568c2ecf20Sopenharmony_ci		},
26578c2ecf20Sopenharmony_ci	 },
26588c2ecf20Sopenharmony_ci	.base_ext2 = {
26598c2ecf20Sopenharmony_ci		.tempSlopeLow = 35,
26608c2ecf20Sopenharmony_ci		.tempSlopeHigh = 50,
26618c2ecf20Sopenharmony_ci		.xatten1DBLow = {0, 0, 0},
26628c2ecf20Sopenharmony_ci		.xatten1MarginLow = {0, 0, 0},
26638c2ecf20Sopenharmony_ci		.xatten1DBHigh = {0, 0, 0},
26648c2ecf20Sopenharmony_ci		.xatten1MarginHigh = {0, 0, 0}
26658c2ecf20Sopenharmony_ci	 },
26668c2ecf20Sopenharmony_ci	.calFreqPier5G = {
26678c2ecf20Sopenharmony_ci		FREQ2FBIN(5160, 0),
26688c2ecf20Sopenharmony_ci		FREQ2FBIN(5220, 0),
26698c2ecf20Sopenharmony_ci		FREQ2FBIN(5320, 0),
26708c2ecf20Sopenharmony_ci		FREQ2FBIN(5400, 0),
26718c2ecf20Sopenharmony_ci		FREQ2FBIN(5500, 0),
26728c2ecf20Sopenharmony_ci		FREQ2FBIN(5600, 0),
26738c2ecf20Sopenharmony_ci		FREQ2FBIN(5700, 0),
26748c2ecf20Sopenharmony_ci		FREQ2FBIN(5785, 0)
26758c2ecf20Sopenharmony_ci	},
26768c2ecf20Sopenharmony_ci	.calPierData5G = {
26778c2ecf20Sopenharmony_ci			{
26788c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
26798c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
26808c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
26818c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
26828c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
26838c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
26848c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
26858c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
26868c2ecf20Sopenharmony_ci			},
26878c2ecf20Sopenharmony_ci			{
26888c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
26898c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
26908c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
26918c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
26928c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
26938c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
26948c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
26958c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
26968c2ecf20Sopenharmony_ci			},
26978c2ecf20Sopenharmony_ci			{
26988c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
26998c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
27008c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
27018c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
27028c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
27038c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
27048c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
27058c2ecf20Sopenharmony_ci				{0, 0, 0, 0, 0},
27068c2ecf20Sopenharmony_ci			},
27078c2ecf20Sopenharmony_ci
27088c2ecf20Sopenharmony_ci	},
27098c2ecf20Sopenharmony_ci	.calTarget_freqbin_5G = {
27108c2ecf20Sopenharmony_ci		FREQ2FBIN(5180, 0),
27118c2ecf20Sopenharmony_ci		FREQ2FBIN(5240, 0),
27128c2ecf20Sopenharmony_ci		FREQ2FBIN(5320, 0),
27138c2ecf20Sopenharmony_ci		FREQ2FBIN(5400, 0),
27148c2ecf20Sopenharmony_ci		FREQ2FBIN(5500, 0),
27158c2ecf20Sopenharmony_ci		FREQ2FBIN(5600, 0),
27168c2ecf20Sopenharmony_ci		FREQ2FBIN(5700, 0),
27178c2ecf20Sopenharmony_ci		FREQ2FBIN(5825, 0)
27188c2ecf20Sopenharmony_ci	},
27198c2ecf20Sopenharmony_ci	.calTarget_freqbin_5GHT20 = {
27208c2ecf20Sopenharmony_ci		FREQ2FBIN(5180, 0),
27218c2ecf20Sopenharmony_ci		FREQ2FBIN(5240, 0),
27228c2ecf20Sopenharmony_ci		FREQ2FBIN(5320, 0),
27238c2ecf20Sopenharmony_ci		FREQ2FBIN(5400, 0),
27248c2ecf20Sopenharmony_ci		FREQ2FBIN(5500, 0),
27258c2ecf20Sopenharmony_ci		FREQ2FBIN(5700, 0),
27268c2ecf20Sopenharmony_ci		FREQ2FBIN(5745, 0),
27278c2ecf20Sopenharmony_ci		FREQ2FBIN(5825, 0)
27288c2ecf20Sopenharmony_ci	},
27298c2ecf20Sopenharmony_ci	.calTarget_freqbin_5GHT40 = {
27308c2ecf20Sopenharmony_ci		FREQ2FBIN(5180, 0),
27318c2ecf20Sopenharmony_ci		FREQ2FBIN(5240, 0),
27328c2ecf20Sopenharmony_ci		FREQ2FBIN(5320, 0),
27338c2ecf20Sopenharmony_ci		FREQ2FBIN(5400, 0),
27348c2ecf20Sopenharmony_ci		FREQ2FBIN(5500, 0),
27358c2ecf20Sopenharmony_ci		FREQ2FBIN(5700, 0),
27368c2ecf20Sopenharmony_ci		FREQ2FBIN(5745, 0),
27378c2ecf20Sopenharmony_ci		FREQ2FBIN(5825, 0)
27388c2ecf20Sopenharmony_ci	 },
27398c2ecf20Sopenharmony_ci	.calTargetPower5G = {
27408c2ecf20Sopenharmony_ci		/* 6-24,36,48,54 */
27418c2ecf20Sopenharmony_ci		{ {30, 30, 28, 24} },
27428c2ecf20Sopenharmony_ci		{ {30, 30, 28, 24} },
27438c2ecf20Sopenharmony_ci		{ {30, 30, 28, 24} },
27448c2ecf20Sopenharmony_ci		{ {30, 30, 28, 24} },
27458c2ecf20Sopenharmony_ci		{ {30, 30, 28, 24} },
27468c2ecf20Sopenharmony_ci		{ {30, 30, 28, 24} },
27478c2ecf20Sopenharmony_ci		{ {30, 30, 28, 24} },
27488c2ecf20Sopenharmony_ci		{ {30, 30, 28, 24} },
27498c2ecf20Sopenharmony_ci	 },
27508c2ecf20Sopenharmony_ci	.calTargetPower5GHT20 = {
27518c2ecf20Sopenharmony_ci		/*
27528c2ecf20Sopenharmony_ci		 * 0_8_16,1-3_9-11_17-19,
27538c2ecf20Sopenharmony_ci		 * 4,5,6,7,12,13,14,15,20,21,22,23
27548c2ecf20Sopenharmony_ci		 */
27558c2ecf20Sopenharmony_ci		{ {30, 30, 30, 28, 24, 20, 30, 28, 24, 20, 0, 0, 0, 0} },
27568c2ecf20Sopenharmony_ci		{ {30, 30, 30, 28, 24, 20, 30, 28, 24, 20, 0, 0, 0, 0} },
27578c2ecf20Sopenharmony_ci		{ {30, 30, 30, 26, 22, 18, 30, 26, 22, 18, 0, 0, 0, 0} },
27588c2ecf20Sopenharmony_ci		{ {30, 30, 30, 26, 22, 18, 30, 26, 22, 18, 0, 0, 0, 0} },
27598c2ecf20Sopenharmony_ci		{ {30, 30, 30, 24, 20, 16, 30, 24, 20, 16, 0, 0, 0, 0} },
27608c2ecf20Sopenharmony_ci		{ {30, 30, 30, 24, 20, 16, 30, 24, 20, 16, 0, 0, 0, 0} },
27618c2ecf20Sopenharmony_ci		{ {30, 30, 30, 22, 18, 14, 30, 22, 18, 14, 0, 0, 0, 0} },
27628c2ecf20Sopenharmony_ci		{ {30, 30, 30, 22, 18, 14, 30, 22, 18, 14, 0, 0, 0, 0} },
27638c2ecf20Sopenharmony_ci	 },
27648c2ecf20Sopenharmony_ci	.calTargetPower5GHT40 =  {
27658c2ecf20Sopenharmony_ci		/*
27668c2ecf20Sopenharmony_ci		 * 0_8_16,1-3_9-11_17-19,
27678c2ecf20Sopenharmony_ci		 * 4,5,6,7,12,13,14,15,20,21,22,23
27688c2ecf20Sopenharmony_ci		 */
27698c2ecf20Sopenharmony_ci		{ {28, 28, 28, 26, 22, 18, 28, 26, 22, 18, 0, 0, 0, 0} },
27708c2ecf20Sopenharmony_ci		{ {28, 28, 28, 26, 22, 18, 28, 26, 22, 18, 0, 0, 0, 0} },
27718c2ecf20Sopenharmony_ci		{ {28, 28, 28, 24, 20, 16, 28, 24, 20, 16, 0, 0, 0, 0} },
27728c2ecf20Sopenharmony_ci		{ {28, 28, 28, 24, 20, 16, 28, 24, 20, 16, 0, 0, 0, 0} },
27738c2ecf20Sopenharmony_ci		{ {28, 28, 28, 22, 18, 14, 28, 22, 18, 14, 0, 0, 0, 0} },
27748c2ecf20Sopenharmony_ci		{ {28, 28, 28, 22, 18, 14, 28, 22, 18, 14, 0, 0, 0, 0} },
27758c2ecf20Sopenharmony_ci		{ {28, 28, 28, 20, 16, 12, 28, 20, 16, 12, 0, 0, 0, 0} },
27768c2ecf20Sopenharmony_ci		{ {28, 28, 28, 20, 16, 12, 28, 20, 16, 12, 0, 0, 0, 0} },
27778c2ecf20Sopenharmony_ci	 },
27788c2ecf20Sopenharmony_ci	.ctlIndex_5G =  {
27798c2ecf20Sopenharmony_ci		0x10, 0x16, 0x18, 0x40, 0x46,
27808c2ecf20Sopenharmony_ci		0x48, 0x30, 0x36, 0x38
27818c2ecf20Sopenharmony_ci	},
27828c2ecf20Sopenharmony_ci	.ctl_freqbin_5G =  {
27838c2ecf20Sopenharmony_ci		{
27848c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
27858c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
27868c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
27878c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
27888c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[4].bChannel */ FREQ2FBIN(5600, 0),
27898c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
27908c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
27918c2ecf20Sopenharmony_ci			/* Data[0].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
27928c2ecf20Sopenharmony_ci		},
27938c2ecf20Sopenharmony_ci		{
27948c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
27958c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
27968c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[2].bChannel */ FREQ2FBIN(5280, 0),
27978c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
27988c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[4].bChannel */ FREQ2FBIN(5520, 0),
27998c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
28008c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
28018c2ecf20Sopenharmony_ci			/* Data[1].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
28028c2ecf20Sopenharmony_ci		},
28038c2ecf20Sopenharmony_ci
28048c2ecf20Sopenharmony_ci		{
28058c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
28068c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
28078c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
28088c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[3].bChannel */ FREQ2FBIN(5310, 0),
28098c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[4].bChannel */ FREQ2FBIN(5510, 0),
28108c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[5].bChannel */ FREQ2FBIN(5550, 0),
28118c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[6].bChannel */ FREQ2FBIN(5670, 0),
28128c2ecf20Sopenharmony_ci			/* Data[2].ctlEdges[7].bChannel */ FREQ2FBIN(5755, 0)
28138c2ecf20Sopenharmony_ci		},
28148c2ecf20Sopenharmony_ci
28158c2ecf20Sopenharmony_ci		{
28168c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
28178c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
28188c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[2].bChannel */ FREQ2FBIN(5260, 0),
28198c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[3].bChannel */ FREQ2FBIN(5320, 0),
28208c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
28218c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
28228c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[6].bChannel */ 0xFF,
28238c2ecf20Sopenharmony_ci			/* Data[3].ctlEdges[7].bChannel */ 0xFF,
28248c2ecf20Sopenharmony_ci		},
28258c2ecf20Sopenharmony_ci
28268c2ecf20Sopenharmony_ci		{
28278c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
28288c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
28298c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[2].bChannel */ FREQ2FBIN(5500, 0),
28308c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[3].bChannel */ FREQ2FBIN(5700, 0),
28318c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[4].bChannel */ 0xFF,
28328c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[5].bChannel */ 0xFF,
28338c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[6].bChannel */ 0xFF,
28348c2ecf20Sopenharmony_ci			/* Data[4].ctlEdges[7].bChannel */ 0xFF,
28358c2ecf20Sopenharmony_ci		},
28368c2ecf20Sopenharmony_ci
28378c2ecf20Sopenharmony_ci		{
28388c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
28398c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[1].bChannel */ FREQ2FBIN(5270, 0),
28408c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[2].bChannel */ FREQ2FBIN(5310, 0),
28418c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
28428c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[4].bChannel */ FREQ2FBIN(5590, 0),
28438c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
28448c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[6].bChannel */ 0xFF,
28458c2ecf20Sopenharmony_ci			/* Data[5].ctlEdges[7].bChannel */ 0xFF
28468c2ecf20Sopenharmony_ci		},
28478c2ecf20Sopenharmony_ci
28488c2ecf20Sopenharmony_ci		{
28498c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
28508c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[1].bChannel */ FREQ2FBIN(5200, 0),
28518c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[2].bChannel */ FREQ2FBIN(5220, 0),
28528c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[3].bChannel */ FREQ2FBIN(5260, 0),
28538c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[4].bChannel */ FREQ2FBIN(5500, 0),
28548c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[5].bChannel */ FREQ2FBIN(5600, 0),
28558c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[6].bChannel */ FREQ2FBIN(5700, 0),
28568c2ecf20Sopenharmony_ci			/* Data[6].ctlEdges[7].bChannel */ FREQ2FBIN(5745, 0)
28578c2ecf20Sopenharmony_ci		},
28588c2ecf20Sopenharmony_ci
28598c2ecf20Sopenharmony_ci		{
28608c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[0].bChannel */ FREQ2FBIN(5180, 0),
28618c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[1].bChannel */ FREQ2FBIN(5260, 0),
28628c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[2].bChannel */ FREQ2FBIN(5320, 0),
28638c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[3].bChannel */ FREQ2FBIN(5500, 0),
28648c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[4].bChannel */ FREQ2FBIN(5560, 0),
28658c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[5].bChannel */ FREQ2FBIN(5700, 0),
28668c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[6].bChannel */ FREQ2FBIN(5745, 0),
28678c2ecf20Sopenharmony_ci			/* Data[7].ctlEdges[7].bChannel */ FREQ2FBIN(5825, 0)
28688c2ecf20Sopenharmony_ci		},
28698c2ecf20Sopenharmony_ci
28708c2ecf20Sopenharmony_ci		{
28718c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[0].bChannel */ FREQ2FBIN(5190, 0),
28728c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[1].bChannel */ FREQ2FBIN(5230, 0),
28738c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[2].bChannel */ FREQ2FBIN(5270, 0),
28748c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[3].bChannel */ FREQ2FBIN(5510, 0),
28758c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[4].bChannel */ FREQ2FBIN(5550, 0),
28768c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[5].bChannel */ FREQ2FBIN(5670, 0),
28778c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[6].bChannel */ FREQ2FBIN(5755, 0),
28788c2ecf20Sopenharmony_ci			/* Data[8].ctlEdges[7].bChannel */ FREQ2FBIN(5795, 0)
28798c2ecf20Sopenharmony_ci		}
28808c2ecf20Sopenharmony_ci	 },
28818c2ecf20Sopenharmony_ci	.ctlPowerData_5G = {
28828c2ecf20Sopenharmony_ci		{
28838c2ecf20Sopenharmony_ci			{
28848c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
28858c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
28868c2ecf20Sopenharmony_ci			}
28878c2ecf20Sopenharmony_ci		},
28888c2ecf20Sopenharmony_ci		{
28898c2ecf20Sopenharmony_ci			{
28908c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
28918c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
28928c2ecf20Sopenharmony_ci			}
28938c2ecf20Sopenharmony_ci		},
28948c2ecf20Sopenharmony_ci		{
28958c2ecf20Sopenharmony_ci			{
28968c2ecf20Sopenharmony_ci				CTL(60, 0), CTL(60, 1), CTL(60, 0), CTL(60, 1),
28978c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
28988c2ecf20Sopenharmony_ci			}
28998c2ecf20Sopenharmony_ci		},
29008c2ecf20Sopenharmony_ci		{
29018c2ecf20Sopenharmony_ci			{
29028c2ecf20Sopenharmony_ci				CTL(60, 0), CTL(60, 1), CTL(60, 1), CTL(60, 0),
29038c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
29048c2ecf20Sopenharmony_ci			}
29058c2ecf20Sopenharmony_ci		},
29068c2ecf20Sopenharmony_ci		{
29078c2ecf20Sopenharmony_ci			{
29088c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
29098c2ecf20Sopenharmony_ci				CTL(60, 0), CTL(60, 0), CTL(60, 0), CTL(60, 0),
29108c2ecf20Sopenharmony_ci			}
29118c2ecf20Sopenharmony_ci		},
29128c2ecf20Sopenharmony_ci		{
29138c2ecf20Sopenharmony_ci			{
29148c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
29158c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 0), CTL(60, 0),
29168c2ecf20Sopenharmony_ci			}
29178c2ecf20Sopenharmony_ci		},
29188c2ecf20Sopenharmony_ci		{
29198c2ecf20Sopenharmony_ci			{
29208c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
29218c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 1),
29228c2ecf20Sopenharmony_ci			}
29238c2ecf20Sopenharmony_ci		},
29248c2ecf20Sopenharmony_ci		{
29258c2ecf20Sopenharmony_ci			{
29268c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
29278c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 1), CTL(60, 0),
29288c2ecf20Sopenharmony_ci			}
29298c2ecf20Sopenharmony_ci		},
29308c2ecf20Sopenharmony_ci		{
29318c2ecf20Sopenharmony_ci			{
29328c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 0), CTL(60, 1), CTL(60, 1),
29338c2ecf20Sopenharmony_ci				CTL(60, 1), CTL(60, 1), CTL(60, 0), CTL(60, 1),
29348c2ecf20Sopenharmony_ci			}
29358c2ecf20Sopenharmony_ci		},
29368c2ecf20Sopenharmony_ci	 }
29378c2ecf20Sopenharmony_ci};
29388c2ecf20Sopenharmony_ci
29398c2ecf20Sopenharmony_ci
29408c2ecf20Sopenharmony_cistatic const struct ar9300_eeprom *ar9300_eep_templates[] = {
29418c2ecf20Sopenharmony_ci	&ar9300_default,
29428c2ecf20Sopenharmony_ci	&ar9300_x112,
29438c2ecf20Sopenharmony_ci	&ar9300_h116,
29448c2ecf20Sopenharmony_ci	&ar9300_h112,
29458c2ecf20Sopenharmony_ci	&ar9300_x113,
29468c2ecf20Sopenharmony_ci};
29478c2ecf20Sopenharmony_ci
29488c2ecf20Sopenharmony_cistatic const struct ar9300_eeprom *ar9003_eeprom_struct_find_by_id(int id)
29498c2ecf20Sopenharmony_ci{
29508c2ecf20Sopenharmony_ci	int it;
29518c2ecf20Sopenharmony_ci
29528c2ecf20Sopenharmony_ci	for (it = 0; it < ARRAY_SIZE(ar9300_eep_templates); it++)
29538c2ecf20Sopenharmony_ci		if (ar9300_eep_templates[it]->templateVersion == id)
29548c2ecf20Sopenharmony_ci			return ar9300_eep_templates[it];
29558c2ecf20Sopenharmony_ci	return NULL;
29568c2ecf20Sopenharmony_ci}
29578c2ecf20Sopenharmony_ci
29588c2ecf20Sopenharmony_cistatic int ath9k_hw_ar9300_check_eeprom(struct ath_hw *ah)
29598c2ecf20Sopenharmony_ci{
29608c2ecf20Sopenharmony_ci	return 0;
29618c2ecf20Sopenharmony_ci}
29628c2ecf20Sopenharmony_ci
29638c2ecf20Sopenharmony_cistatic int interpolate(int x, int xa, int xb, int ya, int yb)
29648c2ecf20Sopenharmony_ci{
29658c2ecf20Sopenharmony_ci	int bf, factor, plus;
29668c2ecf20Sopenharmony_ci
29678c2ecf20Sopenharmony_ci	bf = 2 * (yb - ya) * (x - xa) / (xb - xa);
29688c2ecf20Sopenharmony_ci	factor = bf / 2;
29698c2ecf20Sopenharmony_ci	plus = bf % 2;
29708c2ecf20Sopenharmony_ci	return ya + factor + plus;
29718c2ecf20Sopenharmony_ci}
29728c2ecf20Sopenharmony_ci
29738c2ecf20Sopenharmony_cistatic u32 ath9k_hw_ar9300_get_eeprom(struct ath_hw *ah,
29748c2ecf20Sopenharmony_ci				      enum eeprom_param param)
29758c2ecf20Sopenharmony_ci{
29768c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
29778c2ecf20Sopenharmony_ci	struct ar9300_base_eep_hdr *pBase = &eep->baseEepHeader;
29788c2ecf20Sopenharmony_ci
29798c2ecf20Sopenharmony_ci	switch (param) {
29808c2ecf20Sopenharmony_ci	case EEP_MAC_LSW:
29818c2ecf20Sopenharmony_ci		return get_unaligned_be16(eep->macAddr);
29828c2ecf20Sopenharmony_ci	case EEP_MAC_MID:
29838c2ecf20Sopenharmony_ci		return get_unaligned_be16(eep->macAddr + 2);
29848c2ecf20Sopenharmony_ci	case EEP_MAC_MSW:
29858c2ecf20Sopenharmony_ci		return get_unaligned_be16(eep->macAddr + 4);
29868c2ecf20Sopenharmony_ci	case EEP_REG_0:
29878c2ecf20Sopenharmony_ci		return le16_to_cpu(pBase->regDmn[0]);
29888c2ecf20Sopenharmony_ci	case EEP_OP_CAP:
29898c2ecf20Sopenharmony_ci		return pBase->deviceCap;
29908c2ecf20Sopenharmony_ci	case EEP_OP_MODE:
29918c2ecf20Sopenharmony_ci		return pBase->opCapFlags.opFlags;
29928c2ecf20Sopenharmony_ci	case EEP_RF_SILENT:
29938c2ecf20Sopenharmony_ci		return pBase->rfSilent;
29948c2ecf20Sopenharmony_ci	case EEP_TX_MASK:
29958c2ecf20Sopenharmony_ci		return (pBase->txrxMask >> 4) & 0xf;
29968c2ecf20Sopenharmony_ci	case EEP_RX_MASK:
29978c2ecf20Sopenharmony_ci		return pBase->txrxMask & 0xf;
29988c2ecf20Sopenharmony_ci	case EEP_PAPRD:
29998c2ecf20Sopenharmony_ci		return !!(pBase->featureEnable & BIT(5));
30008c2ecf20Sopenharmony_ci	case EEP_CHAIN_MASK_REDUCE:
30018c2ecf20Sopenharmony_ci		return (pBase->miscConfiguration >> 0x3) & 0x1;
30028c2ecf20Sopenharmony_ci	case EEP_ANT_DIV_CTL1:
30038c2ecf20Sopenharmony_ci		if (AR_SREV_9565(ah))
30048c2ecf20Sopenharmony_ci			return AR9300_EEP_ANTDIV_CONTROL_DEFAULT_VALUE;
30058c2ecf20Sopenharmony_ci		else
30068c2ecf20Sopenharmony_ci			return eep->base_ext1.ant_div_control;
30078c2ecf20Sopenharmony_ci	case EEP_ANTENNA_GAIN_5G:
30088c2ecf20Sopenharmony_ci		return eep->modalHeader5G.antennaGain;
30098c2ecf20Sopenharmony_ci	case EEP_ANTENNA_GAIN_2G:
30108c2ecf20Sopenharmony_ci		return eep->modalHeader2G.antennaGain;
30118c2ecf20Sopenharmony_ci	default:
30128c2ecf20Sopenharmony_ci		return 0;
30138c2ecf20Sopenharmony_ci	}
30148c2ecf20Sopenharmony_ci}
30158c2ecf20Sopenharmony_ci
30168c2ecf20Sopenharmony_cistatic bool ar9300_eeprom_read_byte(struct ath_hw *ah, int address,
30178c2ecf20Sopenharmony_ci				    u8 *buffer)
30188c2ecf20Sopenharmony_ci{
30198c2ecf20Sopenharmony_ci	u16 val;
30208c2ecf20Sopenharmony_ci
30218c2ecf20Sopenharmony_ci	if (unlikely(!ath9k_hw_nvram_read(ah, address / 2, &val)))
30228c2ecf20Sopenharmony_ci		return false;
30238c2ecf20Sopenharmony_ci
30248c2ecf20Sopenharmony_ci	*buffer = (val >> (8 * (address % 2))) & 0xff;
30258c2ecf20Sopenharmony_ci	return true;
30268c2ecf20Sopenharmony_ci}
30278c2ecf20Sopenharmony_ci
30288c2ecf20Sopenharmony_cistatic bool ar9300_eeprom_read_word(struct ath_hw *ah, int address,
30298c2ecf20Sopenharmony_ci				    u8 *buffer)
30308c2ecf20Sopenharmony_ci{
30318c2ecf20Sopenharmony_ci	u16 val;
30328c2ecf20Sopenharmony_ci
30338c2ecf20Sopenharmony_ci	if (unlikely(!ath9k_hw_nvram_read(ah, address / 2, &val)))
30348c2ecf20Sopenharmony_ci		return false;
30358c2ecf20Sopenharmony_ci
30368c2ecf20Sopenharmony_ci	buffer[0] = val >> 8;
30378c2ecf20Sopenharmony_ci	buffer[1] = val & 0xff;
30388c2ecf20Sopenharmony_ci
30398c2ecf20Sopenharmony_ci	return true;
30408c2ecf20Sopenharmony_ci}
30418c2ecf20Sopenharmony_ci
30428c2ecf20Sopenharmony_cistatic bool ar9300_read_eeprom(struct ath_hw *ah, int address, u8 *buffer,
30438c2ecf20Sopenharmony_ci			       int count)
30448c2ecf20Sopenharmony_ci{
30458c2ecf20Sopenharmony_ci	struct ath_common *common = ath9k_hw_common(ah);
30468c2ecf20Sopenharmony_ci	int i;
30478c2ecf20Sopenharmony_ci
30488c2ecf20Sopenharmony_ci	if ((address < 0) || ((address + count) / 2 > AR9300_EEPROM_SIZE - 1)) {
30498c2ecf20Sopenharmony_ci		ath_dbg(common, EEPROM, "eeprom address not in range\n");
30508c2ecf20Sopenharmony_ci		return false;
30518c2ecf20Sopenharmony_ci	}
30528c2ecf20Sopenharmony_ci
30538c2ecf20Sopenharmony_ci	/*
30548c2ecf20Sopenharmony_ci	 * Since we're reading the bytes in reverse order from a little-endian
30558c2ecf20Sopenharmony_ci	 * word stream, an even address means we only use the lower half of
30568c2ecf20Sopenharmony_ci	 * the 16-bit word at that address
30578c2ecf20Sopenharmony_ci	 */
30588c2ecf20Sopenharmony_ci	if (address % 2 == 0) {
30598c2ecf20Sopenharmony_ci		if (!ar9300_eeprom_read_byte(ah, address--, buffer++))
30608c2ecf20Sopenharmony_ci			goto error;
30618c2ecf20Sopenharmony_ci
30628c2ecf20Sopenharmony_ci		count--;
30638c2ecf20Sopenharmony_ci	}
30648c2ecf20Sopenharmony_ci
30658c2ecf20Sopenharmony_ci	for (i = 0; i < count / 2; i++) {
30668c2ecf20Sopenharmony_ci		if (!ar9300_eeprom_read_word(ah, address, buffer))
30678c2ecf20Sopenharmony_ci			goto error;
30688c2ecf20Sopenharmony_ci
30698c2ecf20Sopenharmony_ci		address -= 2;
30708c2ecf20Sopenharmony_ci		buffer += 2;
30718c2ecf20Sopenharmony_ci	}
30728c2ecf20Sopenharmony_ci
30738c2ecf20Sopenharmony_ci	if (count % 2)
30748c2ecf20Sopenharmony_ci		if (!ar9300_eeprom_read_byte(ah, address, buffer))
30758c2ecf20Sopenharmony_ci			goto error;
30768c2ecf20Sopenharmony_ci
30778c2ecf20Sopenharmony_ci	return true;
30788c2ecf20Sopenharmony_ci
30798c2ecf20Sopenharmony_cierror:
30808c2ecf20Sopenharmony_ci	ath_dbg(common, EEPROM, "unable to read eeprom region at offset %d\n",
30818c2ecf20Sopenharmony_ci		address);
30828c2ecf20Sopenharmony_ci	return false;
30838c2ecf20Sopenharmony_ci}
30848c2ecf20Sopenharmony_ci
30858c2ecf20Sopenharmony_cistatic bool ar9300_otp_read_word(struct ath_hw *ah, int addr, u32 *data)
30868c2ecf20Sopenharmony_ci{
30878c2ecf20Sopenharmony_ci	REG_READ(ah, AR9300_OTP_BASE + (4 * addr));
30888c2ecf20Sopenharmony_ci
30898c2ecf20Sopenharmony_ci	if (!ath9k_hw_wait(ah, AR9300_OTP_STATUS, AR9300_OTP_STATUS_TYPE,
30908c2ecf20Sopenharmony_ci			   AR9300_OTP_STATUS_VALID, 1000))
30918c2ecf20Sopenharmony_ci		return false;
30928c2ecf20Sopenharmony_ci
30938c2ecf20Sopenharmony_ci	*data = REG_READ(ah, AR9300_OTP_READ_DATA);
30948c2ecf20Sopenharmony_ci	return true;
30958c2ecf20Sopenharmony_ci}
30968c2ecf20Sopenharmony_ci
30978c2ecf20Sopenharmony_cistatic bool ar9300_read_otp(struct ath_hw *ah, int address, u8 *buffer,
30988c2ecf20Sopenharmony_ci			    int count)
30998c2ecf20Sopenharmony_ci{
31008c2ecf20Sopenharmony_ci	u32 data;
31018c2ecf20Sopenharmony_ci	int i;
31028c2ecf20Sopenharmony_ci
31038c2ecf20Sopenharmony_ci	for (i = 0; i < count; i++) {
31048c2ecf20Sopenharmony_ci		int offset = 8 * ((address - i) % 4);
31058c2ecf20Sopenharmony_ci		if (!ar9300_otp_read_word(ah, (address - i) / 4, &data))
31068c2ecf20Sopenharmony_ci			return false;
31078c2ecf20Sopenharmony_ci
31088c2ecf20Sopenharmony_ci		buffer[i] = (data >> offset) & 0xff;
31098c2ecf20Sopenharmony_ci	}
31108c2ecf20Sopenharmony_ci
31118c2ecf20Sopenharmony_ci	return true;
31128c2ecf20Sopenharmony_ci}
31138c2ecf20Sopenharmony_ci
31148c2ecf20Sopenharmony_ci
31158c2ecf20Sopenharmony_cistatic void ar9300_comp_hdr_unpack(u8 *best, int *code, int *reference,
31168c2ecf20Sopenharmony_ci				   int *length, int *major, int *minor)
31178c2ecf20Sopenharmony_ci{
31188c2ecf20Sopenharmony_ci	unsigned long value[4];
31198c2ecf20Sopenharmony_ci
31208c2ecf20Sopenharmony_ci	value[0] = best[0];
31218c2ecf20Sopenharmony_ci	value[1] = best[1];
31228c2ecf20Sopenharmony_ci	value[2] = best[2];
31238c2ecf20Sopenharmony_ci	value[3] = best[3];
31248c2ecf20Sopenharmony_ci	*code = ((value[0] >> 5) & 0x0007);
31258c2ecf20Sopenharmony_ci	*reference = (value[0] & 0x001f) | ((value[1] >> 2) & 0x0020);
31268c2ecf20Sopenharmony_ci	*length = ((value[1] << 4) & 0x07f0) | ((value[2] >> 4) & 0x000f);
31278c2ecf20Sopenharmony_ci	*major = (value[2] & 0x000f);
31288c2ecf20Sopenharmony_ci	*minor = (value[3] & 0x00ff);
31298c2ecf20Sopenharmony_ci}
31308c2ecf20Sopenharmony_ci
31318c2ecf20Sopenharmony_cistatic u16 ar9300_comp_cksum(u8 *data, int dsize)
31328c2ecf20Sopenharmony_ci{
31338c2ecf20Sopenharmony_ci	int it, checksum = 0;
31348c2ecf20Sopenharmony_ci
31358c2ecf20Sopenharmony_ci	for (it = 0; it < dsize; it++) {
31368c2ecf20Sopenharmony_ci		checksum += data[it];
31378c2ecf20Sopenharmony_ci		checksum &= 0xffff;
31388c2ecf20Sopenharmony_ci	}
31398c2ecf20Sopenharmony_ci
31408c2ecf20Sopenharmony_ci	return checksum;
31418c2ecf20Sopenharmony_ci}
31428c2ecf20Sopenharmony_ci
31438c2ecf20Sopenharmony_cistatic bool ar9300_uncompress_block(struct ath_hw *ah,
31448c2ecf20Sopenharmony_ci				    u8 *mptr,
31458c2ecf20Sopenharmony_ci				    int mdataSize,
31468c2ecf20Sopenharmony_ci				    u8 *block,
31478c2ecf20Sopenharmony_ci				    int size)
31488c2ecf20Sopenharmony_ci{
31498c2ecf20Sopenharmony_ci	int it;
31508c2ecf20Sopenharmony_ci	int spot;
31518c2ecf20Sopenharmony_ci	int offset;
31528c2ecf20Sopenharmony_ci	int length;
31538c2ecf20Sopenharmony_ci	struct ath_common *common = ath9k_hw_common(ah);
31548c2ecf20Sopenharmony_ci
31558c2ecf20Sopenharmony_ci	spot = 0;
31568c2ecf20Sopenharmony_ci
31578c2ecf20Sopenharmony_ci	for (it = 0; it < size; it += (length+2)) {
31588c2ecf20Sopenharmony_ci		offset = block[it];
31598c2ecf20Sopenharmony_ci		offset &= 0xff;
31608c2ecf20Sopenharmony_ci		spot += offset;
31618c2ecf20Sopenharmony_ci		length = block[it+1];
31628c2ecf20Sopenharmony_ci		length &= 0xff;
31638c2ecf20Sopenharmony_ci
31648c2ecf20Sopenharmony_ci		if (length > 0 && spot >= 0 && spot+length <= mdataSize) {
31658c2ecf20Sopenharmony_ci			ath_dbg(common, EEPROM,
31668c2ecf20Sopenharmony_ci				"Restore at %d: spot=%d offset=%d length=%d\n",
31678c2ecf20Sopenharmony_ci				it, spot, offset, length);
31688c2ecf20Sopenharmony_ci			memcpy(&mptr[spot], &block[it+2], length);
31698c2ecf20Sopenharmony_ci			spot += length;
31708c2ecf20Sopenharmony_ci		} else if (length > 0) {
31718c2ecf20Sopenharmony_ci			ath_dbg(common, EEPROM,
31728c2ecf20Sopenharmony_ci				"Bad restore at %d: spot=%d offset=%d length=%d\n",
31738c2ecf20Sopenharmony_ci				it, spot, offset, length);
31748c2ecf20Sopenharmony_ci			return false;
31758c2ecf20Sopenharmony_ci		}
31768c2ecf20Sopenharmony_ci	}
31778c2ecf20Sopenharmony_ci	return true;
31788c2ecf20Sopenharmony_ci}
31798c2ecf20Sopenharmony_ci
31808c2ecf20Sopenharmony_cistatic int ar9300_compress_decision(struct ath_hw *ah,
31818c2ecf20Sopenharmony_ci				    int it,
31828c2ecf20Sopenharmony_ci				    int code,
31838c2ecf20Sopenharmony_ci				    int reference,
31848c2ecf20Sopenharmony_ci				    u8 *mptr,
31858c2ecf20Sopenharmony_ci				    u8 *word, int length, int mdata_size)
31868c2ecf20Sopenharmony_ci{
31878c2ecf20Sopenharmony_ci	struct ath_common *common = ath9k_hw_common(ah);
31888c2ecf20Sopenharmony_ci	const struct ar9300_eeprom *eep = NULL;
31898c2ecf20Sopenharmony_ci
31908c2ecf20Sopenharmony_ci	switch (code) {
31918c2ecf20Sopenharmony_ci	case _CompressNone:
31928c2ecf20Sopenharmony_ci		if (length != mdata_size) {
31938c2ecf20Sopenharmony_ci			ath_dbg(common, EEPROM,
31948c2ecf20Sopenharmony_ci				"EEPROM structure size mismatch memory=%d eeprom=%d\n",
31958c2ecf20Sopenharmony_ci				mdata_size, length);
31968c2ecf20Sopenharmony_ci			return -1;
31978c2ecf20Sopenharmony_ci		}
31988c2ecf20Sopenharmony_ci		memcpy(mptr, word + COMP_HDR_LEN, length);
31998c2ecf20Sopenharmony_ci		ath_dbg(common, EEPROM,
32008c2ecf20Sopenharmony_ci			"restored eeprom %d: uncompressed, length %d\n",
32018c2ecf20Sopenharmony_ci			it, length);
32028c2ecf20Sopenharmony_ci		break;
32038c2ecf20Sopenharmony_ci	case _CompressBlock:
32048c2ecf20Sopenharmony_ci		if (reference != 0) {
32058c2ecf20Sopenharmony_ci			eep = ar9003_eeprom_struct_find_by_id(reference);
32068c2ecf20Sopenharmony_ci			if (eep == NULL) {
32078c2ecf20Sopenharmony_ci				ath_dbg(common, EEPROM,
32088c2ecf20Sopenharmony_ci					"can't find reference eeprom struct %d\n",
32098c2ecf20Sopenharmony_ci					reference);
32108c2ecf20Sopenharmony_ci				return -1;
32118c2ecf20Sopenharmony_ci			}
32128c2ecf20Sopenharmony_ci			memcpy(mptr, eep, mdata_size);
32138c2ecf20Sopenharmony_ci		}
32148c2ecf20Sopenharmony_ci		ath_dbg(common, EEPROM,
32158c2ecf20Sopenharmony_ci			"restore eeprom %d: block, reference %d, length %d\n",
32168c2ecf20Sopenharmony_ci			it, reference, length);
32178c2ecf20Sopenharmony_ci		ar9300_uncompress_block(ah, mptr, mdata_size,
32188c2ecf20Sopenharmony_ci					(word + COMP_HDR_LEN), length);
32198c2ecf20Sopenharmony_ci		break;
32208c2ecf20Sopenharmony_ci	default:
32218c2ecf20Sopenharmony_ci		ath_dbg(common, EEPROM, "unknown compression code %d\n", code);
32228c2ecf20Sopenharmony_ci		return -1;
32238c2ecf20Sopenharmony_ci	}
32248c2ecf20Sopenharmony_ci	return 0;
32258c2ecf20Sopenharmony_ci}
32268c2ecf20Sopenharmony_ci
32278c2ecf20Sopenharmony_citypedef bool (*eeprom_read_op)(struct ath_hw *ah, int address, u8 *buffer,
32288c2ecf20Sopenharmony_ci			       int count);
32298c2ecf20Sopenharmony_ci
32308c2ecf20Sopenharmony_cistatic bool ar9300_check_header(void *data)
32318c2ecf20Sopenharmony_ci{
32328c2ecf20Sopenharmony_ci	u32 *word = data;
32338c2ecf20Sopenharmony_ci	return !(*word == 0 || *word == ~0);
32348c2ecf20Sopenharmony_ci}
32358c2ecf20Sopenharmony_ci
32368c2ecf20Sopenharmony_cistatic bool ar9300_check_eeprom_header(struct ath_hw *ah, eeprom_read_op read,
32378c2ecf20Sopenharmony_ci				       int base_addr)
32388c2ecf20Sopenharmony_ci{
32398c2ecf20Sopenharmony_ci	u8 header[4];
32408c2ecf20Sopenharmony_ci
32418c2ecf20Sopenharmony_ci	if (!read(ah, base_addr, header, 4))
32428c2ecf20Sopenharmony_ci		return false;
32438c2ecf20Sopenharmony_ci
32448c2ecf20Sopenharmony_ci	return ar9300_check_header(header);
32458c2ecf20Sopenharmony_ci}
32468c2ecf20Sopenharmony_ci
32478c2ecf20Sopenharmony_cistatic int ar9300_eeprom_restore_flash(struct ath_hw *ah, u8 *mptr,
32488c2ecf20Sopenharmony_ci				       int mdata_size)
32498c2ecf20Sopenharmony_ci{
32508c2ecf20Sopenharmony_ci	u16 *data = (u16 *) mptr;
32518c2ecf20Sopenharmony_ci	int i;
32528c2ecf20Sopenharmony_ci
32538c2ecf20Sopenharmony_ci	for (i = 0; i < mdata_size / 2; i++, data++)
32548c2ecf20Sopenharmony_ci		if (!ath9k_hw_nvram_read(ah, i, data))
32558c2ecf20Sopenharmony_ci			return -EIO;
32568c2ecf20Sopenharmony_ci
32578c2ecf20Sopenharmony_ci	return 0;
32588c2ecf20Sopenharmony_ci}
32598c2ecf20Sopenharmony_ci/*
32608c2ecf20Sopenharmony_ci * Read the configuration data from the eeprom.
32618c2ecf20Sopenharmony_ci * The data can be put in any specified memory buffer.
32628c2ecf20Sopenharmony_ci *
32638c2ecf20Sopenharmony_ci * Returns -1 on error.
32648c2ecf20Sopenharmony_ci * Returns address of next memory location on success.
32658c2ecf20Sopenharmony_ci */
32668c2ecf20Sopenharmony_cistatic int ar9300_eeprom_restore_internal(struct ath_hw *ah,
32678c2ecf20Sopenharmony_ci					  u8 *mptr, int mdata_size)
32688c2ecf20Sopenharmony_ci{
32698c2ecf20Sopenharmony_ci#define MDEFAULT 15
32708c2ecf20Sopenharmony_ci#define MSTATE 100
32718c2ecf20Sopenharmony_ci	int cptr;
32728c2ecf20Sopenharmony_ci	u8 *word;
32738c2ecf20Sopenharmony_ci	int code;
32748c2ecf20Sopenharmony_ci	int reference, length, major, minor;
32758c2ecf20Sopenharmony_ci	int osize;
32768c2ecf20Sopenharmony_ci	int it;
32778c2ecf20Sopenharmony_ci	u16 checksum, mchecksum;
32788c2ecf20Sopenharmony_ci	struct ath_common *common = ath9k_hw_common(ah);
32798c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep;
32808c2ecf20Sopenharmony_ci	eeprom_read_op read;
32818c2ecf20Sopenharmony_ci
32828c2ecf20Sopenharmony_ci	if (ath9k_hw_use_flash(ah)) {
32838c2ecf20Sopenharmony_ci		u8 txrx;
32848c2ecf20Sopenharmony_ci
32858c2ecf20Sopenharmony_ci		if (ar9300_eeprom_restore_flash(ah, mptr, mdata_size))
32868c2ecf20Sopenharmony_ci			return -EIO;
32878c2ecf20Sopenharmony_ci
32888c2ecf20Sopenharmony_ci		/* check if eeprom contains valid data */
32898c2ecf20Sopenharmony_ci		eep = (struct ar9300_eeprom *) mptr;
32908c2ecf20Sopenharmony_ci		txrx = eep->baseEepHeader.txrxMask;
32918c2ecf20Sopenharmony_ci		if (txrx != 0 && txrx != 0xff)
32928c2ecf20Sopenharmony_ci			return 0;
32938c2ecf20Sopenharmony_ci	}
32948c2ecf20Sopenharmony_ci
32958c2ecf20Sopenharmony_ci	word = kzalloc(2048, GFP_KERNEL);
32968c2ecf20Sopenharmony_ci	if (!word)
32978c2ecf20Sopenharmony_ci		return -ENOMEM;
32988c2ecf20Sopenharmony_ci
32998c2ecf20Sopenharmony_ci	memcpy(mptr, &ar9300_default, mdata_size);
33008c2ecf20Sopenharmony_ci
33018c2ecf20Sopenharmony_ci	read = ar9300_read_eeprom;
33028c2ecf20Sopenharmony_ci	if (AR_SREV_9485(ah))
33038c2ecf20Sopenharmony_ci		cptr = AR9300_BASE_ADDR_4K;
33048c2ecf20Sopenharmony_ci	else if (AR_SREV_9330(ah))
33058c2ecf20Sopenharmony_ci		cptr = AR9300_BASE_ADDR_512;
33068c2ecf20Sopenharmony_ci	else
33078c2ecf20Sopenharmony_ci		cptr = AR9300_BASE_ADDR;
33088c2ecf20Sopenharmony_ci	ath_dbg(common, EEPROM, "Trying EEPROM access at Address 0x%04x\n",
33098c2ecf20Sopenharmony_ci		cptr);
33108c2ecf20Sopenharmony_ci	if (ar9300_check_eeprom_header(ah, read, cptr))
33118c2ecf20Sopenharmony_ci		goto found;
33128c2ecf20Sopenharmony_ci
33138c2ecf20Sopenharmony_ci	cptr = AR9300_BASE_ADDR_4K;
33148c2ecf20Sopenharmony_ci	ath_dbg(common, EEPROM, "Trying EEPROM access at Address 0x%04x\n",
33158c2ecf20Sopenharmony_ci		cptr);
33168c2ecf20Sopenharmony_ci	if (ar9300_check_eeprom_header(ah, read, cptr))
33178c2ecf20Sopenharmony_ci		goto found;
33188c2ecf20Sopenharmony_ci
33198c2ecf20Sopenharmony_ci	cptr = AR9300_BASE_ADDR_512;
33208c2ecf20Sopenharmony_ci	ath_dbg(common, EEPROM, "Trying EEPROM access at Address 0x%04x\n",
33218c2ecf20Sopenharmony_ci		cptr);
33228c2ecf20Sopenharmony_ci	if (ar9300_check_eeprom_header(ah, read, cptr))
33238c2ecf20Sopenharmony_ci		goto found;
33248c2ecf20Sopenharmony_ci
33258c2ecf20Sopenharmony_ci	read = ar9300_read_otp;
33268c2ecf20Sopenharmony_ci	cptr = AR9300_BASE_ADDR;
33278c2ecf20Sopenharmony_ci	ath_dbg(common, EEPROM, "Trying OTP access at Address 0x%04x\n", cptr);
33288c2ecf20Sopenharmony_ci	if (ar9300_check_eeprom_header(ah, read, cptr))
33298c2ecf20Sopenharmony_ci		goto found;
33308c2ecf20Sopenharmony_ci
33318c2ecf20Sopenharmony_ci	cptr = AR9300_BASE_ADDR_512;
33328c2ecf20Sopenharmony_ci	ath_dbg(common, EEPROM, "Trying OTP access at Address 0x%04x\n", cptr);
33338c2ecf20Sopenharmony_ci	if (ar9300_check_eeprom_header(ah, read, cptr))
33348c2ecf20Sopenharmony_ci		goto found;
33358c2ecf20Sopenharmony_ci
33368c2ecf20Sopenharmony_ci	goto fail;
33378c2ecf20Sopenharmony_ci
33388c2ecf20Sopenharmony_cifound:
33398c2ecf20Sopenharmony_ci	ath_dbg(common, EEPROM, "Found valid EEPROM data\n");
33408c2ecf20Sopenharmony_ci
33418c2ecf20Sopenharmony_ci	for (it = 0; it < MSTATE; it++) {
33428c2ecf20Sopenharmony_ci		if (!read(ah, cptr, word, COMP_HDR_LEN))
33438c2ecf20Sopenharmony_ci			goto fail;
33448c2ecf20Sopenharmony_ci
33458c2ecf20Sopenharmony_ci		if (!ar9300_check_header(word))
33468c2ecf20Sopenharmony_ci			break;
33478c2ecf20Sopenharmony_ci
33488c2ecf20Sopenharmony_ci		ar9300_comp_hdr_unpack(word, &code, &reference,
33498c2ecf20Sopenharmony_ci				       &length, &major, &minor);
33508c2ecf20Sopenharmony_ci		ath_dbg(common, EEPROM,
33518c2ecf20Sopenharmony_ci			"Found block at %x: code=%d ref=%d length=%d major=%d minor=%d\n",
33528c2ecf20Sopenharmony_ci			cptr, code, reference, length, major, minor);
33538c2ecf20Sopenharmony_ci		if ((!AR_SREV_9485(ah) && length >= 1024) ||
33548c2ecf20Sopenharmony_ci		    (AR_SREV_9485(ah) && length > EEPROM_DATA_LEN_9485) ||
33558c2ecf20Sopenharmony_ci		    (length > cptr)) {
33568c2ecf20Sopenharmony_ci			ath_dbg(common, EEPROM, "Skipping bad header\n");
33578c2ecf20Sopenharmony_ci			cptr -= COMP_HDR_LEN;
33588c2ecf20Sopenharmony_ci			continue;
33598c2ecf20Sopenharmony_ci		}
33608c2ecf20Sopenharmony_ci
33618c2ecf20Sopenharmony_ci		osize = length;
33628c2ecf20Sopenharmony_ci		read(ah, cptr, word, COMP_HDR_LEN + osize + COMP_CKSUM_LEN);
33638c2ecf20Sopenharmony_ci		checksum = ar9300_comp_cksum(&word[COMP_HDR_LEN], length);
33648c2ecf20Sopenharmony_ci		mchecksum = get_unaligned_le16(&word[COMP_HDR_LEN + osize]);
33658c2ecf20Sopenharmony_ci		ath_dbg(common, EEPROM, "checksum %x %x\n",
33668c2ecf20Sopenharmony_ci			checksum, mchecksum);
33678c2ecf20Sopenharmony_ci		if (checksum == mchecksum) {
33688c2ecf20Sopenharmony_ci			ar9300_compress_decision(ah, it, code, reference, mptr,
33698c2ecf20Sopenharmony_ci						 word, length, mdata_size);
33708c2ecf20Sopenharmony_ci		} else {
33718c2ecf20Sopenharmony_ci			ath_dbg(common, EEPROM,
33728c2ecf20Sopenharmony_ci				"skipping block with bad checksum\n");
33738c2ecf20Sopenharmony_ci		}
33748c2ecf20Sopenharmony_ci		cptr -= (COMP_HDR_LEN + osize + COMP_CKSUM_LEN);
33758c2ecf20Sopenharmony_ci	}
33768c2ecf20Sopenharmony_ci
33778c2ecf20Sopenharmony_ci	kfree(word);
33788c2ecf20Sopenharmony_ci	return cptr;
33798c2ecf20Sopenharmony_ci
33808c2ecf20Sopenharmony_cifail:
33818c2ecf20Sopenharmony_ci	kfree(word);
33828c2ecf20Sopenharmony_ci	return -1;
33838c2ecf20Sopenharmony_ci}
33848c2ecf20Sopenharmony_ci
33858c2ecf20Sopenharmony_ci/*
33868c2ecf20Sopenharmony_ci * Restore the configuration structure by reading the eeprom.
33878c2ecf20Sopenharmony_ci * This function destroys any existing in-memory structure
33888c2ecf20Sopenharmony_ci * content.
33898c2ecf20Sopenharmony_ci */
33908c2ecf20Sopenharmony_cistatic bool ath9k_hw_ar9300_fill_eeprom(struct ath_hw *ah)
33918c2ecf20Sopenharmony_ci{
33928c2ecf20Sopenharmony_ci	u8 *mptr = (u8 *) &ah->eeprom.ar9300_eep;
33938c2ecf20Sopenharmony_ci
33948c2ecf20Sopenharmony_ci	if (ar9300_eeprom_restore_internal(ah, mptr,
33958c2ecf20Sopenharmony_ci			sizeof(struct ar9300_eeprom)) < 0)
33968c2ecf20Sopenharmony_ci		return false;
33978c2ecf20Sopenharmony_ci
33988c2ecf20Sopenharmony_ci	return true;
33998c2ecf20Sopenharmony_ci}
34008c2ecf20Sopenharmony_ci
34018c2ecf20Sopenharmony_ci#if defined(CONFIG_ATH9K_DEBUGFS) || defined(CONFIG_ATH9K_HTC_DEBUGFS)
34028c2ecf20Sopenharmony_cistatic u32 ar9003_dump_modal_eeprom(char *buf, u32 len, u32 size,
34038c2ecf20Sopenharmony_ci				    struct ar9300_modal_eep_header *modal_hdr)
34048c2ecf20Sopenharmony_ci{
34058c2ecf20Sopenharmony_ci	PR_EEP("Chain0 Ant. Control", le16_to_cpu(modal_hdr->antCtrlChain[0]));
34068c2ecf20Sopenharmony_ci	PR_EEP("Chain1 Ant. Control", le16_to_cpu(modal_hdr->antCtrlChain[1]));
34078c2ecf20Sopenharmony_ci	PR_EEP("Chain2 Ant. Control", le16_to_cpu(modal_hdr->antCtrlChain[2]));
34088c2ecf20Sopenharmony_ci	PR_EEP("Ant. Common Control", le32_to_cpu(modal_hdr->antCtrlCommon));
34098c2ecf20Sopenharmony_ci	PR_EEP("Ant. Common Control2", le32_to_cpu(modal_hdr->antCtrlCommon2));
34108c2ecf20Sopenharmony_ci	PR_EEP("Ant. Gain", modal_hdr->antennaGain);
34118c2ecf20Sopenharmony_ci	PR_EEP("Switch Settle", modal_hdr->switchSettling);
34128c2ecf20Sopenharmony_ci	PR_EEP("Chain0 xatten1DB", modal_hdr->xatten1DB[0]);
34138c2ecf20Sopenharmony_ci	PR_EEP("Chain1 xatten1DB", modal_hdr->xatten1DB[1]);
34148c2ecf20Sopenharmony_ci	PR_EEP("Chain2 xatten1DB", modal_hdr->xatten1DB[2]);
34158c2ecf20Sopenharmony_ci	PR_EEP("Chain0 xatten1Margin", modal_hdr->xatten1Margin[0]);
34168c2ecf20Sopenharmony_ci	PR_EEP("Chain1 xatten1Margin", modal_hdr->xatten1Margin[1]);
34178c2ecf20Sopenharmony_ci	PR_EEP("Chain2 xatten1Margin", modal_hdr->xatten1Margin[2]);
34188c2ecf20Sopenharmony_ci	PR_EEP("Temp Slope", modal_hdr->tempSlope);
34198c2ecf20Sopenharmony_ci	PR_EEP("Volt Slope", modal_hdr->voltSlope);
34208c2ecf20Sopenharmony_ci	PR_EEP("spur Channels0", modal_hdr->spurChans[0]);
34218c2ecf20Sopenharmony_ci	PR_EEP("spur Channels1", modal_hdr->spurChans[1]);
34228c2ecf20Sopenharmony_ci	PR_EEP("spur Channels2", modal_hdr->spurChans[2]);
34238c2ecf20Sopenharmony_ci	PR_EEP("spur Channels3", modal_hdr->spurChans[3]);
34248c2ecf20Sopenharmony_ci	PR_EEP("spur Channels4", modal_hdr->spurChans[4]);
34258c2ecf20Sopenharmony_ci	PR_EEP("Chain0 NF Threshold", modal_hdr->noiseFloorThreshCh[0]);
34268c2ecf20Sopenharmony_ci	PR_EEP("Chain1 NF Threshold", modal_hdr->noiseFloorThreshCh[1]);
34278c2ecf20Sopenharmony_ci	PR_EEP("Chain2 NF Threshold", modal_hdr->noiseFloorThreshCh[2]);
34288c2ecf20Sopenharmony_ci	PR_EEP("Quick Drop", modal_hdr->quick_drop);
34298c2ecf20Sopenharmony_ci	PR_EEP("txEndToXpaOff", modal_hdr->txEndToXpaOff);
34308c2ecf20Sopenharmony_ci	PR_EEP("xPA Bias Level", modal_hdr->xpaBiasLvl);
34318c2ecf20Sopenharmony_ci	PR_EEP("txFrameToDataStart", modal_hdr->txFrameToDataStart);
34328c2ecf20Sopenharmony_ci	PR_EEP("txFrameToPaOn", modal_hdr->txFrameToPaOn);
34338c2ecf20Sopenharmony_ci	PR_EEP("txFrameToXpaOn", modal_hdr->txFrameToXpaOn);
34348c2ecf20Sopenharmony_ci	PR_EEP("txClip", modal_hdr->txClip);
34358c2ecf20Sopenharmony_ci	PR_EEP("ADC Desired size", modal_hdr->adcDesiredSize);
34368c2ecf20Sopenharmony_ci
34378c2ecf20Sopenharmony_ci	return len;
34388c2ecf20Sopenharmony_ci}
34398c2ecf20Sopenharmony_ci
34408c2ecf20Sopenharmony_cistatic u32 ar9003_dump_cal_data(struct ath_hw *ah, char *buf, u32 len, u32 size,
34418c2ecf20Sopenharmony_ci				bool is_2g)
34428c2ecf20Sopenharmony_ci{
34438c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
34448c2ecf20Sopenharmony_ci	struct ar9300_base_eep_hdr *pBase;
34458c2ecf20Sopenharmony_ci	struct ar9300_cal_data_per_freq_op_loop *cal_pier;
34468c2ecf20Sopenharmony_ci	int cal_pier_nr;
34478c2ecf20Sopenharmony_ci	int freq;
34488c2ecf20Sopenharmony_ci	int i, j;
34498c2ecf20Sopenharmony_ci
34508c2ecf20Sopenharmony_ci	pBase = &eep->baseEepHeader;
34518c2ecf20Sopenharmony_ci
34528c2ecf20Sopenharmony_ci	if (is_2g)
34538c2ecf20Sopenharmony_ci		cal_pier_nr = AR9300_NUM_2G_CAL_PIERS;
34548c2ecf20Sopenharmony_ci	else
34558c2ecf20Sopenharmony_ci		cal_pier_nr = AR9300_NUM_5G_CAL_PIERS;
34568c2ecf20Sopenharmony_ci
34578c2ecf20Sopenharmony_ci	for (i = 0; i < AR9300_MAX_CHAINS; i++) {
34588c2ecf20Sopenharmony_ci		if (!((pBase->txrxMask >> i) & 1))
34598c2ecf20Sopenharmony_ci			continue;
34608c2ecf20Sopenharmony_ci
34618c2ecf20Sopenharmony_ci		len += scnprintf(buf + len, size - len, "Chain %d\n", i);
34628c2ecf20Sopenharmony_ci
34638c2ecf20Sopenharmony_ci		len += scnprintf(buf + len, size - len,
34648c2ecf20Sopenharmony_ci			"Freq\t ref\tvolt\ttemp\tnf_cal\tnf_pow\trx_temp\n");
34658c2ecf20Sopenharmony_ci
34668c2ecf20Sopenharmony_ci		for (j = 0; j < cal_pier_nr; j++) {
34678c2ecf20Sopenharmony_ci			if (is_2g) {
34688c2ecf20Sopenharmony_ci				cal_pier = &eep->calPierData2G[i][j];
34698c2ecf20Sopenharmony_ci				freq = 2300 + eep->calFreqPier2G[j];
34708c2ecf20Sopenharmony_ci			} else {
34718c2ecf20Sopenharmony_ci				cal_pier = &eep->calPierData5G[i][j];
34728c2ecf20Sopenharmony_ci				freq = 4800 + eep->calFreqPier5G[j] * 5;
34738c2ecf20Sopenharmony_ci			}
34748c2ecf20Sopenharmony_ci
34758c2ecf20Sopenharmony_ci			len += scnprintf(buf + len, size - len,
34768c2ecf20Sopenharmony_ci				"%d\t", freq);
34778c2ecf20Sopenharmony_ci
34788c2ecf20Sopenharmony_ci			len += scnprintf(buf + len, size - len,
34798c2ecf20Sopenharmony_ci				"%d\t%d\t%d\t%d\t%d\t%d\n",
34808c2ecf20Sopenharmony_ci				cal_pier->refPower,
34818c2ecf20Sopenharmony_ci				cal_pier->voltMeas,
34828c2ecf20Sopenharmony_ci				cal_pier->tempMeas,
34838c2ecf20Sopenharmony_ci				cal_pier->rxTempMeas ?
34848c2ecf20Sopenharmony_ci				N2DBM(cal_pier->rxNoisefloorCal) : 0,
34858c2ecf20Sopenharmony_ci				cal_pier->rxTempMeas ?
34868c2ecf20Sopenharmony_ci				N2DBM(cal_pier->rxNoisefloorPower) : 0,
34878c2ecf20Sopenharmony_ci				cal_pier->rxTempMeas);
34888c2ecf20Sopenharmony_ci		}
34898c2ecf20Sopenharmony_ci	}
34908c2ecf20Sopenharmony_ci
34918c2ecf20Sopenharmony_ci	return len;
34928c2ecf20Sopenharmony_ci}
34938c2ecf20Sopenharmony_ci
34948c2ecf20Sopenharmony_cistatic u32 ath9k_hw_ar9003_dump_eeprom(struct ath_hw *ah, bool dump_base_hdr,
34958c2ecf20Sopenharmony_ci				       u8 *buf, u32 len, u32 size)
34968c2ecf20Sopenharmony_ci{
34978c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
34988c2ecf20Sopenharmony_ci	struct ar9300_base_eep_hdr *pBase;
34998c2ecf20Sopenharmony_ci
35008c2ecf20Sopenharmony_ci	if (!dump_base_hdr) {
35018c2ecf20Sopenharmony_ci		len += scnprintf(buf + len, size - len,
35028c2ecf20Sopenharmony_ci				 "%20s :\n", "2GHz modal Header");
35038c2ecf20Sopenharmony_ci		len = ar9003_dump_modal_eeprom(buf, len, size,
35048c2ecf20Sopenharmony_ci						&eep->modalHeader2G);
35058c2ecf20Sopenharmony_ci
35068c2ecf20Sopenharmony_ci		len += scnprintf(buf + len, size - len, "Calibration data\n");
35078c2ecf20Sopenharmony_ci		len = ar9003_dump_cal_data(ah, buf, len, size, true);
35088c2ecf20Sopenharmony_ci
35098c2ecf20Sopenharmony_ci		len += scnprintf(buf + len, size - len,
35108c2ecf20Sopenharmony_ci				 "%20s :\n", "5GHz modal Header");
35118c2ecf20Sopenharmony_ci		len = ar9003_dump_modal_eeprom(buf, len, size,
35128c2ecf20Sopenharmony_ci						&eep->modalHeader5G);
35138c2ecf20Sopenharmony_ci
35148c2ecf20Sopenharmony_ci		len += scnprintf(buf + len, size - len, "Calibration data\n");
35158c2ecf20Sopenharmony_ci		len = ar9003_dump_cal_data(ah, buf, len, size, false);
35168c2ecf20Sopenharmony_ci
35178c2ecf20Sopenharmony_ci		goto out;
35188c2ecf20Sopenharmony_ci	}
35198c2ecf20Sopenharmony_ci
35208c2ecf20Sopenharmony_ci	pBase = &eep->baseEepHeader;
35218c2ecf20Sopenharmony_ci
35228c2ecf20Sopenharmony_ci	PR_EEP("EEPROM Version", ah->eeprom.ar9300_eep.eepromVersion);
35238c2ecf20Sopenharmony_ci	PR_EEP("RegDomain1", le16_to_cpu(pBase->regDmn[0]));
35248c2ecf20Sopenharmony_ci	PR_EEP("RegDomain2", le16_to_cpu(pBase->regDmn[1]));
35258c2ecf20Sopenharmony_ci	PR_EEP("TX Mask", (pBase->txrxMask >> 4));
35268c2ecf20Sopenharmony_ci	PR_EEP("RX Mask", (pBase->txrxMask & 0x0f));
35278c2ecf20Sopenharmony_ci	PR_EEP("Allow 5GHz", !!(pBase->opCapFlags.opFlags &
35288c2ecf20Sopenharmony_ci				AR5416_OPFLAGS_11A));
35298c2ecf20Sopenharmony_ci	PR_EEP("Allow 2GHz", !!(pBase->opCapFlags.opFlags &
35308c2ecf20Sopenharmony_ci				AR5416_OPFLAGS_11G));
35318c2ecf20Sopenharmony_ci	PR_EEP("Disable 2GHz HT20", !!(pBase->opCapFlags.opFlags &
35328c2ecf20Sopenharmony_ci					AR5416_OPFLAGS_N_2G_HT20));
35338c2ecf20Sopenharmony_ci	PR_EEP("Disable 2GHz HT40", !!(pBase->opCapFlags.opFlags &
35348c2ecf20Sopenharmony_ci					AR5416_OPFLAGS_N_2G_HT40));
35358c2ecf20Sopenharmony_ci	PR_EEP("Disable 5Ghz HT20", !!(pBase->opCapFlags.opFlags &
35368c2ecf20Sopenharmony_ci					AR5416_OPFLAGS_N_5G_HT20));
35378c2ecf20Sopenharmony_ci	PR_EEP("Disable 5Ghz HT40", !!(pBase->opCapFlags.opFlags &
35388c2ecf20Sopenharmony_ci					AR5416_OPFLAGS_N_5G_HT40));
35398c2ecf20Sopenharmony_ci	PR_EEP("Big Endian", !!(pBase->opCapFlags.eepMisc &
35408c2ecf20Sopenharmony_ci				AR5416_EEPMISC_BIG_ENDIAN));
35418c2ecf20Sopenharmony_ci	PR_EEP("RF Silent", pBase->rfSilent);
35428c2ecf20Sopenharmony_ci	PR_EEP("BT option", pBase->blueToothOptions);
35438c2ecf20Sopenharmony_ci	PR_EEP("Device Cap", pBase->deviceCap);
35448c2ecf20Sopenharmony_ci	PR_EEP("Device Type", pBase->deviceType);
35458c2ecf20Sopenharmony_ci	PR_EEP("Power Table Offset", pBase->pwrTableOffset);
35468c2ecf20Sopenharmony_ci	PR_EEP("Tuning Caps1", pBase->params_for_tuning_caps[0]);
35478c2ecf20Sopenharmony_ci	PR_EEP("Tuning Caps2", pBase->params_for_tuning_caps[1]);
35488c2ecf20Sopenharmony_ci	PR_EEP("Enable Tx Temp Comp", !!(pBase->featureEnable & BIT(0)));
35498c2ecf20Sopenharmony_ci	PR_EEP("Enable Tx Volt Comp", !!(pBase->featureEnable & BIT(1)));
35508c2ecf20Sopenharmony_ci	PR_EEP("Enable fast clock", !!(pBase->featureEnable & BIT(2)));
35518c2ecf20Sopenharmony_ci	PR_EEP("Enable doubling", !!(pBase->featureEnable & BIT(3)));
35528c2ecf20Sopenharmony_ci	PR_EEP("Internal regulator", !!(pBase->featureEnable & BIT(4)));
35538c2ecf20Sopenharmony_ci	PR_EEP("Enable Paprd", !!(pBase->featureEnable & BIT(5)));
35548c2ecf20Sopenharmony_ci	PR_EEP("Driver Strength", !!(pBase->miscConfiguration & BIT(0)));
35558c2ecf20Sopenharmony_ci	PR_EEP("Quick Drop", !!(pBase->miscConfiguration & BIT(1)));
35568c2ecf20Sopenharmony_ci	PR_EEP("Chain mask Reduce", (pBase->miscConfiguration >> 0x3) & 0x1);
35578c2ecf20Sopenharmony_ci	PR_EEP("Write enable Gpio", pBase->eepromWriteEnableGpio);
35588c2ecf20Sopenharmony_ci	PR_EEP("WLAN Disable Gpio", pBase->wlanDisableGpio);
35598c2ecf20Sopenharmony_ci	PR_EEP("WLAN LED Gpio", pBase->wlanLedGpio);
35608c2ecf20Sopenharmony_ci	PR_EEP("Rx Band Select Gpio", pBase->rxBandSelectGpio);
35618c2ecf20Sopenharmony_ci	PR_EEP("Tx Gain", pBase->txrxgain >> 4);
35628c2ecf20Sopenharmony_ci	PR_EEP("Rx Gain", pBase->txrxgain & 0xf);
35638c2ecf20Sopenharmony_ci	PR_EEP("SW Reg", le32_to_cpu(pBase->swreg));
35648c2ecf20Sopenharmony_ci
35658c2ecf20Sopenharmony_ci	len += scnprintf(buf + len, size - len, "%20s : %pM\n", "MacAddress",
35668c2ecf20Sopenharmony_ci			 ah->eeprom.ar9300_eep.macAddr);
35678c2ecf20Sopenharmony_ciout:
35688c2ecf20Sopenharmony_ci	if (len > size)
35698c2ecf20Sopenharmony_ci		len = size;
35708c2ecf20Sopenharmony_ci
35718c2ecf20Sopenharmony_ci	return len;
35728c2ecf20Sopenharmony_ci}
35738c2ecf20Sopenharmony_ci#else
35748c2ecf20Sopenharmony_cistatic u32 ath9k_hw_ar9003_dump_eeprom(struct ath_hw *ah, bool dump_base_hdr,
35758c2ecf20Sopenharmony_ci				       u8 *buf, u32 len, u32 size)
35768c2ecf20Sopenharmony_ci{
35778c2ecf20Sopenharmony_ci	return 0;
35788c2ecf20Sopenharmony_ci}
35798c2ecf20Sopenharmony_ci#endif
35808c2ecf20Sopenharmony_ci
35818c2ecf20Sopenharmony_ci/* XXX: review hardware docs */
35828c2ecf20Sopenharmony_cistatic int ath9k_hw_ar9300_get_eeprom_ver(struct ath_hw *ah)
35838c2ecf20Sopenharmony_ci{
35848c2ecf20Sopenharmony_ci	return ah->eeprom.ar9300_eep.eepromVersion;
35858c2ecf20Sopenharmony_ci}
35868c2ecf20Sopenharmony_ci
35878c2ecf20Sopenharmony_ci/* XXX: could be read from the eepromVersion, not sure yet */
35888c2ecf20Sopenharmony_cistatic int ath9k_hw_ar9300_get_eeprom_rev(struct ath_hw *ah)
35898c2ecf20Sopenharmony_ci{
35908c2ecf20Sopenharmony_ci	return 0;
35918c2ecf20Sopenharmony_ci}
35928c2ecf20Sopenharmony_ci
35938c2ecf20Sopenharmony_cistatic struct ar9300_modal_eep_header *ar9003_modal_header(struct ath_hw *ah,
35948c2ecf20Sopenharmony_ci							   bool is2ghz)
35958c2ecf20Sopenharmony_ci{
35968c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
35978c2ecf20Sopenharmony_ci
35988c2ecf20Sopenharmony_ci	if (is2ghz)
35998c2ecf20Sopenharmony_ci		return &eep->modalHeader2G;
36008c2ecf20Sopenharmony_ci	else
36018c2ecf20Sopenharmony_ci		return &eep->modalHeader5G;
36028c2ecf20Sopenharmony_ci}
36038c2ecf20Sopenharmony_ci
36048c2ecf20Sopenharmony_cistatic void ar9003_hw_xpa_bias_level_apply(struct ath_hw *ah, bool is2ghz)
36058c2ecf20Sopenharmony_ci{
36068c2ecf20Sopenharmony_ci	int bias = ar9003_modal_header(ah, is2ghz)->xpaBiasLvl;
36078c2ecf20Sopenharmony_ci
36088c2ecf20Sopenharmony_ci	if (AR_SREV_9485(ah) || AR_SREV_9330(ah) || AR_SREV_9340(ah) ||
36098c2ecf20Sopenharmony_ci	    AR_SREV_9531(ah) || AR_SREV_9561(ah))
36108c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, AR_CH0_TOP2, AR_CH0_TOP2_XPABIASLVL, bias);
36118c2ecf20Sopenharmony_ci	else if (AR_SREV_9462(ah) || AR_SREV_9550(ah) || AR_SREV_9565(ah))
36128c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, AR_CH0_TOP, AR_CH0_TOP_XPABIASLVL, bias);
36138c2ecf20Sopenharmony_ci	else {
36148c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, AR_CH0_TOP, AR_CH0_TOP_XPABIASLVL, bias);
36158c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, AR_CH0_THERM,
36168c2ecf20Sopenharmony_ci				AR_CH0_THERM_XPABIASLVL_MSB,
36178c2ecf20Sopenharmony_ci				bias >> 2);
36188c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, AR_CH0_THERM,
36198c2ecf20Sopenharmony_ci				AR_CH0_THERM_XPASHORT2GND, 1);
36208c2ecf20Sopenharmony_ci	}
36218c2ecf20Sopenharmony_ci}
36228c2ecf20Sopenharmony_ci
36238c2ecf20Sopenharmony_cistatic u16 ar9003_switch_com_spdt_get(struct ath_hw *ah, bool is2ghz)
36248c2ecf20Sopenharmony_ci{
36258c2ecf20Sopenharmony_ci	return le16_to_cpu(ar9003_modal_header(ah, is2ghz)->switchcomspdt);
36268c2ecf20Sopenharmony_ci}
36278c2ecf20Sopenharmony_ci
36288c2ecf20Sopenharmony_ciu32 ar9003_hw_ant_ctrl_common_get(struct ath_hw *ah, bool is2ghz)
36298c2ecf20Sopenharmony_ci{
36308c2ecf20Sopenharmony_ci	return le32_to_cpu(ar9003_modal_header(ah, is2ghz)->antCtrlCommon);
36318c2ecf20Sopenharmony_ci}
36328c2ecf20Sopenharmony_ci
36338c2ecf20Sopenharmony_ciu32 ar9003_hw_ant_ctrl_common_2_get(struct ath_hw *ah, bool is2ghz)
36348c2ecf20Sopenharmony_ci{
36358c2ecf20Sopenharmony_ci	return le32_to_cpu(ar9003_modal_header(ah, is2ghz)->antCtrlCommon2);
36368c2ecf20Sopenharmony_ci}
36378c2ecf20Sopenharmony_ci
36388c2ecf20Sopenharmony_cistatic u16 ar9003_hw_ant_ctrl_chain_get(struct ath_hw *ah, int chain,
36398c2ecf20Sopenharmony_ci					bool is2ghz)
36408c2ecf20Sopenharmony_ci{
36418c2ecf20Sopenharmony_ci	__le16 val = ar9003_modal_header(ah, is2ghz)->antCtrlChain[chain];
36428c2ecf20Sopenharmony_ci	return le16_to_cpu(val);
36438c2ecf20Sopenharmony_ci}
36448c2ecf20Sopenharmony_ci
36458c2ecf20Sopenharmony_cistatic void ar9003_hw_ant_ctrl_apply(struct ath_hw *ah, bool is2ghz)
36468c2ecf20Sopenharmony_ci{
36478c2ecf20Sopenharmony_ci	struct ath_common *common = ath9k_hw_common(ah);
36488c2ecf20Sopenharmony_ci	struct ath9k_hw_capabilities *pCap = &ah->caps;
36498c2ecf20Sopenharmony_ci	int chain;
36508c2ecf20Sopenharmony_ci	u32 regval, value, gpio;
36518c2ecf20Sopenharmony_ci	static const u32 switch_chain_reg[AR9300_MAX_CHAINS] = {
36528c2ecf20Sopenharmony_ci			AR_PHY_SWITCH_CHAIN_0,
36538c2ecf20Sopenharmony_ci			AR_PHY_SWITCH_CHAIN_1,
36548c2ecf20Sopenharmony_ci			AR_PHY_SWITCH_CHAIN_2,
36558c2ecf20Sopenharmony_ci	};
36568c2ecf20Sopenharmony_ci
36578c2ecf20Sopenharmony_ci	if (AR_SREV_9485(ah) && (ar9003_hw_get_rx_gain_idx(ah) == 0)) {
36588c2ecf20Sopenharmony_ci		if (ah->config.xlna_gpio)
36598c2ecf20Sopenharmony_ci			gpio = ah->config.xlna_gpio;
36608c2ecf20Sopenharmony_ci		else
36618c2ecf20Sopenharmony_ci			gpio = AR9300_EXT_LNA_CTL_GPIO_AR9485;
36628c2ecf20Sopenharmony_ci
36638c2ecf20Sopenharmony_ci		ath9k_hw_gpio_request_out(ah, gpio, NULL,
36648c2ecf20Sopenharmony_ci					  AR_GPIO_OUTPUT_MUX_AS_PCIE_ATTENTION_LED);
36658c2ecf20Sopenharmony_ci	}
36668c2ecf20Sopenharmony_ci
36678c2ecf20Sopenharmony_ci	value = ar9003_hw_ant_ctrl_common_get(ah, is2ghz);
36688c2ecf20Sopenharmony_ci
36698c2ecf20Sopenharmony_ci	if (AR_SREV_9462(ah) || AR_SREV_9565(ah)) {
36708c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM,
36718c2ecf20Sopenharmony_ci				AR_SWITCH_TABLE_COM_AR9462_ALL, value);
36728c2ecf20Sopenharmony_ci	} else if (AR_SREV_9550(ah) || AR_SREV_9531(ah) || AR_SREV_9561(ah)) {
36738c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM,
36748c2ecf20Sopenharmony_ci				AR_SWITCH_TABLE_COM_AR9550_ALL, value);
36758c2ecf20Sopenharmony_ci	} else
36768c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM,
36778c2ecf20Sopenharmony_ci			      AR_SWITCH_TABLE_COM_ALL, value);
36788c2ecf20Sopenharmony_ci
36798c2ecf20Sopenharmony_ci
36808c2ecf20Sopenharmony_ci	/*
36818c2ecf20Sopenharmony_ci	 *   AR9462 defines new switch table for BT/WLAN,
36828c2ecf20Sopenharmony_ci	 *       here's new field name in XXX.ref for both 2G and 5G.
36838c2ecf20Sopenharmony_ci	 *   Register: [GLB_CONTROL] GLB_CONTROL (@0x20044)
36848c2ecf20Sopenharmony_ci	 *   15:12   R/W     SWITCH_TABLE_COM_SPDT_WLAN_RX
36858c2ecf20Sopenharmony_ci	 * SWITCH_TABLE_COM_SPDT_WLAN_RX
36868c2ecf20Sopenharmony_ci	 *
36878c2ecf20Sopenharmony_ci	 *   11:8     R/W     SWITCH_TABLE_COM_SPDT_WLAN_TX
36888c2ecf20Sopenharmony_ci	 * SWITCH_TABLE_COM_SPDT_WLAN_TX
36898c2ecf20Sopenharmony_ci	 *
36908c2ecf20Sopenharmony_ci	 *   7:4 R/W  SWITCH_TABLE_COM_SPDT_WLAN_IDLE
36918c2ecf20Sopenharmony_ci	 * SWITCH_TABLE_COM_SPDT_WLAN_IDLE
36928c2ecf20Sopenharmony_ci	 */
36938c2ecf20Sopenharmony_ci	if (AR_SREV_9462_20_OR_LATER(ah) || AR_SREV_9565(ah)) {
36948c2ecf20Sopenharmony_ci		value = ar9003_switch_com_spdt_get(ah, is2ghz);
36958c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_GLB_CONTROL,
36968c2ecf20Sopenharmony_ci				AR_SWITCH_TABLE_COM_SPDT_ALL, value);
36978c2ecf20Sopenharmony_ci		REG_SET_BIT(ah, AR_PHY_GLB_CONTROL, AR_BTCOEX_CTRL_SPDT_ENABLE);
36988c2ecf20Sopenharmony_ci	}
36998c2ecf20Sopenharmony_ci
37008c2ecf20Sopenharmony_ci	value = ar9003_hw_ant_ctrl_common_2_get(ah, is2ghz);
37018c2ecf20Sopenharmony_ci	if (AR_SREV_9485(ah) && common->bt_ant_diversity) {
37028c2ecf20Sopenharmony_ci		value &= ~AR_SWITCH_TABLE_COM2_ALL;
37038c2ecf20Sopenharmony_ci		value |= ah->config.ant_ctrl_comm2g_switch_enable;
37048c2ecf20Sopenharmony_ci
37058c2ecf20Sopenharmony_ci	}
37068c2ecf20Sopenharmony_ci	REG_RMW_FIELD(ah, AR_PHY_SWITCH_COM_2, AR_SWITCH_TABLE_COM2_ALL, value);
37078c2ecf20Sopenharmony_ci
37088c2ecf20Sopenharmony_ci	if ((AR_SREV_9462(ah)) && (ah->rxchainmask == 0x2)) {
37098c2ecf20Sopenharmony_ci		value = ar9003_hw_ant_ctrl_chain_get(ah, 1, is2ghz);
37108c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, switch_chain_reg[0],
37118c2ecf20Sopenharmony_ci			      AR_SWITCH_TABLE_ALL, value);
37128c2ecf20Sopenharmony_ci	}
37138c2ecf20Sopenharmony_ci
37148c2ecf20Sopenharmony_ci	for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
37158c2ecf20Sopenharmony_ci		if ((ah->rxchainmask & BIT(chain)) ||
37168c2ecf20Sopenharmony_ci		    (ah->txchainmask & BIT(chain))) {
37178c2ecf20Sopenharmony_ci			value = ar9003_hw_ant_ctrl_chain_get(ah, chain,
37188c2ecf20Sopenharmony_ci							     is2ghz);
37198c2ecf20Sopenharmony_ci			REG_RMW_FIELD(ah, switch_chain_reg[chain],
37208c2ecf20Sopenharmony_ci				      AR_SWITCH_TABLE_ALL, value);
37218c2ecf20Sopenharmony_ci		}
37228c2ecf20Sopenharmony_ci	}
37238c2ecf20Sopenharmony_ci
37248c2ecf20Sopenharmony_ci	if (AR_SREV_9330(ah) || AR_SREV_9485(ah) || AR_SREV_9565(ah)) {
37258c2ecf20Sopenharmony_ci		value = ath9k_hw_ar9300_get_eeprom(ah, EEP_ANT_DIV_CTL1);
37268c2ecf20Sopenharmony_ci		/*
37278c2ecf20Sopenharmony_ci		 * main_lnaconf, alt_lnaconf, main_tb, alt_tb
37288c2ecf20Sopenharmony_ci		 * are the fields present
37298c2ecf20Sopenharmony_ci		 */
37308c2ecf20Sopenharmony_ci		regval = REG_READ(ah, AR_PHY_MC_GAIN_CTRL);
37318c2ecf20Sopenharmony_ci		regval &= (~AR_ANT_DIV_CTRL_ALL);
37328c2ecf20Sopenharmony_ci		regval |= (value & 0x3f) << AR_ANT_DIV_CTRL_ALL_S;
37338c2ecf20Sopenharmony_ci		/* enable_lnadiv */
37348c2ecf20Sopenharmony_ci		regval &= (~AR_PHY_ANT_DIV_LNADIV);
37358c2ecf20Sopenharmony_ci		regval |= ((value >> 6) & 0x1) << AR_PHY_ANT_DIV_LNADIV_S;
37368c2ecf20Sopenharmony_ci
37378c2ecf20Sopenharmony_ci		if (AR_SREV_9485(ah) && common->bt_ant_diversity)
37388c2ecf20Sopenharmony_ci			regval |= AR_ANT_DIV_ENABLE;
37398c2ecf20Sopenharmony_ci
37408c2ecf20Sopenharmony_ci		if (AR_SREV_9565(ah)) {
37418c2ecf20Sopenharmony_ci			if (common->bt_ant_diversity) {
37428c2ecf20Sopenharmony_ci				regval |= (1 << AR_PHY_ANT_SW_RX_PROT_S);
37438c2ecf20Sopenharmony_ci
37448c2ecf20Sopenharmony_ci				REG_SET_BIT(ah, AR_PHY_RESTART,
37458c2ecf20Sopenharmony_ci					    AR_PHY_RESTART_ENABLE_DIV_M2FLAG);
37468c2ecf20Sopenharmony_ci
37478c2ecf20Sopenharmony_ci				/* Force WLAN LNA diversity ON */
37488c2ecf20Sopenharmony_ci				REG_SET_BIT(ah, AR_BTCOEX_WL_LNADIV,
37498c2ecf20Sopenharmony_ci					    AR_BTCOEX_WL_LNADIV_FORCE_ON);
37508c2ecf20Sopenharmony_ci			} else {
37518c2ecf20Sopenharmony_ci				regval &= ~(1 << AR_PHY_ANT_DIV_LNADIV_S);
37528c2ecf20Sopenharmony_ci				regval &= ~(1 << AR_PHY_ANT_SW_RX_PROT_S);
37538c2ecf20Sopenharmony_ci
37548c2ecf20Sopenharmony_ci				REG_CLR_BIT(ah, AR_PHY_MC_GAIN_CTRL,
37558c2ecf20Sopenharmony_ci					    (1 << AR_PHY_ANT_SW_RX_PROT_S));
37568c2ecf20Sopenharmony_ci
37578c2ecf20Sopenharmony_ci				/* Force WLAN LNA diversity OFF */
37588c2ecf20Sopenharmony_ci				REG_CLR_BIT(ah, AR_BTCOEX_WL_LNADIV,
37598c2ecf20Sopenharmony_ci					    AR_BTCOEX_WL_LNADIV_FORCE_ON);
37608c2ecf20Sopenharmony_ci			}
37618c2ecf20Sopenharmony_ci		}
37628c2ecf20Sopenharmony_ci
37638c2ecf20Sopenharmony_ci		REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval);
37648c2ecf20Sopenharmony_ci
37658c2ecf20Sopenharmony_ci		/* enable fast_div */
37668c2ecf20Sopenharmony_ci		regval = REG_READ(ah, AR_PHY_CCK_DETECT);
37678c2ecf20Sopenharmony_ci		regval &= (~AR_FAST_DIV_ENABLE);
37688c2ecf20Sopenharmony_ci		regval |= ((value >> 7) & 0x1) << AR_FAST_DIV_ENABLE_S;
37698c2ecf20Sopenharmony_ci
37708c2ecf20Sopenharmony_ci		if ((AR_SREV_9485(ah) || AR_SREV_9565(ah))
37718c2ecf20Sopenharmony_ci		    && common->bt_ant_diversity)
37728c2ecf20Sopenharmony_ci			regval |= AR_FAST_DIV_ENABLE;
37738c2ecf20Sopenharmony_ci
37748c2ecf20Sopenharmony_ci		REG_WRITE(ah, AR_PHY_CCK_DETECT, regval);
37758c2ecf20Sopenharmony_ci
37768c2ecf20Sopenharmony_ci		if (pCap->hw_caps & ATH9K_HW_CAP_ANT_DIV_COMB) {
37778c2ecf20Sopenharmony_ci			regval = REG_READ(ah, AR_PHY_MC_GAIN_CTRL);
37788c2ecf20Sopenharmony_ci			/*
37798c2ecf20Sopenharmony_ci			 * clear bits 25-30 main_lnaconf, alt_lnaconf,
37808c2ecf20Sopenharmony_ci			 * main_tb, alt_tb
37818c2ecf20Sopenharmony_ci			 */
37828c2ecf20Sopenharmony_ci			regval &= (~(AR_PHY_ANT_DIV_MAIN_LNACONF |
37838c2ecf20Sopenharmony_ci				     AR_PHY_ANT_DIV_ALT_LNACONF |
37848c2ecf20Sopenharmony_ci				     AR_PHY_ANT_DIV_ALT_GAINTB |
37858c2ecf20Sopenharmony_ci				     AR_PHY_ANT_DIV_MAIN_GAINTB));
37868c2ecf20Sopenharmony_ci			/* by default use LNA1 for the main antenna */
37878c2ecf20Sopenharmony_ci			regval |= (ATH_ANT_DIV_COMB_LNA1 <<
37888c2ecf20Sopenharmony_ci				   AR_PHY_ANT_DIV_MAIN_LNACONF_S);
37898c2ecf20Sopenharmony_ci			regval |= (ATH_ANT_DIV_COMB_LNA2 <<
37908c2ecf20Sopenharmony_ci				   AR_PHY_ANT_DIV_ALT_LNACONF_S);
37918c2ecf20Sopenharmony_ci			REG_WRITE(ah, AR_PHY_MC_GAIN_CTRL, regval);
37928c2ecf20Sopenharmony_ci		}
37938c2ecf20Sopenharmony_ci	}
37948c2ecf20Sopenharmony_ci}
37958c2ecf20Sopenharmony_ci
37968c2ecf20Sopenharmony_cistatic void ar9003_hw_drive_strength_apply(struct ath_hw *ah)
37978c2ecf20Sopenharmony_ci{
37988c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
37998c2ecf20Sopenharmony_ci	struct ar9300_base_eep_hdr *pBase = &eep->baseEepHeader;
38008c2ecf20Sopenharmony_ci	int drive_strength;
38018c2ecf20Sopenharmony_ci	unsigned long reg;
38028c2ecf20Sopenharmony_ci
38038c2ecf20Sopenharmony_ci	drive_strength = pBase->miscConfiguration & BIT(0);
38048c2ecf20Sopenharmony_ci	if (!drive_strength)
38058c2ecf20Sopenharmony_ci		return;
38068c2ecf20Sopenharmony_ci
38078c2ecf20Sopenharmony_ci	reg = REG_READ(ah, AR_PHY_65NM_CH0_BIAS1);
38088c2ecf20Sopenharmony_ci	reg &= ~0x00ffffc0;
38098c2ecf20Sopenharmony_ci	reg |= 0x5 << 21;
38108c2ecf20Sopenharmony_ci	reg |= 0x5 << 18;
38118c2ecf20Sopenharmony_ci	reg |= 0x5 << 15;
38128c2ecf20Sopenharmony_ci	reg |= 0x5 << 12;
38138c2ecf20Sopenharmony_ci	reg |= 0x5 << 9;
38148c2ecf20Sopenharmony_ci	reg |= 0x5 << 6;
38158c2ecf20Sopenharmony_ci	REG_WRITE(ah, AR_PHY_65NM_CH0_BIAS1, reg);
38168c2ecf20Sopenharmony_ci
38178c2ecf20Sopenharmony_ci	reg = REG_READ(ah, AR_PHY_65NM_CH0_BIAS2);
38188c2ecf20Sopenharmony_ci	reg &= ~0xffffffe0;
38198c2ecf20Sopenharmony_ci	reg |= 0x5 << 29;
38208c2ecf20Sopenharmony_ci	reg |= 0x5 << 26;
38218c2ecf20Sopenharmony_ci	reg |= 0x5 << 23;
38228c2ecf20Sopenharmony_ci	reg |= 0x5 << 20;
38238c2ecf20Sopenharmony_ci	reg |= 0x5 << 17;
38248c2ecf20Sopenharmony_ci	reg |= 0x5 << 14;
38258c2ecf20Sopenharmony_ci	reg |= 0x5 << 11;
38268c2ecf20Sopenharmony_ci	reg |= 0x5 << 8;
38278c2ecf20Sopenharmony_ci	reg |= 0x5 << 5;
38288c2ecf20Sopenharmony_ci	REG_WRITE(ah, AR_PHY_65NM_CH0_BIAS2, reg);
38298c2ecf20Sopenharmony_ci
38308c2ecf20Sopenharmony_ci	reg = REG_READ(ah, AR_PHY_65NM_CH0_BIAS4);
38318c2ecf20Sopenharmony_ci	reg &= ~0xff800000;
38328c2ecf20Sopenharmony_ci	reg |= 0x5 << 29;
38338c2ecf20Sopenharmony_ci	reg |= 0x5 << 26;
38348c2ecf20Sopenharmony_ci	reg |= 0x5 << 23;
38358c2ecf20Sopenharmony_ci	REG_WRITE(ah, AR_PHY_65NM_CH0_BIAS4, reg);
38368c2ecf20Sopenharmony_ci}
38378c2ecf20Sopenharmony_ci
38388c2ecf20Sopenharmony_cistatic u16 ar9003_hw_atten_chain_get(struct ath_hw *ah, int chain,
38398c2ecf20Sopenharmony_ci				     struct ath9k_channel *chan)
38408c2ecf20Sopenharmony_ci{
38418c2ecf20Sopenharmony_ci	int f[3], t[3];
38428c2ecf20Sopenharmony_ci	u16 value;
38438c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
38448c2ecf20Sopenharmony_ci
38458c2ecf20Sopenharmony_ci	if (chain >= 0 && chain < 3) {
38468c2ecf20Sopenharmony_ci		if (IS_CHAN_2GHZ(chan))
38478c2ecf20Sopenharmony_ci			return eep->modalHeader2G.xatten1DB[chain];
38488c2ecf20Sopenharmony_ci		else if (eep->base_ext2.xatten1DBLow[chain] != 0) {
38498c2ecf20Sopenharmony_ci			t[0] = eep->base_ext2.xatten1DBLow[chain];
38508c2ecf20Sopenharmony_ci			f[0] = 5180;
38518c2ecf20Sopenharmony_ci			t[1] = eep->modalHeader5G.xatten1DB[chain];
38528c2ecf20Sopenharmony_ci			f[1] = 5500;
38538c2ecf20Sopenharmony_ci			t[2] = eep->base_ext2.xatten1DBHigh[chain];
38548c2ecf20Sopenharmony_ci			f[2] = 5785;
38558c2ecf20Sopenharmony_ci			value = ar9003_hw_power_interpolate((s32) chan->channel,
38568c2ecf20Sopenharmony_ci							    f, t, 3);
38578c2ecf20Sopenharmony_ci			return value;
38588c2ecf20Sopenharmony_ci		} else
38598c2ecf20Sopenharmony_ci			return eep->modalHeader5G.xatten1DB[chain];
38608c2ecf20Sopenharmony_ci	}
38618c2ecf20Sopenharmony_ci
38628c2ecf20Sopenharmony_ci	return 0;
38638c2ecf20Sopenharmony_ci}
38648c2ecf20Sopenharmony_ci
38658c2ecf20Sopenharmony_ci
38668c2ecf20Sopenharmony_cistatic u16 ar9003_hw_atten_chain_get_margin(struct ath_hw *ah, int chain,
38678c2ecf20Sopenharmony_ci					    struct ath9k_channel *chan)
38688c2ecf20Sopenharmony_ci{
38698c2ecf20Sopenharmony_ci	int f[3], t[3];
38708c2ecf20Sopenharmony_ci	u16 value;
38718c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
38728c2ecf20Sopenharmony_ci
38738c2ecf20Sopenharmony_ci	if (chain >= 0 && chain < 3) {
38748c2ecf20Sopenharmony_ci		if (IS_CHAN_2GHZ(chan))
38758c2ecf20Sopenharmony_ci			return eep->modalHeader2G.xatten1Margin[chain];
38768c2ecf20Sopenharmony_ci		else if (eep->base_ext2.xatten1MarginLow[chain] != 0) {
38778c2ecf20Sopenharmony_ci			t[0] = eep->base_ext2.xatten1MarginLow[chain];
38788c2ecf20Sopenharmony_ci			f[0] = 5180;
38798c2ecf20Sopenharmony_ci			t[1] = eep->modalHeader5G.xatten1Margin[chain];
38808c2ecf20Sopenharmony_ci			f[1] = 5500;
38818c2ecf20Sopenharmony_ci			t[2] = eep->base_ext2.xatten1MarginHigh[chain];
38828c2ecf20Sopenharmony_ci			f[2] = 5785;
38838c2ecf20Sopenharmony_ci			value = ar9003_hw_power_interpolate((s32) chan->channel,
38848c2ecf20Sopenharmony_ci							    f, t, 3);
38858c2ecf20Sopenharmony_ci			return value;
38868c2ecf20Sopenharmony_ci		} else
38878c2ecf20Sopenharmony_ci			return eep->modalHeader5G.xatten1Margin[chain];
38888c2ecf20Sopenharmony_ci	}
38898c2ecf20Sopenharmony_ci
38908c2ecf20Sopenharmony_ci	return 0;
38918c2ecf20Sopenharmony_ci}
38928c2ecf20Sopenharmony_ci
38938c2ecf20Sopenharmony_cistatic void ar9003_hw_atten_apply(struct ath_hw *ah, struct ath9k_channel *chan)
38948c2ecf20Sopenharmony_ci{
38958c2ecf20Sopenharmony_ci	int i;
38968c2ecf20Sopenharmony_ci	u16 value;
38978c2ecf20Sopenharmony_ci	unsigned long ext_atten_reg[3] = {AR_PHY_EXT_ATTEN_CTL_0,
38988c2ecf20Sopenharmony_ci					  AR_PHY_EXT_ATTEN_CTL_1,
38998c2ecf20Sopenharmony_ci					  AR_PHY_EXT_ATTEN_CTL_2,
39008c2ecf20Sopenharmony_ci					 };
39018c2ecf20Sopenharmony_ci
39028c2ecf20Sopenharmony_ci	if ((AR_SREV_9462(ah)) && (ah->rxchainmask == 0x2)) {
39038c2ecf20Sopenharmony_ci		value = ar9003_hw_atten_chain_get(ah, 1, chan);
39048c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, ext_atten_reg[0],
39058c2ecf20Sopenharmony_ci			      AR_PHY_EXT_ATTEN_CTL_XATTEN1_DB, value);
39068c2ecf20Sopenharmony_ci
39078c2ecf20Sopenharmony_ci		value = ar9003_hw_atten_chain_get_margin(ah, 1, chan);
39088c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, ext_atten_reg[0],
39098c2ecf20Sopenharmony_ci			      AR_PHY_EXT_ATTEN_CTL_XATTEN1_MARGIN,
39108c2ecf20Sopenharmony_ci			      value);
39118c2ecf20Sopenharmony_ci	}
39128c2ecf20Sopenharmony_ci
39138c2ecf20Sopenharmony_ci	/* Test value. if 0 then attenuation is unused. Don't load anything. */
39148c2ecf20Sopenharmony_ci	for (i = 0; i < 3; i++) {
39158c2ecf20Sopenharmony_ci		if (ah->txchainmask & BIT(i)) {
39168c2ecf20Sopenharmony_ci			value = ar9003_hw_atten_chain_get(ah, i, chan);
39178c2ecf20Sopenharmony_ci			REG_RMW_FIELD(ah, ext_atten_reg[i],
39188c2ecf20Sopenharmony_ci				      AR_PHY_EXT_ATTEN_CTL_XATTEN1_DB, value);
39198c2ecf20Sopenharmony_ci
39208c2ecf20Sopenharmony_ci			if (AR_SREV_9485(ah) &&
39218c2ecf20Sopenharmony_ci			    (ar9003_hw_get_rx_gain_idx(ah) == 0) &&
39228c2ecf20Sopenharmony_ci			    ah->config.xatten_margin_cfg)
39238c2ecf20Sopenharmony_ci				value = 5;
39248c2ecf20Sopenharmony_ci			else
39258c2ecf20Sopenharmony_ci				value = ar9003_hw_atten_chain_get_margin(ah, i, chan);
39268c2ecf20Sopenharmony_ci
39278c2ecf20Sopenharmony_ci			if (ah->config.alt_mingainidx)
39288c2ecf20Sopenharmony_ci				REG_RMW_FIELD(ah, AR_PHY_EXT_ATTEN_CTL_0,
39298c2ecf20Sopenharmony_ci					      AR_PHY_EXT_ATTEN_CTL_XATTEN1_MARGIN,
39308c2ecf20Sopenharmony_ci					      value);
39318c2ecf20Sopenharmony_ci
39328c2ecf20Sopenharmony_ci			REG_RMW_FIELD(ah, ext_atten_reg[i],
39338c2ecf20Sopenharmony_ci				      AR_PHY_EXT_ATTEN_CTL_XATTEN1_MARGIN,
39348c2ecf20Sopenharmony_ci				      value);
39358c2ecf20Sopenharmony_ci		}
39368c2ecf20Sopenharmony_ci	}
39378c2ecf20Sopenharmony_ci}
39388c2ecf20Sopenharmony_ci
39398c2ecf20Sopenharmony_cistatic bool is_pmu_set(struct ath_hw *ah, u32 pmu_reg, int pmu_set)
39408c2ecf20Sopenharmony_ci{
39418c2ecf20Sopenharmony_ci	int timeout = 100;
39428c2ecf20Sopenharmony_ci
39438c2ecf20Sopenharmony_ci	while (pmu_set != REG_READ(ah, pmu_reg)) {
39448c2ecf20Sopenharmony_ci		if (timeout-- == 0)
39458c2ecf20Sopenharmony_ci			return false;
39468c2ecf20Sopenharmony_ci		REG_WRITE(ah, pmu_reg, pmu_set);
39478c2ecf20Sopenharmony_ci		udelay(10);
39488c2ecf20Sopenharmony_ci	}
39498c2ecf20Sopenharmony_ci
39508c2ecf20Sopenharmony_ci	return true;
39518c2ecf20Sopenharmony_ci}
39528c2ecf20Sopenharmony_ci
39538c2ecf20Sopenharmony_civoid ar9003_hw_internal_regulator_apply(struct ath_hw *ah)
39548c2ecf20Sopenharmony_ci{
39558c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
39568c2ecf20Sopenharmony_ci	struct ar9300_base_eep_hdr *pBase = &eep->baseEepHeader;
39578c2ecf20Sopenharmony_ci	u32 reg_val;
39588c2ecf20Sopenharmony_ci
39598c2ecf20Sopenharmony_ci	if (pBase->featureEnable & BIT(4)) {
39608c2ecf20Sopenharmony_ci		if (AR_SREV_9330(ah) || AR_SREV_9485(ah)) {
39618c2ecf20Sopenharmony_ci			int reg_pmu_set;
39628c2ecf20Sopenharmony_ci
39638c2ecf20Sopenharmony_ci			reg_pmu_set = REG_READ(ah, AR_PHY_PMU2) & ~AR_PHY_PMU2_PGM;
39648c2ecf20Sopenharmony_ci			REG_WRITE(ah, AR_PHY_PMU2, reg_pmu_set);
39658c2ecf20Sopenharmony_ci			if (!is_pmu_set(ah, AR_PHY_PMU2, reg_pmu_set))
39668c2ecf20Sopenharmony_ci				return;
39678c2ecf20Sopenharmony_ci
39688c2ecf20Sopenharmony_ci			if (AR_SREV_9330(ah)) {
39698c2ecf20Sopenharmony_ci				if (ah->is_clk_25mhz) {
39708c2ecf20Sopenharmony_ci					reg_pmu_set = (3 << 1) | (8 << 4) |
39718c2ecf20Sopenharmony_ci						      (3 << 8) | (1 << 14) |
39728c2ecf20Sopenharmony_ci						      (6 << 17) | (1 << 20) |
39738c2ecf20Sopenharmony_ci						      (3 << 24);
39748c2ecf20Sopenharmony_ci				} else {
39758c2ecf20Sopenharmony_ci					reg_pmu_set = (4 << 1)  | (7 << 4) |
39768c2ecf20Sopenharmony_ci						      (3 << 8)  | (1 << 14) |
39778c2ecf20Sopenharmony_ci						      (6 << 17) | (1 << 20) |
39788c2ecf20Sopenharmony_ci						      (3 << 24);
39798c2ecf20Sopenharmony_ci				}
39808c2ecf20Sopenharmony_ci			} else {
39818c2ecf20Sopenharmony_ci				reg_pmu_set = (5 << 1) | (7 << 4) |
39828c2ecf20Sopenharmony_ci					      (2 << 8) | (2 << 14) |
39838c2ecf20Sopenharmony_ci					      (6 << 17) | (1 << 20) |
39848c2ecf20Sopenharmony_ci					      (3 << 24) | (1 << 28);
39858c2ecf20Sopenharmony_ci			}
39868c2ecf20Sopenharmony_ci
39878c2ecf20Sopenharmony_ci			REG_WRITE(ah, AR_PHY_PMU1, reg_pmu_set);
39888c2ecf20Sopenharmony_ci			if (!is_pmu_set(ah, AR_PHY_PMU1, reg_pmu_set))
39898c2ecf20Sopenharmony_ci				return;
39908c2ecf20Sopenharmony_ci
39918c2ecf20Sopenharmony_ci			reg_pmu_set = (REG_READ(ah, AR_PHY_PMU2) & ~0xFFC00000)
39928c2ecf20Sopenharmony_ci					| (4 << 26);
39938c2ecf20Sopenharmony_ci			REG_WRITE(ah, AR_PHY_PMU2, reg_pmu_set);
39948c2ecf20Sopenharmony_ci			if (!is_pmu_set(ah, AR_PHY_PMU2, reg_pmu_set))
39958c2ecf20Sopenharmony_ci				return;
39968c2ecf20Sopenharmony_ci
39978c2ecf20Sopenharmony_ci			reg_pmu_set = (REG_READ(ah, AR_PHY_PMU2) & ~0x00200000)
39988c2ecf20Sopenharmony_ci					| (1 << 21);
39998c2ecf20Sopenharmony_ci			REG_WRITE(ah, AR_PHY_PMU2, reg_pmu_set);
40008c2ecf20Sopenharmony_ci			if (!is_pmu_set(ah, AR_PHY_PMU2, reg_pmu_set))
40018c2ecf20Sopenharmony_ci				return;
40028c2ecf20Sopenharmony_ci		} else if (AR_SREV_9462(ah) || AR_SREV_9565(ah) ||
40038c2ecf20Sopenharmony_ci			   AR_SREV_9561(ah)) {
40048c2ecf20Sopenharmony_ci			reg_val = le32_to_cpu(pBase->swreg);
40058c2ecf20Sopenharmony_ci			REG_WRITE(ah, AR_PHY_PMU1, reg_val);
40068c2ecf20Sopenharmony_ci
40078c2ecf20Sopenharmony_ci			if (AR_SREV_9561(ah))
40088c2ecf20Sopenharmony_ci				REG_WRITE(ah, AR_PHY_PMU2, 0x10200000);
40098c2ecf20Sopenharmony_ci		} else {
40108c2ecf20Sopenharmony_ci			/* Internal regulator is ON. Write swreg register. */
40118c2ecf20Sopenharmony_ci			reg_val = le32_to_cpu(pBase->swreg);
40128c2ecf20Sopenharmony_ci			REG_WRITE(ah, AR_RTC_REG_CONTROL1,
40138c2ecf20Sopenharmony_ci				  REG_READ(ah, AR_RTC_REG_CONTROL1) &
40148c2ecf20Sopenharmony_ci				  (~AR_RTC_REG_CONTROL1_SWREG_PROGRAM));
40158c2ecf20Sopenharmony_ci			REG_WRITE(ah, AR_RTC_REG_CONTROL0, reg_val);
40168c2ecf20Sopenharmony_ci			/* Set REG_CONTROL1.SWREG_PROGRAM */
40178c2ecf20Sopenharmony_ci			REG_WRITE(ah, AR_RTC_REG_CONTROL1,
40188c2ecf20Sopenharmony_ci				  REG_READ(ah,
40198c2ecf20Sopenharmony_ci					   AR_RTC_REG_CONTROL1) |
40208c2ecf20Sopenharmony_ci					   AR_RTC_REG_CONTROL1_SWREG_PROGRAM);
40218c2ecf20Sopenharmony_ci		}
40228c2ecf20Sopenharmony_ci	} else {
40238c2ecf20Sopenharmony_ci		if (AR_SREV_9330(ah) || AR_SREV_9485(ah)) {
40248c2ecf20Sopenharmony_ci			REG_RMW_FIELD(ah, AR_PHY_PMU2, AR_PHY_PMU2_PGM, 0);
40258c2ecf20Sopenharmony_ci			while (REG_READ_FIELD(ah, AR_PHY_PMU2,
40268c2ecf20Sopenharmony_ci						AR_PHY_PMU2_PGM))
40278c2ecf20Sopenharmony_ci				udelay(10);
40288c2ecf20Sopenharmony_ci
40298c2ecf20Sopenharmony_ci			REG_RMW_FIELD(ah, AR_PHY_PMU1, AR_PHY_PMU1_PWD, 0x1);
40308c2ecf20Sopenharmony_ci			while (!REG_READ_FIELD(ah, AR_PHY_PMU1,
40318c2ecf20Sopenharmony_ci						AR_PHY_PMU1_PWD))
40328c2ecf20Sopenharmony_ci				udelay(10);
40338c2ecf20Sopenharmony_ci			REG_RMW_FIELD(ah, AR_PHY_PMU2, AR_PHY_PMU2_PGM, 0x1);
40348c2ecf20Sopenharmony_ci			while (!REG_READ_FIELD(ah, AR_PHY_PMU2,
40358c2ecf20Sopenharmony_ci						AR_PHY_PMU2_PGM))
40368c2ecf20Sopenharmony_ci				udelay(10);
40378c2ecf20Sopenharmony_ci		} else if (AR_SREV_9462(ah) || AR_SREV_9565(ah))
40388c2ecf20Sopenharmony_ci			REG_RMW_FIELD(ah, AR_PHY_PMU1, AR_PHY_PMU1_PWD, 0x1);
40398c2ecf20Sopenharmony_ci		else {
40408c2ecf20Sopenharmony_ci			reg_val = REG_READ(ah, AR_RTC_SLEEP_CLK) |
40418c2ecf20Sopenharmony_ci				AR_RTC_FORCE_SWREG_PRD;
40428c2ecf20Sopenharmony_ci			REG_WRITE(ah, AR_RTC_SLEEP_CLK, reg_val);
40438c2ecf20Sopenharmony_ci		}
40448c2ecf20Sopenharmony_ci	}
40458c2ecf20Sopenharmony_ci
40468c2ecf20Sopenharmony_ci}
40478c2ecf20Sopenharmony_ci
40488c2ecf20Sopenharmony_cistatic void ar9003_hw_apply_tuning_caps(struct ath_hw *ah)
40498c2ecf20Sopenharmony_ci{
40508c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
40518c2ecf20Sopenharmony_ci	u8 tuning_caps_param = eep->baseEepHeader.params_for_tuning_caps[0];
40528c2ecf20Sopenharmony_ci
40538c2ecf20Sopenharmony_ci	if (AR_SREV_9340(ah) || AR_SREV_9531(ah))
40548c2ecf20Sopenharmony_ci		return;
40558c2ecf20Sopenharmony_ci
40568c2ecf20Sopenharmony_ci	if (eep->baseEepHeader.featureEnable & 0x40) {
40578c2ecf20Sopenharmony_ci		tuning_caps_param &= 0x7f;
40588c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, AR_CH0_XTAL, AR_CH0_XTAL_CAPINDAC,
40598c2ecf20Sopenharmony_ci			      tuning_caps_param);
40608c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, AR_CH0_XTAL, AR_CH0_XTAL_CAPOUTDAC,
40618c2ecf20Sopenharmony_ci			      tuning_caps_param);
40628c2ecf20Sopenharmony_ci	}
40638c2ecf20Sopenharmony_ci}
40648c2ecf20Sopenharmony_ci
40658c2ecf20Sopenharmony_cistatic void ar9003_hw_quick_drop_apply(struct ath_hw *ah, u16 freq)
40668c2ecf20Sopenharmony_ci{
40678c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
40688c2ecf20Sopenharmony_ci	struct ar9300_base_eep_hdr *pBase = &eep->baseEepHeader;
40698c2ecf20Sopenharmony_ci	int quick_drop;
40708c2ecf20Sopenharmony_ci	s32 t[3], f[3] = {5180, 5500, 5785};
40718c2ecf20Sopenharmony_ci
40728c2ecf20Sopenharmony_ci	if (!(pBase->miscConfiguration & BIT(4)))
40738c2ecf20Sopenharmony_ci		return;
40748c2ecf20Sopenharmony_ci
40758c2ecf20Sopenharmony_ci	if (AR_SREV_9300(ah) || AR_SREV_9580(ah) || AR_SREV_9340(ah)) {
40768c2ecf20Sopenharmony_ci		if (freq < 4000) {
40778c2ecf20Sopenharmony_ci			quick_drop = eep->modalHeader2G.quick_drop;
40788c2ecf20Sopenharmony_ci		} else {
40798c2ecf20Sopenharmony_ci			t[0] = eep->base_ext1.quick_drop_low;
40808c2ecf20Sopenharmony_ci			t[1] = eep->modalHeader5G.quick_drop;
40818c2ecf20Sopenharmony_ci			t[2] = eep->base_ext1.quick_drop_high;
40828c2ecf20Sopenharmony_ci			quick_drop = ar9003_hw_power_interpolate(freq, f, t, 3);
40838c2ecf20Sopenharmony_ci		}
40848c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_AGC, AR_PHY_AGC_QUICK_DROP, quick_drop);
40858c2ecf20Sopenharmony_ci	}
40868c2ecf20Sopenharmony_ci}
40878c2ecf20Sopenharmony_ci
40888c2ecf20Sopenharmony_cistatic void ar9003_hw_txend_to_xpa_off_apply(struct ath_hw *ah, bool is2ghz)
40898c2ecf20Sopenharmony_ci{
40908c2ecf20Sopenharmony_ci	u32 value;
40918c2ecf20Sopenharmony_ci
40928c2ecf20Sopenharmony_ci	value = ar9003_modal_header(ah, is2ghz)->txEndToXpaOff;
40938c2ecf20Sopenharmony_ci
40948c2ecf20Sopenharmony_ci	REG_RMW_FIELD(ah, AR_PHY_XPA_TIMING_CTL,
40958c2ecf20Sopenharmony_ci		      AR_PHY_XPA_TIMING_CTL_TX_END_XPAB_OFF, value);
40968c2ecf20Sopenharmony_ci	REG_RMW_FIELD(ah, AR_PHY_XPA_TIMING_CTL,
40978c2ecf20Sopenharmony_ci		      AR_PHY_XPA_TIMING_CTL_TX_END_XPAA_OFF, value);
40988c2ecf20Sopenharmony_ci}
40998c2ecf20Sopenharmony_ci
41008c2ecf20Sopenharmony_cistatic void ar9003_hw_xpa_timing_control_apply(struct ath_hw *ah, bool is2ghz)
41018c2ecf20Sopenharmony_ci{
41028c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
41038c2ecf20Sopenharmony_ci	u8 xpa_ctl;
41048c2ecf20Sopenharmony_ci
41058c2ecf20Sopenharmony_ci	if (!(eep->baseEepHeader.featureEnable & 0x80))
41068c2ecf20Sopenharmony_ci		return;
41078c2ecf20Sopenharmony_ci
41088c2ecf20Sopenharmony_ci	if (!AR_SREV_9300(ah) &&
41098c2ecf20Sopenharmony_ci	    !AR_SREV_9340(ah) &&
41108c2ecf20Sopenharmony_ci	    !AR_SREV_9580(ah) &&
41118c2ecf20Sopenharmony_ci	    !AR_SREV_9531(ah) &&
41128c2ecf20Sopenharmony_ci	    !AR_SREV_9561(ah))
41138c2ecf20Sopenharmony_ci		return;
41148c2ecf20Sopenharmony_ci
41158c2ecf20Sopenharmony_ci	xpa_ctl = ar9003_modal_header(ah, is2ghz)->txFrameToXpaOn;
41168c2ecf20Sopenharmony_ci	if (is2ghz)
41178c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_XPA_TIMING_CTL,
41188c2ecf20Sopenharmony_ci			      AR_PHY_XPA_TIMING_CTL_FRAME_XPAB_ON, xpa_ctl);
41198c2ecf20Sopenharmony_ci	else
41208c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_XPA_TIMING_CTL,
41218c2ecf20Sopenharmony_ci			      AR_PHY_XPA_TIMING_CTL_FRAME_XPAA_ON, xpa_ctl);
41228c2ecf20Sopenharmony_ci}
41238c2ecf20Sopenharmony_ci
41248c2ecf20Sopenharmony_cistatic void ar9003_hw_xlna_bias_strength_apply(struct ath_hw *ah, bool is2ghz)
41258c2ecf20Sopenharmony_ci{
41268c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
41278c2ecf20Sopenharmony_ci	u8 bias;
41288c2ecf20Sopenharmony_ci
41298c2ecf20Sopenharmony_ci	if (!(eep->baseEepHeader.miscConfiguration & 0x40))
41308c2ecf20Sopenharmony_ci		return;
41318c2ecf20Sopenharmony_ci
41328c2ecf20Sopenharmony_ci	if (!AR_SREV_9300(ah))
41338c2ecf20Sopenharmony_ci		return;
41348c2ecf20Sopenharmony_ci
41358c2ecf20Sopenharmony_ci	bias = ar9003_modal_header(ah, is2ghz)->xlna_bias_strength;
41368c2ecf20Sopenharmony_ci	REG_RMW_FIELD(ah, AR_PHY_65NM_CH0_RXTX4, AR_PHY_65NM_RXTX4_XLNA_BIAS,
41378c2ecf20Sopenharmony_ci		      bias & 0x3);
41388c2ecf20Sopenharmony_ci	bias >>= 2;
41398c2ecf20Sopenharmony_ci	REG_RMW_FIELD(ah, AR_PHY_65NM_CH1_RXTX4, AR_PHY_65NM_RXTX4_XLNA_BIAS,
41408c2ecf20Sopenharmony_ci		      bias & 0x3);
41418c2ecf20Sopenharmony_ci	bias >>= 2;
41428c2ecf20Sopenharmony_ci	REG_RMW_FIELD(ah, AR_PHY_65NM_CH2_RXTX4, AR_PHY_65NM_RXTX4_XLNA_BIAS,
41438c2ecf20Sopenharmony_ci		      bias & 0x3);
41448c2ecf20Sopenharmony_ci}
41458c2ecf20Sopenharmony_ci
41468c2ecf20Sopenharmony_cistatic int ar9003_hw_get_thermometer(struct ath_hw *ah)
41478c2ecf20Sopenharmony_ci{
41488c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
41498c2ecf20Sopenharmony_ci	struct ar9300_base_eep_hdr *pBase = &eep->baseEepHeader;
41508c2ecf20Sopenharmony_ci	int thermometer =  (pBase->miscConfiguration >> 1) & 0x3;
41518c2ecf20Sopenharmony_ci
41528c2ecf20Sopenharmony_ci	return --thermometer;
41538c2ecf20Sopenharmony_ci}
41548c2ecf20Sopenharmony_ci
41558c2ecf20Sopenharmony_cistatic void ar9003_hw_thermometer_apply(struct ath_hw *ah)
41568c2ecf20Sopenharmony_ci{
41578c2ecf20Sopenharmony_ci	struct ath9k_hw_capabilities *pCap = &ah->caps;
41588c2ecf20Sopenharmony_ci	int thermometer = ar9003_hw_get_thermometer(ah);
41598c2ecf20Sopenharmony_ci	u8 therm_on = (thermometer < 0) ? 0 : 1;
41608c2ecf20Sopenharmony_ci
41618c2ecf20Sopenharmony_ci	REG_RMW_FIELD(ah, AR_PHY_65NM_CH0_RXTX4,
41628c2ecf20Sopenharmony_ci		      AR_PHY_65NM_CH0_RXTX4_THERM_ON_OVR, therm_on);
41638c2ecf20Sopenharmony_ci	if (pCap->chip_chainmask & BIT(1))
41648c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_65NM_CH1_RXTX4,
41658c2ecf20Sopenharmony_ci			      AR_PHY_65NM_CH0_RXTX4_THERM_ON_OVR, therm_on);
41668c2ecf20Sopenharmony_ci	if (pCap->chip_chainmask & BIT(2))
41678c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_65NM_CH2_RXTX4,
41688c2ecf20Sopenharmony_ci			      AR_PHY_65NM_CH0_RXTX4_THERM_ON_OVR, therm_on);
41698c2ecf20Sopenharmony_ci
41708c2ecf20Sopenharmony_ci	therm_on = thermometer == 0;
41718c2ecf20Sopenharmony_ci	REG_RMW_FIELD(ah, AR_PHY_65NM_CH0_RXTX4,
41728c2ecf20Sopenharmony_ci		      AR_PHY_65NM_CH0_RXTX4_THERM_ON, therm_on);
41738c2ecf20Sopenharmony_ci	if (pCap->chip_chainmask & BIT(1)) {
41748c2ecf20Sopenharmony_ci		therm_on = thermometer == 1;
41758c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_65NM_CH1_RXTX4,
41768c2ecf20Sopenharmony_ci			      AR_PHY_65NM_CH0_RXTX4_THERM_ON, therm_on);
41778c2ecf20Sopenharmony_ci	}
41788c2ecf20Sopenharmony_ci	if (pCap->chip_chainmask & BIT(2)) {
41798c2ecf20Sopenharmony_ci		therm_on = thermometer == 2;
41808c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_65NM_CH2_RXTX4,
41818c2ecf20Sopenharmony_ci			      AR_PHY_65NM_CH0_RXTX4_THERM_ON, therm_on);
41828c2ecf20Sopenharmony_ci	}
41838c2ecf20Sopenharmony_ci}
41848c2ecf20Sopenharmony_ci
41858c2ecf20Sopenharmony_cistatic void ar9003_hw_thermo_cal_apply(struct ath_hw *ah)
41868c2ecf20Sopenharmony_ci{
41878c2ecf20Sopenharmony_ci	u32 data = 0, ko, kg;
41888c2ecf20Sopenharmony_ci
41898c2ecf20Sopenharmony_ci	if (!AR_SREV_9462_20_OR_LATER(ah))
41908c2ecf20Sopenharmony_ci		return;
41918c2ecf20Sopenharmony_ci
41928c2ecf20Sopenharmony_ci	ar9300_otp_read_word(ah, 1, &data);
41938c2ecf20Sopenharmony_ci	ko = data & 0xff;
41948c2ecf20Sopenharmony_ci	kg = (data >> 8) & 0xff;
41958c2ecf20Sopenharmony_ci	if (ko || kg) {
41968c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_BB_THERM_ADC_3,
41978c2ecf20Sopenharmony_ci			      AR_PHY_BB_THERM_ADC_3_THERM_ADC_OFFSET, ko);
41988c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_BB_THERM_ADC_3,
41998c2ecf20Sopenharmony_ci			      AR_PHY_BB_THERM_ADC_3_THERM_ADC_SCALE_GAIN,
42008c2ecf20Sopenharmony_ci			      kg + 256);
42018c2ecf20Sopenharmony_ci	}
42028c2ecf20Sopenharmony_ci}
42038c2ecf20Sopenharmony_ci
42048c2ecf20Sopenharmony_cistatic void ar9003_hw_apply_minccapwr_thresh(struct ath_hw *ah,
42058c2ecf20Sopenharmony_ci					     bool is2ghz)
42068c2ecf20Sopenharmony_ci{
42078c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
42088c2ecf20Sopenharmony_ci	const u_int32_t cca_ctrl[AR9300_MAX_CHAINS] = {
42098c2ecf20Sopenharmony_ci		AR_PHY_CCA_CTRL_0,
42108c2ecf20Sopenharmony_ci		AR_PHY_CCA_CTRL_1,
42118c2ecf20Sopenharmony_ci		AR_PHY_CCA_CTRL_2,
42128c2ecf20Sopenharmony_ci	};
42138c2ecf20Sopenharmony_ci	int chain;
42148c2ecf20Sopenharmony_ci	u32 val;
42158c2ecf20Sopenharmony_ci
42168c2ecf20Sopenharmony_ci	if (is2ghz) {
42178c2ecf20Sopenharmony_ci		if (!(eep->base_ext1.misc_enable & BIT(2)))
42188c2ecf20Sopenharmony_ci			return;
42198c2ecf20Sopenharmony_ci	} else {
42208c2ecf20Sopenharmony_ci		if (!(eep->base_ext1.misc_enable & BIT(3)))
42218c2ecf20Sopenharmony_ci			return;
42228c2ecf20Sopenharmony_ci	}
42238c2ecf20Sopenharmony_ci
42248c2ecf20Sopenharmony_ci	for (chain = 0; chain < AR9300_MAX_CHAINS; chain++) {
42258c2ecf20Sopenharmony_ci		if (!(ah->caps.tx_chainmask & BIT(chain)))
42268c2ecf20Sopenharmony_ci			continue;
42278c2ecf20Sopenharmony_ci
42288c2ecf20Sopenharmony_ci		val = ar9003_modal_header(ah, is2ghz)->noiseFloorThreshCh[chain];
42298c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, cca_ctrl[chain],
42308c2ecf20Sopenharmony_ci			      AR_PHY_EXT_CCA0_THRESH62_1, val);
42318c2ecf20Sopenharmony_ci	}
42328c2ecf20Sopenharmony_ci
42338c2ecf20Sopenharmony_ci}
42348c2ecf20Sopenharmony_ci
42358c2ecf20Sopenharmony_cistatic void ath9k_hw_ar9300_set_board_values(struct ath_hw *ah,
42368c2ecf20Sopenharmony_ci					     struct ath9k_channel *chan)
42378c2ecf20Sopenharmony_ci{
42388c2ecf20Sopenharmony_ci	bool is2ghz = IS_CHAN_2GHZ(chan);
42398c2ecf20Sopenharmony_ci	ar9003_hw_xpa_timing_control_apply(ah, is2ghz);
42408c2ecf20Sopenharmony_ci	ar9003_hw_xpa_bias_level_apply(ah, is2ghz);
42418c2ecf20Sopenharmony_ci	ar9003_hw_ant_ctrl_apply(ah, is2ghz);
42428c2ecf20Sopenharmony_ci	ar9003_hw_drive_strength_apply(ah);
42438c2ecf20Sopenharmony_ci	ar9003_hw_xlna_bias_strength_apply(ah, is2ghz);
42448c2ecf20Sopenharmony_ci	ar9003_hw_atten_apply(ah, chan);
42458c2ecf20Sopenharmony_ci	ar9003_hw_quick_drop_apply(ah, chan->channel);
42468c2ecf20Sopenharmony_ci	if (!AR_SREV_9330(ah) && !AR_SREV_9340(ah) && !AR_SREV_9531(ah))
42478c2ecf20Sopenharmony_ci		ar9003_hw_internal_regulator_apply(ah);
42488c2ecf20Sopenharmony_ci	ar9003_hw_apply_tuning_caps(ah);
42498c2ecf20Sopenharmony_ci	ar9003_hw_apply_minccapwr_thresh(ah, is2ghz);
42508c2ecf20Sopenharmony_ci	ar9003_hw_txend_to_xpa_off_apply(ah, is2ghz);
42518c2ecf20Sopenharmony_ci	ar9003_hw_thermometer_apply(ah);
42528c2ecf20Sopenharmony_ci	ar9003_hw_thermo_cal_apply(ah);
42538c2ecf20Sopenharmony_ci}
42548c2ecf20Sopenharmony_ci
42558c2ecf20Sopenharmony_cistatic void ath9k_hw_ar9300_set_addac(struct ath_hw *ah,
42568c2ecf20Sopenharmony_ci				      struct ath9k_channel *chan)
42578c2ecf20Sopenharmony_ci{
42588c2ecf20Sopenharmony_ci}
42598c2ecf20Sopenharmony_ci
42608c2ecf20Sopenharmony_ci/*
42618c2ecf20Sopenharmony_ci * Returns the interpolated y value corresponding to the specified x value
42628c2ecf20Sopenharmony_ci * from the np ordered pairs of data (px,py).
42638c2ecf20Sopenharmony_ci * The pairs do not have to be in any order.
42648c2ecf20Sopenharmony_ci * If the specified x value is less than any of the px,
42658c2ecf20Sopenharmony_ci * the returned y value is equal to the py for the lowest px.
42668c2ecf20Sopenharmony_ci * If the specified x value is greater than any of the px,
42678c2ecf20Sopenharmony_ci * the returned y value is equal to the py for the highest px.
42688c2ecf20Sopenharmony_ci */
42698c2ecf20Sopenharmony_cistatic int ar9003_hw_power_interpolate(int32_t x,
42708c2ecf20Sopenharmony_ci				       int32_t *px, int32_t *py, u_int16_t np)
42718c2ecf20Sopenharmony_ci{
42728c2ecf20Sopenharmony_ci	int ip = 0;
42738c2ecf20Sopenharmony_ci	int lx = 0, ly = 0, lhave = 0;
42748c2ecf20Sopenharmony_ci	int hx = 0, hy = 0, hhave = 0;
42758c2ecf20Sopenharmony_ci	int dx = 0;
42768c2ecf20Sopenharmony_ci	int y = 0;
42778c2ecf20Sopenharmony_ci
42788c2ecf20Sopenharmony_ci	lhave = 0;
42798c2ecf20Sopenharmony_ci	hhave = 0;
42808c2ecf20Sopenharmony_ci
42818c2ecf20Sopenharmony_ci	/* identify best lower and higher x calibration measurement */
42828c2ecf20Sopenharmony_ci	for (ip = 0; ip < np; ip++) {
42838c2ecf20Sopenharmony_ci		dx = x - px[ip];
42848c2ecf20Sopenharmony_ci
42858c2ecf20Sopenharmony_ci		/* this measurement is higher than our desired x */
42868c2ecf20Sopenharmony_ci		if (dx <= 0) {
42878c2ecf20Sopenharmony_ci			if (!hhave || dx > (x - hx)) {
42888c2ecf20Sopenharmony_ci				/* new best higher x measurement */
42898c2ecf20Sopenharmony_ci				hx = px[ip];
42908c2ecf20Sopenharmony_ci				hy = py[ip];
42918c2ecf20Sopenharmony_ci				hhave = 1;
42928c2ecf20Sopenharmony_ci			}
42938c2ecf20Sopenharmony_ci		}
42948c2ecf20Sopenharmony_ci		/* this measurement is lower than our desired x */
42958c2ecf20Sopenharmony_ci		if (dx >= 0) {
42968c2ecf20Sopenharmony_ci			if (!lhave || dx < (x - lx)) {
42978c2ecf20Sopenharmony_ci				/* new best lower x measurement */
42988c2ecf20Sopenharmony_ci				lx = px[ip];
42998c2ecf20Sopenharmony_ci				ly = py[ip];
43008c2ecf20Sopenharmony_ci				lhave = 1;
43018c2ecf20Sopenharmony_ci			}
43028c2ecf20Sopenharmony_ci		}
43038c2ecf20Sopenharmony_ci	}
43048c2ecf20Sopenharmony_ci
43058c2ecf20Sopenharmony_ci	/* the low x is good */
43068c2ecf20Sopenharmony_ci	if (lhave) {
43078c2ecf20Sopenharmony_ci		/* so is the high x */
43088c2ecf20Sopenharmony_ci		if (hhave) {
43098c2ecf20Sopenharmony_ci			/* they're the same, so just pick one */
43108c2ecf20Sopenharmony_ci			if (hx == lx)
43118c2ecf20Sopenharmony_ci				y = ly;
43128c2ecf20Sopenharmony_ci			else	/* interpolate  */
43138c2ecf20Sopenharmony_ci				y = interpolate(x, lx, hx, ly, hy);
43148c2ecf20Sopenharmony_ci		} else		/* only low is good, use it */
43158c2ecf20Sopenharmony_ci			y = ly;
43168c2ecf20Sopenharmony_ci	} else if (hhave)	/* only high is good, use it */
43178c2ecf20Sopenharmony_ci		y = hy;
43188c2ecf20Sopenharmony_ci	else /* nothing is good,this should never happen unless np=0, ???? */
43198c2ecf20Sopenharmony_ci		y = -(1 << 30);
43208c2ecf20Sopenharmony_ci	return y;
43218c2ecf20Sopenharmony_ci}
43228c2ecf20Sopenharmony_ci
43238c2ecf20Sopenharmony_cistatic u8 ar9003_hw_eeprom_get_tgt_pwr(struct ath_hw *ah,
43248c2ecf20Sopenharmony_ci				       u16 rateIndex, u16 freq, bool is2GHz)
43258c2ecf20Sopenharmony_ci{
43268c2ecf20Sopenharmony_ci	u16 numPiers, i;
43278c2ecf20Sopenharmony_ci	s32 targetPowerArray[AR9300_NUM_5G_20_TARGET_POWERS];
43288c2ecf20Sopenharmony_ci	s32 freqArray[AR9300_NUM_5G_20_TARGET_POWERS];
43298c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
43308c2ecf20Sopenharmony_ci	struct cal_tgt_pow_legacy *pEepromTargetPwr;
43318c2ecf20Sopenharmony_ci	u8 *pFreqBin;
43328c2ecf20Sopenharmony_ci
43338c2ecf20Sopenharmony_ci	if (is2GHz) {
43348c2ecf20Sopenharmony_ci		numPiers = AR9300_NUM_2G_20_TARGET_POWERS;
43358c2ecf20Sopenharmony_ci		pEepromTargetPwr = eep->calTargetPower2G;
43368c2ecf20Sopenharmony_ci		pFreqBin = eep->calTarget_freqbin_2G;
43378c2ecf20Sopenharmony_ci	} else {
43388c2ecf20Sopenharmony_ci		numPiers = AR9300_NUM_5G_20_TARGET_POWERS;
43398c2ecf20Sopenharmony_ci		pEepromTargetPwr = eep->calTargetPower5G;
43408c2ecf20Sopenharmony_ci		pFreqBin = eep->calTarget_freqbin_5G;
43418c2ecf20Sopenharmony_ci	}
43428c2ecf20Sopenharmony_ci
43438c2ecf20Sopenharmony_ci	/*
43448c2ecf20Sopenharmony_ci	 * create array of channels and targetpower from
43458c2ecf20Sopenharmony_ci	 * targetpower piers stored on eeprom
43468c2ecf20Sopenharmony_ci	 */
43478c2ecf20Sopenharmony_ci	for (i = 0; i < numPiers; i++) {
43488c2ecf20Sopenharmony_ci		freqArray[i] = ath9k_hw_fbin2freq(pFreqBin[i], is2GHz);
43498c2ecf20Sopenharmony_ci		targetPowerArray[i] = pEepromTargetPwr[i].tPow2x[rateIndex];
43508c2ecf20Sopenharmony_ci	}
43518c2ecf20Sopenharmony_ci
43528c2ecf20Sopenharmony_ci	/* interpolate to get target power for given frequency */
43538c2ecf20Sopenharmony_ci	return (u8) ar9003_hw_power_interpolate((s32) freq,
43548c2ecf20Sopenharmony_ci						 freqArray,
43558c2ecf20Sopenharmony_ci						 targetPowerArray, numPiers);
43568c2ecf20Sopenharmony_ci}
43578c2ecf20Sopenharmony_ci
43588c2ecf20Sopenharmony_cistatic u8 ar9003_hw_eeprom_get_ht20_tgt_pwr(struct ath_hw *ah,
43598c2ecf20Sopenharmony_ci					    u16 rateIndex,
43608c2ecf20Sopenharmony_ci					    u16 freq, bool is2GHz)
43618c2ecf20Sopenharmony_ci{
43628c2ecf20Sopenharmony_ci	u16 numPiers, i;
43638c2ecf20Sopenharmony_ci	s32 targetPowerArray[AR9300_NUM_5G_20_TARGET_POWERS];
43648c2ecf20Sopenharmony_ci	s32 freqArray[AR9300_NUM_5G_20_TARGET_POWERS];
43658c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
43668c2ecf20Sopenharmony_ci	struct cal_tgt_pow_ht *pEepromTargetPwr;
43678c2ecf20Sopenharmony_ci	u8 *pFreqBin;
43688c2ecf20Sopenharmony_ci
43698c2ecf20Sopenharmony_ci	if (is2GHz) {
43708c2ecf20Sopenharmony_ci		numPiers = AR9300_NUM_2G_20_TARGET_POWERS;
43718c2ecf20Sopenharmony_ci		pEepromTargetPwr = eep->calTargetPower2GHT20;
43728c2ecf20Sopenharmony_ci		pFreqBin = eep->calTarget_freqbin_2GHT20;
43738c2ecf20Sopenharmony_ci	} else {
43748c2ecf20Sopenharmony_ci		numPiers = AR9300_NUM_5G_20_TARGET_POWERS;
43758c2ecf20Sopenharmony_ci		pEepromTargetPwr = eep->calTargetPower5GHT20;
43768c2ecf20Sopenharmony_ci		pFreqBin = eep->calTarget_freqbin_5GHT20;
43778c2ecf20Sopenharmony_ci	}
43788c2ecf20Sopenharmony_ci
43798c2ecf20Sopenharmony_ci	/*
43808c2ecf20Sopenharmony_ci	 * create array of channels and targetpower
43818c2ecf20Sopenharmony_ci	 * from targetpower piers stored on eeprom
43828c2ecf20Sopenharmony_ci	 */
43838c2ecf20Sopenharmony_ci	for (i = 0; i < numPiers; i++) {
43848c2ecf20Sopenharmony_ci		freqArray[i] = ath9k_hw_fbin2freq(pFreqBin[i], is2GHz);
43858c2ecf20Sopenharmony_ci		targetPowerArray[i] = pEepromTargetPwr[i].tPow2x[rateIndex];
43868c2ecf20Sopenharmony_ci	}
43878c2ecf20Sopenharmony_ci
43888c2ecf20Sopenharmony_ci	/* interpolate to get target power for given frequency */
43898c2ecf20Sopenharmony_ci	return (u8) ar9003_hw_power_interpolate((s32) freq,
43908c2ecf20Sopenharmony_ci						 freqArray,
43918c2ecf20Sopenharmony_ci						 targetPowerArray, numPiers);
43928c2ecf20Sopenharmony_ci}
43938c2ecf20Sopenharmony_ci
43948c2ecf20Sopenharmony_cistatic u8 ar9003_hw_eeprom_get_ht40_tgt_pwr(struct ath_hw *ah,
43958c2ecf20Sopenharmony_ci					    u16 rateIndex,
43968c2ecf20Sopenharmony_ci					    u16 freq, bool is2GHz)
43978c2ecf20Sopenharmony_ci{
43988c2ecf20Sopenharmony_ci	u16 numPiers, i;
43998c2ecf20Sopenharmony_ci	s32 targetPowerArray[AR9300_NUM_5G_40_TARGET_POWERS];
44008c2ecf20Sopenharmony_ci	s32 freqArray[AR9300_NUM_5G_40_TARGET_POWERS];
44018c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
44028c2ecf20Sopenharmony_ci	struct cal_tgt_pow_ht *pEepromTargetPwr;
44038c2ecf20Sopenharmony_ci	u8 *pFreqBin;
44048c2ecf20Sopenharmony_ci
44058c2ecf20Sopenharmony_ci	if (is2GHz) {
44068c2ecf20Sopenharmony_ci		numPiers = AR9300_NUM_2G_40_TARGET_POWERS;
44078c2ecf20Sopenharmony_ci		pEepromTargetPwr = eep->calTargetPower2GHT40;
44088c2ecf20Sopenharmony_ci		pFreqBin = eep->calTarget_freqbin_2GHT40;
44098c2ecf20Sopenharmony_ci	} else {
44108c2ecf20Sopenharmony_ci		numPiers = AR9300_NUM_5G_40_TARGET_POWERS;
44118c2ecf20Sopenharmony_ci		pEepromTargetPwr = eep->calTargetPower5GHT40;
44128c2ecf20Sopenharmony_ci		pFreqBin = eep->calTarget_freqbin_5GHT40;
44138c2ecf20Sopenharmony_ci	}
44148c2ecf20Sopenharmony_ci
44158c2ecf20Sopenharmony_ci	/*
44168c2ecf20Sopenharmony_ci	 * create array of channels and targetpower from
44178c2ecf20Sopenharmony_ci	 * targetpower piers stored on eeprom
44188c2ecf20Sopenharmony_ci	 */
44198c2ecf20Sopenharmony_ci	for (i = 0; i < numPiers; i++) {
44208c2ecf20Sopenharmony_ci		freqArray[i] = ath9k_hw_fbin2freq(pFreqBin[i], is2GHz);
44218c2ecf20Sopenharmony_ci		targetPowerArray[i] = pEepromTargetPwr[i].tPow2x[rateIndex];
44228c2ecf20Sopenharmony_ci	}
44238c2ecf20Sopenharmony_ci
44248c2ecf20Sopenharmony_ci	/* interpolate to get target power for given frequency */
44258c2ecf20Sopenharmony_ci	return (u8) ar9003_hw_power_interpolate((s32) freq,
44268c2ecf20Sopenharmony_ci						 freqArray,
44278c2ecf20Sopenharmony_ci						 targetPowerArray, numPiers);
44288c2ecf20Sopenharmony_ci}
44298c2ecf20Sopenharmony_ci
44308c2ecf20Sopenharmony_cistatic u8 ar9003_hw_eeprom_get_cck_tgt_pwr(struct ath_hw *ah,
44318c2ecf20Sopenharmony_ci					   u16 rateIndex, u16 freq)
44328c2ecf20Sopenharmony_ci{
44338c2ecf20Sopenharmony_ci	u16 numPiers = AR9300_NUM_2G_CCK_TARGET_POWERS, i;
44348c2ecf20Sopenharmony_ci	s32 targetPowerArray[AR9300_NUM_2G_CCK_TARGET_POWERS];
44358c2ecf20Sopenharmony_ci	s32 freqArray[AR9300_NUM_2G_CCK_TARGET_POWERS];
44368c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
44378c2ecf20Sopenharmony_ci	struct cal_tgt_pow_legacy *pEepromTargetPwr = eep->calTargetPowerCck;
44388c2ecf20Sopenharmony_ci	u8 *pFreqBin = eep->calTarget_freqbin_Cck;
44398c2ecf20Sopenharmony_ci
44408c2ecf20Sopenharmony_ci	/*
44418c2ecf20Sopenharmony_ci	 * create array of channels and targetpower from
44428c2ecf20Sopenharmony_ci	 * targetpower piers stored on eeprom
44438c2ecf20Sopenharmony_ci	 */
44448c2ecf20Sopenharmony_ci	for (i = 0; i < numPiers; i++) {
44458c2ecf20Sopenharmony_ci		freqArray[i] = ath9k_hw_fbin2freq(pFreqBin[i], 1);
44468c2ecf20Sopenharmony_ci		targetPowerArray[i] = pEepromTargetPwr[i].tPow2x[rateIndex];
44478c2ecf20Sopenharmony_ci	}
44488c2ecf20Sopenharmony_ci
44498c2ecf20Sopenharmony_ci	/* interpolate to get target power for given frequency */
44508c2ecf20Sopenharmony_ci	return (u8) ar9003_hw_power_interpolate((s32) freq,
44518c2ecf20Sopenharmony_ci						 freqArray,
44528c2ecf20Sopenharmony_ci						 targetPowerArray, numPiers);
44538c2ecf20Sopenharmony_ci}
44548c2ecf20Sopenharmony_ci
44558c2ecf20Sopenharmony_cistatic void ar9003_hw_selfgen_tpc_txpower(struct ath_hw *ah,
44568c2ecf20Sopenharmony_ci					  struct ath9k_channel *chan,
44578c2ecf20Sopenharmony_ci					  u8 *pwr_array)
44588c2ecf20Sopenharmony_ci{
44598c2ecf20Sopenharmony_ci	u32 val;
44608c2ecf20Sopenharmony_ci
44618c2ecf20Sopenharmony_ci	/* target power values for self generated frames (ACK,RTS/CTS) */
44628c2ecf20Sopenharmony_ci	if (IS_CHAN_2GHZ(chan)) {
44638c2ecf20Sopenharmony_ci		val = SM(pwr_array[ALL_TARGET_LEGACY_1L_5L], AR_TPC_ACK) |
44648c2ecf20Sopenharmony_ci		      SM(pwr_array[ALL_TARGET_LEGACY_1L_5L], AR_TPC_CTS) |
44658c2ecf20Sopenharmony_ci		      SM(0x3f, AR_TPC_CHIRP) | SM(0x3f, AR_TPC_RPT);
44668c2ecf20Sopenharmony_ci	} else {
44678c2ecf20Sopenharmony_ci		val = SM(pwr_array[ALL_TARGET_LEGACY_6_24], AR_TPC_ACK) |
44688c2ecf20Sopenharmony_ci		      SM(pwr_array[ALL_TARGET_LEGACY_6_24], AR_TPC_CTS) |
44698c2ecf20Sopenharmony_ci		      SM(0x3f, AR_TPC_CHIRP) | SM(0x3f, AR_TPC_RPT);
44708c2ecf20Sopenharmony_ci	}
44718c2ecf20Sopenharmony_ci	REG_WRITE(ah, AR_TPC, val);
44728c2ecf20Sopenharmony_ci}
44738c2ecf20Sopenharmony_ci
44748c2ecf20Sopenharmony_ci/* Set tx power registers to array of values passed in */
44758c2ecf20Sopenharmony_ciint ar9003_hw_tx_power_regwrite(struct ath_hw *ah, u8 * pPwrArray)
44768c2ecf20Sopenharmony_ci{
44778c2ecf20Sopenharmony_ci#define POW_SM(_r, _s)     (((_r) & 0x3f) << (_s))
44788c2ecf20Sopenharmony_ci	/* make sure forced gain is not set */
44798c2ecf20Sopenharmony_ci	REG_WRITE(ah, AR_PHY_TX_FORCED_GAIN, 0);
44808c2ecf20Sopenharmony_ci
44818c2ecf20Sopenharmony_ci	/* Write the OFDM power per rate set */
44828c2ecf20Sopenharmony_ci
44838c2ecf20Sopenharmony_ci	/* 6 (LSB), 9, 12, 18 (MSB) */
44848c2ecf20Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(0),
44858c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 24) |
44868c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 16) |
44878c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 8) |
44888c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 0));
44898c2ecf20Sopenharmony_ci
44908c2ecf20Sopenharmony_ci	/* 24 (LSB), 36, 48, 54 (MSB) */
44918c2ecf20Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(1),
44928c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_54], 24) |
44938c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_48], 16) |
44948c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_36], 8) |
44958c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 0));
44968c2ecf20Sopenharmony_ci
44978c2ecf20Sopenharmony_ci	/* Write the CCK power per rate set */
44988c2ecf20Sopenharmony_ci
44998c2ecf20Sopenharmony_ci	/* 1L (LSB), reserved, 2L, 2S (MSB) */
45008c2ecf20Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(2),
45018c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 24) |
45028c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 16) |
45038c2ecf20Sopenharmony_ci		  /* POW_SM(txPowerTimes2,  8) | this is reserved for AR9003 */
45048c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 0));
45058c2ecf20Sopenharmony_ci
45068c2ecf20Sopenharmony_ci	/* 5.5L (LSB), 5.5S, 11L, 11S (MSB) */
45078c2ecf20Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(3),
45088c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_11S], 24) |
45098c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_11L], 16) |
45108c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_5S], 8) |
45118c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 0)
45128c2ecf20Sopenharmony_ci	    );
45138c2ecf20Sopenharmony_ci
45148c2ecf20Sopenharmony_ci        /* Write the power for duplicated frames - HT40 */
45158c2ecf20Sopenharmony_ci
45168c2ecf20Sopenharmony_ci        /* dup40_cck (LSB), dup40_ofdm, ext20_cck, ext20_ofdm (MSB) */
45178c2ecf20Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(8),
45188c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24], 24) |
45198c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L], 16) |
45208c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_6_24],  8) |
45218c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_LEGACY_1L_5L],  0)
45228c2ecf20Sopenharmony_ci	    );
45238c2ecf20Sopenharmony_ci
45248c2ecf20Sopenharmony_ci	/* Write the HT20 power per rate set */
45258c2ecf20Sopenharmony_ci
45268c2ecf20Sopenharmony_ci	/* 0/8/16 (LSB), 1-3/9-11/17-19, 4, 5 (MSB) */
45278c2ecf20Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(4),
45288c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_5], 24) |
45298c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_4], 16) |
45308c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_1_3_9_11_17_19], 8) |
45318c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_0_8_16], 0)
45328c2ecf20Sopenharmony_ci	    );
45338c2ecf20Sopenharmony_ci
45348c2ecf20Sopenharmony_ci	/* 6 (LSB), 7, 12, 13 (MSB) */
45358c2ecf20Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(5),
45368c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_13], 24) |
45378c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_12], 16) |
45388c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_7], 8) |
45398c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_6], 0)
45408c2ecf20Sopenharmony_ci	    );
45418c2ecf20Sopenharmony_ci
45428c2ecf20Sopenharmony_ci	/* 14 (LSB), 15, 20, 21 */
45438c2ecf20Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(9),
45448c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_21], 24) |
45458c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_20], 16) |
45468c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_15], 8) |
45478c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_14], 0)
45488c2ecf20Sopenharmony_ci	    );
45498c2ecf20Sopenharmony_ci
45508c2ecf20Sopenharmony_ci	/* Mixed HT20 and HT40 rates */
45518c2ecf20Sopenharmony_ci
45528c2ecf20Sopenharmony_ci	/* HT20 22 (LSB), HT20 23, HT40 22, HT40 23 (MSB) */
45538c2ecf20Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(10),
45548c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_23], 24) |
45558c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_22], 16) |
45568c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_23], 8) |
45578c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT20_22], 0)
45588c2ecf20Sopenharmony_ci	    );
45598c2ecf20Sopenharmony_ci
45608c2ecf20Sopenharmony_ci	/*
45618c2ecf20Sopenharmony_ci	 * Write the HT40 power per rate set
45628c2ecf20Sopenharmony_ci	 * correct PAR difference between HT40 and HT20/LEGACY
45638c2ecf20Sopenharmony_ci	 * 0/8/16 (LSB), 1-3/9-11/17-19, 4, 5 (MSB)
45648c2ecf20Sopenharmony_ci	 */
45658c2ecf20Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(6),
45668c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_5], 24) |
45678c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_4], 16) |
45688c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_1_3_9_11_17_19], 8) |
45698c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_0_8_16], 0)
45708c2ecf20Sopenharmony_ci	    );
45718c2ecf20Sopenharmony_ci
45728c2ecf20Sopenharmony_ci	/* 6 (LSB), 7, 12, 13 (MSB) */
45738c2ecf20Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(7),
45748c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_13], 24) |
45758c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_12], 16) |
45768c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_7], 8) |
45778c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_6], 0)
45788c2ecf20Sopenharmony_ci	    );
45798c2ecf20Sopenharmony_ci
45808c2ecf20Sopenharmony_ci	/* 14 (LSB), 15, 20, 21 */
45818c2ecf20Sopenharmony_ci	REG_WRITE(ah, AR_PHY_POWER_TX_RATE(11),
45828c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_21], 24) |
45838c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_20], 16) |
45848c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_15], 8) |
45858c2ecf20Sopenharmony_ci		  POW_SM(pPwrArray[ALL_TARGET_HT40_14], 0)
45868c2ecf20Sopenharmony_ci	    );
45878c2ecf20Sopenharmony_ci
45888c2ecf20Sopenharmony_ci	return 0;
45898c2ecf20Sopenharmony_ci#undef POW_SM
45908c2ecf20Sopenharmony_ci}
45918c2ecf20Sopenharmony_ci
45928c2ecf20Sopenharmony_cistatic void ar9003_hw_get_legacy_target_powers(struct ath_hw *ah, u16 freq,
45938c2ecf20Sopenharmony_ci					       u8 *targetPowerValT2,
45948c2ecf20Sopenharmony_ci					       bool is2GHz)
45958c2ecf20Sopenharmony_ci{
45968c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_LEGACY_6_24] =
45978c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_tgt_pwr(ah, LEGACY_TARGET_RATE_6_24, freq,
45988c2ecf20Sopenharmony_ci					 is2GHz);
45998c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_LEGACY_36] =
46008c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_tgt_pwr(ah, LEGACY_TARGET_RATE_36, freq,
46018c2ecf20Sopenharmony_ci					 is2GHz);
46028c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_LEGACY_48] =
46038c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_tgt_pwr(ah, LEGACY_TARGET_RATE_48, freq,
46048c2ecf20Sopenharmony_ci					 is2GHz);
46058c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_LEGACY_54] =
46068c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_tgt_pwr(ah, LEGACY_TARGET_RATE_54, freq,
46078c2ecf20Sopenharmony_ci					 is2GHz);
46088c2ecf20Sopenharmony_ci}
46098c2ecf20Sopenharmony_ci
46108c2ecf20Sopenharmony_cistatic void ar9003_hw_get_cck_target_powers(struct ath_hw *ah, u16 freq,
46118c2ecf20Sopenharmony_ci					    u8 *targetPowerValT2)
46128c2ecf20Sopenharmony_ci{
46138c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_LEGACY_1L_5L] =
46148c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_cck_tgt_pwr(ah, LEGACY_TARGET_RATE_1L_5L,
46158c2ecf20Sopenharmony_ci					     freq);
46168c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_LEGACY_5S] =
46178c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_cck_tgt_pwr(ah, LEGACY_TARGET_RATE_5S, freq);
46188c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_LEGACY_11L] =
46198c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_cck_tgt_pwr(ah, LEGACY_TARGET_RATE_11L, freq);
46208c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_LEGACY_11S] =
46218c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_cck_tgt_pwr(ah, LEGACY_TARGET_RATE_11S, freq);
46228c2ecf20Sopenharmony_ci}
46238c2ecf20Sopenharmony_ci
46248c2ecf20Sopenharmony_cistatic void ar9003_hw_get_ht20_target_powers(struct ath_hw *ah, u16 freq,
46258c2ecf20Sopenharmony_ci					     u8 *targetPowerValT2, bool is2GHz)
46268c2ecf20Sopenharmony_ci{
46278c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_0_8_16] =
46288c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_0_8_16, freq,
46298c2ecf20Sopenharmony_ci					      is2GHz);
46308c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_1_3_9_11_17_19] =
46318c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_1_3_9_11_17_19,
46328c2ecf20Sopenharmony_ci					      freq, is2GHz);
46338c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_4] =
46348c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_4, freq,
46358c2ecf20Sopenharmony_ci					      is2GHz);
46368c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_5] =
46378c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_5, freq,
46388c2ecf20Sopenharmony_ci					      is2GHz);
46398c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_6] =
46408c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_6, freq,
46418c2ecf20Sopenharmony_ci					      is2GHz);
46428c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_7] =
46438c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_7, freq,
46448c2ecf20Sopenharmony_ci					      is2GHz);
46458c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_12] =
46468c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_12, freq,
46478c2ecf20Sopenharmony_ci					      is2GHz);
46488c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_13] =
46498c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_13, freq,
46508c2ecf20Sopenharmony_ci					      is2GHz);
46518c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_14] =
46528c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_14, freq,
46538c2ecf20Sopenharmony_ci					      is2GHz);
46548c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_15] =
46558c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_15, freq,
46568c2ecf20Sopenharmony_ci					      is2GHz);
46578c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_20] =
46588c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_20, freq,
46598c2ecf20Sopenharmony_ci					      is2GHz);
46608c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_21] =
46618c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_21, freq,
46628c2ecf20Sopenharmony_ci					      is2GHz);
46638c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_22] =
46648c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_22, freq,
46658c2ecf20Sopenharmony_ci					      is2GHz);
46668c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT20_23] =
46678c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht20_tgt_pwr(ah, HT_TARGET_RATE_23, freq,
46688c2ecf20Sopenharmony_ci					      is2GHz);
46698c2ecf20Sopenharmony_ci}
46708c2ecf20Sopenharmony_ci
46718c2ecf20Sopenharmony_cistatic void ar9003_hw_get_ht40_target_powers(struct ath_hw *ah,
46728c2ecf20Sopenharmony_ci						   u16 freq,
46738c2ecf20Sopenharmony_ci						   u8 *targetPowerValT2,
46748c2ecf20Sopenharmony_ci						   bool is2GHz)
46758c2ecf20Sopenharmony_ci{
46768c2ecf20Sopenharmony_ci	/* XXX: hard code for now, need to get from eeprom struct */
46778c2ecf20Sopenharmony_ci	u8 ht40PowerIncForPdadc = 0;
46788c2ecf20Sopenharmony_ci
46798c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_0_8_16] =
46808c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_0_8_16, freq,
46818c2ecf20Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
46828c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_1_3_9_11_17_19] =
46838c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_1_3_9_11_17_19,
46848c2ecf20Sopenharmony_ci					      freq,
46858c2ecf20Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
46868c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_4] =
46878c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_4, freq,
46888c2ecf20Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
46898c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_5] =
46908c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_5, freq,
46918c2ecf20Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
46928c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_6] =
46938c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_6, freq,
46948c2ecf20Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
46958c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_7] =
46968c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_7, freq,
46978c2ecf20Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
46988c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_12] =
46998c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_12, freq,
47008c2ecf20Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
47018c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_13] =
47028c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_13, freq,
47038c2ecf20Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
47048c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_14] =
47058c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_14, freq,
47068c2ecf20Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
47078c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_15] =
47088c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_15, freq,
47098c2ecf20Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
47108c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_20] =
47118c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_20, freq,
47128c2ecf20Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
47138c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_21] =
47148c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_21, freq,
47158c2ecf20Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
47168c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_22] =
47178c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_22, freq,
47188c2ecf20Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
47198c2ecf20Sopenharmony_ci	targetPowerValT2[ALL_TARGET_HT40_23] =
47208c2ecf20Sopenharmony_ci	    ar9003_hw_eeprom_get_ht40_tgt_pwr(ah, HT_TARGET_RATE_23, freq,
47218c2ecf20Sopenharmony_ci					      is2GHz) + ht40PowerIncForPdadc;
47228c2ecf20Sopenharmony_ci}
47238c2ecf20Sopenharmony_ci
47248c2ecf20Sopenharmony_cistatic void ar9003_hw_get_target_power_eeprom(struct ath_hw *ah,
47258c2ecf20Sopenharmony_ci					      struct ath9k_channel *chan,
47268c2ecf20Sopenharmony_ci					      u8 *targetPowerValT2)
47278c2ecf20Sopenharmony_ci{
47288c2ecf20Sopenharmony_ci	bool is2GHz = IS_CHAN_2GHZ(chan);
47298c2ecf20Sopenharmony_ci	unsigned int i = 0;
47308c2ecf20Sopenharmony_ci	struct ath_common *common = ath9k_hw_common(ah);
47318c2ecf20Sopenharmony_ci	u16 freq = chan->channel;
47328c2ecf20Sopenharmony_ci
47338c2ecf20Sopenharmony_ci	if (is2GHz)
47348c2ecf20Sopenharmony_ci		ar9003_hw_get_cck_target_powers(ah, freq, targetPowerValT2);
47358c2ecf20Sopenharmony_ci
47368c2ecf20Sopenharmony_ci	ar9003_hw_get_legacy_target_powers(ah, freq, targetPowerValT2, is2GHz);
47378c2ecf20Sopenharmony_ci	ar9003_hw_get_ht20_target_powers(ah, freq, targetPowerValT2, is2GHz);
47388c2ecf20Sopenharmony_ci
47398c2ecf20Sopenharmony_ci	if (IS_CHAN_HT40(chan))
47408c2ecf20Sopenharmony_ci		ar9003_hw_get_ht40_target_powers(ah, freq, targetPowerValT2,
47418c2ecf20Sopenharmony_ci						 is2GHz);
47428c2ecf20Sopenharmony_ci
47438c2ecf20Sopenharmony_ci	for (i = 0; i < ar9300RateSize; i++) {
47448c2ecf20Sopenharmony_ci		ath_dbg(common, REGULATORY, "TPC[%02d] 0x%08x\n",
47458c2ecf20Sopenharmony_ci			i, targetPowerValT2[i]);
47468c2ecf20Sopenharmony_ci	}
47478c2ecf20Sopenharmony_ci}
47488c2ecf20Sopenharmony_ci
47498c2ecf20Sopenharmony_cistatic int ar9003_hw_cal_pier_get(struct ath_hw *ah,
47508c2ecf20Sopenharmony_ci				  int mode,
47518c2ecf20Sopenharmony_ci				  int ipier,
47528c2ecf20Sopenharmony_ci				  int ichain,
47538c2ecf20Sopenharmony_ci				  int *pfrequency,
47548c2ecf20Sopenharmony_ci				  int *pcorrection,
47558c2ecf20Sopenharmony_ci				  int *ptemperature, int *pvoltage,
47568c2ecf20Sopenharmony_ci				  int *pnf_cal, int *pnf_power)
47578c2ecf20Sopenharmony_ci{
47588c2ecf20Sopenharmony_ci	u8 *pCalPier;
47598c2ecf20Sopenharmony_ci	struct ar9300_cal_data_per_freq_op_loop *pCalPierStruct;
47608c2ecf20Sopenharmony_ci	int is2GHz;
47618c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
47628c2ecf20Sopenharmony_ci	struct ath_common *common = ath9k_hw_common(ah);
47638c2ecf20Sopenharmony_ci
47648c2ecf20Sopenharmony_ci	if (ichain >= AR9300_MAX_CHAINS) {
47658c2ecf20Sopenharmony_ci		ath_dbg(common, EEPROM,
47668c2ecf20Sopenharmony_ci			"Invalid chain index, must be less than %d\n",
47678c2ecf20Sopenharmony_ci			AR9300_MAX_CHAINS);
47688c2ecf20Sopenharmony_ci		return -1;
47698c2ecf20Sopenharmony_ci	}
47708c2ecf20Sopenharmony_ci
47718c2ecf20Sopenharmony_ci	if (mode) {		/* 5GHz */
47728c2ecf20Sopenharmony_ci		if (ipier >= AR9300_NUM_5G_CAL_PIERS) {
47738c2ecf20Sopenharmony_ci			ath_dbg(common, EEPROM,
47748c2ecf20Sopenharmony_ci				"Invalid 5GHz cal pier index, must be less than %d\n",
47758c2ecf20Sopenharmony_ci				AR9300_NUM_5G_CAL_PIERS);
47768c2ecf20Sopenharmony_ci			return -1;
47778c2ecf20Sopenharmony_ci		}
47788c2ecf20Sopenharmony_ci		pCalPier = &(eep->calFreqPier5G[ipier]);
47798c2ecf20Sopenharmony_ci		pCalPierStruct = &(eep->calPierData5G[ichain][ipier]);
47808c2ecf20Sopenharmony_ci		is2GHz = 0;
47818c2ecf20Sopenharmony_ci	} else {
47828c2ecf20Sopenharmony_ci		if (ipier >= AR9300_NUM_2G_CAL_PIERS) {
47838c2ecf20Sopenharmony_ci			ath_dbg(common, EEPROM,
47848c2ecf20Sopenharmony_ci				"Invalid 2GHz cal pier index, must be less than %d\n",
47858c2ecf20Sopenharmony_ci				AR9300_NUM_2G_CAL_PIERS);
47868c2ecf20Sopenharmony_ci			return -1;
47878c2ecf20Sopenharmony_ci		}
47888c2ecf20Sopenharmony_ci
47898c2ecf20Sopenharmony_ci		pCalPier = &(eep->calFreqPier2G[ipier]);
47908c2ecf20Sopenharmony_ci		pCalPierStruct = &(eep->calPierData2G[ichain][ipier]);
47918c2ecf20Sopenharmony_ci		is2GHz = 1;
47928c2ecf20Sopenharmony_ci	}
47938c2ecf20Sopenharmony_ci
47948c2ecf20Sopenharmony_ci	*pfrequency = ath9k_hw_fbin2freq(*pCalPier, is2GHz);
47958c2ecf20Sopenharmony_ci	*pcorrection = pCalPierStruct->refPower;
47968c2ecf20Sopenharmony_ci	*ptemperature = pCalPierStruct->tempMeas;
47978c2ecf20Sopenharmony_ci	*pvoltage = pCalPierStruct->voltMeas;
47988c2ecf20Sopenharmony_ci	*pnf_cal = pCalPierStruct->rxTempMeas ?
47998c2ecf20Sopenharmony_ci			N2DBM(pCalPierStruct->rxNoisefloorCal) : 0;
48008c2ecf20Sopenharmony_ci	*pnf_power = pCalPierStruct->rxTempMeas ?
48018c2ecf20Sopenharmony_ci			N2DBM(pCalPierStruct->rxNoisefloorPower) : 0;
48028c2ecf20Sopenharmony_ci
48038c2ecf20Sopenharmony_ci	return 0;
48048c2ecf20Sopenharmony_ci}
48058c2ecf20Sopenharmony_ci
48068c2ecf20Sopenharmony_cistatic void ar9003_hw_power_control_override(struct ath_hw *ah,
48078c2ecf20Sopenharmony_ci					     int frequency,
48088c2ecf20Sopenharmony_ci					     int *correction,
48098c2ecf20Sopenharmony_ci					     int *voltage, int *temperature)
48108c2ecf20Sopenharmony_ci{
48118c2ecf20Sopenharmony_ci	int temp_slope = 0, temp_slope1 = 0, temp_slope2 = 0;
48128c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
48138c2ecf20Sopenharmony_ci	int f[8], t[8], t1[3], t2[3], i;
48148c2ecf20Sopenharmony_ci
48158c2ecf20Sopenharmony_ci	REG_RMW(ah, AR_PHY_TPC_11_B0,
48168c2ecf20Sopenharmony_ci		(correction[0] << AR_PHY_TPC_OLPC_GAIN_DELTA_S),
48178c2ecf20Sopenharmony_ci		AR_PHY_TPC_OLPC_GAIN_DELTA);
48188c2ecf20Sopenharmony_ci	if (ah->caps.tx_chainmask & BIT(1))
48198c2ecf20Sopenharmony_ci		REG_RMW(ah, AR_PHY_TPC_11_B1,
48208c2ecf20Sopenharmony_ci			(correction[1] << AR_PHY_TPC_OLPC_GAIN_DELTA_S),
48218c2ecf20Sopenharmony_ci			AR_PHY_TPC_OLPC_GAIN_DELTA);
48228c2ecf20Sopenharmony_ci	if (ah->caps.tx_chainmask & BIT(2))
48238c2ecf20Sopenharmony_ci		REG_RMW(ah, AR_PHY_TPC_11_B2,
48248c2ecf20Sopenharmony_ci			(correction[2] << AR_PHY_TPC_OLPC_GAIN_DELTA_S),
48258c2ecf20Sopenharmony_ci			AR_PHY_TPC_OLPC_GAIN_DELTA);
48268c2ecf20Sopenharmony_ci
48278c2ecf20Sopenharmony_ci	/* enable open loop power control on chip */
48288c2ecf20Sopenharmony_ci	REG_RMW(ah, AR_PHY_TPC_6_B0,
48298c2ecf20Sopenharmony_ci		(3 << AR_PHY_TPC_6_ERROR_EST_MODE_S),
48308c2ecf20Sopenharmony_ci		AR_PHY_TPC_6_ERROR_EST_MODE);
48318c2ecf20Sopenharmony_ci	if (ah->caps.tx_chainmask & BIT(1))
48328c2ecf20Sopenharmony_ci		REG_RMW(ah, AR_PHY_TPC_6_B1,
48338c2ecf20Sopenharmony_ci			(3 << AR_PHY_TPC_6_ERROR_EST_MODE_S),
48348c2ecf20Sopenharmony_ci			AR_PHY_TPC_6_ERROR_EST_MODE);
48358c2ecf20Sopenharmony_ci	if (ah->caps.tx_chainmask & BIT(2))
48368c2ecf20Sopenharmony_ci		REG_RMW(ah, AR_PHY_TPC_6_B2,
48378c2ecf20Sopenharmony_ci			(3 << AR_PHY_TPC_6_ERROR_EST_MODE_S),
48388c2ecf20Sopenharmony_ci			AR_PHY_TPC_6_ERROR_EST_MODE);
48398c2ecf20Sopenharmony_ci
48408c2ecf20Sopenharmony_ci	/*
48418c2ecf20Sopenharmony_ci	 * enable temperature compensation
48428c2ecf20Sopenharmony_ci	 * Need to use register names
48438c2ecf20Sopenharmony_ci	 */
48448c2ecf20Sopenharmony_ci	if (frequency < 4000) {
48458c2ecf20Sopenharmony_ci		temp_slope = eep->modalHeader2G.tempSlope;
48468c2ecf20Sopenharmony_ci	} else {
48478c2ecf20Sopenharmony_ci		if (AR_SREV_9550(ah)) {
48488c2ecf20Sopenharmony_ci			t[0] = eep->base_ext1.tempslopextension[2];
48498c2ecf20Sopenharmony_ci			t1[0] = eep->base_ext1.tempslopextension[3];
48508c2ecf20Sopenharmony_ci			t2[0] = eep->base_ext1.tempslopextension[4];
48518c2ecf20Sopenharmony_ci			f[0] = 5180;
48528c2ecf20Sopenharmony_ci
48538c2ecf20Sopenharmony_ci			t[1] = eep->modalHeader5G.tempSlope;
48548c2ecf20Sopenharmony_ci			t1[1] = eep->base_ext1.tempslopextension[0];
48558c2ecf20Sopenharmony_ci			t2[1] = eep->base_ext1.tempslopextension[1];
48568c2ecf20Sopenharmony_ci			f[1] = 5500;
48578c2ecf20Sopenharmony_ci
48588c2ecf20Sopenharmony_ci			t[2] = eep->base_ext1.tempslopextension[5];
48598c2ecf20Sopenharmony_ci			t1[2] = eep->base_ext1.tempslopextension[6];
48608c2ecf20Sopenharmony_ci			t2[2] = eep->base_ext1.tempslopextension[7];
48618c2ecf20Sopenharmony_ci			f[2] = 5785;
48628c2ecf20Sopenharmony_ci
48638c2ecf20Sopenharmony_ci			temp_slope = ar9003_hw_power_interpolate(frequency,
48648c2ecf20Sopenharmony_ci								 f, t, 3);
48658c2ecf20Sopenharmony_ci			temp_slope1 = ar9003_hw_power_interpolate(frequency,
48668c2ecf20Sopenharmony_ci								   f, t1, 3);
48678c2ecf20Sopenharmony_ci			temp_slope2 = ar9003_hw_power_interpolate(frequency,
48688c2ecf20Sopenharmony_ci								   f, t2, 3);
48698c2ecf20Sopenharmony_ci
48708c2ecf20Sopenharmony_ci			goto tempslope;
48718c2ecf20Sopenharmony_ci		}
48728c2ecf20Sopenharmony_ci
48738c2ecf20Sopenharmony_ci		if ((eep->baseEepHeader.miscConfiguration & 0x20) != 0) {
48748c2ecf20Sopenharmony_ci			for (i = 0; i < 8; i++) {
48758c2ecf20Sopenharmony_ci				t[i] = eep->base_ext1.tempslopextension[i];
48768c2ecf20Sopenharmony_ci				f[i] = FBIN2FREQ(eep->calFreqPier5G[i], 0);
48778c2ecf20Sopenharmony_ci			}
48788c2ecf20Sopenharmony_ci			temp_slope = ar9003_hw_power_interpolate((s32) frequency,
48798c2ecf20Sopenharmony_ci								 f, t, 8);
48808c2ecf20Sopenharmony_ci		} else if (eep->base_ext2.tempSlopeLow != 0) {
48818c2ecf20Sopenharmony_ci			t[0] = eep->base_ext2.tempSlopeLow;
48828c2ecf20Sopenharmony_ci			f[0] = 5180;
48838c2ecf20Sopenharmony_ci			t[1] = eep->modalHeader5G.tempSlope;
48848c2ecf20Sopenharmony_ci			f[1] = 5500;
48858c2ecf20Sopenharmony_ci			t[2] = eep->base_ext2.tempSlopeHigh;
48868c2ecf20Sopenharmony_ci			f[2] = 5785;
48878c2ecf20Sopenharmony_ci			temp_slope = ar9003_hw_power_interpolate((s32) frequency,
48888c2ecf20Sopenharmony_ci								 f, t, 3);
48898c2ecf20Sopenharmony_ci		} else {
48908c2ecf20Sopenharmony_ci			temp_slope = eep->modalHeader5G.tempSlope;
48918c2ecf20Sopenharmony_ci		}
48928c2ecf20Sopenharmony_ci	}
48938c2ecf20Sopenharmony_ci
48948c2ecf20Sopenharmony_citempslope:
48958c2ecf20Sopenharmony_ci	if (AR_SREV_9550(ah) || AR_SREV_9531(ah) || AR_SREV_9561(ah)) {
48968c2ecf20Sopenharmony_ci		u8 txmask = (eep->baseEepHeader.txrxMask & 0xf0) >> 4;
48978c2ecf20Sopenharmony_ci
48988c2ecf20Sopenharmony_ci		/*
48998c2ecf20Sopenharmony_ci		 * AR955x has tempSlope register for each chain.
49008c2ecf20Sopenharmony_ci		 * Check whether temp_compensation feature is enabled or not.
49018c2ecf20Sopenharmony_ci		 */
49028c2ecf20Sopenharmony_ci		if (eep->baseEepHeader.featureEnable & 0x1) {
49038c2ecf20Sopenharmony_ci			if (frequency < 4000) {
49048c2ecf20Sopenharmony_ci				if (txmask & BIT(0))
49058c2ecf20Sopenharmony_ci					REG_RMW_FIELD(ah, AR_PHY_TPC_19,
49068c2ecf20Sopenharmony_ci						      AR_PHY_TPC_19_ALPHA_THERM,
49078c2ecf20Sopenharmony_ci						      eep->base_ext2.tempSlopeLow);
49088c2ecf20Sopenharmony_ci				if (txmask & BIT(1))
49098c2ecf20Sopenharmony_ci					REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
49108c2ecf20Sopenharmony_ci						      AR_PHY_TPC_19_ALPHA_THERM,
49118c2ecf20Sopenharmony_ci						      temp_slope);
49128c2ecf20Sopenharmony_ci				if (txmask & BIT(2))
49138c2ecf20Sopenharmony_ci					REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
49148c2ecf20Sopenharmony_ci						      AR_PHY_TPC_19_ALPHA_THERM,
49158c2ecf20Sopenharmony_ci						      eep->base_ext2.tempSlopeHigh);
49168c2ecf20Sopenharmony_ci			} else {
49178c2ecf20Sopenharmony_ci				if (txmask & BIT(0))
49188c2ecf20Sopenharmony_ci					REG_RMW_FIELD(ah, AR_PHY_TPC_19,
49198c2ecf20Sopenharmony_ci						      AR_PHY_TPC_19_ALPHA_THERM,
49208c2ecf20Sopenharmony_ci						      temp_slope);
49218c2ecf20Sopenharmony_ci				if (txmask & BIT(1))
49228c2ecf20Sopenharmony_ci					REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
49238c2ecf20Sopenharmony_ci						      AR_PHY_TPC_19_ALPHA_THERM,
49248c2ecf20Sopenharmony_ci						      temp_slope1);
49258c2ecf20Sopenharmony_ci				if (txmask & BIT(2))
49268c2ecf20Sopenharmony_ci					REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
49278c2ecf20Sopenharmony_ci						      AR_PHY_TPC_19_ALPHA_THERM,
49288c2ecf20Sopenharmony_ci						      temp_slope2);
49298c2ecf20Sopenharmony_ci			}
49308c2ecf20Sopenharmony_ci		} else {
49318c2ecf20Sopenharmony_ci			/*
49328c2ecf20Sopenharmony_ci			 * If temp compensation is not enabled,
49338c2ecf20Sopenharmony_ci			 * set all registers to 0.
49348c2ecf20Sopenharmony_ci			 */
49358c2ecf20Sopenharmony_ci			if (txmask & BIT(0))
49368c2ecf20Sopenharmony_ci				REG_RMW_FIELD(ah, AR_PHY_TPC_19,
49378c2ecf20Sopenharmony_ci					      AR_PHY_TPC_19_ALPHA_THERM, 0);
49388c2ecf20Sopenharmony_ci			if (txmask & BIT(1))
49398c2ecf20Sopenharmony_ci				REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
49408c2ecf20Sopenharmony_ci					      AR_PHY_TPC_19_ALPHA_THERM, 0);
49418c2ecf20Sopenharmony_ci			if (txmask & BIT(2))
49428c2ecf20Sopenharmony_ci				REG_RMW_FIELD(ah, AR_PHY_TPC_19_B2,
49438c2ecf20Sopenharmony_ci					      AR_PHY_TPC_19_ALPHA_THERM, 0);
49448c2ecf20Sopenharmony_ci		}
49458c2ecf20Sopenharmony_ci	} else {
49468c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_TPC_19,
49478c2ecf20Sopenharmony_ci			      AR_PHY_TPC_19_ALPHA_THERM, temp_slope);
49488c2ecf20Sopenharmony_ci	}
49498c2ecf20Sopenharmony_ci
49508c2ecf20Sopenharmony_ci	if (AR_SREV_9462_20_OR_LATER(ah))
49518c2ecf20Sopenharmony_ci		REG_RMW_FIELD(ah, AR_PHY_TPC_19_B1,
49528c2ecf20Sopenharmony_ci			      AR_PHY_TPC_19_B1_ALPHA_THERM, temp_slope);
49538c2ecf20Sopenharmony_ci
49548c2ecf20Sopenharmony_ci
49558c2ecf20Sopenharmony_ci	REG_RMW_FIELD(ah, AR_PHY_TPC_18, AR_PHY_TPC_18_THERM_CAL_VALUE,
49568c2ecf20Sopenharmony_ci		      temperature[0]);
49578c2ecf20Sopenharmony_ci}
49588c2ecf20Sopenharmony_ci
49598c2ecf20Sopenharmony_ci/* Apply the recorded correction values. */
49608c2ecf20Sopenharmony_cistatic int ar9003_hw_calibration_apply(struct ath_hw *ah, int frequency)
49618c2ecf20Sopenharmony_ci{
49628c2ecf20Sopenharmony_ci	int ichain, ipier, npier;
49638c2ecf20Sopenharmony_ci	int mode;
49648c2ecf20Sopenharmony_ci	int lfrequency[AR9300_MAX_CHAINS],
49658c2ecf20Sopenharmony_ci	    lcorrection[AR9300_MAX_CHAINS],
49668c2ecf20Sopenharmony_ci	    ltemperature[AR9300_MAX_CHAINS], lvoltage[AR9300_MAX_CHAINS],
49678c2ecf20Sopenharmony_ci	    lnf_cal[AR9300_MAX_CHAINS], lnf_pwr[AR9300_MAX_CHAINS];
49688c2ecf20Sopenharmony_ci	int hfrequency[AR9300_MAX_CHAINS],
49698c2ecf20Sopenharmony_ci	    hcorrection[AR9300_MAX_CHAINS],
49708c2ecf20Sopenharmony_ci	    htemperature[AR9300_MAX_CHAINS], hvoltage[AR9300_MAX_CHAINS],
49718c2ecf20Sopenharmony_ci	    hnf_cal[AR9300_MAX_CHAINS], hnf_pwr[AR9300_MAX_CHAINS];
49728c2ecf20Sopenharmony_ci	int fdiff;
49738c2ecf20Sopenharmony_ci	int correction[AR9300_MAX_CHAINS],
49748c2ecf20Sopenharmony_ci	    voltage[AR9300_MAX_CHAINS], temperature[AR9300_MAX_CHAINS],
49758c2ecf20Sopenharmony_ci	    nf_cal[AR9300_MAX_CHAINS], nf_pwr[AR9300_MAX_CHAINS];
49768c2ecf20Sopenharmony_ci	int pfrequency, pcorrection, ptemperature, pvoltage,
49778c2ecf20Sopenharmony_ci	    pnf_cal, pnf_pwr;
49788c2ecf20Sopenharmony_ci	struct ath_common *common = ath9k_hw_common(ah);
49798c2ecf20Sopenharmony_ci
49808c2ecf20Sopenharmony_ci	mode = (frequency >= 4000);
49818c2ecf20Sopenharmony_ci	if (mode)
49828c2ecf20Sopenharmony_ci		npier = AR9300_NUM_5G_CAL_PIERS;
49838c2ecf20Sopenharmony_ci	else
49848c2ecf20Sopenharmony_ci		npier = AR9300_NUM_2G_CAL_PIERS;
49858c2ecf20Sopenharmony_ci
49868c2ecf20Sopenharmony_ci	for (ichain = 0; ichain < AR9300_MAX_CHAINS; ichain++) {
49878c2ecf20Sopenharmony_ci		lfrequency[ichain] = 0;
49888c2ecf20Sopenharmony_ci		hfrequency[ichain] = 100000;
49898c2ecf20Sopenharmony_ci	}
49908c2ecf20Sopenharmony_ci	/* identify best lower and higher frequency calibration measurement */
49918c2ecf20Sopenharmony_ci	for (ichain = 0; ichain < AR9300_MAX_CHAINS; ichain++) {
49928c2ecf20Sopenharmony_ci		for (ipier = 0; ipier < npier; ipier++) {
49938c2ecf20Sopenharmony_ci			if (!ar9003_hw_cal_pier_get(ah, mode, ipier, ichain,
49948c2ecf20Sopenharmony_ci						    &pfrequency, &pcorrection,
49958c2ecf20Sopenharmony_ci						    &ptemperature, &pvoltage,
49968c2ecf20Sopenharmony_ci						    &pnf_cal, &pnf_pwr)) {
49978c2ecf20Sopenharmony_ci				fdiff = frequency - pfrequency;
49988c2ecf20Sopenharmony_ci
49998c2ecf20Sopenharmony_ci				/*
50008c2ecf20Sopenharmony_ci				 * this measurement is higher than
50018c2ecf20Sopenharmony_ci				 * our desired frequency
50028c2ecf20Sopenharmony_ci				 */
50038c2ecf20Sopenharmony_ci				if (fdiff <= 0) {
50048c2ecf20Sopenharmony_ci					if (hfrequency[ichain] <= 0 ||
50058c2ecf20Sopenharmony_ci					    hfrequency[ichain] >= 100000 ||
50068c2ecf20Sopenharmony_ci					    fdiff >
50078c2ecf20Sopenharmony_ci					    (frequency - hfrequency[ichain])) {
50088c2ecf20Sopenharmony_ci						/*
50098c2ecf20Sopenharmony_ci						 * new best higher
50108c2ecf20Sopenharmony_ci						 * frequency measurement
50118c2ecf20Sopenharmony_ci						 */
50128c2ecf20Sopenharmony_ci						hfrequency[ichain] = pfrequency;
50138c2ecf20Sopenharmony_ci						hcorrection[ichain] =
50148c2ecf20Sopenharmony_ci						    pcorrection;
50158c2ecf20Sopenharmony_ci						htemperature[ichain] =
50168c2ecf20Sopenharmony_ci						    ptemperature;
50178c2ecf20Sopenharmony_ci						hvoltage[ichain] = pvoltage;
50188c2ecf20Sopenharmony_ci						hnf_cal[ichain] = pnf_cal;
50198c2ecf20Sopenharmony_ci						hnf_pwr[ichain] = pnf_pwr;
50208c2ecf20Sopenharmony_ci					}
50218c2ecf20Sopenharmony_ci				}
50228c2ecf20Sopenharmony_ci				if (fdiff >= 0) {
50238c2ecf20Sopenharmony_ci					if (lfrequency[ichain] <= 0
50248c2ecf20Sopenharmony_ci					    || fdiff <
50258c2ecf20Sopenharmony_ci					    (frequency - lfrequency[ichain])) {
50268c2ecf20Sopenharmony_ci						/*
50278c2ecf20Sopenharmony_ci						 * new best lower
50288c2ecf20Sopenharmony_ci						 * frequency measurement
50298c2ecf20Sopenharmony_ci						 */
50308c2ecf20Sopenharmony_ci						lfrequency[ichain] = pfrequency;
50318c2ecf20Sopenharmony_ci						lcorrection[ichain] =
50328c2ecf20Sopenharmony_ci						    pcorrection;
50338c2ecf20Sopenharmony_ci						ltemperature[ichain] =
50348c2ecf20Sopenharmony_ci						    ptemperature;
50358c2ecf20Sopenharmony_ci						lvoltage[ichain] = pvoltage;
50368c2ecf20Sopenharmony_ci						lnf_cal[ichain] = pnf_cal;
50378c2ecf20Sopenharmony_ci						lnf_pwr[ichain] = pnf_pwr;
50388c2ecf20Sopenharmony_ci					}
50398c2ecf20Sopenharmony_ci				}
50408c2ecf20Sopenharmony_ci			}
50418c2ecf20Sopenharmony_ci		}
50428c2ecf20Sopenharmony_ci	}
50438c2ecf20Sopenharmony_ci
50448c2ecf20Sopenharmony_ci	/* interpolate  */
50458c2ecf20Sopenharmony_ci	for (ichain = 0; ichain < AR9300_MAX_CHAINS; ichain++) {
50468c2ecf20Sopenharmony_ci		ath_dbg(common, EEPROM,
50478c2ecf20Sopenharmony_ci			"ch=%d f=%d low=%d %d h=%d %d n=%d %d p=%d %d\n",
50488c2ecf20Sopenharmony_ci			ichain, frequency, lfrequency[ichain],
50498c2ecf20Sopenharmony_ci			lcorrection[ichain], hfrequency[ichain],
50508c2ecf20Sopenharmony_ci			hcorrection[ichain], lnf_cal[ichain],
50518c2ecf20Sopenharmony_ci			hnf_cal[ichain], lnf_pwr[ichain],
50528c2ecf20Sopenharmony_ci			hnf_pwr[ichain]);
50538c2ecf20Sopenharmony_ci		/* they're the same, so just pick one */
50548c2ecf20Sopenharmony_ci		if (hfrequency[ichain] == lfrequency[ichain]) {
50558c2ecf20Sopenharmony_ci			correction[ichain] = lcorrection[ichain];
50568c2ecf20Sopenharmony_ci			voltage[ichain] = lvoltage[ichain];
50578c2ecf20Sopenharmony_ci			temperature[ichain] = ltemperature[ichain];
50588c2ecf20Sopenharmony_ci			nf_cal[ichain] = lnf_cal[ichain];
50598c2ecf20Sopenharmony_ci			nf_pwr[ichain] = lnf_pwr[ichain];
50608c2ecf20Sopenharmony_ci		}
50618c2ecf20Sopenharmony_ci		/* the low frequency is good */
50628c2ecf20Sopenharmony_ci		else if (frequency - lfrequency[ichain] < 1000) {
50638c2ecf20Sopenharmony_ci			/* so is the high frequency, interpolate */
50648c2ecf20Sopenharmony_ci			if (hfrequency[ichain] - frequency < 1000) {
50658c2ecf20Sopenharmony_ci
50668c2ecf20Sopenharmony_ci				correction[ichain] = interpolate(frequency,
50678c2ecf20Sopenharmony_ci						lfrequency[ichain],
50688c2ecf20Sopenharmony_ci						hfrequency[ichain],
50698c2ecf20Sopenharmony_ci						lcorrection[ichain],
50708c2ecf20Sopenharmony_ci						hcorrection[ichain]);
50718c2ecf20Sopenharmony_ci
50728c2ecf20Sopenharmony_ci				temperature[ichain] = interpolate(frequency,
50738c2ecf20Sopenharmony_ci						lfrequency[ichain],
50748c2ecf20Sopenharmony_ci						hfrequency[ichain],
50758c2ecf20Sopenharmony_ci						ltemperature[ichain],
50768c2ecf20Sopenharmony_ci						htemperature[ichain]);
50778c2ecf20Sopenharmony_ci
50788c2ecf20Sopenharmony_ci				voltage[ichain] = interpolate(frequency,
50798c2ecf20Sopenharmony_ci						lfrequency[ichain],
50808c2ecf20Sopenharmony_ci						hfrequency[ichain],
50818c2ecf20Sopenharmony_ci						lvoltage[ichain],
50828c2ecf20Sopenharmony_ci						hvoltage[ichain]);
50838c2ecf20Sopenharmony_ci
50848c2ecf20Sopenharmony_ci				nf_cal[ichain] = interpolate(frequency,
50858c2ecf20Sopenharmony_ci						lfrequency[ichain],
50868c2ecf20Sopenharmony_ci						hfrequency[ichain],
50878c2ecf20Sopenharmony_ci						lnf_cal[ichain],
50888c2ecf20Sopenharmony_ci						hnf_cal[ichain]);
50898c2ecf20Sopenharmony_ci
50908c2ecf20Sopenharmony_ci				nf_pwr[ichain] = interpolate(frequency,
50918c2ecf20Sopenharmony_ci						lfrequency[ichain],
50928c2ecf20Sopenharmony_ci						hfrequency[ichain],
50938c2ecf20Sopenharmony_ci						lnf_pwr[ichain],
50948c2ecf20Sopenharmony_ci						hnf_pwr[ichain]);
50958c2ecf20Sopenharmony_ci			}
50968c2ecf20Sopenharmony_ci			/* only low is good, use it */
50978c2ecf20Sopenharmony_ci			else {
50988c2ecf20Sopenharmony_ci				correction[ichain] = lcorrection[ichain];
50998c2ecf20Sopenharmony_ci				temperature[ichain] = ltemperature[ichain];
51008c2ecf20Sopenharmony_ci				voltage[ichain] = lvoltage[ichain];
51018c2ecf20Sopenharmony_ci				nf_cal[ichain] = lnf_cal[ichain];
51028c2ecf20Sopenharmony_ci				nf_pwr[ichain] = lnf_pwr[ichain];
51038c2ecf20Sopenharmony_ci			}
51048c2ecf20Sopenharmony_ci		}
51058c2ecf20Sopenharmony_ci		/* only high is good, use it */
51068c2ecf20Sopenharmony_ci		else if (hfrequency[ichain] - frequency < 1000) {
51078c2ecf20Sopenharmony_ci			correction[ichain] = hcorrection[ichain];
51088c2ecf20Sopenharmony_ci			temperature[ichain] = htemperature[ichain];
51098c2ecf20Sopenharmony_ci			voltage[ichain] = hvoltage[ichain];
51108c2ecf20Sopenharmony_ci			nf_cal[ichain] = hnf_cal[ichain];
51118c2ecf20Sopenharmony_ci			nf_pwr[ichain] = hnf_pwr[ichain];
51128c2ecf20Sopenharmony_ci		} else {	/* nothing is good, presume 0???? */
51138c2ecf20Sopenharmony_ci			correction[ichain] = 0;
51148c2ecf20Sopenharmony_ci			temperature[ichain] = 0;
51158c2ecf20Sopenharmony_ci			voltage[ichain] = 0;
51168c2ecf20Sopenharmony_ci			nf_cal[ichain] = 0;
51178c2ecf20Sopenharmony_ci			nf_pwr[ichain] = 0;
51188c2ecf20Sopenharmony_ci		}
51198c2ecf20Sopenharmony_ci	}
51208c2ecf20Sopenharmony_ci
51218c2ecf20Sopenharmony_ci	ar9003_hw_power_control_override(ah, frequency, correction, voltage,
51228c2ecf20Sopenharmony_ci					 temperature);
51238c2ecf20Sopenharmony_ci
51248c2ecf20Sopenharmony_ci	ath_dbg(common, EEPROM,
51258c2ecf20Sopenharmony_ci		"for frequency=%d, calibration correction = %d %d %d\n",
51268c2ecf20Sopenharmony_ci		frequency, correction[0], correction[1], correction[2]);
51278c2ecf20Sopenharmony_ci
51288c2ecf20Sopenharmony_ci	/* Store calibrated noise floor values */
51298c2ecf20Sopenharmony_ci	for (ichain = 0; ichain < AR5416_MAX_CHAINS; ichain++)
51308c2ecf20Sopenharmony_ci		if (mode) {
51318c2ecf20Sopenharmony_ci			ah->nf_5g.cal[ichain] = nf_cal[ichain];
51328c2ecf20Sopenharmony_ci			ah->nf_5g.pwr[ichain] = nf_pwr[ichain];
51338c2ecf20Sopenharmony_ci		} else {
51348c2ecf20Sopenharmony_ci			ah->nf_2g.cal[ichain] = nf_cal[ichain];
51358c2ecf20Sopenharmony_ci			ah->nf_2g.pwr[ichain] = nf_pwr[ichain];
51368c2ecf20Sopenharmony_ci		}
51378c2ecf20Sopenharmony_ci
51388c2ecf20Sopenharmony_ci	return 0;
51398c2ecf20Sopenharmony_ci}
51408c2ecf20Sopenharmony_ci
51418c2ecf20Sopenharmony_cistatic u16 ar9003_hw_get_direct_edge_power(struct ar9300_eeprom *eep,
51428c2ecf20Sopenharmony_ci					   int idx,
51438c2ecf20Sopenharmony_ci					   int edge,
51448c2ecf20Sopenharmony_ci					   bool is2GHz)
51458c2ecf20Sopenharmony_ci{
51468c2ecf20Sopenharmony_ci	struct cal_ctl_data_2g *ctl_2g = eep->ctlPowerData_2G;
51478c2ecf20Sopenharmony_ci	struct cal_ctl_data_5g *ctl_5g = eep->ctlPowerData_5G;
51488c2ecf20Sopenharmony_ci
51498c2ecf20Sopenharmony_ci	if (is2GHz)
51508c2ecf20Sopenharmony_ci		return CTL_EDGE_TPOWER(ctl_2g[idx].ctlEdges[edge]);
51518c2ecf20Sopenharmony_ci	else
51528c2ecf20Sopenharmony_ci		return CTL_EDGE_TPOWER(ctl_5g[idx].ctlEdges[edge]);
51538c2ecf20Sopenharmony_ci}
51548c2ecf20Sopenharmony_ci
51558c2ecf20Sopenharmony_cistatic u16 ar9003_hw_get_indirect_edge_power(struct ar9300_eeprom *eep,
51568c2ecf20Sopenharmony_ci					     int idx,
51578c2ecf20Sopenharmony_ci					     unsigned int edge,
51588c2ecf20Sopenharmony_ci					     u16 freq,
51598c2ecf20Sopenharmony_ci					     bool is2GHz)
51608c2ecf20Sopenharmony_ci{
51618c2ecf20Sopenharmony_ci	struct cal_ctl_data_2g *ctl_2g = eep->ctlPowerData_2G;
51628c2ecf20Sopenharmony_ci	struct cal_ctl_data_5g *ctl_5g = eep->ctlPowerData_5G;
51638c2ecf20Sopenharmony_ci
51648c2ecf20Sopenharmony_ci	u8 *ctl_freqbin = is2GHz ?
51658c2ecf20Sopenharmony_ci		&eep->ctl_freqbin_2G[idx][0] :
51668c2ecf20Sopenharmony_ci		&eep->ctl_freqbin_5G[idx][0];
51678c2ecf20Sopenharmony_ci
51688c2ecf20Sopenharmony_ci	if (is2GHz) {
51698c2ecf20Sopenharmony_ci		if (ath9k_hw_fbin2freq(ctl_freqbin[edge - 1], 1) < freq &&
51708c2ecf20Sopenharmony_ci		    CTL_EDGE_FLAGS(ctl_2g[idx].ctlEdges[edge - 1]))
51718c2ecf20Sopenharmony_ci			return CTL_EDGE_TPOWER(ctl_2g[idx].ctlEdges[edge - 1]);
51728c2ecf20Sopenharmony_ci	} else {
51738c2ecf20Sopenharmony_ci		if (ath9k_hw_fbin2freq(ctl_freqbin[edge - 1], 0) < freq &&
51748c2ecf20Sopenharmony_ci		    CTL_EDGE_FLAGS(ctl_5g[idx].ctlEdges[edge - 1]))
51758c2ecf20Sopenharmony_ci			return CTL_EDGE_TPOWER(ctl_5g[idx].ctlEdges[edge - 1]);
51768c2ecf20Sopenharmony_ci	}
51778c2ecf20Sopenharmony_ci
51788c2ecf20Sopenharmony_ci	return MAX_RATE_POWER;
51798c2ecf20Sopenharmony_ci}
51808c2ecf20Sopenharmony_ci
51818c2ecf20Sopenharmony_ci/*
51828c2ecf20Sopenharmony_ci * Find the maximum conformance test limit for the given channel and CTL info
51838c2ecf20Sopenharmony_ci */
51848c2ecf20Sopenharmony_cistatic u16 ar9003_hw_get_max_edge_power(struct ar9300_eeprom *eep,
51858c2ecf20Sopenharmony_ci					u16 freq, int idx, bool is2GHz)
51868c2ecf20Sopenharmony_ci{
51878c2ecf20Sopenharmony_ci	u16 twiceMaxEdgePower = MAX_RATE_POWER;
51888c2ecf20Sopenharmony_ci	u8 *ctl_freqbin = is2GHz ?
51898c2ecf20Sopenharmony_ci		&eep->ctl_freqbin_2G[idx][0] :
51908c2ecf20Sopenharmony_ci		&eep->ctl_freqbin_5G[idx][0];
51918c2ecf20Sopenharmony_ci	u16 num_edges = is2GHz ?
51928c2ecf20Sopenharmony_ci		AR9300_NUM_BAND_EDGES_2G : AR9300_NUM_BAND_EDGES_5G;
51938c2ecf20Sopenharmony_ci	unsigned int edge;
51948c2ecf20Sopenharmony_ci
51958c2ecf20Sopenharmony_ci	/* Get the edge power */
51968c2ecf20Sopenharmony_ci	for (edge = 0;
51978c2ecf20Sopenharmony_ci	     (edge < num_edges) && (ctl_freqbin[edge] != AR5416_BCHAN_UNUSED);
51988c2ecf20Sopenharmony_ci	     edge++) {
51998c2ecf20Sopenharmony_ci		/*
52008c2ecf20Sopenharmony_ci		 * If there's an exact channel match or an inband flag set
52018c2ecf20Sopenharmony_ci		 * on the lower channel use the given rdEdgePower
52028c2ecf20Sopenharmony_ci		 */
52038c2ecf20Sopenharmony_ci		if (freq == ath9k_hw_fbin2freq(ctl_freqbin[edge], is2GHz)) {
52048c2ecf20Sopenharmony_ci			twiceMaxEdgePower =
52058c2ecf20Sopenharmony_ci				ar9003_hw_get_direct_edge_power(eep, idx,
52068c2ecf20Sopenharmony_ci								edge, is2GHz);
52078c2ecf20Sopenharmony_ci			break;
52088c2ecf20Sopenharmony_ci		} else if ((edge > 0) &&
52098c2ecf20Sopenharmony_ci			   (freq < ath9k_hw_fbin2freq(ctl_freqbin[edge],
52108c2ecf20Sopenharmony_ci						      is2GHz))) {
52118c2ecf20Sopenharmony_ci			twiceMaxEdgePower =
52128c2ecf20Sopenharmony_ci				ar9003_hw_get_indirect_edge_power(eep, idx,
52138c2ecf20Sopenharmony_ci								  edge, freq,
52148c2ecf20Sopenharmony_ci								  is2GHz);
52158c2ecf20Sopenharmony_ci			/*
52168c2ecf20Sopenharmony_ci			 * Leave loop - no more affecting edges possible in
52178c2ecf20Sopenharmony_ci			 * this monotonic increasing list
52188c2ecf20Sopenharmony_ci			 */
52198c2ecf20Sopenharmony_ci			break;
52208c2ecf20Sopenharmony_ci		}
52218c2ecf20Sopenharmony_ci	}
52228c2ecf20Sopenharmony_ci
52238c2ecf20Sopenharmony_ci	if (is2GHz && !twiceMaxEdgePower)
52248c2ecf20Sopenharmony_ci		twiceMaxEdgePower = 60;
52258c2ecf20Sopenharmony_ci
52268c2ecf20Sopenharmony_ci	return twiceMaxEdgePower;
52278c2ecf20Sopenharmony_ci}
52288c2ecf20Sopenharmony_ci
52298c2ecf20Sopenharmony_cistatic void ar9003_hw_set_power_per_rate_table(struct ath_hw *ah,
52308c2ecf20Sopenharmony_ci					       struct ath9k_channel *chan,
52318c2ecf20Sopenharmony_ci					       u8 *pPwrArray, u16 cfgCtl,
52328c2ecf20Sopenharmony_ci					       u8 antenna_reduction,
52338c2ecf20Sopenharmony_ci					       u16 powerLimit)
52348c2ecf20Sopenharmony_ci{
52358c2ecf20Sopenharmony_ci	struct ath_common *common = ath9k_hw_common(ah);
52368c2ecf20Sopenharmony_ci	struct ar9300_eeprom *pEepData = &ah->eeprom.ar9300_eep;
52378c2ecf20Sopenharmony_ci	u16 twiceMaxEdgePower;
52388c2ecf20Sopenharmony_ci	int i;
52398c2ecf20Sopenharmony_ci	u16 scaledPower = 0, minCtlPower;
52408c2ecf20Sopenharmony_ci	static const u16 ctlModesFor11a[] = {
52418c2ecf20Sopenharmony_ci		CTL_11A, CTL_5GHT20, CTL_11A_EXT, CTL_5GHT40
52428c2ecf20Sopenharmony_ci	};
52438c2ecf20Sopenharmony_ci	static const u16 ctlModesFor11g[] = {
52448c2ecf20Sopenharmony_ci		CTL_11B, CTL_11G, CTL_2GHT20, CTL_11B_EXT,
52458c2ecf20Sopenharmony_ci		CTL_11G_EXT, CTL_2GHT40
52468c2ecf20Sopenharmony_ci	};
52478c2ecf20Sopenharmony_ci	u16 numCtlModes;
52488c2ecf20Sopenharmony_ci	const u16 *pCtlMode;
52498c2ecf20Sopenharmony_ci	u16 ctlMode, freq;
52508c2ecf20Sopenharmony_ci	struct chan_centers centers;
52518c2ecf20Sopenharmony_ci	u8 *ctlIndex;
52528c2ecf20Sopenharmony_ci	u8 ctlNum;
52538c2ecf20Sopenharmony_ci	u16 twiceMinEdgePower;
52548c2ecf20Sopenharmony_ci	bool is2ghz = IS_CHAN_2GHZ(chan);
52558c2ecf20Sopenharmony_ci
52568c2ecf20Sopenharmony_ci	ath9k_hw_get_channel_centers(ah, chan, &centers);
52578c2ecf20Sopenharmony_ci	scaledPower = ath9k_hw_get_scaled_power(ah, powerLimit,
52588c2ecf20Sopenharmony_ci						antenna_reduction);
52598c2ecf20Sopenharmony_ci
52608c2ecf20Sopenharmony_ci	if (is2ghz) {
52618c2ecf20Sopenharmony_ci		/* Setup for CTL modes */
52628c2ecf20Sopenharmony_ci		/* CTL_11B, CTL_11G, CTL_2GHT20 */
52638c2ecf20Sopenharmony_ci		numCtlModes =
52648c2ecf20Sopenharmony_ci			ARRAY_SIZE(ctlModesFor11g) -
52658c2ecf20Sopenharmony_ci				   SUB_NUM_CTL_MODES_AT_2G_40;
52668c2ecf20Sopenharmony_ci		pCtlMode = ctlModesFor11g;
52678c2ecf20Sopenharmony_ci		if (IS_CHAN_HT40(chan))
52688c2ecf20Sopenharmony_ci			/* All 2G CTL's */
52698c2ecf20Sopenharmony_ci			numCtlModes = ARRAY_SIZE(ctlModesFor11g);
52708c2ecf20Sopenharmony_ci	} else {
52718c2ecf20Sopenharmony_ci		/* Setup for CTL modes */
52728c2ecf20Sopenharmony_ci		/* CTL_11A, CTL_5GHT20 */
52738c2ecf20Sopenharmony_ci		numCtlModes = ARRAY_SIZE(ctlModesFor11a) -
52748c2ecf20Sopenharmony_ci					 SUB_NUM_CTL_MODES_AT_5G_40;
52758c2ecf20Sopenharmony_ci		pCtlMode = ctlModesFor11a;
52768c2ecf20Sopenharmony_ci		if (IS_CHAN_HT40(chan))
52778c2ecf20Sopenharmony_ci			/* All 5G CTL's */
52788c2ecf20Sopenharmony_ci			numCtlModes = ARRAY_SIZE(ctlModesFor11a);
52798c2ecf20Sopenharmony_ci	}
52808c2ecf20Sopenharmony_ci
52818c2ecf20Sopenharmony_ci	/*
52828c2ecf20Sopenharmony_ci	 * For MIMO, need to apply regulatory caps individually across
52838c2ecf20Sopenharmony_ci	 * dynamically running modes: CCK, OFDM, HT20, HT40
52848c2ecf20Sopenharmony_ci	 *
52858c2ecf20Sopenharmony_ci	 * The outer loop walks through each possible applicable runtime mode.
52868c2ecf20Sopenharmony_ci	 * The inner loop walks through each ctlIndex entry in EEPROM.
52878c2ecf20Sopenharmony_ci	 * The ctl value is encoded as [7:4] == test group, [3:0] == test mode.
52888c2ecf20Sopenharmony_ci	 */
52898c2ecf20Sopenharmony_ci	for (ctlMode = 0; ctlMode < numCtlModes; ctlMode++) {
52908c2ecf20Sopenharmony_ci		bool isHt40CtlMode = (pCtlMode[ctlMode] == CTL_5GHT40) ||
52918c2ecf20Sopenharmony_ci			(pCtlMode[ctlMode] == CTL_2GHT40);
52928c2ecf20Sopenharmony_ci		if (isHt40CtlMode)
52938c2ecf20Sopenharmony_ci			freq = centers.synth_center;
52948c2ecf20Sopenharmony_ci		else if (pCtlMode[ctlMode] & EXT_ADDITIVE)
52958c2ecf20Sopenharmony_ci			freq = centers.ext_center;
52968c2ecf20Sopenharmony_ci		else
52978c2ecf20Sopenharmony_ci			freq = centers.ctl_center;
52988c2ecf20Sopenharmony_ci
52998c2ecf20Sopenharmony_ci		ath_dbg(common, REGULATORY,
53008c2ecf20Sopenharmony_ci			"LOOP-Mode ctlMode %d < %d, isHt40CtlMode %d, EXT_ADDITIVE %d\n",
53018c2ecf20Sopenharmony_ci			ctlMode, numCtlModes, isHt40CtlMode,
53028c2ecf20Sopenharmony_ci			(pCtlMode[ctlMode] & EXT_ADDITIVE));
53038c2ecf20Sopenharmony_ci
53048c2ecf20Sopenharmony_ci		/* walk through each CTL index stored in EEPROM */
53058c2ecf20Sopenharmony_ci		if (is2ghz) {
53068c2ecf20Sopenharmony_ci			ctlIndex = pEepData->ctlIndex_2G;
53078c2ecf20Sopenharmony_ci			ctlNum = AR9300_NUM_CTLS_2G;
53088c2ecf20Sopenharmony_ci		} else {
53098c2ecf20Sopenharmony_ci			ctlIndex = pEepData->ctlIndex_5G;
53108c2ecf20Sopenharmony_ci			ctlNum = AR9300_NUM_CTLS_5G;
53118c2ecf20Sopenharmony_ci		}
53128c2ecf20Sopenharmony_ci
53138c2ecf20Sopenharmony_ci		twiceMaxEdgePower = MAX_RATE_POWER;
53148c2ecf20Sopenharmony_ci		for (i = 0; (i < ctlNum) && ctlIndex[i]; i++) {
53158c2ecf20Sopenharmony_ci			ath_dbg(common, REGULATORY,
53168c2ecf20Sopenharmony_ci				"LOOP-Ctlidx %d: cfgCtl 0x%2.2x pCtlMode 0x%2.2x ctlIndex 0x%2.2x chan %d\n",
53178c2ecf20Sopenharmony_ci				i, cfgCtl, pCtlMode[ctlMode], ctlIndex[i],
53188c2ecf20Sopenharmony_ci				chan->channel);
53198c2ecf20Sopenharmony_ci
53208c2ecf20Sopenharmony_ci			/*
53218c2ecf20Sopenharmony_ci			 * compare test group from regulatory
53228c2ecf20Sopenharmony_ci			 * channel list with test mode from pCtlMode
53238c2ecf20Sopenharmony_ci			 * list
53248c2ecf20Sopenharmony_ci			 */
53258c2ecf20Sopenharmony_ci			if ((((cfgCtl & ~CTL_MODE_M) |
53268c2ecf20Sopenharmony_ci			       (pCtlMode[ctlMode] & CTL_MODE_M)) ==
53278c2ecf20Sopenharmony_ci				ctlIndex[i]) ||
53288c2ecf20Sopenharmony_ci			    (((cfgCtl & ~CTL_MODE_M) |
53298c2ecf20Sopenharmony_ci			       (pCtlMode[ctlMode] & CTL_MODE_M)) ==
53308c2ecf20Sopenharmony_ci			     ((ctlIndex[i] & CTL_MODE_M) |
53318c2ecf20Sopenharmony_ci			       SD_NO_CTL))) {
53328c2ecf20Sopenharmony_ci				twiceMinEdgePower =
53338c2ecf20Sopenharmony_ci				  ar9003_hw_get_max_edge_power(pEepData,
53348c2ecf20Sopenharmony_ci							       freq, i,
53358c2ecf20Sopenharmony_ci							       is2ghz);
53368c2ecf20Sopenharmony_ci
53378c2ecf20Sopenharmony_ci				if ((cfgCtl & ~CTL_MODE_M) == SD_NO_CTL)
53388c2ecf20Sopenharmony_ci					/*
53398c2ecf20Sopenharmony_ci					 * Find the minimum of all CTL
53408c2ecf20Sopenharmony_ci					 * edge powers that apply to
53418c2ecf20Sopenharmony_ci					 * this channel
53428c2ecf20Sopenharmony_ci					 */
53438c2ecf20Sopenharmony_ci					twiceMaxEdgePower =
53448c2ecf20Sopenharmony_ci						min(twiceMaxEdgePower,
53458c2ecf20Sopenharmony_ci						    twiceMinEdgePower);
53468c2ecf20Sopenharmony_ci				else {
53478c2ecf20Sopenharmony_ci					/* specific */
53488c2ecf20Sopenharmony_ci					twiceMaxEdgePower = twiceMinEdgePower;
53498c2ecf20Sopenharmony_ci					break;
53508c2ecf20Sopenharmony_ci				}
53518c2ecf20Sopenharmony_ci			}
53528c2ecf20Sopenharmony_ci		}
53538c2ecf20Sopenharmony_ci
53548c2ecf20Sopenharmony_ci		minCtlPower = (u8)min(twiceMaxEdgePower, scaledPower);
53558c2ecf20Sopenharmony_ci
53568c2ecf20Sopenharmony_ci		ath_dbg(common, REGULATORY,
53578c2ecf20Sopenharmony_ci			"SEL-Min ctlMode %d pCtlMode %d 2xMaxEdge %d sP %d minCtlPwr %d\n",
53588c2ecf20Sopenharmony_ci			ctlMode, pCtlMode[ctlMode], twiceMaxEdgePower,
53598c2ecf20Sopenharmony_ci			scaledPower, minCtlPower);
53608c2ecf20Sopenharmony_ci
53618c2ecf20Sopenharmony_ci		/* Apply ctl mode to correct target power set */
53628c2ecf20Sopenharmony_ci		switch (pCtlMode[ctlMode]) {
53638c2ecf20Sopenharmony_ci		case CTL_11B:
53648c2ecf20Sopenharmony_ci			for (i = ALL_TARGET_LEGACY_1L_5L;
53658c2ecf20Sopenharmony_ci			     i <= ALL_TARGET_LEGACY_11S; i++)
53668c2ecf20Sopenharmony_ci				pPwrArray[i] = (u8)min((u16)pPwrArray[i],
53678c2ecf20Sopenharmony_ci						       minCtlPower);
53688c2ecf20Sopenharmony_ci			break;
53698c2ecf20Sopenharmony_ci		case CTL_11A:
53708c2ecf20Sopenharmony_ci		case CTL_11G:
53718c2ecf20Sopenharmony_ci			for (i = ALL_TARGET_LEGACY_6_24;
53728c2ecf20Sopenharmony_ci			     i <= ALL_TARGET_LEGACY_54; i++)
53738c2ecf20Sopenharmony_ci				pPwrArray[i] = (u8)min((u16)pPwrArray[i],
53748c2ecf20Sopenharmony_ci						       minCtlPower);
53758c2ecf20Sopenharmony_ci			break;
53768c2ecf20Sopenharmony_ci		case CTL_5GHT20:
53778c2ecf20Sopenharmony_ci		case CTL_2GHT20:
53788c2ecf20Sopenharmony_ci			for (i = ALL_TARGET_HT20_0_8_16;
53798c2ecf20Sopenharmony_ci			     i <= ALL_TARGET_HT20_23; i++) {
53808c2ecf20Sopenharmony_ci				pPwrArray[i] = (u8)min((u16)pPwrArray[i],
53818c2ecf20Sopenharmony_ci						       minCtlPower);
53828c2ecf20Sopenharmony_ci				if (ath9k_hw_mci_is_enabled(ah))
53838c2ecf20Sopenharmony_ci					pPwrArray[i] =
53848c2ecf20Sopenharmony_ci						(u8)min((u16)pPwrArray[i],
53858c2ecf20Sopenharmony_ci						ar9003_mci_get_max_txpower(ah,
53868c2ecf20Sopenharmony_ci							pCtlMode[ctlMode]));
53878c2ecf20Sopenharmony_ci			}
53888c2ecf20Sopenharmony_ci			break;
53898c2ecf20Sopenharmony_ci		case CTL_5GHT40:
53908c2ecf20Sopenharmony_ci		case CTL_2GHT40:
53918c2ecf20Sopenharmony_ci			for (i = ALL_TARGET_HT40_0_8_16;
53928c2ecf20Sopenharmony_ci			     i <= ALL_TARGET_HT40_23; i++) {
53938c2ecf20Sopenharmony_ci				pPwrArray[i] = (u8)min((u16)pPwrArray[i],
53948c2ecf20Sopenharmony_ci						       minCtlPower);
53958c2ecf20Sopenharmony_ci				if (ath9k_hw_mci_is_enabled(ah))
53968c2ecf20Sopenharmony_ci					pPwrArray[i] =
53978c2ecf20Sopenharmony_ci						(u8)min((u16)pPwrArray[i],
53988c2ecf20Sopenharmony_ci						ar9003_mci_get_max_txpower(ah,
53998c2ecf20Sopenharmony_ci							pCtlMode[ctlMode]));
54008c2ecf20Sopenharmony_ci			}
54018c2ecf20Sopenharmony_ci			break;
54028c2ecf20Sopenharmony_ci		default:
54038c2ecf20Sopenharmony_ci			break;
54048c2ecf20Sopenharmony_ci		}
54058c2ecf20Sopenharmony_ci	} /* end ctl mode checking */
54068c2ecf20Sopenharmony_ci}
54078c2ecf20Sopenharmony_ci
54088c2ecf20Sopenharmony_cistatic inline u8 mcsidx_to_tgtpwridx(unsigned int mcs_idx, u8 base_pwridx)
54098c2ecf20Sopenharmony_ci{
54108c2ecf20Sopenharmony_ci	u8 mod_idx = mcs_idx % 8;
54118c2ecf20Sopenharmony_ci
54128c2ecf20Sopenharmony_ci	if (mod_idx <= 3)
54138c2ecf20Sopenharmony_ci		return mod_idx ? (base_pwridx + 1) : base_pwridx;
54148c2ecf20Sopenharmony_ci	else
54158c2ecf20Sopenharmony_ci		return base_pwridx + 4 * (mcs_idx / 8) + mod_idx - 2;
54168c2ecf20Sopenharmony_ci}
54178c2ecf20Sopenharmony_ci
54188c2ecf20Sopenharmony_cistatic void ar9003_paprd_set_txpower(struct ath_hw *ah,
54198c2ecf20Sopenharmony_ci				     struct ath9k_channel *chan,
54208c2ecf20Sopenharmony_ci				     u8 *targetPowerValT2)
54218c2ecf20Sopenharmony_ci{
54228c2ecf20Sopenharmony_ci	int i;
54238c2ecf20Sopenharmony_ci
54248c2ecf20Sopenharmony_ci	if (!ar9003_is_paprd_enabled(ah))
54258c2ecf20Sopenharmony_ci		return;
54268c2ecf20Sopenharmony_ci
54278c2ecf20Sopenharmony_ci	if (IS_CHAN_HT40(chan))
54288c2ecf20Sopenharmony_ci		i = ALL_TARGET_HT40_7;
54298c2ecf20Sopenharmony_ci	else
54308c2ecf20Sopenharmony_ci		i = ALL_TARGET_HT20_7;
54318c2ecf20Sopenharmony_ci
54328c2ecf20Sopenharmony_ci	if (IS_CHAN_2GHZ(chan)) {
54338c2ecf20Sopenharmony_ci		if (!AR_SREV_9330(ah) && !AR_SREV_9340(ah) &&
54348c2ecf20Sopenharmony_ci		    !AR_SREV_9462(ah) && !AR_SREV_9565(ah)) {
54358c2ecf20Sopenharmony_ci			if (IS_CHAN_HT40(chan))
54368c2ecf20Sopenharmony_ci				i = ALL_TARGET_HT40_0_8_16;
54378c2ecf20Sopenharmony_ci			else
54388c2ecf20Sopenharmony_ci				i = ALL_TARGET_HT20_0_8_16;
54398c2ecf20Sopenharmony_ci		}
54408c2ecf20Sopenharmony_ci	}
54418c2ecf20Sopenharmony_ci
54428c2ecf20Sopenharmony_ci	ah->paprd_target_power = targetPowerValT2[i];
54438c2ecf20Sopenharmony_ci}
54448c2ecf20Sopenharmony_ci
54458c2ecf20Sopenharmony_cistatic void ath9k_hw_ar9300_set_txpower(struct ath_hw *ah,
54468c2ecf20Sopenharmony_ci					struct ath9k_channel *chan, u16 cfgCtl,
54478c2ecf20Sopenharmony_ci					u8 twiceAntennaReduction,
54488c2ecf20Sopenharmony_ci					u8 powerLimit, bool test)
54498c2ecf20Sopenharmony_ci{
54508c2ecf20Sopenharmony_ci	struct ath_regulatory *regulatory = ath9k_hw_regulatory(ah);
54518c2ecf20Sopenharmony_ci	struct ath_common *common = ath9k_hw_common(ah);
54528c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
54538c2ecf20Sopenharmony_ci	struct ar9300_modal_eep_header *modal_hdr;
54548c2ecf20Sopenharmony_ci	u8 targetPowerValT2[ar9300RateSize];
54558c2ecf20Sopenharmony_ci	u8 target_power_val_t2_eep[ar9300RateSize];
54568c2ecf20Sopenharmony_ci	u8 targetPowerValT2_tpc[ar9300RateSize];
54578c2ecf20Sopenharmony_ci	unsigned int i = 0, paprd_scale_factor = 0;
54588c2ecf20Sopenharmony_ci	u8 pwr_idx, min_pwridx = 0;
54598c2ecf20Sopenharmony_ci
54608c2ecf20Sopenharmony_ci	memset(targetPowerValT2, 0 , sizeof(targetPowerValT2));
54618c2ecf20Sopenharmony_ci
54628c2ecf20Sopenharmony_ci	/*
54638c2ecf20Sopenharmony_ci	 * Get target powers from EEPROM - our baseline for TX Power
54648c2ecf20Sopenharmony_ci	 */
54658c2ecf20Sopenharmony_ci	ar9003_hw_get_target_power_eeprom(ah, chan, targetPowerValT2);
54668c2ecf20Sopenharmony_ci
54678c2ecf20Sopenharmony_ci	if (ar9003_is_paprd_enabled(ah)) {
54688c2ecf20Sopenharmony_ci		if (IS_CHAN_2GHZ(chan))
54698c2ecf20Sopenharmony_ci			modal_hdr = &eep->modalHeader2G;
54708c2ecf20Sopenharmony_ci		else
54718c2ecf20Sopenharmony_ci			modal_hdr = &eep->modalHeader5G;
54728c2ecf20Sopenharmony_ci
54738c2ecf20Sopenharmony_ci		ah->paprd_ratemask =
54748c2ecf20Sopenharmony_ci			le32_to_cpu(modal_hdr->papdRateMaskHt20) &
54758c2ecf20Sopenharmony_ci			AR9300_PAPRD_RATE_MASK;
54768c2ecf20Sopenharmony_ci
54778c2ecf20Sopenharmony_ci		ah->paprd_ratemask_ht40 =
54788c2ecf20Sopenharmony_ci			le32_to_cpu(modal_hdr->papdRateMaskHt40) &
54798c2ecf20Sopenharmony_ci			AR9300_PAPRD_RATE_MASK;
54808c2ecf20Sopenharmony_ci
54818c2ecf20Sopenharmony_ci		paprd_scale_factor = ar9003_get_paprd_scale_factor(ah, chan);
54828c2ecf20Sopenharmony_ci		min_pwridx = IS_CHAN_HT40(chan) ? ALL_TARGET_HT40_0_8_16 :
54838c2ecf20Sopenharmony_ci						  ALL_TARGET_HT20_0_8_16;
54848c2ecf20Sopenharmony_ci
54858c2ecf20Sopenharmony_ci		if (!ah->paprd_table_write_done) {
54868c2ecf20Sopenharmony_ci			memcpy(target_power_val_t2_eep, targetPowerValT2,
54878c2ecf20Sopenharmony_ci			       sizeof(targetPowerValT2));
54888c2ecf20Sopenharmony_ci			for (i = 0; i < 24; i++) {
54898c2ecf20Sopenharmony_ci				pwr_idx = mcsidx_to_tgtpwridx(i, min_pwridx);
54908c2ecf20Sopenharmony_ci				if (ah->paprd_ratemask & (1 << i)) {
54918c2ecf20Sopenharmony_ci					if (targetPowerValT2[pwr_idx] &&
54928c2ecf20Sopenharmony_ci					    targetPowerValT2[pwr_idx] ==
54938c2ecf20Sopenharmony_ci					    target_power_val_t2_eep[pwr_idx])
54948c2ecf20Sopenharmony_ci						targetPowerValT2[pwr_idx] -=
54958c2ecf20Sopenharmony_ci							paprd_scale_factor;
54968c2ecf20Sopenharmony_ci				}
54978c2ecf20Sopenharmony_ci			}
54988c2ecf20Sopenharmony_ci		}
54998c2ecf20Sopenharmony_ci		memcpy(target_power_val_t2_eep, targetPowerValT2,
55008c2ecf20Sopenharmony_ci		       sizeof(targetPowerValT2));
55018c2ecf20Sopenharmony_ci	}
55028c2ecf20Sopenharmony_ci
55038c2ecf20Sopenharmony_ci	ar9003_hw_set_power_per_rate_table(ah, chan,
55048c2ecf20Sopenharmony_ci					   targetPowerValT2, cfgCtl,
55058c2ecf20Sopenharmony_ci					   twiceAntennaReduction,
55068c2ecf20Sopenharmony_ci					   powerLimit);
55078c2ecf20Sopenharmony_ci
55088c2ecf20Sopenharmony_ci	memcpy(targetPowerValT2_tpc, targetPowerValT2,
55098c2ecf20Sopenharmony_ci	       sizeof(targetPowerValT2));
55108c2ecf20Sopenharmony_ci
55118c2ecf20Sopenharmony_ci	if (ar9003_is_paprd_enabled(ah)) {
55128c2ecf20Sopenharmony_ci		for (i = 0; i < ar9300RateSize; i++) {
55138c2ecf20Sopenharmony_ci			if ((ah->paprd_ratemask & (1 << i)) &&
55148c2ecf20Sopenharmony_ci			    (abs(targetPowerValT2[i] -
55158c2ecf20Sopenharmony_ci				target_power_val_t2_eep[i]) >
55168c2ecf20Sopenharmony_ci			    paprd_scale_factor)) {
55178c2ecf20Sopenharmony_ci				ah->paprd_ratemask &= ~(1 << i);
55188c2ecf20Sopenharmony_ci				ath_dbg(common, EEPROM,
55198c2ecf20Sopenharmony_ci					"paprd disabled for mcs %d\n", i);
55208c2ecf20Sopenharmony_ci			}
55218c2ecf20Sopenharmony_ci		}
55228c2ecf20Sopenharmony_ci	}
55238c2ecf20Sopenharmony_ci
55248c2ecf20Sopenharmony_ci	regulatory->max_power_level = 0;
55258c2ecf20Sopenharmony_ci	for (i = 0; i < ar9300RateSize; i++) {
55268c2ecf20Sopenharmony_ci		if (targetPowerValT2[i] > regulatory->max_power_level)
55278c2ecf20Sopenharmony_ci			regulatory->max_power_level = targetPowerValT2[i];
55288c2ecf20Sopenharmony_ci	}
55298c2ecf20Sopenharmony_ci
55308c2ecf20Sopenharmony_ci	ath9k_hw_update_regulatory_maxpower(ah);
55318c2ecf20Sopenharmony_ci
55328c2ecf20Sopenharmony_ci	if (test)
55338c2ecf20Sopenharmony_ci		return;
55348c2ecf20Sopenharmony_ci
55358c2ecf20Sopenharmony_ci	for (i = 0; i < ar9300RateSize; i++) {
55368c2ecf20Sopenharmony_ci		ath_dbg(common, REGULATORY, "TPC[%02d] 0x%08x\n",
55378c2ecf20Sopenharmony_ci			i, targetPowerValT2[i]);
55388c2ecf20Sopenharmony_ci	}
55398c2ecf20Sopenharmony_ci
55408c2ecf20Sopenharmony_ci	/* Write target power array to registers */
55418c2ecf20Sopenharmony_ci	ar9003_hw_tx_power_regwrite(ah, targetPowerValT2);
55428c2ecf20Sopenharmony_ci	ar9003_hw_calibration_apply(ah, chan->channel);
55438c2ecf20Sopenharmony_ci	ar9003_paprd_set_txpower(ah, chan, targetPowerValT2);
55448c2ecf20Sopenharmony_ci
55458c2ecf20Sopenharmony_ci	ar9003_hw_selfgen_tpc_txpower(ah, chan, targetPowerValT2);
55468c2ecf20Sopenharmony_ci
55478c2ecf20Sopenharmony_ci	/* TPC initializations */
55488c2ecf20Sopenharmony_ci	if (ah->tpc_enabled) {
55498c2ecf20Sopenharmony_ci		u32 val;
55508c2ecf20Sopenharmony_ci
55518c2ecf20Sopenharmony_ci		ar9003_hw_init_rate_txpower(ah, targetPowerValT2_tpc, chan);
55528c2ecf20Sopenharmony_ci
55538c2ecf20Sopenharmony_ci		/* Enable TPC */
55548c2ecf20Sopenharmony_ci		REG_WRITE(ah, AR_PHY_PWRTX_MAX,
55558c2ecf20Sopenharmony_ci			  AR_PHY_POWER_TX_RATE_MAX_TPC_ENABLE);
55568c2ecf20Sopenharmony_ci		/* Disable per chain power reduction */
55578c2ecf20Sopenharmony_ci		val = REG_READ(ah, AR_PHY_POWER_TX_SUB);
55588c2ecf20Sopenharmony_ci		if (AR_SREV_9340(ah))
55598c2ecf20Sopenharmony_ci			REG_WRITE(ah, AR_PHY_POWER_TX_SUB,
55608c2ecf20Sopenharmony_ci				  val & 0xFFFFFFC0);
55618c2ecf20Sopenharmony_ci		else
55628c2ecf20Sopenharmony_ci			REG_WRITE(ah, AR_PHY_POWER_TX_SUB,
55638c2ecf20Sopenharmony_ci				  val & 0xFFFFF000);
55648c2ecf20Sopenharmony_ci	} else {
55658c2ecf20Sopenharmony_ci		/* Disable TPC */
55668c2ecf20Sopenharmony_ci		REG_WRITE(ah, AR_PHY_PWRTX_MAX, 0);
55678c2ecf20Sopenharmony_ci	}
55688c2ecf20Sopenharmony_ci}
55698c2ecf20Sopenharmony_ci
55708c2ecf20Sopenharmony_cistatic u16 ath9k_hw_ar9300_get_spur_channel(struct ath_hw *ah,
55718c2ecf20Sopenharmony_ci					    u16 i, bool is2GHz)
55728c2ecf20Sopenharmony_ci{
55738c2ecf20Sopenharmony_ci	return AR_NO_SPUR;
55748c2ecf20Sopenharmony_ci}
55758c2ecf20Sopenharmony_ci
55768c2ecf20Sopenharmony_cis32 ar9003_hw_get_tx_gain_idx(struct ath_hw *ah)
55778c2ecf20Sopenharmony_ci{
55788c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
55798c2ecf20Sopenharmony_ci
55808c2ecf20Sopenharmony_ci	return (eep->baseEepHeader.txrxgain >> 4) & 0xf; /* bits 7:4 */
55818c2ecf20Sopenharmony_ci}
55828c2ecf20Sopenharmony_ci
55838c2ecf20Sopenharmony_cis32 ar9003_hw_get_rx_gain_idx(struct ath_hw *ah)
55848c2ecf20Sopenharmony_ci{
55858c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
55868c2ecf20Sopenharmony_ci
55878c2ecf20Sopenharmony_ci	return (eep->baseEepHeader.txrxgain) & 0xf; /* bits 3:0 */
55888c2ecf20Sopenharmony_ci}
55898c2ecf20Sopenharmony_ci
55908c2ecf20Sopenharmony_ciu8 *ar9003_get_spur_chan_ptr(struct ath_hw *ah, bool is2ghz)
55918c2ecf20Sopenharmony_ci{
55928c2ecf20Sopenharmony_ci	return ar9003_modal_header(ah, is2ghz)->spurChans;
55938c2ecf20Sopenharmony_ci}
55948c2ecf20Sopenharmony_ci
55958c2ecf20Sopenharmony_ciunsigned int ar9003_get_paprd_scale_factor(struct ath_hw *ah,
55968c2ecf20Sopenharmony_ci					   struct ath9k_channel *chan)
55978c2ecf20Sopenharmony_ci{
55988c2ecf20Sopenharmony_ci	struct ar9300_eeprom *eep = &ah->eeprom.ar9300_eep;
55998c2ecf20Sopenharmony_ci
56008c2ecf20Sopenharmony_ci	if (IS_CHAN_2GHZ(chan))
56018c2ecf20Sopenharmony_ci		return MS(le32_to_cpu(eep->modalHeader2G.papdRateMaskHt20),
56028c2ecf20Sopenharmony_ci			  AR9300_PAPRD_SCALE_1);
56038c2ecf20Sopenharmony_ci	else {
56048c2ecf20Sopenharmony_ci		if (chan->channel >= 5700)
56058c2ecf20Sopenharmony_ci			return MS(le32_to_cpu(eep->modalHeader5G.papdRateMaskHt20),
56068c2ecf20Sopenharmony_ci				  AR9300_PAPRD_SCALE_1);
56078c2ecf20Sopenharmony_ci		else if (chan->channel >= 5400)
56088c2ecf20Sopenharmony_ci			return MS(le32_to_cpu(eep->modalHeader5G.papdRateMaskHt40),
56098c2ecf20Sopenharmony_ci				  AR9300_PAPRD_SCALE_2);
56108c2ecf20Sopenharmony_ci		else
56118c2ecf20Sopenharmony_ci			return MS(le32_to_cpu(eep->modalHeader5G.papdRateMaskHt40),
56128c2ecf20Sopenharmony_ci				  AR9300_PAPRD_SCALE_1);
56138c2ecf20Sopenharmony_ci	}
56148c2ecf20Sopenharmony_ci}
56158c2ecf20Sopenharmony_ci
56168c2ecf20Sopenharmony_cistatic u8 ar9003_get_eepmisc(struct ath_hw *ah)
56178c2ecf20Sopenharmony_ci{
56188c2ecf20Sopenharmony_ci	return ah->eeprom.ar9300_eep.baseEepHeader.opCapFlags.eepMisc;
56198c2ecf20Sopenharmony_ci}
56208c2ecf20Sopenharmony_ci
56218c2ecf20Sopenharmony_ciconst struct eeprom_ops eep_ar9300_ops = {
56228c2ecf20Sopenharmony_ci	.check_eeprom = ath9k_hw_ar9300_check_eeprom,
56238c2ecf20Sopenharmony_ci	.get_eeprom = ath9k_hw_ar9300_get_eeprom,
56248c2ecf20Sopenharmony_ci	.fill_eeprom = ath9k_hw_ar9300_fill_eeprom,
56258c2ecf20Sopenharmony_ci	.dump_eeprom = ath9k_hw_ar9003_dump_eeprom,
56268c2ecf20Sopenharmony_ci	.get_eeprom_ver = ath9k_hw_ar9300_get_eeprom_ver,
56278c2ecf20Sopenharmony_ci	.get_eeprom_rev = ath9k_hw_ar9300_get_eeprom_rev,
56288c2ecf20Sopenharmony_ci	.set_board_values = ath9k_hw_ar9300_set_board_values,
56298c2ecf20Sopenharmony_ci	.set_addac = ath9k_hw_ar9300_set_addac,
56308c2ecf20Sopenharmony_ci	.set_txpower = ath9k_hw_ar9300_set_txpower,
56318c2ecf20Sopenharmony_ci	.get_spur_channel = ath9k_hw_ar9300_get_spur_channel,
56328c2ecf20Sopenharmony_ci	.get_eepmisc = ar9003_get_eepmisc
56338c2ecf20Sopenharmony_ci};
5634