xref: /freebsd/sys/dev/usb/wlan/if_upgtvar.h (revision 7431dfd4580e850375fe5478d92ec770344db098)
1 /*	$OpenBSD: if_upgtvar.h,v 1.14 2008/02/02 13:48:44 mglocker Exp $ */
2 /*	$FreeBSD$ */
3 
4 /*
5  * Copyright (c) 2007 Marcus Glocker <mglocker@openbsd.org>
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 struct upgt_softc;
21 
22 /*
23  * General values.
24  */
25 enum {
26 	UPGT_BULK_RX,
27 	UPGT_BULK_TX,
28 	UPGT_N_XFERS = 2,
29 };
30 
31 #define UPGT_CONFIG_INDEX		0
32 #define UPGT_IFACE_INDEX		0
33 #define UPGT_USB_TIMEOUT		1000
34 #define UPGT_FIRMWARE_TIMEOUT		10
35 
36 #define UPGT_MEMADDR_FIRMWARE_START	0x00020000	/* 512 bytes large */
37 #define UPGT_MEMSIZE_FRAME_HEAD		0x0070
38 #define UPGT_MEMSIZE_RX			0x3500
39 
40 #define	UPGT_RX_MAXCOUNT		6
41 #define	UPGT_TX_MAXCOUNT		128
42 #define	UPGT_TX_STAT_INTERVAL		5
43 #define	UPGT_RX_MINSZ			(sizeof(struct upgt_lmac_header) + 4)
44 
45 /* device flags */
46 #define UPGT_DEVICE_ATTACHED		(1 << 0)
47 
48 /* leds */
49 #define UPGT_LED_OFF			0
50 #define UPGT_LED_ON			1
51 #define UPGT_LED_BLINK			2
52 
53 /*
54  * Firmware.
55  */
56 #define UPGT_FW_BLOCK_SIZE		256
57 
58 #define UPGT_BRA_FWTYPE_SIZE		4
59 #define UPGT_BRA_FWTYPE_LM86		"LM86"
60 #define UPGT_BRA_FWTYPE_LM87		"LM87"
61 enum upgt_fw_type {
62 	UPGT_FWTYPE_LM86,
63 	UPGT_FWTYPE_LM87
64 };
65 
66 #define UPGT_BRA_TYPE_FW		0x80000001
67 #define UPGT_BRA_TYPE_VERSION		0x80000002
68 #define UPGT_BRA_TYPE_DEPIF		0x80000003
69 #define UPGT_BRA_TYPE_EXPIF		0x80000004
70 #define UPGT_BRA_TYPE_DESCR		0x80000101
71 #define UPGT_BRA_TYPE_END		0xff0000ff
72 struct upgt_fw_bra_option {
73 	uint32_t			type;
74 	uint32_t			len;
75 	uint8_t				data[];
76 } __packed;
77 
78 struct upgt_fw_bra_descr {
79 	uint32_t			unknown1;
80 	uint32_t			memaddr_space_start;
81 	uint32_t			memaddr_space_end;
82 	uint32_t			unknown2;
83 	uint32_t			unknown3;
84 	uint8_t				rates[20];
85 } __packed;
86 
87 #define UPGT_X2_SIGNATURE_SIZE		4
88 #define UPGT_X2_SIGNATURE		"x2  "
89 struct upgt_fw_x2_header {
90 	uint8_t				signature[4];
91 	uint32_t			startaddr;
92 	uint32_t			len;
93 	uint32_t			crc;
94 } __packed;
95 
96 /*
97  * EEPROM.
98  */
99 #define UPGT_EEPROM_SIZE		8192
100 #define UPGT_EEPROM_BLOCK_SIZE		1020
101 
102 struct upgt_eeprom_header {
103 	/* 14 bytes */
104 	uint32_t			magic;
105 	uint16_t			pad1;
106 	uint16_t			preamble_len;
107 	uint32_t			pad2;
108 	/* data */
109 } __packed;
110 
111 #define UPGT_EEPROM_TYPE_END		0x0000
112 #define UPGT_EEPROM_TYPE_NAME		0x0001
113 #define UPGT_EEPROM_TYPE_SERIAL		0x0003
114 #define UPGT_EEPROM_TYPE_MAC		0x0101
115 #define UPGT_EEPROM_TYPE_HWRX		0x1001
116 #define UPGT_EEPROM_TYPE_CHIP		0x1002
117 #define UPGT_EEPROM_TYPE_FREQ3		0x1903
118 #define UPGT_EEPROM_TYPE_FREQ4		0x1904
119 #define UPGT_EEPROM_TYPE_FREQ5		0x1905
120 #define UPGT_EEPROM_TYPE_FREQ6		0x1906
121 #define UPGT_EEPROM_TYPE_OFF		0xffff
122 struct upgt_eeprom_option {
123 	uint16_t			len;
124 	uint16_t			type;
125 	uint8_t				data[];
126 	/* data */
127 } __packed;
128 
129 #define UPGT_EEPROM_RX_CONST		0x88
130 struct upgt_eeprom_option_hwrx {
131 	uint32_t			pad1;
132 	uint8_t				rxfilter;
133 	uint8_t				pad2[15];
134 } __packed;
135 
136 struct upgt_eeprom_freq3_header {
137 	uint8_t				flags;
138 	uint8_t				elements;
139 } __packed;
140 
141 struct upgt_eeprom_freq4_header {
142 	uint8_t				flags;
143 	uint8_t				elements;
144 	uint8_t				settings;
145 	uint8_t				type;
146 } __packed;
147 
148 struct upgt_eeprom_freq4_1 {
149 	uint16_t			freq;
150 	uint8_t				data[50];
151 } __packed;
152 
153 struct upgt_eeprom_freq4_2 {
154 	uint16_t			head;
155 	uint8_t				subtails[4];
156 	uint8_t				tail;
157 } __packed;
158 
159 /*
160  * LMAC protocol.
161  */
162 struct upgt_lmac_mem {
163 	uint32_t			addr;
164 	uint32_t			chksum;
165 } __packed;
166 
167 #define UPGT_H1_FLAGS_TX_MGMT		0x00	/* for TX: mgmt frame */
168 #define UPGT_H1_FLAGS_TX_NO_CALLBACK	0x01	/* for TX: no USB callback */
169 #define UPGT_H1_FLAGS_TX_DATA		0x10	/* for TX: data frame */
170 #define UPGT_H1_TYPE_RX_DATA		0x00	/* 802.11 RX data frame */
171 #define UPGT_H1_TYPE_RX_DATA_MGMT	0x04	/* 802.11 RX mgmt frame */
172 #define UPGT_H1_TYPE_TX_DATA		0x40	/* 802.11 TX data frame */
173 #define UPGT_H1_TYPE_CTRL		0x80	/* control frame */
174 struct upgt_lmac_h1 {
175 	/* 4 bytes */
176 	uint8_t				flags;
177 	uint8_t				type;
178 	uint16_t			len;
179 } __packed;
180 
181 #define UPGT_H2_TYPE_TX_ACK_NO		0x0000
182 #define UPGT_H2_TYPE_TX_ACK_YES		0x0001
183 #define UPGT_H2_TYPE_MACFILTER		0x0000
184 #define UPGT_H2_TYPE_CHANNEL		0x0001
185 #define UPGT_H2_TYPE_TX_DONE		0x0008
186 #define UPGT_H2_TYPE_STATS		0x000a
187 #define UPGT_H2_TYPE_EEPROM		0x000c
188 #define UPGT_H2_TYPE_LED		0x000d
189 #define UPGT_H2_FLAGS_TX_ACK_NO		0x0101
190 #define UPGT_H2_FLAGS_TX_ACK_YES	0x0707
191 struct upgt_lmac_h2 {
192 	/* 8 bytes */
193 	uint32_t			reqid;
194 	uint16_t			type;
195 	uint16_t			flags;
196 } __packed;
197 
198 struct upgt_lmac_header {
199 	/* 12 bytes */
200 	struct upgt_lmac_h1		header1;
201 	struct upgt_lmac_h2		header2;
202 } __packed;
203 
204 struct upgt_lmac_eeprom {
205 	/* 16 bytes */
206 	struct upgt_lmac_h1		header1;
207 	struct upgt_lmac_h2		header2;
208 	uint16_t			offset;
209 	uint16_t			len;
210 	/* data */
211 } __packed;
212 
213 #define UPGT_FILTER_TYPE_NONE		0x0000
214 #define UPGT_FILTER_TYPE_STA		0x0001
215 #define UPGT_FILTER_TYPE_IBSS		0x0002
216 #define UPGT_FILTER_TYPE_HOSTAP		0x0004
217 #define UPGT_FILTER_TYPE_MONITOR	0x0010
218 #define UPGT_FILTER_TYPE_RESET		0x0020
219 #define UPGT_FILTER_UNKNOWN1		0x0002
220 #define UPGT_FILTER_UNKNOWN2		0x0ca8
221 #define UPGT_FILTER_UNKNOWN3		0xffff
222 #define UPGT_FILTER_MONITOR_UNKNOWN1	0x0000
223 #define UPGT_FILTER_MONITOR_UNKNOWN2	0x0000
224 #define UPGT_FILTER_MONITOR_UNKNOWN3	0x0000
225 struct upgt_lmac_filter {
226 	struct upgt_lmac_h1		header1;
227 	struct upgt_lmac_h2		header2;
228 	/* 32 bytes */
229 	uint16_t			type;
230 	uint8_t				dst[IEEE80211_ADDR_LEN];
231 	uint8_t				src[IEEE80211_ADDR_LEN];
232 	uint16_t			unknown1;
233 	uint32_t			rxaddr;
234 	uint16_t			unknown2;
235 	uint32_t			rxhw;
236 	uint16_t			unknown3;
237 	uint32_t			unknown4;
238 } __packed;
239 
240 /* frequence 3 data */
241 struct upgt_lmac_freq3 {
242 	uint16_t			freq;
243 	uint8_t				data[6];
244 } __packed;
245 
246 /* frequence 4 data */
247 struct upgt_lmac_freq4 {
248 	struct upgt_eeprom_freq4_2	cmd;
249 	uint8_t				pad;
250 };
251 
252 /* frequence 6 data */
253 struct upgt_lmac_freq6 {
254 	uint16_t			freq;
255 	uint8_t				data[8];
256 } __packed;
257 
258 #define UPGT_CHANNEL_UNKNOWN1		0x0001
259 #define UPGT_CHANNEL_UNKNOWN2		0x0000
260 #define UPGT_CHANNEL_UNKNOWN3		0x48
261 struct upgt_lmac_channel {
262 	struct upgt_lmac_h1		header1;
263 	struct upgt_lmac_h2		header2;
264 	/* 112 bytes */
265 	uint16_t			unknown1;
266 	uint16_t			unknown2;
267 	uint8_t				pad1[20];
268 	struct upgt_lmac_freq6		freq6;
269 	uint8_t				settings;
270 	uint8_t				unknown3;
271 	uint8_t				freq3_1[4];
272 	struct upgt_lmac_freq4		freq4[8];
273 	uint8_t				freq3_2[4];
274 	uint32_t			pad2;
275 } __packed;
276 
277 #define UPGT_LED_MODE_SET		0x0003
278 #define UPGT_LED_ACTION_OFF		0x0002
279 #define UPGT_LED_ACTION_ON		0x0003
280 #define UPGT_LED_ACTION_TMP_DUR		100	/* ms */
281 struct upgt_lmac_led {
282 	struct upgt_lmac_h1		header1;
283 	struct upgt_lmac_h2		header2;
284 	uint16_t			mode;
285 	uint16_t			action_fix;
286 	uint16_t			action_tmp;
287 	uint16_t			action_tmp_dur;
288 } __packed;
289 
290 struct upgt_lmac_stats {
291 	struct upgt_lmac_h1		header1;
292 	struct upgt_lmac_h2		header2;
293 	uint8_t				data[76];
294 } __packed;
295 
296 struct upgt_lmac_rx_desc {
297 	struct upgt_lmac_h1		header1;
298 	/* 16 bytes */
299 	uint16_t			freq;
300 	uint8_t				unknown1;
301 	uint8_t				rate;
302 	uint8_t				rssi;
303 	uint8_t				pad;
304 	uint16_t			unknown2;
305 	uint32_t			timestamp;
306 	uint32_t			unknown3;
307 	uint8_t				data[];
308 } __packed;
309 
310 #define UPGT_TX_DESC_KEY_EXISTS		0x01
311 struct upgt_lmac_tx_desc_wep {
312 	uint8_t				key_exists;
313 	uint8_t				key_len;
314 	uint8_t				key_val[16];
315 } __packed;
316 
317 #define UPGT_TX_DESC_TYPE_BEACON	0x00000000
318 #define UPGT_TX_DESC_TYPE_PROBE		0x00000001
319 #define UPGT_TX_DESC_TYPE_MGMT		0x00000002
320 #define UPGT_TX_DESC_TYPE_DATA		0x00000004
321 #define UPGT_TX_DESC_PAD3_SIZE		2
322 struct upgt_lmac_tx_desc {
323 	struct upgt_lmac_h1		header1;
324 	struct upgt_lmac_h2		header2;
325 	uint8_t				rates[8];
326 	uint16_t			pad1;
327 	struct upgt_lmac_tx_desc_wep	wep_key;
328 	uint32_t			type;
329 	uint32_t			pad2;
330 	uint32_t			unknown1;
331 	uint32_t			unknown2;
332 	uint8_t				pad3[2];
333 	/* 802.11 frame data */
334 } __packed;
335 
336 #define UPGT_TX_DONE_DESC_STATUS_OK	0x0001
337 struct upgt_lmac_tx_done_desc {
338 	struct upgt_lmac_h1		header1;
339 	struct upgt_lmac_h2		header2;
340 	uint16_t			status;
341 	uint16_t			rssi;
342 	uint16_t			seq;
343 	uint16_t			unknown;
344 } __packed;
345 
346 /*
347  * USB xfers.
348  */
349 struct upgt_data {
350 	uint8_t				*buf;
351 	uint32_t			 buflen;
352 	struct ieee80211_node		*ni;
353 	struct mbuf			*m;
354 	uint32_t			 addr;
355 	STAILQ_ENTRY(upgt_data)		 next;
356 };
357 typedef STAILQ_HEAD(, upgt_data) upgt_datahead;
358 
359 /*
360  * Prism memory.
361  */
362 struct upgt_memory_page {
363 	uint8_t				used;
364 	uint32_t			addr;
365 } __packed;
366 
367 #define UPGT_MEMORY_MAX_PAGES		8
368 struct upgt_memory {
369 	uint8_t				pages;
370 	struct upgt_memory_page		page[UPGT_MEMORY_MAX_PAGES];
371 } __packed;
372 
373 /*
374  * BPF
375  */
376 struct upgt_rx_radiotap_header {
377 	struct ieee80211_radiotap_header wr_ihdr;
378 	uint8_t		wr_flags;
379 	uint8_t		wr_rate;
380 	uint16_t	wr_chan_freq;
381 	uint16_t	wr_chan_flags;
382 	int8_t		wr_antsignal;
383 } __packed __aligned(8);
384 
385 #define UPGT_RX_RADIOTAP_PRESENT					\
386 	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
387 	 (1 << IEEE80211_RADIOTAP_RATE) |				\
388 	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
389 	 (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL))
390 
391 struct upgt_tx_radiotap_header {
392 	struct ieee80211_radiotap_header wt_ihdr;
393 	uint8_t		wt_flags;
394 	uint8_t		wt_rate;
395 	uint16_t	wt_chan_freq;
396 	uint16_t	wt_chan_flags;
397 } __packed __aligned(8);
398 
399 #define UPGT_TX_RADIOTAP_PRESENT					\
400 	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
401 	 (1 << IEEE80211_RADIOTAP_RATE) |				\
402 	 (1 << IEEE80211_RADIOTAP_CHANNEL))
403 
404 struct upgt_stat {
405 	uint32_t		st_tx_active;
406 	uint32_t		st_tx_inactive;
407 	uint32_t		st_tx_pending;
408 };
409 
410 #define	UPGT_STAT_INC(sc, var)	(sc)->sc_stat.var++
411 #define	UPGT_STAT_DEC(sc, var)	(sc)->sc_stat.var--
412 
413 struct upgt_vap {
414 	struct ieee80211vap	vap;
415 	int			(*newstate)(struct ieee80211vap *,
416 				    enum ieee80211_state, int);
417 };
418 #define	UPGT_VAP(vap)	((struct upgt_vap *)(vap))
419 
420 struct upgt_softc {
421 	device_t		 sc_dev;
422 	struct ifnet		*sc_ifp;
423 	struct usb_device	*sc_udev;
424 	void			*sc_rx_dma_buf;
425 	void			*sc_tx_dma_buf;
426 	struct mtx		 sc_mtx;
427 	struct upgt_stat	 sc_stat;
428 	int			 sc_flags;
429 #define	UPGT_FLAG_FWLOADED	 (1 << 0)
430 #define	UPGT_FLAG_INITDONE	 (1 << 1)
431 #define	UPGT_FLAG_DETACHED	 (1 << 2)
432 	int			 sc_if_flags;
433 	int			 sc_debug;
434 
435 	uint8_t			 sc_myaddr[IEEE80211_ADDR_LEN];
436 
437 	enum ieee80211_state	 sc_state;
438 	int			 sc_arg;
439 	int			 sc_led_blink;
440 	struct callout		 sc_led_ch;
441 	uint8_t			 sc_cur_rateset[8];
442 
443 	/* watchdog  */
444 	int			 sc_tx_timer;
445 	struct callout		 sc_watchdog_ch;
446 
447 	/* Firmware.  */
448 	int			 sc_fw_type;
449 	/* memory addresses on device */
450 	uint32_t		 sc_memaddr_frame_start;
451 	uint32_t		 sc_memaddr_frame_end;
452 	uint32_t		 sc_memaddr_rx_start;
453 	struct upgt_memory	 sc_memory;
454 
455 	/* data which we found in the EEPROM */
456 	uint8_t			 sc_eeprom[2 * UPGT_EEPROM_SIZE] __aligned(4);
457 	uint16_t		 sc_eeprom_hwrx;
458 	struct upgt_lmac_freq3	 sc_eeprom_freq3[IEEE80211_CHAN_MAX];
459 	struct upgt_lmac_freq4	 sc_eeprom_freq4[IEEE80211_CHAN_MAX][8];
460 	struct upgt_lmac_freq6	 sc_eeprom_freq6[IEEE80211_CHAN_MAX];
461 	uint8_t			 sc_eeprom_freq6_settings;
462 
463 	/* RX/TX  */
464 	struct usb_xfer	*sc_xfer[UPGT_N_XFERS];
465 	int			 sc_rx_no;
466 	int			 sc_tx_no;
467 	struct upgt_data	 sc_rx_data[UPGT_RX_MAXCOUNT];
468 	upgt_datahead		 sc_rx_active;
469 	upgt_datahead		 sc_rx_inactive;
470 	struct upgt_data	 sc_tx_data[UPGT_TX_MAXCOUNT];
471 	upgt_datahead		 sc_tx_active;
472 	upgt_datahead		 sc_tx_inactive;
473 	upgt_datahead		 sc_tx_pending;
474 
475 	/* BPF  */
476 	struct upgt_rx_radiotap_header	sc_rxtap;
477 	int				sc_rxtap_len;
478 	struct upgt_tx_radiotap_header	sc_txtap;
479 	int				sc_txtap_len;
480 };
481 
482 #define UPGT_LOCK(sc)		mtx_lock(&(sc)->sc_mtx)
483 #define UPGT_UNLOCK(sc)		mtx_unlock(&(sc)->sc_mtx)
484 #define	UPGT_ASSERT_LOCKED(sc)	mtx_assert(&(sc)->sc_mtx, MA_OWNED)
485