xref: /freebsd/sys/dev/usb/wlan/if_uathvar.h (revision 760bc48e7ee4471fe04fa5fee89d00bf7d698ddb)
1dc60165bSWeongyo Jeong /*	$OpenBSD: if_uathvar.h,v 1.3 2006/09/20 19:47:17 damien Exp $	*/
2dc60165bSWeongyo Jeong /*	$FreeBSD$	*/
3dc60165bSWeongyo Jeong 
4dc60165bSWeongyo Jeong /*-
5dc60165bSWeongyo Jeong  * Copyright (c) 2006
6dc60165bSWeongyo Jeong  *	Damien Bergamini <damien.bergamini@free.fr>
7dc60165bSWeongyo Jeong  * Copyright (c) 2006 Sam Leffler, Errno Consulting
8dc60165bSWeongyo Jeong  * Copyright (c) 2008-2009 Weongyo Jeong <weongyo@freebsd.org>
9dc60165bSWeongyo Jeong  *
10dc60165bSWeongyo Jeong  * Permission to use, copy, modify, and distribute this software for any
11dc60165bSWeongyo Jeong  * purpose with or without fee is hereby granted, provided that the above
12dc60165bSWeongyo Jeong  * copyright notice and this permission notice appear in all copies.
13dc60165bSWeongyo Jeong  *
14dc60165bSWeongyo Jeong  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
15dc60165bSWeongyo Jeong  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
16dc60165bSWeongyo Jeong  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
17dc60165bSWeongyo Jeong  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
18dc60165bSWeongyo Jeong  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
19dc60165bSWeongyo Jeong  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
20dc60165bSWeongyo Jeong  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
21dc60165bSWeongyo Jeong  */
22dc60165bSWeongyo Jeong 
23dc60165bSWeongyo Jeong enum {
24dc60165bSWeongyo Jeong 	UATH_INTR_RX,
25dc60165bSWeongyo Jeong 	UATH_INTR_TX,
26dc60165bSWeongyo Jeong 	UATH_BULK_RX,
27dc60165bSWeongyo Jeong 	UATH_BULK_TX,
28dc60165bSWeongyo Jeong 	UATH_N_XFERS = 4,
29dc60165bSWeongyo Jeong };
30dc60165bSWeongyo Jeong 
31dc60165bSWeongyo Jeong #define	UATH_ID_BSS		2	/* Connection ID  */
32dc60165bSWeongyo Jeong 
33dc60165bSWeongyo Jeong #define	UATH_RX_DATA_LIST_COUNT	128
34dc60165bSWeongyo Jeong #define	UATH_TX_DATA_LIST_COUNT	16
35dc60165bSWeongyo Jeong #define	UATH_CMD_LIST_COUNT	60
36dc60165bSWeongyo Jeong 
37dc60165bSWeongyo Jeong #define	UATH_DATA_TIMEOUT	10000
38dc60165bSWeongyo Jeong #define	UATH_CMD_TIMEOUT	1000
39dc60165bSWeongyo Jeong 
40dc60165bSWeongyo Jeong /* flags for sending firmware commands */
41dc60165bSWeongyo Jeong #define	UATH_CMD_FLAG_ASYNC	(1 << 0)
42dc60165bSWeongyo Jeong #define	UATH_CMD_FLAG_READ	(1 << 1)
43dc60165bSWeongyo Jeong #define	UATH_CMD_FLAG_MAGIC	(1 << 2)
44dc60165bSWeongyo Jeong 
45dc60165bSWeongyo Jeong struct uath_rx_radiotap_header {
46dc60165bSWeongyo Jeong 	struct ieee80211_radiotap_header wr_ihdr;
475463c4a4SSam Leffler 	u_int64_t	wr_tsf;
485463c4a4SSam Leffler 	u_int8_t	wr_flags;
495463c4a4SSam Leffler 	u_int8_t	wr_rate;
50dc60165bSWeongyo Jeong 	uint16_t	wr_chan_freq;
51dc60165bSWeongyo Jeong 	uint16_t	wr_chan_flags;
525463c4a4SSam Leffler 	int8_t		wr_antsignal;
535463c4a4SSam Leffler 	int8_t		wr_antnoise;
545463c4a4SSam Leffler 	u_int8_t	wr_antenna;
55dc60165bSWeongyo Jeong } __packed;
56dc60165bSWeongyo Jeong 
575463c4a4SSam Leffler #define UATH_RX_RADIOTAP_PRESENT (		\
585463c4a4SSam Leffler 	(1 << IEEE80211_RADIOTAP_TSFT)		| \
595463c4a4SSam Leffler 	(1 << IEEE80211_RADIOTAP_FLAGS)		| \
605463c4a4SSam Leffler 	(1 << IEEE80211_RADIOTAP_RATE)		| \
615463c4a4SSam Leffler 	(1 << IEEE80211_RADIOTAP_ANTENNA)	| \
62dc60165bSWeongyo Jeong 	(1 << IEEE80211_RADIOTAP_CHANNEL)	| \
635463c4a4SSam Leffler 	(1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL)	| \
645463c4a4SSam Leffler 	(1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)	| \
655463c4a4SSam Leffler 	0)
66dc60165bSWeongyo Jeong 
67dc60165bSWeongyo Jeong struct uath_tx_radiotap_header {
68dc60165bSWeongyo Jeong 	struct ieee80211_radiotap_header wt_ihdr;
69dc60165bSWeongyo Jeong 	uint8_t		wt_flags;
70dc60165bSWeongyo Jeong 	uint16_t	wt_chan_freq;
71dc60165bSWeongyo Jeong 	uint16_t	wt_chan_flags;
72dc60165bSWeongyo Jeong } __packed;
73dc60165bSWeongyo Jeong 
74dc60165bSWeongyo Jeong #define	UATH_TX_RADIOTAP_PRESENT					\
75dc60165bSWeongyo Jeong 	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
76dc60165bSWeongyo Jeong 	 (1 << IEEE80211_RADIOTAP_CHANNEL))
77dc60165bSWeongyo Jeong 
78dc60165bSWeongyo Jeong struct uath_data {
79dc60165bSWeongyo Jeong 	struct uath_softc		*sc;
80dc60165bSWeongyo Jeong 	uint8_t				*buf;
81dc60165bSWeongyo Jeong 	uint16_t			buflen;
82dc60165bSWeongyo Jeong 	struct mbuf			*m;
83dc60165bSWeongyo Jeong 	struct ieee80211_node		*ni;		/* NB: tx only */
84dc60165bSWeongyo Jeong 	STAILQ_ENTRY(uath_data)		next;
85dc60165bSWeongyo Jeong };
86dc60165bSWeongyo Jeong typedef STAILQ_HEAD(, uath_data) uath_datahead;
87dc60165bSWeongyo Jeong 
88dc60165bSWeongyo Jeong struct uath_cmd {
89dc60165bSWeongyo Jeong 	struct uath_softc		*sc;
90dc60165bSWeongyo Jeong 	uint32_t			flags;
91dc60165bSWeongyo Jeong 	uint32_t			msgid;
92dc60165bSWeongyo Jeong 	uint8_t				*buf;
93dc60165bSWeongyo Jeong 	uint16_t			buflen;
94dc60165bSWeongyo Jeong 	void				*odata;		/* NB: tx only */
95dc60165bSWeongyo Jeong 	int				olen;		/* space in odata */
96dc60165bSWeongyo Jeong 	STAILQ_ENTRY(uath_cmd)		next;
97dc60165bSWeongyo Jeong };
98dc60165bSWeongyo Jeong typedef STAILQ_HEAD(, uath_cmd) uath_cmdhead;
99dc60165bSWeongyo Jeong 
100dc60165bSWeongyo Jeong struct uath_wme_settings {
101dc60165bSWeongyo Jeong 	uint8_t				aifsn;
102dc60165bSWeongyo Jeong 	uint8_t				logcwmin;
103dc60165bSWeongyo Jeong 	uint8_t				logcwmax;
104dc60165bSWeongyo Jeong 	uint16_t			txop;
105dc60165bSWeongyo Jeong #define	UATH_TXOP_TO_US(txop)		((txop) << 5)
106dc60165bSWeongyo Jeong 	uint8_t				acm;
107dc60165bSWeongyo Jeong };
108dc60165bSWeongyo Jeong 
109dc60165bSWeongyo Jeong struct uath_devcap {
110dc60165bSWeongyo Jeong 	uint32_t			targetVersion;
111dc60165bSWeongyo Jeong 	uint32_t			targetRevision;
112dc60165bSWeongyo Jeong 	uint32_t			macVersion;
113dc60165bSWeongyo Jeong 	uint32_t			macRevision;
114dc60165bSWeongyo Jeong 	uint32_t			phyRevision;
115dc60165bSWeongyo Jeong 	uint32_t			analog5GhzRevision;
116dc60165bSWeongyo Jeong 	uint32_t			analog2GhzRevision;
117dc60165bSWeongyo Jeong 	uint32_t			regDomain;
118dc60165bSWeongyo Jeong 	uint32_t			regCapBits;
119dc60165bSWeongyo Jeong 	uint32_t			countryCode;
120dc60165bSWeongyo Jeong 	uint32_t			keyCacheSize;
121dc60165bSWeongyo Jeong 	uint32_t			numTxQueues;
122dc60165bSWeongyo Jeong 	uint32_t			connectionIdMax;
123dc60165bSWeongyo Jeong 	uint32_t			wirelessModes;
124dc60165bSWeongyo Jeong #define	UATH_WIRELESS_MODE_11A		0x01
125dc60165bSWeongyo Jeong #define	UATH_WIRELESS_MODE_TURBO	0x02
126dc60165bSWeongyo Jeong #define	UATH_WIRELESS_MODE_11B		0x04
127dc60165bSWeongyo Jeong #define	UATH_WIRELESS_MODE_11G		0x08
128dc60165bSWeongyo Jeong #define	UATH_WIRELESS_MODE_108G		0x10
129dc60165bSWeongyo Jeong 	uint32_t			chanSpreadSupport;
130dc60165bSWeongyo Jeong 	uint32_t			compressSupport;
131dc60165bSWeongyo Jeong 	uint32_t			burstSupport;
132dc60165bSWeongyo Jeong 	uint32_t			fastFramesSupport;
133dc60165bSWeongyo Jeong 	uint32_t			chapTuningSupport;
134dc60165bSWeongyo Jeong 	uint32_t			turboGSupport;
135dc60165bSWeongyo Jeong 	uint32_t			turboPrimeSupport;
136dc60165bSWeongyo Jeong 	uint32_t			deviceType;
137dc60165bSWeongyo Jeong 	uint32_t			wmeSupport;
138dc60165bSWeongyo Jeong 	uint32_t			low2GhzChan;
139dc60165bSWeongyo Jeong 	uint32_t			high2GhzChan;
140dc60165bSWeongyo Jeong 	uint32_t			low5GhzChan;
141dc60165bSWeongyo Jeong 	uint32_t			high5GhzChan;
142dc60165bSWeongyo Jeong 	uint32_t			supportCipherWEP;
143dc60165bSWeongyo Jeong 	uint32_t			supportCipherAES_CCM;
144dc60165bSWeongyo Jeong 	uint32_t			supportCipherTKIP;
145dc60165bSWeongyo Jeong 	uint32_t			supportCipherMicAES_CCM;
146dc60165bSWeongyo Jeong 	uint32_t			supportMicTKIP;
147dc60165bSWeongyo Jeong 	uint32_t			twiceAntennaGain5G;
148dc60165bSWeongyo Jeong 	uint32_t			twiceAntennaGain2G;
149dc60165bSWeongyo Jeong };
150dc60165bSWeongyo Jeong 
151dc60165bSWeongyo Jeong struct uath_stat {
152dc60165bSWeongyo Jeong 	uint32_t			st_badchunkseqnum;
153dc60165bSWeongyo Jeong 	uint32_t			st_invalidlen;
154dc60165bSWeongyo Jeong 	uint32_t			st_multichunk;
155dc60165bSWeongyo Jeong 	uint32_t			st_toobigrxpkt;
156dc60165bSWeongyo Jeong 	uint32_t			st_stopinprogress;
157dc60165bSWeongyo Jeong 	uint32_t			st_crcerr;
158dc60165bSWeongyo Jeong 	uint32_t			st_phyerr;
159dc60165bSWeongyo Jeong 	uint32_t			st_decrypt_crcerr;
160dc60165bSWeongyo Jeong 	uint32_t			st_decrypt_micerr;
161dc60165bSWeongyo Jeong 	uint32_t			st_decomperr;
162dc60165bSWeongyo Jeong 	uint32_t			st_keyerr;
163dc60165bSWeongyo Jeong 	uint32_t			st_err;
164dc60165bSWeongyo Jeong 	/* CMD/RX/TX queues */
165dc60165bSWeongyo Jeong 	uint32_t			st_cmd_active;
166dc60165bSWeongyo Jeong 	uint32_t			st_cmd_inactive;
167dc60165bSWeongyo Jeong 	uint32_t			st_cmd_pending;
168dc60165bSWeongyo Jeong 	uint32_t			st_cmd_waiting;
169dc60165bSWeongyo Jeong 	uint32_t			st_rx_active;
170dc60165bSWeongyo Jeong 	uint32_t			st_rx_inactive;
171dc60165bSWeongyo Jeong 	uint32_t			st_tx_active;
172dc60165bSWeongyo Jeong 	uint32_t			st_tx_inactive;
173dc60165bSWeongyo Jeong 	uint32_t			st_tx_pending;
174dc60165bSWeongyo Jeong };
175dc60165bSWeongyo Jeong #define	UATH_STAT_INC(sc, var)		(sc)->sc_stat.var++
176dc60165bSWeongyo Jeong #define	UATH_STAT_DEC(sc, var)		(sc)->sc_stat.var--
177dc60165bSWeongyo Jeong 
178dc60165bSWeongyo Jeong struct uath_vap {
179dc60165bSWeongyo Jeong 	struct ieee80211vap		vap;
180dc60165bSWeongyo Jeong 	int				(*newstate)(struct ieee80211vap *,
181dc60165bSWeongyo Jeong 					    enum ieee80211_state, int);
182dc60165bSWeongyo Jeong };
183dc60165bSWeongyo Jeong #define	UATH_VAP(vap)			((struct uath_vap *)(vap))
184dc60165bSWeongyo Jeong 
185dc60165bSWeongyo Jeong struct uath_softc {
186dc60165bSWeongyo Jeong 	struct ifnet			*sc_ifp;
187dc60165bSWeongyo Jeong 	device_t			sc_dev;
188760bc48eSAndrew Thompson 	struct usb_device		*sc_udev;
189dc60165bSWeongyo Jeong 	struct mtx			sc_mtx;
190dc60165bSWeongyo Jeong 	uint32_t			sc_debug;
191dc60165bSWeongyo Jeong 
192dc60165bSWeongyo Jeong 	struct uath_stat		sc_stat;
193dc60165bSWeongyo Jeong 	int				(*sc_newstate)(struct ieee80211com *,
194dc60165bSWeongyo Jeong 					    enum ieee80211_state, int);
195dc60165bSWeongyo Jeong 
196760bc48eSAndrew Thompson 	struct usb_xfer		*sc_xfer[UATH_N_XFERS];
197dc60165bSWeongyo Jeong 	struct uath_cmd			sc_cmd[UATH_CMD_LIST_COUNT];
198dc60165bSWeongyo Jeong 	uath_cmdhead			sc_cmd_active;
199dc60165bSWeongyo Jeong 	uath_cmdhead			sc_cmd_inactive;
200dc60165bSWeongyo Jeong 	uath_cmdhead			sc_cmd_pending;
201dc60165bSWeongyo Jeong 	uath_cmdhead			sc_cmd_waiting;
202dc60165bSWeongyo Jeong 	struct uath_data		sc_rx[UATH_RX_DATA_LIST_COUNT];
203dc60165bSWeongyo Jeong 	uath_datahead			sc_rx_active;
204dc60165bSWeongyo Jeong 	uath_datahead			sc_rx_inactive;
205dc60165bSWeongyo Jeong 	struct uath_data		sc_tx[UATH_TX_DATA_LIST_COUNT];
206dc60165bSWeongyo Jeong 	uath_datahead			sc_tx_active;
207dc60165bSWeongyo Jeong 	uath_datahead			sc_tx_inactive;
208dc60165bSWeongyo Jeong 	uath_datahead			sc_tx_pending;
209dc60165bSWeongyo Jeong 
210dc60165bSWeongyo Jeong 	uint32_t			sc_msgid;
211dc60165bSWeongyo Jeong 	uint32_t			sc_seqnum;
212dc60165bSWeongyo Jeong 	int				sc_tx_timer;
213dc60165bSWeongyo Jeong 	struct callout			watchdog_ch;
214dc60165bSWeongyo Jeong 	struct callout			stat_ch;
215dc60165bSWeongyo Jeong 	/* multi-chunked support  */
216dc60165bSWeongyo Jeong 	struct mbuf			*sc_intrx_head;
217dc60165bSWeongyo Jeong 	struct mbuf			*sc_intrx_tail;
218dc60165bSWeongyo Jeong 	uint8_t				sc_intrx_nextnum;
219dc60165bSWeongyo Jeong 	uint32_t			sc_intrx_len;
220dc60165bSWeongyo Jeong #define	UATH_MAX_INTRX_SIZE		3616
221dc60165bSWeongyo Jeong 
222dc60165bSWeongyo Jeong 	struct uath_devcap		sc_devcap;
223dc60165bSWeongyo Jeong 	uint8_t				sc_serial[16];
224dc60165bSWeongyo Jeong 
225dc60165bSWeongyo Jeong 	/* unsorted  */
226dc60165bSWeongyo Jeong 	uint32_t			sc_flags;
227dc60165bSWeongyo Jeong #define	UATH_FLAG_INVALID		(1 << 1)
228dc60165bSWeongyo Jeong #define	UATH_FLAG_INITDONE		(1 << 2)
229dc60165bSWeongyo Jeong 
230dc60165bSWeongyo Jeong 	struct	uath_rx_radiotap_header	sc_rxtap;
231dc60165bSWeongyo Jeong 	int				sc_rxtap_len;
232dc60165bSWeongyo Jeong 	struct	uath_tx_radiotap_header	sc_txtap;
233dc60165bSWeongyo Jeong 	int				sc_txtap_len;
234dc60165bSWeongyo Jeong };
235dc60165bSWeongyo Jeong 
236dc60165bSWeongyo Jeong #define	UATH_LOCK(sc)			mtx_lock(&(sc)->sc_mtx)
237dc60165bSWeongyo Jeong #define	UATH_UNLOCK(sc)			mtx_unlock(&(sc)->sc_mtx)
238dc60165bSWeongyo Jeong #define	UATH_ASSERT_LOCKED(sc)		mtx_assert(&(sc)->sc_mtx, MA_OWNED)
239dc60165bSWeongyo Jeong 
240dc60165bSWeongyo Jeong #define	UATH_RESET_INTRX(sc) do {		\
241dc60165bSWeongyo Jeong 	(sc)->sc_intrx_head = NULL;		\
242dc60165bSWeongyo Jeong 	(sc)->sc_intrx_tail = NULL;		\
243dc60165bSWeongyo Jeong 	(sc)->sc_intrx_nextnum = 0;		\
244dc60165bSWeongyo Jeong 	(sc)->sc_intrx_len = 0;			\
245dc60165bSWeongyo Jeong } while (0)
246