xref: /onnv-gate/usr/src/uts/common/io/arn/arn_ath9k.h (revision 11729:8922e660c576)
19999SWang.Lin@Sun.COM /*
2*11729SWang.Lin@Sun.COM  * Copyright 2010 Sun Microsystems, Inc.  All rights reserved.
39999SWang.Lin@Sun.COM  * Use is subject to license terms.
49999SWang.Lin@Sun.COM  */
59999SWang.Lin@Sun.COM 
69999SWang.Lin@Sun.COM /*
79999SWang.Lin@Sun.COM  * Copyright (c) 2008 Atheros Communications Inc.
89999SWang.Lin@Sun.COM  *
99999SWang.Lin@Sun.COM  * Permission to use, copy, modify, and/or distribute this software for any
109999SWang.Lin@Sun.COM  * purpose with or without fee is hereby granted, provided that the above
119999SWang.Lin@Sun.COM  * copyright notice and this permission notice appear in all copies.
129999SWang.Lin@Sun.COM  *
139999SWang.Lin@Sun.COM  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
149999SWang.Lin@Sun.COM  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
159999SWang.Lin@Sun.COM  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
169999SWang.Lin@Sun.COM  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
179999SWang.Lin@Sun.COM  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
189999SWang.Lin@Sun.COM  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
199999SWang.Lin@Sun.COM  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
209999SWang.Lin@Sun.COM  */
219999SWang.Lin@Sun.COM 
229999SWang.Lin@Sun.COM #ifndef	_ARN_ATH9K_H
239999SWang.Lin@Sun.COM #define	_ARN_ATH9K_H
249999SWang.Lin@Sun.COM 
259999SWang.Lin@Sun.COM #ifdef __cplusplus
269999SWang.Lin@Sun.COM extern "C" {
279999SWang.Lin@Sun.COM #endif
289999SWang.Lin@Sun.COM 
2911377SWang.Lin@Sun.COM #define	FUDGE	2
3011377SWang.Lin@Sun.COM 
319999SWang.Lin@Sun.COM enum ath9k_band {
329999SWang.Lin@Sun.COM 	ATH9K_BAND_2GHZ,
339999SWang.Lin@Sun.COM 	ATH9K_BAND_5GHZ,
349999SWang.Lin@Sun.COM 	ATH9K_NUM_BANDS
359999SWang.Lin@Sun.COM };
369999SWang.Lin@Sun.COM 
379999SWang.Lin@Sun.COM #define	ATHEROS_VENDOR_ID	0x168c
389999SWang.Lin@Sun.COM 
399999SWang.Lin@Sun.COM #define	AR5416_DEVID_PCI	0x0023
409999SWang.Lin@Sun.COM #define	AR5416_DEVID_PCIE	0x0024
419999SWang.Lin@Sun.COM #define	AR9160_DEVID_PCI	0x0027
429999SWang.Lin@Sun.COM #define	AR9280_DEVID_PCI	0x0029
439999SWang.Lin@Sun.COM #define	AR9280_DEVID_PCIE	0x002a
449999SWang.Lin@Sun.COM #define	AR9285_DEVID_PCIE	0x002b
459999SWang.Lin@Sun.COM 
469999SWang.Lin@Sun.COM #define	AR5416_AR9100_DEVID	0x000b
479999SWang.Lin@Sun.COM 
489999SWang.Lin@Sun.COM #define	AR_SUBVENDOR_ID_NOG	0x0e11
499999SWang.Lin@Sun.COM #define	AR_SUBVENDOR_ID_NEW_A	0x7065
509999SWang.Lin@Sun.COM 
519999SWang.Lin@Sun.COM #define	ATH9K_TXERR_XRETRY		0x01
529999SWang.Lin@Sun.COM #define	ATH9K_TXERR_FILT		0x02
539999SWang.Lin@Sun.COM #define	ATH9K_TXERR_FIFO		0x04
549999SWang.Lin@Sun.COM #define	ATH9K_TXERR_XTXOP		0x08
559999SWang.Lin@Sun.COM #define	ATH9K_TXERR_TIMER_EXPIRED	0x10
569999SWang.Lin@Sun.COM 
579999SWang.Lin@Sun.COM #define	ATH9K_TX_BA		0x01
589999SWang.Lin@Sun.COM #define	ATH9K_TX_PWRMGMT	0x02
599999SWang.Lin@Sun.COM #define	ATH9K_TX_DESC_CFG_ERR	0x04
609999SWang.Lin@Sun.COM #define	ATH9K_TX_DATA_UNDERRUN	0x08
619999SWang.Lin@Sun.COM #define	ATH9K_TX_DELIM_UNDERRUN	0x10
629999SWang.Lin@Sun.COM #define	ATH9K_TX_SW_ABORTED	0x40
639999SWang.Lin@Sun.COM #define	ATH9K_TX_SW_FILTERED	0x80
649999SWang.Lin@Sun.COM 
659999SWang.Lin@Sun.COM /* should be changed later */
669999SWang.Lin@Sun.COM #define	BIT(n)	(1UL << (n))
679999SWang.Lin@Sun.COM 
689999SWang.Lin@Sun.COM struct ath_tx_status {
699999SWang.Lin@Sun.COM 	uint32_t ts_tstamp;
709999SWang.Lin@Sun.COM 	uint16_t ts_seqnum;
719999SWang.Lin@Sun.COM 	uint8_t ts_status;
729999SWang.Lin@Sun.COM 	uint8_t ts_ratecode;
739999SWang.Lin@Sun.COM 	uint8_t ts_rateindex;
749999SWang.Lin@Sun.COM 	int8_t ts_rssi;
759999SWang.Lin@Sun.COM 	uint8_t ts_shortretry;
769999SWang.Lin@Sun.COM 	uint8_t ts_longretry;
779999SWang.Lin@Sun.COM 	uint8_t ts_virtcol;
789999SWang.Lin@Sun.COM 	uint8_t ts_antenna;
799999SWang.Lin@Sun.COM 	uint8_t ts_flags;
809999SWang.Lin@Sun.COM 	int8_t ts_rssi_ctl0;
819999SWang.Lin@Sun.COM 	int8_t ts_rssi_ctl1;
829999SWang.Lin@Sun.COM 	int8_t ts_rssi_ctl2;
839999SWang.Lin@Sun.COM 	int8_t ts_rssi_ext0;
849999SWang.Lin@Sun.COM 	int8_t ts_rssi_ext1;
859999SWang.Lin@Sun.COM 	int8_t ts_rssi_ext2;
869999SWang.Lin@Sun.COM 	uint8_t pad[3];
879999SWang.Lin@Sun.COM 	uint32_t ba_low;
889999SWang.Lin@Sun.COM 	uint32_t ba_high;
899999SWang.Lin@Sun.COM 	uint32_t evm0;
909999SWang.Lin@Sun.COM 	uint32_t evm1;
919999SWang.Lin@Sun.COM 	uint32_t evm2;
929999SWang.Lin@Sun.COM };
939999SWang.Lin@Sun.COM 
949999SWang.Lin@Sun.COM struct ath_rx_status {
959999SWang.Lin@Sun.COM 	uint32_t rs_tstamp;
969999SWang.Lin@Sun.COM 	uint16_t rs_datalen;
979999SWang.Lin@Sun.COM 	uint8_t rs_status;
989999SWang.Lin@Sun.COM 	uint8_t rs_phyerr;
999999SWang.Lin@Sun.COM 	int8_t rs_rssi;
1009999SWang.Lin@Sun.COM 	uint8_t rs_keyix;
1019999SWang.Lin@Sun.COM 	uint8_t rs_rate;
1029999SWang.Lin@Sun.COM 	uint8_t rs_antenna;
1039999SWang.Lin@Sun.COM 	uint8_t rs_more;
1049999SWang.Lin@Sun.COM 	int8_t rs_rssi_ctl0;
1059999SWang.Lin@Sun.COM 	int8_t rs_rssi_ctl1;
1069999SWang.Lin@Sun.COM 	int8_t rs_rssi_ctl2;
1079999SWang.Lin@Sun.COM 	int8_t rs_rssi_ext0;
1089999SWang.Lin@Sun.COM 	int8_t rs_rssi_ext1;
1099999SWang.Lin@Sun.COM 	int8_t rs_rssi_ext2;
1109999SWang.Lin@Sun.COM 	uint8_t rs_isaggr;
1119999SWang.Lin@Sun.COM 	uint8_t rs_moreaggr;
1129999SWang.Lin@Sun.COM 	uint8_t rs_num_delims;
1139999SWang.Lin@Sun.COM 	uint8_t rs_flags;
1149999SWang.Lin@Sun.COM 	uint32_t evm0;
1159999SWang.Lin@Sun.COM 	uint32_t evm1;
1169999SWang.Lin@Sun.COM 	uint32_t evm2;
1179999SWang.Lin@Sun.COM };
1189999SWang.Lin@Sun.COM 
1199999SWang.Lin@Sun.COM #define	ATH9K_RXERR_CRC		0x01
1209999SWang.Lin@Sun.COM #define	ATH9K_RXERR_PHY		0x02
1219999SWang.Lin@Sun.COM #define	ATH9K_RXERR_FIFO	0x04
1229999SWang.Lin@Sun.COM #define	ATH9K_RXERR_DECRYPT	0x08
1239999SWang.Lin@Sun.COM #define	ATH9K_RXERR_MIC		0x10
1249999SWang.Lin@Sun.COM 
1259999SWang.Lin@Sun.COM #define	ATH9K_RX_MORE		0x01
1269999SWang.Lin@Sun.COM #define	ATH9K_RX_MORE_AGGR	0x02
1279999SWang.Lin@Sun.COM #define	ATH9K_RX_GI		0x04
1289999SWang.Lin@Sun.COM #define	ATH9K_RX_2040		0x08
1299999SWang.Lin@Sun.COM #define	ATH9K_RX_DELIM_CRC_PRE	0x10
1309999SWang.Lin@Sun.COM #define	ATH9K_RX_DELIM_CRC_POST	0x20
1319999SWang.Lin@Sun.COM #define	ATH9K_RX_DECRYPT_BUSY	0x40
1329999SWang.Lin@Sun.COM 
1339999SWang.Lin@Sun.COM #define	ATH9K_RXKEYIX_INVALID	((uint8_t)-1)
1349999SWang.Lin@Sun.COM #define	ATH9K_TXKEYIX_INVALID	((uint32_t)-1)
1359999SWang.Lin@Sun.COM 
1369999SWang.Lin@Sun.COM #pragma pack(1)
1379999SWang.Lin@Sun.COM struct ath_desc {
1389999SWang.Lin@Sun.COM 	uint32_t ds_link;
1399999SWang.Lin@Sun.COM 	uint32_t ds_data;
1409999SWang.Lin@Sun.COM 	uint32_t ds_ctl0;
1419999SWang.Lin@Sun.COM 	uint32_t ds_ctl1;
1429999SWang.Lin@Sun.COM 	uint32_t ds_hw[20];
1439999SWang.Lin@Sun.COM 	union {
1449999SWang.Lin@Sun.COM 		struct ath_tx_status tx;
1459999SWang.Lin@Sun.COM 		struct ath_rx_status rx;
1469999SWang.Lin@Sun.COM 		void *stats;
1479999SWang.Lin@Sun.COM 	} ds_us;
1489999SWang.Lin@Sun.COM 	void *ds_vdata;
1499999SWang.Lin@Sun.COM };
1509999SWang.Lin@Sun.COM #pragma pack()
1519999SWang.Lin@Sun.COM 
1529999SWang.Lin@Sun.COM #define	ds_txstat	ds_us.tx
1539999SWang.Lin@Sun.COM #define	ds_rxstat	ds_us.rx
1549999SWang.Lin@Sun.COM #define	ds_stat		ds_us.stats
1559999SWang.Lin@Sun.COM 
1569999SWang.Lin@Sun.COM #define	ATH9K_TXDESC_CLRDMASK		0x0001
1579999SWang.Lin@Sun.COM #define	ATH9K_TXDESC_NOACK		0x0002
1589999SWang.Lin@Sun.COM #define	ATH9K_TXDESC_RTSENA		0x0004
1599999SWang.Lin@Sun.COM #define	ATH9K_TXDESC_CTSENA		0x0008
1609999SWang.Lin@Sun.COM /*
1619999SWang.Lin@Sun.COM  * ATH9K_TXDESC_INTREQ forces a tx interrupt to be generated for
1629999SWang.Lin@Sun.COM  * the descriptor its marked on.  We take a tx interrupt to reap
1639999SWang.Lin@Sun.COM  * descriptors when the h/w hits an EOL condition or
1649999SWang.Lin@Sun.COM  * when the descriptor is specifically marked to generate
1659999SWang.Lin@Sun.COM  * an interrupt with this flag. Descriptors should be
1669999SWang.Lin@Sun.COM  * marked periodically to insure timely replenishing of the
1679999SWang.Lin@Sun.COM  * supply needed for sending frames. Defering interrupts
1689999SWang.Lin@Sun.COM  * reduces system load and potentially allows more concurrent
1699999SWang.Lin@Sun.COM  * work to be done but if done to aggressively can cause
1709999SWang.Lin@Sun.COM  * senders to backup. When the hardware queue is left too
1719999SWang.Lin@Sun.COM  * large rate control information may also be too out of
1729999SWang.Lin@Sun.COM  * date. An Alternative for this is TX interrupt mitigation
1739999SWang.Lin@Sun.COM  * but this needs more testing.
1749999SWang.Lin@Sun.COM  */
1759999SWang.Lin@Sun.COM #define	ATH9K_TXDESC_INTREQ		0x0010
1769999SWang.Lin@Sun.COM #define	ATH9K_TXDESC_VEOL		0x0020
1779999SWang.Lin@Sun.COM #define	ATH9K_TXDESC_EXT_ONLY		0x0040
1789999SWang.Lin@Sun.COM #define	ATH9K_TXDESC_EXT_AND_CTL	0x0080
1799999SWang.Lin@Sun.COM #define	ATH9K_TXDESC_VMF		0x0100
1809999SWang.Lin@Sun.COM #define	ATH9K_TXDESC_FRAG_IS_ON 	0x0200
1819999SWang.Lin@Sun.COM #define	ATH9K_TXDESC_CAB		0x0400
1829999SWang.Lin@Sun.COM 
1839999SWang.Lin@Sun.COM #define	ATH9K_RXDESC_INTREQ		0x0020
1849999SWang.Lin@Sun.COM 
1859999SWang.Lin@Sun.COM enum wireless_mode {
1869999SWang.Lin@Sun.COM 	ATH9K_MODE_11A = 0,
1879999SWang.Lin@Sun.COM 	ATH9K_MODE_11B = 2,
1889999SWang.Lin@Sun.COM 	ATH9K_MODE_11G = 3,
1899999SWang.Lin@Sun.COM 	ATH9K_MODE_11NA_HT20 = 6,
1909999SWang.Lin@Sun.COM 	ATH9K_MODE_11NG_HT20 = 7,
1919999SWang.Lin@Sun.COM 	ATH9K_MODE_11NA_HT40PLUS = 8,
1929999SWang.Lin@Sun.COM 	ATH9K_MODE_11NA_HT40MINUS = 9,
1939999SWang.Lin@Sun.COM 	ATH9K_MODE_11NG_HT40PLUS = 10,
1949999SWang.Lin@Sun.COM 	ATH9K_MODE_11NG_HT40MINUS = 11,
1959999SWang.Lin@Sun.COM 	ATH9K_MODE_MAX
1969999SWang.Lin@Sun.COM };
1979999SWang.Lin@Sun.COM 
1989999SWang.Lin@Sun.COM enum ath9k_hw_caps {
1999999SWang.Lin@Sun.COM 	ATH9K_HW_CAP_CHAN_SPREAD		= BIT(0),
2009999SWang.Lin@Sun.COM 	ATH9K_HW_CAP_MIC_AESCCM			= BIT(1),
2019999SWang.Lin@Sun.COM 	ATH9K_HW_CAP_MIC_CKIP			= BIT(2),
2029999SWang.Lin@Sun.COM 	ATH9K_HW_CAP_MIC_TKIP			= BIT(3),
2039999SWang.Lin@Sun.COM 	ATH9K_HW_CAP_CIPHER_AESCCM		= BIT(4),
2049999SWang.Lin@Sun.COM 	ATH9K_HW_CAP_CIPHER_CKIP		= BIT(5),
2059999SWang.Lin@Sun.COM 	ATH9K_HW_CAP_CIPHER_TKIP		= BIT(6),
2069999SWang.Lin@Sun.COM 	ATH9K_HW_CAP_VEOL			= BIT(7),
2079999SWang.Lin@Sun.COM 	ATH9K_HW_CAP_BSSIDMASK			= BIT(8),
2089999SWang.Lin@Sun.COM 	ATH9K_HW_CAP_MCAST_KEYSEARCH		= BIT(9),
2099999SWang.Lin@Sun.COM 	ATH9K_HW_CAP_CHAN_HALFRATE		= BIT(10),
2109999SWang.Lin@Sun.COM 	ATH9K_HW_CAP_CHAN_QUARTERRATE		= BIT(11),
2119999SWang.Lin@Sun.COM 	ATH9K_HW_CAP_HT				= BIT(12),
2129999SWang.Lin@Sun.COM 	ATH9K_HW_CAP_GTT			= BIT(13),
2139999SWang.Lin@Sun.COM 	ATH9K_HW_CAP_FASTCC			= BIT(14),
2149999SWang.Lin@Sun.COM 	ATH9K_HW_CAP_RFSILENT			= BIT(15),
2159999SWang.Lin@Sun.COM 	ATH9K_HW_CAP_WOW			= BIT(16),
2169999SWang.Lin@Sun.COM 	ATH9K_HW_CAP_CST			= BIT(17),
2179999SWang.Lin@Sun.COM 	ATH9K_HW_CAP_ENHANCEDPM			= BIT(18),
2189999SWang.Lin@Sun.COM 	ATH9K_HW_CAP_AUTOSLEEP			= BIT(19),
2199999SWang.Lin@Sun.COM 	ATH9K_HW_CAP_4KB_SPLITTRANS		= BIT(20),
2209999SWang.Lin@Sun.COM 	ATH9K_HW_CAP_WOW_MATCHPATTERN_EXACT	= BIT(21),
2219999SWang.Lin@Sun.COM };
2229999SWang.Lin@Sun.COM 
2239999SWang.Lin@Sun.COM enum ath9k_capability_type {
2249999SWang.Lin@Sun.COM 	ATH9K_CAP_CIPHER = 0,
2259999SWang.Lin@Sun.COM 	ATH9K_CAP_TKIP_MIC,
2269999SWang.Lin@Sun.COM 	ATH9K_CAP_TKIP_SPLIT,
2279999SWang.Lin@Sun.COM 	ATH9K_CAP_PHYCOUNTERS,
2289999SWang.Lin@Sun.COM 	ATH9K_CAP_DIVERSITY,
2299999SWang.Lin@Sun.COM 	ATH9K_CAP_TXPOW,
2309999SWang.Lin@Sun.COM 	ATH9K_CAP_PHYDIAG,
2319999SWang.Lin@Sun.COM 	ATH9K_CAP_MCAST_KEYSRCH,
2329999SWang.Lin@Sun.COM 	ATH9K_CAP_TSF_ADJUST,
2339999SWang.Lin@Sun.COM 	ATH9K_CAP_WME_TKIPMIC,
2349999SWang.Lin@Sun.COM 	ATH9K_CAP_RFSILENT,
2359999SWang.Lin@Sun.COM 	ATH9K_CAP_ANT_CFG_2GHZ,
2369999SWang.Lin@Sun.COM 	ATH9K_CAP_ANT_CFG_5GHZ
2379999SWang.Lin@Sun.COM };
2389999SWang.Lin@Sun.COM 
2399999SWang.Lin@Sun.COM struct ath9k_hw_capabilities {
2409999SWang.Lin@Sun.COM 	uint32_t hw_caps; /* ATH9K_HW_CAP_* from ath9k_hw_caps */
2419999SWang.Lin@Sun.COM 	uint8_t	 wireless_modes[4]; /* ATH9K_MODE_* */
2429999SWang.Lin@Sun.COM 	uint16_t total_queues;
2439999SWang.Lin@Sun.COM 	uint16_t keycache_size;
2449999SWang.Lin@Sun.COM 	uint16_t low_5ghz_chan, high_5ghz_chan;
2459999SWang.Lin@Sun.COM 	uint16_t low_2ghz_chan, high_2ghz_chan;
2469999SWang.Lin@Sun.COM 	uint16_t num_mr_retries;
2479999SWang.Lin@Sun.COM 	uint16_t rts_aggr_limit;
2489999SWang.Lin@Sun.COM 	uint8_t tx_chainmask;
2499999SWang.Lin@Sun.COM 	uint8_t rx_chainmask;
2509999SWang.Lin@Sun.COM 	uint16_t tx_triglevel_max;
2519999SWang.Lin@Sun.COM 	uint16_t reg_cap;
2529999SWang.Lin@Sun.COM 	uint8_t num_gpio_pins;
2539999SWang.Lin@Sun.COM 	uint8_t num_antcfg_2ghz;
2549999SWang.Lin@Sun.COM 	uint8_t num_antcfg_5ghz;
2559999SWang.Lin@Sun.COM };
2569999SWang.Lin@Sun.COM 
2579999SWang.Lin@Sun.COM struct ath9k_ops_config {
2589999SWang.Lin@Sun.COM 	int dma_beacon_response_time;
2599999SWang.Lin@Sun.COM 	int sw_beacon_response_time;
2609999SWang.Lin@Sun.COM 	int additional_swba_backoff;
2619999SWang.Lin@Sun.COM 	int ack_6mb;
2629999SWang.Lin@Sun.COM 	int cwm_ignore_extcca;
2639999SWang.Lin@Sun.COM 	uint8_t pcie_powersave_enable;
2649999SWang.Lin@Sun.COM 	uint8_t pcie_l1skp_enable;
2659999SWang.Lin@Sun.COM 	uint8_t pcie_clock_req;
2669999SWang.Lin@Sun.COM 	uint32_t pcie_waen;
2679999SWang.Lin@Sun.COM 	int pcie_power_reset;
2689999SWang.Lin@Sun.COM 	uint8_t pcie_restore;
2699999SWang.Lin@Sun.COM 	uint8_t analog_shiftreg;
2709999SWang.Lin@Sun.COM 	uint8_t ht_enable;
2719999SWang.Lin@Sun.COM 	uint32_t ofdm_trig_low;
2729999SWang.Lin@Sun.COM 	uint32_t ofdm_trig_high;
2739999SWang.Lin@Sun.COM 	uint32_t cck_trig_high;
2749999SWang.Lin@Sun.COM 	uint32_t cck_trig_low;
2759999SWang.Lin@Sun.COM 	uint32_t enable_ani;
2769999SWang.Lin@Sun.COM 	uint8_t noise_immunity_level;
2779999SWang.Lin@Sun.COM 	uint32_t ofdm_weaksignal_det;
2789999SWang.Lin@Sun.COM 	uint32_t cck_weaksignal_thr;
2799999SWang.Lin@Sun.COM 	uint8_t spur_immunity_level;
2809999SWang.Lin@Sun.COM 	uint8_t firstep_level;
2819999SWang.Lin@Sun.COM 	int8_t rssi_thr_high;
2829999SWang.Lin@Sun.COM 	int8_t rssi_thr_low;
2839999SWang.Lin@Sun.COM 	uint16_t diversity_control;
2849999SWang.Lin@Sun.COM 	uint16_t antenna_switch_swap;
2859999SWang.Lin@Sun.COM 	int serialize_regmode;
2869999SWang.Lin@Sun.COM 	int intr_mitigation;
2879999SWang.Lin@Sun.COM #define	SPUR_DISABLE		0
2889999SWang.Lin@Sun.COM #define	SPUR_ENABLE_IOCTL	1
2899999SWang.Lin@Sun.COM #define	SPUR_ENABLE_EEPROM	2
2909999SWang.Lin@Sun.COM #define	AR_EEPROM_MODAL_SPURS	5
2919999SWang.Lin@Sun.COM #define	AR_SPUR_5413_1		1640
2929999SWang.Lin@Sun.COM #define	AR_SPUR_5413_2		1200
2939999SWang.Lin@Sun.COM #define	AR_NO_SPUR		0x8000
2949999SWang.Lin@Sun.COM #define	AR_BASE_FREQ_2GHZ	2300
2959999SWang.Lin@Sun.COM #define	AR_BASE_FREQ_5GHZ	4900
2969999SWang.Lin@Sun.COM #define	AR_SPUR_FEEQ_BOUND_HT40	19
2979999SWang.Lin@Sun.COM #define	AR_SPUR_FEEQ_BOUND_HT20	10
2989999SWang.Lin@Sun.COM 	int spurmode;
2999999SWang.Lin@Sun.COM 	uint16_t spurchans[AR_EEPROM_MODAL_SPURS][2];
3009999SWang.Lin@Sun.COM };
3019999SWang.Lin@Sun.COM 
3029999SWang.Lin@Sun.COM enum ath9k_tx_queue {
3039999SWang.Lin@Sun.COM 	ATH9K_TX_QUEUE_INACTIVE = 0,
3049999SWang.Lin@Sun.COM 	ATH9K_TX_QUEUE_DATA,
3059999SWang.Lin@Sun.COM 	ATH9K_TX_QUEUE_BEACON,
3069999SWang.Lin@Sun.COM 	ATH9K_TX_QUEUE_CAB,
3079999SWang.Lin@Sun.COM 	ATH9K_TX_QUEUE_UAPSD,
3089999SWang.Lin@Sun.COM 	ATH9K_TX_QUEUE_PSPOLL
3099999SWang.Lin@Sun.COM };
3109999SWang.Lin@Sun.COM 
3119999SWang.Lin@Sun.COM #define	ATH9K_NUM_TX_QUEUES 10
3129999SWang.Lin@Sun.COM 
3139999SWang.Lin@Sun.COM enum ath9k_tx_queue_subtype {
3149999SWang.Lin@Sun.COM 	ATH9K_WME_AC_BK = 0,
3159999SWang.Lin@Sun.COM 	ATH9K_WME_AC_BE,
3169999SWang.Lin@Sun.COM 	ATH9K_WME_AC_VI,
3179999SWang.Lin@Sun.COM 	ATH9K_WME_AC_VO,
3189999SWang.Lin@Sun.COM 	ATH9K_WME_UPSD
3199999SWang.Lin@Sun.COM };
3209999SWang.Lin@Sun.COM 
3219999SWang.Lin@Sun.COM enum ath9k_tx_queue_flags {
3229999SWang.Lin@Sun.COM 	TXQ_FLAG_TXOKINT_ENABLE = 0x0001,
3239999SWang.Lin@Sun.COM 	TXQ_FLAG_TXERRINT_ENABLE = 0x0001,
3249999SWang.Lin@Sun.COM 	TXQ_FLAG_TXDESCINT_ENABLE = 0x0002,
3259999SWang.Lin@Sun.COM 	TXQ_FLAG_TXEOLINT_ENABLE = 0x0004,
3269999SWang.Lin@Sun.COM 	TXQ_FLAG_TXURNINT_ENABLE = 0x0008,
3279999SWang.Lin@Sun.COM 	TXQ_FLAG_BACKOFF_DISABLE = 0x0010,
3289999SWang.Lin@Sun.COM 	TXQ_FLAG_COMPRESSION_ENABLE = 0x0020,
3299999SWang.Lin@Sun.COM 	TXQ_FLAG_RDYTIME_EXP_POLICY_ENABLE = 0x0040,
3309999SWang.Lin@Sun.COM 	TXQ_FLAG_FRAG_BURST_BACKOFF_ENABLE = 0x0080,
3319999SWang.Lin@Sun.COM };
3329999SWang.Lin@Sun.COM 
3339999SWang.Lin@Sun.COM #define	ATH9K_TXQ_USEDEFAULT	((uint32_t)(-1))
3349999SWang.Lin@Sun.COM 
3359999SWang.Lin@Sun.COM #define	ATH9K_DECOMP_MASK_SIZE		128
3369999SWang.Lin@Sun.COM #define	ATH9K_READY_TIME_LO_BOUND	50
3379999SWang.Lin@Sun.COM #define	ATH9K_READY_TIME_HI_BOUND	96
3389999SWang.Lin@Sun.COM 
3399999SWang.Lin@Sun.COM enum ath9k_pkt_type {
3409999SWang.Lin@Sun.COM 	ATH9K_PKT_TYPE_NORMAL = 0,
3419999SWang.Lin@Sun.COM 	ATH9K_PKT_TYPE_ATIM,
3429999SWang.Lin@Sun.COM 	ATH9K_PKT_TYPE_PSPOLL,
3439999SWang.Lin@Sun.COM 	ATH9K_PKT_TYPE_BEACON,
3449999SWang.Lin@Sun.COM 	ATH9K_PKT_TYPE_PROBE_RESP,
3459999SWang.Lin@Sun.COM 	ATH9K_PKT_TYPE_CHIRP,
3469999SWang.Lin@Sun.COM 	ATH9K_PKT_TYPE_GRP_POLL,
3479999SWang.Lin@Sun.COM };
3489999SWang.Lin@Sun.COM 
3499999SWang.Lin@Sun.COM struct ath9k_tx_queue_info {
3509999SWang.Lin@Sun.COM 	uint32_t tqi_ver;
3519999SWang.Lin@Sun.COM 	enum ath9k_tx_queue tqi_type;
3529999SWang.Lin@Sun.COM 	enum ath9k_tx_queue_subtype tqi_subtype;
3539999SWang.Lin@Sun.COM 	enum ath9k_tx_queue_flags tqi_qflags;
3549999SWang.Lin@Sun.COM 	uint32_t tqi_priority;
3559999SWang.Lin@Sun.COM 	uint32_t tqi_aifs;
3569999SWang.Lin@Sun.COM 	uint32_t tqi_cwmin;
3579999SWang.Lin@Sun.COM 	uint32_t tqi_cwmax;
3589999SWang.Lin@Sun.COM 	uint16_t tqi_shretry;
3599999SWang.Lin@Sun.COM 	uint16_t tqi_lgretry;
3609999SWang.Lin@Sun.COM 	uint32_t tqi_cbrPeriod;
3619999SWang.Lin@Sun.COM 	uint32_t tqi_cbrOverflowLimit;
3629999SWang.Lin@Sun.COM 	uint32_t tqi_burstTime;
3639999SWang.Lin@Sun.COM 	uint32_t tqi_readyTime;
3649999SWang.Lin@Sun.COM 	uint32_t tqi_physCompBuf;
3659999SWang.Lin@Sun.COM 	uint32_t tqi_intFlags;
3669999SWang.Lin@Sun.COM };
3679999SWang.Lin@Sun.COM 
3689999SWang.Lin@Sun.COM enum ath9k_rx_filter {
3699999SWang.Lin@Sun.COM 	ATH9K_RX_FILTER_UCAST = 0x00000001,
3709999SWang.Lin@Sun.COM 	ATH9K_RX_FILTER_MCAST = 0x00000002,
3719999SWang.Lin@Sun.COM 	ATH9K_RX_FILTER_BCAST = 0x00000004,
3729999SWang.Lin@Sun.COM 	ATH9K_RX_FILTER_CONTROL = 0x00000008,
3739999SWang.Lin@Sun.COM 	ATH9K_RX_FILTER_BEACON = 0x00000010,
3749999SWang.Lin@Sun.COM 	ATH9K_RX_FILTER_PROM = 0x00000020,
3759999SWang.Lin@Sun.COM 	ATH9K_RX_FILTER_PROBEREQ = 0x00000080,
3769999SWang.Lin@Sun.COM 	ATH9K_RX_FILTER_PSPOLL = 0x00004000,
3779999SWang.Lin@Sun.COM 	ATH9K_RX_FILTER_PHYERR = 0x00000100,
3789999SWang.Lin@Sun.COM 	ATH9K_RX_FILTER_PHYRADAR = 0x00002000,
3799999SWang.Lin@Sun.COM };
3809999SWang.Lin@Sun.COM 
3819999SWang.Lin@Sun.COM enum ath9k_int {
3829999SWang.Lin@Sun.COM 	ATH9K_INT_RX = 0x00000001,
3839999SWang.Lin@Sun.COM 	ATH9K_INT_RXDESC = 0x00000002,
3849999SWang.Lin@Sun.COM 	ATH9K_INT_RXNOFRM = 0x00000008,
3859999SWang.Lin@Sun.COM 	ATH9K_INT_RXEOL = 0x00000010,
3869999SWang.Lin@Sun.COM 	ATH9K_INT_RXORN = 0x00000020,
3879999SWang.Lin@Sun.COM 	ATH9K_INT_TX = 0x00000040,
3889999SWang.Lin@Sun.COM 	ATH9K_INT_TXDESC = 0x00000080,
3899999SWang.Lin@Sun.COM 	ATH9K_INT_TIM_TIMER = 0x00000100,
3909999SWang.Lin@Sun.COM 	ATH9K_INT_TXURN = 0x00000800,
3919999SWang.Lin@Sun.COM 	ATH9K_INT_MIB = 0x00001000,
3929999SWang.Lin@Sun.COM 	ATH9K_INT_RXPHY = 0x00004000,
3939999SWang.Lin@Sun.COM 	ATH9K_INT_RXKCM = 0x00008000,
3949999SWang.Lin@Sun.COM 	ATH9K_INT_SWBA = 0x00010000,
3959999SWang.Lin@Sun.COM 	ATH9K_INT_BMISS = 0x00040000,
3969999SWang.Lin@Sun.COM 	ATH9K_INT_BNR = 0x00100000,
3979999SWang.Lin@Sun.COM 	ATH9K_INT_TIM = 0x00200000,
3989999SWang.Lin@Sun.COM 	ATH9K_INT_DTIM = 0x00400000,
3999999SWang.Lin@Sun.COM 	ATH9K_INT_DTIMSYNC = 0x00800000,
4009999SWang.Lin@Sun.COM 	ATH9K_INT_GPIO = 0x01000000,
4019999SWang.Lin@Sun.COM 	ATH9K_INT_CABEND = 0x02000000,
4029999SWang.Lin@Sun.COM 	ATH9K_INT_CST = 0x10000000,
4039999SWang.Lin@Sun.COM 	ATH9K_INT_GTT = 0x20000000,
4049999SWang.Lin@Sun.COM 	ATH9K_INT_FATAL = 0x40000000,
4059999SWang.Lin@Sun.COM 	ATH9K_INT_GLOBAL = INT_MIN,
4069999SWang.Lin@Sun.COM 	ATH9K_INT_BMISC = ATH9K_INT_TIM |
4079999SWang.Lin@Sun.COM 		ATH9K_INT_DTIM |
4089999SWang.Lin@Sun.COM 		ATH9K_INT_DTIMSYNC |
4099999SWang.Lin@Sun.COM 		ATH9K_INT_CABEND,
4109999SWang.Lin@Sun.COM 	ATH9K_INT_COMMON = ATH9K_INT_RXNOFRM |
4119999SWang.Lin@Sun.COM 		ATH9K_INT_RXDESC |
4129999SWang.Lin@Sun.COM 		ATH9K_INT_RXEOL |
4139999SWang.Lin@Sun.COM 		ATH9K_INT_RXORN |
4149999SWang.Lin@Sun.COM 		ATH9K_INT_TXURN |
4159999SWang.Lin@Sun.COM 		ATH9K_INT_TXDESC |
4169999SWang.Lin@Sun.COM 		ATH9K_INT_MIB |
4179999SWang.Lin@Sun.COM 		ATH9K_INT_RXPHY |
4189999SWang.Lin@Sun.COM 		ATH9K_INT_RXKCM |
4199999SWang.Lin@Sun.COM 		ATH9K_INT_SWBA |
4209999SWang.Lin@Sun.COM 		ATH9K_INT_BMISS |
4219999SWang.Lin@Sun.COM 		ATH9K_INT_GPIO,
4229999SWang.Lin@Sun.COM 	ATH9K_INT_NOCARD = -1
4239999SWang.Lin@Sun.COM };
4249999SWang.Lin@Sun.COM 
4259999SWang.Lin@Sun.COM #define	ATH9K_RATESERIES_RTS_CTS	0x0001
4269999SWang.Lin@Sun.COM #define	ATH9K_RATESERIES_2040		0x0002
4279999SWang.Lin@Sun.COM #define	ATH9K_RATESERIES_HALFGI		0x0004
4289999SWang.Lin@Sun.COM 
4299999SWang.Lin@Sun.COM struct ath9k_11n_rate_series {
4309999SWang.Lin@Sun.COM 	uint32_t Tries;
4319999SWang.Lin@Sun.COM 	uint32_t Rate;
4329999SWang.Lin@Sun.COM 	uint32_t PktDuration;
4339999SWang.Lin@Sun.COM 	uint32_t ChSel;
4349999SWang.Lin@Sun.COM 	uint32_t RateFlags;
4359999SWang.Lin@Sun.COM };
4369999SWang.Lin@Sun.COM 
4379999SWang.Lin@Sun.COM #define	CHANNEL_CW_INT		0x00002
4389999SWang.Lin@Sun.COM #define	CHANNEL_CCK		0x00020
4399999SWang.Lin@Sun.COM #define	CHANNEL_OFDM		0x00040
4409999SWang.Lin@Sun.COM #define	CHANNEL_2GHZ		0x00080
4419999SWang.Lin@Sun.COM #define	CHANNEL_5GHZ		0x00100
4429999SWang.Lin@Sun.COM #define	CHANNEL_PASSIVE		0x00200
4439999SWang.Lin@Sun.COM #define	CHANNEL_DYN		0x00400
4449999SWang.Lin@Sun.COM #define	CHANNEL_HALF		0x04000
4459999SWang.Lin@Sun.COM #define	CHANNEL_QUARTER		0x08000
4469999SWang.Lin@Sun.COM #define	CHANNEL_HT20		0x10000
4479999SWang.Lin@Sun.COM #define	CHANNEL_HT40PLUS	0x20000
4489999SWang.Lin@Sun.COM #define	CHANNEL_HT40MINUS	0x40000
4499999SWang.Lin@Sun.COM 
4509999SWang.Lin@Sun.COM #define	CHANNEL_INTERFERENCE	0x01
4519999SWang.Lin@Sun.COM #define	CHANNEL_DFS		0x02
4529999SWang.Lin@Sun.COM #define	CHANNEL_4MS_LIMIT	0x04
4539999SWang.Lin@Sun.COM #define	CHANNEL_DFS_CLEAR	0x08
4549999SWang.Lin@Sun.COM #define	CHANNEL_DISALLOW_ADHOC	0x10
4559999SWang.Lin@Sun.COM #define	CHANNEL_PER_11D_ADHOC	0x20
4569999SWang.Lin@Sun.COM 
4579999SWang.Lin@Sun.COM #define	CHANNEL_A		(CHANNEL_5GHZ|CHANNEL_OFDM)
4589999SWang.Lin@Sun.COM #define	CHANNEL_B		(CHANNEL_2GHZ|CHANNEL_CCK)
4599999SWang.Lin@Sun.COM #define	CHANNEL_G		(CHANNEL_2GHZ|CHANNEL_OFDM)
4609999SWang.Lin@Sun.COM #define	CHANNEL_G_HT20		(CHANNEL_2GHZ|CHANNEL_HT20)
4619999SWang.Lin@Sun.COM #define	CHANNEL_A_HT20		(CHANNEL_5GHZ|CHANNEL_HT20)
4629999SWang.Lin@Sun.COM #define	CHANNEL_G_HT40PLUS	(CHANNEL_2GHZ|CHANNEL_HT40PLUS)
4639999SWang.Lin@Sun.COM #define	CHANNEL_G_HT40MINUS	(CHANNEL_2GHZ|CHANNEL_HT40MINUS)
4649999SWang.Lin@Sun.COM #define	CHANNEL_A_HT40PLUS	(CHANNEL_5GHZ|CHANNEL_HT40PLUS)
4659999SWang.Lin@Sun.COM #define	CHANNEL_A_HT40MINUS	(CHANNEL_5GHZ|CHANNEL_HT40MINUS)
4669999SWang.Lin@Sun.COM #define	CHANNEL_ALL		\
4679999SWang.Lin@Sun.COM 	(CHANNEL_OFDM|		\
4689999SWang.Lin@Sun.COM 	CHANNEL_CCK|		\
4699999SWang.Lin@Sun.COM 	CHANNEL_2GHZ |		\
4709999SWang.Lin@Sun.COM 	CHANNEL_5GHZ |		\
4719999SWang.Lin@Sun.COM 	CHANNEL_HT20 |		\
4729999SWang.Lin@Sun.COM 	CHANNEL_HT40PLUS |	\
4739999SWang.Lin@Sun.COM 	CHANNEL_HT40MINUS)
4749999SWang.Lin@Sun.COM 
4759999SWang.Lin@Sun.COM struct ath9k_channel {
4769999SWang.Lin@Sun.COM 	uint16_t channel;
4779999SWang.Lin@Sun.COM 	uint32_t channelFlags;
4789999SWang.Lin@Sun.COM 	uint8_t privFlags;
4799999SWang.Lin@Sun.COM 	int8_t maxRegTxPower;
4809999SWang.Lin@Sun.COM 	int8_t maxTxPower;
4819999SWang.Lin@Sun.COM 	int8_t minTxPower;
4829999SWang.Lin@Sun.COM 	uint32_t chanmode;
4839999SWang.Lin@Sun.COM 	int32_t CalValid;
4849999SWang.Lin@Sun.COM 	boolean_t oneTimeCalsDone;
4859999SWang.Lin@Sun.COM 	int8_t iCoff;
4869999SWang.Lin@Sun.COM 	int8_t qCoff;
4879999SWang.Lin@Sun.COM 	int16_t rawNoiseFloor;
4889999SWang.Lin@Sun.COM 	int8_t antennaMax;
4899999SWang.Lin@Sun.COM 	uint32_t regDmnFlags;
4909999SWang.Lin@Sun.COM 	uint32_t conformanceTestLimit[3]; /* 0:11a, 1: 11b, 2:11g */
4919999SWang.Lin@Sun.COM #ifdef ARN_NF_PER_CHAN
4929999SWang.Lin@Sun.COM 	struct ath9k_nfcal_hist nfCalHist[NUM_NF_READINGS];
4939999SWang.Lin@Sun.COM #endif
4949999SWang.Lin@Sun.COM };
4959999SWang.Lin@Sun.COM 
4969999SWang.Lin@Sun.COM #define	IS_CHAN_A(_c) ((((_c)->channelFlags & CHANNEL_A) == CHANNEL_A) || \
4979999SWang.Lin@Sun.COM 	(((_c)->channelFlags & CHANNEL_A_HT20) == CHANNEL_A_HT20) || \
4989999SWang.Lin@Sun.COM 	(((_c)->channelFlags & CHANNEL_A_HT40PLUS) == CHANNEL_A_HT40PLUS) || \
4999999SWang.Lin@Sun.COM 	(((_c)->channelFlags & CHANNEL_A_HT40MINUS) == CHANNEL_A_HT40MINUS))
5009999SWang.Lin@Sun.COM #define	IS_CHAN_G(_c) ((((_c)->channelFlags & (CHANNEL_G)) == CHANNEL_G) || \
5019999SWang.Lin@Sun.COM 	(((_c)->channelFlags & CHANNEL_G_HT20) == CHANNEL_G_HT20) || \
5029999SWang.Lin@Sun.COM 	(((_c)->channelFlags & CHANNEL_G_HT40PLUS) == CHANNEL_G_HT40PLUS) || \
5039999SWang.Lin@Sun.COM 	(((_c)->channelFlags & CHANNEL_G_HT40MINUS) == CHANNEL_G_HT40MINUS))
5049999SWang.Lin@Sun.COM #define	IS_CHAN_OFDM(_c)	(((_c)->channelFlags & CHANNEL_OFDM) != 0)
5059999SWang.Lin@Sun.COM #define	IS_CHAN_5GHZ(_c)	(((_c)->channelFlags & CHANNEL_5GHZ) != 0)
5069999SWang.Lin@Sun.COM #define	IS_CHAN_2GHZ(_c)	(((_c)->channelFlags & CHANNEL_2GHZ) != 0)
5079999SWang.Lin@Sun.COM #define	IS_CHAN_PASSIVE(_c)	(((_c)->channelFlags & CHANNEL_PASSIVE) != 0)
5089999SWang.Lin@Sun.COM #define	IS_CHAN_HALF_RATE(_c)	(((_c)->channelFlags & CHANNEL_HALF) != 0)
5099999SWang.Lin@Sun.COM #define	IS_CHAN_QUARTER_RATE(_c) \
5109999SWang.Lin@Sun.COM 	(((_c)->channelFlags & CHANNEL_QUARTER) != 0)
5119999SWang.Lin@Sun.COM 
5129999SWang.Lin@Sun.COM /* These macros check chanmode and not channelFlags */
5139999SWang.Lin@Sun.COM #define	IS_CHAN_B(_c)	((_c)->chanmode == CHANNEL_B)
5149999SWang.Lin@Sun.COM #define	IS_CHAN_HT20(_c)	(((_c)->chanmode == CHANNEL_A_HT20) ||	\
5159999SWang.Lin@Sun.COM 	((_c)->chanmode == CHANNEL_G_HT20))
5169999SWang.Lin@Sun.COM #define	IS_CHAN_HT40(_c) (((_c)->chanmode == CHANNEL_A_HT40PLUS) ||	\
5179999SWang.Lin@Sun.COM 	((_c)->chanmode == CHANNEL_A_HT40MINUS) ||	\
5189999SWang.Lin@Sun.COM 	((_c)->chanmode == CHANNEL_G_HT40PLUS) ||	\
5199999SWang.Lin@Sun.COM 	((_c)->chanmode == CHANNEL_G_HT40MINUS))
5209999SWang.Lin@Sun.COM #define	IS_CHAN_HT(_c)	(IS_CHAN_HT20((_c)) || IS_CHAN_HT40((_c)))
5219999SWang.Lin@Sun.COM 
5229999SWang.Lin@Sun.COM #define	IS_CHAN_IN_PUBLIC_SAFETY_BAND(_c)	((_c) > 4940 && (_c) < 4990)
5239999SWang.Lin@Sun.COM #define	IS_CHAN_A_5MHZ_SPACED(_c)			\
5249999SWang.Lin@Sun.COM 	((((_c)->channelFlags & CHANNEL_5GHZ) != 0) &&	\
5259999SWang.Lin@Sun.COM 	(((_c)->channel % 20) != 0) &&			\
5269999SWang.Lin@Sun.COM 	(((_c)->channel % 10) != 0))
5279999SWang.Lin@Sun.COM 
5289999SWang.Lin@Sun.COM struct ath9k_keyval {
5299999SWang.Lin@Sun.COM 	uint8_t kv_type;
5309999SWang.Lin@Sun.COM 	uint8_t kv_pad;
5319999SWang.Lin@Sun.COM 	uint16_t kv_len;
5329999SWang.Lin@Sun.COM 	uint8_t kv_val[16];
5339999SWang.Lin@Sun.COM 	uint8_t kv_mic[8];
5349999SWang.Lin@Sun.COM 	uint8_t kv_txmic[8];
5359999SWang.Lin@Sun.COM };
5369999SWang.Lin@Sun.COM 
5379999SWang.Lin@Sun.COM enum ath9k_key_type {
5389999SWang.Lin@Sun.COM 	ATH9K_KEY_TYPE_CLEAR,
5399999SWang.Lin@Sun.COM 	ATH9K_KEY_TYPE_WEP,
5409999SWang.Lin@Sun.COM 	ATH9K_KEY_TYPE_AES,
5419999SWang.Lin@Sun.COM 	ATH9K_KEY_TYPE_TKIP,
5429999SWang.Lin@Sun.COM };
5439999SWang.Lin@Sun.COM 
5449999SWang.Lin@Sun.COM enum ath9k_cipher {
5459999SWang.Lin@Sun.COM 	ATH9K_CIPHER_WEP = 0,
5469999SWang.Lin@Sun.COM 	ATH9K_CIPHER_AES_OCB = 1,
5479999SWang.Lin@Sun.COM 	ATH9K_CIPHER_AES_CCM = 2,
5489999SWang.Lin@Sun.COM 	ATH9K_CIPHER_CKIP = 3,
5499999SWang.Lin@Sun.COM 	ATH9K_CIPHER_TKIP = 4,
5509999SWang.Lin@Sun.COM 	ATH9K_CIPHER_CLR = 5,
5519999SWang.Lin@Sun.COM 	ATH9K_CIPHER_MIC = 127
5529999SWang.Lin@Sun.COM };
5539999SWang.Lin@Sun.COM 
5549999SWang.Lin@Sun.COM #define	AR_EEPROM_EEPCAP_COMPRESS_DIS	0x0001
5559999SWang.Lin@Sun.COM #define	AR_EEPROM_EEPCAP_AES_DIS	0x0002
5569999SWang.Lin@Sun.COM #define	AR_EEPROM_EEPCAP_FASTFRAME_DIS	0x0004
5579999SWang.Lin@Sun.COM #define	AR_EEPROM_EEPCAP_BURST_DIS	0x0008
5589999SWang.Lin@Sun.COM #define	AR_EEPROM_EEPCAP_MAXQCU		0x01F0
5599999SWang.Lin@Sun.COM #define	AR_EEPROM_EEPCAP_MAXQCU_S	4
5609999SWang.Lin@Sun.COM #define	AR_EEPROM_EEPCAP_HEAVY_CLIP_EN	0x0200
5619999SWang.Lin@Sun.COM #define	AR_EEPROM_EEPCAP_KC_ENTRIES	0xF000
5629999SWang.Lin@Sun.COM #define	AR_EEPROM_EEPCAP_KC_ENTRIES_S	12
5639999SWang.Lin@Sun.COM 
5649999SWang.Lin@Sun.COM #define	AR_EEPROM_EEREGCAP_EN_FCC_MIDBAND	0x0040
5659999SWang.Lin@Sun.COM #define	AR_EEPROM_EEREGCAP_EN_KK_U1_EVEN	0x0080
5669999SWang.Lin@Sun.COM #define	AR_EEPROM_EEREGCAP_EN_KK_U2		0x0100
5679999SWang.Lin@Sun.COM #define	AR_EEPROM_EEREGCAP_EN_KK_MIDBAND	0x0200
5689999SWang.Lin@Sun.COM #define	AR_EEPROM_EEREGCAP_EN_KK_U1_ODD		0x0400
5699999SWang.Lin@Sun.COM #define	AR_EEPROM_EEREGCAP_EN_KK_NEW_11A	0x0800
5709999SWang.Lin@Sun.COM 
5719999SWang.Lin@Sun.COM #define	AR_EEPROM_EEREGCAP_EN_KK_U1_ODD_PRE4_0 	0x4000
5729999SWang.Lin@Sun.COM #define	AR_EEPROM_EEREGCAP_EN_KK_NEW_11A_PRE4_0	0x8000
5739999SWang.Lin@Sun.COM 
5749999SWang.Lin@Sun.COM #define	SD_NO_CTL	0xE0
5759999SWang.Lin@Sun.COM #define	NO_CTL		0xff
5769999SWang.Lin@Sun.COM #define	CTL_MODE_M	7
5779999SWang.Lin@Sun.COM #define	CTL_11A		0
5789999SWang.Lin@Sun.COM #define	CTL_11B		1
5799999SWang.Lin@Sun.COM #define	CTL_11G		2
5809999SWang.Lin@Sun.COM #define	CTL_2GHT20	5
5819999SWang.Lin@Sun.COM #define	CTL_5GHT20	6
5829999SWang.Lin@Sun.COM #define	CTL_2GHT40	7
5839999SWang.Lin@Sun.COM #define	CTL_5GHT40	8
5849999SWang.Lin@Sun.COM 
5859999SWang.Lin@Sun.COM #define	AR_EEPROM_MAC(i)	(0x1d+(i))
5869999SWang.Lin@Sun.COM 
5879999SWang.Lin@Sun.COM #define	AR_EEPROM_RFSILENT_GPIO_SEL	0x001c
5889999SWang.Lin@Sun.COM #define	AR_EEPROM_RFSILENT_GPIO_SEL_S	2
5899999SWang.Lin@Sun.COM #define	AR_EEPROM_RFSILENT_POLARITY	0x0002
5909999SWang.Lin@Sun.COM #define	AR_EEPROM_RFSILENT_POLARITY_S	1
5919999SWang.Lin@Sun.COM 
5929999SWang.Lin@Sun.COM #define	CTRY_DEBUG	0x1ff
5939999SWang.Lin@Sun.COM #define	CTRY_DEFAULT	0
5949999SWang.Lin@Sun.COM 
5959999SWang.Lin@Sun.COM enum reg_ext_bitmap {
5969999SWang.Lin@Sun.COM 	REG_EXT_JAPAN_MIDBAND = 1,
5979999SWang.Lin@Sun.COM 	REG_EXT_FCC_DFS_HT40 = 2,
5989999SWang.Lin@Sun.COM 	REG_EXT_JAPAN_NONDFS_HT40 = 3,
5999999SWang.Lin@Sun.COM 	REG_EXT_JAPAN_DFS_HT40 = 4
6009999SWang.Lin@Sun.COM };
6019999SWang.Lin@Sun.COM 
6029999SWang.Lin@Sun.COM struct ath9k_country_entry {
6039999SWang.Lin@Sun.COM 	uint16_t countryCode;
6049999SWang.Lin@Sun.COM 	uint16_t regDmnEnum;
6059999SWang.Lin@Sun.COM 	uint16_t regDmn5G;
6069999SWang.Lin@Sun.COM 	uint16_t regDmn2G;
6079999SWang.Lin@Sun.COM 	uint8_t isMultidomain;
6089999SWang.Lin@Sun.COM 	uint8_t iso[3];
6099999SWang.Lin@Sun.COM };
6109999SWang.Lin@Sun.COM 
6119999SWang.Lin@Sun.COM /* Register read/write primitives */
6129999SWang.Lin@Sun.COM #define	REG_WRITE(_ah, _reg, _val)	arn_iowrite32((_ah), (_reg), (_val))
6139999SWang.Lin@Sun.COM #define	REG_READ(_ah, _reg)	arn_ioread32((_ah), (_reg))
6149999SWang.Lin@Sun.COM #define	FLASH_READ(_ah, _reg)					\
6159999SWang.Lin@Sun.COM 	ddi_get16((_ah->ah_sc)->sc_io_handle,			\
6169999SWang.Lin@Sun.COM 	    (uint16_t *)((uintptr_t)(_ah)->ah_sh + (_reg)))
6179999SWang.Lin@Sun.COM 
6189999SWang.Lin@Sun.COM #define	SM(_v, _f)	(((_v) << _f##_S) & _f)
6199999SWang.Lin@Sun.COM #define	MS(_v, _f)	(((_v) & _f) >> _f##_S)
6209999SWang.Lin@Sun.COM #define	REG_RMW(_a, _r, _set, _clr)	\
6219999SWang.Lin@Sun.COM 	REG_WRITE(_a, _r, (REG_READ(_a, _r) & ~(_clr)) | (_set))
6229999SWang.Lin@Sun.COM #define	REG_RMW_FIELD(_a, _r, _f, _v) \
6239999SWang.Lin@Sun.COM 	REG_WRITE(_a, _r, \
6249999SWang.Lin@Sun.COM 	(REG_READ(_a, _r) & ~_f) | (((_v) << _f##_S) & _f))
6259999SWang.Lin@Sun.COM #define	REG_SET_BIT(_a, _r, _f) \
6269999SWang.Lin@Sun.COM 	REG_WRITE(_a, _r, REG_READ(_a, _r) | _f)
6279999SWang.Lin@Sun.COM #define	REG_CLR_BIT(_a, _r, _f) \
6289999SWang.Lin@Sun.COM 	REG_WRITE(_a, _r, REG_READ(_a, _r) & ~_f)
6299999SWang.Lin@Sun.COM 
6309999SWang.Lin@Sun.COM #define	ATH9K_TXQ_USE_LOCKOUT_BKOFF_DIS	0x00000001
6319999SWang.Lin@Sun.COM 
6329999SWang.Lin@Sun.COM #define	INIT_AIFS	2
6339999SWang.Lin@Sun.COM #define	INIT_CWMIN	15
6349999SWang.Lin@Sun.COM #define	INIT_CWMIN_11B	31
6359999SWang.Lin@Sun.COM #define	INIT_CWMAX	1023
6369999SWang.Lin@Sun.COM #define	INIT_SH_RETRY	10
6379999SWang.Lin@Sun.COM #define	INIT_LG_RETRY	10
6389999SWang.Lin@Sun.COM #define	INIT_SSH_RETRY	32
6399999SWang.Lin@Sun.COM #define	INIT_SLG_RETRY	32
6409999SWang.Lin@Sun.COM 
6419999SWang.Lin@Sun.COM #define	WLAN_CTRL_FRAME_SIZE	(2+2+6+4)
6429999SWang.Lin@Sun.COM 
6439999SWang.Lin@Sun.COM #define	ATH_AMPDU_LIMIT_MAX	(64 * 1024 - 1)
6449999SWang.Lin@Sun.COM #define	ATH_AMPDU_LIMIT_DEFAULT	ATH_AMPDU_LIMIT_MAX
6459999SWang.Lin@Sun.COM 
646*11729SWang.Lin@Sun.COM #define	FCS_LEN	4
6479999SWang.Lin@Sun.COM #define	IEEE80211_WEP_IVLEN	3
6489999SWang.Lin@Sun.COM #define	IEEE80211_WEP_KIDLEN	1
6499999SWang.Lin@Sun.COM #define	IEEE80211_WEP_CRCLEN	4
6509999SWang.Lin@Sun.COM #define	IEEE80211_MAX_MPDU_LEN	(3840 + FCS_LEN +	\
6519999SWang.Lin@Sun.COM 	(IEEE80211_WEP_IVLEN +	\
6529999SWang.Lin@Sun.COM 	IEEE80211_WEP_KIDLEN +	\
6539999SWang.Lin@Sun.COM 	IEEE80211_WEP_CRCLEN))
6549999SWang.Lin@Sun.COM #define	MAX_RATE_POWER	63
6559999SWang.Lin@Sun.COM 
6569999SWang.Lin@Sun.COM enum ath9k_power_mode {
6579999SWang.Lin@Sun.COM 	ATH9K_PM_AWAKE = 0,
6589999SWang.Lin@Sun.COM 	ATH9K_PM_FULL_SLEEP,
6599999SWang.Lin@Sun.COM 	ATH9K_PM_NETWORK_SLEEP,
6609999SWang.Lin@Sun.COM 	ATH9K_PM_UNDEFINED
6619999SWang.Lin@Sun.COM };
6629999SWang.Lin@Sun.COM 
6639999SWang.Lin@Sun.COM struct ath9k_mib_stats {
6649999SWang.Lin@Sun.COM 	uint32_t ackrcv_bad;
6659999SWang.Lin@Sun.COM 	uint32_t rts_bad;
6669999SWang.Lin@Sun.COM 	uint32_t rts_good;
6679999SWang.Lin@Sun.COM 	uint32_t fcs_bad;
6689999SWang.Lin@Sun.COM 	uint32_t beacons;
6699999SWang.Lin@Sun.COM };
6709999SWang.Lin@Sun.COM 
6719999SWang.Lin@Sun.COM enum ath9k_ant_setting {
6729999SWang.Lin@Sun.COM 	ATH9K_ANT_VARIABLE = 0,
6739999SWang.Lin@Sun.COM 	ATH9K_ANT_FIXED_A,
6749999SWang.Lin@Sun.COM 	ATH9K_ANT_FIXED_B
6759999SWang.Lin@Sun.COM };
6769999SWang.Lin@Sun.COM 
6779999SWang.Lin@Sun.COM 
6789999SWang.Lin@Sun.COM enum ath9k_opmode {
6799999SWang.Lin@Sun.COM 	ATH9K_M_STA = 1,
6809999SWang.Lin@Sun.COM 	ATH9K_M_IBSS = 0,
6819999SWang.Lin@Sun.COM 	ATH9K_M_HOSTAP = 6,
6829999SWang.Lin@Sun.COM 	ATH9K_M_MONITOR = 8
6839999SWang.Lin@Sun.COM };
6849999SWang.Lin@Sun.COM 
6859999SWang.Lin@Sun.COM 
6869999SWang.Lin@Sun.COM #define	ATH9K_SLOT_TIME_6	6
6879999SWang.Lin@Sun.COM #define	ATH9K_SLOT_TIME_9	9
6889999SWang.Lin@Sun.COM #define	ATH9K_SLOT_TIME_20	20
6899999SWang.Lin@Sun.COM 
6909999SWang.Lin@Sun.COM enum ath9k_ht_macmode {
6919999SWang.Lin@Sun.COM 	ATH9K_HT_MACMODE_20 = 0,
6929999SWang.Lin@Sun.COM 	ATH9K_HT_MACMODE_2040 = 1,
6939999SWang.Lin@Sun.COM };
6949999SWang.Lin@Sun.COM 
6959999SWang.Lin@Sun.COM enum ath9k_ht_extprotspacing {
6969999SWang.Lin@Sun.COM 	ATH9K_HT_EXTPROTSPACING_20 = 0,
6979999SWang.Lin@Sun.COM 	ATH9K_HT_EXTPROTSPACING_25 = 1,
6989999SWang.Lin@Sun.COM };
6999999SWang.Lin@Sun.COM 
7009999SWang.Lin@Sun.COM struct ath9k_ht_cwm {
7019999SWang.Lin@Sun.COM 	enum ath9k_ht_macmode ht_macmode;
7029999SWang.Lin@Sun.COM 	enum ath9k_ht_extprotspacing ht_extprotspacing;
7039999SWang.Lin@Sun.COM };
7049999SWang.Lin@Sun.COM 
7059999SWang.Lin@Sun.COM enum ath9k_ani_cmd {
7069999SWang.Lin@Sun.COM 	ATH9K_ANI_PRESENT = 0x1,
7079999SWang.Lin@Sun.COM 	ATH9K_ANI_NOISE_IMMUNITY_LEVEL = 0x2,
7089999SWang.Lin@Sun.COM 	ATH9K_ANI_OFDM_WEAK_SIGNAL_DETECTION = 0x4,
7099999SWang.Lin@Sun.COM 	ATH9K_ANI_CCK_WEAK_SIGNAL_THR = 0x8,
7109999SWang.Lin@Sun.COM 	ATH9K_ANI_FIRSTEP_LEVEL = 0x10,
7119999SWang.Lin@Sun.COM 	ATH9K_ANI_SPUR_IMMUNITY_LEVEL = 0x20,
7129999SWang.Lin@Sun.COM 	ATH9K_ANI_MODE = 0x40,
7139999SWang.Lin@Sun.COM 	ATH9K_ANI_PHYERR_RESET = 0x80,
7149999SWang.Lin@Sun.COM 	ATH9K_ANI_ALL = 0xff
7159999SWang.Lin@Sun.COM };
7169999SWang.Lin@Sun.COM 
7179999SWang.Lin@Sun.COM enum ath9k_tp_scale {
7189999SWang.Lin@Sun.COM 	ATH9K_TP_SCALE_MAX = 0,
7199999SWang.Lin@Sun.COM 	ATH9K_TP_SCALE_50,
7209999SWang.Lin@Sun.COM 	ATH9K_TP_SCALE_25,
7219999SWang.Lin@Sun.COM 	ATH9K_TP_SCALE_12,
7229999SWang.Lin@Sun.COM 	ATH9K_TP_SCALE_MIN
7239999SWang.Lin@Sun.COM };
7249999SWang.Lin@Sun.COM 
7259999SWang.Lin@Sun.COM enum ser_reg_mode {
7269999SWang.Lin@Sun.COM 	SER_REG_MODE_OFF = 0,
7279999SWang.Lin@Sun.COM 	SER_REG_MODE_ON = 1,
7289999SWang.Lin@Sun.COM 	SER_REG_MODE_AUTO = 2,
7299999SWang.Lin@Sun.COM };
7309999SWang.Lin@Sun.COM 
7319999SWang.Lin@Sun.COM #define	AR_PHY_CCA_MAX_GOOD_VALUE		-85
7329999SWang.Lin@Sun.COM #define	AR_PHY_CCA_MAX_HIGH_VALUE		-62
7339999SWang.Lin@Sun.COM #define	AR_PHY_CCA_MIN_BAD_VALUE		-121
7349999SWang.Lin@Sun.COM #define	AR_PHY_CCA_FILTERWINDOW_LENGTH_INIT	3
7359999SWang.Lin@Sun.COM #define	AR_PHY_CCA_FILTERWINDOW_LENGTH		5
7369999SWang.Lin@Sun.COM 
7379999SWang.Lin@Sun.COM #define	ATH9K_NF_CAL_HIST_MAX		5
7389999SWang.Lin@Sun.COM #define	NUM_NF_READINGS			6
7399999SWang.Lin@Sun.COM 
7409999SWang.Lin@Sun.COM struct ath9k_nfcal_hist {
7419999SWang.Lin@Sun.COM 	int16_t nfCalBuffer[ATH9K_NF_CAL_HIST_MAX];
7429999SWang.Lin@Sun.COM 	uint8_t currIndex;
7439999SWang.Lin@Sun.COM 	int16_t privNF;
7449999SWang.Lin@Sun.COM 	uint8_t invalidNFcount;
7459999SWang.Lin@Sun.COM };
7469999SWang.Lin@Sun.COM 
7479999SWang.Lin@Sun.COM struct ath9k_beacon_state {
7489999SWang.Lin@Sun.COM 	uint32_t bs_nexttbtt;
7499999SWang.Lin@Sun.COM 	uint32_t bs_nextdtim;
7509999SWang.Lin@Sun.COM 	uint32_t bs_intval;
7519999SWang.Lin@Sun.COM #define	ATH9K_BEACON_PERIOD	0x0000ffff
7529999SWang.Lin@Sun.COM #define	ATH9K_BEACON_ENA	0x00800000
7539999SWang.Lin@Sun.COM #define	ATH9K_BEACON_RESET_TSF	0x01000000
75411377SWang.Lin@Sun.COM #define	ATH9K_TSFOOR_THRESHOLD	0x00004240 /* 16k us */
7559999SWang.Lin@Sun.COM 	uint32_t bs_dtimperiod;
7569999SWang.Lin@Sun.COM 	uint16_t bs_cfpperiod;
7579999SWang.Lin@Sun.COM 	uint16_t bs_cfpmaxduration;
7589999SWang.Lin@Sun.COM 	uint32_t bs_cfpnext;
7599999SWang.Lin@Sun.COM 	uint16_t bs_timoffset;
7609999SWang.Lin@Sun.COM 	uint16_t bs_bmissthreshold;
7619999SWang.Lin@Sun.COM 	uint32_t bs_sleepduration;
76211377SWang.Lin@Sun.COM 	uint32_t bs_tsfoor_threshold;
7639999SWang.Lin@Sun.COM };
7649999SWang.Lin@Sun.COM 
7659999SWang.Lin@Sun.COM struct ath9k_node_stats {
7669999SWang.Lin@Sun.COM 	uint32_t ns_avgbrssi;
7679999SWang.Lin@Sun.COM 	uint32_t ns_avgrssi;
7689999SWang.Lin@Sun.COM 	uint32_t ns_avgtxrssi;
7699999SWang.Lin@Sun.COM 	uint32_t ns_avgtxrate;
7709999SWang.Lin@Sun.COM };
7719999SWang.Lin@Sun.COM 
7729999SWang.Lin@Sun.COM #define	ATH9K_RSSI_EP_MULTIPLIER			(1<<7)
7739999SWang.Lin@Sun.COM 
7749999SWang.Lin@Sun.COM #define	AR_GPIO_OUTPUT_MUX_AS_OUTPUT			0
7759999SWang.Lin@Sun.COM #define	AR_GPIO_OUTPUT_MUX_AS_PCIE_ATTENTION_LED	1
7769999SWang.Lin@Sun.COM #define	AR_GPIO_OUTPUT_MUX_AS_PCIE_POWER_LED		2
7779999SWang.Lin@Sun.COM #define	AR_GPIO_OUTPUT_MUX_AS_MAC_NETWORK_LED		5
7789999SWang.Lin@Sun.COM #define	AR_GPIO_OUTPUT_MUX_AS_MAC_POWER_LED		6
7799999SWang.Lin@Sun.COM 
7809999SWang.Lin@Sun.COM enum {
7819999SWang.Lin@Sun.COM 	ATH9K_RESET_POWER_ON,
7829999SWang.Lin@Sun.COM 	ATH9K_RESET_WARM,
7839999SWang.Lin@Sun.COM 	ATH9K_RESET_COLD,
7849999SWang.Lin@Sun.COM };
7859999SWang.Lin@Sun.COM 
7869999SWang.Lin@Sun.COM #define	AH_USE_EEPROM	0x1
7879999SWang.Lin@Sun.COM 
7889999SWang.Lin@Sun.COM struct ath_hal {
7899999SWang.Lin@Sun.COM 	uint32_t ah_magic;
7909999SWang.Lin@Sun.COM 	uint16_t ah_devid;
7919999SWang.Lin@Sun.COM 	uint16_t ah_subvendorid;
7929999SWang.Lin@Sun.COM 	uint32_t ah_macVersion;
7939999SWang.Lin@Sun.COM 	uint16_t ah_macRev;
7949999SWang.Lin@Sun.COM 	uint16_t ah_phyRev;
7959999SWang.Lin@Sun.COM 	uint16_t ah_analog5GhzRev;
7969999SWang.Lin@Sun.COM 	uint16_t ah_analog2GhzRev;
7979999SWang.Lin@Sun.COM 
7989999SWang.Lin@Sun.COM 	caddr_t	 ah_sh;
7999999SWang.Lin@Sun.COM 	struct arn_softc *ah_sc;
8009999SWang.Lin@Sun.COM 	enum ath9k_opmode ah_opmode;
8019999SWang.Lin@Sun.COM 	struct ath9k_ops_config ah_config;
8029999SWang.Lin@Sun.COM 	struct ath9k_hw_capabilities ah_caps;
8039999SWang.Lin@Sun.COM 
8049999SWang.Lin@Sun.COM 	uint16_t ah_countryCode;
8059999SWang.Lin@Sun.COM 	uint32_t ah_flags;
8069999SWang.Lin@Sun.COM 	int16_t ah_powerLimit;
8079999SWang.Lin@Sun.COM 	uint16_t ah_maxPowerLevel;
8089999SWang.Lin@Sun.COM 	uint32_t ah_tpScale;
8099999SWang.Lin@Sun.COM 	uint16_t ah_currentRD;
8109999SWang.Lin@Sun.COM 	uint16_t ah_currentRDExt;
8119999SWang.Lin@Sun.COM 	uint16_t ah_currentRDInUse;
8129999SWang.Lin@Sun.COM 	uint16_t ah_currentRD5G;
8139999SWang.Lin@Sun.COM 	uint16_t ah_currentRD2G;
8149999SWang.Lin@Sun.COM 	char ah_iso[4];
8159999SWang.Lin@Sun.COM 
8169999SWang.Lin@Sun.COM 	struct ath9k_channel ah_channels[150];
8179999SWang.Lin@Sun.COM 	struct ath9k_channel *ah_curchan;
8189999SWang.Lin@Sun.COM 	uint32_t ah_nchan;
8199999SWang.Lin@Sun.COM 
8209999SWang.Lin@Sun.COM 	boolean_t ah_isPciExpress;
8219999SWang.Lin@Sun.COM 	uint16_t ah_txTrigLevel;
8229999SWang.Lin@Sun.COM 	uint16_t ah_rfsilent;
8239999SWang.Lin@Sun.COM 	uint32_t ah_rfkill_gpio;
8249999SWang.Lin@Sun.COM 	uint32_t ah_rfkill_polarity;
8259999SWang.Lin@Sun.COM 
8269999SWang.Lin@Sun.COM 	struct ath9k_nfcal_hist nfCalHist[NUM_NF_READINGS];
8279999SWang.Lin@Sun.COM };
8289999SWang.Lin@Sun.COM 
8299999SWang.Lin@Sun.COM struct chan_centers {
8309999SWang.Lin@Sun.COM 	uint16_t synth_center;
8319999SWang.Lin@Sun.COM 	uint16_t ctl_center;
8329999SWang.Lin@Sun.COM 	uint16_t ext_center;
8339999SWang.Lin@Sun.COM };
8349999SWang.Lin@Sun.COM 
8359999SWang.Lin@Sun.COM struct ath_rate_table;
8369999SWang.Lin@Sun.COM 
8379999SWang.Lin@Sun.COM /* Helpers */
8389999SWang.Lin@Sun.COM 
8399999SWang.Lin@Sun.COM enum wireless_mode ath9k_hw_chan2wmode(struct ath_hal *ah,
8409999SWang.Lin@Sun.COM     const struct ath9k_channel *chan);
8419999SWang.Lin@Sun.COM boolean_t ath9k_hw_wait(struct ath_hal *ah, uint32_t reg, uint32_t mask,
8429999SWang.Lin@Sun.COM     uint32_t val);
8439999SWang.Lin@Sun.COM uint32_t ath9k_hw_reverse_bits(uint32_t val, uint32_t n);
8449999SWang.Lin@Sun.COM boolean_t ath9k_get_channel_edges(struct ath_hal *ah,
8459999SWang.Lin@Sun.COM     uint16_t flags, uint16_t *low, uint16_t *high);
8469999SWang.Lin@Sun.COM uint16_t ath9k_hw_computetxtime(struct ath_hal *ah,
8479999SWang.Lin@Sun.COM     struct ath_rate_table *rates,
8489999SWang.Lin@Sun.COM     uint32_t frameLen, uint16_t rateix,
8499999SWang.Lin@Sun.COM     boolean_t shortPreamble);
8509999SWang.Lin@Sun.COM uint32_t ath9k_hw_mhz2ieee(struct ath_hal *ah, uint32_t freq, uint32_t flags);
8519999SWang.Lin@Sun.COM void ath9k_hw_get_channel_centers(struct ath_hal *ah,
8529999SWang.Lin@Sun.COM     struct ath9k_channel *chan,
8539999SWang.Lin@Sun.COM     struct chan_centers *centers);
8549999SWang.Lin@Sun.COM 
8559999SWang.Lin@Sun.COM /* Attach, Detach */
8569999SWang.Lin@Sun.COM 
8579999SWang.Lin@Sun.COM const char *ath9k_hw_probe(uint16_t vendorid, uint16_t devid);
8589999SWang.Lin@Sun.COM void ath9k_hw_detach(struct ath_hal *ah);
8599999SWang.Lin@Sun.COM struct ath_hal *ath9k_hw_attach(uint16_t devid, struct arn_softc *sc,
8609999SWang.Lin@Sun.COM     caddr_t mem, int *error);
8619999SWang.Lin@Sun.COM void ath9k_hw_rfdetach(struct ath_hal *ah);
8629999SWang.Lin@Sun.COM 
8639999SWang.Lin@Sun.COM 
8649999SWang.Lin@Sun.COM /* HW Reset */
8659999SWang.Lin@Sun.COM 
8669999SWang.Lin@Sun.COM boolean_t ath9k_hw_reset(struct ath_hal *ah, struct ath9k_channel *chan,
8679999SWang.Lin@Sun.COM     enum ath9k_ht_macmode macmode,
8689999SWang.Lin@Sun.COM     uint8_t txchainmask, uint8_t rxchainmask,
8699999SWang.Lin@Sun.COM     enum ath9k_ht_extprotspacing extprotspacing,
8709999SWang.Lin@Sun.COM     boolean_t bChannelChange, int *status);
8719999SWang.Lin@Sun.COM 
8729999SWang.Lin@Sun.COM /* Key Cache Management */
8739999SWang.Lin@Sun.COM 
8749999SWang.Lin@Sun.COM boolean_t ath9k_hw_keyreset(struct ath_hal *ah, uint16_t entry);
8759999SWang.Lin@Sun.COM boolean_t ath9k_hw_keysetmac(struct ath_hal *ah, uint16_t entry,
8769999SWang.Lin@Sun.COM     const uint8_t *mac);
8779999SWang.Lin@Sun.COM boolean_t ath9k_hw_set_keycache_entry(struct ath_hal *ah, uint16_t entry,
8789999SWang.Lin@Sun.COM     const struct ath9k_keyval *k, const uint8_t *mac, int xorKey);
8799999SWang.Lin@Sun.COM boolean_t ath9k_hw_keyisvalid(struct ath_hal *ah, uint16_t entry);
8809999SWang.Lin@Sun.COM 
8819999SWang.Lin@Sun.COM /* Power Management */
8829999SWang.Lin@Sun.COM 
8839999SWang.Lin@Sun.COM boolean_t ath9k_hw_setpower(struct ath_hal *ah,
8849999SWang.Lin@Sun.COM     enum ath9k_power_mode mode);
8859999SWang.Lin@Sun.COM void ath9k_hw_configpcipowersave(struct ath_hal *ah, int restore);
8869999SWang.Lin@Sun.COM 
8879999SWang.Lin@Sun.COM /* Beacon timers */
8889999SWang.Lin@Sun.COM 
8899999SWang.Lin@Sun.COM void ath9k_hw_beaconinit(struct ath_hal *ah, uint32_t next_beacon,
8909999SWang.Lin@Sun.COM     uint32_t beacon_period);
8919999SWang.Lin@Sun.COM void ath9k_hw_set_sta_beacon_timers(struct ath_hal *ah,
8929999SWang.Lin@Sun.COM     const struct ath9k_beacon_state *bs);
8939999SWang.Lin@Sun.COM /* HW Capabilities */
8949999SWang.Lin@Sun.COM 
8959999SWang.Lin@Sun.COM boolean_t ath9k_hw_fill_cap_info(struct ath_hal *ah);
8969999SWang.Lin@Sun.COM boolean_t ath9k_hw_getcapability(struct ath_hal *ah,
8979999SWang.Lin@Sun.COM     enum ath9k_capability_type type,
8989999SWang.Lin@Sun.COM     uint32_t capability, uint32_t *result);
8999999SWang.Lin@Sun.COM boolean_t ath9k_hw_setcapability(struct ath_hal *ah,
9009999SWang.Lin@Sun.COM     enum ath9k_capability_type type,
9019999SWang.Lin@Sun.COM     uint32_t capability, uint32_t setting,
9029999SWang.Lin@Sun.COM     int *status);
9039999SWang.Lin@Sun.COM 
9049999SWang.Lin@Sun.COM /* GPIO / RFKILL / Antennae */
9059999SWang.Lin@Sun.COM 
9069999SWang.Lin@Sun.COM void ath9k_hw_cfg_gpio_input(struct ath_hal *ah, uint32_t gpio);
9079999SWang.Lin@Sun.COM uint32_t ath9k_hw_gpio_get(struct ath_hal *ah, uint32_t gpio);
9089999SWang.Lin@Sun.COM void ath9k_hw_cfg_output(struct ath_hal *ah, uint32_t gpio,
9099999SWang.Lin@Sun.COM     uint32_t ah_signal_type);
9109999SWang.Lin@Sun.COM void ath9k_hw_set_gpio(struct ath_hal *ah, uint32_t gpio, uint32_t val);
9119999SWang.Lin@Sun.COM #if defined(CONFIG_RFKILL) || defined(CONFIG_RFKILL_MODULE)
9129999SWang.Lin@Sun.COM void ath9k_enable_rfkill(struct ath_hal *ah);
9139999SWang.Lin@Sun.COM #endif
9149999SWang.Lin@Sun.COM int ath9k_hw_select_antconfig(struct ath_hal *ah, uint32_t cfg);
9159999SWang.Lin@Sun.COM uint32_t ath9k_hw_getdefantenna(struct ath_hal *ah);
9169999SWang.Lin@Sun.COM void ath9k_hw_setantenna(struct ath_hal *ah, uint32_t antenna);
9179999SWang.Lin@Sun.COM boolean_t ath9k_hw_setantennaswitch(struct ath_hal *ah,
9189999SWang.Lin@Sun.COM     enum ath9k_ant_setting settings,
9199999SWang.Lin@Sun.COM     struct ath9k_channel *chan,
9209999SWang.Lin@Sun.COM     uint8_t *tx_chainmask,
9219999SWang.Lin@Sun.COM     uint8_t *rx_chainmask,
9229999SWang.Lin@Sun.COM     uint8_t *antenna_cfgd);
9239999SWang.Lin@Sun.COM 
9249999SWang.Lin@Sun.COM /* General Operation */
9259999SWang.Lin@Sun.COM 
9269999SWang.Lin@Sun.COM uint32_t ath9k_hw_getrxfilter(struct ath_hal *ah);
9279999SWang.Lin@Sun.COM void ath9k_hw_setrxfilter(struct ath_hal *ah, uint32_t bits);
9289999SWang.Lin@Sun.COM boolean_t ath9k_hw_phy_disable(struct ath_hal *ah);
9299999SWang.Lin@Sun.COM boolean_t ath9k_hw_disable(struct ath_hal *ah);
9309999SWang.Lin@Sun.COM boolean_t ath9k_hw_set_txpowerlimit(struct ath_hal *ah, uint32_t limit);
9319999SWang.Lin@Sun.COM void ath9k_hw_getmac(struct ath_hal *ah, uint8_t *mac);
9329999SWang.Lin@Sun.COM boolean_t ath9k_hw_setmac(struct ath_hal *ah, const uint8_t *mac);
9339999SWang.Lin@Sun.COM void ath9k_hw_setopmode(struct ath_hal *ah);
9349999SWang.Lin@Sun.COM void ath9k_hw_setmcastfilter(struct ath_hal *ah, uint32_t filter0,
9359999SWang.Lin@Sun.COM     uint32_t filter1);
9369999SWang.Lin@Sun.COM void ath9k_hw_getbssidmask(struct ath_hal *ah, uint8_t *mask);
9379999SWang.Lin@Sun.COM boolean_t ath9k_hw_setbssidmask(struct ath_hal *ah, const uint8_t *mask);
9389999SWang.Lin@Sun.COM void ath9k_hw_write_associd(struct ath_hal *ah, const uint8_t *bssid,
9399999SWang.Lin@Sun.COM     uint16_t assocId);
9409999SWang.Lin@Sun.COM uint64_t ath9k_hw_gettsf64(struct ath_hal *ah);
9419999SWang.Lin@Sun.COM void ath9k_hw_reset_tsf(struct ath_hal *ah);
9429999SWang.Lin@Sun.COM boolean_t ath9k_hw_set_tsfadjust(struct ath_hal *ah, uint32_t setting);
9439999SWang.Lin@Sun.COM boolean_t ath9k_hw_setslottime(struct ath_hal *ah, uint32_t us);
9449999SWang.Lin@Sun.COM void ath9k_hw_set11nmac2040(struct ath_hal *ah, enum ath9k_ht_macmode mode);
9459999SWang.Lin@Sun.COM 
9469999SWang.Lin@Sun.COM /* Regulatory */
9479999SWang.Lin@Sun.COM 
9489999SWang.Lin@Sun.COM boolean_t ath9k_regd_is_public_safety_sku(struct ath_hal *ah);
9499999SWang.Lin@Sun.COM struct ath9k_channel *ath9k_regd_check_channel(struct ath_hal *ah,
9509999SWang.Lin@Sun.COM     const struct ath9k_channel *c);
9519999SWang.Lin@Sun.COM uint32_t ath9k_regd_get_ctl(struct ath_hal *ah, struct ath9k_channel *chan);
9529999SWang.Lin@Sun.COM uint32_t ath9k_regd_get_antenna_allowed(struct ath_hal *ah,
9539999SWang.Lin@Sun.COM     struct ath9k_channel *chan);
9549999SWang.Lin@Sun.COM boolean_t ath9k_regd_init_channels(struct ath_hal *ah,
9559999SWang.Lin@Sun.COM     uint32_t maxchans, uint32_t *nchans, uint8_t *regclassids,
9569999SWang.Lin@Sun.COM     uint32_t maxregids, uint32_t *nregids, uint16_t cc,
9579999SWang.Lin@Sun.COM     boolean_t enableOutdoor, boolean_t enableExtendedChannels);
9589999SWang.Lin@Sun.COM 
9599999SWang.Lin@Sun.COM /* ANI */
9609999SWang.Lin@Sun.COM 
9619999SWang.Lin@Sun.COM void ath9k_ani_reset(struct ath_hal *ah);
9629999SWang.Lin@Sun.COM void ath9k_hw_ani_monitor(struct ath_hal *ah,
9639999SWang.Lin@Sun.COM     const struct ath9k_node_stats *stats,
9649999SWang.Lin@Sun.COM     struct ath9k_channel *chan);
9659999SWang.Lin@Sun.COM boolean_t ath9k_hw_phycounters(struct ath_hal *ah);
9669999SWang.Lin@Sun.COM void ath9k_enable_mib_counters(struct ath_hal *ah);
9679999SWang.Lin@Sun.COM void ath9k_hw_disable_mib_counters(struct ath_hal *ah);
9689999SWang.Lin@Sun.COM uint32_t ath9k_hw_GetMibCycleCountsPct(struct ath_hal *ah,
9699999SWang.Lin@Sun.COM     uint32_t *rxc_pcnt,
9709999SWang.Lin@Sun.COM     uint32_t *rxf_pcnt,
9719999SWang.Lin@Sun.COM     uint32_t *txf_pcnt);
9729999SWang.Lin@Sun.COM void ath9k_hw_procmibevent(struct ath_hal *ah,
9739999SWang.Lin@Sun.COM     const struct ath9k_node_stats *stats);
9749999SWang.Lin@Sun.COM void ath9k_hw_ani_setup(struct ath_hal *ah);
9759999SWang.Lin@Sun.COM void ath9k_hw_ani_attach(struct ath_hal *ah);
9769999SWang.Lin@Sun.COM void ath9k_hw_ani_detach(struct ath_hal *ah);
9779999SWang.Lin@Sun.COM 
9789999SWang.Lin@Sun.COM /* Calibration */
9799999SWang.Lin@Sun.COM 
9809999SWang.Lin@Sun.COM void ath9k_hw_reset_calvalid(struct ath_hal *ah, struct ath9k_channel *chan,
9819999SWang.Lin@Sun.COM     boolean_t *isCalDone);
9829999SWang.Lin@Sun.COM void ath9k_hw_start_nfcal(struct ath_hal *ah);
9839999SWang.Lin@Sun.COM void ath9k_hw_loadnf(struct ath_hal *ah, struct ath9k_channel *chan);
9849999SWang.Lin@Sun.COM int16_t ath9k_hw_getnf(struct ath_hal *ah, struct ath9k_channel *chan);
9859999SWang.Lin@Sun.COM void ath9k_init_nfcal_hist_buffer(struct ath_hal *ah);
9869999SWang.Lin@Sun.COM signed short ath9k_hw_getchan_noise(struct ath_hal *ah,
9879999SWang.Lin@Sun.COM     struct ath9k_channel *chan);
9889999SWang.Lin@Sun.COM boolean_t ath9k_hw_calibrate(struct ath_hal *ah, struct ath9k_channel *chan,
9899999SWang.Lin@Sun.COM     uint8_t rxchainmask, boolean_t longcal, boolean_t *isCalDone);
9909999SWang.Lin@Sun.COM boolean_t ath9k_hw_init_cal(struct ath_hal *ah,
9919999SWang.Lin@Sun.COM     struct ath9k_channel *chan);
9929999SWang.Lin@Sun.COM 
9939999SWang.Lin@Sun.COM 
9949999SWang.Lin@Sun.COM /* EEPROM */
9959999SWang.Lin@Sun.COM 
9969999SWang.Lin@Sun.COM int ath9k_hw_set_txpower(struct ath_hal *ah,
9979999SWang.Lin@Sun.COM     struct ath9k_channel *chan,
9989999SWang.Lin@Sun.COM     uint16_t cfgCtl,
9999999SWang.Lin@Sun.COM     uint8_t twiceAntennaReduction,
10009999SWang.Lin@Sun.COM     uint8_t twiceMaxRegulatoryPower,
10019999SWang.Lin@Sun.COM     uint8_t powerLimit);
10029999SWang.Lin@Sun.COM void ath9k_hw_set_addac(struct ath_hal *ah, struct ath9k_channel *chan);
10039999SWang.Lin@Sun.COM boolean_t ath9k_hw_set_power_per_rate_table(struct ath_hal *ah,
10049999SWang.Lin@Sun.COM     struct ath9k_channel *chan,
10059999SWang.Lin@Sun.COM     int16_t *ratesArray,
10069999SWang.Lin@Sun.COM     uint16_t cfgCtl,
10079999SWang.Lin@Sun.COM     uint8_t AntennaReduction,
10089999SWang.Lin@Sun.COM     uint8_t twiceMaxRegulatoryPower,
10099999SWang.Lin@Sun.COM     uint8_t powerLimit);
10109999SWang.Lin@Sun.COM boolean_t ath9k_hw_set_power_cal_table(struct ath_hal *ah,
10119999SWang.Lin@Sun.COM     struct ath9k_channel *chan, int16_t *pTxPowerIndexOffset);
10129999SWang.Lin@Sun.COM boolean_t ath9k_hw_eeprom_set_board_values(struct ath_hal *ah,
10139999SWang.Lin@Sun.COM     struct ath9k_channel *chan);
10149999SWang.Lin@Sun.COM int ath9k_hw_get_eeprom_antenna_cfg(struct ath_hal *ah,
10159999SWang.Lin@Sun.COM     struct ath9k_channel *chan, uint8_t index, uint16_t *config);
10169999SWang.Lin@Sun.COM 
10179999SWang.Lin@Sun.COM uint8_t ath9k_hw_get_num_ant_config(struct ath_hal *ah,
10189999SWang.Lin@Sun.COM     enum ath9k_band freq_band);
10199999SWang.Lin@Sun.COM 
10209999SWang.Lin@Sun.COM uint16_t ath9k_hw_eeprom_get_spur_chan(struct ath_hal *ah, uint16_t i,
10219999SWang.Lin@Sun.COM     boolean_t is2GHz);
10229999SWang.Lin@Sun.COM int ath9k_hw_eeprom_attach(struct ath_hal *ah);
10239999SWang.Lin@Sun.COM 
10249999SWang.Lin@Sun.COM /* Interrupt Handling */
10259999SWang.Lin@Sun.COM 
10269999SWang.Lin@Sun.COM boolean_t ath9k_hw_intrpend(struct ath_hal *ah);
10279999SWang.Lin@Sun.COM boolean_t ath9k_hw_getisr(struct ath_hal *ah, enum ath9k_int *masked);
10289999SWang.Lin@Sun.COM enum ath9k_int ath9k_hw_intrget(struct ath_hal *ah);
10299999SWang.Lin@Sun.COM enum ath9k_int ath9k_hw_set_interrupts(struct ath_hal *ah, enum ath9k_int ints);
10309999SWang.Lin@Sun.COM 
10319999SWang.Lin@Sun.COM /* MAC (PCU/QCU) */
10329999SWang.Lin@Sun.COM 
10339999SWang.Lin@Sun.COM void ath9k_hw_dmaRegDump(struct ath_hal *ah);
10349999SWang.Lin@Sun.COM uint32_t ath9k_hw_gettxbuf(struct ath_hal *ah, uint32_t q);
10359999SWang.Lin@Sun.COM boolean_t ath9k_hw_puttxbuf(struct ath_hal *ah, uint32_t q, uint32_t txdp);
10369999SWang.Lin@Sun.COM boolean_t ath9k_hw_txstart(struct ath_hal *ah, uint32_t q);
10379999SWang.Lin@Sun.COM uint32_t ath9k_hw_numtxpending(struct ath_hal *ah, uint32_t q);
10389999SWang.Lin@Sun.COM boolean_t ath9k_hw_updatetxtriglevel(struct ath_hal *ah,
10399999SWang.Lin@Sun.COM     boolean_t bIncTrigLevel);
10409999SWang.Lin@Sun.COM boolean_t ath9k_hw_stoptxdma(struct ath_hal *ah, uint32_t q);
10419999SWang.Lin@Sun.COM boolean_t ath9k_hw_filltxdesc(struct ath_hal *ah, struct ath_desc *ds,
10429999SWang.Lin@Sun.COM     uint32_t segLen, boolean_t firstSeg,
10439999SWang.Lin@Sun.COM     boolean_t lastSeg, const struct ath_desc *ds0);
10449999SWang.Lin@Sun.COM void ath9k_hw_cleartxdesc(struct ath_hal *ah, struct ath_desc *ds);
10459999SWang.Lin@Sun.COM int ath9k_hw_txprocdesc(struct ath_hal *ah, struct ath_desc *ds);
10469999SWang.Lin@Sun.COM void ath9k_hw_set11n_txdesc(struct ath_hal *ah, struct ath_desc *ds,
10479999SWang.Lin@Sun.COM     uint32_t pktLen, enum ath9k_pkt_type type, uint32_t txPower,
10489999SWang.Lin@Sun.COM     uint32_t keyIx, enum ath9k_key_type keyType, uint32_t flags);
10499999SWang.Lin@Sun.COM void ath9k_hw_set11n_ratescenario(struct ath_hal *ah, struct ath_desc *ds,
10509999SWang.Lin@Sun.COM     struct ath_desc *lastds,
10519999SWang.Lin@Sun.COM     uint32_t durUpdateEn, uint32_t rtsctsRate,
10529999SWang.Lin@Sun.COM     uint32_t rtsctsDuration,
10539999SWang.Lin@Sun.COM     struct ath9k_11n_rate_series series[],
10549999SWang.Lin@Sun.COM     uint32_t nseries, uint32_t flags);
10559999SWang.Lin@Sun.COM void ath9k_hw_set11n_aggr_first(struct ath_hal *ah, struct ath_desc *ds,
10569999SWang.Lin@Sun.COM     uint32_t aggrLen);
10579999SWang.Lin@Sun.COM void ath9k_hw_set11n_aggr_middle(struct ath_hal *ah, struct ath_desc *ds,
10589999SWang.Lin@Sun.COM     uint32_t numDelims);
10599999SWang.Lin@Sun.COM void ath9k_hw_set11n_aggr_last(struct ath_hal *ah, struct ath_desc *ds);
10609999SWang.Lin@Sun.COM void ath9k_hw_clr11n_aggr(struct ath_hal *ah, struct ath_desc *ds);
10619999SWang.Lin@Sun.COM void ath9k_hw_set11n_burstduration(struct ath_hal *ah, struct ath_desc *ds,
10629999SWang.Lin@Sun.COM     uint32_t burstDuration);
10639999SWang.Lin@Sun.COM void ath9k_hw_set11n_virtualmorefrag(struct ath_hal *ah, struct ath_desc *ds,
10649999SWang.Lin@Sun.COM     uint32_t vmf);
10659999SWang.Lin@Sun.COM void ath9k_hw_gettxintrtxqs(struct ath_hal *ah, uint32_t *txqs);
10669999SWang.Lin@Sun.COM boolean_t ath9k_hw_set_txq_props(struct ath_hal *ah, int q,
10679999SWang.Lin@Sun.COM     const struct ath9k_tx_queue_info *qinfo);
10689999SWang.Lin@Sun.COM boolean_t ath9k_hw_get_txq_props(struct ath_hal *ah, int q,
10699999SWang.Lin@Sun.COM     struct ath9k_tx_queue_info *qinfo);
10709999SWang.Lin@Sun.COM int ath9k_hw_setuptxqueue(struct ath_hal *ah, enum ath9k_tx_queue type,
10719999SWang.Lin@Sun.COM     const struct ath9k_tx_queue_info *qinfo);
10729999SWang.Lin@Sun.COM boolean_t ath9k_hw_releasetxqueue(struct ath_hal *ah, uint32_t q);
10739999SWang.Lin@Sun.COM boolean_t ath9k_hw_resettxqueue(struct ath_hal *ah, uint32_t q);
10749999SWang.Lin@Sun.COM int ath9k_hw_rxprocdesc(struct ath_hal *ah, struct ath_desc *ds,
10759999SWang.Lin@Sun.COM     uint32_t pa, struct ath_desc *nds, uint64_t tsf);
10769999SWang.Lin@Sun.COM boolean_t ath9k_hw_setuprxdesc(struct ath_hal *ah, struct ath_desc *ds,
10779999SWang.Lin@Sun.COM     uint32_t size, uint32_t flags);
10789999SWang.Lin@Sun.COM boolean_t ath9k_hw_setrxabort(struct ath_hal *ah, boolean_t set);
10799999SWang.Lin@Sun.COM void ath9k_hw_putrxbuf(struct ath_hal *ah, uint32_t rxdp);
10809999SWang.Lin@Sun.COM void ath9k_hw_rxena(struct ath_hal *ah);
10819999SWang.Lin@Sun.COM void ath9k_hw_startpcureceive(struct ath_hal *ah);
10829999SWang.Lin@Sun.COM void ath9k_hw_stoppcurecv(struct ath_hal *ah);
10839999SWang.Lin@Sun.COM boolean_t ath9k_hw_stopdmarecv(struct ath_hal *ah);
10849999SWang.Lin@Sun.COM 
10859999SWang.Lin@Sun.COM #ifdef __cplusplus
10869999SWang.Lin@Sun.COM }
10879999SWang.Lin@Sun.COM #endif
10889999SWang.Lin@Sun.COM 
10899999SWang.Lin@Sun.COM #endif /* _ARN_ATH9K_H */
1090