xref: /freebsd/sys/contrib/dev/ath/ath_hal/ar9300/ar9300.h (revision c1ebd4c98fb8feab6931a536390739fc115e1805)
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