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