blob: 709be347b4f99c6747355d314d363e190f3794de [file] [log] [blame]
/*
* Copyright (c) 2011-2012 Qualcomm Atheros Inc.
*
* Permission to use, copy, modify, and/or distribute this software for any
* purpose with or without fee is hereby granted, provided that the above
* copyright notice and this permission notice appear in all copies.
*
* THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
* WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
* ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
* WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
* ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
* OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
*/
#ifndef _AR6003_EEPROM_STRUCT_H_
#define _AR6003_EEPROM_STRUCT_H_
#include <stdint.h>
#define PREPACK
#define POSTPACK __attribute__ ((packed))
#define AR6003_EEP_VER_MINOR_MASK 0xFFF
#define AR6003_EEP_MINOR_VER5 0x5
#define AR6003_EEP_MINOR_VER10 0xA
#define AR6K_EEPROM_SIZE_PRIOR_VER4 1024
#define AR6K_EEPROM_SIZE_LARGEST 2048
#define AR6003_NUM_5G_CAL_PIERS 8
#define AR6003_NUM_2G_CAL_PIERS 3
#define AR6003_NUM_5G_CAL_PIERS_EXPANDED 32
#define AR6003_NUM_2G_CAL_PIERS_EXPANDED 16
#define AR6003_BCHAN_UNUSED 0xFF
#define AR6003_BOARDFLAGSEXT_PSAT_CAL_GEN_EEPROM 0x04
#define AR6003_BOARDFLAGSEXT_PSAT_CAL_ABS 0x08
#define FREQ2FBIN(x,y) ((y) ? ((x) - 2300) : (((x) - 4800) / 5))
#define FBIN2FREQ(x,y) ((y) ? ((x) + 2300) : (((x) * 5) + 4800))
#define AR6003_MAX_CHAINS 1
#define AR6003_EEPROM_MODAL_SPURS 5
#define AR6003_NUM_ALPHATHERM_CHAN_PIERS 4
#define AR6003_NUM_ALPHATHERM_TEMP_PIERS 4
#define AR6003_NUM_5G_20_TARGET_POWERS 8
#define AR6003_NUM_5G_40_TARGET_POWERS 8
#define AR6003_NUM_2G_CCK_TARGET_POWERS 2
#define AR6003_NUM_2G_20_TARGET_POWERS 3
#define AR6003_NUM_2G_40_TARGET_POWERS 3
#define AR6003_NUM_CTLS 21
#define AR6003_NUM_BAND_EDGES 8
#define AR6003_NUM_PD_GAINS 4
#define NUM_ATECAL_CHANS_2G 4
#define NUM_ATECAL_CHANS_5G 10
#define AR6003_PD_GAIN_ICEPTS 5
#define STICKY_REG_TBL_SIZE_MAX 8
#define MAX_CUSTDATA_BYTES 16
typedef enum {
WLAN_11A_CAPABILITY = 1,
WLAN_11G_CAPABILITY = 2,
WLAN_11AG_CAPABILITY = 3,
}WALN_CAPABILITY;
typedef enum {
TGTPWR_LEG_6_24 = 0,
TGTPWR_LEG_36,
TGTPWR_LEG_48,
TGTPWR_LEG_54,
TGTPWR_LEG_LAST
} TGTPWR_LEG;
typedef enum {
TGTPWR_HT_0 = 0,
TGTPWR_HT_1,
TGTPWR_HT_2,
TGTPWR_HT_3,
TGTPWR_HT_4,
TGTPWR_HT_5,
TGTPWR_HT_6,
TGTPWR_HT_7,
TGTPWR_HT_LAST
} TGTPWR_HT;
typedef PREPACK struct Ar6003_spurChanStruct {
uint8_t spurChan; /*spur mitigation enabled in the channel bitmap, 1 bit 1 channel*/
uint8_t spurABChoose; /*choose which is master spur ,spur_A or spur_B*/
uint8_t spurA_PrimSecChoose; /*choose primary and secondary spur which produce by spur_A*/
uint8_t spurB_PrimSecChoose; /*choose primary and secondary spur which produce by spur_B*/
} POSTPACK AR6003_SPUR_CHAN;
typedef union Ar6003_obdbStruct {
uint16_t value;
struct g_bits {
uint16_t paloff : 3,
qam : 3,
psk : 3,
cck : 3,
db : 3,
unused : 1;
} g_obdb;
struct a_bits {
uint16_t d2b : 3,
d3b : 3,
d4b : 3,
ob : 3,
unused : 4;
} a_obdb;
} POSTPACK AR6003_OBDB;
typedef PREPACK struct Ar6003_BaseEepHeader {
uint32_t length; // 4 B
uint16_t checksum; // 2 B
uint16_t version; // 2 B
uint16_t opCapFlags; // 2 B
uint16_t boardFlags; // 2 B
uint16_t regDmn[2]; // 4 B
uint16_t subSystemId; // 2 B
uint16_t blueToothOptions; // 2 B
uint16_t binBuildNumber; // major(4):minor(5):build(7) // 2 B
uint8_t macAddr[6]; // 6 B
uint8_t bdAddr[6]; // 6 B
uint8_t rxMask; // 1 B
uint8_t txMask; // 1 B
int8_t cckOfdmDelta; // 1 B
uint8_t custData[MAX_CUSTDATA_BYTES]; // 16 B
uint8_t reserved[4]; // 4 B reserved for custData. Sometimes custData exceed the max bytes
uint8_t spurBaseA; // 1 B
uint8_t spurBaseB; // 1 B
uint8_t spurRssiThresh; // 1 B
uint8_t HTCapFlags; // 1 B
uint8_t boardFlagsExt; // 1 B
uint8_t futureBase[6]; // 6 B
} POSTPACK AR6003_BASE_EEP_HEADER; // 68 B
// Notes:
// - IQ CAL is done by sw for every reset, here we store the default values in case IQ CAL
// is not done for whatever reason.
typedef PREPACK struct Ar6003_ModalEepHeader {
uint32_t antCtrlChain[AR6003_MAX_CHAINS]; // 4B, "chn_b0_switch_table", AntE only
uint32_t antCtrlCom1; // 4B, "com1_switch_table", AntA, B, C, D
uint32_t antCtrlCom2; // 4B, "com2_switch_table"
AR6003_OBDB ob_db; // 2B, a number of ob, db fields
uint8_t anaXtalConfig[6]; // 6B, tbd?: for xtal/synth related fields, tobe replaced with a struct
int8_t antennaGainCh[AR6003_MAX_CHAINS]; // 1B, affect antenna gain calculation
uint8_t switchSettling; // 1B, "time_switch_settling"
uint8_t swSettleHt40; // 1B, "time_switch_settling" for HT40
uint8_t xatten1Db[AR6003_MAX_CHAINS]; // 1B, "xatten1_db_0"
uint8_t xatten1Margin[AR6003_MAX_CHAINS]; // 1B, "xatten1_margin_0"
uint8_t xatten1Hyst[AR6003_MAX_CHAINS]; // 1B, "xatten1_hyst_margin_0"
uint8_t xatten2Db[AR6003_MAX_CHAINS]; // 1B, "xatten2_db_0"
uint8_t xatten2Margin[AR6003_MAX_CHAINS]; // 1B, "xatten2_margin_0"
uint8_t xatten2Hyst[AR6003_MAX_CHAINS]; // 1B, "xatten2_hyst_margin_0"
int8_t adcDesiredSize; // 1B, "adc_desired_size"
uint8_t txEndToXpaOff; // 1B, "tx_end_to_xpaa_off", "tx_end_to_xpab_off"
uint8_t txEndToRxOn; // 1B, "tx_end_to_a2_rx_on"
uint8_t txFrameToXpaOn; // 1B, "tx_frame_to_xpaa_on", "tx_frame_to_xpab_on"
uint8_t txFrameToDataStart; // 1B, "tx_frame_to_tx_d_start"
uint8_t txFrameToPaOn; // 1B, "tx_frame_to_pa_on"
uint8_t thresh62; // 1B, "cf_thresh62"
int8_t noiseFloorThreshCh[AR6003_MAX_CHAINS]; // 1B, tbd?: what to set?
int8_t rxIqCalICh[AR6003_MAX_CHAINS]; // 1B, "rx_iqcorr_q_i_coff_0"
int8_t rxIqCalQCh[AR6003_MAX_CHAINS]; // 1B, "rx_iqcorr_q_q_coff_0"
uint8_t xpaBiasLvl; // 1B, "an_top_xpabiaslvl"
uint8_t ht40PowerIncForPdadc; // 1B, affect tx power in HT40
uint8_t enableXpa; // 1B, "bb_enable_xpab | bb_enable_xpaa"
AR6003_SPUR_CHAN spurChans[AR6003_EEPROM_MODAL_SPURS]; // 4 * 5 = 20 B, tbd?:
uint8_t alphaTherm; // 1B, "alpha_therm"
uint8_t alphaThermPalOn; // 1B, "alpha_therm_pal_on"
uint8_t alphaVolt; // 1B, "alpha_volt"
uint8_t alphaVoltPalOn; // 1B, "alpha_volt_pal_on"
int8_t adcDesiredSizeHT40; // 1B, "adc_desired_size" for HT40
uint8_t paprdQuickDrop; // 1B, "bb_paprd_trainer_cntl3_cf_paprd_quick_drop"
uint8_t txGainTbl_0; // bb_tx_gain_table_0
uint8_t txGainTblDelta[16]; // bb_tx_gain_table_x (_1 to _32, 4 bits per delta) for PAL OFF??
uint8_t reserved[3];
uint32_t antCtrlExtCommon1;
uint32_t antCtrlExtCommon2;
uint8_t alphaThermChans[AR6003_NUM_ALPHATHERM_CHAN_PIERS]; // 4B, "alpha therm channels"
uint8_t alphaThermTbl[AR6003_NUM_ALPHATHERM_CHAN_PIERS][AR6003_NUM_ALPHATHERM_TEMP_PIERS]; // 16B, "alpha_therm_tbl" lowtemp midtemp1 midtemp2 hightemp
uint8_t areg_lvlctr; // 1 B
uint8_t pareg_lvlctr; // 1 B
uint8_t txGainTblMax; // 1 B
uint8_t cckInitRfGain; // 1 B
uint16_t paprdMinCorrThreshold; // 2 B
uint8_t an_rxrf_bias1_pwd_ic25vga5g; // 1 B
uint8_t futureModal[5]; // 5 B
} POSTPACK AR6003_MODAL_EEP_HEADER; // 128 B
typedef PREPACK struct Ar6003_calDataPerFreq {
uint8_t pwrPdg[AR6003_NUM_PD_GAINS][AR6003_PD_GAIN_ICEPTS]; // 20 B
uint8_t vpdPdg[AR6003_NUM_PD_GAINS][AR6003_PD_GAIN_ICEPTS]; // 20 B
} POSTPACK AR6003_CAL_DATA_PER_FREQ; // 40 B
typedef PREPACK struct Ar6003_calDataPerFreqOlpc {
int8_t olpcGainDelta; // 1B, "olpc_gain_delta"
uint8_t thermCalVal; // 1B, "therm_cal_value"
uint8_t voltCalVal; // 1B, "volt_cal_value"
int8_t olpcGainDeltaPALOn; // 1B, "olpc_gain_delta_pal_on"
} POSTPACK AR6003_CAL_DATA_PER_FREQ_OLPC; // 4 B
typedef PREPACK struct Ar6003_calDataPerFreqOlpcExpanded {
AR6003_CAL_DATA_PER_FREQ_OLPC olpcBasic; // 4B
int16_t olpcGainDelta_t10; // 2B "untruncated olpc gain delta 0.1dB resolution"
uint8_t desiredScaleCck_t10; // 1B, "desired_scale_cck"
uint8_t desiredScale6M_t10; // 1B
uint8_t desiredScale36M_t10; // 1B
uint8_t desiredScale54M_t10; // 1B
uint8_t desiredScaleMCS0HT20_t10; // 1B
uint8_t desiredScaleMCS7HT20_t10; // 1B
uint8_t desiredScaleMCS0HT40_t10; // 1B
uint8_t desiredScaleMCS7HT40_t10; // 1B
} POSTPACK AR6003_CAL_DATA_PER_FREQ_OLPC_EXPANDED; // 14 B
typedef PREPACK struct Ar6003_calDataPerFreqOlpcATEDelta {
int16_t olpcGainDelta_t10; // 2B
} POSTPACK AR6003_CAL_DATA_PER_FREQ_OLPC_FE_DELTA; // 2B
typedef PREPACK struct Ar6003_CalTargetPowerLegacy {
uint8_t bChannel;
uint8_t tPow2x[4];
} POSTPACK AR6003_CAL_TARGET_POWER_LEG; // 5B
typedef PREPACK struct Ar6003_CalTargetPowerHt {
uint8_t bChannel;
uint8_t tPow2x[8];
} POSTPACK AR6003_CAL_TARGET_POWER_HT;
typedef PREPACK struct Ar6003_CalCtlEdges {
uint8_t bChannel;
uint8_t tPower :6,
flag :2;
} POSTPACK AR6003_CAL_CTL_EDGES;
typedef PREPACK struct Ar6003_CalCtlData {
AR6003_CAL_CTL_EDGES ctlEdges[AR6003_MAX_CHAINS][AR6003_NUM_BAND_EDGES]; // 2 * 8 = 16 B
} POSTPACK AR6003_CAL_CTL_DATA; // 16 B
typedef PREPACK struct Ar6003_CalDataPerChip {
int16_t thermAdcScaledGain; // 2B, "therm_adc_scaled_gain"
int8_t thermAdcOffset; // 1B, "therm_adc_offset"
uint8_t xtalCapOutDac; // 1B, "xtal_capoutdac"
uint8_t xtalCapInDac; // 1B, "xtal_capindac"
uint8_t refBiasTrim; // 1B, tbd?: what field?
} POSTPACK AR6003_CAL_DATA_PER_CHIP; // 6 B
typedef PREPACK struct ateProvided {
uint8_t GoldenTherm;
uint8_t GoldenVolt;
uint8_t pcDac;
uint8_t vtestLCodeGolden;
int8_t vtestLVoltGolden;
uint8_t vtestHCodeGolden;
int8_t vtestHVoltGolden;
uint8_t numCalChans5G;
uint8_t numCalChans2G; // 1B
uint8_t calFreqPier5G[NUM_ATECAL_CHANS_5G]; // 10B
uint8_t calFreqPier2G[NUM_ATECAL_CHANS_2G]; // 4B
uint8_t ateZeroCalFlag; // 1B
} POSTPACK AR6003_ATE_PROVIDED_DATA; // 24B
typedef PREPACK struct stickyRegTbl {
uint32_t address;
uint32_t value;
} POSTPACK AR6003_STICKY_REG_TABLE; // 8B
#define PSAT_AN_TXRF3_RDIV2G_LSB 0 // an_txrf3_rdiv2g;
#define PSAT_AN_TXRF3_RDIV2G_MASK 0x3 // an_txrf3_rdiv2g;
#define PSAT_AN_TXRF3_PDPREDIST2G_LSB 2 // an_txrf3_pdpredist2g;
#define PSAT_AN_TXRF3_PDPREDIST2G_MASK 0x1 // an_txrf3_pdpredist2g;
#define PSAT_AN_RXTX2_MXRGAIN_LSB 3 // an_rxtx2_mxrgain;
#define PSAT_AN_RXTX2_MXRGAIN_MASK 0x3 // an_rxtx2_mxrgain;
#define PSAT_AN_RXRF_BIAS1_PWD_IC25MXR2GH_LSB 5 // an_rxrf_bias1_pwd_ic25mxr2gh;
#define PSAT_AN_RXRF_BIAS1_PWD_IC25MXR2GH_MASK 0x7 // an_rxrf_bias1_pwd_ic25mxr2gh;
#define PSAT_AN_BIAS2_PWD_IC25RXRF_LSB 8 // an_bias2_pwd_ic25rxrf;
#define PSAT_AN_BIAS2_PWD_IC25RXRF_MASK 0x7 // an_bias2_pwd_ic25rxrf;
#define PSAT_AN_BB1_I2V_CURR2X_LSB 11 // an_bb1_i2v_curr2x;
#define PSAT_AN_BB1_I2V_CURR2X_MASK 0x1 // an_bb1_i2v_curr2x;
#define PSAT_AN_TXRF6_CAPDIV2G_LSB 12 // an_txrf6_capdiv2g;
#define PSAT_AN_TXRF6_CAPDIV2G_MASK 0xF // an_txrf6_capdiv2g;
typedef PREPACK struct ar6kPSATCAL {
int16_t psat_t10;
int16_t ofdmCwDelta_t10;
int16_t cmacOlpcPsatDeltaGu_t10;
int16_t olpcGainDeltaGu_t10;
uint8_t olpcPcdac;
uint8_t psatPcdac;
uint16_t psatTuneParms;
uint16_t psatTuneParmsAlt1;
} POSTPACK AR6003_PSAT_CAL_PARMS;
typedef PREPACK struct ar6kEeprom {
// base
AR6003_BASE_EEP_HEADER baseEepHeader; // 68 B
// modal
AR6003_MODAL_EEP_HEADER modalHeader[2]; // 256 B
// CAL section
uint8_t calFreqPier5G[AR6003_NUM_5G_CAL_PIERS]; // 8 B
uint8_t calFreqPier2G[AR6003_NUM_2G_CAL_PIERS]; // 3 B
uint8_t padding1; // 1 B
AR6003_CAL_DATA_PER_FREQ_OLPC calPierData5G[AR6003_NUM_5G_CAL_PIERS]; // 4 * 8 = 32 B
AR6003_CAL_DATA_PER_FREQ_OLPC calPierData2G[AR6003_NUM_2G_CAL_PIERS]; // 4 * 3 = 12 B
// ATE CAL data from OTP
AR6003_CAL_DATA_PER_CHIP calPerChip; // 6 B
// future expansion of CAL data
AR6003_PSAT_CAL_PARMS psatCAL; // 14B
// target power
AR6003_CAL_TARGET_POWER_LEG calTargetPower5G[AR6003_NUM_5G_20_TARGET_POWERS]; // 5 * 8 = 40 B
AR6003_CAL_TARGET_POWER_HT calTargetPower5GHT20[AR6003_NUM_5G_20_TARGET_POWERS]; // 9 * 8 = 72 B
AR6003_CAL_TARGET_POWER_HT calTargetPower5GHT40[AR6003_NUM_5G_40_TARGET_POWERS]; // 9 * 8 = 72 B
AR6003_CAL_TARGET_POWER_LEG calTargetPowerCck[AR6003_NUM_2G_CCK_TARGET_POWERS]; // 5 * 2 = 10 B
AR6003_CAL_TARGET_POWER_LEG calTargetPower2G[AR6003_NUM_2G_20_TARGET_POWERS]; // 5 * 3 = 15 B
AR6003_CAL_TARGET_POWER_HT calTargetPower2GHT20[AR6003_NUM_2G_20_TARGET_POWERS]; // 9 * 3 = 27 B
AR6003_CAL_TARGET_POWER_HT calTargetPower2GHT40[AR6003_NUM_2G_40_TARGET_POWERS]; // 9 * 3 = 27 B // 263B
uint8_t psatTuneParmsAlt4_H; // 1 B // 264B
// CTL
uint8_t ctlIndex[AR6003_NUM_CTLS]; // 21 B
uint8_t psatTuneParmsAlt4_L; // 1 B
uint16_t psatTuneParmsAlt2; // 2 B
AR6003_CAL_CTL_DATA ctlData[AR6003_NUM_CTLS]; // 16 * 21 = 336 B // 360B
// total: 1024B
uint8_t calFreqPier5GExpanded[AR6003_NUM_5G_CAL_PIERS_EXPANDED]; // 32 B
uint8_t calFreqPier2GExpanded[AR6003_NUM_2G_CAL_PIERS_EXPANDED]; // 16 B
AR6003_CAL_DATA_PER_FREQ_OLPC_EXPANDED calPierData5GExpanded[AR6003_NUM_5G_CAL_PIERS_EXPANDED]; // 14 * 32 = 448 B
AR6003_CAL_DATA_PER_FREQ_OLPC_EXPANDED calPierData2GExpanded[AR6003_NUM_2G_CAL_PIERS_EXPANDED]; // 14 * 16 = 224 B
AR6003_ATE_PROVIDED_DATA ateProvidedData; // 24B
int8_t calTgtPwrBkoff2GLeg[TGTPWR_LEG_LAST]; // 4B
int8_t calTgtPwrBkoff2GHT20[TGTPWR_HT_LAST]; // 8B
int8_t calTgtPwrBkoff2GHT40[TGTPWR_HT_LAST]; // 8B
uint16_t psatTuneParmsAlt3; // 2B
uint16_t checksumExpanded; // 2B
// total: 768B
AR6003_CAL_DATA_PER_FREQ_OLPC_FE_DELTA calDataFEDelta5G[AR6003_NUM_5G_CAL_PIERS_EXPANDED]; // 2 * 32 = 64 B
AR6003_CAL_DATA_PER_FREQ_OLPC_FE_DELTA calDataFEDelta2G[AR6003_NUM_2G_CAL_PIERS_EXPANDED]; // 2 * 16 = 32 B
uint16_t psatTuneParmsAlt7; // 2B
uint16_t psatTuneParmsAlt8; // 2B
uint16_t psatTuneParmsAlt9; // 2B
int16_t cmacOlpcPsatDeltaGuMid_t10; // 2B
int16_t cmacOlpcPsatDeltaGuHigh_t10; // 2B
uint16_t psatTuneParmsAltSet[10]; // 20B
int8_t psatTuneParmsOlpcPsatCmacDelta[20]; // 20B
uint8_t padding5[42]; // 42B
//uint32_t pllClkModa;
AR6003_STICKY_REG_TABLE stickyRegTable[STICKY_REG_TBL_SIZE_MAX]; // 64B
//uint8_t stickyRegTableSize;
uint16_t psatTuneParmsAlt5; // 2B
uint16_t psatTuneParmsAlt6; // 2B
//uint16_t checksum0CAL;
// total: 256B
} POSTPACK AR6003_EEPROM; // 1024 + 768 + 256 = 2048B
#endif //_AR6003_EEPROM_STRUCT_H_