1 /* $OpenBSD: if_runvar.h,v 1.3 2009/03/26 20:17:27 damien Exp $ */
2
3 /*-
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>
7 *
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.
11 *
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.
19 *
20 * $FreeBSD$
21 */
22
23 #ifndef _IF_RUNVAR_H_
24 #define _IF_RUNVAR_H_
25
26 /* Support up to 4KB frames - useful for A-MSDU/FF. */
27 #define RUN_MAX_RXSZ \
28 MIN(4096, MJUMPAGESIZE)
29
30 /* Support up to 8KB frames - useful for A-MSDU/FF. */
31 #define RUN_MAX_TXSZ \
32 (sizeof (struct rt2870_txd) + \
33 sizeof (struct rt2860_txwi) + \
34 8192 + 11)
35
36 #define RUN_TX_TIMEOUT 5000 /* ms */
37
38 /* Tx ring count was 8/endpoint, now 32 for all 4 (or 6) endpoints. */
39 #define RUN_TX_RING_COUNT 32
40 #define RUN_RX_RING_COUNT 1
41
42 #define RT2870_WCID_MAX 64
43 #define RUN_AID2WCID(aid) ((aid) & 0xff)
44
45 #define RUN_VAP_MAX 8
46
47 struct run_rx_radiotap_header {
48 struct ieee80211_radiotap_header wr_ihdr;
49 uint64_t wr_tsf;
50 uint8_t wr_flags;
51 uint8_t wr_rate;
52 uint16_t wr_chan_freq;
53 uint16_t wr_chan_flags;
54 int8_t wr_dbm_antsignal;
55 uint8_t wr_antenna;
56 uint8_t wr_antsignal;
57 } __packed __aligned(8);
58
59 #define RUN_RX_RADIOTAP_PRESENT \
60 (1 << IEEE80211_RADIOTAP_TSFT | \
61 1 << IEEE80211_RADIOTAP_FLAGS | \
62 1 << IEEE80211_RADIOTAP_RATE | \
63 1 << IEEE80211_RADIOTAP_CHANNEL | \
64 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL | \
65 1 << IEEE80211_RADIOTAP_ANTENNA | \
66 1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL)
67
68 struct run_tx_radiotap_header {
69 struct ieee80211_radiotap_header wt_ihdr;
70 uint8_t wt_flags;
71 uint8_t wt_rate;
72 uint16_t wt_chan_freq;
73 uint16_t wt_chan_flags;
74 uint8_t wt_hwqueue;
75 } __packed;
76
77 #define IEEE80211_RADIOTAP_HWQUEUE 15
78
79 #define RUN_TX_RADIOTAP_PRESENT \
80 (1 << IEEE80211_RADIOTAP_FLAGS | \
81 1 << IEEE80211_RADIOTAP_RATE | \
82 1 << IEEE80211_RADIOTAP_CHANNEL | \
83 1 << IEEE80211_RADIOTAP_HWQUEUE)
84
85 struct run_softc;
86
87 struct run_tx_data {
88 STAILQ_ENTRY(run_tx_data) next;
89 struct run_softc *sc;
90 struct mbuf *m;
91 struct ieee80211_node *ni;
92 uint32_t align[0]; /* dummy field */
93 uint8_t desc[sizeof(struct rt2870_txd) +
94 sizeof(struct rt2860_txwi)];
95 uint8_t ridx;
96 };
97 STAILQ_HEAD(run_tx_data_head, run_tx_data);
98
99 struct run_node {
100 struct ieee80211_node ni;
101 uint8_t amrr_ridx;
102 uint8_t mgt_ridx;
103 uint8_t fix_ridx;
104 };
105 #define RUN_NODE(ni) ((struct run_node *)(ni))
106
107 struct run_cmdq {
108 void *arg0;
109 void *arg1;
110 void (*func)(void *);
111 struct ieee80211_key *k;
112 struct ieee80211_key key;
113 uint8_t mac[IEEE80211_ADDR_LEN];
114 uint8_t wcid;
115 };
116
117 struct run_vap {
118 struct ieee80211vap vap;
119 struct mbuf *beacon_mbuf;
120
121 int (*newstate)(struct ieee80211vap *,
122 enum ieee80211_state, int);
123 void (*recv_mgmt)(struct ieee80211_node *,
124 struct mbuf *, int,
125 const struct ieee80211_rx_stats *,
126 int, int);
127
128 uint8_t rvp_id;
129 };
130 #define RUN_VAP(vap) ((struct run_vap *)(vap))
131
132 /*
133 * There are 7 bulk endpoints: 1 for RX
134 * and 6 for TX (4 EDCAs + HCCA + Prio).
135 * Update 03-14-2009: some devices like the Planex GW-US300MiniS
136 * seem to have only 4 TX bulk endpoints (Fukaumi Naoki).
137 */
138 enum {
139 RUN_BULK_TX_BE, /* = WME_AC_BE */
140 RUN_BULK_TX_BK, /* = WME_AC_BK */
141 RUN_BULK_TX_VI, /* = WME_AC_VI */
142 RUN_BULK_TX_VO, /* = WME_AC_VO */
143 RUN_BULK_TX_HCCA,
144 RUN_BULK_TX_PRIO,
145 RUN_BULK_RX,
146 RUN_N_XFER,
147 };
148
149 #define RUN_EP_QUEUES RUN_BULK_RX
150
151 struct run_endpoint_queue {
152 struct run_tx_data tx_data[RUN_TX_RING_COUNT];
153 struct run_tx_data_head tx_qh;
154 struct run_tx_data_head tx_fh;
155 uint32_t tx_nfree;
156 };
157
158 struct run_softc {
159 struct mtx sc_mtx;
160 struct ieee80211com sc_ic;
161 struct ieee80211_ratectl_tx_stats sc_txs;
162 struct mbufq sc_snd;
163 device_t sc_dev;
164 struct usb_device *sc_udev;
165 int sc_need_fwload;
166
167 int sc_flags;
168 #define RUN_FLAG_FWLOAD_NEEDED 0x01
169 #define RUN_RUNNING 0x02
170
171 uint16_t wcid_stats[RT2870_WCID_MAX + 1][3];
172 #define RUN_TXCNT 0
173 #define RUN_SUCCESS 1
174 #define RUN_RETRY 2
175
176 int (*sc_srom_read)(struct run_softc *,
177 uint16_t, uint16_t *);
178
179 uint16_t mac_ver;
180 uint16_t mac_rev;
181 uint16_t rf_rev;
182 uint8_t freq;
183 uint8_t ntxchains;
184 uint8_t nrxchains;
185
186 uint8_t bbp25;
187 uint8_t bbp26;
188 uint8_t rf24_20mhz;
189 uint8_t rf24_40mhz;
190 uint8_t patch_dac;
191 uint8_t rfswitch;
192 uint8_t ext_2ghz_lna;
193 uint8_t ext_5ghz_lna;
194 uint8_t calib_2ghz;
195 uint8_t calib_5ghz;
196 uint8_t txmixgain_2ghz;
197 uint8_t txmixgain_5ghz;
198 int8_t txpow1[54];
199 int8_t txpow2[54];
200 int8_t txpow3[54];
201 int8_t rssi_2ghz[3];
202 int8_t rssi_5ghz[3];
203 uint8_t lna[4];
204
205 struct {
206 uint8_t reg;
207 uint8_t val;
208 } bbp[10], rf[10];
209 uint8_t leds;
210 uint16_t led[3];
211 uint32_t txpow20mhz[5];
212 uint32_t txpow40mhz_2ghz[5];
213 uint32_t txpow40mhz_5ghz[5];
214
215 struct run_endpoint_queue sc_epq[RUN_EP_QUEUES];
216
217 struct task ratectl_task;
218 struct usb_callout ratectl_ch;
219 uint8_t ratectl_run;
220 #define RUN_RATECTL_OFF 0
221
222 /* need to be power of 2, otherwise RUN_CMDQ_GET fails */
223 #define RUN_CMDQ_MAX 16
224 #define RUN_CMDQ_MASQ (RUN_CMDQ_MAX - 1)
225 struct run_cmdq cmdq[RUN_CMDQ_MAX];
226 struct task cmdq_task;
227 uint32_t cmdq_store;
228 uint8_t cmdq_exec;
229 uint8_t cmdq_run;
230 uint8_t cmdq_key_set;
231 #define RUN_CMDQ_ABORT 0
232 #define RUN_CMDQ_GO 1
233
234 struct usb_xfer *sc_xfer[RUN_N_XFER];
235
236 struct mbuf *rx_m;
237
238 uint8_t fifo_cnt;
239
240 uint8_t running;
241 uint8_t runbmap;
242 uint8_t ap_running;
243 uint8_t adhoc_running;
244 uint8_t sta_running;
245 uint8_t rvp_cnt;
246 uint8_t rvp_bmap;
247 uint8_t sc_detached;
248
249 uint8_t sc_bssid[IEEE80211_ADDR_LEN];
250
251 union {
252 struct run_rx_radiotap_header th;
253 uint8_t pad[64];
254 } sc_rxtapu;
255 #define sc_rxtap sc_rxtapu.th
256
257 union {
258 struct run_tx_radiotap_header th;
259 uint8_t pad[64];
260 } sc_txtapu;
261 #define sc_txtap sc_txtapu.th
262 };
263
264 #define RUN_LOCK(sc) mtx_lock(&(sc)->sc_mtx)
265 #define RUN_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx)
266 #define RUN_LOCK_ASSERT(sc, t) mtx_assert(&(sc)->sc_mtx, t)
267
268 #endif /* _IF_RUNVAR_H_ */
Cache object: 1f6c6674af60af9962da917c6cc776a6
|