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