1 /*-
2 * Copyright (c) 2008,2010 Damien Bergamini <damien.bergamini@free.fr>
3 * ported to FreeBSD by Akinori Furukoshi <moonlightakkiy@yahoo.ca>
4 * USB Consulting, Hans Petter Selasky <hselasky@freebsd.org>
5 * Copyright (c) 2013-2014 Kevin Lo
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20 #include <sys/cdefs.h>
21 __FBSDID("$FreeBSD: releng/10.2/sys/dev/usb/wlan/if_run.c 281878 2015-04-23 01:52:07Z kevlo $");
22
23 /*-
24 * Ralink Technology RT2700U/RT2800U/RT3000U/RT3900E chipset driver.
25 * http://www.ralinktech.com/
26 */
27
28 #include <sys/param.h>
29 #include <sys/sockio.h>
30 #include <sys/sysctl.h>
31 #include <sys/lock.h>
32 #include <sys/mutex.h>
33 #include <sys/mbuf.h>
34 #include <sys/kernel.h>
35 #include <sys/socket.h>
36 #include <sys/systm.h>
37 #include <sys/malloc.h>
38 #include <sys/module.h>
39 #include <sys/bus.h>
40 #include <sys/endian.h>
41 #include <sys/linker.h>
42 #include <sys/firmware.h>
43 #include <sys/kdb.h>
44
45 #include <machine/bus.h>
46 #include <machine/resource.h>
47 #include <sys/rman.h>
48
49 #include <net/bpf.h>
50 #include <net/if.h>
51 #include <net/if_arp.h>
52 #include <net/ethernet.h>
53 #include <net/if_dl.h>
54 #include <net/if_media.h>
55 #include <net/if_types.h>
56
57 #include <netinet/in.h>
58 #include <netinet/in_systm.h>
59 #include <netinet/in_var.h>
60 #include <netinet/if_ether.h>
61 #include <netinet/ip.h>
62
63 #include <net80211/ieee80211_var.h>
64 #include <net80211/ieee80211_regdomain.h>
65 #include <net80211/ieee80211_radiotap.h>
66 #include <net80211/ieee80211_ratectl.h>
67
68 #include <dev/usb/usb.h>
69 #include <dev/usb/usbdi.h>
70 #include "usbdevs.h"
71
72 #define USB_DEBUG_VAR run_debug
73 #include <dev/usb/usb_debug.h>
74 #include <dev/usb/usb_msctest.h>
75
76 #include <dev/usb/wlan/if_runreg.h>
77 #include <dev/usb/wlan/if_runvar.h>
78
79 #ifdef USB_DEBUG
80 #define RUN_DEBUG
81 #endif
82
83 #ifdef RUN_DEBUG
84 int run_debug = 0;
85 static SYSCTL_NODE(_hw_usb, OID_AUTO, run, CTLFLAG_RW, 0, "USB run");
86 SYSCTL_INT(_hw_usb_run, OID_AUTO, debug, CTLFLAG_RW, &run_debug, 0,
87 "run debug level");
88 #endif
89
90 #define IEEE80211_HAS_ADDR4(wh) \
91 (((wh)->i_fc[1] & IEEE80211_FC1_DIR_MASK) == IEEE80211_FC1_DIR_DSTODS)
92
93 /*
94 * Because of LOR in run_key_delete(), use atomic instead.
95 * '& RUN_CMDQ_MASQ' is to loop cmdq[].
96 */
97 #define RUN_CMDQ_GET(c) (atomic_fetchadd_32((c), 1) & RUN_CMDQ_MASQ)
98
99 static const STRUCT_USB_HOST_ID run_devs[] = {
100 #define RUN_DEV(v,p) { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) }
101 #define RUN_DEV_EJECT(v,p) \
102 { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, RUN_EJECT) }
103 #define RUN_EJECT 1
104 RUN_DEV(ABOCOM, RT2770),
105 RUN_DEV(ABOCOM, RT2870),
106 RUN_DEV(ABOCOM, RT3070),
107 RUN_DEV(ABOCOM, RT3071),
108 RUN_DEV(ABOCOM, RT3072),
109 RUN_DEV(ABOCOM2, RT2870_1),
110 RUN_DEV(ACCTON, RT2770),
111 RUN_DEV(ACCTON, RT2870_1),
112 RUN_DEV(ACCTON, RT2870_2),
113 RUN_DEV(ACCTON, RT2870_3),
114 RUN_DEV(ACCTON, RT2870_4),
115 RUN_DEV(ACCTON, RT2870_5),
116 RUN_DEV(ACCTON, RT3070),
117 RUN_DEV(ACCTON, RT3070_1),
118 RUN_DEV(ACCTON, RT3070_2),
119 RUN_DEV(ACCTON, RT3070_3),
120 RUN_DEV(ACCTON, RT3070_4),
121 RUN_DEV(ACCTON, RT3070_5),
122 RUN_DEV(AIRTIES, RT3070),
123 RUN_DEV(ALLWIN, RT2070),
124 RUN_DEV(ALLWIN, RT2770),
125 RUN_DEV(ALLWIN, RT2870),
126 RUN_DEV(ALLWIN, RT3070),
127 RUN_DEV(ALLWIN, RT3071),
128 RUN_DEV(ALLWIN, RT3072),
129 RUN_DEV(ALLWIN, RT3572),
130 RUN_DEV(AMIGO, RT2870_1),
131 RUN_DEV(AMIGO, RT2870_2),
132 RUN_DEV(AMIT, CGWLUSB2GNR),
133 RUN_DEV(AMIT, RT2870_1),
134 RUN_DEV(AMIT2, RT2870),
135 RUN_DEV(ASUS, RT2870_1),
136 RUN_DEV(ASUS, RT2870_2),
137 RUN_DEV(ASUS, RT2870_3),
138 RUN_DEV(ASUS, RT2870_4),
139 RUN_DEV(ASUS, RT2870_5),
140 RUN_DEV(ASUS, USBN13),
141 RUN_DEV(ASUS, RT3070_1),
142 RUN_DEV(ASUS, USBN66),
143 RUN_DEV(ASUS, USB_N53),
144 RUN_DEV(ASUS2, USBN11),
145 RUN_DEV(AZUREWAVE, RT2870_1),
146 RUN_DEV(AZUREWAVE, RT2870_2),
147 RUN_DEV(AZUREWAVE, RT3070_1),
148 RUN_DEV(AZUREWAVE, RT3070_2),
149 RUN_DEV(AZUREWAVE, RT3070_3),
150 RUN_DEV(BELKIN, F9L1103),
151 RUN_DEV(BELKIN, F5D8053V3),
152 RUN_DEV(BELKIN, F5D8055),
153 RUN_DEV(BELKIN, F5D8055V2),
154 RUN_DEV(BELKIN, F6D4050V1),
155 RUN_DEV(BELKIN, F6D4050V2),
156 RUN_DEV(BELKIN, RT2870_1),
157 RUN_DEV(BELKIN, RT2870_2),
158 RUN_DEV(CISCOLINKSYS, AE1000),
159 RUN_DEV(CISCOLINKSYS2, RT3070),
160 RUN_DEV(CISCOLINKSYS3, RT3070),
161 RUN_DEV(CONCEPTRONIC2, RT2870_1),
162 RUN_DEV(CONCEPTRONIC2, RT2870_2),
163 RUN_DEV(CONCEPTRONIC2, RT2870_3),
164 RUN_DEV(CONCEPTRONIC2, RT2870_4),
165 RUN_DEV(CONCEPTRONIC2, RT2870_5),
166 RUN_DEV(CONCEPTRONIC2, RT2870_6),
167 RUN_DEV(CONCEPTRONIC2, RT2870_7),
168 RUN_DEV(CONCEPTRONIC2, RT2870_8),
169 RUN_DEV(CONCEPTRONIC2, RT3070_1),
170 RUN_DEV(CONCEPTRONIC2, RT3070_2),
171 RUN_DEV(CONCEPTRONIC2, VIGORN61),
172 RUN_DEV(COREGA, CGWLUSB300GNM),
173 RUN_DEV(COREGA, RT2870_1),
174 RUN_DEV(COREGA, RT2870_2),
175 RUN_DEV(COREGA, RT2870_3),
176 RUN_DEV(COREGA, RT3070),
177 RUN_DEV(CYBERTAN, RT2870),
178 RUN_DEV(DLINK, RT2870),
179 RUN_DEV(DLINK, RT3072),
180 RUN_DEV(DLINK, DWA127),
181 RUN_DEV(DLINK, DWA140B3),
182 RUN_DEV(DLINK, DWA160B2),
183 RUN_DEV(DLINK, DWA140D1),
184 RUN_DEV(DLINK, DWA162),
185 RUN_DEV(DLINK2, DWA130),
186 RUN_DEV(DLINK2, RT2870_1),
187 RUN_DEV(DLINK2, RT2870_2),
188 RUN_DEV(DLINK2, RT3070_1),
189 RUN_DEV(DLINK2, RT3070_2),
190 RUN_DEV(DLINK2, RT3070_3),
191 RUN_DEV(DLINK2, RT3070_4),
192 RUN_DEV(DLINK2, RT3070_5),
193 RUN_DEV(DLINK2, RT3072),
194 RUN_DEV(DLINK2, RT3072_1),
195 RUN_DEV(EDIMAX, EW7717),
196 RUN_DEV(EDIMAX, EW7718),
197 RUN_DEV(EDIMAX, EW7733UND),
198 RUN_DEV(EDIMAX, RT2870_1),
199 RUN_DEV(ENCORE, RT3070_1),
200 RUN_DEV(ENCORE, RT3070_2),
201 RUN_DEV(ENCORE, RT3070_3),
202 RUN_DEV(GIGABYTE, GNWB31N),
203 RUN_DEV(GIGABYTE, GNWB32L),
204 RUN_DEV(GIGABYTE, RT2870_1),
205 RUN_DEV(GIGASET, RT3070_1),
206 RUN_DEV(GIGASET, RT3070_2),
207 RUN_DEV(GUILLEMOT, HWNU300),
208 RUN_DEV(HAWKING, HWUN2),
209 RUN_DEV(HAWKING, RT2870_1),
210 RUN_DEV(HAWKING, RT2870_2),
211 RUN_DEV(HAWKING, RT3070),
212 RUN_DEV(IODATA, RT3072_1),
213 RUN_DEV(IODATA, RT3072_2),
214 RUN_DEV(IODATA, RT3072_3),
215 RUN_DEV(IODATA, RT3072_4),
216 RUN_DEV(LINKSYS4, RT3070),
217 RUN_DEV(LINKSYS4, WUSB100),
218 RUN_DEV(LINKSYS4, WUSB54GCV3),
219 RUN_DEV(LINKSYS4, WUSB600N),
220 RUN_DEV(LINKSYS4, WUSB600NV2),
221 RUN_DEV(LOGITEC, RT2870_1),
222 RUN_DEV(LOGITEC, RT2870_2),
223 RUN_DEV(LOGITEC, RT2870_3),
224 RUN_DEV(LOGITEC, LANW300NU2),
225 RUN_DEV(LOGITEC, LANW150NU2),
226 RUN_DEV(LOGITEC, LANW300NU2S),
227 RUN_DEV(MELCO, WLIUCG300HP),
228 RUN_DEV(MELCO, RT2870_2),
229 RUN_DEV(MELCO, WLIUCAG300N),
230 RUN_DEV(MELCO, WLIUCG300N),
231 RUN_DEV(MELCO, WLIUCG301N),
232 RUN_DEV(MELCO, WLIUCGN),
233 RUN_DEV(MELCO, WLIUCGNM),
234 RUN_DEV(MELCO, WLIUCG300HPV1),
235 RUN_DEV(MELCO, WLIUCGNM2),
236 RUN_DEV(MOTOROLA4, RT2770),
237 RUN_DEV(MOTOROLA4, RT3070),
238 RUN_DEV(MSI, RT3070_1),
239 RUN_DEV(MSI, RT3070_2),
240 RUN_DEV(MSI, RT3070_3),
241 RUN_DEV(MSI, RT3070_4),
242 RUN_DEV(MSI, RT3070_5),
243 RUN_DEV(MSI, RT3070_6),
244 RUN_DEV(MSI, RT3070_7),
245 RUN_DEV(MSI, RT3070_8),
246 RUN_DEV(MSI, RT3070_9),
247 RUN_DEV(MSI, RT3070_10),
248 RUN_DEV(MSI, RT3070_11),
249 RUN_DEV(OVISLINK, RT3072),
250 RUN_DEV(PARA, RT3070),
251 RUN_DEV(PEGATRON, RT2870),
252 RUN_DEV(PEGATRON, RT3070),
253 RUN_DEV(PEGATRON, RT3070_2),
254 RUN_DEV(PEGATRON, RT3070_3),
255 RUN_DEV(PHILIPS, RT2870),
256 RUN_DEV(PLANEX2, GWUS300MINIS),
257 RUN_DEV(PLANEX2, GWUSMICRON),
258 RUN_DEV(PLANEX2, RT2870),
259 RUN_DEV(PLANEX2, RT3070),
260 RUN_DEV(QCOM, RT2870),
261 RUN_DEV(QUANTA, RT3070),
262 RUN_DEV(RALINK, RT2070),
263 RUN_DEV(RALINK, RT2770),
264 RUN_DEV(RALINK, RT2870),
265 RUN_DEV(RALINK, RT3070),
266 RUN_DEV(RALINK, RT3071),
267 RUN_DEV(RALINK, RT3072),
268 RUN_DEV(RALINK, RT3370),
269 RUN_DEV(RALINK, RT3572),
270 RUN_DEV(RALINK, RT3573),
271 RUN_DEV(RALINK, RT5370),
272 RUN_DEV(RALINK, RT5572),
273 RUN_DEV(RALINK, RT8070),
274 RUN_DEV(SAMSUNG, WIS09ABGN),
275 RUN_DEV(SAMSUNG2, RT2870_1),
276 RUN_DEV(SENAO, RT2870_1),
277 RUN_DEV(SENAO, RT2870_2),
278 RUN_DEV(SENAO, RT2870_3),
279 RUN_DEV(SENAO, RT2870_4),
280 RUN_DEV(SENAO, RT3070),
281 RUN_DEV(SENAO, RT3071),
282 RUN_DEV(SENAO, RT3072_1),
283 RUN_DEV(SENAO, RT3072_2),
284 RUN_DEV(SENAO, RT3072_3),
285 RUN_DEV(SENAO, RT3072_4),
286 RUN_DEV(SENAO, RT3072_5),
287 RUN_DEV(SITECOMEU, RT2770),
288 RUN_DEV(SITECOMEU, RT2870_1),
289 RUN_DEV(SITECOMEU, RT2870_2),
290 RUN_DEV(SITECOMEU, RT2870_3),
291 RUN_DEV(SITECOMEU, RT2870_4),
292 RUN_DEV(SITECOMEU, RT3070),
293 RUN_DEV(SITECOMEU, RT3070_2),
294 RUN_DEV(SITECOMEU, RT3070_3),
295 RUN_DEV(SITECOMEU, RT3070_4),
296 RUN_DEV(SITECOMEU, RT3071),
297 RUN_DEV(SITECOMEU, RT3072_1),
298 RUN_DEV(SITECOMEU, RT3072_2),
299 RUN_DEV(SITECOMEU, RT3072_3),
300 RUN_DEV(SITECOMEU, RT3072_4),
301 RUN_DEV(SITECOMEU, RT3072_5),
302 RUN_DEV(SITECOMEU, RT3072_6),
303 RUN_DEV(SITECOMEU, WL608),
304 RUN_DEV(SPARKLAN, RT2870_1),
305 RUN_DEV(SPARKLAN, RT3070),
306 RUN_DEV(SWEEX2, LW153),
307 RUN_DEV(SWEEX2, LW303),
308 RUN_DEV(SWEEX2, LW313),
309 RUN_DEV(TOSHIBA, RT3070),
310 RUN_DEV(UMEDIA, RT2870_1),
311 RUN_DEV(ZCOM, RT2870_1),
312 RUN_DEV(ZCOM, RT2870_2),
313 RUN_DEV(ZINWELL, RT2870_1),
314 RUN_DEV(ZINWELL, RT2870_2),
315 RUN_DEV(ZINWELL, RT3070),
316 RUN_DEV(ZINWELL, RT3072_1),
317 RUN_DEV(ZINWELL, RT3072_2),
318 RUN_DEV(ZYXEL, RT2870_1),
319 RUN_DEV(ZYXEL, RT2870_2),
320 RUN_DEV_EJECT(ZYXEL, NWD2705),
321 RUN_DEV_EJECT(RALINK, RT_STOR),
322 #undef RUN_DEV_EJECT
323 #undef RUN_DEV
324 };
325
326 static device_probe_t run_match;
327 static device_attach_t run_attach;
328 static device_detach_t run_detach;
329
330 static usb_callback_t run_bulk_rx_callback;
331 static usb_callback_t run_bulk_tx_callback0;
332 static usb_callback_t run_bulk_tx_callback1;
333 static usb_callback_t run_bulk_tx_callback2;
334 static usb_callback_t run_bulk_tx_callback3;
335 static usb_callback_t run_bulk_tx_callback4;
336 static usb_callback_t run_bulk_tx_callback5;
337
338 static void run_autoinst(void *, struct usb_device *,
339 struct usb_attach_arg *);
340 static int run_driver_loaded(struct module *, int, void *);
341 static void run_bulk_tx_callbackN(struct usb_xfer *xfer,
342 usb_error_t error, u_int index);
343 static struct ieee80211vap *run_vap_create(struct ieee80211com *,
344 const char [IFNAMSIZ], int, enum ieee80211_opmode, int,
345 const uint8_t [IEEE80211_ADDR_LEN],
346 const uint8_t [IEEE80211_ADDR_LEN]);
347 static void run_vap_delete(struct ieee80211vap *);
348 static void run_cmdq_cb(void *, int);
349 static void run_setup_tx_list(struct run_softc *,
350 struct run_endpoint_queue *);
351 static void run_unsetup_tx_list(struct run_softc *,
352 struct run_endpoint_queue *);
353 static int run_load_microcode(struct run_softc *);
354 static int run_reset(struct run_softc *);
355 static usb_error_t run_do_request(struct run_softc *,
356 struct usb_device_request *, void *);
357 static int run_read(struct run_softc *, uint16_t, uint32_t *);
358 static int run_read_region_1(struct run_softc *, uint16_t, uint8_t *, int);
359 static int run_write_2(struct run_softc *, uint16_t, uint16_t);
360 static int run_write(struct run_softc *, uint16_t, uint32_t);
361 static int run_write_region_1(struct run_softc *, uint16_t,
362 const uint8_t *, int);
363 static int run_set_region_4(struct run_softc *, uint16_t, uint32_t, int);
364 static int run_efuse_read(struct run_softc *, uint16_t, uint16_t *, int);
365 static int run_efuse_read_2(struct run_softc *, uint16_t, uint16_t *);
366 static int run_eeprom_read_2(struct run_softc *, uint16_t, uint16_t *);
367 static int run_rt2870_rf_write(struct run_softc *, uint32_t);
368 static int run_rt3070_rf_read(struct run_softc *, uint8_t, uint8_t *);
369 static int run_rt3070_rf_write(struct run_softc *, uint8_t, uint8_t);
370 static int run_bbp_read(struct run_softc *, uint8_t, uint8_t *);
371 static int run_bbp_write(struct run_softc *, uint8_t, uint8_t);
372 static int run_mcu_cmd(struct run_softc *, uint8_t, uint16_t);
373 static const char *run_get_rf(uint16_t);
374 static void run_rt3593_get_txpower(struct run_softc *);
375 static void run_get_txpower(struct run_softc *);
376 static int run_read_eeprom(struct run_softc *);
377 static struct ieee80211_node *run_node_alloc(struct ieee80211vap *,
378 const uint8_t mac[IEEE80211_ADDR_LEN]);
379 static int run_media_change(struct ifnet *);
380 static int run_newstate(struct ieee80211vap *, enum ieee80211_state, int);
381 static int run_wme_update(struct ieee80211com *);
382 static void run_wme_update_cb(void *);
383 static void run_key_update_begin(struct ieee80211vap *);
384 static void run_key_update_end(struct ieee80211vap *);
385 static void run_key_set_cb(void *);
386 static int run_key_set(struct ieee80211vap *, struct ieee80211_key *,
387 const uint8_t mac[IEEE80211_ADDR_LEN]);
388 static void run_key_delete_cb(void *);
389 static int run_key_delete(struct ieee80211vap *, struct ieee80211_key *);
390 static void run_ratectl_to(void *);
391 static void run_ratectl_cb(void *, int);
392 static void run_drain_fifo(void *);
393 static void run_iter_func(void *, struct ieee80211_node *);
394 static void run_newassoc_cb(void *);
395 static void run_newassoc(struct ieee80211_node *, int);
396 static void run_rx_frame(struct run_softc *, struct mbuf *, uint32_t);
397 static void run_tx_free(struct run_endpoint_queue *pq,
398 struct run_tx_data *, int);
399 static void run_set_tx_desc(struct run_softc *, struct run_tx_data *);
400 static int run_tx(struct run_softc *, struct mbuf *,
401 struct ieee80211_node *);
402 static int run_tx_mgt(struct run_softc *, struct mbuf *,
403 struct ieee80211_node *);
404 static int run_sendprot(struct run_softc *, const struct mbuf *,
405 struct ieee80211_node *, int, int);
406 static int run_tx_param(struct run_softc *, struct mbuf *,
407 struct ieee80211_node *,
408 const struct ieee80211_bpf_params *);
409 static int run_raw_xmit(struct ieee80211_node *, struct mbuf *,
410 const struct ieee80211_bpf_params *);
411 static void run_start(struct ifnet *);
412 static int run_ioctl(struct ifnet *, u_long, caddr_t);
413 static void run_iq_calib(struct run_softc *, u_int);
414 static void run_set_agc(struct run_softc *, uint8_t);
415 static void run_select_chan_group(struct run_softc *, int);
416 static void run_set_rx_antenna(struct run_softc *, int);
417 static void run_rt2870_set_chan(struct run_softc *, u_int);
418 static void run_rt3070_set_chan(struct run_softc *, u_int);
419 static void run_rt3572_set_chan(struct run_softc *, u_int);
420 static void run_rt3593_set_chan(struct run_softc *, u_int);
421 static void run_rt5390_set_chan(struct run_softc *, u_int);
422 static void run_rt5592_set_chan(struct run_softc *, u_int);
423 static int run_set_chan(struct run_softc *, struct ieee80211_channel *);
424 static void run_set_channel(struct ieee80211com *);
425 static void run_scan_start(struct ieee80211com *);
426 static void run_scan_end(struct ieee80211com *);
427 static void run_update_beacon(struct ieee80211vap *, int);
428 static void run_update_beacon_cb(void *);
429 static void run_updateprot(struct ieee80211com *);
430 static void run_updateprot_cb(void *);
431 static void run_usb_timeout_cb(void *);
432 static void run_reset_livelock(struct run_softc *);
433 static void run_enable_tsf_sync(struct run_softc *);
434 static void run_enable_mrr(struct run_softc *);
435 static void run_set_txpreamble(struct run_softc *);
436 static void run_set_basicrates(struct run_softc *);
437 static void run_set_leds(struct run_softc *, uint16_t);
438 static void run_set_bssid(struct run_softc *, const uint8_t *);
439 static void run_set_macaddr(struct run_softc *, const uint8_t *);
440 static void run_updateslot(struct ifnet *);
441 static void run_updateslot_cb(void *);
442 static void run_update_mcast(struct ifnet *);
443 static int8_t run_rssi2dbm(struct run_softc *, uint8_t, uint8_t);
444 static void run_update_promisc_locked(struct ifnet *);
445 static void run_update_promisc(struct ifnet *);
446 static void run_rt5390_bbp_init(struct run_softc *);
447 static int run_bbp_init(struct run_softc *);
448 static int run_rt3070_rf_init(struct run_softc *);
449 static void run_rt3593_rf_init(struct run_softc *);
450 static void run_rt5390_rf_init(struct run_softc *);
451 static int run_rt3070_filter_calib(struct run_softc *, uint8_t, uint8_t,
452 uint8_t *);
453 static void run_rt3070_rf_setup(struct run_softc *);
454 static void run_rt3593_rf_setup(struct run_softc *);
455 static void run_rt5390_rf_setup(struct run_softc *);
456 static int run_txrx_enable(struct run_softc *);
457 static void run_adjust_freq_offset(struct run_softc *);
458 static void run_init(void *);
459 static void run_init_locked(struct run_softc *);
460 static void run_stop(void *);
461 static void run_delay(struct run_softc *, u_int);
462
463 static eventhandler_tag run_etag;
464
465 static const struct rt2860_rate {
466 uint8_t rate;
467 uint8_t mcs;
468 enum ieee80211_phytype phy;
469 uint8_t ctl_ridx;
470 uint16_t sp_ack_dur;
471 uint16_t lp_ack_dur;
472 } rt2860_rates[] = {
473 { 2, 0, IEEE80211_T_DS, 0, 314, 314 },
474 { 4, 1, IEEE80211_T_DS, 1, 258, 162 },
475 { 11, 2, IEEE80211_T_DS, 2, 223, 127 },
476 { 22, 3, IEEE80211_T_DS, 3, 213, 117 },
477 { 12, 0, IEEE80211_T_OFDM, 4, 60, 60 },
478 { 18, 1, IEEE80211_T_OFDM, 4, 52, 52 },
479 { 24, 2, IEEE80211_T_OFDM, 6, 48, 48 },
480 { 36, 3, IEEE80211_T_OFDM, 6, 44, 44 },
481 { 48, 4, IEEE80211_T_OFDM, 8, 44, 44 },
482 { 72, 5, IEEE80211_T_OFDM, 8, 40, 40 },
483 { 96, 6, IEEE80211_T_OFDM, 8, 40, 40 },
484 { 108, 7, IEEE80211_T_OFDM, 8, 40, 40 }
485 };
486
487 static const struct {
488 uint16_t reg;
489 uint32_t val;
490 } rt2870_def_mac[] = {
491 RT2870_DEF_MAC
492 };
493
494 static const struct {
495 uint8_t reg;
496 uint8_t val;
497 } rt2860_def_bbp[] = {
498 RT2860_DEF_BBP
499 },rt5390_def_bbp[] = {
500 RT5390_DEF_BBP
501 },rt5592_def_bbp[] = {
502 RT5592_DEF_BBP
503 };
504
505 /*
506 * Default values for BBP register R196 for RT5592.
507 */
508 static const uint8_t rt5592_bbp_r196[] = {
509 0xe0, 0x1f, 0x38, 0x32, 0x08, 0x28, 0x19, 0x0a, 0xff, 0x00,
510 0x16, 0x10, 0x10, 0x0b, 0x36, 0x2c, 0x26, 0x24, 0x42, 0x36,
511 0x30, 0x2d, 0x4c, 0x46, 0x3d, 0x40, 0x3e, 0x42, 0x3d, 0x40,
512 0x3c, 0x34, 0x2c, 0x2f, 0x3c, 0x35, 0x2e, 0x2a, 0x49, 0x41,
513 0x36, 0x31, 0x30, 0x30, 0x0e, 0x0d, 0x28, 0x21, 0x1c, 0x16,
514 0x50, 0x4a, 0x43, 0x40, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00,
515 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
516 0x00, 0x00, 0x7d, 0x14, 0x32, 0x2c, 0x36, 0x4c, 0x43, 0x2c,
517 0x2e, 0x36, 0x30, 0x6e
518 };
519
520 static const struct rfprog {
521 uint8_t chan;
522 uint32_t r1, r2, r3, r4;
523 } rt2860_rf2850[] = {
524 RT2860_RF2850
525 };
526
527 struct {
528 uint8_t n, r, k;
529 } rt3070_freqs[] = {
530 RT3070_RF3052
531 };
532
533 static const struct rt5592_freqs {
534 uint16_t n;
535 uint8_t k, m, r;
536 } rt5592_freqs_20mhz[] = {
537 RT5592_RF5592_20MHZ
538 },rt5592_freqs_40mhz[] = {
539 RT5592_RF5592_40MHZ
540 };
541
542 static const struct {
543 uint8_t reg;
544 uint8_t val;
545 } rt3070_def_rf[] = {
546 RT3070_DEF_RF
547 },rt3572_def_rf[] = {
548 RT3572_DEF_RF
549 },rt3593_def_rf[] = {
550 RT3593_DEF_RF
551 },rt5390_def_rf[] = {
552 RT5390_DEF_RF
553 },rt5392_def_rf[] = {
554 RT5392_DEF_RF
555 },rt5592_def_rf[] = {
556 RT5592_DEF_RF
557 },rt5592_2ghz_def_rf[] = {
558 RT5592_2GHZ_DEF_RF
559 },rt5592_5ghz_def_rf[] = {
560 RT5592_5GHZ_DEF_RF
561 };
562
563 static const struct {
564 u_int firstchan;
565 u_int lastchan;
566 uint8_t reg;
567 uint8_t val;
568 } rt5592_chan_5ghz[] = {
569 RT5592_CHAN_5GHZ
570 };
571
572 static const struct usb_config run_config[RUN_N_XFER] = {
573 [RUN_BULK_TX_BE] = {
574 .type = UE_BULK,
575 .endpoint = UE_ADDR_ANY,
576 .ep_index = 0,
577 .direction = UE_DIR_OUT,
578 .bufsize = RUN_MAX_TXSZ,
579 .flags = {.pipe_bof = 1,.force_short_xfer = 1,},
580 .callback = run_bulk_tx_callback0,
581 .timeout = 5000, /* ms */
582 },
583 [RUN_BULK_TX_BK] = {
584 .type = UE_BULK,
585 .endpoint = UE_ADDR_ANY,
586 .direction = UE_DIR_OUT,
587 .ep_index = 1,
588 .bufsize = RUN_MAX_TXSZ,
589 .flags = {.pipe_bof = 1,.force_short_xfer = 1,},
590 .callback = run_bulk_tx_callback1,
591 .timeout = 5000, /* ms */
592 },
593 [RUN_BULK_TX_VI] = {
594 .type = UE_BULK,
595 .endpoint = UE_ADDR_ANY,
596 .direction = UE_DIR_OUT,
597 .ep_index = 2,
598 .bufsize = RUN_MAX_TXSZ,
599 .flags = {.pipe_bof = 1,.force_short_xfer = 1,},
600 .callback = run_bulk_tx_callback2,
601 .timeout = 5000, /* ms */
602 },
603 [RUN_BULK_TX_VO] = {
604 .type = UE_BULK,
605 .endpoint = UE_ADDR_ANY,
606 .direction = UE_DIR_OUT,
607 .ep_index = 3,
608 .bufsize = RUN_MAX_TXSZ,
609 .flags = {.pipe_bof = 1,.force_short_xfer = 1,},
610 .callback = run_bulk_tx_callback3,
611 .timeout = 5000, /* ms */
612 },
613 [RUN_BULK_TX_HCCA] = {
614 .type = UE_BULK,
615 .endpoint = UE_ADDR_ANY,
616 .direction = UE_DIR_OUT,
617 .ep_index = 4,
618 .bufsize = RUN_MAX_TXSZ,
619 .flags = {.pipe_bof = 1,.force_short_xfer = 1,.no_pipe_ok = 1,},
620 .callback = run_bulk_tx_callback4,
621 .timeout = 5000, /* ms */
622 },
623 [RUN_BULK_TX_PRIO] = {
624 .type = UE_BULK,
625 .endpoint = UE_ADDR_ANY,
626 .direction = UE_DIR_OUT,
627 .ep_index = 5,
628 .bufsize = RUN_MAX_TXSZ,
629 .flags = {.pipe_bof = 1,.force_short_xfer = 1,.no_pipe_ok = 1,},
630 .callback = run_bulk_tx_callback5,
631 .timeout = 5000, /* ms */
632 },
633 [RUN_BULK_RX] = {
634 .type = UE_BULK,
635 .endpoint = UE_ADDR_ANY,
636 .direction = UE_DIR_IN,
637 .bufsize = RUN_MAX_RXSZ,
638 .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
639 .callback = run_bulk_rx_callback,
640 }
641 };
642
643 static void
644 run_autoinst(void *arg, struct usb_device *udev,
645 struct usb_attach_arg *uaa)
646 {
647 struct usb_interface *iface;
648 struct usb_interface_descriptor *id;
649
650 if (uaa->dev_state != UAA_DEV_READY)
651 return;
652
653 iface = usbd_get_iface(udev, 0);
654 if (iface == NULL)
655 return;
656 id = iface->idesc;
657 if (id == NULL || id->bInterfaceClass != UICLASS_MASS)
658 return;
659 if (usbd_lookup_id_by_uaa(run_devs, sizeof(run_devs), uaa))
660 return;
661
662 if (usb_msc_eject(udev, 0, MSC_EJECT_STOPUNIT) == 0)
663 uaa->dev_state = UAA_DEV_EJECTING;
664 }
665
666 static int
667 run_driver_loaded(struct module *mod, int what, void *arg)
668 {
669 switch (what) {
670 case MOD_LOAD:
671 run_etag = EVENTHANDLER_REGISTER(usb_dev_configured,
672 run_autoinst, NULL, EVENTHANDLER_PRI_ANY);
673 break;
674 case MOD_UNLOAD:
675 EVENTHANDLER_DEREGISTER(usb_dev_configured, run_etag);
676 break;
677 default:
678 return (EOPNOTSUPP);
679 }
680 return (0);
681 }
682
683 static int
684 run_match(device_t self)
685 {
686 struct usb_attach_arg *uaa = device_get_ivars(self);
687
688 if (uaa->usb_mode != USB_MODE_HOST)
689 return (ENXIO);
690 if (uaa->info.bConfigIndex != 0)
691 return (ENXIO);
692 if (uaa->info.bIfaceIndex != RT2860_IFACE_INDEX)
693 return (ENXIO);
694
695 return (usbd_lookup_id_by_uaa(run_devs, sizeof(run_devs), uaa));
696 }
697
698 static int
699 run_attach(device_t self)
700 {
701 struct run_softc *sc = device_get_softc(self);
702 struct usb_attach_arg *uaa = device_get_ivars(self);
703 struct ieee80211com *ic;
704 struct ifnet *ifp;
705 uint32_t ver;
706 int ntries, error;
707 uint8_t iface_index, bands;
708
709 device_set_usb_desc(self);
710 sc->sc_udev = uaa->device;
711 sc->sc_dev = self;
712 if (USB_GET_DRIVER_INFO(uaa) != RUN_EJECT)
713 sc->sc_flags |= RUN_FLAG_FWLOAD_NEEDED;
714
715 mtx_init(&sc->sc_mtx, device_get_nameunit(sc->sc_dev),
716 MTX_NETWORK_LOCK, MTX_DEF);
717
718 iface_index = RT2860_IFACE_INDEX;
719
720 error = usbd_transfer_setup(uaa->device, &iface_index,
721 sc->sc_xfer, run_config, RUN_N_XFER, sc, &sc->sc_mtx);
722 if (error) {
723 device_printf(self, "could not allocate USB transfers, "
724 "err=%s\n", usbd_errstr(error));
725 goto detach;
726 }
727
728 RUN_LOCK(sc);
729
730 /* wait for the chip to settle */
731 for (ntries = 0; ntries < 100; ntries++) {
732 if (run_read(sc, RT2860_ASIC_VER_ID, &ver) != 0) {
733 RUN_UNLOCK(sc);
734 goto detach;
735 }
736 if (ver != 0 && ver != 0xffffffff)
737 break;
738 run_delay(sc, 10);
739 }
740 if (ntries == 100) {
741 device_printf(sc->sc_dev,
742 "timeout waiting for NIC to initialize\n");
743 RUN_UNLOCK(sc);
744 goto detach;
745 }
746 sc->mac_ver = ver >> 16;
747 sc->mac_rev = ver & 0xffff;
748
749 /* retrieve RF rev. no and various other things from EEPROM */
750 run_read_eeprom(sc);
751
752 device_printf(sc->sc_dev,
753 "MAC/BBP RT%04X (rev 0x%04X), RF %s (MIMO %dT%dR), address %s\n",
754 sc->mac_ver, sc->mac_rev, run_get_rf(sc->rf_rev),
755 sc->ntxchains, sc->nrxchains, ether_sprintf(sc->sc_bssid));
756
757 RUN_UNLOCK(sc);
758
759 ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211);
760 if (ifp == NULL) {
761 device_printf(sc->sc_dev, "can not if_alloc()\n");
762 goto detach;
763 }
764 ic = ifp->if_l2com;
765
766 ifp->if_softc = sc;
767 if_initname(ifp, "run", device_get_unit(sc->sc_dev));
768 ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
769 ifp->if_init = run_init;
770 ifp->if_ioctl = run_ioctl;
771 ifp->if_start = run_start;
772 IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen);
773 ifp->if_snd.ifq_drv_maxlen = ifqmaxlen;
774 IFQ_SET_READY(&ifp->if_snd);
775
776 ic->ic_ifp = ifp;
777 ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */
778 ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */
779
780 /* set device capabilities */
781 ic->ic_caps =
782 IEEE80211_C_STA | /* station mode supported */
783 IEEE80211_C_MONITOR | /* monitor mode supported */
784 IEEE80211_C_IBSS |
785 IEEE80211_C_HOSTAP |
786 IEEE80211_C_WDS | /* 4-address traffic works */
787 IEEE80211_C_MBSS |
788 IEEE80211_C_SHPREAMBLE | /* short preamble supported */
789 IEEE80211_C_SHSLOT | /* short slot time supported */
790 IEEE80211_C_WME | /* WME */
791 IEEE80211_C_WPA; /* WPA1|WPA2(RSN) */
792
793 ic->ic_cryptocaps =
794 IEEE80211_CRYPTO_WEP |
795 IEEE80211_CRYPTO_AES_CCM |
796 IEEE80211_CRYPTO_TKIPMIC |
797 IEEE80211_CRYPTO_TKIP;
798
799 ic->ic_flags |= IEEE80211_F_DATAPAD;
800 ic->ic_flags_ext |= IEEE80211_FEXT_SWBMISS;
801
802 bands = 0;
803 setbit(&bands, IEEE80211_MODE_11B);
804 setbit(&bands, IEEE80211_MODE_11G);
805 if (sc->rf_rev == RT2860_RF_2750 || sc->rf_rev == RT2860_RF_2850 ||
806 sc->rf_rev == RT3070_RF_3052 || sc->rf_rev == RT3593_RF_3053 ||
807 sc->rf_rev == RT5592_RF_5592)
808 setbit(&bands, IEEE80211_MODE_11A);
809 ieee80211_init_channels(ic, NULL, &bands);
810
811 ieee80211_ifattach(ic, sc->sc_bssid);
812
813 ic->ic_scan_start = run_scan_start;
814 ic->ic_scan_end = run_scan_end;
815 ic->ic_set_channel = run_set_channel;
816 ic->ic_node_alloc = run_node_alloc;
817 ic->ic_newassoc = run_newassoc;
818 ic->ic_updateslot = run_updateslot;
819 ic->ic_update_mcast = run_update_mcast;
820 ic->ic_wme.wme_update = run_wme_update;
821 ic->ic_raw_xmit = run_raw_xmit;
822 ic->ic_update_promisc = run_update_promisc;
823
824 ic->ic_vap_create = run_vap_create;
825 ic->ic_vap_delete = run_vap_delete;
826
827 ieee80211_radiotap_attach(ic,
828 &sc->sc_txtap.wt_ihdr, sizeof(sc->sc_txtap),
829 RUN_TX_RADIOTAP_PRESENT,
830 &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap),
831 RUN_RX_RADIOTAP_PRESENT);
832
833 TASK_INIT(&sc->cmdq_task, 0, run_cmdq_cb, sc);
834 TASK_INIT(&sc->ratectl_task, 0, run_ratectl_cb, sc);
835 usb_callout_init_mtx(&sc->ratectl_ch, &sc->sc_mtx, 0);
836
837 if (bootverbose)
838 ieee80211_announce(ic);
839
840 return (0);
841
842 detach:
843 run_detach(self);
844 return (ENXIO);
845 }
846
847 static int
848 run_detach(device_t self)
849 {
850 struct run_softc *sc = device_get_softc(self);
851 struct ifnet *ifp = sc->sc_ifp;
852 struct ieee80211com *ic;
853 int i;
854
855 RUN_LOCK(sc);
856 sc->sc_detached = 1;
857 RUN_UNLOCK(sc);
858
859 /* stop all USB transfers */
860 usbd_transfer_unsetup(sc->sc_xfer, RUN_N_XFER);
861
862 RUN_LOCK(sc);
863 sc->ratectl_run = RUN_RATECTL_OFF;
864 sc->cmdq_run = sc->cmdq_key_set = RUN_CMDQ_ABORT;
865
866 /* free TX list, if any */
867 for (i = 0; i != RUN_EP_QUEUES; i++)
868 run_unsetup_tx_list(sc, &sc->sc_epq[i]);
869 RUN_UNLOCK(sc);
870
871 if (ifp) {
872 ic = ifp->if_l2com;
873 /* drain tasks */
874 usb_callout_drain(&sc->ratectl_ch);
875 ieee80211_draintask(ic, &sc->cmdq_task);
876 ieee80211_draintask(ic, &sc->ratectl_task);
877 ieee80211_ifdetach(ic);
878 if_free(ifp);
879 }
880
881 mtx_destroy(&sc->sc_mtx);
882
883 return (0);
884 }
885
886 static struct ieee80211vap *
887 run_vap_create(struct ieee80211com *ic, const char name[IFNAMSIZ], int unit,
888 enum ieee80211_opmode opmode, int flags,
889 const uint8_t bssid[IEEE80211_ADDR_LEN],
890 const uint8_t mac[IEEE80211_ADDR_LEN])
891 {
892 struct ifnet *ifp = ic->ic_ifp;
893 struct run_softc *sc = ifp->if_softc;
894 struct run_vap *rvp;
895 struct ieee80211vap *vap;
896 int i;
897
898 if (sc->rvp_cnt >= RUN_VAP_MAX) {
899 if_printf(ifp, "number of VAPs maxed out\n");
900 return (NULL);
901 }
902
903 switch (opmode) {
904 case IEEE80211_M_STA:
905 /* enable s/w bmiss handling for sta mode */
906 flags |= IEEE80211_CLONE_NOBEACONS;
907 /* fall though */
908 case IEEE80211_M_IBSS:
909 case IEEE80211_M_MONITOR:
910 case IEEE80211_M_HOSTAP:
911 case IEEE80211_M_MBSS:
912 /* other than WDS vaps, only one at a time */
913 if (!TAILQ_EMPTY(&ic->ic_vaps))
914 return (NULL);
915 break;
916 case IEEE80211_M_WDS:
917 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next){
918 if(vap->iv_opmode != IEEE80211_M_HOSTAP)
919 continue;
920 /* WDS vap's always share the local mac address. */
921 flags &= ~IEEE80211_CLONE_BSSID;
922 break;
923 }
924 if (vap == NULL) {
925 if_printf(ifp, "wds only supported in ap mode\n");
926 return (NULL);
927 }
928 break;
929 default:
930 if_printf(ifp, "unknown opmode %d\n", opmode);
931 return (NULL);
932 }
933
934 rvp = (struct run_vap *) malloc(sizeof(struct run_vap),
935 M_80211_VAP, M_NOWAIT | M_ZERO);
936 if (rvp == NULL)
937 return (NULL);
938 vap = &rvp->vap;
939
940 if (ieee80211_vap_setup(ic, vap, name, unit,
941 opmode, flags, bssid, mac) != 0) {
942 /* out of memory */
943 free(rvp, M_80211_VAP);
944 return (NULL);
945 }
946
947 vap->iv_key_update_begin = run_key_update_begin;
948 vap->iv_key_update_end = run_key_update_end;
949 vap->iv_update_beacon = run_update_beacon;
950 vap->iv_max_aid = RT2870_WCID_MAX;
951 /*
952 * To delete the right key from h/w, we need wcid.
953 * Luckily, there is unused space in ieee80211_key{}, wk_pad,
954 * and matching wcid will be written into there. So, cast
955 * some spells to remove 'const' from ieee80211_key{}
956 */
957 vap->iv_key_delete = (void *)run_key_delete;
958 vap->iv_key_set = (void *)run_key_set;
959
960 /* override state transition machine */
961 rvp->newstate = vap->iv_newstate;
962 vap->iv_newstate = run_newstate;
963
964 ieee80211_ratectl_init(vap);
965 ieee80211_ratectl_setinterval(vap, 1000 /* 1 sec */);
966
967 /* complete setup */
968 ieee80211_vap_attach(vap, run_media_change, ieee80211_media_status);
969
970 /* make sure id is always unique */
971 for (i = 0; i < RUN_VAP_MAX; i++) {
972 if((sc->rvp_bmap & 1 << i) == 0){
973 sc->rvp_bmap |= 1 << i;
974 rvp->rvp_id = i;
975 break;
976 }
977 }
978 if (sc->rvp_cnt++ == 0)
979 ic->ic_opmode = opmode;
980
981 if (opmode == IEEE80211_M_HOSTAP)
982 sc->cmdq_run = RUN_CMDQ_GO;
983
984 DPRINTF("rvp_id=%d bmap=%x rvp_cnt=%d\n",
985 rvp->rvp_id, sc->rvp_bmap, sc->rvp_cnt);
986
987 return (vap);
988 }
989
990 static void
991 run_vap_delete(struct ieee80211vap *vap)
992 {
993 struct run_vap *rvp = RUN_VAP(vap);
994 struct ifnet *ifp;
995 struct ieee80211com *ic;
996 struct run_softc *sc;
997 uint8_t rvp_id;
998
999 if (vap == NULL)
1000 return;
1001
1002 ic = vap->iv_ic;
1003 ifp = ic->ic_ifp;
1004
1005 sc = ifp->if_softc;
1006
1007 RUN_LOCK(sc);
1008
1009 m_freem(rvp->beacon_mbuf);
1010 rvp->beacon_mbuf = NULL;
1011
1012 rvp_id = rvp->rvp_id;
1013 sc->ratectl_run &= ~(1 << rvp_id);
1014 sc->rvp_bmap &= ~(1 << rvp_id);
1015 run_set_region_4(sc, RT2860_SKEY(rvp_id, 0), 0, 128);
1016 run_set_region_4(sc, RT2860_BCN_BASE(rvp_id), 0, 512);
1017 --sc->rvp_cnt;
1018
1019 DPRINTF("vap=%p rvp_id=%d bmap=%x rvp_cnt=%d\n",
1020 vap, rvp_id, sc->rvp_bmap, sc->rvp_cnt);
1021
1022 RUN_UNLOCK(sc);
1023
1024 ieee80211_ratectl_deinit(vap);
1025 ieee80211_vap_detach(vap);
1026 free(rvp, M_80211_VAP);
1027 }
1028
1029 /*
1030 * There are numbers of functions need to be called in context thread.
1031 * Rather than creating taskqueue event for each of those functions,
1032 * here is all-for-one taskqueue callback function. This function
1033 * gurantees deferred functions are executed in the same order they
1034 * were enqueued.
1035 * '& RUN_CMDQ_MASQ' is to loop cmdq[].
1036 */
1037 static void
1038 run_cmdq_cb(void *arg, int pending)
1039 {
1040 struct run_softc *sc = arg;
1041 uint8_t i;
1042
1043 /* call cmdq[].func locked */
1044 RUN_LOCK(sc);
1045 for (i = sc->cmdq_exec; sc->cmdq[i].func && pending;
1046 i = sc->cmdq_exec, pending--) {
1047 DPRINTFN(6, "cmdq_exec=%d pending=%d\n", i, pending);
1048 if (sc->cmdq_run == RUN_CMDQ_GO) {
1049 /*
1050 * If arg0 is NULL, callback func needs more
1051 * than one arg. So, pass ptr to cmdq struct.
1052 */
1053 if (sc->cmdq[i].arg0)
1054 sc->cmdq[i].func(sc->cmdq[i].arg0);
1055 else
1056 sc->cmdq[i].func(&sc->cmdq[i]);
1057 }
1058 sc->cmdq[i].arg0 = NULL;
1059 sc->cmdq[i].func = NULL;
1060 sc->cmdq_exec++;
1061 sc->cmdq_exec &= RUN_CMDQ_MASQ;
1062 }
1063 RUN_UNLOCK(sc);
1064 }
1065
1066 static void
1067 run_setup_tx_list(struct run_softc *sc, struct run_endpoint_queue *pq)
1068 {
1069 struct run_tx_data *data;
1070
1071 memset(pq, 0, sizeof(*pq));
1072
1073 STAILQ_INIT(&pq->tx_qh);
1074 STAILQ_INIT(&pq->tx_fh);
1075
1076 for (data = &pq->tx_data[0];
1077 data < &pq->tx_data[RUN_TX_RING_COUNT]; data++) {
1078 data->sc = sc;
1079 STAILQ_INSERT_TAIL(&pq->tx_fh, data, next);
1080 }
1081 pq->tx_nfree = RUN_TX_RING_COUNT;
1082 }
1083
1084 static void
1085 run_unsetup_tx_list(struct run_softc *sc, struct run_endpoint_queue *pq)
1086 {
1087 struct run_tx_data *data;
1088
1089 /* make sure any subsequent use of the queues will fail */
1090 pq->tx_nfree = 0;
1091 STAILQ_INIT(&pq->tx_fh);
1092 STAILQ_INIT(&pq->tx_qh);
1093
1094 /* free up all node references and mbufs */
1095 for (data = &pq->tx_data[0];
1096 data < &pq->tx_data[RUN_TX_RING_COUNT]; data++) {
1097 if (data->m != NULL) {
1098 m_freem(data->m);
1099 data->m = NULL;
1100 }
1101 if (data->ni != NULL) {
1102 ieee80211_free_node(data->ni);
1103 data->ni = NULL;
1104 }
1105 }
1106 }
1107
1108 static int
1109 run_load_microcode(struct run_softc *sc)
1110 {
1111 usb_device_request_t req;
1112 const struct firmware *fw;
1113 const u_char *base;
1114 uint32_t tmp;
1115 int ntries, error;
1116 const uint64_t *temp;
1117 uint64_t bytes;
1118
1119 RUN_UNLOCK(sc);
1120 fw = firmware_get("runfw");
1121 RUN_LOCK(sc);
1122 if (fw == NULL) {
1123 device_printf(sc->sc_dev,
1124 "failed loadfirmware of file %s\n", "runfw");
1125 return ENOENT;
1126 }
1127
1128 if (fw->datasize != 8192) {
1129 device_printf(sc->sc_dev,
1130 "invalid firmware size (should be 8KB)\n");
1131 error = EINVAL;
1132 goto fail;
1133 }
1134
1135 /*
1136 * RT3071/RT3072 use a different firmware
1137 * run-rt2870 (8KB) contains both,
1138 * first half (4KB) is for rt2870,
1139 * last half is for rt3071.
1140 */
1141 base = fw->data;
1142 if ((sc->mac_ver) != 0x2860 &&
1143 (sc->mac_ver) != 0x2872 &&
1144 (sc->mac_ver) != 0x3070) {
1145 base += 4096;
1146 }
1147
1148 /* cheap sanity check */
1149 temp = fw->data;
1150 bytes = *temp;
1151 if (bytes != be64toh(0xffffff0210280210ULL)) {
1152 device_printf(sc->sc_dev, "firmware checksum failed\n");
1153 error = EINVAL;
1154 goto fail;
1155 }
1156
1157 /* write microcode image */
1158 if (sc->sc_flags & RUN_FLAG_FWLOAD_NEEDED) {
1159 run_write_region_1(sc, RT2870_FW_BASE, base, 4096);
1160 run_write(sc, RT2860_H2M_MAILBOX_CID, 0xffffffff);
1161 run_write(sc, RT2860_H2M_MAILBOX_STATUS, 0xffffffff);
1162 }
1163
1164 req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1165 req.bRequest = RT2870_RESET;
1166 USETW(req.wValue, 8);
1167 USETW(req.wIndex, 0);
1168 USETW(req.wLength, 0);
1169 if ((error = usbd_do_request(sc->sc_udev, &sc->sc_mtx, &req, NULL))
1170 != 0) {
1171 device_printf(sc->sc_dev, "firmware reset failed\n");
1172 goto fail;
1173 }
1174
1175 run_delay(sc, 10);
1176
1177 run_write(sc, RT2860_H2M_BBPAGENT, 0);
1178 run_write(sc, RT2860_H2M_MAILBOX, 0);
1179 run_write(sc, RT2860_H2M_INTSRC, 0);
1180 if ((error = run_mcu_cmd(sc, RT2860_MCU_CMD_RFRESET, 0)) != 0)
1181 goto fail;
1182
1183 /* wait until microcontroller is ready */
1184 for (ntries = 0; ntries < 1000; ntries++) {
1185 if ((error = run_read(sc, RT2860_SYS_CTRL, &tmp)) != 0)
1186 goto fail;
1187 if (tmp & RT2860_MCU_READY)
1188 break;
1189 run_delay(sc, 10);
1190 }
1191 if (ntries == 1000) {
1192 device_printf(sc->sc_dev,
1193 "timeout waiting for MCU to initialize\n");
1194 error = ETIMEDOUT;
1195 goto fail;
1196 }
1197 device_printf(sc->sc_dev, "firmware %s ver. %u.%u loaded\n",
1198 (base == fw->data) ? "RT2870" : "RT3071",
1199 *(base + 4092), *(base + 4093));
1200
1201 fail:
1202 firmware_put(fw, FIRMWARE_UNLOAD);
1203 return (error);
1204 }
1205
1206 static int
1207 run_reset(struct run_softc *sc)
1208 {
1209 usb_device_request_t req;
1210
1211 req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1212 req.bRequest = RT2870_RESET;
1213 USETW(req.wValue, 1);
1214 USETW(req.wIndex, 0);
1215 USETW(req.wLength, 0);
1216 return (usbd_do_request(sc->sc_udev, &sc->sc_mtx, &req, NULL));
1217 }
1218
1219 static usb_error_t
1220 run_do_request(struct run_softc *sc,
1221 struct usb_device_request *req, void *data)
1222 {
1223 usb_error_t err;
1224 int ntries = 10;
1225
1226 RUN_LOCK_ASSERT(sc, MA_OWNED);
1227
1228 while (ntries--) {
1229 err = usbd_do_request_flags(sc->sc_udev, &sc->sc_mtx,
1230 req, data, 0, NULL, 250 /* ms */);
1231 if (err == 0)
1232 break;
1233 DPRINTFN(1, "Control request failed, %s (retrying)\n",
1234 usbd_errstr(err));
1235 run_delay(sc, 10);
1236 }
1237 return (err);
1238 }
1239
1240 static int
1241 run_read(struct run_softc *sc, uint16_t reg, uint32_t *val)
1242 {
1243 uint32_t tmp;
1244 int error;
1245
1246 error = run_read_region_1(sc, reg, (uint8_t *)&tmp, sizeof tmp);
1247 if (error == 0)
1248 *val = le32toh(tmp);
1249 else
1250 *val = 0xffffffff;
1251 return (error);
1252 }
1253
1254 static int
1255 run_read_region_1(struct run_softc *sc, uint16_t reg, uint8_t *buf, int len)
1256 {
1257 usb_device_request_t req;
1258
1259 req.bmRequestType = UT_READ_VENDOR_DEVICE;
1260 req.bRequest = RT2870_READ_REGION_1;
1261 USETW(req.wValue, 0);
1262 USETW(req.wIndex, reg);
1263 USETW(req.wLength, len);
1264
1265 return (run_do_request(sc, &req, buf));
1266 }
1267
1268 static int
1269 run_write_2(struct run_softc *sc, uint16_t reg, uint16_t val)
1270 {
1271 usb_device_request_t req;
1272
1273 req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1274 req.bRequest = RT2870_WRITE_2;
1275 USETW(req.wValue, val);
1276 USETW(req.wIndex, reg);
1277 USETW(req.wLength, 0);
1278
1279 return (run_do_request(sc, &req, NULL));
1280 }
1281
1282 static int
1283 run_write(struct run_softc *sc, uint16_t reg, uint32_t val)
1284 {
1285 int error;
1286
1287 if ((error = run_write_2(sc, reg, val & 0xffff)) == 0)
1288 error = run_write_2(sc, reg + 2, val >> 16);
1289 return (error);
1290 }
1291
1292 static int
1293 run_write_region_1(struct run_softc *sc, uint16_t reg, const uint8_t *buf,
1294 int len)
1295 {
1296 #if 1
1297 int i, error = 0;
1298 /*
1299 * NB: the WRITE_REGION_1 command is not stable on RT2860.
1300 * We thus issue multiple WRITE_2 commands instead.
1301 */
1302 KASSERT((len & 1) == 0, ("run_write_region_1: Data too long.\n"));
1303 for (i = 0; i < len && error == 0; i += 2)
1304 error = run_write_2(sc, reg + i, buf[i] | buf[i + 1] << 8);
1305 return (error);
1306 #else
1307 usb_device_request_t req;
1308 int error = 0;
1309
1310 /*
1311 * NOTE: It appears the WRITE_REGION_1 command cannot be
1312 * passed a huge amount of data, which will crash the
1313 * firmware. Limit amount of data passed to 64-bytes at a
1314 * time.
1315 */
1316 while (len > 0) {
1317 int delta = 64;
1318 if (delta > len)
1319 delta = len;
1320
1321 req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1322 req.bRequest = RT2870_WRITE_REGION_1;
1323 USETW(req.wValue, 0);
1324 USETW(req.wIndex, reg);
1325 USETW(req.wLength, delta);
1326 error = run_do_request(sc, &req, __DECONST(uint8_t *, buf));
1327 if (error != 0)
1328 break;
1329 reg += delta;
1330 buf += delta;
1331 len -= delta;
1332 }
1333 return (error);
1334 #endif
1335 }
1336
1337 static int
1338 run_set_region_4(struct run_softc *sc, uint16_t reg, uint32_t val, int len)
1339 {
1340 int i, error = 0;
1341
1342 KASSERT((len & 3) == 0, ("run_set_region_4: Invalid data length.\n"));
1343 for (i = 0; i < len && error == 0; i += 4)
1344 error = run_write(sc, reg + i, val);
1345 return (error);
1346 }
1347
1348 static int
1349 run_efuse_read(struct run_softc *sc, uint16_t addr, uint16_t *val, int count)
1350 {
1351 uint32_t tmp;
1352 uint16_t reg;
1353 int error, ntries;
1354
1355 if ((error = run_read(sc, RT3070_EFUSE_CTRL, &tmp)) != 0)
1356 return (error);
1357
1358 if (count == 2)
1359 addr *= 2;
1360 /*-
1361 * Read one 16-byte block into registers EFUSE_DATA[0-3]:
1362 * DATA0: F E D C
1363 * DATA1: B A 9 8
1364 * DATA2: 7 6 5 4
1365 * DATA3: 3 2 1 0
1366 */
1367 tmp &= ~(RT3070_EFSROM_MODE_MASK | RT3070_EFSROM_AIN_MASK);
1368 tmp |= (addr & ~0xf) << RT3070_EFSROM_AIN_SHIFT | RT3070_EFSROM_KICK;
1369 run_write(sc, RT3070_EFUSE_CTRL, tmp);
1370 for (ntries = 0; ntries < 100; ntries++) {
1371 if ((error = run_read(sc, RT3070_EFUSE_CTRL, &tmp)) != 0)
1372 return (error);
1373 if (!(tmp & RT3070_EFSROM_KICK))
1374 break;
1375 run_delay(sc, 2);
1376 }
1377 if (ntries == 100)
1378 return (ETIMEDOUT);
1379
1380 if ((tmp & RT3070_EFUSE_AOUT_MASK) == RT3070_EFUSE_AOUT_MASK) {
1381 *val = 0xffff; /* address not found */
1382 return (0);
1383 }
1384 /* determine to which 32-bit register our 16-bit word belongs */
1385 reg = RT3070_EFUSE_DATA3 - (addr & 0xc);
1386 if ((error = run_read(sc, reg, &tmp)) != 0)
1387 return (error);
1388
1389 tmp >>= (8 * (addr & 0x3));
1390 *val = (addr & 1) ? tmp >> 16 : tmp & 0xffff;
1391
1392 return (0);
1393 }
1394
1395 /* Read 16-bit from eFUSE ROM for RT3xxx. */
1396 static int
1397 run_efuse_read_2(struct run_softc *sc, uint16_t addr, uint16_t *val)
1398 {
1399 return (run_efuse_read(sc, addr, val, 2));
1400 }
1401
1402 static int
1403 run_eeprom_read_2(struct run_softc *sc, uint16_t addr, uint16_t *val)
1404 {
1405 usb_device_request_t req;
1406 uint16_t tmp;
1407 int error;
1408
1409 addr *= 2;
1410 req.bmRequestType = UT_READ_VENDOR_DEVICE;
1411 req.bRequest = RT2870_EEPROM_READ;
1412 USETW(req.wValue, 0);
1413 USETW(req.wIndex, addr);
1414 USETW(req.wLength, sizeof(tmp));
1415
1416 error = usbd_do_request(sc->sc_udev, &sc->sc_mtx, &req, &tmp);
1417 if (error == 0)
1418 *val = le16toh(tmp);
1419 else
1420 *val = 0xffff;
1421 return (error);
1422 }
1423
1424 static __inline int
1425 run_srom_read(struct run_softc *sc, uint16_t addr, uint16_t *val)
1426 {
1427 /* either eFUSE ROM or EEPROM */
1428 return sc->sc_srom_read(sc, addr, val);
1429 }
1430
1431 static int
1432 run_rt2870_rf_write(struct run_softc *sc, uint32_t val)
1433 {
1434 uint32_t tmp;
1435 int error, ntries;
1436
1437 for (ntries = 0; ntries < 10; ntries++) {
1438 if ((error = run_read(sc, RT2860_RF_CSR_CFG0, &tmp)) != 0)
1439 return (error);
1440 if (!(tmp & RT2860_RF_REG_CTRL))
1441 break;
1442 }
1443 if (ntries == 10)
1444 return (ETIMEDOUT);
1445
1446 return (run_write(sc, RT2860_RF_CSR_CFG0, val));
1447 }
1448
1449 static int
1450 run_rt3070_rf_read(struct run_softc *sc, uint8_t reg, uint8_t *val)
1451 {
1452 uint32_t tmp;
1453 int error, ntries;
1454
1455 for (ntries = 0; ntries < 100; ntries++) {
1456 if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0)
1457 return (error);
1458 if (!(tmp & RT3070_RF_KICK))
1459 break;
1460 }
1461 if (ntries == 100)
1462 return (ETIMEDOUT);
1463
1464 tmp = RT3070_RF_KICK | reg << 8;
1465 if ((error = run_write(sc, RT3070_RF_CSR_CFG, tmp)) != 0)
1466 return (error);
1467
1468 for (ntries = 0; ntries < 100; ntries++) {
1469 if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0)
1470 return (error);
1471 if (!(tmp & RT3070_RF_KICK))
1472 break;
1473 }
1474 if (ntries == 100)
1475 return (ETIMEDOUT);
1476
1477 *val = tmp & 0xff;
1478 return (0);
1479 }
1480
1481 static int
1482 run_rt3070_rf_write(struct run_softc *sc, uint8_t reg, uint8_t val)
1483 {
1484 uint32_t tmp;
1485 int error, ntries;
1486
1487 for (ntries = 0; ntries < 10; ntries++) {
1488 if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0)
1489 return (error);
1490 if (!(tmp & RT3070_RF_KICK))
1491 break;
1492 }
1493 if (ntries == 10)
1494 return (ETIMEDOUT);
1495
1496 tmp = RT3070_RF_WRITE | RT3070_RF_KICK | reg << 8 | val;
1497 return (run_write(sc, RT3070_RF_CSR_CFG, tmp));
1498 }
1499
1500 static int
1501 run_bbp_read(struct run_softc *sc, uint8_t reg, uint8_t *val)
1502 {
1503 uint32_t tmp;
1504 int ntries, error;
1505
1506 for (ntries = 0; ntries < 10; ntries++) {
1507 if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0)
1508 return (error);
1509 if (!(tmp & RT2860_BBP_CSR_KICK))
1510 break;
1511 }
1512 if (ntries == 10)
1513 return (ETIMEDOUT);
1514
1515 tmp = RT2860_BBP_CSR_READ | RT2860_BBP_CSR_KICK | reg << 8;
1516 if ((error = run_write(sc, RT2860_BBP_CSR_CFG, tmp)) != 0)
1517 return (error);
1518
1519 for (ntries = 0; ntries < 10; ntries++) {
1520 if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0)
1521 return (error);
1522 if (!(tmp & RT2860_BBP_CSR_KICK))
1523 break;
1524 }
1525 if (ntries == 10)
1526 return (ETIMEDOUT);
1527
1528 *val = tmp & 0xff;
1529 return (0);
1530 }
1531
1532 static int
1533 run_bbp_write(struct run_softc *sc, uint8_t reg, uint8_t val)
1534 {
1535 uint32_t tmp;
1536 int ntries, error;
1537
1538 for (ntries = 0; ntries < 10; ntries++) {
1539 if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0)
1540 return (error);
1541 if (!(tmp & RT2860_BBP_CSR_KICK))
1542 break;
1543 }
1544 if (ntries == 10)
1545 return (ETIMEDOUT);
1546
1547 tmp = RT2860_BBP_CSR_KICK | reg << 8 | val;
1548 return (run_write(sc, RT2860_BBP_CSR_CFG, tmp));
1549 }
1550
1551 /*
1552 * Send a command to the 8051 microcontroller unit.
1553 */
1554 static int
1555 run_mcu_cmd(struct run_softc *sc, uint8_t cmd, uint16_t arg)
1556 {
1557 uint32_t tmp;
1558 int error, ntries;
1559
1560 for (ntries = 0; ntries < 100; ntries++) {
1561 if ((error = run_read(sc, RT2860_H2M_MAILBOX, &tmp)) != 0)
1562 return error;
1563 if (!(tmp & RT2860_H2M_BUSY))
1564 break;
1565 }
1566 if (ntries == 100)
1567 return ETIMEDOUT;
1568
1569 tmp = RT2860_H2M_BUSY | RT2860_TOKEN_NO_INTR << 16 | arg;
1570 if ((error = run_write(sc, RT2860_H2M_MAILBOX, tmp)) == 0)
1571 error = run_write(sc, RT2860_HOST_CMD, cmd);
1572 return (error);
1573 }
1574
1575 /*
1576 * Add `delta' (signed) to each 4-bit sub-word of a 32-bit word.
1577 * Used to adjust per-rate Tx power registers.
1578 */
1579 static __inline uint32_t
1580 b4inc(uint32_t b32, int8_t delta)
1581 {
1582 int8_t i, b4;
1583
1584 for (i = 0; i < 8; i++) {
1585 b4 = b32 & 0xf;
1586 b4 += delta;
1587 if (b4 < 0)
1588 b4 = 0;
1589 else if (b4 > 0xf)
1590 b4 = 0xf;
1591 b32 = b32 >> 4 | b4 << 28;
1592 }
1593 return (b32);
1594 }
1595
1596 static const char *
1597 run_get_rf(uint16_t rev)
1598 {
1599 switch (rev) {
1600 case RT2860_RF_2820: return "RT2820";
1601 case RT2860_RF_2850: return "RT2850";
1602 case RT2860_RF_2720: return "RT2720";
1603 case RT2860_RF_2750: return "RT2750";
1604 case RT3070_RF_3020: return "RT3020";
1605 case RT3070_RF_2020: return "RT2020";
1606 case RT3070_RF_3021: return "RT3021";
1607 case RT3070_RF_3022: return "RT3022";
1608 case RT3070_RF_3052: return "RT3052";
1609 case RT3593_RF_3053: return "RT3053";
1610 case RT5592_RF_5592: return "RT5592";
1611 case RT5390_RF_5370: return "RT5370";
1612 case RT5390_RF_5372: return "RT5372";
1613 }
1614 return ("unknown");
1615 }
1616
1617 static void
1618 run_rt3593_get_txpower(struct run_softc *sc)
1619 {
1620 uint16_t addr, val;
1621 int i;
1622
1623 /* Read power settings for 2GHz channels. */
1624 for (i = 0; i < 14; i += 2) {
1625 addr = (sc->ntxchains == 3) ? RT3593_EEPROM_PWR2GHZ_BASE1 :
1626 RT2860_EEPROM_PWR2GHZ_BASE1;
1627 run_srom_read(sc, addr + i / 2, &val);
1628 sc->txpow1[i + 0] = (int8_t)(val & 0xff);
1629 sc->txpow1[i + 1] = (int8_t)(val >> 8);
1630
1631 addr = (sc->ntxchains == 3) ? RT3593_EEPROM_PWR2GHZ_BASE2 :
1632 RT2860_EEPROM_PWR2GHZ_BASE2;
1633 run_srom_read(sc, addr + i / 2, &val);
1634 sc->txpow2[i + 0] = (int8_t)(val & 0xff);
1635 sc->txpow2[i + 1] = (int8_t)(val >> 8);
1636
1637 if (sc->ntxchains == 3) {
1638 run_srom_read(sc, RT3593_EEPROM_PWR2GHZ_BASE3 + i / 2,
1639 &val);
1640 sc->txpow3[i + 0] = (int8_t)(val & 0xff);
1641 sc->txpow3[i + 1] = (int8_t)(val >> 8);
1642 }
1643 }
1644 /* Fix broken Tx power entries. */
1645 for (i = 0; i < 14; i++) {
1646 if (sc->txpow1[i] > 31)
1647 sc->txpow1[i] = 5;
1648 if (sc->txpow2[i] > 31)
1649 sc->txpow2[i] = 5;
1650 if (sc->ntxchains == 3) {
1651 if (sc->txpow3[i] > 31)
1652 sc->txpow3[i] = 5;
1653 }
1654 }
1655 /* Read power settings for 5GHz channels. */
1656 for (i = 0; i < 40; i += 2) {
1657 run_srom_read(sc, RT3593_EEPROM_PWR5GHZ_BASE1 + i / 2, &val);
1658 sc->txpow1[i + 14] = (int8_t)(val & 0xff);
1659 sc->txpow1[i + 15] = (int8_t)(val >> 8);
1660
1661 run_srom_read(sc, RT3593_EEPROM_PWR5GHZ_BASE2 + i / 2, &val);
1662 sc->txpow2[i + 14] = (int8_t)(val & 0xff);
1663 sc->txpow2[i + 15] = (int8_t)(val >> 8);
1664
1665 if (sc->ntxchains == 3) {
1666 run_srom_read(sc, RT3593_EEPROM_PWR5GHZ_BASE3 + i / 2,
1667 &val);
1668 sc->txpow3[i + 14] = (int8_t)(val & 0xff);
1669 sc->txpow3[i + 15] = (int8_t)(val >> 8);
1670 }
1671 }
1672 }
1673
1674 static void
1675 run_get_txpower(struct run_softc *sc)
1676 {
1677 uint16_t val;
1678 int i;
1679
1680 /* Read power settings for 2GHz channels. */
1681 for (i = 0; i < 14; i += 2) {
1682 run_srom_read(sc, RT2860_EEPROM_PWR2GHZ_BASE1 + i / 2, &val);
1683 sc->txpow1[i + 0] = (int8_t)(val & 0xff);
1684 sc->txpow1[i + 1] = (int8_t)(val >> 8);
1685
1686 if (sc->mac_ver != 0x5390) {
1687 run_srom_read(sc,
1688 RT2860_EEPROM_PWR2GHZ_BASE2 + i / 2, &val);
1689 sc->txpow2[i + 0] = (int8_t)(val & 0xff);
1690 sc->txpow2[i + 1] = (int8_t)(val >> 8);
1691 }
1692 }
1693 /* Fix broken Tx power entries. */
1694 for (i = 0; i < 14; i++) {
1695 if (sc->mac_ver >= 0x5390) {
1696 if (sc->txpow1[i] < 0 || sc->txpow1[i] > 27)
1697 sc->txpow1[i] = 5;
1698 } else {
1699 if (sc->txpow1[i] < 0 || sc->txpow1[i] > 31)
1700 sc->txpow1[i] = 5;
1701 }
1702 if (sc->mac_ver > 0x5390) {
1703 if (sc->txpow2[i] < 0 || sc->txpow2[i] > 27)
1704 sc->txpow2[i] = 5;
1705 } else if (sc->mac_ver < 0x5390) {
1706 if (sc->txpow2[i] < 0 || sc->txpow2[i] > 31)
1707 sc->txpow2[i] = 5;
1708 }
1709 DPRINTF("chan %d: power1=%d, power2=%d\n",
1710 rt2860_rf2850[i].chan, sc->txpow1[i], sc->txpow2[i]);
1711 }
1712 /* Read power settings for 5GHz channels. */
1713 for (i = 0; i < 40; i += 2) {
1714 run_srom_read(sc, RT2860_EEPROM_PWR5GHZ_BASE1 + i / 2, &val);
1715 sc->txpow1[i + 14] = (int8_t)(val & 0xff);
1716 sc->txpow1[i + 15] = (int8_t)(val >> 8);
1717
1718 run_srom_read(sc, RT2860_EEPROM_PWR5GHZ_BASE2 + i / 2, &val);
1719 sc->txpow2[i + 14] = (int8_t)(val & 0xff);
1720 sc->txpow2[i + 15] = (int8_t)(val >> 8);
1721 }
1722 /* Fix broken Tx power entries. */
1723 for (i = 0; i < 40; i++ ) {
1724 if (sc->mac_ver != 0x5592) {
1725 if (sc->txpow1[14 + i] < -7 || sc->txpow1[14 + i] > 15)
1726 sc->txpow1[14 + i] = 5;
1727 if (sc->txpow2[14 + i] < -7 || sc->txpow2[14 + i] > 15)
1728 sc->txpow2[14 + i] = 5;
1729 }
1730 DPRINTF("chan %d: power1=%d, power2=%d\n",
1731 rt2860_rf2850[14 + i].chan, sc->txpow1[14 + i],
1732 sc->txpow2[14 + i]);
1733 }
1734 }
1735
1736 static int
1737 run_read_eeprom(struct run_softc *sc)
1738 {
1739 int8_t delta_2ghz, delta_5ghz;
1740 uint32_t tmp;
1741 uint16_t val;
1742 int ridx, ant, i;
1743
1744 /* check whether the ROM is eFUSE ROM or EEPROM */
1745 sc->sc_srom_read = run_eeprom_read_2;
1746 if (sc->mac_ver >= 0x3070) {
1747 run_read(sc, RT3070_EFUSE_CTRL, &tmp);
1748 DPRINTF("EFUSE_CTRL=0x%08x\n", tmp);
1749 if ((tmp & RT3070_SEL_EFUSE) || sc->mac_ver == 0x3593)
1750 sc->sc_srom_read = run_efuse_read_2;
1751 }
1752
1753 /* read ROM version */
1754 run_srom_read(sc, RT2860_EEPROM_VERSION, &val);
1755 DPRINTF("EEPROM rev=%d, FAE=%d\n", val & 0xff, val >> 8);
1756
1757 /* read MAC address */
1758 run_srom_read(sc, RT2860_EEPROM_MAC01, &val);
1759 sc->sc_bssid[0] = val & 0xff;
1760 sc->sc_bssid[1] = val >> 8;
1761 run_srom_read(sc, RT2860_EEPROM_MAC23, &val);
1762 sc->sc_bssid[2] = val & 0xff;
1763 sc->sc_bssid[3] = val >> 8;
1764 run_srom_read(sc, RT2860_EEPROM_MAC45, &val);
1765 sc->sc_bssid[4] = val & 0xff;
1766 sc->sc_bssid[5] = val >> 8;
1767
1768 if (sc->mac_ver < 0x3593) {
1769 /* read vender BBP settings */
1770 for (i = 0; i < 10; i++) {
1771 run_srom_read(sc, RT2860_EEPROM_BBP_BASE + i, &val);
1772 sc->bbp[i].val = val & 0xff;
1773 sc->bbp[i].reg = val >> 8;
1774 DPRINTF("BBP%d=0x%02x\n", sc->bbp[i].reg,
1775 sc->bbp[i].val);
1776 }
1777 if (sc->mac_ver >= 0x3071) {
1778 /* read vendor RF settings */
1779 for (i = 0; i < 10; i++) {
1780 run_srom_read(sc, RT3071_EEPROM_RF_BASE + i,
1781 &val);
1782 sc->rf[i].val = val & 0xff;
1783 sc->rf[i].reg = val >> 8;
1784 DPRINTF("RF%d=0x%02x\n", sc->rf[i].reg,
1785 sc->rf[i].val);
1786 }
1787 }
1788 }
1789
1790 /* read RF frequency offset from EEPROM */
1791 run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_FREQ_LEDS :
1792 RT3593_EEPROM_FREQ, &val);
1793 sc->freq = ((val & 0xff) != 0xff) ? val & 0xff : 0;
1794 DPRINTF("EEPROM freq offset %d\n", sc->freq & 0xff);
1795
1796 run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_FREQ_LEDS :
1797 RT3593_EEPROM_FREQ_LEDS, &val);
1798 if (val >> 8 != 0xff) {
1799 /* read LEDs operating mode */
1800 sc->leds = val >> 8;
1801 run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_LED1 :
1802 RT3593_EEPROM_LED1, &sc->led[0]);
1803 run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_LED2 :
1804 RT3593_EEPROM_LED2, &sc->led[1]);
1805 run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_LED3 :
1806 RT3593_EEPROM_LED3, &sc->led[2]);
1807 } else {
1808 /* broken EEPROM, use default settings */
1809 sc->leds = 0x01;
1810 sc->led[0] = 0x5555;
1811 sc->led[1] = 0x2221;
1812 sc->led[2] = 0x5627; /* differs from RT2860 */
1813 }
1814 DPRINTF("EEPROM LED mode=0x%02x, LEDs=0x%04x/0x%04x/0x%04x\n",
1815 sc->leds, sc->led[0], sc->led[1], sc->led[2]);
1816
1817 /* read RF information */
1818 if (sc->mac_ver == 0x5390 || sc->mac_ver ==0x5392)
1819 run_srom_read(sc, 0x00, &val);
1820 else
1821 run_srom_read(sc, RT2860_EEPROM_ANTENNA, &val);
1822
1823 if (val == 0xffff) {
1824 device_printf(sc->sc_dev,
1825 "invalid EEPROM antenna info, using default\n");
1826 DPRINTF("invalid EEPROM antenna info, using default\n");
1827 if (sc->mac_ver == 0x3572) {
1828 /* default to RF3052 2T2R */
1829 sc->rf_rev = RT3070_RF_3052;
1830 sc->ntxchains = 2;
1831 sc->nrxchains = 2;
1832 } else if (sc->mac_ver >= 0x3070) {
1833 /* default to RF3020 1T1R */
1834 sc->rf_rev = RT3070_RF_3020;
1835 sc->ntxchains = 1;
1836 sc->nrxchains = 1;
1837 } else {
1838 /* default to RF2820 1T2R */
1839 sc->rf_rev = RT2860_RF_2820;
1840 sc->ntxchains = 1;
1841 sc->nrxchains = 2;
1842 }
1843 } else {
1844 if (sc->mac_ver == 0x5390 || sc->mac_ver ==0x5392) {
1845 sc->rf_rev = val;
1846 run_srom_read(sc, RT2860_EEPROM_ANTENNA, &val);
1847 } else
1848 sc->rf_rev = (val >> 8) & 0xf;
1849 sc->ntxchains = (val >> 4) & 0xf;
1850 sc->nrxchains = val & 0xf;
1851 }
1852 DPRINTF("EEPROM RF rev=0x%04x chains=%dT%dR\n",
1853 sc->rf_rev, sc->ntxchains, sc->nrxchains);
1854
1855 /* check if RF supports automatic Tx access gain control */
1856 run_srom_read(sc, RT2860_EEPROM_CONFIG, &val);
1857 DPRINTF("EEPROM CFG 0x%04x\n", val);
1858 /* check if driver should patch the DAC issue */
1859 if ((val >> 8) != 0xff)
1860 sc->patch_dac = (val >> 15) & 1;
1861 if ((val & 0xff) != 0xff) {
1862 sc->ext_5ghz_lna = (val >> 3) & 1;
1863 sc->ext_2ghz_lna = (val >> 2) & 1;
1864 /* check if RF supports automatic Tx access gain control */
1865 sc->calib_2ghz = sc->calib_5ghz = (val >> 1) & 1;
1866 /* check if we have a hardware radio switch */
1867 sc->rfswitch = val & 1;
1868 }
1869
1870 /* Read Tx power settings. */
1871 if (sc->mac_ver == 0x3593)
1872 run_rt3593_get_txpower(sc);
1873 else
1874 run_get_txpower(sc);
1875
1876 /* read Tx power compensation for each Tx rate */
1877 run_srom_read(sc, RT2860_EEPROM_DELTAPWR, &val);
1878 delta_2ghz = delta_5ghz = 0;
1879 if ((val & 0xff) != 0xff && (val & 0x80)) {
1880 delta_2ghz = val & 0xf;
1881 if (!(val & 0x40)) /* negative number */
1882 delta_2ghz = -delta_2ghz;
1883 }
1884 val >>= 8;
1885 if ((val & 0xff) != 0xff && (val & 0x80)) {
1886 delta_5ghz = val & 0xf;
1887 if (!(val & 0x40)) /* negative number */
1888 delta_5ghz = -delta_5ghz;
1889 }
1890 DPRINTF("power compensation=%d (2GHz), %d (5GHz)\n",
1891 delta_2ghz, delta_5ghz);
1892
1893 for (ridx = 0; ridx < 5; ridx++) {
1894 uint32_t reg;
1895
1896 run_srom_read(sc, RT2860_EEPROM_RPWR + ridx * 2, &val);
1897 reg = val;
1898 run_srom_read(sc, RT2860_EEPROM_RPWR + ridx * 2 + 1, &val);
1899 reg |= (uint32_t)val << 16;
1900
1901 sc->txpow20mhz[ridx] = reg;
1902 sc->txpow40mhz_2ghz[ridx] = b4inc(reg, delta_2ghz);
1903 sc->txpow40mhz_5ghz[ridx] = b4inc(reg, delta_5ghz);
1904
1905 DPRINTF("ridx %d: power 20MHz=0x%08x, 40MHz/2GHz=0x%08x, "
1906 "40MHz/5GHz=0x%08x\n", ridx, sc->txpow20mhz[ridx],
1907 sc->txpow40mhz_2ghz[ridx], sc->txpow40mhz_5ghz[ridx]);
1908 }
1909
1910 /* Read RSSI offsets and LNA gains from EEPROM. */
1911 run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_RSSI1_2GHZ :
1912 RT3593_EEPROM_RSSI1_2GHZ, &val);
1913 sc->rssi_2ghz[0] = val & 0xff; /* Ant A */
1914 sc->rssi_2ghz[1] = val >> 8; /* Ant B */
1915 run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_RSSI2_2GHZ :
1916 RT3593_EEPROM_RSSI2_2GHZ, &val);
1917 if (sc->mac_ver >= 0x3070) {
1918 if (sc->mac_ver == 0x3593) {
1919 sc->txmixgain_2ghz = 0;
1920 sc->rssi_2ghz[2] = val & 0xff; /* Ant C */
1921 } else {
1922 /*
1923 * On RT3070 chips (limited to 2 Rx chains), this ROM
1924 * field contains the Tx mixer gain for the 2GHz band.
1925 */
1926 if ((val & 0xff) != 0xff)
1927 sc->txmixgain_2ghz = val & 0x7;
1928 }
1929 DPRINTF("tx mixer gain=%u (2GHz)\n", sc->txmixgain_2ghz);
1930 } else
1931 sc->rssi_2ghz[2] = val & 0xff; /* Ant C */
1932 if (sc->mac_ver == 0x3593)
1933 run_srom_read(sc, RT3593_EEPROM_LNA_5GHZ, &val);
1934 sc->lna[2] = val >> 8; /* channel group 2 */
1935
1936 run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_RSSI1_5GHZ :
1937 RT3593_EEPROM_RSSI1_5GHZ, &val);
1938 sc->rssi_5ghz[0] = val & 0xff; /* Ant A */
1939 sc->rssi_5ghz[1] = val >> 8; /* Ant B */
1940 run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_RSSI2_5GHZ :
1941 RT3593_EEPROM_RSSI2_5GHZ, &val);
1942 if (sc->mac_ver == 0x3572) {
1943 /*
1944 * On RT3572 chips (limited to 2 Rx chains), this ROM
1945 * field contains the Tx mixer gain for the 5GHz band.
1946 */
1947 if ((val & 0xff) != 0xff)
1948 sc->txmixgain_5ghz = val & 0x7;
1949 DPRINTF("tx mixer gain=%u (5GHz)\n", sc->txmixgain_5ghz);
1950 } else
1951 sc->rssi_5ghz[2] = val & 0xff; /* Ant C */
1952 if (sc->mac_ver == 0x3593) {
1953 sc->txmixgain_5ghz = 0;
1954 run_srom_read(sc, RT3593_EEPROM_LNA_5GHZ, &val);
1955 }
1956 sc->lna[3] = val >> 8; /* channel group 3 */
1957
1958 run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_LNA :
1959 RT3593_EEPROM_LNA, &val);
1960 sc->lna[0] = val & 0xff; /* channel group 0 */
1961 sc->lna[1] = val >> 8; /* channel group 1 */
1962
1963 /* fix broken 5GHz LNA entries */
1964 if (sc->lna[2] == 0 || sc->lna[2] == 0xff) {
1965 DPRINTF("invalid LNA for channel group %d\n", 2);
1966 sc->lna[2] = sc->lna[1];
1967 }
1968 if (sc->lna[3] == 0 || sc->lna[3] == 0xff) {
1969 DPRINTF("invalid LNA for channel group %d\n", 3);
1970 sc->lna[3] = sc->lna[1];
1971 }
1972
1973 /* fix broken RSSI offset entries */
1974 for (ant = 0; ant < 3; ant++) {
1975 if (sc->rssi_2ghz[ant] < -10 || sc->rssi_2ghz[ant] > 10) {
1976 DPRINTF("invalid RSSI%d offset: %d (2GHz)\n",
1977 ant + 1, sc->rssi_2ghz[ant]);
1978 sc->rssi_2ghz[ant] = 0;
1979 }
1980 if (sc->rssi_5ghz[ant] < -10 || sc->rssi_5ghz[ant] > 10) {
1981 DPRINTF("invalid RSSI%d offset: %d (5GHz)\n",
1982 ant + 1, sc->rssi_5ghz[ant]);
1983 sc->rssi_5ghz[ant] = 0;
1984 }
1985 }
1986 return (0);
1987 }
1988
1989 static struct ieee80211_node *
1990 run_node_alloc(struct ieee80211vap *vap, const uint8_t mac[IEEE80211_ADDR_LEN])
1991 {
1992 return malloc(sizeof (struct run_node), M_DEVBUF, M_NOWAIT | M_ZERO);
1993 }
1994
1995 static int
1996 run_media_change(struct ifnet *ifp)
1997 {
1998 struct ieee80211vap *vap = ifp->if_softc;
1999 struct ieee80211com *ic = vap->iv_ic;
2000 const struct ieee80211_txparam *tp;
2001 struct run_softc *sc = ic->ic_ifp->if_softc;
2002 uint8_t rate, ridx;
2003 int error;
2004
2005 RUN_LOCK(sc);
2006
2007 error = ieee80211_media_change(ifp);
2008 if (error != ENETRESET) {
2009 RUN_UNLOCK(sc);
2010 return (error);
2011 }
2012
2013 tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)];
2014 if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) {
2015 struct ieee80211_node *ni;
2016 struct run_node *rn;
2017
2018 rate = ic->ic_sup_rates[ic->ic_curmode].
2019 rs_rates[tp->ucastrate] & IEEE80211_RATE_VAL;
2020 for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++)
2021 if (rt2860_rates[ridx].rate == rate)
2022 break;
2023 ni = ieee80211_ref_node(vap->iv_bss);
2024 rn = (struct run_node *)ni;
2025 rn->fix_ridx = ridx;
2026 DPRINTF("rate=%d, fix_ridx=%d\n", rate, rn->fix_ridx);
2027 ieee80211_free_node(ni);
2028 }
2029
2030 #if 0
2031 if ((ifp->if_flags & IFF_UP) &&
2032 (ifp->if_drv_flags & IFF_DRV_RUNNING)){
2033 run_init_locked(sc);
2034 }
2035 #endif
2036
2037 RUN_UNLOCK(sc);
2038
2039 return (0);
2040 }
2041
2042 static int
2043 run_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
2044 {
2045 const struct ieee80211_txparam *tp;
2046 struct ieee80211com *ic = vap->iv_ic;
2047 struct run_softc *sc = ic->ic_ifp->if_softc;
2048 struct run_vap *rvp = RUN_VAP(vap);
2049 enum ieee80211_state ostate;
2050 uint32_t sta[3];
2051 uint32_t tmp;
2052 uint8_t ratectl;
2053 uint8_t restart_ratectl = 0;
2054 uint8_t bid = 1 << rvp->rvp_id;
2055
2056 ostate = vap->iv_state;
2057 DPRINTF("%s -> %s\n",
2058 ieee80211_state_name[ostate],
2059 ieee80211_state_name[nstate]);
2060
2061 IEEE80211_UNLOCK(ic);
2062 RUN_LOCK(sc);
2063
2064 ratectl = sc->ratectl_run; /* remember current state */
2065 sc->ratectl_run = RUN_RATECTL_OFF;
2066 usb_callout_stop(&sc->ratectl_ch);
2067
2068 if (ostate == IEEE80211_S_RUN) {
2069 /* turn link LED off */
2070 run_set_leds(sc, RT2860_LED_RADIO);
2071 }
2072
2073 switch (nstate) {
2074 case IEEE80211_S_INIT:
2075 restart_ratectl = 1;
2076
2077 if (ostate != IEEE80211_S_RUN)
2078 break;
2079
2080 ratectl &= ~bid;
2081 sc->runbmap &= ~bid;
2082
2083 /* abort TSF synchronization if there is no vap running */
2084 if (--sc->running == 0) {
2085 run_read(sc, RT2860_BCN_TIME_CFG, &tmp);
2086 run_write(sc, RT2860_BCN_TIME_CFG,
2087 tmp & ~(RT2860_BCN_TX_EN | RT2860_TSF_TIMER_EN |
2088 RT2860_TBTT_TIMER_EN));
2089 }
2090 break;
2091
2092 case IEEE80211_S_RUN:
2093 if (!(sc->runbmap & bid)) {
2094 if(sc->running++)
2095 restart_ratectl = 1;
2096 sc->runbmap |= bid;
2097 }
2098
2099 m_freem(rvp->beacon_mbuf);
2100 rvp->beacon_mbuf = NULL;
2101
2102 switch (vap->iv_opmode) {
2103 case IEEE80211_M_HOSTAP:
2104 case IEEE80211_M_MBSS:
2105 sc->ap_running |= bid;
2106 ic->ic_opmode = vap->iv_opmode;
2107 run_update_beacon_cb(vap);
2108 break;
2109 case IEEE80211_M_IBSS:
2110 sc->adhoc_running |= bid;
2111 if (!sc->ap_running)
2112 ic->ic_opmode = vap->iv_opmode;
2113 run_update_beacon_cb(vap);
2114 break;
2115 case IEEE80211_M_STA:
2116 sc->sta_running |= bid;
2117 if (!sc->ap_running && !sc->adhoc_running)
2118 ic->ic_opmode = vap->iv_opmode;
2119
2120 /* read statistic counters (clear on read) */
2121 run_read_region_1(sc, RT2860_TX_STA_CNT0,
2122 (uint8_t *)sta, sizeof sta);
2123
2124 break;
2125 default:
2126 ic->ic_opmode = vap->iv_opmode;
2127 break;
2128 }
2129
2130 if (vap->iv_opmode != IEEE80211_M_MONITOR) {
2131 struct ieee80211_node *ni;
2132
2133 if (ic->ic_bsschan == IEEE80211_CHAN_ANYC) {
2134 RUN_UNLOCK(sc);
2135 IEEE80211_LOCK(ic);
2136 return (-1);
2137 }
2138 run_updateslot(ic->ic_ifp);
2139 run_enable_mrr(sc);
2140 run_set_txpreamble(sc);
2141 run_set_basicrates(sc);
2142 ni = ieee80211_ref_node(vap->iv_bss);
2143 IEEE80211_ADDR_COPY(sc->sc_bssid, ni->ni_bssid);
2144 run_set_bssid(sc, ni->ni_bssid);
2145 ieee80211_free_node(ni);
2146 run_enable_tsf_sync(sc);
2147
2148 /* enable automatic rate adaptation */
2149 tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)];
2150 if (tp->ucastrate == IEEE80211_FIXED_RATE_NONE)
2151 ratectl |= bid;
2152 }
2153
2154 /* turn link LED on */
2155 run_set_leds(sc, RT2860_LED_RADIO |
2156 (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan) ?
2157 RT2860_LED_LINK_2GHZ : RT2860_LED_LINK_5GHZ));
2158
2159 break;
2160 default:
2161 DPRINTFN(6, "undefined case\n");
2162 break;
2163 }
2164
2165 /* restart amrr for running VAPs */
2166 if ((sc->ratectl_run = ratectl) && restart_ratectl)
2167 usb_callout_reset(&sc->ratectl_ch, hz, run_ratectl_to, sc);
2168
2169 RUN_UNLOCK(sc);
2170 IEEE80211_LOCK(ic);
2171
2172 return(rvp->newstate(vap, nstate, arg));
2173 }
2174
2175 /* ARGSUSED */
2176 static void
2177 run_wme_update_cb(void *arg)
2178 {
2179 struct ieee80211com *ic = arg;
2180 struct run_softc *sc = ic->ic_ifp->if_softc;
2181 struct ieee80211_wme_state *wmesp = &ic->ic_wme;
2182 int aci, error = 0;
2183
2184 RUN_LOCK_ASSERT(sc, MA_OWNED);
2185
2186 /* update MAC TX configuration registers */
2187 for (aci = 0; aci < WME_NUM_AC; aci++) {
2188 error = run_write(sc, RT2860_EDCA_AC_CFG(aci),
2189 wmesp->wme_params[aci].wmep_logcwmax << 16 |
2190 wmesp->wme_params[aci].wmep_logcwmin << 12 |
2191 wmesp->wme_params[aci].wmep_aifsn << 8 |
2192 wmesp->wme_params[aci].wmep_txopLimit);
2193 if (error) goto err;
2194 }
2195
2196 /* update SCH/DMA registers too */
2197 error = run_write(sc, RT2860_WMM_AIFSN_CFG,
2198 wmesp->wme_params[WME_AC_VO].wmep_aifsn << 12 |
2199 wmesp->wme_params[WME_AC_VI].wmep_aifsn << 8 |
2200 wmesp->wme_params[WME_AC_BK].wmep_aifsn << 4 |
2201 wmesp->wme_params[WME_AC_BE].wmep_aifsn);
2202 if (error) goto err;
2203 error = run_write(sc, RT2860_WMM_CWMIN_CFG,
2204 wmesp->wme_params[WME_AC_VO].wmep_logcwmin << 12 |
2205 wmesp->wme_params[WME_AC_VI].wmep_logcwmin << 8 |
2206 wmesp->wme_params[WME_AC_BK].wmep_logcwmin << 4 |
2207 wmesp->wme_params[WME_AC_BE].wmep_logcwmin);
2208 if (error) goto err;
2209 error = run_write(sc, RT2860_WMM_CWMAX_CFG,
2210 wmesp->wme_params[WME_AC_VO].wmep_logcwmax << 12 |
2211 wmesp->wme_params[WME_AC_VI].wmep_logcwmax << 8 |
2212 wmesp->wme_params[WME_AC_BK].wmep_logcwmax << 4 |
2213 wmesp->wme_params[WME_AC_BE].wmep_logcwmax);
2214 if (error) goto err;
2215 error = run_write(sc, RT2860_WMM_TXOP0_CFG,
2216 wmesp->wme_params[WME_AC_BK].wmep_txopLimit << 16 |
2217 wmesp->wme_params[WME_AC_BE].wmep_txopLimit);
2218 if (error) goto err;
2219 error = run_write(sc, RT2860_WMM_TXOP1_CFG,
2220 wmesp->wme_params[WME_AC_VO].wmep_txopLimit << 16 |
2221 wmesp->wme_params[WME_AC_VI].wmep_txopLimit);
2222
2223 err:
2224 if (error)
2225 DPRINTF("WME update failed\n");
2226
2227 return;
2228 }
2229
2230 static int
2231 run_wme_update(struct ieee80211com *ic)
2232 {
2233 struct run_softc *sc = ic->ic_ifp->if_softc;
2234
2235 /* sometime called wothout lock */
2236 if (mtx_owned(&ic->ic_comlock.mtx)) {
2237 uint32_t i = RUN_CMDQ_GET(&sc->cmdq_store);
2238 DPRINTF("cmdq_store=%d\n", i);
2239 sc->cmdq[i].func = run_wme_update_cb;
2240 sc->cmdq[i].arg0 = ic;
2241 ieee80211_runtask(ic, &sc->cmdq_task);
2242 return (0);
2243 }
2244
2245 RUN_LOCK(sc);
2246 run_wme_update_cb(ic);
2247 RUN_UNLOCK(sc);
2248
2249 /* return whatever, upper layer desn't care anyway */
2250 return (0);
2251 }
2252
2253 static void
2254 run_key_update_begin(struct ieee80211vap *vap)
2255 {
2256 /*
2257 * To avoid out-of-order events, both run_key_set() and
2258 * _delete() are deferred and handled by run_cmdq_cb().
2259 * So, there is nothing we need to do here.
2260 */
2261 }
2262
2263 static void
2264 run_key_update_end(struct ieee80211vap *vap)
2265 {
2266 /* null */
2267 }
2268
2269 static void
2270 run_key_set_cb(void *arg)
2271 {
2272 struct run_cmdq *cmdq = arg;
2273 struct ieee80211vap *vap = cmdq->arg1;
2274 struct ieee80211_key *k = cmdq->k;
2275 struct ieee80211com *ic = vap->iv_ic;
2276 struct run_softc *sc = ic->ic_ifp->if_softc;
2277 struct ieee80211_node *ni;
2278 uint32_t attr;
2279 uint16_t base, associd;
2280 uint8_t mode, wcid, iv[8];
2281
2282 RUN_LOCK_ASSERT(sc, MA_OWNED);
2283
2284 if (vap->iv_opmode == IEEE80211_M_HOSTAP)
2285 ni = ieee80211_find_vap_node(&ic->ic_sta, vap, cmdq->mac);
2286 else
2287 ni = vap->iv_bss;
2288 associd = (ni != NULL) ? ni->ni_associd : 0;
2289
2290 /* map net80211 cipher to RT2860 security mode */
2291 switch (k->wk_cipher->ic_cipher) {
2292 case IEEE80211_CIPHER_WEP:
2293 if(k->wk_keylen < 8)
2294 mode = RT2860_MODE_WEP40;
2295 else
2296 mode = RT2860_MODE_WEP104;
2297 break;
2298 case IEEE80211_CIPHER_TKIP:
2299 mode = RT2860_MODE_TKIP;
2300 break;
2301 case IEEE80211_CIPHER_AES_CCM:
2302 mode = RT2860_MODE_AES_CCMP;
2303 break;
2304 default:
2305 DPRINTF("undefined case\n");
2306 return;
2307 }
2308
2309 DPRINTFN(1, "associd=%x, keyix=%d, mode=%x, type=%s, tx=%s, rx=%s\n",
2310 associd, k->wk_keyix, mode,
2311 (k->wk_flags & IEEE80211_KEY_GROUP) ? "group" : "pairwise",
2312 (k->wk_flags & IEEE80211_KEY_XMIT) ? "on" : "off",
2313 (k->wk_flags & IEEE80211_KEY_RECV) ? "on" : "off");
2314
2315 if (k->wk_flags & IEEE80211_KEY_GROUP) {
2316 wcid = 0; /* NB: update WCID0 for group keys */
2317 base = RT2860_SKEY(RUN_VAP(vap)->rvp_id, k->wk_keyix);
2318 } else {
2319 wcid = (vap->iv_opmode == IEEE80211_M_STA) ?
2320 1 : RUN_AID2WCID(associd);
2321 base = RT2860_PKEY(wcid);
2322 }
2323
2324 if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_TKIP) {
2325 if(run_write_region_1(sc, base, k->wk_key, 16))
2326 return;
2327 if(run_write_region_1(sc, base + 16, &k->wk_key[16], 8)) /* wk_txmic */
2328 return;
2329 if(run_write_region_1(sc, base + 24, &k->wk_key[24], 8)) /* wk_rxmic */
2330 return;
2331 } else {
2332 /* roundup len to 16-bit: XXX fix write_region_1() instead */
2333 if(run_write_region_1(sc, base, k->wk_key, (k->wk_keylen + 1) & ~1))
2334 return;
2335 }
2336
2337 if (!(k->wk_flags & IEEE80211_KEY_GROUP) ||
2338 (k->wk_flags & (IEEE80211_KEY_XMIT | IEEE80211_KEY_RECV))) {
2339 /* set initial packet number in IV+EIV */
2340 if (k->wk_cipher == IEEE80211_CIPHER_WEP) {
2341 memset(iv, 0, sizeof iv);
2342 iv[3] = vap->iv_def_txkey << 6;
2343 } else {
2344 if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_TKIP) {
2345 iv[0] = k->wk_keytsc >> 8;
2346 iv[1] = (iv[0] | 0x20) & 0x7f;
2347 iv[2] = k->wk_keytsc;
2348 } else /* CCMP */ {
2349 iv[0] = k->wk_keytsc;
2350 iv[1] = k->wk_keytsc >> 8;
2351 iv[2] = 0;
2352 }
2353 iv[3] = k->wk_keyix << 6 | IEEE80211_WEP_EXTIV;
2354 iv[4] = k->wk_keytsc >> 16;
2355 iv[5] = k->wk_keytsc >> 24;
2356 iv[6] = k->wk_keytsc >> 32;
2357 iv[7] = k->wk_keytsc >> 40;
2358 }
2359 if (run_write_region_1(sc, RT2860_IVEIV(wcid), iv, 8))
2360 return;
2361 }
2362
2363 if (k->wk_flags & IEEE80211_KEY_GROUP) {
2364 /* install group key */
2365 if (run_read(sc, RT2860_SKEY_MODE_0_7, &attr))
2366 return;
2367 attr &= ~(0xf << (k->wk_keyix * 4));
2368 attr |= mode << (k->wk_keyix * 4);
2369 if (run_write(sc, RT2860_SKEY_MODE_0_7, attr))
2370 return;
2371 } else {
2372 /* install pairwise key */
2373 if (run_read(sc, RT2860_WCID_ATTR(wcid), &attr))
2374 return;
2375 attr = (attr & ~0xf) | (mode << 1) | RT2860_RX_PKEY_EN;
2376 if (run_write(sc, RT2860_WCID_ATTR(wcid), attr))
2377 return;
2378 }
2379
2380 /* TODO create a pass-thru key entry? */
2381
2382 /* need wcid to delete the right key later */
2383 k->wk_pad = wcid;
2384 }
2385
2386 /*
2387 * Don't have to be deferred, but in order to keep order of
2388 * execution, i.e. with run_key_delete(), defer this and let
2389 * run_cmdq_cb() maintain the order.
2390 *
2391 * return 0 on error
2392 */
2393 static int
2394 run_key_set(struct ieee80211vap *vap, struct ieee80211_key *k,
2395 const uint8_t mac[IEEE80211_ADDR_LEN])
2396 {
2397 struct ieee80211com *ic = vap->iv_ic;
2398 struct run_softc *sc = ic->ic_ifp->if_softc;
2399 uint32_t i;
2400
2401 i = RUN_CMDQ_GET(&sc->cmdq_store);
2402 DPRINTF("cmdq_store=%d\n", i);
2403 sc->cmdq[i].func = run_key_set_cb;
2404 sc->cmdq[i].arg0 = NULL;
2405 sc->cmdq[i].arg1 = vap;
2406 sc->cmdq[i].k = k;
2407 IEEE80211_ADDR_COPY(sc->cmdq[i].mac, mac);
2408 ieee80211_runtask(ic, &sc->cmdq_task);
2409
2410 /*
2411 * To make sure key will be set when hostapd
2412 * calls iv_key_set() before if_init().
2413 */
2414 if (vap->iv_opmode == IEEE80211_M_HOSTAP) {
2415 RUN_LOCK(sc);
2416 sc->cmdq_key_set = RUN_CMDQ_GO;
2417 RUN_UNLOCK(sc);
2418 }
2419
2420 return (1);
2421 }
2422
2423 /*
2424 * If wlan is destroyed without being brought down i.e. without
2425 * wlan down or wpa_cli terminate, this function is called after
2426 * vap is gone. Don't refer it.
2427 */
2428 static void
2429 run_key_delete_cb(void *arg)
2430 {
2431 struct run_cmdq *cmdq = arg;
2432 struct run_softc *sc = cmdq->arg1;
2433 struct ieee80211_key *k = &cmdq->key;
2434 uint32_t attr;
2435 uint8_t wcid;
2436
2437 RUN_LOCK_ASSERT(sc, MA_OWNED);
2438
2439 if (k->wk_flags & IEEE80211_KEY_GROUP) {
2440 /* remove group key */
2441 DPRINTF("removing group key\n");
2442 run_read(sc, RT2860_SKEY_MODE_0_7, &attr);
2443 attr &= ~(0xf << (k->wk_keyix * 4));
2444 run_write(sc, RT2860_SKEY_MODE_0_7, attr);
2445 } else {
2446 /* remove pairwise key */
2447 DPRINTF("removing key for wcid %x\n", k->wk_pad);
2448 /* matching wcid was written to wk_pad in run_key_set() */
2449 wcid = k->wk_pad;
2450 run_read(sc, RT2860_WCID_ATTR(wcid), &attr);
2451 attr &= ~0xf;
2452 run_write(sc, RT2860_WCID_ATTR(wcid), attr);
2453 run_set_region_4(sc, RT2860_WCID_ENTRY(wcid), 0, 8);
2454 }
2455
2456 k->wk_pad = 0;
2457 }
2458
2459 /*
2460 * return 0 on error
2461 */
2462 static int
2463 run_key_delete(struct ieee80211vap *vap, struct ieee80211_key *k)
2464 {
2465 struct ieee80211com *ic = vap->iv_ic;
2466 struct run_softc *sc = ic->ic_ifp->if_softc;
2467 struct ieee80211_key *k0;
2468 uint32_t i;
2469
2470 /*
2471 * When called back, key might be gone. So, make a copy
2472 * of some values need to delete keys before deferring.
2473 * But, because of LOR with node lock, cannot use lock here.
2474 * So, use atomic instead.
2475 */
2476 i = RUN_CMDQ_GET(&sc->cmdq_store);
2477 DPRINTF("cmdq_store=%d\n", i);
2478 sc->cmdq[i].func = run_key_delete_cb;
2479 sc->cmdq[i].arg0 = NULL;
2480 sc->cmdq[i].arg1 = sc;
2481 k0 = &sc->cmdq[i].key;
2482 k0->wk_flags = k->wk_flags;
2483 k0->wk_keyix = k->wk_keyix;
2484 /* matching wcid was written to wk_pad in run_key_set() */
2485 k0->wk_pad = k->wk_pad;
2486 ieee80211_runtask(ic, &sc->cmdq_task);
2487 return (1); /* return fake success */
2488
2489 }
2490
2491 static void
2492 run_ratectl_to(void *arg)
2493 {
2494 struct run_softc *sc = arg;
2495
2496 /* do it in a process context, so it can go sleep */
2497 ieee80211_runtask(sc->sc_ifp->if_l2com, &sc->ratectl_task);
2498 /* next timeout will be rescheduled in the callback task */
2499 }
2500
2501 /* ARGSUSED */
2502 static void
2503 run_ratectl_cb(void *arg, int pending)
2504 {
2505 struct run_softc *sc = arg;
2506 struct ieee80211com *ic = sc->sc_ifp->if_l2com;
2507 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
2508
2509 if (vap == NULL)
2510 return;
2511
2512 if (sc->rvp_cnt > 1 || vap->iv_opmode != IEEE80211_M_STA) {
2513 /*
2514 * run_reset_livelock() doesn't do anything with AMRR,
2515 * but Ralink wants us to call it every 1 sec. So, we
2516 * piggyback here rather than creating another callout.
2517 * Livelock may occur only in HOSTAP or IBSS mode
2518 * (when h/w is sending beacons).
2519 */
2520 RUN_LOCK(sc);
2521 run_reset_livelock(sc);
2522 /* just in case, there are some stats to drain */
2523 run_drain_fifo(sc);
2524 RUN_UNLOCK(sc);
2525 }
2526
2527 ieee80211_iterate_nodes(&ic->ic_sta, run_iter_func, sc);
2528
2529 RUN_LOCK(sc);
2530 if(sc->ratectl_run != RUN_RATECTL_OFF)
2531 usb_callout_reset(&sc->ratectl_ch, hz, run_ratectl_to, sc);
2532 RUN_UNLOCK(sc);
2533 }
2534
2535 static void
2536 run_drain_fifo(void *arg)
2537 {
2538 struct run_softc *sc = arg;
2539 struct ifnet *ifp = sc->sc_ifp;
2540 uint32_t stat;
2541 uint16_t (*wstat)[3];
2542 uint8_t wcid, mcs, pid;
2543 int8_t retry;
2544
2545 RUN_LOCK_ASSERT(sc, MA_OWNED);
2546
2547 for (;;) {
2548 /* drain Tx status FIFO (maxsize = 16) */
2549 run_read(sc, RT2860_TX_STAT_FIFO, &stat);
2550 DPRINTFN(4, "tx stat 0x%08x\n", stat);
2551 if (!(stat & RT2860_TXQ_VLD))
2552 break;
2553
2554 wcid = (stat >> RT2860_TXQ_WCID_SHIFT) & 0xff;
2555
2556 /* if no ACK was requested, no feedback is available */
2557 if (!(stat & RT2860_TXQ_ACKREQ) || wcid > RT2870_WCID_MAX ||
2558 wcid == 0)
2559 continue;
2560
2561 /*
2562 * Even though each stat is Tx-complete-status like format,
2563 * the device can poll stats. Because there is no guarantee
2564 * that the referring node is still around when read the stats.
2565 * So that, if we use ieee80211_ratectl_tx_update(), we will
2566 * have hard time not to refer already freed node.
2567 *
2568 * To eliminate such page faults, we poll stats in softc.
2569 * Then, update the rates later with ieee80211_ratectl_tx_update().
2570 */
2571 wstat = &(sc->wcid_stats[wcid]);
2572 (*wstat)[RUN_TXCNT]++;
2573 if (stat & RT2860_TXQ_OK)
2574 (*wstat)[RUN_SUCCESS]++;
2575 else
2576 ifp->if_oerrors++;
2577 /*
2578 * Check if there were retries, ie if the Tx success rate is
2579 * different from the requested rate. Note that it works only
2580 * because we do not allow rate fallback from OFDM to CCK.
2581 */
2582 mcs = (stat >> RT2860_TXQ_MCS_SHIFT) & 0x7f;
2583 pid = (stat >> RT2860_TXQ_PID_SHIFT) & 0xf;
2584 if ((retry = pid -1 - mcs) > 0) {
2585 (*wstat)[RUN_TXCNT] += retry;
2586 (*wstat)[RUN_RETRY] += retry;
2587 }
2588 }
2589 DPRINTFN(3, "count=%d\n", sc->fifo_cnt);
2590
2591 sc->fifo_cnt = 0;
2592 }
2593
2594 static void
2595 run_iter_func(void *arg, struct ieee80211_node *ni)
2596 {
2597 struct run_softc *sc = arg;
2598 struct ieee80211vap *vap = ni->ni_vap;
2599 struct ieee80211com *ic = ni->ni_ic;
2600 struct ifnet *ifp = ic->ic_ifp;
2601 struct run_node *rn = (void *)ni;
2602 union run_stats sta[2];
2603 uint16_t (*wstat)[3];
2604 int txcnt, success, retrycnt, error;
2605
2606 RUN_LOCK(sc);
2607
2608 /* Check for special case */
2609 if (sc->rvp_cnt <= 1 && vap->iv_opmode == IEEE80211_M_STA &&
2610 ni != vap->iv_bss)
2611 goto fail;
2612
2613 if (sc->rvp_cnt <= 1 && (vap->iv_opmode == IEEE80211_M_IBSS ||
2614 vap->iv_opmode == IEEE80211_M_STA)) {
2615 /* read statistic counters (clear on read) and update AMRR state */
2616 error = run_read_region_1(sc, RT2860_TX_STA_CNT0, (uint8_t *)sta,
2617 sizeof sta);
2618 if (error != 0)
2619 goto fail;
2620
2621 /* count failed TX as errors */
2622 ifp->if_oerrors += le16toh(sta[0].error.fail);
2623
2624 retrycnt = le16toh(sta[1].tx.retry);
2625 success = le16toh(sta[1].tx.success);
2626 txcnt = retrycnt + success + le16toh(sta[0].error.fail);
2627
2628 DPRINTFN(3, "retrycnt=%d success=%d failcnt=%d\n",
2629 retrycnt, success, le16toh(sta[0].error.fail));
2630 } else {
2631 wstat = &(sc->wcid_stats[RUN_AID2WCID(ni->ni_associd)]);
2632
2633 if (wstat == &(sc->wcid_stats[0]) ||
2634 wstat > &(sc->wcid_stats[RT2870_WCID_MAX]))
2635 goto fail;
2636
2637 txcnt = (*wstat)[RUN_TXCNT];
2638 success = (*wstat)[RUN_SUCCESS];
2639 retrycnt = (*wstat)[RUN_RETRY];
2640 DPRINTFN(3, "retrycnt=%d txcnt=%d success=%d\n",
2641 retrycnt, txcnt, success);
2642
2643 memset(wstat, 0, sizeof(*wstat));
2644 }
2645
2646 ieee80211_ratectl_tx_update(vap, ni, &txcnt, &success, &retrycnt);
2647 rn->amrr_ridx = ieee80211_ratectl_rate(ni, NULL, 0);
2648
2649 fail:
2650 RUN_UNLOCK(sc);
2651
2652 DPRINTFN(3, "ridx=%d\n", rn->amrr_ridx);
2653 }
2654
2655 static void
2656 run_newassoc_cb(void *arg)
2657 {
2658 struct run_cmdq *cmdq = arg;
2659 struct ieee80211_node *ni = cmdq->arg1;
2660 struct run_softc *sc = ni->ni_vap->iv_ic->ic_ifp->if_softc;
2661 uint8_t wcid = cmdq->wcid;
2662
2663 RUN_LOCK_ASSERT(sc, MA_OWNED);
2664
2665 run_write_region_1(sc, RT2860_WCID_ENTRY(wcid),
2666 ni->ni_macaddr, IEEE80211_ADDR_LEN);
2667
2668 memset(&(sc->wcid_stats[wcid]), 0, sizeof(sc->wcid_stats[wcid]));
2669 }
2670
2671 static void
2672 run_newassoc(struct ieee80211_node *ni, int isnew)
2673 {
2674 struct run_node *rn = (void *)ni;
2675 struct ieee80211_rateset *rs = &ni->ni_rates;
2676 struct ieee80211vap *vap = ni->ni_vap;
2677 struct ieee80211com *ic = vap->iv_ic;
2678 struct run_softc *sc = ic->ic_ifp->if_softc;
2679 uint8_t rate;
2680 uint8_t ridx;
2681 uint8_t wcid;
2682 int i, j;
2683
2684 wcid = (vap->iv_opmode == IEEE80211_M_STA) ?
2685 1 : RUN_AID2WCID(ni->ni_associd);
2686
2687 if (wcid > RT2870_WCID_MAX) {
2688 device_printf(sc->sc_dev, "wcid=%d out of range\n", wcid);
2689 return;
2690 }
2691
2692 /* only interested in true associations */
2693 if (isnew && ni->ni_associd != 0) {
2694
2695 /*
2696 * This function could is called though timeout function.
2697 * Need to defer.
2698 */
2699 uint32_t cnt = RUN_CMDQ_GET(&sc->cmdq_store);
2700 DPRINTF("cmdq_store=%d\n", cnt);
2701 sc->cmdq[cnt].func = run_newassoc_cb;
2702 sc->cmdq[cnt].arg0 = NULL;
2703 sc->cmdq[cnt].arg1 = ni;
2704 sc->cmdq[cnt].wcid = wcid;
2705 ieee80211_runtask(ic, &sc->cmdq_task);
2706 }
2707
2708 DPRINTF("new assoc isnew=%d associd=%x addr=%s\n",
2709 isnew, ni->ni_associd, ether_sprintf(ni->ni_macaddr));
2710
2711 for (i = 0; i < rs->rs_nrates; i++) {
2712 rate = rs->rs_rates[i] & IEEE80211_RATE_VAL;
2713 /* convert 802.11 rate to hardware rate index */
2714 for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++)
2715 if (rt2860_rates[ridx].rate == rate)
2716 break;
2717 rn->ridx[i] = ridx;
2718 /* determine rate of control response frames */
2719 for (j = i; j >= 0; j--) {
2720 if ((rs->rs_rates[j] & IEEE80211_RATE_BASIC) &&
2721 rt2860_rates[rn->ridx[i]].phy ==
2722 rt2860_rates[rn->ridx[j]].phy)
2723 break;
2724 }
2725 if (j >= 0) {
2726 rn->ctl_ridx[i] = rn->ridx[j];
2727 } else {
2728 /* no basic rate found, use mandatory one */
2729 rn->ctl_ridx[i] = rt2860_rates[ridx].ctl_ridx;
2730 }
2731 DPRINTF("rate=0x%02x ridx=%d ctl_ridx=%d\n",
2732 rs->rs_rates[i], rn->ridx[i], rn->ctl_ridx[i]);
2733 }
2734 rate = vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)].mgmtrate;
2735 for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++)
2736 if (rt2860_rates[ridx].rate == rate)
2737 break;
2738 rn->mgt_ridx = ridx;
2739 DPRINTF("rate=%d, mgmt_ridx=%d\n", rate, rn->mgt_ridx);
2740
2741 RUN_LOCK(sc);
2742 if(sc->ratectl_run != RUN_RATECTL_OFF)
2743 usb_callout_reset(&sc->ratectl_ch, hz, run_ratectl_to, sc);
2744 RUN_UNLOCK(sc);
2745 }
2746
2747 /*
2748 * Return the Rx chain with the highest RSSI for a given frame.
2749 */
2750 static __inline uint8_t
2751 run_maxrssi_chain(struct run_softc *sc, const struct rt2860_rxwi *rxwi)
2752 {
2753 uint8_t rxchain = 0;
2754
2755 if (sc->nrxchains > 1) {
2756 if (rxwi->rssi[1] > rxwi->rssi[rxchain])
2757 rxchain = 1;
2758 if (sc->nrxchains > 2)
2759 if (rxwi->rssi[2] > rxwi->rssi[rxchain])
2760 rxchain = 2;
2761 }
2762 return (rxchain);
2763 }
2764
2765 static void
2766 run_rx_frame(struct run_softc *sc, struct mbuf *m, uint32_t dmalen)
2767 {
2768 struct ifnet *ifp = sc->sc_ifp;
2769 struct ieee80211com *ic = ifp->if_l2com;
2770 struct ieee80211_frame *wh;
2771 struct ieee80211_node *ni;
2772 struct rt2870_rxd *rxd;
2773 struct rt2860_rxwi *rxwi;
2774 uint32_t flags;
2775 uint16_t len, rxwisize;
2776 uint8_t ant, rssi;
2777 int8_t nf;
2778
2779 rxwi = mtod(m, struct rt2860_rxwi *);
2780 len = le16toh(rxwi->len) & 0xfff;
2781 rxwisize = sizeof(struct rt2860_rxwi);
2782 if (sc->mac_ver == 0x5592)
2783 rxwisize += sizeof(uint64_t);
2784 else if (sc->mac_ver == 0x3593)
2785 rxwisize += sizeof(uint32_t);
2786 if (__predict_false(len > dmalen)) {
2787 m_freem(m);
2788 ifp->if_ierrors++;
2789 DPRINTF("bad RXWI length %u > %u\n", len, dmalen);
2790 return;
2791 }
2792 /* Rx descriptor is located at the end */
2793 rxd = (struct rt2870_rxd *)(mtod(m, caddr_t) + dmalen);
2794 flags = le32toh(rxd->flags);
2795
2796 if (__predict_false(flags & (RT2860_RX_CRCERR | RT2860_RX_ICVERR))) {
2797 m_freem(m);
2798 ifp->if_ierrors++;
2799 DPRINTF("%s error.\n", (flags & RT2860_RX_CRCERR)?"CRC":"ICV");
2800 return;
2801 }
2802
2803 m->m_data += rxwisize;
2804 m->m_pkthdr.len = m->m_len -= rxwisize;
2805
2806 wh = mtod(m, struct ieee80211_frame *);
2807
2808 if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
2809 wh->i_fc[1] &= ~IEEE80211_FC1_PROTECTED;
2810 m->m_flags |= M_WEP;
2811 }
2812
2813 if (flags & RT2860_RX_L2PAD) {
2814 DPRINTFN(8, "received RT2860_RX_L2PAD frame\n");
2815 len += 2;
2816 }
2817
2818 ni = ieee80211_find_rxnode(ic,
2819 mtod(m, struct ieee80211_frame_min *));
2820
2821 if (__predict_false(flags & RT2860_RX_MICERR)) {
2822 /* report MIC failures to net80211 for TKIP */
2823 if (ni != NULL)
2824 ieee80211_notify_michael_failure(ni->ni_vap, wh,
2825 rxwi->keyidx);
2826 m_freem(m);
2827 ifp->if_ierrors++;
2828 DPRINTF("MIC error. Someone is lying.\n");
2829 return;
2830 }
2831
2832 ant = run_maxrssi_chain(sc, rxwi);
2833 rssi = rxwi->rssi[ant];
2834 nf = run_rssi2dbm(sc, rssi, ant);
2835
2836 m->m_pkthdr.rcvif = ifp;
2837 m->m_pkthdr.len = m->m_len = len;
2838
2839 if (ni != NULL) {
2840 (void)ieee80211_input(ni, m, rssi, nf);
2841 ieee80211_free_node(ni);
2842 } else {
2843 (void)ieee80211_input_all(ic, m, rssi, nf);
2844 }
2845
2846 if (__predict_false(ieee80211_radiotap_active(ic))) {
2847 struct run_rx_radiotap_header *tap = &sc->sc_rxtap;
2848 uint16_t phy;
2849
2850 tap->wr_flags = 0;
2851 tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq);
2852 tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags);
2853 tap->wr_antsignal = rssi;
2854 tap->wr_antenna = ant;
2855 tap->wr_dbm_antsignal = run_rssi2dbm(sc, rssi, ant);
2856 tap->wr_rate = 2; /* in case it can't be found below */
2857 phy = le16toh(rxwi->phy);
2858 switch (phy & RT2860_PHY_MODE) {
2859 case RT2860_PHY_CCK:
2860 switch ((phy & RT2860_PHY_MCS) & ~RT2860_PHY_SHPRE) {
2861 case 0: tap->wr_rate = 2; break;
2862 case 1: tap->wr_rate = 4; break;
2863 case 2: tap->wr_rate = 11; break;
2864 case 3: tap->wr_rate = 22; break;
2865 }
2866 if (phy & RT2860_PHY_SHPRE)
2867 tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
2868 break;
2869 case RT2860_PHY_OFDM:
2870 switch (phy & RT2860_PHY_MCS) {
2871 case 0: tap->wr_rate = 12; break;
2872 case 1: tap->wr_rate = 18; break;
2873 case 2: tap->wr_rate = 24; break;
2874 case 3: tap->wr_rate = 36; break;
2875 case 4: tap->wr_rate = 48; break;
2876 case 5: tap->wr_rate = 72; break;
2877 case 6: tap->wr_rate = 96; break;
2878 case 7: tap->wr_rate = 108; break;
2879 }
2880 break;
2881 }
2882 }
2883 }
2884
2885 static void
2886 run_bulk_rx_callback(struct usb_xfer *xfer, usb_error_t error)
2887 {
2888 struct run_softc *sc = usbd_xfer_softc(xfer);
2889 struct ifnet *ifp = sc->sc_ifp;
2890 struct mbuf *m = NULL;
2891 struct mbuf *m0;
2892 uint32_t dmalen;
2893 uint16_t rxwisize;
2894 int xferlen;
2895
2896 rxwisize = sizeof(struct rt2860_rxwi);
2897 if (sc->mac_ver == 0x5592)
2898 rxwisize += sizeof(uint64_t);
2899 else if (sc->mac_ver == 0x3593)
2900 rxwisize += sizeof(uint32_t);
2901
2902 usbd_xfer_status(xfer, &xferlen, NULL, NULL, NULL);
2903
2904 switch (USB_GET_STATE(xfer)) {
2905 case USB_ST_TRANSFERRED:
2906
2907 DPRINTFN(15, "rx done, actlen=%d\n", xferlen);
2908
2909 if (xferlen < (int)(sizeof(uint32_t) + rxwisize +
2910 sizeof(struct rt2870_rxd))) {
2911 DPRINTF("xfer too short %d\n", xferlen);
2912 goto tr_setup;
2913 }
2914
2915 m = sc->rx_m;
2916 sc->rx_m = NULL;
2917
2918 /* FALLTHROUGH */
2919 case USB_ST_SETUP:
2920 tr_setup:
2921 if (sc->rx_m == NULL) {
2922 sc->rx_m = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR,
2923 MJUMPAGESIZE /* xfer can be bigger than MCLBYTES */);
2924 }
2925 if (sc->rx_m == NULL) {
2926 DPRINTF("could not allocate mbuf - idle with stall\n");
2927 ifp->if_ierrors++;
2928 usbd_xfer_set_stall(xfer);
2929 usbd_xfer_set_frames(xfer, 0);
2930 } else {
2931 /*
2932 * Directly loading a mbuf cluster into DMA to
2933 * save some data copying. This works because
2934 * there is only one cluster.
2935 */
2936 usbd_xfer_set_frame_data(xfer, 0,
2937 mtod(sc->rx_m, caddr_t), RUN_MAX_RXSZ);
2938 usbd_xfer_set_frames(xfer, 1);
2939 }
2940 usbd_transfer_submit(xfer);
2941 break;
2942
2943 default: /* Error */
2944 if (error != USB_ERR_CANCELLED) {
2945 /* try to clear stall first */
2946 usbd_xfer_set_stall(xfer);
2947
2948 if (error == USB_ERR_TIMEOUT)
2949 device_printf(sc->sc_dev, "device timeout\n");
2950
2951 ifp->if_ierrors++;
2952
2953 goto tr_setup;
2954 }
2955 if (sc->rx_m != NULL) {
2956 m_freem(sc->rx_m);
2957 sc->rx_m = NULL;
2958 }
2959 break;
2960 }
2961
2962 if (m == NULL)
2963 return;
2964
2965 /* inputting all the frames must be last */
2966
2967 RUN_UNLOCK(sc);
2968
2969 m->m_pkthdr.len = m->m_len = xferlen;
2970
2971 /* HW can aggregate multiple 802.11 frames in a single USB xfer */
2972 for(;;) {
2973 dmalen = le32toh(*mtod(m, uint32_t *)) & 0xffff;
2974
2975 if ((dmalen >= (uint32_t)-8) || (dmalen == 0) ||
2976 ((dmalen & 3) != 0)) {
2977 DPRINTF("bad DMA length %u\n", dmalen);
2978 break;
2979 }
2980 if ((dmalen + 8) > (uint32_t)xferlen) {
2981 DPRINTF("bad DMA length %u > %d\n",
2982 dmalen + 8, xferlen);
2983 break;
2984 }
2985
2986 /* If it is the last one or a single frame, we won't copy. */
2987 if ((xferlen -= dmalen + 8) <= 8) {
2988 /* trim 32-bit DMA-len header */
2989 m->m_data += 4;
2990 m->m_pkthdr.len = m->m_len -= 4;
2991 run_rx_frame(sc, m, dmalen);
2992 m = NULL; /* don't free source buffer */
2993 break;
2994 }
2995
2996 /* copy aggregated frames to another mbuf */
2997 m0 = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
2998 if (__predict_false(m0 == NULL)) {
2999 DPRINTF("could not allocate mbuf\n");
3000 ifp->if_ierrors++;
3001 break;
3002 }
3003 m_copydata(m, 4 /* skip 32-bit DMA-len header */,
3004 dmalen + sizeof(struct rt2870_rxd), mtod(m0, caddr_t));
3005 m0->m_pkthdr.len = m0->m_len =
3006 dmalen + sizeof(struct rt2870_rxd);
3007 run_rx_frame(sc, m0, dmalen);
3008
3009 /* update data ptr */
3010 m->m_data += dmalen + 8;
3011 m->m_pkthdr.len = m->m_len -= dmalen + 8;
3012 }
3013
3014 /* make sure we free the source buffer, if any */
3015 m_freem(m);
3016
3017 RUN_LOCK(sc);
3018 }
3019
3020 static void
3021 run_tx_free(struct run_endpoint_queue *pq,
3022 struct run_tx_data *data, int txerr)
3023 {
3024 if (data->m != NULL) {
3025 if (data->m->m_flags & M_TXCB)
3026 ieee80211_process_callback(data->ni, data->m,
3027 txerr ? ETIMEDOUT : 0);
3028 m_freem(data->m);
3029 data->m = NULL;
3030
3031 if (data->ni == NULL) {
3032 DPRINTF("no node\n");
3033 } else {
3034 ieee80211_free_node(data->ni);
3035 data->ni = NULL;
3036 }
3037 }
3038
3039 STAILQ_INSERT_TAIL(&pq->tx_fh, data, next);
3040 pq->tx_nfree++;
3041 }
3042
3043 static void
3044 run_bulk_tx_callbackN(struct usb_xfer *xfer, usb_error_t error, u_int index)
3045 {
3046 struct run_softc *sc = usbd_xfer_softc(xfer);
3047 struct ifnet *ifp = sc->sc_ifp;
3048 struct ieee80211com *ic = ifp->if_l2com;
3049 struct run_tx_data *data;
3050 struct ieee80211vap *vap = NULL;
3051 struct usb_page_cache *pc;
3052 struct run_endpoint_queue *pq = &sc->sc_epq[index];
3053 struct mbuf *m;
3054 usb_frlength_t size;
3055 int actlen;
3056 int sumlen;
3057
3058 usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
3059
3060 switch (USB_GET_STATE(xfer)) {
3061 case USB_ST_TRANSFERRED:
3062 DPRINTFN(11, "transfer complete: %d "
3063 "bytes @ index %d\n", actlen, index);
3064
3065 data = usbd_xfer_get_priv(xfer);
3066
3067 run_tx_free(pq, data, 0);
3068 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
3069
3070 usbd_xfer_set_priv(xfer, NULL);
3071
3072 ifp->if_opackets++;
3073
3074 /* FALLTHROUGH */
3075 case USB_ST_SETUP:
3076 tr_setup:
3077 data = STAILQ_FIRST(&pq->tx_qh);
3078 if (data == NULL)
3079 break;
3080
3081 STAILQ_REMOVE_HEAD(&pq->tx_qh, next);
3082
3083 m = data->m;
3084 size = (sc->mac_ver == 0x5592) ?
3085 sizeof(data->desc) + sizeof(uint32_t) : sizeof(data->desc);
3086 if ((m->m_pkthdr.len +
3087 size + 3 + 8) > RUN_MAX_TXSZ) {
3088 DPRINTF("data overflow, %u bytes\n",
3089 m->m_pkthdr.len);
3090
3091 ifp->if_oerrors++;
3092
3093 run_tx_free(pq, data, 1);
3094
3095 goto tr_setup;
3096 }
3097
3098 pc = usbd_xfer_get_frame(xfer, 0);
3099 usbd_copy_in(pc, 0, &data->desc, size);
3100 usbd_m_copy_in(pc, size, m, 0, m->m_pkthdr.len);
3101 size += m->m_pkthdr.len;
3102 /*
3103 * Align end on a 4-byte boundary, pad 8 bytes (CRC +
3104 * 4-byte padding), and be sure to zero those trailing
3105 * bytes:
3106 */
3107 usbd_frame_zero(pc, size, ((-size) & 3) + 8);
3108 size += ((-size) & 3) + 8;
3109
3110 vap = data->ni->ni_vap;
3111 if (ieee80211_radiotap_active_vap(vap)) {
3112 struct run_tx_radiotap_header *tap = &sc->sc_txtap;
3113 struct rt2860_txwi *txwi =
3114 (struct rt2860_txwi *)(&data->desc + sizeof(struct rt2870_txd));
3115 tap->wt_flags = 0;
3116 tap->wt_rate = rt2860_rates[data->ridx].rate;
3117 tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq);
3118 tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags);
3119 tap->wt_hwqueue = index;
3120 if (le16toh(txwi->phy) & RT2860_PHY_SHPRE)
3121 tap->wt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
3122
3123 ieee80211_radiotap_tx(vap, m);
3124 }
3125
3126 DPRINTFN(11, "sending frame len=%u/%u @ index %d\n",
3127 m->m_pkthdr.len, size, index);
3128
3129 usbd_xfer_set_frame_len(xfer, 0, size);
3130 usbd_xfer_set_priv(xfer, data);
3131
3132 usbd_transfer_submit(xfer);
3133
3134 RUN_UNLOCK(sc);
3135 run_start(ifp);
3136 RUN_LOCK(sc);
3137
3138 break;
3139
3140 default:
3141 DPRINTF("USB transfer error, %s\n",
3142 usbd_errstr(error));
3143
3144 data = usbd_xfer_get_priv(xfer);
3145
3146 ifp->if_oerrors++;
3147
3148 if (data != NULL) {
3149 if(data->ni != NULL)
3150 vap = data->ni->ni_vap;
3151 run_tx_free(pq, data, error);
3152 usbd_xfer_set_priv(xfer, NULL);
3153 }
3154 if (vap == NULL)
3155 vap = TAILQ_FIRST(&ic->ic_vaps);
3156
3157 if (error != USB_ERR_CANCELLED) {
3158 if (error == USB_ERR_TIMEOUT) {
3159 device_printf(sc->sc_dev, "device timeout\n");
3160 uint32_t i = RUN_CMDQ_GET(&sc->cmdq_store);
3161 DPRINTF("cmdq_store=%d\n", i);
3162 sc->cmdq[i].func = run_usb_timeout_cb;
3163 sc->cmdq[i].arg0 = vap;
3164 ieee80211_runtask(ic, &sc->cmdq_task);
3165 }
3166
3167 /*
3168 * Try to clear stall first, also if other
3169 * errors occur, hence clearing stall
3170 * introduces a 50 ms delay:
3171 */
3172 usbd_xfer_set_stall(xfer);
3173 goto tr_setup;
3174 }
3175 break;
3176 }
3177 }
3178
3179 static void
3180 run_bulk_tx_callback0(struct usb_xfer *xfer, usb_error_t error)
3181 {
3182 run_bulk_tx_callbackN(xfer, error, 0);
3183 }
3184
3185 static void
3186 run_bulk_tx_callback1(struct usb_xfer *xfer, usb_error_t error)
3187 {
3188 run_bulk_tx_callbackN(xfer, error, 1);
3189 }
3190
3191 static void
3192 run_bulk_tx_callback2(struct usb_xfer *xfer, usb_error_t error)
3193 {
3194 run_bulk_tx_callbackN(xfer, error, 2);
3195 }
3196
3197 static void
3198 run_bulk_tx_callback3(struct usb_xfer *xfer, usb_error_t error)
3199 {
3200 run_bulk_tx_callbackN(xfer, error, 3);
3201 }
3202
3203 static void
3204 run_bulk_tx_callback4(struct usb_xfer *xfer, usb_error_t error)
3205 {
3206 run_bulk_tx_callbackN(xfer, error, 4);
3207 }
3208
3209 static void
3210 run_bulk_tx_callback5(struct usb_xfer *xfer, usb_error_t error)
3211 {
3212 run_bulk_tx_callbackN(xfer, error, 5);
3213 }
3214
3215 static void
3216 run_set_tx_desc(struct run_softc *sc, struct run_tx_data *data)
3217 {
3218 struct mbuf *m = data->m;
3219 struct ieee80211com *ic = sc->sc_ifp->if_l2com;
3220 struct ieee80211vap *vap = data->ni->ni_vap;
3221 struct ieee80211_frame *wh;
3222 struct rt2870_txd *txd;
3223 struct rt2860_txwi *txwi;
3224 uint16_t xferlen, txwisize;
3225 uint16_t mcs;
3226 uint8_t ridx = data->ridx;
3227 uint8_t pad;
3228
3229 /* get MCS code from rate index */
3230 mcs = rt2860_rates[ridx].mcs;
3231
3232 txwisize = (sc->mac_ver == 0x5592) ?
3233 sizeof(*txwi) + sizeof(uint32_t) : sizeof(*txwi);
3234 xferlen = txwisize + m->m_pkthdr.len;
3235
3236 /* roundup to 32-bit alignment */
3237 xferlen = (xferlen + 3) & ~3;
3238
3239 txd = (struct rt2870_txd *)&data->desc;
3240 txd->len = htole16(xferlen);
3241
3242 wh = mtod(m, struct ieee80211_frame *);
3243
3244 /*
3245 * Ether both are true or both are false, the header
3246 * are nicely aligned to 32-bit. So, no L2 padding.
3247 */
3248 if(IEEE80211_HAS_ADDR4(wh) == IEEE80211_QOS_HAS_SEQ(wh))
3249 pad = 0;
3250 else
3251 pad = 2;
3252
3253 /* setup TX Wireless Information */
3254 txwi = (struct rt2860_txwi *)(txd + 1);
3255 txwi->len = htole16(m->m_pkthdr.len - pad);
3256 if (rt2860_rates[ridx].phy == IEEE80211_T_DS) {
3257 mcs |= RT2860_PHY_CCK;
3258 if (ridx != RT2860_RIDX_CCK1 &&
3259 (ic->ic_flags & IEEE80211_F_SHPREAMBLE))
3260 mcs |= RT2860_PHY_SHPRE;
3261 } else
3262 mcs |= RT2860_PHY_OFDM;
3263 txwi->phy = htole16(mcs);
3264
3265 /* check if RTS/CTS or CTS-to-self protection is required */
3266 if (!IEEE80211_IS_MULTICAST(wh->i_addr1) &&
3267 (m->m_pkthdr.len + IEEE80211_CRC_LEN > vap->iv_rtsthreshold ||
3268 ((ic->ic_flags & IEEE80211_F_USEPROT) &&
3269 rt2860_rates[ridx].phy == IEEE80211_T_OFDM)))
3270 txwi->txop |= RT2860_TX_TXOP_HT;
3271 else
3272 txwi->txop |= RT2860_TX_TXOP_BACKOFF;
3273
3274 if (vap->iv_opmode != IEEE80211_M_STA && !IEEE80211_QOS_HAS_SEQ(wh))
3275 txwi->xflags |= RT2860_TX_NSEQ;
3276 }
3277
3278 /* This function must be called locked */
3279 static int
3280 run_tx(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
3281 {
3282 struct ieee80211com *ic = sc->sc_ifp->if_l2com;
3283 struct ieee80211vap *vap = ni->ni_vap;
3284 struct ieee80211_frame *wh;
3285 struct ieee80211_channel *chan;
3286 const struct ieee80211_txparam *tp;
3287 struct run_node *rn = (void *)ni;
3288 struct run_tx_data *data;
3289 struct rt2870_txd *txd;
3290 struct rt2860_txwi *txwi;
3291 uint16_t qos;
3292 uint16_t dur;
3293 uint16_t qid;
3294 uint8_t type;
3295 uint8_t tid;
3296 uint8_t ridx;
3297 uint8_t ctl_ridx;
3298 uint8_t qflags;
3299 uint8_t xflags = 0;
3300 int hasqos;
3301
3302 RUN_LOCK_ASSERT(sc, MA_OWNED);
3303
3304 wh = mtod(m, struct ieee80211_frame *);
3305
3306 type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
3307
3308 /*
3309 * There are 7 bulk endpoints: 1 for RX
3310 * and 6 for TX (4 EDCAs + HCCA + Prio).
3311 * Update 03-14-2009: some devices like the Planex GW-US300MiniS
3312 * seem to have only 4 TX bulk endpoints (Fukaumi Naoki).
3313 */
3314 if ((hasqos = IEEE80211_QOS_HAS_SEQ(wh))) {
3315 uint8_t *frm;
3316
3317 if(IEEE80211_HAS_ADDR4(wh))
3318 frm = ((struct ieee80211_qosframe_addr4 *)wh)->i_qos;
3319 else
3320 frm =((struct ieee80211_qosframe *)wh)->i_qos;
3321
3322 qos = le16toh(*(const uint16_t *)frm);
3323 tid = qos & IEEE80211_QOS_TID;
3324 qid = TID_TO_WME_AC(tid);
3325 } else {
3326 qos = 0;
3327 tid = 0;
3328 qid = WME_AC_BE;
3329 }
3330 qflags = (qid < 4) ? RT2860_TX_QSEL_EDCA : RT2860_TX_QSEL_HCCA;
3331
3332 DPRINTFN(8, "qos %d\tqid %d\ttid %d\tqflags %x\n",
3333 qos, qid, tid, qflags);
3334
3335 chan = (ni->ni_chan != IEEE80211_CHAN_ANYC)?ni->ni_chan:ic->ic_curchan;
3336 tp = &vap->iv_txparms[ieee80211_chan2mode(chan)];
3337
3338 /* pickup a rate index */
3339 if (IEEE80211_IS_MULTICAST(wh->i_addr1) ||
3340 type != IEEE80211_FC0_TYPE_DATA || m->m_flags & M_EAPOL) {
3341 ridx = (ic->ic_curmode == IEEE80211_MODE_11A) ?
3342 RT2860_RIDX_OFDM6 : RT2860_RIDX_CCK1;
3343 ctl_ridx = rt2860_rates[ridx].ctl_ridx;
3344 } else {
3345 if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE)
3346 ridx = rn->fix_ridx;
3347 else
3348 ridx = rn->amrr_ridx;
3349 ctl_ridx = rt2860_rates[ridx].ctl_ridx;
3350 }
3351
3352 if (!IEEE80211_IS_MULTICAST(wh->i_addr1) &&
3353 (!hasqos || (qos & IEEE80211_QOS_ACKPOLICY) !=
3354 IEEE80211_QOS_ACKPOLICY_NOACK)) {
3355 xflags |= RT2860_TX_ACK;
3356 if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
3357 dur = rt2860_rates[ctl_ridx].sp_ack_dur;
3358 else
3359 dur = rt2860_rates[ctl_ridx].lp_ack_dur;
3360 USETW(wh->i_dur, dur);
3361 }
3362
3363 /* reserve slots for mgmt packets, just in case */
3364 if (sc->sc_epq[qid].tx_nfree < 3) {
3365 DPRINTFN(10, "tx ring %d is full\n", qid);
3366 return (-1);
3367 }
3368
3369 data = STAILQ_FIRST(&sc->sc_epq[qid].tx_fh);
3370 STAILQ_REMOVE_HEAD(&sc->sc_epq[qid].tx_fh, next);
3371 sc->sc_epq[qid].tx_nfree--;
3372
3373 txd = (struct rt2870_txd *)&data->desc;
3374 txd->flags = qflags;
3375 txwi = (struct rt2860_txwi *)(txd + 1);
3376 txwi->xflags = xflags;
3377 if (IEEE80211_IS_MULTICAST(wh->i_addr1))
3378 txwi->wcid = 0;
3379 else
3380 txwi->wcid = (vap->iv_opmode == IEEE80211_M_STA) ?
3381 1 : RUN_AID2WCID(ni->ni_associd);
3382
3383 /* clear leftover garbage bits */
3384 txwi->flags = 0;
3385 txwi->txop = 0;
3386
3387 data->m = m;
3388 data->ni = ni;
3389 data->ridx = ridx;
3390
3391 run_set_tx_desc(sc, data);
3392
3393 /*
3394 * The chip keeps track of 2 kind of Tx stats,
3395 * * TX_STAT_FIFO, for per WCID stats, and
3396 * * TX_STA_CNT0 for all-TX-in-one stats.
3397 *
3398 * To use FIFO stats, we need to store MCS into the driver-private
3399 * PacketID field. So that, we can tell whose stats when we read them.
3400 * We add 1 to the MCS because setting the PacketID field to 0 means
3401 * that we don't want feedback in TX_STAT_FIFO.
3402 * And, that's what we want for STA mode, since TX_STA_CNT0 does the job.
3403 *
3404 * FIFO stats doesn't count Tx with WCID 0xff, so we do this in run_tx().
3405 */
3406 if (sc->rvp_cnt > 1 || vap->iv_opmode == IEEE80211_M_HOSTAP ||
3407 vap->iv_opmode == IEEE80211_M_MBSS) {
3408 uint16_t pid = (rt2860_rates[ridx].mcs + 1) & 0xf;
3409 txwi->len |= htole16(pid << RT2860_TX_PID_SHIFT);
3410
3411 /*
3412 * Unlike PCI based devices, we don't get any interrupt from
3413 * USB devices, so we simulate FIFO-is-full interrupt here.
3414 * Ralink recomends to drain FIFO stats every 100 ms, but 16 slots
3415 * quickly get fulled. To prevent overflow, increment a counter on
3416 * every FIFO stat request, so we know how many slots are left.
3417 * We do this only in HOSTAP or multiple vap mode since FIFO stats
3418 * are used only in those modes.
3419 * We just drain stats. AMRR gets updated every 1 sec by
3420 * run_ratectl_cb() via callout.
3421 * Call it early. Otherwise overflow.
3422 */
3423 if (sc->fifo_cnt++ == 10) {
3424 /*
3425 * With multiple vaps or if_bridge, if_start() is called
3426 * with a non-sleepable lock, tcpinp. So, need to defer.
3427 */
3428 uint32_t i = RUN_CMDQ_GET(&sc->cmdq_store);
3429 DPRINTFN(6, "cmdq_store=%d\n", i);
3430 sc->cmdq[i].func = run_drain_fifo;
3431 sc->cmdq[i].arg0 = sc;
3432 ieee80211_runtask(ic, &sc->cmdq_task);
3433 }
3434 }
3435
3436 STAILQ_INSERT_TAIL(&sc->sc_epq[qid].tx_qh, data, next);
3437
3438 usbd_transfer_start(sc->sc_xfer[qid]);
3439
3440 DPRINTFN(8, "sending data frame len=%d rate=%d qid=%d\n",
3441 m->m_pkthdr.len + (int)(sizeof(struct rt2870_txd) +
3442 sizeof(struct rt2860_txwi)), rt2860_rates[ridx].rate, qid);
3443
3444 return (0);
3445 }
3446
3447 static int
3448 run_tx_mgt(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
3449 {
3450 struct ifnet *ifp = sc->sc_ifp;
3451 struct ieee80211com *ic = ifp->if_l2com;
3452 struct run_node *rn = (void *)ni;
3453 struct run_tx_data *data;
3454 struct ieee80211_frame *wh;
3455 struct rt2870_txd *txd;
3456 struct rt2860_txwi *txwi;
3457 uint16_t dur;
3458 uint8_t ridx = rn->mgt_ridx;
3459 uint8_t type;
3460 uint8_t xflags = 0;
3461 uint8_t wflags = 0;
3462
3463 RUN_LOCK_ASSERT(sc, MA_OWNED);
3464
3465 wh = mtod(m, struct ieee80211_frame *);
3466
3467 type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
3468
3469 /* tell hardware to add timestamp for probe responses */
3470 if ((wh->i_fc[0] &
3471 (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_MASK)) ==
3472 (IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_PROBE_RESP))
3473 wflags |= RT2860_TX_TS;
3474 else if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
3475 xflags |= RT2860_TX_ACK;
3476
3477 dur = ieee80211_ack_duration(ic->ic_rt, rt2860_rates[ridx].rate,
3478 ic->ic_flags & IEEE80211_F_SHPREAMBLE);
3479 USETW(wh->i_dur, dur);
3480 }
3481
3482 if (sc->sc_epq[0].tx_nfree == 0) {
3483 /* let caller free mbuf */
3484 ifp->if_drv_flags |= IFF_DRV_OACTIVE;
3485 return (EIO);
3486 }
3487 data = STAILQ_FIRST(&sc->sc_epq[0].tx_fh);
3488 STAILQ_REMOVE_HEAD(&sc->sc_epq[0].tx_fh, next);
3489 sc->sc_epq[0].tx_nfree--;
3490
3491 txd = (struct rt2870_txd *)&data->desc;
3492 txd->flags = RT2860_TX_QSEL_EDCA;
3493 txwi = (struct rt2860_txwi *)(txd + 1);
3494 txwi->wcid = 0xff;
3495 txwi->flags = wflags;
3496 txwi->xflags = xflags;
3497 txwi->txop = 0; /* clear leftover garbage bits */
3498
3499 data->m = m;
3500 data->ni = ni;
3501 data->ridx = ridx;
3502
3503 run_set_tx_desc(sc, data);
3504
3505 DPRINTFN(10, "sending mgt frame len=%d rate=%d\n", m->m_pkthdr.len +
3506 (int)(sizeof(struct rt2870_txd) + sizeof(struct rt2860_txwi)),
3507 rt2860_rates[ridx].rate);
3508
3509 STAILQ_INSERT_TAIL(&sc->sc_epq[0].tx_qh, data, next);
3510
3511 usbd_transfer_start(sc->sc_xfer[0]);
3512
3513 return (0);
3514 }
3515
3516 static int
3517 run_sendprot(struct run_softc *sc,
3518 const struct mbuf *m, struct ieee80211_node *ni, int prot, int rate)
3519 {
3520 struct ieee80211com *ic = ni->ni_ic;
3521 struct ieee80211_frame *wh;
3522 struct run_tx_data *data;
3523 struct rt2870_txd *txd;
3524 struct rt2860_txwi *txwi;
3525 struct mbuf *mprot;
3526 int ridx;
3527 int protrate;
3528 int ackrate;
3529 int pktlen;
3530 int isshort;
3531 uint16_t dur;
3532 uint8_t type;
3533 uint8_t wflags = 0;
3534 uint8_t xflags = 0;
3535
3536 RUN_LOCK_ASSERT(sc, MA_OWNED);
3537
3538 KASSERT(prot == IEEE80211_PROT_RTSCTS || prot == IEEE80211_PROT_CTSONLY,
3539 ("protection %d", prot));
3540
3541 wh = mtod(m, struct ieee80211_frame *);
3542 pktlen = m->m_pkthdr.len + IEEE80211_CRC_LEN;
3543 type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
3544
3545 protrate = ieee80211_ctl_rate(ic->ic_rt, rate);
3546 ackrate = ieee80211_ack_rate(ic->ic_rt, rate);
3547
3548 isshort = (ic->ic_flags & IEEE80211_F_SHPREAMBLE) != 0;
3549 dur = ieee80211_compute_duration(ic->ic_rt, pktlen, rate, isshort)
3550 + ieee80211_ack_duration(ic->ic_rt, rate, isshort);
3551 wflags = RT2860_TX_FRAG;
3552
3553 /* check that there are free slots before allocating the mbuf */
3554 if (sc->sc_epq[0].tx_nfree == 0) {
3555 /* let caller free mbuf */
3556 sc->sc_ifp->if_drv_flags |= IFF_DRV_OACTIVE;
3557 return (ENOBUFS);
3558 }
3559
3560 if (prot == IEEE80211_PROT_RTSCTS) {
3561 /* NB: CTS is the same size as an ACK */
3562 dur += ieee80211_ack_duration(ic->ic_rt, rate, isshort);
3563 xflags |= RT2860_TX_ACK;
3564 mprot = ieee80211_alloc_rts(ic, wh->i_addr1, wh->i_addr2, dur);
3565 } else {
3566 mprot = ieee80211_alloc_cts(ic, ni->ni_vap->iv_myaddr, dur);
3567 }
3568 if (mprot == NULL) {
3569 sc->sc_ifp->if_oerrors++;
3570 DPRINTF("could not allocate mbuf\n");
3571 return (ENOBUFS);
3572 }
3573
3574 data = STAILQ_FIRST(&sc->sc_epq[0].tx_fh);
3575 STAILQ_REMOVE_HEAD(&sc->sc_epq[0].tx_fh, next);
3576 sc->sc_epq[0].tx_nfree--;
3577
3578 txd = (struct rt2870_txd *)&data->desc;
3579 txd->flags = RT2860_TX_QSEL_EDCA;
3580 txwi = (struct rt2860_txwi *)(txd + 1);
3581 txwi->wcid = 0xff;
3582 txwi->flags = wflags;
3583 txwi->xflags = xflags;
3584 txwi->txop = 0; /* clear leftover garbage bits */
3585
3586 data->m = mprot;
3587 data->ni = ieee80211_ref_node(ni);
3588
3589 for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++)
3590 if (rt2860_rates[ridx].rate == protrate)
3591 break;
3592 data->ridx = ridx;
3593
3594 run_set_tx_desc(sc, data);
3595
3596 DPRINTFN(1, "sending prot len=%u rate=%u\n",
3597 m->m_pkthdr.len, rate);
3598
3599 STAILQ_INSERT_TAIL(&sc->sc_epq[0].tx_qh, data, next);
3600
3601 usbd_transfer_start(sc->sc_xfer[0]);
3602
3603 return (0);
3604 }
3605
3606 static int
3607 run_tx_param(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni,
3608 const struct ieee80211_bpf_params *params)
3609 {
3610 struct ieee80211com *ic = ni->ni_ic;
3611 struct ieee80211_frame *wh;
3612 struct run_tx_data *data;
3613 struct rt2870_txd *txd;
3614 struct rt2860_txwi *txwi;
3615 uint8_t type;
3616 uint8_t ridx;
3617 uint8_t rate;
3618 uint8_t opflags = 0;
3619 uint8_t xflags = 0;
3620 int error;
3621
3622 RUN_LOCK_ASSERT(sc, MA_OWNED);
3623
3624 KASSERT(params != NULL, ("no raw xmit params"));
3625
3626 wh = mtod(m, struct ieee80211_frame *);
3627 type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
3628
3629 rate = params->ibp_rate0;
3630 if (!ieee80211_isratevalid(ic->ic_rt, rate)) {
3631 /* let caller free mbuf */
3632 return (EINVAL);
3633 }
3634
3635 if ((params->ibp_flags & IEEE80211_BPF_NOACK) == 0)
3636 xflags |= RT2860_TX_ACK;
3637 if (params->ibp_flags & (IEEE80211_BPF_RTS|IEEE80211_BPF_CTS)) {
3638 error = run_sendprot(sc, m, ni,
3639 params->ibp_flags & IEEE80211_BPF_RTS ?
3640 IEEE80211_PROT_RTSCTS : IEEE80211_PROT_CTSONLY,
3641 rate);
3642 if (error) {
3643 /* let caller free mbuf */
3644 return error;
3645 }
3646 opflags |= /*XXX RT2573_TX_LONG_RETRY |*/ RT2860_TX_TXOP_SIFS;
3647 }
3648
3649 if (sc->sc_epq[0].tx_nfree == 0) {
3650 /* let caller free mbuf */
3651 sc->sc_ifp->if_drv_flags |= IFF_DRV_OACTIVE;
3652 DPRINTF("sending raw frame, but tx ring is full\n");
3653 return (EIO);
3654 }
3655 data = STAILQ_FIRST(&sc->sc_epq[0].tx_fh);
3656 STAILQ_REMOVE_HEAD(&sc->sc_epq[0].tx_fh, next);
3657 sc->sc_epq[0].tx_nfree--;
3658
3659 txd = (struct rt2870_txd *)&data->desc;
3660 txd->flags = RT2860_TX_QSEL_EDCA;
3661 txwi = (struct rt2860_txwi *)(txd + 1);
3662 txwi->wcid = 0xff;
3663 txwi->xflags = xflags;
3664 txwi->txop = opflags;
3665 txwi->flags = 0; /* clear leftover garbage bits */
3666
3667 data->m = m;
3668 data->ni = ni;
3669 for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++)
3670 if (rt2860_rates[ridx].rate == rate)
3671 break;
3672 data->ridx = ridx;
3673
3674 run_set_tx_desc(sc, data);
3675
3676 DPRINTFN(10, "sending raw frame len=%u rate=%u\n",
3677 m->m_pkthdr.len, rate);
3678
3679 STAILQ_INSERT_TAIL(&sc->sc_epq[0].tx_qh, data, next);
3680
3681 usbd_transfer_start(sc->sc_xfer[0]);
3682
3683 return (0);
3684 }
3685
3686 static int
3687 run_raw_xmit(struct ieee80211_node *ni, struct mbuf *m,
3688 const struct ieee80211_bpf_params *params)
3689 {
3690 struct ifnet *ifp = ni->ni_ic->ic_ifp;
3691 struct run_softc *sc = ifp->if_softc;
3692 int error = 0;
3693
3694 RUN_LOCK(sc);
3695
3696 /* prevent management frames from being sent if we're not ready */
3697 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
3698 error = ENETDOWN;
3699 goto done;
3700 }
3701
3702 if (params == NULL) {
3703 /* tx mgt packet */
3704 if ((error = run_tx_mgt(sc, m, ni)) != 0) {
3705 ifp->if_oerrors++;
3706 DPRINTF("mgt tx failed\n");
3707 goto done;
3708 }
3709 } else {
3710 /* tx raw packet with param */
3711 if ((error = run_tx_param(sc, m, ni, params)) != 0) {
3712 ifp->if_oerrors++;
3713 DPRINTF("tx with param failed\n");
3714 goto done;
3715 }
3716 }
3717
3718 ifp->if_opackets++;
3719
3720 done:
3721 RUN_UNLOCK(sc);
3722
3723 if (error != 0) {
3724 if(m != NULL)
3725 m_freem(m);
3726 ieee80211_free_node(ni);
3727 }
3728
3729 return (error);
3730 }
3731
3732 static void
3733 run_start(struct ifnet *ifp)
3734 {
3735 struct run_softc *sc = ifp->if_softc;
3736 struct ieee80211_node *ni;
3737 struct mbuf *m;
3738
3739 RUN_LOCK(sc);
3740
3741 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
3742 RUN_UNLOCK(sc);
3743 return;
3744 }
3745
3746 for (;;) {
3747 /* send data frames */
3748 IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
3749 if (m == NULL)
3750 break;
3751
3752 ni = (struct ieee80211_node *)m->m_pkthdr.rcvif;
3753 if (run_tx(sc, m, ni) != 0) {
3754 IFQ_DRV_PREPEND(&ifp->if_snd, m);
3755 ifp->if_drv_flags |= IFF_DRV_OACTIVE;
3756 break;
3757 }
3758 }
3759
3760 RUN_UNLOCK(sc);
3761 }
3762
3763 static int
3764 run_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
3765 {
3766 struct run_softc *sc = ifp->if_softc;
3767 struct ieee80211com *ic = sc->sc_ifp->if_l2com;
3768 struct ifreq *ifr = (struct ifreq *) data;
3769 int startall = 0;
3770 int error;
3771
3772 RUN_LOCK(sc);
3773 error = sc->sc_detached ? ENXIO : 0;
3774 RUN_UNLOCK(sc);
3775 if (error)
3776 return (error);
3777
3778 switch (cmd) {
3779 case SIOCSIFFLAGS:
3780 RUN_LOCK(sc);
3781 if (ifp->if_flags & IFF_UP) {
3782 if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)){
3783 startall = 1;
3784 run_init_locked(sc);
3785 } else
3786 run_update_promisc_locked(ifp);
3787 } else {
3788 if (ifp->if_drv_flags & IFF_DRV_RUNNING &&
3789 (ic->ic_nrunning == 0 || sc->rvp_cnt <= 1)) {
3790 run_stop(sc);
3791 }
3792 }
3793 RUN_UNLOCK(sc);
3794 if (startall)
3795 ieee80211_start_all(ic);
3796 break;
3797 case SIOCGIFMEDIA:
3798 error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd);
3799 break;
3800 case SIOCGIFADDR:
3801 error = ether_ioctl(ifp, cmd, data);
3802 break;
3803 default:
3804 error = EINVAL;
3805 break;
3806 }
3807
3808 return (error);
3809 }
3810
3811 static void
3812 run_iq_calib(struct run_softc *sc, u_int chan)
3813 {
3814 uint16_t val;
3815
3816 /* Tx0 IQ gain. */
3817 run_bbp_write(sc, 158, 0x2c);
3818 if (chan <= 14)
3819 run_efuse_read(sc, RT5390_EEPROM_IQ_GAIN_CAL_TX0_2GHZ, &val, 1);
3820 else if (chan <= 64) {
3821 run_efuse_read(sc,
3822 RT5390_EEPROM_IQ_GAIN_CAL_TX0_CH36_TO_CH64_5GHZ,
3823 &val, 1);
3824 } else if (chan <= 138) {
3825 run_efuse_read(sc,
3826 RT5390_EEPROM_IQ_GAIN_CAL_TX0_CH100_TO_CH138_5GHZ,
3827 &val, 1);
3828 } else if (chan <= 165) {
3829 run_efuse_read(sc,
3830 RT5390_EEPROM_IQ_GAIN_CAL_TX0_CH140_TO_CH165_5GHZ,
3831 &val, 1);
3832 } else
3833 val = 0;
3834 run_bbp_write(sc, 159, val);
3835
3836 /* Tx0 IQ phase. */
3837 run_bbp_write(sc, 158, 0x2d);
3838 if (chan <= 14) {
3839 run_efuse_read(sc, RT5390_EEPROM_IQ_PHASE_CAL_TX0_2GHZ,
3840 &val, 1);
3841 } else if (chan <= 64) {
3842 run_efuse_read(sc,
3843 RT5390_EEPROM_IQ_PHASE_CAL_TX0_CH36_TO_CH64_5GHZ,
3844 &val, 1);
3845 } else if (chan <= 138) {
3846 run_efuse_read(sc,
3847 RT5390_EEPROM_IQ_PHASE_CAL_TX0_CH100_TO_CH138_5GHZ,
3848 &val, 1);
3849 } else if (chan <= 165) {
3850 run_efuse_read(sc,
3851 RT5390_EEPROM_IQ_PHASE_CAL_TX0_CH140_TO_CH165_5GHZ,
3852 &val, 1);
3853 } else
3854 val = 0;
3855 run_bbp_write(sc, 159, val);
3856
3857 /* Tx1 IQ gain. */
3858 run_bbp_write(sc, 158, 0x4a);
3859 if (chan <= 14) {
3860 run_efuse_read(sc, RT5390_EEPROM_IQ_GAIN_CAL_TX1_2GHZ,
3861 &val, 1);
3862 } else if (chan <= 64) {
3863 run_efuse_read(sc,
3864 RT5390_EEPROM_IQ_GAIN_CAL_TX1_CH36_TO_CH64_5GHZ,
3865 &val, 1);
3866 } else if (chan <= 138) {
3867 run_efuse_read(sc,
3868 RT5390_EEPROM_IQ_GAIN_CAL_TX1_CH100_TO_CH138_5GHZ,
3869 &val, 1);
3870 } else if (chan <= 165) {
3871 run_efuse_read(sc,
3872 RT5390_EEPROM_IQ_GAIN_CAL_TX1_CH140_TO_CH165_5GHZ,
3873 &val, 1);
3874 } else
3875 val = 0;
3876 run_bbp_write(sc, 159, val);
3877
3878 /* Tx1 IQ phase. */
3879 run_bbp_write(sc, 158, 0x4b);
3880 if (chan <= 14) {
3881 run_efuse_read(sc, RT5390_EEPROM_IQ_PHASE_CAL_TX1_2GHZ,
3882 &val, 1);
3883 } else if (chan <= 64) {
3884 run_efuse_read(sc,
3885 RT5390_EEPROM_IQ_PHASE_CAL_TX1_CH36_TO_CH64_5GHZ,
3886 &val, 1);
3887 } else if (chan <= 138) {
3888 run_efuse_read(sc,
3889 RT5390_EEPROM_IQ_PHASE_CAL_TX1_CH100_TO_CH138_5GHZ,
3890 &val, 1);
3891 } else if (chan <= 165) {
3892 run_efuse_read(sc,
3893 RT5390_EEPROM_IQ_PHASE_CAL_TX1_CH140_TO_CH165_5GHZ,
3894 &val, 1);
3895 } else
3896 val = 0;
3897 run_bbp_write(sc, 159, val);
3898
3899 /* RF IQ compensation control. */
3900 run_bbp_write(sc, 158, 0x04);
3901 run_efuse_read(sc, RT5390_EEPROM_RF_IQ_COMPENSATION_CTL,
3902 &val, 1);
3903 run_bbp_write(sc, 159, val);
3904
3905 /* RF IQ imbalance compensation control. */
3906 run_bbp_write(sc, 158, 0x03);
3907 run_efuse_read(sc,
3908 RT5390_EEPROM_RF_IQ_IMBALANCE_COMPENSATION_CTL, &val, 1);
3909 run_bbp_write(sc, 159, val);
3910 }
3911
3912 static void
3913 run_set_agc(struct run_softc *sc, uint8_t agc)
3914 {
3915 uint8_t bbp;
3916
3917 if (sc->mac_ver == 0x3572) {
3918 run_bbp_read(sc, 27, &bbp);
3919 bbp &= ~(0x3 << 5);
3920 run_bbp_write(sc, 27, bbp | 0 << 5); /* select Rx0 */
3921 run_bbp_write(sc, 66, agc);
3922 run_bbp_write(sc, 27, bbp | 1 << 5); /* select Rx1 */
3923 run_bbp_write(sc, 66, agc);
3924 } else
3925 run_bbp_write(sc, 66, agc);
3926 }
3927
3928 static void
3929 run_select_chan_group(struct run_softc *sc, int group)
3930 {
3931 uint32_t tmp;
3932 uint8_t agc;
3933
3934 run_bbp_write(sc, 62, 0x37 - sc->lna[group]);
3935 run_bbp_write(sc, 63, 0x37 - sc->lna[group]);
3936 run_bbp_write(sc, 64, 0x37 - sc->lna[group]);
3937 if (sc->mac_ver < 0x3572)
3938 run_bbp_write(sc, 86, 0x00);
3939
3940 if (sc->mac_ver == 0x3593) {
3941 run_bbp_write(sc, 77, 0x98);
3942 run_bbp_write(sc, 83, (group == 0) ? 0x8a : 0x9a);
3943 }
3944
3945 if (group == 0) {
3946 if (sc->ext_2ghz_lna) {
3947 if (sc->mac_ver >= 0x5390)
3948 run_bbp_write(sc, 75, 0x52);
3949 else {
3950 run_bbp_write(sc, 82, 0x62);
3951 run_bbp_write(sc, 75, 0x46);
3952 }
3953 } else {
3954 if (sc->mac_ver == 0x5592) {
3955 run_bbp_write(sc, 79, 0x1c);
3956 run_bbp_write(sc, 80, 0x0e);
3957 run_bbp_write(sc, 81, 0x3a);
3958 run_bbp_write(sc, 82, 0x62);
3959
3960 run_bbp_write(sc, 195, 0x80);
3961 run_bbp_write(sc, 196, 0xe0);
3962 run_bbp_write(sc, 195, 0x81);
3963 run_bbp_write(sc, 196, 0x1f);
3964 run_bbp_write(sc, 195, 0x82);
3965 run_bbp_write(sc, 196, 0x38);
3966 run_bbp_write(sc, 195, 0x83);
3967 run_bbp_write(sc, 196, 0x32);
3968 run_bbp_write(sc, 195, 0x85);
3969 run_bbp_write(sc, 196, 0x28);
3970 run_bbp_write(sc, 195, 0x86);
3971 run_bbp_write(sc, 196, 0x19);
3972 } else if (sc->mac_ver >= 0x5390)
3973 run_bbp_write(sc, 75, 0x50);
3974 else {
3975 run_bbp_write(sc, 82,
3976 (sc->mac_ver == 0x3593) ? 0x62 : 0x84);
3977 run_bbp_write(sc, 75, 0x50);
3978 }
3979 }
3980 } else {
3981 if (sc->mac_ver == 0x5592) {
3982 run_bbp_write(sc, 79, 0x18);
3983 run_bbp_write(sc, 80, 0x08);
3984 run_bbp_write(sc, 81, 0x38);
3985 run_bbp_write(sc, 82, 0x92);
3986
3987 run_bbp_write(sc, 195, 0x80);
3988 run_bbp_write(sc, 196, 0xf0);
3989 run_bbp_write(sc, 195, 0x81);
3990 run_bbp_write(sc, 196, 0x1e);
3991 run_bbp_write(sc, 195, 0x82);
3992 run_bbp_write(sc, 196, 0x28);
3993 run_bbp_write(sc, 195, 0x83);
3994 run_bbp_write(sc, 196, 0x20);
3995 run_bbp_write(sc, 195, 0x85);
3996 run_bbp_write(sc, 196, 0x7f);
3997 run_bbp_write(sc, 195, 0x86);
3998 run_bbp_write(sc, 196, 0x7f);
3999 } else if (sc->mac_ver == 0x3572)
4000 run_bbp_write(sc, 82, 0x94);
4001 else
4002 run_bbp_write(sc, 82,
4003 (sc->mac_ver == 0x3593) ? 0x82 : 0xf2);
4004 if (sc->ext_5ghz_lna)
4005 run_bbp_write(sc, 75, 0x46);
4006 else
4007 run_bbp_write(sc, 75, 0x50);
4008 }
4009
4010 run_read(sc, RT2860_TX_BAND_CFG, &tmp);
4011 tmp &= ~(RT2860_5G_BAND_SEL_N | RT2860_5G_BAND_SEL_P);
4012 tmp |= (group == 0) ? RT2860_5G_BAND_SEL_N : RT2860_5G_BAND_SEL_P;
4013 run_write(sc, RT2860_TX_BAND_CFG, tmp);
4014
4015 /* enable appropriate Power Amplifiers and Low Noise Amplifiers */
4016 tmp = RT2860_RFTR_EN | RT2860_TRSW_EN | RT2860_LNA_PE0_EN;
4017 if (sc->mac_ver == 0x3593)
4018 tmp |= 1 << 29 | 1 << 28;
4019 if (sc->nrxchains > 1)
4020 tmp |= RT2860_LNA_PE1_EN;
4021 if (group == 0) { /* 2GHz */
4022 tmp |= RT2860_PA_PE_G0_EN;
4023 if (sc->ntxchains > 1)
4024 tmp |= RT2860_PA_PE_G1_EN;
4025 if (sc->mac_ver == 0x3593) {
4026 if (sc->ntxchains > 2)
4027 tmp |= 1 << 25;
4028 }
4029 } else { /* 5GHz */
4030 tmp |= RT2860_PA_PE_A0_EN;
4031 if (sc->ntxchains > 1)
4032 tmp |= RT2860_PA_PE_A1_EN;
4033 }
4034 if (sc->mac_ver == 0x3572) {
4035 run_rt3070_rf_write(sc, 8, 0x00);
4036 run_write(sc, RT2860_TX_PIN_CFG, tmp);
4037 run_rt3070_rf_write(sc, 8, 0x80);
4038 } else
4039 run_write(sc, RT2860_TX_PIN_CFG, tmp);
4040
4041 if (sc->mac_ver == 0x5592) {
4042 run_bbp_write(sc, 195, 0x8d);
4043 run_bbp_write(sc, 196, 0x1a);
4044 }
4045
4046 if (sc->mac_ver == 0x3593) {
4047 run_read(sc, RT2860_GPIO_CTRL, &tmp);
4048 tmp &= ~0x01010000;
4049 if (group == 0)
4050 tmp |= 0x00010000;
4051 tmp = (tmp & ~0x00009090) | 0x00000090;
4052 run_write(sc, RT2860_GPIO_CTRL, tmp);
4053 }
4054
4055 /* set initial AGC value */
4056 if (group == 0) { /* 2GHz band */
4057 if (sc->mac_ver >= 0x3070)
4058 agc = 0x1c + sc->lna[0] * 2;
4059 else
4060 agc = 0x2e + sc->lna[0];
4061 } else { /* 5GHz band */
4062 if (sc->mac_ver == 0x5592)
4063 agc = 0x24 + sc->lna[group] * 2;
4064 else if (sc->mac_ver == 0x3572 || sc->mac_ver == 0x3593)
4065 agc = 0x22 + (sc->lna[group] * 5) / 3;
4066 else
4067 agc = 0x32 + (sc->lna[group] * 5) / 3;
4068 }
4069 run_set_agc(sc, agc);
4070 }
4071
4072 static void
4073 run_rt2870_set_chan(struct run_softc *sc, u_int chan)
4074 {
4075 const struct rfprog *rfprog = rt2860_rf2850;
4076 uint32_t r2, r3, r4;
4077 int8_t txpow1, txpow2;
4078 int i;
4079
4080 /* find the settings for this channel (we know it exists) */
4081 for (i = 0; rfprog[i].chan != chan; i++);
4082
4083 r2 = rfprog[i].r2;
4084 if (sc->ntxchains == 1)
4085 r2 |= 1 << 14; /* 1T: disable Tx chain 2 */
4086 if (sc->nrxchains == 1)
4087 r2 |= 1 << 17 | 1 << 6; /* 1R: disable Rx chains 2 & 3 */
4088 else if (sc->nrxchains == 2)
4089 r2 |= 1 << 6; /* 2R: disable Rx chain 3 */
4090
4091 /* use Tx power values from EEPROM */
4092 txpow1 = sc->txpow1[i];
4093 txpow2 = sc->txpow2[i];
4094
4095 /* Initialize RF R3 and R4. */
4096 r3 = rfprog[i].r3 & 0xffffc1ff;
4097 r4 = (rfprog[i].r4 & ~(0x001f87c0)) | (sc->freq << 15);
4098 if (chan > 14) {
4099 if (txpow1 >= 0) {
4100 txpow1 = (txpow1 > 0xf) ? (0xf) : (txpow1);
4101 r3 |= (txpow1 << 10) | (1 << 9);
4102 } else {
4103 txpow1 += 7;
4104
4105 /* txpow1 is not possible larger than 15. */
4106 r3 |= (txpow1 << 10);
4107 }
4108 if (txpow2 >= 0) {
4109 txpow2 = (txpow2 > 0xf) ? (0xf) : (txpow2);
4110 r4 |= (txpow2 << 7) | (1 << 6);
4111 } else {
4112 txpow2 += 7;
4113 r4 |= (txpow2 << 7);
4114 }
4115 } else {
4116 /* Set Tx0 power. */
4117 r3 |= (txpow1 << 9);
4118
4119 /* Set frequency offset and Tx1 power. */
4120 r4 |= (txpow2 << 6);
4121 }
4122
4123 run_rt2870_rf_write(sc, rfprog[i].r1);
4124 run_rt2870_rf_write(sc, r2);
4125 run_rt2870_rf_write(sc, r3 & ~(1 << 2));
4126 run_rt2870_rf_write(sc, r4);
4127
4128 run_delay(sc, 10);
4129
4130 run_rt2870_rf_write(sc, rfprog[i].r1);
4131 run_rt2870_rf_write(sc, r2);
4132 run_rt2870_rf_write(sc, r3 | (1 << 2));
4133 run_rt2870_rf_write(sc, r4);
4134
4135 run_delay(sc, 10);
4136
4137 run_rt2870_rf_write(sc, rfprog[i].r1);
4138 run_rt2870_rf_write(sc, r2);
4139 run_rt2870_rf_write(sc, r3 & ~(1 << 2));
4140 run_rt2870_rf_write(sc, r4);
4141 }
4142
4143 static void
4144 run_rt3070_set_chan(struct run_softc *sc, u_int chan)
4145 {
4146 int8_t txpow1, txpow2;
4147 uint8_t rf;
4148 int i;
4149
4150 /* find the settings for this channel (we know it exists) */
4151 for (i = 0; rt2860_rf2850[i].chan != chan; i++);
4152
4153 /* use Tx power values from EEPROM */
4154 txpow1 = sc->txpow1[i];
4155 txpow2 = sc->txpow2[i];
4156
4157 run_rt3070_rf_write(sc, 2, rt3070_freqs[i].n);
4158
4159 /* RT3370/RT3390: RF R3 [7:4] is not reserved bits. */
4160 run_rt3070_rf_read(sc, 3, &rf);
4161 rf = (rf & ~0x0f) | rt3070_freqs[i].k;
4162 run_rt3070_rf_write(sc, 3, rf);
4163
4164 run_rt3070_rf_read(sc, 6, &rf);
4165 rf = (rf & ~0x03) | rt3070_freqs[i].r;
4166 run_rt3070_rf_write(sc, 6, rf);
4167
4168 /* set Tx0 power */
4169 run_rt3070_rf_read(sc, 12, &rf);
4170 rf = (rf & ~0x1f) | txpow1;
4171 run_rt3070_rf_write(sc, 12, rf);
4172
4173 /* set Tx1 power */
4174 run_rt3070_rf_read(sc, 13, &rf);
4175 rf = (rf & ~0x1f) | txpow2;
4176 run_rt3070_rf_write(sc, 13, rf);
4177
4178 run_rt3070_rf_read(sc, 1, &rf);
4179 rf &= ~0xfc;
4180 if (sc->ntxchains == 1)
4181 rf |= 1 << 7 | 1 << 5; /* 1T: disable Tx chains 2 & 3 */
4182 else if (sc->ntxchains == 2)
4183 rf |= 1 << 7; /* 2T: disable Tx chain 3 */
4184 if (sc->nrxchains == 1)
4185 rf |= 1 << 6 | 1 << 4; /* 1R: disable Rx chains 2 & 3 */
4186 else if (sc->nrxchains == 2)
4187 rf |= 1 << 6; /* 2R: disable Rx chain 3 */
4188 run_rt3070_rf_write(sc, 1, rf);
4189
4190 /* set RF offset */
4191 run_rt3070_rf_read(sc, 23, &rf);
4192 rf = (rf & ~0x7f) | sc->freq;
4193 run_rt3070_rf_write(sc, 23, rf);
4194
4195 /* program RF filter */
4196 run_rt3070_rf_read(sc, 24, &rf); /* Tx */
4197 rf = (rf & ~0x3f) | sc->rf24_20mhz;
4198 run_rt3070_rf_write(sc, 24, rf);
4199 run_rt3070_rf_read(sc, 31, &rf); /* Rx */
4200 rf = (rf & ~0x3f) | sc->rf24_20mhz;
4201 run_rt3070_rf_write(sc, 31, rf);
4202
4203 /* enable RF tuning */
4204 run_rt3070_rf_read(sc, 7, &rf);
4205 run_rt3070_rf_write(sc, 7, rf | 0x01);
4206 }
4207
4208 static void
4209 run_rt3572_set_chan(struct run_softc *sc, u_int chan)
4210 {
4211 int8_t txpow1, txpow2;
4212 uint32_t tmp;
4213 uint8_t rf;
4214 int i;
4215
4216 /* find the settings for this channel (we know it exists) */
4217 for (i = 0; rt2860_rf2850[i].chan != chan; i++);
4218
4219 /* use Tx power values from EEPROM */
4220 txpow1 = sc->txpow1[i];
4221 txpow2 = sc->txpow2[i];
4222
4223 if (chan <= 14) {
4224 run_bbp_write(sc, 25, sc->bbp25);
4225 run_bbp_write(sc, 26, sc->bbp26);
4226 } else {
4227 /* enable IQ phase correction */
4228 run_bbp_write(sc, 25, 0x09);
4229 run_bbp_write(sc, 26, 0xff);
4230 }
4231
4232 run_rt3070_rf_write(sc, 2, rt3070_freqs[i].n);
4233 run_rt3070_rf_write(sc, 3, rt3070_freqs[i].k);
4234 run_rt3070_rf_read(sc, 6, &rf);
4235 rf = (rf & ~0x0f) | rt3070_freqs[i].r;
4236 rf |= (chan <= 14) ? 0x08 : 0x04;
4237 run_rt3070_rf_write(sc, 6, rf);
4238
4239 /* set PLL mode */
4240 run_rt3070_rf_read(sc, 5, &rf);
4241 rf &= ~(0x08 | 0x04);
4242 rf |= (chan <= 14) ? 0x04 : 0x08;
4243 run_rt3070_rf_write(sc, 5, rf);
4244
4245 /* set Tx power for chain 0 */
4246 if (chan <= 14)
4247 rf = 0x60 | txpow1;
4248 else
4249 rf = 0xe0 | (txpow1 & 0xc) << 1 | (txpow1 & 0x3);
4250 run_rt3070_rf_write(sc, 12, rf);
4251
4252 /* set Tx power for chain 1 */
4253 if (chan <= 14)
4254 rf = 0x60 | txpow2;
4255 else
4256 rf = 0xe0 | (txpow2 & 0xc) << 1 | (txpow2 & 0x3);
4257 run_rt3070_rf_write(sc, 13, rf);
4258
4259 /* set Tx/Rx streams */
4260 run_rt3070_rf_read(sc, 1, &rf);
4261 rf &= ~0xfc;
4262 if (sc->ntxchains == 1)
4263 rf |= 1 << 7 | 1 << 5; /* 1T: disable Tx chains 2 & 3 */
4264 else if (sc->ntxchains == 2)
4265 rf |= 1 << 7; /* 2T: disable Tx chain 3 */
4266 if (sc->nrxchains == 1)
4267 rf |= 1 << 6 | 1 << 4; /* 1R: disable Rx chains 2 & 3 */
4268 else if (sc->nrxchains == 2)
4269 rf |= 1 << 6; /* 2R: disable Rx chain 3 */
4270 run_rt3070_rf_write(sc, 1, rf);
4271
4272 /* set RF offset */
4273 run_rt3070_rf_read(sc, 23, &rf);
4274 rf = (rf & ~0x7f) | sc->freq;
4275 run_rt3070_rf_write(sc, 23, rf);
4276
4277 /* program RF filter */
4278 rf = sc->rf24_20mhz;
4279 run_rt3070_rf_write(sc, 24, rf); /* Tx */
4280 run_rt3070_rf_write(sc, 31, rf); /* Rx */
4281
4282 /* enable RF tuning */
4283 run_rt3070_rf_read(sc, 7, &rf);
4284 rf = (chan <= 14) ? 0xd8 : ((rf & ~0xc8) | 0x14);
4285 run_rt3070_rf_write(sc, 7, rf);
4286
4287 /* TSSI */
4288 rf = (chan <= 14) ? 0xc3 : 0xc0;
4289 run_rt3070_rf_write(sc, 9, rf);
4290
4291 /* set loop filter 1 */
4292 run_rt3070_rf_write(sc, 10, 0xf1);
4293 /* set loop filter 2 */
4294 run_rt3070_rf_write(sc, 11, (chan <= 14) ? 0xb9 : 0x00);
4295
4296 /* set tx_mx2_ic */
4297 run_rt3070_rf_write(sc, 15, (chan <= 14) ? 0x53 : 0x43);
4298 /* set tx_mx1_ic */
4299 if (chan <= 14)
4300 rf = 0x48 | sc->txmixgain_2ghz;
4301 else
4302 rf = 0x78 | sc->txmixgain_5ghz;
4303 run_rt3070_rf_write(sc, 16, rf);
4304
4305 /* set tx_lo1 */
4306 run_rt3070_rf_write(sc, 17, 0x23);
4307 /* set tx_lo2 */
4308 if (chan <= 14)
4309 rf = 0x93;
4310 else if (chan <= 64)
4311 rf = 0xb7;
4312 else if (chan <= 128)
4313 rf = 0x74;
4314 else
4315 rf = 0x72;
4316 run_rt3070_rf_write(sc, 19, rf);
4317
4318 /* set rx_lo1 */
4319 if (chan <= 14)
4320 rf = 0xb3;
4321 else if (chan <= 64)
4322 rf = 0xf6;
4323 else if (chan <= 128)
4324 rf = 0xf4;
4325 else
4326 rf = 0xf3;
4327 run_rt3070_rf_write(sc, 20, rf);
4328
4329 /* set pfd_delay */
4330 if (chan <= 14)
4331 rf = 0x15;
4332 else if (chan <= 64)
4333 rf = 0x3d;
4334 else
4335 rf = 0x01;
4336 run_rt3070_rf_write(sc, 25, rf);
4337
4338 /* set rx_lo2 */
4339 run_rt3070_rf_write(sc, 26, (chan <= 14) ? 0x85 : 0x87);
4340 /* set ldo_rf_vc */
4341 run_rt3070_rf_write(sc, 27, (chan <= 14) ? 0x00 : 0x01);
4342 /* set drv_cc */
4343 run_rt3070_rf_write(sc, 29, (chan <= 14) ? 0x9b : 0x9f);
4344
4345 run_read(sc, RT2860_GPIO_CTRL, &tmp);
4346 tmp &= ~0x8080;
4347 if (chan <= 14)
4348 tmp |= 0x80;
4349 run_write(sc, RT2860_GPIO_CTRL, tmp);
4350
4351 /* enable RF tuning */
4352 run_rt3070_rf_read(sc, 7, &rf);
4353 run_rt3070_rf_write(sc, 7, rf | 0x01);
4354
4355 run_delay(sc, 2);
4356 }
4357
4358 static void
4359 run_rt3593_set_chan(struct run_softc *sc, u_int chan)
4360 {
4361 int8_t txpow1, txpow2, txpow3;
4362 uint8_t h20mhz, rf;
4363 int i;
4364
4365 /* find the settings for this channel (we know it exists) */
4366 for (i = 0; rt2860_rf2850[i].chan != chan; i++);
4367
4368 /* use Tx power values from EEPROM */
4369 txpow1 = sc->txpow1[i];
4370 txpow2 = sc->txpow2[i];
4371 txpow3 = (sc->ntxchains == 3) ? sc->txpow3[i] : 0;
4372
4373 if (chan <= 14) {
4374 run_bbp_write(sc, 25, sc->bbp25);
4375 run_bbp_write(sc, 26, sc->bbp26);
4376 } else {
4377 /* Enable IQ phase correction. */
4378 run_bbp_write(sc, 25, 0x09);
4379 run_bbp_write(sc, 26, 0xff);
4380 }
4381
4382 run_rt3070_rf_write(sc, 8, rt3070_freqs[i].n);
4383 run_rt3070_rf_write(sc, 9, rt3070_freqs[i].k & 0x0f);
4384 run_rt3070_rf_read(sc, 11, &rf);
4385 rf = (rf & ~0x03) | (rt3070_freqs[i].r & 0x03);
4386 run_rt3070_rf_write(sc, 11, rf);
4387
4388 /* Set pll_idoh. */
4389 run_rt3070_rf_read(sc, 11, &rf);
4390 rf &= ~0x4c;
4391 rf |= (chan <= 14) ? 0x44 : 0x48;
4392 run_rt3070_rf_write(sc, 11, rf);
4393
4394 if (chan <= 14)
4395 rf = txpow1 & 0x1f;
4396 else
4397 rf = 0x40 | ((txpow1 & 0x18) << 1) | (txpow1 & 0x07);
4398 run_rt3070_rf_write(sc, 53, rf);
4399
4400 if (chan <= 14)
4401 rf = txpow2 & 0x1f;
4402 else
4403 rf = 0x40 | ((txpow2 & 0x18) << 1) | (txpow2 & 0x07);
4404 run_rt3070_rf_write(sc, 55, rf);
4405
4406 if (chan <= 14)
4407 rf = txpow3 & 0x1f;
4408 else
4409 rf = 0x40 | ((txpow3 & 0x18) << 1) | (txpow3 & 0x07);
4410 run_rt3070_rf_write(sc, 54, rf);
4411
4412 rf = RT3070_RF_BLOCK | RT3070_PLL_PD;
4413 if (sc->ntxchains == 3)
4414 rf |= RT3070_TX0_PD | RT3070_TX1_PD | RT3070_TX2_PD;
4415 else
4416 rf |= RT3070_TX0_PD | RT3070_TX1_PD;
4417 rf |= RT3070_RX0_PD | RT3070_RX1_PD | RT3070_RX2_PD;
4418 run_rt3070_rf_write(sc, 1, rf);
4419
4420 run_adjust_freq_offset(sc);
4421
4422 run_rt3070_rf_write(sc, 31, (chan <= 14) ? 0xa0 : 0x80);
4423
4424 h20mhz = (sc->rf24_20mhz & 0x20) >> 5;
4425 run_rt3070_rf_read(sc, 30, &rf);
4426 rf = (rf & ~0x06) | (h20mhz << 1) | (h20mhz << 2);
4427 run_rt3070_rf_write(sc, 30, rf);
4428
4429 run_rt3070_rf_read(sc, 36, &rf);
4430 if (chan <= 14)
4431 rf |= 0x80;
4432 else
4433 rf &= ~0x80;
4434 run_rt3070_rf_write(sc, 36, rf);
4435
4436 /* Set vcolo_bs. */
4437 run_rt3070_rf_write(sc, 34, (chan <= 14) ? 0x3c : 0x20);
4438 /* Set pfd_delay. */
4439 run_rt3070_rf_write(sc, 12, (chan <= 14) ? 0x1a : 0x12);
4440
4441 /* Set vco bias current control. */
4442 run_rt3070_rf_read(sc, 6, &rf);
4443 rf &= ~0xc0;
4444 if (chan <= 14)
4445 rf |= 0x40;
4446 else if (chan <= 128)
4447 rf |= 0x80;
4448 else
4449 rf |= 0x40;
4450 run_rt3070_rf_write(sc, 6, rf);
4451
4452 run_rt3070_rf_read(sc, 30, &rf);
4453 rf = (rf & ~0x18) | 0x10;
4454 run_rt3070_rf_write(sc, 30, rf);
4455
4456 run_rt3070_rf_write(sc, 10, (chan <= 14) ? 0xd3 : 0xd8);
4457 run_rt3070_rf_write(sc, 13, (chan <= 14) ? 0x12 : 0x23);
4458
4459 run_rt3070_rf_read(sc, 51, &rf);
4460 rf = (rf & ~0x03) | 0x01;
4461 run_rt3070_rf_write(sc, 51, rf);
4462 /* Set tx_mx1_cc. */
4463 run_rt3070_rf_read(sc, 51, &rf);
4464 rf &= ~0x1c;
4465 rf |= (chan <= 14) ? 0x14 : 0x10;
4466 run_rt3070_rf_write(sc, 51, rf);
4467 /* Set tx_mx1_ic. */
4468 run_rt3070_rf_read(sc, 51, &rf);
4469 rf &= ~0xe0;
4470 rf |= (chan <= 14) ? 0x60 : 0x40;
4471 run_rt3070_rf_write(sc, 51, rf);
4472 /* Set tx_lo1_ic. */
4473 run_rt3070_rf_read(sc, 49, &rf);
4474 rf &= ~0x1c;
4475 rf |= (chan <= 14) ? 0x0c : 0x08;
4476 run_rt3070_rf_write(sc, 49, rf);
4477 /* Set tx_lo1_en. */
4478 run_rt3070_rf_read(sc, 50, &rf);
4479 run_rt3070_rf_write(sc, 50, rf & ~0x20);
4480 /* Set drv_cc. */
4481 run_rt3070_rf_read(sc, 57, &rf);
4482 rf &= ~0xfc;
4483 rf |= (chan <= 14) ? 0x6c : 0x3c;
4484 run_rt3070_rf_write(sc, 57, rf);
4485 /* Set rx_mix1_ic, rxa_lnactr, lna_vc, lna_inbias_en and lna_en. */
4486 run_rt3070_rf_write(sc, 44, (chan <= 14) ? 0x93 : 0x9b);
4487 /* Set drv_gnd_a, tx_vga_cc_a and tx_mx2_gain. */
4488 run_rt3070_rf_write(sc, 52, (chan <= 14) ? 0x45 : 0x05);
4489 /* Enable VCO calibration. */
4490 run_rt3070_rf_read(sc, 3, &rf);
4491 rf &= ~RT5390_VCOCAL;
4492 rf |= (chan <= 14) ? RT5390_VCOCAL : 0xbe;
4493 run_rt3070_rf_write(sc, 3, rf);
4494
4495 if (chan <= 14)
4496 rf = 0x23;
4497 else if (chan <= 64)
4498 rf = 0x36;
4499 else if (chan <= 128)
4500 rf = 0x32;
4501 else
4502 rf = 0x30;
4503 run_rt3070_rf_write(sc, 39, rf);
4504 if (chan <= 14)
4505 rf = 0xbb;
4506 else if (chan <= 64)
4507 rf = 0xeb;
4508 else if (chan <= 128)
4509 rf = 0xb3;
4510 else
4511 rf = 0x9b;
4512 run_rt3070_rf_write(sc, 45, rf);
4513
4514 /* Set FEQ/AEQ control. */
4515 run_bbp_write(sc, 105, 0x34);
4516 }
4517
4518 static void
4519 run_rt5390_set_chan(struct run_softc *sc, u_int chan)
4520 {
4521 int8_t txpow1, txpow2;
4522 uint8_t rf;
4523 int i;
4524
4525 /* find the settings for this channel (we know it exists) */
4526 for (i = 0; rt2860_rf2850[i].chan != chan; i++);
4527
4528 /* use Tx power values from EEPROM */
4529 txpow1 = sc->txpow1[i];
4530 txpow2 = sc->txpow2[i];
4531
4532 run_rt3070_rf_write(sc, 8, rt3070_freqs[i].n);
4533 run_rt3070_rf_write(sc, 9, rt3070_freqs[i].k & 0x0f);
4534 run_rt3070_rf_read(sc, 11, &rf);
4535 rf = (rf & ~0x03) | (rt3070_freqs[i].r & 0x03);
4536 run_rt3070_rf_write(sc, 11, rf);
4537
4538 run_rt3070_rf_read(sc, 49, &rf);
4539 rf = (rf & ~0x3f) | (txpow1 & 0x3f);
4540 /* The valid range of the RF R49 is 0x00 to 0x27. */
4541 if ((rf & 0x3f) > 0x27)
4542 rf = (rf & ~0x3f) | 0x27;
4543 run_rt3070_rf_write(sc, 49, rf);
4544
4545 if (sc->mac_ver == 0x5392) {
4546 run_rt3070_rf_read(sc, 50, &rf);
4547 rf = (rf & ~0x3f) | (txpow2 & 0x3f);
4548 /* The valid range of the RF R50 is 0x00 to 0x27. */
4549 if ((rf & 0x3f) > 0x27)
4550 rf = (rf & ~0x3f) | 0x27;
4551 run_rt3070_rf_write(sc, 50, rf);
4552 }
4553
4554 run_rt3070_rf_read(sc, 1, &rf);
4555 rf |= RT3070_RF_BLOCK | RT3070_PLL_PD | RT3070_RX0_PD | RT3070_TX0_PD;
4556 if (sc->mac_ver == 0x5392)
4557 rf |= RT3070_RX1_PD | RT3070_TX1_PD;
4558 run_rt3070_rf_write(sc, 1, rf);
4559
4560 if (sc->mac_ver != 0x5392) {
4561 run_rt3070_rf_read(sc, 2, &rf);
4562 rf |= 0x80;
4563 run_rt3070_rf_write(sc, 2, rf);
4564 run_delay(sc, 10);
4565 rf &= 0x7f;
4566 run_rt3070_rf_write(sc, 2, rf);
4567 }
4568
4569 run_adjust_freq_offset(sc);
4570
4571 if (sc->mac_ver == 0x5392) {
4572 /* Fix for RT5392C. */
4573 if (sc->mac_rev >= 0x0223) {
4574 if (chan <= 4)
4575 rf = 0x0f;
4576 else if (chan >= 5 && chan <= 7)
4577 rf = 0x0e;
4578 else
4579 rf = 0x0d;
4580 run_rt3070_rf_write(sc, 23, rf);
4581
4582 if (chan <= 4)
4583 rf = 0x0c;
4584 else if (chan == 5)
4585 rf = 0x0b;
4586 else if (chan >= 6 && chan <= 7)
4587 rf = 0x0a;
4588 else if (chan >= 8 && chan <= 10)
4589 rf = 0x09;
4590 else
4591 rf = 0x08;
4592 run_rt3070_rf_write(sc, 59, rf);
4593 } else {
4594 if (chan <= 11)
4595 rf = 0x0f;
4596 else
4597 rf = 0x0b;
4598 run_rt3070_rf_write(sc, 59, rf);
4599 }
4600 } else {
4601 /* Fix for RT5390F. */
4602 if (sc->mac_rev >= 0x0502) {
4603 if (chan <= 11)
4604 rf = 0x43;
4605 else
4606 rf = 0x23;
4607 run_rt3070_rf_write(sc, 55, rf);
4608
4609 if (chan <= 11)
4610 rf = 0x0f;
4611 else if (chan == 12)
4612 rf = 0x0d;
4613 else
4614 rf = 0x0b;
4615 run_rt3070_rf_write(sc, 59, rf);
4616 } else {
4617 run_rt3070_rf_write(sc, 55, 0x44);
4618 run_rt3070_rf_write(sc, 59, 0x8f);
4619 }
4620 }
4621
4622 /* Enable VCO calibration. */
4623 run_rt3070_rf_read(sc, 3, &rf);
4624 rf |= RT5390_VCOCAL;
4625 run_rt3070_rf_write(sc, 3, rf);
4626 }
4627
4628 static void
4629 run_rt5592_set_chan(struct run_softc *sc, u_int chan)
4630 {
4631 const struct rt5592_freqs *freqs;
4632 uint32_t tmp;
4633 uint8_t reg, rf, txpow_bound;
4634 int8_t txpow1, txpow2;
4635 int i;
4636
4637 run_read(sc, RT5592_DEBUG_INDEX, &tmp);
4638 freqs = (tmp & RT5592_SEL_XTAL) ?
4639 rt5592_freqs_40mhz : rt5592_freqs_20mhz;
4640
4641 /* find the settings for this channel (we know it exists) */
4642 for (i = 0; rt2860_rf2850[i].chan != chan; i++, freqs++);
4643
4644 /* use Tx power values from EEPROM */
4645 txpow1 = sc->txpow1[i];
4646 txpow2 = sc->txpow2[i];
4647
4648 run_read(sc, RT3070_LDO_CFG0, &tmp);
4649 tmp &= ~0x1c000000;
4650 if (chan > 14)
4651 tmp |= 0x14000000;
4652 run_write(sc, RT3070_LDO_CFG0, tmp);
4653
4654 /* N setting. */
4655 run_rt3070_rf_write(sc, 8, freqs->n & 0xff);
4656 run_rt3070_rf_read(sc, 9, &rf);
4657 rf &= ~(1 << 4);
4658 rf |= ((freqs->n & 0x0100) >> 8) << 4;
4659 run_rt3070_rf_write(sc, 9, rf);
4660
4661 /* K setting. */
4662 run_rt3070_rf_read(sc, 9, &rf);
4663 rf &= ~0x0f;
4664 rf |= (freqs->k & 0x0f);
4665 run_rt3070_rf_write(sc, 9, rf);
4666
4667 /* Mode setting. */
4668 run_rt3070_rf_read(sc, 11, &rf);
4669 rf &= ~0x0c;
4670 rf |= ((freqs->m - 0x8) & 0x3) << 2;
4671 run_rt3070_rf_write(sc, 11, rf);
4672 run_rt3070_rf_read(sc, 9, &rf);
4673 rf &= ~(1 << 7);
4674 rf |= (((freqs->m - 0x8) & 0x4) >> 2) << 7;
4675 run_rt3070_rf_write(sc, 9, rf);
4676
4677 /* R setting. */
4678 run_rt3070_rf_read(sc, 11, &rf);
4679 rf &= ~0x03;
4680 rf |= (freqs->r - 0x1);
4681 run_rt3070_rf_write(sc, 11, rf);
4682
4683 if (chan <= 14) {
4684 /* Initialize RF registers for 2GHZ. */
4685 for (i = 0; i < nitems(rt5592_2ghz_def_rf); i++) {
4686 run_rt3070_rf_write(sc, rt5592_2ghz_def_rf[i].reg,
4687 rt5592_2ghz_def_rf[i].val);
4688 }
4689
4690 rf = (chan <= 10) ? 0x07 : 0x06;
4691 run_rt3070_rf_write(sc, 23, rf);
4692 run_rt3070_rf_write(sc, 59, rf);
4693
4694 run_rt3070_rf_write(sc, 55, 0x43);
4695
4696 /*
4697 * RF R49/R50 Tx power ALC code.
4698 * G-band bit<7:6>=1:0, bit<5:0> range from 0x0 ~ 0x27.
4699 */
4700 reg = 2;
4701 txpow_bound = 0x27;
4702 } else {
4703 /* Initialize RF registers for 5GHZ. */
4704 for (i = 0; i < nitems(rt5592_5ghz_def_rf); i++) {
4705 run_rt3070_rf_write(sc, rt5592_5ghz_def_rf[i].reg,
4706 rt5592_5ghz_def_rf[i].val);
4707 }
4708 for (i = 0; i < nitems(rt5592_chan_5ghz); i++) {
4709 if (chan >= rt5592_chan_5ghz[i].firstchan &&
4710 chan <= rt5592_chan_5ghz[i].lastchan) {
4711 run_rt3070_rf_write(sc, rt5592_chan_5ghz[i].reg,
4712 rt5592_chan_5ghz[i].val);
4713 }
4714 }
4715
4716 /*
4717 * RF R49/R50 Tx power ALC code.
4718 * A-band bit<7:6>=1:1, bit<5:0> range from 0x0 ~ 0x2b.
4719 */
4720 reg = 3;
4721 txpow_bound = 0x2b;
4722 }
4723
4724 /* RF R49 ch0 Tx power ALC code. */
4725 run_rt3070_rf_read(sc, 49, &rf);
4726 rf &= ~0xc0;
4727 rf |= (reg << 6);
4728 rf = (rf & ~0x3f) | (txpow1 & 0x3f);
4729 if ((rf & 0x3f) > txpow_bound)
4730 rf = (rf & ~0x3f) | txpow_bound;
4731 run_rt3070_rf_write(sc, 49, rf);
4732
4733 /* RF R50 ch1 Tx power ALC code. */
4734 run_rt3070_rf_read(sc, 50, &rf);
4735 rf &= ~(1 << 7 | 1 << 6);
4736 rf |= (reg << 6);
4737 rf = (rf & ~0x3f) | (txpow2 & 0x3f);
4738 if ((rf & 0x3f) > txpow_bound)
4739 rf = (rf & ~0x3f) | txpow_bound;
4740 run_rt3070_rf_write(sc, 50, rf);
4741
4742 /* Enable RF_BLOCK, PLL_PD, RX0_PD, and TX0_PD. */
4743 run_rt3070_rf_read(sc, 1, &rf);
4744 rf |= (RT3070_RF_BLOCK | RT3070_PLL_PD | RT3070_RX0_PD | RT3070_TX0_PD);
4745 if (sc->ntxchains > 1)
4746 rf |= RT3070_TX1_PD;
4747 if (sc->nrxchains > 1)
4748 rf |= RT3070_RX1_PD;
4749 run_rt3070_rf_write(sc, 1, rf);
4750
4751 run_rt3070_rf_write(sc, 6, 0xe4);
4752
4753 run_rt3070_rf_write(sc, 30, 0x10);
4754 run_rt3070_rf_write(sc, 31, 0x80);
4755 run_rt3070_rf_write(sc, 32, 0x80);
4756
4757 run_adjust_freq_offset(sc);
4758
4759 /* Enable VCO calibration. */
4760 run_rt3070_rf_read(sc, 3, &rf);
4761 rf |= RT5390_VCOCAL;
4762 run_rt3070_rf_write(sc, 3, rf);
4763 }
4764
4765 static void
4766 run_set_rx_antenna(struct run_softc *sc, int aux)
4767 {
4768 uint32_t tmp;
4769 uint8_t bbp152;
4770
4771 if (aux) {
4772 if (sc->rf_rev == RT5390_RF_5370) {
4773 run_bbp_read(sc, 152, &bbp152);
4774 run_bbp_write(sc, 152, bbp152 & ~0x80);
4775 } else {
4776 run_mcu_cmd(sc, RT2860_MCU_CMD_ANTSEL, 0);
4777 run_read(sc, RT2860_GPIO_CTRL, &tmp);
4778 run_write(sc, RT2860_GPIO_CTRL, (tmp & ~0x0808) | 0x08);
4779 }
4780 } else {
4781 if (sc->rf_rev == RT5390_RF_5370) {
4782 run_bbp_read(sc, 152, &bbp152);
4783 run_bbp_write(sc, 152, bbp152 | 0x80);
4784 } else {
4785 run_mcu_cmd(sc, RT2860_MCU_CMD_ANTSEL, 1);
4786 run_read(sc, RT2860_GPIO_CTRL, &tmp);
4787 run_write(sc, RT2860_GPIO_CTRL, tmp & ~0x0808);
4788 }
4789 }
4790 }
4791
4792 static int
4793 run_set_chan(struct run_softc *sc, struct ieee80211_channel *c)
4794 {
4795 struct ieee80211com *ic = sc->sc_ifp->if_l2com;
4796 u_int chan, group;
4797
4798 chan = ieee80211_chan2ieee(ic, c);
4799 if (chan == 0 || chan == IEEE80211_CHAN_ANY)
4800 return (EINVAL);
4801
4802 if (sc->mac_ver == 0x5592)
4803 run_rt5592_set_chan(sc, chan);
4804 else if (sc->mac_ver >= 0x5390)
4805 run_rt5390_set_chan(sc, chan);
4806 else if (sc->mac_ver == 0x3593)
4807 run_rt3593_set_chan(sc, chan);
4808 else if (sc->mac_ver == 0x3572)
4809 run_rt3572_set_chan(sc, chan);
4810 else if (sc->mac_ver >= 0x3070)
4811 run_rt3070_set_chan(sc, chan);
4812 else
4813 run_rt2870_set_chan(sc, chan);
4814
4815 /* determine channel group */
4816 if (chan <= 14)
4817 group = 0;
4818 else if (chan <= 64)
4819 group = 1;
4820 else if (chan <= 128)
4821 group = 2;
4822 else
4823 group = 3;
4824
4825 /* XXX necessary only when group has changed! */
4826 run_select_chan_group(sc, group);
4827
4828 run_delay(sc, 10);
4829
4830 /* Perform IQ calibration. */
4831 if (sc->mac_ver >= 0x5392)
4832 run_iq_calib(sc, chan);
4833
4834 return (0);
4835 }
4836
4837 static void
4838 run_set_channel(struct ieee80211com *ic)
4839 {
4840 struct run_softc *sc = ic->ic_ifp->if_softc;
4841
4842 RUN_LOCK(sc);
4843 run_set_chan(sc, ic->ic_curchan);
4844 RUN_UNLOCK(sc);
4845
4846 return;
4847 }
4848
4849 static void
4850 run_scan_start(struct ieee80211com *ic)
4851 {
4852 struct run_softc *sc = ic->ic_ifp->if_softc;
4853 uint32_t tmp;
4854
4855 RUN_LOCK(sc);
4856
4857 /* abort TSF synchronization */
4858 run_read(sc, RT2860_BCN_TIME_CFG, &tmp);
4859 run_write(sc, RT2860_BCN_TIME_CFG,
4860 tmp & ~(RT2860_BCN_TX_EN | RT2860_TSF_TIMER_EN |
4861 RT2860_TBTT_TIMER_EN));
4862 run_set_bssid(sc, sc->sc_ifp->if_broadcastaddr);
4863
4864 RUN_UNLOCK(sc);
4865
4866 return;
4867 }
4868
4869 static void
4870 run_scan_end(struct ieee80211com *ic)
4871 {
4872 struct run_softc *sc = ic->ic_ifp->if_softc;
4873
4874 RUN_LOCK(sc);
4875
4876 run_enable_tsf_sync(sc);
4877 /* XXX keep local copy */
4878 run_set_bssid(sc, sc->sc_bssid);
4879
4880 RUN_UNLOCK(sc);
4881
4882 return;
4883 }
4884
4885 /*
4886 * Could be called from ieee80211_node_timeout()
4887 * (non-sleepable thread)
4888 */
4889 static void
4890 run_update_beacon(struct ieee80211vap *vap, int item)
4891 {
4892 struct ieee80211com *ic = vap->iv_ic;
4893 struct run_softc *sc = ic->ic_ifp->if_softc;
4894 struct run_vap *rvp = RUN_VAP(vap);
4895 int mcast = 0;
4896 uint32_t i;
4897
4898 KASSERT(vap != NULL, ("no beacon"));
4899
4900 switch (item) {
4901 case IEEE80211_BEACON_ERP:
4902 run_updateslot(ic->ic_ifp);
4903 break;
4904 case IEEE80211_BEACON_HTINFO:
4905 run_updateprot(ic);
4906 break;
4907 case IEEE80211_BEACON_TIM:
4908 mcast = 1; /*TODO*/
4909 break;
4910 default:
4911 break;
4912 }
4913
4914 setbit(rvp->bo.bo_flags, item);
4915 if (rvp->beacon_mbuf == NULL) {
4916 rvp->beacon_mbuf = ieee80211_beacon_alloc(vap->iv_bss,
4917 &rvp->bo);
4918 if (rvp->beacon_mbuf == NULL)
4919 return;
4920 }
4921 ieee80211_beacon_update(vap->iv_bss, &rvp->bo, rvp->beacon_mbuf, mcast);
4922
4923 i = RUN_CMDQ_GET(&sc->cmdq_store);
4924 DPRINTF("cmdq_store=%d\n", i);
4925 sc->cmdq[i].func = run_update_beacon_cb;
4926 sc->cmdq[i].arg0 = vap;
4927 ieee80211_runtask(ic, &sc->cmdq_task);
4928
4929 return;
4930 }
4931
4932 static void
4933 run_update_beacon_cb(void *arg)
4934 {
4935 struct ieee80211vap *vap = arg;
4936 struct run_vap *rvp = RUN_VAP(vap);
4937 struct ieee80211com *ic = vap->iv_ic;
4938 struct run_softc *sc = ic->ic_ifp->if_softc;
4939 struct rt2860_txwi txwi;
4940 struct mbuf *m;
4941 uint16_t txwisize;
4942 uint8_t ridx;
4943
4944 if (vap->iv_bss->ni_chan == IEEE80211_CHAN_ANYC)
4945 return;
4946 if (ic->ic_bsschan == IEEE80211_CHAN_ANYC)
4947 return;
4948
4949 /*
4950 * No need to call ieee80211_beacon_update(), run_update_beacon()
4951 * is taking care of apropriate calls.
4952 */
4953 if (rvp->beacon_mbuf == NULL) {
4954 rvp->beacon_mbuf = ieee80211_beacon_alloc(vap->iv_bss,
4955 &rvp->bo);
4956 if (rvp->beacon_mbuf == NULL)
4957 return;
4958 }
4959 m = rvp->beacon_mbuf;
4960
4961 memset(&txwi, 0, sizeof(txwi));
4962 txwi.wcid = 0xff;
4963 txwi.len = htole16(m->m_pkthdr.len);
4964
4965 /* send beacons at the lowest available rate */
4966 ridx = (ic->ic_curmode == IEEE80211_MODE_11A) ?
4967 RT2860_RIDX_OFDM6 : RT2860_RIDX_CCK1;
4968 txwi.phy = htole16(rt2860_rates[ridx].mcs);
4969 if (rt2860_rates[ridx].phy == IEEE80211_T_OFDM)
4970 txwi.phy |= htole16(RT2860_PHY_OFDM);
4971 txwi.txop = RT2860_TX_TXOP_HT;
4972 txwi.flags = RT2860_TX_TS;
4973 txwi.xflags = RT2860_TX_NSEQ;
4974
4975 txwisize = (sc->mac_ver == 0x5592) ?
4976 sizeof(txwi) + sizeof(uint32_t) : sizeof(txwi);
4977 run_write_region_1(sc, RT2860_BCN_BASE(rvp->rvp_id), (uint8_t *)&txwi,
4978 txwisize);
4979 run_write_region_1(sc, RT2860_BCN_BASE(rvp->rvp_id) + txwisize,
4980 mtod(m, uint8_t *), (m->m_pkthdr.len + 1) & ~1);
4981 }
4982
4983 static void
4984 run_updateprot(struct ieee80211com *ic)
4985 {
4986 struct run_softc *sc = ic->ic_ifp->if_softc;
4987 uint32_t i;
4988
4989 i = RUN_CMDQ_GET(&sc->cmdq_store);
4990 DPRINTF("cmdq_store=%d\n", i);
4991 sc->cmdq[i].func = run_updateprot_cb;
4992 sc->cmdq[i].arg0 = ic;
4993 ieee80211_runtask(ic, &sc->cmdq_task);
4994 }
4995
4996 static void
4997 run_updateprot_cb(void *arg)
4998 {
4999 struct ieee80211com *ic = arg;
5000 struct run_softc *sc = ic->ic_ifp->if_softc;
5001 uint32_t tmp;
5002
5003 tmp = RT2860_RTSTH_EN | RT2860_PROT_NAV_SHORT | RT2860_TXOP_ALLOW_ALL;
5004 /* setup protection frame rate (MCS code) */
5005 tmp |= (ic->ic_curmode == IEEE80211_MODE_11A) ?
5006 rt2860_rates[RT2860_RIDX_OFDM6].mcs | RT2860_PHY_OFDM :
5007 rt2860_rates[RT2860_RIDX_CCK11].mcs;
5008
5009 /* CCK frames don't require protection */
5010 run_write(sc, RT2860_CCK_PROT_CFG, tmp);
5011 if (ic->ic_flags & IEEE80211_F_USEPROT) {
5012 if (ic->ic_protmode == IEEE80211_PROT_RTSCTS)
5013 tmp |= RT2860_PROT_CTRL_RTS_CTS;
5014 else if (ic->ic_protmode == IEEE80211_PROT_CTSONLY)
5015 tmp |= RT2860_PROT_CTRL_CTS;
5016 }
5017 run_write(sc, RT2860_OFDM_PROT_CFG, tmp);
5018 }
5019
5020 static void
5021 run_usb_timeout_cb(void *arg)
5022 {
5023 struct ieee80211vap *vap = arg;
5024 struct run_softc *sc = vap->iv_ic->ic_ifp->if_softc;
5025
5026 RUN_LOCK_ASSERT(sc, MA_OWNED);
5027
5028 if(vap->iv_state == IEEE80211_S_RUN &&
5029 vap->iv_opmode != IEEE80211_M_STA)
5030 run_reset_livelock(sc);
5031 else if (vap->iv_state == IEEE80211_S_SCAN) {
5032 DPRINTF("timeout caused by scan\n");
5033 /* cancel bgscan */
5034 ieee80211_cancel_scan(vap);
5035 } else
5036 DPRINTF("timeout by unknown cause\n");
5037 }
5038
5039 static void
5040 run_reset_livelock(struct run_softc *sc)
5041 {
5042 uint32_t tmp;
5043
5044 RUN_LOCK_ASSERT(sc, MA_OWNED);
5045
5046 /*
5047 * In IBSS or HostAP modes (when the hardware sends beacons), the MAC
5048 * can run into a livelock and start sending CTS-to-self frames like
5049 * crazy if protection is enabled. Reset MAC/BBP for a while
5050 */
5051 run_read(sc, RT2860_DEBUG, &tmp);
5052 DPRINTFN(3, "debug reg %08x\n", tmp);
5053 if ((tmp & (1 << 29)) && (tmp & (1 << 7 | 1 << 5))) {
5054 DPRINTF("CTS-to-self livelock detected\n");
5055 run_write(sc, RT2860_MAC_SYS_CTRL, RT2860_MAC_SRST);
5056 run_delay(sc, 1);
5057 run_write(sc, RT2860_MAC_SYS_CTRL,
5058 RT2860_MAC_RX_EN | RT2860_MAC_TX_EN);
5059 }
5060 }
5061
5062 static void
5063 run_update_promisc_locked(struct ifnet *ifp)
5064 {
5065 struct run_softc *sc = ifp->if_softc;
5066 uint32_t tmp;
5067
5068 run_read(sc, RT2860_RX_FILTR_CFG, &tmp);
5069
5070 tmp |= RT2860_DROP_UC_NOME;
5071 if (ifp->if_flags & IFF_PROMISC)
5072 tmp &= ~RT2860_DROP_UC_NOME;
5073
5074 run_write(sc, RT2860_RX_FILTR_CFG, tmp);
5075
5076 DPRINTF("%s promiscuous mode\n", (ifp->if_flags & IFF_PROMISC) ?
5077 "entering" : "leaving");
5078 }
5079
5080 static void
5081 run_update_promisc(struct ifnet *ifp)
5082 {
5083 struct run_softc *sc = ifp->if_softc;
5084
5085 if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
5086 return;
5087
5088 RUN_LOCK(sc);
5089 run_update_promisc_locked(ifp);
5090 RUN_UNLOCK(sc);
5091 }
5092
5093 static void
5094 run_enable_tsf_sync(struct run_softc *sc)
5095 {
5096 struct ieee80211com *ic = sc->sc_ifp->if_l2com;
5097 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
5098 uint32_t tmp;
5099
5100 DPRINTF("rvp_id=%d ic_opmode=%d\n", RUN_VAP(vap)->rvp_id,
5101 ic->ic_opmode);
5102
5103 run_read(sc, RT2860_BCN_TIME_CFG, &tmp);
5104 tmp &= ~0x1fffff;
5105 tmp |= vap->iv_bss->ni_intval * 16;
5106 tmp |= RT2860_TSF_TIMER_EN | RT2860_TBTT_TIMER_EN;
5107
5108 if (ic->ic_opmode == IEEE80211_M_STA) {
5109 /*
5110 * Local TSF is always updated with remote TSF on beacon
5111 * reception.
5112 */
5113 tmp |= 1 << RT2860_TSF_SYNC_MODE_SHIFT;
5114 } else if (ic->ic_opmode == IEEE80211_M_IBSS) {
5115 tmp |= RT2860_BCN_TX_EN;
5116 /*
5117 * Local TSF is updated with remote TSF on beacon reception
5118 * only if the remote TSF is greater than local TSF.
5119 */
5120 tmp |= 2 << RT2860_TSF_SYNC_MODE_SHIFT;
5121 } else if (ic->ic_opmode == IEEE80211_M_HOSTAP ||
5122 ic->ic_opmode == IEEE80211_M_MBSS) {
5123 tmp |= RT2860_BCN_TX_EN;
5124 /* SYNC with nobody */
5125 tmp |= 3 << RT2860_TSF_SYNC_MODE_SHIFT;
5126 } else {
5127 DPRINTF("Enabling TSF failed. undefined opmode\n");
5128 return;
5129 }
5130
5131 run_write(sc, RT2860_BCN_TIME_CFG, tmp);
5132 }
5133
5134 static void
5135 run_enable_mrr(struct run_softc *sc)
5136 {
5137 #define CCK(mcs) (mcs)
5138 #define OFDM(mcs) (1 << 3 | (mcs))
5139 run_write(sc, RT2860_LG_FBK_CFG0,
5140 OFDM(6) << 28 | /* 54->48 */
5141 OFDM(5) << 24 | /* 48->36 */
5142 OFDM(4) << 20 | /* 36->24 */
5143 OFDM(3) << 16 | /* 24->18 */
5144 OFDM(2) << 12 | /* 18->12 */
5145 OFDM(1) << 8 | /* 12-> 9 */
5146 OFDM(0) << 4 | /* 9-> 6 */
5147 OFDM(0)); /* 6-> 6 */
5148
5149 run_write(sc, RT2860_LG_FBK_CFG1,
5150 CCK(2) << 12 | /* 11->5.5 */
5151 CCK(1) << 8 | /* 5.5-> 2 */
5152 CCK(0) << 4 | /* 2-> 1 */
5153 CCK(0)); /* 1-> 1 */
5154 #undef OFDM
5155 #undef CCK
5156 }
5157
5158 static void
5159 run_set_txpreamble(struct run_softc *sc)
5160 {
5161 struct ieee80211com *ic = sc->sc_ifp->if_l2com;
5162 uint32_t tmp;
5163
5164 run_read(sc, RT2860_AUTO_RSP_CFG, &tmp);
5165 if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
5166 tmp |= RT2860_CCK_SHORT_EN;
5167 else
5168 tmp &= ~RT2860_CCK_SHORT_EN;
5169 run_write(sc, RT2860_AUTO_RSP_CFG, tmp);
5170 }
5171
5172 static void
5173 run_set_basicrates(struct run_softc *sc)
5174 {
5175 struct ieee80211com *ic = sc->sc_ifp->if_l2com;
5176
5177 /* set basic rates mask */
5178 if (ic->ic_curmode == IEEE80211_MODE_11B)
5179 run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x003);
5180 else if (ic->ic_curmode == IEEE80211_MODE_11A)
5181 run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x150);
5182 else /* 11g */
5183 run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x15f);
5184 }
5185
5186 static void
5187 run_set_leds(struct run_softc *sc, uint16_t which)
5188 {
5189 (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LEDS,
5190 which | (sc->leds & 0x7f));
5191 }
5192
5193 static void
5194 run_set_bssid(struct run_softc *sc, const uint8_t *bssid)
5195 {
5196 run_write(sc, RT2860_MAC_BSSID_DW0,
5197 bssid[0] | bssid[1] << 8 | bssid[2] << 16 | bssid[3] << 24);
5198 run_write(sc, RT2860_MAC_BSSID_DW1,
5199 bssid[4] | bssid[5] << 8);
5200 }
5201
5202 static void
5203 run_set_macaddr(struct run_softc *sc, const uint8_t *addr)
5204 {
5205 run_write(sc, RT2860_MAC_ADDR_DW0,
5206 addr[0] | addr[1] << 8 | addr[2] << 16 | addr[3] << 24);
5207 run_write(sc, RT2860_MAC_ADDR_DW1,
5208 addr[4] | addr[5] << 8 | 0xff << 16);
5209 }
5210
5211 static void
5212 run_updateslot(struct ifnet *ifp)
5213 {
5214 struct run_softc *sc = ifp->if_softc;
5215 struct ieee80211com *ic = ifp->if_l2com;
5216 uint32_t i;
5217
5218 i = RUN_CMDQ_GET(&sc->cmdq_store);
5219 DPRINTF("cmdq_store=%d\n", i);
5220 sc->cmdq[i].func = run_updateslot_cb;
5221 sc->cmdq[i].arg0 = ifp;
5222 ieee80211_runtask(ic, &sc->cmdq_task);
5223
5224 return;
5225 }
5226
5227 /* ARGSUSED */
5228 static void
5229 run_updateslot_cb(void *arg)
5230 {
5231 struct ifnet *ifp = arg;
5232 struct run_softc *sc = ifp->if_softc;
5233 struct ieee80211com *ic = ifp->if_l2com;
5234 uint32_t tmp;
5235
5236 run_read(sc, RT2860_BKOFF_SLOT_CFG, &tmp);
5237 tmp &= ~0xff;
5238 tmp |= (ic->ic_flags & IEEE80211_F_SHSLOT) ? 9 : 20;
5239 run_write(sc, RT2860_BKOFF_SLOT_CFG, tmp);
5240 }
5241
5242 static void
5243 run_update_mcast(struct ifnet *ifp)
5244 {
5245 /* h/w filter supports getting everything or nothing */
5246 ifp->if_flags |= IFF_ALLMULTI;
5247 }
5248
5249 static int8_t
5250 run_rssi2dbm(struct run_softc *sc, uint8_t rssi, uint8_t rxchain)
5251 {
5252 struct ieee80211com *ic = sc->sc_ifp->if_l2com;
5253 struct ieee80211_channel *c = ic->ic_curchan;
5254 int delta;
5255
5256 if (IEEE80211_IS_CHAN_5GHZ(c)) {
5257 u_int chan = ieee80211_chan2ieee(ic, c);
5258 delta = sc->rssi_5ghz[rxchain];
5259
5260 /* determine channel group */
5261 if (chan <= 64)
5262 delta -= sc->lna[1];
5263 else if (chan <= 128)
5264 delta -= sc->lna[2];
5265 else
5266 delta -= sc->lna[3];
5267 } else
5268 delta = sc->rssi_2ghz[rxchain] - sc->lna[0];
5269
5270 return (-12 - delta - rssi);
5271 }
5272
5273 static void
5274 run_rt5390_bbp_init(struct run_softc *sc)
5275 {
5276 int i;
5277 uint8_t bbp;
5278
5279 /* Apply maximum likelihood detection for 2 stream case. */
5280 run_bbp_read(sc, 105, &bbp);
5281 if (sc->nrxchains > 1)
5282 run_bbp_write(sc, 105, bbp | RT5390_MLD);
5283
5284 /* Avoid data lost and CRC error. */
5285 run_bbp_read(sc, 4, &bbp);
5286 run_bbp_write(sc, 4, bbp | RT5390_MAC_IF_CTRL);
5287
5288 if (sc->mac_ver == 0x5592) {
5289 for (i = 0; i < nitems(rt5592_def_bbp); i++) {
5290 run_bbp_write(sc, rt5592_def_bbp[i].reg,
5291 rt5592_def_bbp[i].val);
5292 }
5293 for (i = 0; i < nitems(rt5592_bbp_r196); i++) {
5294 run_bbp_write(sc, 195, i + 0x80);
5295 run_bbp_write(sc, 196, rt5592_bbp_r196[i]);
5296 }
5297 } else {
5298 for (i = 0; i < nitems(rt5390_def_bbp); i++) {
5299 run_bbp_write(sc, rt5390_def_bbp[i].reg,
5300 rt5390_def_bbp[i].val);
5301 }
5302 }
5303 if (sc->mac_ver == 0x5392) {
5304 run_bbp_write(sc, 88, 0x90);
5305 run_bbp_write(sc, 95, 0x9a);
5306 run_bbp_write(sc, 98, 0x12);
5307 run_bbp_write(sc, 106, 0x12);
5308 run_bbp_write(sc, 134, 0xd0);
5309 run_bbp_write(sc, 135, 0xf6);
5310 run_bbp_write(sc, 148, 0x84);
5311 }
5312
5313 run_bbp_read(sc, 152, &bbp);
5314 run_bbp_write(sc, 152, bbp | 0x80);
5315
5316 /* Fix BBP254 for RT5592C. */
5317 if (sc->mac_ver == 0x5592 && sc->mac_rev >= 0x0221) {
5318 run_bbp_read(sc, 254, &bbp);
5319 run_bbp_write(sc, 254, bbp | 0x80);
5320 }
5321
5322 /* Disable hardware antenna diversity. */
5323 if (sc->mac_ver == 0x5390)
5324 run_bbp_write(sc, 154, 0);
5325
5326 /* Initialize Rx CCK/OFDM frequency offset report. */
5327 run_bbp_write(sc, 142, 1);
5328 run_bbp_write(sc, 143, 57);
5329 }
5330
5331 static int
5332 run_bbp_init(struct run_softc *sc)
5333 {
5334 int i, error, ntries;
5335 uint8_t bbp0;
5336
5337 /* wait for BBP to wake up */
5338 for (ntries = 0; ntries < 20; ntries++) {
5339 if ((error = run_bbp_read(sc, 0, &bbp0)) != 0)
5340 return error;
5341 if (bbp0 != 0 && bbp0 != 0xff)
5342 break;
5343 }
5344 if (ntries == 20)
5345 return (ETIMEDOUT);
5346
5347 /* initialize BBP registers to default values */
5348 if (sc->mac_ver >= 0x5390)
5349 run_rt5390_bbp_init(sc);
5350 else {
5351 for (i = 0; i < nitems(rt2860_def_bbp); i++) {
5352 run_bbp_write(sc, rt2860_def_bbp[i].reg,
5353 rt2860_def_bbp[i].val);
5354 }
5355 }
5356
5357 if (sc->mac_ver == 0x3593) {
5358 run_bbp_write(sc, 79, 0x13);
5359 run_bbp_write(sc, 80, 0x05);
5360 run_bbp_write(sc, 81, 0x33);
5361 run_bbp_write(sc, 86, 0x46);
5362 run_bbp_write(sc, 137, 0x0f);
5363 }
5364
5365 /* fix BBP84 for RT2860E */
5366 if (sc->mac_ver == 0x2860 && sc->mac_rev != 0x0101)
5367 run_bbp_write(sc, 84, 0x19);
5368
5369 if (sc->mac_ver >= 0x3070 && (sc->mac_ver != 0x3593 &&
5370 sc->mac_ver != 0x5592)) {
5371 run_bbp_write(sc, 79, 0x13);
5372 run_bbp_write(sc, 80, 0x05);
5373 run_bbp_write(sc, 81, 0x33);
5374 } else if (sc->mac_ver == 0x2860 && sc->mac_rev == 0x0100) {
5375 run_bbp_write(sc, 69, 0x16);
5376 run_bbp_write(sc, 73, 0x12);
5377 }
5378 return (0);
5379 }
5380
5381 static int
5382 run_rt3070_rf_init(struct run_softc *sc)
5383 {
5384 uint32_t tmp;
5385 uint8_t bbp4, mingain, rf, target;
5386 int i;
5387
5388 run_rt3070_rf_read(sc, 30, &rf);
5389 /* toggle RF R30 bit 7 */
5390 run_rt3070_rf_write(sc, 30, rf | 0x80);
5391 run_delay(sc, 10);
5392 run_rt3070_rf_write(sc, 30, rf & ~0x80);
5393
5394 /* initialize RF registers to default value */
5395 if (sc->mac_ver == 0x3572) {
5396 for (i = 0; i < nitems(rt3572_def_rf); i++) {
5397 run_rt3070_rf_write(sc, rt3572_def_rf[i].reg,
5398 rt3572_def_rf[i].val);
5399 }
5400 } else {
5401 for (i = 0; i < nitems(rt3070_def_rf); i++) {
5402 run_rt3070_rf_write(sc, rt3070_def_rf[i].reg,
5403 rt3070_def_rf[i].val);
5404 }
5405 }
5406
5407 if (sc->mac_ver == 0x3070 && sc->mac_rev < 0x0201) {
5408 /*
5409 * Change voltage from 1.2V to 1.35V for RT3070.
5410 * The DAC issue (RT3070_LDO_CFG0) has been fixed
5411 * in RT3070(F).
5412 */
5413 run_read(sc, RT3070_LDO_CFG0, &tmp);
5414 tmp = (tmp & ~0x0f000000) | 0x0d000000;
5415 run_write(sc, RT3070_LDO_CFG0, tmp);
5416
5417 } else if (sc->mac_ver == 0x3071) {
5418 run_rt3070_rf_read(sc, 6, &rf);
5419 run_rt3070_rf_write(sc, 6, rf | 0x40);
5420 run_rt3070_rf_write(sc, 31, 0x14);
5421
5422 run_read(sc, RT3070_LDO_CFG0, &tmp);
5423 tmp &= ~0x1f000000;
5424 if (sc->mac_rev < 0x0211)
5425 tmp |= 0x0d000000; /* 1.3V */
5426 else
5427 tmp |= 0x01000000; /* 1.2V */
5428 run_write(sc, RT3070_LDO_CFG0, tmp);
5429
5430 /* patch LNA_PE_G1 */
5431 run_read(sc, RT3070_GPIO_SWITCH, &tmp);
5432 run_write(sc, RT3070_GPIO_SWITCH, tmp & ~0x20);
5433
5434 } else if (sc->mac_ver == 0x3572) {
5435 run_rt3070_rf_read(sc, 6, &rf);
5436 run_rt3070_rf_write(sc, 6, rf | 0x40);
5437
5438 /* increase voltage from 1.2V to 1.35V */
5439 run_read(sc, RT3070_LDO_CFG0, &tmp);
5440 tmp = (tmp & ~0x1f000000) | 0x0d000000;
5441 run_write(sc, RT3070_LDO_CFG0, tmp);
5442
5443 if (sc->mac_rev < 0x0211 || !sc->patch_dac) {
5444 run_delay(sc, 1); /* wait for 1msec */
5445 /* decrease voltage back to 1.2V */
5446 tmp = (tmp & ~0x1f000000) | 0x01000000;
5447 run_write(sc, RT3070_LDO_CFG0, tmp);
5448 }
5449 }
5450
5451 /* select 20MHz bandwidth */
5452 run_rt3070_rf_read(sc, 31, &rf);
5453 run_rt3070_rf_write(sc, 31, rf & ~0x20);
5454
5455 /* calibrate filter for 20MHz bandwidth */
5456 sc->rf24_20mhz = 0x1f; /* default value */
5457 target = (sc->mac_ver < 0x3071) ? 0x16 : 0x13;
5458 run_rt3070_filter_calib(sc, 0x07, target, &sc->rf24_20mhz);
5459
5460 /* select 40MHz bandwidth */
5461 run_bbp_read(sc, 4, &bbp4);
5462 run_bbp_write(sc, 4, (bbp4 & ~0x18) | 0x10);
5463 run_rt3070_rf_read(sc, 31, &rf);
5464 run_rt3070_rf_write(sc, 31, rf | 0x20);
5465
5466 /* calibrate filter for 40MHz bandwidth */
5467 sc->rf24_40mhz = 0x2f; /* default value */
5468 target = (sc->mac_ver < 0x3071) ? 0x19 : 0x15;
5469 run_rt3070_filter_calib(sc, 0x27, target, &sc->rf24_40mhz);
5470
5471 /* go back to 20MHz bandwidth */
5472 run_bbp_read(sc, 4, &bbp4);
5473 run_bbp_write(sc, 4, bbp4 & ~0x18);
5474
5475 if (sc->mac_ver == 0x3572) {
5476 /* save default BBP registers 25 and 26 values */
5477 run_bbp_read(sc, 25, &sc->bbp25);
5478 run_bbp_read(sc, 26, &sc->bbp26);
5479 } else if (sc->mac_rev < 0x0201 || sc->mac_rev < 0x0211)
5480 run_rt3070_rf_write(sc, 27, 0x03);
5481
5482 run_read(sc, RT3070_OPT_14, &tmp);
5483 run_write(sc, RT3070_OPT_14, tmp | 1);
5484
5485 if (sc->mac_ver == 0x3070 || sc->mac_ver == 0x3071) {
5486 run_rt3070_rf_read(sc, 17, &rf);
5487 rf &= ~RT3070_TX_LO1;
5488 if ((sc->mac_ver == 0x3070 ||
5489 (sc->mac_ver == 0x3071 && sc->mac_rev >= 0x0211)) &&
5490 !sc->ext_2ghz_lna)
5491 rf |= 0x20; /* fix for long range Rx issue */
5492 mingain = (sc->mac_ver == 0x3070) ? 1 : 2;
5493 if (sc->txmixgain_2ghz >= mingain)
5494 rf = (rf & ~0x7) | sc->txmixgain_2ghz;
5495 run_rt3070_rf_write(sc, 17, rf);
5496 }
5497
5498 if (sc->mac_ver == 0x3071) {
5499 run_rt3070_rf_read(sc, 1, &rf);
5500 rf &= ~(RT3070_RX0_PD | RT3070_TX0_PD);
5501 rf |= RT3070_RF_BLOCK | RT3070_RX1_PD | RT3070_TX1_PD;
5502 run_rt3070_rf_write(sc, 1, rf);
5503
5504 run_rt3070_rf_read(sc, 15, &rf);
5505 run_rt3070_rf_write(sc, 15, rf & ~RT3070_TX_LO2);
5506
5507 run_rt3070_rf_read(sc, 20, &rf);
5508 run_rt3070_rf_write(sc, 20, rf & ~RT3070_RX_LO1);
5509
5510 run_rt3070_rf_read(sc, 21, &rf);
5511 run_rt3070_rf_write(sc, 21, rf & ~RT3070_RX_LO2);
5512 }
5513
5514 if (sc->mac_ver == 0x3070 || sc->mac_ver == 0x3071) {
5515 /* fix Tx to Rx IQ glitch by raising RF voltage */
5516 run_rt3070_rf_read(sc, 27, &rf);
5517 rf &= ~0x77;
5518 if (sc->mac_rev < 0x0211)
5519 rf |= 0x03;
5520 run_rt3070_rf_write(sc, 27, rf);
5521 }
5522 return (0);
5523 }
5524
5525 static void
5526 run_rt3593_rf_init(struct run_softc *sc)
5527 {
5528 uint32_t tmp;
5529 uint8_t rf;
5530 int i;
5531
5532 /* Disable the GPIO bits 4 and 7 for LNA PE control. */
5533 run_read(sc, RT3070_GPIO_SWITCH, &tmp);
5534 tmp &= ~(1 << 4 | 1 << 7);
5535 run_write(sc, RT3070_GPIO_SWITCH, tmp);
5536
5537 /* Initialize RF registers to default value. */
5538 for (i = 0; i < nitems(rt3593_def_rf); i++) {
5539 run_rt3070_rf_write(sc, rt3593_def_rf[i].reg,
5540 rt3593_def_rf[i].val);
5541 }
5542
5543 /* Toggle RF R2 to initiate calibration. */
5544 run_rt3070_rf_write(sc, 2, RT5390_RESCAL);
5545
5546 /* Initialize RF frequency offset. */
5547 run_adjust_freq_offset(sc);
5548
5549 run_rt3070_rf_read(sc, 18, &rf);
5550 run_rt3070_rf_write(sc, 18, rf | RT3593_AUTOTUNE_BYPASS);
5551
5552 /*
5553 * Increase voltage from 1.2V to 1.35V, wait for 1 msec to
5554 * decrease voltage back to 1.2V.
5555 */
5556 run_read(sc, RT3070_LDO_CFG0, &tmp);
5557 tmp = (tmp & ~0x1f000000) | 0x0d000000;
5558 run_write(sc, RT3070_LDO_CFG0, tmp);
5559 run_delay(sc, 1);
5560 tmp = (tmp & ~0x1f000000) | 0x01000000;
5561 run_write(sc, RT3070_LDO_CFG0, tmp);
5562
5563 sc->rf24_20mhz = 0x1f;
5564 sc->rf24_40mhz = 0x2f;
5565
5566 /* Save default BBP registers 25 and 26 values. */
5567 run_bbp_read(sc, 25, &sc->bbp25);
5568 run_bbp_read(sc, 26, &sc->bbp26);
5569
5570 run_read(sc, RT3070_OPT_14, &tmp);
5571 run_write(sc, RT3070_OPT_14, tmp | 1);
5572 }
5573
5574 static void
5575 run_rt5390_rf_init(struct run_softc *sc)
5576 {
5577 uint32_t tmp;
5578 uint8_t rf;
5579 int i;
5580
5581 /* Toggle RF R2 to initiate calibration. */
5582 if (sc->mac_ver == 0x5390) {
5583 run_rt3070_rf_read(sc, 2, &rf);
5584 run_rt3070_rf_write(sc, 2, rf | RT5390_RESCAL);
5585 run_delay(sc, 10);
5586 run_rt3070_rf_write(sc, 2, rf & ~RT5390_RESCAL);
5587 } else {
5588 run_rt3070_rf_write(sc, 2, RT5390_RESCAL);
5589 run_delay(sc, 10);
5590 }
5591
5592 /* Initialize RF registers to default value. */
5593 if (sc->mac_ver == 0x5592) {
5594 for (i = 0; i < nitems(rt5592_def_rf); i++) {
5595 run_rt3070_rf_write(sc, rt5592_def_rf[i].reg,
5596 rt5592_def_rf[i].val);
5597 }
5598 /* Initialize RF frequency offset. */
5599 run_adjust_freq_offset(sc);
5600 } else if (sc->mac_ver == 0x5392) {
5601 for (i = 0; i < nitems(rt5392_def_rf); i++) {
5602 run_rt3070_rf_write(sc, rt5392_def_rf[i].reg,
5603 rt5392_def_rf[i].val);
5604 }
5605 if (sc->mac_rev >= 0x0223) {
5606 run_rt3070_rf_write(sc, 23, 0x0f);
5607 run_rt3070_rf_write(sc, 24, 0x3e);
5608 run_rt3070_rf_write(sc, 51, 0x32);
5609 run_rt3070_rf_write(sc, 53, 0x22);
5610 run_rt3070_rf_write(sc, 56, 0xc1);
5611 run_rt3070_rf_write(sc, 59, 0x0f);
5612 }
5613 } else {
5614 for (i = 0; i < nitems(rt5390_def_rf); i++) {
5615 run_rt3070_rf_write(sc, rt5390_def_rf[i].reg,
5616 rt5390_def_rf[i].val);
5617 }
5618 if (sc->mac_rev >= 0x0502) {
5619 run_rt3070_rf_write(sc, 6, 0xe0);
5620 run_rt3070_rf_write(sc, 25, 0x80);
5621 run_rt3070_rf_write(sc, 46, 0x73);
5622 run_rt3070_rf_write(sc, 53, 0x00);
5623 run_rt3070_rf_write(sc, 56, 0x42);
5624 run_rt3070_rf_write(sc, 61, 0xd1);
5625 }
5626 }
5627
5628 sc->rf24_20mhz = 0x1f; /* default value */
5629 sc->rf24_40mhz = (sc->mac_ver == 0x5592) ? 0 : 0x2f;
5630
5631 if (sc->mac_rev < 0x0211)
5632 run_rt3070_rf_write(sc, 27, 0x3);
5633
5634 run_read(sc, RT3070_OPT_14, &tmp);
5635 run_write(sc, RT3070_OPT_14, tmp | 1);
5636 }
5637
5638 static int
5639 run_rt3070_filter_calib(struct run_softc *sc, uint8_t init, uint8_t target,
5640 uint8_t *val)
5641 {
5642 uint8_t rf22, rf24;
5643 uint8_t bbp55_pb, bbp55_sb, delta;
5644 int ntries;
5645
5646 /* program filter */
5647 run_rt3070_rf_read(sc, 24, &rf24);
5648 rf24 = (rf24 & 0xc0) | init; /* initial filter value */
5649 run_rt3070_rf_write(sc, 24, rf24);
5650
5651 /* enable baseband loopback mode */
5652 run_rt3070_rf_read(sc, 22, &rf22);
5653 run_rt3070_rf_write(sc, 22, rf22 | 0x01);
5654
5655 /* set power and frequency of passband test tone */
5656 run_bbp_write(sc, 24, 0x00);
5657 for (ntries = 0; ntries < 100; ntries++) {
5658 /* transmit test tone */
5659 run_bbp_write(sc, 25, 0x90);
5660 run_delay(sc, 10);
5661 /* read received power */
5662 run_bbp_read(sc, 55, &bbp55_pb);
5663 if (bbp55_pb != 0)
5664 break;
5665 }
5666 if (ntries == 100)
5667 return (ETIMEDOUT);
5668
5669 /* set power and frequency of stopband test tone */
5670 run_bbp_write(sc, 24, 0x06);
5671 for (ntries = 0; ntries < 100; ntries++) {
5672 /* transmit test tone */
5673 run_bbp_write(sc, 25, 0x90);
5674 run_delay(sc, 10);
5675 /* read received power */
5676 run_bbp_read(sc, 55, &bbp55_sb);
5677
5678 delta = bbp55_pb - bbp55_sb;
5679 if (delta > target)
5680 break;
5681
5682 /* reprogram filter */
5683 rf24++;
5684 run_rt3070_rf_write(sc, 24, rf24);
5685 }
5686 if (ntries < 100) {
5687 if (rf24 != init)
5688 rf24--; /* backtrack */
5689 *val = rf24;
5690 run_rt3070_rf_write(sc, 24, rf24);
5691 }
5692
5693 /* restore initial state */
5694 run_bbp_write(sc, 24, 0x00);
5695
5696 /* disable baseband loopback mode */
5697 run_rt3070_rf_read(sc, 22, &rf22);
5698 run_rt3070_rf_write(sc, 22, rf22 & ~0x01);
5699
5700 return (0);
5701 }
5702
5703 static void
5704 run_rt3070_rf_setup(struct run_softc *sc)
5705 {
5706 uint8_t bbp, rf;
5707 int i;
5708
5709 if (sc->mac_ver == 0x3572) {
5710 /* enable DC filter */
5711 if (sc->mac_rev >= 0x0201)
5712 run_bbp_write(sc, 103, 0xc0);
5713
5714 run_bbp_read(sc, 138, &bbp);
5715 if (sc->ntxchains == 1)
5716 bbp |= 0x20; /* turn off DAC1 */
5717 if (sc->nrxchains == 1)
5718 bbp &= ~0x02; /* turn off ADC1 */
5719 run_bbp_write(sc, 138, bbp);
5720
5721 if (sc->mac_rev >= 0x0211) {
5722 /* improve power consumption */
5723 run_bbp_read(sc, 31, &bbp);
5724 run_bbp_write(sc, 31, bbp & ~0x03);
5725 }
5726
5727 run_rt3070_rf_read(sc, 16, &rf);
5728 rf = (rf & ~0x07) | sc->txmixgain_2ghz;
5729 run_rt3070_rf_write(sc, 16, rf);
5730
5731 } else if (sc->mac_ver == 0x3071) {
5732 if (sc->mac_rev >= 0x0211) {
5733 /* enable DC filter */
5734 run_bbp_write(sc, 103, 0xc0);
5735
5736 /* improve power consumption */
5737 run_bbp_read(sc, 31, &bbp);
5738 run_bbp_write(sc, 31, bbp & ~0x03);
5739 }
5740
5741 run_bbp_read(sc, 138, &bbp);
5742 if (sc->ntxchains == 1)
5743 bbp |= 0x20; /* turn off DAC1 */
5744 if (sc->nrxchains == 1)
5745 bbp &= ~0x02; /* turn off ADC1 */
5746 run_bbp_write(sc, 138, bbp);
5747
5748 run_write(sc, RT2860_TX_SW_CFG1, 0);
5749 if (sc->mac_rev < 0x0211) {
5750 run_write(sc, RT2860_TX_SW_CFG2,
5751 sc->patch_dac ? 0x2c : 0x0f);
5752 } else
5753 run_write(sc, RT2860_TX_SW_CFG2, 0);
5754
5755 } else if (sc->mac_ver == 0x3070) {
5756 if (sc->mac_rev >= 0x0201) {
5757 /* enable DC filter */
5758 run_bbp_write(sc, 103, 0xc0);
5759
5760 /* improve power consumption */
5761 run_bbp_read(sc, 31, &bbp);
5762 run_bbp_write(sc, 31, bbp & ~0x03);
5763 }
5764
5765 if (sc->mac_rev < 0x0201) {
5766 run_write(sc, RT2860_TX_SW_CFG1, 0);
5767 run_write(sc, RT2860_TX_SW_CFG2, 0x2c);
5768 } else
5769 run_write(sc, RT2860_TX_SW_CFG2, 0);
5770 }
5771
5772 /* initialize RF registers from ROM for >=RT3071*/
5773 if (sc->mac_ver >= 0x3071) {
5774 for (i = 0; i < 10; i++) {
5775 if (sc->rf[i].reg == 0 || sc->rf[i].reg == 0xff)
5776 continue;
5777 run_rt3070_rf_write(sc, sc->rf[i].reg, sc->rf[i].val);
5778 }
5779 }
5780 }
5781
5782 static void
5783 run_rt3593_rf_setup(struct run_softc *sc)
5784 {
5785 uint8_t bbp, rf;
5786
5787 if (sc->mac_rev >= 0x0211) {
5788 /* Enable DC filter. */
5789 run_bbp_write(sc, 103, 0xc0);
5790 }
5791 run_write(sc, RT2860_TX_SW_CFG1, 0);
5792 if (sc->mac_rev < 0x0211) {
5793 run_write(sc, RT2860_TX_SW_CFG2,
5794 sc->patch_dac ? 0x2c : 0x0f);
5795 } else
5796 run_write(sc, RT2860_TX_SW_CFG2, 0);
5797
5798 run_rt3070_rf_read(sc, 50, &rf);
5799 run_rt3070_rf_write(sc, 50, rf & ~RT3593_TX_LO2);
5800
5801 run_rt3070_rf_read(sc, 51, &rf);
5802 rf = (rf & ~(RT3593_TX_LO1 | 0x0c)) |
5803 ((sc->txmixgain_2ghz & 0x07) << 2);
5804 run_rt3070_rf_write(sc, 51, rf);
5805
5806 run_rt3070_rf_read(sc, 38, &rf);
5807 run_rt3070_rf_write(sc, 38, rf & ~RT5390_RX_LO1);
5808
5809 run_rt3070_rf_read(sc, 39, &rf);
5810 run_rt3070_rf_write(sc, 39, rf & ~RT5390_RX_LO2);
5811
5812 run_rt3070_rf_read(sc, 1, &rf);
5813 run_rt3070_rf_write(sc, 1, rf & ~(RT3070_RF_BLOCK | RT3070_PLL_PD));
5814
5815 run_rt3070_rf_read(sc, 30, &rf);
5816 rf = (rf & ~0x18) | 0x10;
5817 run_rt3070_rf_write(sc, 30, rf);
5818
5819 /* Apply maximum likelihood detection for 2 stream case. */
5820 run_bbp_read(sc, 105, &bbp);
5821 if (sc->nrxchains > 1)
5822 run_bbp_write(sc, 105, bbp | RT5390_MLD);
5823
5824 /* Avoid data lost and CRC error. */
5825 run_bbp_read(sc, 4, &bbp);
5826 run_bbp_write(sc, 4, bbp | RT5390_MAC_IF_CTRL);
5827
5828 run_bbp_write(sc, 92, 0x02);
5829 run_bbp_write(sc, 82, 0x82);
5830 run_bbp_write(sc, 106, 0x05);
5831 run_bbp_write(sc, 104, 0x92);
5832 run_bbp_write(sc, 88, 0x90);
5833 run_bbp_write(sc, 148, 0xc8);
5834 run_bbp_write(sc, 47, 0x48);
5835 run_bbp_write(sc, 120, 0x50);
5836
5837 run_bbp_write(sc, 163, 0x9d);
5838
5839 /* SNR mapping. */
5840 run_bbp_write(sc, 142, 0x06);
5841 run_bbp_write(sc, 143, 0xa0);
5842 run_bbp_write(sc, 142, 0x07);
5843 run_bbp_write(sc, 143, 0xa1);
5844 run_bbp_write(sc, 142, 0x08);
5845 run_bbp_write(sc, 143, 0xa2);
5846
5847 run_bbp_write(sc, 31, 0x08);
5848 run_bbp_write(sc, 68, 0x0b);
5849 run_bbp_write(sc, 105, 0x04);
5850 }
5851
5852 static void
5853 run_rt5390_rf_setup(struct run_softc *sc)
5854 {
5855 uint8_t bbp, rf;
5856
5857 if (sc->mac_rev >= 0x0211) {
5858 /* Enable DC filter. */
5859 run_bbp_write(sc, 103, 0xc0);
5860
5861 if (sc->mac_ver != 0x5592) {
5862 /* Improve power consumption. */
5863 run_bbp_read(sc, 31, &bbp);
5864 run_bbp_write(sc, 31, bbp & ~0x03);
5865 }
5866 }
5867
5868 run_bbp_read(sc, 138, &bbp);
5869 if (sc->ntxchains == 1)
5870 bbp |= 0x20; /* turn off DAC1 */
5871 if (sc->nrxchains == 1)
5872 bbp &= ~0x02; /* turn off ADC1 */
5873 run_bbp_write(sc, 138, bbp);
5874
5875 run_rt3070_rf_read(sc, 38, &rf);
5876 run_rt3070_rf_write(sc, 38, rf & ~RT5390_RX_LO1);
5877
5878 run_rt3070_rf_read(sc, 39, &rf);
5879 run_rt3070_rf_write(sc, 39, rf & ~RT5390_RX_LO2);
5880
5881 /* Avoid data lost and CRC error. */
5882 run_bbp_read(sc, 4, &bbp);
5883 run_bbp_write(sc, 4, bbp | RT5390_MAC_IF_CTRL);
5884
5885 run_rt3070_rf_read(sc, 30, &rf);
5886 rf = (rf & ~0x18) | 0x10;
5887 run_rt3070_rf_write(sc, 30, rf);
5888
5889 if (sc->mac_ver != 0x5592) {
5890 run_write(sc, RT2860_TX_SW_CFG1, 0);
5891 if (sc->mac_rev < 0x0211) {
5892 run_write(sc, RT2860_TX_SW_CFG2,
5893 sc->patch_dac ? 0x2c : 0x0f);
5894 } else
5895 run_write(sc, RT2860_TX_SW_CFG2, 0);
5896 }
5897 }
5898
5899 static int
5900 run_txrx_enable(struct run_softc *sc)
5901 {
5902 struct ieee80211com *ic = sc->sc_ifp->if_l2com;
5903 uint32_t tmp;
5904 int error, ntries;
5905
5906 run_write(sc, RT2860_MAC_SYS_CTRL, RT2860_MAC_TX_EN);
5907 for (ntries = 0; ntries < 200; ntries++) {
5908 if ((error = run_read(sc, RT2860_WPDMA_GLO_CFG, &tmp)) != 0)
5909 return (error);
5910 if ((tmp & (RT2860_TX_DMA_BUSY | RT2860_RX_DMA_BUSY)) == 0)
5911 break;
5912 run_delay(sc, 50);
5913 }
5914 if (ntries == 200)
5915 return (ETIMEDOUT);
5916
5917 run_delay(sc, 50);
5918
5919 tmp |= RT2860_RX_DMA_EN | RT2860_TX_DMA_EN | RT2860_TX_WB_DDONE;
5920 run_write(sc, RT2860_WPDMA_GLO_CFG, tmp);
5921
5922 /* enable Rx bulk aggregation (set timeout and limit) */
5923 tmp = RT2860_USB_TX_EN | RT2860_USB_RX_EN | RT2860_USB_RX_AGG_EN |
5924 RT2860_USB_RX_AGG_TO(128) | RT2860_USB_RX_AGG_LMT(2);
5925 run_write(sc, RT2860_USB_DMA_CFG, tmp);
5926
5927 /* set Rx filter */
5928 tmp = RT2860_DROP_CRC_ERR | RT2860_DROP_PHY_ERR;
5929 if (ic->ic_opmode != IEEE80211_M_MONITOR) {
5930 tmp |= RT2860_DROP_UC_NOME | RT2860_DROP_DUPL |
5931 RT2860_DROP_CTS | RT2860_DROP_BA | RT2860_DROP_ACK |
5932 RT2860_DROP_VER_ERR | RT2860_DROP_CTRL_RSV |
5933 RT2860_DROP_CFACK | RT2860_DROP_CFEND;
5934 if (ic->ic_opmode == IEEE80211_M_STA)
5935 tmp |= RT2860_DROP_RTS | RT2860_DROP_PSPOLL;
5936 }
5937 run_write(sc, RT2860_RX_FILTR_CFG, tmp);
5938
5939 run_write(sc, RT2860_MAC_SYS_CTRL,
5940 RT2860_MAC_RX_EN | RT2860_MAC_TX_EN);
5941
5942 return (0);
5943 }
5944
5945 static void
5946 run_adjust_freq_offset(struct run_softc *sc)
5947 {
5948 uint8_t rf, tmp;
5949
5950 run_rt3070_rf_read(sc, 17, &rf);
5951 tmp = rf;
5952 rf = (rf & ~0x7f) | (sc->freq & 0x7f);
5953 rf = MIN(rf, 0x5f);
5954
5955 if (tmp != rf)
5956 run_mcu_cmd(sc, 0x74, (tmp << 8 ) | rf);
5957 }
5958
5959 static void
5960 run_init_locked(struct run_softc *sc)
5961 {
5962 struct ifnet *ifp = sc->sc_ifp;
5963 struct ieee80211com *ic = ifp->if_l2com;
5964 uint32_t tmp;
5965 uint8_t bbp1, bbp3;
5966 int i;
5967 int ridx;
5968 int ntries;
5969
5970 if (ic->ic_nrunning > 1)
5971 return;
5972
5973 run_stop(sc);
5974
5975 if (run_load_microcode(sc) != 0) {
5976 device_printf(sc->sc_dev, "could not load 8051 microcode\n");
5977 goto fail;
5978 }
5979
5980 for (ntries = 0; ntries < 100; ntries++) {
5981 if (run_read(sc, RT2860_ASIC_VER_ID, &tmp) != 0)
5982 goto fail;
5983 if (tmp != 0 && tmp != 0xffffffff)
5984 break;
5985 run_delay(sc, 10);
5986 }
5987 if (ntries == 100)
5988 goto fail;
5989
5990 for (i = 0; i != RUN_EP_QUEUES; i++)
5991 run_setup_tx_list(sc, &sc->sc_epq[i]);
5992
5993 run_set_macaddr(sc, IF_LLADDR(ifp));
5994
5995 for (ntries = 0; ntries < 100; ntries++) {
5996 if (run_read(sc, RT2860_WPDMA_GLO_CFG, &tmp) != 0)
5997 goto fail;
5998 if ((tmp & (RT2860_TX_DMA_BUSY | RT2860_RX_DMA_BUSY)) == 0)
5999 break;
6000 run_delay(sc, 10);
6001 }
6002 if (ntries == 100) {
6003 device_printf(sc->sc_dev, "timeout waiting for DMA engine\n");
6004 goto fail;
6005 }
6006 tmp &= 0xff0;
6007 tmp |= RT2860_TX_WB_DDONE;
6008 run_write(sc, RT2860_WPDMA_GLO_CFG, tmp);
6009
6010 /* turn off PME_OEN to solve high-current issue */
6011 run_read(sc, RT2860_SYS_CTRL, &tmp);
6012 run_write(sc, RT2860_SYS_CTRL, tmp & ~RT2860_PME_OEN);
6013
6014 run_write(sc, RT2860_MAC_SYS_CTRL,
6015 RT2860_BBP_HRST | RT2860_MAC_SRST);
6016 run_write(sc, RT2860_USB_DMA_CFG, 0);
6017
6018 if (run_reset(sc) != 0) {
6019 device_printf(sc->sc_dev, "could not reset chipset\n");
6020 goto fail;
6021 }
6022
6023 run_write(sc, RT2860_MAC_SYS_CTRL, 0);
6024
6025 /* init Tx power for all Tx rates (from EEPROM) */
6026 for (ridx = 0; ridx < 5; ridx++) {
6027 if (sc->txpow20mhz[ridx] == 0xffffffff)
6028 continue;
6029 run_write(sc, RT2860_TX_PWR_CFG(ridx), sc->txpow20mhz[ridx]);
6030 }
6031
6032 for (i = 0; i < nitems(rt2870_def_mac); i++)
6033 run_write(sc, rt2870_def_mac[i].reg, rt2870_def_mac[i].val);
6034 run_write(sc, RT2860_WMM_AIFSN_CFG, 0x00002273);
6035 run_write(sc, RT2860_WMM_CWMIN_CFG, 0x00002344);
6036 run_write(sc, RT2860_WMM_CWMAX_CFG, 0x000034aa);
6037
6038 if (sc->mac_ver >= 0x5390) {
6039 run_write(sc, RT2860_TX_SW_CFG0,
6040 4 << RT2860_DLY_PAPE_EN_SHIFT | 4);
6041 if (sc->mac_ver >= 0x5392) {
6042 run_write(sc, RT2860_MAX_LEN_CFG, 0x00002fff);
6043 if (sc->mac_ver == 0x5592) {
6044 run_write(sc, RT2860_HT_FBK_CFG1, 0xedcba980);
6045 run_write(sc, RT2860_TXOP_HLDR_ET, 0x00000082);
6046 } else {
6047 run_write(sc, RT2860_HT_FBK_CFG1, 0xedcb4980);
6048 run_write(sc, RT2860_LG_FBK_CFG0, 0xedcba322);
6049 }
6050 }
6051 } else if (sc->mac_ver == 0x3593) {
6052 run_write(sc, RT2860_TX_SW_CFG0,
6053 4 << RT2860_DLY_PAPE_EN_SHIFT | 2);
6054 } else if (sc->mac_ver >= 0x3070) {
6055 /* set delay of PA_PE assertion to 1us (unit of 0.25us) */
6056 run_write(sc, RT2860_TX_SW_CFG0,
6057 4 << RT2860_DLY_PAPE_EN_SHIFT);
6058 }
6059
6060 /* wait while MAC is busy */
6061 for (ntries = 0; ntries < 100; ntries++) {
6062 if (run_read(sc, RT2860_MAC_STATUS_REG, &tmp) != 0)
6063 goto fail;
6064 if (!(tmp & (RT2860_RX_STATUS_BUSY | RT2860_TX_STATUS_BUSY)))
6065 break;
6066 run_delay(sc, 10);
6067 }
6068 if (ntries == 100)
6069 goto fail;
6070
6071 /* clear Host to MCU mailbox */
6072 run_write(sc, RT2860_H2M_BBPAGENT, 0);
6073 run_write(sc, RT2860_H2M_MAILBOX, 0);
6074 run_delay(sc, 10);
6075
6076 if (run_bbp_init(sc) != 0) {
6077 device_printf(sc->sc_dev, "could not initialize BBP\n");
6078 goto fail;
6079 }
6080
6081 /* abort TSF synchronization */
6082 run_read(sc, RT2860_BCN_TIME_CFG, &tmp);
6083 tmp &= ~(RT2860_BCN_TX_EN | RT2860_TSF_TIMER_EN |
6084 RT2860_TBTT_TIMER_EN);
6085 run_write(sc, RT2860_BCN_TIME_CFG, tmp);
6086
6087 /* clear RX WCID search table */
6088 run_set_region_4(sc, RT2860_WCID_ENTRY(0), 0, 512);
6089 /* clear WCID attribute table */
6090 run_set_region_4(sc, RT2860_WCID_ATTR(0), 0, 8 * 32);
6091
6092 /* hostapd sets a key before init. So, don't clear it. */
6093 if (sc->cmdq_key_set != RUN_CMDQ_GO) {
6094 /* clear shared key table */
6095 run_set_region_4(sc, RT2860_SKEY(0, 0), 0, 8 * 32);
6096 /* clear shared key mode */
6097 run_set_region_4(sc, RT2860_SKEY_MODE_0_7, 0, 4);
6098 }
6099
6100 run_read(sc, RT2860_US_CYC_CNT, &tmp);
6101 tmp = (tmp & ~0xff) | 0x1e;
6102 run_write(sc, RT2860_US_CYC_CNT, tmp);
6103
6104 if (sc->mac_rev != 0x0101)
6105 run_write(sc, RT2860_TXOP_CTRL_CFG, 0x0000583f);
6106
6107 run_write(sc, RT2860_WMM_TXOP0_CFG, 0);
6108 run_write(sc, RT2860_WMM_TXOP1_CFG, 48 << 16 | 96);
6109
6110 /* write vendor-specific BBP values (from EEPROM) */
6111 if (sc->mac_ver < 0x3593) {
6112 for (i = 0; i < 10; i++) {
6113 if (sc->bbp[i].reg == 0 || sc->bbp[i].reg == 0xff)
6114 continue;
6115 run_bbp_write(sc, sc->bbp[i].reg, sc->bbp[i].val);
6116 }
6117 }
6118
6119 /* select Main antenna for 1T1R devices */
6120 if (sc->rf_rev == RT3070_RF_3020 || sc->rf_rev == RT5390_RF_5370)
6121 run_set_rx_antenna(sc, 0);
6122
6123 /* send LEDs operating mode to microcontroller */
6124 (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED1, sc->led[0]);
6125 (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED2, sc->led[1]);
6126 (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED3, sc->led[2]);
6127
6128 if (sc->mac_ver >= 0x5390)
6129 run_rt5390_rf_init(sc);
6130 else if (sc->mac_ver == 0x3593)
6131 run_rt3593_rf_init(sc);
6132 else if (sc->mac_ver >= 0x3070)
6133 run_rt3070_rf_init(sc);
6134
6135 /* disable non-existing Rx chains */
6136 run_bbp_read(sc, 3, &bbp3);
6137 bbp3 &= ~(1 << 3 | 1 << 4);
6138 if (sc->nrxchains == 2)
6139 bbp3 |= 1 << 3;
6140 else if (sc->nrxchains == 3)
6141 bbp3 |= 1 << 4;
6142 run_bbp_write(sc, 3, bbp3);
6143
6144 /* disable non-existing Tx chains */
6145 run_bbp_read(sc, 1, &bbp1);
6146 if (sc->ntxchains == 1)
6147 bbp1 &= ~(1 << 3 | 1 << 4);
6148 run_bbp_write(sc, 1, bbp1);
6149
6150 if (sc->mac_ver >= 0x5390)
6151 run_rt5390_rf_setup(sc);
6152 else if (sc->mac_ver == 0x3593)
6153 run_rt3593_rf_setup(sc);
6154 else if (sc->mac_ver >= 0x3070)
6155 run_rt3070_rf_setup(sc);
6156
6157 /* select default channel */
6158 run_set_chan(sc, ic->ic_curchan);
6159
6160 /* setup initial protection mode */
6161 run_updateprot_cb(ic);
6162
6163 /* turn radio LED on */
6164 run_set_leds(sc, RT2860_LED_RADIO);
6165
6166 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
6167 ifp->if_drv_flags |= IFF_DRV_RUNNING;
6168 sc->cmdq_run = RUN_CMDQ_GO;
6169
6170 for (i = 0; i != RUN_N_XFER; i++)
6171 usbd_xfer_set_stall(sc->sc_xfer[i]);
6172
6173 usbd_transfer_start(sc->sc_xfer[RUN_BULK_RX]);
6174
6175 if (run_txrx_enable(sc) != 0)
6176 goto fail;
6177
6178 return;
6179
6180 fail:
6181 run_stop(sc);
6182 }
6183
6184 static void
6185 run_init(void *arg)
6186 {
6187 struct run_softc *sc = arg;
6188 struct ifnet *ifp = sc->sc_ifp;
6189 struct ieee80211com *ic = ifp->if_l2com;
6190
6191 RUN_LOCK(sc);
6192 run_init_locked(sc);
6193 RUN_UNLOCK(sc);
6194
6195 if (ifp->if_drv_flags & IFF_DRV_RUNNING)
6196 ieee80211_start_all(ic);
6197 }
6198
6199 static void
6200 run_stop(void *arg)
6201 {
6202 struct run_softc *sc = (struct run_softc *)arg;
6203 struct ifnet *ifp = sc->sc_ifp;
6204 uint32_t tmp;
6205 int i;
6206 int ntries;
6207
6208 RUN_LOCK_ASSERT(sc, MA_OWNED);
6209
6210 if (ifp->if_drv_flags & IFF_DRV_RUNNING)
6211 run_set_leds(sc, 0); /* turn all LEDs off */
6212
6213 ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
6214
6215 sc->ratectl_run = RUN_RATECTL_OFF;
6216 sc->cmdq_run = sc->cmdq_key_set;
6217
6218 RUN_UNLOCK(sc);
6219
6220 for(i = 0; i < RUN_N_XFER; i++)
6221 usbd_transfer_drain(sc->sc_xfer[i]);
6222
6223 RUN_LOCK(sc);
6224
6225 if (sc->rx_m != NULL) {
6226 m_free(sc->rx_m);
6227 sc->rx_m = NULL;
6228 }
6229
6230 /* Disable Tx/Rx DMA. */
6231 if (run_read(sc, RT2860_WPDMA_GLO_CFG, &tmp) != 0)
6232 return;
6233 tmp &= ~(RT2860_RX_DMA_EN | RT2860_TX_DMA_EN);
6234 run_write(sc, RT2860_WPDMA_GLO_CFG, tmp);
6235
6236 for (ntries = 0; ntries < 100; ntries++) {
6237 if (run_read(sc, RT2860_WPDMA_GLO_CFG, &tmp) != 0)
6238 return;
6239 if ((tmp & (RT2860_TX_DMA_BUSY | RT2860_RX_DMA_BUSY)) == 0)
6240 break;
6241 run_delay(sc, 10);
6242 }
6243 if (ntries == 100) {
6244 device_printf(sc->sc_dev, "timeout waiting for DMA engine\n");
6245 return;
6246 }
6247
6248 /* disable Tx/Rx */
6249 run_read(sc, RT2860_MAC_SYS_CTRL, &tmp);
6250 tmp &= ~(RT2860_MAC_RX_EN | RT2860_MAC_TX_EN);
6251 run_write(sc, RT2860_MAC_SYS_CTRL, tmp);
6252
6253 /* wait for pending Tx to complete */
6254 for (ntries = 0; ntries < 100; ntries++) {
6255 if (run_read(sc, RT2860_TXRXQ_PCNT, &tmp) != 0) {
6256 DPRINTF("Cannot read Tx queue count\n");
6257 break;
6258 }
6259 if ((tmp & RT2860_TX2Q_PCNT_MASK) == 0) {
6260 DPRINTF("All Tx cleared\n");
6261 break;
6262 }
6263 run_delay(sc, 10);
6264 }
6265 if (ntries >= 100)
6266 DPRINTF("There are still pending Tx\n");
6267 run_delay(sc, 10);
6268 run_write(sc, RT2860_USB_DMA_CFG, 0);
6269
6270 run_write(sc, RT2860_MAC_SYS_CTRL, RT2860_BBP_HRST | RT2860_MAC_SRST);
6271 run_write(sc, RT2860_MAC_SYS_CTRL, 0);
6272
6273 for (i = 0; i != RUN_EP_QUEUES; i++)
6274 run_unsetup_tx_list(sc, &sc->sc_epq[i]);
6275 }
6276
6277 static void
6278 run_delay(struct run_softc *sc, u_int ms)
6279 {
6280 usb_pause_mtx(mtx_owned(&sc->sc_mtx) ?
6281 &sc->sc_mtx : NULL, USB_MS_TO_TICKS(ms));
6282 }
6283
6284 static device_method_t run_methods[] = {
6285 /* Device interface */
6286 DEVMETHOD(device_probe, run_match),
6287 DEVMETHOD(device_attach, run_attach),
6288 DEVMETHOD(device_detach, run_detach),
6289 DEVMETHOD_END
6290 };
6291
6292 static driver_t run_driver = {
6293 .name = "run",
6294 .methods = run_methods,
6295 .size = sizeof(struct run_softc)
6296 };
6297
6298 static devclass_t run_devclass;
6299
6300 DRIVER_MODULE(run, uhub, run_driver, run_devclass, run_driver_loaded, NULL);
6301 MODULE_DEPEND(run, wlan, 1, 1, 1);
6302 MODULE_DEPEND(run, usb, 1, 1, 1);
6303 MODULE_DEPEND(run, firmware, 1, 1, 1);
6304 MODULE_VERSION(run, 1);
Cache object: b3fdb0991f2f9a6b57c1c6b191414cf9
|