1 /*	$NetBSD: athnvar.h,v 1.5 2015/11/27 21:16:17 jmcneill 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@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 } __packed;
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 } __packed;
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)(struct athn_softc *);
420 	int	(*tx)(struct athn_softc *, struct mbuf *,
421 		    struct ieee80211_node *, int);
422 
423 	/* PHY callbacks. */
424 	void	(*set_rf_mode)(struct athn_softc *,
425 		    struct ieee80211_channel *);
426 	int	(*rf_bus_request)(struct athn_softc *);
427 	void	(*rf_bus_release)(struct athn_softc *);
428 	void	(*set_phy)(struct athn_softc *, struct ieee80211_channel *,
429 		    struct ieee80211_channel *);
430 	void	(*set_delta_slope)(struct athn_softc *,
431 		    struct ieee80211_channel *, struct ieee80211_channel *);
432 	void	(*enable_antenna_diversity)(struct athn_softc *);
433 	void	(*init_baseband)(struct athn_softc *);
434 	void	(*disable_phy)(struct athn_softc *);
435 	void	(*set_rxchains)(struct athn_softc *);
436 	void	(*noisefloor_calib)(struct athn_softc *);
437 	void	(*do_calib)(struct athn_softc *);
438 	void	(*next_calib)(struct athn_softc *);
439 	void	(*hw_init)(struct athn_softc *, struct ieee80211_channel *,
440 		    struct ieee80211_channel *);
441 	void	(*get_paprd_masks)(struct athn_softc *sc,
442 		    struct ieee80211_channel *, uint32_t *, uint32_t *);
443 
444 	/* ANI callbacks. */
445 	void	(*set_noise_immunity_level)(struct athn_softc *, int);
446 	void	(*enable_ofdm_weak_signal)(struct athn_softc *);
447 	void	(*disable_ofdm_weak_signal)(struct athn_softc *);
448 	void	(*set_cck_weak_signal)(struct athn_softc *, int);
449 	void	(*set_firstep_level)(struct athn_softc *, int);
450 	void	(*set_spur_immunity_level)(struct athn_softc *, int);
451 };
452 
453 struct athn_softc {
454 	device_t			sc_dev;
455 	device_suspensor_t		sc_suspensor;
456 	pmf_qual_t			sc_qual;
457 	struct ieee80211com		sc_ic;
458 	struct ethercom			sc_ec;
459 #define sc_if	sc_ec.ec_if
460 
461 #if 0
462 	int				(*sc_enable)(struct athn_softc *);
463 	void				(*sc_disable)(struct athn_softc *);
464 	void				(*sc_power)(struct athn_softc *, int);
465 #endif
466 	void				(*sc_disable_aspm)(struct athn_softc *);
467 	void				(*sc_enable_extsynch)(
468 					    struct athn_softc *);
469 
470 	int				(*sc_newstate)(struct ieee80211com *,
471 					    enum ieee80211_state, int);
472 
473 	bus_dma_tag_t			sc_dmat;
474 
475 	callout_t			sc_scan_to;
476 	callout_t			sc_calib_to;
477 	struct ieee80211_amrr		sc_amrr;
478 
479 	u_int				sc_flags;
480 #define ATHN_FLAG_PCIE			(1 << 0)
481 #define ATHN_FLAG_USB			(1 << 1)
482 #define ATHN_FLAG_OLPC			(1 << 2)
483 #define ATHN_FLAG_PAPRD			(1 << 3)
484 #define ATHN_FLAG_FAST_PLL_CLOCK	(1 << 4)
485 #define ATHN_FLAG_RFSILENT		(1 << 5)
486 #define ATHN_FLAG_RFSILENT_REVERSED	(1 << 6)
487 #define ATHN_FLAG_BTCOEX2WIRE		(1 << 7)
488 #define ATHN_FLAG_BTCOEX3WIRE		(1 << 8)
489 /* Shortcut. */
490 #define ATHN_FLAG_BTCOEX	(ATHN_FLAG_BTCOEX2WIRE | ATHN_FLAG_BTCOEX3WIRE)
491 #define ATHN_FLAG_11A			(1 << 9)
492 #define ATHN_FLAG_11G			(1 << 10)
493 #define ATHN_FLAG_11N			(1 << 11)
494 #define ATHN_FLAG_AN_TOP2_FIXUP		(1 << 12)
495 #define ATHN_FLAG_NON_ENTERPRISE	(1 << 13)
496 #define ATHN_FLAG_3TREDUCE_CHAIN	(1 << 14)
497 
498 	uint8_t				sc_ngpiopins;
499 	int				sc_led_pin;
500 	int				sc_rfsilent_pin;
501 	int				sc_led_state;
502 	uint32_t			sc_isync;
503 	uint32_t			sc_imask;
504 
505 	uint16_t			sc_mac_ver;
506 	uint8_t				sc_mac_rev;
507 	uint8_t				sc_rf_rev;
508 	uint16_t			sc_eep_rev;
509 
510 	uint8_t				sc_txchainmask;
511 	uint8_t				sc_rxchainmask;
512 	uint8_t				sc_ntxchains;
513 	uint8_t				sc_nrxchains;
514 
515 	uint8_t				sc_sup_calib_mask;
516 	uint8_t				sc_cur_calib_mask;
517 #define ATHN_CAL_IQ		(1 << 0)
518 #define ATHN_CAL_ADC_GAIN	(1 << 1)
519 #define ATHN_CAL_ADC_DC		(1 << 2)
520 #define ATHN_CAL_TEMP		(1 << 3)
521 
522 	struct ieee80211_channel	*sc_curchan;
523 	struct ieee80211_channel	*sc_curchanext;
524 
525 	/* Open Loop Power Control. */
526 	int8_t				sc_tx_gain_tbl[AR9280_TX_GAIN_TABLE_SIZE];
527 	int8_t				sc_pdadc;
528 	int8_t				sc_tcomp;
529 	int				sc_olpc_ticks;
530 
531 	/* PA predistortion. */
532 	uint16_t			sc_gain1[AR_MAX_CHAINS];
533 	uint32_t			sc_txgain[AR9003_TX_GAIN_TABLE_SIZE];
534 	int16_t				sc_pa_in[AR_MAX_CHAINS]
535 					     [AR9003_PAPRD_MEM_TAB_SIZE];
536 	int16_t				sc_angle[AR_MAX_CHAINS]
537 					     [AR9003_PAPRD_MEM_TAB_SIZE];
538 	int32_t				sc_trainpow;
539 	uint8_t				sc_paprd_curchain;
540 
541 	uint32_t			sc_rwbuf[64];
542 
543 	size_t				sc_kc_entries;
544 
545 	void				*sc_eep;
546 	const void			*sc_eep_def;
547 	uint32_t			sc_eep_base;
548 	uint32_t			sc_eep_size;
549 
550 	struct athn_rxq			sc_rxq[2];
551 	struct athn_txq			sc_txq[31];
552 
553 	void				*sc_descs;
554 	bus_dmamap_t			sc_map;
555 	bus_dma_segment_t		sc_seg;
556 	SIMPLEQ_HEAD(, athn_tx_buf)	sc_txbufs;
557 	struct athn_tx_buf		*sc_bcnbuf;
558 	struct athn_tx_buf		sc_txpool[ATHN_NTXBUFS];
559 
560 	bus_dmamap_t			sc_txsmap;
561 	bus_dma_segment_t		sc_txsseg;
562 	void				*sc_txsring;
563 	int				sc_txscur;
564 
565 	int				sc_if_flags;
566 	int				sc_tx_timer;
567 
568 	const struct athn_ini		*sc_ini;
569 	const struct athn_gain		*sc_rx_gain;
570 	const struct athn_gain		*sc_tx_gain;
571 	const struct athn_addac		*sc_addac;
572 	const struct athn_serdes	*sc_serdes;
573 	uint32_t			sc_workaround;
574 	uint32_t			sc_obs_off;
575 	uint32_t			sc_gpio_input_en_off;
576 
577 	struct athn_ops			sc_ops;
578 
579 	int				sc_fixed_ridx;
580 
581 	int16_t				sc_cca_min_2g;
582 	int16_t				sc_cca_max_2g;
583 	int16_t				sc_cca_min_5g;
584 	int16_t				sc_cca_max_5g;
585 	int16_t				sc_def_nf;
586 	struct {
587 		int16_t	nf[AR_MAX_CHAINS];
588 		int16_t	nf_ext[AR_MAX_CHAINS];
589 	}				sc_nf_hist[ATHN_NF_CAL_HIST_MAX];
590 	int				sc_nf_hist_cur;
591 	int16_t				sc_nf_priv[AR_MAX_CHAINS];
592 	int16_t				sc_nf_ext_priv[AR_MAX_CHAINS];
593 	int				sc_pa_calib_ticks;
594 
595 	struct athn_calib		sc_calib;
596 	struct athn_ani			sc_ani;
597 
598 	struct bpf_if *			sc_drvbpf;
599 
600 	union {
601 		struct athn_rx_radiotap_header th;
602 		uint8_t pad[IEEE80211_RADIOTAP_HDRLEN];
603 	} sc_rxtapu;
604 #define sc_rxtap			sc_rxtapu.th
605 	int				sc_rxtap_len;
606 
607 	union {
608 		struct athn_tx_radiotap_header th;
609 		uint8_t pad[IEEE80211_RADIOTAP_HDRLEN];
610 	} sc_txtapu;
611 #define sc_txtap			sc_txtapu.th
612 	int				sc_txtap_len;
613 
614 	/*
615 	 * Attach overrides.  Set before calling athn_attach().
616 	 */
617 	int				sc_max_aid;
618 	int				(*sc_media_change)(struct ifnet *);
619 };
620 
621 int	athn_attach(struct athn_softc *);
622 void	athn_detach(struct athn_softc *);
623 void	athn_suspend(struct athn_softc *);
624 bool	athn_resume(struct athn_softc *);
625 int	athn_intr(void *);
626 
627 /* used by if_athn_usb.c */
628 void	athn_btcoex_init(struct athn_softc *);
629 int	athn_hw_reset(struct athn_softc *, struct ieee80211_channel *,
630 	    struct ieee80211_channel *, int);
631 void	athn_init_pll(struct athn_softc *, const struct ieee80211_channel *);
632 void	athn_led_init(struct athn_softc *);
633 int	athn_reset(struct athn_softc *, int);
634 void	athn_reset_key(struct athn_softc *, int);
635 void	athn_rx_start(struct athn_softc *);
636 void	athn_set_bss(struct athn_softc *, struct ieee80211_node *);
637 int	athn_set_chan(struct athn_softc *, struct ieee80211_channel *,
638 	    struct ieee80211_channel *);
639 void	athn_set_hostap_timers(struct athn_softc *);
640 void	athn_set_led(struct athn_softc *, int);
641 void	athn_set_opmode(struct athn_softc *);
642 int	athn_set_power_awake(struct athn_softc *);
643 void	athn_set_power_sleep(struct athn_softc *);
644 void	athn_set_rxfilter(struct athn_softc *, uint32_t);
645 void	athn_set_sta_timers(struct athn_softc *);
646 void	athn_updateslot(struct ifnet *);
647 
648 #ifdef notyet_edca
649 void	athn_updateedca(struct ieee80211com *);
650 #endif
651 #ifdef notyet
652 void	athn_delete_key(struct ieee80211com *, struct ieee80211_node *,
653 	    struct ieee80211_key *);
654 int	athn_set_key(struct ieee80211com *, struct ieee80211_node *,
655 	    struct ieee80211_key *);
656 #endif /* notyet */
657 
658 /* used by ar9285.c */
659 uint8_t	athn_chan2fbin(struct ieee80211_channel *);
660 void	athn_get_pier_ival(uint8_t, const uint8_t *, int, int *, int *);
661 
662 /* used by arn5008.c and arn9003.c */
663 void	athn_config_nonpcie(struct athn_softc *);
664 void	athn_config_pcie(struct athn_softc *);
665 void	athn_get_delta_slope(uint32_t, uint32_t *, uint32_t *);
666 void	athn_inc_tx_trigger_level(struct athn_softc *);
667 void	athn_stop(struct ifnet *, int);
668 void	athn_stop_tx_dma(struct athn_softc *, int);
669 int	athn_tx_pending(struct athn_softc *, int);
670 int	athn_txtime(struct athn_softc *, int, int, u_int);
671 
672 /* used by arn5008.c, arn9003.c, arn9287.c, and arn9380.c */
673 int	athn_interpolate(int, int, int, int, int);
674 
675 #endif /* _ATHNVAR_H_ */
676