176bd547bSAdrian Chadd /* 276bd547bSAdrian Chadd * Copyright (c) 2013 Qualcomm Atheros, Inc. 376bd547bSAdrian Chadd * 476bd547bSAdrian Chadd * Permission to use, copy, modify, and/or distribute this software for any 576bd547bSAdrian Chadd * purpose with or without fee is hereby granted, provided that the above 676bd547bSAdrian Chadd * copyright notice and this permission notice appear in all copies. 776bd547bSAdrian Chadd * 876bd547bSAdrian Chadd * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH 976bd547bSAdrian Chadd * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY 1076bd547bSAdrian Chadd * AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, 1176bd547bSAdrian Chadd * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM 1276bd547bSAdrian Chadd * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR 1376bd547bSAdrian Chadd * OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR 1476bd547bSAdrian Chadd * PERFORMANCE OF THIS SOFTWARE. 1576bd547bSAdrian Chadd */ 1676bd547bSAdrian Chadd 1776bd547bSAdrian Chadd #ifndef _ATH_AR9300_H_ 1876bd547bSAdrian Chadd #define _ATH_AR9300_H_ 1976bd547bSAdrian Chadd 20e113789bSAdrian Chadd #include "ar9300_freebsd_inc.h" 21e113789bSAdrian Chadd 22e113789bSAdrian Chadd /* XXX doesn't belong here */ 23e113789bSAdrian Chadd #define AR_EEPROM_MODAL_SPURS 5 24e113789bSAdrian Chadd 2541137b06SAdrian Chadd /* Ensure that AH_BYTE_ORDER is defined */ 2641137b06SAdrian Chadd #ifndef AH_BYTE_ORDER 2741137b06SAdrian Chadd #error AH_BYTE_ORDER needs to be defined! 2841137b06SAdrian Chadd #endif 2941137b06SAdrian Chadd 30e113789bSAdrian Chadd /* 31e113789bSAdrian Chadd * (a) this should be N(a), 32e113789bSAdrian Chadd * (b) FreeBSD does define nitems, 33e113789bSAdrian Chadd * (c) it doesn't have an AH_ prefix, sigh. 34e113789bSAdrian Chadd */ 35e113789bSAdrian Chadd #define ARRAY_LENGTH(a) (sizeof(a) / sizeof((a)[0])) 36e113789bSAdrian Chadd 3776bd547bSAdrian Chadd #include "ah_internal.h" 3876bd547bSAdrian Chadd #include "ah_eeprom.h" 3976bd547bSAdrian Chadd #include "ah_devid.h" 4076bd547bSAdrian Chadd #include "ar9300eep.h" /* For Eeprom definitions */ 4176bd547bSAdrian Chadd 4276bd547bSAdrian Chadd #define AR9300_MAGIC 0x19741014 4376bd547bSAdrian Chadd 4476bd547bSAdrian Chadd /* MAC register values */ 4576bd547bSAdrian Chadd 4676bd547bSAdrian Chadd #define INIT_CONFIG_STATUS 0x00000000 4776bd547bSAdrian Chadd #define INIT_RSSI_THR 0x7 /* Missed beacon counter initialized to 0x7 (max is 0xff) */ 4876bd547bSAdrian Chadd #define INIT_RSSI_BEACON_WEIGHT 8 /* ave beacon rssi weight (0-16) */ 4976bd547bSAdrian Chadd 5076bd547bSAdrian Chadd /* 5176bd547bSAdrian Chadd * Various fifo fill before Tx start, in 64-byte units 5276bd547bSAdrian Chadd * i.e. put the frame in the air while still DMAing 5376bd547bSAdrian Chadd */ 5476bd547bSAdrian Chadd #define MIN_TX_FIFO_THRESHOLD 0x1 5576bd547bSAdrian Chadd #define MAX_TX_FIFO_THRESHOLD (( 4096 / 64) - 1) 5676bd547bSAdrian Chadd #define INIT_TX_FIFO_THRESHOLD MIN_TX_FIFO_THRESHOLD 5776bd547bSAdrian Chadd 5876bd547bSAdrian Chadd #define CHANSEL_DIV 15 5976bd547bSAdrian Chadd #define FCLK 40 6076bd547bSAdrian Chadd 6176bd547bSAdrian Chadd #define COEFF ((FCLK * 5) / 2) 6276bd547bSAdrian Chadd #define CHANSEL_2G(_freq) (((_freq) * 0x10000) / CHANSEL_DIV) 6376bd547bSAdrian Chadd #define CHANSEL_5G(_freq) (((_freq) * 0x8000) / CHANSEL_DIV) 6476bd547bSAdrian Chadd #define CHANSEL_5G_DOT5MHZ 2188 6576bd547bSAdrian Chadd 6676bd547bSAdrian Chadd /* 6776bd547bSAdrian Chadd * Receive Queue Fifo depth. 6876bd547bSAdrian Chadd */ 6976bd547bSAdrian Chadd enum RX_FIFO_DEPTH { 7076bd547bSAdrian Chadd HAL_HP_RXFIFO_DEPTH = 16, 7176bd547bSAdrian Chadd HAL_LP_RXFIFO_DEPTH = 128, 7276bd547bSAdrian Chadd }; 7376bd547bSAdrian Chadd 7476bd547bSAdrian Chadd /* 7576bd547bSAdrian Chadd * Gain support. 7676bd547bSAdrian Chadd */ 7776bd547bSAdrian Chadd #define NUM_CORNER_FIX_BITS_2133 7 7876bd547bSAdrian Chadd #define CCK_OFDM_GAIN_DELTA 15 7976bd547bSAdrian Chadd 8076bd547bSAdrian Chadd enum GAIN_PARAMS { 8176bd547bSAdrian Chadd GP_TXCLIP, 8276bd547bSAdrian Chadd GP_PD90, 8376bd547bSAdrian Chadd GP_PD84, 8476bd547bSAdrian Chadd GP_GSEL 8576bd547bSAdrian Chadd }; 8676bd547bSAdrian Chadd 8776bd547bSAdrian Chadd enum GAIN_PARAMS_2133 { 8876bd547bSAdrian Chadd GP_MIXGAIN_OVR, 8976bd547bSAdrian Chadd GP_PWD_138, 9076bd547bSAdrian Chadd GP_PWD_137, 9176bd547bSAdrian Chadd GP_PWD_136, 9276bd547bSAdrian Chadd GP_PWD_132, 9376bd547bSAdrian Chadd GP_PWD_131, 9476bd547bSAdrian Chadd GP_PWD_130, 9576bd547bSAdrian Chadd }; 9676bd547bSAdrian Chadd 9776bd547bSAdrian Chadd typedef struct _gain_opt_step { 9876bd547bSAdrian Chadd int16_t paramVal[NUM_CORNER_FIX_BITS_2133]; 9976bd547bSAdrian Chadd int32_t stepGain; 10076bd547bSAdrian Chadd int8_t stepName[16]; 10176bd547bSAdrian Chadd } GAIN_OPTIMIZATION_STEP; 10276bd547bSAdrian Chadd 10376bd547bSAdrian Chadd typedef struct { 10476bd547bSAdrian Chadd u_int32_t numStepsInLadder; 10576bd547bSAdrian Chadd u_int32_t defaultStepNum; 10676bd547bSAdrian Chadd GAIN_OPTIMIZATION_STEP optStep[10]; 10776bd547bSAdrian Chadd } GAIN_OPTIMIZATION_LADDER; 10876bd547bSAdrian Chadd 10976bd547bSAdrian Chadd typedef struct { 11076bd547bSAdrian Chadd u_int32_t currStepNum; 11176bd547bSAdrian Chadd u_int32_t currGain; 11276bd547bSAdrian Chadd u_int32_t targetGain; 11376bd547bSAdrian Chadd u_int32_t loTrig; 11476bd547bSAdrian Chadd u_int32_t hiTrig; 11576bd547bSAdrian Chadd u_int32_t gainFCorrection; 11676bd547bSAdrian Chadd u_int32_t active; 11776bd547bSAdrian Chadd GAIN_OPTIMIZATION_STEP *curr_step; 11876bd547bSAdrian Chadd } GAIN_VALUES; 11976bd547bSAdrian Chadd 12076bd547bSAdrian Chadd typedef struct { 12176bd547bSAdrian Chadd u_int16_t synth_center; 12276bd547bSAdrian Chadd u_int16_t ctl_center; 12376bd547bSAdrian Chadd u_int16_t ext_center; 12476bd547bSAdrian Chadd } CHAN_CENTERS; 12576bd547bSAdrian Chadd 12676bd547bSAdrian Chadd /* RF HAL structures */ 12776bd547bSAdrian Chadd typedef struct rf_hal_funcs { 128e113789bSAdrian Chadd HAL_BOOL (*set_channel)(struct ath_hal *, struct ieee80211_channel *); 129e113789bSAdrian Chadd HAL_BOOL (*get_chip_power_lim)(struct ath_hal *ah, 130e113789bSAdrian Chadd struct ieee80211_channel *chan); 13176bd547bSAdrian Chadd } RF_HAL_FUNCS; 13276bd547bSAdrian Chadd 13376bd547bSAdrian Chadd struct ar9300_ani_default { 13476bd547bSAdrian Chadd u_int16_t m1_thresh_low; 13576bd547bSAdrian Chadd u_int16_t m2_thresh_low; 13676bd547bSAdrian Chadd u_int16_t m1_thresh; 13776bd547bSAdrian Chadd u_int16_t m2_thresh; 13876bd547bSAdrian Chadd u_int16_t m2_count_thr; 13976bd547bSAdrian Chadd u_int16_t m2_count_thr_low; 14076bd547bSAdrian Chadd u_int16_t m1_thresh_low_ext; 14176bd547bSAdrian Chadd u_int16_t m2_thresh_low_ext; 14276bd547bSAdrian Chadd u_int16_t m1_thresh_ext; 14376bd547bSAdrian Chadd u_int16_t m2_thresh_ext; 14476bd547bSAdrian Chadd u_int16_t firstep; 14576bd547bSAdrian Chadd u_int16_t firstep_low; 14676bd547bSAdrian Chadd u_int16_t cycpwr_thr1; 14776bd547bSAdrian Chadd u_int16_t cycpwr_thr1_ext; 14876bd547bSAdrian Chadd }; 14976bd547bSAdrian Chadd 15076bd547bSAdrian Chadd /* 15176bd547bSAdrian Chadd * Per-channel ANI state private to the driver. 15276bd547bSAdrian Chadd */ 15376bd547bSAdrian Chadd struct ar9300_ani_state { 154e113789bSAdrian Chadd struct ieee80211_channel c; /* XXX ew? */ 15576bd547bSAdrian Chadd HAL_BOOL must_restore; 15676bd547bSAdrian Chadd HAL_BOOL ofdms_turn; 15776bd547bSAdrian Chadd u_int8_t ofdm_noise_immunity_level; 15876bd547bSAdrian Chadd u_int8_t cck_noise_immunity_level; 15976bd547bSAdrian Chadd u_int8_t spur_immunity_level; 16076bd547bSAdrian Chadd u_int8_t firstep_level; 16176bd547bSAdrian Chadd u_int8_t ofdm_weak_sig_detect_off; 16276bd547bSAdrian Chadd u_int8_t mrc_cck_off; 16376bd547bSAdrian Chadd 16476bd547bSAdrian Chadd /* Thresholds */ 16576bd547bSAdrian Chadd u_int32_t listen_time; 16676bd547bSAdrian Chadd u_int32_t ofdm_trig_high; 16776bd547bSAdrian Chadd u_int32_t ofdm_trig_low; 16876bd547bSAdrian Chadd int32_t cck_trig_high; 16976bd547bSAdrian Chadd int32_t cck_trig_low; 17076bd547bSAdrian Chadd int32_t rssi_thr_low; 17176bd547bSAdrian Chadd int32_t rssi_thr_high; 17276bd547bSAdrian Chadd 17376bd547bSAdrian Chadd int32_t rssi; /* The current RSSI */ 17476bd547bSAdrian Chadd u_int32_t tx_frame_count; /* Last tx_frame_count */ 17576bd547bSAdrian Chadd u_int32_t rx_frame_count; /* Last rx Frame count */ 1769778bf37SAdrian Chadd u_int32_t rx_busy_count; /* Last rx busy count */ 1779778bf37SAdrian Chadd u_int32_t rx_ext_busy_count; /* Last rx busy count; extension channel */ 17876bd547bSAdrian Chadd u_int32_t cycle_count; /* Last cycle_count (can detect wrap-around) */ 17976bd547bSAdrian Chadd u_int32_t ofdm_phy_err_count;/* OFDM err count since last reset */ 18076bd547bSAdrian Chadd u_int32_t cck_phy_err_count; /* CCK err count since last reset */ 18176bd547bSAdrian Chadd 18276bd547bSAdrian Chadd struct ar9300_ani_default ini_def; /* INI default values for ANI registers */ 18376bd547bSAdrian Chadd HAL_BOOL phy_noise_spur; /* based on OFDM/CCK Phy errors */ 18476bd547bSAdrian Chadd }; 18576bd547bSAdrian Chadd 18676bd547bSAdrian Chadd #define AR9300_ANI_POLLINTERVAL 1000 /* 1000 milliseconds between ANI poll */ 18776bd547bSAdrian Chadd 18876bd547bSAdrian Chadd #define AR9300_CHANNEL_SWITCH_TIME_USEC 1000 /* 1 millisecond needed to change channels */ 18976bd547bSAdrian Chadd 19076bd547bSAdrian Chadd #define HAL_PROCESS_ANI 0x00000001 /* ANI state setup */ 19176bd547bSAdrian Chadd #define HAL_RADAR_EN 0x80000000 /* Radar detect is capable */ 19276bd547bSAdrian Chadd #define HAL_AR_EN 0x40000000 /* AR detect is capable */ 19376bd547bSAdrian Chadd 19476bd547bSAdrian Chadd #define DO_ANI(ah) \ 19576bd547bSAdrian Chadd ((AH9300(ah)->ah_proc_phy_err & HAL_PROCESS_ANI)) 19676bd547bSAdrian Chadd 197d5c3e61aSAdrian Chadd #if 0 19876bd547bSAdrian Chadd struct ar9300_stats { 19976bd547bSAdrian Chadd u_int32_t ast_ani_niup; /* ANI increased noise immunity */ 20076bd547bSAdrian Chadd u_int32_t ast_ani_nidown; /* ANI decreased noise immunity */ 20176bd547bSAdrian Chadd u_int32_t ast_ani_spurup; /* ANI increased spur immunity */ 20276bd547bSAdrian Chadd u_int32_t ast_ani_spurdown;/* ANI descreased spur immunity */ 20376bd547bSAdrian Chadd u_int32_t ast_ani_ofdmon; /* ANI OFDM weak signal detect on */ 20476bd547bSAdrian Chadd u_int32_t ast_ani_ofdmoff;/* ANI OFDM weak signal detect off */ 20576bd547bSAdrian Chadd u_int32_t ast_ani_cckhigh;/* ANI CCK weak signal threshold high */ 20676bd547bSAdrian Chadd u_int32_t ast_ani_ccklow; /* ANI CCK weak signal threshold low */ 20776bd547bSAdrian Chadd u_int32_t ast_ani_stepup; /* ANI increased first step level */ 20876bd547bSAdrian Chadd u_int32_t ast_ani_stepdown;/* ANI decreased first step level */ 20976bd547bSAdrian Chadd u_int32_t ast_ani_ofdmerrs;/* ANI cumulative ofdm phy err count */ 21076bd547bSAdrian Chadd u_int32_t ast_ani_cckerrs;/* ANI cumulative cck phy err count */ 21176bd547bSAdrian Chadd u_int32_t ast_ani_reset; /* ANI parameters zero'd for non-STA */ 21276bd547bSAdrian Chadd u_int32_t ast_ani_lzero; /* ANI listen time forced to zero */ 21376bd547bSAdrian Chadd u_int32_t ast_ani_lneg; /* ANI listen time calculated < 0 */ 21476bd547bSAdrian Chadd HAL_MIB_STATS ast_mibstats; /* MIB counter stats */ 21576bd547bSAdrian Chadd HAL_NODE_STATS ast_nodestats; /* Latest rssi stats from driver */ 21676bd547bSAdrian Chadd }; 217d5c3e61aSAdrian Chadd #endif 21876bd547bSAdrian Chadd 21976bd547bSAdrian Chadd struct ar9300_rad_reader { 22076bd547bSAdrian Chadd u_int16_t rd_index; 22176bd547bSAdrian Chadd u_int16_t rd_expSeq; 22276bd547bSAdrian Chadd u_int32_t rd_resetVal; 22376bd547bSAdrian Chadd u_int8_t rd_start; 22476bd547bSAdrian Chadd }; 22576bd547bSAdrian Chadd 22676bd547bSAdrian Chadd struct ar9300_rad_writer { 22776bd547bSAdrian Chadd u_int16_t wr_index; 22876bd547bSAdrian Chadd u_int16_t wr_seq; 22976bd547bSAdrian Chadd }; 23076bd547bSAdrian Chadd 23176bd547bSAdrian Chadd struct ar9300_radar_event { 23276bd547bSAdrian Chadd u_int32_t re_ts; /* 32 bit time stamp */ 23376bd547bSAdrian Chadd u_int8_t re_rssi; /* rssi of radar event */ 23476bd547bSAdrian Chadd u_int8_t re_dur; /* duration of radar pulse */ 23576bd547bSAdrian Chadd u_int8_t re_chanIndex; /* Channel of event */ 23676bd547bSAdrian Chadd }; 23776bd547bSAdrian Chadd 23876bd547bSAdrian Chadd struct ar9300_radar_q_elem { 23976bd547bSAdrian Chadd u_int32_t rq_seqNum; 24076bd547bSAdrian Chadd u_int32_t rq_busy; /* 32 bit to insure atomic read/write */ 24176bd547bSAdrian Chadd struct ar9300_radar_event rq_event; /* Radar event */ 24276bd547bSAdrian Chadd }; 24376bd547bSAdrian Chadd 24476bd547bSAdrian Chadd struct ar9300_radar_q_info { 24576bd547bSAdrian Chadd u_int16_t ri_qsize; /* q size */ 24676bd547bSAdrian Chadd u_int16_t ri_seqSize; /* Size of sequence ring */ 24776bd547bSAdrian Chadd struct ar9300_rad_reader ri_reader; /* State for the q reader */ 24876bd547bSAdrian Chadd struct ar9300_rad_writer ri_writer; /* state for the q writer */ 24976bd547bSAdrian Chadd }; 25076bd547bSAdrian Chadd 25176bd547bSAdrian Chadd #define HAL_MAX_ACK_RADAR_DUR 511 25276bd547bSAdrian Chadd #define HAL_MAX_NUM_PEAKS 3 25376bd547bSAdrian Chadd #define HAL_ARQ_SIZE 4096 /* 8K AR events for buffer size */ 25476bd547bSAdrian Chadd #define HAL_ARQ_SEQSIZE 4097 /* Sequence counter wrap for AR */ 25576bd547bSAdrian Chadd #define HAL_RADARQ_SIZE 1024 /* 1K radar events for buffer size */ 25676bd547bSAdrian Chadd #define HAL_RADARQ_SEQSIZE 1025 /* Sequence counter wrap for radar */ 25776bd547bSAdrian Chadd #define HAL_NUMRADAR_STATES 64 /* Number of radar channels we keep state for */ 25876bd547bSAdrian Chadd 25976bd547bSAdrian Chadd struct ar9300_ar_state { 26076bd547bSAdrian Chadd u_int16_t ar_prev_time_stamp; 26176bd547bSAdrian Chadd u_int32_t ar_prev_width; 26276bd547bSAdrian Chadd u_int32_t ar_phy_err_count[HAL_MAX_ACK_RADAR_DUR]; 26376bd547bSAdrian Chadd u_int32_t ar_ack_sum; 26476bd547bSAdrian Chadd u_int16_t ar_peak_list[HAL_MAX_NUM_PEAKS]; 26576bd547bSAdrian Chadd u_int32_t ar_packet_threshold; /* Thresh to determine traffic load */ 26676bd547bSAdrian Chadd u_int32_t ar_par_threshold; /* Thresh to determine peak */ 26776bd547bSAdrian Chadd u_int32_t ar_radar_rssi; /* Rssi threshold for AR event */ 26876bd547bSAdrian Chadd }; 26976bd547bSAdrian Chadd 27076bd547bSAdrian Chadd struct ar9300_radar_state { 271e113789bSAdrian Chadd struct ieee80211_channel *rs_chan; /* Channel info */ 27276bd547bSAdrian Chadd u_int8_t rs_chan_index; /* Channel index in radar structure */ 27376bd547bSAdrian Chadd u_int32_t rs_num_radar_events; /* Number of radar events */ 27476bd547bSAdrian Chadd int32_t rs_firpwr; /* Thresh to check radar sig is gone */ 27576bd547bSAdrian Chadd u_int32_t rs_radar_rssi; /* Thresh to start radar det (dB) */ 27676bd547bSAdrian Chadd u_int32_t rs_height; /* Thresh for pulse height (dB)*/ 27776bd547bSAdrian Chadd u_int32_t rs_pulse_rssi; /* Thresh to check if pulse is gone (dB) */ 27876bd547bSAdrian Chadd u_int32_t rs_inband; /* Thresh to check if pusle is inband (0.5 dB) */ 27976bd547bSAdrian Chadd }; 28076bd547bSAdrian Chadd typedef struct { 28176bd547bSAdrian Chadd u_int8_t uc_receiver_errors; 28276bd547bSAdrian Chadd u_int8_t uc_bad_tlp_errors; 28376bd547bSAdrian Chadd u_int8_t uc_bad_dllp_errors; 28476bd547bSAdrian Chadd u_int8_t uc_replay_timeout_errors; 28576bd547bSAdrian Chadd u_int8_t uc_replay_number_rollover_errors; 28676bd547bSAdrian Chadd } ar_pcie_error_moniter_counters; 28776bd547bSAdrian Chadd 28876bd547bSAdrian Chadd #define AR9300_OPFLAGS_11A 0x01 /* if set, allow 11a */ 28976bd547bSAdrian Chadd #define AR9300_OPFLAGS_11G 0x02 /* if set, allow 11g */ 29076bd547bSAdrian Chadd #define AR9300_OPFLAGS_N_5G_HT40 0x04 /* if set, disable 5G HT40 */ 29176bd547bSAdrian Chadd #define AR9300_OPFLAGS_N_2G_HT40 0x08 /* if set, disable 2G HT40 */ 29276bd547bSAdrian Chadd #define AR9300_OPFLAGS_N_5G_HT20 0x10 /* if set, disable 5G HT20 */ 29376bd547bSAdrian Chadd #define AR9300_OPFLAGS_N_2G_HT20 0x20 /* if set, disable 2G HT20 */ 29476bd547bSAdrian Chadd 29576bd547bSAdrian Chadd /* 29676bd547bSAdrian Chadd * For Kite and later chipsets, the following bits are not being programmed in EEPROM 29776bd547bSAdrian Chadd * and so need to be enabled always. 29876bd547bSAdrian Chadd * Bit 0: en_fcc_mid, Bit 1: en_jap_mid, Bit 2: en_fcc_dfs_ht40 29976bd547bSAdrian Chadd * Bit 3: en_jap_ht40, Bit 4: en_jap_dfs_ht40 30076bd547bSAdrian Chadd */ 30176bd547bSAdrian Chadd #define AR9300_RDEXT_DEFAULT 0x1F 30276bd547bSAdrian Chadd 30376bd547bSAdrian Chadd #define AR9300_MAX_CHAINS 3 30476bd547bSAdrian Chadd #define AR9300_NUM_CHAINS(chainmask) \ 30576bd547bSAdrian Chadd (((chainmask >> 2) & 1) + ((chainmask >> 1) & 1) + (chainmask & 1)) 30676bd547bSAdrian Chadd #define AR9300_CHAIN0_MASK 0x1 30776bd547bSAdrian Chadd #define AR9300_CHAIN1_MASK 0x2 30876bd547bSAdrian Chadd #define AR9300_CHAIN2_MASK 0x4 30976bd547bSAdrian Chadd 31076bd547bSAdrian Chadd /* Support for multiple INIs */ 31176bd547bSAdrian Chadd struct ar9300_ini_array { 31277240069SDimitry Andric const u_int32_t *ia_array; 31376bd547bSAdrian Chadd u_int32_t ia_rows; 31476bd547bSAdrian Chadd u_int32_t ia_columns; 31576bd547bSAdrian Chadd }; 31676bd547bSAdrian Chadd #define INIT_INI_ARRAY(iniarray, array, rows, columns) do { \ 31777240069SDimitry Andric (iniarray)->ia_array = (const u_int32_t *)(array); \ 31876bd547bSAdrian Chadd (iniarray)->ia_rows = (rows); \ 31976bd547bSAdrian Chadd (iniarray)->ia_columns = (columns); \ 32076bd547bSAdrian Chadd } while (0) 32176bd547bSAdrian Chadd #define INI_RA(iniarray, row, column) (((iniarray)->ia_array)[(row) * ((iniarray)->ia_columns) + (column)]) 32276bd547bSAdrian Chadd 32376bd547bSAdrian Chadd #define INIT_CAL(_perCal) \ 32476bd547bSAdrian Chadd (_perCal)->cal_state = CAL_WAITING; \ 32576bd547bSAdrian Chadd (_perCal)->cal_next = AH_NULL; 32676bd547bSAdrian Chadd 32776bd547bSAdrian Chadd #define INSERT_CAL(_ahp, _perCal) \ 32876bd547bSAdrian Chadd do { \ 32976bd547bSAdrian Chadd if ((_ahp)->ah_cal_list_last == AH_NULL) { \ 33076bd547bSAdrian Chadd (_ahp)->ah_cal_list = (_ahp)->ah_cal_list_last = (_perCal); \ 33176bd547bSAdrian Chadd ((_ahp)->ah_cal_list_last)->cal_next = (_perCal); \ 33276bd547bSAdrian Chadd } else { \ 33376bd547bSAdrian Chadd ((_ahp)->ah_cal_list_last)->cal_next = (_perCal); \ 33476bd547bSAdrian Chadd (_ahp)->ah_cal_list_last = (_perCal); \ 33576bd547bSAdrian Chadd (_perCal)->cal_next = (_ahp)->ah_cal_list; \ 33676bd547bSAdrian Chadd } \ 33776bd547bSAdrian Chadd } while (0) 33876bd547bSAdrian Chadd 33976bd547bSAdrian Chadd typedef enum cal_types { 34076bd547bSAdrian Chadd IQ_MISMATCH_CAL = 0x1, 34176bd547bSAdrian Chadd TEMP_COMP_CAL = 0x2, 34276bd547bSAdrian Chadd } HAL_CAL_TYPES; 34376bd547bSAdrian Chadd 34476bd547bSAdrian Chadd typedef enum cal_state { 34576bd547bSAdrian Chadd CAL_INACTIVE, 34676bd547bSAdrian Chadd CAL_WAITING, 34776bd547bSAdrian Chadd CAL_RUNNING, 34876bd547bSAdrian Chadd CAL_DONE 34976bd547bSAdrian Chadd } HAL_CAL_STATE; /* Calibrate state */ 35076bd547bSAdrian Chadd 35176bd547bSAdrian Chadd #define MIN_CAL_SAMPLES 1 35276bd547bSAdrian Chadd #define MAX_CAL_SAMPLES 64 35376bd547bSAdrian Chadd #define INIT_LOG_COUNT 5 35476bd547bSAdrian Chadd #define PER_MIN_LOG_COUNT 2 35576bd547bSAdrian Chadd #define PER_MAX_LOG_COUNT 10 35676bd547bSAdrian Chadd 35776bd547bSAdrian Chadd #define AR9300_NUM_BT_WEIGHTS 4 35876bd547bSAdrian Chadd #define AR9300_NUM_WLAN_WEIGHTS 4 35976bd547bSAdrian Chadd 36076bd547bSAdrian Chadd /* Per Calibration data structure */ 36176bd547bSAdrian Chadd typedef struct per_cal_data { 36276bd547bSAdrian Chadd HAL_CAL_TYPES cal_type; // Type of calibration 36376bd547bSAdrian Chadd u_int32_t cal_num_samples; // Number of SW samples to collect 36476bd547bSAdrian Chadd u_int32_t cal_count_max; // Number of HW samples to collect 36576bd547bSAdrian Chadd void (*cal_collect)(struct ath_hal *, u_int8_t); // Accumulator func 36676bd547bSAdrian Chadd void (*cal_post_proc)(struct ath_hal *, u_int8_t); // Post-processing func 36776bd547bSAdrian Chadd } HAL_PERCAL_DATA; 36876bd547bSAdrian Chadd 36976bd547bSAdrian Chadd /* List structure for calibration data */ 37076bd547bSAdrian Chadd typedef struct cal_list { 37176bd547bSAdrian Chadd const HAL_PERCAL_DATA *cal_data; 37276bd547bSAdrian Chadd HAL_CAL_STATE cal_state; 37376bd547bSAdrian Chadd struct cal_list *cal_next; 37476bd547bSAdrian Chadd } HAL_CAL_LIST; 37576bd547bSAdrian Chadd 37676bd547bSAdrian Chadd #define AR9300_NUM_CAL_TYPES 2 37776bd547bSAdrian Chadd #define AR9300_PAPRD_TABLE_SZ 24 37876bd547bSAdrian Chadd #define AR9300_PAPRD_GAIN_TABLE_SZ 32 37976bd547bSAdrian Chadd #define AR9382_MAX_GPIO_PIN_NUM (16) 38076bd547bSAdrian Chadd #define AR9382_GPIO_PIN_8_RESERVED (8) 38176bd547bSAdrian Chadd #define AR9382_GPIO_9_INPUT_ONLY (9) 38276bd547bSAdrian Chadd #define AR9382_MAX_GPIO_INPUT_PIN_NUM (13) 38376bd547bSAdrian Chadd #define AR9382_GPIO_PIN_11_RESERVED (11) 38476bd547bSAdrian Chadd #define AR9382_MAX_JTAG_GPIO_PIN_NUM (3) 38576bd547bSAdrian Chadd 38676bd547bSAdrian Chadd /* Paprd tx power adjust data structure */ 38776bd547bSAdrian Chadd struct ar9300_paprd_pwr_adjust { 38876bd547bSAdrian Chadd u_int32_t target_rate; // rate index 38976bd547bSAdrian Chadd u_int32_t reg_addr; // register offset 39076bd547bSAdrian Chadd u_int32_t reg_mask; // mask of register 39176bd547bSAdrian Chadd u_int32_t reg_mask_offset; // mask offset of register 39276bd547bSAdrian Chadd u_int32_t sub_db; // offset value unit of dB 39376bd547bSAdrian Chadd }; 39476bd547bSAdrian Chadd 395e113789bSAdrian Chadd struct ar9300NfLimits { 396e113789bSAdrian Chadd int16_t max; 397e113789bSAdrian Chadd int16_t min; 398e113789bSAdrian Chadd int16_t nominal; 399e113789bSAdrian Chadd }; 400e113789bSAdrian Chadd 40176bd547bSAdrian Chadd #define AR9300_MAX_RATES 36 /* legacy(4) + ofdm(8) + HTSS(8) + HTDS(8) + HTTS(8)*/ 40276bd547bSAdrian Chadd struct ath_hal_9300 { 403e113789bSAdrian Chadd struct ath_hal_private ah_priv; /* base class */ 40476bd547bSAdrian Chadd 40576bd547bSAdrian Chadd /* 40676bd547bSAdrian Chadd * Information retrieved from EEPROM. 40776bd547bSAdrian Chadd */ 40876bd547bSAdrian Chadd ar9300_eeprom_t ah_eeprom; 40976bd547bSAdrian Chadd 41076bd547bSAdrian Chadd GAIN_VALUES ah_gain_values; 41176bd547bSAdrian Chadd 41276bd547bSAdrian Chadd u_int8_t ah_macaddr[IEEE80211_ADDR_LEN]; 41376bd547bSAdrian Chadd u_int8_t ah_bssid[IEEE80211_ADDR_LEN]; 41476bd547bSAdrian Chadd u_int8_t ah_bssid_mask[IEEE80211_ADDR_LEN]; 41576bd547bSAdrian Chadd u_int16_t ah_assoc_id; 41676bd547bSAdrian Chadd 41776bd547bSAdrian Chadd /* 41876bd547bSAdrian Chadd * Runtime state. 41976bd547bSAdrian Chadd */ 42076bd547bSAdrian Chadd u_int32_t ah_mask_reg; /* copy of AR_IMR */ 42176bd547bSAdrian Chadd u_int32_t ah_mask2Reg; /* copy of AR_IMR_S2 */ 42276bd547bSAdrian Chadd u_int32_t ah_msi_reg; /* copy of AR_PCIE_MSI */ 42376bd547bSAdrian Chadd os_atomic_t ah_ier_ref_count; /* reference count for enabling interrupts */ 424d5c3e61aSAdrian Chadd HAL_ANI_STATS ah_stats; /* various statistics */ 42576bd547bSAdrian Chadd RF_HAL_FUNCS ah_rf_hal; 42676bd547bSAdrian Chadd u_int32_t ah_tx_desc_mask; /* mask for TXDESC */ 42776bd547bSAdrian Chadd u_int32_t ah_tx_ok_interrupt_mask; 42876bd547bSAdrian Chadd u_int32_t ah_tx_err_interrupt_mask; 42976bd547bSAdrian Chadd u_int32_t ah_tx_desc_interrupt_mask; 43076bd547bSAdrian Chadd u_int32_t ah_tx_eol_interrupt_mask; 43176bd547bSAdrian Chadd u_int32_t ah_tx_urn_interrupt_mask; 43276bd547bSAdrian Chadd HAL_TX_QUEUE_INFO ah_txq[HAL_NUM_TX_QUEUES]; 43376bd547bSAdrian Chadd HAL_SMPS_MODE ah_sm_power_mode; 43476bd547bSAdrian Chadd HAL_BOOL ah_chip_full_sleep; 43576bd547bSAdrian Chadd u_int32_t ah_atim_window; 43676bd547bSAdrian Chadd HAL_ANT_SETTING ah_diversity_control; /* antenna setting */ 43776bd547bSAdrian Chadd u_int16_t ah_antenna_switch_swap; /* Controls mapping of OID request */ 43876bd547bSAdrian Chadd u_int8_t ah_tx_chainmask_cfg; /* chain mask config */ 43976bd547bSAdrian Chadd u_int8_t ah_rx_chainmask_cfg; 44076bd547bSAdrian Chadd u_int32_t ah_beacon_rssi_threshold; /* cache beacon rssi threshold */ 44176bd547bSAdrian Chadd /* Calibration related fields */ 44276bd547bSAdrian Chadd HAL_CAL_TYPES ah_supp_cals; 44376bd547bSAdrian Chadd HAL_CAL_LIST ah_iq_cal_data; /* IQ Cal Data */ 44476bd547bSAdrian Chadd HAL_CAL_LIST ah_temp_comp_cal_data; /* Temperature Compensation Cal Data */ 44576bd547bSAdrian Chadd HAL_CAL_LIST *ah_cal_list; /* ptr to first cal in list */ 44676bd547bSAdrian Chadd HAL_CAL_LIST *ah_cal_list_last; /* ptr to last cal in list */ 44776bd547bSAdrian Chadd HAL_CAL_LIST *ah_cal_list_curr; /* ptr to current cal */ 44876bd547bSAdrian Chadd // IQ Cal aliases 44976bd547bSAdrian Chadd #define ah_total_power_meas_i ah_meas0.unsign 45076bd547bSAdrian Chadd #define ah_total_power_meas_q ah_meas1.unsign 45176bd547bSAdrian Chadd #define ah_total_iq_corr_meas ah_meas2.sign 45276bd547bSAdrian Chadd union { 45376bd547bSAdrian Chadd u_int32_t unsign[AR9300_MAX_CHAINS]; 45476bd547bSAdrian Chadd int32_t sign[AR9300_MAX_CHAINS]; 45576bd547bSAdrian Chadd } ah_meas0; 45676bd547bSAdrian Chadd union { 45776bd547bSAdrian Chadd u_int32_t unsign[AR9300_MAX_CHAINS]; 45876bd547bSAdrian Chadd int32_t sign[AR9300_MAX_CHAINS]; 45976bd547bSAdrian Chadd } ah_meas1; 46076bd547bSAdrian Chadd union { 46176bd547bSAdrian Chadd u_int32_t unsign[AR9300_MAX_CHAINS]; 46276bd547bSAdrian Chadd int32_t sign[AR9300_MAX_CHAINS]; 46376bd547bSAdrian Chadd } ah_meas2; 46476bd547bSAdrian Chadd union { 46576bd547bSAdrian Chadd u_int32_t unsign[AR9300_MAX_CHAINS]; 46676bd547bSAdrian Chadd int32_t sign[AR9300_MAX_CHAINS]; 46776bd547bSAdrian Chadd } ah_meas3; 46876bd547bSAdrian Chadd u_int16_t ah_cal_samples; 46976bd547bSAdrian Chadd /* end - Calibration related fields */ 47076bd547bSAdrian Chadd u_int32_t ah_tx6_power_in_half_dbm; /* power output for 6Mb tx */ 47176bd547bSAdrian Chadd u_int32_t ah_sta_id1_defaults; /* STA_ID1 default settings */ 47276bd547bSAdrian Chadd u_int32_t ah_misc_mode; /* MISC_MODE settings */ 47376bd547bSAdrian Chadd HAL_BOOL ah_get_plcp_hdr; /* setting about MISC_SEL_EVM */ 47476bd547bSAdrian Chadd enum { 47576bd547bSAdrian Chadd AUTO_32KHZ, /* use it if 32kHz crystal present */ 47676bd547bSAdrian Chadd USE_32KHZ, /* do it regardless */ 47776bd547bSAdrian Chadd DONT_USE_32KHZ, /* don't use it regardless */ 47876bd547bSAdrian Chadd } ah_enable32k_hz_clock; /* whether to sleep at 32kHz */ 47976bd547bSAdrian Chadd 48076bd547bSAdrian Chadd u_int32_t ah_ofdm_tx_power; 48176bd547bSAdrian Chadd int16_t ah_tx_power_index_offset; 48276bd547bSAdrian Chadd 48376bd547bSAdrian Chadd u_int ah_slot_time; /* user-specified slot time */ 48476bd547bSAdrian Chadd u_int ah_ack_timeout; /* user-specified ack timeout */ 48576bd547bSAdrian Chadd /* 48676bd547bSAdrian Chadd * XXX 48776bd547bSAdrian Chadd * 11g-specific stuff; belongs in the driver. 48876bd547bSAdrian Chadd */ 48976bd547bSAdrian Chadd u_int8_t ah_g_beacon_rate; /* fixed rate for G beacons */ 49076bd547bSAdrian Chadd u_int32_t ah_gpio_mask; /* copy of enabled GPIO mask */ 49176bd547bSAdrian Chadd u_int32_t ah_gpio_cause; /* copy of GPIO cause (sync and async) */ 49276bd547bSAdrian Chadd /* 49376bd547bSAdrian Chadd * RF Silent handling; setup according to the EEPROM. 49476bd547bSAdrian Chadd */ 49576bd547bSAdrian Chadd u_int32_t ah_gpio_select; /* GPIO pin to use */ 49676bd547bSAdrian Chadd u_int32_t ah_polarity; /* polarity to disable RF */ 49776bd547bSAdrian Chadd u_int32_t ah_gpio_bit; /* after init, prev value */ 49876bd547bSAdrian Chadd HAL_BOOL ah_eep_enabled; /* EEPROM bit for capability */ 49976bd547bSAdrian Chadd 50076bd547bSAdrian Chadd #ifdef ATH_BT_COEX 50176bd547bSAdrian Chadd /* 50276bd547bSAdrian Chadd * Bluetooth coexistence static setup according to the registry 50376bd547bSAdrian Chadd */ 50476bd547bSAdrian Chadd HAL_BT_MODULE ah_bt_module; /* Bluetooth module identifier */ 50576bd547bSAdrian Chadd u_int8_t ah_bt_coex_config_type; /* BT coex configuration */ 50676bd547bSAdrian Chadd u_int8_t ah_bt_active_gpio_select; /* GPIO pin for BT_ACTIVE */ 50776bd547bSAdrian Chadd u_int8_t ah_bt_priority_gpio_select; /* GPIO pin for BT_PRIORITY */ 50876bd547bSAdrian Chadd u_int8_t ah_wlan_active_gpio_select; /* GPIO pin for WLAN_ACTIVE */ 50976bd547bSAdrian Chadd u_int8_t ah_bt_active_polarity; /* Polarity of BT_ACTIVE */ 51076bd547bSAdrian Chadd HAL_BOOL ah_bt_coex_single_ant; /* Single or dual antenna configuration */ 51176bd547bSAdrian Chadd u_int8_t ah_bt_wlan_isolation; /* Isolation between BT and WLAN in dB */ 51276bd547bSAdrian Chadd /* 51376bd547bSAdrian Chadd * Bluetooth coexistence runtime settings 51476bd547bSAdrian Chadd */ 51576bd547bSAdrian Chadd HAL_BOOL ah_bt_coex_enabled; /* If Bluetooth coexistence is enabled */ 51676bd547bSAdrian Chadd u_int32_t ah_bt_coex_mode; /* Register setting for AR_BT_COEX_MODE */ 51776bd547bSAdrian Chadd u_int32_t ah_bt_coex_bt_weight[AR9300_NUM_BT_WEIGHTS]; /* Register setting for AR_BT_COEX_WEIGHT */ 51876bd547bSAdrian Chadd u_int32_t ah_bt_coex_wlan_weight[AR9300_NUM_WLAN_WEIGHTS]; /* Register setting for AR_BT_COEX_WEIGHT */ 51976bd547bSAdrian Chadd u_int32_t ah_bt_coex_mode2; /* Register setting for AR_BT_COEX_MODE2 */ 52076bd547bSAdrian Chadd u_int32_t ah_bt_coex_flag; /* Special tuning flags for BT coex */ 52176bd547bSAdrian Chadd #endif 52276bd547bSAdrian Chadd 52376bd547bSAdrian Chadd /* 52476bd547bSAdrian Chadd * Generic timer support 52576bd547bSAdrian Chadd */ 52676bd547bSAdrian Chadd u_int32_t ah_avail_gen_timers; /* mask of available timers */ 52776bd547bSAdrian Chadd u_int32_t ah_intr_gen_timer_trigger; /* generic timer trigger interrupt state */ 52876bd547bSAdrian Chadd u_int32_t ah_intr_gen_timer_thresh; /* generic timer trigger interrupt state */ 52976bd547bSAdrian Chadd HAL_BOOL ah_enable_tsf2; /* enable TSF2 for gen timer 8-15. */ 53076bd547bSAdrian Chadd 53176bd547bSAdrian Chadd /* 53276bd547bSAdrian Chadd * ANI & Radar support. 53376bd547bSAdrian Chadd */ 53476bd547bSAdrian Chadd u_int32_t ah_proc_phy_err; /* Process Phy errs */ 53576bd547bSAdrian Chadd u_int32_t ah_ani_period; /* ani update list period */ 53676bd547bSAdrian Chadd struct ar9300_ani_state *ah_curani; /* cached last reference */ 53776bd547bSAdrian Chadd struct ar9300_ani_state ah_ani[255]; /* per-channel state */ 53876bd547bSAdrian Chadd struct ar9300_radar_state ah_radar[HAL_NUMRADAR_STATES]; /* Per-Channel Radar detector state */ 53976bd547bSAdrian Chadd struct ar9300_radar_q_elem *ah_radarq; /* radar event queue */ 54076bd547bSAdrian Chadd struct ar9300_radar_q_info ah_radarq_info; /* radar event q read/write state */ 54176bd547bSAdrian Chadd struct ar9300_ar_state ah_ar; /* AR detector state */ 54276bd547bSAdrian Chadd struct ar9300_radar_q_elem *ah_arq; /* AR event queue */ 54376bd547bSAdrian Chadd struct ar9300_radar_q_info ah_arq_info; /* AR event q read/write state */ 54476bd547bSAdrian Chadd 54576bd547bSAdrian Chadd /* 54676bd547bSAdrian Chadd * Transmit power state. Note these are maintained 54776bd547bSAdrian Chadd * here so they can be retrieved by diagnostic tools. 54876bd547bSAdrian Chadd */ 54976bd547bSAdrian Chadd u_int16_t ah_rates_array[16]; 55076bd547bSAdrian Chadd 55176bd547bSAdrian Chadd /* 55276bd547bSAdrian Chadd * Tx queue interrupt state. 55376bd547bSAdrian Chadd */ 55476bd547bSAdrian Chadd u_int32_t ah_intr_txqs; 55576bd547bSAdrian Chadd 55676bd547bSAdrian Chadd HAL_BOOL ah_intr_mitigation_rx; /* rx Interrupt Mitigation Settings */ 55776bd547bSAdrian Chadd HAL_BOOL ah_intr_mitigation_tx; /* tx Interrupt Mitigation Settings */ 55876bd547bSAdrian Chadd 55976bd547bSAdrian Chadd /* 56076bd547bSAdrian Chadd * Extension Channel Rx Clear State 56176bd547bSAdrian Chadd */ 56276bd547bSAdrian Chadd u_int32_t ah_cycle_count; 56376bd547bSAdrian Chadd u_int32_t ah_ctl_busy; 56476bd547bSAdrian Chadd u_int32_t ah_ext_busy; 56576bd547bSAdrian Chadd 56676bd547bSAdrian Chadd /* HT CWM state */ 56776bd547bSAdrian Chadd HAL_HT_EXTPROTSPACING ah_ext_prot_spacing; 56876bd547bSAdrian Chadd u_int8_t ah_tx_chainmask; /* tx chain mask */ 56976bd547bSAdrian Chadd u_int8_t ah_rx_chainmask; /* rx chain mask */ 57076bd547bSAdrian Chadd 571899d1cacSAdrian Chadd /* optional tx chainmask */ 572899d1cacSAdrian Chadd u_int8_t ah_tx_chainmaskopt; 573899d1cacSAdrian Chadd 57476bd547bSAdrian Chadd u_int8_t ah_tx_cal_chainmask; /* tx cal chain mask */ 57576bd547bSAdrian Chadd u_int8_t ah_rx_cal_chainmask; /* rx cal chain mask */ 57676bd547bSAdrian Chadd 57776bd547bSAdrian Chadd int ah_hwp; 57876bd547bSAdrian Chadd void *ah_cal_mem; 57976bd547bSAdrian Chadd HAL_BOOL ah_emu_eeprom; 58076bd547bSAdrian Chadd 58176bd547bSAdrian Chadd HAL_ANI_CMD ah_ani_function; 58276bd547bSAdrian Chadd HAL_BOOL ah_rifs_enabled; 58376bd547bSAdrian Chadd u_int32_t ah_rifs_reg[11]; 58476bd547bSAdrian Chadd u_int32_t ah_rifs_sec_cnt; 58576bd547bSAdrian Chadd 58676bd547bSAdrian Chadd /* open-loop power control */ 58776bd547bSAdrian Chadd u_int32_t original_gain[22]; 58876bd547bSAdrian Chadd int32_t init_pdadc; 58976bd547bSAdrian Chadd int32_t pdadc_delta; 59076bd547bSAdrian Chadd 59176bd547bSAdrian Chadd /* cycle counts for beacon stuck diagnostics */ 59276bd547bSAdrian Chadd u_int32_t ah_cycles; 59376bd547bSAdrian Chadd u_int32_t ah_rx_clear; 59476bd547bSAdrian Chadd u_int32_t ah_rx_frame; 59576bd547bSAdrian Chadd u_int32_t ah_tx_frame; 59676bd547bSAdrian Chadd 59776bd547bSAdrian Chadd #define BB_HANG_SIG1 0 59876bd547bSAdrian Chadd #define BB_HANG_SIG2 1 59976bd547bSAdrian Chadd #define BB_HANG_SIG3 2 60076bd547bSAdrian Chadd #define BB_HANG_SIG4 3 60176bd547bSAdrian Chadd #define MAC_HANG_SIG1 4 60276bd547bSAdrian Chadd #define MAC_HANG_SIG2 5 60376bd547bSAdrian Chadd /* bb hang detection */ 60476bd547bSAdrian Chadd int ah_hang[6]; 60576bd547bSAdrian Chadd hal_hw_hangs_t ah_hang_wars; 606e113789bSAdrian Chadd 607e113789bSAdrian Chadd /* 608e113789bSAdrian Chadd * Keytable type table 609e113789bSAdrian Chadd */ 610e113789bSAdrian Chadd #define AR_KEYTABLE_SIZE 128 /* XXX! */ 611e113789bSAdrian Chadd uint8_t ah_keytype[AR_KEYTABLE_SIZE]; 612e113789bSAdrian Chadd #undef AR_KEYTABLE_SIZE 61376bd547bSAdrian Chadd /* 61476bd547bSAdrian Chadd * Support for ar9300 multiple INIs 61576bd547bSAdrian Chadd */ 61676bd547bSAdrian Chadd struct ar9300_ini_array ah_ini_pcie_serdes; 61776bd547bSAdrian Chadd struct ar9300_ini_array ah_ini_pcie_serdes_low_power; 61876bd547bSAdrian Chadd struct ar9300_ini_array ah_ini_modes_additional; 61976bd547bSAdrian Chadd struct ar9300_ini_array ah_ini_modes_additional_40mhz; 62076bd547bSAdrian Chadd struct ar9300_ini_array ah_ini_modes_rxgain; 62176bd547bSAdrian Chadd struct ar9300_ini_array ah_ini_modes_rxgain_bounds; 62276bd547bSAdrian Chadd struct ar9300_ini_array ah_ini_modes_txgain; 62376bd547bSAdrian Chadd struct ar9300_ini_array ah_ini_japan2484; 62476bd547bSAdrian Chadd struct ar9300_ini_array ah_ini_radio_post_sys2ant; 62576bd547bSAdrian Chadd struct ar9300_ini_array ah_ini_BTCOEX_MAX_TXPWR; 62609ff344bSAdrian Chadd struct ar9300_ini_array ah_ini_modes_rxgain_xlna; 62709ff344bSAdrian Chadd struct ar9300_ini_array ah_ini_modes_rxgain_bb_core; 62809ff344bSAdrian Chadd struct ar9300_ini_array ah_ini_modes_rxgain_bb_postamble; 62909ff344bSAdrian Chadd 63076bd547bSAdrian Chadd /* 63176bd547bSAdrian Chadd * New INI format starting with Osprey 2.0 INI. 63276bd547bSAdrian Chadd * Pre, core, post arrays for each sub-system (mac, bb, radio, soc) 63376bd547bSAdrian Chadd */ 63476bd547bSAdrian Chadd #define ATH_INI_PRE 0 63576bd547bSAdrian Chadd #define ATH_INI_CORE 1 63676bd547bSAdrian Chadd #define ATH_INI_POST 2 63776bd547bSAdrian Chadd #define ATH_INI_NUM_SPLIT (ATH_INI_POST + 1) 63876bd547bSAdrian Chadd struct ar9300_ini_array ah_ini_mac[ATH_INI_NUM_SPLIT]; /* New INI format */ 63976bd547bSAdrian Chadd struct ar9300_ini_array ah_ini_bb[ATH_INI_NUM_SPLIT]; /* New INI format */ 64076bd547bSAdrian Chadd struct ar9300_ini_array ah_ini_radio[ATH_INI_NUM_SPLIT]; /* New INI format */ 64176bd547bSAdrian Chadd struct ar9300_ini_array ah_ini_soc[ATH_INI_NUM_SPLIT]; /* New INI format */ 64276bd547bSAdrian Chadd 64376bd547bSAdrian Chadd /* 64476bd547bSAdrian Chadd * Added to support DFS postamble array in INI that we need to apply 64576bd547bSAdrian Chadd * in DFS channels 64676bd547bSAdrian Chadd */ 64776bd547bSAdrian Chadd 64876bd547bSAdrian Chadd struct ar9300_ini_array ah_ini_dfs; 64976bd547bSAdrian Chadd 65076bd547bSAdrian Chadd #if ATH_WOW 65176bd547bSAdrian Chadd struct ar9300_ini_array ah_ini_pcie_serdes_wow; /* SerDes values during WOW sleep */ 65276bd547bSAdrian Chadd #endif 65376bd547bSAdrian Chadd 65476bd547bSAdrian Chadd /* To indicate EEPROM mapping used */ 65576bd547bSAdrian Chadd u_int32_t ah_immunity_vals[6]; 65676bd547bSAdrian Chadd HAL_BOOL ah_immunity_on; 65776bd547bSAdrian Chadd /* 65876bd547bSAdrian Chadd * snap shot of counter register for debug purposes 65976bd547bSAdrian Chadd */ 66076bd547bSAdrian Chadd #ifdef AH_DEBUG 66176bd547bSAdrian Chadd u_int32_t last_tf; 66276bd547bSAdrian Chadd u_int32_t last_rf; 66376bd547bSAdrian Chadd u_int32_t last_rc; 66476bd547bSAdrian Chadd u_int32_t last_cc; 66576bd547bSAdrian Chadd #endif 66676bd547bSAdrian Chadd HAL_BOOL ah_dma_stuck; /* Set to AH_TRUE when RX/TX DMA failed to stop. */ 66776bd547bSAdrian Chadd u_int32_t nf_tsf32; /* timestamp for NF calibration duration */ 66876bd547bSAdrian Chadd 66976bd547bSAdrian Chadd u_int32_t reg_dmn; /* Regulatory Domain */ 67076bd547bSAdrian Chadd int16_t twice_antenna_gain; /* Antenna Gain */ 67176bd547bSAdrian Chadd u_int16_t twice_antenna_reduction; /* Antenna Gain Allowed */ 67276bd547bSAdrian Chadd 67376bd547bSAdrian Chadd /* 67476bd547bSAdrian Chadd * Upper limit after factoring in the regulatory max, antenna gain and 67576bd547bSAdrian Chadd * multichain factor. No TxBF, CDD or STBC gain factored 67676bd547bSAdrian Chadd */ 67776bd547bSAdrian Chadd int16_t upper_limit[AR9300_MAX_CHAINS]; 67876bd547bSAdrian Chadd 67976bd547bSAdrian Chadd /* adjusted power for descriptor-based TPC for 1, 2, or 3 chains */ 68076bd547bSAdrian Chadd int16_t txpower[AR9300_MAX_RATES][AR9300_MAX_CHAINS]; 68176bd547bSAdrian Chadd 68276bd547bSAdrian Chadd /* adjusted power for descriptor-based TPC for 1, 2, or 3 chains with STBC*/ 68376bd547bSAdrian Chadd int16_t txpower_stbc[AR9300_MAX_RATES][AR9300_MAX_CHAINS]; 68476bd547bSAdrian Chadd 68576bd547bSAdrian Chadd /* Transmit Status ring support */ 68676bd547bSAdrian Chadd struct ar9300_txs *ts_ring; 68776bd547bSAdrian Chadd u_int16_t ts_tail; 68876bd547bSAdrian Chadd u_int16_t ts_size; 68976bd547bSAdrian Chadd u_int32_t ts_paddr_start; 69076bd547bSAdrian Chadd u_int32_t ts_paddr_end; 69176bd547bSAdrian Chadd 69276bd547bSAdrian Chadd /* Receive Buffer size */ 69376bd547bSAdrian Chadd #define HAL_RXBUFSIZE_DEFAULT 0xfff 69476bd547bSAdrian Chadd u_int16_t rx_buf_size; 69576bd547bSAdrian Chadd 69676bd547bSAdrian Chadd u_int32_t ah_wa_reg_val; // Store the permanent value of Reg 0x4004 so we dont have to R/M/W. (We should not be reading this register when in sleep states). 69776bd547bSAdrian Chadd 69876bd547bSAdrian Chadd /* Indicate the PLL source clock rate is 25Mhz or not. 69976bd547bSAdrian Chadd * clk_25mhz = 0 by default. 70076bd547bSAdrian Chadd */ 70176bd547bSAdrian Chadd u_int8_t clk_25mhz; 70276bd547bSAdrian Chadd /* For PAPRD uses */ 70376bd547bSAdrian Chadd u_int16_t small_signal_gain[AH_MAX_CHAINS]; 70476bd547bSAdrian Chadd u_int32_t pa_table[AH_MAX_CHAINS][AR9300_PAPRD_TABLE_SZ]; 70576bd547bSAdrian Chadd u_int32_t paprd_gain_table_entries[AR9300_PAPRD_GAIN_TABLE_SZ]; 70676bd547bSAdrian Chadd u_int32_t paprd_gain_table_index[AR9300_PAPRD_GAIN_TABLE_SZ]; 70776bd547bSAdrian Chadd u_int32_t ah_2g_paprd_rate_mask_ht20; /* Copy of eep->modal_header_2g.paprd_rate_mask_ht20 */ 70876bd547bSAdrian Chadd u_int32_t ah_2g_paprd_rate_mask_ht40; /* Copy of eep->modal_header_2g.paprd_rate_mask_ht40 */ 70976bd547bSAdrian Chadd u_int32_t ah_5g_paprd_rate_mask_ht20; /* Copy of eep->modal_header_5g.paprd_rate_mask_ht20 */ 71076bd547bSAdrian Chadd u_int32_t ah_5g_paprd_rate_mask_ht40; /* Copy of eep->modal_header_5g.paprd_rate_mask_ht40 */ 71176bd547bSAdrian Chadd u_int32_t paprd_training_power; 71276bd547bSAdrian Chadd /* For GreenTx use to store the default tx power */ 71376bd547bSAdrian Chadd u_int8_t ah_default_tx_power[ar9300_rate_size]; 71476bd547bSAdrian Chadd HAL_BOOL ah_paprd_broken; 71576bd547bSAdrian Chadd 71676bd547bSAdrian Chadd /* To store offsets of host interface registers */ 71776bd547bSAdrian Chadd struct { 71876bd547bSAdrian Chadd u_int32_t AR_RC; 71976bd547bSAdrian Chadd u_int32_t AR_WA; 72076bd547bSAdrian Chadd u_int32_t AR_PM_STATE; 72176bd547bSAdrian Chadd u_int32_t AR_H_INFOL; 72276bd547bSAdrian Chadd u_int32_t AR_H_INFOH; 72376bd547bSAdrian Chadd u_int32_t AR_PCIE_PM_CTRL; 72476bd547bSAdrian Chadd u_int32_t AR_HOST_TIMEOUT; 72576bd547bSAdrian Chadd u_int32_t AR_EEPROM; 72676bd547bSAdrian Chadd u_int32_t AR_SREV; 72776bd547bSAdrian Chadd u_int32_t AR_INTR_SYNC_CAUSE; 72876bd547bSAdrian Chadd u_int32_t AR_INTR_SYNC_CAUSE_CLR; 72976bd547bSAdrian Chadd u_int32_t AR_INTR_SYNC_ENABLE; 73076bd547bSAdrian Chadd u_int32_t AR_INTR_ASYNC_MASK; 73176bd547bSAdrian Chadd u_int32_t AR_INTR_SYNC_MASK; 73276bd547bSAdrian Chadd u_int32_t AR_INTR_ASYNC_CAUSE_CLR; 73376bd547bSAdrian Chadd u_int32_t AR_INTR_ASYNC_CAUSE; 73476bd547bSAdrian Chadd u_int32_t AR_INTR_ASYNC_ENABLE; 73576bd547bSAdrian Chadd u_int32_t AR_PCIE_SERDES; 73676bd547bSAdrian Chadd u_int32_t AR_PCIE_SERDES2; 73776bd547bSAdrian Chadd u_int32_t AR_GPIO_OUT; 73876bd547bSAdrian Chadd u_int32_t AR_GPIO_IN; 73976bd547bSAdrian Chadd u_int32_t AR_GPIO_OE_OUT; 74076bd547bSAdrian Chadd u_int32_t AR_GPIO_OE1_OUT; 74176bd547bSAdrian Chadd u_int32_t AR_GPIO_INTR_POL; 74276bd547bSAdrian Chadd u_int32_t AR_GPIO_INPUT_EN_VAL; 74376bd547bSAdrian Chadd u_int32_t AR_GPIO_INPUT_MUX1; 74476bd547bSAdrian Chadd u_int32_t AR_GPIO_INPUT_MUX2; 74576bd547bSAdrian Chadd u_int32_t AR_GPIO_OUTPUT_MUX1; 74676bd547bSAdrian Chadd u_int32_t AR_GPIO_OUTPUT_MUX2; 74776bd547bSAdrian Chadd u_int32_t AR_GPIO_OUTPUT_MUX3; 74876bd547bSAdrian Chadd u_int32_t AR_INPUT_STATE; 74976bd547bSAdrian Chadd u_int32_t AR_SPARE; 75076bd547bSAdrian Chadd u_int32_t AR_PCIE_CORE_RESET_EN; 75176bd547bSAdrian Chadd u_int32_t AR_CLKRUN; 75276bd547bSAdrian Chadd u_int32_t AR_EEPROM_STATUS_DATA; 75376bd547bSAdrian Chadd u_int32_t AR_OBS; 75476bd547bSAdrian Chadd u_int32_t AR_RFSILENT; 75576bd547bSAdrian Chadd u_int32_t AR_GPIO_PDPU; 75676bd547bSAdrian Chadd u_int32_t AR_GPIO_DS; 75776bd547bSAdrian Chadd u_int32_t AR_MISC; 75876bd547bSAdrian Chadd u_int32_t AR_PCIE_MSI; 75976bd547bSAdrian Chadd u_int32_t AR_TSF_SNAPSHOT_BT_ACTIVE; 76076bd547bSAdrian Chadd u_int32_t AR_TSF_SNAPSHOT_BT_PRIORITY; 76176bd547bSAdrian Chadd u_int32_t AR_TSF_SNAPSHOT_BT_CNTL; 76276bd547bSAdrian Chadd u_int32_t AR_PCIE_PHY_LATENCY_NFTS_ADJ; 76376bd547bSAdrian Chadd u_int32_t AR_TDMA_CCA_CNTL; 76476bd547bSAdrian Chadd u_int32_t AR_TXAPSYNC; 76576bd547bSAdrian Chadd u_int32_t AR_TXSYNC_INIT_SYNC_TMR; 76676bd547bSAdrian Chadd u_int32_t AR_INTR_PRIO_SYNC_CAUSE; 76776bd547bSAdrian Chadd u_int32_t AR_INTR_PRIO_SYNC_ENABLE; 76876bd547bSAdrian Chadd u_int32_t AR_INTR_PRIO_ASYNC_MASK; 76976bd547bSAdrian Chadd u_int32_t AR_INTR_PRIO_SYNC_MASK; 77076bd547bSAdrian Chadd u_int32_t AR_INTR_PRIO_ASYNC_CAUSE; 77176bd547bSAdrian Chadd u_int32_t AR_INTR_PRIO_ASYNC_ENABLE; 77276bd547bSAdrian Chadd } ah_hostifregs; 77376bd547bSAdrian Chadd 77476bd547bSAdrian Chadd u_int32_t ah_enterprise_mode; 77576bd547bSAdrian Chadd u_int32_t ah_radar1; 77676bd547bSAdrian Chadd u_int32_t ah_dc_offset; 77776bd547bSAdrian Chadd HAL_BOOL ah_hw_green_tx_enable; /* 1:enalbe H/W Green Tx */ 77876bd547bSAdrian Chadd HAL_BOOL ah_smartantenna_enable; /* 1:enalbe H/W */ 77976bd547bSAdrian Chadd u_int32_t ah_disable_cck; 78076bd547bSAdrian Chadd HAL_BOOL ah_lna_div_use_bt_ant_enable; /* 1:enable Rx(LNA) Diversity */ 78176bd547bSAdrian Chadd 78276bd547bSAdrian Chadd 78376bd547bSAdrian Chadd /* 78476bd547bSAdrian Chadd * Different types of memory where the calibration data might be stored. 78576bd547bSAdrian Chadd * All types are searched in Ar9300EepromRestore() in the order flash, eeprom, otp. 78676bd547bSAdrian Chadd * To disable searching a type, set its parameter to 0. 78776bd547bSAdrian Chadd */ 78876bd547bSAdrian Chadd int try_dram; 78976bd547bSAdrian Chadd int try_flash; 79076bd547bSAdrian Chadd int try_eeprom; 79176bd547bSAdrian Chadd int try_otp; 79276bd547bSAdrian Chadd #ifdef ATH_CAL_NAND_FLASH 79376bd547bSAdrian Chadd int try_nand; 79476bd547bSAdrian Chadd #endif 79576bd547bSAdrian Chadd /* 79676bd547bSAdrian Chadd * This is where we found the calibration data. 79776bd547bSAdrian Chadd */ 79876bd547bSAdrian Chadd int calibration_data_source; 79976bd547bSAdrian Chadd int calibration_data_source_address; 80076bd547bSAdrian Chadd /* 80176bd547bSAdrian Chadd * This is where we look for the calibration data. must be set before ath_attach() is called 80276bd547bSAdrian Chadd */ 80376bd547bSAdrian Chadd int calibration_data_try; 80476bd547bSAdrian Chadd int calibration_data_try_address; 80576bd547bSAdrian Chadd u_int8_t 80676bd547bSAdrian Chadd tx_iq_cal_enable : 1, 80776bd547bSAdrian Chadd tx_iq_cal_during_agc_cal : 1, 80876bd547bSAdrian Chadd tx_cl_cal_enable : 1; 80976bd547bSAdrian Chadd 81076bd547bSAdrian Chadd #if ATH_SUPPORT_MCI 81176bd547bSAdrian Chadd /* For MCI */ 81276bd547bSAdrian Chadd HAL_BOOL ah_mci_ready; 81376bd547bSAdrian Chadd u_int32_t ah_mci_int_raw; 81476bd547bSAdrian Chadd u_int32_t ah_mci_int_rx_msg; 81576bd547bSAdrian Chadd u_int32_t ah_mci_rx_status; 81676bd547bSAdrian Chadd u_int32_t ah_mci_cont_status; 81776bd547bSAdrian Chadd u_int8_t ah_mci_bt_state; 81876bd547bSAdrian Chadd u_int32_t ah_mci_gpm_addr; 81976bd547bSAdrian Chadd u_int8_t *ah_mci_gpm_buf; 82076bd547bSAdrian Chadd u_int32_t ah_mci_gpm_len; 82176bd547bSAdrian Chadd u_int32_t ah_mci_gpm_idx; 82276bd547bSAdrian Chadd u_int32_t ah_mci_sched_addr; 82376bd547bSAdrian Chadd u_int8_t *ah_mci_sched_buf; 82476bd547bSAdrian Chadd u_int8_t ah_mci_coex_major_version_wlan; 82576bd547bSAdrian Chadd u_int8_t ah_mci_coex_minor_version_wlan; 82676bd547bSAdrian Chadd u_int8_t ah_mci_coex_major_version_bt; 82776bd547bSAdrian Chadd u_int8_t ah_mci_coex_minor_version_bt; 82876bd547bSAdrian Chadd HAL_BOOL ah_mci_coex_bt_version_known; 82976bd547bSAdrian Chadd HAL_BOOL ah_mci_coex_wlan_channels_update; 83076bd547bSAdrian Chadd u_int32_t ah_mci_coex_wlan_channels[4]; 83176bd547bSAdrian Chadd HAL_BOOL ah_mci_coex_2g5g_update; 83276bd547bSAdrian Chadd HAL_BOOL ah_mci_coex_is_2g; 83376bd547bSAdrian Chadd HAL_BOOL ah_mci_query_bt; 83476bd547bSAdrian Chadd HAL_BOOL ah_mci_unhalt_bt_gpm; /* need send UNHALT */ 83576bd547bSAdrian Chadd HAL_BOOL ah_mci_halted_bt_gpm; /* HALT sent */ 83676bd547bSAdrian Chadd HAL_BOOL ah_mci_need_flush_btinfo; 83776bd547bSAdrian Chadd HAL_BOOL ah_mci_concur_tx_en; 83876bd547bSAdrian Chadd u_int8_t ah_mci_stomp_low_tx_pri; 83976bd547bSAdrian Chadd u_int8_t ah_mci_stomp_all_tx_pri; 84076bd547bSAdrian Chadd u_int8_t ah_mci_stomp_none_tx_pri; 84176bd547bSAdrian Chadd u_int32_t ah_mci_wlan_cal_seq; 84276bd547bSAdrian Chadd u_int32_t ah_mci_wlan_cal_done; 84376bd547bSAdrian Chadd #if ATH_SUPPORT_AIC 84476bd547bSAdrian Chadd HAL_BOOL ah_aic_enabled; 84576bd547bSAdrian Chadd u_int32_t ah_aic_sram[ATH_AIC_MAX_BT_CHANNEL]; 84676bd547bSAdrian Chadd #endif 847899d1cacSAdrian Chadd 84876bd547bSAdrian Chadd #endif /* ATH_SUPPORT_MCI */ 84976bd547bSAdrian Chadd u_int8_t ah_cac_quiet_enabled; 85076bd547bSAdrian Chadd #if ATH_WOW_OFFLOAD 85176bd547bSAdrian Chadd u_int32_t ah_mcast_filter_l32_set; 85276bd547bSAdrian Chadd u_int32_t ah_mcast_filter_u32_set; 85376bd547bSAdrian Chadd #endif 85476bd547bSAdrian Chadd HAL_BOOL ah_reduced_self_gen_mask; 855899d1cacSAdrian Chadd HAL_BOOL ah_chip_reset_done; 856899d1cacSAdrian Chadd HAL_BOOL ah_abort_txdma_norx; 857899d1cacSAdrian Chadd /* store previous passive RX Cal info */ 858899d1cacSAdrian Chadd HAL_BOOL ah_skip_rx_iq_cal; 859899d1cacSAdrian Chadd HAL_BOOL ah_rx_cal_complete; /* previous rx cal completed or not */ 860899d1cacSAdrian Chadd u_int32_t ah_rx_cal_chan; /* chan on which rx cal is done */ 861899d1cacSAdrian Chadd u_int32_t ah_rx_cal_chan_flag; 862899d1cacSAdrian Chadd u_int32_t ah_rx_cal_corr[AR9300_MAX_CHAINS]; 863e113789bSAdrian Chadd 864e113789bSAdrian Chadd /* Local additions for FreeBSD */ 865e113789bSAdrian Chadd /* 866e113789bSAdrian Chadd * These fields are in the top level HAL in the atheros 867e113789bSAdrian Chadd * codebase; here we place them in the AR9300 HAL and 868e113789bSAdrian Chadd * access them via accessor methods if the driver requires them. 869e113789bSAdrian Chadd */ 870e113789bSAdrian Chadd u_int32_t ah_ob_db1[3]; 871e113789bSAdrian Chadd u_int32_t ah_db2[3]; 872e113789bSAdrian Chadd u_int32_t ah_bb_panic_timeout_ms; 873e113789bSAdrian Chadd u_int32_t ah_bb_panic_last_status; 874e113789bSAdrian Chadd u_int32_t ah_tx_trig_level; 875e113789bSAdrian Chadd u_int16_t ath_hal_spur_chans[AR_EEPROM_MODAL_SPURS][2]; 876e113789bSAdrian Chadd int16_t nf_cw_int_delta; /* diff btwn nominal NF and CW interf threshold */ 877e113789bSAdrian Chadd int ah_phyrestart_disabled; 878e113789bSAdrian Chadd HAL_RSSI_TX_POWER green_tx_status; 879e113789bSAdrian Chadd int green_ap_ps_on; 880e113789bSAdrian Chadd int ah_enable_keysearch_always; 881e113789bSAdrian Chadd int ah_fccaifs; 882e113789bSAdrian Chadd int ah_reset_reason; 883e113789bSAdrian Chadd int ah_dcs_enable; 884d5c3e61aSAdrian Chadd HAL_ANI_STATE ext_ani_state; /* FreeBSD; external facing ANI state */ 885e113789bSAdrian Chadd 886e113789bSAdrian Chadd struct ar9300NfLimits nf_2GHz; 887e113789bSAdrian Chadd struct ar9300NfLimits nf_5GHz; 888e113789bSAdrian Chadd struct ar9300NfLimits *nfp; 88978b812deSAdrian Chadd 89078b812deSAdrian Chadd uint32_t ah_beaconInterval; 89176bd547bSAdrian Chadd }; 89276bd547bSAdrian Chadd 89376bd547bSAdrian Chadd #define AH9300(_ah) ((struct ath_hal_9300 *)(_ah)) 89476bd547bSAdrian Chadd 89576bd547bSAdrian Chadd #define IS_9300_EMU(ah) \ 89676bd547bSAdrian Chadd (AH_PRIVATE(ah)->ah_devid == AR9300_DEVID_EMU_PCIE) 89776bd547bSAdrian Chadd 89876bd547bSAdrian Chadd #define ar9300_eep_data_in_flash(_ah) \ 89976bd547bSAdrian Chadd (!(AH_PRIVATE(_ah)->ah_flags & AH_USE_EEPROM)) 90076bd547bSAdrian Chadd 901e113789bSAdrian Chadd #ifdef notyet 90276bd547bSAdrian Chadd // Need these additional conditions for IS_5GHZ_FAST_CLOCK_EN when we have valid eeprom contents. 90376bd547bSAdrian Chadd && \ 90476bd547bSAdrian Chadd ((ar9300_eeprom_get(AH9300(_ah), EEP_MINOR_REV) <= AR9300_EEP_MINOR_VER_16) || \ 90576bd547bSAdrian Chadd (ar9300_eeprom_get(AH9300(_ah), EEP_FSTCLK_5G)))) 90676bd547bSAdrian Chadd #endif 90776bd547bSAdrian Chadd 90876bd547bSAdrian Chadd /* 90976bd547bSAdrian Chadd * WAR for bug 6773. OS_DELAY() does a PIO READ on the PCI bus which allows 91076bd547bSAdrian Chadd * other cards' DMA reads to complete in the middle of our reset. 91176bd547bSAdrian Chadd */ 91276bd547bSAdrian Chadd #define WAR_6773(x) do { \ 91376bd547bSAdrian Chadd if ((++(x) % 64) == 0) \ 91476bd547bSAdrian Chadd OS_DELAY(1); \ 91576bd547bSAdrian Chadd } while (0) 91676bd547bSAdrian Chadd 91776bd547bSAdrian Chadd #define REG_WRITE_ARRAY(iniarray, column, regWr) do { \ 91876bd547bSAdrian Chadd int r; \ 91976bd547bSAdrian Chadd for (r = 0; r < ((iniarray)->ia_rows); r++) { \ 92076bd547bSAdrian Chadd OS_REG_WRITE(ah, INI_RA((iniarray), (r), 0), INI_RA((iniarray), r, (column)));\ 92176bd547bSAdrian Chadd WAR_6773(regWr); \ 92276bd547bSAdrian Chadd } \ 92376bd547bSAdrian Chadd } while (0) 92476bd547bSAdrian Chadd 92576bd547bSAdrian Chadd #define UPPER_5G_SUB_BANDSTART 5700 92676bd547bSAdrian Chadd #define MID_5G_SUB_BANDSTART 5400 92776bd547bSAdrian Chadd #define TRAINPOWER_DB_OFFSET 6 92876bd547bSAdrian Chadd 92976bd547bSAdrian Chadd #define AH_PAPRD_GET_SCALE_FACTOR(_scale, _eep, _is2G, _channel) do{ if(_is2G) { _scale = (_eep->modal_header_2g.paprd_rate_mask_ht20>>25)&0x7; \ 93076bd547bSAdrian Chadd } else { \ 93176bd547bSAdrian Chadd if(_channel >= UPPER_5G_SUB_BANDSTART){ _scale = (_eep->modal_header_5g.paprd_rate_mask_ht20>>25)&0x7;} \ 93276bd547bSAdrian Chadd else if((UPPER_5G_SUB_BANDSTART < _channel) && (_channel >= MID_5G_SUB_BANDSTART)) \ 93376bd547bSAdrian Chadd { _scale = (_eep->modal_header_5g.paprd_rate_mask_ht40>>28)&0x7;} \ 93476bd547bSAdrian Chadd else { _scale = (_eep->modal_header_5g.paprd_rate_mask_ht40>>25)&0x7;} } }while(0) 93576bd547bSAdrian Chadd 93676bd547bSAdrian Chadd #ifdef AH_ASSERT 93776bd547bSAdrian Chadd #define ar9300FeatureNotSupported(feature, ah, func) \ 93876bd547bSAdrian Chadd ath_hal_printf(ah, # feature \ 93976bd547bSAdrian Chadd " not supported but called from %s\n", (func)), \ 94076bd547bSAdrian Chadd hal_assert(0) 94176bd547bSAdrian Chadd #else 94276bd547bSAdrian Chadd #define ar9300FeatureNotSupported(feature, ah, func) \ 94376bd547bSAdrian Chadd ath_hal_printf(ah, # feature \ 94476bd547bSAdrian Chadd " not supported but called from %s\n", (func)) 94576bd547bSAdrian Chadd #endif /* AH_ASSERT */ 94676bd547bSAdrian Chadd 94776bd547bSAdrian Chadd /* 94876bd547bSAdrian Chadd * Green Tx, Based on different RSSI of Received Beacon thresholds, 94976bd547bSAdrian Chadd * using different tx power by modified register tx power related values. 95076bd547bSAdrian Chadd * The thresholds are decided by system team. 95176bd547bSAdrian Chadd */ 95276bd547bSAdrian Chadd #define WB225_SW_GREEN_TX_THRES1_DB 56 /* in dB */ 95376bd547bSAdrian Chadd #define WB225_SW_GREEN_TX_THRES2_DB 41 /* in dB */ 95476bd547bSAdrian Chadd #define WB225_OB_CALIBRATION_VALUE 5 /* For Green Tx OLPC Delta 95576bd547bSAdrian Chadd Calibration Offset */ 95676bd547bSAdrian Chadd #define WB225_OB_GREEN_TX_SHORT_VALUE 1 /* For Green Tx OB value 95776bd547bSAdrian Chadd in short distance*/ 95876bd547bSAdrian Chadd #define WB225_OB_GREEN_TX_MIDDLE_VALUE 3 /* For Green Tx OB value 95976bd547bSAdrian Chadd in middle distance */ 96076bd547bSAdrian Chadd #define WB225_OB_GREEN_TX_LONG_VALUE 5 /* For Green Tx OB value 96176bd547bSAdrian Chadd in long distance */ 96276bd547bSAdrian Chadd #define WB225_BBPWRTXRATE9_SW_GREEN_TX_SHORT_VALUE 0x06060606 /* For SwGreen Tx 96376bd547bSAdrian Chadd BB_powertx_rate9 reg 96476bd547bSAdrian Chadd value in short 96576bd547bSAdrian Chadd distance */ 96676bd547bSAdrian Chadd #define WB225_BBPWRTXRATE9_SW_GREEN_TX_MIDDLE_VALUE 0x0E0E0E0E /* For SwGreen Tx 96776bd547bSAdrian Chadd BB_powertx_rate9 reg 96876bd547bSAdrian Chadd value in middle 96976bd547bSAdrian Chadd distance */ 97076bd547bSAdrian Chadd 97176bd547bSAdrian Chadd 97276bd547bSAdrian Chadd /* Tx power for short distacnce in SwGreenTx.*/ 97376bd547bSAdrian Chadd static const u_int8_t wb225_sw_gtx_tp_distance_short[ar9300_rate_size] = { 97476bd547bSAdrian Chadd 6, /*ALL_TARGET_LEGACY_6_24*/ 97576bd547bSAdrian Chadd 6, /*ALL_TARGET_LEGACY_36*/ 97676bd547bSAdrian Chadd 6, /*ALL_TARGET_LEGACY_48*/ 97776bd547bSAdrian Chadd 4, /*ALL_TARGET_LEGACY_54*/ 97876bd547bSAdrian Chadd 6, /*ALL_TARGET_LEGACY_1L_5L*/ 97976bd547bSAdrian Chadd 6, /*ALL_TARGET_LEGACY_5S*/ 98076bd547bSAdrian Chadd 6, /*ALL_TARGET_LEGACY_11L*/ 98176bd547bSAdrian Chadd 6, /*ALL_TARGET_LEGACY_11S*/ 98276bd547bSAdrian Chadd 6, /*ALL_TARGET_HT20_0_8_16*/ 98376bd547bSAdrian Chadd 6, /*ALL_TARGET_HT20_1_3_9_11_17_19*/ 98476bd547bSAdrian Chadd 4, /*ALL_TARGET_HT20_4*/ 98576bd547bSAdrian Chadd 4, /*ALL_TARGET_HT20_5*/ 98676bd547bSAdrian Chadd 4, /*ALL_TARGET_HT20_6*/ 98776bd547bSAdrian Chadd 2, /*ALL_TARGET_HT20_7*/ 98876bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_12*/ 98976bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_13*/ 99076bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_14*/ 99176bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_15*/ 99276bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_20*/ 99376bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_21*/ 99476bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_22*/ 99576bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_23*/ 99676bd547bSAdrian Chadd 6, /*ALL_TARGET_HT40_0_8_16*/ 99776bd547bSAdrian Chadd 6, /*ALL_TARGET_HT40_1_3_9_11_17_19*/ 99876bd547bSAdrian Chadd 4, /*ALL_TARGET_HT40_4*/ 99976bd547bSAdrian Chadd 4, /*ALL_TARGET_HT40_5*/ 100076bd547bSAdrian Chadd 4, /*ALL_TARGET_HT40_6*/ 100176bd547bSAdrian Chadd 2, /*ALL_TARGET_HT40_7*/ 100276bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_12*/ 100376bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_13*/ 100476bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_14*/ 100576bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_15*/ 100676bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_20*/ 100776bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_21*/ 100876bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_22*/ 100976bd547bSAdrian Chadd 0 /*ALL_TARGET_HT40_23*/ 101076bd547bSAdrian Chadd }; 101176bd547bSAdrian Chadd 101276bd547bSAdrian Chadd /* Tx power for middle distacnce in SwGreenTx.*/ 101376bd547bSAdrian Chadd static const u_int8_t wb225_sw_gtx_tp_distance_middle[ar9300_rate_size] = { 101476bd547bSAdrian Chadd 14, /*ALL_TARGET_LEGACY_6_24*/ 101576bd547bSAdrian Chadd 14, /*ALL_TARGET_LEGACY_36*/ 101676bd547bSAdrian Chadd 14, /*ALL_TARGET_LEGACY_48*/ 101776bd547bSAdrian Chadd 12, /*ALL_TARGET_LEGACY_54*/ 101876bd547bSAdrian Chadd 14, /*ALL_TARGET_LEGACY_1L_5L*/ 101976bd547bSAdrian Chadd 14, /*ALL_TARGET_LEGACY_5S*/ 102076bd547bSAdrian Chadd 14, /*ALL_TARGET_LEGACY_11L*/ 102176bd547bSAdrian Chadd 14, /*ALL_TARGET_LEGACY_11S*/ 102276bd547bSAdrian Chadd 14, /*ALL_TARGET_HT20_0_8_16*/ 102376bd547bSAdrian Chadd 14, /*ALL_TARGET_HT20_1_3_9_11_17_19*/ 102476bd547bSAdrian Chadd 14, /*ALL_TARGET_HT20_4*/ 102576bd547bSAdrian Chadd 14, /*ALL_TARGET_HT20_5*/ 102676bd547bSAdrian Chadd 12, /*ALL_TARGET_HT20_6*/ 102776bd547bSAdrian Chadd 10, /*ALL_TARGET_HT20_7*/ 102876bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_12*/ 102976bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_13*/ 103076bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_14*/ 103176bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_15*/ 103276bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_20*/ 103376bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_21*/ 103476bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_22*/ 103576bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_23*/ 103676bd547bSAdrian Chadd 14, /*ALL_TARGET_HT40_0_8_16*/ 103776bd547bSAdrian Chadd 14, /*ALL_TARGET_HT40_1_3_9_11_17_19*/ 103876bd547bSAdrian Chadd 14, /*ALL_TARGET_HT40_4*/ 103976bd547bSAdrian Chadd 14, /*ALL_TARGET_HT40_5*/ 104076bd547bSAdrian Chadd 12, /*ALL_TARGET_HT40_6*/ 104176bd547bSAdrian Chadd 10, /*ALL_TARGET_HT40_7*/ 104276bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_12*/ 104376bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_13*/ 104476bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_14*/ 104576bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_15*/ 104676bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_20*/ 104776bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_21*/ 104876bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_22*/ 104976bd547bSAdrian Chadd 0 /*ALL_TARGET_HT40_23*/ 105076bd547bSAdrian Chadd }; 105176bd547bSAdrian Chadd 105276bd547bSAdrian Chadd /* OLPC DeltaCalibration Offset unit in half dB.*/ 105376bd547bSAdrian Chadd static const u_int8_t wb225_gtx_olpc_cal_offset[6] = { 105476bd547bSAdrian Chadd 0, /* OB0*/ 105576bd547bSAdrian Chadd 16, /* OB1*/ 105676bd547bSAdrian Chadd 9, /* OB2*/ 105776bd547bSAdrian Chadd 5, /* OB3*/ 105876bd547bSAdrian Chadd 2, /* OB4*/ 105976bd547bSAdrian Chadd 0, /* OB5*/ 106076bd547bSAdrian Chadd }; 106176bd547bSAdrian Chadd 106276bd547bSAdrian Chadd /* 106376bd547bSAdrian Chadd * Definitions for HwGreenTx 106476bd547bSAdrian Chadd */ 106576bd547bSAdrian Chadd #define AR9485_HW_GREEN_TX_THRES1_DB 56 /* in dB */ 106676bd547bSAdrian Chadd #define AR9485_HW_GREEN_TX_THRES2_DB 41 /* in dB */ 106776bd547bSAdrian Chadd #define AR9485_BBPWRTXRATE9_HW_GREEN_TX_SHORT_VALUE 0x0C0C0A0A /* For HwGreen Tx 106876bd547bSAdrian Chadd BB_powertx_rate9 reg 106976bd547bSAdrian Chadd value in short 107076bd547bSAdrian Chadd distance */ 107176bd547bSAdrian Chadd #define AR9485_BBPWRTXRATE9_HW_GREEN_TX_MIDDLE_VALUE 0x10100E0E /* For HwGreenTx 107276bd547bSAdrian Chadd BB_powertx_rate9 reg 107376bd547bSAdrian Chadd value in middle 107476bd547bSAdrian Chadd distance */ 107576bd547bSAdrian Chadd 107676bd547bSAdrian Chadd /* Tx power for short distacnce in HwGreenTx.*/ 107776bd547bSAdrian Chadd static const u_int8_t ar9485_hw_gtx_tp_distance_short[ar9300_rate_size] = { 107876bd547bSAdrian Chadd 14, /*ALL_TARGET_LEGACY_6_24*/ 107976bd547bSAdrian Chadd 14, /*ALL_TARGET_LEGACY_36*/ 108076bd547bSAdrian Chadd 8, /*ALL_TARGET_LEGACY_48*/ 108176bd547bSAdrian Chadd 2, /*ALL_TARGET_LEGACY_54*/ 108276bd547bSAdrian Chadd 14, /*ALL_TARGET_LEGACY_1L_5L*/ 108376bd547bSAdrian Chadd 14, /*ALL_TARGET_LEGACY_5S*/ 108476bd547bSAdrian Chadd 14, /*ALL_TARGET_LEGACY_11L*/ 108576bd547bSAdrian Chadd 14, /*ALL_TARGET_LEGACY_11S*/ 108676bd547bSAdrian Chadd 12, /*ALL_TARGET_HT20_0_8_16*/ 108776bd547bSAdrian Chadd 12, /*ALL_TARGET_HT20_1_3_9_11_17_19*/ 108876bd547bSAdrian Chadd 12, /*ALL_TARGET_HT20_4*/ 108976bd547bSAdrian Chadd 12, /*ALL_TARGET_HT20_5*/ 109076bd547bSAdrian Chadd 8, /*ALL_TARGET_HT20_6*/ 109176bd547bSAdrian Chadd 2, /*ALL_TARGET_HT20_7*/ 109276bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_12*/ 109376bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_13*/ 109476bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_14*/ 109576bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_15*/ 109676bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_20*/ 109776bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_21*/ 109876bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_22*/ 109976bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_23*/ 110076bd547bSAdrian Chadd 10, /*ALL_TARGET_HT40_0_8_16*/ 110176bd547bSAdrian Chadd 10, /*ALL_TARGET_HT40_1_3_9_11_17_19*/ 110276bd547bSAdrian Chadd 10, /*ALL_TARGET_HT40_4*/ 110376bd547bSAdrian Chadd 10, /*ALL_TARGET_HT40_5*/ 110476bd547bSAdrian Chadd 6, /*ALL_TARGET_HT40_6*/ 110576bd547bSAdrian Chadd 2, /*ALL_TARGET_HT40_7*/ 110676bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_12*/ 110776bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_13*/ 110876bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_14*/ 110976bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_15*/ 111076bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_20*/ 111176bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_21*/ 111276bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_22*/ 111376bd547bSAdrian Chadd 0 /*ALL_TARGET_HT40_23*/ 111476bd547bSAdrian Chadd }; 111576bd547bSAdrian Chadd 111676bd547bSAdrian Chadd /* Tx power for middle distacnce in HwGreenTx.*/ 111776bd547bSAdrian Chadd static const u_int8_t ar9485_hw_gtx_tp_distance_middle[ar9300_rate_size] = { 111876bd547bSAdrian Chadd 18, /*ALL_TARGET_LEGACY_6_24*/ 111976bd547bSAdrian Chadd 18, /*ALL_TARGET_LEGACY_36*/ 112076bd547bSAdrian Chadd 14, /*ALL_TARGET_LEGACY_48*/ 112176bd547bSAdrian Chadd 12, /*ALL_TARGET_LEGACY_54*/ 112276bd547bSAdrian Chadd 18, /*ALL_TARGET_LEGACY_1L_5L*/ 112376bd547bSAdrian Chadd 18, /*ALL_TARGET_LEGACY_5S*/ 112476bd547bSAdrian Chadd 18, /*ALL_TARGET_LEGACY_11L*/ 112576bd547bSAdrian Chadd 18, /*ALL_TARGET_LEGACY_11S*/ 112676bd547bSAdrian Chadd 16, /*ALL_TARGET_HT20_0_8_16*/ 112776bd547bSAdrian Chadd 16, /*ALL_TARGET_HT20_1_3_9_11_17_19*/ 112876bd547bSAdrian Chadd 16, /*ALL_TARGET_HT20_4*/ 112976bd547bSAdrian Chadd 16, /*ALL_TARGET_HT20_5*/ 113076bd547bSAdrian Chadd 14, /*ALL_TARGET_HT20_6*/ 113176bd547bSAdrian Chadd 12, /*ALL_TARGET_HT20_7*/ 113276bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_12*/ 113376bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_13*/ 113476bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_14*/ 113576bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_15*/ 113676bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_20*/ 113776bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_21*/ 113876bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_22*/ 113976bd547bSAdrian Chadd 0, /*ALL_TARGET_HT20_23*/ 114076bd547bSAdrian Chadd 14, /*ALL_TARGET_HT40_0_8_16*/ 114176bd547bSAdrian Chadd 14, /*ALL_TARGET_HT40_1_3_9_11_17_19*/ 114276bd547bSAdrian Chadd 14, /*ALL_TARGET_HT40_4*/ 114376bd547bSAdrian Chadd 14, /*ALL_TARGET_HT40_5*/ 114476bd547bSAdrian Chadd 14, /*ALL_TARGET_HT40_6*/ 114576bd547bSAdrian Chadd 12, /*ALL_TARGET_HT40_7*/ 114676bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_12*/ 114776bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_13*/ 114876bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_14*/ 114976bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_15*/ 115076bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_20*/ 115176bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_21*/ 115276bd547bSAdrian Chadd 0, /*ALL_TARGET_HT40_22*/ 115376bd547bSAdrian Chadd 0 /*ALL_TARGET_HT40_23*/ 115476bd547bSAdrian Chadd }; 115576bd547bSAdrian Chadd 115676bd547bSAdrian Chadd /* MIMO Modes used in TPC calculations */ 115776bd547bSAdrian Chadd typedef enum { 115876bd547bSAdrian Chadd AR9300_DEF_MODE = 0, /* Could be CDD or Direct */ 115976bd547bSAdrian Chadd AR9300_TXBF_MODE, 116076bd547bSAdrian Chadd AR9300_STBC_MODE 116176bd547bSAdrian Chadd } AR9300_TXMODES; 116276bd547bSAdrian Chadd typedef enum { 116376bd547bSAdrian Chadd POSEIDON_STORED_REG_OBDB = 0, /* default OB/DB setting from ini */ 116476bd547bSAdrian Chadd POSEIDON_STORED_REG_TPC = 1, /* default txpower value in TPC reg */ 116576bd547bSAdrian Chadd POSEIDON_STORED_REG_BB_PWRTX_RATE9 = 2, /* default txpower value in 116676bd547bSAdrian Chadd * BB_powertx_rate9 reg 116776bd547bSAdrian Chadd */ 116876bd547bSAdrian Chadd POSEIDON_STORED_REG_SZ /* Can not add anymore */ 116976bd547bSAdrian Chadd } POSEIDON_STORED_REGS; 117076bd547bSAdrian Chadd 117176bd547bSAdrian Chadd typedef enum { 117276bd547bSAdrian Chadd POSEIDON_STORED_REG_G2_OLPC_OFFSET = 0,/* default OB/DB setting from ini */ 117376bd547bSAdrian Chadd POSEIDON_STORED_REG_G2_SZ /* should not exceed 3 */ 117476bd547bSAdrian Chadd } POSEIDON_STORED_REGS_G2; 117576bd547bSAdrian Chadd 117676bd547bSAdrian Chadd #if AH_NEED_TX_DATA_SWAP 117776bd547bSAdrian Chadd #if AH_NEED_RX_DATA_SWAP 117876bd547bSAdrian Chadd #define ar9300_init_cfg_reg(ah) OS_REG_RMW(ah, AR_CFG, AR_CFG_SWTB | AR_CFG_SWRB,0) 117976bd547bSAdrian Chadd #else 118076bd547bSAdrian Chadd #define ar9300_init_cfg_reg(ah) OS_REG_RMW(ah, AR_CFG, AR_CFG_SWTB,0) 118176bd547bSAdrian Chadd #endif 118276bd547bSAdrian Chadd #elif AH_NEED_RX_DATA_SWAP 118376bd547bSAdrian Chadd #define ar9300_init_cfg_reg(ah) OS_REG_RMW(ah, AR_CFG, AR_CFG_SWRB,0) 118476bd547bSAdrian Chadd #else 118576bd547bSAdrian Chadd #define ar9300_init_cfg_reg(ah) OS_REG_RMW(ah, AR_CFG, AR_CFG_SWTD | AR_CFG_SWRD,0) 118676bd547bSAdrian Chadd #endif 118776bd547bSAdrian Chadd 118876bd547bSAdrian Chadd extern HAL_BOOL ar9300_rf_attach(struct ath_hal *, HAL_STATUS *); 118976bd547bSAdrian Chadd 119076bd547bSAdrian Chadd struct ath_hal; 119176bd547bSAdrian Chadd 119276bd547bSAdrian Chadd extern struct ath_hal_9300 * ar9300_new_state(u_int16_t devid, 1193e113789bSAdrian Chadd HAL_SOFTC sc, HAL_BUS_TAG st, HAL_BUS_HANDLE sh, uint16_t *eepromdata, 11949389d5a9SAdrian Chadd HAL_OPS_CONFIG *ah_config, 1195e113789bSAdrian Chadd HAL_STATUS *status); 119676bd547bSAdrian Chadd extern struct ath_hal * ar9300_attach(u_int16_t devid, 1197e113789bSAdrian Chadd HAL_SOFTC sc, HAL_BUS_TAG st, HAL_BUS_HANDLE sh, uint16_t *eepromdata, 11989389d5a9SAdrian Chadd HAL_OPS_CONFIG *ah_config, HAL_STATUS *status); 119976bd547bSAdrian Chadd extern void ar9300_detach(struct ath_hal *ah); 120076bd547bSAdrian Chadd extern void ar9300_read_revisions(struct ath_hal *ah); 120176bd547bSAdrian Chadd extern HAL_BOOL ar9300_chip_test(struct ath_hal *ah); 120276bd547bSAdrian Chadd extern HAL_BOOL ar9300_get_channel_edges(struct ath_hal *ah, 120376bd547bSAdrian Chadd u_int16_t flags, u_int16_t *low, u_int16_t *high); 120476bd547bSAdrian Chadd extern HAL_BOOL ar9300_fill_capability_info(struct ath_hal *ah); 120576bd547bSAdrian Chadd 120676bd547bSAdrian Chadd extern void ar9300_beacon_init(struct ath_hal *ah, 1207899d1cacSAdrian Chadd u_int32_t next_beacon, u_int32_t beacon_period, 1208899d1cacSAdrian Chadd u_int32_t beacon_period_fraction, HAL_OPMODE opmode); 120976bd547bSAdrian Chadd extern void ar9300_set_sta_beacon_timers(struct ath_hal *ah, 121076bd547bSAdrian Chadd const HAL_BEACON_STATE *); 121176bd547bSAdrian Chadd 121276bd547bSAdrian Chadd extern HAL_BOOL ar9300_is_interrupt_pending(struct ath_hal *ah); 121376bd547bSAdrian Chadd extern HAL_BOOL ar9300_get_pending_interrupts(struct ath_hal *ah, HAL_INT *, HAL_INT_TYPE, u_int8_t, HAL_BOOL); 121476bd547bSAdrian Chadd extern HAL_INT ar9300_get_interrupts(struct ath_hal *ah); 121576bd547bSAdrian Chadd extern HAL_INT ar9300_set_interrupts(struct ath_hal *ah, HAL_INT ints, HAL_BOOL); 121676bd547bSAdrian Chadd extern void ar9300_set_intr_mitigation_timer(struct ath_hal* ah, 121776bd547bSAdrian Chadd HAL_INT_MITIGATION reg, u_int32_t value); 121876bd547bSAdrian Chadd extern u_int32_t ar9300_get_intr_mitigation_timer(struct ath_hal* ah, 121976bd547bSAdrian Chadd HAL_INT_MITIGATION reg); 122076bd547bSAdrian Chadd extern u_int32_t ar9300_get_key_cache_size(struct ath_hal *); 122176bd547bSAdrian Chadd extern HAL_BOOL ar9300_is_key_cache_entry_valid(struct ath_hal *, u_int16_t entry); 122276bd547bSAdrian Chadd extern HAL_BOOL ar9300_reset_key_cache_entry(struct ath_hal *ah, u_int16_t entry); 1223e113789bSAdrian Chadd extern HAL_CHANNEL_INTERNAL * ar9300_check_chan(struct ath_hal *ah, 1224e113789bSAdrian Chadd const struct ieee80211_channel *chan); 1225e113789bSAdrian Chadd 122676bd547bSAdrian Chadd extern HAL_BOOL ar9300_set_key_cache_entry_mac(struct ath_hal *, 122776bd547bSAdrian Chadd u_int16_t entry, const u_int8_t *mac); 122876bd547bSAdrian Chadd extern HAL_BOOL ar9300_set_key_cache_entry(struct ath_hal *ah, u_int16_t entry, 122976bd547bSAdrian Chadd const HAL_KEYVAL *k, const u_int8_t *mac, int xor_key); 123076bd547bSAdrian Chadd extern HAL_BOOL ar9300_print_keycache(struct ath_hal *ah); 1231899d1cacSAdrian Chadd #if ATH_SUPPORT_KEYPLUMB_WAR 1232899d1cacSAdrian Chadd extern HAL_BOOL ar9300_check_key_cache_entry(struct ath_hal *ah, u_int16_t entry, 1233899d1cacSAdrian Chadd const HAL_KEYVAL *k, int xorKey); 1234899d1cacSAdrian Chadd #endif 123576bd547bSAdrian Chadd 123676bd547bSAdrian Chadd extern void ar9300_get_mac_address(struct ath_hal *ah, u_int8_t *mac); 123776bd547bSAdrian Chadd extern HAL_BOOL ar9300_set_mac_address(struct ath_hal *ah, const u_int8_t *); 123876bd547bSAdrian Chadd extern void ar9300_get_bss_id_mask(struct ath_hal *ah, u_int8_t *mac); 123976bd547bSAdrian Chadd extern HAL_BOOL ar9300_set_bss_id_mask(struct ath_hal *, const u_int8_t *); 124076bd547bSAdrian Chadd extern HAL_STATUS ar9300_select_ant_config(struct ath_hal *ah, u_int32_t cfg); 12413876533bSAdrian Chadd #if 0 1242899d1cacSAdrian Chadd extern u_int32_t ar9300_ant_ctrl_common_get(struct ath_hal *ah, HAL_BOOL is_2ghz); 12433876533bSAdrian Chadd #endif 1244899d1cacSAdrian Chadd extern HAL_BOOL ar9300_ant_swcom_sel(struct ath_hal *ah, u_int8_t ops, 1245899d1cacSAdrian Chadd u_int32_t *common_tbl1, u_int32_t *common_tbl2); 124676bd547bSAdrian Chadd extern HAL_BOOL ar9300_set_regulatory_domain(struct ath_hal *ah, 124776bd547bSAdrian Chadd u_int16_t reg_domain, HAL_STATUS *stats); 124876bd547bSAdrian Chadd extern u_int ar9300_get_wireless_modes(struct ath_hal *ah); 124976bd547bSAdrian Chadd extern void ar9300_enable_rf_kill(struct ath_hal *); 1250e113789bSAdrian Chadd extern HAL_BOOL ar9300_gpio_cfg_output(struct ath_hal *, u_int32_t gpio, HAL_GPIO_MUX_TYPE signalType); 1251e113789bSAdrian Chadd extern HAL_BOOL ar9300_gpio_cfg_output_led_off(struct ath_hal *, u_int32_t gpio, HAL_GPIO_MUX_TYPE signalType); 125276bd547bSAdrian Chadd extern HAL_BOOL ar9300_gpio_cfg_input(struct ath_hal *, u_int32_t gpio); 125376bd547bSAdrian Chadd extern HAL_BOOL ar9300_gpio_set(struct ath_hal *, u_int32_t gpio, u_int32_t val); 125476bd547bSAdrian Chadd extern u_int32_t ar9300_gpio_get(struct ath_hal *ah, u_int32_t gpio); 125576bd547bSAdrian Chadd extern u_int32_t ar9300_gpio_get_intr(struct ath_hal *ah); 125676bd547bSAdrian Chadd extern void ar9300_gpio_set_intr(struct ath_hal *ah, u_int, u_int32_t ilevel); 125776bd547bSAdrian Chadd extern u_int32_t ar9300_gpio_get_polarity(struct ath_hal *ah); 125876bd547bSAdrian Chadd extern void ar9300_gpio_set_polarity(struct ath_hal *ah, u_int32_t, u_int32_t); 125976bd547bSAdrian Chadd extern u_int32_t ar9300_gpio_get_mask(struct ath_hal *ah); 126076bd547bSAdrian Chadd extern int ar9300_gpio_set_mask(struct ath_hal *ah, u_int32_t mask, u_int32_t pol_map); 126176bd547bSAdrian Chadd extern void ar9300_set_led_state(struct ath_hal *ah, HAL_LED_STATE state); 126276bd547bSAdrian Chadd extern void ar9300_set_power_led_state(struct ath_hal *ah, u_int8_t enable); 126376bd547bSAdrian Chadd extern void ar9300_set_network_led_state(struct ath_hal *ah, u_int8_t enable); 126476bd547bSAdrian Chadd extern void ar9300_write_associd(struct ath_hal *ah, const u_int8_t *bssid, 126576bd547bSAdrian Chadd u_int16_t assoc_id); 126676bd547bSAdrian Chadd extern u_int32_t ar9300_ppm_get_rssi_dump(struct ath_hal *); 126776bd547bSAdrian Chadd extern u_int32_t ar9300_ppm_arm_trigger(struct ath_hal *); 126876bd547bSAdrian Chadd extern int ar9300_ppm_get_trigger(struct ath_hal *); 126976bd547bSAdrian Chadd extern u_int32_t ar9300_ppm_force(struct ath_hal *); 127076bd547bSAdrian Chadd extern void ar9300_ppm_un_force(struct ath_hal *); 127176bd547bSAdrian Chadd extern u_int32_t ar9300_ppm_get_force_state(struct ath_hal *); 127276bd547bSAdrian Chadd extern void ar9300_set_dcs_mode(struct ath_hal *ah, u_int32_t); 127376bd547bSAdrian Chadd extern u_int32_t ar9300_get_dcs_mode(struct ath_hal *ah); 127476bd547bSAdrian Chadd extern u_int32_t ar9300_get_tsf32(struct ath_hal *ah); 127576bd547bSAdrian Chadd extern u_int64_t ar9300_get_tsf64(struct ath_hal *ah); 127676bd547bSAdrian Chadd extern u_int32_t ar9300_get_tsf2_32(struct ath_hal *ah); 127776bd547bSAdrian Chadd extern void ar9300_set_tsf64(struct ath_hal *ah, u_int64_t tsf); 127876bd547bSAdrian Chadd extern void ar9300_reset_tsf(struct ath_hal *ah); 127976bd547bSAdrian Chadd extern void ar9300_set_basic_rate(struct ath_hal *ah, HAL_RATE_SET *pSet); 128076bd547bSAdrian Chadd extern u_int32_t ar9300_get_random_seed(struct ath_hal *ah); 128176bd547bSAdrian Chadd extern HAL_BOOL ar9300_detect_card_present(struct ath_hal *ah); 128276bd547bSAdrian Chadd extern void ar9300_update_mib_mac_stats(struct ath_hal *ah); 128376bd547bSAdrian Chadd extern void ar9300_get_mib_mac_stats(struct ath_hal *ah, HAL_MIB_STATS* stats); 128476bd547bSAdrian Chadd extern HAL_BOOL ar9300_is_japan_channel_spread_supported(struct ath_hal *ah); 128576bd547bSAdrian Chadd extern u_int32_t ar9300_get_cur_rssi(struct ath_hal *ah); 128676bd547bSAdrian Chadd extern u_int32_t ar9300_get_rssi_chain0(struct ath_hal *ah); 128776bd547bSAdrian Chadd extern u_int ar9300_get_def_antenna(struct ath_hal *ah); 128876bd547bSAdrian Chadd extern void ar9300_set_def_antenna(struct ath_hal *ah, u_int antenna); 128976bd547bSAdrian Chadd extern HAL_BOOL ar9300_set_antenna_switch(struct ath_hal *ah, 1290e113789bSAdrian Chadd HAL_ANT_SETTING settings, const struct ieee80211_channel *chan, 1291e113789bSAdrian Chadd u_int8_t *, u_int8_t *, u_int8_t *); 129276bd547bSAdrian Chadd extern HAL_BOOL ar9300_is_sleep_after_beacon_broken(struct ath_hal *ah); 129376bd547bSAdrian Chadd extern HAL_BOOL ar9300_set_slot_time(struct ath_hal *, u_int); 129476bd547bSAdrian Chadd extern HAL_BOOL ar9300_set_ack_timeout(struct ath_hal *, u_int); 129576bd547bSAdrian Chadd extern u_int ar9300_get_ack_timeout(struct ath_hal *); 129676bd547bSAdrian Chadd extern HAL_STATUS ar9300_set_quiet(struct ath_hal *ah, u_int32_t period, u_int32_t duration, 129776bd547bSAdrian Chadd u_int32_t next_start, HAL_QUIET_FLAG flag); 129876bd547bSAdrian Chadd extern void ar9300_set_pcu_config(struct ath_hal *); 129976bd547bSAdrian Chadd extern HAL_STATUS ar9300_get_capability(struct ath_hal *, HAL_CAPABILITY_TYPE, 130076bd547bSAdrian Chadd u_int32_t, u_int32_t *); 130176bd547bSAdrian Chadd extern HAL_BOOL ar9300_set_capability(struct ath_hal *, HAL_CAPABILITY_TYPE, 130276bd547bSAdrian Chadd u_int32_t, u_int32_t, HAL_STATUS *); 130376bd547bSAdrian Chadd extern HAL_BOOL ar9300_get_diag_state(struct ath_hal *ah, int request, 130476bd547bSAdrian Chadd const void *args, u_int32_t argsize, 130576bd547bSAdrian Chadd void **result, u_int32_t *resultsize); 130676bd547bSAdrian Chadd extern void ar9300_get_desc_info(struct ath_hal *ah, HAL_DESC_INFO *desc_info); 1307e113789bSAdrian Chadd extern uint32_t ar9300_get_11n_ext_busy(struct ath_hal *ah); 130876bd547bSAdrian Chadd extern void ar9300_set_11n_mac2040(struct ath_hal *ah, HAL_HT_MACMODE mode); 130976bd547bSAdrian Chadd extern HAL_HT_RXCLEAR ar9300_get_11n_rx_clear(struct ath_hal *ah); 131076bd547bSAdrian Chadd extern void ar9300_set_11n_rx_clear(struct ath_hal *ah, HAL_HT_RXCLEAR rxclear); 131176bd547bSAdrian Chadd extern HAL_BOOL ar9300_set_power_mode(struct ath_hal *ah, HAL_POWER_MODE mode, 131276bd547bSAdrian Chadd int set_chip); 131376bd547bSAdrian Chadd extern HAL_POWER_MODE ar9300_get_power_mode(struct ath_hal *ah); 131476bd547bSAdrian Chadd extern HAL_BOOL ar9300_set_power_mode_awake(struct ath_hal *ah, int set_chip); 131576bd547bSAdrian Chadd extern void ar9300_set_sm_power_mode(struct ath_hal *ah, HAL_SMPS_MODE mode); 131676bd547bSAdrian Chadd 131776bd547bSAdrian Chadd extern void ar9300_config_pci_power_save(struct ath_hal *ah, int restore, int power_off); 131876bd547bSAdrian Chadd 131976bd547bSAdrian Chadd extern void ar9300_force_tsf_sync(struct ath_hal *ah, const u_int8_t *bssid, 132076bd547bSAdrian Chadd u_int16_t assoc_id); 132176bd547bSAdrian Chadd 132276bd547bSAdrian Chadd 132376bd547bSAdrian Chadd #if ATH_WOW 132476bd547bSAdrian Chadd extern void ar9300_wow_apply_pattern(struct ath_hal *ah, u_int8_t *p_ath_pattern, 132576bd547bSAdrian Chadd u_int8_t *p_ath_mask, int32_t pattern_count, u_int32_t ath_pattern_len); 132676bd547bSAdrian Chadd //extern u_int32_t ar9300_wow_wake_up(struct ath_hal *ah,u_int8_t *chipPatternBytes); 132776bd547bSAdrian Chadd extern u_int32_t ar9300_wow_wake_up(struct ath_hal *ah, HAL_BOOL offloadEnable); 1328e113789bSAdrian Chadd extern bool ar9300_wow_enable(struct ath_hal *ah, u_int32_t pattern_enable, u_int32_t timeout_in_seconds, int clearbssid, 132976bd547bSAdrian Chadd HAL_BOOL offloadEnable); 133076bd547bSAdrian Chadd #if ATH_WOW_OFFLOAD 133176bd547bSAdrian Chadd /* ARP offload */ 133276bd547bSAdrian Chadd #define WOW_OFFLOAD_ARP_INFO_MAX 2 133376bd547bSAdrian Chadd 133476bd547bSAdrian Chadd struct hal_wow_offload_arp_info { 133576bd547bSAdrian Chadd u_int32_t valid; 133676bd547bSAdrian Chadd u_int32_t id; 133776bd547bSAdrian Chadd 133876bd547bSAdrian Chadd u_int32_t Flags; 133976bd547bSAdrian Chadd union { 134076bd547bSAdrian Chadd u_int8_t u8[4]; 134176bd547bSAdrian Chadd u_int32_t u32; 134276bd547bSAdrian Chadd } RemoteIPv4Address; 134376bd547bSAdrian Chadd union { 134476bd547bSAdrian Chadd u_int8_t u8[4]; 134576bd547bSAdrian Chadd u_int32_t u32; 134676bd547bSAdrian Chadd } HostIPv4Address; 134776bd547bSAdrian Chadd union { 134876bd547bSAdrian Chadd u_int8_t u8[6]; 134976bd547bSAdrian Chadd u_int32_t u32[2]; 135076bd547bSAdrian Chadd } MacAddress; 135176bd547bSAdrian Chadd }; 135276bd547bSAdrian Chadd 135376bd547bSAdrian Chadd /* NS offload */ 135476bd547bSAdrian Chadd #define WOW_OFFLOAD_NS_INFO_MAX 2 135576bd547bSAdrian Chadd 135676bd547bSAdrian Chadd struct hal_wow_offload_ns_info { 135776bd547bSAdrian Chadd u_int32_t valid; 135876bd547bSAdrian Chadd u_int32_t id; 135976bd547bSAdrian Chadd 136076bd547bSAdrian Chadd u_int32_t Flags; 136176bd547bSAdrian Chadd union { 136276bd547bSAdrian Chadd u_int8_t u8[16]; 136376bd547bSAdrian Chadd u_int32_t u32[4]; 136476bd547bSAdrian Chadd } RemoteIPv6Address; 136576bd547bSAdrian Chadd union { 136676bd547bSAdrian Chadd u_int8_t u8[16]; 136776bd547bSAdrian Chadd u_int32_t u32[4]; 136876bd547bSAdrian Chadd } SolicitedNodeIPv6Address; 136976bd547bSAdrian Chadd union { 137076bd547bSAdrian Chadd u_int8_t u8[6]; 137176bd547bSAdrian Chadd u_int32_t u32[2]; 137276bd547bSAdrian Chadd } MacAddress; 137376bd547bSAdrian Chadd union { 137476bd547bSAdrian Chadd u_int8_t u8[16]; 137576bd547bSAdrian Chadd u_int32_t u32[4]; 137676bd547bSAdrian Chadd } TargetIPv6Addresses[2]; 137776bd547bSAdrian Chadd }; 137876bd547bSAdrian Chadd 137976bd547bSAdrian Chadd extern void ar9300_wowoffload_prep(struct ath_hal *ah); 138076bd547bSAdrian Chadd extern void ar9300_wowoffload_post(struct ath_hal *ah); 138176bd547bSAdrian Chadd extern u_int32_t ar9300_wowoffload_download_rekey_data(struct ath_hal *ah, u_int32_t *data, u_int32_t size); 138276bd547bSAdrian Chadd extern void ar9300_wowoffload_retrieve_data(struct ath_hal *ah, void *buf, u_int32_t param); 138376bd547bSAdrian Chadd extern void ar9300_wowoffload_download_acer_magic(struct ath_hal *ah, HAL_BOOL valid, u_int8_t* datap, u_int32_t bytes); 138476bd547bSAdrian Chadd extern void ar9300_wowoffload_download_acer_swka(struct ath_hal *ah, u_int32_t id, HAL_BOOL valid, u_int32_t period, u_int32_t size, u_int32_t* datap); 138576bd547bSAdrian Chadd extern void ar9300_wowoffload_download_arp_info(struct ath_hal *ah, u_int32_t id, u_int32_t *data); 138676bd547bSAdrian Chadd extern void ar9300_wowoffload_download_ns_info(struct ath_hal *ah, u_int32_t id, u_int32_t *data); 138776bd547bSAdrian Chadd #endif /* ATH_WOW_OFFLOAD */ 138876bd547bSAdrian Chadd #endif 138976bd547bSAdrian Chadd 139076bd547bSAdrian Chadd extern HAL_BOOL ar9300_reset(struct ath_hal *ah, HAL_OPMODE opmode, 1391e113789bSAdrian Chadd struct ieee80211_channel *chan, HAL_HT_MACMODE macmode, u_int8_t txchainmask, 139276bd547bSAdrian Chadd u_int8_t rxchainmask, HAL_HT_EXTPROTSPACING extprotspacing, 13938c01c3dcSAdrian Chadd HAL_BOOL b_channel_change, HAL_STATUS *status, HAL_RESET_TYPE reset_type, int is_scan); 1394e113789bSAdrian Chadd extern HAL_BOOL ar9300_lean_channel_change(struct ath_hal *ah, HAL_OPMODE opmode, struct ieee80211_channel *chan, 139576bd547bSAdrian Chadd HAL_HT_MACMODE macmode, u_int8_t txchainmask, u_int8_t rxchainmask); 139676bd547bSAdrian Chadd extern HAL_BOOL ar9300_set_reset_reg(struct ath_hal *ah, u_int32_t type); 1397e113789bSAdrian Chadd extern void ar9300_init_pll(struct ath_hal *ah, struct ieee80211_channel *chan); 139876bd547bSAdrian Chadd extern void ar9300_green_ap_ps_on_off( struct ath_hal *ah, u_int16_t rxMask); 139976bd547bSAdrian Chadd extern u_int16_t ar9300_is_single_ant_power_save_possible(struct ath_hal *ah); 140076bd547bSAdrian Chadd extern void ar9300_set_operating_mode(struct ath_hal *ah, int opmode); 140176bd547bSAdrian Chadd extern HAL_BOOL ar9300_phy_disable(struct ath_hal *ah); 140276bd547bSAdrian Chadd extern HAL_BOOL ar9300_disable(struct ath_hal *ah); 14038c01c3dcSAdrian Chadd extern HAL_BOOL ar9300_chip_reset(struct ath_hal *ah, struct ieee80211_channel *, HAL_RESET_TYPE type); 1404e113789bSAdrian Chadd extern HAL_BOOL ar9300_calibration(struct ath_hal *ah, struct ieee80211_channel *chan, 140576bd547bSAdrian Chadd u_int8_t rxchainmask, HAL_BOOL longcal, HAL_BOOL *isIQdone, int is_scan, u_int32_t *sched_cals); 1406e113789bSAdrian Chadd extern void ar9300_reset_cal_valid(struct ath_hal *ah, 1407e113789bSAdrian Chadd const struct ieee80211_channel *chan, 140876bd547bSAdrian Chadd HAL_BOOL *isIQdone, u_int32_t cal_type); 140976bd547bSAdrian Chadd extern void ar9300_iq_cal_collect(struct ath_hal *ah, u_int8_t num_chains); 141076bd547bSAdrian Chadd extern void ar9300_iq_calibration(struct ath_hal *ah, u_int8_t num_chains); 141176bd547bSAdrian Chadd extern void ar9300_temp_comp_cal_collect(struct ath_hal *ah); 141276bd547bSAdrian Chadd extern void ar9300_temp_comp_calibration(struct ath_hal *ah, u_int8_t num_chains); 141376bd547bSAdrian Chadd extern int16_t ar9300_get_min_cca_pwr(struct ath_hal *ah); 1414*c1ebd4c9SJohn Baldwin extern void ar9300_upload_noise_floor(struct ath_hal *ah, int is2G, int16_t nfarray[HAL_NUM_NF_READINGS]); 141576bd547bSAdrian Chadd 141676bd547bSAdrian Chadd extern HAL_BOOL ar9300_set_tx_power_limit(struct ath_hal *ah, u_int32_t limit, 141776bd547bSAdrian Chadd u_int16_t extra_txpow, u_int16_t tpc_in_db); 141876bd547bSAdrian Chadd extern void ar9300_chain_noise_floor(struct ath_hal *ah, int16_t *nf_buf, 1419e113789bSAdrian Chadd struct ieee80211_channel *chan, int is_scan); 1420899d1cacSAdrian Chadd extern int16_t ar9300_get_nf_from_reg(struct ath_hal *ah, struct ieee80211_channel *chan, int wait_time); 1421899d1cacSAdrian Chadd extern int ar9300_get_rx_nf_offset(struct ath_hal *ah, struct ieee80211_channel *chan, int8_t *nf_pwr, int8_t *nf_cal); 142276bd547bSAdrian Chadd extern HAL_BOOL ar9300_load_nf(struct ath_hal *ah, int16_t nf[]); 142376bd547bSAdrian Chadd 142476bd547bSAdrian Chadd extern HAL_RFGAIN ar9300_get_rfgain(struct ath_hal *ah); 142576bd547bSAdrian Chadd extern const HAL_RATE_TABLE *ar9300_get_rate_table(struct ath_hal *, u_int mode); 142676bd547bSAdrian Chadd extern int16_t ar9300_get_rate_txpower(struct ath_hal *ah, u_int mode, 142776bd547bSAdrian Chadd u_int8_t rate_index, u_int8_t chainmask, u_int8_t mimo_mode); 142876bd547bSAdrian Chadd extern void ar9300_init_rate_txpower(struct ath_hal *ah, u_int mode, 1429e113789bSAdrian Chadd const struct ieee80211_channel *chan, 143076bd547bSAdrian Chadd u_int8_t powerPerRate[], 143176bd547bSAdrian Chadd u_int8_t chainmask); 143276bd547bSAdrian Chadd extern void ar9300_adjust_reg_txpower_cdd(struct ath_hal *ah, 143376bd547bSAdrian Chadd u_int8_t powerPerRate[]); 1434e113789bSAdrian Chadd extern HAL_STATUS ath_hal_get_rate_power_limit_from_eeprom(struct ath_hal *ah, 1435e113789bSAdrian Chadd u_int16_t freq, int8_t *max_rate_power, int8_t *min_rate_power); 1436e113789bSAdrian Chadd 143776bd547bSAdrian Chadd extern void ar9300_reset_tx_status_ring(struct ath_hal *ah); 143876bd547bSAdrian Chadd extern void ar9300_enable_mib_counters(struct ath_hal *); 143976bd547bSAdrian Chadd extern void ar9300_disable_mib_counters(struct ath_hal *); 144076bd547bSAdrian Chadd extern void ar9300_ani_attach(struct ath_hal *); 144176bd547bSAdrian Chadd extern void ar9300_ani_detach(struct ath_hal *); 144276bd547bSAdrian Chadd extern struct ar9300_ani_state *ar9300_ani_get_current_state(struct ath_hal *); 1443d5c3e61aSAdrian Chadd extern HAL_ANI_STATS *ar9300_ani_get_current_stats(struct ath_hal *); 144476bd547bSAdrian Chadd extern HAL_BOOL ar9300_ani_control(struct ath_hal *, HAL_ANI_CMD cmd, int param); 144576bd547bSAdrian Chadd struct ath_rx_status; 144676bd547bSAdrian Chadd 144776bd547bSAdrian Chadd extern void ar9300_process_mib_intr(struct ath_hal *, const HAL_NODE_STATS *); 144876bd547bSAdrian Chadd extern void ar9300_ani_ar_poll(struct ath_hal *, const HAL_NODE_STATS *, 1449e113789bSAdrian Chadd const struct ieee80211_channel *, HAL_ANISTATS *); 145076bd547bSAdrian Chadd extern void ar9300_ani_reset(struct ath_hal *, HAL_BOOL is_scanning); 145176bd547bSAdrian Chadd extern void ar9300_ani_init_defaults(struct ath_hal *ah, HAL_HT_MACMODE macmode); 145276bd547bSAdrian Chadd extern void ar9300_enable_tpc(struct ath_hal *); 145376bd547bSAdrian Chadd 145476bd547bSAdrian Chadd extern HAL_BOOL ar9300_rf_gain_cap_apply(struct ath_hal *ah, int is2GHz); 145576bd547bSAdrian Chadd extern void ar9300_rx_gain_table_apply(struct ath_hal *ah); 145676bd547bSAdrian Chadd extern void ar9300_tx_gain_table_apply(struct ath_hal *ah); 145776bd547bSAdrian Chadd extern void ar9300_mat_enable(struct ath_hal *ah, int enable); 145876bd547bSAdrian Chadd extern void ar9300_dump_keycache(struct ath_hal *ah, int n, u_int32_t *entry); 1459e113789bSAdrian Chadd extern HAL_BOOL ar9300_ant_ctrl_set_lna_div_use_bt_ant(struct ath_hal * ah, HAL_BOOL enable, const struct ieee80211_channel * chan); 146076bd547bSAdrian Chadd 146176bd547bSAdrian Chadd /* BB Panic Watchdog declarations */ 146276bd547bSAdrian Chadd #define HAL_BB_PANIC_WD_TMO 25 /* in ms, 0 to disable */ 146376bd547bSAdrian Chadd #define HAL_BB_PANIC_WD_TMO_HORNET 85 146476bd547bSAdrian Chadd extern void ar9300_config_bb_panic_watchdog(struct ath_hal *); 146576bd547bSAdrian Chadd extern void ar9300_handle_bb_panic(struct ath_hal *); 146676bd547bSAdrian Chadd extern int ar9300_get_bb_panic_info(struct ath_hal *ah, struct hal_bb_panic_info *bb_panic); 146776bd547bSAdrian Chadd extern HAL_BOOL ar9300_handle_radar_bb_panic(struct ath_hal *ah); 146876bd547bSAdrian Chadd extern void ar9300_set_hal_reset_reason(struct ath_hal *ah, u_int8_t resetreason); 146976bd547bSAdrian Chadd 147076bd547bSAdrian Chadd /* DFS declarations */ 1471e113789bSAdrian Chadd extern void ar9300_check_dfs(struct ath_hal *ah, struct ieee80211_channel *chan); 1472e113789bSAdrian Chadd extern void ar9300_dfs_found(struct ath_hal *ah, struct ieee80211_channel *chan, 147376bd547bSAdrian Chadd u_int64_t nolTime); 147476bd547bSAdrian Chadd extern void ar9300_enable_dfs(struct ath_hal *ah, HAL_PHYERR_PARAM *pe); 147576bd547bSAdrian Chadd extern void ar9300_get_dfs_thresh(struct ath_hal *ah, HAL_PHYERR_PARAM *pe); 1476e113789bSAdrian Chadd extern HAL_BOOL ar9300_radar_wait(struct ath_hal *ah, struct ieee80211_channel *chan); 147776bd547bSAdrian Chadd extern struct dfs_pulse * ar9300_get_dfs_radars(struct ath_hal *ah, 147876bd547bSAdrian Chadd u_int32_t dfsdomain, int *numradars, struct dfs_bin5pulse **bin5pulses, 147976bd547bSAdrian Chadd int *numb5radars, HAL_PHYERR_PARAM *pe); 148066c73f1dSAdrian Chadd extern HAL_BOOL ar9300_get_default_dfs_thresh(struct ath_hal *ah, HAL_PHYERR_PARAM *pe); 148176bd547bSAdrian Chadd extern void ar9300_adjust_difs(struct ath_hal *ah, u_int32_t val); 148276bd547bSAdrian Chadd extern u_int32_t ar9300_dfs_config_fft(struct ath_hal *ah, HAL_BOOL is_enable); 148376bd547bSAdrian Chadd extern void ar9300_cac_tx_quiet(struct ath_hal *ah, HAL_BOOL enable); 148476bd547bSAdrian Chadd extern void ar9300_dfs_cac_war(struct ath_hal *ah, u_int32_t start); 148576bd547bSAdrian Chadd 1486e113789bSAdrian Chadd extern struct ieee80211_channel * ar9300_get_extension_channel(struct ath_hal *ah); 148776bd547bSAdrian Chadd extern HAL_BOOL ar9300_is_fast_clock_enabled(struct ath_hal *ah); 148876bd547bSAdrian Chadd 148976bd547bSAdrian Chadd 149076bd547bSAdrian Chadd extern void ar9300_mark_phy_inactive(struct ath_hal *ah); 149176bd547bSAdrian Chadd 149276bd547bSAdrian Chadd /* Spectral scan declarations */ 149376bd547bSAdrian Chadd extern void ar9300_configure_spectral_scan(struct ath_hal *ah, HAL_SPECTRAL_PARAM *ss); 149476bd547bSAdrian Chadd extern void ar9300_set_cca_threshold(struct ath_hal *ah, u_int8_t thresh62); 149576bd547bSAdrian Chadd extern void ar9300_get_spectral_params(struct ath_hal *ah, HAL_SPECTRAL_PARAM *ss); 149676bd547bSAdrian Chadd extern HAL_BOOL ar9300_is_spectral_active(struct ath_hal *ah); 149776bd547bSAdrian Chadd extern HAL_BOOL ar9300_is_spectral_enabled(struct ath_hal *ah); 149876bd547bSAdrian Chadd extern void ar9300_start_spectral_scan(struct ath_hal *ah); 149976bd547bSAdrian Chadd extern void ar9300_stop_spectral_scan(struct ath_hal *ah); 150076bd547bSAdrian Chadd extern u_int32_t ar9300_get_spectral_config(struct ath_hal *ah); 150176bd547bSAdrian Chadd extern void ar9300_restore_spectral_config(struct ath_hal *ah, u_int32_t restoreval); 150276bd547bSAdrian Chadd int16_t ar9300_get_ctl_chan_nf(struct ath_hal *ah); 150376bd547bSAdrian Chadd int16_t ar9300_get_ext_chan_nf(struct ath_hal *ah); 150476bd547bSAdrian Chadd /* End spectral scan declarations */ 150576bd547bSAdrian Chadd 150676bd547bSAdrian Chadd /* Raw ADC capture functions */ 150776bd547bSAdrian Chadd extern void ar9300_enable_test_addac_mode(struct ath_hal *ah); 150876bd547bSAdrian Chadd extern void ar9300_disable_test_addac_mode(struct ath_hal *ah); 150976bd547bSAdrian Chadd extern void ar9300_begin_adc_capture(struct ath_hal *ah, int auto_agc_gain); 151076bd547bSAdrian Chadd extern HAL_STATUS ar9300_retrieve_capture_data(struct ath_hal *ah, u_int16_t chain_mask, int disable_dc_filter, void *sample_buf, u_int32_t *max_samples); 151176bd547bSAdrian Chadd extern HAL_STATUS ar9300_calc_adc_ref_powers(struct ath_hal *ah, int freq_mhz, int16_t *sample_min, int16_t *sample_max, int32_t *chain_ref_pwr, int num_chain_ref_pwr); 151276bd547bSAdrian Chadd extern HAL_STATUS ar9300_get_min_agc_gain(struct ath_hal *ah, int freq_mhz, int32_t *chain_gain, int num_chain_gain); 151376bd547bSAdrian Chadd 151476bd547bSAdrian Chadd extern HAL_BOOL ar9300_reset_11n(struct ath_hal *ah, HAL_OPMODE opmode, 1515e113789bSAdrian Chadd struct ieee80211_channel *chan, HAL_BOOL b_channel_change, HAL_STATUS *status); 151676bd547bSAdrian Chadd extern void ar9300_set_coverage_class(struct ath_hal *ah, u_int8_t coverageclass, int now); 151776bd547bSAdrian Chadd 151876bd547bSAdrian Chadd extern void ar9300_get_channel_centers(struct ath_hal *ah, 1519e113789bSAdrian Chadd const struct ieee80211_channel *chan, 152076bd547bSAdrian Chadd CHAN_CENTERS *centers); 152176bd547bSAdrian Chadd extern u_int16_t ar9300_get_ctl_center(struct ath_hal *ah, 1522e113789bSAdrian Chadd const struct ieee80211_channel *chan); 152376bd547bSAdrian Chadd extern u_int16_t ar9300_get_ext_center(struct ath_hal *ah, 1524e113789bSAdrian Chadd const struct ieee80211_channel *chan); 152576bd547bSAdrian Chadd extern u_int32_t ar9300_get_mib_cycle_counts_pct(struct ath_hal *, u_int32_t*, u_int32_t*, u_int32_t*); 152676bd547bSAdrian Chadd 152776bd547bSAdrian Chadd extern void ar9300_dma_reg_dump(struct ath_hal *); 152876bd547bSAdrian Chadd extern HAL_BOOL ar9300_set_11n_rx_rifs(struct ath_hal *ah, HAL_BOOL enable); 152976bd547bSAdrian Chadd extern HAL_BOOL ar9300_set_rifs_delay(struct ath_hal *ah, HAL_BOOL enable); 153076bd547bSAdrian Chadd extern HAL_BOOL ar9300_set_smart_antenna(struct ath_hal *ah, HAL_BOOL enable); 153176bd547bSAdrian Chadd extern HAL_BOOL ar9300_detect_bb_hang(struct ath_hal *ah); 153276bd547bSAdrian Chadd extern HAL_BOOL ar9300_detect_mac_hang(struct ath_hal *ah); 153376bd547bSAdrian Chadd 153476bd547bSAdrian Chadd #ifdef ATH_BT_COEX 153576bd547bSAdrian Chadd extern void ar9300_set_bt_coex_info(struct ath_hal *ah, HAL_BT_COEX_INFO *btinfo); 153676bd547bSAdrian Chadd extern void ar9300_bt_coex_config(struct ath_hal *ah, HAL_BT_COEX_CONFIG *btconf); 153776bd547bSAdrian Chadd extern void ar9300_bt_coex_set_qcu_thresh(struct ath_hal *ah, int qnum); 153876bd547bSAdrian Chadd extern void ar9300_bt_coex_set_weights(struct ath_hal *ah, u_int32_t stomp_type); 153976bd547bSAdrian Chadd extern void ar9300_bt_coex_setup_bmiss_thresh(struct ath_hal *ah, u_int32_t thresh); 154076bd547bSAdrian Chadd extern void ar9300_bt_coex_set_parameter(struct ath_hal *ah, u_int32_t type, u_int32_t value); 154176bd547bSAdrian Chadd extern void ar9300_bt_coex_disable(struct ath_hal *ah); 154276bd547bSAdrian Chadd extern int ar9300_bt_coex_enable(struct ath_hal *ah); 154376bd547bSAdrian Chadd extern void ar9300_init_bt_coex(struct ath_hal *ah); 154476bd547bSAdrian Chadd extern u_int32_t ar9300_get_bt_active_gpio(struct ath_hal *ah, u_int32_t reg); 154576bd547bSAdrian Chadd extern u_int32_t ar9300_get_wlan_active_gpio(struct ath_hal *ah, u_int32_t reg,u_int32_t bOn); 154676bd547bSAdrian Chadd #endif 154776bd547bSAdrian Chadd extern int ar9300_alloc_generic_timer(struct ath_hal *ah, HAL_GEN_TIMER_DOMAIN tsf); 154876bd547bSAdrian Chadd extern void ar9300_free_generic_timer(struct ath_hal *ah, int index); 154976bd547bSAdrian Chadd extern void ar9300_start_generic_timer(struct ath_hal *ah, int index, u_int32_t timer_next, 155076bd547bSAdrian Chadd u_int32_t timer_period); 155176bd547bSAdrian Chadd extern void ar9300_stop_generic_timer(struct ath_hal *ah, int index); 155276bd547bSAdrian Chadd extern void ar9300_get_gen_timer_interrupts(struct ath_hal *ah, u_int32_t *trigger, 155376bd547bSAdrian Chadd u_int32_t *thresh); 155476bd547bSAdrian Chadd extern void ar9300_start_tsf2(struct ath_hal *ah); 155576bd547bSAdrian Chadd 155676bd547bSAdrian Chadd extern void ar9300_chk_rssi_update_tx_pwr(struct ath_hal *ah, int rssi); 155776bd547bSAdrian Chadd extern HAL_BOOL ar9300_is_skip_paprd_by_greentx(struct ath_hal *ah); 155876bd547bSAdrian Chadd extern void ar9300_control_signals_for_green_tx_mode(struct ath_hal *ah); 155976bd547bSAdrian Chadd extern void ar9300_hwgreentx_set_pal_spare(struct ath_hal *ah, int value); 1560e113789bSAdrian Chadd extern HAL_BOOL ar9300_is_ani_noise_spur(struct ath_hal *ah); 156176bd547bSAdrian Chadd extern void ar9300_reset_hw_beacon_proc_crc(struct ath_hal *ah); 156276bd547bSAdrian Chadd extern int32_t ar9300_get_hw_beacon_rssi(struct ath_hal *ah); 156376bd547bSAdrian Chadd extern void ar9300_set_hw_beacon_rssi_threshold(struct ath_hal *ah, 156476bd547bSAdrian Chadd u_int32_t rssi_threshold); 156576bd547bSAdrian Chadd extern void ar9300_reset_hw_beacon_rssi(struct ath_hal *ah); 156676bd547bSAdrian Chadd extern void ar9300_set_hw_beacon_proc(struct ath_hal *ah, HAL_BOOL on); 156776bd547bSAdrian Chadd extern void ar9300_get_vow_stats(struct ath_hal *ah, HAL_VOWSTATS *p_stats, 156876bd547bSAdrian Chadd u_int8_t); 156976bd547bSAdrian Chadd 157076bd547bSAdrian Chadd extern int ar9300_get_spur_info(struct ath_hal * ah, int *enable, int len, u_int16_t *freq); 157176bd547bSAdrian Chadd extern int ar9300_set_spur_info(struct ath_hal * ah, int enable, int len, u_int16_t *freq); 157276bd547bSAdrian Chadd extern void ar9300_wow_set_gpio_reset_low(struct ath_hal * ah); 1573e113789bSAdrian Chadd extern HAL_BOOL ar9300_get_mib_cycle_counts(struct ath_hal *, HAL_SURVEY_SAMPLE *); 157476bd547bSAdrian Chadd extern void ar9300_clear_mib_counters(struct ath_hal *ah); 157576bd547bSAdrian Chadd 157676bd547bSAdrian Chadd /* EEPROM interface functions */ 157776bd547bSAdrian Chadd /* Common Interface functions */ 157876bd547bSAdrian Chadd extern HAL_STATUS ar9300_eeprom_attach(struct ath_hal *); 157976bd547bSAdrian Chadd extern u_int32_t ar9300_eeprom_get(struct ath_hal_9300 *ahp, EEPROM_PARAM param); 158076bd547bSAdrian Chadd 158176bd547bSAdrian Chadd extern u_int32_t ar9300_ini_fixup(struct ath_hal *ah, 158276bd547bSAdrian Chadd ar9300_eeprom_t *p_eep_data, 158376bd547bSAdrian Chadd u_int32_t reg, 158476bd547bSAdrian Chadd u_int32_t val); 158576bd547bSAdrian Chadd 158676bd547bSAdrian Chadd extern HAL_STATUS ar9300_eeprom_set_transmit_power(struct ath_hal *ah, 1587e113789bSAdrian Chadd ar9300_eeprom_t *p_eep_data, const struct ieee80211_channel *chan, 158876bd547bSAdrian Chadd u_int16_t cfg_ctl, u_int16_t twice_antenna_reduction, 158976bd547bSAdrian Chadd u_int16_t twice_max_regulatory_power, u_int16_t power_limit); 1590e113789bSAdrian Chadd extern void ar9300_eeprom_set_addac(struct ath_hal *, struct ieee80211_channel *); 159176bd547bSAdrian Chadd extern HAL_BOOL ar9300_eeprom_set_param(struct ath_hal *ah, EEPROM_PARAM param, u_int32_t value); 1592e113789bSAdrian Chadd extern HAL_BOOL ar9300_eeprom_set_board_values(struct ath_hal *, const struct ieee80211_channel *); 159376bd547bSAdrian Chadd extern HAL_BOOL ar9300_eeprom_read_word(struct ath_hal *, u_int off, u_int16_t *data); 159476bd547bSAdrian Chadd extern HAL_BOOL ar9300_eeprom_read(struct ath_hal *ah, long address, u_int8_t *buffer, int many); 159576bd547bSAdrian Chadd extern HAL_BOOL ar9300_otp_read(struct ath_hal *ah, u_int off, u_int32_t *data, HAL_BOOL is_wifi); 159676bd547bSAdrian Chadd 159776bd547bSAdrian Chadd extern HAL_BOOL ar9300_flash_read(struct ath_hal *, u_int off, u_int16_t *data); 159876bd547bSAdrian Chadd extern HAL_BOOL ar9300_flash_write(struct ath_hal *, u_int off, u_int16_t data); 159976bd547bSAdrian Chadd extern u_int ar9300_eeprom_dump_support(struct ath_hal *ah, void **pp_e); 160076bd547bSAdrian Chadd extern u_int8_t ar9300_eeprom_get_num_ant_config(struct ath_hal_9300 *ahp, HAL_FREQ_BAND freq_band); 1601e113789bSAdrian Chadd extern HAL_STATUS ar9300_eeprom_get_ant_cfg(struct ath_hal_9300 *ahp, const struct ieee80211_channel *chan, 160276bd547bSAdrian Chadd u_int8_t index, u_int16_t *config); 160376bd547bSAdrian Chadd extern u_int8_t* ar9300_eeprom_get_cust_data(struct ath_hal_9300 *ahp); 160476bd547bSAdrian Chadd extern u_int8_t *ar9300_eeprom_get_spur_chans_ptr(struct ath_hal *ah, HAL_BOOL is_2ghz); 160576bd547bSAdrian Chadd extern HAL_BOOL ar9300_interference_is_present(struct ath_hal *ah); 160676bd547bSAdrian Chadd extern HAL_BOOL ar9300_tuning_caps_apply(struct ath_hal *ah); 160776bd547bSAdrian Chadd extern void ar9300_disp_tpc_tables(struct ath_hal *ah); 160876bd547bSAdrian Chadd extern u_int8_t *ar9300_get_tpc_tables(struct ath_hal *ah); 160976bd547bSAdrian Chadd extern u_int8_t ar9300_eeprom_set_tx_gain_cap(struct ath_hal *ah, int *tx_gain_max); 161076bd547bSAdrian Chadd extern u_int8_t ar9300_eeprom_tx_gain_table_index_max_apply(struct ath_hal *ah, u_int16_t channel); 161176bd547bSAdrian Chadd 161276bd547bSAdrian Chadd /* Common EEPROM Help function */ 161376bd547bSAdrian Chadd extern void ar9300_set_immunity(struct ath_hal *ah, HAL_BOOL enable); 161476bd547bSAdrian Chadd extern void ar9300_get_hw_hangs(struct ath_hal *ah, hal_hw_hangs_t *hangs); 161576bd547bSAdrian Chadd 161676bd547bSAdrian Chadd extern u_int ar9300_mac_to_clks(struct ath_hal *ah, u_int clks); 161776bd547bSAdrian Chadd 161876bd547bSAdrian Chadd /* tx_bf interface */ 161976bd547bSAdrian Chadd #define ar9300_init_txbf(ah) 162076bd547bSAdrian Chadd #define ar9300_set_11n_txbf_sounding(ah, ds, series, cec, opt) 162176bd547bSAdrian Chadd #define ar9300_set_11n_txbf_cal(ah, ds, cal_pos, code_rate, cec, opt) 162276bd547bSAdrian Chadd #define ar9300_txbf_save_cv_from_compress( \ 162376bd547bSAdrian Chadd ah, key_idx, mimo_control, compress_rpt) \ 162476bd547bSAdrian Chadd false 162576bd547bSAdrian Chadd #define ar9300_txbf_save_cv_from_non_compress( \ 162676bd547bSAdrian Chadd ah, key_idx, mimo_control, non_compress_rpt) \ 162776bd547bSAdrian Chadd false 162876bd547bSAdrian Chadd #define ar9300_txbf_rc_update( \ 162976bd547bSAdrian Chadd ah, rx_status, local_h, csi_frame, ness_a, ness_b, bw) \ 163076bd547bSAdrian Chadd false 163176bd547bSAdrian Chadd #define ar9300_fill_csi_frame( \ 163276bd547bSAdrian Chadd ah, rx_status, bandwidth, local_h, csi_frame_body) \ 163376bd547bSAdrian Chadd 0 163476bd547bSAdrian Chadd #define ar9300_fill_txbf_capabilities(ah) 163576bd547bSAdrian Chadd #define ar9300_get_txbf_capabilities(ah) NULL 163676bd547bSAdrian Chadd #define ar9300_txbf_set_key( \ 163776bd547bSAdrian Chadd ah, entry, rx_staggered_sounding, channel_estimation_cap, mmss) 163876bd547bSAdrian Chadd #define ar9300_read_key_cache_mac(ah, entry, mac) false 163976bd547bSAdrian Chadd #define ar9300_txbf_get_cv_cache_nr(ah, key_idx, nr) 164076bd547bSAdrian Chadd #define ar9300_set_selfgenrate_limit(ah, ts_ratecode) 164176bd547bSAdrian Chadd #define ar9300_reset_lowest_txrate(ah) 164276bd547bSAdrian Chadd #define ar9300_txbf_set_basic_set(ah) 164376bd547bSAdrian Chadd 164476bd547bSAdrian Chadd extern void ar9300_crdc_rx_notify(struct ath_hal *ah, struct ath_rx_status *rxs); 164576bd547bSAdrian Chadd extern void ar9300_chain_rssi_diff_compensation(struct ath_hal *ah); 164676bd547bSAdrian Chadd 164776bd547bSAdrian Chadd 164876bd547bSAdrian Chadd 164976bd547bSAdrian Chadd #if ATH_SUPPORT_MCI 165076bd547bSAdrian Chadd extern void ar9300_mci_bt_coex_set_weights(struct ath_hal *ah, u_int32_t stomp_type); 165176bd547bSAdrian Chadd extern void ar9300_mci_bt_coex_disable(struct ath_hal *ah); 165276bd547bSAdrian Chadd extern int ar9300_mci_bt_coex_enable(struct ath_hal *ah); 165376bd547bSAdrian Chadd extern void ar9300_mci_setup (struct ath_hal *ah, u_int32_t gpm_addr, 165476bd547bSAdrian Chadd void *gpm_buf, u_int16_t len, 165576bd547bSAdrian Chadd u_int32_t sched_addr); 165676bd547bSAdrian Chadd extern void ar9300_mci_remote_reset(struct ath_hal *ah, HAL_BOOL wait_done); 165776bd547bSAdrian Chadd extern void ar9300_mci_send_lna_transfer(struct ath_hal *ah, HAL_BOOL wait_done); 165876bd547bSAdrian Chadd extern void ar9300_mci_send_sys_waking(struct ath_hal *ah, HAL_BOOL wait_done); 165976bd547bSAdrian Chadd extern HAL_BOOL ar9300_mci_send_message (struct ath_hal *ah, u_int8_t header, 166076bd547bSAdrian Chadd u_int32_t flag, u_int32_t *payload, u_int8_t len, 166176bd547bSAdrian Chadd HAL_BOOL wait_done, HAL_BOOL check_bt); 166276bd547bSAdrian Chadd extern u_int32_t ar9300_mci_get_interrupt (struct ath_hal *ah, 166376bd547bSAdrian Chadd u_int32_t *mci_int, 166476bd547bSAdrian Chadd u_int32_t *mci_int_rx_msg); 166576bd547bSAdrian Chadd extern u_int32_t ar9300_mci_state (struct ath_hal *ah, u_int32_t state_type, u_int32_t *p_data); 166676bd547bSAdrian Chadd extern void ar9300_mci_reset (struct ath_hal *ah, HAL_BOOL en_int, HAL_BOOL is_2g, HAL_BOOL is_full_sleep); 166776bd547bSAdrian Chadd extern void ar9300_mci_send_coex_halt_bt_gpm(struct ath_hal *ah, HAL_BOOL halt, HAL_BOOL wait_done); 166876bd547bSAdrian Chadd extern void ar9300_mci_mute_bt(struct ath_hal *ah); 166976bd547bSAdrian Chadd extern u_int32_t ar9300_mci_wait_for_gpm(struct ath_hal *ah, u_int8_t gpm_type, u_int8_t gpm_opcode, int32_t time_out); 167076bd547bSAdrian Chadd extern void ar9300_mci_enable_interrupt(struct ath_hal *ah); 167176bd547bSAdrian Chadd extern void ar9300_mci_disable_interrupt(struct ath_hal *ah); 167276bd547bSAdrian Chadd extern void ar9300_mci_detach (struct ath_hal *ah); 167376bd547bSAdrian Chadd extern u_int32_t ar9300_mci_check_int (struct ath_hal *ah, u_int32_t ints); 167476bd547bSAdrian Chadd extern void ar9300_mci_sync_bt_state (struct ath_hal *ah); 167576bd547bSAdrian Chadd extern void ar9300_mci_2g5g_changed(struct ath_hal *ah, HAL_BOOL is_2g); 167676bd547bSAdrian Chadd extern void ar9300_mci_2g5g_switch(struct ath_hal *ah, HAL_BOOL wait_done); 167776bd547bSAdrian Chadd #if ATH_SUPPORT_AIC 167876bd547bSAdrian Chadd extern u_int32_t ar9300_aic_calibration (struct ath_hal *ah); 167976bd547bSAdrian Chadd extern u_int32_t ar9300_aic_start_normal (struct ath_hal *ah); 168076bd547bSAdrian Chadd #endif 168176bd547bSAdrian Chadd #endif 168276bd547bSAdrian Chadd 168376bd547bSAdrian Chadd extern HAL_STATUS ar9300_set_proxy_sta(struct ath_hal *ah, HAL_BOOL enable); 168476bd547bSAdrian Chadd 168576bd547bSAdrian Chadd extern HAL_BOOL ar9300_regulatory_domain_override( 168676bd547bSAdrian Chadd struct ath_hal *ah, u_int16_t regdmn); 168776bd547bSAdrian Chadd #if ATH_ANT_DIV_COMB 168876bd547bSAdrian Chadd extern void ar9300_ant_div_comb_get_config(struct ath_hal *ah, HAL_ANT_COMB_CONFIG* div_comb_conf); 168976bd547bSAdrian Chadd extern void ar9300_ant_div_comb_set_config(struct ath_hal *ah, HAL_ANT_COMB_CONFIG* div_comb_conf); 169076bd547bSAdrian Chadd #endif /* ATH_ANT_DIV_COMB */ 169176bd547bSAdrian Chadd extern void ar9300_disable_phy_restart(struct ath_hal *ah, 169276bd547bSAdrian Chadd int disable_phy_restart); 169376bd547bSAdrian Chadd extern void ar9300_enable_keysearch_always(struct ath_hal *ah, int enable); 169476bd547bSAdrian Chadd extern HAL_BOOL ar9300ForceVCS( struct ath_hal *ah); 169576bd547bSAdrian Chadd extern HAL_BOOL ar9300SetDfs3StreamFix(struct ath_hal *ah, u_int32_t val); 169676bd547bSAdrian Chadd extern HAL_BOOL ar9300Get3StreamSignature( struct ath_hal *ah); 169776bd547bSAdrian Chadd 169876bd547bSAdrian Chadd #ifdef ATH_TX99_DIAG 169976bd547bSAdrian Chadd #ifndef ATH_SUPPORT_HTC 1700e113789bSAdrian Chadd extern void ar9300_tx99_channel_pwr_update(struct ath_hal *ah, struct ieee80211_channel *c, u_int32_t txpower); 170176bd547bSAdrian Chadd extern void ar9300_tx99_chainmsk_setup(struct ath_hal *ah, int tx_chainmask); 170276bd547bSAdrian Chadd extern void ar9300_tx99_set_single_carrier(struct ath_hal *ah, int tx_chain_mask, int chtype); 170376bd547bSAdrian Chadd extern void ar9300_tx99_start(struct ath_hal *ah, u_int8_t *data); 170476bd547bSAdrian Chadd extern void ar9300_tx99_stop(struct ath_hal *ah); 170576bd547bSAdrian Chadd #endif /* ATH_SUPPORT_HTC */ 170676bd547bSAdrian Chadd #endif /* ATH_TX99_DIAG */ 1707899d1cacSAdrian Chadd extern HAL_BOOL ar9300_set_ctl_pwr(struct ath_hal *ah, u_int8_t *ctl_array); 1708899d1cacSAdrian Chadd extern void ar9300_set_txchainmaskopt(struct ath_hal *ah, u_int8_t mask); 170976bd547bSAdrian Chadd 171076bd547bSAdrian Chadd enum { 171176bd547bSAdrian Chadd AR9300_COEFF_TX_TYPE = 0, 171276bd547bSAdrian Chadd AR9300_COEFF_RX_TYPE 171376bd547bSAdrian Chadd }; 171476bd547bSAdrian Chadd 171576bd547bSAdrian Chadd #endif /* _ATH_AR9300_H_ */ 1716