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