Home | History | Annotate | Line # | Download | only in usb
if_upgtvar.h revision 1.7
      1  1.7   andvar /*	$NetBSD: if_upgtvar.h,v 1.7 2021/08/21 11:55:25 andvar 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.4      mrg };
     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.4      mrg };
     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.2    skrll 	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.7   andvar /* frequency 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.7   andvar /* frequency 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.7   andvar /* frequency 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.3     maxv 	enum {
    402  1.3     maxv 		UPGT_INIT_NONE,
    403  1.3     maxv 		UPGT_INIT_INITED
    404  1.3     maxv 	} sc_init_state;
    405  1.2    skrll 	struct usbd_device *	 sc_udev;
    406  1.2    skrll 	struct usbd_interface *	 sc_iface;
    407  1.1  tsutsui 	int			 sc_rx_no;
    408  1.1  tsutsui 	int			 sc_tx_no;
    409  1.1  tsutsui 	struct usb_task		 sc_task_newstate;
    410  1.1  tsutsui 	struct usb_task		 sc_task_tx;
    411  1.2    skrll 	struct usbd_pipe *	 sc_rx_pipeh;
    412  1.2    skrll 	struct usbd_pipe *	 sc_tx_pipeh;
    413  1.1  tsutsui 
    414  1.1  tsutsui 	struct upgt_data	 tx_data[UPGT_TX_COUNT];
    415  1.1  tsutsui 	struct upgt_data	 rx_data;
    416  1.1  tsutsui 	struct upgt_data	 cmd_data;
    417  1.1  tsutsui 	int			 tx_queued;
    418  1.1  tsutsui 	kmutex_t		 sc_mtx;
    419  1.5    skrll 	kcondvar_t		 sc_cv;
    420  1.1  tsutsui 
    421  1.6  thorpej 	kmutex_t		 sc_media_mtx;	/* XXX */
    422  1.6  thorpej 
    423  1.1  tsutsui 	uint8_t			 sc_device_type;
    424  1.1  tsutsui 	struct ieee80211com	 sc_ic;
    425  1.1  tsutsui 	enum ieee80211_state	 sc_state;
    426  1.1  tsutsui 	int			 sc_arg;
    427  1.1  tsutsui 	int			 (*sc_newstate)(struct ieee80211com *,
    428  1.1  tsutsui 				     enum ieee80211_state, int);
    429  1.1  tsutsui 	callout_t		 scan_to;
    430  1.1  tsutsui 	callout_t		 led_to;
    431  1.1  tsutsui 	int			 sc_led_blink;
    432  1.1  tsutsui 	uint8_t			 sc_cur_rateset[8];
    433  1.1  tsutsui 
    434  1.1  tsutsui 	int			 sc_flags;
    435  1.1  tsutsui 	uint8_t			*sc_fw;
    436  1.1  tsutsui 	size_t			 sc_fw_size;
    437  1.1  tsutsui 	int			 sc_fw_type;
    438  1.1  tsutsui 
    439  1.1  tsutsui 	/* memory addresses on device */
    440  1.1  tsutsui 	uint32_t		 sc_memaddr_frame_start;
    441  1.1  tsutsui 	uint32_t		 sc_memaddr_frame_end;
    442  1.1  tsutsui 	uint32_t		 sc_memaddr_rx_start;
    443  1.1  tsutsui 	struct upgt_memory	 sc_memory;
    444  1.1  tsutsui 
    445  1.1  tsutsui 	/* data which we found in the EEPROM */
    446  1.1  tsutsui 	uint8_t			 sc_eeprom[UPGT_EEPROM_SIZE];
    447  1.1  tsutsui 	uint16_t		 sc_eeprom_hwrx;
    448  1.1  tsutsui 	struct upgt_lmac_freq3	 sc_eeprom_freq3[IEEE80211_CHAN_MAX];
    449  1.1  tsutsui 	struct upgt_lmac_freq4	 sc_eeprom_freq4[IEEE80211_CHAN_MAX][8];
    450  1.1  tsutsui 	struct upgt_lmac_freq6	 sc_eeprom_freq6[IEEE80211_CHAN_MAX];
    451  1.1  tsutsui 	uint8_t			 sc_eeprom_freq6_settings;
    452  1.1  tsutsui 
    453  1.1  tsutsui 	/* radio tap */
    454  1.1  tsutsui 	struct bpf_if		*sc_drvbpf;
    455  1.1  tsutsui 
    456  1.1  tsutsui 	/* RX */
    457  1.1  tsutsui 	union {
    458  1.1  tsutsui 				 struct upgt_rx_radiotap_header th;
    459  1.1  tsutsui 				 uint8_t pad[64];
    460  1.1  tsutsui 	}			 sc_rxtapu;
    461  1.1  tsutsui #define sc_rxtap		 sc_rxtapu.th
    462  1.1  tsutsui 	int			 sc_rxtap_len;
    463  1.1  tsutsui 
    464  1.1  tsutsui 	/* TX */
    465  1.1  tsutsui 	union {
    466  1.1  tsutsui 				 struct upgt_tx_radiotap_header th;
    467  1.1  tsutsui 				 uint8_t pad[64];
    468  1.1  tsutsui 	}			 sc_txtapu;
    469  1.1  tsutsui #define sc_txtap		 sc_txtapu.th
    470  1.1  tsutsui 	int			 sc_txtap_len;
    471  1.1  tsutsui };
    472