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