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