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, ¢ers); 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