Home | History | Annotate | Line # | Download | only in ic
      1 /*	$NetBSD: athnvar.h,v 1.8 2019/10/05 23:27:20 mrg Exp $	*/
      2 /*	$OpenBSD: athnvar.h,v 1.34 2013/10/21 16:13:49 stsp Exp $	*/
      3 
      4 /*-
      5  * Copyright (c) 2009 Damien Bergamini <damien.bergamini (at) free.fr>
      6  *
      7  * Permission to use, copy, modify, and distribute this software for any
      8  * purpose with or without fee is hereby granted, provided that the above
      9  * copyright notice and this permission notice appear in all copies.
     10  *
     11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
     12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
     13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
     14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
     15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
     16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
     17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
     18  */
     19 
     20 #ifndef _ATHNVAR_H_
     21 #define _ATHNVAR_H_
     22 
     23 #ifdef	_KERNEL_OPT
     24 #include "opt_athn.h"
     25 #endif
     26 
     27 #define PUBLIC
     28 
     29 #define IEEE80211_NO_HT		/* XXX: porting artifact */
     30 
     31 #ifdef notyet
     32 #define ATHN_BT_COEXISTENCE	1
     33 #endif
     34 
     35 #define ATHN_SOFTC(sc)		((struct athn_softc *)(sc))
     36 #define ATHN_NODE(ni)		((struct athn_node *)(ni))
     37 
     38 #ifdef ATHN_DEBUG
     39 #define	DBG_INIT	__BIT(0)
     40 #define	DBG_FN		__BIT(1)
     41 #define	DBG_TX		__BIT(2)
     42 #define	DBG_RX		__BIT(3)
     43 #define	DBG_STM		__BIT(4)
     44 #define	DBG_RF		__BIT(5)
     45 #define	DBG_NODES	__BIT(6)
     46 #define	DBG_INTR	__BIT(7)
     47 #define	DBG_ALL		0xffffffffU
     48 #define DPRINTFN(n, s, ...) do { \
     49 	if (athn_debug & (n)) { \
     50 		printf("%s: %s: ", \
     51 			device_xname(ATHN_SOFTC(s)->sc_dev), __func__); \
     52 		printf(__VA_ARGS__); \
     53 	} \
     54 } while (0)
     55 extern int athn_debug;
     56 #else /* ATHN_DEBUG */
     57 #define DPRINTFN(n, s, ...)
     58 #endif /* ATHN_DEBUG */
     59 
     60 #define LE_READ_4(p)	((p)[0] | (p)[1] << 8 | (p)[2] << 16 | (p)[3] << 24)
     61 #define LE_READ_2(p)	((p)[0] | (p)[1] << 8)
     62 
     63 #define ATHN_RXBUFSZ	3872
     64 #define ATHN_TXBUFSZ	4096
     65 
     66 #define ATHN_NRXBUFS	64
     67 #define ATHN_NTXBUFS	64	/* Shared between all Tx queues. */
     68 
     69 struct athn_rx_radiotap_header {
     70 	struct ieee80211_radiotap_header wr_ihdr;
     71 	uint64_t	wr_tsft;
     72 	uint8_t		wr_flags;
     73 	uint8_t		wr_rate;
     74 	uint16_t	wr_chan_freq;
     75 	uint16_t	wr_chan_flags;
     76 	int8_t		wr_dbm_antsignal;
     77 	uint8_t		wr_antenna;
     78 };
     79 
     80 #define ATHN_RX_RADIOTAP_PRESENT					\
     81 	(1 << IEEE80211_RADIOTAP_TSFT |					\
     82 	 1 << IEEE80211_RADIOTAP_FLAGS |				\
     83 	 1 << IEEE80211_RADIOTAP_RATE |					\
     84 	 1 << IEEE80211_RADIOTAP_CHANNEL |				\
     85 	 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL |			\
     86 	 1 << IEEE80211_RADIOTAP_ANTENNA)
     87 
     88 struct athn_tx_radiotap_header {
     89 	struct ieee80211_radiotap_header wt_ihdr;
     90 	uint8_t		wt_flags;
     91 	uint8_t		wt_rate;
     92 	uint16_t	wt_chan_freq;
     93 	uint16_t	wt_chan_flags;
     94 };
     95 
     96 #define ATHN_TX_RADIOTAP_PRESENT					\
     97 	(1 << IEEE80211_RADIOTAP_FLAGS |				\
     98 	 1 << IEEE80211_RADIOTAP_RATE |					\
     99 	 1 << IEEE80211_RADIOTAP_CHANNEL)
    100 
    101 struct athn_tx_buf {
    102 	SIMPLEQ_ENTRY(athn_tx_buf)	bf_list;
    103 
    104 	void				*bf_descs;
    105 	bus_dmamap_t			bf_map;
    106 	bus_addr_t			bf_daddr;
    107 
    108 	struct mbuf			*bf_m;
    109 	struct ieee80211_node		*bf_ni;
    110 	int				bf_txflags;
    111 #define ATHN_TXFLAG_PAPRD	(1 << 0)
    112 #define ATHN_TXFLAG_CAB		(1 << 1)
    113 };
    114 
    115 struct athn_txq {
    116 	SIMPLEQ_HEAD(, athn_tx_buf)	head;
    117 	void				*lastds;
    118 	struct athn_tx_buf		*wait;
    119 	int				queued;
    120 };
    121 
    122 struct athn_rx_buf {
    123 	SIMPLEQ_ENTRY(athn_rx_buf)	bf_list;
    124 
    125 	void				*bf_desc;
    126 	bus_dmamap_t			bf_map;
    127 
    128 	struct mbuf			*bf_m;
    129 	bus_addr_t			bf_daddr;
    130 };
    131 
    132 struct athn_rxq {
    133 	struct athn_rx_buf		*bf;
    134 
    135 	void				*descs;
    136 	void				*lastds;
    137 	bus_dmamap_t			map;
    138 	bus_dma_segment_t		seg;
    139 	int				count;
    140 
    141 	SIMPLEQ_HEAD(, athn_rx_buf)	head;
    142 };
    143 
    144 /* Software rate indexes. */
    145 #define ATHN_RIDX_CCK1	0
    146 #define ATHN_RIDX_CCK2	1
    147 #define ATHN_RIDX_OFDM6	4
    148 #define ATHN_RIDX_MCS0	12
    149 #define ATHN_RIDX_MCS15	27
    150 #define ATHN_RIDX_MAX	27
    151 #define ATHN_IS_HT_RIDX(ridx)	((ridx) >= ATHN_RIDX_MCS0)
    152 
    153 static const struct athn_rate {
    154 	uint8_t	rate;		/* Rate in 500Kbps unit or MCS if 0x80. */
    155 	uint8_t	hwrate;		/* HW representation. */
    156 	uint8_t	rspridx;	/* Control Response Frame rate index. */
    157 	enum	ieee80211_phytype phy;
    158 } athn_rates[] = {
    159 	{    2, 0x1b, 0, IEEE80211_T_DS },
    160 	{    4, 0x1a, 1, IEEE80211_T_DS },
    161 	{   11, 0x19, 1, IEEE80211_T_DS },
    162 	{   22, 0x18, 1, IEEE80211_T_DS },
    163 	{   12, 0x0b, 4, IEEE80211_T_OFDM },
    164 	{   18, 0x0f, 4, IEEE80211_T_OFDM },
    165 	{   24, 0x0a, 6, IEEE80211_T_OFDM },
    166 	{   36, 0x0e, 6, IEEE80211_T_OFDM },
    167 	{   48, 0x09, 8, IEEE80211_T_OFDM },
    168 	{   72, 0x0d, 8, IEEE80211_T_OFDM },
    169 	{   96, 0x08, 8, IEEE80211_T_OFDM },
    170 	{  108, 0x0c, 8, IEEE80211_T_OFDM },
    171 	{ 0x80, 0x80, 8, IEEE80211_T_OFDM },
    172 	{ 0x81, 0x81, 8, IEEE80211_T_OFDM },
    173 	{ 0x82, 0x82, 8, IEEE80211_T_OFDM },
    174 	{ 0x83, 0x83, 8, IEEE80211_T_OFDM },
    175 	{ 0x84, 0x84, 8, IEEE80211_T_OFDM },
    176 	{ 0x85, 0x85, 8, IEEE80211_T_OFDM },
    177 	{ 0x86, 0x86, 8, IEEE80211_T_OFDM },
    178 	{ 0x87, 0x87, 8, IEEE80211_T_OFDM },
    179 	{ 0x88, 0x88, 8, IEEE80211_T_OFDM },
    180 	{ 0x89, 0x89, 8, IEEE80211_T_OFDM },
    181 	{ 0x8a, 0x8a, 8, IEEE80211_T_OFDM },
    182 	{ 0x8b, 0x8b, 8, IEEE80211_T_OFDM },
    183 	{ 0x8c, 0x8c, 8, IEEE80211_T_OFDM },
    184 	{ 0x8d, 0x8d, 8, IEEE80211_T_OFDM },
    185 	{ 0x8e, 0x8e, 8, IEEE80211_T_OFDM },
    186 	{ 0x8f, 0x8f, 8, IEEE80211_T_OFDM }
    187 };
    188 
    189 struct athn_series {
    190 	uint16_t	dur;
    191 	uint8_t		hwrate;
    192 };
    193 
    194 struct athn_pier {
    195 	uint8_t		fbin;
    196 	const uint8_t	*pwr[AR_PD_GAINS_IN_MASK];
    197 	const uint8_t	*vpd[AR_PD_GAINS_IN_MASK];
    198 };
    199 
    200 /*
    201  * Structures used to store initialization values.
    202  */
    203 struct athn_ini {
    204 	int		nregs;
    205 	const uint16_t	*regs;
    206 	const uint32_t	*vals_5g20;
    207 #ifndef IEEE80211_NO_HT
    208 	const uint32_t	*vals_5g40;
    209 	const uint32_t	*vals_2g40;
    210 #endif
    211 	const uint32_t	*vals_2g20;
    212 	int		ncmregs;
    213 	const uint16_t	*cmregs;
    214 	const uint32_t	*cmvals;
    215 	int		nfastregs;
    216 	const uint16_t	*fastregs;
    217 	const uint32_t	*fastvals_5g20;
    218 #ifndef IEEE80211_NO_HT
    219 	const uint32_t	*fastvals_5g40;
    220 #endif
    221 };
    222 
    223 struct athn_gain {
    224 	int		nregs;
    225 	const uint16_t	*regs;
    226 	const uint32_t	*vals_5g;
    227 	const uint32_t	*vals_2g;
    228 };
    229 
    230 struct athn_addac {
    231 	int		nvals;
    232 	const uint32_t	*vals;
    233 };
    234 
    235 struct athn_serdes {
    236 	int		nvals;
    237 	const uint32_t	*regs;
    238 	const uint32_t	*vals;
    239 };
    240 
    241 /* Rx queue software indexes. */
    242 #define ATHN_QID_LP		0
    243 #define ATHN_QID_HP		1
    244 
    245 /* Tx queue software indexes. */
    246 #define ATHN_QID_AC_BE		0
    247 #define ATHN_QID_PSPOLL		1
    248 #define ATHN_QID_AC_BK		2
    249 #define ATHN_QID_AC_VI		3
    250 #define ATHN_QID_AC_VO		4
    251 #define ATHN_QID_UAPSD		5
    252 #define ATHN_QID_CAB		6
    253 #define ATHN_QID_BEACON		7
    254 #define ATHN_QID_COUNT		8
    255 
    256 /* Map Access Category to Tx queue Id. */
    257 static const uint8_t athn_ac2qid[WME_NUM_AC] = {
    258 	ATHN_QID_AC_BE,	/* WME_AC_BE */
    259 	ATHN_QID_AC_BK,	/* WME_AC_BK */
    260 	ATHN_QID_AC_VI,	/* WME_AC_VI */
    261 	ATHN_QID_AC_VO	/* WME_AC_VO */
    262 };
    263 
    264 static const uint8_t athn_5ghz_chans[] = {
    265 	/* UNII 1. */
    266 	36, 40, 44, 48,
    267 	/* UNII 2. */
    268 	52, 56, 60, 64,
    269 	/* Middle band. */
    270 	100, 104, 108, 112, 116, 120, 124, 128, 132, 136, 140,
    271 	/* UNII 3. */
    272 	149, 153, 157, 161, 165
    273 };
    274 
    275 /* Number of data bits per OFDM symbol for MCS[0-15]. */
    276 /* See tables 20-29, 20-30, 20-33, 20-34. */
    277 static const uint16_t ar_mcs_ndbps[][2] = {
    278 	/* 20MHz  40MHz */
    279 	{     26,    54 },	/* MCS0 */
    280 	{     52,   108 },	/* MCS1 */
    281 	{     78,   162 },	/* MCS2 */
    282 	{    104,   216 },	/* MCS3 */
    283 	{    156,   324 },	/* MCS4 */
    284 	{    208,   432 },	/* MCS5 */
    285 	{    234,   486 },	/* MCS6 */
    286 	{    260,   540 },	/* MCS7 */
    287 	{     26,   108 },	/* MCS8 */
    288 	{     52,   216 },	/* MCS9 */
    289 	{     78,   324 },	/* MCS10 */
    290 	{    104,   432 },	/* MCS11 */
    291 	{    156,   648 },	/* MCS12 */
    292 	{    208,   864 },	/* MCS13 */
    293 	{    234,   972 },	/* MCS14 */
    294 	{    260,  1080 }	/* MCS15 */
    295 };
    296 
    297 #define ATHN_POWER_OFDM6	0
    298 #define ATHN_POWER_OFDM9	1
    299 #define ATHN_POWER_OFDM12	2
    300 #define ATHN_POWER_OFDM18	3
    301 #define ATHN_POWER_OFDM24	4
    302 #define ATHN_POWER_OFDM36	5
    303 #define ATHN_POWER_OFDM48	6
    304 #define ATHN_POWER_OFDM54	7
    305 #define ATHN_POWER_CCK1_LP	8
    306 #define ATHN_POWER_CCK2_LP	9
    307 #define ATHN_POWER_CCK2_SP	10
    308 #define ATHN_POWER_CCK55_LP	11
    309 #define ATHN_POWER_CCK55_SP	12
    310 #define ATHN_POWER_CCK11_LP	13
    311 #define ATHN_POWER_CCK11_SP	14
    312 #define ATHN_POWER_XR		15
    313 #define ATHN_POWER_HT20(mcs)	(16 + (mcs))
    314 #define ATHN_POWER_HT40(mcs)	(40 + (mcs))
    315 #define ATHN_POWER_CCK_DUP	64
    316 #define ATHN_POWER_OFDM_DUP	65
    317 #define ATHN_POWER_CCK_EXT	66
    318 #define ATHN_POWER_OFDM_EXT	67
    319 #define ATHN_POWER_COUNT	68
    320 
    321 struct athn_node {
    322 	struct ieee80211_node		ni;
    323 	struct ieee80211_amrr_node	amn;
    324 	uint8_t				ridx[IEEE80211_RATE_MAXSIZE];
    325 	uint8_t				fallback[IEEE80211_RATE_MAXSIZE];
    326 	uint8_t				sta_index;
    327 };
    328 
    329 /*
    330  * Adaptive noise immunity state.
    331  */
    332 #define ATHN_ANI_PERIOD		100
    333 #define ATHN_ANI_RSSI_THR_HIGH	40
    334 #define ATHN_ANI_RSSI_THR_LOW	7
    335 struct athn_ani {
    336 	uint8_t		noise_immunity_level;
    337 	uint8_t		spur_immunity_level;
    338 	uint8_t		firstep_level;
    339 	uint8_t		ofdm_weak_signal;
    340 	uint8_t		cck_weak_signal;
    341 
    342 	uint32_t	listen_time;
    343 
    344 	uint32_t	ofdm_trig_high;
    345 	uint32_t	ofdm_trig_low;
    346 
    347 	int32_t		cck_trig_high;
    348 	int32_t		cck_trig_low;
    349 
    350 	uint32_t	ofdm_phy_err_base;
    351 	uint32_t	cck_phy_err_base;
    352 	uint32_t	ofdm_phy_err_count;
    353 	uint32_t	cck_phy_err_count;
    354 
    355 	uint32_t	cyccnt;
    356 	uint32_t	txfcnt;
    357 	uint32_t	rxfcnt;
    358 };
    359 
    360 struct athn_iq_cal {
    361 	uint32_t	pwr_meas_i;
    362 	uint32_t	pwr_meas_q;
    363 	int32_t		iq_corr_meas;
    364 };
    365 
    366 struct athn_adc_cal {
    367 	uint32_t	pwr_meas_odd_i;
    368 	uint32_t	pwr_meas_even_i;
    369 	uint32_t	pwr_meas_odd_q;
    370 	uint32_t	pwr_meas_even_q;
    371 };
    372 
    373 struct athn_calib {
    374 	int			nsamples;
    375 	struct athn_iq_cal	iq[AR_MAX_CHAINS];
    376 	struct athn_adc_cal	adc_gain[AR_MAX_CHAINS];
    377 	struct athn_adc_cal	adc_dc_offset[AR_MAX_CHAINS];
    378 };
    379 
    380 #define ATHN_NF_CAL_HIST_MAX	5
    381 
    382 struct athn_softc;
    383 
    384 struct athn_ops {
    385 	/* Bus callbacks. */
    386 	uint32_t	(*read)(struct athn_softc *, uint32_t);
    387 	void		(*write)(struct athn_softc *, uint32_t, uint32_t);
    388 	void		(*write_barrier)(struct athn_softc *);
    389 
    390 	void	(*setup)(struct athn_softc *);
    391 	void	(*set_txpower)(struct athn_softc *, struct ieee80211_channel *,
    392 		    struct ieee80211_channel *);
    393 	void	(*spur_mitigate)(struct athn_softc *,
    394 		    struct ieee80211_channel *, struct ieee80211_channel *);
    395 	const struct ar_spur_chan *
    396 		(*get_spur_chans)(struct athn_softc *, int);
    397 	void	(*init_from_rom)(struct athn_softc *,
    398 		    struct ieee80211_channel *, struct ieee80211_channel *);
    399 	int	(*set_synth)(struct athn_softc *, struct ieee80211_channel *,
    400 		    struct ieee80211_channel *);
    401 	int	(*read_rom_data)(struct athn_softc *, uint32_t, void *, int);
    402 	const uint8_t *
    403 		(*get_rom_template)(struct athn_softc *, uint8_t);
    404 	void	(*swap_rom)(struct athn_softc *);
    405 	void	(*olpc_init)(struct athn_softc *);
    406 	void	(*olpc_temp_compensation)(struct athn_softc *);
    407 
    408 	/* GPIO callbacks. */
    409 	int	(*gpio_read)(struct athn_softc *, int);
    410 	void	(*gpio_write)(struct athn_softc *, int, int);
    411 	void	(*gpio_config_input)(struct athn_softc *, int);
    412 	void	(*gpio_config_output)(struct athn_softc *, int, int);
    413 	void	(*rfsilent_init)(struct athn_softc *);
    414 
    415 	/* DMA callbacks. */
    416 	int	(*dma_alloc)(struct athn_softc *);
    417 	void	(*dma_free)(struct athn_softc *);
    418 	void	(*rx_enable)(struct athn_softc *);
    419 	int	(*intr_status)(struct athn_softc *);
    420 	int	(*intr)(struct athn_softc *);
    421 	int	(*tx)(struct athn_softc *, struct mbuf *,
    422 		    struct ieee80211_node *, int);
    423 
    424 	/* PHY callbacks. */
    425 	void	(*set_rf_mode)(struct athn_softc *,
    426 		    struct ieee80211_channel *);
    427 	int	(*rf_bus_request)(struct athn_softc *);
    428 	void	(*rf_bus_release)(struct athn_softc *);
    429 	void	(*set_phy)(struct athn_softc *, struct ieee80211_channel *,
    430 		    struct ieee80211_channel *);
    431 	void	(*set_delta_slope)(struct athn_softc *,
    432 		    struct ieee80211_channel *, struct ieee80211_channel *);
    433 	void	(*enable_antenna_diversity)(struct athn_softc *);
    434 	void	(*init_baseband)(struct athn_softc *);
    435 	void	(*disable_phy)(struct athn_softc *);
    436 	void	(*set_rxchains)(struct athn_softc *);
    437 	void	(*noisefloor_calib)(struct athn_softc *);
    438 	void	(*do_calib)(struct athn_softc *);
    439 	void	(*next_calib)(struct athn_softc *);
    440 	void	(*hw_init)(struct athn_softc *, struct ieee80211_channel *,
    441 		    struct ieee80211_channel *);
    442 	void	(*get_paprd_masks)(struct athn_softc *sc,
    443 		    struct ieee80211_channel *, uint32_t *, uint32_t *);
    444 
    445 	/* ANI callbacks. */
    446 	void	(*set_noise_immunity_level)(struct athn_softc *, int);
    447 	void	(*enable_ofdm_weak_signal)(struct athn_softc *);
    448 	void	(*disable_ofdm_weak_signal)(struct athn_softc *);
    449 	void	(*set_cck_weak_signal)(struct athn_softc *, int);
    450 	void	(*set_firstep_level)(struct athn_softc *, int);
    451 	void	(*set_spur_immunity_level)(struct athn_softc *, int);
    452 };
    453 
    454 struct athn_softc {
    455 	device_t			sc_dev;
    456 	device_suspensor_t		sc_suspensor;
    457 	pmf_qual_t			sc_qual;
    458 	struct ieee80211com		sc_ic;
    459 	struct ethercom			sc_ec;
    460 #define sc_if	sc_ec.ec_if
    461 	void				*sc_soft_ih;
    462 
    463 #if 0
    464 	int				(*sc_enable)(struct athn_softc *);
    465 	void				(*sc_disable)(struct athn_softc *);
    466 	void				(*sc_power)(struct athn_softc *, int);
    467 #endif
    468 	void				(*sc_disable_aspm)(struct athn_softc *);
    469 	void				(*sc_enable_extsynch)(
    470 					    struct athn_softc *);
    471 
    472 	int				(*sc_newstate)(struct ieee80211com *,
    473 					    enum ieee80211_state, int);
    474 
    475 	bus_dma_tag_t			sc_dmat;
    476 
    477 	callout_t			sc_scan_to;
    478 	callout_t			sc_calib_to;
    479 	struct ieee80211_amrr		sc_amrr;
    480 
    481 	u_int				sc_flags;
    482 #define ATHN_FLAG_PCIE			(1 << 0)
    483 #define ATHN_FLAG_USB			(1 << 1)
    484 #define ATHN_FLAG_OLPC			(1 << 2)
    485 #define ATHN_FLAG_PAPRD			(1 << 3)
    486 #define ATHN_FLAG_FAST_PLL_CLOCK	(1 << 4)
    487 #define ATHN_FLAG_RFSILENT		(1 << 5)
    488 #define ATHN_FLAG_RFSILENT_REVERSED	(1 << 6)
    489 #define ATHN_FLAG_BTCOEX2WIRE		(1 << 7)
    490 #define ATHN_FLAG_BTCOEX3WIRE		(1 << 8)
    491 /* Shortcut. */
    492 #define ATHN_FLAG_BTCOEX	(ATHN_FLAG_BTCOEX2WIRE | ATHN_FLAG_BTCOEX3WIRE)
    493 #define ATHN_FLAG_11A			(1 << 9)
    494 #define ATHN_FLAG_11G			(1 << 10)
    495 #define ATHN_FLAG_11N			(1 << 11)
    496 #define ATHN_FLAG_AN_TOP2_FIXUP		(1 << 12)
    497 #define ATHN_FLAG_NON_ENTERPRISE	(1 << 13)
    498 #define ATHN_FLAG_3TREDUCE_CHAIN	(1 << 14)
    499 
    500 	uint8_t				sc_ngpiopins;
    501 	int				sc_led_pin;
    502 	int				sc_rfsilent_pin;
    503 	int				sc_led_state;
    504 	uint32_t			sc_isync;
    505 	uint32_t			sc_imask;
    506 
    507 	uint16_t			sc_mac_ver;
    508 	uint8_t				sc_mac_rev;
    509 	uint8_t				sc_rf_rev;
    510 	uint16_t			sc_eep_rev;
    511 
    512 	uint8_t				sc_txchainmask;
    513 	uint8_t				sc_rxchainmask;
    514 	uint8_t				sc_ntxchains;
    515 	uint8_t				sc_nrxchains;
    516 
    517 	uint8_t				sc_sup_calib_mask;
    518 	uint8_t				sc_cur_calib_mask;
    519 #define ATHN_CAL_IQ		(1 << 0)
    520 #define ATHN_CAL_ADC_GAIN	(1 << 1)
    521 #define ATHN_CAL_ADC_DC		(1 << 2)
    522 #define ATHN_CAL_TEMP		(1 << 3)
    523 
    524 	struct ieee80211_channel	*sc_curchan;
    525 	struct ieee80211_channel	*sc_curchanext;
    526 
    527 	/* Open Loop Power Control. */
    528 	int8_t				sc_tx_gain_tbl[AR9280_TX_GAIN_TABLE_SIZE];
    529 	int8_t				sc_pdadc;
    530 	int8_t				sc_tcomp;
    531 	int				sc_olpc_ticks;
    532 
    533 	/* PA predistortion. */
    534 	uint16_t			sc_gain1[AR_MAX_CHAINS];
    535 	uint32_t			sc_txgain[AR9003_TX_GAIN_TABLE_SIZE];
    536 	int16_t				sc_pa_in[AR_MAX_CHAINS]
    537 					     [AR9003_PAPRD_MEM_TAB_SIZE];
    538 	int16_t				sc_angle[AR_MAX_CHAINS]
    539 					     [AR9003_PAPRD_MEM_TAB_SIZE];
    540 	int32_t				sc_trainpow;
    541 	uint8_t				sc_paprd_curchain;
    542 
    543 	uint32_t			sc_rwbuf[64];
    544 
    545 	size_t				sc_kc_entries;
    546 
    547 	void				*sc_eep;
    548 	const void			*sc_eep_def;
    549 	uint32_t			sc_eep_base;
    550 	uint32_t			sc_eep_size;
    551 
    552 	struct athn_rxq			sc_rxq[2];
    553 	struct athn_txq			sc_txq[31];
    554 
    555 	void				*sc_descs;
    556 	bus_dmamap_t			sc_map;
    557 	bus_dma_segment_t		sc_seg;
    558 	SIMPLEQ_HEAD(, athn_tx_buf)	sc_txbufs;
    559 	struct athn_tx_buf		*sc_bcnbuf;
    560 	struct athn_tx_buf		sc_txpool[ATHN_NTXBUFS];
    561 
    562 	bus_dmamap_t			sc_txsmap;
    563 	bus_dma_segment_t		sc_txsseg;
    564 	void				*sc_txsring;
    565 	int				sc_txscur;
    566 
    567 	u_short				sc_if_flags;
    568 	int				sc_tx_timer;
    569 
    570 	const struct athn_ini		*sc_ini;
    571 	const struct athn_gain		*sc_rx_gain;
    572 	const struct athn_gain		*sc_tx_gain;
    573 	const struct athn_addac		*sc_addac;
    574 	const struct athn_serdes	*sc_serdes;
    575 	uint32_t			sc_workaround;
    576 	uint32_t			sc_obs_off;
    577 	uint32_t			sc_gpio_input_en_off;
    578 
    579 	struct athn_ops			sc_ops;
    580 
    581 	int				sc_fixed_ridx;
    582 
    583 	int16_t				sc_cca_min_2g;
    584 	int16_t				sc_cca_max_2g;
    585 	int16_t				sc_cca_min_5g;
    586 	int16_t				sc_cca_max_5g;
    587 	int16_t				sc_def_nf;
    588 	struct {
    589 		int16_t	nf[AR_MAX_CHAINS];
    590 		int16_t	nf_ext[AR_MAX_CHAINS];
    591 	}				sc_nf_hist[ATHN_NF_CAL_HIST_MAX];
    592 	int				sc_nf_hist_cur;
    593 	int16_t				sc_nf_priv[AR_MAX_CHAINS];
    594 	int16_t				sc_nf_ext_priv[AR_MAX_CHAINS];
    595 	int				sc_pa_calib_ticks;
    596 
    597 	struct athn_calib		sc_calib;
    598 	struct athn_ani			sc_ani;
    599 
    600 	struct bpf_if *			sc_drvbpf;
    601 
    602 	union {
    603 		struct athn_rx_radiotap_header th;
    604 		uint8_t pad[IEEE80211_RADIOTAP_HDRLEN];
    605 	} sc_rxtapu;
    606 #define sc_rxtap			sc_rxtapu.th
    607 	int				sc_rxtap_len;
    608 
    609 	union {
    610 		struct athn_tx_radiotap_header th;
    611 		uint8_t pad[IEEE80211_RADIOTAP_HDRLEN];
    612 	} sc_txtapu;
    613 #define sc_txtap			sc_txtapu.th
    614 	int				sc_txtap_len;
    615 
    616 	/*
    617 	 * Attach overrides.  Set before calling athn_attach().
    618 	 */
    619 	int				sc_max_aid;
    620 	int				(*sc_media_change)(struct ifnet *);
    621 };
    622 
    623 int	athn_attach(struct athn_softc *);
    624 void	athn_detach(struct athn_softc *);
    625 void	athn_suspend(struct athn_softc *);
    626 bool	athn_resume(struct athn_softc *);
    627 int	athn_intr(void *);
    628 
    629 /* used by if_athn_usb.c */
    630 void	athn_btcoex_init(struct athn_softc *);
    631 int	athn_hw_reset(struct athn_softc *, struct ieee80211_channel *,
    632 	    struct ieee80211_channel *, int);
    633 void	athn_init_pll(struct athn_softc *, const struct ieee80211_channel *);
    634 void	athn_led_init(struct athn_softc *);
    635 int	athn_reset(struct athn_softc *, int);
    636 void	athn_reset_key(struct athn_softc *, int);
    637 void	athn_rx_start(struct athn_softc *);
    638 void	athn_set_bss(struct athn_softc *, struct ieee80211_node *);
    639 int	athn_set_chan(struct athn_softc *, struct ieee80211_channel *,
    640 	    struct ieee80211_channel *);
    641 void	athn_set_hostap_timers(struct athn_softc *);
    642 void	athn_set_led(struct athn_softc *, int);
    643 void	athn_set_opmode(struct athn_softc *);
    644 int	athn_set_power_awake(struct athn_softc *);
    645 void	athn_set_power_sleep(struct athn_softc *);
    646 void	athn_set_rxfilter(struct athn_softc *, uint32_t);
    647 void	athn_set_sta_timers(struct athn_softc *);
    648 void	athn_updateslot(struct ifnet *);
    649 
    650 #ifdef notyet_edca
    651 void	athn_updateedca(struct ieee80211com *);
    652 #endif
    653 #ifdef notyet
    654 void	athn_delete_key(struct ieee80211com *, struct ieee80211_node *,
    655 	    struct ieee80211_key *);
    656 int	athn_set_key(struct ieee80211com *, struct ieee80211_node *,
    657 	    struct ieee80211_key *);
    658 #endif /* notyet */
    659 
    660 /* used by ar9285.c */
    661 uint8_t	athn_chan2fbin(struct ieee80211_channel *);
    662 void	athn_get_pier_ival(uint8_t, const uint8_t *, int, int *, int *);
    663 
    664 /* used by arn5008.c and arn9003.c */
    665 void	athn_config_nonpcie(struct athn_softc *);
    666 void	athn_config_pcie(struct athn_softc *);
    667 void	athn_get_delta_slope(uint32_t, uint32_t *, uint32_t *);
    668 void	athn_inc_tx_trigger_level(struct athn_softc *);
    669 void	athn_stop(struct ifnet *, int);
    670 void	athn_stop_tx_dma(struct athn_softc *, int);
    671 int	athn_tx_pending(struct athn_softc *, int);
    672 int	athn_txtime(struct athn_softc *, int, int, u_int);
    673 
    674 /* used by arn5008.c, arn9003.c, arn9287.c, and arn9380.c */
    675 int	athn_interpolate(int, int, int, int, int);
    676 
    677 #endif /* _ATHNVAR_H_ */
    678