1/* 2 * Copyright (c) 2013 Qualcomm Atheros, Inc. 3 * 4 * Permission to use, copy, modify, and/or distribute this software for any 5 * purpose with or without fee is hereby granted, provided that the above 6 * copyright notice and this permission notice appear in all copies. 7 * 8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 9 * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 10 * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 11 * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 12 * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 13 * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 14 * PERFORMANCE OF THIS SOFTWARE. 15 */ 16 17#ifndef _ATH_AR9300_EEP_H_ 18#define _ATH_AR9300_EEP_H_ 19 20#include "opt_ah.h" 21#include "ah.h" 22 23#if defined(WIN32) || defined(WIN64) 24#pragma pack (push, ar9300, 1) 25#endif 26 27/* Ensure that AH_BYTE_ORDER is defined */ 28#ifndef AH_BYTE_ORDER 29#error AH_BYTE_ORDER needs to be defined! 30#endif 31 32/* FreeBSD extras - should be in ah_eeprom.h ? */ 33#define AR_EEPROM_EEPCAP_COMPRESS_DIS 0x0001 34#define AR_EEPROM_EEPCAP_AES_DIS 0x0002 35#define AR_EEPROM_EEPCAP_FASTFRAME_DIS 0x0004 36#define AR_EEPROM_EEPCAP_BURST_DIS 0x0008 37#define AR_EEPROM_EEPCAP_MAXQCU 0x01F0 38#define AR_EEPROM_EEPCAP_MAXQCU_S 4 39#define AR_EEPROM_EEPCAP_HEAVY_CLIP_EN 0x0200 40#define AR_EEPROM_EEPCAP_KC_ENTRIES 0xF000 41#define AR_EEPROM_EEPCAP_KC_ENTRIES_S 12 42 43 44#define MSTATE 100 45#define MOUTPUT 2048 46#define MDEFAULT 15 47#define MVALUE 100 48 49enum CompressAlgorithm 50{ 51 _compress_none = 0, 52 _compress_lzma, 53 _compress_pairs, 54 _compress_block, 55 _compress4, 56 _compress5, 57 _compress6, 58 _compress7, 59}; 60 61 62enum 63{ 64 calibration_data_none = 0, 65 calibration_data_dram, 66 calibration_data_flash, 67 calibration_data_eeprom, 68 calibration_data_otp, 69#ifdef ATH_CAL_NAND_FLASH 70 calibration_data_nand, 71#endif 72 CalibrationDataDontLoad, 73}; 74#define HOST_CALDATA_SIZE (16*1024) 75 76// 77// DO NOT CHANGE THE DEFINTIONS OF THESE SYMBOLS. 78// Add additional definitions to the end. 79// Yes, the first one is 2. Do not use 0 or 1. 80// 81enum Ar9300EepromTemplate 82{ 83 ar9300_eeprom_template_generic = 2, 84 ar9300_eeprom_template_hb112 = 3, 85 ar9300_eeprom_template_hb116 = 4, 86 ar9300_eeprom_template_xb112 = 5, 87 ar9300_eeprom_template_xb113 = 6, 88 ar9300_eeprom_template_xb114 = 7, 89 ar9300_eeprom_template_tb417 = 8, 90 ar9300_eeprom_template_ap111 = 9, 91 ar9300_eeprom_template_ap121 = 10, 92 ar9300_eeprom_template_hornet_generic = 11, 93 ar9300_eeprom_template_wasp_2 = 12, 94 ar9300_eeprom_template_wasp_k31 = 13, 95 ar9300_eeprom_template_osprey_k31 = 14, 96 ar9300_eeprom_template_aphrodite = 15 97}; 98 99#define ar9300_eeprom_template_default ar9300_eeprom_template_generic 100#define Ar9300EepromFormatDefault 2 101 102#define reference_current 0 103#define compression_header_length 4 104#define compression_checksum_length 2 105 106#define OSPREY_EEP_VER 0xD000 107#define OSPREY_EEP_VER_MINOR_MASK 0xFFF 108#define OSPREY_EEP_MINOR_VER_1 0x1 109#define OSPREY_EEP_MINOR_VER OSPREY_EEP_MINOR_VER_1 110 111// 16-bit offset location start of calibration struct 112#define OSPREY_EEP_START_LOC 256 113#define OSPREY_NUM_5G_CAL_PIERS 8 114#define OSPREY_NUM_2G_CAL_PIERS 3 115#define OSPREY_NUM_5G_20_TARGET_POWERS 8 116#define OSPREY_NUM_5G_40_TARGET_POWERS 8 117#define OSPREY_NUM_2G_CCK_TARGET_POWERS 2 118#define OSPREY_NUM_2G_20_TARGET_POWERS 3 119#define OSPREY_NUM_2G_40_TARGET_POWERS 3 120//#define OSPREY_NUM_CTLS 21 121#define OSPREY_NUM_CTLS_5G 9 122#define OSPREY_NUM_CTLS_2G 12 123#define OSPREY_CTL_MODE_M 0xF 124#define OSPREY_NUM_BAND_EDGES_5G 8 125#define OSPREY_NUM_BAND_EDGES_2G 4 126#define OSPREY_NUM_PD_GAINS 4 127#define OSPREY_PD_GAINS_IN_MASK 4 128#define OSPREY_PD_GAIN_ICEPTS 5 129#define OSPREY_EEPROM_MODAL_SPURS 5 130#define OSPREY_MAX_RATE_POWER 63 131#define OSPREY_NUM_PDADC_VALUES 128 132#define OSPREY_NUM_RATES 16 133#define OSPREY_BCHAN_UNUSED 0xFF 134#define OSPREY_MAX_PWR_RANGE_IN_HALF_DB 64 135#define OSPREY_OPFLAGS_11A 0x01 136#define OSPREY_OPFLAGS_11G 0x02 137#define OSPREY_OPFLAGS_5G_HT40 0x04 138#define OSPREY_OPFLAGS_2G_HT40 0x08 139#define OSPREY_OPFLAGS_5G_HT20 0x10 140#define OSPREY_OPFLAGS_2G_HT20 0x20 141#define OSPREY_EEPMISC_BIG_ENDIAN 0x01 142#define OSPREY_EEPMISC_WOW 0x02 143#define OSPREY_CUSTOMER_DATA_SIZE 20 144 145#define FREQ2FBIN(x,y) \ 146 (u_int8_t)(((y) == HAL_FREQ_BAND_2GHZ) ? ((x) - 2300) : (((x) - 4800) / 5)) 147#define FBIN2FREQ(x,y) \ 148 (((y) == HAL_FREQ_BAND_2GHZ) ? (2300 + x) : (4800 + 5 * x)) 149#define OSPREY_MAX_CHAINS 3 150#define OSPREY_ANT_16S 25 151#define OSPREY_FUTURE_MODAL_SZ 6 152 153#define OSPREY_NUM_ANT_CHAIN_FIELDS 7 154#define OSPREY_NUM_ANT_COMMON_FIELDS 4 155#define OSPREY_SIZE_ANT_CHAIN_FIELD 3 156#define OSPREY_SIZE_ANT_COMMON_FIELD 4 157#define OSPREY_ANT_CHAIN_MASK 0x7 158#define OSPREY_ANT_COMMON_MASK 0xf 159#define OSPREY_CHAIN_0_IDX 0 160#define OSPREY_CHAIN_1_IDX 1 161#define OSPREY_CHAIN_2_IDX 2 162#define OSPREY_1_CHAINMASK 1 163#define OSPREY_2LOHI_CHAINMASK 5 164#define OSPREY_2LOMID_CHAINMASK 3 165#define OSPREY_3_CHAINMASK 7 166 167#define AR928X_NUM_ANT_CHAIN_FIELDS 6 168#define AR928X_SIZE_ANT_CHAIN_FIELD 2 169#define AR928X_ANT_CHAIN_MASK 0x3 170 171/* Delta from which to start power to pdadc table */ 172/* This offset is used in both open loop and closed loop power control 173 * schemes. In open loop power control, it is not really needed, but for 174 * the "sake of consistency" it was kept. 175 * For certain AP designs, this value is overwritten by the value in the flag 176 * "pwrTableOffset" just before writing the pdadc vs pwr into the chip registers. 177 */ 178#define OSPREY_PWR_TABLE_OFFSET 0 179 180//enable flags for voltage and temp compensation 181#define ENABLE_TEMP_COMPENSATION 0x01 182#define ENABLE_VOLT_COMPENSATION 0x02 183 184#define FLASH_BASE_CALDATA_OFFSET 0x1000 185#define AR9300_EEPROM_SIZE 16*1024 // byte addressable 186#define FIXED_CCA_THRESHOLD 15 187 188typedef struct eepFlags { 189 u_int8_t op_flags; 190 u_int8_t eepMisc; 191} __packed EEP_FLAGS; 192 193typedef enum targetPowerHTRates { 194 HT_TARGET_RATE_0_8_16, 195 HT_TARGET_RATE_1_3_9_11_17_19, 196 HT_TARGET_RATE_4, 197 HT_TARGET_RATE_5, 198 HT_TARGET_RATE_6, 199 HT_TARGET_RATE_7, 200 HT_TARGET_RATE_12, 201 HT_TARGET_RATE_13, 202 HT_TARGET_RATE_14, 203 HT_TARGET_RATE_15, 204 HT_TARGET_RATE_20, 205 HT_TARGET_RATE_21, 206 HT_TARGET_RATE_22, 207 HT_TARGET_RATE_23 208}TARGET_POWER_HT_RATES; 209 210const static int mapRate2Index[24]= 211{ 212 0,1,1,1,2, 213 3,4,5,0,1, 214 1,1,6,7,8, 215 9,0,1,1,1, 216 10,11,12,13 217}; 218 219typedef enum targetPowerLegacyRates { 220 LEGACY_TARGET_RATE_6_24, 221 LEGACY_TARGET_RATE_36, 222 LEGACY_TARGET_RATE_48, 223 LEGACY_TARGET_RATE_54 224}TARGET_POWER_LEGACY_RATES; 225 226typedef enum targetPowerCckRates { 227 LEGACY_TARGET_RATE_1L_5L, 228 LEGACY_TARGET_RATE_5S, 229 LEGACY_TARGET_RATE_11L, 230 LEGACY_TARGET_RATE_11S 231}TARGET_POWER_CCK_RATES; 232 233#define MAX_MODAL_RESERVED 11 234#define MAX_MODAL_FUTURE 5 235#define MAX_BASE_EXTENSION_FUTURE 2 236#define MAX_TEMP_SLOPE 8 237#define OSPREY_CHECKSUM_LOCATION (OSPREY_EEP_START_LOC + 1) 238 239typedef struct osprey_BaseEepHeader { 240 u_int16_t reg_dmn[2]; //Does this need to be outside of this structure, if it gets written after calibration 241 u_int8_t txrx_mask; //4 bits tx and 4 bits rx 242 EEP_FLAGS op_cap_flags; 243 u_int8_t rf_silent; 244 u_int8_t blue_tooth_options; 245 u_int8_t device_cap; 246 u_int8_t device_type; // takes lower byte in eeprom location 247 int8_t pwrTableOffset; // offset in dB to be added to beginning of pdadc table in calibration 248 u_int8_t params_for_tuning_caps[2]; //placeholder, get more details from Don 249 u_int8_t feature_enable; //bit0 - enable tx temp comp 250 //bit1 - enable tx volt comp 251 //bit2 - enable fastClock - default to 1 252 //bit3 - enable doubling - default to 1 253 //bit4 - enable internal regulator - default to 1 254 //bit5 - enable paprd - default to 0 255 //bit6 - enable TuningCaps - default to 0 256 //bit7 - enable tx_frame_to_xpa_on - default to 0 257 u_int8_t misc_configuration; //misc flags: bit0 - turn down drivestrength 258 // bit 1:2 - 0=don't force, 1=force to thermometer 0, 2=force to thermometer 1, 3=force to thermometer 2 259 // bit 3 - reduce chain mask from 0x7 to 0x3 on 2 stream rates 260 // bit 4 - enable quick drop 261 // bit 5 - enable 8 temp slop 262 // bit 6; enable xLNA_bias_strength 263 // bit 7; enable rf_gain_cap 264 u_int8_t eeprom_write_enable_gpio; 265 u_int8_t wlan_disable_gpio; 266 u_int8_t wlan_led_gpio; 267 u_int8_t rx_band_select_gpio; 268 u_int8_t txrxgain; 269 u_int32_t swreg; // SW controlled internal regulator fields 270} __packed OSPREY_BASE_EEP_HEADER; 271 272typedef struct osprey_BaseExtension_1 { 273 u_int8_t ant_div_control; 274 u_int8_t future[MAX_BASE_EXTENSION_FUTURE]; 275 u_int8_t misc_enable; 276 int8_t tempslopextension[MAX_TEMP_SLOPE]; 277 int8_t quick_drop_low; 278 int8_t quick_drop_high; 279} __packed OSPREY_BASE_EXTENSION_1; 280 281typedef struct osprey_BaseExtension_2 { 282 int8_t temp_slope_low; 283 int8_t temp_slope_high; 284 u_int8_t xatten1_db_low[OSPREY_MAX_CHAINS]; // 3 //xatten1_db for merlin (0xa20c/b20c 5:0) 285 u_int8_t xatten1_margin_low[OSPREY_MAX_CHAINS]; // 3 //xatten1_margin for merlin (0xa20c/b20c 16:12 286 u_int8_t xatten1_db_high[OSPREY_MAX_CHAINS]; // 3 //xatten1_db for merlin (0xa20c/b20c 5:0) 287 u_int8_t xatten1_margin_high[OSPREY_MAX_CHAINS]; // 3 //xatten1_margin for merlin (0xa20c/b20c 16:12 288} __packed OSPREY_BASE_EXTENSION_2; 289 290typedef struct spurChanStruct { 291 u_int16_t spur_chan; 292 u_int8_t spurRangeLow; 293 u_int8_t spurRangeHigh; 294} __packed SPUR_CHAN; 295 296//Note the order of the fields in this structure has been optimized to put all fields likely to change together 297typedef struct ospreyModalEepHeader { 298 u_int32_t ant_ctrl_common; // 4 idle, t1, t2, b (4 bits per setting) 299 u_int32_t ant_ctrl_common2; // 4 ra1l1, ra2l1, ra1l2, ra2l2, ra12 300 u_int16_t ant_ctrl_chain[OSPREY_MAX_CHAINS]; // 6 idle, t, r, rx1, rx12, b (2 bits each) 301 u_int8_t xatten1_db[OSPREY_MAX_CHAINS]; // 3 //xatten1_db for merlin (0xa20c/b20c 5:0) 302 u_int8_t xatten1_margin[OSPREY_MAX_CHAINS]; // 3 //xatten1_margin for merlin (0xa20c/b20c 16:12 303 int8_t temp_slope; 304 int8_t voltSlope; 305 u_int8_t spur_chans[OSPREY_EEPROM_MODAL_SPURS]; // spur channels in usual fbin coding format 306 int8_t noise_floor_thresh_ch[OSPREY_MAX_CHAINS];// 3 //Check if the register is per chain 307 u_int8_t reserved[MAX_MODAL_RESERVED]; 308 int8_t quick_drop; 309 u_int8_t xpa_bias_lvl; // 1 310 u_int8_t tx_frame_to_data_start; // 1 311 u_int8_t tx_frame_to_pa_on; // 1 312 u_int8_t txClip; // 4 bits tx_clip, 4 bits dac_scale_cck 313 int8_t antenna_gain; // 1 314 u_int8_t switchSettling; // 1 315 int8_t adcDesiredSize; // 1 316 u_int8_t tx_end_to_xpa_off; // 1 317 u_int8_t txEndToRxOn; // 1 318 u_int8_t tx_frame_to_xpa_on; // 1 319 u_int8_t thresh62; // 1 320 u_int32_t paprd_rate_mask_ht20; 321 u_int32_t paprd_rate_mask_ht40; 322 u_int16_t switchcomspdt; 323 u_int8_t xLNA_bias_strength; // bit: 0,1:chain0, 2,3:chain1, 4,5:chain2 324 u_int8_t rf_gain_cap; 325 u_int8_t tx_gain_cap; // bit0:4 txgain cap, txgain index for max_txgain + 20 (10dBm higher than max txgain) 326 u_int8_t futureModal[MAX_MODAL_FUTURE]; 327 // last 12 bytes stolen and moved to newly created base extension structure 328} __packed OSPREY_MODAL_EEP_HEADER; // == 100 B 329 330typedef struct ospCalDataPerFreqOpLoop { 331 int8_t ref_power; /* */ 332 u_int8_t volt_meas; /* pdadc voltage at power measurement */ 333 u_int8_t temp_meas; /* pcdac used for power measurement */ 334 int8_t rx_noisefloor_cal; /*range is -60 to -127 create a mapping equation 1db resolution */ 335 int8_t rx_noisefloor_power; /*range is same as noisefloor */ 336 u_int8_t rxTempMeas; /*temp measured when noisefloor cal was performed */ 337} __packed OSP_CAL_DATA_PER_FREQ_OP_LOOP; 338 339typedef struct CalTargetPowerLegacy { 340 u_int8_t t_pow2x[4]; 341} __packed CAL_TARGET_POWER_LEG; 342 343typedef struct ospCalTargetPowerHt { 344 u_int8_t t_pow2x[14]; 345} __packed OSP_CAL_TARGET_POWER_HT; 346 347#if AH_BYTE_ORDER == AH_BIG_ENDIAN 348typedef struct CalCtlEdgePwr { 349 u_int8_t flag :2, 350 t_power :6; 351} __packed CAL_CTL_EDGE_PWR; 352#elif AH_BYTE_ORDER == AH_LITTLE_ENDIAN 353typedef struct CalCtlEdgePwr { 354 u_int8_t t_power :6, 355 flag :2; 356} __packed CAL_CTL_EDGE_PWR; 357#else 358#error AH_BYTE_ORDER undefined! 359#endif 360 361typedef struct ospCalCtlData_5G { 362 CAL_CTL_EDGE_PWR ctl_edges[OSPREY_NUM_BAND_EDGES_5G]; 363} __packed OSP_CAL_CTL_DATA_5G; 364 365typedef struct ospCalCtlData_2G { 366 CAL_CTL_EDGE_PWR ctl_edges[OSPREY_NUM_BAND_EDGES_2G]; 367} __packed OSP_CAL_CTL_DATA_2G; 368 369typedef struct ospreyEeprom { 370 u_int8_t eeprom_version; 371 u_int8_t template_version; 372 u_int8_t mac_addr[6]; 373 u_int8_t custData[OSPREY_CUSTOMER_DATA_SIZE]; 374 375 OSPREY_BASE_EEP_HEADER base_eep_header; 376 377 OSPREY_MODAL_EEP_HEADER modal_header_2g; 378 OSPREY_BASE_EXTENSION_1 base_ext1; 379 u_int8_t cal_freq_pier_2g[OSPREY_NUM_2G_CAL_PIERS]; 380 OSP_CAL_DATA_PER_FREQ_OP_LOOP cal_pier_data_2g[OSPREY_MAX_CHAINS][OSPREY_NUM_2G_CAL_PIERS]; 381 u_int8_t cal_target_freqbin_cck[OSPREY_NUM_2G_CCK_TARGET_POWERS]; 382 u_int8_t cal_target_freqbin_2g[OSPREY_NUM_2G_20_TARGET_POWERS]; 383 u_int8_t cal_target_freqbin_2g_ht20[OSPREY_NUM_2G_20_TARGET_POWERS]; 384 u_int8_t cal_target_freqbin_2g_ht40[OSPREY_NUM_2G_40_TARGET_POWERS]; 385 CAL_TARGET_POWER_LEG cal_target_power_cck[OSPREY_NUM_2G_CCK_TARGET_POWERS]; 386 CAL_TARGET_POWER_LEG cal_target_power_2g[OSPREY_NUM_2G_20_TARGET_POWERS]; 387 OSP_CAL_TARGET_POWER_HT cal_target_power_2g_ht20[OSPREY_NUM_2G_20_TARGET_POWERS]; 388 OSP_CAL_TARGET_POWER_HT cal_target_power_2g_ht40[OSPREY_NUM_2G_40_TARGET_POWERS]; 389 u_int8_t ctl_index_2g[OSPREY_NUM_CTLS_2G]; 390 u_int8_t ctl_freqbin_2G[OSPREY_NUM_CTLS_2G][OSPREY_NUM_BAND_EDGES_2G]; 391 OSP_CAL_CTL_DATA_2G ctl_power_data_2g[OSPREY_NUM_CTLS_2G]; 392 393 OSPREY_MODAL_EEP_HEADER modal_header_5g; 394 OSPREY_BASE_EXTENSION_2 base_ext2; 395 u_int8_t cal_freq_pier_5g[OSPREY_NUM_5G_CAL_PIERS]; 396 OSP_CAL_DATA_PER_FREQ_OP_LOOP cal_pier_data_5g[OSPREY_MAX_CHAINS][OSPREY_NUM_5G_CAL_PIERS]; 397 u_int8_t cal_target_freqbin_5g[OSPREY_NUM_5G_20_TARGET_POWERS]; 398 u_int8_t cal_target_freqbin_5g_ht20[OSPREY_NUM_5G_20_TARGET_POWERS]; 399 u_int8_t cal_target_freqbin_5g_ht40[OSPREY_NUM_5G_40_TARGET_POWERS]; 400 CAL_TARGET_POWER_LEG cal_target_power_5g[OSPREY_NUM_5G_20_TARGET_POWERS]; 401 OSP_CAL_TARGET_POWER_HT cal_target_power_5g_ht20[OSPREY_NUM_5G_20_TARGET_POWERS]; 402 OSP_CAL_TARGET_POWER_HT cal_target_power_5g_ht40[OSPREY_NUM_5G_40_TARGET_POWERS]; 403 u_int8_t ctl_index_5g[OSPREY_NUM_CTLS_5G]; 404 u_int8_t ctl_freqbin_5G[OSPREY_NUM_CTLS_5G][OSPREY_NUM_BAND_EDGES_5G]; 405 OSP_CAL_CTL_DATA_5G ctl_power_data_5g[OSPREY_NUM_CTLS_5G]; 406} __packed ar9300_eeprom_t; 407 408 409/* 410** SWAP Functions 411** used to read EEPROM data, which is apparently stored in little 412** endian form. We have included both forms of the swap functions, 413** one for big endian and one for little endian. The indices of the 414** array elements are the differences 415*/ 416#if AH_BYTE_ORDER == AH_BIG_ENDIAN 417 418#define AR9300_EEPROM_MAGIC 0x5aa5 419#define SWAP16(_x) ( (u_int16_t)( (((const u_int8_t *)(&_x))[0] ) |\ 420 ( ( (const u_int8_t *)( &_x ) )[1]<< 8) ) ) 421 422#define SWAP32(_x) ((u_int32_t)( \ 423 (((const u_int8_t *)(&_x))[0]) | \ 424 (((const u_int8_t *)(&_x))[1]<< 8) | \ 425 (((const u_int8_t *)(&_x))[2]<<16) | \ 426 (((const u_int8_t *)(&_x))[3]<<24))) 427 428#else // AH_BYTE_ORDER 429 430#define AR9300_EEPROM_MAGIC 0xa55a 431#define SWAP16(_x) ( (u_int16_t)( (((const u_int8_t *)(&_x))[1] ) |\ 432 ( ( (const u_int8_t *)( &_x ) )[0]<< 8) ) ) 433 434#define SWAP32(_x) ((u_int32_t)( \ 435 (((const u_int8_t *)(&_x))[3]) | \ 436 (((const u_int8_t *)(&_x))[2]<< 8) | \ 437 (((const u_int8_t *)(&_x))[1]<<16) | \ 438 (((const u_int8_t *)(&_x))[0]<<24))) 439 440#endif // AH_BYTE_ORDER 441 442// OTP registers for OSPREY 443 444#define AR_GPIO_IN_OUT 0x4048 // GPIO input / output register 445#define OTP_MEM_START_ADDRESS 0x14000 446#define OTP_STATUS0_OTP_SM_BUSY 0x00015f18 447#define OTP_STATUS1_EFUSE_READ_DATA 0x00015f1c 448 449#define OTP_LDO_CONTROL_ENABLE 0x00015f24 450#define OTP_LDO_STATUS_POWER_ON 0x00015f2c 451#define OTP_INTF0_EFUSE_WR_ENABLE_REG_V 0x00015f00 452// OTP register for Jupiter 453#define GLB_OTP_LDO_CONTROL_ENABLE 0x00020020 454#define GLB_OTP_LDO_STATUS_POWER_ON 0x00020028 455#define OTP_PGENB_SETUP_HOLD_TIME_DELAY 0x15f34 456 457// OTP register for Jupiter BT 458#define BTOTP_MEM_START_ADDRESS 0x64000 459#define BTOTP_STATUS0_OTP_SM_BUSY 0x00065f18 460#define BTOTP_STATUS1_EFUSE_READ_DATA 0x00065f1c 461#define BTOTP_INTF0_EFUSE_WR_ENABLE_REG_V 0x00065f00 462#define BTOTP_INTF2 0x00065f08 463#define BTOTP_PGENB_SETUP_HOLD_TIME_DELAY 0x65f34 464#define BT_RESET_CTL 0x44000 465#define BT_CLOCK_CONTROL 0x44028 466 467 468// OTP register for WASP 469#define OTP_MEM_START_ADDRESS_WASP 0x00030000 470#define OTP_STATUS0_OTP_SM_BUSY_WASP (OTP_MEM_START_ADDRESS_WASP + 0x1018) 471#define OTP_STATUS1_EFUSE_READ_DATA_WASP (OTP_MEM_START_ADDRESS_WASP + 0x101C) 472#define OTP_LDO_CONTROL_ENABLE_WASP (OTP_MEM_START_ADDRESS_WASP + 0x1024) 473#define OTP_LDO_STATUS_POWER_ON_WASP (OTP_MEM_START_ADDRESS_WASP + 0x102C) 474#define OTP_INTF0_EFUSE_WR_ENABLE_REG_V_WASP (OTP_MEM_START_ADDRESS_WASP + 0x1000) 475// Below control the access timing of OTP read/write 476#define OTP_PG_STROBE_PW_REG_V_WASP (OTP_MEM_START_ADDRESS_WASP + 0x1008) 477#define OTP_RD_STROBE_PW_REG_V_WASP (OTP_MEM_START_ADDRESS_WASP + 0x100C) 478#define OTP_VDDQ_HOLD_TIME_DELAY_WASP (OTP_MEM_START_ADDRESS_WASP + 0x1030) 479#define OTP_PGENB_SETUP_HOLD_TIME_DELAY_WASP (OTP_MEM_START_ADDRESS_WASP + 0x1034) 480#define OTP_STROBE_PULSE_INTERVAL_DELAY_WASP (OTP_MEM_START_ADDRESS_WASP + 0x1038) 481#define OTP_CSB_ADDR_LOAD_SETUP_HOLD_DELAY_WASP (OTP_MEM_START_ADDRESS_WASP + 0x103C) 482 483#define AR9300_EEPROM_MAGIC_OFFSET 0x0 484/* reg_off = 4 * (eep_off) */ 485#define AR9300_EEPROM_S 2 486#define AR9300_EEPROM_OFFSET 0x2000 487#ifdef AR9100 488#define AR9300_EEPROM_START_ADDR 0x1fff1000 489#else 490#define AR9300_EEPROM_START_ADDR 0x503f1200 491#endif 492#define AR9300_FLASH_CAL_START_OFFSET 0x1000 493#define AR9300_EEPROM_MAX 0xae0 494#define IS_EEP_MINOR_V3(_ahp) (ar9300_eeprom_get((_ahp), EEP_MINOR_REV) >= AR9300_EEP_MINOR_VER_3) 495 496#define ar9300_get_ntxchains(_txchainmask) \ 497 (((_txchainmask >> 2) & 1) + ((_txchainmask >> 1) & 1) + (_txchainmask & 1)) 498 499/* RF silent fields in \ */ 500#define EEP_RFSILENT_ENABLED 0x0001 /* bit 0: enabled/disabled */ 501#define EEP_RFSILENT_ENABLED_S 0 /* bit 0: enabled/disabled */ 502#define EEP_RFSILENT_POLARITY 0x0002 /* bit 1: polarity */ 503#define EEP_RFSILENT_POLARITY_S 1 /* bit 1: polarity */ 504#define EEP_RFSILENT_GPIO_SEL 0x00fc /* bits 2..7: gpio PIN */ 505#define EEP_RFSILENT_GPIO_SEL_S 2 /* bits 2..7: gpio PIN */ 506#define AR9300_EEP_VER 0xE 507#define AR9300_BCHAN_UNUSED 0xFF 508#define AR9300_MAX_RATE_POWER 63 509 510typedef enum { 511 CALDATA_AUTO=0, 512 CALDATA_EEPROM, 513 CALDATA_FLASH, 514 CALDATA_OTP 515} CALDATA_TYPE; 516 517typedef enum { 518 EEP_NFTHRESH_5, 519 EEP_NFTHRESH_2, 520 EEP_MAC_MSW, 521 EEP_MAC_MID, 522 EEP_MAC_LSW, 523 EEP_REG_0, 524 EEP_REG_1, 525 EEP_OP_CAP, 526 EEP_OP_MODE, 527 EEP_RF_SILENT, 528 EEP_OB_5, 529 EEP_DB_5, 530 EEP_OB_2, 531 EEP_DB_2, 532 EEP_MINOR_REV, 533 EEP_TX_MASK, 534 EEP_RX_MASK, 535 EEP_FSTCLK_5G, 536 EEP_RXGAIN_TYPE, 537 EEP_OL_PWRCTRL, 538 EEP_TXGAIN_TYPE, 539 EEP_RC_CHAIN_MASK, 540 EEP_DAC_HPWR_5G, 541 EEP_FRAC_N_5G, 542 EEP_DEV_TYPE, 543 EEP_TEMPSENSE_SLOPE, 544 EEP_TEMPSENSE_SLOPE_PAL_ON, 545 EEP_PWR_TABLE_OFFSET, 546 EEP_DRIVE_STRENGTH, 547 EEP_INTERNAL_REGULATOR, 548 EEP_SWREG, 549 EEP_PAPRD_ENABLED, 550 EEP_ANTDIV_control, 551 EEP_CHAIN_MASK_REDUCE, 552} EEPROM_PARAM; 553 554#define AR9300_RATES_OFDM_OFFSET 0 555#define AR9300_RATES_CCK_OFFSET 4 556#define AR9300_RATES_HT20_OFFSET 8 557#define AR9300_RATES_HT40_OFFSET 22 558typedef enum ar9300_Rates { 559 ALL_TARGET_LEGACY_6_24, 560 ALL_TARGET_LEGACY_36, 561 ALL_TARGET_LEGACY_48, 562 ALL_TARGET_LEGACY_54, 563 ALL_TARGET_LEGACY_1L_5L, 564 ALL_TARGET_LEGACY_5S, 565 ALL_TARGET_LEGACY_11L, 566 ALL_TARGET_LEGACY_11S, 567 ALL_TARGET_HT20_0_8_16, 568 ALL_TARGET_HT20_1_3_9_11_17_19, 569 ALL_TARGET_HT20_4, 570 ALL_TARGET_HT20_5, 571 ALL_TARGET_HT20_6, 572 ALL_TARGET_HT20_7, 573 ALL_TARGET_HT20_12, 574 ALL_TARGET_HT20_13, 575 ALL_TARGET_HT20_14, 576 ALL_TARGET_HT20_15, 577 ALL_TARGET_HT20_20, 578 ALL_TARGET_HT20_21, 579 ALL_TARGET_HT20_22, 580 ALL_TARGET_HT20_23, 581 ALL_TARGET_HT40_0_8_16, 582 ALL_TARGET_HT40_1_3_9_11_17_19, 583 ALL_TARGET_HT40_4, 584 ALL_TARGET_HT40_5, 585 ALL_TARGET_HT40_6, 586 ALL_TARGET_HT40_7, 587 ALL_TARGET_HT40_12, 588 ALL_TARGET_HT40_13, 589 ALL_TARGET_HT40_14, 590 ALL_TARGET_HT40_15, 591 ALL_TARGET_HT40_20, 592 ALL_TARGET_HT40_21, 593 ALL_TARGET_HT40_22, 594 ALL_TARGET_HT40_23, 595 ar9300_rate_size 596} AR9300_RATES; 597 598 599/************************************************************************** 600 * fbin2freq 601 * 602 * Get channel value from binary representation held in eeprom 603 * RETURNS: the frequency in MHz 604 */ 605static inline u_int16_t 606fbin2freq(u_int8_t fbin, HAL_BOOL is_2ghz) 607{ 608 /* 609 * Reserved value 0xFF provides an empty definition both as 610 * an fbin and as a frequency - do not convert 611 */ 612 if (fbin == AR9300_BCHAN_UNUSED) 613 { 614 return fbin; 615 } 616 617 return (u_int16_t)((is_2ghz) ? (2300 + fbin) : (4800 + 5 * fbin)); 618} 619 620extern int CompressionHeaderUnpack(u_int8_t *best, int *code, int *reference, int *length, int *major, int *minor); 621extern void Ar9300EepromFormatConvert(ar9300_eeprom_t *mptr); 622extern HAL_BOOL ar9300_eeprom_restore(struct ath_hal *ah); 623extern int ar9300_eeprom_restore_internal(struct ath_hal *ah, ar9300_eeprom_t *mptr, int /*msize*/); 624extern int ar9300_eeprom_base_address(struct ath_hal *ah); 625extern int ar9300_eeprom_volatile(struct ath_hal *ah); 626extern int ar9300_eeprom_low_limit(struct ath_hal *ah); 627extern u_int16_t ar9300_compression_checksum(u_int8_t *data, int dsize); 628extern int ar9300_compression_header_unpack(u_int8_t *best, int *code, int *reference, int *length, int *major, int *minor); 629 630extern u_int16_t ar9300_eeprom_struct_size(void); 631extern ar9300_eeprom_t *ar9300EepromStructInit(int default_index); 632extern ar9300_eeprom_t *ar9300EepromStructGet(void); 633extern ar9300_eeprom_t *ar9300_eeprom_struct_default(int default_index); 634extern ar9300_eeprom_t *ar9300_eeprom_struct_default_find_by_id(int ver); 635extern int ar9300_eeprom_struct_default_many(void); 636extern int ar9300EepromUpdateCalPier(int pierIdx, int freq, int chain, 637 int pwrCorrection, int volt_meas, int temp_meas); 638extern int ar9300_power_control_override(struct ath_hal *ah, int frequency, int *correction, int *voltage, int *temperature); 639 640extern void ar9300EepromDisplayCalData(int for2GHz); 641extern void ar9300EepromDisplayAll(void); 642extern void ar9300_set_target_power_from_eeprom(struct ath_hal *ah, u_int16_t freq, 643 u_int8_t *target_power_val_t2); 644extern HAL_BOOL ar9300_eeprom_set_power_per_rate_table(struct ath_hal *ah, 645 ar9300_eeprom_t *p_eep_data, 646 const struct ieee80211_channel *chan, 647 u_int8_t *p_pwr_array, 648 u_int16_t cfg_ctl, 649 u_int16_t antenna_reduction, 650 u_int16_t twice_max_regulatory_power, 651 u_int16_t power_limit, 652 u_int8_t chainmask); 653extern int ar9300_transmit_power_reg_write(struct ath_hal *ah, u_int8_t *p_pwr_array); 654 655extern u_int8_t ar9300_eeprom_get_legacy_trgt_pwr(struct ath_hal *ah, u_int16_t rate_index, u_int16_t freq, HAL_BOOL is_2ghz); 656extern u_int8_t ar9300_eeprom_get_ht20_trgt_pwr(struct ath_hal *ah, u_int16_t rate_index, u_int16_t freq, HAL_BOOL is_2ghz); 657extern u_int8_t ar9300_eeprom_get_ht40_trgt_pwr(struct ath_hal *ah, u_int16_t rate_index, u_int16_t freq, HAL_BOOL is_2ghz); 658extern u_int8_t ar9300_eeprom_get_cck_trgt_pwr(struct ath_hal *ah, u_int16_t rate_index, u_int16_t freq); 659extern HAL_BOOL ar9300_internal_regulator_apply(struct ath_hal *ah); 660extern HAL_BOOL ar9300_drive_strength_apply(struct ath_hal *ah); 661extern HAL_BOOL ar9300_attenuation_apply(struct ath_hal *ah, u_int16_t channel); 662extern int32_t ar9300_thermometer_get(struct ath_hal *ah); 663extern HAL_BOOL ar9300_thermometer_apply(struct ath_hal *ah); 664extern HAL_BOOL ar9300_xpa_timing_control_apply(struct ath_hal *ah, HAL_BOOL is_2ghz); 665extern HAL_BOOL ar9300_x_lNA_bias_strength_apply(struct ath_hal *ah, HAL_BOOL is_2ghz); 666 667extern int32_t ar9300MacAdressGet(u_int8_t *mac); 668extern int32_t ar9300CustomerDataGet(u_int8_t *data, int32_t len); 669extern int32_t ar9300ReconfigDriveStrengthGet(void); 670extern int32_t ar9300EnableTempCompensationGet(void); 671extern int32_t ar9300EnableVoltCompensationGet(void); 672extern int32_t ar9300FastClockEnableGet(void); 673extern int32_t ar9300EnableDoublingGet(void); 674 675extern u_int16_t *ar9300_regulatory_domain_get(struct ath_hal *ah); 676extern int32_t ar9300_eeprom_write_enable_gpio_get(struct ath_hal *ah); 677extern int32_t ar9300_wlan_led_gpio_get(struct ath_hal *ah); 678extern int32_t ar9300_wlan_disable_gpio_get(struct ath_hal *ah); 679extern int32_t ar9300_rx_band_select_gpio_get(struct ath_hal *ah); 680extern int32_t ar9300_rx_gain_index_get(struct ath_hal *ah); 681extern int32_t ar9300_tx_gain_index_get(struct ath_hal *ah); 682extern int32_t ar9300_xpa_bias_level_get(struct ath_hal *ah, HAL_BOOL is_2ghz); 683extern HAL_BOOL ar9300_xpa_bias_level_apply(struct ath_hal *ah, HAL_BOOL is_2ghz); 684extern u_int32_t ar9300_ant_ctrl_common_get(struct ath_hal *ah, HAL_BOOL is_2ghz); 685extern u_int32_t ar9300_ant_ctrl_common2_get(struct ath_hal *ah, HAL_BOOL is_2ghz); 686extern u_int16_t ar9300_ant_ctrl_chain_get(struct ath_hal *ah, int chain, HAL_BOOL is_2ghz); 687extern HAL_BOOL ar9300_ant_ctrl_apply(struct ath_hal *ah, HAL_BOOL is_2ghz); 688/* since valid noise floor values are negative, returns 1 on error */ 689extern int32_t ar9300_noise_floor_cal_or_power_get( 690 struct ath_hal *ah, int32_t frequency, int32_t ichain, HAL_BOOL use_cal); 691#define ar9300NoiseFloorGet(ah, frequency, ichain) \ 692 ar9300_noise_floor_cal_or_power_get(ah, frequency, ichain, 1/*use_cal*/) 693#define ar9300NoiseFloorPowerGet(ah, frequency, ichain) \ 694 ar9300_noise_floor_cal_or_power_get(ah, frequency, ichain, 0/*use_cal*/) 695extern void ar9300_eeprom_template_preference(int32_t value); 696extern int32_t ar9300_eeprom_template_install(struct ath_hal *ah, int32_t value); 697extern void ar9300_calibration_data_set(struct ath_hal *ah, int32_t source); 698extern int32_t ar9300_calibration_data_get(struct ath_hal *ah); 699extern int32_t ar9300_calibration_data_address_get(struct ath_hal *ah); 700extern void ar9300_calibration_data_address_set(struct ath_hal *ah, int32_t source); 701extern HAL_BOOL ar9300_calibration_data_read_flash(struct ath_hal *ah, long address, u_int8_t *buffer, int many); 702extern HAL_BOOL ar9300_calibration_data_read_eeprom(struct ath_hal *ah, long address, u_int8_t *buffer, int many); 703extern HAL_BOOL ar9300_calibration_data_read_otp(struct ath_hal *ah, long address, u_int8_t *buffer, int many, HAL_BOOL is_wifi); 704extern HAL_BOOL ar9300_calibration_data_read(struct ath_hal *ah, long address, u_int8_t *buffer, int many); 705extern int32_t ar9300_eeprom_size(struct ath_hal *ah); 706extern int32_t ar9300_otp_size(struct ath_hal *ah); 707extern HAL_BOOL ar9300_calibration_data_read_array(struct ath_hal *ah, int address, u_int8_t *buffer, int many); 708 709 710 711#if defined(WIN32) || defined(WIN64) 712#pragma pack (pop, ar9300) 713#endif 714 715#endif /* _ATH_AR9300_EEP_H_ */ 716