1/*- 2 * SPDX-License-Identifier: ISC 3 * 4 * Copyright (c) 2002-2008 Sam Leffler, Errno Consulting 5 * Copyright (c) 2002-2008 Atheros Communications, Inc. 6 * 7 * Permission to use, copy, modify, and/or distribute this software for any 8 * purpose with or without fee is hereby granted, provided that the above 9 * copyright notice and this permission notice appear in all copies. 10 * 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 * 19 * $FreeBSD: releng/12.0/sys/dev/ath/ath_hal/ah_eeprom_v3.h 326695 2017-12-08 15:57:29Z pfg $ 20 */ 21#ifndef _ATH_AH_EEPROM_V3_H_ 22#define _ATH_AH_EEPROM_V3_H_ 23 24#include "ah_eeprom.h" 25 26/* EEPROM defines for Version 2 & 3 AR5211 chips */ 27#define AR_EEPROM_RFSILENT 0x0f /* RF Silent/Clock Run Enable */ 28#define AR_EEPROM_MAC(i) (0x1d+(i)) /* MAC address word */ 29#define AR_EEPROM_MAGIC 0x3d /* magic number */ 30#define AR_EEPROM_PROTECT 0x3f /* EEPROM protect bits */ 31#define AR_EEPROM_PROTECT_PCIE 0x01 /* EEPROM protect bits for Condor/Swan*/ 32#define AR_EEPROM_REG_DOMAIN 0xbf /* current regulatory domain */ 33#define AR_EEPROM_ATHEROS_BASE 0xc0 /* Base of Atheros-specific data */ 34#define AR_EEPROM_ATHEROS(i) (AR_EEPROM_ATHEROS_BASE+(i)) 35#define AR_EEPROM_ATHEROS_MAX (0x400-AR_EEPROM_ATHEROS_BASE) 36#define AR_EEPROM_VERSION AR_EEPROM_ATHEROS(1) 37 38/* FLASH(EEPROM) Defines for AR531X chips */ 39#define AR_EEPROM_SIZE_LOWER 0x1b /* size info -- lower */ 40#define AR_EEPROM_SIZE_UPPER 0x1c /* size info -- upper */ 41#define AR_EEPROM_SIZE_UPPER_MASK 0xfff0 42#define AR_EEPROM_SIZE_UPPER_SHIFT 4 43#define AR_EEPROM_SIZE_ENDLOC_SHIFT 12 44#define AR_EEPROM_ATHEROS_MAX_LOC 0x400 45#define AR_EEPROM_ATHEROS_MAX_OFF (AR_EEPROM_ATHEROS_MAX_LOC-AR_EEPROM_ATHEROS_BASE) 46 47/* regulatory capabilities offsets */ 48#define AR_EEPROM_REG_CAPABILITIES_OFFSET 0xCA 49#define AR_EEPROM_REG_CAPABILITIES_OFFSET_PRE4_0 0xCF /* prior to 4.0 */ 50 51/* regulatory capabilities */ 52#define AR_EEPROM_EEREGCAP_EN_FCC_MIDBAND 0x0040 53#define AR_EEPROM_EEREGCAP_EN_KK_U1_EVEN 0x0080 54#define AR_EEPROM_EEREGCAP_EN_KK_U2 0x0100 55#define AR_EEPROM_EEREGCAP_EN_KK_MIDBAND 0x0200 56#define AR_EEPROM_EEREGCAP_EN_KK_U1_ODD 0x0400 57#define AR_EEPROM_EEREGCAP_EN_KK_NEW_11A 0x0800 58 59/* regulatory capabilities prior to eeprom version 4.0 */ 60#define AR_EEPROM_EEREGCAP_EN_KK_U1_ODD_PRE4_0 0x4000 61#define AR_EEPROM_EEREGCAP_EN_KK_NEW_11A_PRE4_0 0x8000 62 63/* 64 * AR2413 (includes AR5413) 65 */ 66#define AR_EEPROM_SERIAL_NUM_OFFSET 0xB0 /* EEPROM serial number */ 67#define AR_EEPROM_SERIAL_NUM_SIZE 12 /* EEPROM serial number size */ 68#define AR_EEPROM_CAPABILITIES_OFFSET 0xC9 /* EEPROM Location of capabilities */ 69 70#define AR_EEPROM_EEPCAP_COMPRESS_DIS 0x0001 71#define AR_EEPROM_EEPCAP_AES_DIS 0x0002 72#define AR_EEPROM_EEPCAP_FASTFRAME_DIS 0x0004 73#define AR_EEPROM_EEPCAP_BURST_DIS 0x0008 74#define AR_EEPROM_EEPCAP_MAXQCU 0x01F0 75#define AR_EEPROM_EEPCAP_MAXQCU_S 4 76#define AR_EEPROM_EEPCAP_HEAVY_CLIP_EN 0x0200 77#define AR_EEPROM_EEPCAP_KC_ENTRIES 0xF000 78#define AR_EEPROM_EEPCAP_KC_ENTRIES_S 12 79 80/* XXX used to index various EEPROM-derived data structures */ 81enum { 82 headerInfo11A = 0, 83 headerInfo11B = 1, 84 headerInfo11G = 2, 85}; 86 87#define GROUPS_OFFSET3_2 0x100 /* groups offset for ver3.2 and earlier */ 88#define GROUPS_OFFSET3_3 0x150 /* groups offset for ver3.3 */ 89/* relative offset of GROUPi to GROUPS_OFFSET */ 90#define GROUP1_OFFSET 0x0 91#define GROUP2_OFFSET 0x5 92#define GROUP3_OFFSET 0x37 93#define GROUP4_OFFSET 0x46 94#define GROUP5_OFFSET 0x55 95#define GROUP6_OFFSET 0x65 96#define GROUP7_OFFSET 0x69 97#define GROUP8_OFFSET 0x6f 98 99/* RF silent fields in EEPROM */ 100#define AR_EEPROM_RFSILENT_GPIO_SEL 0x001c 101#define AR_EEPROM_RFSILENT_GPIO_SEL_S 2 102#define AR_EEPROM_RFSILENT_POLARITY 0x0002 103#define AR_EEPROM_RFSILENT_POLARITY_S 1 104 105/* Protect Bits RP is read protect, WP is write protect */ 106#define AR_EEPROM_PROTECT_RP_0_31 0x0001 107#define AR_EEPROM_PROTECT_WP_0_31 0x0002 108#define AR_EEPROM_PROTECT_RP_32_63 0x0004 109#define AR_EEPROM_PROTECT_WP_32_63 0x0008 110#define AR_EEPROM_PROTECT_RP_64_127 0x0010 111#define AR_EEPROM_PROTECT_WP_64_127 0x0020 112#define AR_EEPROM_PROTECT_RP_128_191 0x0040 113#define AR_EEPROM_PROTECT_WP_128_191 0x0080 114#define AR_EEPROM_PROTECT_RP_192_207 0x0100 115#define AR_EEPROM_PROTECT_WP_192_207 0x0200 116#define AR_EEPROM_PROTECT_RP_208_223 0x0400 117#define AR_EEPROM_PROTECT_WP_208_223 0x0800 118#define AR_EEPROM_PROTECT_RP_224_239 0x1000 119#define AR_EEPROM_PROTECT_WP_224_239 0x2000 120#define AR_EEPROM_PROTECT_RP_240_255 0x4000 121#define AR_EEPROM_PROTECT_WP_240_255 0x8000 122 123#define AR_EEPROM_MODAL_SPURS 5 124#define AR_SPUR_5413_1 1640 /* Freq 2464 */ 125#define AR_SPUR_5413_2 1200 /* Freq 2420 */ 126 127/* 128 * EEPROM fixed point conversion scale factors. 129 * NB: if you change one be sure to keep the other in sync. 130 */ 131#define EEP_SCALE 100 /* conversion scale to avoid fp arith */ 132#define EEP_DELTA 10 /* SCALE/10, to avoid arith divide */ 133 134#define PWR_MIN 0 135#define PWR_MAX 3150 /* 31.5 * SCALE */ 136#define PWR_STEP 50 /* 0.5 * SCALE */ 137/* Keep 2 above defines together */ 138 139#define NUM_11A_EEPROM_CHANNELS 10 140#define NUM_2_4_EEPROM_CHANNELS 3 141#define NUM_PCDAC_VALUES 11 142#define NUM_TEST_FREQUENCIES 8 143#define NUM_EDGES 8 144#define NUM_INTERCEPTS 11 145#define FREQ_MASK 0x7f 146#define FREQ_MASK_3_3 0xff /* expanded in version 3.3 */ 147#define PCDAC_MASK 0x3f 148#define POWER_MASK 0x3f 149#define NON_EDGE_FLAG_MASK 0x40 150#define CHANNEL_POWER_INFO 8 151#define OBDB_UNSET 0xffff 152#define CHANNEL_UNUSED 0xff 153#define SCALE_OC_DELTA(_x) (((_x) * 2) / 10) 154 155/* Used during pcdac table construction */ 156#define PCDAC_START 1 157#define PCDAC_STOP 63 158#define PCDAC_STEP 1 159#define PWR_TABLE_SIZE 64 160#define MAX_RATE_POWER 63 161 162/* Used during power/rate table construction */ 163#define NUM_CTLS 16 164#define NUM_CTLS_3_3 32 /* expanded in version 3.3 */ 165#define NUM_CTLS_MAX NUM_CTLS_3_3 166 167typedef struct fullPcdacStruct { 168 uint16_t channelValue; 169 uint16_t pcdacMin; 170 uint16_t pcdacMax; 171 uint16_t numPcdacValues; 172 uint16_t PcdacValues[64]; 173 /* power is 32bit since in dest it is scaled */ 174 int16_t PwrValues[64]; 175} FULL_PCDAC_STRUCT; 176 177typedef struct dataPerChannel { 178 uint16_t channelValue; 179 uint16_t pcdacMin; 180 uint16_t pcdacMax; 181 uint16_t numPcdacValues; 182 uint16_t PcdacValues[NUM_PCDAC_VALUES]; 183 /* NB: power is 32bit since in dest it is scaled */ 184 int16_t PwrValues[NUM_PCDAC_VALUES]; 185} DATA_PER_CHANNEL; 186 187/* points to the appropriate pcdac structs in the above struct based on mode */ 188typedef struct pcdacsEeprom { 189 const uint16_t *pChannelList; 190 uint16_t numChannels; 191 const DATA_PER_CHANNEL *pDataPerChannel; 192} PCDACS_EEPROM; 193 194typedef struct trgtPowerInfo { 195 uint16_t twicePwr54; 196 uint16_t twicePwr48; 197 uint16_t twicePwr36; 198 uint16_t twicePwr6_24; 199 uint16_t testChannel; 200} TRGT_POWER_INFO; 201 202typedef struct trgtPowerAllModes { 203 uint16_t numTargetPwr_11a; 204 TRGT_POWER_INFO trgtPwr_11a[NUM_TEST_FREQUENCIES]; 205 uint16_t numTargetPwr_11g; 206 TRGT_POWER_INFO trgtPwr_11g[3]; 207 uint16_t numTargetPwr_11b; 208 TRGT_POWER_INFO trgtPwr_11b[2]; 209} TRGT_POWER_ALL_MODES; 210 211typedef struct cornerCalInfo { 212 uint16_t gSel; 213 uint16_t pd84; 214 uint16_t pd90; 215 uint16_t clip; 216} CORNER_CAL_INFO; 217 218/* 219 * EEPROM version 4 definitions 220 */ 221#define NUM_XPD_PER_CHANNEL 4 222#define NUM_POINTS_XPD0 4 223#define NUM_POINTS_XPD3 3 224#define IDEAL_10dB_INTERCEPT_2G 35 225#define IDEAL_10dB_INTERCEPT_5G 55 226 227#define TENX_OFDM_CCK_DELTA_INIT 15 /* power 1.5 dbm */ 228#define TENX_CH14_FILTER_CCK_DELTA_INIT 15 /* power 1.5 dbm */ 229#define CCK_OFDM_GAIN_DELTA 15 230 231#define NUM_TARGET_POWER_LOCATIONS_11B 4 232#define NUM_TARGET_POWER_LOCATIONS_11G 6 233 234typedef struct { 235 uint16_t xpd_gain; 236 uint16_t numPcdacs; 237 uint16_t pcdac[NUM_POINTS_XPD0]; 238 int16_t pwr_t4[NUM_POINTS_XPD0]; /* or gainF */ 239} EXPN_DATA_PER_XPD_5112; 240 241typedef struct { 242 uint16_t channelValue; 243 int16_t maxPower_t4; 244 EXPN_DATA_PER_XPD_5112 pDataPerXPD[NUM_XPD_PER_CHANNEL]; 245} EXPN_DATA_PER_CHANNEL_5112; 246 247typedef struct { 248 uint16_t *pChannels; 249 uint16_t numChannels; 250 uint16_t xpdMask; /* mask of permitted xpd_gains */ 251 EXPN_DATA_PER_CHANNEL_5112 *pDataPerChannel; 252} EEPROM_POWER_EXPN_5112; 253 254typedef struct { 255 uint16_t channelValue; 256 uint16_t pcd1_xg0; 257 int16_t pwr1_xg0; 258 uint16_t pcd2_delta_xg0; 259 int16_t pwr2_xg0; 260 uint16_t pcd3_delta_xg0; 261 int16_t pwr3_xg0; 262 uint16_t pcd4_delta_xg0; 263 int16_t pwr4_xg0; 264 int16_t maxPower_t4; 265 int16_t pwr1_xg3; /* pcdac = 20 */ 266 int16_t pwr2_xg3; /* pcdac = 35 */ 267 int16_t pwr3_xg3; /* pcdac = 63 */ 268 /* XXX - Should be pwr1_xg2, etc to agree with documentation */ 269} EEPROM_DATA_PER_CHANNEL_5112; 270 271typedef struct { 272 uint16_t pChannels[NUM_11A_EEPROM_CHANNELS]; 273 uint16_t numChannels; 274 uint16_t xpdMask; /* mask of permitted xpd_gains */ 275 EEPROM_DATA_PER_CHANNEL_5112 pDataPerChannel[NUM_11A_EEPROM_CHANNELS]; 276} EEPROM_POWER_5112; 277 278/* 279 * EEPROM version 5 definitions (Griffin, et. al.). 280 */ 281#define NUM_2_4_EEPROM_CHANNELS_2413 4 282#define NUM_11A_EEPROM_CHANNELS_2413 10 283#define PWR_TABLE_SIZE_2413 128 284 285/* Used during pdadc construction */ 286#define MAX_NUM_PDGAINS_PER_CHANNEL 4 287#define NUM_PDGAINS_PER_CHANNEL 2 288#define NUM_POINTS_LAST_PDGAIN 5 289#define NUM_POINTS_OTHER_PDGAINS 4 290#define XPD_GAIN1_GEN5 3 291#define XPD_GAIN2_GEN5 1 292#define MAX_PWR_RANGE_IN_HALF_DB 64 293#define PD_GAIN_BOUNDARY_STRETCH_IN_HALF_DB 4 294 295typedef struct { 296 uint16_t pd_gain; 297 uint16_t numVpd; 298 uint16_t Vpd[NUM_POINTS_LAST_PDGAIN]; 299 int16_t pwr_t4[NUM_POINTS_LAST_PDGAIN]; /* or gainF */ 300} RAW_DATA_PER_PDGAIN_2413; 301 302typedef struct { 303 uint16_t channelValue; 304 int16_t maxPower_t4; 305 uint16_t numPdGains; /* # Pd Gains per channel */ 306 RAW_DATA_PER_PDGAIN_2413 pDataPerPDGain[MAX_NUM_PDGAINS_PER_CHANNEL]; 307} RAW_DATA_PER_CHANNEL_2413; 308 309/* XXX: assumes NUM_11A_EEPROM_CHANNELS_2413 >= NUM_2_4_EEPROM_CHANNELS_2413 ??? */ 310typedef struct { 311 uint16_t pChannels[NUM_11A_EEPROM_CHANNELS_2413]; 312 uint16_t numChannels; 313 uint16_t xpd_mask; /* mask of permitted xpd_gains */ 314 RAW_DATA_PER_CHANNEL_2413 pDataPerChannel[NUM_11A_EEPROM_CHANNELS_2413]; 315} RAW_DATA_STRUCT_2413; 316 317typedef struct { 318 uint16_t channelValue; 319 uint16_t numPdGains; 320 uint16_t Vpd_I[MAX_NUM_PDGAINS_PER_CHANNEL]; 321 int16_t pwr_I[MAX_NUM_PDGAINS_PER_CHANNEL]; 322 uint16_t Vpd_delta[NUM_POINTS_LAST_PDGAIN] 323 [MAX_NUM_PDGAINS_PER_CHANNEL]; 324 int16_t pwr_delta_t2[NUM_POINTS_LAST_PDGAIN] 325 [MAX_NUM_PDGAINS_PER_CHANNEL]; 326 int16_t maxPower_t4; 327} EEPROM_DATA_PER_CHANNEL_2413; 328 329typedef struct { 330 uint16_t pChannels[NUM_11A_EEPROM_CHANNELS_2413]; 331 uint16_t numChannels; 332 uint16_t xpd_mask; /* mask of permitted xpd_gains */ 333 EEPROM_DATA_PER_CHANNEL_2413 pDataPerChannel[NUM_11A_EEPROM_CHANNELS_2413]; 334} EEPROM_DATA_STRUCT_2413; 335 336/* 337 * Information retrieved from EEPROM. 338 */ 339typedef struct { 340 uint16_t ee_version; /* Version field */ 341 uint16_t ee_protect; /* EEPROM protect field */ 342 uint16_t ee_regdomain; /* Regulatory domain */ 343 344 /* General Device Parameters */ 345 uint16_t ee_turbo5Disable; 346 uint16_t ee_turbo2Disable; 347 uint16_t ee_rfKill; 348 uint16_t ee_deviceType; 349 uint16_t ee_turbo2WMaxPower5; 350 uint16_t ee_turbo2WMaxPower2; 351 uint16_t ee_xrTargetPower5; 352 uint16_t ee_xrTargetPower2; 353 uint16_t ee_Amode; 354 uint16_t ee_regCap; 355 uint16_t ee_Bmode; 356 uint16_t ee_Gmode; 357 int8_t ee_antennaGainMax[2]; 358 uint16_t ee_xtnd5GSupport; 359 uint8_t ee_cckOfdmPwrDelta; 360 uint8_t ee_exist32kHzCrystal; 361 uint16_t ee_targetPowersStart; 362 uint16_t ee_fixedBias5; 363 uint16_t ee_fixedBias2; 364 uint16_t ee_cckOfdmGainDelta; 365 uint16_t ee_scaledCh14FilterCckDelta; 366 uint16_t ee_eepMap; 367 uint16_t ee_earStart; 368 369 /* 5 GHz / 2.4 GHz CKK / 2.4 GHz OFDM common parameters */ 370 uint16_t ee_switchSettling[3]; 371 uint16_t ee_txrxAtten[3]; 372 uint16_t ee_txEndToXLNAOn[3]; 373 uint16_t ee_thresh62[3]; 374 uint16_t ee_txEndToXPAOff[3]; 375 uint16_t ee_txFrameToXPAOn[3]; 376 int8_t ee_adcDesiredSize[3]; /* 8-bit signed value */ 377 int8_t ee_pgaDesiredSize[3]; /* 8-bit signed value */ 378 int16_t ee_noiseFloorThresh[3]; 379 uint16_t ee_xlnaGain[3]; 380 uint16_t ee_xgain[3]; 381 uint16_t ee_xpd[3]; 382 uint16_t ee_antennaControl[11][3]; 383 uint16_t ee_falseDetectBackoff[3]; 384 uint16_t ee_gainI[3]; 385 uint16_t ee_rxtxMargin[3]; 386 387 /* new parameters added for the AR2413 */ 388 HAL_BOOL ee_disableXr5; 389 HAL_BOOL ee_disableXr2; 390 uint16_t ee_eepMap2PowerCalStart; 391 uint16_t ee_capField; 392 393 uint16_t ee_switchSettlingTurbo[2]; 394 uint16_t ee_txrxAttenTurbo[2]; 395 int8_t ee_adcDesiredSizeTurbo[2]; 396 int8_t ee_pgaDesiredSizeTurbo[2]; 397 uint16_t ee_rxtxMarginTurbo[2]; 398 399 /* 5 GHz parameters */ 400 uint16_t ee_ob1; 401 uint16_t ee_db1; 402 uint16_t ee_ob2; 403 uint16_t ee_db2; 404 uint16_t ee_ob3; 405 uint16_t ee_db3; 406 uint16_t ee_ob4; 407 uint16_t ee_db4; 408 409 /* 2.4 GHz parameters */ 410 uint16_t ee_obFor24; 411 uint16_t ee_dbFor24; 412 uint16_t ee_obFor24g; 413 uint16_t ee_dbFor24g; 414 uint16_t ee_ob2GHz[2]; 415 uint16_t ee_db2GHz[2]; 416 uint16_t ee_numCtls; 417 uint16_t ee_ctl[NUM_CTLS_MAX]; 418 uint16_t ee_iqCalI[2]; 419 uint16_t ee_iqCalQ[2]; 420 uint16_t ee_calPier11g[NUM_2_4_EEPROM_CHANNELS]; 421 uint16_t ee_calPier11b[NUM_2_4_EEPROM_CHANNELS]; 422 423 /* corner calibration information */ 424 CORNER_CAL_INFO ee_cornerCal; 425 426 uint16_t ee_opCap; 427 428 /* 11a info */ 429 uint16_t ee_channels11a[NUM_11A_EEPROM_CHANNELS]; 430 uint16_t ee_numChannels11a; 431 DATA_PER_CHANNEL ee_dataPerChannel11a[NUM_11A_EEPROM_CHANNELS]; 432 433 uint16_t ee_numChannels2_4; 434 uint16_t ee_channels11g[NUM_2_4_EEPROM_CHANNELS]; 435 uint16_t ee_channels11b[NUM_2_4_EEPROM_CHANNELS]; 436 uint16_t ee_spurChans[AR_EEPROM_MODAL_SPURS][2]; 437 438 /* 11g info */ 439 DATA_PER_CHANNEL ee_dataPerChannel11g[NUM_2_4_EEPROM_CHANNELS]; 440 441 /* 11b info */ 442 DATA_PER_CHANNEL ee_dataPerChannel11b[NUM_2_4_EEPROM_CHANNELS]; 443 444 TRGT_POWER_ALL_MODES ee_tpow; 445 446 RD_EDGES_POWER ee_rdEdgesPower[NUM_EDGES*NUM_CTLS_MAX]; 447 448 union { 449 EEPROM_POWER_EXPN_5112 eu_modePowerArray5112[3]; 450 RAW_DATA_STRUCT_2413 eu_rawDataset2413[3]; 451 } ee_u; 452} HAL_EEPROM; 453 454/* write-around defines */ 455#define ee_numTargetPwr_11a ee_tpow.numTargetPwr_11a 456#define ee_trgtPwr_11a ee_tpow.trgtPwr_11a 457#define ee_numTargetPwr_11g ee_tpow.numTargetPwr_11g 458#define ee_trgtPwr_11g ee_tpow.trgtPwr_11g 459#define ee_numTargetPwr_11b ee_tpow.numTargetPwr_11b 460#define ee_trgtPwr_11b ee_tpow.trgtPwr_11b 461#define ee_modePowerArray5112 ee_u.eu_modePowerArray5112 462#define ee_rawDataset2413 ee_u.eu_rawDataset2413 463#endif /* _ATH_AH_EEPROM_V3_H_ */ 464