summaryrefslogtreecommitdiffstats
path: root/ah_eeprom_v3.h
diff options
context:
space:
mode:
Diffstat (limited to 'ah_eeprom_v3.h')
-rw-r--r--ah_eeprom_v3.h462
1 files changed, 462 insertions, 0 deletions
diff --git a/ah_eeprom_v3.h b/ah_eeprom_v3.h
new file mode 100644
index 0000000..9f30c72
--- /dev/null
+++ b/ah_eeprom_v3.h
@@ -0,0 +1,462 @@
+/*
+ * Copyright (c) 2002-2008 Sam Leffler, Errno Consulting
+ * Copyright (c) 2002-2008 Atheros Communications, 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.
+ *
+ * $Id: ah_eeprom_v3.h,v 1.2 2008/11/10 04:08:00 sam Exp $
+ */
+#ifndef _ATH_AH_EEPROM_V3_H_
+#define _ATH_AH_EEPROM_V3_H_
+
+#include "ah_eeprom.h"
+
+/* EEPROM defines for Version 2 & 3 AR5211 chips */
+#define AR_EEPROM_RFSILENT 0x0f /* RF Silent/Clock Run Enable */
+#define AR_EEPROM_MAC(i) (0x1d+(i)) /* MAC address word */
+#define AR_EEPROM_MAGIC 0x3d /* magic number */
+#define AR_EEPROM_PROTECT 0x3f /* EEPROM protect bits */
+#define AR_EEPROM_PROTECT_PCIE 0x01 /* EEPROM protect bits for Condor/Swan*/
+#define AR_EEPROM_REG_DOMAIN 0xbf /* current regulatory domain */
+#define AR_EEPROM_ATHEROS_BASE 0xc0 /* Base of Atheros-specific data */
+#define AR_EEPROM_ATHEROS(i) (AR_EEPROM_ATHEROS_BASE+(i))
+#define AR_EEPROM_ATHEROS_MAX (0x400-AR_EEPROM_ATHEROS_BASE)
+#define AR_EEPROM_VERSION AR_EEPROM_ATHEROS(1)
+
+/* FLASH(EEPROM) Defines for AR531X chips */
+#define AR_EEPROM_SIZE_LOWER 0x1b /* size info -- lower */
+#define AR_EEPROM_SIZE_UPPER 0x1c /* size info -- upper */
+#define AR_EEPROM_SIZE_UPPER_MASK 0xfff0
+#define AR_EEPROM_SIZE_UPPER_SHIFT 4
+#define AR_EEPROM_SIZE_ENDLOC_SHIFT 12
+#define AR_EEPROM_ATHEROS_MAX_LOC 0x400
+#define AR_EEPROM_ATHEROS_MAX_OFF (AR_EEPROM_ATHEROS_MAX_LOC-AR_EEPROM_ATHEROS_BASE)
+
+/* regulatory capabilities offsets */
+#define AR_EEPROM_REG_CAPABILITIES_OFFSET 0xCA
+#define AR_EEPROM_REG_CAPABILITIES_OFFSET_PRE4_0 0xCF /* prior to 4.0 */
+
+/* regulatory capabilities */
+#define AR_EEPROM_EEREGCAP_EN_FCC_MIDBAND 0x0040
+#define AR_EEPROM_EEREGCAP_EN_KK_U1_EVEN 0x0080
+#define AR_EEPROM_EEREGCAP_EN_KK_U2 0x0100
+#define AR_EEPROM_EEREGCAP_EN_KK_MIDBAND 0x0200
+#define AR_EEPROM_EEREGCAP_EN_KK_U1_ODD 0x0400
+#define AR_EEPROM_EEREGCAP_EN_KK_NEW_11A 0x0800
+
+/* regulatory capabilities prior to eeprom version 4.0 */
+#define AR_EEPROM_EEREGCAP_EN_KK_U1_ODD_PRE4_0 0x4000
+#define AR_EEPROM_EEREGCAP_EN_KK_NEW_11A_PRE4_0 0x8000
+
+/*
+ * AR2413 (includes AR5413)
+ */
+#define AR_EEPROM_SERIAL_NUM_OFFSET 0xB0 /* EEPROM serial number */
+#define AR_EEPROM_SERIAL_NUM_SIZE 12 /* EEPROM serial number size */
+#define AR_EEPROM_CAPABILITIES_OFFSET 0xC9 /* EEPROM Location of capabilities */
+
+#define AR_EEPROM_EEPCAP_COMPRESS_DIS 0x0001
+#define AR_EEPROM_EEPCAP_AES_DIS 0x0002
+#define AR_EEPROM_EEPCAP_FASTFRAME_DIS 0x0004
+#define AR_EEPROM_EEPCAP_BURST_DIS 0x0008
+#define AR_EEPROM_EEPCAP_MAXQCU 0x01F0
+#define AR_EEPROM_EEPCAP_MAXQCU_S 4
+#define AR_EEPROM_EEPCAP_HEAVY_CLIP_EN 0x0200
+#define AR_EEPROM_EEPCAP_KC_ENTRIES 0xF000
+#define AR_EEPROM_EEPCAP_KC_ENTRIES_S 12
+
+/* XXX used to index various EEPROM-derived data structures */
+enum {
+ headerInfo11A = 0,
+ headerInfo11B = 1,
+ headerInfo11G = 2,
+};
+
+#define GROUPS_OFFSET3_2 0x100 /* groups offset for ver3.2 and earlier */
+#define GROUPS_OFFSET3_3 0x150 /* groups offset for ver3.3 */
+/* relative offset of GROUPi to GROUPS_OFFSET */
+#define GROUP1_OFFSET 0x0
+#define GROUP2_OFFSET 0x5
+#define GROUP3_OFFSET 0x37
+#define GROUP4_OFFSET 0x46
+#define GROUP5_OFFSET 0x55
+#define GROUP6_OFFSET 0x65
+#define GROUP7_OFFSET 0x69
+#define GROUP8_OFFSET 0x6f
+
+/* RF silent fields in EEPROM */
+#define AR_EEPROM_RFSILENT_GPIO_SEL 0x001c
+#define AR_EEPROM_RFSILENT_GPIO_SEL_S 2
+#define AR_EEPROM_RFSILENT_POLARITY 0x0002
+#define AR_EEPROM_RFSILENT_POLARITY_S 1
+
+/* Protect Bits RP is read protect, WP is write protect */
+#define AR_EEPROM_PROTECT_RP_0_31 0x0001
+#define AR_EEPROM_PROTECT_WP_0_31 0x0002
+#define AR_EEPROM_PROTECT_RP_32_63 0x0004
+#define AR_EEPROM_PROTECT_WP_32_63 0x0008
+#define AR_EEPROM_PROTECT_RP_64_127 0x0010
+#define AR_EEPROM_PROTECT_WP_64_127 0x0020
+#define AR_EEPROM_PROTECT_RP_128_191 0x0040
+#define AR_EEPROM_PROTECT_WP_128_191 0x0080
+#define AR_EEPROM_PROTECT_RP_192_207 0x0100
+#define AR_EEPROM_PROTECT_WP_192_207 0x0200
+#define AR_EEPROM_PROTECT_RP_208_223 0x0400
+#define AR_EEPROM_PROTECT_WP_208_223 0x0800
+#define AR_EEPROM_PROTECT_RP_224_239 0x1000
+#define AR_EEPROM_PROTECT_WP_224_239 0x2000
+#define AR_EEPROM_PROTECT_RP_240_255 0x4000
+#define AR_EEPROM_PROTECT_WP_240_255 0x8000
+
+#define AR_EEPROM_MODAL_SPURS 5
+#define AR_SPUR_5413_1 1640 /* Freq 2464 */
+#define AR_SPUR_5413_2 1200 /* Freq 2420 */
+
+/*
+ * EEPROM fixed point conversion scale factors.
+ * NB: if you change one be sure to keep the other in sync.
+ */
+#define EEP_SCALE 100 /* conversion scale to avoid fp arith */
+#define EEP_DELTA 10 /* SCALE/10, to avoid arith divide */
+
+#define PWR_MIN 0
+#define PWR_MAX 3150 /* 31.5 * SCALE */
+#define PWR_STEP 50 /* 0.5 * SCALE */
+/* Keep 2 above defines together */
+
+#define NUM_11A_EEPROM_CHANNELS 10
+#define NUM_2_4_EEPROM_CHANNELS 3
+#define NUM_PCDAC_VALUES 11
+#define NUM_TEST_FREQUENCIES 8
+#define NUM_EDGES 8
+#define NUM_INTERCEPTS 11
+#define FREQ_MASK 0x7f
+#define FREQ_MASK_3_3 0xff /* expanded in version 3.3 */
+#define PCDAC_MASK 0x3f
+#define POWER_MASK 0x3f
+#define NON_EDGE_FLAG_MASK 0x40
+#define CHANNEL_POWER_INFO 8
+#define OBDB_UNSET 0xffff
+#define CHANNEL_UNUSED 0xff
+#define SCALE_OC_DELTA(_x) (((_x) * 2) / 10)
+
+/* Used during pcdac table construction */
+#define PCDAC_START 1
+#define PCDAC_STOP 63
+#define PCDAC_STEP 1
+#define PWR_TABLE_SIZE 64
+#define MAX_RATE_POWER 63
+
+/* Used during power/rate table construction */
+#define NUM_CTLS 16
+#define NUM_CTLS_3_3 32 /* expanded in version 3.3 */
+#define NUM_CTLS_MAX NUM_CTLS_3_3
+
+typedef struct fullPcdacStruct {
+ uint16_t channelValue;
+ uint16_t pcdacMin;
+ uint16_t pcdacMax;
+ uint16_t numPcdacValues;
+ uint16_t PcdacValues[64];
+ /* power is 32bit since in dest it is scaled */
+ int16_t PwrValues[64];
+} FULL_PCDAC_STRUCT;
+
+typedef struct dataPerChannel {
+ uint16_t channelValue;
+ uint16_t pcdacMin;
+ uint16_t pcdacMax;
+ uint16_t numPcdacValues;
+ uint16_t PcdacValues[NUM_PCDAC_VALUES];
+ /* NB: power is 32bit since in dest it is scaled */
+ int16_t PwrValues[NUM_PCDAC_VALUES];
+} DATA_PER_CHANNEL;
+
+/* points to the appropriate pcdac structs in the above struct based on mode */
+typedef struct pcdacsEeprom {
+ const uint16_t *pChannelList;
+ uint16_t numChannels;
+ const DATA_PER_CHANNEL *pDataPerChannel;
+} PCDACS_EEPROM;
+
+typedef struct trgtPowerInfo {
+ uint16_t twicePwr54;
+ uint16_t twicePwr48;
+ uint16_t twicePwr36;
+ uint16_t twicePwr6_24;
+ uint16_t testChannel;
+} TRGT_POWER_INFO;
+
+typedef struct trgtPowerAllModes {
+ uint16_t numTargetPwr_11a;
+ TRGT_POWER_INFO trgtPwr_11a[NUM_TEST_FREQUENCIES];
+ uint16_t numTargetPwr_11g;
+ TRGT_POWER_INFO trgtPwr_11g[3];
+ uint16_t numTargetPwr_11b;
+ TRGT_POWER_INFO trgtPwr_11b[2];
+} TRGT_POWER_ALL_MODES;
+
+typedef struct cornerCalInfo {
+ uint16_t gSel;
+ uint16_t pd84;
+ uint16_t pd90;
+ uint16_t clip;
+} CORNER_CAL_INFO;
+
+/*
+ * EEPROM version 4 definitions
+ */
+#define NUM_XPD_PER_CHANNEL 4
+#define NUM_POINTS_XPD0 4
+#define NUM_POINTS_XPD3 3
+#define IDEAL_10dB_INTERCEPT_2G 35
+#define IDEAL_10dB_INTERCEPT_5G 55
+
+#define TENX_OFDM_CCK_DELTA_INIT 15 /* power 1.5 dbm */
+#define TENX_CH14_FILTER_CCK_DELTA_INIT 15 /* power 1.5 dbm */
+#define CCK_OFDM_GAIN_DELTA 15
+
+#define NUM_TARGET_POWER_LOCATIONS_11B 4
+#define NUM_TARGET_POWER_LOCATIONS_11G 6
+
+
+typedef struct {
+ uint16_t xpd_gain;
+ uint16_t numPcdacs;
+ uint16_t pcdac[NUM_POINTS_XPD0];
+ int16_t pwr_t4[NUM_POINTS_XPD0]; /* or gainF */
+} EXPN_DATA_PER_XPD_5112;
+
+typedef struct {
+ uint16_t channelValue;
+ int16_t maxPower_t4;
+ EXPN_DATA_PER_XPD_5112 pDataPerXPD[NUM_XPD_PER_CHANNEL];
+} EXPN_DATA_PER_CHANNEL_5112;
+
+typedef struct {
+ uint16_t *pChannels;
+ uint16_t numChannels;
+ uint16_t xpdMask; /* mask of permitted xpd_gains */
+ EXPN_DATA_PER_CHANNEL_5112 *pDataPerChannel;
+} EEPROM_POWER_EXPN_5112;
+
+typedef struct {
+ uint16_t channelValue;
+ uint16_t pcd1_xg0;
+ int16_t pwr1_xg0;
+ uint16_t pcd2_delta_xg0;
+ int16_t pwr2_xg0;
+ uint16_t pcd3_delta_xg0;
+ int16_t pwr3_xg0;
+ uint16_t pcd4_delta_xg0;
+ int16_t pwr4_xg0;
+ int16_t maxPower_t4;
+ int16_t pwr1_xg3; /* pcdac = 20 */
+ int16_t pwr2_xg3; /* pcdac = 35 */
+ int16_t pwr3_xg3; /* pcdac = 63 */
+ /* XXX - Should be pwr1_xg2, etc to agree with documentation */
+} EEPROM_DATA_PER_CHANNEL_5112;
+
+typedef struct {
+ uint16_t pChannels[NUM_11A_EEPROM_CHANNELS];
+ uint16_t numChannels;
+ uint16_t xpdMask; /* mask of permitted xpd_gains */
+ EEPROM_DATA_PER_CHANNEL_5112 pDataPerChannel[NUM_11A_EEPROM_CHANNELS];
+} EEPROM_POWER_5112;
+
+/*
+ * EEPROM version 5 definitions (Griffin, et. al.).
+ */
+#define NUM_2_4_EEPROM_CHANNELS_2413 4
+#define NUM_11A_EEPROM_CHANNELS_2413 10
+#define PWR_TABLE_SIZE_2413 128
+
+/* Used during pdadc construction */
+#define MAX_NUM_PDGAINS_PER_CHANNEL 4
+#define NUM_PDGAINS_PER_CHANNEL 2
+#define NUM_POINTS_LAST_PDGAIN 5
+#define NUM_POINTS_OTHER_PDGAINS 4
+#define XPD_GAIN1_GEN5 3
+#define XPD_GAIN2_GEN5 1
+#define MAX_PWR_RANGE_IN_HALF_DB 64
+#define PD_GAIN_BOUNDARY_STRETCH_IN_HALF_DB 4
+
+typedef struct {
+ uint16_t pd_gain;
+ uint16_t numVpd;
+ uint16_t Vpd[NUM_POINTS_LAST_PDGAIN];
+ int16_t pwr_t4[NUM_POINTS_LAST_PDGAIN]; /* or gainF */
+} RAW_DATA_PER_PDGAIN_2413;
+
+typedef struct {
+ uint16_t channelValue;
+ int16_t maxPower_t4;
+ uint16_t numPdGains; /* # Pd Gains per channel */
+ RAW_DATA_PER_PDGAIN_2413 pDataPerPDGain[MAX_NUM_PDGAINS_PER_CHANNEL];
+} RAW_DATA_PER_CHANNEL_2413;
+
+/* XXX: assumes NUM_11A_EEPROM_CHANNELS_2413 >= NUM_2_4_EEPROM_CHANNELS_2413 ??? */
+typedef struct {
+ uint16_t pChannels[NUM_11A_EEPROM_CHANNELS_2413];
+ uint16_t numChannels;
+ uint16_t xpd_mask; /* mask of permitted xpd_gains */
+ RAW_DATA_PER_CHANNEL_2413 pDataPerChannel[NUM_11A_EEPROM_CHANNELS_2413];
+} RAW_DATA_STRUCT_2413;
+
+typedef struct {
+ uint16_t channelValue;
+ uint16_t numPdGains;
+ uint16_t Vpd_I[MAX_NUM_PDGAINS_PER_CHANNEL];
+ int16_t pwr_I[MAX_NUM_PDGAINS_PER_CHANNEL];
+ uint16_t Vpd_delta[NUM_POINTS_LAST_PDGAIN]
+ [MAX_NUM_PDGAINS_PER_CHANNEL];
+ int16_t pwr_delta_t2[NUM_POINTS_LAST_PDGAIN]
+ [MAX_NUM_PDGAINS_PER_CHANNEL];
+ int16_t maxPower_t4;
+} EEPROM_DATA_PER_CHANNEL_2413;
+
+typedef struct {
+ uint16_t pChannels[NUM_11A_EEPROM_CHANNELS_2413];
+ uint16_t numChannels;
+ uint16_t xpd_mask; /* mask of permitted xpd_gains */
+ EEPROM_DATA_PER_CHANNEL_2413 pDataPerChannel[NUM_11A_EEPROM_CHANNELS_2413];
+} EEPROM_DATA_STRUCT_2413;
+
+/*
+ * Information retrieved from EEPROM.
+ */
+typedef struct {
+ uint16_t ee_version; /* Version field */
+ uint16_t ee_protect; /* EEPROM protect field */
+ uint16_t ee_regdomain; /* Regulatory domain */
+
+ /* General Device Parameters */
+ uint16_t ee_turbo5Disable;
+ uint16_t ee_turbo2Disable;
+ uint16_t ee_rfKill;
+ uint16_t ee_deviceType;
+ uint16_t ee_turbo2WMaxPower5;
+ uint16_t ee_turbo2WMaxPower2;
+ uint16_t ee_xrTargetPower5;
+ uint16_t ee_xrTargetPower2;
+ uint16_t ee_Amode;
+ uint16_t ee_regCap;
+ uint16_t ee_Bmode;
+ uint16_t ee_Gmode;
+ int8_t ee_antennaGainMax[2];
+ uint16_t ee_xtnd5GSupport;
+ uint8_t ee_cckOfdmPwrDelta;
+ uint8_t ee_exist32kHzCrystal;
+ uint16_t ee_targetPowersStart;
+ uint16_t ee_fixedBias5;
+ uint16_t ee_fixedBias2;
+ uint16_t ee_cckOfdmGainDelta;
+ uint16_t ee_scaledCh14FilterCckDelta;
+ uint16_t ee_eepMap;
+ uint16_t ee_earStart;
+
+ /* 5 GHz / 2.4 GHz CKK / 2.4 GHz OFDM common parameters */
+ uint16_t ee_switchSettling[3];
+ uint16_t ee_txrxAtten[3];
+ uint16_t ee_txEndToXLNAOn[3];
+ uint16_t ee_thresh62[3];
+ uint16_t ee_txEndToXPAOff[3];
+ uint16_t ee_txFrameToXPAOn[3];
+ int8_t ee_adcDesiredSize[3]; /* 8-bit signed value */
+ int8_t ee_pgaDesiredSize[3]; /* 8-bit signed value */
+ int16_t ee_noiseFloorThresh[3];
+ uint16_t ee_xlnaGain[3];
+ uint16_t ee_xgain[3];
+ uint16_t ee_xpd[3];
+ uint16_t ee_antennaControl[11][3];
+ uint16_t ee_falseDetectBackoff[3];
+ uint16_t ee_gainI[3];
+ uint16_t ee_rxtxMargin[3];
+
+ /* new parameters added for the AR2413 */
+ HAL_BOOL ee_disableXr5;
+ HAL_BOOL ee_disableXr2;
+ uint16_t ee_eepMap2PowerCalStart;
+ uint16_t ee_capField;
+
+ uint16_t ee_switchSettlingTurbo[2];
+ uint16_t ee_txrxAttenTurbo[2];
+ int8_t ee_adcDesiredSizeTurbo[2];
+ int8_t ee_pgaDesiredSizeTurbo[2];
+ uint16_t ee_rxtxMarginTurbo[2];
+
+ /* 5 GHz parameters */
+ uint16_t ee_ob1;
+ uint16_t ee_db1;
+ uint16_t ee_ob2;
+ uint16_t ee_db2;
+ uint16_t ee_ob3;
+ uint16_t ee_db3;
+ uint16_t ee_ob4;
+ uint16_t ee_db4;
+
+ /* 2.4 GHz parameters */
+ uint16_t ee_obFor24;
+ uint16_t ee_dbFor24;
+ uint16_t ee_obFor24g;
+ uint16_t ee_dbFor24g;
+ uint16_t ee_ob2GHz[2];
+ uint16_t ee_db2GHz[2];
+ uint16_t ee_numCtls;
+ uint16_t ee_ctl[NUM_CTLS_MAX];
+ uint16_t ee_iqCalI[2];
+ uint16_t ee_iqCalQ[2];
+ uint16_t ee_calPier11g[NUM_2_4_EEPROM_CHANNELS];
+ uint16_t ee_calPier11b[NUM_2_4_EEPROM_CHANNELS];
+
+ /* corner calibration information */
+ CORNER_CAL_INFO ee_cornerCal;
+
+ uint16_t ee_opCap;
+
+ /* 11a info */
+ uint16_t ee_channels11a[NUM_11A_EEPROM_CHANNELS];
+ uint16_t ee_numChannels11a;
+ DATA_PER_CHANNEL ee_dataPerChannel11a[NUM_11A_EEPROM_CHANNELS];
+
+ uint16_t ee_numChannels2_4;
+ uint16_t ee_channels11g[NUM_2_4_EEPROM_CHANNELS];
+ uint16_t ee_channels11b[NUM_2_4_EEPROM_CHANNELS];
+ uint16_t ee_spurChans[AR_EEPROM_MODAL_SPURS][2];
+
+ /* 11g info */
+ DATA_PER_CHANNEL ee_dataPerChannel11g[NUM_2_4_EEPROM_CHANNELS];
+
+ /* 11b info */
+ DATA_PER_CHANNEL ee_dataPerChannel11b[NUM_2_4_EEPROM_CHANNELS];
+
+ TRGT_POWER_ALL_MODES ee_tpow;
+
+ RD_EDGES_POWER ee_rdEdgesPower[NUM_EDGES*NUM_CTLS_MAX];
+
+ union {
+ EEPROM_POWER_EXPN_5112 eu_modePowerArray5112[3];
+ RAW_DATA_STRUCT_2413 eu_rawDataset2413[3];
+ } ee_u;
+} HAL_EEPROM;
+
+/* write-around defines */
+#define ee_numTargetPwr_11a ee_tpow.numTargetPwr_11a
+#define ee_trgtPwr_11a ee_tpow.trgtPwr_11a
+#define ee_numTargetPwr_11g ee_tpow.numTargetPwr_11g
+#define ee_trgtPwr_11g ee_tpow.trgtPwr_11g
+#define ee_numTargetPwr_11b ee_tpow.numTargetPwr_11b
+#define ee_trgtPwr_11b ee_tpow.trgtPwr_11b
+#define ee_modePowerArray5112 ee_u.eu_modePowerArray5112
+#define ee_rawDataset2413 ee_u.eu_rawDataset2413
+#endif /* _ATH_AH_EEPROM_V3_H_ */
OpenPOWER on IntegriCloud