xref: /openbsd/sys/dev/ic/athvar.h (revision a6445c1d)
1 /*      $OpenBSD: athvar.h,v 1.32 2011/04/27 16:06:13 deraadt Exp $  */
2 /*	$NetBSD: athvar.h,v 1.10 2004/08/10 01:03:53 dyoung Exp $	*/
3 
4 /*-
5  * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting
6  * All rights reserved.
7  *
8  * Redistribution and use in source and binary forms, with or without
9  * modification, are permitted provided that the following conditions
10  * are met:
11  * 1. Redistributions of source code must retain the above copyright
12  *    notice, this list of conditions and the following disclaimer,
13  *    without modification.
14  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
15  *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
16  *    redistribution must be conditioned upon including a substantially
17  *    similar Disclaimer requirement for further binary redistribution.
18  * 3. Neither the names of the above-listed copyright holders nor the names
19  *    of any contributors may be used to endorse or promote products derived
20  *    from this software without specific prior written permission.
21  *
22  * NO WARRANTY
23  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
24  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
25  * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
26  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
27  * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
28  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
29  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
30  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
31  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
32  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
33  * THE POSSIBILITY OF SUCH DAMAGES.
34  *
35  * $FreeBSD: src/sys/dev/ath/if_athvar.h,v 1.14 2004/04/03 03:33:02 sam Exp $
36  */
37 
38 /*
39  * Definitions for the Atheros Wireless LAN controller driver.
40  */
41 #ifndef _DEV_ATH_ATHVAR_H
42 #define _DEV_ATH_ATHVAR_H
43 
44 #ifdef _KERNEL
45 
46 #include <net80211/ieee80211_radiotap.h>
47 #include <dev/ic/ar5xxx.h>
48 
49 #include "bpfilter.h"
50 
51 #ifdef notyet
52 #include "gpio.h"
53 #endif
54 
55 #define	ATH_TIMEOUT		1000
56 
57 #define	ATH_RXBUF	40		/* number of RX buffers */
58 #define	ATH_TXBUF	60		/* number of TX buffers */
59 #define	ATH_TXDESC	8		/* number of descriptors per buffer */
60 #define ATH_MAXGPIO	10		/* maximal number of gpio pins */
61 
62 struct ath_recv_hist {
63 	int		arh_ticks;	/* sample time by system clock */
64 	u_int8_t	arh_rssi;	/* rssi */
65 	u_int8_t	arh_antenna;	/* antenna */
66 };
67 #define	ATH_RHIST_SIZE		16	/* number of samples */
68 #define	ATH_RHIST_NOTIME	(~0)
69 
70 /*
71  * Ioctl-related definitions for the Atheros Wireless LAN controller driver.
72  */
73 struct ath_stats {
74 	u_int32_t	ast_watchdog;	/* device reset by watchdog */
75 	u_int32_t	ast_hardware;	/* fatal hardware error interrupts */
76 	u_int32_t	ast_bmiss;	/* beacon miss interrupts */
77 	u_int32_t	ast_mib;	/* MIB counter interrupts */
78 	u_int32_t	ast_rxorn;	/* rx overrun interrupts */
79 	u_int32_t	ast_rxeol;	/* rx eol interrupts */
80 	u_int32_t	ast_txurn;	/* tx underrun interrupts */
81 	u_int32_t	ast_intrcoal;	/* interrupts coalesced */
82 	u_int32_t	ast_tx_mgmt;	/* management frames transmitted */
83 	u_int32_t	ast_tx_discard;	/* frames discarded prior to assoc */
84 	u_int32_t	ast_tx_qstop;	/* output stopped 'cuz no buffer */
85 	u_int32_t	ast_tx_encap;	/* tx encapsulation failed */
86 	u_int32_t	ast_tx_nonode;	/* tx failed 'cuz no node */
87 	u_int32_t	ast_tx_nombuf;	/* tx failed 'cuz no mbuf */
88 	u_int32_t	ast_tx_nomcl;	/* tx failed 'cuz no cluster */
89 	u_int32_t	ast_tx_linear;	/* tx linearized to cluster */
90 	u_int32_t	ast_tx_nodata;	/* tx discarded empty frame */
91 	u_int32_t	ast_tx_busdma;	/* tx failed for dma resrcs */
92 	u_int32_t	ast_tx_xretries;/* tx failed 'cuz too many retries */
93 	u_int32_t	ast_tx_fifoerr;	/* tx failed 'cuz FIFO underrun */
94 	u_int32_t	ast_tx_filtered;/* tx failed 'cuz xmit filtered */
95 	u_int32_t	ast_tx_shortretry;/* tx on-chip retries (short) */
96 	u_int32_t	ast_tx_longretry;/* tx on-chip retries (long) */
97 	u_int32_t	ast_tx_badrate;	/* tx failed 'cuz bogus xmit rate */
98 	u_int32_t	ast_tx_noack;	/* tx frames with no ack marked */
99 	u_int32_t	ast_tx_rts;	/* tx frames with rts enabled */
100 	u_int32_t	ast_tx_cts;	/* tx frames with cts enabled */
101 	u_int32_t	ast_tx_shortpre;/* tx frames with short preamble */
102 	u_int32_t	ast_tx_altrate;	/* tx frames with alternate rate */
103 	u_int32_t	ast_tx_protect;	/* tx frames with protection */
104 	u_int32_t	ast_rx_nombuf;	/* rx setup failed 'cuz no mbuf */
105 	u_int32_t	ast_rx_busdma;	/* rx setup failed for dma resrcs */
106 	u_int32_t	ast_rx_orn;	/* rx failed 'cuz of desc overrun */
107 	u_int32_t	ast_rx_crcerr;	/* rx failed 'cuz of bad CRC */
108 	u_int32_t	ast_rx_fifoerr;	/* rx failed 'cuz of FIFO overrun */
109 	u_int32_t	ast_rx_badcrypt;/* rx failed 'cuz decryption */
110 	u_int32_t	ast_rx_phyerr;	/* rx failed 'cuz of PHY err */
111 	u_int32_t	ast_rx_phy[32];	/* rx PHY error per-code counts */
112 	u_int32_t	ast_rx_tooshort;/* rx discarded 'cuz frame too short */
113 	u_int32_t	ast_rx_toobig;	/* rx discarded 'cuz frame too large */
114 	u_int32_t	ast_rx_ctl;	/* rx discarded 'cuz ctl frame */
115 	u_int32_t	ast_be_nombuf;	/* beacon setup failed 'cuz no mbuf */
116 	u_int32_t	ast_per_cal;	/* periodic calibration calls */
117 	u_int32_t	ast_per_calfail;/* periodic calibration failed */
118 	u_int32_t	ast_per_rfgain;	/* periodic calibration rfgain reset */
119 	u_int32_t	ast_rate_calls;	/* rate control checks */
120 	u_int32_t	ast_rate_raise;	/* rate control raised xmit rate */
121 	u_int32_t	ast_rate_drop;	/* rate control dropped xmit rate */
122 };
123 
124 /*
125  * Radio capture format.
126  */
127 #define ATH_RX_RADIOTAP_PRESENT (		\
128 	(1 << IEEE80211_RADIOTAP_FLAGS)		| \
129 	(1 << IEEE80211_RADIOTAP_RATE)		| \
130 	(1 << IEEE80211_RADIOTAP_CHANNEL)	| \
131 	(1 << IEEE80211_RADIOTAP_ANTENNA)	| \
132 	(1 << IEEE80211_RADIOTAP_RSSI)		| \
133 	0)
134 
135 struct ath_rx_radiotap_header {
136 	struct ieee80211_radiotap_header wr_ihdr;
137 	u_int8_t	wr_flags;
138 	u_int8_t	wr_rate;
139 	u_int16_t	wr_chan_freq;
140 	u_int16_t	wr_chan_flags;
141 	u_int8_t	wr_antenna;
142 	u_int8_t	wr_rssi;
143 	u_int8_t	wr_max_rssi;
144 } __packed;
145 
146 #define ATH_TX_RADIOTAP_PRESENT (		\
147 	(1 << IEEE80211_RADIOTAP_FLAGS)		| \
148 	(1 << IEEE80211_RADIOTAP_RATE)		| \
149 	(1 << IEEE80211_RADIOTAP_CHANNEL)	| \
150 	(1 << IEEE80211_RADIOTAP_DBM_TX_POWER)	| \
151 	(1 << IEEE80211_RADIOTAP_ANTENNA)	| \
152 	(1 << IEEE80211_RADIOTAP_HWQUEUE)	| \
153 	0)
154 
155 struct ath_tx_radiotap_header {
156 	struct ieee80211_radiotap_header wt_ihdr;
157 	u_int8_t	wt_flags;
158 	u_int8_t	wt_rate;
159 	u_int16_t	wt_chan_freq;
160 	u_int16_t	wt_chan_flags;
161 	u_int8_t	wt_txpower;
162 	u_int8_t	wt_antenna;
163 	u_int8_t	wt_hwqueue;
164 } __packed;
165 
166 /*
167  * driver-specific node
168  */
169 struct ath_node {
170 	struct ieee80211_node		an_node;	/* base class */
171 	struct ieee80211_rssadapt	an_rssadapt;	/* rate adaption */
172 	u_int				an_tx_antenna;	/* antenna for last good frame */
173 	u_int				an_rx_antenna;	/* antenna for last rcvd frame */
174 	struct ath_recv_hist		an_rx_hist[ATH_RHIST_SIZE];
175 	u_int				an_rx_hist_next;/* index of next ``free entry'' */
176 };
177 #define	ATH_NODE(_n)	((struct ath_node *)(_n))
178 
179 struct ath_buf {
180 	TAILQ_ENTRY(ath_buf)		bf_list;
181 	bus_dmamap_t			bf_dmamap;	/* DMA map of the buffer */
182 #define bf_nseg				bf_dmamap->dm_nsegs
183 #define bf_mapsize			bf_dmamap->dm_mapsize
184 #define bf_segs				bf_dmamap->dm_segs
185 	struct ath_desc			*bf_desc;	/* virtual addr of desc */
186 	bus_addr_t			bf_daddr;	/* physical addr of desc */
187 	struct mbuf			*bf_m;		/* mbuf for buf */
188 	struct ieee80211_node		*bf_node;	/* pointer to the node */
189 	struct ieee80211_rssdesc	bf_id;
190 #define	ATH_MAX_SCATTER			64
191 };
192 
193 typedef struct ath_task {
194 	void	(*t_func)(void*, int);
195 	void	*t_context;
196 } ath_task_t;
197 
198 struct ath_softc {
199 #ifndef __FreeBSD__
200 	struct device		sc_dev;
201 #endif
202 	struct ieee80211com	sc_ic;		/* IEEE 802.11 common */
203 #ifndef __FreeBSD__
204 	int			(*sc_enable)(struct ath_softc *);
205 	void			(*sc_disable)(struct ath_softc *);
206 	void			(*sc_power)(struct ath_softc *, int);
207 #endif
208 	int			(*sc_newstate)(struct ieee80211com *,
209 					enum ieee80211_state, int);
210 	void			(*sc_node_free)(struct ieee80211com *,
211 					struct ieee80211_node *);
212 	void			(*sc_node_copy)(struct ieee80211com *,
213 					struct ieee80211_node *,
214 					const struct ieee80211_node *);
215 	void			(*sc_recv_mgmt)(struct ieee80211com *,
216 				    struct mbuf *, struct ieee80211_node *,
217 				    struct ieee80211_rxinfo *, int);
218 #ifdef __FreeBSD__
219 	device_t		sc_dev;
220 #endif
221 	bus_space_tag_t		sc_st;		/* bus space tag */
222 	bus_space_handle_t	sc_sh;		/* bus space handle */
223 	bus_size_t		sc_ss;		/* bus space size */
224 	bus_dma_tag_t		sc_dmat;	/* bus DMA tag */
225 #ifdef __FreeBSD__
226 	struct mtx		sc_mtx;		/* master lock (recursive) */
227 #endif
228 	struct ath_hal		*sc_ah;		/* Atheros HAL */
229 	unsigned int		sc_invalid : 1,	/* disable hardware accesses */
230 				sc_doani : 1,	/* dynamic noise immunity */
231 				sc_veol : 1,	/* tx VEOL support */
232 				sc_softled : 1,	/* GPIO software LED */
233 				sc_probing : 1,	/* probing AP on beacon miss */
234 				sc_pcie : 1;	/* indicates PCI Express */
235 	u_int			sc_nchan;	/* number of valid channels */
236 	const HAL_RATE_TABLE	*sc_rates[IEEE80211_MODE_MAX];
237 	const HAL_RATE_TABLE	*sc_currates;	/* current rate table */
238 	enum ieee80211_phymode	sc_curmode;	/* current phy mode */
239 	u_int8_t		sc_rixmap[256];	/* IEEE to h/w rate table ix */
240 	u_int8_t		sc_hwmap[32];	/* h/w rate ix to IEEE table */
241 	HAL_INT			sc_imask;	/* interrupt mask copy */
242 
243 #if NBPFILTER > 0
244 	caddr_t			sc_drvbpf;
245 
246 	union {
247 		struct ath_rx_radiotap_header	th;
248 		uint8_t				pad[IEEE80211_RADIOTAP_HDRLEN];
249 	}			sc_rxtapu;
250 #define sc_rxtap		sc_rxtapu.th
251 	int			sc_rxtap_len;
252 
253 	union {
254 		struct ath_tx_radiotap_header	th;
255 		uint8_t				pad[IEEE80211_RADIOTAP_HDRLEN];
256 	}			sc_txtapu;
257 #define sc_txtap		sc_txtapu.th
258 	int			sc_txtap_len;
259 #endif
260 
261 	struct ath_desc		*sc_desc;	/* TX/RX descriptors */
262 	bus_dma_segment_t	sc_dseg;
263 	int			sc_dnseg;	/* number of segments */
264 	bus_dmamap_t		sc_ddmamap;	/* DMA map for descriptors */
265 	bus_addr_t		sc_desc_paddr;	/* physical addr of sc_desc */
266 	bus_addr_t		sc_desc_len;	/* size of sc_desc */
267 
268 	ath_task_t		sc_fataltask;	/* fatal int processing */
269 	ath_task_t		sc_rxorntask;	/* rxorn int processing */
270 
271 	TAILQ_HEAD(, ath_buf)	sc_rxbuf;	/* receive buffer */
272 	u_int32_t		*sc_rxlink;	/* link ptr in last RX desc */
273 	ath_task_t		sc_rxtask;	/* rx int processing */
274 
275 	u_int			sc_txhalq[HAL_NUM_TX_QUEUES];	/* HAL q for outgoing frames */
276 	u_int32_t		*sc_txlink;	/* link ptr in last TX desc */
277 	int			sc_tx_timer;	/* transmit timeout */
278 	TAILQ_HEAD(, ath_buf)	sc_txbuf;	/* transmit buffer */
279 #ifdef __FreeBSD__
280 	struct mtx		sc_txbuflock;	/* txbuf lock */
281 #endif
282 	TAILQ_HEAD(, ath_buf)	sc_txq;		/* transmitting queue */
283 #ifdef __FreeBSD__
284 	struct mtx		sc_txqlock;	/* lock on txq and txlink */
285 #endif
286 	ath_task_t		sc_txtask;	/* tx int processing */
287 
288 	u_int			sc_bhalq;	/* HAL q for outgoing beacons */
289 	struct ath_buf		*sc_bcbuf;	/* beacon buffer */
290 	struct ath_buf		*sc_bufptr;	/* allocated buffer ptr */
291 	ath_task_t		sc_swbatask;	/* swba int processing */
292 	ath_task_t		sc_bmisstask;	/* bmiss int processing */
293 
294 #ifdef __OpenBSD__
295 	struct timeval		sc_last_ch;
296 	struct timeout		sc_cal_to;
297 	struct timeval		sc_last_beacon;
298 	struct timeout		sc_scan_to;
299 	struct timeout		sc_rssadapt_to;
300 #else
301 	struct callout		sc_cal_ch;	/* callout handle for cals */
302 	struct callout		sc_scan_ch;	/* callout handle for scan */
303 #endif
304 	struct ath_stats	sc_stats;	/* interface statistics */
305 	HAL_MIB_STATS		sc_mib_stats;	/* MIB counter statistics */
306 
307 #ifndef __FreeBSD__
308 	u_int			sc_flags;	/* misc flags */
309 #endif
310 
311 	u_int8_t                sc_broadcast_addr[IEEE80211_ADDR_LEN];
312 
313 	struct gpio_chipset_tag sc_gpio_gc;	/* gpio(4) framework */
314 	gpio_pin_t		sc_gpio_pins[ATH_MAXGPIO];
315 };
316 
317 /* unaligned little endian access */
318 #define LE_READ_2(p)							\
319 	((u_int16_t)							\
320 	 ((((u_int8_t *)(p))[0]      ) | (((u_int8_t *)(p))[1] <<  8)))
321 #define LE_READ_4(p)							\
322 	((u_int32_t)							\
323 	 ((((u_int8_t *)(p))[0]      ) | (((u_int8_t *)(p))[1] <<  8) |	\
324 	 (((u_int8_t *)(p))[2] << 16) | (((u_int8_t *)(p))[3] << 24)))
325 
326 #ifdef AR_DEBUG
327 enum {
328 	ATH_DEBUG_XMIT		= 0x00000001,	/* basic xmit operation */
329 	ATH_DEBUG_XMIT_DESC	= 0x00000002,	/* xmit descriptors */
330 	ATH_DEBUG_RECV		= 0x00000004,	/* basic recv operation */
331 	ATH_DEBUG_RECV_DESC	= 0x00000008,	/* recv descriptors */
332 	ATH_DEBUG_RATE		= 0x00000010,	/* rate control */
333 	ATH_DEBUG_RESET		= 0x00000020,	/* reset processing */
334 	ATH_DEBUG_MODE		= 0x00000040,	/* mode init/setup */
335 	ATH_DEBUG_BEACON	= 0x00000080,	/* beacon handling */
336 	ATH_DEBUG_WATCHDOG	= 0x00000100,	/* watchdog timeout */
337 	ATH_DEBUG_INTR		= 0x00001000,	/* ISR */
338 	ATH_DEBUG_TX_PROC	= 0x00002000,	/* tx ISR proc */
339 	ATH_DEBUG_RX_PROC	= 0x00004000,	/* rx ISR proc */
340 	ATH_DEBUG_BEACON_PROC	= 0x00008000,	/* beacon ISR proc */
341 	ATH_DEBUG_CALIBRATE	= 0x00010000,	/* periodic calibration */
342 	ATH_DEBUG_ANY		= 0xffffffff
343 };
344 #define	IFF_DUMPPKTS(_ifp, _m) \
345 	((ath_debug & _m) || \
346 	    ((_ifp)->if_flags & (IFF_DEBUG|IFF_LINK2)) == (IFF_DEBUG|IFF_LINK2))
347 #define	DPRINTF(_m,X)	if (ath_debug & (_m)) printf X
348 #else
349 #define	IFF_DUMPPKTS(_ifp, _m) \
350 	(((_ifp)->if_flags & (IFF_DEBUG|IFF_LINK2)) == (IFF_DEBUG|IFF_LINK2))
351 #define	DPRINTF(_m, X)
352 #endif
353 
354 /*
355  * Wrapper code
356  */
357 #ifndef __FreeBSD__
358 #undef KASSERT
359 #define KASSERT(cond, complaint) if (!(cond)) panic complaint
360 
361 #define	ATH_ATTACHED		0x0001		/* attach has succeeded */
362 #define ATH_ENABLED		0x0002		/* chip is enabled */
363 #define ATH_GPIO		0x0004		/* gpio device attached */
364 
365 #define	ATH_IS_ENABLED(sc)	((sc)->sc_flags & ATH_ENABLED)
366 #endif
367 
368 #define	ATH_LOCK_INIT(_sc) \
369 	mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \
370 		 MTX_NETWORK_LOCK, MTX_DEF | MTX_RECURSE)
371 #define	ATH_LOCK_DESTROY(_sc)	mtx_destroy(&(_sc)->sc_mtx)
372 #define	ATH_LOCK(_sc)		mtx_lock(&(_sc)->sc_mtx)
373 #define	ATH_UNLOCK(_sc)		mtx_unlock(&(_sc)->sc_mtx)
374 #define	ATH_LOCK_ASSERT(_sc)	mtx_assert(&(_sc)->sc_mtx, MA_OWNED)
375 
376 #define	ATH_TXBUF_LOCK_INIT(_sc) \
377 	mtx_init(&(_sc)->sc_txbuflock, \
378 		device_get_nameunit((_sc)->sc_dev), "xmit buf q", MTX_DEF)
379 #define	ATH_TXBUF_LOCK_DESTROY(_sc)	mtx_destroy(&(_sc)->sc_txbuflock)
380 #define	ATH_TXBUF_LOCK(_sc)		mtx_lock(&(_sc)->sc_txbuflock)
381 #define	ATH_TXBUF_UNLOCK(_sc)		mtx_unlock(&(_sc)->sc_txbuflock)
382 #define	ATH_TXBUF_LOCK_ASSERT(_sc) \
383 	mtx_assert(&(_sc)->sc_txbuflock, MA_OWNED)
384 
385 #define	ATH_TXQ_LOCK_INIT(_sc) \
386 	mtx_init(&(_sc)->sc_txqlock, \
387 		device_get_nameunit((_sc)->sc_dev), "xmit q", MTX_DEF)
388 #define	ATH_TXQ_LOCK_DESTROY(_sc)	mtx_destroy(&(_sc)->sc_txqlock)
389 #define	ATH_TXQ_LOCK(_sc)		mtx_lock(&(_sc)->sc_txqlock)
390 #define	ATH_TXQ_UNLOCK(_sc)		mtx_unlock(&(_sc)->sc_txqlock)
391 #define	ATH_TXQ_LOCK_ASSERT(_sc)	mtx_assert(&(_sc)->sc_txqlock, MA_OWNED)
392 
393 #define ATH_TICKS() (tick)
394 #define ATH_CALLOUT_INIT(chp) callout_init((chp))
395 #define ATH_TASK_INIT(task, func, context)	\
396 	do {					\
397 		(task)->t_func = (func);	\
398 		(task)->t_context = (context);	\
399 	} while (0)
400 #define ATH_TASK_RUN_OR_ENQUEUE(task) ((*(task)->t_func)((task)->t_context, 1))
401 
402 typedef unsigned long u_intptr_t;
403 
404 int	ath_attach(u_int16_t, struct ath_softc *);
405 int	ath_detach(struct ath_softc *, int);
406 int	ath_enable(struct ath_softc *);
407 int	ath_activate(struct device *, int);
408 int	ath_intr(void *);
409 int	ath_enable(struct ath_softc *);
410 
411 /*
412  * HAL definitions to comply with local coding convention.
413  */
414 #define	ath_hal_reset(_ah, _opmode, _chan, _outdoor, _pstatus) \
415 	((*(_ah)->ah_reset)((_ah), (_opmode), (_chan), (_outdoor), (_pstatus)))
416 #define	ath_hal_get_rate_table(_ah, _mode) \
417 	((*(_ah)->ah_get_rate_table)((_ah), (_mode)))
418 #define	ath_hal_get_lladdr(_ah, _mac) \
419 	((*(_ah)->ah_get_lladdr)((_ah), (_mac)))
420 #define	ath_hal_set_lladdr(_ah, _mac) \
421 	((*(_ah)->ah_set_lladdr)((_ah), (_mac)))
422 #define	ath_hal_set_intr(_ah, _mask) \
423 	((*(_ah)->ah_set_intr)((_ah), (_mask)))
424 #define	ath_hal_get_intr(_ah) \
425 	((*(_ah)->ah_get_intr)((_ah)))
426 #define	ath_hal_is_intr_pending(_ah) \
427 	((*(_ah)->ah_is_intr_pending)((_ah)))
428 #define	ath_hal_get_isr(_ah, _pmask) \
429 	((*(_ah)->ah_get_isr)((_ah), (_pmask)))
430 #define	ath_hal_update_tx_triglevel(_ah, _inc) \
431 	((*(_ah)->ah_update_tx_triglevel)((_ah), (_inc)))
432 #define	ath_hal_set_power(_ah, _mode, _sleepduration) \
433 	((*(_ah)->ah_set_power)((_ah), (_mode), AH_TRUE, (_sleepduration)))
434 #define	ath_hal_reset_key(_ah, _ix) \
435 	((*(_ah)->ah_reset_key)((_ah), (_ix)))
436 #define	ath_hal_set_key(_ah, _ix, _pk) \
437 	((*(_ah)->ah_set_key)((_ah), (_ix), (_pk), NULL, AH_FALSE))
438 #define	ath_hal_is_key_valid(_ah, _ix) \
439 	(((*(_ah)->ah_is_key_valid)((_ah), (_ix))))
440 #define	ath_hal_set_key_lladdr(_ah, _ix, _mac) \
441 	((*(_ah)->ah_set_key_lladdr)((_ah), (_ix), (_mac)))
442 #define	ath_hal_softcrypto(_ah, _val ) \
443 	((*(_ah)->ah_softcrypto)((_ah), (_val)))
444 #define	ath_hal_get_rx_filter(_ah) \
445 	((*(_ah)->ah_get_rx_filter)((_ah)))
446 #define	ath_hal_set_rx_filter(_ah, _filter) \
447 	((*(_ah)->ah_set_rx_filter)((_ah), (_filter)))
448 #define	ath_hal_set_mcast_filter(_ah, _mfilt0, _mfilt1) \
449 	((*(_ah)->ah_set_mcast_filter)((_ah), (_mfilt0), (_mfilt1)))
450 #define	ath_hal_wait_for_beacon(_ah, _bf) \
451 	((*(_ah)->ah_wait_for_beacon)((_ah), (_bf)->bf_daddr))
452 #define	ath_hal_put_rx_buf(_ah, _bufaddr) \
453 	((*(_ah)->ah_put_rx_buf)((_ah), (_bufaddr)))
454 #define	ath_hal_get_tsf32(_ah) \
455 	((*(_ah)->ah_get_tsf32)((_ah)))
456 #define	ath_hal_get_tsf64(_ah) \
457 	((*(_ah)->ah_get_tsf64)((_ah)))
458 #define	ath_hal_reset_tsf(_ah) \
459 	((*(_ah)->ah_reset_tsf)((_ah)))
460 #define	ath_hal_start_rx(_ah) \
461 	((*(_ah)->ah_start_rx)((_ah)))
462 #define	ath_hal_put_tx_buf(_ah, _q, _bufaddr) \
463 	((*(_ah)->ah_put_tx_buf)((_ah), (_q), (_bufaddr)))
464 #define	ath_hal_get_tx_buf(_ah, _q) \
465 	((*(_ah)->ah_get_tx_buf)((_ah), (_q)))
466 #define	ath_hal_get_rx_buf(_ah) \
467 	((*(_ah)->ah_get_rx_buf)((_ah)))
468 #define	ath_hal_tx_start(_ah, _q) \
469 	((*(_ah)->ah_tx_start)((_ah), (_q)))
470 #define	ath_hal_setchannel(_ah, _chan) \
471 	((*(_ah)->ah_setchannel)((_ah), (_chan)))
472 #define	ath_hal_calibrate(_ah, _chan) \
473 	((*(_ah)->ah_calibrate)((_ah), (_chan)))
474 #define	ath_hal_set_ledstate(_ah, _state) \
475 	((*(_ah)->ah_set_ledstate)((_ah), (_state)))
476 #define	ath_hal_init_beacon(_ah, _nextb, _bperiod) \
477 	((*(_ah)->ah_init_beacon)((_ah), (_nextb), (_bperiod)))
478 #define	ath_hal_reset_beacon(_ah) \
479 	((*(_ah)->ah_reset_beacon)((_ah)))
480 #define	ath_hal_set_beacon_timers(_ah, _bs, _tsf, _dc, _cc) \
481 	((*(_ah)->ah_set_beacon_timers)((_ah), (_bs), (_tsf), \
482 	 (_dc), (_cc)))
483 #define	ath_hal_set_associd(_ah, _bss, _associd) \
484 	((*(_ah)->ah_set_associd)((_ah), (_bss), (_associd), 0))
485 #define	ath_hal_get_regdomain(_ah, _prd) \
486 	(*(_prd) = (_ah)->ah_get_regdomain(_ah))
487 #define	ath_hal_detach(_ah) \
488 	((*(_ah)->ah_detach)(_ah))
489 #define ath_hal_set_slot_time(_ah, _t) \
490 	((*(_ah)->ah_set_slot_time)(_ah, _t))
491 #define ath_hal_set_gpio_output(_ah, _gpio) \
492 	((*(_ah)->ah_set_gpio_output)((_ah), (_gpio)))
493 #define ath_hal_set_gpio_input(_ah, _gpio) \
494 	((*(_ah)->ah_set_gpio_input)((_ah), (_gpio)))
495 #define ath_hal_get_gpio(_ah, _gpio) \
496 	((*(_ah)->ah_get_gpio)((_ah), (_gpio)))
497 #define ath_hal_set_gpio(_ah, _gpio, _b) \
498 	((*(_ah)->ah_set_gpio)((_ah), (_gpio), (_b)))
499 #define ath_hal_set_gpio_intr(_ah, _gpio, _b) \
500 	((*(_ah)->ah_set_gpio_intr)((_ah), (_gpio), (_b)))
501 
502 #define	ath_hal_set_opmode(_ah) \
503 	((*(_ah)->ah_set_opmode)((_ah)))
504 #define	ath_hal_stop_tx_dma(_ah, _qnum) \
505 	((*(_ah)->ah_stop_tx_dma)((_ah), (_qnum)))
506 #define	ath_hal_stop_pcu_recv(_ah) \
507 	((*(_ah)->ah_stop_pcu_recv)((_ah)))
508 #define	ath_hal_start_rx_pcu(_ah) \
509 	((*(_ah)->ah_start_rx_pcu)((_ah)))
510 #define	ath_hal_stop_rx_dma(_ah) \
511 	((*(_ah)->ah_stop_rx_dma)((_ah)))
512 #define	ath_hal_get_diag_state(_ah, _id, _indata, _insize, _outdata, _outsize) \
513 	((*(_ah)->ah_get_diag_state)((_ah), (_id), \
514 	 (_indata), (_insize), (_outdata), (_outsize)))
515 
516 #define	ath_hal_setup_tx_queue(_ah, _type, _qinfo) \
517 	((*(_ah)->ah_setup_tx_queue)((_ah), (_type), (_qinfo)))
518 #define	ath_hal_reset_tx_queue(_ah, _q) \
519 	((*(_ah)->ah_reset_tx_queue)((_ah), (_q)))
520 #define	ath_hal_release_tx_queue(_ah, _q) \
521 	((*(_ah)->ah_release_tx_queue)((_ah), (_q)))
522 #define	ath_hal_has_veol(_ah) \
523 	((*(_ah)->ah_has_veol)((_ah)))
524 #define ath_hal_update_mib_counters(_ah, _stats) \
525 	((*(_ah)->ah_update_mib_counters)((_ah), (_stats)))
526 #define	ath_hal_get_rf_gain(_ah) \
527 	((*(_ah)->ah_get_rf_gain)((_ah)))
528 #define	ath_hal_set_rx_signal(_ah) \
529 	((*(_ah)->ah_set_rx_signal)((_ah)))
530 
531 #define	ath_hal_setup_rx_desc(_ah, _ds, _size, _intreq) \
532 	((*(_ah)->ah_setup_rx_desc)((_ah), (_ds), (_size), (_intreq)))
533 #define	ath_hal_proc_rx_desc(_ah, _ds, _dspa, _dsnext) \
534 	((*(_ah)->ah_proc_rx_desc)((_ah), (_ds), (_dspa), (_dsnext)))
535 #define	ath_hal_setup_tx_desc(_ah, _ds, _plen, _hlen, _atype, _txpow, \
536 	    _txr0, _txtr0, _keyix, _ant, _flags, \
537 	    _rtsrate, _rtsdura) \
538 	((*(_ah)->ah_setup_tx_desc)((_ah), (_ds), (_plen), (_hlen), (_atype), \
539 	    (_txpow), (_txr0), (_txtr0), (_keyix), (_ant), \
540 	    (_flags), (_rtsrate), (_rtsdura)))
541 #define	ath_hal_setup_xtx_desc(_ah, _ds, \
542 	    _txr1, _txtr1, _txr2, _txtr2, _txr3, _txtr3) \
543 	((*(_ah)->ah_setup_xtx_desc)((_ah), (_ds), \
544 	    (_txr1), (_txtr1), (_txr2), (_txtr2), (_txr3), (_txtr3)))
545 #define	ath_hal_fill_tx_desc(_ah, _ds, _l, _first, _last) \
546 	((*(_ah)->ah_fill_tx_desc)((_ah), (_ds), (_l), (_first), (_last)))
547 #define	ath_hal_proc_tx_desc(_ah, _ds) \
548 	((*(_ah)->ah_proc_tx_desc)((_ah), (_ds)))
549 
550 #endif /* _KERNEL */
551 
552 #define	SIOCGATHSTATS	_IOWR('i', 137, struct ifreq)
553 
554 #endif /* _DEV_ATH_ATHVAR_H */
555