xref: /illumos-gate/usr/src/uts/common/io/ath/ath_impl.h (revision f808c858)
1 /*
2  * Copyright 2005 Sun Microsystems, Inc.  All rights reserved.
3  * Use is subject to license terms.
4  */
5 
6 /*
7  * Copyright (c) 2002-2004 Sam Leffler, Errno Consulting
8  * All rights reserved.
9  *
10  * Redistribution and use in source and binary forms, with or without
11  * modification, are permitted provided that the following conditions
12  * are met:
13  * 1. Redistributions of source code must retain the above copyright
14  *    notice, this list of conditions and the following disclaimer,
15  *    without modification.
16  * 2. Redistributions in binary form must reproduce at minimum a disclaimer
17  *    similar to the "NO WARRANTY" disclaimer below ("Disclaimer") and any
18  *    redistribution must be conditioned upon including a substantially
19  *    similar Disclaimer requirement for further binary redistribution.
20  * 3. Neither the names of the above-listed copyright holders nor the names
21  *    of any contributors may be used to endorse or promote products derived
22  *    from this software without specific prior written permission.
23  *
24  * NO WARRANTY
25  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
26  * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
27  * LIMITED TO, THE IMPLIED WARRANTIES OF NONINFRINGEMENT, MERCHANTIBILITY
28  * AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL
29  * THE COPYRIGHT HOLDERS OR CONTRIBUTORS BE LIABLE FOR SPECIAL, EXEMPLARY,
30  * OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
31  * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
32  * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER
33  * IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
34  * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
35  * THE POSSIBILITY OF SUCH DAMAGES.
36  *
37  */
38 
39 /*
40  * ath_impl.h is a bridge between the HAL and the driver. It
41  * defines some data structures encapsulating the HAL interface
42  * and communicating with the IEEE80211 MAC layer and other
43  * driver components.
44  */
45 
46 #ifndef	_ATH_IMPL_H
47 #define	_ATH_IMPL_H
48 
49 #pragma ident	"%Z%%M%	%I%	%E% SMI"
50 
51 #ifdef __cplusplus
52 extern "C" {
53 #endif
54 
55 /*
56  * Defintions for the Atheros Wireless LAN controller driver.
57  */
58 
59 #include <sys/list.h>
60 #include "ath_ieee80211.h"
61 #include "ath_hal.h"
62 
63 /*
64  * Bit flags in the ath_dbg_flags
65  */
66 #define	ATH_DBG_INIT		0x00000001	/* initialisation	*/
67 #define	ATH_DBG_GLD		0x00000002	/* GLD entry points	*/
68 #define	ATH_DBG_HAL		0x00000004	/* HAL related code	*/
69 #define	ATH_DBG_INT		0x00000008	/* interrupt handler	*/
70 #define	ATH_DBG_RECV		0x00000010	/* receive-side code	*/
71 #define	ATH_DBG_SEND		0x00000020	/* packet-send code	*/
72 #define	ATH_DBG_80211		0x00000040	/* 80211 state machine	*/
73 #define	ATH_DBG_IOCTL		0x00000080	/* ioctl code		*/
74 #define	ATH_DBG_STATS		0x00000100	/* statistics		*/
75 #define	ATH_DBG_RATE		0x00000200	/* rate control		*/
76 #define	ATH_DBG_AUX		0x00000400	/* for ath_aux.c	*/
77 #define	ATH_DBG_WIFICFG		0x00000800	/* wificonfig		*/
78 #define	ATH_DBG_OSDEP		0x00001000	/* osdep		*/
79 #define	ATH_DBG_ATTACH		0x00002000	/* attach		*/
80 #define	ATH_DBG_DETACH		0x00004000	/* detach		*/
81 #define	ATH_DBG_ALL		0x00007fff	/* all			*/
82 
83 #ifdef DEBUG
84 #define	ATH_DDB(command)	do {				\
85 					{ command; }		\
86 					_NOTE(CONSTANTCONDITION)\
87 				} while (0)
88 #else
89 #define	ATH_DDB(command)
90 #endif /* DEBUG */
91 
92 /*
93  * Node type of wifi device
94  */
95 #ifndef DDI_NT_NET_WIFI
96 #define	DDI_NT_NET_WIFI	"ddi_network:wifi"
97 #endif
98 #define	ATH_NODENAME	"ath"
99 
100 #define	ATH_DEBUG(args)		ATH_DDB(ath_dbg args)
101 
102 #define	list_empty(a) ((a)->list_head.list_next == &(a)->list_head)
103 #define	ATH_LE_READ_4(p)						\
104 	((uint32_t)							\
105 	((((uint8_t *)(p))[0]) | (((uint8_t *)(p))[1] <<  8) |		\
106 	(((uint8_t *)(p))[2] << 16) | (((uint8_t *)(p))[3] << 24)))
107 #define	ATH_N(a)	(sizeof (a) / sizeof (a[0]))
108 #define	ATH_TXQ_SETUP(asc, i)	((asc)->asc_txqsetup & (1<<i))
109 #define	ATH_PA2DESC(_asc, _pa) \
110 	((struct ath_desc *)((caddr_t)(_asc)->asc_desc + \
111 	((_pa) - (_asc)->asc_desc_dma.cookie.dmac_address)))
112 /*
113  * Sync a DMA area described by a dma_area_t
114  */
115 #define	ATH_DMA_SYNC(area, flag)    ((void) ddi_dma_sync((area).dma_hdl,    \
116 				(area).offset, (area).alength, (flag)))
117 
118 #define	ATH_TXINTR_PERIOD 5
119 #define	ATH_TIMEOUT	1000
120 #define	ATH_RXBUF	80		/* number of RX buffers */
121 #define	ATH_TXBUF	200		/* number of TX buffers */
122 #define	ATH_TXDESC	1		/* number of descriptors per buffer */
123 #define	ATH_TXMAXTRY	11		/* max number of transmit attempts */
124 
125 /* driver-specific node state */
126 struct ath_node {
127 	struct ieee80211_node an_node;	/* base class */
128 	uint32_t	an_tx_times;	/* rate ctl times on one rate */
129 	uint32_t	an_tx_ok;	/* tx ok pkt */
130 	uint32_t	an_tx_err;	/* tx !ok pkt */
131 	uint32_t	an_tx_retr;	/* tx retry count */
132 	int32_t		an_tx_upper;	/* tx upper rate req cnt */
133 	uint32_t	an_tx_antenna;	/* antenna for last good frame */
134 	uint8_t		an_tx_rix0;	/* series 0 rate index */
135 	uint8_t		an_tx_try0;	/* series 0 try count */
136 	uint8_t		an_tx_mgtrate;	/* h/w rate for management/ctl frames */
137 	uint8_t		an_tx_mgtratesp; /* short preamble h/w rate for " " */
138 	uint8_t		an_tx_rate0;	/* series 0 h/w rate */
139 	uint8_t		an_tx_rate1;	/* series 1 h/w rate */
140 	uint8_t		an_tx_rate2;	/* series 2 h/w rate */
141 	uint8_t		an_tx_rate3;	/* series 3 h/w rate */
142 	uint8_t		an_tx_rate0sp;	/* series 0 short preamble h/w rate */
143 	uint8_t		an_tx_rate1sp;	/* series 1 short preamble h/w rate */
144 	uint8_t		an_tx_rate2sp;	/* series 2 short preamble h/w rate */
145 	uint8_t		an_tx_rate3sp;	/* series 3 short preamble h/w rate */
146 };
147 #define	ATH_NODE(_n)	((struct ath_node *)(_n))
148 
149 
150 struct ath_stats {
151 	uint32_t	ast_hardware;	/* fatal hardware error interrupts */
152 	uint32_t	ast_rxorn;	/* rx overrun interrupts */
153 	uint32_t	ast_rxeol;	/* rx eol interrupts */
154 	uint32_t	ast_txurn;	/* tx underrun interrupts */
155 	uint32_t	ast_tx_mgmt;	/* management frames transmitted */
156 	uint32_t	ast_tx_discard;	/* frames discarded prior to assoc */
157 	uint32_t	ast_tx_invalid; /* frames discarded 'cuz device gone */
158 	uint32_t	ast_tx_qstop;	/* tx queue stopped 'cuz full */
159 	uint32_t	ast_tx_nobuf;	/* tx failed 'cuz no tx buffer (data) */
160 	uint32_t	ast_tx_nobufmgt; /* tx failed 'cuz no tx buffer(mgmt) */
161 	uint32_t	ast_tx_xretries; /* tx failed 'cuz too many retries */
162 	uint32_t	ast_tx_fifoerr;	/* tx failed 'cuz FIFO underrun */
163 	uint32_t	ast_tx_filtered; /* tx failed 'cuz xmit filtered */
164 	uint32_t	ast_tx_shortretry; /* tx on-chip retries (short) */
165 	uint32_t	ast_tx_longretry; /* tx on-chip retries (long) */
166 	uint32_t	ast_tx_noack;	/* tx frames with no ack marked */
167 	uint32_t	ast_tx_rts;	/* tx frames with rts enabled */
168 	uint32_t	ast_tx_shortpre; /* tx frames with short preamble */
169 	uint32_t	ast_tx_altrate;	/* tx frames with alternate rate */
170 	int16_t		ast_tx_rssi;	/* tx rssi of last ack */
171 	int16_t		ast_tx_rssidelta; /* tx rssi delta */
172 	uint32_t	ast_rx_crcerr;	/* rx failed 'cuz of bad CRC */
173 	uint32_t	ast_rx_fifoerr;	/* rx failed 'cuz of FIFO overrun */
174 	uint32_t	ast_rx_badcrypt; /* rx failed 'cuz decryption */
175 	uint32_t	ast_rx_phyerr;	/* rx PHY error summary count */
176 	uint32_t	ast_rx_phy[32];	/* rx PHY error per-code counts */
177 	uint32_t	ast_rx_tooshort; /* rx discarded 'cuz frame too short */
178 	uint32_t	ast_per_cal;	/* periodic calibration calls */
179 	uint32_t	ast_per_calfail; /* periodic calibration failed */
180 	uint32_t	ast_per_rfgain;	/* periodic calibration rfgain reset */
181 	uint32_t	ast_rate_calls;	/* rate control checks */
182 	uint32_t	ast_rate_raise;	/* rate control raised xmit rate */
183 	uint32_t	ast_rate_drop;	/* rate control dropped xmit rate */
184 };
185 
186 
187 /*
188  * Describes one chunk of allocated DMA-able memory
189  *
190  * In some cases, this is a single chunk as allocated from the system;
191  * but we also use this structure to represent slices carved off such
192  * a chunk.  Even when we don't really need all the information, we
193  * use this structure as a convenient way of correlating the various
194  * ways of looking at a piece of memory (kernel VA, IO space DVMA,
195  * handle+offset, etc).
196  */
197 struct dma_area {
198 	ddi_acc_handle_t	acc_hdl;	/* handle for memory */
199 	caddr_t			mem_va;		/* CPU VA of memory */
200 	uint32_t		nslots;		/* number of slots */
201 	uint32_t		size;		/* size per slot */
202 	size_t			alength;	/* allocated size */
203 						/* >= product of above */
204 
205 	ddi_dma_handle_t	dma_hdl;	/* DMA handle */
206 	offset_t		offset;		/* relative to handle */
207 	ddi_dma_cookie_t	cookie;		/* associated cookie */
208 	uint32_t		ncookies;	/* must be 1 */
209 	uint32_t		token;		/* arbitrary identifier */
210 };						/* 0x50 (80) bytes */
211 typedef struct dma_area dma_area_t;
212 
213 struct ath_buf {
214 	struct ath_desc		*bf_desc;	/* virtual addr of desc */
215 	uint32_t		bf_daddr;	/* physical addr of desc */
216 	dma_area_t		bf_dma;		/* dma area for buf */
217 	struct ieee80211_node	*bf_in;		/* pointer to the node */
218 
219 	/* we're in list of asc->asc_txbuf_list or asc->asc_rxbuf_list */
220 	list_node_t		bf_node;
221 };
222 
223 
224 /*
225  * Data transmit queue state.  One of these exists for each
226  * hardware transmit queue.  Packets sent to us from above
227  * are assigned to queues based on their priority.  Not all
228  * devices support a complete set of hardware transmit queues.
229  * For those devices the array sc_ac2q will map multiple
230  * priorities to fewer hardware queues (typically all to one
231  * hardware queue).
232  */
233 struct ath_txq {
234 	uint_t		axq_qnum;	/* hardware q number */
235 	uint_t		axq_depth;	/* queue depth (stat only) */
236 	uint_t		axq_intrcnt;	/* interrupt count */
237 	uint32_t	*axq_link;	/* link ptr in last TX desc */
238 	list_t		axq_list;	/* transmit queue */
239 	kmutex_t	axq_lock;	/* lock on q and link */
240 };
241 
242 
243 /*
244  * asc_isc must be the first element, for convience of
245  * casting between iee80211com and ath
246  */
247 typedef struct ath {
248 	ieee80211com_t		asc_isc;	/* IEEE 802.11 common */
249 	dev_info_t		*asc_dev;	/* back pointer to dev_info_t */
250 	struct ath_hal		*asc_ah;	/* Atheros HAL */
251 	uint32_t		asc_invalid : 1, /* being detached */
252 				asc_mrretry : 1, /* multi-rate retry support */
253 				asc_have11g : 1, /* have 11g support */
254 				asc_splitmic : 1; /* Split TKIP mic keys */
255 	const HAL_RATE_TABLE	*asc_rates[IEEE80211_MODE_MAX]; /* h/w rate */
256 
257 	ddi_acc_handle_t	asc_cfg_handle;	/* DDI I/O handle */
258 	ddi_acc_handle_t	asc_io_handle;	/* DDI I/O handle */
259 	uint16_t		asc_cachelsz;	/* cache line size */
260 	ddi_iblock_cookie_t	asc_iblock;
261 	ddi_softintr_t		asc_softint_id;
262 
263 	struct ath_desc		*asc_desc;	/* TX/RX descriptors */
264 	dma_area_t		asc_desc_dma;	/* descriptor structure */
265 	/* pointer to the first "struct ath_buf" */
266 	struct ath_buf		*asc_vbufptr;
267 	/* length of all allocated "struct ath_buf" */
268 	uint32_t		asc_vbuflen;
269 	/* size of one DMA TX/RX buffer based on 802.11 MTU */
270 	int32_t			asc_dmabuf_size;
271 
272 	list_t			asc_rxbuf_list;
273 	kmutex_t		asc_rxbuflock;	/* recv lock for above data */
274 	uint32_t		*asc_rxlink;	/* link ptr in last RX desc */
275 	uint32_t		asc_rx_pend;
276 
277 	list_t			asc_txbuf_list;
278 	kmutex_t		asc_txbuflock;	/* txbuf lock */
279 
280 	uint_t			asc_txqsetup;	/* h/w queues setup */
281 	struct ath_txq		asc_txq[HAL_NUM_TX_QUEUES]; /* tx queues */
282 	struct ath_txq		*asc_ac2q[5];	/* WME AC -> h/w qnum */
283 
284 	const HAL_RATE_TABLE	*asc_currates;	/* current rate table */
285 	enum ieee80211_phymode	asc_curmode;	/* current phy mode */
286 	uint8_t			asc_rixmap[256]; /* IEEE to h/w rate table ix */
287 	HAL_INT			asc_imask;	/* interrupt mask copy */
288 	struct ath_stats	asc_stats;	/* interface statistics */
289 	int32_t			asc_promisc;	/* Promiscuous mode enabled */
290 	uint8_t			asc_mcast_cnt[64];
291 	uint32_t		asc_mfilt[2];
292 	kmutex_t		asc_genlock;
293 
294 	uint32_t		asc_need_gld_sched;
295 	kmutex_t		asc_gld_sched_lock;
296 } ath_t;
297 
298 #define	ATH_STATE(macinfo)	((ath_t *)((macinfo)->gldm_private))
299 
300 /* Debug and log functions */
301 void ath_dbg(uint32_t dbg_flags, const char *fmt, ...);	/* debug function */
302 void ath_log(const char *fmt, ...);	/* event log function */
303 void ath_problem(const char *fmt, ...);	/* run-time problem function */
304 
305 #ifdef __cplusplus
306 }
307 #endif
308 
309 #endif /* _ATH_IMPL_H */
310