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