1188417Sthompsa/* $FreeBSD: stable/11/sys/dev/usb/wlan/if_rumvar.h 345636 2019-03-28 09:50:25Z avos $ */ 2184610Salfred 3184610Salfred/*- 4184610Salfred * Copyright (c) 2005, 2006 Damien Bergamini <damien.bergamini@free.fr> 5184610Salfred * Copyright (c) 2006 Niall O'Higgins <niallo@openbsd.org> 6184610Salfred * 7184610Salfred * Permission to use, copy, modify, and distribute this software for any 8184610Salfred * purpose with or without fee is hereby granted, provided that the above 9184610Salfred * copyright notice and this permission notice appear in all copies. 10184610Salfred * 11184610Salfred * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12184610Salfred * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13184610Salfred * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14184610Salfred * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15184610Salfred * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16184610Salfred * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17184610Salfred * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18184610Salfred */ 19184610Salfred 20188417Sthompsa#define RUM_TX_LIST_COUNT 8 21188969Sthompsa#define RUM_TX_MINFREE 2 22184610Salfred 23184610Salfredstruct rum_rx_radiotap_header { 24184610Salfred struct ieee80211_radiotap_header wr_ihdr; 25288604Sadrian uint64_t wr_tsf; 26188417Sthompsa uint8_t wr_flags; 27188417Sthompsa uint8_t wr_rate; 28188417Sthompsa uint16_t wr_chan_freq; 29188417Sthompsa uint16_t wr_chan_flags; 30192468Ssam int8_t wr_antsignal; 31192468Ssam int8_t wr_antnoise; 32188417Sthompsa uint8_t wr_antenna; 33253757Shselasky} __packed __aligned(8); 34184610Salfred 35188417Sthompsa#define RT2573_RX_RADIOTAP_PRESENT \ 36288604Sadrian ((1 << IEEE80211_RADIOTAP_TSFT) | \ 37288604Sadrian (1 << IEEE80211_RADIOTAP_FLAGS) | \ 38184610Salfred (1 << IEEE80211_RADIOTAP_RATE) | \ 39184610Salfred (1 << IEEE80211_RADIOTAP_CHANNEL) | \ 40192468Ssam (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \ 41192468Ssam (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) | \ 42184610Salfred (1 << IEEE80211_RADIOTAP_ANTENNA) | \ 43192468Ssam 0) 44184610Salfred 45184610Salfredstruct rum_tx_radiotap_header { 46184610Salfred struct ieee80211_radiotap_header wt_ihdr; 47188417Sthompsa uint8_t wt_flags; 48188417Sthompsa uint8_t wt_rate; 49188417Sthompsa uint16_t wt_chan_freq; 50188417Sthompsa uint16_t wt_chan_flags; 51188417Sthompsa uint8_t wt_antenna; 52345636Savos} __packed; 53184610Salfred 54188417Sthompsa#define RT2573_TX_RADIOTAP_PRESENT \ 55345635Savos ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 56184610Salfred (1 << IEEE80211_RADIOTAP_RATE) | \ 57184610Salfred (1 << IEEE80211_RADIOTAP_CHANNEL) | \ 58184610Salfred (1 << IEEE80211_RADIOTAP_ANTENNA)) 59184610Salfred 60188417Sthompsastruct rum_softc; 61184610Salfred 62188417Sthompsastruct rum_tx_data { 63188417Sthompsa STAILQ_ENTRY(rum_tx_data) next; 64188417Sthompsa struct rum_softc *sc; 65188417Sthompsa struct rum_tx_desc desc; 66188417Sthompsa struct mbuf *m; 67188417Sthompsa struct ieee80211_node *ni; 68188417Sthompsa int rate; 69188417Sthompsa}; 70188417Sthompsatypedef STAILQ_HEAD(, rum_tx_data) rum_txdhead; 71188417Sthompsa 72288532Sadrianunion sec_param { 73288532Sadrian struct ieee80211_key key; 74288532Sadrian uint8_t macaddr[IEEE80211_ADDR_LEN]; 75288532Sadrian struct ieee80211vap *vap; 76288532Sadrian}; 77288532Sadrian#define CMD_FUNC_PROTO void (*func)(struct rum_softc *, \ 78288634Sadrian union sec_param *, uint8_t) 79288532Sadrian 80288532Sadrianstruct rum_cmdq { 81288532Sadrian union sec_param data; 82288532Sadrian uint8_t rvp_id; 83288532Sadrian 84288532Sadrian CMD_FUNC_PROTO; 85288532Sadrian}; 86288532Sadrian#define RUM_CMDQ_SIZE 16 87288532Sadrian 88188417Sthompsastruct rum_vap { 89188417Sthompsa struct ieee80211vap vap; 90288623Sadrian struct mbuf *bcn_mbuf; 91206358Srpaulo struct usb_callout ratectl_ch; 92206358Srpaulo struct task ratectl_task; 93288638Sadrian uint8_t maxretry; 94188417Sthompsa 95188417Sthompsa int (*newstate)(struct ieee80211vap *, 96188417Sthompsa enum ieee80211_state, int); 97297171Savos void (*bmiss)(struct ieee80211vap *); 98297171Savos void (*recv_mgmt)(struct ieee80211_node *, 99297171Savos struct mbuf *, int, 100297171Savos const struct ieee80211_rx_stats *, 101297171Savos int, int); 102188417Sthompsa}; 103188417Sthompsa#define RUM_VAP(vap) ((struct rum_vap *)(vap)) 104188417Sthompsa 105187259Sthompsaenum { 106188417Sthompsa RUM_BULK_WR, 107188417Sthompsa RUM_BULK_RD, 108188417Sthompsa RUM_N_TRANSFER = 2, 109187259Sthompsa}; 110187259Sthompsa 111184610Salfredstruct rum_softc { 112287197Sglebius struct ieee80211com sc_ic; 113287197Sglebius struct mbufq sc_snd; 114188417Sthompsa device_t sc_dev; 115192984Sthompsa struct usb_device *sc_udev; 116184610Salfred 117288531Sadrian struct usb_xfer *sc_xfer[RUM_N_TRANSFER]; 118184610Salfred 119188417Sthompsa uint8_t rf_rev; 120188417Sthompsa uint8_t rffreq; 121184610Salfred 122188419Sthompsa struct rum_tx_data tx_data[RUM_TX_LIST_COUNT]; 123188417Sthompsa rum_txdhead tx_q; 124188417Sthompsa rum_txdhead tx_free; 125188417Sthompsa int tx_nfree; 126188417Sthompsa struct rum_rx_desc sc_rx_desc; 127184610Salfred 128188417Sthompsa struct mtx sc_mtx; 129184610Salfred 130297171Savos int sc_sleep_end; 131297171Savos int sc_sleep_time; 132297171Savos uint8_t last_rx_flags; 133297171Savos 134288532Sadrian struct rum_cmdq cmdq[RUM_CMDQ_SIZE]; 135288532Sadrian struct mtx cmdq_mtx; 136288532Sadrian struct task cmdq_task; 137288532Sadrian uint8_t cmdq_first; 138288532Sadrian uint8_t cmdq_last; 139288532Sadrian 140188417Sthompsa uint32_t sta[6]; 141188417Sthompsa uint32_t rf_regs[4]; 142188417Sthompsa uint8_t txpow[44]; 143287197Sglebius u_int sc_detached:1, 144288633Sadrian sc_running:1, 145297171Savos sc_sleeping:1, 146288633Sadrian sc_clr_shkeys:1; 147184610Salfred 148288619Sadrian uint8_t sc_bssid[IEEE80211_ADDR_LEN]; 149288642Sadrian struct wmeParams wme_params[WME_NUM_AC]; 150288619Sadrian 151288633Sadrian uint8_t vap_key_count[1]; 152288633Sadrian uint64_t keys_bmap; 153288633Sadrian 154188417Sthompsa struct { 155188417Sthompsa uint8_t val; 156188417Sthompsa uint8_t reg; 157188417Sthompsa } __packed bbp_prom[16]; 158188417Sthompsa 159188417Sthompsa int hw_radio; 160188417Sthompsa int rx_ant; 161188417Sthompsa int tx_ant; 162188417Sthompsa int nb_ant; 163188417Sthompsa int ext_2ghz_lna; 164188417Sthompsa int ext_5ghz_lna; 165188417Sthompsa int rssi_2ghz_corr; 166188417Sthompsa int rssi_5ghz_corr; 167188417Sthompsa uint8_t bbp17; 168188417Sthompsa 169188417Sthompsa struct rum_rx_radiotap_header sc_rxtap; 170188417Sthompsa struct rum_tx_radiotap_header sc_txtap; 171184610Salfred}; 172188417Sthompsa 173288532Sadrian#define RUM_LOCK_INIT(sc) \ 174288532Sadrian mtx_init(&(sc)->sc_mtx, device_get_nameunit((sc)->sc_dev), \ 175288532Sadrian MTX_NETWORK_LOCK, MTX_DEF); 176288532Sadrian#define RUM_LOCK(sc) mtx_lock(&(sc)->sc_mtx) 177288532Sadrian#define RUM_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx) 178288532Sadrian#define RUM_LOCK_ASSERT(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED) 179288532Sadrian#define RUM_LOCK_DESTROY(sc) mtx_destroy(&(sc)->sc_mtx) 180288532Sadrian 181288532Sadrian#define RUM_CMDQ_LOCK_INIT(sc) \ 182288532Sadrian mtx_init(&(sc)->cmdq_mtx, "cmdq lock", NULL, MTX_DEF) 183288532Sadrian#define RUM_CMDQ_LOCK(sc) mtx_lock(&(sc)->cmdq_mtx) 184288532Sadrian#define RUM_CMDQ_UNLOCK(sc) mtx_unlock(&(sc)->cmdq_mtx) 185288532Sadrian#define RUM_CMDQ_LOCK_DESTROY(sc) mtx_destroy(&(sc)->cmdq_mtx) 186