xref: /openbsd-src/sys/dev/usb/if_upgtvar.h (revision 4b1a56afb1a28c97103da3911d326d1216798a6e)
1*4b1a56afSjsg /*	$OpenBSD: if_upgtvar.h,v 1.18 2022/01/09 05:43:00 jsg Exp $ */
21d97e97dSmglocker 
31d97e97dSmglocker /*
41d97e97dSmglocker  * Copyright (c) 2007 Marcus Glocker <mglocker@openbsd.org>
51d97e97dSmglocker  *
61d97e97dSmglocker  * Permission to use, copy, modify, and distribute this software for any
71d97e97dSmglocker  * purpose with or without fee is hereby granted, provided that the above
81d97e97dSmglocker  * copyright notice and this permission notice appear in all copies.
91d97e97dSmglocker  *
101d97e97dSmglocker  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
111d97e97dSmglocker  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
121d97e97dSmglocker  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
131d97e97dSmglocker  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
141d97e97dSmglocker  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
151d97e97dSmglocker  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
161d97e97dSmglocker  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
171d97e97dSmglocker  */
181d97e97dSmglocker 
191d97e97dSmglocker struct upgt_softc;
201d97e97dSmglocker 
211d97e97dSmglocker /*
221d97e97dSmglocker  * Radio tap.
231d97e97dSmglocker  */
241d97e97dSmglocker struct upgt_rx_radiotap_header {
251d97e97dSmglocker 	struct ieee80211_radiotap_header wr_ihdr;
261d97e97dSmglocker 	uint8_t				wr_flags;
271d97e97dSmglocker 	uint8_t				wr_rate;
281d97e97dSmglocker 	uint16_t			wr_chan_freq;
291d97e97dSmglocker 	uint16_t			wr_chan_flags;
301d97e97dSmglocker 	uint8_t				wr_antsignal;
311d97e97dSmglocker } __packed;
321d97e97dSmglocker 
331d97e97dSmglocker #define UPGT_RX_RADIOTAP_PRESENT					\
341d97e97dSmglocker 	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
351d97e97dSmglocker 	 (1 << IEEE80211_RADIOTAP_RATE) |				\
361d97e97dSmglocker 	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
371d97e97dSmglocker 	 (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL))
381d97e97dSmglocker 
391d97e97dSmglocker struct upgt_tx_radiotap_header {
401d97e97dSmglocker 	struct ieee80211_radiotap_header wt_ihdr;
411d97e97dSmglocker 	uint8_t				wt_flags;
421d97e97dSmglocker 	uint8_t				wt_rate;
431d97e97dSmglocker 	uint16_t			wt_chan_freq;
441d97e97dSmglocker 	uint16_t			wt_chan_flags;
451d97e97dSmglocker } __packed;
461d97e97dSmglocker 
471d97e97dSmglocker #define UPGT_TX_RADIOTAP_PRESENT					\
481d97e97dSmglocker 	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
491d97e97dSmglocker 	 (1 << IEEE80211_RADIOTAP_RATE) |				\
500b488b6aSmglocker 	 (1 << IEEE80211_RADIOTAP_CHANNEL))
511d97e97dSmglocker 
521d97e97dSmglocker /*
531d97e97dSmglocker  * General values.
541d97e97dSmglocker  */
551d97e97dSmglocker #define UPGT_IFACE_INDEX		0
561d97e97dSmglocker #define UPGT_CONFIG_NO			1
571d97e97dSmglocker #define UPGT_USB_TIMEOUT		1000
581d97e97dSmglocker #define UPGT_FIRMWARE_TIMEOUT		10
591d97e97dSmglocker 
601d97e97dSmglocker #define UPGT_MEMADDR_FIRMWARE_START	0x00020000	/* 512 bytes large */
611d97e97dSmglocker #define UPGT_MEMSIZE_FRAME_HEAD		0x0070
621d97e97dSmglocker #define UPGT_MEMSIZE_RX			0x3500
631d97e97dSmglocker 
641d97e97dSmglocker #define UPGT_TX_COUNT			6
651d97e97dSmglocker 
661d97e97dSmglocker /* device flags */
671d97e97dSmglocker #define UPGT_DEVICE_ATTACHED		(1 << 0)
681d97e97dSmglocker 
6902f087d8Smglocker /* leds */
7002f087d8Smglocker #define UPGT_LED_OFF			0
7102f087d8Smglocker #define UPGT_LED_ON			1
7202f087d8Smglocker #define UPGT_LED_BLINK			2
7302f087d8Smglocker 
741d97e97dSmglocker /*
751d97e97dSmglocker  * USB xfers.
761d97e97dSmglocker  */
771d97e97dSmglocker struct upgt_data {
781d97e97dSmglocker 	struct upgt_softc		*sc;
79ab0b1be7Smglocker 	struct usbd_xfer		*xfer;
801d97e97dSmglocker 	void				*buf;
811d97e97dSmglocker 	struct ieee80211_node		*ni;
821d97e97dSmglocker 	struct mbuf			*m;
831d97e97dSmglocker 	uint32_t			 addr;
841d97e97dSmglocker };
851d97e97dSmglocker 
861d97e97dSmglocker /*
871d97e97dSmglocker  * Firmware.
881d97e97dSmglocker  */
891d97e97dSmglocker #define UPGT_FW_BLOCK_SIZE		512
901d97e97dSmglocker 
911d97e97dSmglocker #define UPGT_BRA_FWTYPE_SIZE		4
921d97e97dSmglocker #define UPGT_BRA_FWTYPE_LM86		"LM86"
931d97e97dSmglocker #define UPGT_BRA_FWTYPE_LM87		"LM87"
941d97e97dSmglocker #define UPGT_BRA_FWTYPE_FMAC		"FMAC"
951d97e97dSmglocker enum upgt_fw_type {
961d97e97dSmglocker 	UPGT_FWTYPE_LM86,
971d97e97dSmglocker 	UPGT_FWTYPE_LM87,
981d97e97dSmglocker 	UPGT_FWTYPE_FMAC
991d97e97dSmglocker };
1001d97e97dSmglocker 
1011d97e97dSmglocker #define UPGT_BRA_TYPE_FW		0x80000001
1021d97e97dSmglocker #define UPGT_BRA_TYPE_VERSION		0x80000002
1031d97e97dSmglocker #define UPGT_BRA_TYPE_DEPIF		0x80000003
1041d97e97dSmglocker #define UPGT_BRA_TYPE_EXPIF		0x80000004
1051d97e97dSmglocker #define UPGT_BRA_TYPE_DESCR		0x80000101
1061d97e97dSmglocker #define UPGT_BRA_TYPE_END		0xff0000ff
1071d97e97dSmglocker struct upgt_fw_bra_option {
1081d97e97dSmglocker 	uint32_t			type;
1091d97e97dSmglocker 	uint32_t			len;
1101d97e97dSmglocker 	uint8_t				data[];
1111d97e97dSmglocker } __packed;
1121d97e97dSmglocker 
1131d97e97dSmglocker struct upgt_fw_bra_descr {
1141d97e97dSmglocker 	uint32_t			unknown1;
1151d97e97dSmglocker 	uint32_t			memaddr_space_start;
1161d97e97dSmglocker 	uint32_t			memaddr_space_end;
1171d97e97dSmglocker 	uint32_t			unknown2;
1181d97e97dSmglocker 	uint32_t			unknown3;
1191d97e97dSmglocker 	uint8_t				rates[20];
1201d97e97dSmglocker } __packed;
1211d97e97dSmglocker 
1221d97e97dSmglocker #define UPGT_X2_SIGNATURE_SIZE		4
1231d97e97dSmglocker #define UPGT_X2_SIGNATURE		"x2  "
1241d97e97dSmglocker struct upgt_fw_x2_header {
1251d97e97dSmglocker 	uint8_t				signature[4];
1261d97e97dSmglocker 	uint32_t			startaddr;
1271d97e97dSmglocker 	uint32_t			len;
1281d97e97dSmglocker 	uint32_t			crc;
1291d97e97dSmglocker } __packed;
1301d97e97dSmglocker 
1311d97e97dSmglocker /*
1321d97e97dSmglocker  * EEPROM.
1331d97e97dSmglocker  */
1341d97e97dSmglocker #define UPGT_EEPROM_SIZE		8192
1351d97e97dSmglocker #define UPGT_EEPROM_BLOCK_SIZE		1020
1361d97e97dSmglocker 
1371d97e97dSmglocker struct upgt_eeprom_header {
1381d97e97dSmglocker 	/* 14 bytes */
1391d97e97dSmglocker 	uint32_t			magic;
1401d97e97dSmglocker 	uint16_t			pad1;
1411d97e97dSmglocker 	uint16_t			preamble_len;
1421d97e97dSmglocker 	uint32_t			pad2;
1431d97e97dSmglocker 	/* data */
1441d97e97dSmglocker } __packed;
1451d97e97dSmglocker 
1461d97e97dSmglocker #define UPGT_EEPROM_TYPE_END		0x0000
1471d97e97dSmglocker #define UPGT_EEPROM_TYPE_NAME		0x0001
1481d97e97dSmglocker #define UPGT_EEPROM_TYPE_SERIAL		0x0003
1491d97e97dSmglocker #define UPGT_EEPROM_TYPE_MAC		0x0101
1501d97e97dSmglocker #define UPGT_EEPROM_TYPE_HWRX		0x1001
1511d97e97dSmglocker #define UPGT_EEPROM_TYPE_CHIP		0x1002
1521d97e97dSmglocker #define UPGT_EEPROM_TYPE_FREQ3		0x1903
1531d97e97dSmglocker #define UPGT_EEPROM_TYPE_FREQ4		0x1904
1541d97e97dSmglocker #define UPGT_EEPROM_TYPE_FREQ5		0x1905
1551d97e97dSmglocker #define UPGT_EEPROM_TYPE_FREQ6		0x1906
1561d97e97dSmglocker #define UPGT_EEPROM_TYPE_OFF		0xffff
1571d97e97dSmglocker struct upgt_eeprom_option {
1581d97e97dSmglocker 	uint16_t			len;
1591d97e97dSmglocker 	uint16_t			type;
1601d97e97dSmglocker 	uint8_t				data[];
1611d97e97dSmglocker 	/* data */
1621d97e97dSmglocker } __packed;
1631d97e97dSmglocker 
1641d97e97dSmglocker #define UPGT_EEPROM_RX_CONST		0x88
1651d97e97dSmglocker struct upgt_eeprom_option_hwrx {
1661d97e97dSmglocker 	uint32_t			pad1;
1671d97e97dSmglocker 	uint8_t				rxfilter;
1681d97e97dSmglocker 	uint8_t				pad2[15];
1691d97e97dSmglocker } __packed;
1701d97e97dSmglocker 
1711d97e97dSmglocker struct upgt_eeprom_freq3_header {
1721d97e97dSmglocker 	uint8_t				flags;
1731d97e97dSmglocker 	uint8_t				elements;
1741d97e97dSmglocker } __packed;
1751d97e97dSmglocker 
1761d97e97dSmglocker struct upgt_eeprom_freq4_header {
1771d97e97dSmglocker 	uint8_t				flags;
1781d97e97dSmglocker 	uint8_t				elements;
1791d97e97dSmglocker 	uint8_t				settings;
1801d97e97dSmglocker 	uint8_t				type;
1811d97e97dSmglocker } __packed;
1821d97e97dSmglocker 
1831d97e97dSmglocker struct upgt_eeprom_freq4_1 {
1841d97e97dSmglocker 	uint16_t			freq;
1851d97e97dSmglocker 	uint8_t				data[50];
1861d97e97dSmglocker } __packed;
1871d97e97dSmglocker 
1881d97e97dSmglocker struct upgt_eeprom_freq4_2 {
1891d97e97dSmglocker 	uint16_t			head;
1901d97e97dSmglocker 	uint8_t				subtails[4];
1911d97e97dSmglocker 	uint8_t				tail;
1921d97e97dSmglocker } __packed;
1931d97e97dSmglocker 
1941d97e97dSmglocker /*
1951d97e97dSmglocker  * LMAC protocol.
1961d97e97dSmglocker  */
197836f404eSmglocker struct upgt_lmac_mem {
198836f404eSmglocker 	uint32_t			addr;
199836f404eSmglocker 	uint32_t			chksum;
200836f404eSmglocker } __packed;
201836f404eSmglocker 
2021d97e97dSmglocker #define UPGT_H1_FLAGS_TX_MGMT		0x00	/* for TX: mgmt frame */
2031d97e97dSmglocker #define UPGT_H1_FLAGS_TX_NO_CALLBACK	0x01	/* for TX: no USB callback */
2041d97e97dSmglocker #define UPGT_H1_FLAGS_TX_DATA		0x10	/* for TX: data frame */
2058880a392Smglocker #define UPGT_H1_TYPE_RX_DATA		0x00	/* 802.11 RX data frame */
206836f404eSmglocker #define UPGT_H1_TYPE_RX_DATA_MGMT	0x04	/* 802.11 RX mgmt frame */
2078880a392Smglocker #define UPGT_H1_TYPE_TX_DATA		0x40	/* 802.11 TX data frame */
2081d97e97dSmglocker #define UPGT_H1_TYPE_CTRL		0x80	/* control frame */
2091d97e97dSmglocker struct upgt_lmac_h1 {
2101d97e97dSmglocker 	/* 4 bytes */
2111d97e97dSmglocker 	uint8_t				flags;
2121d97e97dSmglocker 	uint8_t				type;
2131d97e97dSmglocker 	uint16_t			len;
2141d97e97dSmglocker } __packed;
2151d97e97dSmglocker 
216aeb546b6Smglocker #define UPGT_H2_TYPE_TX_ACK_NO		0x0000
217aeb546b6Smglocker #define UPGT_H2_TYPE_TX_ACK_YES		0x0001
2181d97e97dSmglocker #define UPGT_H2_TYPE_MACFILTER		0x0000
2191d97e97dSmglocker #define UPGT_H2_TYPE_CHANNEL		0x0001
2201d97e97dSmglocker #define UPGT_H2_TYPE_TX_DONE		0x0008
221ec72f164Smglocker #define UPGT_H2_TYPE_STATS		0x000a
2221d97e97dSmglocker #define UPGT_H2_TYPE_EEPROM		0x000c
22302f087d8Smglocker #define UPGT_H2_TYPE_LED		0x000d
224aeb546b6Smglocker #define UPGT_H2_FLAGS_TX_ACK_NO		0x0101
225aeb546b6Smglocker #define UPGT_H2_FLAGS_TX_ACK_YES	0x0707
2261d97e97dSmglocker struct upgt_lmac_h2 {
2271d97e97dSmglocker 	/* 8 bytes */
2281d97e97dSmglocker 	uint32_t			reqid;
2291d97e97dSmglocker 	uint16_t			type;
2301d97e97dSmglocker 	uint16_t			flags;
2311d97e97dSmglocker } __packed;
2321d97e97dSmglocker 
2331d97e97dSmglocker struct upgt_lmac_header {
2341d97e97dSmglocker 	/* 12 bytes */
2351d97e97dSmglocker 	struct upgt_lmac_h1		header1;
2361d97e97dSmglocker 	struct upgt_lmac_h2		header2;
2371d97e97dSmglocker } __packed;
2381d97e97dSmglocker 
2391d97e97dSmglocker struct upgt_lmac_eeprom {
2401d97e97dSmglocker 	/* 16 bytes */
2411d97e97dSmglocker 	struct upgt_lmac_h1		header1;
2421d97e97dSmglocker 	struct upgt_lmac_h2		header2;
2431d97e97dSmglocker 	uint16_t			offset;
2441d97e97dSmglocker 	uint16_t			len;
2451d97e97dSmglocker 	/* data */
2461d97e97dSmglocker } __packed;
2471d97e97dSmglocker 
2481d97e97dSmglocker #define UPGT_FILTER_TYPE_NONE		0x0000
2491d97e97dSmglocker #define UPGT_FILTER_TYPE_STA		0x0001
2501d97e97dSmglocker #define UPGT_FILTER_TYPE_IBSS		0x0002
2511d97e97dSmglocker #define UPGT_FILTER_TYPE_HOSTAP		0x0004
2521d97e97dSmglocker #define UPGT_FILTER_TYPE_MONITOR	0x0010
2532d4d746fSmglocker #define UPGT_FILTER_TYPE_RESET		0x0020
254836f404eSmglocker #define UPGT_FILTER_UNKNOWN1		0x0002
255836f404eSmglocker #define UPGT_FILTER_UNKNOWN2		0x0ca8
256836f404eSmglocker #define UPGT_FILTER_UNKNOWN3		0xffff
2571d97e97dSmglocker struct upgt_lmac_filter {
2581d97e97dSmglocker 	struct upgt_lmac_h1		header1;
2591d97e97dSmglocker 	struct upgt_lmac_h2		header2;
260836f404eSmglocker 	/* 32 bytes */
2611d97e97dSmglocker 	uint16_t			type;
2621d97e97dSmglocker 	uint8_t				dst[IEEE80211_ADDR_LEN];
2631d97e97dSmglocker 	uint8_t				src[IEEE80211_ADDR_LEN];
2641d97e97dSmglocker 	uint16_t			unknown1;
2651d97e97dSmglocker 	uint32_t			rxaddr;
266836f404eSmglocker 	uint16_t			unknown2;
267836f404eSmglocker 	uint32_t			rxhw;
268836f404eSmglocker 	uint16_t			unknown3;
269836f404eSmglocker 	uint32_t			unknown4;
2701d97e97dSmglocker } __packed;
2711d97e97dSmglocker 
272*4b1a56afSjsg /* frequency 3 data */
2731d97e97dSmglocker struct upgt_lmac_freq3 {
2741d97e97dSmglocker 	uint16_t			freq;
2751d97e97dSmglocker 	uint8_t				data[6];
2761d97e97dSmglocker } __packed;
2771d97e97dSmglocker 
278*4b1a56afSjsg /* frequency 4 data */
2791d97e97dSmglocker struct upgt_lmac_freq4 {
2801d97e97dSmglocker 	struct upgt_eeprom_freq4_2	cmd;
2811d97e97dSmglocker 	uint8_t				pad;
2821d97e97dSmglocker };
2831d97e97dSmglocker 
284*4b1a56afSjsg /* frequency 6 data */
2851d97e97dSmglocker struct upgt_lmac_freq6 {
2861d97e97dSmglocker 	uint16_t			freq;
2871d97e97dSmglocker 	uint8_t				data[8];
2881d97e97dSmglocker } __packed;
2891d97e97dSmglocker 
2901d97e97dSmglocker #define UPGT_CHANNEL_UNKNOWN1		0x0001
2911d97e97dSmglocker #define UPGT_CHANNEL_UNKNOWN2		0x0000
2921d97e97dSmglocker #define UPGT_CHANNEL_UNKNOWN3		0x48
2931d97e97dSmglocker struct upgt_lmac_channel {
2941d97e97dSmglocker 	struct upgt_lmac_h1		header1;
2951d97e97dSmglocker 	struct upgt_lmac_h2		header2;
2961d97e97dSmglocker 	/* 112 bytes */
2971d97e97dSmglocker 	uint16_t			unknown1;
2981d97e97dSmglocker 	uint16_t			unknown2;
2991d97e97dSmglocker 	uint8_t				pad1[20];
3001d97e97dSmglocker 	struct upgt_lmac_freq6		freq6;
3011d97e97dSmglocker 	uint8_t				settings;
3021d97e97dSmglocker 	uint8_t				unknown3;
3032fa849daSmglocker 	uint8_t				freq3_1[4];
3041d97e97dSmglocker 	struct upgt_lmac_freq4		freq4[8];
3052fa849daSmglocker 	uint8_t				freq3_2[4];
3061d97e97dSmglocker 	uint32_t			pad2;
3071d97e97dSmglocker } __packed;
3081d97e97dSmglocker 
30902f087d8Smglocker #define UPGT_LED_MODE_SET		0x0003
31002f087d8Smglocker #define UPGT_LED_ACTION_OFF		0x0002
31102f087d8Smglocker #define UPGT_LED_ACTION_ON		0x0003
31202f087d8Smglocker #define UPGT_LED_ACTION_TMP_DUR		100		/* ms */
31302f087d8Smglocker struct upgt_lmac_led {
31402f087d8Smglocker 	struct upgt_lmac_h1		header1;
31502f087d8Smglocker 	struct upgt_lmac_h2		header2;
31602f087d8Smglocker 	uint16_t			mode;
31702f087d8Smglocker 	uint16_t			action_fix;
31802f087d8Smglocker 	uint16_t			action_tmp;
31902f087d8Smglocker 	uint16_t			action_tmp_dur;
32002f087d8Smglocker } __packed;
32102f087d8Smglocker 
322ec72f164Smglocker struct upgt_lmac_stats {
323ec72f164Smglocker 	struct upgt_lmac_h1		header1;
324ec72f164Smglocker 	struct upgt_lmac_h2		header2;
325ec72f164Smglocker 	uint8_t				data[76];
326ec72f164Smglocker } __packed;
327ec72f164Smglocker 
3281d97e97dSmglocker struct upgt_lmac_rx_desc {
3291d97e97dSmglocker 	struct upgt_lmac_h1		header1;
3301d97e97dSmglocker 	/* 16 bytes */
3311d97e97dSmglocker 	uint16_t			freq;
3321d97e97dSmglocker 	uint8_t				unknown1;
3331d97e97dSmglocker 	uint8_t				rate;
3341d97e97dSmglocker 	uint8_t				rssi;
3351d97e97dSmglocker 	uint8_t				pad;
3361d97e97dSmglocker 	uint16_t			unknown2;
3371d97e97dSmglocker 	uint32_t			timestamp;
3381d97e97dSmglocker 	uint32_t			unknown3;
3391d97e97dSmglocker 	uint8_t				data[];
3401d97e97dSmglocker } __packed;
3411d97e97dSmglocker 
3421d97e97dSmglocker #define UPGT_TX_DESC_KEY_EXISTS		0x01
3431d97e97dSmglocker struct upgt_lmac_tx_desc_wep {
3441d97e97dSmglocker 	uint8_t				key_exists;
3451d97e97dSmglocker 	uint8_t				key_len;
3461d97e97dSmglocker 	uint8_t				key_val[16];
3471d97e97dSmglocker } __packed;
3481d97e97dSmglocker 
3491d97e97dSmglocker #define UPGT_TX_DESC_TYPE_BEACON	0x00000000
3501d97e97dSmglocker #define UPGT_TX_DESC_TYPE_PROBE		0x00000001
3511d97e97dSmglocker #define UPGT_TX_DESC_TYPE_MGMT		0x00000002
3521d97e97dSmglocker #define UPGT_TX_DESC_TYPE_DATA		0x00000004
353aeb546b6Smglocker #define UPGT_TX_DESC_PAD3_SIZE		2
3541d97e97dSmglocker struct upgt_lmac_tx_desc {
3551d97e97dSmglocker 	struct upgt_lmac_h1		header1;
3561d97e97dSmglocker 	struct upgt_lmac_h2		header2;
3571d97e97dSmglocker 	uint8_t				rates[8];
3581d97e97dSmglocker 	uint16_t			pad1;
3591d97e97dSmglocker 	struct upgt_lmac_tx_desc_wep	wep_key;
3601d97e97dSmglocker 	uint32_t			type;
3611d97e97dSmglocker 	uint32_t			pad2;
3621d97e97dSmglocker 	uint32_t			unknown1;
3631d97e97dSmglocker 	uint32_t			unknown2;
36426068c4bSmglocker 	uint8_t				pad3[2];
3651d97e97dSmglocker 	/* 802.11 frame data */
3661d97e97dSmglocker } __packed;
3671d97e97dSmglocker 
3681d97e97dSmglocker #define UPGT_TX_DONE_DESC_STATUS_OK	0x0001
3691d97e97dSmglocker struct upgt_lmac_tx_done_desc {
3701d97e97dSmglocker 	struct upgt_lmac_h1		header1;
3711d97e97dSmglocker 	struct upgt_lmac_h2		header2;
3721d97e97dSmglocker 	uint16_t			status;
3731d97e97dSmglocker 	uint16_t			rssi;
3741d97e97dSmglocker 	uint16_t			seq;
3751d97e97dSmglocker 	uint16_t			unknown;
3761d97e97dSmglocker } __packed;
3771d97e97dSmglocker 
3781d97e97dSmglocker /*
3791d97e97dSmglocker  * Prism memory.
3801d97e97dSmglocker  */
3811d97e97dSmglocker struct upgt_memory_page {
3821d97e97dSmglocker 	uint8_t				used;
3831d97e97dSmglocker 	uint32_t			addr;
3841d97e97dSmglocker } __packed;
3851d97e97dSmglocker 
3861d97e97dSmglocker #define UPGT_MEMORY_MAX_PAGES		8
3871d97e97dSmglocker struct upgt_memory {
3881d97e97dSmglocker 	uint8_t				pages;
3891d97e97dSmglocker 	struct upgt_memory_page		page[UPGT_MEMORY_MAX_PAGES];
3901d97e97dSmglocker } __packed;
3911d97e97dSmglocker 
3921d97e97dSmglocker /*
3931d97e97dSmglocker  * Softc.
3941d97e97dSmglocker  */
3951d97e97dSmglocker struct upgt_softc {
3961d97e97dSmglocker 	struct device		 sc_dev;
3971d97e97dSmglocker 
398ab0b1be7Smglocker 	struct usbd_device	*sc_udev;
399ab0b1be7Smglocker 	struct usbd_interface	*sc_iface;
4001d97e97dSmglocker 	int			 sc_rx_no;
4011d97e97dSmglocker 	int			 sc_tx_no;
4021d97e97dSmglocker 	struct usb_task		 sc_task_newstate;
4031d97e97dSmglocker 	struct usb_task		 sc_task_tx;
404ab0b1be7Smglocker 	struct usbd_pipe	*sc_rx_pipeh;
405ab0b1be7Smglocker 	struct usbd_pipe	*sc_tx_pipeh;
4061d97e97dSmglocker 
4071d97e97dSmglocker 	struct upgt_data	 tx_data[UPGT_TX_COUNT];
4081d97e97dSmglocker 	struct upgt_data	 rx_data;
4091d97e97dSmglocker 	struct upgt_data	 cmd_data;
4101d97e97dSmglocker 	int			 tx_queued;
4111d97e97dSmglocker 
4126abbc5b4Smglocker 	uint8_t			 sc_device_type;
4131d97e97dSmglocker 	struct ieee80211com	 sc_ic;
4141d97e97dSmglocker 	enum ieee80211_state	 sc_state;
4151d97e97dSmglocker 	int			 sc_arg;
4161d97e97dSmglocker 	int			 (*sc_newstate)(struct ieee80211com *,
4171d97e97dSmglocker 				     enum ieee80211_state, int);
4181d97e97dSmglocker 	struct timeout		 scan_to;
41902f087d8Smglocker 	struct timeout		 led_to;
42002f087d8Smglocker 	int			 sc_led_blink;
4216b9aaf9aSmglocker 	unsigned		 sc_cur_chan;
4226b9aaf9aSmglocker 	uint8_t			 sc_cur_rateset[8];
4231d97e97dSmglocker 
4241d97e97dSmglocker 	uint8_t			*sc_fw;
4251d97e97dSmglocker 	size_t			 sc_fw_size;
4261d97e97dSmglocker 	int			 sc_fw_type;
4271d97e97dSmglocker 
4281d97e97dSmglocker 	/* memory addresses on device */
4291d97e97dSmglocker 	uint32_t		 sc_memaddr_frame_start;
4301d97e97dSmglocker 	uint32_t		 sc_memaddr_frame_end;
4311d97e97dSmglocker 	uint32_t		 sc_memaddr_rx_start;
4321d97e97dSmglocker 	struct upgt_memory	 sc_memory;
4331d97e97dSmglocker 
4341d97e97dSmglocker 	/* data which we found in the EEPROM */
4351d97e97dSmglocker 	uint8_t			 sc_eeprom[UPGT_EEPROM_SIZE];
4361d97e97dSmglocker 	uint16_t		 sc_eeprom_hwrx;
4371d97e97dSmglocker 	struct upgt_lmac_freq3	 sc_eeprom_freq3[IEEE80211_CHAN_MAX];
4381d97e97dSmglocker 	struct upgt_lmac_freq4	 sc_eeprom_freq4[IEEE80211_CHAN_MAX][8];
4391d97e97dSmglocker 	struct upgt_lmac_freq6	 sc_eeprom_freq6[IEEE80211_CHAN_MAX];
4401d97e97dSmglocker 	uint8_t			 sc_eeprom_freq6_settings;
4411d97e97dSmglocker 
4421d97e97dSmglocker 	/* radio tap */
4431d97e97dSmglocker #if NBPFILTER > 0
4441d97e97dSmglocker 	caddr_t			 sc_drvbpf;
4451d97e97dSmglocker 
4461d97e97dSmglocker 	/* RX */
4471d97e97dSmglocker 	union {
4481d97e97dSmglocker 				 struct upgt_rx_radiotap_header th;
4491d97e97dSmglocker 				 uint8_t pad[64];
4501d97e97dSmglocker 	}			 sc_rxtapu;
4511d97e97dSmglocker #define sc_rxtap		 sc_rxtapu.th
4521d97e97dSmglocker 	int			 sc_rxtap_len;
4531d97e97dSmglocker 
4541d97e97dSmglocker 	/* TX */
4551d97e97dSmglocker 	union {
4561d97e97dSmglocker 				 struct upgt_tx_radiotap_header th;
4571d97e97dSmglocker 			 	 uint8_t pad[64];
4581d97e97dSmglocker 	}			 sc_txtapu;
4591d97e97dSmglocker #define sc_txtap		 sc_txtapu.th
4601d97e97dSmglocker 	int			 sc_txtap_len;
4611d97e97dSmglocker #endif
4621d97e97dSmglocker };
463