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