xref: /netbsd-src/sys/dev/usb/if_run.c (revision c9496f6b604074a9451a67df576a5b423068e71e)
1 /*	$NetBSD: if_run.c,v 1.26 2018/02/01 16:49:34 maxv Exp $	*/
2 /*	$OpenBSD: if_run.c,v 1.90 2012/03/24 15:11:04 jsg Exp $	*/
3 
4 /*-
5  * Copyright (c) 2008-2010 Damien Bergamini <damien.bergamini@free.fr>
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 /*-
21  * Ralink Technology RT2700U/RT2800U/RT3000U chipset driver.
22  * http://www.ralinktech.com/
23  */
24 
25 #include <sys/cdefs.h>
26 __KERNEL_RCSID(0, "$NetBSD: if_run.c,v 1.26 2018/02/01 16:49:34 maxv Exp $");
27 
28 #ifdef _KERNEL_OPT
29 #include "opt_usb.h"
30 #endif
31 
32 #include <sys/param.h>
33 #include <sys/sockio.h>
34 #include <sys/sysctl.h>
35 #include <sys/mbuf.h>
36 #include <sys/kernel.h>
37 #include <sys/socket.h>
38 #include <sys/systm.h>
39 #include <sys/malloc.h>
40 #include <sys/callout.h>
41 #include <sys/module.h>
42 #include <sys/conf.h>
43 #include <sys/device.h>
44 
45 #include <sys/bus.h>
46 #include <machine/endian.h>
47 #include <sys/intr.h>
48 
49 #include <net/bpf.h>
50 #include <net/if.h>
51 #include <net/if_arp.h>
52 #include <net/if_dl.h>
53 #include <net/if_ether.h>
54 #include <net/if_media.h>
55 #include <net/if_types.h>
56 
57 #include <net80211/ieee80211_var.h>
58 #include <net80211/ieee80211_amrr.h>
59 #include <net80211/ieee80211_radiotap.h>
60 
61 #include <dev/firmload.h>
62 
63 #include <dev/usb/usb.h>
64 #include <dev/usb/usbdi.h>
65 #include <dev/usb/usbdivar.h>
66 #include <dev/usb/usbdi_util.h>
67 #include <dev/usb/usbdevs.h>
68 
69 #include <dev/ic/rt2860reg.h>		/* shared with ral(4) */
70 #include <dev/usb/if_runvar.h>
71 
72 #ifdef RUN_DEBUG
73 #define DPRINTF(x)	do { if (run_debug) printf x; } while (0)
74 #define DPRINTFN(n, x)	do { if (run_debug >= (n)) printf x; } while (0)
75 int run_debug = 0;
76 #else
77 #define DPRINTF(x)
78 #define DPRINTFN(n, x)
79 #endif
80 
81 #define IEEE80211_HAS_ADDR4(wh) IEEE80211_IS_DSTODS(wh)
82 
83 #define USB_ID(v, p)	{ USB_VENDOR_##v, USB_PRODUCT_##v##_##p }
84 static const struct usb_devno run_devs[] = {
85 	USB_ID(ABOCOM,		RT2770),
86 	USB_ID(ABOCOM,		RT2870),
87 	USB_ID(ABOCOM,		RT3070),
88 	USB_ID(ABOCOM,		RT3071),
89 	USB_ID(ABOCOM,		RT3072),
90 	USB_ID(ABOCOM2,		RT2870_1),
91 	USB_ID(ACCTON,		RT2770),
92 	USB_ID(ACCTON,		RT2870_1),
93 	USB_ID(ACCTON,		RT2870_2),
94 	USB_ID(ACCTON,		RT2870_3),
95 	USB_ID(ACCTON,		RT2870_4),
96 	USB_ID(ACCTON,		RT2870_5),
97 	USB_ID(ACCTON,		RT3070),
98 	USB_ID(ACCTON,		RT3070_1),
99 	USB_ID(ACCTON,		RT3070_2),
100 	USB_ID(ACCTON,		RT3070_3),
101 	USB_ID(ACCTON,		RT3070_4),
102 	USB_ID(ACCTON,		RT3070_5),
103 	USB_ID(ACCTON,		RT3070_6),
104 	USB_ID(AIRTIES,		RT3070),
105 	USB_ID(AIRTIES,		RT3070_2),
106 	USB_ID(ALLWIN,		RT2070),
107 	USB_ID(ALLWIN,		RT2770),
108 	USB_ID(ALLWIN,		RT2870),
109 	USB_ID(ALLWIN,		RT3070),
110 	USB_ID(ALLWIN,		RT3071),
111 	USB_ID(ALLWIN,		RT3072),
112 	USB_ID(ALLWIN,		RT3572),
113 	USB_ID(AMIGO,		RT2870_1),
114 	USB_ID(AMIGO,		RT2870_2),
115 	USB_ID(AMIT,		CGWLUSB2GNR),
116 	USB_ID(AMIT,		RT2870_1),
117 	USB_ID(AMIT2,		RT2870),
118 	USB_ID(ASUSTEK,		RT2870_1),
119 	USB_ID(ASUSTEK,		RT2870_2),
120 	USB_ID(ASUSTEK,		RT2870_3),
121 	USB_ID(ASUSTEK,		RT2870_4),
122 	USB_ID(ASUSTEK,		RT2870_5),
123 	USB_ID(ASUSTEK,		RT3070),
124 	USB_ID(ASUSTEK,		RT3070_1),
125 	USB_ID(ASUSTEK2,	USBN11),
126 	USB_ID(AZUREWAVE,	RT2870_1),
127 	USB_ID(AZUREWAVE,	RT2870_2),
128 	USB_ID(AZUREWAVE,	RT3070),
129 	USB_ID(AZUREWAVE,	RT3070_2),
130 	USB_ID(AZUREWAVE,	RT3070_3),
131 	USB_ID(AZUREWAVE,	RT3070_4),
132 	USB_ID(AZUREWAVE,	RT3070_5),
133 	USB_ID(BELKIN,		F5D8053V3),
134 	USB_ID(BELKIN,		F5D8055),
135 	USB_ID(BELKIN,		F5D8055V2),
136 	USB_ID(BELKIN,		F6D4050V1),
137 	USB_ID(BELKIN,		F6D4050V2),
138 	USB_ID(BELKIN,		F7D1101V2),
139 	USB_ID(BELKIN,		RT2870_1),
140 	USB_ID(BELKIN,		RT2870_2),
141 	USB_ID(BEWAN,		RT3070),
142 	USB_ID(CISCOLINKSYS,	AE1000),
143 	USB_ID(CISCOLINKSYS,	AM10),
144 	USB_ID(CISCOLINKSYS2,	RT3070),
145 	USB_ID(CISCOLINKSYS3,	RT3070),
146 	USB_ID(CONCEPTRONIC,	RT2870_1),
147 	USB_ID(CONCEPTRONIC,	RT2870_2),
148 	USB_ID(CONCEPTRONIC,	RT2870_3),
149 	USB_ID(CONCEPTRONIC,	RT2870_4),
150 	USB_ID(CONCEPTRONIC,	RT2870_5),
151 	USB_ID(CONCEPTRONIC,	RT2870_6),
152 	USB_ID(CONCEPTRONIC,	RT2870_7),
153 	USB_ID(CONCEPTRONIC,	RT2870_8),
154 	USB_ID(CONCEPTRONIC,	RT3070_1),
155 	USB_ID(CONCEPTRONIC,	RT3070_2),
156 	USB_ID(CONCEPTRONIC,	RT3070_3),
157 	USB_ID(COREGA,		CGWLUSB300GNM),
158 	USB_ID(COREGA,		RT2870_1),
159 	USB_ID(COREGA,		RT2870_2),
160 	USB_ID(COREGA,		RT2870_3),
161 	USB_ID(COREGA,		RT3070),
162 	USB_ID(CYBERTAN,	RT2870),
163 	USB_ID(DLINK,		RT2870),
164 	USB_ID(DLINK,		RT3072),
165 	USB_ID(DLINK2,		DWA130),
166 	USB_ID(DLINK2,		RT2870_1),
167 	USB_ID(DLINK2,		RT2870_2),
168 	USB_ID(DLINK2,		RT3070_1),
169 	USB_ID(DLINK2,		RT3070_2),
170 	USB_ID(DLINK2,		RT3070_3),
171 	USB_ID(DLINK2,		RT3070_4),
172 	USB_ID(DLINK2,		RT3070_5),
173 	USB_ID(DLINK2,		RT3072),
174 	USB_ID(DLINK2,		RT3072_1),
175 	USB_ID(DVICO,		RT3070),
176 	USB_ID(EDIMAX,		EW7717),
177 	USB_ID(EDIMAX,		EW7718),
178 	USB_ID(EDIMAX,		EW7722UTN),
179 	USB_ID(EDIMAX,		RT2870_1),
180 	USB_ID(ENCORE,		RT3070),
181 	USB_ID(ENCORE,		RT3070_2),
182 	USB_ID(ENCORE,		RT3070_3),
183 	USB_ID(GIGABYTE,	GNWB31N),
184 	USB_ID(GIGABYTE,	GNWB32L),
185 	USB_ID(GIGABYTE,	RT2870_1),
186 	USB_ID(GIGASET,		RT3070_1),
187 	USB_ID(GIGASET,		RT3070_2),
188 	USB_ID(GUILLEMOT,	HWNU300),
189 	USB_ID(HAWKING,		HWUN2),
190 	USB_ID(HAWKING,		RT2870_1),
191 	USB_ID(HAWKING,		RT2870_2),
192 	USB_ID(HAWKING,		RT2870_3),
193 	USB_ID(HAWKING,		RT2870_4),
194 	USB_ID(HAWKING,		RT2870_5),
195 	USB_ID(HAWKING,		RT3070),
196 	USB_ID(IODATA,		RT3072_1),
197 	USB_ID(IODATA,		RT3072_2),
198 	USB_ID(IODATA,		RT3072_3),
199 	USB_ID(IODATA,		RT3072_4),
200 	USB_ID(LINKSYS4,	RT3070),
201 	USB_ID(LINKSYS4,	WUSB100),
202 	USB_ID(LINKSYS4,	WUSB54GC_3),
203 	USB_ID(LINKSYS4,	WUSB600N),
204 	USB_ID(LINKSYS4,	WUSB600NV2),
205 	USB_ID(LOGITEC,		LANW300NU2),
206 	USB_ID(LOGITEC,		RT2870_1),
207 	USB_ID(LOGITEC,		RT2870_2),
208 	USB_ID(LOGITEC,		RT2870_3),
209 	USB_ID(LOGITEC,		RT3020),
210 	USB_ID(MELCO,		RT2870_1),
211 	USB_ID(MELCO,		RT2870_2),
212 	USB_ID(MELCO,		WLIUCAG300N),
213 	USB_ID(MELCO,		WLIUCG300N),
214 	USB_ID(MELCO,		WLIUCG301N),
215 	USB_ID(MELCO,		WLIUCGN),
216 	USB_ID(MELCO,		WLIUCGNHP),
217 	USB_ID(MELCO,		WLIUCGNM),
218 	USB_ID(MELCO,		WLIUCGNM2T),
219 	USB_ID(MOTOROLA4,	RT2770),
220 	USB_ID(MOTOROLA4,	RT3070),
221 	USB_ID(MSI,		RT3070),
222 	USB_ID(MSI,		RT3070_2),
223 	USB_ID(MSI,		RT3070_3),
224 	USB_ID(MSI,		RT3070_4),
225 	USB_ID(MSI,		RT3070_5),
226 	USB_ID(MSI,		RT3070_6),
227 	USB_ID(MSI,		RT3070_7),
228 	USB_ID(MSI,		RT3070_8),
229 	USB_ID(MSI,		RT3070_9),
230 	USB_ID(MSI,		RT3070_10),
231 	USB_ID(MSI,		RT3070_11),
232 	USB_ID(MSI,		RT3070_12),
233 	USB_ID(MSI,		RT3070_13),
234 	USB_ID(MSI,		RT3070_14),
235 	USB_ID(MSI,		RT3070_15),
236 	USB_ID(OVISLINK,	RT3071),
237 	USB_ID(OVISLINK,	RT3072),
238 	USB_ID(PARA,		RT3070),
239 	USB_ID(PEGATRON,	RT2870),
240 	USB_ID(PEGATRON,	RT3070),
241 	USB_ID(PEGATRON,	RT3070_2),
242 	USB_ID(PEGATRON,	RT3070_3),
243 	USB_ID(PEGATRON,	RT3072),
244 	USB_ID(PHILIPS,		RT2870),
245 	USB_ID(PLANEX2,		GWUS300MINIS),
246 	USB_ID(PLANEX2,		GWUSMICRO300),
247 	USB_ID(PLANEX2,		GWUSMICRON),
248 	USB_ID(PLANEX2,		GWUS300MINIX),
249 	USB_ID(PLANEX2,		RT3070),
250 	USB_ID(QCOM,		RT2870),
251 	USB_ID(QUANTA,		RT3070),
252 	USB_ID(RALINK,		RT2070),
253 	USB_ID(RALINK,		RT2770),
254 	USB_ID(RALINK,		RT2870),
255 	USB_ID(RALINK,		RT3070),
256 	USB_ID(RALINK,		RT3071),
257 	USB_ID(RALINK,		RT3072),
258 	USB_ID(RALINK,		RT3370),
259 	USB_ID(RALINK,		RT3572),
260 	USB_ID(RALINK,		RT5370),
261 	USB_ID(RALINK,		RT5572),
262 	USB_ID(RALINK,		RT8070),
263 	USB_ID(SAMSUNG,		RT2870_1),
264 	USB_ID(SENAO,		RT2870_1),
265 	USB_ID(SENAO,		RT2870_2),
266 	USB_ID(SENAO,		RT2870_3),
267 	USB_ID(SENAO,		RT2870_4),
268 	USB_ID(SENAO,		RT3070),
269 	USB_ID(SENAO,		RT3071),
270 	USB_ID(SENAO,		RT3072),
271 	USB_ID(SENAO,		RT3072_2),
272 	USB_ID(SENAO,		RT3072_3),
273 	USB_ID(SENAO,		RT3072_4),
274 	USB_ID(SENAO,		RT3072_5),
275 	USB_ID(SITECOMEU,	RT2870_1),
276 	USB_ID(SITECOMEU,	RT2870_2),
277 	USB_ID(SITECOMEU,	RT2870_3),
278 	USB_ID(SITECOMEU,	RT3070_1),
279 	USB_ID(SITECOMEU,	RT3072_3),
280 	USB_ID(SITECOMEU,	RT3072_4),
281 	USB_ID(SITECOMEU,	RT3072_5),
282 	USB_ID(SITECOMEU,	WL302),
283 	USB_ID(SITECOMEU,	WL315),
284 	USB_ID(SITECOMEU,	WL321),
285 	USB_ID(SITECOMEU,	WL324),
286 	USB_ID(SITECOMEU,	WL329),
287 	USB_ID(SITECOMEU,	WL343),
288 	USB_ID(SITECOMEU,	WL344),
289 	USB_ID(SITECOMEU,	WL345),
290 	USB_ID(SITECOMEU,	WL349V4),
291 	USB_ID(SITECOMEU,	WL608),
292 	USB_ID(SITECOMEU,	WLA4000),
293 	USB_ID(SITECOMEU,	WLA5000),
294 	USB_ID(SPARKLAN,	RT2870_1),
295 	USB_ID(SPARKLAN,	RT2870_2),
296 	USB_ID(SPARKLAN,	RT3070),
297 	USB_ID(SWEEX2,		LW153),
298 	USB_ID(SWEEX2,		LW303),
299 	USB_ID(SWEEX2,		LW313),
300 	USB_ID(TOSHIBA,		RT3070),
301 	USB_ID(UMEDIA,		RT2870_1),
302 	USB_ID(UMEDIA,		TEW645UB),
303 	USB_ID(ZCOM,		RT2870_1),
304 	USB_ID(ZCOM,		RT2870_2),
305 	USB_ID(ZINWELL,		RT2870_1),
306 	USB_ID(ZINWELL,		RT2870_2),
307 	USB_ID(ZINWELL,		RT3070),
308 	USB_ID(ZINWELL,		RT3072),
309 	USB_ID(ZINWELL,		RT3072_2),
310 	USB_ID(ZYXEL,		NWD2105),
311 	USB_ID(ZYXEL,		NWD211AN),
312 	USB_ID(ZYXEL,		RT2870_1),
313 	USB_ID(ZYXEL,		RT2870_2),
314 	USB_ID(ZYXEL,		RT3070),
315 };
316 
317 static int		run_match(device_t, cfdata_t, void *);
318 static void		run_attach(device_t, device_t, void *);
319 static int		run_detach(device_t, int);
320 static int		run_activate(device_t, enum devact);
321 
322 CFATTACH_DECL_NEW(run, sizeof(struct run_softc),
323 	run_match, run_attach, run_detach, run_activate);
324 
325 static int		run_alloc_rx_ring(struct run_softc *);
326 static void		run_free_rx_ring(struct run_softc *);
327 static int		run_alloc_tx_ring(struct run_softc *, int);
328 static void		run_free_tx_ring(struct run_softc *, int);
329 static int		run_load_microcode(struct run_softc *);
330 static int		run_reset(struct run_softc *);
331 static int		run_read(struct run_softc *, uint16_t, uint32_t *);
332 static int		run_read_region_1(struct run_softc *, uint16_t,
333 			    uint8_t *, int);
334 static int		run_write_2(struct run_softc *, uint16_t, uint16_t);
335 static int		run_write(struct run_softc *, uint16_t, uint32_t);
336 static int		run_write_region_1(struct run_softc *, uint16_t,
337 			    const uint8_t *, int);
338 static int		run_set_region_4(struct run_softc *, uint16_t,
339 			    uint32_t, int);
340 static int		run_efuse_read(struct run_softc *, uint16_t,
341 			    uint16_t *, int);
342 static int		run_efuse_read_2(struct run_softc *, uint16_t,
343 			    uint16_t *);
344 static int		run_eeprom_read_2(struct run_softc *, uint16_t,
345 			    uint16_t *);
346 static int		run_rt2870_rf_write(struct run_softc *, uint8_t,
347 			    uint32_t);
348 static int		run_rt3070_rf_read(struct run_softc *, uint8_t,
349 			    uint8_t *);
350 static int		run_rt3070_rf_write(struct run_softc *, uint8_t,
351 			    uint8_t);
352 static int		run_bbp_read(struct run_softc *, uint8_t, uint8_t *);
353 static int		run_bbp_write(struct run_softc *, uint8_t, uint8_t);
354 static int		run_mcu_cmd(struct run_softc *, uint8_t, uint16_t);
355 static const char *	run_get_rf(int);
356 static void		run_rt3593_get_txpower(struct run_softc *);
357 static void		run_get_txpower(struct run_softc *);
358 static int		run_read_eeprom(struct run_softc *);
359 static struct ieee80211_node *
360 			run_node_alloc(struct ieee80211_node_table *);
361 static int		run_media_change(struct ifnet *);
362 static void		run_next_scan(void *);
363 static void		run_task(void *);
364 static void		run_do_async(struct run_softc *,
365 			    void (*)(struct run_softc *, void *), void *, int);
366 static int		run_newstate(struct ieee80211com *,
367 			    enum ieee80211_state, int);
368 static void		run_newstate_cb(struct run_softc *, void *);
369 static int		run_updateedca(struct ieee80211com *);
370 static void		run_updateedca_cb(struct run_softc *, void *);
371 #ifdef RUN_HWCRYPTO
372 static int		run_set_key(struct ieee80211com *,
373 			    const struct ieee80211_key *, const uint8_t *);
374 static void		run_set_key_cb(struct run_softc *, void *);
375 static int		run_delete_key(struct ieee80211com *,
376 			    const struct ieee80211_key *);
377 static void		run_delete_key_cb(struct run_softc *, void *);
378 #endif
379 static void		run_calibrate_to(void *);
380 static void		run_calibrate_cb(struct run_softc *, void *);
381 static void		run_newassoc(struct ieee80211_node *, int);
382 static void		run_rx_frame(struct run_softc *, uint8_t *, int);
383 static void		run_rxeof(struct usbd_xfer *, void *,
384 			    usbd_status);
385 static void		run_txeof(struct usbd_xfer *, void *,
386 			    usbd_status);
387 static int		run_tx(struct run_softc *, struct mbuf *,
388 			    struct ieee80211_node *);
389 static void		run_start(struct ifnet *);
390 static void		run_watchdog(struct ifnet *);
391 static int		run_ioctl(struct ifnet *, u_long, void *);
392 static void		run_select_chan_group(struct run_softc *, int);
393 static void		run_iq_calib(struct run_softc *, u_int);
394 static void		run_set_agc(struct run_softc *, uint8_t);
395 static void		run_set_rx_antenna(struct run_softc *, int);
396 static void		run_rt2870_set_chan(struct run_softc *, u_int);
397 static void		run_rt3070_set_chan(struct run_softc *, u_int);
398 static void		run_rt3572_set_chan(struct run_softc *, u_int);
399 static void		run_rt3593_set_chan(struct run_softc *, u_int);
400 static void		run_rt5390_set_chan(struct run_softc *, u_int);
401 static void		run_rt5592_set_chan(struct run_softc *, u_int);
402 static int		run_set_chan(struct run_softc *,
403 			    struct ieee80211_channel *);
404 static void		run_updateprot(struct run_softc *);
405 static void		run_enable_tsf_sync(struct run_softc *);
406 static void		run_enable_mrr(struct run_softc *);
407 static void		run_set_txpreamble(struct run_softc *);
408 static void		run_set_basicrates(struct run_softc *);
409 static void		run_set_leds(struct run_softc *, uint16_t);
410 static void		run_set_bssid(struct run_softc *, const uint8_t *);
411 static void		run_set_macaddr(struct run_softc *, const uint8_t *);
412 static void		run_updateslot(struct ifnet *);
413 static void		run_updateslot_cb(struct run_softc *, void *);
414 static int8_t		run_rssi2dbm(struct run_softc *, uint8_t, uint8_t);
415 static void		run_rt5390_bbp_init(struct run_softc *);
416 static int		run_bbp_init(struct run_softc *);
417 static int		run_rt3070_rf_init(struct run_softc *);
418 static int		run_rt3593_rf_init(struct run_softc *);
419 static int		run_rt5390_rf_init(struct run_softc *);
420 static int		run_rt3070_filter_calib(struct run_softc *, uint8_t,
421 			    uint8_t, uint8_t *);
422 static void		run_rt3070_rf_setup(struct run_softc *);
423 static void		run_rt3593_rf_setup(struct run_softc *);
424 static void		run_rt5390_rf_setup(struct run_softc *);
425 static int		run_txrx_enable(struct run_softc *);
426 static int     		run_adjust_freq_offset(struct run_softc *);
427 static int		run_init(struct ifnet *);
428 static void		run_stop(struct ifnet *, int);
429 #ifndef IEEE80211_STA_ONLY
430 static int		run_setup_beacon(struct run_softc *);
431 #endif
432 
433 static const struct {
434 	uint32_t reg;
435 	uint32_t val;
436 } rt2870_def_mac[] = {
437 	RT2870_DEF_MAC
438 };
439 
440 static const struct {
441 	uint8_t reg;
442 	uint8_t val;
443 } rt2860_def_bbp[] = {
444 	RT2860_DEF_BBP
445 }, rt5390_def_bbp[] = {
446 	RT5390_DEF_BBP
447 }, rt5592_def_bbp[] = {
448 	RT5592_DEF_BBP
449 };
450 
451 /*
452  * Default values for BBP register R196 for RT5592.
453  */
454 static const uint8_t rt5592_bbp_r196[] = {
455 	0xe0, 0x1f, 0x38, 0x32, 0x08, 0x28, 0x19, 0x0a, 0xff, 0x00,
456 	0x16, 0x10, 0x10, 0x0b, 0x36, 0x2c, 0x26, 0x24, 0x42, 0x36,
457 	0x30, 0x2d, 0x4c, 0x46, 0x3d, 0x40, 0x3e, 0x42, 0x3d, 0x40,
458 	0x3c, 0x34, 0x2c, 0x2f, 0x3c, 0x35, 0x2e, 0x2a, 0x49, 0x41,
459 	0x36, 0x31, 0x30, 0x30, 0x0e, 0x0d, 0x28, 0x21, 0x1c, 0x16,
460 	0x50, 0x4a, 0x43, 0x40, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00,
461 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
462 	0x00, 0x00, 0x7d, 0x14, 0x32, 0x2c, 0x36, 0x4c, 0x43, 0x2c,
463 	0x2e, 0x36, 0x30, 0x6e
464 };
465 
466 static const struct rfprog {
467 	uint8_t chan;
468 	uint32_t r1, r2, r3, r4;
469 } rt2860_rf2850[] = {
470 	RT2860_RF2850
471 };
472 
473 static const struct {
474 	uint8_t n, r, k;
475 } rt3070_freqs[] = {
476 	RT3070_RF3052
477 };
478 
479 static const struct rt5592_freqs {
480 	uint16_t n;
481 	uint8_t k, m, r;
482 } rt5592_freqs_20mhz[] = {
483 	RT5592_RF5592_20MHZ
484 },rt5592_freqs_40mhz[] = {
485 	RT5592_RF5592_40MHZ
486 };
487 
488 static const struct {
489 	uint8_t reg;
490 	uint8_t val;
491 } rt3070_def_rf[] = {
492 	RT3070_DEF_RF
493 }, rt3572_def_rf[] = {
494 	RT3572_DEF_RF
495 },rt3593_def_rf[] = {
496 	RT3593_DEF_RF
497 },rt5390_def_rf[] = {
498 	RT5390_DEF_RF
499 },rt5392_def_rf[] = {
500 	RT5392_DEF_RF
501 },rt5592_def_rf[] = {
502 	RT5592_DEF_RF
503 },rt5592_2ghz_def_rf[] = {
504 	RT5592_2GHZ_DEF_RF
505 },rt5592_5ghz_def_rf[] = {
506 	RT5592_5GHZ_DEF_RF
507 };
508 
509 static const struct {
510 	u_int firstchan;
511 	u_int lastchan;
512 	uint8_t reg;
513 	uint8_t val;
514 } rt5592_chan_5ghz[] = {
515 	RT5592_CHAN_5GHZ
516 };
517 
518 static int
519 firmware_load(const char *dname, const char *iname, uint8_t **ucodep,
520     size_t *sizep)
521 {
522 	firmware_handle_t fh;
523 	int error;
524 
525 	if ((error = firmware_open(dname, iname, &fh)) != 0)
526 		return error;
527 	*sizep = firmware_get_size(fh);
528 	if ((*ucodep = firmware_malloc(*sizep)) == NULL) {
529 		firmware_close(fh);
530 		return ENOMEM;
531 	}
532 	if ((error = firmware_read(fh, 0, *ucodep, *sizep)) != 0)
533 		firmware_free(*ucodep, *sizep);
534 	firmware_close(fh);
535 
536 	return error;
537 }
538 
539 static int
540 run_match(device_t parent, cfdata_t match, void *aux)
541 {
542 	struct usb_attach_arg *uaa = aux;
543 
544 	return (usb_lookup(run_devs, uaa->uaa_vendor, uaa->uaa_product) != NULL) ?
545 	    UMATCH_VENDOR_PRODUCT : UMATCH_NONE;
546 }
547 
548 static void
549 run_attach(device_t parent, device_t self, void *aux)
550 {
551 	struct run_softc *sc = device_private(self);
552 	struct usb_attach_arg *uaa = aux;
553 	struct ieee80211com *ic = &sc->sc_ic;
554 	struct ifnet *ifp = &sc->sc_if;
555 	usb_interface_descriptor_t *id;
556 	usb_endpoint_descriptor_t *ed;
557 	char *devinfop;
558 	int i, nrx, ntx, ntries, error;
559 	uint32_t ver;
560 
561 	aprint_naive("\n");
562 	aprint_normal("\n");
563 
564 	sc->sc_dev = self;
565 	sc->sc_udev = uaa->uaa_device;
566 
567 	devinfop = usbd_devinfo_alloc(sc->sc_udev, 0);
568 	aprint_normal_dev(sc->sc_dev, "%s\n", devinfop);
569 	usbd_devinfo_free(devinfop);
570 
571 	error = usbd_set_config_no(sc->sc_udev, 1, 0);
572 	if (error != 0) {
573 		aprint_error_dev(sc->sc_dev, "failed to set configuration"
574 		    ", err=%s\n", usbd_errstr(error));
575 		return;
576 	}
577 
578 	/* get the first interface handle */
579 	error = usbd_device2interface_handle(sc->sc_udev, 0, &sc->sc_iface);
580 	if (error != 0) {
581 		aprint_error_dev(sc->sc_dev,
582 		    "could not get interface handle\n");
583 		return;
584 	}
585 
586 	/*
587 	 * Find all bulk endpoints.  There are 7 bulk endpoints: 1 for RX
588 	 * and 6 for TX (4 EDCAs + HCCA + Prio).
589 	 * Update 03-14-2009:  some devices like the Planex GW-US300MiniS
590 	 * seem to have only 4 TX bulk endpoints (Fukaumi Naoki).
591 	 */
592 	nrx = ntx = 0;
593 	id = usbd_get_interface_descriptor(sc->sc_iface);
594 	for (i = 0; i < id->bNumEndpoints; i++) {
595 		ed = usbd_interface2endpoint_descriptor(sc->sc_iface, i);
596 		if (ed == NULL || UE_GET_XFERTYPE(ed->bmAttributes) != UE_BULK)
597 			continue;
598 
599 		if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN) {
600 			sc->rxq.pipe_no = ed->bEndpointAddress;
601 			nrx++;
602 		} else if (ntx < RUN_MAXEPOUT) {
603 			sc->txq[ntx].pipe_no = ed->bEndpointAddress;
604 			ntx++;
605 		}
606 	}
607 	/* make sure we've got them all */
608 	if (nrx < 1 || ntx < RUN_MAXEPOUT) {
609 		aprint_error_dev(sc->sc_dev, "missing endpoint\n");
610 		return;
611 	}
612 
613 	usb_init_task(&sc->sc_task, run_task, sc, 0);
614 	callout_init(&sc->scan_to, 0);
615 	callout_setfunc(&sc->scan_to, run_next_scan, sc);
616 	callout_init(&sc->calib_to, 0);
617 	callout_setfunc(&sc->calib_to, run_calibrate_to, sc);
618 
619 	sc->amrr.amrr_min_success_threshold =  1;
620 	sc->amrr.amrr_max_success_threshold = 10;
621 
622 	/* wait for the chip to settle */
623 	for (ntries = 0; ntries < 100; ntries++) {
624 		if (run_read(sc, RT2860_ASIC_VER_ID, &ver) != 0)
625 			return;
626 		if (ver != 0 && ver != 0xffffffff)
627 			break;
628 		DELAY(10);
629 	}
630 	if (ntries == 100) {
631 		aprint_error_dev(sc->sc_dev,
632 		    "timeout waiting for NIC to initialize\n");
633 		return;
634 	}
635 	sc->mac_ver = ver >> 16;
636 	sc->mac_rev = ver & 0xffff;
637 
638 	/* retrieve RF rev. no and various other things from EEPROM */
639 	run_read_eeprom(sc);
640 
641 	aprint_error_dev(sc->sc_dev,
642 	    "MAC/BBP RT%04X (rev 0x%04X), RF %s (MIMO %dT%dR), address %s\n",
643 	    sc->mac_ver, sc->mac_rev, run_get_rf(sc->rf_rev), sc->ntxchains,
644 	    sc->nrxchains, ether_sprintf(ic->ic_myaddr));
645 
646 	ic->ic_ifp = ifp;
647 	ic->ic_phytype = IEEE80211_T_OFDM;	/* not only, but not used */
648 	ic->ic_opmode = IEEE80211_M_STA;	/* default to BSS mode */
649 	ic->ic_state = IEEE80211_S_INIT;
650 
651 	/* set device capabilities */
652 	ic->ic_caps =
653 	    IEEE80211_C_MONITOR |	/* monitor mode supported */
654 #ifndef IEEE80211_STA_ONLY
655 	    IEEE80211_C_IBSS |		/* IBSS mode supported */
656 	    IEEE80211_C_HOSTAP |	/* HostAP mode supported */
657 #endif
658 	    IEEE80211_C_SHPREAMBLE |	/* short preamble supported */
659 	    IEEE80211_C_SHSLOT |	/* short slot time supported */
660 #ifdef RUN_HWCRYPTO
661 	    IEEE80211_C_WEP |		/* WEP */
662 	    IEEE80211_C_TKIP |		/* TKIP */
663 	    IEEE80211_C_AES_CCM |	/* AES CCMP */
664 	    IEEE80211_C_TKIPMIC |	/* TKIPMIC */
665 #endif
666 	    IEEE80211_C_WME |		/* WME */
667 	    IEEE80211_C_WPA;		/* WPA/RSN */
668 
669 	if (sc->rf_rev == RT2860_RF_2750 ||
670 	    sc->rf_rev == RT2860_RF_2850 ||
671 	    sc->rf_rev == RT3070_RF_3052 ||
672 	    sc->rf_rev == RT3070_RF_3053 ||
673 	    sc->rf_rev == RT5592_RF_5592) {
674 		/* set supported .11a rates */
675 		ic->ic_sup_rates[IEEE80211_MODE_11A] =
676 		    ieee80211_std_rateset_11a;
677 
678 		/* set supported .11a channels */
679 		for (i = 14; i < (int)__arraycount(rt2860_rf2850); i++) {
680 			uint8_t chan = rt2860_rf2850[i].chan;
681 			ic->ic_channels[chan].ic_freq =
682 			    ieee80211_ieee2mhz(chan, IEEE80211_CHAN_5GHZ);
683 			ic->ic_channels[chan].ic_flags = IEEE80211_CHAN_A;
684 		}
685 	}
686 
687 	/* set supported .11b and .11g rates */
688 	ic->ic_sup_rates[IEEE80211_MODE_11B] = ieee80211_std_rateset_11b;
689 	ic->ic_sup_rates[IEEE80211_MODE_11G] = ieee80211_std_rateset_11g;
690 
691 	/* set supported .11b and .11g channels (1 through 14) */
692 	for (i = 1; i <= 14; i++) {
693 		ic->ic_channels[i].ic_freq =
694 		    ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ);
695 		ic->ic_channels[i].ic_flags =
696 		    IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM |
697 		    IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ;
698 	}
699 
700 	ifp->if_softc = sc;
701 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
702 	ifp->if_init = run_init;
703 	ifp->if_ioctl = run_ioctl;
704 	ifp->if_start = run_start;
705 	ifp->if_watchdog = run_watchdog;
706 	IFQ_SET_READY(&ifp->if_snd);
707 	memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
708 
709 	if_attach(ifp);
710 	ieee80211_ifattach(ic);
711 	ic->ic_node_alloc = run_node_alloc;
712 	ic->ic_newassoc = run_newassoc;
713 	ic->ic_updateslot = run_updateslot;
714 	ic->ic_wme.wme_update = run_updateedca;
715 #ifdef RUN_HWCRYPTO
716 	ic->ic_crypto.cs_key_set = run_set_key;
717 	ic->ic_crypto.cs_key_delete = run_delete_key;
718 #endif
719 	/* override state transition machine */
720 	sc->sc_newstate = ic->ic_newstate;
721 	ic->ic_newstate = run_newstate;
722 	ieee80211_media_init(ic, run_media_change, ieee80211_media_status);
723 
724 	bpf_attach2(ifp, DLT_IEEE802_11_RADIO,
725 	    sizeof(struct ieee80211_frame) + IEEE80211_RADIOTAP_HDRLEN,
726 	    &sc->sc_drvbpf);
727 
728 	sc->sc_rxtap_len = sizeof(sc->sc_rxtapu);
729 	sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len);
730 	sc->sc_rxtap.wr_ihdr.it_present = htole32(RUN_RX_RADIOTAP_PRESENT);
731 
732 	sc->sc_txtap_len = sizeof(sc->sc_txtapu);
733 	sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len);
734 	sc->sc_txtap.wt_ihdr.it_present = htole32(RUN_TX_RADIOTAP_PRESENT);
735 
736 	ieee80211_announce(ic);
737 
738 	usbd_add_drv_event(USB_EVENT_DRIVER_ATTACH, sc->sc_udev, sc->sc_dev);
739 
740 	if (!pmf_device_register(self, NULL, NULL))
741 		aprint_error_dev(self, "couldn't establish power handler\n");
742 }
743 
744 static int
745 run_detach(device_t self, int flags)
746 {
747 	struct run_softc *sc = device_private(self);
748 	struct ifnet *ifp = &sc->sc_if;
749 	struct ieee80211com *ic = &sc->sc_ic;
750 	int s;
751 
752 	if (ifp->if_softc == NULL)
753 		return 0;
754 
755 	pmf_device_deregister(self);
756 
757 	s = splusb();
758 
759 	sc->sc_flags |= RUN_DETACHING;
760 
761 	if (ifp->if_flags & IFF_RUNNING) {
762 		usb_rem_task(sc->sc_udev, &sc->sc_task);
763 		run_stop(ifp, 0);
764 	}
765 
766 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
767 	bpf_detach(ifp);
768 	ieee80211_ifdetach(ic);
769 	if_detach(ifp);
770 
771 	splx(s);
772 
773 	usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->sc_udev, sc->sc_dev);
774 
775 	callout_stop(&sc->scan_to);
776 	callout_stop(&sc->calib_to);
777 
778 	callout_destroy(&sc->scan_to);
779 	callout_destroy(&sc->calib_to);
780 
781 	return 0;
782 }
783 
784 static int
785 run_activate(device_t self, enum devact act)
786 {
787 	struct run_softc *sc = device_private(self);
788 
789 	switch (act) {
790 	case DVACT_DEACTIVATE:
791 		if_deactivate(sc->sc_ic.ic_ifp);
792 		return 0;
793 	default:
794 		return EOPNOTSUPP;
795 	}
796 }
797 
798 static int
799 run_alloc_rx_ring(struct run_softc *sc)
800 {
801 	struct run_rx_ring *rxq = &sc->rxq;
802 	int i, error;
803 
804 	error = usbd_open_pipe(sc->sc_iface, rxq->pipe_no, 0, &rxq->pipeh);
805 	if (error != 0)
806 		goto fail;
807 
808 	for (i = 0; i < RUN_RX_RING_COUNT; i++) {
809 		struct run_rx_data *data = &rxq->data[i];
810 
811 		data->sc = sc;	/* backpointer for callbacks */
812 
813 		error = usbd_create_xfer(sc->rxq.pipeh, RUN_MAX_RXSZ,
814 		    0, 0, &data->xfer);
815 		if (error)
816 			goto fail;
817 
818 		data->buf = usbd_get_buffer(data->xfer);
819 	}
820 	if (error != 0)
821 fail:		run_free_rx_ring(sc);
822 	return error;
823 }
824 
825 static void
826 run_free_rx_ring(struct run_softc *sc)
827 {
828 	struct run_rx_ring *rxq = &sc->rxq;
829 	int i;
830 
831 	if (rxq->pipeh != NULL) {
832 		usbd_abort_pipe(rxq->pipeh);
833 	}
834 	for (i = 0; i < RUN_RX_RING_COUNT; i++) {
835 		if (rxq->data[i].xfer != NULL)
836 			usbd_destroy_xfer(rxq->data[i].xfer);
837 		rxq->data[i].xfer = NULL;
838 	}
839 	if (rxq->pipeh != NULL) {
840 		usbd_close_pipe(rxq->pipeh);
841 		rxq->pipeh = NULL;
842 	}
843 }
844 
845 static int
846 run_alloc_tx_ring(struct run_softc *sc, int qid)
847 {
848 	struct run_tx_ring *txq = &sc->txq[qid];
849 	int i, error;
850 
851 	txq->cur = txq->queued = 0;
852 
853 	error = usbd_open_pipe(sc->sc_iface, txq->pipe_no, 0, &txq->pipeh);
854 	if (error != 0)
855 		goto fail;
856 
857 	for (i = 0; i < RUN_TX_RING_COUNT; i++) {
858 		struct run_tx_data *data = &txq->data[i];
859 
860 		data->sc = sc;	/* backpointer for callbacks */
861 		data->qid = qid;
862 
863 		error = usbd_create_xfer(txq->pipeh, RUN_MAX_TXSZ,
864 		    USBD_FORCE_SHORT_XFER, 0, &data->xfer);
865 		if (error)
866 			goto fail;
867 
868 		data->buf = usbd_get_buffer(data->xfer);
869 		/* zeroize the TXD + TXWI part */
870 		memset(data->buf, 0, sizeof(struct rt2870_txd) +
871 		    sizeof(struct rt2860_txwi));
872 	}
873 	if (error != 0)
874 fail:		run_free_tx_ring(sc, qid);
875 	return error;
876 }
877 
878 static void
879 run_free_tx_ring(struct run_softc *sc, int qid)
880 {
881 	struct run_tx_ring *txq = &sc->txq[qid];
882 	int i;
883 
884 	if (txq->pipeh != NULL) {
885 		usbd_abort_pipe(txq->pipeh);
886 		usbd_close_pipe(txq->pipeh);
887 		txq->pipeh = NULL;
888 	}
889 	for (i = 0; i < RUN_TX_RING_COUNT; i++) {
890 		if (txq->data[i].xfer != NULL)
891 			usbd_destroy_xfer(txq->data[i].xfer);
892 		txq->data[i].xfer = NULL;
893 	}
894 }
895 
896 static int
897 run_load_microcode(struct run_softc *sc)
898 {
899 	usb_device_request_t req;
900 	const char *fwname;
901 	u_char *ucode = NULL;	/* XXX gcc 4.8.3: maybe-uninitialized */
902 	size_t size = 0;	/* XXX gcc 4.8.3: maybe-uninitialized */
903 	uint32_t tmp;
904 	int ntries, error;
905 
906 	/* RT3071/RT3072 use a different firmware */
907 	if (sc->mac_ver != 0x2860 &&
908 	    sc->mac_ver != 0x2872 &&
909 	    sc->mac_ver != 0x3070)
910 		fwname = "run-rt3071";
911 	else
912 		fwname = "run-rt2870";
913 
914 	if ((error = firmware_load("run", fwname, &ucode, &size)) != 0) {
915 		aprint_error_dev(sc->sc_dev,
916 		    "error %d, could not read firmware %s\n", error, fwname);
917 		return error;
918 	}
919 	if (size != 4096) {
920 		aprint_error_dev(sc->sc_dev,
921 		    "invalid firmware size (should be 4KB)\n");
922 		firmware_free(ucode, size);
923 		return EINVAL;
924 	}
925 
926 	run_read(sc, RT2860_ASIC_VER_ID, &tmp);
927 	/* write microcode image */
928 	run_write_region_1(sc, RT2870_FW_BASE, ucode, size);
929 	firmware_free(ucode, size);
930 	run_write(sc, RT2860_H2M_MAILBOX_CID, 0xffffffff);
931 	run_write(sc, RT2860_H2M_MAILBOX_STATUS, 0xffffffff);
932 
933 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
934 	req.bRequest = RT2870_RESET;
935 	USETW(req.wValue, 8);
936 	USETW(req.wIndex, 0);
937 	USETW(req.wLength, 0);
938 	if ((error = usbd_do_request(sc->sc_udev, &req, NULL)) != 0)
939 		return error;
940 
941 	usbd_delay_ms(sc->sc_udev, 10);
942 	run_write(sc, RT2860_H2M_MAILBOX, 0);
943 	if ((error = run_mcu_cmd(sc, RT2860_MCU_CMD_RFRESET, 0)) != 0)
944 		return error;
945 
946 	/* wait until microcontroller is ready */
947 	for (ntries = 0; ntries < 1000; ntries++) {
948 		if ((error = run_read(sc, RT2860_SYS_CTRL, &tmp)) != 0)
949 			return error;
950 		if (tmp & RT2860_MCU_READY)
951 			break;
952 		usbd_delay_ms(sc->sc_udev, 10);
953 	}
954 	if (ntries == 1000) {
955 		aprint_error_dev(sc->sc_dev,
956 		    "timeout waiting for MCU to initialize\n");
957 		return ETIMEDOUT;
958 	}
959 
960 	sc->sc_flags |= RUN_FWLOADED;
961 
962 	DPRINTF(("microcode successfully loaded after %d tries\n", ntries));
963 	return 0;
964 }
965 
966 static int
967 run_reset(struct run_softc *sc)
968 {
969 	usb_device_request_t req;
970 
971 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
972 	req.bRequest = RT2870_RESET;
973 	USETW(req.wValue, 1);
974 	USETW(req.wIndex, 0);
975 	USETW(req.wLength, 0);
976 	return usbd_do_request(sc->sc_udev, &req, NULL);
977 }
978 
979 static int
980 run_read(struct run_softc *sc, uint16_t reg, uint32_t *val)
981 {
982 	uint32_t tmp;
983 	int error;
984 
985 	error = run_read_region_1(sc, reg, (uint8_t *)&tmp, sizeof(tmp));
986 	if (error == 0)
987 		*val = le32toh(tmp);
988 	else
989 		*val = 0xffffffff;
990 	return error;
991 }
992 
993 static int
994 run_read_region_1(struct run_softc *sc, uint16_t reg, uint8_t *buf, int len)
995 {
996 	usb_device_request_t req;
997 
998 	req.bmRequestType = UT_READ_VENDOR_DEVICE;
999 	req.bRequest = RT2870_READ_REGION_1;
1000 	USETW(req.wValue, 0);
1001 	USETW(req.wIndex, reg);
1002 	USETW(req.wLength, len);
1003 	return usbd_do_request(sc->sc_udev, &req, buf);
1004 }
1005 
1006 static int
1007 run_write_2(struct run_softc *sc, uint16_t reg, uint16_t val)
1008 {
1009 	usb_device_request_t req;
1010 
1011 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1012 	req.bRequest = RT2870_WRITE_2;
1013 	USETW(req.wValue, val);
1014 	USETW(req.wIndex, reg);
1015 	USETW(req.wLength, 0);
1016 	return usbd_do_request(sc->sc_udev, &req, NULL);
1017 }
1018 
1019 static int
1020 run_write(struct run_softc *sc, uint16_t reg, uint32_t val)
1021 {
1022 	int error;
1023 
1024 	if ((error = run_write_2(sc, reg, val & 0xffff)) == 0)
1025 		error = run_write_2(sc, reg + 2, val >> 16);
1026 	return error;
1027 }
1028 
1029 static int
1030 run_write_region_1(struct run_softc *sc, uint16_t reg, const uint8_t *buf,
1031     int len)
1032 {
1033 #if 1
1034 	int i, error = 0;
1035 	/*
1036 	 * NB: the WRITE_REGION_1 command is not stable on RT2860.
1037 	 * We thus issue multiple WRITE_2 commands instead.
1038 	 */
1039 	KASSERT((len & 1) == 0);
1040 	for (i = 0; i < len && error == 0; i += 2)
1041 		error = run_write_2(sc, reg + i, buf[i] | buf[i + 1] << 8);
1042 	return error;
1043 #else
1044 	usb_device_request_t req;
1045 
1046 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1047 	req.bRequest = RT2870_WRITE_REGION_1;
1048 	USETW(req.wValue, 0);
1049 	USETW(req.wIndex, reg);
1050 	USETW(req.wLength, len);
1051 	return usbd_do_request(sc->sc_udev, &req, buf);
1052 #endif
1053 }
1054 
1055 static int
1056 run_set_region_4(struct run_softc *sc, uint16_t reg, uint32_t val, int count)
1057 {
1058 	int error = 0;
1059 
1060 	for (; count > 0 && error == 0; count--, reg += 4)
1061 		error = run_write(sc, reg, val);
1062 	return error;
1063 }
1064 
1065 static int
1066 run_efuse_read(struct run_softc *sc, uint16_t addr, uint16_t *val, int count)
1067 {
1068 	uint32_t tmp;
1069 	uint16_t reg;
1070 	int error, ntries;
1071 
1072 	if ((error = run_read(sc, RT3070_EFUSE_CTRL, &tmp)) != 0)
1073 		return error;
1074 
1075 	if (count == 2)
1076 		addr *= 2;
1077 	/*-
1078 	 * Read one 16-byte block into registers EFUSE_DATA[0-3]:
1079 	 * DATA0: F E D C
1080 	 * DATA1: B A 9 8
1081 	 * DATA2: 7 6 5 4
1082 	 * DATA3: 3 2 1 0
1083 	 */
1084 	tmp &= ~(RT3070_EFSROM_MODE_MASK | RT3070_EFSROM_AIN_MASK);
1085 	tmp |= (addr & ~0xf) << RT3070_EFSROM_AIN_SHIFT | RT3070_EFSROM_KICK;
1086 	run_write(sc, RT3070_EFUSE_CTRL, tmp);
1087 	for (ntries = 0; ntries < 100; ntries++) {
1088 		if ((error = run_read(sc, RT3070_EFUSE_CTRL, &tmp)) != 0)
1089 			return error;
1090 		if (!(tmp & RT3070_EFSROM_KICK))
1091 			break;
1092 		usbd_delay_ms(sc->sc_udev, 2);
1093 	}
1094 	if (ntries == 100)
1095 		return ETIMEDOUT;
1096 
1097 	if ((tmp & RT3070_EFUSE_AOUT_MASK) == RT3070_EFUSE_AOUT_MASK) {
1098 		*val = 0xffff;	/* address not found */
1099 		return 0;
1100 	}
1101 	/* determine to which 32-bit register our 16-bit word belongs */
1102 	reg = RT3070_EFUSE_DATA3 - (addr & 0xc);
1103 	if ((error = run_read(sc, reg, &tmp)) != 0)
1104 		return error;
1105 
1106 	*val = (addr & 1) ? tmp >> 16 : tmp & 0xffff;
1107 	return 0;
1108 }
1109 
1110 /* Read 16-bit from eFUSE ROM for RT3xxxx. */
1111 static int
1112 run_efuse_read_2(struct run_softc *sc, uint16_t addr, uint16_t *val)
1113 {
1114 	return (run_efuse_read(sc, addr, val, 2));
1115 }
1116 
1117 static int
1118 run_eeprom_read_2(struct run_softc *sc, uint16_t addr, uint16_t *val)
1119 {
1120 	usb_device_request_t req;
1121 	uint16_t tmp;
1122 	int error;
1123 
1124 	addr *= 2;
1125 	req.bmRequestType = UT_READ_VENDOR_DEVICE;
1126 	req.bRequest = RT2870_EEPROM_READ;
1127 	USETW(req.wValue, 0);
1128 	USETW(req.wIndex, addr);
1129 	USETW(req.wLength, sizeof(tmp));
1130 	error = usbd_do_request(sc->sc_udev, &req, &tmp);
1131 	if (error == 0)
1132 		*val = le16toh(tmp);
1133 	else
1134 		*val = 0xffff;
1135 	return error;
1136 }
1137 
1138 static __inline int
1139 run_srom_read(struct run_softc *sc, uint16_t addr, uint16_t *val)
1140 {
1141 
1142 	/* either eFUSE ROM or EEPROM */
1143 	return sc->sc_srom_read(sc, addr, val);
1144 }
1145 
1146 static int
1147 run_rt2870_rf_write(struct run_softc *sc, uint8_t reg, uint32_t val)
1148 {
1149 	uint32_t tmp;
1150 	int error, ntries;
1151 
1152 	for (ntries = 0; ntries < 10; ntries++) {
1153 		if ((error = run_read(sc, RT2860_RF_CSR_CFG0, &tmp)) != 0)
1154 			return error;
1155 		if (!(tmp & RT2860_RF_REG_CTRL))
1156 			break;
1157 	}
1158 	if (ntries == 10)
1159 		return ETIMEDOUT;
1160 
1161 	/* RF registers are 24-bit on the RT2860 */
1162 	tmp = RT2860_RF_REG_CTRL | 24 << RT2860_RF_REG_WIDTH_SHIFT |
1163 	    (val & 0x3fffff) << 2 | (reg & 3);
1164 	return run_write(sc, RT2860_RF_CSR_CFG0, tmp);
1165 }
1166 
1167 static int
1168 run_rt3070_rf_read(struct run_softc *sc, uint8_t reg, uint8_t *val)
1169 {
1170 	uint32_t tmp;
1171 	int error, ntries;
1172 
1173 	for (ntries = 0; ntries < 100; ntries++) {
1174 		if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0)
1175 			return error;
1176 		if (!(tmp & RT3070_RF_KICK))
1177 			break;
1178 	}
1179 	if (ntries == 100)
1180 		return ETIMEDOUT;
1181 
1182 	tmp = RT3070_RF_KICK | reg << 8;
1183 	if ((error = run_write(sc, RT3070_RF_CSR_CFG, tmp)) != 0)
1184 		return error;
1185 
1186 	for (ntries = 0; ntries < 100; ntries++) {
1187 		if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0)
1188 			return error;
1189 		if (!(tmp & RT3070_RF_KICK))
1190 			break;
1191 	}
1192 	if (ntries == 100)
1193 		return ETIMEDOUT;
1194 
1195 	*val = tmp & 0xff;
1196 	return 0;
1197 }
1198 
1199 static int
1200 run_rt3070_rf_write(struct run_softc *sc, uint8_t reg, uint8_t val)
1201 {
1202 	uint32_t tmp;
1203 	int error, ntries;
1204 
1205 	for (ntries = 0; ntries < 10; ntries++) {
1206 		if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0)
1207 			return error;
1208 		if (!(tmp & RT3070_RF_KICK))
1209 			break;
1210 	}
1211 	if (ntries == 10)
1212 		return ETIMEDOUT;
1213 
1214 	tmp = RT3070_RF_WRITE | RT3070_RF_KICK | reg << 8 | val;
1215 	return run_write(sc, RT3070_RF_CSR_CFG, tmp);
1216 }
1217 
1218 static int
1219 run_bbp_read(struct run_softc *sc, uint8_t reg, uint8_t *val)
1220 {
1221 	uint32_t tmp;
1222 	int ntries, error;
1223 
1224 	for (ntries = 0; ntries < 10; ntries++) {
1225 		if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0)
1226 			return error;
1227 		if (!(tmp & RT2860_BBP_CSR_KICK))
1228 			break;
1229 	}
1230 	if (ntries == 10)
1231 		return ETIMEDOUT;
1232 
1233 	tmp = RT2860_BBP_CSR_READ | RT2860_BBP_CSR_KICK | reg << 8;
1234 	if ((error = run_write(sc, RT2860_BBP_CSR_CFG, tmp)) != 0)
1235 		return error;
1236 
1237 	for (ntries = 0; ntries < 10; ntries++) {
1238 		if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0)
1239 			return error;
1240 		if (!(tmp & RT2860_BBP_CSR_KICK))
1241 			break;
1242 	}
1243 	if (ntries == 10)
1244 		return ETIMEDOUT;
1245 
1246 	*val = tmp & 0xff;
1247 	return 0;
1248 }
1249 
1250 static int
1251 run_bbp_write(struct run_softc *sc, uint8_t reg, uint8_t val)
1252 {
1253 	uint32_t tmp;
1254 	int ntries, error;
1255 
1256 	for (ntries = 0; ntries < 10; ntries++) {
1257 		if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0)
1258 			return error;
1259 		if (!(tmp & RT2860_BBP_CSR_KICK))
1260 			break;
1261 	}
1262 	if (ntries == 10)
1263 		return ETIMEDOUT;
1264 
1265 	tmp = RT2860_BBP_CSR_KICK | reg << 8 | val;
1266 	return run_write(sc, RT2860_BBP_CSR_CFG, tmp);
1267 }
1268 
1269 /*
1270  * Send a command to the 8051 microcontroller unit.
1271  */
1272 static int
1273 run_mcu_cmd(struct run_softc *sc, uint8_t cmd, uint16_t arg)
1274 {
1275 	uint32_t tmp;
1276 	int error, ntries;
1277 
1278 	for (ntries = 0; ntries < 100; ntries++) {
1279 		if ((error = run_read(sc, RT2860_H2M_MAILBOX, &tmp)) != 0)
1280 			return error;
1281 		if (!(tmp & RT2860_H2M_BUSY))
1282 			break;
1283 	}
1284 	if (ntries == 100)
1285 		return ETIMEDOUT;
1286 
1287 	tmp = RT2860_H2M_BUSY | RT2860_TOKEN_NO_INTR << 16 | arg;
1288 	if ((error = run_write(sc, RT2860_H2M_MAILBOX, tmp)) == 0)
1289 		error = run_write(sc, RT2860_HOST_CMD, cmd);
1290 	return error;
1291 }
1292 
1293 /*
1294  * Add `delta' (signed) to each 4-bit sub-word of a 32-bit word.
1295  * Used to adjust per-rate Tx power registers.
1296  */
1297 static __inline uint32_t
1298 b4inc(uint32_t b32, int8_t delta)
1299 {
1300 	int8_t i, b4;
1301 
1302 	for (i = 0; i < 8; i++) {
1303 		b4 = b32 & 0xf;
1304 		b4 += delta;
1305 		if (b4 < 0)
1306 			b4 = 0;
1307 		else if (b4 > 0xf)
1308 			b4 = 0xf;
1309 		b32 = b32 >> 4 | b4 << 28;
1310 	}
1311 	return b32;
1312 }
1313 
1314 static const char *
1315 run_get_rf(int rev)
1316 {
1317 	switch (rev) {
1318 	case RT2860_RF_2820:	return "RT2820";
1319 	case RT2860_RF_2850:	return "RT2850";
1320 	case RT2860_RF_2720:	return "RT2720";
1321 	case RT2860_RF_2750:	return "RT2750";
1322 	case RT3070_RF_3020:	return "RT3020";
1323 	case RT3070_RF_2020:	return "RT2020";
1324 	case RT3070_RF_3021:	return "RT3021";
1325 	case RT3070_RF_3022:	return "RT3022";
1326 	case RT3070_RF_3052:	return "RT3052";
1327 	case RT3070_RF_3053:    return "RT3053";
1328 	case RT5592_RF_5592:    return "RT5592";
1329 	case RT5390_RF_5370:    return "RT5370";
1330 	case RT5390_RF_5372:    return "RT5372";
1331 	}
1332 	return "unknown";
1333 }
1334 
1335 static void
1336 run_rt3593_get_txpower(struct run_softc *sc)
1337 {
1338 	uint16_t addr, val;
1339 	int i;
1340 
1341 	/* Read power settings for 2GHz channels. */
1342 	for (i = 0; i < 14; i += 2) {
1343 		addr = (sc->ntxchains == 3) ? RT3593_EEPROM_PWR2GHZ_BASE1 :
1344 		    RT2860_EEPROM_PWR2GHZ_BASE1;
1345 		run_srom_read(sc, addr + i / 2, &val);
1346 		sc->txpow1[i + 0] = (int8_t)(val & 0xff);
1347 		sc->txpow1[i + 1] = (int8_t)(val >> 8);
1348 
1349 		addr = (sc->ntxchains == 3) ? RT3593_EEPROM_PWR2GHZ_BASE2 :
1350 		    RT2860_EEPROM_PWR2GHZ_BASE2;
1351 		run_srom_read(sc, addr + i / 2, &val);
1352 		sc->txpow2[i + 0] = (int8_t)(val & 0xff);
1353 		sc->txpow2[i + 1] = (int8_t)(val >> 8);
1354 
1355 		if (sc->ntxchains == 3) {
1356 			run_srom_read(sc, RT3593_EEPROM_PWR2GHZ_BASE3 + i / 2,
1357 			    &val);
1358 			sc->txpow3[i + 0] = (int8_t)(val & 0xff);
1359 			sc->txpow3[i + 1] = (int8_t)(val >> 8);
1360 		}
1361 	}
1362 	/* Fix broken Tx power entries. */
1363 	for (i = 0; i < 14; i++) {
1364 		if (sc->txpow1[i] > 31)
1365 			sc->txpow1[i] = 5;
1366 		if (sc->txpow2[i] > 31)
1367 			sc->txpow2[i] = 5;
1368 		if (sc->ntxchains == 3) {
1369 			if (sc->txpow3[i] > 31)
1370 				sc->txpow3[i] = 5;
1371 		}
1372 	}
1373 	/* Read power settings for 5GHz channels. */
1374 	for (i = 0; i < 40; i += 2) {
1375 		run_srom_read(sc, RT3593_EEPROM_PWR5GHZ_BASE1 + i / 2, &val);
1376 		sc->txpow1[i + 14] = (int8_t)(val & 0xff);
1377 		sc->txpow1[i + 15] = (int8_t)(val >> 8);
1378 
1379 		run_srom_read(sc, RT3593_EEPROM_PWR5GHZ_BASE2 + i / 2, &val);
1380 		sc->txpow2[i + 14] = (int8_t)(val & 0xff);
1381 		sc->txpow2[i + 15] = (int8_t)(val >> 8);
1382 
1383 		if (sc->ntxchains == 3) {
1384 			run_srom_read(sc, RT3593_EEPROM_PWR5GHZ_BASE3 + i / 2,
1385 			    &val);
1386 			sc->txpow3[i + 14] = (int8_t)(val & 0xff);
1387 			sc->txpow3[i + 15] = (int8_t)(val >> 8);
1388 		}
1389 	}
1390 }
1391 
1392 static void
1393 run_get_txpower(struct run_softc *sc)
1394 {
1395 	uint16_t val;
1396 	int i;
1397 
1398 	/* Read power settings for 2GHz channels. */
1399 	for (i = 0; i < 14; i += 2) {
1400 		run_srom_read(sc, RT2860_EEPROM_PWR2GHZ_BASE1 + i / 2, &val);
1401 		sc->txpow1[i + 0] = (int8_t)(val & 0xff);
1402 		sc->txpow1[i + 1] = (int8_t)(val >> 8);
1403 
1404 		if (sc->mac_ver != 0x5390) {
1405 			run_srom_read(sc,
1406 			    RT2860_EEPROM_PWR2GHZ_BASE2 + i / 2, &val);
1407 			sc->txpow2[i + 0] = (int8_t)(val & 0xff);
1408 			sc->txpow2[i + 1] = (int8_t)(val >> 8);
1409 		}
1410 	}
1411 	/* Fix broken Tx power entries. */
1412 	for (i = 0; i < 14; i++) {
1413 		if (sc->mac_ver >= 0x5390) {
1414 			if (sc->txpow1[i] < 0 || sc->txpow1[i] > 39)
1415 				sc->txpow1[i] = 5;
1416 		} else {
1417 			if (sc->txpow1[i] < 0 || sc->txpow1[i] > 31)
1418 				sc->txpow1[i] = 5;
1419 		}
1420 		if (sc->mac_ver > 0x5390) {
1421 			if (sc->txpow2[i] < 0 || sc->txpow2[i] > 39)
1422 				sc->txpow2[i] = 5;
1423 		} else if (sc->mac_ver < 0x5390) {
1424 			if (sc->txpow2[i] < 0 || sc->txpow2[i] > 31)
1425 				sc->txpow2[i] = 5;
1426 		}
1427 		DPRINTF(("chan %d: power1=%d, power2=%d\n",
1428 		    rt2860_rf2850[i].chan, sc->txpow1[i], sc->txpow2[i]));
1429 	}
1430 	/* Read power settings for 5GHz channels. */
1431 	for (i = 0; i < 40; i += 2) {
1432 		run_srom_read(sc, RT2860_EEPROM_PWR5GHZ_BASE1 + i / 2, &val);
1433 		sc->txpow1[i + 14] = (int8_t)(val & 0xff);
1434 		sc->txpow1[i + 15] = (int8_t)(val >> 8);
1435 
1436 		run_srom_read(sc, RT2860_EEPROM_PWR5GHZ_BASE2 + i / 2, &val);
1437 		sc->txpow2[i + 14] = (int8_t)(val & 0xff);
1438 		sc->txpow2[i + 15] = (int8_t)(val >> 8);
1439 	}
1440 	/* Fix broken Tx power entries. */
1441 	for (i = 0; i < 40; i++ ) {
1442 		if (sc->mac_ver != 0x5592) {
1443 			if (sc->txpow1[14 + i] < -7 || sc->txpow1[14 + i] > 15)
1444 				sc->txpow1[14 + i] = 5;
1445 			if (sc->txpow2[14 + i] < -7 || sc->txpow2[14 + i] > 15)
1446 				sc->txpow2[14 + i] = 5;
1447 		}
1448 		DPRINTF(("chan %d: power1=%d, power2=%d\n",
1449 		    rt2860_rf2850[14 + i].chan, sc->txpow1[14 + i],
1450 		    sc->txpow2[14 + i]));
1451 	}
1452 }
1453 
1454 static int
1455 run_read_eeprom(struct run_softc *sc)
1456 {
1457 	struct ieee80211com *ic = &sc->sc_ic;
1458 	int8_t delta_2ghz, delta_5ghz;
1459 	uint32_t tmp;
1460 	uint16_t val;
1461 	int ridx, ant, i;
1462 
1463 	/* check whether the ROM is eFUSE ROM or EEPROM */
1464 	sc->sc_srom_read = run_eeprom_read_2;
1465 	if (sc->mac_ver >= 0x3070) {
1466 		run_read(sc, RT3070_EFUSE_CTRL, &tmp);
1467 		DPRINTF(("EFUSE_CTRL=0x%08x\n", tmp));
1468 		if (tmp & RT3070_SEL_EFUSE)
1469 			sc->sc_srom_read = run_efuse_read_2;
1470 	}
1471 
1472 	/* read ROM version */
1473 	run_srom_read(sc, RT2860_EEPROM_VERSION, &val);
1474 	DPRINTF(("EEPROM rev=%d, FAE=%d\n", val & 0xff, val >> 8));
1475 
1476 	/* read MAC address */
1477 	run_srom_read(sc, RT2860_EEPROM_MAC01, &val);
1478 	ic->ic_myaddr[0] = val & 0xff;
1479 	ic->ic_myaddr[1] = val >> 8;
1480 	run_srom_read(sc, RT2860_EEPROM_MAC23, &val);
1481 	ic->ic_myaddr[2] = val & 0xff;
1482 	ic->ic_myaddr[3] = val >> 8;
1483 	run_srom_read(sc, RT2860_EEPROM_MAC45, &val);
1484 	ic->ic_myaddr[4] = val & 0xff;
1485 	ic->ic_myaddr[5] = val >> 8;
1486 
1487 	/* read vendor BBP settings */
1488 	for (i = 0; i < 10; i++) {
1489 		run_srom_read(sc, RT2860_EEPROM_BBP_BASE + i, &val);
1490 		sc->bbp[i].val = val & 0xff;
1491 		sc->bbp[i].reg = val >> 8;
1492 		DPRINTF(("BBP%d=0x%02x\n", sc->bbp[i].reg, sc->bbp[i].val));
1493 	}
1494 
1495 	/* read vendor RF settings */
1496 	for (i = 0; i < 8; i++) {
1497 		run_srom_read(sc, RT3071_EEPROM_RF_BASE + i, &val);
1498 		sc->rf[i].val = val & 0xff;
1499 		sc->rf[i].reg = val >> 8;
1500 		DPRINTF(("RF%d=0x%02x\n", sc->rf[i].reg,
1501 		    sc->rf[i].val));
1502 	}
1503 
1504 	/* read RF frequency offset from EEPROM */
1505 	run_srom_read(sc, RT2860_EEPROM_FREQ_LEDS, &val);
1506 	sc->freq = ((val & 0xff) != 0xff) ? val & 0xff : 0;
1507 	DPRINTF(("EEPROM freq offset %d\n", sc->freq & 0xff));
1508 
1509 	if ((val >> 8) != 0xff) {
1510 		/* read LEDs operating mode */
1511 		sc->leds = val >> 8;
1512 		run_srom_read(sc, RT2860_EEPROM_LED1, &sc->led[0]);
1513 		run_srom_read(sc, RT2860_EEPROM_LED2, &sc->led[1]);
1514 		run_srom_read(sc, RT2860_EEPROM_LED3, &sc->led[2]);
1515 	} else {
1516 		/* broken EEPROM, use default settings */
1517 		sc->leds = 0x01;
1518 		sc->led[0] = 0x5555;
1519 		sc->led[1] = 0x2221;
1520 		sc->led[2] = 0x5627;	/* differs from RT2860 */
1521 	}
1522 	DPRINTF(("EEPROM LED mode=0x%02x, LEDs=0x%04x/0x%04x/0x%04x\n",
1523 	    sc->leds, sc->led[0], sc->led[1], sc->led[2]));
1524 
1525 	/* read RF information */
1526 	run_srom_read(sc, RT2860_EEPROM_ANTENNA, &val);
1527 	if (val == 0xffff) {
1528 		DPRINTF(("invalid EEPROM antenna info, using default\n"));
1529 		if (sc->mac_ver == 0x3572) {
1530 			/* default to RF3052 2T2R */
1531 			sc->rf_rev = RT3070_RF_3052;
1532 			sc->ntxchains = 2;
1533 			sc->nrxchains = 2;
1534 		} else if (sc->mac_ver >= 0x3070) {
1535 			/* default to RF3020 1T1R */
1536 			sc->rf_rev = RT3070_RF_3020;
1537 			sc->ntxchains = 1;
1538 			sc->nrxchains = 1;
1539 		} else {
1540 			/* default to RF2820 1T2R */
1541 			sc->rf_rev = RT2860_RF_2820;
1542 			sc->ntxchains = 1;
1543 			sc->nrxchains = 2;
1544 		}
1545 	} else {
1546 		sc->rf_rev = (val >> 8) & 0xf;
1547 		sc->ntxchains = (val >> 4) & 0xf;
1548 		sc->nrxchains = val & 0xf;
1549 	}
1550 	DPRINTF(("EEPROM RF rev=0x%02x chains=%dT%dR\n",
1551 	    sc->rf_rev, sc->ntxchains, sc->nrxchains));
1552 
1553 	run_srom_read(sc, RT2860_EEPROM_CONFIG, &val);
1554 	DPRINTF(("EEPROM CFG 0x%04x\n", val));
1555 	/* check if driver should patch the DAC issue */
1556 	if ((val >> 8) != 0xff)
1557 		sc->patch_dac = (val >> 15) & 1;
1558 	if ((val & 0xff) != 0xff) {
1559 		sc->ext_5ghz_lna = (val >> 3) & 1;
1560 		sc->ext_2ghz_lna = (val >> 2) & 1;
1561 		/* check if RF supports automatic Tx access gain control */
1562 		sc->calib_2ghz = sc->calib_5ghz = (val >> 1) & 1;
1563 		/* check if we have a hardware radio switch */
1564 		sc->rfswitch = val & 1;
1565 	}
1566 
1567 	/* Read Tx power settings. */
1568 	if (sc->mac_ver == 0x3593)
1569 		run_rt3593_get_txpower(sc);
1570 	else
1571 		run_get_txpower(sc);
1572 
1573 	/* read Tx power compensation for each Tx rate */
1574 	run_srom_read(sc, RT2860_EEPROM_DELTAPWR, &val);
1575 	delta_2ghz = delta_5ghz = 0;
1576 	if ((val & 0xff) != 0xff && (val & 0x80)) {
1577 		delta_2ghz = val & 0xf;
1578 		if (!(val & 0x40))	/* negative number */
1579 			delta_2ghz = -delta_2ghz;
1580 	}
1581 	val >>= 8;
1582 	if ((val & 0xff) != 0xff && (val & 0x80)) {
1583 		delta_5ghz = val & 0xf;
1584 		if (!(val & 0x40))	/* negative number */
1585 			delta_5ghz = -delta_5ghz;
1586 	}
1587 	DPRINTF(("power compensation=%d (2GHz), %d (5GHz)\n",
1588 	    delta_2ghz, delta_5ghz));
1589 
1590 	for (ridx = 0; ridx < 5; ridx++) {
1591 		uint32_t reg;
1592 
1593 		run_srom_read(sc, RT2860_EEPROM_RPWR + ridx * 2, &val);
1594 		reg = val;
1595 		run_srom_read(sc, RT2860_EEPROM_RPWR + ridx * 2 + 1, &val);
1596 		reg |= (uint32_t)val << 16;
1597 
1598 		sc->txpow20mhz[ridx] = reg;
1599 		sc->txpow40mhz_2ghz[ridx] = b4inc(reg, delta_2ghz);
1600 		sc->txpow40mhz_5ghz[ridx] = b4inc(reg, delta_5ghz);
1601 
1602 		DPRINTF(("ridx %d: power 20MHz=0x%08x, 40MHz/2GHz=0x%08x, "
1603 		    "40MHz/5GHz=0x%08x\n", ridx, sc->txpow20mhz[ridx],
1604 		    sc->txpow40mhz_2ghz[ridx], sc->txpow40mhz_5ghz[ridx]));
1605 	}
1606 
1607 	/* read RSSI offsets and LNA gains from EEPROM */
1608 	run_srom_read(sc, RT2860_EEPROM_RSSI1_2GHZ, &val);
1609 	sc->rssi_2ghz[0] = val & 0xff;	/* Ant A */
1610 	sc->rssi_2ghz[1] = val >> 8;	/* Ant B */
1611 	run_srom_read(sc, RT2860_EEPROM_RSSI2_2GHZ, &val);
1612 	if (sc->mac_ver >= 0x3070) {
1613 		if (sc->mac_ver == 0x3593) {
1614 			sc->txmixgain_2ghz = 0;
1615 			sc->rssi_2ghz[2] = val & 0xff; 	/* Ant C */
1616 		} else {
1617 			/*
1618 			 * On RT3070 chips (limited to 2 Rx chains), this ROM
1619 			 * field contains the Tx mixer gain for the 2GHz band.
1620 			 */
1621 			if ((val & 0xff) != 0xff)
1622 				sc->txmixgain_2ghz = val & 0x7;
1623 		}
1624 		DPRINTF(("tx mixer gain=%u (2GHz)\n", sc->txmixgain_2ghz));
1625 	} else {
1626 		sc->rssi_2ghz[2] = val & 0xff;	/* Ant C */
1627 	}
1628 	if (sc->mac_ver == 0x3593)
1629 		run_srom_read(sc, RT3593_EEPROM_LNA_5GHZ, &val);
1630 	sc->lna[2] = val >> 8;		/* channel group 2 */
1631 
1632 	run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_RSSI1_5GHZ :
1633 	    RT3593_EEPROM_RSSI2_5GHZ, &val);
1634 	sc->rssi_5ghz[0] = val & 0xff;	/* Ant A */
1635 	sc->rssi_5ghz[1] = val >> 8;	/* Ant B */
1636 	run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_RSSI2_5GHZ :
1637 	    RT3593_EEPROM_RSSI2_5GHZ, &val);
1638 	if (sc->mac_ver == 0x3572) {
1639 		/*
1640 		 * On RT3572 chips (limited to 2 Rx chains), this ROM
1641 		 * field contains the Tx mixer gain for the 5GHz band.
1642 		 */
1643 		if ((val & 0xff) != 0xff)
1644 			sc->txmixgain_5ghz = val & 0x7;
1645 		DPRINTF(("tx mixer gain=%u (5GHz)\n", sc->txmixgain_5ghz));
1646 	} else {
1647 		sc->rssi_5ghz[2] = val & 0xff;	/* Ant C */
1648 	}
1649 	if (sc->mac_ver == 0x3593) {
1650 		sc->txmixgain_5ghz = 0;
1651 		run_srom_read(sc, RT3593_EEPROM_LNA_5GHZ, &val);
1652 	}
1653 	sc->lna[3] = val >> 8;		/* channel group 3 */
1654 
1655 	run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_LNA :
1656 	    RT3593_EEPROM_LNA, &val);
1657 	sc->lna[0] = val & 0xff;	/* channel group 0 */
1658 	sc->lna[1] = val >> 8;		/* channel group 1 */
1659 
1660 	/* fix broken 5GHz LNA entries */
1661 	if (sc->lna[2] == 0 || sc->lna[2] == 0xff) {
1662 		DPRINTF(("invalid LNA for channel group %d\n", 2));
1663 		sc->lna[2] = sc->lna[1];
1664 	}
1665 	if (sc->lna[3] == 0 || sc->lna[3] == 0xff) {
1666 		DPRINTF(("invalid LNA for channel group %d\n", 3));
1667 		sc->lna[3] = sc->lna[1];
1668 	}
1669 
1670 	/* fix broken RSSI offset entries */
1671 	for (ant = 0; ant < 3; ant++) {
1672 		if (sc->rssi_2ghz[ant] < -10 || sc->rssi_2ghz[ant] > 10) {
1673 			DPRINTF(("invalid RSSI%d offset: %d (2GHz)\n",
1674 			    ant + 1, sc->rssi_2ghz[ant]));
1675 			sc->rssi_2ghz[ant] = 0;
1676 		}
1677 		if (sc->rssi_5ghz[ant] < -10 || sc->rssi_5ghz[ant] > 10) {
1678 			DPRINTF(("invalid RSSI%d offset: %d (5GHz)\n",
1679 			    ant + 1, sc->rssi_5ghz[ant]));
1680 			sc->rssi_5ghz[ant] = 0;
1681 		}
1682 	}
1683 	return 0;
1684 }
1685 
1686 static struct ieee80211_node *
1687 run_node_alloc(struct ieee80211_node_table *nt)
1688 {
1689 	struct run_node *rn =
1690 	    malloc(sizeof(struct run_node), M_DEVBUF, M_NOWAIT | M_ZERO);
1691 	return rn ? &rn->ni : NULL;
1692 }
1693 
1694 static int
1695 run_media_change(struct ifnet *ifp)
1696 {
1697 	struct run_softc *sc = ifp->if_softc;
1698 	struct ieee80211com *ic = &sc->sc_ic;
1699 	uint8_t rate, ridx;
1700 	int error;
1701 
1702 	error = ieee80211_media_change(ifp);
1703 	if (error != ENETRESET)
1704 		return error;
1705 
1706 	if (ic->ic_fixed_rate != IEEE80211_FIXED_RATE_NONE) {
1707 		rate = ic->ic_sup_rates[ic->ic_curmode].
1708 		    rs_rates[ic->ic_fixed_rate] & IEEE80211_RATE_VAL;
1709 		for (ridx = 0; ridx <= RT2860_RIDX_MAX; ridx++)
1710 			if (rt2860_rates[ridx].rate == rate)
1711 				break;
1712 		sc->fixed_ridx = ridx;
1713 	}
1714 
1715 	if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == (IFF_UP | IFF_RUNNING))
1716 		run_init(ifp);
1717 
1718 	return 0;
1719 }
1720 
1721 static void
1722 run_next_scan(void *arg)
1723 {
1724 	struct run_softc *sc = arg;
1725 
1726 	if (sc->sc_ic.ic_state == IEEE80211_S_SCAN)
1727 		ieee80211_next_scan(&sc->sc_ic);
1728 }
1729 
1730 static void
1731 run_task(void *arg)
1732 {
1733 	struct run_softc *sc = arg;
1734 	struct run_host_cmd_ring *ring = &sc->cmdq;
1735 	struct run_host_cmd *cmd;
1736 	int s;
1737 
1738 	/* process host commands */
1739 	s = splusb();
1740 	while (ring->next != ring->cur) {
1741 		cmd = &ring->cmd[ring->next];
1742 		splx(s);
1743 		/* callback */
1744 		cmd->cb(sc, cmd->data);
1745 		s = splusb();
1746 		ring->queued--;
1747 		ring->next = (ring->next + 1) % RUN_HOST_CMD_RING_COUNT;
1748 	}
1749 	wakeup(ring);
1750 	splx(s);
1751 }
1752 
1753 static void
1754 run_do_async(struct run_softc *sc, void (*cb)(struct run_softc *, void *),
1755     void *arg, int len)
1756 {
1757 	struct run_host_cmd_ring *ring = &sc->cmdq;
1758 	struct run_host_cmd *cmd;
1759 	int s;
1760 
1761 	if (sc->sc_flags & RUN_DETACHING)
1762 		return;
1763 
1764 	s = splusb();
1765 	cmd = &ring->cmd[ring->cur];
1766 	cmd->cb = cb;
1767 	KASSERT(len <= sizeof(cmd->data));
1768 	memcpy(cmd->data, arg, len);
1769 	ring->cur = (ring->cur + 1) % RUN_HOST_CMD_RING_COUNT;
1770 
1771 	/* if there is no pending command already, schedule a task */
1772 	if (++ring->queued == 1)
1773 		usb_add_task(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER);
1774 	splx(s);
1775 }
1776 
1777 static int
1778 run_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
1779 {
1780 	struct run_softc *sc = ic->ic_ifp->if_softc;
1781 	struct run_cmd_newstate cmd;
1782 
1783 	callout_stop(&sc->scan_to);
1784 	callout_stop(&sc->calib_to);
1785 
1786 	/* do it in a process context */
1787 	cmd.state = nstate;
1788 	cmd.arg = arg;
1789 	run_do_async(sc, run_newstate_cb, &cmd, sizeof(cmd));
1790 	return 0;
1791 }
1792 
1793 static void
1794 run_newstate_cb(struct run_softc *sc, void *arg)
1795 {
1796 	struct run_cmd_newstate *cmd = arg;
1797 	struct ifnet *ifp = &sc->sc_if;
1798 	struct ieee80211com *ic = &sc->sc_ic;
1799 	enum ieee80211_state ostate;
1800 	struct ieee80211_node *ni;
1801 	uint32_t tmp, sta[3];
1802 	uint8_t wcid;
1803 	int s;
1804 
1805 	s = splnet();
1806 	ostate = ic->ic_state;
1807 
1808 	if (ostate == IEEE80211_S_RUN) {
1809 		/* turn link LED off */
1810 		run_set_leds(sc, RT2860_LED_RADIO);
1811 	}
1812 
1813 	switch (cmd->state) {
1814 	case IEEE80211_S_INIT:
1815 		if (ostate == IEEE80211_S_RUN) {
1816 			/* abort TSF synchronization */
1817 			run_read(sc, RT2860_BCN_TIME_CFG, &tmp);
1818 			run_write(sc, RT2860_BCN_TIME_CFG,
1819 			    tmp & ~(RT2860_BCN_TX_EN | RT2860_TSF_TIMER_EN |
1820 			    RT2860_TBTT_TIMER_EN));
1821 		}
1822 		break;
1823 
1824 	case IEEE80211_S_SCAN:
1825 		run_set_chan(sc, ic->ic_curchan);
1826 		callout_schedule(&sc->scan_to, hz / 5);
1827 		break;
1828 
1829 	case IEEE80211_S_AUTH:
1830 	case IEEE80211_S_ASSOC:
1831 		run_set_chan(sc, ic->ic_curchan);
1832 		break;
1833 
1834 	case IEEE80211_S_RUN:
1835 		run_set_chan(sc, ic->ic_curchan);
1836 
1837 		ni = ic->ic_bss;
1838 
1839 		if (ic->ic_opmode != IEEE80211_M_MONITOR) {
1840 			run_updateslot(ifp);
1841 			run_enable_mrr(sc);
1842 			run_set_txpreamble(sc);
1843 			run_set_basicrates(sc);
1844 			run_set_bssid(sc, ni->ni_bssid);
1845 		}
1846 #ifndef IEEE80211_STA_ONLY
1847 		if (ic->ic_opmode == IEEE80211_M_HOSTAP ||
1848 		    ic->ic_opmode == IEEE80211_M_IBSS)
1849 			(void)run_setup_beacon(sc);
1850 #endif
1851 		if (ic->ic_opmode == IEEE80211_M_STA) {
1852 			/* add BSS entry to the WCID table */
1853 			wcid = RUN_AID2WCID(ni->ni_associd);
1854 			run_write_region_1(sc, RT2860_WCID_ENTRY(wcid),
1855 			    ni->ni_macaddr, IEEE80211_ADDR_LEN);
1856 
1857 			/* fake a join to init the tx rate */
1858 			run_newassoc(ni, 1);
1859 		}
1860 		if (ic->ic_opmode != IEEE80211_M_MONITOR) {
1861 			run_enable_tsf_sync(sc);
1862 
1863 			/* clear statistic registers used by AMRR */
1864 			run_read_region_1(sc, RT2860_TX_STA_CNT0,
1865 			    (uint8_t *)sta, sizeof(sta));
1866 			/* start calibration timer */
1867 			callout_schedule(&sc->calib_to, hz);
1868 		}
1869 
1870 		/* turn link LED on */
1871 		run_set_leds(sc, RT2860_LED_RADIO |
1872 		    (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan) ?
1873 		     RT2860_LED_LINK_2GHZ : RT2860_LED_LINK_5GHZ));
1874 		break;
1875 	}
1876 	(void)sc->sc_newstate(ic, cmd->state, cmd->arg);
1877 	splx(s);
1878 }
1879 
1880 static int
1881 run_updateedca(struct ieee80211com *ic)
1882 {
1883 
1884 	/* do it in a process context */
1885 	run_do_async(ic->ic_ifp->if_softc, run_updateedca_cb, NULL, 0);
1886 	return 0;
1887 }
1888 
1889 /* ARGSUSED */
1890 static void
1891 run_updateedca_cb(struct run_softc *sc, void *arg)
1892 {
1893 	struct ieee80211com *ic = &sc->sc_ic;
1894 	int s, aci;
1895 
1896 	s = splnet();
1897 	/* update MAC TX configuration registers */
1898 	for (aci = 0; aci < WME_NUM_AC; aci++) {
1899 		run_write(sc, RT2860_EDCA_AC_CFG(aci),
1900 		    ic->ic_wme.wme_params[aci].wmep_logcwmax << 16 |
1901 		    ic->ic_wme.wme_params[aci].wmep_logcwmin << 12 |
1902 		    ic->ic_wme.wme_params[aci].wmep_aifsn  <<  8 |
1903 		    ic->ic_wme.wme_params[aci].wmep_txopLimit);
1904 	}
1905 
1906 	/* update SCH/DMA registers too */
1907 	run_write(sc, RT2860_WMM_AIFSN_CFG,
1908 	    ic->ic_wme.wme_params[WME_AC_VO].wmep_aifsn  << 12 |
1909 	    ic->ic_wme.wme_params[WME_AC_VI].wmep_aifsn  <<  8 |
1910 	    ic->ic_wme.wme_params[WME_AC_BK].wmep_aifsn  <<  4 |
1911 	    ic->ic_wme.wme_params[WME_AC_BE].wmep_aifsn);
1912 	run_write(sc, RT2860_WMM_CWMIN_CFG,
1913 	    ic->ic_wme.wme_params[WME_AC_VO].wmep_logcwmin << 12 |
1914 	    ic->ic_wme.wme_params[WME_AC_VI].wmep_logcwmin <<  8 |
1915 	    ic->ic_wme.wme_params[WME_AC_BK].wmep_logcwmin <<  4 |
1916 	    ic->ic_wme.wme_params[WME_AC_BE].wmep_logcwmin);
1917 	run_write(sc, RT2860_WMM_CWMAX_CFG,
1918 	    ic->ic_wme.wme_params[WME_AC_VO].wmep_logcwmax << 12 |
1919 	    ic->ic_wme.wme_params[WME_AC_VI].wmep_logcwmax <<  8 |
1920 	    ic->ic_wme.wme_params[WME_AC_BK].wmep_logcwmax <<  4 |
1921 	    ic->ic_wme.wme_params[WME_AC_BE].wmep_logcwmax);
1922 	run_write(sc, RT2860_WMM_TXOP0_CFG,
1923 	    ic->ic_wme.wme_params[WME_AC_BK].wmep_txopLimit << 16 |
1924 	    ic->ic_wme.wme_params[WME_AC_BE].wmep_txopLimit);
1925 	run_write(sc, RT2860_WMM_TXOP1_CFG,
1926 	    ic->ic_wme.wme_params[WME_AC_VO].wmep_txopLimit << 16 |
1927 	    ic->ic_wme.wme_params[WME_AC_VI].wmep_txopLimit);
1928 	splx(s);
1929 }
1930 
1931 #ifdef RUN_HWCRYPTO
1932 static int
1933 run_set_key(struct ieee80211com *ic, const struct ieee80211_key *k,
1934     const uint8_t *mac)
1935 {
1936 	struct run_softc *sc = ic->ic_ifp->if_softc;
1937 	struct ieee80211_node *ni = ic->ic_bss;
1938 	struct run_cmd_key cmd;
1939 
1940 	/* do it in a process context */
1941 	cmd.key = *k;
1942 	cmd.associd = (ni != NULL) ? ni->ni_associd : 0;
1943 	run_do_async(sc, run_set_key_cb, &cmd, sizeof(cmd));
1944 	return 1;
1945 }
1946 
1947 static void
1948 run_set_key_cb(struct run_softc *sc, void *arg)
1949 {
1950 #ifndef IEEE80211_STA_ONLY
1951 	struct ieee80211com *ic = &sc->sc_ic;
1952 #endif
1953 	struct run_cmd_key *cmd = arg;
1954 	struct ieee80211_key *k = &cmd->key;
1955 	uint32_t attr;
1956 	uint16_t base;
1957 	uint8_t mode, wcid, iv[8];
1958 
1959 	/* map net80211 cipher to RT2860 security mode */
1960 	switch (k->wk_cipher->ic_cipher) {
1961 	case IEEE80211_CIPHER_WEP:
1962 		k->wk_flags |= IEEE80211_KEY_GROUP; /* XXX */
1963 		if (k->wk_keylen == 5)
1964 			mode = RT2860_MODE_WEP40;
1965 		else
1966 			mode = RT2860_MODE_WEP104;
1967 		break;
1968 	case IEEE80211_CIPHER_TKIP:
1969 		mode = RT2860_MODE_TKIP;
1970 		break;
1971 	case IEEE80211_CIPHER_AES_CCM:
1972 		mode = RT2860_MODE_AES_CCMP;
1973 		break;
1974 	default:
1975 		return;
1976 	}
1977 
1978 	if (k->wk_flags & IEEE80211_KEY_GROUP) {
1979 		wcid = 0;	/* NB: update WCID0 for group keys */
1980 		base = RT2860_SKEY(0, k->wk_keyix);
1981 	} else {
1982 		wcid = RUN_AID2WCID(cmd->associd);
1983 		base = RT2860_PKEY(wcid);
1984 	}
1985 
1986 	if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_TKIP) {
1987 		run_write_region_1(sc, base, k->wk_key, 16);
1988 #ifndef IEEE80211_STA_ONLY
1989 		if (ic->ic_opmode == IEEE80211_M_HOSTAP) {
1990 			run_write_region_1(sc, base + 16, &k->wk_key[16], 8);
1991 			run_write_region_1(sc, base + 24, &k->wk_key[24], 8);
1992 		} else
1993 #endif
1994 		{
1995 			run_write_region_1(sc, base + 16, &k->wk_key[24], 8);
1996 			run_write_region_1(sc, base + 24, &k->wk_key[16], 8);
1997 		}
1998 	} else {
1999 		/* roundup len to 16-bit: XXX fix write_region_1() instead */
2000 		run_write_region_1(sc, base, k->wk_key,
2001 		    (k->wk_keylen + 1) & ~1);
2002 	}
2003 
2004 	if (!(k->wk_flags & IEEE80211_KEY_GROUP) ||
2005 	    (k->wk_flags & IEEE80211_KEY_XMIT)) {
2006 		/* set initial packet number in IV+EIV */
2007 		if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_WEP) {
2008 			memset(iv, 0, sizeof(iv));
2009 			iv[3] = sc->sc_ic.ic_crypto.cs_def_txkey << 6;
2010 		} else {
2011 			if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_TKIP) {
2012 				iv[0] = k->wk_keytsc >> 8;
2013 				iv[1] = (iv[0] | 0x20) & 0x7f;
2014 				iv[2] = k->wk_keytsc;
2015 			} else /* CCMP */ {
2016 				iv[0] = k->wk_keytsc;
2017 				iv[1] = k->wk_keytsc >> 8;
2018 				iv[2] = 0;
2019 			}
2020 			iv[3] = k->wk_keyix << 6 | IEEE80211_WEP_EXTIV;
2021 			iv[4] = k->wk_keytsc >> 16;
2022 			iv[5] = k->wk_keytsc >> 24;
2023 			iv[6] = k->wk_keytsc >> 32;
2024 			iv[7] = k->wk_keytsc >> 40;
2025 		}
2026 		run_write_region_1(sc, RT2860_IVEIV(wcid), iv, 8);
2027 	}
2028 
2029 	if (k->wk_flags & IEEE80211_KEY_GROUP) {
2030 		/* install group key */
2031 		run_read(sc, RT2860_SKEY_MODE_0_7, &attr);
2032 		attr &= ~(0xf << (k->wk_keyix * 4));
2033 		attr |= mode << (k->wk_keyix * 4);
2034 		run_write(sc, RT2860_SKEY_MODE_0_7, attr);
2035 	} else {
2036 		/* install pairwise key */
2037 		run_read(sc, RT2860_WCID_ATTR(wcid), &attr);
2038 		attr = (attr & ~0xf) | (mode << 1) | RT2860_RX_PKEY_EN;
2039 		run_write(sc, RT2860_WCID_ATTR(wcid), attr);
2040 	}
2041 }
2042 
2043 static int
2044 run_delete_key(struct ieee80211com *ic, const struct ieee80211_key *k)
2045 {
2046 	struct run_softc *sc = ic->ic_ifp->if_softc;
2047 	struct ieee80211_node *ni = ic->ic_bss;
2048 	struct run_cmd_key cmd;
2049 
2050 	/* do it in a process context */
2051 	cmd.key = *k;
2052 	cmd.associd = (ni != NULL) ? ni->ni_associd : 0;
2053 	run_do_async(sc, run_delete_key_cb, &cmd, sizeof(cmd));
2054 	return 1;
2055 }
2056 
2057 static void
2058 run_delete_key_cb(struct run_softc *sc, void *arg)
2059 {
2060 	struct run_cmd_key *cmd = arg;
2061 	struct ieee80211_key *k = &cmd->key;
2062 	uint32_t attr;
2063 	uint8_t wcid;
2064 
2065 	if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_WEP)
2066 		k->wk_flags |= IEEE80211_KEY_GROUP; /* XXX */
2067 
2068 	if (k->wk_flags & IEEE80211_KEY_GROUP) {
2069 		/* remove group key */
2070 		run_read(sc, RT2860_SKEY_MODE_0_7, &attr);
2071 		attr &= ~(0xf << (k->wk_keyix * 4));
2072 		run_write(sc, RT2860_SKEY_MODE_0_7, attr);
2073 
2074 	} else {
2075 		/* remove pairwise key */
2076 		wcid = RUN_AID2WCID(cmd->associd);
2077 		run_read(sc, RT2860_WCID_ATTR(wcid), &attr);
2078 		attr &= ~0xf;
2079 		run_write(sc, RT2860_WCID_ATTR(wcid), attr);
2080 	}
2081 }
2082 #endif
2083 
2084 static void
2085 run_calibrate_to(void *arg)
2086 {
2087 
2088 	/* do it in a process context */
2089 	run_do_async(arg, run_calibrate_cb, NULL, 0);
2090 	/* next timeout will be rescheduled in the calibration task */
2091 }
2092 
2093 /* ARGSUSED */
2094 static void
2095 run_calibrate_cb(struct run_softc *sc, void *arg)
2096 {
2097 	struct ifnet *ifp = &sc->sc_if;
2098 	uint32_t sta[3];
2099 	int s, error;
2100 
2101 	/* read statistic counters (clear on read) and update AMRR state */
2102 	error = run_read_region_1(sc, RT2860_TX_STA_CNT0, (uint8_t *)sta,
2103 	    sizeof(sta));
2104 	if (error != 0)
2105 		goto skip;
2106 
2107 	DPRINTF(("retrycnt=%d txcnt=%d failcnt=%d\n",
2108 	    le32toh(sta[1]) >> 16, le32toh(sta[1]) & 0xffff,
2109 	    le32toh(sta[0]) & 0xffff));
2110 
2111 	s = splnet();
2112 	/* count failed TX as errors */
2113 	ifp->if_oerrors += le32toh(sta[0]) & 0xffff;
2114 
2115 	sc->amn.amn_retrycnt =
2116 	    (le32toh(sta[0]) & 0xffff) +	/* failed TX count */
2117 	    (le32toh(sta[1]) >> 16);		/* TX retransmission count */
2118 
2119 	sc->amn.amn_txcnt =
2120 	    sc->amn.amn_retrycnt +
2121 	    (le32toh(sta[1]) & 0xffff);		/* successful TX count */
2122 
2123 	ieee80211_amrr_choose(&sc->amrr, sc->sc_ic.ic_bss, &sc->amn);
2124 	splx(s);
2125 
2126 skip:	callout_schedule(&sc->calib_to, hz);
2127 }
2128 
2129 static void
2130 run_newassoc(struct ieee80211_node *ni, int isnew)
2131 {
2132 	struct run_softc *sc = ni->ni_ic->ic_ifp->if_softc;
2133 	struct run_node *rn = (void *)ni;
2134 	struct ieee80211_rateset *rs = &ni->ni_rates;
2135 	uint8_t rate;
2136 	int ridx, i, j;
2137 
2138 	DPRINTF(("new assoc isnew=%d addr=%s\n",
2139 	    isnew, ether_sprintf(ni->ni_macaddr)));
2140 
2141 	ieee80211_amrr_node_init(&sc->amrr, &sc->amn);
2142 	/* start at lowest available bit-rate, AMRR will raise */
2143 	ni->ni_txrate = 0;
2144 
2145 	for (i = 0; i < rs->rs_nrates; i++) {
2146 		rate = rs->rs_rates[i] & IEEE80211_RATE_VAL;
2147 		/* convert 802.11 rate to hardware rate index */
2148 		for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++)
2149 			if (rt2860_rates[ridx].rate == rate)
2150 				break;
2151 		rn->ridx[i] = ridx;
2152 		/* determine rate of control response frames */
2153 		for (j = i; j >= 0; j--) {
2154 			if ((rs->rs_rates[j] & IEEE80211_RATE_BASIC) &&
2155 			    rt2860_rates[rn->ridx[i]].phy ==
2156 			    rt2860_rates[rn->ridx[j]].phy)
2157 				break;
2158 		}
2159 		if (j >= 0) {
2160 			rn->ctl_ridx[i] = rn->ridx[j];
2161 		} else {
2162 			/* no basic rate found, use mandatory one */
2163 			rn->ctl_ridx[i] = rt2860_rates[ridx].ctl_ridx;
2164 		}
2165 		DPRINTF(("rate=0x%02x ridx=%d ctl_ridx=%d\n",
2166 		    rs->rs_rates[i], rn->ridx[i], rn->ctl_ridx[i]));
2167 	}
2168 }
2169 
2170 /*
2171  * Return the Rx chain with the highest RSSI for a given frame.
2172  */
2173 static __inline uint8_t
2174 run_maxrssi_chain(struct run_softc *sc, const struct rt2860_rxwi *rxwi)
2175 {
2176 	uint8_t rxchain = 0;
2177 
2178 	if (sc->nrxchains > 1) {
2179 		if (rxwi->rssi[1] > rxwi->rssi[rxchain])
2180 			rxchain = 1;
2181 		if (sc->nrxchains > 2)
2182 			if (rxwi->rssi[2] > rxwi->rssi[rxchain])
2183 				rxchain = 2;
2184 	}
2185 	return rxchain;
2186 }
2187 
2188 static void
2189 run_rx_frame(struct run_softc *sc, uint8_t *buf, int dmalen)
2190 {
2191 	struct ieee80211com *ic = &sc->sc_ic;
2192 	struct ifnet *ifp = &sc->sc_if;
2193 	struct ieee80211_frame *wh;
2194 	struct ieee80211_node *ni;
2195 	struct rt2870_rxd *rxd;
2196 	struct rt2860_rxwi *rxwi;
2197 	struct mbuf *m;
2198 	uint32_t flags;
2199 	uint16_t len, rxwisize, phy;
2200 	uint8_t ant, rssi;
2201 	int s;
2202 #ifdef RUN_HWCRYPTO
2203 	int decrypted = 0;
2204 #endif
2205 
2206 	rxwi = (struct rt2860_rxwi *)buf;
2207 	len = le16toh(rxwi->len) & 0xfff;
2208 	if (__predict_false(len > dmalen)) {
2209 		DPRINTF(("bad RXWI length %u > %u\n", len, dmalen));
2210 		return;
2211 	}
2212 	/* Rx descriptor is located at the end */
2213 	rxd = (struct rt2870_rxd *)(buf + dmalen);
2214 	flags = le32toh(rxd->flags);
2215 
2216 	if (__predict_false(flags & (RT2860_RX_CRCERR | RT2860_RX_ICVERR))) {
2217 		ifp->if_ierrors++;
2218 		return;
2219 	}
2220 
2221 	rxwisize = sizeof(struct rt2860_rxwi);
2222 	if (sc->mac_ver == 0x5592)
2223 		rxwisize += sizeof(uint64_t);
2224 	else if (sc->mac_ver == 0x3593)
2225 		rxwisize += sizeof(uint32_t);
2226 
2227 	wh = (struct ieee80211_frame *)(((uint8_t *)rxwi) + rxwisize);
2228 #ifdef RUN_HWCRYPTO
2229 	if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
2230 		wh->i_fc[1] &= ~IEEE80211_FC1_WEP;
2231 		decrypted = 1;
2232 	}
2233 #endif
2234 
2235 	if (__predict_false((flags & RT2860_RX_MICERR))) {
2236 		/* report MIC failures to net80211 for TKIP */
2237 		ieee80211_notify_michael_failure(ic, wh, 0/* XXX */);
2238 		ifp->if_ierrors++;
2239 		return;
2240 	}
2241 
2242 	if (flags & RT2860_RX_L2PAD) {
2243 		u_int hdrlen = ieee80211_hdrspace(ic, wh);
2244 		memmove((uint8_t *)wh + 2, wh, hdrlen);
2245 		wh = (struct ieee80211_frame *)((uint8_t *)wh + 2);
2246 	}
2247 
2248 	/* could use m_devget but net80211 wants contig mgmt frames */
2249 	MGETHDR(m, M_DONTWAIT, MT_DATA);
2250 	if (__predict_false(m == NULL)) {
2251 		ifp->if_ierrors++;
2252 		return;
2253 	}
2254 	if (len > MHLEN) {
2255 		MCLGET(m, M_DONTWAIT);
2256 		if (__predict_false(!(m->m_flags & M_EXT))) {
2257 			ifp->if_ierrors++;
2258 			m_freem(m);
2259 			return;
2260 		}
2261 	}
2262 	/* finalize mbuf */
2263 	m_set_rcvif(m, ifp);
2264 	memcpy(mtod(m, void *), wh, len);
2265 	m->m_pkthdr.len = m->m_len = len;
2266 
2267 	ant = run_maxrssi_chain(sc, rxwi);
2268 	rssi = rxwi->rssi[ant];
2269 
2270 	if (__predict_false(sc->sc_drvbpf != NULL)) {
2271 		struct run_rx_radiotap_header *tap = &sc->sc_rxtap;
2272 
2273 		tap->wr_flags = 0;
2274 		tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq);
2275 		tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags);
2276 		tap->wr_antsignal = rssi;
2277 		tap->wr_antenna = ant;
2278 		tap->wr_dbm_antsignal = run_rssi2dbm(sc, rssi, ant);
2279 		tap->wr_rate = 2;	/* in case it can't be found below */
2280 		phy = le16toh(rxwi->phy);
2281 		switch (phy & RT2860_PHY_MODE) {
2282 		case RT2860_PHY_CCK:
2283 			switch ((phy & RT2860_PHY_MCS) & ~RT2860_PHY_SHPRE) {
2284 			case 0:	tap->wr_rate =   2; break;
2285 			case 1:	tap->wr_rate =   4; break;
2286 			case 2:	tap->wr_rate =  11; break;
2287 			case 3:	tap->wr_rate =  22; break;
2288 			}
2289 			if (phy & RT2860_PHY_SHPRE)
2290 				tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
2291 			break;
2292 		case RT2860_PHY_OFDM:
2293 			switch (phy & RT2860_PHY_MCS) {
2294 			case 0:	tap->wr_rate =  12; break;
2295 			case 1:	tap->wr_rate =  18; break;
2296 			case 2:	tap->wr_rate =  24; break;
2297 			case 3:	tap->wr_rate =  36; break;
2298 			case 4:	tap->wr_rate =  48; break;
2299 			case 5:	tap->wr_rate =  72; break;
2300 			case 6:	tap->wr_rate =  96; break;
2301 			case 7:	tap->wr_rate = 108; break;
2302 			}
2303 			break;
2304 		}
2305 		bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m);
2306 	}
2307 
2308 	s = splnet();
2309 	ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh);
2310 #ifdef RUN_HWCRYPTO
2311 	if (decrypted) {
2312 		uint32_t icflags = ic->ic_flags;
2313 
2314 		ic->ic_flags &= ~IEEE80211_F_DROPUNENC; /* XXX */
2315 		ieee80211_input(ic, m, ni, rssi, 0);
2316 		ic->ic_flags = icflags;
2317 	} else
2318 #endif
2319 	ieee80211_input(ic, m, ni, rssi, 0);
2320 
2321 	/* node is no longer needed */
2322 	ieee80211_free_node(ni);
2323 
2324 	/*
2325 	 * In HostAP mode, ieee80211_input() will enqueue packets in if_snd
2326 	 * without calling if_start().
2327 	 */
2328 	if (!IFQ_IS_EMPTY(&ifp->if_snd) && !(ifp->if_flags & IFF_OACTIVE))
2329 		run_start(ifp);
2330 
2331 	splx(s);
2332 }
2333 
2334 static void
2335 run_rxeof(struct usbd_xfer *xfer, void *priv, usbd_status status)
2336 {
2337 	struct run_rx_data *data = priv;
2338 	struct run_softc *sc = data->sc;
2339 	uint8_t *buf;
2340 	uint32_t dmalen;
2341 	int xferlen;
2342 
2343 	if (__predict_false(sc->sc_flags & RUN_DETACHING))
2344 		return;
2345 
2346 	if (__predict_false(status != USBD_NORMAL_COMPLETION)) {
2347 		DPRINTF(("RX status=%d\n", status));
2348 		if (status == USBD_STALLED)
2349 			usbd_clear_endpoint_stall_async(sc->rxq.pipeh);
2350 		if (status != USBD_CANCELLED)
2351 			goto skip;
2352 		return;
2353 	}
2354 	usbd_get_xfer_status(xfer, NULL, NULL, &xferlen, NULL);
2355 
2356 	if (__predict_false(xferlen < (int)(sizeof(uint32_t) +
2357 	    sizeof(struct rt2860_rxwi) + sizeof(struct rt2870_rxd)))) {
2358 		DPRINTF(("xfer too short %d\n", xferlen));
2359 		goto skip;
2360 	}
2361 
2362 	/* HW can aggregate multiple 802.11 frames in a single USB xfer */
2363 	buf = data->buf;
2364 	while (xferlen > 8) {
2365 		dmalen = le32toh(*(uint32_t *)buf) & 0xffff;
2366 
2367 		if (__predict_false((dmalen >= (uint32_t)-8) || dmalen == 0 ||
2368 		    (dmalen & 3) != 0)) {
2369 			DPRINTF(("bad DMA length %u (%x)\n", dmalen, dmalen));
2370 			break;
2371 		}
2372 		if (__predict_false(dmalen + 8 > (uint32_t)xferlen)) {
2373 			DPRINTF(("bad DMA length %u > %d\n",
2374 			    dmalen + 8, xferlen));
2375 			break;
2376 		}
2377 		run_rx_frame(sc, buf + sizeof(uint32_t), dmalen);
2378 		buf += dmalen + 8;
2379 		xferlen -= dmalen + 8;
2380 	}
2381 
2382 skip:	/* setup a new transfer */
2383 	usbd_setup_xfer(xfer, data, data->buf, RUN_MAX_RXSZ,
2384 	    USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, run_rxeof);
2385 	(void)usbd_transfer(xfer);
2386 }
2387 
2388 static void
2389 run_txeof(struct usbd_xfer *xfer, void *priv, usbd_status status)
2390 {
2391 	struct run_tx_data *data = priv;
2392 	struct run_softc *sc = data->sc;
2393 	struct run_tx_ring *txq = &sc->txq[data->qid];
2394 	struct ifnet *ifp = &sc->sc_if;
2395 	int s;
2396 
2397 	if (__predict_false(status != USBD_NORMAL_COMPLETION)) {
2398 		DPRINTF(("TX status=%d\n", status));
2399 		if (status == USBD_STALLED)
2400 			usbd_clear_endpoint_stall_async(txq->pipeh);
2401 		ifp->if_oerrors++;
2402 		return;
2403 	}
2404 
2405 	s = splnet();
2406 	sc->sc_tx_timer = 0;
2407 	ifp->if_opackets++;
2408 	if (--txq->queued < RUN_TX_RING_COUNT) {
2409 		sc->qfullmsk &= ~(1 << data->qid);
2410 		ifp->if_flags &= ~IFF_OACTIVE;
2411 		run_start(ifp);
2412 	}
2413 	splx(s);
2414 }
2415 
2416 static int
2417 run_tx(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
2418 {
2419 	struct ieee80211com *ic = &sc->sc_ic;
2420 	struct run_node *rn = (void *)ni;
2421 	struct ieee80211_frame *wh;
2422 #ifndef RUN_HWCRYPTO
2423 	struct ieee80211_key *k;
2424 #endif
2425 	struct run_tx_ring *ring;
2426 	struct run_tx_data *data;
2427 	struct rt2870_txd *txd;
2428 	struct rt2860_txwi *txwi;
2429 	uint16_t dur, mcs;
2430 	uint8_t type, tid, qid, qos = 0;
2431 	int error, hasqos, ridx, ctl_ridx, xferlen, txwisize;
2432 	uint8_t pad;
2433 
2434 	wh = mtod(m, struct ieee80211_frame *);
2435 
2436 #ifndef RUN_HWCRYPTO
2437 	if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
2438 		k = ieee80211_crypto_encap(ic, ni, m);
2439 		if (k == NULL) {
2440 			m_freem(m);
2441 			return ENOBUFS;
2442 		}
2443 
2444 		/* packet header may have moved, reset our local pointer */
2445 		wh = mtod(m, struct ieee80211_frame *);
2446 	}
2447 #endif
2448 	type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
2449 
2450 	if ((hasqos = ieee80211_has_qos(wh))) {
2451 		qos = ((struct ieee80211_qosframe *)wh)->i_qos[0];
2452 		tid = qos & IEEE80211_QOS_TID;
2453 		qid = TID_TO_WME_AC(tid);
2454 	} else {
2455 		tid = 0;
2456 		qid = WME_AC_BE;
2457 	}
2458 	ring = &sc->txq[qid];
2459 	data = &ring->data[ring->cur];
2460 
2461 	/* pickup a rate index */
2462 	if (IEEE80211_IS_MULTICAST(wh->i_addr1) ||
2463 	    type != IEEE80211_FC0_TYPE_DATA) {
2464 		ridx = (ic->ic_curmode == IEEE80211_MODE_11A) ?
2465 		    RT2860_RIDX_OFDM6 : RT2860_RIDX_CCK1;
2466 		ctl_ridx = rt2860_rates[ridx].ctl_ridx;
2467 	} else if (ic->ic_fixed_rate != IEEE80211_FIXED_RATE_NONE) {
2468 		ridx = sc->fixed_ridx;
2469 		ctl_ridx = rt2860_rates[ridx].ctl_ridx;
2470 	} else {
2471 		ridx = rn->ridx[ni->ni_txrate];
2472 		ctl_ridx = rn->ctl_ridx[ni->ni_txrate];
2473 	}
2474 
2475 	/* get MCS code from rate index */
2476 	mcs = rt2860_rates[ridx].mcs;
2477 
2478 	txwisize = (sc->mac_ver == 0x5592) ?
2479 	    sizeof(*txwi) + sizeof(uint32_t) : sizeof(*txwi);
2480 	xferlen = txwisize + m->m_pkthdr.len;
2481 	/* roundup to 32-bit alignment */
2482 	xferlen = (xferlen + 3) & ~3;
2483 
2484 	txd = (struct rt2870_txd *)data->buf;
2485 	txd->flags = RT2860_TX_QSEL_EDCA;
2486 	txd->len = htole16(xferlen);
2487 
2488 	/*
2489 	 * Ether both are true or both are false, the header
2490 	 * are nicely aligned to 32-bit. So, no L2 padding.
2491 	 */
2492 	if (IEEE80211_HAS_ADDR4(wh) == IEEE80211_QOS_HAS_SEQ(wh))
2493 		pad = 0;
2494 	else
2495 		pad = 2;
2496 
2497 	/* setup TX Wireless Information */
2498 	txwi = (struct rt2860_txwi *)(txd + 1);
2499 	txwi->flags = 0;
2500 	txwi->xflags = hasqos ? 0 : RT2860_TX_NSEQ;
2501 	txwi->wcid = (type == IEEE80211_FC0_TYPE_DATA) ?
2502 	    RUN_AID2WCID(ni->ni_associd) : 0xff;
2503 	txwi->len = htole16(m->m_pkthdr.len - pad);
2504 	if (rt2860_rates[ridx].phy == IEEE80211_T_DS) {
2505 		txwi->phy = htole16(RT2860_PHY_CCK);
2506 		if (ridx != RT2860_RIDX_CCK1 &&
2507 		    (ic->ic_flags & IEEE80211_F_SHPREAMBLE))
2508 			mcs |= RT2860_PHY_SHPRE;
2509 	} else
2510 		mcs |= RT2860_PHY_OFDM;
2511 	txwi->phy |= htole16(mcs);
2512 
2513 	txwi->txop = RT2860_TX_TXOP_BACKOFF;
2514 
2515 	if (!IEEE80211_IS_MULTICAST(wh->i_addr1) &&
2516 	    (!hasqos || (qos & IEEE80211_QOS_ACKPOLICY) !=
2517 	    IEEE80211_QOS_ACKPOLICY_NOACK)) {
2518 		txwi->xflags |= RT2860_TX_ACK;
2519 		if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
2520 			dur = rt2860_rates[ctl_ridx].sp_ack_dur;
2521 		else
2522 			dur = rt2860_rates[ctl_ridx].lp_ack_dur;
2523 		*(uint16_t *)wh->i_dur = htole16(dur);
2524 	}
2525 
2526 #ifndef IEEE80211_STA_ONLY
2527 	/* ask MAC to insert timestamp into probe responses */
2528 	if ((wh->i_fc[0] &
2529 	    (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_MASK)) ==
2530 	    (IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_PROBE_RESP))
2531 	    /* NOTE: beacons do not pass through tx_data() */
2532 		txwi->flags |= RT2860_TX_TS;
2533 #endif
2534 
2535 	if (__predict_false(sc->sc_drvbpf != NULL)) {
2536 		struct run_tx_radiotap_header *tap = &sc->sc_txtap;
2537 
2538 		tap->wt_flags = 0;
2539 		tap->wt_rate = rt2860_rates[ridx].rate;
2540 		tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq);
2541 		tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags);
2542 		tap->wt_hwqueue = qid;
2543 		if (mcs & RT2860_PHY_SHPRE)
2544 			tap->wt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
2545 
2546 		bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m);
2547 	}
2548 
2549 	m_copydata(m, 0, m->m_pkthdr.len, ((uint8_t *)txwi) + txwisize);
2550 	m_freem(m);
2551 
2552 	xferlen += sizeof(*txd) + 4;
2553 
2554 	usbd_setup_xfer(data->xfer, data, data->buf, xferlen,
2555 	    USBD_FORCE_SHORT_XFER, RUN_TX_TIMEOUT, run_txeof);
2556 	error = usbd_transfer(data->xfer);
2557 	if (__predict_false(error != USBD_IN_PROGRESS &&
2558 	    error != USBD_NORMAL_COMPLETION))
2559 		return error;
2560 
2561 	ieee80211_free_node(ni);
2562 
2563 	ring->cur = (ring->cur + 1) % RUN_TX_RING_COUNT;
2564 	if (++ring->queued >= RUN_TX_RING_COUNT)
2565 		sc->qfullmsk |= 1 << qid;
2566 
2567 	return 0;
2568 }
2569 
2570 static void
2571 run_start(struct ifnet *ifp)
2572 {
2573 	struct run_softc *sc = ifp->if_softc;
2574 	struct ieee80211com *ic = &sc->sc_ic;
2575 	struct ether_header *eh;
2576 	struct ieee80211_node *ni;
2577 	struct mbuf *m;
2578 
2579 	if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
2580 		return;
2581 
2582 	for (;;) {
2583 		if (sc->qfullmsk != 0) {
2584 			ifp->if_flags |= IFF_OACTIVE;
2585 			break;
2586 		}
2587 		/* send pending management frames first */
2588 		IF_DEQUEUE(&ic->ic_mgtq, m);
2589 		if (m != NULL) {
2590 			ni = M_GETCTX(m, struct ieee80211_node *);
2591 			M_CLEARCTX(m);
2592 			goto sendit;
2593 		}
2594 		if (ic->ic_state != IEEE80211_S_RUN)
2595 			break;
2596 
2597 		/* encapsulate and send data frames */
2598 		IFQ_DEQUEUE(&ifp->if_snd, m);
2599 		if (m == NULL)
2600 			break;
2601 		if (m->m_len < (int)sizeof(*eh) &&
2602 		    (m = m_pullup(m, sizeof(*eh))) == NULL) {
2603 			ifp->if_oerrors++;
2604 			continue;
2605 		}
2606 
2607 		eh = mtod(m, struct ether_header *);
2608 		ni = ieee80211_find_txnode(ic, eh->ether_dhost);
2609 		if (ni == NULL) {
2610 			m_freem(m);
2611 			ifp->if_oerrors++;
2612 			continue;
2613 		}
2614 
2615 		bpf_mtap(ifp, m);
2616 
2617 		if ((m = ieee80211_encap(ic, m, ni)) == NULL) {
2618 			ieee80211_free_node(ni);
2619 			ifp->if_oerrors++;
2620 			continue;
2621 		}
2622 sendit:
2623 		bpf_mtap3(ic->ic_rawbpf, m);
2624 
2625 		if (run_tx(sc, m, ni) != 0) {
2626 			ieee80211_free_node(ni);
2627 			ifp->if_oerrors++;
2628 			continue;
2629 		}
2630 
2631 		sc->sc_tx_timer = 5;
2632 		ifp->if_timer = 1;
2633 	}
2634 }
2635 
2636 static void
2637 run_watchdog(struct ifnet *ifp)
2638 {
2639 	struct run_softc *sc = ifp->if_softc;
2640 	struct ieee80211com *ic = &sc->sc_ic;
2641 
2642 	ifp->if_timer = 0;
2643 
2644 	if (sc->sc_tx_timer > 0) {
2645 		if (--sc->sc_tx_timer == 0) {
2646 			aprint_error_dev(sc->sc_dev, "device timeout\n");
2647 			/* run_init(ifp); XXX needs a process context! */
2648 			ifp->if_oerrors++;
2649 			return;
2650 		}
2651 		ifp->if_timer = 1;
2652 	}
2653 
2654 	ieee80211_watchdog(ic);
2655 }
2656 
2657 static int
2658 run_ioctl(struct ifnet *ifp, u_long cmd, void *data)
2659 {
2660 	struct run_softc *sc = ifp->if_softc;
2661 	struct ieee80211com *ic = &sc->sc_ic;
2662 	int s, error = 0;
2663 
2664 	s = splnet();
2665 
2666 	switch (cmd) {
2667 	case SIOCSIFFLAGS:
2668 		if ((error = ifioctl_common(ifp, cmd, data)) != 0)
2669 			break;
2670 		switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
2671 		case IFF_UP|IFF_RUNNING:
2672 			break;
2673 		case IFF_UP:
2674 			run_init(ifp);
2675 			break;
2676 		case IFF_RUNNING:
2677 			run_stop(ifp, 1);
2678 			break;
2679 		case 0:
2680 			break;
2681 		}
2682 		break;
2683 
2684 	case SIOCADDMULTI:
2685 	case SIOCDELMULTI:
2686 		if ((error = ether_ioctl(ifp, cmd, data)) == ENETRESET) {
2687 			/* setup multicast filter, etc */
2688 			error = 0;
2689 		}
2690 		break;
2691 
2692 	default:
2693 		error = ieee80211_ioctl(ic, cmd, data);
2694 		break;
2695 	}
2696 
2697 	if (error == ENETRESET) {
2698 		if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) ==
2699 		    (IFF_UP | IFF_RUNNING)) {
2700 			run_init(ifp);
2701 		}
2702 		error = 0;
2703 	}
2704 
2705 	splx(s);
2706 
2707 	return error;
2708 }
2709 
2710 static void
2711 run_select_chan_group(struct run_softc *sc, int group)
2712 {
2713 	uint32_t tmp;
2714 	uint8_t agc;
2715 
2716 	run_bbp_write(sc, 62, 0x37 - sc->lna[group]);
2717 	run_bbp_write(sc, 63, 0x37 - sc->lna[group]);
2718 	run_bbp_write(sc, 64, 0x37 - sc->lna[group]);
2719 	run_bbp_write(sc, 86, 0x00);
2720 
2721 	if (group == 0) {
2722 		if (sc->ext_2ghz_lna) {
2723 			run_bbp_write(sc, 82, 0x62);
2724 			run_bbp_write(sc, 75, 0x46);
2725 		} else {
2726 			run_bbp_write(sc, 82, 0x84);
2727 			run_bbp_write(sc, 75, 0x50);
2728 		}
2729 	} else {
2730 		if (sc->mac_ver == 0x3572)
2731 			run_bbp_write(sc, 82, 0x94);
2732 		else
2733 			run_bbp_write(sc, 82, 0xf2);
2734 		if (sc->ext_5ghz_lna)
2735 			run_bbp_write(sc, 75, 0x46);
2736 		else
2737 			run_bbp_write(sc, 75, 0x50);
2738 	}
2739 
2740 	run_read(sc, RT2860_TX_BAND_CFG, &tmp);
2741 	tmp &= ~(RT2860_5G_BAND_SEL_N | RT2860_5G_BAND_SEL_P);
2742 	tmp |= (group == 0) ? RT2860_5G_BAND_SEL_N : RT2860_5G_BAND_SEL_P;
2743 	run_write(sc, RT2860_TX_BAND_CFG, tmp);
2744 
2745 	/* enable appropriate Power Amplifiers and Low Noise Amplifiers */
2746 	tmp = RT2860_RFTR_EN | RT2860_TRSW_EN | RT2860_LNA_PE0_EN;
2747 	if (sc->nrxchains > 1)
2748 		tmp |= RT2860_LNA_PE1_EN;
2749 	if (group == 0) {	/* 2GHz */
2750 		tmp |= RT2860_PA_PE_G0_EN;
2751 		if (sc->ntxchains > 1)
2752 			tmp |= RT2860_PA_PE_G1_EN;
2753 	} else {		/* 5GHz */
2754 		tmp |= RT2860_PA_PE_A0_EN;
2755 		if (sc->ntxchains > 1)
2756 			tmp |= RT2860_PA_PE_A1_EN;
2757 	}
2758 	if (sc->mac_ver == 0x3572) {
2759 		run_rt3070_rf_write(sc, 8, 0x00);
2760 		run_write(sc, RT2860_TX_PIN_CFG, tmp);
2761 		run_rt3070_rf_write(sc, 8, 0x80);
2762 	} else
2763 		run_write(sc, RT2860_TX_PIN_CFG, tmp);
2764 
2765 	/* set initial AGC value */
2766 	if (group == 0) {       /* 2GHz band */
2767 		if (sc->mac_ver >= 0x3070)
2768 			agc = 0x1c + sc->lna[0] * 2;
2769 		else
2770 			agc = 0x2e + sc->lna[0];
2771 	} else {		/* 5GHz band */
2772 		if (sc->mac_ver == 0x3572)
2773 			agc = 0x22 + (sc->lna[group] * 5) / 3;
2774 		else
2775 			agc = 0x32 + (sc->lna[group] * 5) / 3;
2776 	}
2777 	run_set_agc(sc, agc);
2778 }
2779 
2780 static void
2781 run_rt2870_set_chan(struct run_softc *sc, u_int chan)
2782 {
2783 	const struct rfprog *rfprog = rt2860_rf2850;
2784 	uint32_t r2, r3, r4;
2785 	int8_t txpow1, txpow2;
2786 	int i;
2787 
2788 	/* find the settings for this channel (we know it exists) */
2789 	for (i = 0; rfprog[i].chan != chan; i++);
2790 
2791 	r2 = rfprog[i].r2;
2792 	if (sc->ntxchains == 1)
2793 		r2 |= 1 << 12;		/* 1T: disable Tx chain 2 */
2794 	if (sc->nrxchains == 1)
2795 		r2 |= 1 << 15 | 1 << 4;	/* 1R: disable Rx chains 2 & 3 */
2796 	else if (sc->nrxchains == 2)
2797 		r2 |= 1 << 4;		/* 2R: disable Rx chain 3 */
2798 
2799 	/* use Tx power values from EEPROM */
2800 	txpow1 = sc->txpow1[i];
2801 	txpow2 = sc->txpow2[i];
2802 	if (chan > 14) {
2803 		if (txpow1 >= 0)
2804 			txpow1 = txpow1 << 1 | 1;
2805 		else
2806 			txpow1 = (7 + txpow1) << 1;
2807 		if (txpow2 >= 0)
2808 			txpow2 = txpow2 << 1 | 1;
2809 		else
2810 			txpow2 = (7 + txpow2) << 1;
2811 	}
2812 	r3 = rfprog[i].r3 | txpow1 << 7;
2813 	r4 = rfprog[i].r4 | sc->freq << 13 | txpow2 << 4;
2814 
2815 	run_rt2870_rf_write(sc, RT2860_RF1, rfprog[i].r1);
2816 	run_rt2870_rf_write(sc, RT2860_RF2, r2);
2817 	run_rt2870_rf_write(sc, RT2860_RF3, r3);
2818 	run_rt2870_rf_write(sc, RT2860_RF4, r4);
2819 
2820 	usbd_delay_ms(sc->sc_udev, 10);
2821 
2822 	run_rt2870_rf_write(sc, RT2860_RF1, rfprog[i].r1);
2823 	run_rt2870_rf_write(sc, RT2860_RF2, r2);
2824 	run_rt2870_rf_write(sc, RT2860_RF3, r3 | 1);
2825 	run_rt2870_rf_write(sc, RT2860_RF4, r4);
2826 
2827 	usbd_delay_ms(sc->sc_udev, 10);
2828 
2829 	run_rt2870_rf_write(sc, RT2860_RF1, rfprog[i].r1);
2830 	run_rt2870_rf_write(sc, RT2860_RF2, r2);
2831 	run_rt2870_rf_write(sc, RT2860_RF3, r3);
2832 	run_rt2870_rf_write(sc, RT2860_RF4, r4);
2833 }
2834 
2835 static void
2836 run_rt3070_set_chan(struct run_softc *sc, u_int chan)
2837 {
2838 	int8_t txpow1, txpow2;
2839 	uint8_t rf;
2840 	int i;
2841 
2842 	KASSERT(chan >= 1 && chan <= 14);	/* RT3070 is 2GHz only */
2843 
2844 	/* find the settings for this channel (we know it exists) */
2845 	for (i = 0; rt2860_rf2850[i].chan != chan; i++)
2846 		continue;
2847 
2848 	/* use Tx power values from EEPROM */
2849 	txpow1 = sc->txpow1[i];
2850 	txpow2 = sc->txpow2[i];
2851 
2852 	run_rt3070_rf_write(sc, 2, rt3070_freqs[i].n);
2853 	run_rt3070_rf_write(sc, 3, rt3070_freqs[i].k);
2854 	run_rt3070_rf_read(sc, 6, &rf);
2855 	rf = (rf & ~0x03) | rt3070_freqs[i].r;
2856 	run_rt3070_rf_write(sc, 6, rf);
2857 
2858 	/* set Tx0 power */
2859 	run_rt3070_rf_read(sc, 12, &rf);
2860 	rf = (rf & ~0x1f) | txpow1;
2861 	run_rt3070_rf_write(sc, 12, rf);
2862 
2863 	/* set Tx1 power */
2864 	run_rt3070_rf_read(sc, 13, &rf);
2865 	rf = (rf & ~0x1f) | txpow2;
2866 	run_rt3070_rf_write(sc, 13, rf);
2867 
2868 	run_rt3070_rf_read(sc, 1, &rf);
2869 	rf &= ~0xfc;
2870 	if (sc->ntxchains == 1)
2871 		rf |= 1 << 7 | 1 << 5;	/* 1T: disable Tx chains 2 & 3 */
2872 	else if (sc->ntxchains == 2)
2873 		rf |= 1 << 7;		/* 2T: disable Tx chain 3 */
2874 	if (sc->nrxchains == 1)
2875 		rf |= 1 << 6 | 1 << 4;	/* 1R: disable Rx chains 2 & 3 */
2876 	else if (sc->nrxchains == 2)
2877 		rf |= 1 << 6;		/* 2R: disable Rx chain 3 */
2878 	run_rt3070_rf_write(sc, 1, rf);
2879 
2880 	/* set RF offset */
2881 	run_rt3070_rf_read(sc, 23, &rf);
2882 	rf = (rf & ~0x7f) | sc->freq;
2883 	run_rt3070_rf_write(sc, 23, rf);
2884 
2885 	/* program RF filter */
2886 	run_rt3070_rf_read(sc, 24, &rf);        /* Tx */
2887 	rf = (rf & ~0x3f) | sc->rf24_20mhz;
2888 	run_rt3070_rf_write(sc, 24, rf);
2889 	run_rt3070_rf_read(sc, 31, &rf);        /* Rx */
2890 	rf = (rf & ~0x3f) | sc->rf24_20mhz;
2891 	run_rt3070_rf_write(sc, 31, rf);
2892 
2893 	/* enable RF tuning */
2894 	run_rt3070_rf_read(sc, 7, &rf);
2895 	run_rt3070_rf_write(sc, 7, rf | 0x01);
2896 }
2897 
2898 static void
2899 run_rt3572_set_chan(struct run_softc *sc, u_int chan)
2900 {
2901 	int8_t txpow1, txpow2;
2902 	uint32_t tmp;
2903 	uint8_t rf;
2904 	int i;
2905 
2906 	/* find the settings for this channel (we know it exists) */
2907 	for (i = 0; rt2860_rf2850[i].chan != chan; i++);
2908 
2909 	/* use Tx power values from EEPROM */
2910 	txpow1 = sc->txpow1[i];
2911 	txpow2 = sc->txpow2[i];
2912 
2913 	if (chan <= 14) {
2914 		run_bbp_write(sc, 25, sc->bbp25);
2915 		run_bbp_write(sc, 26, sc->bbp26);
2916 	} else {
2917 		/* enable IQ phase correction */
2918 		run_bbp_write(sc, 25, 0x09);
2919 		run_bbp_write(sc, 26, 0xff);
2920 	}
2921 
2922 	run_rt3070_rf_write(sc, 2, rt3070_freqs[i].n);
2923 	run_rt3070_rf_write(sc, 3, rt3070_freqs[i].k);
2924 	run_rt3070_rf_read(sc, 6, &rf);
2925 	rf  = (rf & ~0x0f) | rt3070_freqs[i].r;
2926 	rf |= (chan <= 14) ? 0x08 : 0x04;
2927 	run_rt3070_rf_write(sc, 6, rf);
2928 
2929 	/* set PLL mode */
2930 	run_rt3070_rf_read(sc, 5, &rf);
2931 	rf &= ~(0x08 | 0x04);
2932 	rf |= (chan <= 14) ? 0x04 : 0x08;
2933 	run_rt3070_rf_write(sc, 5, rf);
2934 
2935 	/* set Tx power for chain 0 */
2936 	if (chan <= 14)
2937 		rf = 0x60 | txpow1;
2938 	else
2939 		rf = 0xe0 | (txpow1 & 0xc) << 1 | (txpow1 & 0x3);
2940 	run_rt3070_rf_write(sc, 12, rf);
2941 
2942 	/* set Tx power for chain 1 */
2943 	if (chan <= 14)
2944 		rf = 0x60 | txpow2;
2945 	else
2946 		rf = 0xe0 | (txpow2 & 0xc) << 1 | (txpow2 & 0x3);
2947 	run_rt3070_rf_write(sc, 13, rf);
2948 
2949 	/* set Tx/Rx streams */
2950 	run_rt3070_rf_read(sc, 1, &rf);
2951 	rf &= ~0xfc;
2952 	if (sc->ntxchains == 1)
2953 		rf |= 1 << 7 | 1 << 5;	/* 1T: disable Tx chains 2 & 3 */
2954 	else if (sc->ntxchains == 2)
2955 		rf |= 1 << 7;		/* 2T: disable Tx chain 3 */
2956 	if (sc->nrxchains == 1)
2957 		rf |= 1 << 6 | 1 << 4;	/* 1R: disable Rx chains 2 & 3 */
2958 	else if (sc->nrxchains == 2)
2959 		rf |= 1 << 6;		/* 2R: disable Rx chain 3 */
2960 	run_rt3070_rf_write(sc, 1, rf);
2961 
2962 	/* set RF offset */
2963 	run_rt3070_rf_read(sc, 23, &rf);
2964 	rf = (rf & ~0x7f) | sc->freq;
2965 	run_rt3070_rf_write(sc, 23, rf);
2966 
2967 	/* program RF filter */
2968 	rf = sc->rf24_20mhz;
2969 	run_rt3070_rf_write(sc, 24, rf);	/* Tx */
2970 	run_rt3070_rf_write(sc, 31, rf);	/* Rx */
2971 
2972 	/* enable RF tuning */
2973 	run_rt3070_rf_read(sc, 7, &rf);
2974 	rf = (chan <= 14) ? 0xd8 : ((rf & ~0xc8) | 0x14);
2975 	run_rt3070_rf_write(sc, 7, rf);
2976 
2977 	/* TSSI */
2978 	rf = (chan <= 14) ? 0xc3 : 0xc0;
2979 	run_rt3070_rf_write(sc, 9, rf);
2980 
2981 	/* set loop filter 1 */
2982 	run_rt3070_rf_write(sc, 10, 0xf1);
2983 	/* set loop filter 2 */
2984 	run_rt3070_rf_write(sc, 11, (chan <= 14) ? 0xb9 : 0x00);
2985 
2986 	/* set tx_mx2_ic */
2987 	run_rt3070_rf_write(sc, 15, (chan <= 14) ? 0x53 : 0x43);
2988 	/* set tx_mx1_ic */
2989 	if (chan <= 14)
2990 		rf = 0x48 | sc->txmixgain_2ghz;
2991 	else
2992 		rf = 0x78 | sc->txmixgain_5ghz;
2993 	run_rt3070_rf_write(sc, 16, rf);
2994 
2995 	/* set tx_lo1 */
2996 	run_rt3070_rf_write(sc, 17, 0x23);
2997 	/* set tx_lo2 */
2998 	if (chan <= 14)
2999 		rf = 0x93;
3000 	else if (chan <= 64)
3001 		rf = 0xb7;
3002 	else if (chan <= 128)
3003 		rf = 0x74;
3004 	else
3005 		rf = 0x72;
3006 	run_rt3070_rf_write(sc, 19, rf);
3007 
3008 	/* set rx_lo1 */
3009 	if (chan <= 14)
3010 		rf = 0xb3;
3011 	else if (chan <= 64)
3012 		rf = 0xf6;
3013 	else if (chan <= 128)
3014 		rf = 0xf4;
3015 	else
3016 		rf = 0xf3;
3017 	run_rt3070_rf_write(sc, 20, rf);
3018 
3019 	/* set pfd_delay */
3020 	if (chan <= 14)
3021 		rf = 0x15;
3022 	else if (chan <= 64)
3023 		rf = 0x3d;
3024 	else
3025 		rf = 0x01;
3026 	run_rt3070_rf_write(sc, 25, rf);
3027 
3028 	/* set rx_lo2 */
3029 	run_rt3070_rf_write(sc, 26, (chan <= 14) ? 0x85 : 0x87);
3030 	/* set ldo_rf_vc */
3031 	run_rt3070_rf_write(sc, 27, (chan <= 14) ? 0x00 : 0x01);
3032 	/* set drv_cc */
3033 	run_rt3070_rf_write(sc, 29, (chan <= 14) ? 0x9b : 0x9f);
3034 
3035 	run_read(sc, RT2860_GPIO_CTRL, &tmp);
3036 	tmp &= ~0x8080;
3037 	if (chan <= 14)
3038 		tmp |= 0x80;
3039 	run_write(sc, RT2860_GPIO_CTRL, tmp);
3040 
3041 	/* enable RF tuning */
3042 	run_rt3070_rf_read(sc, 7, &rf);
3043 	run_rt3070_rf_write(sc, 7, rf | 0x01);
3044 
3045 	usbd_delay_ms(sc->sc_udev, 2);
3046 }
3047 
3048 static void
3049 run_rt3593_set_chan(struct run_softc *sc, u_int chan)
3050 {
3051 	int8_t txpow1, txpow2, txpow3;
3052 	uint8_t h20mhz, rf;
3053 	int i;
3054 
3055 	/* find the settings for this channel (we know it exists) */
3056 	for (i = 0; rt2860_rf2850[i].chan != chan; i++);
3057 
3058 	/* use Tx power values from EEPROM */
3059 	txpow1 = sc->txpow1[i];
3060 	txpow2 = sc->txpow2[i];
3061 	txpow3 = (sc->ntxchains == 3) ? sc->txpow3[i] : 0;
3062 
3063 	if (chan <= 14) {
3064 		run_bbp_write(sc, 25, sc->bbp25);
3065 		run_bbp_write(sc, 26, sc->bbp26);
3066 	} else {
3067 		/* Enable IQ phase correction. */
3068 		run_bbp_write(sc, 25, 0x09);
3069 		run_bbp_write(sc, 26, 0xff);
3070 	}
3071 
3072 	run_rt3070_rf_write(sc, 8, rt3070_freqs[i].n);
3073 	run_rt3070_rf_write(sc, 9, rt3070_freqs[i].k & 0x0f);
3074 	run_rt3070_rf_read(sc, 11, &rf);
3075 	rf = (rf & ~0x03) | (rt3070_freqs[i].r & 0x03);
3076 	run_rt3070_rf_write(sc, 11, rf);
3077 
3078 	/* Set pll_idoh. */
3079 	run_rt3070_rf_read(sc, 11, &rf);
3080 	rf &= ~0x4c;
3081 	rf |= (chan <= 14) ? 0x44 : 0x48;
3082 	run_rt3070_rf_write(sc, 11, rf);
3083 
3084 	if (chan <= 14)
3085 		rf = txpow1 & 0x1f;
3086 	else
3087 		rf = 0x40 | ((txpow1 & 0x18) << 1) | (txpow1 & 0x07);
3088 	run_rt3070_rf_write(sc, 53, rf);
3089 
3090 	if (chan <= 14)
3091 		rf = txpow2 & 0x1f;
3092 	else
3093 		rf = 0x40 | ((txpow2 & 0x18) << 1) | (txpow2 & 0x07);
3094 	run_rt3070_rf_write(sc, 55, rf);
3095 
3096 	if (chan <= 14)
3097 		rf = txpow3 & 0x1f;
3098 	else
3099 		rf = 0x40 | ((txpow3 & 0x18) << 1) | (txpow3 & 0x07);
3100 	run_rt3070_rf_write(sc, 54, rf);
3101 
3102 	rf = RT3070_RF_BLOCK | RT3070_PLL_PD;
3103 	if (sc->ntxchains == 3)
3104 		rf |= RT3070_TX0_PD | RT3070_TX1_PD | RT3070_TX2_PD;
3105 	else
3106 		rf |= RT3070_TX0_PD | RT3070_TX1_PD;
3107 	rf |= RT3070_RX0_PD | RT3070_RX1_PD | RT3070_RX2_PD;
3108 	run_rt3070_rf_write(sc, 1, rf);
3109 
3110 	run_adjust_freq_offset(sc);
3111 
3112 	run_rt3070_rf_write(sc, 31, (chan <= 14) ? 0xa0 : 0x80);
3113 
3114 	h20mhz = (sc->rf24_20mhz & 0x20) >> 5;
3115 	run_rt3070_rf_read(sc, 30, &rf);
3116 	rf = (rf & ~0x06) | (h20mhz << 1) | (h20mhz << 2);
3117 	run_rt3070_rf_write(sc, 30, rf);
3118 
3119 	run_rt3070_rf_read(sc, 36, &rf);
3120 	if (chan <= 14)
3121 		rf |= 0x80;
3122 	else
3123 		rf &= ~0x80;
3124 	run_rt3070_rf_write(sc, 36, rf);
3125 
3126 	/* Set vcolo_bs. */
3127 	run_rt3070_rf_write(sc, 34, (chan <= 14) ? 0x3c : 0x20);
3128 	/* Set pfd_delay. */
3129 	run_rt3070_rf_write(sc, 12, (chan <= 14) ? 0x1a : 0x12);
3130 
3131 	/* Set vco bias current control. */
3132 	run_rt3070_rf_read(sc, 6, &rf);
3133 	rf &= ~0xc0;
3134 	if (chan <= 14)
3135 		rf |= 0x40;
3136 	else if (chan <= 128)
3137 		rf |= 0x80;
3138 	else
3139 		rf |= 0x40;
3140 	run_rt3070_rf_write(sc, 6, rf);
3141 
3142 	run_rt3070_rf_read(sc, 30, &rf);
3143 	rf = (rf & ~0x18) | 0x10;
3144 	run_rt3070_rf_write(sc, 30, rf);
3145 
3146 	run_rt3070_rf_write(sc, 10, (chan <= 14) ? 0xd3 : 0xd8);
3147 	run_rt3070_rf_write(sc, 13, (chan <= 14) ? 0x12 : 0x23);
3148 
3149 	run_rt3070_rf_read(sc, 51, &rf);
3150 	rf = (rf & ~0x03) | 0x01;
3151 	run_rt3070_rf_write(sc, 51, rf);
3152 	/* Set tx_mx1_cc. */
3153 	run_rt3070_rf_read(sc, 51, &rf);
3154 	rf &= ~0x1c;
3155 	rf |= (chan <= 14) ? 0x14 : 0x10;
3156 	run_rt3070_rf_write(sc, 51, rf);
3157 	/* Set tx_mx1_ic. */
3158 	run_rt3070_rf_read(sc, 51, &rf);
3159 	rf &= ~0xe0;
3160 	rf |= (chan <= 14) ? 0x60 : 0x40;
3161 	run_rt3070_rf_write(sc, 51, rf);
3162 	/* Set tx_lo1_ic. */
3163 	run_rt3070_rf_read(sc, 49, &rf);
3164 	rf &= ~0x1c;
3165 	rf |= (chan <= 14) ? 0x0c : 0x08;
3166 	run_rt3070_rf_write(sc, 49, rf);
3167 	/* Set tx_lo1_en. */
3168 	run_rt3070_rf_read(sc, 50, &rf);
3169 	run_rt3070_rf_write(sc, 50, rf & ~0x20);
3170 	/* Set drv_cc. */
3171 	run_rt3070_rf_read(sc, 57, &rf);
3172 	rf &= ~0xfc;
3173 	rf |= (chan <= 14) ?  0x6c : 0x3c;
3174 	run_rt3070_rf_write(sc, 57, rf);
3175 	/* Set rx_mix1_ic, rxa_lnactr, lna_vc, lna_inbias_en and lna_en. */
3176 	run_rt3070_rf_write(sc, 44, (chan <= 14) ? 0x93 : 0x9b);
3177 	/* Set drv_gnd_a, tx_vga_cc_a and tx_mx2_gain. */
3178 	run_rt3070_rf_write(sc, 52, (chan <= 14) ? 0x45 : 0x05);
3179 	/* Enable VCO calibration. */
3180 	run_rt3070_rf_read(sc, 3, &rf);
3181 	rf &= ~RT5390_VCOCAL;
3182 	rf |= (chan <= 14) ? RT5390_VCOCAL : 0xbe;
3183 	run_rt3070_rf_write(sc, 3, rf);
3184 
3185 	if (chan <= 14)
3186 		rf = 0x23;
3187 	else if (chan <= 64)
3188 		rf = 0x36;
3189 	else if (chan <= 128)
3190 		rf = 0x32;
3191 	else
3192 		rf = 0x30;
3193 	run_rt3070_rf_write(sc, 39, rf);
3194 	if (chan <= 14)
3195 		rf = 0xbb;
3196 	else if (chan <= 64)
3197 		rf = 0xeb;
3198 	else if (chan <= 128)
3199 		rf = 0xb3;
3200 	else
3201 		rf = 0x9b;
3202 	run_rt3070_rf_write(sc, 45, rf);
3203 
3204 	/* Set FEQ/AEQ control. */
3205 	run_bbp_write(sc, 105, 0x34);
3206 }
3207 
3208 static void
3209 run_rt5390_set_chan(struct run_softc *sc, u_int chan)
3210 {
3211 	int8_t txpow1, txpow2;
3212 	uint8_t rf;
3213 	int i;
3214 
3215 	/* find the settings for this channel (we know it exists) */
3216 	for (i = 0; rt2860_rf2850[i].chan != chan; i++);
3217 
3218 	/* use Tx power values from EEPROM */
3219 	txpow1 = sc->txpow1[i];
3220 	txpow2 = sc->txpow2[i];
3221 
3222 	run_rt3070_rf_write(sc, 8, rt3070_freqs[i].n);
3223 	run_rt3070_rf_write(sc, 9, rt3070_freqs[i].k & 0x0f);
3224 	run_rt3070_rf_read(sc, 11, &rf);
3225 	rf = (rf & ~0x03) | (rt3070_freqs[i].r & 0x03);
3226 	run_rt3070_rf_write(sc, 11, rf);
3227 
3228 	run_rt3070_rf_read(sc, 49, &rf);
3229 	rf = (rf & ~0x3f) | (txpow1 & 0x3f);
3230 	/* The valid range of the RF R49 is 0x00 to 0x27. */
3231 	if ((rf & 0x3f) > 0x27)
3232 		rf = (rf & ~0x3f) | 0x27;
3233 	run_rt3070_rf_write(sc, 49, rf);
3234 
3235 	if (sc->mac_ver == 0x5392) {
3236 		run_rt3070_rf_read(sc, 50, &rf);
3237 		rf = (rf & ~0x3f) | (txpow2 & 0x3f);
3238 		/* The valid range of the RF R50 is 0x00 to 0x27. */
3239 		if ((rf & 0x3f) > 0x27)
3240 			rf = (rf & ~0x3f) | 0x27;
3241 		run_rt3070_rf_write(sc, 50, rf);
3242 	}
3243 
3244 	run_rt3070_rf_read(sc, 1, &rf);
3245 	rf |= RT3070_RF_BLOCK | RT3070_PLL_PD | RT3070_RX0_PD | RT3070_TX0_PD;
3246 	if (sc->mac_ver == 0x5392)
3247 		rf |= RT3070_RX1_PD | RT3070_TX1_PD;
3248 	run_rt3070_rf_write(sc, 1, rf);
3249 
3250 	if (sc->mac_ver != 0x5392) {
3251 		run_rt3070_rf_read(sc, 2, &rf);
3252 		rf |= 0x80;
3253 		run_rt3070_rf_write(sc, 2, rf);
3254 		usbd_delay_ms(sc->sc_udev, 10);
3255 		rf &= 0x7f;
3256 		run_rt3070_rf_write(sc, 2, rf);
3257 	}
3258 
3259 	run_adjust_freq_offset(sc);
3260 
3261 	if (sc->mac_ver == 0x5392) {
3262 		/* Fix for RT5392C. */
3263 		if (sc->mac_rev >= 0x0223) {
3264 			if (chan <= 4)
3265 				rf = 0x0f;
3266 			else if (chan >= 5 && chan <= 7)
3267 				rf = 0x0e;
3268 			else
3269 				rf = 0x0d;
3270 			run_rt3070_rf_write(sc, 23, rf);
3271 
3272 			if (chan <= 4)
3273 				rf = 0x0c;
3274 			else if (chan == 5)
3275 				rf = 0x0b;
3276 			else if (chan >= 6 && chan <= 7)
3277 				rf = 0x0a;
3278 			else if (chan >= 8 && chan <= 10)
3279 				rf = 0x09;
3280 			else
3281 				rf = 0x08;
3282 			run_rt3070_rf_write(sc, 59, rf);
3283 		} else {
3284 			if (chan <= 11)
3285 				rf = 0x0f;
3286 			else
3287 				rf = 0x0b;
3288 			run_rt3070_rf_write(sc, 59, rf);
3289 		}
3290 	} else {
3291 		/* Fix for RT5390F. */
3292 		if (sc->mac_rev >= 0x0502) {
3293 			if (chan <= 11)
3294 				rf = 0x43;
3295 			else
3296 				rf = 0x23;
3297 			run_rt3070_rf_write(sc, 55, rf);
3298 
3299 			if (chan <= 11)
3300 				rf = 0x0f;
3301 			else if (chan == 12)
3302 				rf = 0x0d;
3303 			else
3304 				rf = 0x0b;
3305 			run_rt3070_rf_write(sc, 59, rf);
3306 		} else {
3307 			run_rt3070_rf_write(sc, 55, 0x44);
3308 			run_rt3070_rf_write(sc, 59, 0x8f);
3309 		}
3310 	}
3311 
3312 	/* Enable VCO calibration. */
3313 	run_rt3070_rf_read(sc, 3, &rf);
3314 	rf |= RT5390_VCOCAL;
3315 	run_rt3070_rf_write(sc, 3, rf);
3316 }
3317 
3318 static void
3319 run_rt5592_set_chan(struct run_softc *sc, u_int chan)
3320 {
3321 	const struct rt5592_freqs *freqs;
3322 	uint32_t tmp;
3323 	uint8_t reg, rf, txpow_bound;
3324 	int8_t txpow1, txpow2;
3325 	int i;
3326 
3327 	run_read(sc, RT5592_DEBUG_INDEX, &tmp);
3328 	freqs = (tmp & RT5592_SEL_XTAL) ?
3329 	    rt5592_freqs_40mhz : rt5592_freqs_20mhz;
3330 
3331 	/* find the settings for this channel (we know it exists) */
3332 	for (i = 0; rt2860_rf2850[i].chan != chan; i++, freqs++);
3333 
3334 	/* use Tx power values from EEPROM */
3335 	txpow1 = sc->txpow1[i];
3336 	txpow2 = sc->txpow2[i];
3337 
3338 	run_read(sc, RT3070_LDO_CFG0, &tmp);
3339 	tmp &= ~0x1c000000;
3340 	if (chan > 14)
3341 		tmp |= 0x14000000;
3342 	run_write(sc, RT3070_LDO_CFG0, tmp);
3343 
3344 	/* N setting. */
3345 	run_rt3070_rf_write(sc, 8, freqs->n & 0xff);
3346 	run_rt3070_rf_read(sc, 9, &rf);
3347 	rf &= ~(1 << 4);
3348 	rf |= ((freqs->n & 0x0100) >> 8) << 4;
3349 	run_rt3070_rf_write(sc, 9, rf);
3350 
3351 	/* K setting. */
3352 	run_rt3070_rf_read(sc, 9, &rf);
3353 	rf &= ~0x0f;
3354 	rf |= (freqs->k & 0x0f);
3355 	run_rt3070_rf_write(sc, 9, rf);
3356 
3357 	/* Mode setting. */
3358 	run_rt3070_rf_read(sc, 11, &rf);
3359 	rf &= ~0x0c;
3360 	rf |= ((freqs->m - 0x8) & 0x3) << 2;
3361 	run_rt3070_rf_write(sc, 11, rf);
3362 	run_rt3070_rf_read(sc, 9, &rf);
3363 	rf &= ~(1 << 7);
3364 	rf |= (((freqs->m - 0x8) & 0x4) >> 2) << 7;
3365 	run_rt3070_rf_write(sc, 9, rf);
3366 
3367 	/* R setting. */
3368 	run_rt3070_rf_read(sc, 11, &rf);
3369 	rf &= ~0x03;
3370 	rf |= (freqs->r - 0x1);
3371 	run_rt3070_rf_write(sc, 11, rf);
3372 
3373 	if (chan <= 14) {
3374 		/* Initialize RF registers for 2GHZ. */
3375 		for (i = 0; i < (int)__arraycount(rt5592_2ghz_def_rf); i++) {
3376 			run_rt3070_rf_write(sc, rt5592_2ghz_def_rf[i].reg,
3377 			    rt5592_2ghz_def_rf[i].val);
3378 		}
3379 
3380 		rf = (chan <= 10) ? 0x07 : 0x06;
3381 		run_rt3070_rf_write(sc, 23, rf);
3382 		run_rt3070_rf_write(sc, 59, rf);
3383 
3384 		run_rt3070_rf_write(sc, 55, 0x43);
3385 
3386 		/*
3387 		 * RF R49/R50 Tx power ALC code.
3388 		 * G-band bit<7:6>=1:0, bit<5:0> range from 0x0 ~ 0x27.
3389 		 */
3390 		reg = 2;
3391 		txpow_bound = 0x27;
3392 	} else {
3393 		/* Initialize RF registers for 5GHZ. */
3394 		for (i = 0; i < (int)__arraycount(rt5592_5ghz_def_rf); i++) {
3395 			run_rt3070_rf_write(sc, rt5592_5ghz_def_rf[i].reg,
3396 			    rt5592_5ghz_def_rf[i].val);
3397 		}
3398 		for (i = 0; i < (int)__arraycount(rt5592_chan_5ghz); i++) {
3399 			if (chan >= rt5592_chan_5ghz[i].firstchan &&
3400 			    chan <= rt5592_chan_5ghz[i].lastchan) {
3401 				run_rt3070_rf_write(sc, rt5592_chan_5ghz[i].reg,
3402 				    rt5592_chan_5ghz[i].val);
3403 			}
3404 		}
3405 
3406 		/*
3407 		 * RF R49/R50 Tx power ALC code.
3408 		 * A-band bit<7:6>=1:1, bit<5:0> range from 0x0 ~ 0x2b.
3409 		 */
3410 		reg = 3;
3411 		txpow_bound = 0x2b;
3412 	}
3413 
3414 	/* RF R49 ch0 Tx power ALC code. */
3415 	run_rt3070_rf_read(sc, 49, &rf);
3416 	rf &= ~0xc0;
3417 	rf |= (reg << 6);
3418 	rf = (rf & ~0x3f) | (txpow1 & 0x3f);
3419 	if ((rf & 0x3f) > txpow_bound)
3420 		rf = (rf & ~0x3f) | txpow_bound;
3421 	run_rt3070_rf_write(sc, 49, rf);
3422 
3423 	/* RF R50 ch1 Tx power ALC code. */
3424 	run_rt3070_rf_read(sc, 50, &rf);
3425 	rf &= ~(1 << 7 | 1 << 6);
3426 	rf |= (reg << 6);
3427 	rf = (rf & ~0x3f) | (txpow2 & 0x3f);
3428 	if ((rf & 0x3f) > txpow_bound)
3429 		rf = (rf & ~0x3f) | txpow_bound;
3430 	run_rt3070_rf_write(sc, 50, rf);
3431 
3432 	/* Enable RF_BLOCK, PLL_PD, RX0_PD, and TX0_PD. */
3433 	run_rt3070_rf_read(sc, 1, &rf);
3434 	rf |= (RT3070_RF_BLOCK | RT3070_PLL_PD | RT3070_RX0_PD | RT3070_TX0_PD);
3435 	if (sc->ntxchains > 1)
3436 		rf |= RT3070_TX1_PD;
3437 	if (sc->nrxchains > 1)
3438 		rf |= RT3070_RX1_PD;
3439 	run_rt3070_rf_write(sc, 1, rf);
3440 
3441 	run_rt3070_rf_write(sc, 6, 0xe4);
3442 
3443 	run_rt3070_rf_write(sc, 30, 0x10);
3444 	run_rt3070_rf_write(sc, 31, 0x80);
3445 	run_rt3070_rf_write(sc, 32, 0x80);
3446 
3447 	run_adjust_freq_offset(sc);
3448 
3449 	/* Enable VCO calibration. */
3450 	run_rt3070_rf_read(sc, 3, &rf);
3451 	rf |= RT5390_VCOCAL;
3452 	run_rt3070_rf_write(sc, 3, rf);
3453 }
3454 
3455 static void
3456 run_iq_calib(struct run_softc *sc, u_int chan)
3457 {
3458 	uint16_t val;
3459 
3460 	/* Tx0 IQ gain. */
3461 	run_bbp_write(sc, 158, 0x2c);
3462 	if (chan <= 14)
3463 		run_efuse_read(sc, RT5390_EEPROM_IQ_GAIN_CAL_TX0_2GHZ, &val, 1);
3464 	else if (chan <= 64) {
3465 		run_efuse_read(sc,
3466 		    RT5390_EEPROM_IQ_GAIN_CAL_TX0_CH36_TO_CH64_5GHZ,
3467 		    &val, 1);
3468 	} else if (chan <= 138) {
3469 		run_efuse_read(sc,
3470 		    RT5390_EEPROM_IQ_GAIN_CAL_TX0_CH100_TO_CH138_5GHZ,
3471 		    &val, 1);
3472 	} else if (chan <= 165) {
3473 		run_efuse_read(sc,
3474 	    RT5390_EEPROM_IQ_GAIN_CAL_TX0_CH140_TO_CH165_5GHZ,
3475 		    &val, 1);
3476 	} else
3477 		val = 0;
3478 	run_bbp_write(sc, 159, val);
3479 
3480 	/* Tx0 IQ phase. */
3481 	run_bbp_write(sc, 158, 0x2d);
3482 	if (chan <= 14) {
3483 		run_efuse_read(sc, RT5390_EEPROM_IQ_PHASE_CAL_TX0_2GHZ,
3484 		    &val, 1);
3485 	} else if (chan <= 64) {
3486 		run_efuse_read(sc,
3487 		    RT5390_EEPROM_IQ_PHASE_CAL_TX0_CH36_TO_CH64_5GHZ,
3488 		    &val, 1);
3489 	} else if (chan <= 138) {
3490 		run_efuse_read(sc,
3491 		    RT5390_EEPROM_IQ_PHASE_CAL_TX0_CH100_TO_CH138_5GHZ,
3492 		    &val, 1);
3493 	} else if (chan <= 165) {
3494 		run_efuse_read(sc,
3495 		    RT5390_EEPROM_IQ_PHASE_CAL_TX0_CH140_TO_CH165_5GHZ,
3496 		    &val, 1);
3497 	} else
3498 		val = 0;
3499 	run_bbp_write(sc, 159, val);
3500 
3501 	/* Tx1 IQ gain. */
3502 	run_bbp_write(sc, 158, 0x4a);
3503 	if (chan <= 14) {
3504 		run_efuse_read(sc, RT5390_EEPROM_IQ_GAIN_CAL_TX1_2GHZ,
3505 		    &val, 1);
3506 	} else if (chan <= 64) {
3507 		run_efuse_read(sc,
3508 		    RT5390_EEPROM_IQ_GAIN_CAL_TX1_CH36_TO_CH64_5GHZ,
3509 		    &val, 1);
3510 	} else if (chan <= 138) {
3511 		run_efuse_read(sc,
3512 		    RT5390_EEPROM_IQ_GAIN_CAL_TX1_CH100_TO_CH138_5GHZ,
3513 		    &val, 1);
3514 	} else if (chan <= 165) {
3515 		run_efuse_read(sc,
3516 		    RT5390_EEPROM_IQ_GAIN_CAL_TX1_CH140_TO_CH165_5GHZ,
3517 		    &val, 1);
3518 	} else
3519 		val = 0;
3520 	run_bbp_write(sc, 159, val);
3521 
3522 	/* Tx1 IQ phase. */
3523 	run_bbp_write(sc, 158, 0x4b);
3524 	if (chan <= 14) {
3525 		run_efuse_read(sc, RT5390_EEPROM_IQ_PHASE_CAL_TX1_2GHZ,
3526 		    &val, 1);
3527 	} else if (chan <= 64) {
3528 		run_efuse_read(sc,
3529 		    RT5390_EEPROM_IQ_PHASE_CAL_TX1_CH36_TO_CH64_5GHZ,
3530 		    &val, 1);
3531 	} else if (chan <= 138) {
3532 		run_efuse_read(sc,
3533 		    RT5390_EEPROM_IQ_PHASE_CAL_TX1_CH100_TO_CH138_5GHZ,
3534 		    &val, 1);
3535 	} else if (chan <= 165) {
3536 		run_efuse_read(sc,
3537 		    RT5390_EEPROM_IQ_PHASE_CAL_TX1_CH140_TO_CH165_5GHZ,
3538 		    &val, 1);
3539 	} else
3540 		val = 0;
3541 	run_bbp_write(sc, 159, val);
3542 
3543 	/* RF IQ compensation control. */
3544 	run_bbp_write(sc, 158, 0x04);
3545 	run_efuse_read(sc, RT5390_EEPROM_RF_IQ_COMPENSATION_CTL,
3546 	    &val, 1);
3547 	run_bbp_write(sc, 159, val);
3548 
3549 	/* RF IQ imbalance compensation control. */
3550 	run_bbp_write(sc, 158, 0x03);
3551 	run_efuse_read(sc,
3552 	    RT5390_EEPROM_RF_IQ_IMBALANCE_COMPENSATION_CTL, &val, 1);
3553 	run_bbp_write(sc, 159, val);
3554 }
3555 
3556 static void
3557 run_set_agc(struct run_softc *sc, uint8_t agc)
3558 {
3559 	uint8_t bbp;
3560 
3561 	if (sc->mac_ver == 0x3572) {
3562 		run_bbp_read(sc, 27, &bbp);
3563 		bbp &= ~(0x3 << 5);
3564 		run_bbp_write(sc, 27, bbp | 0 << 5);	/* select Rx0 */
3565 		run_bbp_write(sc, 66, agc);
3566 		run_bbp_write(sc, 27, bbp | 1 << 5);	/* select Rx1 */
3567 		run_bbp_write(sc, 66, agc);
3568 	} else
3569 		run_bbp_write(sc, 66, agc);
3570 }
3571 
3572 static void
3573 run_set_rx_antenna(struct run_softc *sc, int aux)
3574 {
3575 	uint32_t tmp;
3576 	uint8_t bbp152;
3577 
3578 	if (sc->rf_rev == RT5390_RF_5370) {
3579 		run_bbp_read(sc, 152, &bbp152);
3580 		bbp152 &= ~0x80;
3581 		if (aux)
3582 			bbp152 |= 0x80;
3583 		run_bbp_write(sc, 152, bbp152);
3584 	} else {
3585 		run_mcu_cmd(sc, RT2860_MCU_CMD_ANTSEL, !aux);
3586 		run_read(sc, RT2860_GPIO_CTRL, &tmp);
3587 		tmp &= ~0x0808;
3588 		if (aux)
3589 			tmp |= 0x08;
3590 		run_write(sc, RT2860_GPIO_CTRL, tmp);
3591 	}
3592 }
3593 
3594 static int
3595 run_set_chan(struct run_softc *sc, struct ieee80211_channel *c)
3596 {
3597 	struct ieee80211com *ic = &sc->sc_ic;
3598 	u_int chan, group;
3599 
3600 	chan = ieee80211_chan2ieee(ic, c);
3601 	if (chan == 0 || chan == IEEE80211_CHAN_ANY)
3602 		return EINVAL;
3603 
3604 	if (sc->mac_ver == 0x5592)
3605 		run_rt5592_set_chan(sc, chan);
3606 	else if (sc->mac_ver >= 0x5390)
3607 		run_rt5390_set_chan(sc, chan);
3608 	else if (sc->mac_ver == 0x3593)
3609 		run_rt3593_set_chan(sc, chan);
3610 	else if (sc->mac_ver == 0x3572)
3611 		run_rt3572_set_chan(sc, chan);
3612 	else if (sc->mac_ver >= 0x3070)
3613 		run_rt3070_set_chan(sc, chan);
3614 	else
3615 		run_rt2870_set_chan(sc, chan);
3616 
3617 	/* determine channel group */
3618 	if (chan <= 14)
3619 		group = 0;
3620 	else if (chan <= 64)
3621 		group = 1;
3622 	else if (chan <= 128)
3623 		group = 2;
3624 	else
3625 		group = 3;
3626 
3627 	/* XXX necessary only when group has changed! */
3628 	run_select_chan_group(sc, group);
3629 
3630 	usbd_delay_ms(sc->sc_udev, 10);
3631 
3632 	/* Perform IQ calibration. */
3633 	if (sc->mac_ver >= 0x5392)
3634 		run_iq_calib(sc, chan);
3635 
3636 	return 0;
3637 }
3638 
3639 static void
3640 run_updateprot(struct run_softc *sc)
3641 {
3642 	struct ieee80211com *ic = &sc->sc_ic;
3643 	uint32_t tmp;
3644 
3645 	tmp = RT2860_RTSTH_EN | RT2860_PROT_NAV_SHORT | RT2860_TXOP_ALLOW_ALL;
3646 	/* setup protection frame rate (MCS code) */
3647 	tmp |= (ic->ic_curmode == IEEE80211_MODE_11A) ?
3648 	    rt2860_rates[RT2860_RIDX_OFDM6].mcs | RT2860_PHY_OFDM :
3649 	    rt2860_rates[RT2860_RIDX_CCK11].mcs;
3650 
3651 	/* CCK frames don't require protection */
3652 	run_write(sc, RT2860_CCK_PROT_CFG, tmp);
3653 	if (ic->ic_flags & IEEE80211_F_USEPROT) {
3654 		if (ic->ic_protmode == IEEE80211_PROT_RTSCTS)
3655 			tmp |= RT2860_PROT_CTRL_RTS_CTS;
3656 		else if (ic->ic_protmode == IEEE80211_PROT_CTSONLY)
3657 			tmp |= RT2860_PROT_CTRL_CTS;
3658 	}
3659 	run_write(sc, RT2860_OFDM_PROT_CFG, tmp);
3660 }
3661 
3662 static void
3663 run_enable_tsf_sync(struct run_softc *sc)
3664 {
3665 	struct ieee80211com *ic = &sc->sc_ic;
3666 	uint32_t tmp;
3667 
3668 	run_read(sc, RT2860_BCN_TIME_CFG, &tmp);
3669 	tmp &= ~0x1fffff;
3670 	tmp |= ic->ic_bss->ni_intval * 16;
3671 	tmp |= RT2860_TSF_TIMER_EN | RT2860_TBTT_TIMER_EN;
3672 	if (ic->ic_opmode == IEEE80211_M_STA) {
3673 		/*
3674 		 * Local TSF is always updated with remote TSF on beacon
3675 		 * reception.
3676 		 */
3677 		tmp |= 1 << RT2860_TSF_SYNC_MODE_SHIFT;
3678 	}
3679 #ifndef IEEE80211_STA_ONLY
3680 	else if (ic->ic_opmode == IEEE80211_M_IBSS) {
3681 		tmp |= RT2860_BCN_TX_EN;
3682 		/*
3683 		 * Local TSF is updated with remote TSF on beacon reception
3684 		 * only if the remote TSF is greater than local TSF.
3685 		 */
3686 		tmp |= 2 << RT2860_TSF_SYNC_MODE_SHIFT;
3687 	} else if (ic->ic_opmode == IEEE80211_M_HOSTAP) {
3688 		tmp |= RT2860_BCN_TX_EN;
3689 		/* SYNC with nobody */
3690 		tmp |= 3 << RT2860_TSF_SYNC_MODE_SHIFT;
3691 	}
3692 #endif
3693 	run_write(sc, RT2860_BCN_TIME_CFG, tmp);
3694 }
3695 
3696 static void
3697 run_enable_mrr(struct run_softc *sc)
3698 {
3699 #define CCK(mcs)	(mcs)
3700 #define OFDM(mcs)	(1 << 3 | (mcs))
3701 	run_write(sc, RT2860_LG_FBK_CFG0,
3702 	    OFDM(6) << 28 |	/* 54->48 */
3703 	    OFDM(5) << 24 |	/* 48->36 */
3704 	    OFDM(4) << 20 |	/* 36->24 */
3705 	    OFDM(3) << 16 |	/* 24->18 */
3706 	    OFDM(2) << 12 |	/* 18->12 */
3707 	    OFDM(1) <<  8 |	/* 12-> 9 */
3708 	    OFDM(0) <<  4 |	/*  9-> 6 */
3709 	    OFDM(0));		/*  6-> 6 */
3710 
3711 	run_write(sc, RT2860_LG_FBK_CFG1,
3712 	    CCK(2) << 12 |	/* 11->5.5 */
3713 	    CCK(1) <<  8 |	/* 5.5-> 2 */
3714 	    CCK(0) <<  4 |	/*   2-> 1 */
3715 	    CCK(0));		/*   1-> 1 */
3716 #undef OFDM
3717 #undef CCK
3718 }
3719 
3720 static void
3721 run_set_txpreamble(struct run_softc *sc)
3722 {
3723 	uint32_t tmp;
3724 
3725 	run_read(sc, RT2860_AUTO_RSP_CFG, &tmp);
3726 	if (sc->sc_ic.ic_flags & IEEE80211_F_SHPREAMBLE)
3727 		tmp |= RT2860_CCK_SHORT_EN;
3728 	else
3729 		tmp &= ~RT2860_CCK_SHORT_EN;
3730 	run_write(sc, RT2860_AUTO_RSP_CFG, tmp);
3731 }
3732 
3733 static void
3734 run_set_basicrates(struct run_softc *sc)
3735 {
3736 	struct ieee80211com *ic = &sc->sc_ic;
3737 
3738 	/* set basic rates mask */
3739 	if (ic->ic_curmode == IEEE80211_MODE_11B)
3740 		run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x003);
3741 	else if (ic->ic_curmode == IEEE80211_MODE_11A)
3742 		run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x150);
3743 	else	/* 11g */
3744 		run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x15f);
3745 }
3746 
3747 static void
3748 run_set_leds(struct run_softc *sc, uint16_t which)
3749 {
3750 
3751 	(void)run_mcu_cmd(sc, RT2860_MCU_CMD_LEDS,
3752 	    which | (sc->leds & 0x7f));
3753 }
3754 
3755 static void
3756 run_set_bssid(struct run_softc *sc, const uint8_t *bssid)
3757 {
3758 
3759 	run_write(sc, RT2860_MAC_BSSID_DW0,
3760 	    bssid[0] | bssid[1] << 8 | bssid[2] << 16 | bssid[3] << 24);
3761 	run_write(sc, RT2860_MAC_BSSID_DW1,
3762 	    bssid[4] | bssid[5] << 8);
3763 }
3764 
3765 static void
3766 run_set_macaddr(struct run_softc *sc, const uint8_t *addr)
3767 {
3768 
3769 	run_write(sc, RT2860_MAC_ADDR_DW0,
3770 	    addr[0] | addr[1] << 8 | addr[2] << 16 | addr[3] << 24);
3771 	run_write(sc, RT2860_MAC_ADDR_DW1,
3772 	    addr[4] | addr[5] << 8 | 0xff << 16);
3773 }
3774 
3775 static void
3776 run_updateslot(struct ifnet *ifp)
3777 {
3778 
3779 	/* do it in a process context */
3780 	run_do_async(ifp->if_softc, run_updateslot_cb, NULL, 0);
3781 }
3782 
3783 /* ARGSUSED */
3784 static void
3785 run_updateslot_cb(struct run_softc *sc, void *arg)
3786 {
3787 	uint32_t tmp;
3788 
3789 	run_read(sc, RT2860_BKOFF_SLOT_CFG, &tmp);
3790 	tmp &= ~0xff;
3791 	tmp |= (sc->sc_ic.ic_flags & IEEE80211_F_SHSLOT) ? 9 : 20;
3792 	run_write(sc, RT2860_BKOFF_SLOT_CFG, tmp);
3793 }
3794 
3795 static int8_t
3796 run_rssi2dbm(struct run_softc *sc, uint8_t rssi, uint8_t rxchain)
3797 {
3798 	struct ieee80211com *ic = &sc->sc_ic;
3799 	struct ieee80211_channel *c = ic->ic_curchan;
3800 	int delta;
3801 
3802 	if (IEEE80211_IS_CHAN_5GHZ(c)) {
3803 		u_int chan = ieee80211_chan2ieee(ic, c);
3804 		delta = sc->rssi_5ghz[rxchain];
3805 
3806 		/* determine channel group */
3807 		if (chan <= 64)
3808 			delta -= sc->lna[1];
3809 		else if (chan <= 128)
3810 			delta -= sc->lna[2];
3811 		else
3812 			delta -= sc->lna[3];
3813 	} else
3814 		delta = sc->rssi_2ghz[rxchain] - sc->lna[0];
3815 
3816 	return -12 - delta - rssi;
3817 }
3818 
3819 static void
3820 run_rt5390_bbp_init(struct run_softc *sc)
3821 {
3822 	u_int i;
3823 	uint8_t bbp;
3824 
3825 	/* Apply maximum likelihood detection for 2 stream case. */
3826 	run_bbp_read(sc, 105, &bbp);
3827 	if (sc->nrxchains > 1)
3828 		run_bbp_write(sc, 105, bbp | RT5390_MLD);
3829 
3830 	/* Avoid data lost and CRC error. */
3831 	run_bbp_read(sc, 4, &bbp);
3832 	run_bbp_write(sc, 4, bbp | RT5390_MAC_IF_CTRL);
3833 
3834 	if (sc->mac_ver == 0x5592) {
3835 		for (i = 0; i < (int)__arraycount(rt5592_def_bbp); i++) {
3836 			run_bbp_write(sc, rt5592_def_bbp[i].reg,
3837 			    rt5592_def_bbp[i].val);
3838 		}
3839 		for (i = 0; i < (int)__arraycount(rt5592_bbp_r196); i++) {
3840 			run_bbp_write(sc, 195, i + 0x80);
3841 			run_bbp_write(sc, 196, rt5592_bbp_r196[i]);
3842 		}
3843 	} else {
3844 		for (i = 0; i < (int)__arraycount(rt5390_def_bbp); i++) {
3845 			run_bbp_write(sc, rt5390_def_bbp[i].reg,
3846 			    rt5390_def_bbp[i].val);
3847 		}
3848 	}
3849 	if (sc->mac_ver == 0x5392) {
3850 		run_bbp_write(sc, 88, 0x90);
3851 		run_bbp_write(sc, 95, 0x9a);
3852 		run_bbp_write(sc, 98, 0x12);
3853 		run_bbp_write(sc, 106, 0x12);
3854 		run_bbp_write(sc, 134, 0xd0);
3855 		run_bbp_write(sc, 135, 0xf6);
3856 		run_bbp_write(sc, 148, 0x84);
3857 	}
3858 
3859 	run_bbp_read(sc, 152, &bbp);
3860 	run_bbp_write(sc, 152, bbp | 0x80);
3861 
3862 	/* Fix BBP254 for RT5592C. */
3863 	if (sc->mac_ver == 0x5592 && sc->mac_rev >= 0x0221) {
3864 		run_bbp_read(sc, 254, &bbp);
3865 		run_bbp_write(sc, 254, bbp | 0x80);
3866 	}
3867 
3868 	/* Disable hardware antenna diversity. */
3869 	if (sc->mac_ver == 0x5390)
3870 		run_bbp_write(sc, 154, 0);
3871 
3872 	/* Initialize Rx CCK/OFDM frequency offset report. */
3873 	run_bbp_write(sc, 142, 1);
3874 	run_bbp_write(sc, 143, 57);
3875 }
3876 
3877 static int
3878 run_bbp_init(struct run_softc *sc)
3879 {
3880 	int i, error, ntries;
3881 	uint8_t bbp0;
3882 
3883 	/* wait for BBP to wake up */
3884 	for (ntries = 0; ntries < 20; ntries++) {
3885 		if ((error = run_bbp_read(sc, 0, &bbp0)) != 0)
3886 			return error;
3887 		if (bbp0 != 0 && bbp0 != 0xff)
3888 			break;
3889 	}
3890 	if (ntries == 20)
3891 		return ETIMEDOUT;
3892 
3893 	/* initialize BBP registers to default values */
3894 	if (sc->mac_ver >= 0x5390)
3895 		run_rt5390_bbp_init(sc);
3896 	else {
3897 		for (i = 0; i < (int)__arraycount(rt2860_def_bbp); i++) {
3898 			run_bbp_write(sc, rt2860_def_bbp[i].reg,
3899 			    rt2860_def_bbp[i].val);
3900 		}
3901 	}
3902 
3903 	if (sc->mac_ver == 0x3593) {
3904 		run_bbp_write(sc, 79, 0x13);
3905 		run_bbp_write(sc, 80, 0x05);
3906 		run_bbp_write(sc, 81, 0x33);
3907 		run_bbp_write(sc, 86, 0x46);
3908 		run_bbp_write(sc, 137, 0x0f);
3909 	}
3910 
3911 	/* fix BBP84 for RT2860E */
3912 	if (sc->mac_ver == 0x2860 && sc->mac_rev != 0x0101)
3913 		run_bbp_write(sc, 84, 0x19);
3914 
3915 	if (sc->mac_ver >= 0x3070) {
3916 		run_bbp_write(sc, 79, 0x13);
3917 		run_bbp_write(sc, 80, 0x05);
3918 		run_bbp_write(sc, 81, 0x33);
3919 	} else if (sc->mac_ver == 0x2860 && sc->mac_rev == 0x0100) {
3920 		run_bbp_write(sc, 69, 0x16);
3921 		run_bbp_write(sc, 73, 0x12);
3922 	}
3923 	return 0;
3924 }
3925 
3926 static int
3927 run_rt3070_rf_init(struct run_softc *sc)
3928 {
3929 	uint32_t tmp;
3930 	uint8_t rf, target, bbp4;
3931 	int i;
3932 
3933 	run_rt3070_rf_read(sc, 30, &rf);
3934 	/* toggle RF R30 bit 7 */
3935 	run_rt3070_rf_write(sc, 30, rf | 0x80);
3936 	usbd_delay_ms(sc->sc_udev, 10);
3937 	run_rt3070_rf_write(sc, 30, rf & ~0x80);
3938 
3939 	/* initialize RF registers to default value */
3940 	if (sc->mac_ver == 0x3572) {
3941 		for (i = 0; i < (int)__arraycount(rt3572_def_rf); i++) {
3942 			run_rt3070_rf_write(sc, rt3572_def_rf[i].reg,
3943 			    rt3572_def_rf[i].val);
3944 		}
3945 	} else {
3946 		for (i = 0; i < (int)__arraycount(rt3070_def_rf); i++) {
3947 			run_rt3070_rf_write(sc, rt3070_def_rf[i].reg,
3948 			    rt3070_def_rf[i].val);
3949 		}
3950 	}
3951 	if (sc->mac_ver == 0x3572) {
3952 		run_rt3070_rf_read(sc, 6, &rf);
3953 		run_rt3070_rf_write(sc, 6, rf | 0x40);
3954 		run_rt3070_rf_write(sc, 31, 0x14);
3955 
3956 		run_read(sc, RT3070_LDO_CFG0, &tmp);
3957 		tmp &= ~0x1f000000;
3958 		if (sc->mac_rev < 0x0211 && sc->patch_dac)
3959 			tmp |= 0x0d000000;	/* 1.3V */
3960 		else
3961 			tmp |= 0x01000000;	/* 1.2V */
3962 		run_write(sc, RT3070_LDO_CFG0, tmp);
3963 	} else if (sc->mac_ver == 0x3071) {
3964 		run_rt3070_rf_read(sc, 6, &rf);
3965 		run_rt3070_rf_write(sc, 6, rf | 0x40);
3966 		run_rt3070_rf_write(sc, 31, 0x14);
3967 
3968 		run_read(sc, RT3070_LDO_CFG0, &tmp);
3969 		tmp &= ~0x1f000000;
3970 		if (sc->mac_rev < 0x0211)
3971 			tmp |= 0x0d000000;	/* 1.35V */
3972 		else
3973 			tmp |= 0x01000000;	/* 1.2V */
3974 		run_write(sc, RT3070_LDO_CFG0, tmp);
3975 
3976 		/* patch LNA_PE_G1 */
3977 		run_read(sc, RT3070_GPIO_SWITCH, &tmp);
3978 		run_write(sc, RT3070_GPIO_SWITCH, tmp & ~0x20);
3979 	} else if (sc->mac_ver == 0x3070) {
3980 		/* increase voltage from 1.2V to 1.35V */
3981 		run_read(sc, RT3070_LDO_CFG0, &tmp);
3982 		tmp = (tmp & ~0x0f000000) | 0x0d000000;
3983 		run_write(sc, RT3070_LDO_CFG0, tmp);
3984 	}
3985 
3986 	/* select 20MHz bandwidth */
3987 	run_rt3070_rf_read(sc, 31, &rf);
3988 	run_rt3070_rf_write(sc, 31, rf & ~0x20);
3989 
3990 	/* calibrate filter for 20MHz bandwidth */
3991 	sc->rf24_20mhz = 0x1f;	/* default value */
3992 	target = (sc->mac_ver < 0x3071) ? 0x16 : 0x13;
3993 	run_rt3070_filter_calib(sc, 0x07, target, &sc->rf24_20mhz);
3994 
3995 	/* select 40MHz bandwidth */
3996 	run_bbp_read(sc, 4, &bbp4);
3997 	run_bbp_write(sc, 4, (bbp4 & ~0x08) | 0x10);
3998 	run_rt3070_rf_read(sc, 31, &rf);
3999 	run_rt3070_rf_write(sc, 31, rf | 0x20);
4000 
4001 	/* calibrate filter for 40MHz bandwidth */
4002 	sc->rf24_40mhz = 0x2f;	/* default value */
4003 	target = (sc->mac_ver < 0x3071) ? 0x19 : 0x15;
4004 	run_rt3070_filter_calib(sc, 0x27, target, &sc->rf24_40mhz);
4005 
4006 	/* go back to 20MHz bandwidth */
4007 	run_bbp_read(sc, 4, &bbp4);
4008 	run_bbp_write(sc, 4, bbp4 & ~0x18);
4009 
4010 	if (sc->mac_ver == 0x3572) {
4011 		/* save default BBP registers 25 and 26 values */
4012 		run_bbp_read(sc, 25, &sc->bbp25);
4013 		run_bbp_read(sc, 26, &sc->bbp26);
4014 	} else if (sc->mac_rev < 0x0211)
4015 		run_rt3070_rf_write(sc, 27, 0x03);
4016 
4017 	run_read(sc, RT3070_OPT_14, &tmp);
4018 	run_write(sc, RT3070_OPT_14, tmp | 1);
4019 
4020 	if (sc->mac_ver == 0x3070 || sc->mac_ver == 0x3071) {
4021 		run_rt3070_rf_read(sc, 17, &rf);
4022 		rf &= ~RT3070_TX_LO1;
4023 		if ((sc->mac_ver == 0x3070 ||
4024 		     (sc->mac_ver == 0x3071 && sc->mac_rev >= 0x0211)) &&
4025 		    !sc->ext_2ghz_lna)
4026 			rf |= 0x20;	/* fix for long range Rx issue */
4027 		if (sc->txmixgain_2ghz >= 1)
4028 			rf = (rf & ~0x7) | sc->txmixgain_2ghz;
4029 		run_rt3070_rf_write(sc, 17, rf);
4030 	}
4031 	if (sc->mac_ver == 0x3071) {
4032 		run_rt3070_rf_read(sc, 1, &rf);
4033 		rf &= ~(RT3070_RX0_PD | RT3070_TX0_PD);
4034 		rf |= RT3070_RF_BLOCK | RT3070_RX1_PD | RT3070_TX1_PD;
4035 		run_rt3070_rf_write(sc, 1, rf);
4036 
4037 		run_rt3070_rf_read(sc, 15, &rf);
4038 		run_rt3070_rf_write(sc, 15, rf & ~RT3070_TX_LO2);
4039 
4040 		run_rt3070_rf_read(sc, 20, &rf);
4041 		run_rt3070_rf_write(sc, 20, rf & ~RT3070_RX_LO1);
4042 
4043 		run_rt3070_rf_read(sc, 21, &rf);
4044 		run_rt3070_rf_write(sc, 21, rf & ~RT3070_RX_LO2);
4045 	}
4046 	if (sc->mac_ver == 0x3070 || sc->mac_ver == 0x3071) {
4047 		/* fix Tx to Rx IQ glitch by raising RF voltage */
4048 		run_rt3070_rf_read(sc, 27, &rf);
4049 		rf &= ~0x77;
4050 		if (sc->mac_rev < 0x0211)
4051 			rf |= 0x03;
4052 		run_rt3070_rf_write(sc, 27, rf);
4053 	}
4054 	return 0;
4055 }
4056 
4057 static int
4058 run_rt3593_rf_init(struct run_softc *sc)
4059 {
4060 	uint32_t tmp;
4061 	uint8_t rf;
4062 	int i;
4063 
4064 	/* Disable the GPIO bits 4 and 7 for LNA PE control. */
4065 	run_read(sc, RT3070_GPIO_SWITCH, &tmp);
4066 	tmp &= ~(1 << 4 | 1 << 7);
4067 	run_write(sc, RT3070_GPIO_SWITCH, tmp);
4068 
4069 	/* Initialize RF registers to default value. */
4070 	for (i = 0; i < __arraycount(rt3593_def_rf); i++) {
4071 		run_rt3070_rf_write(sc, rt3593_def_rf[i].reg,
4072 			rt3593_def_rf[i].val);
4073 	}
4074 
4075 	/* Toggle RF R2 to initiate calibration. */
4076 	run_rt3070_rf_write(sc, 2, RT5390_RESCAL);
4077 
4078 	/* Initialize RF frequency offset. */
4079 	run_adjust_freq_offset(sc);
4080 
4081 	run_rt3070_rf_read(sc, 18, &rf);
4082 	run_rt3070_rf_write(sc, 18, rf | RT3593_AUTOTUNE_BYPASS);
4083 
4084 	/*
4085 	 * Increase voltage from 1.2V to 1.35V, wait for 1 msec to
4086 	 * decrease voltage back to 1.2V.
4087 	 */
4088 	run_read(sc, RT3070_LDO_CFG0, &tmp);
4089 	tmp = (tmp & ~0x1f000000) | 0x0d000000;
4090 	run_write(sc, RT3070_LDO_CFG0, tmp);
4091 	usbd_delay_ms(sc->sc_udev, 1);
4092 	tmp = (tmp & ~0x1f000000) | 0x01000000;
4093 	run_write(sc, RT3070_LDO_CFG0, tmp);
4094 
4095 	sc->rf24_20mhz = 0x1f;
4096 	sc->rf24_40mhz = 0x2f;
4097 
4098 	/* Save default BBP registers 25 and 26 values. */
4099 	run_bbp_read(sc, 25, &sc->bbp25);
4100 	run_bbp_read(sc, 26, &sc->bbp26);
4101 
4102 	run_read(sc, RT3070_OPT_14, &tmp);
4103 	run_write(sc, RT3070_OPT_14, tmp | 1);
4104 	return (0);
4105 }
4106 
4107 static int
4108 run_rt5390_rf_init(struct run_softc *sc)
4109 {
4110 	uint32_t tmp;
4111 	uint8_t rf;
4112 	int i;
4113 
4114 	/* Toggle RF R2 to initiate calibration. */
4115 	if (sc->mac_ver == 0x5390) {
4116 		run_rt3070_rf_read(sc, 2, &rf);
4117 		run_rt3070_rf_write(sc, 2, rf | RT5390_RESCAL);
4118 		usbd_delay_ms(sc->sc_udev, 10);
4119 		run_rt3070_rf_write(sc, 2, rf & ~RT5390_RESCAL);
4120 	} else {
4121 		run_rt3070_rf_write(sc, 2, RT5390_RESCAL);
4122 		usbd_delay_ms(sc->sc_udev, 10);
4123 	}
4124 
4125 	/* Initialize RF registers to default value. */
4126 	if (sc->mac_ver == 0x5592) {
4127 		for (i = 0; i < __arraycount(rt5592_def_rf); i++) {
4128 			run_rt3070_rf_write(sc, rt5592_def_rf[i].reg,
4129 			    rt5592_def_rf[i].val);
4130 		}
4131 		/* Initialize RF frequency offset. */
4132 		run_adjust_freq_offset(sc);
4133 	} else if (sc->mac_ver == 0x5392) {
4134 		for (i = 0; i < __arraycount(rt5392_def_rf); i++) {
4135 			run_rt3070_rf_write(sc, rt5392_def_rf[i].reg,
4136 			    rt5392_def_rf[i].val);
4137 		}
4138 		if (sc->mac_rev >= 0x0223) {
4139 			run_rt3070_rf_write(sc, 23, 0x0f);
4140 			run_rt3070_rf_write(sc, 24, 0x3e);
4141 			run_rt3070_rf_write(sc, 51, 0x32);
4142 			run_rt3070_rf_write(sc, 53, 0x22);
4143 			run_rt3070_rf_write(sc, 56, 0xc1);
4144 			run_rt3070_rf_write(sc, 59, 0x0f);
4145 		}
4146 	} else {
4147 		for (i = 0; i < __arraycount(rt5390_def_rf); i++) {
4148 			run_rt3070_rf_write(sc, rt5390_def_rf[i].reg,
4149 			    rt5390_def_rf[i].val);
4150 		}
4151 		if (sc->mac_rev >= 0x0502) {
4152 			run_rt3070_rf_write(sc, 6, 0xe0);
4153 			run_rt3070_rf_write(sc, 25, 0x80);
4154 			run_rt3070_rf_write(sc, 46, 0x73);
4155 			run_rt3070_rf_write(sc, 53, 0x00);
4156 			run_rt3070_rf_write(sc, 56, 0x42);
4157 			run_rt3070_rf_write(sc, 61, 0xd1);
4158 		}
4159 	}
4160 
4161 	sc->rf24_20mhz = 0x1f;  /* default value */
4162 	sc->rf24_40mhz = (sc->mac_ver == 0x5592) ? 0 : 0x2f;
4163 
4164 	if (sc->mac_rev < 0x0211)
4165 		run_rt3070_rf_write(sc, 27, 0x3);
4166 
4167 	run_read(sc, RT3070_OPT_14, &tmp);
4168 	run_write(sc, RT3070_OPT_14, tmp | 1);
4169 	return (0);
4170 }
4171 
4172 static int
4173 run_rt3070_filter_calib(struct run_softc *sc, uint8_t init, uint8_t target,
4174     uint8_t *val)
4175 {
4176 	uint8_t rf22, rf24;
4177 	uint8_t bbp55_pb, bbp55_sb, delta;
4178 	int ntries;
4179 
4180 	/* program filter */
4181 	run_rt3070_rf_read(sc, 24, &rf24);
4182 	rf24 = (rf24 & 0xc0) | init;    /* initial filter value */
4183 	run_rt3070_rf_write(sc, 24, rf24);
4184 
4185 	/* enable baseband loopback mode */
4186 	run_rt3070_rf_read(sc, 22, &rf22);
4187 	run_rt3070_rf_write(sc, 22, rf22 | 0x01);
4188 
4189 	/* set power and frequency of passband test tone */
4190 	run_bbp_write(sc, 24, 0x00);
4191 	for (ntries = 0; ntries < 100; ntries++) {
4192 		/* transmit test tone */
4193 		run_bbp_write(sc, 25, 0x90);
4194 		usbd_delay_ms(sc->sc_udev, 10);
4195 		/* read received power */
4196 		run_bbp_read(sc, 55, &bbp55_pb);
4197 		if (bbp55_pb != 0)
4198 			break;
4199 	}
4200 	if (ntries == 100)
4201 		return ETIMEDOUT;
4202 
4203 	/* set power and frequency of stopband test tone */
4204 	run_bbp_write(sc, 24, 0x06);
4205 	for (ntries = 0; ntries < 100; ntries++) {
4206 		/* transmit test tone */
4207 		run_bbp_write(sc, 25, 0x90);
4208 		usbd_delay_ms(sc->sc_udev, 10);
4209 		/* read received power */
4210 		run_bbp_read(sc, 55, &bbp55_sb);
4211 
4212 		delta = bbp55_pb - bbp55_sb;
4213 		if (delta > target)
4214 			break;
4215 
4216 		/* reprogram filter */
4217 		rf24++;
4218 		run_rt3070_rf_write(sc, 24, rf24);
4219 	}
4220 	if (ntries < 100) {
4221 		if (rf24 != init)
4222 			rf24--;	/* backtrack */
4223 		*val = rf24;
4224 		run_rt3070_rf_write(sc, 24, rf24);
4225 	}
4226 
4227 	/* restore initial state */
4228 	run_bbp_write(sc, 24, 0x00);
4229 
4230 	/* disable baseband loopback mode */
4231 	run_rt3070_rf_read(sc, 22, &rf22);
4232 	run_rt3070_rf_write(sc, 22, rf22 & ~0x01);
4233 
4234 	return 0;
4235 }
4236 
4237 static void
4238 run_rt3070_rf_setup(struct run_softc *sc)
4239 {
4240 	uint8_t bbp, rf;
4241 	int i;
4242 
4243 	if (sc->mac_ver == 0x3572) {
4244 		/* enable DC filter */
4245 		if (sc->mac_rev >= 0x0201)
4246 			run_bbp_write(sc, 103, 0xc0);
4247 
4248 		run_bbp_read(sc, 138, &bbp);
4249 		if (sc->ntxchains == 1)
4250 			bbp |= 0x20;	/* turn off DAC1 */
4251 		if (sc->nrxchains == 1)
4252 			bbp &= ~0x02;	/* turn off ADC1 */
4253 		run_bbp_write(sc, 138, bbp);
4254 
4255 		if (sc->mac_rev >= 0x0211) {
4256 			/* improve power consumption */
4257 			run_bbp_read(sc, 31, &bbp);
4258 			run_bbp_write(sc, 31, bbp & ~0x03);
4259 		}
4260 
4261 		run_rt3070_rf_read(sc, 16, &rf);
4262 		rf = (rf & ~0x07) | sc->txmixgain_2ghz;
4263 		run_rt3070_rf_write(sc, 16, rf);
4264 	} else if (sc->mac_ver == 0x3071) {
4265 		/* enable DC filter */
4266 		if (sc->mac_rev >= 0x0201)
4267 			run_bbp_write(sc, 103, 0xc0);
4268 
4269 		run_bbp_read(sc, 138, &bbp);
4270 		if (sc->ntxchains == 1)
4271 			bbp |= 0x20;	/* turn off DAC1 */
4272 		if (sc->nrxchains == 1)
4273 			bbp &= ~0x02;	/* turn off ADC1 */
4274 		run_bbp_write(sc, 138, bbp);
4275 
4276 		if (sc->mac_rev >= 0x0211) {
4277 			/* improve power consumption */
4278 			run_bbp_read(sc, 31, &bbp);
4279 			run_bbp_write(sc, 31, bbp & ~0x03);
4280 		}
4281 
4282 		run_write(sc, RT2860_TX_SW_CFG1, 0);
4283 		if (sc->mac_rev < 0x0211) {
4284 			run_write(sc, RT2860_TX_SW_CFG2,
4285 			    sc->patch_dac ? 0x2c : 0x0f);
4286 		} else
4287 			run_write(sc, RT2860_TX_SW_CFG2, 0);
4288 	} else if (sc->mac_ver == 0x3070) {
4289 		if (sc->mac_rev >= 0x0201) {
4290 			/* enable DC filter */
4291 			run_bbp_write(sc, 103, 0xc0);
4292 
4293 			/* improve power consumption */
4294 			run_bbp_read(sc, 31, &bbp);
4295 			run_bbp_write(sc, 31, bbp & ~0x03);
4296 		}
4297 
4298 		if (sc->mac_rev < 0x0211) {
4299 			run_write(sc, RT2860_TX_SW_CFG1, 0);
4300 			run_write(sc, RT2860_TX_SW_CFG2, 0x2c);
4301 		} else
4302 			run_write(sc, RT2860_TX_SW_CFG2, 0);
4303 	}
4304 
4305 	/* initialize RF registers from ROM for >=RT3071*/
4306 	if (sc->mac_ver >= 0x3071) {
4307 		for (i = 0; i < 10; i++) {
4308 			if (sc->rf[i].reg == 0 || sc->rf[i].reg == 0xff)
4309 				continue;
4310 			run_rt3070_rf_write(sc, sc->rf[i].reg, sc->rf[i].val);
4311 		}
4312 	}
4313 }
4314 
4315 static void
4316 run_rt3593_rf_setup(struct run_softc *sc)
4317 {
4318 	uint8_t bbp, rf;
4319 
4320 	if (sc->mac_rev >= 0x0211) {
4321 		/* Enable DC filter. */
4322 		run_bbp_write(sc, 103, 0xc0);
4323 	}
4324 	run_write(sc, RT2860_TX_SW_CFG1, 0);
4325 	if (sc->mac_rev < 0x0211) {
4326 		run_write(sc, RT2860_TX_SW_CFG2,
4327 		    sc->patch_dac ? 0x2c : 0x0f);
4328 	} else
4329 		run_write(sc, RT2860_TX_SW_CFG2, 0);
4330 
4331 	run_rt3070_rf_read(sc, 50, &rf);
4332 	run_rt3070_rf_write(sc, 50, rf & ~RT3593_TX_LO2);
4333 
4334 	run_rt3070_rf_read(sc, 51, &rf);
4335 	rf = (rf & ~(RT3593_TX_LO1 | 0x0c)) |
4336 	    ((sc->txmixgain_2ghz & 0x07) << 2);
4337 	run_rt3070_rf_write(sc, 51, rf);
4338 
4339 	run_rt3070_rf_read(sc, 38, &rf);
4340 	run_rt3070_rf_write(sc, 38, rf & ~RT5390_RX_LO1);
4341 
4342 	run_rt3070_rf_read(sc, 39, &rf);
4343 	run_rt3070_rf_write(sc, 39, rf & ~RT5390_RX_LO2);
4344 
4345 	run_rt3070_rf_read(sc, 1, &rf);
4346 	run_rt3070_rf_write(sc, 1, rf & ~(RT3070_RF_BLOCK | RT3070_PLL_PD));
4347 
4348 	run_rt3070_rf_read(sc, 30, &rf);
4349 	rf = (rf & ~0x18) | 0x10;
4350 	run_rt3070_rf_write(sc, 30, rf);
4351 
4352 	/* Apply maximum likelihood detection for 2 stream case. */
4353 	run_bbp_read(sc, 105, &bbp);
4354 	if (sc->nrxchains > 1)
4355 		run_bbp_write(sc, 105, bbp | RT5390_MLD);
4356 
4357 	/* Avoid data lost and CRC error. */
4358 	run_bbp_read(sc, 4, &bbp);
4359 	run_bbp_write(sc, 4, bbp | RT5390_MAC_IF_CTRL);
4360 
4361 	run_bbp_write(sc, 92, 0x02);
4362 	run_bbp_write(sc, 82, 0x82);
4363 	run_bbp_write(sc, 106, 0x05);
4364 	run_bbp_write(sc, 104, 0x92);
4365 	run_bbp_write(sc, 88, 0x90);
4366 	run_bbp_write(sc, 148, 0xc8);
4367 	run_bbp_write(sc, 47, 0x48);
4368 	run_bbp_write(sc, 120, 0x50);
4369 
4370 	run_bbp_write(sc, 163, 0x9d);
4371 
4372 	/* SNR mapping. */
4373 	run_bbp_write(sc, 142, 0x06);
4374 	run_bbp_write(sc, 143, 0xa0);
4375 	run_bbp_write(sc, 142, 0x07);
4376 	run_bbp_write(sc, 143, 0xa1);
4377 	run_bbp_write(sc, 142, 0x08);
4378 	run_bbp_write(sc, 143, 0xa2);
4379 
4380 	run_bbp_write(sc, 31, 0x08);
4381 	run_bbp_write(sc, 68, 0x0b);
4382 	run_bbp_write(sc, 105, 0x04);
4383 }
4384 
4385 static void
4386 run_rt5390_rf_setup(struct run_softc *sc)
4387 {
4388 	uint8_t bbp, rf;
4389 
4390 	if (sc->mac_rev >= 0x0211) {
4391 		/* Enable DC filter. */
4392 		run_bbp_write(sc, 103, 0xc0);
4393 
4394 		if (sc->mac_ver != 0x5592) {
4395 			/* Improve power consumption. */
4396 			run_bbp_read(sc, 31, &bbp);
4397 			run_bbp_write(sc, 31, bbp & ~0x03);
4398 		}
4399 	}
4400 
4401 	run_bbp_read(sc, 138, &bbp);
4402 	if (sc->ntxchains == 1)
4403 		bbp |= 0x20;    /* turn off DAC1 */
4404 	if (sc->nrxchains == 1)
4405 		bbp &= ~0x02;   /* turn off ADC1 */
4406 	run_bbp_write(sc, 138, bbp);
4407 
4408 	run_rt3070_rf_read(sc, 38, &rf);
4409 	run_rt3070_rf_write(sc, 38, rf & ~RT5390_RX_LO1);
4410 
4411 	run_rt3070_rf_read(sc, 39, &rf);
4412 	run_rt3070_rf_write(sc, 39, rf & ~RT5390_RX_LO2);
4413 
4414 	/* Avoid data lost and CRC error. */
4415 	run_bbp_read(sc, 4, &bbp);
4416 	run_bbp_write(sc, 4, bbp | RT5390_MAC_IF_CTRL);
4417 
4418 	run_rt3070_rf_read(sc, 30, &rf);
4419 	rf = (rf & ~0x18) | 0x10;
4420 	run_rt3070_rf_write(sc, 30, rf);
4421 
4422 	if (sc->mac_ver != 0x5592) {
4423 		run_write(sc, RT2860_TX_SW_CFG1, 0);
4424 		if (sc->mac_rev < 0x0211) {
4425 			run_write(sc, RT2860_TX_SW_CFG2,
4426 			    sc->patch_dac ? 0x2c : 0x0f);
4427 		} else
4428 			run_write(sc, RT2860_TX_SW_CFG2, 0);
4429 	}
4430 }
4431 
4432 static int
4433 run_txrx_enable(struct run_softc *sc)
4434 {
4435 	uint32_t tmp;
4436 	int error, ntries;
4437 
4438 	run_write(sc, RT2860_MAC_SYS_CTRL, RT2860_MAC_TX_EN);
4439 	for (ntries = 0; ntries < 200; ntries++) {
4440 		if ((error = run_read(sc, RT2860_WPDMA_GLO_CFG, &tmp)) != 0)
4441 			return error;
4442 		if ((tmp & (RT2860_TX_DMA_BUSY | RT2860_RX_DMA_BUSY)) == 0)
4443 			break;
4444 		usbd_delay_ms(sc->sc_udev, 50);
4445 	}
4446 	if (ntries == 200)
4447 		return ETIMEDOUT;
4448 
4449 	usbd_delay_ms(sc->sc_udev, 50);
4450 
4451 	tmp |= RT2860_RX_DMA_EN | RT2860_TX_DMA_EN | RT2860_TX_WB_DDONE;
4452 	run_write(sc, RT2860_WPDMA_GLO_CFG, tmp);
4453 
4454 	/* enable Rx bulk aggregation (set timeout and limit) */
4455 	tmp = RT2860_USB_TX_EN | RT2860_USB_RX_EN | RT2860_USB_RX_AGG_EN |
4456 	    RT2860_USB_RX_AGG_TO(128) | RT2860_USB_RX_AGG_LMT(2);
4457 	run_write(sc, RT2860_USB_DMA_CFG, tmp);
4458 
4459 	/* set Rx filter */
4460 	tmp = RT2860_DROP_CRC_ERR | RT2860_DROP_PHY_ERR;
4461 	if (sc->sc_ic.ic_opmode != IEEE80211_M_MONITOR) {
4462 		tmp |= RT2860_DROP_UC_NOME | RT2860_DROP_DUPL |
4463 		    RT2860_DROP_CTS | RT2860_DROP_BA | RT2860_DROP_ACK |
4464 		    RT2860_DROP_VER_ERR | RT2860_DROP_CTRL_RSV |
4465 		    RT2860_DROP_CFACK | RT2860_DROP_CFEND;
4466 		if (sc->sc_ic.ic_opmode == IEEE80211_M_STA)
4467 			tmp |= RT2860_DROP_RTS | RT2860_DROP_PSPOLL;
4468 	}
4469 	run_write(sc, RT2860_RX_FILTR_CFG, tmp);
4470 
4471 	run_write(sc, RT2860_MAC_SYS_CTRL,
4472 	    RT2860_MAC_RX_EN | RT2860_MAC_TX_EN);
4473 
4474 	return 0;
4475 }
4476 
4477 static int
4478 run_adjust_freq_offset(struct run_softc *sc)
4479 {
4480 	uint8_t rf, tmp;
4481 
4482 	run_rt3070_rf_read(sc, 17, &rf);
4483 	tmp = rf;
4484 	rf = (rf & ~0x7f) | (sc->freq & 0x7f);
4485 	rf = MIN(rf, 0x5f);
4486 
4487 	if (tmp != rf)
4488 		run_mcu_cmd(sc, 0x74, (tmp << 8 ) | rf);
4489 
4490 	return (0);
4491 }
4492 
4493 static int
4494 run_init(struct ifnet *ifp)
4495 {
4496 	struct run_softc *sc = ifp->if_softc;
4497 	struct ieee80211com *ic = &sc->sc_ic;
4498 	uint32_t tmp;
4499 	uint8_t bbp1, bbp3;
4500 	int i, error, qid, ridx, ntries;
4501 
4502 	for (ntries = 0; ntries < 100; ntries++) {
4503 		if ((error = run_read(sc, RT2860_ASIC_VER_ID, &tmp)) != 0)
4504 			goto fail;
4505 		if (tmp != 0 && tmp != 0xffffffff)
4506 			break;
4507 		usbd_delay_ms(sc->sc_udev, 10);
4508 	}
4509 	if (ntries == 100) {
4510 		error = ETIMEDOUT;
4511 		goto fail;
4512 	}
4513 
4514 	if ((sc->sc_flags & RUN_FWLOADED) == 0 &&
4515 	    (error = run_load_microcode(sc)) != 0) {
4516 		aprint_error_dev(sc->sc_dev,
4517 		    "could not load 8051 microcode\n");
4518 		goto fail;
4519 	}
4520 
4521 	if (ifp->if_flags & IFF_RUNNING)
4522 		run_stop(ifp, 0);
4523 
4524 	/* init host command ring */
4525 	sc->cmdq.cur = sc->cmdq.next = sc->cmdq.queued = 0;
4526 
4527 	/* init Tx rings (4 EDCAs) */
4528 	for (qid = 0; qid < 4; qid++) {
4529 		if ((error = run_alloc_tx_ring(sc, qid)) != 0)
4530 			goto fail;
4531 	}
4532 	/* init Rx ring */
4533 	if ((error = run_alloc_rx_ring(sc)) != 0)
4534 		goto fail;
4535 
4536 	IEEE80211_ADDR_COPY(ic->ic_myaddr, CLLADDR(ifp->if_sadl));
4537 	run_set_macaddr(sc, ic->ic_myaddr);
4538 
4539 	for (ntries = 0; ntries < 100; ntries++) {
4540 		if ((error = run_read(sc, RT2860_WPDMA_GLO_CFG, &tmp)) != 0)
4541 			goto fail;
4542 		if ((tmp & (RT2860_TX_DMA_BUSY | RT2860_RX_DMA_BUSY)) == 0)
4543 			break;
4544 		usbd_delay_ms(sc->sc_udev, 10);
4545 	}
4546 	if (ntries == 100) {
4547 		aprint_error_dev(sc->sc_dev,
4548 		    "timeout waiting for DMA engine\n");
4549 		error = ETIMEDOUT;
4550 		goto fail;
4551 	}
4552 	tmp &= 0xff0;
4553 	tmp |= RT2860_TX_WB_DDONE;
4554 	run_write(sc, RT2860_WPDMA_GLO_CFG, tmp);
4555 
4556 	/* turn off PME_OEN to solve high-current issue */
4557 	run_read(sc, RT2860_SYS_CTRL, &tmp);
4558 	run_write(sc, RT2860_SYS_CTRL, tmp & ~RT2860_PME_OEN);
4559 
4560 	run_write(sc, RT2860_MAC_SYS_CTRL,
4561 	    RT2860_BBP_HRST | RT2860_MAC_SRST);
4562 	run_write(sc, RT2860_USB_DMA_CFG, 0);
4563 
4564 	if ((error = run_reset(sc)) != 0) {
4565 		aprint_error_dev(sc->sc_dev, "could not reset chipset\n");
4566 		goto fail;
4567 	}
4568 
4569 	run_write(sc, RT2860_MAC_SYS_CTRL, 0);
4570 
4571 	/* init Tx power for all Tx rates (from EEPROM) */
4572 	for (ridx = 0; ridx < 5; ridx++) {
4573 		if (sc->txpow20mhz[ridx] == 0xffffffff)
4574 			continue;
4575 		run_write(sc, RT2860_TX_PWR_CFG(ridx), sc->txpow20mhz[ridx]);
4576 	}
4577 
4578 	for (i = 0; i < (int)__arraycount(rt2870_def_mac); i++)
4579 		run_write(sc, rt2870_def_mac[i].reg, rt2870_def_mac[i].val);
4580 	run_write(sc, RT2860_WMM_AIFSN_CFG, 0x00002273);
4581 	run_write(sc, RT2860_WMM_CWMIN_CFG, 0x00002344);
4582 	run_write(sc, RT2860_WMM_CWMAX_CFG, 0x000034aa);
4583 
4584 	if (sc->mac_ver >= 0x5390) {
4585 		run_write(sc, RT2860_TX_SW_CFG0,
4586 		    4 << RT2860_DLY_PAPE_EN_SHIFT | 4);
4587 		if (sc->mac_ver >= 0x5392) {
4588 			run_write(sc, RT2860_MAX_LEN_CFG, 0x00002fff);
4589 			if (sc->mac_ver == 0x5592) {
4590 				run_write(sc, RT2860_HT_FBK_CFG1, 0xedcba980);
4591 				run_write(sc, RT2860_TXOP_HLDR_ET, 0x00000082);
4592 			} else {
4593 				run_write(sc, RT2860_HT_FBK_CFG1, 0xedcb4980);
4594 				run_write(sc, RT2860_LG_FBK_CFG0, 0xedcba322);
4595 			}
4596 		}
4597 	} else if (sc->mac_ver >= 0x3593) {
4598 		run_write(sc, RT2860_TX_SW_CFG0,
4599 		    4 << RT2860_DLY_PAPE_EN_SHIFT | 2);
4600 	} else if (sc->mac_ver >= 0x3070) {
4601 		/* set delay of PA_PE assertion to 1us (unit of 0.25us) */
4602 		run_write(sc, RT2860_TX_SW_CFG0,
4603 		    4 << RT2860_DLY_PAPE_EN_SHIFT);
4604 	}
4605 
4606 	/* wait while MAC is busy */
4607 	for (ntries = 0; ntries < 100; ntries++) {
4608 		if ((error = run_read(sc, RT2860_MAC_STATUS_REG, &tmp)) != 0)
4609 			goto fail;
4610 		if (!(tmp & (RT2860_RX_STATUS_BUSY | RT2860_TX_STATUS_BUSY)))
4611 			break;
4612 		DELAY(1000);
4613 	}
4614 	if (ntries == 100) {
4615 		error = ETIMEDOUT;
4616 		goto fail;
4617 	}
4618 
4619 	/* clear Host to MCU mailbox */
4620 	run_write(sc, RT2860_H2M_BBPAGENT, 0);
4621 	run_write(sc, RT2860_H2M_MAILBOX, 0);
4622 	usbd_delay_ms(sc->sc_udev, 10);
4623 
4624 	if ((error = run_bbp_init(sc)) != 0) {
4625 		aprint_error_dev(sc->sc_dev, "could not initialize BBP\n");
4626 		goto fail;
4627 	}
4628 
4629 	/* abort TSF synchronization */
4630 	run_read(sc, RT2860_BCN_TIME_CFG, &tmp);
4631 	tmp &= ~(RT2860_BCN_TX_EN | RT2860_TSF_TIMER_EN |
4632 	    RT2860_TBTT_TIMER_EN);
4633 	run_write(sc, RT2860_BCN_TIME_CFG, tmp);
4634 
4635 	/* clear RX WCID search table */
4636 	run_set_region_4(sc, RT2860_WCID_ENTRY(0), 0, 512);
4637 	/* clear Pair-wise key table */
4638 	run_set_region_4(sc, RT2860_PKEY(0), 0, 2048);
4639 	/* clear IV/EIV table */
4640 	run_set_region_4(sc, RT2860_IVEIV(0), 0, 512);
4641 	/* clear WCID attribute table */
4642 	run_set_region_4(sc, RT2860_WCID_ATTR(0), 0, 8 * 32);
4643 	/* clear shared key table */
4644 	run_set_region_4(sc, RT2860_SKEY(0, 0), 0, 8 * 32);
4645 	/* clear shared key mode */
4646 	run_set_region_4(sc, RT2860_SKEY_MODE_0_7, 0, 4);
4647 
4648 	/* clear RX WCID search table */
4649 	run_set_region_4(sc, RT2860_WCID_ENTRY(0), 0, 512);
4650 	/* clear WCID attribute table */
4651 	run_set_region_4(sc, RT2860_WCID_ATTR(0), 0, 8 * 32);
4652 
4653 	run_read(sc, RT2860_US_CYC_CNT, &tmp);
4654 	tmp = (tmp & ~0xff) | 0x1e;
4655 	run_write(sc, RT2860_US_CYC_CNT, tmp);
4656 
4657 	if (sc->mac_rev != 0x0101)
4658 		run_write(sc, RT2860_TXOP_CTRL_CFG, 0x0000583f);
4659 
4660 	run_write(sc, RT2860_WMM_TXOP0_CFG, 0);
4661 	run_write(sc, RT2860_WMM_TXOP1_CFG, 48 << 16 | 96);
4662 
4663 	/* write vendor-specific BBP values (from EEPROM) */
4664 	if (sc->mac_ver < 0x3593) {
4665 		for (i = 0; i < 10; i++) {
4666 			if (sc->bbp[i].reg == 0 || sc->bbp[i].reg == 0xff)
4667 				continue;
4668 			run_bbp_write(sc, sc->bbp[i].reg, sc->bbp[i].val);
4669 		}
4670 	}
4671 
4672 	/* select Main antenna for 1T1R devices */
4673 	if (sc->rf_rev == RT3070_RF_3020 || sc->rf_rev == RT5390_RF_5370)
4674 		run_set_rx_antenna(sc, 0);
4675 
4676 	/* send LEDs operating mode to microcontroller */
4677 	(void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED1, sc->led[0]);
4678 	(void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED2, sc->led[1]);
4679 	(void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED3, sc->led[2]);
4680 
4681 	if (sc->mac_ver >= 0x5390)
4682 		run_rt5390_rf_init(sc);
4683 	else if (sc->mac_ver == 0x3593)
4684 		run_rt3593_rf_init(sc);
4685 	else if (sc->mac_ver >= 0x3070)
4686 		run_rt3070_rf_init(sc);
4687 
4688 	/* disable non-existing Rx chains */
4689 	run_bbp_read(sc, 3, &bbp3);
4690 	bbp3 &= ~(1 << 3 | 1 << 4);
4691 	if (sc->nrxchains == 2)
4692 		bbp3 |= 1 << 3;
4693 	else if (sc->nrxchains == 3)
4694 		bbp3 |= 1 << 4;
4695 	run_bbp_write(sc, 3, bbp3);
4696 
4697 	/* disable non-existing Tx chains */
4698 	run_bbp_read(sc, 1, &bbp1);
4699 	if (sc->ntxchains == 1)
4700 		bbp1 &= ~(1 << 3 | 1 << 4);
4701 	run_bbp_write(sc, 1, bbp1);
4702 
4703 	if (sc->mac_ver >= 0x5390)
4704 		run_rt5390_rf_setup(sc);
4705 	else if (sc->mac_ver == 0x3593)
4706 		run_rt3593_rf_setup(sc);
4707 	else if (sc->mac_ver >= 0x3070)
4708 		run_rt3070_rf_setup(sc);
4709 
4710 	/* select default channel */
4711 	run_set_chan(sc, ic->ic_curchan);
4712 
4713 	/* setup initial protection mode */
4714 	run_updateprot(sc);
4715 
4716 	/* turn radio LED on */
4717 	run_set_leds(sc, RT2860_LED_RADIO);
4718 
4719 #ifdef RUN_HWCRYPTO
4720 	if (ic->ic_flags & IEEE80211_F_PRIVACY) {
4721 		/* install WEP keys */
4722 		for (i = 0; i < IEEE80211_WEP_NKID; i++)
4723 			(void)run_set_key(ic, &ic->ic_crypto.cs_nw_keys[i],
4724 			    NULL);
4725 	}
4726 #endif
4727 
4728 	for (i = 0; i < RUN_RX_RING_COUNT; i++) {
4729 		struct run_rx_data *data = &sc->rxq.data[i];
4730 
4731 		usbd_setup_xfer(data->xfer, data, data->buf, RUN_MAX_RXSZ,
4732 		    USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, run_rxeof);
4733 		error = usbd_transfer(data->xfer);
4734 		if (error != USBD_NORMAL_COMPLETION &&
4735 		    error != USBD_IN_PROGRESS)
4736 			goto fail;
4737 	}
4738 
4739 	if ((error = run_txrx_enable(sc)) != 0)
4740 		goto fail;
4741 
4742 	ifp->if_flags &= ~IFF_OACTIVE;
4743 	ifp->if_flags |= IFF_RUNNING;
4744 
4745 	if (ic->ic_opmode == IEEE80211_M_MONITOR)
4746 		ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
4747 	else
4748 		ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
4749 
4750 	if (error != 0)
4751 fail:		run_stop(ifp, 1);
4752 	return error;
4753 }
4754 
4755 static void
4756 run_stop(struct ifnet *ifp, int disable)
4757 {
4758 	struct run_softc *sc = ifp->if_softc;
4759 	struct ieee80211com *ic = &sc->sc_ic;
4760 	uint32_t tmp;
4761 	int ntries, qid;
4762 
4763 	if (ifp->if_flags & IFF_RUNNING)
4764 		run_set_leds(sc, 0);	/* turn all LEDs off */
4765 
4766 	sc->sc_tx_timer = 0;
4767 	ifp->if_timer = 0;
4768 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
4769 
4770 	callout_stop(&sc->scan_to);
4771 	callout_stop(&sc->calib_to);
4772 
4773 	ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
4774 	/* wait for all queued asynchronous commands to complete */
4775 	while (sc->cmdq.queued > 0)
4776 		tsleep(&sc->cmdq, 0, "cmdq", 0);
4777 
4778 	/* disable Tx/Rx */
4779 	run_read(sc, RT2860_MAC_SYS_CTRL, &tmp);
4780 	tmp &= ~(RT2860_MAC_RX_EN | RT2860_MAC_TX_EN);
4781 	run_write(sc, RT2860_MAC_SYS_CTRL, tmp);
4782 
4783 	/* wait for pending Tx to complete */
4784 	for (ntries = 0; ntries < 100; ntries++) {
4785 		if (run_read(sc, RT2860_TXRXQ_PCNT, &tmp) != 0)
4786 			break;
4787 		if ((tmp & RT2860_TX2Q_PCNT_MASK) == 0)
4788 			break;
4789 	}
4790 	DELAY(1000);
4791 	run_write(sc, RT2860_USB_DMA_CFG, 0);
4792 
4793 	/* reset adapter */
4794 	run_write(sc, RT2860_MAC_SYS_CTRL, RT2860_BBP_HRST | RT2860_MAC_SRST);
4795 	run_write(sc, RT2860_MAC_SYS_CTRL, 0);
4796 
4797 	/* reset Tx and Rx rings */
4798 	sc->qfullmsk = 0;
4799 	for (qid = 0; qid < 4; qid++)
4800 		run_free_tx_ring(sc, qid);
4801 	run_free_rx_ring(sc);
4802 }
4803 
4804 #ifndef IEEE80211_STA_ONLY
4805 static int
4806 run_setup_beacon(struct run_softc *sc)
4807 {
4808 	struct ieee80211com *ic = &sc->sc_ic;
4809 	struct rt2860_txwi txwi;
4810 	struct mbuf *m;
4811 	uint16_t txwisize;
4812 	int ridx;
4813 
4814 	if ((m = ieee80211_beacon_alloc(ic, ic->ic_bss, &sc->sc_bo)) == NULL)
4815 		return ENOBUFS;
4816 
4817 	memset(&txwi, 0, sizeof(txwi));
4818 	txwi.wcid = 0xff;
4819 	txwi.len = htole16(m->m_pkthdr.len);
4820 	/* send beacons at the lowest available rate */
4821 	ridx = (ic->ic_curmode == IEEE80211_MODE_11A) ?
4822 	    RT2860_RIDX_OFDM6 : RT2860_RIDX_CCK1;
4823 	txwi.phy = htole16(rt2860_rates[ridx].mcs);
4824 	if (rt2860_rates[ridx].phy == IEEE80211_T_OFDM)
4825 		txwi.phy |= htole16(RT2860_PHY_OFDM);
4826 	txwi.txop = RT2860_TX_TXOP_HT;
4827 	txwi.flags = RT2860_TX_TS;
4828 
4829 	txwisize = (sc->mac_ver == 0x5592) ?
4830 	    sizeof(txwi) + sizeof(uint32_t) : sizeof(txwi);
4831 	run_write_region_1(sc, RT2860_BCN_BASE(0),
4832 	    (uint8_t *)&txwi, txwisize);
4833 	run_write_region_1(sc, RT2860_BCN_BASE(0) + txwisize,
4834 	    mtod(m, uint8_t *), (m->m_pkthdr.len + 1) & ~1);
4835 
4836 	m_freem(m);
4837 
4838 	return 0;
4839 }
4840 #endif
4841 
4842 MODULE(MODULE_CLASS_DRIVER, if_run, "bpf");
4843 
4844 #ifdef _MODULE
4845 #include "ioconf.c"
4846 #endif
4847 
4848 static int
4849 if_run_modcmd(modcmd_t cmd, void *arg)
4850 {
4851 	int error = 0;
4852 
4853 	switch (cmd) {
4854 	case MODULE_CMD_INIT:
4855 #ifdef _MODULE
4856 		error = config_init_component(cfdriver_ioconf_run,
4857 		    cfattach_ioconf_run, cfdata_ioconf_run);
4858 #endif
4859 		return error;
4860 	case MODULE_CMD_FINI:
4861 #ifdef _MODULE
4862 		error = config_fini_component(cfdriver_ioconf_run,
4863 		    cfattach_ioconf_run, cfdata_ioconf_run);
4864 #endif
4865 		return error;
4866 	default:
4867 		return ENOTTY;
4868 	}
4869 }
4870