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