112bd3c8bSSascha Wildner /* $OpenBSD: if_runvar.h,v 1.3 2009/03/26 20:17:27 damien Exp $ */ 212bd3c8bSSascha Wildner 312bd3c8bSSascha Wildner /*- 412bd3c8bSSascha Wildner * Copyright (c) 2008,2009 Damien Bergamini <damien.bergamini@free.fr> 512bd3c8bSSascha Wildner * ported to FreeBSD by Akinori Furukoshi <moonlightakkiy@yahoo.ca> 612bd3c8bSSascha Wildner * USB Consulting, Hans Petter Selasky <hselasky@freebsd.org> 712bd3c8bSSascha Wildner * 812bd3c8bSSascha Wildner * Permission to use, copy, modify, and distribute this software for any 912bd3c8bSSascha Wildner * purpose with or without fee is hereby granted, provided that the above 1012bd3c8bSSascha Wildner * copyright notice and this permission notice appear in all copies. 1112bd3c8bSSascha Wildner * 1212bd3c8bSSascha Wildner * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 1312bd3c8bSSascha Wildner * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 1412bd3c8bSSascha Wildner * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 1512bd3c8bSSascha Wildner * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 1612bd3c8bSSascha Wildner * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 1712bd3c8bSSascha Wildner * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 1812bd3c8bSSascha Wildner * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 1912bd3c8bSSascha Wildner * 20*d52983bdSImre Vadász * $FreeBSD: head/sys/dev/usb/wlan/if_runvar.h 296356 2016-03-03 20:06:16Z avos $ 2112bd3c8bSSascha Wildner */ 2212bd3c8bSSascha Wildner 2312bd3c8bSSascha Wildner #ifndef _IF_RUNVAR_H_ 2412bd3c8bSSascha Wildner #define _IF_RUNVAR_H_ 2512bd3c8bSSascha Wildner 2612bd3c8bSSascha Wildner #define RUN_MAX_RXSZ \ 2712bd3c8bSSascha Wildner MIN(4096, MJUMPAGESIZE) 28cea9a87bSSascha Wildner 2912bd3c8bSSascha Wildner /* NB: "11" is the maximum number of padding bytes needed for Tx */ 3012bd3c8bSSascha Wildner #define RUN_MAX_TXSZ \ 3112bd3c8bSSascha Wildner (sizeof (struct rt2870_txd) + \ 32cea9a87bSSascha Wildner sizeof (struct rt2860_txwi) + \ 3312bd3c8bSSascha Wildner MCLBYTES + 11) 3412bd3c8bSSascha Wildner 3512bd3c8bSSascha Wildner #define RUN_TX_TIMEOUT 5000 /* ms */ 3612bd3c8bSSascha Wildner 3712bd3c8bSSascha Wildner /* Tx ring count was 8/endpoint, now 32 for all 4 (or 6) endpoints. */ 3812bd3c8bSSascha Wildner #define RUN_TX_RING_COUNT 32 3912bd3c8bSSascha Wildner #define RUN_RX_RING_COUNT 1 4012bd3c8bSSascha Wildner 4112bd3c8bSSascha Wildner #define RT2870_WCID_MAX 64 4212bd3c8bSSascha Wildner #define RUN_AID2WCID(aid) ((aid) & 0xff) 4312bd3c8bSSascha Wildner 4412bd3c8bSSascha Wildner #define RUN_VAP_MAX 8 4512bd3c8bSSascha Wildner 4612bd3c8bSSascha Wildner struct run_rx_radiotap_header { 4712bd3c8bSSascha Wildner struct ieee80211_radiotap_header wr_ihdr; 48*d52983bdSImre Vadász uint64_t wr_tsf; 4912bd3c8bSSascha Wildner uint8_t wr_flags; 5012bd3c8bSSascha Wildner uint8_t wr_rate; 5112bd3c8bSSascha Wildner uint16_t wr_chan_freq; 5212bd3c8bSSascha Wildner uint16_t wr_chan_flags; 5312bd3c8bSSascha Wildner int8_t wr_dbm_antsignal; 5412bd3c8bSSascha Wildner uint8_t wr_antenna; 5512bd3c8bSSascha Wildner uint8_t wr_antsignal; 56cea9a87bSSascha Wildner } __packed __aligned(8); 5712bd3c8bSSascha Wildner 5812bd3c8bSSascha Wildner #define RUN_RX_RADIOTAP_PRESENT \ 59*d52983bdSImre Vadász (1 << IEEE80211_RADIOTAP_TSFT | \ 60*d52983bdSImre Vadász 1 << IEEE80211_RADIOTAP_FLAGS | \ 6112bd3c8bSSascha Wildner 1 << IEEE80211_RADIOTAP_RATE | \ 6212bd3c8bSSascha Wildner 1 << IEEE80211_RADIOTAP_CHANNEL | \ 6312bd3c8bSSascha Wildner 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL | \ 6412bd3c8bSSascha Wildner 1 << IEEE80211_RADIOTAP_ANTENNA | \ 6512bd3c8bSSascha Wildner 1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL) 6612bd3c8bSSascha Wildner 6712bd3c8bSSascha Wildner struct run_tx_radiotap_header { 6812bd3c8bSSascha Wildner struct ieee80211_radiotap_header wt_ihdr; 69*d52983bdSImre Vadász uint64_t wt_tsf; 7012bd3c8bSSascha Wildner uint8_t wt_flags; 7112bd3c8bSSascha Wildner uint8_t wt_rate; 7212bd3c8bSSascha Wildner uint16_t wt_chan_freq; 7312bd3c8bSSascha Wildner uint16_t wt_chan_flags; 7412bd3c8bSSascha Wildner uint8_t wt_hwqueue; 75cea9a87bSSascha Wildner } __packed __aligned(8); 7612bd3c8bSSascha Wildner 7712bd3c8bSSascha Wildner #define IEEE80211_RADIOTAP_HWQUEUE 15 7812bd3c8bSSascha Wildner 7912bd3c8bSSascha Wildner #define RUN_TX_RADIOTAP_PRESENT \ 80*d52983bdSImre Vadász (1 << IEEE80211_RADIOTAP_TSFT | \ 81*d52983bdSImre Vadász 1 << IEEE80211_RADIOTAP_FLAGS | \ 8212bd3c8bSSascha Wildner 1 << IEEE80211_RADIOTAP_RATE | \ 8312bd3c8bSSascha Wildner 1 << IEEE80211_RADIOTAP_CHANNEL | \ 8412bd3c8bSSascha Wildner 1 << IEEE80211_RADIOTAP_HWQUEUE) 8512bd3c8bSSascha Wildner 8612bd3c8bSSascha Wildner struct run_softc; 8712bd3c8bSSascha Wildner 8812bd3c8bSSascha Wildner struct run_tx_data { 8912bd3c8bSSascha Wildner STAILQ_ENTRY(run_tx_data) next; 9012bd3c8bSSascha Wildner struct run_softc *sc; 9112bd3c8bSSascha Wildner struct mbuf *m; 9212bd3c8bSSascha Wildner struct ieee80211_node *ni; 9312bd3c8bSSascha Wildner uint32_t align[0]; /* dummy field */ 9412bd3c8bSSascha Wildner uint8_t desc[sizeof(struct rt2870_txd) + 9512bd3c8bSSascha Wildner sizeof(struct rt2860_txwi)]; 9612bd3c8bSSascha Wildner uint8_t ridx; 9712bd3c8bSSascha Wildner }; 9812bd3c8bSSascha Wildner STAILQ_HEAD(run_tx_data_head, run_tx_data); 9912bd3c8bSSascha Wildner 10012bd3c8bSSascha Wildner struct run_node { 10112bd3c8bSSascha Wildner struct ieee80211_node ni; 10212bd3c8bSSascha Wildner uint8_t ridx[IEEE80211_RATE_MAXSIZE]; 10312bd3c8bSSascha Wildner uint8_t ctl_ridx[IEEE80211_RATE_MAXSIZE]; 10412bd3c8bSSascha Wildner uint8_t amrr_ridx; 10512bd3c8bSSascha Wildner uint8_t mgt_ridx; 10612bd3c8bSSascha Wildner uint8_t fix_ridx; 10712bd3c8bSSascha Wildner }; 108*d52983bdSImre Vadász #define RUN_NODE(ni) ((struct run_node *)(ni)) 10912bd3c8bSSascha Wildner 11012bd3c8bSSascha Wildner struct run_cmdq { 11112bd3c8bSSascha Wildner void *arg0; 11212bd3c8bSSascha Wildner void *arg1; 11312bd3c8bSSascha Wildner void (*func)(void *); 11412bd3c8bSSascha Wildner struct ieee80211_key *k; 11512bd3c8bSSascha Wildner struct ieee80211_key key; 11612bd3c8bSSascha Wildner uint8_t mac[IEEE80211_ADDR_LEN]; 11712bd3c8bSSascha Wildner uint8_t wcid; 11812bd3c8bSSascha Wildner }; 11912bd3c8bSSascha Wildner 12012bd3c8bSSascha Wildner struct run_vap { 12112bd3c8bSSascha Wildner struct ieee80211vap vap; 12212bd3c8bSSascha Wildner struct mbuf *beacon_mbuf; 12312bd3c8bSSascha Wildner 12412bd3c8bSSascha Wildner int (*newstate)(struct ieee80211vap *, 12512bd3c8bSSascha Wildner enum ieee80211_state, int); 126*d52983bdSImre Vadász void (*recv_mgmt)(struct ieee80211_node *, 127*d52983bdSImre Vadász struct mbuf *, int, 128*d52983bdSImre Vadász const struct ieee80211_rx_stats *, 129*d52983bdSImre Vadász int, int); 13012bd3c8bSSascha Wildner 13112bd3c8bSSascha Wildner uint8_t rvp_id; 13212bd3c8bSSascha Wildner }; 13312bd3c8bSSascha Wildner #define RUN_VAP(vap) ((struct run_vap *)(vap)) 13412bd3c8bSSascha Wildner 13512bd3c8bSSascha Wildner /* 13612bd3c8bSSascha Wildner * There are 7 bulk endpoints: 1 for RX 13712bd3c8bSSascha Wildner * and 6 for TX (4 EDCAs + HCCA + Prio). 13812bd3c8bSSascha Wildner * Update 03-14-2009: some devices like the Planex GW-US300MiniS 13912bd3c8bSSascha Wildner * seem to have only 4 TX bulk endpoints (Fukaumi Naoki). 14012bd3c8bSSascha Wildner */ 14112bd3c8bSSascha Wildner enum { 14212bd3c8bSSascha Wildner RUN_BULK_TX_BE, /* = WME_AC_BE */ 14312bd3c8bSSascha Wildner RUN_BULK_TX_BK, /* = WME_AC_BK */ 14412bd3c8bSSascha Wildner RUN_BULK_TX_VI, /* = WME_AC_VI */ 14512bd3c8bSSascha Wildner RUN_BULK_TX_VO, /* = WME_AC_VO */ 14612bd3c8bSSascha Wildner RUN_BULK_TX_HCCA, 14712bd3c8bSSascha Wildner RUN_BULK_TX_PRIO, 14812bd3c8bSSascha Wildner RUN_BULK_RX, 14912bd3c8bSSascha Wildner RUN_N_XFER, 15012bd3c8bSSascha Wildner }; 15112bd3c8bSSascha Wildner 15212bd3c8bSSascha Wildner #define RUN_EP_QUEUES RUN_BULK_RX 15312bd3c8bSSascha Wildner 15412bd3c8bSSascha Wildner struct run_endpoint_queue { 15512bd3c8bSSascha Wildner struct run_tx_data tx_data[RUN_TX_RING_COUNT]; 15612bd3c8bSSascha Wildner struct run_tx_data_head tx_qh; 15712bd3c8bSSascha Wildner struct run_tx_data_head tx_fh; 15812bd3c8bSSascha Wildner uint32_t tx_nfree; 15912bd3c8bSSascha Wildner }; 16012bd3c8bSSascha Wildner 16112bd3c8bSSascha Wildner struct run_softc { 162*d52983bdSImre Vadász struct lock sc_lock; 163*d52983bdSImre Vadász struct ieee80211com sc_ic; 164*d52983bdSImre Vadász struct mbufq sc_snd; 16512bd3c8bSSascha Wildner device_t sc_dev; 16612bd3c8bSSascha Wildner struct usb_device *sc_udev; 167cea9a87bSSascha Wildner int sc_need_fwload; 168cea9a87bSSascha Wildner 169cea9a87bSSascha Wildner int sc_flags; 170cea9a87bSSascha Wildner #define RUN_FLAG_FWLOAD_NEEDED 0x01 171*d52983bdSImre Vadász #define RUN_RUNNING 0x02 172cea9a87bSSascha Wildner 17312bd3c8bSSascha Wildner uint16_t wcid_stats[RT2870_WCID_MAX + 1][3]; 17412bd3c8bSSascha Wildner #define RUN_TXCNT 0 17512bd3c8bSSascha Wildner #define RUN_SUCCESS 1 17612bd3c8bSSascha Wildner #define RUN_RETRY 2 17712bd3c8bSSascha Wildner 17812bd3c8bSSascha Wildner int (*sc_srom_read)(struct run_softc *, 17912bd3c8bSSascha Wildner uint16_t, uint16_t *); 18012bd3c8bSSascha Wildner 18112bd3c8bSSascha Wildner uint16_t mac_ver; 18212bd3c8bSSascha Wildner uint16_t mac_rev; 183cea9a87bSSascha Wildner uint16_t rf_rev; 18412bd3c8bSSascha Wildner uint8_t freq; 18512bd3c8bSSascha Wildner uint8_t ntxchains; 18612bd3c8bSSascha Wildner uint8_t nrxchains; 18712bd3c8bSSascha Wildner 18812bd3c8bSSascha Wildner uint8_t bbp25; 18912bd3c8bSSascha Wildner uint8_t bbp26; 19012bd3c8bSSascha Wildner uint8_t rf24_20mhz; 19112bd3c8bSSascha Wildner uint8_t rf24_40mhz; 19212bd3c8bSSascha Wildner uint8_t patch_dac; 19312bd3c8bSSascha Wildner uint8_t rfswitch; 19412bd3c8bSSascha Wildner uint8_t ext_2ghz_lna; 19512bd3c8bSSascha Wildner uint8_t ext_5ghz_lna; 19612bd3c8bSSascha Wildner uint8_t calib_2ghz; 19712bd3c8bSSascha Wildner uint8_t calib_5ghz; 19812bd3c8bSSascha Wildner uint8_t txmixgain_2ghz; 19912bd3c8bSSascha Wildner uint8_t txmixgain_5ghz; 20012bd3c8bSSascha Wildner int8_t txpow1[54]; 20112bd3c8bSSascha Wildner int8_t txpow2[54]; 202cea9a87bSSascha Wildner int8_t txpow3[54]; 20312bd3c8bSSascha Wildner int8_t rssi_2ghz[3]; 20412bd3c8bSSascha Wildner int8_t rssi_5ghz[3]; 20512bd3c8bSSascha Wildner uint8_t lna[4]; 20612bd3c8bSSascha Wildner 20712bd3c8bSSascha Wildner struct { 20812bd3c8bSSascha Wildner uint8_t reg; 20912bd3c8bSSascha Wildner uint8_t val; 21012bd3c8bSSascha Wildner } bbp[10], rf[10]; 21112bd3c8bSSascha Wildner uint8_t leds; 21212bd3c8bSSascha Wildner uint16_t led[3]; 21312bd3c8bSSascha Wildner uint32_t txpow20mhz[5]; 21412bd3c8bSSascha Wildner uint32_t txpow40mhz_2ghz[5]; 21512bd3c8bSSascha Wildner uint32_t txpow40mhz_5ghz[5]; 21612bd3c8bSSascha Wildner 21712bd3c8bSSascha Wildner struct run_endpoint_queue sc_epq[RUN_EP_QUEUES]; 21812bd3c8bSSascha Wildner 21912bd3c8bSSascha Wildner struct task ratectl_task; 22012bd3c8bSSascha Wildner struct usb_callout ratectl_ch; 22112bd3c8bSSascha Wildner uint8_t ratectl_run; 22212bd3c8bSSascha Wildner #define RUN_RATECTL_OFF 0 22312bd3c8bSSascha Wildner 22412bd3c8bSSascha Wildner /* need to be power of 2, otherwise RUN_CMDQ_GET fails */ 22512bd3c8bSSascha Wildner #define RUN_CMDQ_MAX 16 22612bd3c8bSSascha Wildner #define RUN_CMDQ_MASQ (RUN_CMDQ_MAX - 1) 22712bd3c8bSSascha Wildner struct run_cmdq cmdq[RUN_CMDQ_MAX]; 22812bd3c8bSSascha Wildner struct task cmdq_task; 22912bd3c8bSSascha Wildner uint32_t cmdq_store; 23012bd3c8bSSascha Wildner uint8_t cmdq_exec; 23112bd3c8bSSascha Wildner uint8_t cmdq_run; 23212bd3c8bSSascha Wildner uint8_t cmdq_key_set; 23312bd3c8bSSascha Wildner #define RUN_CMDQ_ABORT 0 23412bd3c8bSSascha Wildner #define RUN_CMDQ_GO 1 23512bd3c8bSSascha Wildner 23612bd3c8bSSascha Wildner struct usb_xfer *sc_xfer[RUN_N_XFER]; 23712bd3c8bSSascha Wildner 23812bd3c8bSSascha Wildner struct mbuf *rx_m; 23912bd3c8bSSascha Wildner 24012bd3c8bSSascha Wildner uint8_t fifo_cnt; 24112bd3c8bSSascha Wildner 24212bd3c8bSSascha Wildner uint8_t running; 24312bd3c8bSSascha Wildner uint8_t runbmap; 24412bd3c8bSSascha Wildner uint8_t ap_running; 24512bd3c8bSSascha Wildner uint8_t adhoc_running; 24612bd3c8bSSascha Wildner uint8_t sta_running; 24712bd3c8bSSascha Wildner uint8_t rvp_cnt; 24812bd3c8bSSascha Wildner uint8_t rvp_bmap; 24910f2cea7SSascha Wildner uint8_t sc_detached; 25012bd3c8bSSascha Wildner 251*d52983bdSImre Vadász uint8_t sc_bssid[IEEE80211_ADDR_LEN]; 252*d52983bdSImre Vadász 25312bd3c8bSSascha Wildner union { 25412bd3c8bSSascha Wildner struct run_rx_radiotap_header th; 25512bd3c8bSSascha Wildner uint8_t pad[64]; 25612bd3c8bSSascha Wildner } sc_rxtapu; 25712bd3c8bSSascha Wildner #define sc_rxtap sc_rxtapu.th 25812bd3c8bSSascha Wildner 25912bd3c8bSSascha Wildner union { 26012bd3c8bSSascha Wildner struct run_tx_radiotap_header th; 26112bd3c8bSSascha Wildner uint8_t pad[64]; 26212bd3c8bSSascha Wildner } sc_txtapu; 26312bd3c8bSSascha Wildner #define sc_txtap sc_txtapu.th 26412bd3c8bSSascha Wildner }; 26512bd3c8bSSascha Wildner 26610f2cea7SSascha Wildner #define RUN_LOCK(sc) lockmgr(&(sc)->sc_lock, LK_EXCLUSIVE) 26710f2cea7SSascha Wildner #define RUN_UNLOCK(sc) lockmgr(&(sc)->sc_lock, LK_RELEASE) 26810f2cea7SSascha Wildner #define RUN_LOCK_ASSERT(sc, t) KKASSERT(lockstatus(&(sc)->sc_lock, curthread) != 0) 26912bd3c8bSSascha Wildner 27012bd3c8bSSascha Wildner #endif /* _IF_RUNVAR_H_ */ 271