1*c2d905cbSgson /* $NetBSD: if_runvar.h,v 1.9 2020/06/06 13:53:43 gson Exp $ */ 29cdb1c70Snonaka /* $OpenBSD: if_runvar.h,v 1.8 2010/02/08 18:46:47 damien Exp $ */ 39cdb1c70Snonaka 49cdb1c70Snonaka /*- 59cdb1c70Snonaka * Copyright (c) 2008,2009 Damien Bergamini <damien.bergamini@free.fr> 69cdb1c70Snonaka * 79cdb1c70Snonaka * Permission to use, copy, modify, and distribute this software for any 89cdb1c70Snonaka * purpose with or without fee is hereby granted, provided that the above 99cdb1c70Snonaka * copyright notice and this permission notice appear in all copies. 109cdb1c70Snonaka * 119cdb1c70Snonaka * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 129cdb1c70Snonaka * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 139cdb1c70Snonaka * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 149cdb1c70Snonaka * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 159cdb1c70Snonaka * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 169cdb1c70Snonaka * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 179cdb1c70Snonaka * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 189cdb1c70Snonaka */ 199cdb1c70Snonaka 209cdb1c70Snonaka #define RUN_MAX_RXSZ \ 219cdb1c70Snonaka 4096 229cdb1c70Snonaka #if 0 239cdb1c70Snonaka (sizeof(uint32_t) + \ 249cdb1c70Snonaka sizeof(struct rt2860_rxwi) + \ 259cdb1c70Snonaka sizeof(uint16_t) + \ 269cdb1c70Snonaka MCLBYTES + \ 279cdb1c70Snonaka sizeof(struct rt2870_rxd)) 289cdb1c70Snonaka #endif 299cdb1c70Snonaka /* NB: "11" is the maximum number of padding bytes needed for Tx */ 309cdb1c70Snonaka #define RUN_MAX_TXSZ \ 319cdb1c70Snonaka (sizeof(struct rt2870_txd) + \ 32d164e220Smlelstv sizeof(struct rt2860_txwi) + \ 339cdb1c70Snonaka MCLBYTES + 11) 349cdb1c70Snonaka 359cdb1c70Snonaka #define RUN_TX_TIMEOUT 5000 /* ms */ 369cdb1c70Snonaka 379cdb1c70Snonaka #define RUN_RX_RING_COUNT 1 389cdb1c70Snonaka #define RUN_TX_RING_COUNT 8 399cdb1c70Snonaka 40d164e220Smlelstv #define RT2870_WCID_MAX 64 419cdb1c70Snonaka #define RUN_AID2WCID(aid) ((aid) & 0xff) 429cdb1c70Snonaka 439cdb1c70Snonaka struct run_rx_radiotap_header { 449cdb1c70Snonaka struct ieee80211_radiotap_header wr_ihdr; 459cdb1c70Snonaka uint8_t wr_flags; 469cdb1c70Snonaka uint8_t wr_rate; 479cdb1c70Snonaka uint16_t wr_chan_freq; 489cdb1c70Snonaka uint16_t wr_chan_flags; 499cdb1c70Snonaka uint8_t wr_dbm_antsignal; 509cdb1c70Snonaka uint8_t wr_antenna; 519cdb1c70Snonaka uint8_t wr_antsignal; 5249e18393Smrg }; 539cdb1c70Snonaka 549cdb1c70Snonaka #define RUN_RX_RADIOTAP_PRESENT \ 559cdb1c70Snonaka (1 << IEEE80211_RADIOTAP_FLAGS | \ 569cdb1c70Snonaka 1 << IEEE80211_RADIOTAP_RATE | \ 579cdb1c70Snonaka 1 << IEEE80211_RADIOTAP_CHANNEL | \ 589cdb1c70Snonaka 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL | \ 599cdb1c70Snonaka 1 << IEEE80211_RADIOTAP_ANTENNA | \ 609cdb1c70Snonaka 1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL) 619cdb1c70Snonaka 629cdb1c70Snonaka struct run_tx_radiotap_header { 639cdb1c70Snonaka struct ieee80211_radiotap_header wt_ihdr; 649cdb1c70Snonaka uint8_t wt_flags; 659cdb1c70Snonaka uint8_t wt_rate; 669cdb1c70Snonaka uint16_t wt_chan_freq; 679cdb1c70Snonaka uint16_t wt_chan_flags; 689cdb1c70Snonaka uint8_t wt_hwqueue; 6949e18393Smrg }; 709cdb1c70Snonaka 719cdb1c70Snonaka #define RUN_TX_RADIOTAP_PRESENT \ 729cdb1c70Snonaka (1 << IEEE80211_RADIOTAP_FLAGS | \ 739cdb1c70Snonaka 1 << IEEE80211_RADIOTAP_RATE | \ 749cdb1c70Snonaka 1 << IEEE80211_RADIOTAP_CHANNEL/* | \ 759cdb1c70Snonaka 1 << IEEE80211_RADIOTAP_HWQUEUE*/) 769cdb1c70Snonaka 779cdb1c70Snonaka struct run_softc; 789cdb1c70Snonaka 799cdb1c70Snonaka struct run_tx_data { 809cdb1c70Snonaka struct run_softc *sc; 814e8e6643Sskrll struct usbd_xfer *xfer; 829cdb1c70Snonaka uint8_t *buf; 839cdb1c70Snonaka uint8_t qid; 849cdb1c70Snonaka }; 859cdb1c70Snonaka 869cdb1c70Snonaka struct run_rx_data { 879cdb1c70Snonaka struct run_softc *sc; 884e8e6643Sskrll struct usbd_xfer *xfer; 899cdb1c70Snonaka uint8_t *buf; 909cdb1c70Snonaka }; 919cdb1c70Snonaka 929cdb1c70Snonaka struct run_tx_ring { 939cdb1c70Snonaka struct run_tx_data data[RUN_TX_RING_COUNT]; 944e8e6643Sskrll struct usbd_pipe * pipeh; 959cdb1c70Snonaka int cur; 9690e85cecSmlelstv volatile unsigned queued; 979cdb1c70Snonaka uint8_t pipe_no; 989cdb1c70Snonaka }; 999cdb1c70Snonaka 1009cdb1c70Snonaka struct run_rx_ring { 1019cdb1c70Snonaka struct run_rx_data data[RUN_RX_RING_COUNT]; 1024e8e6643Sskrll struct usbd_pipe * pipeh; 1039cdb1c70Snonaka uint8_t pipe_no; 1049cdb1c70Snonaka }; 1059cdb1c70Snonaka 1069cdb1c70Snonaka struct run_host_cmd { 1079cdb1c70Snonaka void (*cb)(struct run_softc *, void *); 1089cdb1c70Snonaka uint8_t data[256]; 1099cdb1c70Snonaka }; 1109cdb1c70Snonaka 1119cdb1c70Snonaka struct run_cmd_newstate { 1129cdb1c70Snonaka enum ieee80211_state state; 1139cdb1c70Snonaka int arg; 1149cdb1c70Snonaka }; 1159cdb1c70Snonaka 1169cdb1c70Snonaka struct run_cmd_key { 1179cdb1c70Snonaka struct ieee80211_key key; 1189cdb1c70Snonaka uint16_t associd; 1199cdb1c70Snonaka }; 1209cdb1c70Snonaka 1219cdb1c70Snonaka #define RUN_HOST_CMD_RING_COUNT 32 1229cdb1c70Snonaka struct run_host_cmd_ring { 1239cdb1c70Snonaka struct run_host_cmd cmd[RUN_HOST_CMD_RING_COUNT]; 1249cdb1c70Snonaka int cur; 1259cdb1c70Snonaka int next; 1269cdb1c70Snonaka int queued; 1279cdb1c70Snonaka }; 1289cdb1c70Snonaka 1299cdb1c70Snonaka struct run_node { 1309cdb1c70Snonaka struct ieee80211_node ni; 1319cdb1c70Snonaka uint8_t ridx[IEEE80211_RATE_MAXSIZE]; 1329cdb1c70Snonaka uint8_t ctl_ridx[IEEE80211_RATE_MAXSIZE]; 1339cdb1c70Snonaka }; 1349cdb1c70Snonaka 135d42627d4Sskrll #define RUN_MAXEPOUT 4 136d42627d4Sskrll 1379cdb1c70Snonaka struct run_softc { 1389cdb1c70Snonaka device_t sc_dev; 1399cdb1c70Snonaka struct ethercom sc_ec; 1409cdb1c70Snonaka #define sc_if sc_ec.ec_if 1419cdb1c70Snonaka struct ieee80211com sc_ic; 1429cdb1c70Snonaka int (*sc_newstate)(struct ieee80211com *, 1439cdb1c70Snonaka enum ieee80211_state, int); 1449cdb1c70Snonaka int (*sc_srom_read)(struct run_softc *, 1459cdb1c70Snonaka uint16_t, uint16_t *); 1469cdb1c70Snonaka 1477a9a30c5Sthorpej kmutex_t sc_media_mtx; /* XXX */ 1487a9a30c5Sthorpej 1494e8e6643Sskrll struct usbd_device * sc_udev; 1504e8e6643Sskrll struct usbd_interface * sc_iface; 1519cdb1c70Snonaka 1529cdb1c70Snonaka uint16_t mac_ver; 1539cdb1c70Snonaka uint16_t mac_rev; 154faca41fbSmlelstv uint16_t rf_rev; 1559cdb1c70Snonaka uint8_t freq; 1569cdb1c70Snonaka uint8_t ntxchains; 1579cdb1c70Snonaka uint8_t nrxchains; 1589cdb1c70Snonaka int fixed_ridx; 1599cdb1c70Snonaka 1609cdb1c70Snonaka uint8_t bbp25; 1619cdb1c70Snonaka uint8_t bbp26; 1629cdb1c70Snonaka uint8_t rf24_20mhz; 1639cdb1c70Snonaka uint8_t rf24_40mhz; 1649cdb1c70Snonaka uint8_t patch_dac; 1659cdb1c70Snonaka uint8_t rfswitch; 1669cdb1c70Snonaka uint8_t ext_2ghz_lna; 1679cdb1c70Snonaka uint8_t ext_5ghz_lna; 1689cdb1c70Snonaka uint8_t calib_2ghz; 1699cdb1c70Snonaka uint8_t calib_5ghz; 1709cdb1c70Snonaka uint8_t txmixgain_2ghz; 1719cdb1c70Snonaka uint8_t txmixgain_5ghz; 1729cdb1c70Snonaka int8_t txpow1[54]; 1739cdb1c70Snonaka int8_t txpow2[54]; 174faca41fbSmlelstv int8_t txpow3[54]; 1759cdb1c70Snonaka int8_t rssi_2ghz[3]; 1769cdb1c70Snonaka int8_t rssi_5ghz[3]; 1779cdb1c70Snonaka uint8_t lna[4]; 1789cdb1c70Snonaka 1799cdb1c70Snonaka struct { 1809cdb1c70Snonaka uint8_t reg; 1819cdb1c70Snonaka uint8_t val; 1829cdb1c70Snonaka } bbp[10], rf[10]; 1839cdb1c70Snonaka uint8_t leds; 1849cdb1c70Snonaka uint16_t led[3]; 1859cdb1c70Snonaka uint32_t txpow20mhz[5]; 1869cdb1c70Snonaka uint32_t txpow40mhz_2ghz[5]; 1879cdb1c70Snonaka uint32_t txpow40mhz_5ghz[5]; 1889cdb1c70Snonaka 1899cdb1c70Snonaka struct usb_task sc_task; 1909cdb1c70Snonaka 1919cdb1c70Snonaka struct ieee80211_amrr amrr; 1929cdb1c70Snonaka struct ieee80211_amrr_node amn; 1939cdb1c70Snonaka 1949cdb1c70Snonaka callout_t scan_to; 1959cdb1c70Snonaka callout_t calib_to; 1969cdb1c70Snonaka 1979cdb1c70Snonaka struct run_rx_ring rxq; 198d42627d4Sskrll struct run_tx_ring txq[RUN_MAXEPOUT]; 1999cdb1c70Snonaka struct run_host_cmd_ring cmdq; 2009cdb1c70Snonaka uint8_t qfullmsk; 2019cdb1c70Snonaka int sc_tx_timer; 2029cdb1c70Snonaka struct ieee80211_beacon_offsets sc_bo; 2039cdb1c70Snonaka int sc_flags; 2049cdb1c70Snonaka #define RUN_FWLOADED (1 << 0) 2059cdb1c70Snonaka #define RUN_DETACHING (1 << 1) 206*c2d905cbSgson #define RUN_USE_BLOCK_WRITE (1 << 2) 2079cdb1c70Snonaka 2089cdb1c70Snonaka struct bpf_if * sc_drvbpf; 2099cdb1c70Snonaka 2109cdb1c70Snonaka union { 2119cdb1c70Snonaka struct run_rx_radiotap_header th; 2129cdb1c70Snonaka uint8_t pad[64]; 2139cdb1c70Snonaka } sc_rxtapu; 2149cdb1c70Snonaka #define sc_rxtap sc_rxtapu.th 2159cdb1c70Snonaka int sc_rxtap_len; 2169cdb1c70Snonaka 2179cdb1c70Snonaka union { 2189cdb1c70Snonaka struct run_tx_radiotap_header th; 2199cdb1c70Snonaka uint8_t pad[64]; 2209cdb1c70Snonaka } sc_txtapu; 2219cdb1c70Snonaka #define sc_txtap sc_txtapu.th 2229cdb1c70Snonaka int sc_txtap_len; 2239cdb1c70Snonaka }; 224