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