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