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