xref: /illumos-gate/usr/src/uts/common/io/uath/uath_var.h (revision 46b592853d0f4f11781b6b0a7533f267c6aee132)
1 /*
2  *
3  * Copyright 2009 Sun Microsystems, Inc.  All rights reserved.
4  * Use is subject to license terms.
5  */
6 
7 /*
8  * Copyright (c) 2006
9  *	Damien Bergamini <damien.bergamini@free.fr>
10  * Copyright (c) 2006 Sam Leffler, Errno Consulting
11  * Copyright (c) 2008-2009 Weongyo Jeong <weongyo@freebsd.org>
12  *
13  * Permission to use, copy, modify, and distribute this software for any
14  * purpose with or without fee is hereby granted, provided that the above
15  * copyright notice and this permission notice appear in all copies.
16  *
17  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
18  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
19  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
20  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
21  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
22  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
23  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
24  */
25 
26 
27 #ifndef	_UATH_VAR_H
28 #define	_UATH_VAR_H
29 
30 #include <sys/queue.h>
31 
32 #ifdef __cplusplus
33 extern "C" {
34 #endif
35 
36 #define	UATH_ID_BSS		2	/* Connection ID  */
37 
38 #define	UATH_RX_DATA_LIST_COUNT	1	/* 128 */
39 #define	UATH_TX_DATA_LIST_COUNT	8	/* 16 */
40 #define	UATH_CMD_LIST_COUNT	8	/* 60 */
41 
42 #define	UATH_DATA_TIMEOUT	10000
43 #define	UATH_CMD_TIMEOUT	1000
44 
45 /*
46  * Useful combinations of channel characteristics from net80211.
47  */
48 #define	UATH_CHAN_A	\
49 	(IEEE80211_CHAN_5GHZ | IEEE80211_CHAN_OFDM)
50 #define	UATH_CHAN_B	\
51 	(IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_CCK)
52 #define	UATH_CHAN_PUREG	\
53 	(IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_OFDM)
54 #define	UATH_CHAN_G	\
55 	(IEEE80211_CHAN_2GHZ | IEEE80211_CHAN_DYN)
56 
57 #define	UATH_IS_CHAN_A(_c)		\
58 	(((_c)->ich_flags & UATH_CHAN_A) == UATH_CHAN_A)
59 #define	UATH_IS_CHAN_B(_c)		\
60 	(((_c)->ich_flags & UATH_CHAN_B) == UATH_CHAN_B)
61 #define	UATH_IS_CHAN_PUREG(_c)	\
62 	(((_c)->ich_flags & UATH_CHAN_PUREG) == UATH_CHAN_PUREG)
63 #define	UATH_IS_CHAN_G(_c)		\
64 	(((_c)->ich_flags & UATH_CHAN_G) == UATH_CHAN_G)
65 #define	UATH_IS_CHAN_ANYG(_c)	\
66 	(UATH_IS_CHAN_PUREG(_c) || UATH_IS_CHAN_G(_c))
67 
68 #define	UATH_IS_CHAN_OFDM(_c)	\
69 	((_c)->ich_flags & IEEE80211_CHAN_OFDM)
70 #define	UATH_IS_CHAN_CCK(_c)	\
71 	((_c)->ich_flags & IEEE80211_CHAN_CCK)
72 
73 #define	UATH_NODE_QOS	0x0002		/* QoS enabled */
74 
75 
76 /* flags for sending firmware commands */
77 #define	UATH_CMD_FLAG_ASYNC	(1 << 0)
78 #define	UATH_CMD_FLAG_READ	(1 << 1)
79 #define	UATH_CMD_FLAG_MAGIC	(1 << 2)
80 
81 struct uath_cmd {
82 	struct uath_softc	*sc;
83 	uint32_t		flags;
84 	uint32_t		msgid;
85 	uint8_t			*buf;
86 	uint16_t		buflen;
87 	void			*odata;		/* NB: tx only */
88 	int			olen;		/* space in odata */
89 	STAILQ_ENTRY(uath_cmd)	next;
90 };
91 typedef STAILQ_HEAD(, uath_cmd) uath_cmdhead;
92 
93 struct uath_data {
94 	struct uath_softc	*sc;
95 	uint8_t			*buf;
96 	uint16_t		buflen;
97 	struct ieee80211_node	*ni;		/* NB: tx only */
98 	STAILQ_ENTRY(uath_data)	next;
99 };
100 typedef STAILQ_HEAD(, uath_data) uath_datahead;
101 
102 struct uath_cmd_lock {
103 	boolean_t	done;
104 	kmutex_t	mutex;
105 	kcondvar_t	cv;
106 };
107 
108 struct uath_wme_settings {
109 	uint8_t				aifsn;
110 	uint8_t				logcwmin;
111 	uint8_t				logcwmax;
112 	uint16_t			txop;
113 #define	UATH_TXOP_TO_US(txop)		((txop) << 5)
114 	uint8_t				acm;
115 };
116 
117 struct uath_devcap {
118 	uint32_t			targetVersion;
119 	uint32_t			targetRevision;
120 	uint32_t			macVersion;
121 	uint32_t			macRevision;
122 	uint32_t			phyRevision;
123 	uint32_t			analog5GhzRevision;
124 	uint32_t			analog2GhzRevision;
125 	uint32_t			regDomain;
126 	uint32_t			regCapBits;
127 	uint32_t			countryCode;
128 	uint32_t			keyCacheSize;
129 	uint32_t			numTxQueues;
130 	uint32_t			connectionIdMax;
131 	uint32_t			wirelessModes;
132 #define	UATH_WIRELESS_MODE_11A		0x01
133 #define	UATH_WIRELESS_MODE_TURBO	0x02
134 #define	UATH_WIRELESS_MODE_11B		0x04
135 #define	UATH_WIRELESS_MODE_11G		0x08
136 #define	UATH_WIRELESS_MODE_108G		0x10
137 	uint32_t			chanSpreadSupport;
138 	uint32_t			compressSupport;
139 	uint32_t			burstSupport;
140 	uint32_t			fastFramesSupport;
141 	uint32_t			chapTuningSupport;
142 	uint32_t			turboGSupport;
143 	uint32_t			turboPrimeSupport;
144 	uint32_t			deviceType;
145 	uint32_t			wmeSupport;
146 	uint32_t			low2GhzChan;
147 	uint32_t			high2GhzChan;
148 	uint32_t			low5GhzChan;
149 	uint32_t			high5GhzChan;
150 	uint32_t			supportCipherWEP;
151 	uint32_t			supportCipherAES_CCM;
152 	uint32_t			supportCipherTKIP;
153 	uint32_t			supportCipherMicAES_CCM;
154 	uint32_t			supportMicTKIP;
155 	uint32_t			twiceAntennaGain5G;
156 	uint32_t			twiceAntennaGain2G;
157 };
158 
159 struct uath_stat {
160 	uint32_t			st_badchunkseqnum;
161 	uint32_t			st_invalidlen;
162 	uint32_t			st_multichunk;
163 	uint32_t			st_toobigrxpkt;
164 	uint32_t			st_stopinprogress;
165 	uint32_t			st_crcerr;
166 	uint32_t			st_phyerr;
167 	uint32_t			st_decrypt_crcerr;
168 	uint32_t			st_decrypt_micerr;
169 	uint32_t			st_decomperr;
170 	uint32_t			st_keyerr;
171 	uint32_t			st_err;
172 	/* not use CMD/RX/TX queues, so ignore some structure */
173 };
174 #define	UATH_STAT_INC(sc, var)		(sc)->sc_stat.var++
175 #define	UATH_STAT_DEC(sc, var)		(sc)->sc_stat.var--
176 
177 struct uath_softc {
178 	struct ieee80211com	sc_ic;
179 	dev_info_t		*sc_dev;
180 
181 	usb_client_dev_data_t	*sc_udev;	/* usb dev */
182 	int			dev_flags;
183 	uint32_t		sc_flags;
184 
185 	usb_pipe_handle_t	rx_cmd_pipe;
186 	usb_pipe_handle_t	rx_data_pipe;
187 	usb_pipe_handle_t	tx_cmd_pipe;
188 	usb_pipe_handle_t	tx_data_pipe;
189 
190 	kmutex_t		sc_genlock;
191 	kmutex_t		sc_rxlock_cmd;
192 	kmutex_t		sc_rxlock_data;
193 	kmutex_t		sc_txlock_cmd;
194 	kmutex_t		sc_txlock_data;
195 
196 	struct uath_cmd		sc_cmd[UATH_CMD_LIST_COUNT];
197 	struct uath_data	sc_rx[UATH_RX_DATA_LIST_COUNT];
198 	struct uath_data	sc_tx[UATH_TX_DATA_LIST_COUNT];
199 
200 	int			tx_cmd_queued;
201 	int			rx_cmd_queued;
202 	int			tx_data_queued;
203 	int			rx_data_queued;
204 
205 	int			sc_cmdid;
206 
207 	struct uath_stat	sc_stat;
208 
209 	struct uath_cmd_lock 	rlock;
210 	struct uath_cmd_lock 	wlock;
211 
212 	struct uath_devcap	sc_devcap;
213 	uint8_t			sc_serial[16];
214 
215 	uint32_t		sc_msgid;
216 	uint32_t		sc_seqnum;
217 
218 	uint8_t			sc_intrx_nextnum;
219 	uint32_t		sc_intrx_len;
220 #define	UATH_MAX_INTRX_SIZE		3616
221 
222 	timeout_id_t		sc_scan_id;
223 	timeout_id_t		sc_stat_id;
224 
225 	uint32_t		sc_need_sched;
226 
227 	/* kstats */
228 	uint32_t		sc_tx_nobuf;
229 	uint32_t		sc_rx_nobuf;
230 	uint32_t		sc_tx_err;
231 	uint32_t		sc_rx_err;
232 	uint32_t		sc_tx_retries;
233 
234 	int			(*sc_newstate)(struct ieee80211com *,
235 				    enum ieee80211_state, int);
236 };
237 
238 #define	UATH_SUCCESS		0
239 #define	UATH_FAILURE		-1
240 
241 #define	UATH_FLAG_RUNNING	(1 << 0)
242 #define	UATH_FLAG_SUSPEND	(1 << 1)
243 #define	UATH_FLAG_RECONNECT	(1 << 2)
244 #define	UATH_FLAG_DISCONNECT	(1 << 3)
245 
246 #define	UATH_LOCK(sc)		mutex_enter(&(sc)->sc_genlock)
247 #define	UATH_UNLOCK(sc)		mutex_exit(&(sc)->sc_genlock)
248 #define	UATH_IS_RUNNING(_sc)	((_sc)->sc_flags & UATH_FLAG_RUNNING)
249 #define	UATH_IS_SUSPEND(_sc)	((_sc)->sc_flags & UATH_FLAG_SUSPEND)
250 #define	UATH_IS_DISCONNECT(_sc)	((_sc)->sc_flags & UATH_FLAG_DISCONNECT)
251 #define	UATH_IS_RECONNECT(_sc)	((_sc)->sc_flags & UATH_FLAG_RECONNECT)
252 
253 #define	UATH_RESET_INTRX(sc) do {		\
254 	(sc)->sc_intrx_nextnum = 0;		\
255 	(sc)->sc_intrx_len = 0;			\
256 	_NOTE(CONSTCOND)						\
257 } while (0)
258 
259 
260 #ifdef __cplusplus
261 }
262 #endif
263 
264 #endif /* _UATH_VAR_H */
265