1879f0effSWeongyo Jeong /* $OpenBSD: if_upgtvar.h,v 1.14 2008/02/02 13:48:44 mglocker Exp $ */ 2879f0effSWeongyo Jeong 3879f0effSWeongyo Jeong /* 4879f0effSWeongyo Jeong * Copyright (c) 2007 Marcus Glocker <mglocker@openbsd.org> 5879f0effSWeongyo Jeong * 6879f0effSWeongyo Jeong * Permission to use, copy, modify, and distribute this software for any 7879f0effSWeongyo Jeong * purpose with or without fee is hereby granted, provided that the above 8879f0effSWeongyo Jeong * copyright notice and this permission notice appear in all copies. 9879f0effSWeongyo Jeong * 10879f0effSWeongyo Jeong * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 11879f0effSWeongyo Jeong * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 12879f0effSWeongyo Jeong * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 13879f0effSWeongyo Jeong * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 14879f0effSWeongyo Jeong * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 15879f0effSWeongyo Jeong * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 16879f0effSWeongyo Jeong * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 17879f0effSWeongyo Jeong */ 18879f0effSWeongyo Jeong 19879f0effSWeongyo Jeong struct upgt_softc; 20879f0effSWeongyo Jeong 21879f0effSWeongyo Jeong /* 22879f0effSWeongyo Jeong * General values. 23879f0effSWeongyo Jeong */ 24879f0effSWeongyo Jeong enum { 25879f0effSWeongyo Jeong UPGT_BULK_RX, 26879f0effSWeongyo Jeong UPGT_BULK_TX, 27879f0effSWeongyo Jeong UPGT_N_XFERS = 2, 28879f0effSWeongyo Jeong }; 29879f0effSWeongyo Jeong 30879f0effSWeongyo Jeong #define UPGT_CONFIG_INDEX 0 31879f0effSWeongyo Jeong #define UPGT_IFACE_INDEX 0 32879f0effSWeongyo Jeong #define UPGT_USB_TIMEOUT 1000 33879f0effSWeongyo Jeong #define UPGT_FIRMWARE_TIMEOUT 10 34879f0effSWeongyo Jeong 35879f0effSWeongyo Jeong #define UPGT_MEMADDR_FIRMWARE_START 0x00020000 /* 512 bytes large */ 36879f0effSWeongyo Jeong #define UPGT_MEMSIZE_FRAME_HEAD 0x0070 37879f0effSWeongyo Jeong #define UPGT_MEMSIZE_RX 0x3500 38879f0effSWeongyo Jeong 39879f0effSWeongyo Jeong #define UPGT_RX_MAXCOUNT 6 40879f0effSWeongyo Jeong #define UPGT_TX_MAXCOUNT 128 41879f0effSWeongyo Jeong #define UPGT_TX_STAT_INTERVAL 5 42879f0effSWeongyo Jeong #define UPGT_RX_MINSZ (sizeof(struct upgt_lmac_header) + 4) 43879f0effSWeongyo Jeong 44879f0effSWeongyo Jeong /* device flags */ 45879f0effSWeongyo Jeong #define UPGT_DEVICE_ATTACHED (1 << 0) 46879f0effSWeongyo Jeong 47879f0effSWeongyo Jeong /* leds */ 48879f0effSWeongyo Jeong #define UPGT_LED_OFF 0 49879f0effSWeongyo Jeong #define UPGT_LED_ON 1 50879f0effSWeongyo Jeong #define UPGT_LED_BLINK 2 51879f0effSWeongyo Jeong 52879f0effSWeongyo Jeong /* 53879f0effSWeongyo Jeong * Firmware. 54879f0effSWeongyo Jeong */ 55879f0effSWeongyo Jeong #define UPGT_FW_BLOCK_SIZE 256 56879f0effSWeongyo Jeong 57879f0effSWeongyo Jeong #define UPGT_BRA_FWTYPE_SIZE 4 58879f0effSWeongyo Jeong #define UPGT_BRA_FWTYPE_LM86 "LM86" 59879f0effSWeongyo Jeong #define UPGT_BRA_FWTYPE_LM87 "LM87" 60879f0effSWeongyo Jeong enum upgt_fw_type { 61879f0effSWeongyo Jeong UPGT_FWTYPE_LM86, 62879f0effSWeongyo Jeong UPGT_FWTYPE_LM87 63879f0effSWeongyo Jeong }; 64879f0effSWeongyo Jeong 65879f0effSWeongyo Jeong #define UPGT_BRA_TYPE_FW 0x80000001 66879f0effSWeongyo Jeong #define UPGT_BRA_TYPE_VERSION 0x80000002 67879f0effSWeongyo Jeong #define UPGT_BRA_TYPE_DEPIF 0x80000003 68879f0effSWeongyo Jeong #define UPGT_BRA_TYPE_EXPIF 0x80000004 69879f0effSWeongyo Jeong #define UPGT_BRA_TYPE_DESCR 0x80000101 70879f0effSWeongyo Jeong #define UPGT_BRA_TYPE_END 0xff0000ff 71879f0effSWeongyo Jeong struct upgt_fw_bra_option { 72879f0effSWeongyo Jeong uint32_t type; 73879f0effSWeongyo Jeong uint32_t len; 74879f0effSWeongyo Jeong uint8_t data[]; 75879f0effSWeongyo Jeong } __packed; 76879f0effSWeongyo Jeong 77879f0effSWeongyo Jeong struct upgt_fw_bra_descr { 78879f0effSWeongyo Jeong uint32_t unknown1; 79879f0effSWeongyo Jeong uint32_t memaddr_space_start; 80879f0effSWeongyo Jeong uint32_t memaddr_space_end; 81879f0effSWeongyo Jeong uint32_t unknown2; 82879f0effSWeongyo Jeong uint32_t unknown3; 83879f0effSWeongyo Jeong uint8_t rates[20]; 84879f0effSWeongyo Jeong } __packed; 85879f0effSWeongyo Jeong 86879f0effSWeongyo Jeong #define UPGT_X2_SIGNATURE_SIZE 4 87879f0effSWeongyo Jeong #define UPGT_X2_SIGNATURE "x2 " 88879f0effSWeongyo Jeong struct upgt_fw_x2_header { 89879f0effSWeongyo Jeong uint8_t signature[4]; 90879f0effSWeongyo Jeong uint32_t startaddr; 91879f0effSWeongyo Jeong uint32_t len; 92879f0effSWeongyo Jeong uint32_t crc; 93879f0effSWeongyo Jeong } __packed; 94879f0effSWeongyo Jeong 95879f0effSWeongyo Jeong /* 96879f0effSWeongyo Jeong * EEPROM. 97879f0effSWeongyo Jeong */ 98879f0effSWeongyo Jeong #define UPGT_EEPROM_SIZE 8192 99879f0effSWeongyo Jeong #define UPGT_EEPROM_BLOCK_SIZE 1020 100879f0effSWeongyo Jeong 101879f0effSWeongyo Jeong struct upgt_eeprom_header { 102879f0effSWeongyo Jeong /* 14 bytes */ 103879f0effSWeongyo Jeong uint32_t magic; 104879f0effSWeongyo Jeong uint16_t pad1; 105879f0effSWeongyo Jeong uint16_t preamble_len; 106879f0effSWeongyo Jeong uint32_t pad2; 107879f0effSWeongyo Jeong /* data */ 108879f0effSWeongyo Jeong } __packed; 109879f0effSWeongyo Jeong 110879f0effSWeongyo Jeong #define UPGT_EEPROM_TYPE_END 0x0000 111879f0effSWeongyo Jeong #define UPGT_EEPROM_TYPE_NAME 0x0001 112879f0effSWeongyo Jeong #define UPGT_EEPROM_TYPE_SERIAL 0x0003 113879f0effSWeongyo Jeong #define UPGT_EEPROM_TYPE_MAC 0x0101 114879f0effSWeongyo Jeong #define UPGT_EEPROM_TYPE_HWRX 0x1001 115879f0effSWeongyo Jeong #define UPGT_EEPROM_TYPE_CHIP 0x1002 116879f0effSWeongyo Jeong #define UPGT_EEPROM_TYPE_FREQ3 0x1903 117879f0effSWeongyo Jeong #define UPGT_EEPROM_TYPE_FREQ4 0x1904 118879f0effSWeongyo Jeong #define UPGT_EEPROM_TYPE_FREQ5 0x1905 119879f0effSWeongyo Jeong #define UPGT_EEPROM_TYPE_FREQ6 0x1906 120879f0effSWeongyo Jeong #define UPGT_EEPROM_TYPE_OFF 0xffff 121879f0effSWeongyo Jeong struct upgt_eeprom_option { 122879f0effSWeongyo Jeong uint16_t len; 123879f0effSWeongyo Jeong uint16_t type; 124879f0effSWeongyo Jeong uint8_t data[]; 125879f0effSWeongyo Jeong /* data */ 126879f0effSWeongyo Jeong } __packed; 127879f0effSWeongyo Jeong 128879f0effSWeongyo Jeong #define UPGT_EEPROM_RX_CONST 0x88 129879f0effSWeongyo Jeong struct upgt_eeprom_option_hwrx { 130879f0effSWeongyo Jeong uint32_t pad1; 131879f0effSWeongyo Jeong uint8_t rxfilter; 132879f0effSWeongyo Jeong uint8_t pad2[15]; 133879f0effSWeongyo Jeong } __packed; 134879f0effSWeongyo Jeong 135879f0effSWeongyo Jeong struct upgt_eeprom_freq3_header { 136879f0effSWeongyo Jeong uint8_t flags; 137879f0effSWeongyo Jeong uint8_t elements; 138879f0effSWeongyo Jeong } __packed; 139879f0effSWeongyo Jeong 140879f0effSWeongyo Jeong struct upgt_eeprom_freq4_header { 141879f0effSWeongyo Jeong uint8_t flags; 142879f0effSWeongyo Jeong uint8_t elements; 143879f0effSWeongyo Jeong uint8_t settings; 144879f0effSWeongyo Jeong uint8_t type; 145879f0effSWeongyo Jeong } __packed; 146879f0effSWeongyo Jeong 147879f0effSWeongyo Jeong struct upgt_eeprom_freq4_1 { 148879f0effSWeongyo Jeong uint16_t freq; 149879f0effSWeongyo Jeong uint8_t data[50]; 150879f0effSWeongyo Jeong } __packed; 151879f0effSWeongyo Jeong 152879f0effSWeongyo Jeong struct upgt_eeprom_freq4_2 { 153879f0effSWeongyo Jeong uint16_t head; 154879f0effSWeongyo Jeong uint8_t subtails[4]; 155879f0effSWeongyo Jeong uint8_t tail; 156879f0effSWeongyo Jeong } __packed; 157879f0effSWeongyo Jeong 158879f0effSWeongyo Jeong /* 159879f0effSWeongyo Jeong * LMAC protocol. 160879f0effSWeongyo Jeong */ 161879f0effSWeongyo Jeong struct upgt_lmac_mem { 162879f0effSWeongyo Jeong uint32_t addr; 163879f0effSWeongyo Jeong uint32_t chksum; 164879f0effSWeongyo Jeong } __packed; 165879f0effSWeongyo Jeong 166879f0effSWeongyo Jeong #define UPGT_H1_FLAGS_TX_MGMT 0x00 /* for TX: mgmt frame */ 167879f0effSWeongyo Jeong #define UPGT_H1_FLAGS_TX_NO_CALLBACK 0x01 /* for TX: no USB callback */ 168879f0effSWeongyo Jeong #define UPGT_H1_FLAGS_TX_DATA 0x10 /* for TX: data frame */ 169879f0effSWeongyo Jeong #define UPGT_H1_TYPE_RX_DATA 0x00 /* 802.11 RX data frame */ 170879f0effSWeongyo Jeong #define UPGT_H1_TYPE_RX_DATA_MGMT 0x04 /* 802.11 RX mgmt frame */ 171879f0effSWeongyo Jeong #define UPGT_H1_TYPE_TX_DATA 0x40 /* 802.11 TX data frame */ 172879f0effSWeongyo Jeong #define UPGT_H1_TYPE_CTRL 0x80 /* control frame */ 173879f0effSWeongyo Jeong struct upgt_lmac_h1 { 174879f0effSWeongyo Jeong /* 4 bytes */ 175879f0effSWeongyo Jeong uint8_t flags; 176879f0effSWeongyo Jeong uint8_t type; 177879f0effSWeongyo Jeong uint16_t len; 178879f0effSWeongyo Jeong } __packed; 179879f0effSWeongyo Jeong 180879f0effSWeongyo Jeong #define UPGT_H2_TYPE_TX_ACK_NO 0x0000 181879f0effSWeongyo Jeong #define UPGT_H2_TYPE_TX_ACK_YES 0x0001 182879f0effSWeongyo Jeong #define UPGT_H2_TYPE_MACFILTER 0x0000 183879f0effSWeongyo Jeong #define UPGT_H2_TYPE_CHANNEL 0x0001 184879f0effSWeongyo Jeong #define UPGT_H2_TYPE_TX_DONE 0x0008 185879f0effSWeongyo Jeong #define UPGT_H2_TYPE_STATS 0x000a 186879f0effSWeongyo Jeong #define UPGT_H2_TYPE_EEPROM 0x000c 187879f0effSWeongyo Jeong #define UPGT_H2_TYPE_LED 0x000d 188879f0effSWeongyo Jeong #define UPGT_H2_FLAGS_TX_ACK_NO 0x0101 189879f0effSWeongyo Jeong #define UPGT_H2_FLAGS_TX_ACK_YES 0x0707 190879f0effSWeongyo Jeong struct upgt_lmac_h2 { 191879f0effSWeongyo Jeong /* 8 bytes */ 192879f0effSWeongyo Jeong uint32_t reqid; 193879f0effSWeongyo Jeong uint16_t type; 194879f0effSWeongyo Jeong uint16_t flags; 195879f0effSWeongyo Jeong } __packed; 196879f0effSWeongyo Jeong 197879f0effSWeongyo Jeong struct upgt_lmac_header { 198879f0effSWeongyo Jeong /* 12 bytes */ 199879f0effSWeongyo Jeong struct upgt_lmac_h1 header1; 200879f0effSWeongyo Jeong struct upgt_lmac_h2 header2; 201879f0effSWeongyo Jeong } __packed; 202879f0effSWeongyo Jeong 203879f0effSWeongyo Jeong struct upgt_lmac_eeprom { 204879f0effSWeongyo Jeong /* 16 bytes */ 205879f0effSWeongyo Jeong struct upgt_lmac_h1 header1; 206879f0effSWeongyo Jeong struct upgt_lmac_h2 header2; 207879f0effSWeongyo Jeong uint16_t offset; 208879f0effSWeongyo Jeong uint16_t len; 209879f0effSWeongyo Jeong /* data */ 210879f0effSWeongyo Jeong } __packed; 211879f0effSWeongyo Jeong 212879f0effSWeongyo Jeong #define UPGT_FILTER_TYPE_NONE 0x0000 213879f0effSWeongyo Jeong #define UPGT_FILTER_TYPE_STA 0x0001 214879f0effSWeongyo Jeong #define UPGT_FILTER_TYPE_IBSS 0x0002 215879f0effSWeongyo Jeong #define UPGT_FILTER_TYPE_HOSTAP 0x0004 216879f0effSWeongyo Jeong #define UPGT_FILTER_TYPE_MONITOR 0x0010 217879f0effSWeongyo Jeong #define UPGT_FILTER_TYPE_RESET 0x0020 218879f0effSWeongyo Jeong #define UPGT_FILTER_UNKNOWN1 0x0002 219879f0effSWeongyo Jeong #define UPGT_FILTER_UNKNOWN2 0x0ca8 220879f0effSWeongyo Jeong #define UPGT_FILTER_UNKNOWN3 0xffff 221879f0effSWeongyo Jeong #define UPGT_FILTER_MONITOR_UNKNOWN1 0x0000 222879f0effSWeongyo Jeong #define UPGT_FILTER_MONITOR_UNKNOWN2 0x0000 223879f0effSWeongyo Jeong #define UPGT_FILTER_MONITOR_UNKNOWN3 0x0000 224879f0effSWeongyo Jeong struct upgt_lmac_filter { 225879f0effSWeongyo Jeong struct upgt_lmac_h1 header1; 226879f0effSWeongyo Jeong struct upgt_lmac_h2 header2; 227879f0effSWeongyo Jeong /* 32 bytes */ 228879f0effSWeongyo Jeong uint16_t type; 229879f0effSWeongyo Jeong uint8_t dst[IEEE80211_ADDR_LEN]; 230879f0effSWeongyo Jeong uint8_t src[IEEE80211_ADDR_LEN]; 231879f0effSWeongyo Jeong uint16_t unknown1; 232879f0effSWeongyo Jeong uint32_t rxaddr; 233879f0effSWeongyo Jeong uint16_t unknown2; 234879f0effSWeongyo Jeong uint32_t rxhw; 235879f0effSWeongyo Jeong uint16_t unknown3; 236879f0effSWeongyo Jeong uint32_t unknown4; 237879f0effSWeongyo Jeong } __packed; 238879f0effSWeongyo Jeong 239879f0effSWeongyo Jeong /* frequence 3 data */ 240879f0effSWeongyo Jeong struct upgt_lmac_freq3 { 241879f0effSWeongyo Jeong uint16_t freq; 242879f0effSWeongyo Jeong uint8_t data[6]; 243879f0effSWeongyo Jeong } __packed; 244879f0effSWeongyo Jeong 245879f0effSWeongyo Jeong /* frequence 4 data */ 246879f0effSWeongyo Jeong struct upgt_lmac_freq4 { 247879f0effSWeongyo Jeong struct upgt_eeprom_freq4_2 cmd; 248879f0effSWeongyo Jeong uint8_t pad; 249879f0effSWeongyo Jeong }; 250879f0effSWeongyo Jeong 251879f0effSWeongyo Jeong /* frequence 6 data */ 252879f0effSWeongyo Jeong struct upgt_lmac_freq6 { 253879f0effSWeongyo Jeong uint16_t freq; 254879f0effSWeongyo Jeong uint8_t data[8]; 255879f0effSWeongyo Jeong } __packed; 256879f0effSWeongyo Jeong 257879f0effSWeongyo Jeong #define UPGT_CHANNEL_UNKNOWN1 0x0001 258879f0effSWeongyo Jeong #define UPGT_CHANNEL_UNKNOWN2 0x0000 259879f0effSWeongyo Jeong #define UPGT_CHANNEL_UNKNOWN3 0x48 260879f0effSWeongyo Jeong struct upgt_lmac_channel { 261879f0effSWeongyo Jeong struct upgt_lmac_h1 header1; 262879f0effSWeongyo Jeong struct upgt_lmac_h2 header2; 263879f0effSWeongyo Jeong /* 112 bytes */ 264879f0effSWeongyo Jeong uint16_t unknown1; 265879f0effSWeongyo Jeong uint16_t unknown2; 266879f0effSWeongyo Jeong uint8_t pad1[20]; 267879f0effSWeongyo Jeong struct upgt_lmac_freq6 freq6; 268879f0effSWeongyo Jeong uint8_t settings; 269879f0effSWeongyo Jeong uint8_t unknown3; 270879f0effSWeongyo Jeong uint8_t freq3_1[4]; 271879f0effSWeongyo Jeong struct upgt_lmac_freq4 freq4[8]; 272879f0effSWeongyo Jeong uint8_t freq3_2[4]; 273879f0effSWeongyo Jeong uint32_t pad2; 274879f0effSWeongyo Jeong } __packed; 275879f0effSWeongyo Jeong 276879f0effSWeongyo Jeong #define UPGT_LED_MODE_SET 0x0003 277879f0effSWeongyo Jeong #define UPGT_LED_ACTION_OFF 0x0002 278879f0effSWeongyo Jeong #define UPGT_LED_ACTION_ON 0x0003 279879f0effSWeongyo Jeong #define UPGT_LED_ACTION_TMP_DUR 100 /* ms */ 280879f0effSWeongyo Jeong struct upgt_lmac_led { 281879f0effSWeongyo Jeong struct upgt_lmac_h1 header1; 282879f0effSWeongyo Jeong struct upgt_lmac_h2 header2; 283879f0effSWeongyo Jeong uint16_t mode; 284879f0effSWeongyo Jeong uint16_t action_fix; 285879f0effSWeongyo Jeong uint16_t action_tmp; 286879f0effSWeongyo Jeong uint16_t action_tmp_dur; 287879f0effSWeongyo Jeong } __packed; 288879f0effSWeongyo Jeong 289879f0effSWeongyo Jeong struct upgt_lmac_stats { 290879f0effSWeongyo Jeong struct upgt_lmac_h1 header1; 291879f0effSWeongyo Jeong struct upgt_lmac_h2 header2; 292879f0effSWeongyo Jeong uint8_t data[76]; 293879f0effSWeongyo Jeong } __packed; 294879f0effSWeongyo Jeong 295879f0effSWeongyo Jeong struct upgt_lmac_rx_desc { 296879f0effSWeongyo Jeong struct upgt_lmac_h1 header1; 297879f0effSWeongyo Jeong /* 16 bytes */ 298879f0effSWeongyo Jeong uint16_t freq; 299879f0effSWeongyo Jeong uint8_t unknown1; 300879f0effSWeongyo Jeong uint8_t rate; 301879f0effSWeongyo Jeong uint8_t rssi; 302879f0effSWeongyo Jeong uint8_t pad; 303879f0effSWeongyo Jeong uint16_t unknown2; 304879f0effSWeongyo Jeong uint32_t timestamp; 305879f0effSWeongyo Jeong uint32_t unknown3; 306879f0effSWeongyo Jeong uint8_t data[]; 307879f0effSWeongyo Jeong } __packed; 308879f0effSWeongyo Jeong 309879f0effSWeongyo Jeong #define UPGT_TX_DESC_KEY_EXISTS 0x01 310879f0effSWeongyo Jeong struct upgt_lmac_tx_desc_wep { 311879f0effSWeongyo Jeong uint8_t key_exists; 312879f0effSWeongyo Jeong uint8_t key_len; 313879f0effSWeongyo Jeong uint8_t key_val[16]; 314879f0effSWeongyo Jeong } __packed; 315879f0effSWeongyo Jeong 316879f0effSWeongyo Jeong #define UPGT_TX_DESC_TYPE_BEACON 0x00000000 317879f0effSWeongyo Jeong #define UPGT_TX_DESC_TYPE_PROBE 0x00000001 318879f0effSWeongyo Jeong #define UPGT_TX_DESC_TYPE_MGMT 0x00000002 319879f0effSWeongyo Jeong #define UPGT_TX_DESC_TYPE_DATA 0x00000004 320879f0effSWeongyo Jeong #define UPGT_TX_DESC_PAD3_SIZE 2 321879f0effSWeongyo Jeong struct upgt_lmac_tx_desc { 322879f0effSWeongyo Jeong struct upgt_lmac_h1 header1; 323879f0effSWeongyo Jeong struct upgt_lmac_h2 header2; 324879f0effSWeongyo Jeong uint8_t rates[8]; 325879f0effSWeongyo Jeong uint16_t pad1; 326879f0effSWeongyo Jeong struct upgt_lmac_tx_desc_wep wep_key; 327879f0effSWeongyo Jeong uint32_t type; 328879f0effSWeongyo Jeong uint32_t pad2; 329879f0effSWeongyo Jeong uint32_t unknown1; 330879f0effSWeongyo Jeong uint32_t unknown2; 331879f0effSWeongyo Jeong uint8_t pad3[2]; 332879f0effSWeongyo Jeong /* 802.11 frame data */ 333879f0effSWeongyo Jeong } __packed; 334879f0effSWeongyo Jeong 335879f0effSWeongyo Jeong #define UPGT_TX_DONE_DESC_STATUS_OK 0x0001 336879f0effSWeongyo Jeong struct upgt_lmac_tx_done_desc { 337879f0effSWeongyo Jeong struct upgt_lmac_h1 header1; 338879f0effSWeongyo Jeong struct upgt_lmac_h2 header2; 339879f0effSWeongyo Jeong uint16_t status; 340879f0effSWeongyo Jeong uint16_t rssi; 341879f0effSWeongyo Jeong uint16_t seq; 342879f0effSWeongyo Jeong uint16_t unknown; 343879f0effSWeongyo Jeong } __packed; 344879f0effSWeongyo Jeong 345879f0effSWeongyo Jeong /* 346879f0effSWeongyo Jeong * USB xfers. 347879f0effSWeongyo Jeong */ 348879f0effSWeongyo Jeong struct upgt_data { 349879f0effSWeongyo Jeong uint8_t *buf; 350879f0effSWeongyo Jeong uint32_t buflen; 351879f0effSWeongyo Jeong struct ieee80211_node *ni; 352879f0effSWeongyo Jeong struct mbuf *m; 353879f0effSWeongyo Jeong uint32_t addr; 354879f0effSWeongyo Jeong STAILQ_ENTRY(upgt_data) next; 355879f0effSWeongyo Jeong }; 356879f0effSWeongyo Jeong typedef STAILQ_HEAD(, upgt_data) upgt_datahead; 357879f0effSWeongyo Jeong 358879f0effSWeongyo Jeong /* 359879f0effSWeongyo Jeong * Prism memory. 360879f0effSWeongyo Jeong */ 361879f0effSWeongyo Jeong struct upgt_memory_page { 362879f0effSWeongyo Jeong uint8_t used; 363879f0effSWeongyo Jeong uint32_t addr; 364879f0effSWeongyo Jeong } __packed; 365879f0effSWeongyo Jeong 366879f0effSWeongyo Jeong #define UPGT_MEMORY_MAX_PAGES 8 367879f0effSWeongyo Jeong struct upgt_memory { 368879f0effSWeongyo Jeong uint8_t pages; 369879f0effSWeongyo Jeong struct upgt_memory_page page[UPGT_MEMORY_MAX_PAGES]; 370879f0effSWeongyo Jeong } __packed; 371879f0effSWeongyo Jeong 372879f0effSWeongyo Jeong /* 373879f0effSWeongyo Jeong * BPF 374879f0effSWeongyo Jeong */ 375879f0effSWeongyo Jeong struct upgt_rx_radiotap_header { 376879f0effSWeongyo Jeong struct ieee80211_radiotap_header wr_ihdr; 377879f0effSWeongyo Jeong uint8_t wr_flags; 378879f0effSWeongyo Jeong uint8_t wr_rate; 379879f0effSWeongyo Jeong uint16_t wr_chan_freq; 380879f0effSWeongyo Jeong uint16_t wr_chan_flags; 381879f0effSWeongyo Jeong int8_t wr_antsignal; 382e8353a7aSHans Petter Selasky } __packed __aligned(8); 383879f0effSWeongyo Jeong 384879f0effSWeongyo Jeong #define UPGT_RX_RADIOTAP_PRESENT \ 385879f0effSWeongyo Jeong ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 386879f0effSWeongyo Jeong (1 << IEEE80211_RADIOTAP_RATE) | \ 387879f0effSWeongyo Jeong (1 << IEEE80211_RADIOTAP_CHANNEL) | \ 388879f0effSWeongyo Jeong (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL)) 389879f0effSWeongyo Jeong 390879f0effSWeongyo Jeong struct upgt_tx_radiotap_header { 391879f0effSWeongyo Jeong struct ieee80211_radiotap_header wt_ihdr; 392879f0effSWeongyo Jeong uint8_t wt_flags; 393879f0effSWeongyo Jeong uint8_t wt_rate; 394879f0effSWeongyo Jeong uint16_t wt_chan_freq; 395879f0effSWeongyo Jeong uint16_t wt_chan_flags; 396*786ac703SAndriy Voskoboinyk } __packed; 397879f0effSWeongyo Jeong 398879f0effSWeongyo Jeong #define UPGT_TX_RADIOTAP_PRESENT \ 399879f0effSWeongyo Jeong ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 400879f0effSWeongyo Jeong (1 << IEEE80211_RADIOTAP_RATE) | \ 401879f0effSWeongyo Jeong (1 << IEEE80211_RADIOTAP_CHANNEL)) 402879f0effSWeongyo Jeong 403879f0effSWeongyo Jeong struct upgt_stat { 404879f0effSWeongyo Jeong uint32_t st_tx_active; 405879f0effSWeongyo Jeong uint32_t st_tx_inactive; 406879f0effSWeongyo Jeong uint32_t st_tx_pending; 407879f0effSWeongyo Jeong }; 408879f0effSWeongyo Jeong 409879f0effSWeongyo Jeong #define UPGT_STAT_INC(sc, var) (sc)->sc_stat.var++ 410879f0effSWeongyo Jeong #define UPGT_STAT_DEC(sc, var) (sc)->sc_stat.var-- 411879f0effSWeongyo Jeong 412879f0effSWeongyo Jeong struct upgt_vap { 413879f0effSWeongyo Jeong struct ieee80211vap vap; 414879f0effSWeongyo Jeong int (*newstate)(struct ieee80211vap *, 415879f0effSWeongyo Jeong enum ieee80211_state, int); 416879f0effSWeongyo Jeong }; 417879f0effSWeongyo Jeong #define UPGT_VAP(vap) ((struct upgt_vap *)(vap)) 418879f0effSWeongyo Jeong 419879f0effSWeongyo Jeong struct upgt_softc { 4207a79cebfSGleb Smirnoff struct ieee80211com sc_ic; 4217a79cebfSGleb Smirnoff struct mbufq sc_snd; 422879f0effSWeongyo Jeong device_t sc_dev; 423760bc48eSAndrew Thompson struct usb_device *sc_udev; 424c180b398SHans Petter Selasky void *sc_rx_dma_buf; 425c180b398SHans Petter Selasky void *sc_tx_dma_buf; 426879f0effSWeongyo Jeong struct mtx sc_mtx; 427879f0effSWeongyo Jeong struct upgt_stat sc_stat; 428879f0effSWeongyo Jeong int sc_flags; 429879f0effSWeongyo Jeong #define UPGT_FLAG_FWLOADED (1 << 0) 430879f0effSWeongyo Jeong #define UPGT_FLAG_INITDONE (1 << 1) 431645e4d17SHans Petter Selasky #define UPGT_FLAG_DETACHED (1 << 2) 432879f0effSWeongyo Jeong int sc_debug; 433879f0effSWeongyo Jeong 434879f0effSWeongyo Jeong enum ieee80211_state sc_state; 435879f0effSWeongyo Jeong int sc_arg; 436879f0effSWeongyo Jeong int sc_led_blink; 437879f0effSWeongyo Jeong struct callout sc_led_ch; 438879f0effSWeongyo Jeong uint8_t sc_cur_rateset[8]; 439879f0effSWeongyo Jeong 440879f0effSWeongyo Jeong /* watchdog */ 441879f0effSWeongyo Jeong int sc_tx_timer; 442879f0effSWeongyo Jeong struct callout sc_watchdog_ch; 443879f0effSWeongyo Jeong 444879f0effSWeongyo Jeong /* Firmware. */ 445879f0effSWeongyo Jeong int sc_fw_type; 446879f0effSWeongyo Jeong /* memory addresses on device */ 447879f0effSWeongyo Jeong uint32_t sc_memaddr_frame_start; 448879f0effSWeongyo Jeong uint32_t sc_memaddr_frame_end; 449879f0effSWeongyo Jeong uint32_t sc_memaddr_rx_start; 450879f0effSWeongyo Jeong struct upgt_memory sc_memory; 451879f0effSWeongyo Jeong 452879f0effSWeongyo Jeong /* data which we found in the EEPROM */ 4531b9c9ab2SHans Petter Selasky uint8_t sc_eeprom[2 * UPGT_EEPROM_SIZE] __aligned(4); 454879f0effSWeongyo Jeong uint16_t sc_eeprom_hwrx; 455879f0effSWeongyo Jeong struct upgt_lmac_freq3 sc_eeprom_freq3[IEEE80211_CHAN_MAX]; 456879f0effSWeongyo Jeong struct upgt_lmac_freq4 sc_eeprom_freq4[IEEE80211_CHAN_MAX][8]; 457879f0effSWeongyo Jeong struct upgt_lmac_freq6 sc_eeprom_freq6[IEEE80211_CHAN_MAX]; 458879f0effSWeongyo Jeong uint8_t sc_eeprom_freq6_settings; 459879f0effSWeongyo Jeong 460879f0effSWeongyo Jeong /* RX/TX */ 461760bc48eSAndrew Thompson struct usb_xfer *sc_xfer[UPGT_N_XFERS]; 462879f0effSWeongyo Jeong int sc_rx_no; 463879f0effSWeongyo Jeong int sc_tx_no; 464879f0effSWeongyo Jeong struct upgt_data sc_rx_data[UPGT_RX_MAXCOUNT]; 465879f0effSWeongyo Jeong upgt_datahead sc_rx_active; 466879f0effSWeongyo Jeong upgt_datahead sc_rx_inactive; 467879f0effSWeongyo Jeong struct upgt_data sc_tx_data[UPGT_TX_MAXCOUNT]; 468879f0effSWeongyo Jeong upgt_datahead sc_tx_active; 469879f0effSWeongyo Jeong upgt_datahead sc_tx_inactive; 470879f0effSWeongyo Jeong upgt_datahead sc_tx_pending; 471879f0effSWeongyo Jeong 472879f0effSWeongyo Jeong /* BPF */ 473879f0effSWeongyo Jeong struct upgt_rx_radiotap_header sc_rxtap; 474879f0effSWeongyo Jeong struct upgt_tx_radiotap_header sc_txtap; 475879f0effSWeongyo Jeong }; 476879f0effSWeongyo Jeong 477879f0effSWeongyo Jeong #define UPGT_LOCK(sc) mtx_lock(&(sc)->sc_mtx) 478879f0effSWeongyo Jeong #define UPGT_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx) 479879f0effSWeongyo Jeong #define UPGT_ASSERT_LOCKED(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED) 480