1 /* $OpenBSD: if_runvar.h,v 1.3 2009/03/26 20:17:27 damien Exp $ */
4 * Copyright (c) 2008,2009 Damien Bergamini <damien.bergamini@free.fr>
5 * ported to FreeBSD by Akinori Furukoshi <moonlightakkiy@yahoo.ca>
6 * USB Consulting, Hans Petter Selasky <hselasky@freebsd.org>
8 * Permission to use, copy, modify, and distribute this software for any
9 * purpose with or without fee is hereby granted, provided that the above
10 * copyright notice and this permission notice appear in all copies.
12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
26 #define RUN_MAX_RXSZ \
27 MIN(4096, MJUMPAGESIZE)
29 /* NB: "11" is the maximum number of padding bytes needed for Tx */
30 #define RUN_MAX_TXSZ \
31 (sizeof (struct rt2870_txd) + \
32 sizeof (struct rt2860_txwi) + \
35 #define RUN_TX_TIMEOUT 5000 /* ms */
37 /* Tx ring count was 8/endpoint, now 32 for all 4 (or 6) endpoints. */
38 #define RUN_TX_RING_COUNT 32
39 #define RUN_RX_RING_COUNT 1
41 #define RT2870_WCID_MAX 64
42 #define RUN_AID2WCID(aid) ((aid) & 0xff)
46 struct run_rx_radiotap_header {
47 struct ieee80211_radiotap_header wr_ihdr;
51 uint16_t wr_chan_freq;
52 uint16_t wr_chan_flags;
53 int8_t wr_dbm_antsignal;
56 } __packed __aligned(8);
58 #define RUN_RX_RADIOTAP_PRESENT \
59 (1 << IEEE80211_RADIOTAP_TSFT | \
60 1 << IEEE80211_RADIOTAP_FLAGS | \
61 1 << IEEE80211_RADIOTAP_RATE | \
62 1 << IEEE80211_RADIOTAP_CHANNEL | \
63 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL | \
64 1 << IEEE80211_RADIOTAP_ANTENNA | \
65 1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL)
67 struct run_tx_radiotap_header {
68 struct ieee80211_radiotap_header wt_ihdr;
72 uint16_t wt_chan_freq;
73 uint16_t wt_chan_flags;
75 } __packed __aligned(8);
77 #define IEEE80211_RADIOTAP_HWQUEUE 15
79 #define RUN_TX_RADIOTAP_PRESENT \
80 (1 << IEEE80211_RADIOTAP_TSFT | \
81 1 << IEEE80211_RADIOTAP_FLAGS | \
82 1 << IEEE80211_RADIOTAP_RATE | \
83 1 << IEEE80211_RADIOTAP_CHANNEL | \
84 1 << IEEE80211_RADIOTAP_HWQUEUE)
89 STAILQ_ENTRY(run_tx_data) next;
92 struct ieee80211_node *ni;
93 uint32_t align[0]; /* dummy field */
94 uint8_t desc[sizeof(struct rt2870_txd) +
95 sizeof(struct rt2860_txwi)];
98 STAILQ_HEAD(run_tx_data_head, run_tx_data);
101 struct ieee80211_node ni;
102 uint8_t ridx[IEEE80211_RATE_MAXSIZE];
103 uint8_t ctl_ridx[IEEE80211_RATE_MAXSIZE];
108 #define RUN_NODE(ni) ((struct run_node *)(ni))
113 void (*func)(void *);
114 struct ieee80211_key *k;
115 struct ieee80211_key key;
116 uint8_t mac[IEEE80211_ADDR_LEN];
121 struct ieee80211vap vap;
122 struct mbuf *beacon_mbuf;
124 int (*newstate)(struct ieee80211vap *,
125 enum ieee80211_state, int);
126 void (*recv_mgmt)(struct ieee80211_node *,
128 const struct ieee80211_rx_stats *,
133 #define RUN_VAP(vap) ((struct run_vap *)(vap))
136 * There are 7 bulk endpoints: 1 for RX
137 * and 6 for TX (4 EDCAs + HCCA + Prio).
138 * Update 03-14-2009: some devices like the Planex GW-US300MiniS
139 * seem to have only 4 TX bulk endpoints (Fukaumi Naoki).
142 RUN_BULK_TX_BE, /* = WME_AC_BE */
143 RUN_BULK_TX_BK, /* = WME_AC_BK */
144 RUN_BULK_TX_VI, /* = WME_AC_VI */
145 RUN_BULK_TX_VO, /* = WME_AC_VO */
152 #define RUN_EP_QUEUES RUN_BULK_RX
154 struct run_endpoint_queue {
155 struct run_tx_data tx_data[RUN_TX_RING_COUNT];
156 struct run_tx_data_head tx_qh;
157 struct run_tx_data_head tx_fh;
163 struct ieee80211com sc_ic;
166 struct usb_device *sc_udev;
170 #define RUN_FLAG_FWLOAD_NEEDED 0x01
171 #define RUN_RUNNING 0x02
173 uint16_t wcid_stats[RT2870_WCID_MAX + 1][3];
175 #define RUN_SUCCESS 1
178 int (*sc_srom_read)(struct run_softc *,
179 uint16_t, uint16_t *);
194 uint8_t ext_2ghz_lna;
195 uint8_t ext_5ghz_lna;
198 uint8_t txmixgain_2ghz;
199 uint8_t txmixgain_5ghz;
213 uint32_t txpow20mhz[5];
214 uint32_t txpow40mhz_2ghz[5];
215 uint32_t txpow40mhz_5ghz[5];
217 struct run_endpoint_queue sc_epq[RUN_EP_QUEUES];
219 struct task ratectl_task;
220 struct usb_callout ratectl_ch;
222 #define RUN_RATECTL_OFF 0
224 /* need to be power of 2, otherwise RUN_CMDQ_GET fails */
225 #define RUN_CMDQ_MAX 16
226 #define RUN_CMDQ_MASQ (RUN_CMDQ_MAX - 1)
227 struct run_cmdq cmdq[RUN_CMDQ_MAX];
228 struct task cmdq_task;
232 uint8_t cmdq_key_set;
233 #define RUN_CMDQ_ABORT 0
234 #define RUN_CMDQ_GO 1
236 struct usb_xfer *sc_xfer[RUN_N_XFER];
245 uint8_t adhoc_running;
251 uint8_t sc_bssid[IEEE80211_ADDR_LEN];
254 struct run_rx_radiotap_header th;
257 #define sc_rxtap sc_rxtapu.th
260 struct run_tx_radiotap_header th;
263 #define sc_txtap sc_txtapu.th
266 #define RUN_LOCK(sc) mtx_lock(&(sc)->sc_mtx)
267 #define RUN_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx)
268 #define RUN_LOCK_ASSERT(sc, t) mtx_assert(&(sc)->sc_mtx, t)
270 #endif /* _IF_RUNVAR_H_ */