Path: blob/main/sys/dev/ath/ath_hal/ah_eeprom_v3.h
39537 views
/*-1* SPDX-License-Identifier: ISC2*3* Copyright (c) 2002-2008 Sam Leffler, Errno Consulting4* Copyright (c) 2002-2008 Atheros Communications, Inc.5*6* Permission to use, copy, modify, and/or distribute this software for any7* purpose with or without fee is hereby granted, provided that the above8* copyright notice and this permission notice appear in all copies.9*10* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES11* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF12* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR13* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES14* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN15* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF16* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.17*/18#ifndef _ATH_AH_EEPROM_V3_H_19#define _ATH_AH_EEPROM_V3_H_2021#include "ah_eeprom.h"2223/* EEPROM defines for Version 2 & 3 AR5211 chips */24#define AR_EEPROM_RFSILENT 0x0f /* RF Silent/Clock Run Enable */25#define AR_EEPROM_MAC(i) (0x1d+(i)) /* MAC address word */26#define AR_EEPROM_MAGIC 0x3d /* magic number */27#define AR_EEPROM_PROTECT 0x3f /* EEPROM protect bits */28#define AR_EEPROM_PROTECT_PCIE 0x01 /* EEPROM protect bits for Condor/Swan*/29#define AR_EEPROM_REG_DOMAIN 0xbf /* current regulatory domain */30#define AR_EEPROM_ATHEROS_BASE 0xc0 /* Base of Atheros-specific data */31#define AR_EEPROM_ATHEROS(i) (AR_EEPROM_ATHEROS_BASE+(i))32#define AR_EEPROM_ATHEROS_MAX (0x400-AR_EEPROM_ATHEROS_BASE)33#define AR_EEPROM_VERSION AR_EEPROM_ATHEROS(1)3435/* FLASH(EEPROM) Defines for AR531X chips */36#define AR_EEPROM_SIZE_LOWER 0x1b /* size info -- lower */37#define AR_EEPROM_SIZE_UPPER 0x1c /* size info -- upper */38#define AR_EEPROM_SIZE_UPPER_MASK 0xfff039#define AR_EEPROM_SIZE_UPPER_SHIFT 440#define AR_EEPROM_SIZE_ENDLOC_SHIFT 1241#define AR_EEPROM_ATHEROS_MAX_LOC 0x40042#define AR_EEPROM_ATHEROS_MAX_OFF (AR_EEPROM_ATHEROS_MAX_LOC-AR_EEPROM_ATHEROS_BASE)4344/* regulatory capabilities offsets */45#define AR_EEPROM_REG_CAPABILITIES_OFFSET 0xCA46#define AR_EEPROM_REG_CAPABILITIES_OFFSET_PRE4_0 0xCF /* prior to 4.0 */4748/* regulatory capabilities */49#define AR_EEPROM_EEREGCAP_EN_FCC_MIDBAND 0x004050#define AR_EEPROM_EEREGCAP_EN_KK_U1_EVEN 0x008051#define AR_EEPROM_EEREGCAP_EN_KK_U2 0x010052#define AR_EEPROM_EEREGCAP_EN_KK_MIDBAND 0x020053#define AR_EEPROM_EEREGCAP_EN_KK_U1_ODD 0x040054#define AR_EEPROM_EEREGCAP_EN_KK_NEW_11A 0x08005556/* regulatory capabilities prior to eeprom version 4.0 */57#define AR_EEPROM_EEREGCAP_EN_KK_U1_ODD_PRE4_0 0x400058#define AR_EEPROM_EEREGCAP_EN_KK_NEW_11A_PRE4_0 0x80005960/*61* AR2413 (includes AR5413)62*/63#define AR_EEPROM_SERIAL_NUM_OFFSET 0xB0 /* EEPROM serial number */64#define AR_EEPROM_SERIAL_NUM_SIZE 12 /* EEPROM serial number size */65#define AR_EEPROM_CAPABILITIES_OFFSET 0xC9 /* EEPROM Location of capabilities */6667#define AR_EEPROM_EEPCAP_COMPRESS_DIS 0x000168#define AR_EEPROM_EEPCAP_AES_DIS 0x000269#define AR_EEPROM_EEPCAP_FASTFRAME_DIS 0x000470#define AR_EEPROM_EEPCAP_BURST_DIS 0x000871#define AR_EEPROM_EEPCAP_MAXQCU 0x01F072#define AR_EEPROM_EEPCAP_MAXQCU_S 473#define AR_EEPROM_EEPCAP_HEAVY_CLIP_EN 0x020074#define AR_EEPROM_EEPCAP_KC_ENTRIES 0xF00075#define AR_EEPROM_EEPCAP_KC_ENTRIES_S 127677/* XXX used to index various EEPROM-derived data structures */78enum {79headerInfo11A = 0,80headerInfo11B = 1,81headerInfo11G = 2,82};8384#define GROUPS_OFFSET3_2 0x100 /* groups offset for ver3.2 and earlier */85#define GROUPS_OFFSET3_3 0x150 /* groups offset for ver3.3 */86/* relative offset of GROUPi to GROUPS_OFFSET */87#define GROUP1_OFFSET 0x088#define GROUP2_OFFSET 0x589#define GROUP3_OFFSET 0x3790#define GROUP4_OFFSET 0x4691#define GROUP5_OFFSET 0x5592#define GROUP6_OFFSET 0x6593#define GROUP7_OFFSET 0x6994#define GROUP8_OFFSET 0x6f9596/* RF silent fields in EEPROM */97#define AR_EEPROM_RFSILENT_GPIO_SEL 0x001c98#define AR_EEPROM_RFSILENT_GPIO_SEL_S 299#define AR_EEPROM_RFSILENT_POLARITY 0x0002100#define AR_EEPROM_RFSILENT_POLARITY_S 1101102/* Protect Bits RP is read protect, WP is write protect */103#define AR_EEPROM_PROTECT_RP_0_31 0x0001104#define AR_EEPROM_PROTECT_WP_0_31 0x0002105#define AR_EEPROM_PROTECT_RP_32_63 0x0004106#define AR_EEPROM_PROTECT_WP_32_63 0x0008107#define AR_EEPROM_PROTECT_RP_64_127 0x0010108#define AR_EEPROM_PROTECT_WP_64_127 0x0020109#define AR_EEPROM_PROTECT_RP_128_191 0x0040110#define AR_EEPROM_PROTECT_WP_128_191 0x0080111#define AR_EEPROM_PROTECT_RP_192_207 0x0100112#define AR_EEPROM_PROTECT_WP_192_207 0x0200113#define AR_EEPROM_PROTECT_RP_208_223 0x0400114#define AR_EEPROM_PROTECT_WP_208_223 0x0800115#define AR_EEPROM_PROTECT_RP_224_239 0x1000116#define AR_EEPROM_PROTECT_WP_224_239 0x2000117#define AR_EEPROM_PROTECT_RP_240_255 0x4000118#define AR_EEPROM_PROTECT_WP_240_255 0x8000119120#define AR_EEPROM_MODAL_SPURS 5121#define AR_SPUR_5413_1 1640 /* Freq 2464 */122#define AR_SPUR_5413_2 1200 /* Freq 2420 */123124/*125* EEPROM fixed point conversion scale factors.126* NB: if you change one be sure to keep the other in sync.127*/128#define EEP_SCALE 100 /* conversion scale to avoid fp arith */129#define EEP_DELTA 10 /* SCALE/10, to avoid arith divide */130131#define PWR_MIN 0132#define PWR_MAX 3150 /* 31.5 * SCALE */133#define PWR_STEP 50 /* 0.5 * SCALE */134/* Keep 2 above defines together */135136#define NUM_11A_EEPROM_CHANNELS 10137#define NUM_2_4_EEPROM_CHANNELS 3138#define NUM_PCDAC_VALUES 11139#define NUM_TEST_FREQUENCIES 8140#define NUM_EDGES 8141#define NUM_INTERCEPTS 11142#define FREQ_MASK 0x7f143#define FREQ_MASK_3_3 0xff /* expanded in version 3.3 */144#define PCDAC_MASK 0x3f145#define POWER_MASK 0x3f146#define NON_EDGE_FLAG_MASK 0x40147#define CHANNEL_POWER_INFO 8148#define OBDB_UNSET 0xffff149#define CHANNEL_UNUSED 0xff150#define SCALE_OC_DELTA(_x) (((_x) * 2) / 10)151152/* Used during pcdac table construction */153#define PCDAC_START 1154#define PCDAC_STOP 63155#define PCDAC_STEP 1156#define PWR_TABLE_SIZE 64157#define MAX_RATE_POWER 63158159/* Used during power/rate table construction */160#define NUM_CTLS 16161#define NUM_CTLS_3_3 32 /* expanded in version 3.3 */162#define NUM_CTLS_MAX NUM_CTLS_3_3163164typedef struct fullPcdacStruct {165uint16_t channelValue;166uint16_t pcdacMin;167uint16_t pcdacMax;168uint16_t numPcdacValues;169uint16_t PcdacValues[64];170/* power is 32bit since in dest it is scaled */171int16_t PwrValues[64];172} FULL_PCDAC_STRUCT;173174typedef struct dataPerChannel {175uint16_t channelValue;176uint16_t pcdacMin;177uint16_t pcdacMax;178uint16_t numPcdacValues;179uint16_t PcdacValues[NUM_PCDAC_VALUES];180/* NB: power is 32bit since in dest it is scaled */181int16_t PwrValues[NUM_PCDAC_VALUES];182} DATA_PER_CHANNEL;183184/* points to the appropriate pcdac structs in the above struct based on mode */185typedef struct pcdacsEeprom {186const uint16_t *pChannelList;187uint16_t numChannels;188const DATA_PER_CHANNEL *pDataPerChannel;189} PCDACS_EEPROM;190191typedef struct trgtPowerInfo {192uint16_t twicePwr54;193uint16_t twicePwr48;194uint16_t twicePwr36;195uint16_t twicePwr6_24;196uint16_t testChannel;197} TRGT_POWER_INFO;198199typedef struct trgtPowerAllModes {200uint16_t numTargetPwr_11a;201TRGT_POWER_INFO trgtPwr_11a[NUM_TEST_FREQUENCIES];202uint16_t numTargetPwr_11g;203TRGT_POWER_INFO trgtPwr_11g[3];204uint16_t numTargetPwr_11b;205TRGT_POWER_INFO trgtPwr_11b[2];206} TRGT_POWER_ALL_MODES;207208typedef struct cornerCalInfo {209uint16_t gSel;210uint16_t pd84;211uint16_t pd90;212uint16_t clip;213} CORNER_CAL_INFO;214215/*216* EEPROM version 4 definitions217*/218#define NUM_XPD_PER_CHANNEL 4219#define NUM_POINTS_XPD0 4220#define NUM_POINTS_XPD3 3221#define IDEAL_10dB_INTERCEPT_2G 35222#define IDEAL_10dB_INTERCEPT_5G 55223224#define TENX_OFDM_CCK_DELTA_INIT 15 /* power 1.5 dbm */225#define TENX_CH14_FILTER_CCK_DELTA_INIT 15 /* power 1.5 dbm */226#define CCK_OFDM_GAIN_DELTA 15227228#define NUM_TARGET_POWER_LOCATIONS_11B 4229#define NUM_TARGET_POWER_LOCATIONS_11G 6230231typedef struct {232uint16_t xpd_gain;233uint16_t numPcdacs;234uint16_t pcdac[NUM_POINTS_XPD0];235int16_t pwr_t4[NUM_POINTS_XPD0]; /* or gainF */236} EXPN_DATA_PER_XPD_5112;237238typedef struct {239uint16_t channelValue;240int16_t maxPower_t4;241EXPN_DATA_PER_XPD_5112 pDataPerXPD[NUM_XPD_PER_CHANNEL];242} EXPN_DATA_PER_CHANNEL_5112;243244typedef struct {245uint16_t *pChannels;246uint16_t numChannels;247uint16_t xpdMask; /* mask of permitted xpd_gains */248EXPN_DATA_PER_CHANNEL_5112 *pDataPerChannel;249} EEPROM_POWER_EXPN_5112;250251typedef struct {252uint16_t channelValue;253uint16_t pcd1_xg0;254int16_t pwr1_xg0;255uint16_t pcd2_delta_xg0;256int16_t pwr2_xg0;257uint16_t pcd3_delta_xg0;258int16_t pwr3_xg0;259uint16_t pcd4_delta_xg0;260int16_t pwr4_xg0;261int16_t maxPower_t4;262int16_t pwr1_xg3; /* pcdac = 20 */263int16_t pwr2_xg3; /* pcdac = 35 */264int16_t pwr3_xg3; /* pcdac = 63 */265/* XXX - Should be pwr1_xg2, etc to agree with documentation */266} EEPROM_DATA_PER_CHANNEL_5112;267268typedef struct {269uint16_t pChannels[NUM_11A_EEPROM_CHANNELS];270uint16_t numChannels;271uint16_t xpdMask; /* mask of permitted xpd_gains */272EEPROM_DATA_PER_CHANNEL_5112 pDataPerChannel[NUM_11A_EEPROM_CHANNELS];273} EEPROM_POWER_5112;274275/*276* EEPROM version 5 definitions (Griffin, et. al.).277*/278#define NUM_2_4_EEPROM_CHANNELS_2413 4279#define NUM_11A_EEPROM_CHANNELS_2413 10280#define PWR_TABLE_SIZE_2413 128281282/* Used during pdadc construction */283#define MAX_NUM_PDGAINS_PER_CHANNEL 4284#define NUM_PDGAINS_PER_CHANNEL 2285#define NUM_POINTS_LAST_PDGAIN 5286#define NUM_POINTS_OTHER_PDGAINS 4287#define XPD_GAIN1_GEN5 3288#define XPD_GAIN2_GEN5 1289#define MAX_PWR_RANGE_IN_HALF_DB 64290#define PD_GAIN_BOUNDARY_STRETCH_IN_HALF_DB 4291292typedef struct {293uint16_t pd_gain;294uint16_t numVpd;295uint16_t Vpd[NUM_POINTS_LAST_PDGAIN];296int16_t pwr_t4[NUM_POINTS_LAST_PDGAIN]; /* or gainF */297} RAW_DATA_PER_PDGAIN_2413;298299typedef struct {300uint16_t channelValue;301int16_t maxPower_t4;302uint16_t numPdGains; /* # Pd Gains per channel */303RAW_DATA_PER_PDGAIN_2413 pDataPerPDGain[MAX_NUM_PDGAINS_PER_CHANNEL];304} RAW_DATA_PER_CHANNEL_2413;305306/* XXX: assumes NUM_11A_EEPROM_CHANNELS_2413 >= NUM_2_4_EEPROM_CHANNELS_2413 ??? */307typedef struct {308uint16_t pChannels[NUM_11A_EEPROM_CHANNELS_2413];309uint16_t numChannels;310uint16_t xpd_mask; /* mask of permitted xpd_gains */311RAW_DATA_PER_CHANNEL_2413 pDataPerChannel[NUM_11A_EEPROM_CHANNELS_2413];312} RAW_DATA_STRUCT_2413;313314typedef struct {315uint16_t channelValue;316uint16_t numPdGains;317uint16_t Vpd_I[MAX_NUM_PDGAINS_PER_CHANNEL];318int16_t pwr_I[MAX_NUM_PDGAINS_PER_CHANNEL];319uint16_t Vpd_delta[NUM_POINTS_LAST_PDGAIN]320[MAX_NUM_PDGAINS_PER_CHANNEL];321int16_t pwr_delta_t2[NUM_POINTS_LAST_PDGAIN]322[MAX_NUM_PDGAINS_PER_CHANNEL];323int16_t maxPower_t4;324} EEPROM_DATA_PER_CHANNEL_2413;325326typedef struct {327uint16_t pChannels[NUM_11A_EEPROM_CHANNELS_2413];328uint16_t numChannels;329uint16_t xpd_mask; /* mask of permitted xpd_gains */330EEPROM_DATA_PER_CHANNEL_2413 pDataPerChannel[NUM_11A_EEPROM_CHANNELS_2413];331} EEPROM_DATA_STRUCT_2413;332333/*334* Information retrieved from EEPROM.335*/336typedef struct {337uint16_t ee_version; /* Version field */338uint16_t ee_protect; /* EEPROM protect field */339uint16_t ee_regdomain; /* Regulatory domain */340341/* General Device Parameters */342uint16_t ee_turbo5Disable;343uint16_t ee_turbo2Disable;344uint16_t ee_rfKill;345uint16_t ee_deviceType;346uint16_t ee_turbo2WMaxPower5;347uint16_t ee_turbo2WMaxPower2;348uint16_t ee_xrTargetPower5;349uint16_t ee_xrTargetPower2;350uint16_t ee_Amode;351uint16_t ee_regCap;352uint16_t ee_Bmode;353uint16_t ee_Gmode;354int8_t ee_antennaGainMax[2];355uint16_t ee_xtnd5GSupport;356uint8_t ee_cckOfdmPwrDelta;357uint8_t ee_exist32kHzCrystal;358uint16_t ee_targetPowersStart;359uint16_t ee_fixedBias5;360uint16_t ee_fixedBias2;361uint16_t ee_cckOfdmGainDelta;362uint16_t ee_scaledCh14FilterCckDelta;363uint16_t ee_eepMap;364uint16_t ee_earStart;365366/* 5 GHz / 2.4 GHz CKK / 2.4 GHz OFDM common parameters */367uint16_t ee_switchSettling[3];368uint16_t ee_txrxAtten[3];369uint16_t ee_txEndToXLNAOn[3];370uint16_t ee_thresh62[3];371uint16_t ee_txEndToXPAOff[3];372uint16_t ee_txFrameToXPAOn[3];373int8_t ee_adcDesiredSize[3]; /* 8-bit signed value */374int8_t ee_pgaDesiredSize[3]; /* 8-bit signed value */375int16_t ee_noiseFloorThresh[3];376uint16_t ee_xlnaGain[3];377uint16_t ee_xgain[3];378uint16_t ee_xpd[3];379uint16_t ee_antennaControl[11][3];380uint16_t ee_falseDetectBackoff[3];381uint16_t ee_gainI[3];382uint16_t ee_rxtxMargin[3];383384/* new parameters added for the AR2413 */385HAL_BOOL ee_disableXr5;386HAL_BOOL ee_disableXr2;387uint16_t ee_eepMap2PowerCalStart;388uint16_t ee_capField;389390uint16_t ee_switchSettlingTurbo[2];391uint16_t ee_txrxAttenTurbo[2];392int8_t ee_adcDesiredSizeTurbo[2];393int8_t ee_pgaDesiredSizeTurbo[2];394uint16_t ee_rxtxMarginTurbo[2];395396/* 5 GHz parameters */397uint16_t ee_ob1;398uint16_t ee_db1;399uint16_t ee_ob2;400uint16_t ee_db2;401uint16_t ee_ob3;402uint16_t ee_db3;403uint16_t ee_ob4;404uint16_t ee_db4;405406/* 2.4 GHz parameters */407uint16_t ee_obFor24;408uint16_t ee_dbFor24;409uint16_t ee_obFor24g;410uint16_t ee_dbFor24g;411uint16_t ee_ob2GHz[2];412uint16_t ee_db2GHz[2];413uint16_t ee_numCtls;414uint16_t ee_ctl[NUM_CTLS_MAX];415uint16_t ee_iqCalI[2];416uint16_t ee_iqCalQ[2];417uint16_t ee_calPier11g[NUM_2_4_EEPROM_CHANNELS];418uint16_t ee_calPier11b[NUM_2_4_EEPROM_CHANNELS];419420/* corner calibration information */421CORNER_CAL_INFO ee_cornerCal;422423uint16_t ee_opCap;424425/* 11a info */426uint16_t ee_channels11a[NUM_11A_EEPROM_CHANNELS];427uint16_t ee_numChannels11a;428DATA_PER_CHANNEL ee_dataPerChannel11a[NUM_11A_EEPROM_CHANNELS];429430uint16_t ee_numChannels2_4;431uint16_t ee_channels11g[NUM_2_4_EEPROM_CHANNELS];432uint16_t ee_channels11b[NUM_2_4_EEPROM_CHANNELS];433uint16_t ee_spurChans[AR_EEPROM_MODAL_SPURS][2];434435/* 11g info */436DATA_PER_CHANNEL ee_dataPerChannel11g[NUM_2_4_EEPROM_CHANNELS];437438/* 11b info */439DATA_PER_CHANNEL ee_dataPerChannel11b[NUM_2_4_EEPROM_CHANNELS];440441TRGT_POWER_ALL_MODES ee_tpow;442443RD_EDGES_POWER ee_rdEdgesPower[NUM_EDGES*NUM_CTLS_MAX];444445union {446EEPROM_POWER_EXPN_5112 eu_modePowerArray5112[3];447RAW_DATA_STRUCT_2413 eu_rawDataset2413[3];448} ee_u;449} HAL_EEPROM;450451/* write-around defines */452#define ee_numTargetPwr_11a ee_tpow.numTargetPwr_11a453#define ee_trgtPwr_11a ee_tpow.trgtPwr_11a454#define ee_numTargetPwr_11g ee_tpow.numTargetPwr_11g455#define ee_trgtPwr_11g ee_tpow.trgtPwr_11g456#define ee_numTargetPwr_11b ee_tpow.numTargetPwr_11b457#define ee_trgtPwr_11b ee_tpow.trgtPwr_11b458#define ee_modePowerArray5112 ee_u.eu_modePowerArray5112459#define ee_rawDataset2413 ee_u.eu_rawDataset2413460#endif /* _ATH_AH_EEPROM_V3_H_ */461462463