Merge branch 'vendor/OPENSSH'
[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;
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         for (ntries = 0; ntries < 100; ntries++) {
1460                 if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0)
1461                         return (error);
1462                 if (!(tmp & RT3070_RF_KICK))
1463                         break;
1464         }
1465         if (ntries == 100)
1466                 return (ETIMEDOUT);
1467
1468         tmp = RT3070_RF_KICK | reg << 8;
1469         if ((error = run_write(sc, RT3070_RF_CSR_CFG, tmp)) != 0)
1470                 return (error);
1471
1472         for (ntries = 0; ntries < 100; ntries++) {
1473                 if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0)
1474                         return (error);
1475                 if (!(tmp & RT3070_RF_KICK))
1476                         break;
1477         }
1478         if (ntries == 100)
1479                 return (ETIMEDOUT);
1480
1481         *val = tmp & 0xff;
1482         return (0);
1483 }
1484
1485 static int
1486 run_rt3070_rf_write(struct run_softc *sc, uint8_t reg, uint8_t val)
1487 {
1488         uint32_t tmp;
1489         int error, ntries;
1490
1491         for (ntries = 0; ntries < 10; ntries++) {
1492                 if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0)
1493                         return (error);
1494                 if (!(tmp & RT3070_RF_KICK))
1495                         break;
1496         }
1497         if (ntries == 10)
1498                 return (ETIMEDOUT);
1499
1500         tmp = RT3070_RF_WRITE | RT3070_RF_KICK | reg << 8 | val;
1501         return (run_write(sc, RT3070_RF_CSR_CFG, tmp));
1502 }
1503
1504 static int
1505 run_bbp_read(struct run_softc *sc, uint8_t reg, uint8_t *val)
1506 {
1507         uint32_t tmp;
1508         int ntries, error;
1509
1510         for (ntries = 0; ntries < 10; ntries++) {
1511                 if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0)
1512                         return (error);
1513                 if (!(tmp & RT2860_BBP_CSR_KICK))
1514                         break;
1515         }
1516         if (ntries == 10)
1517                 return (ETIMEDOUT);
1518
1519         tmp = RT2860_BBP_CSR_READ | RT2860_BBP_CSR_KICK | reg << 8;
1520         if ((error = run_write(sc, RT2860_BBP_CSR_CFG, tmp)) != 0)
1521                 return (error);
1522
1523         for (ntries = 0; ntries < 10; ntries++) {
1524                 if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0)
1525                         return (error);
1526                 if (!(tmp & RT2860_BBP_CSR_KICK))
1527                         break;
1528         }
1529         if (ntries == 10)
1530                 return (ETIMEDOUT);
1531
1532         *val = tmp & 0xff;
1533         return (0);
1534 }
1535
1536 static int
1537 run_bbp_write(struct run_softc *sc, uint8_t reg, uint8_t val)
1538 {
1539         uint32_t tmp;
1540         int ntries, error;
1541
1542         for (ntries = 0; ntries < 10; ntries++) {
1543                 if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0)
1544                         return (error);
1545                 if (!(tmp & RT2860_BBP_CSR_KICK))
1546                         break;
1547         }
1548         if (ntries == 10)
1549                 return (ETIMEDOUT);
1550
1551         tmp = RT2860_BBP_CSR_KICK | reg << 8 | val;
1552         return (run_write(sc, RT2860_BBP_CSR_CFG, tmp));
1553 }
1554
1555 /*
1556  * Send a command to the 8051 microcontroller unit.
1557  */
1558 static int
1559 run_mcu_cmd(struct run_softc *sc, uint8_t cmd, uint16_t arg)
1560 {
1561         uint32_t tmp;
1562         int error, ntries;
1563
1564         for (ntries = 0; ntries < 100; ntries++) {
1565                 if ((error = run_read(sc, RT2860_H2M_MAILBOX, &tmp)) != 0)
1566                         return error;
1567                 if (!(tmp & RT2860_H2M_BUSY))
1568                         break;
1569         }
1570         if (ntries == 100)
1571                 return ETIMEDOUT;
1572
1573         tmp = RT2860_H2M_BUSY | RT2860_TOKEN_NO_INTR << 16 | arg;
1574         if ((error = run_write(sc, RT2860_H2M_MAILBOX, tmp)) == 0)
1575                 error = run_write(sc, RT2860_HOST_CMD, cmd);
1576         return (error);
1577 }
1578
1579 /*
1580  * Add `delta' (signed) to each 4-bit sub-word of a 32-bit word.
1581  * Used to adjust per-rate Tx power registers.
1582  */
1583 static __inline uint32_t
1584 b4inc(uint32_t b32, int8_t delta)
1585 {
1586         int8_t i, b4;
1587
1588         for (i = 0; i < 8; i++) {
1589                 b4 = b32 & 0xf;
1590                 b4 += delta;
1591                 if (b4 < 0)
1592                         b4 = 0;
1593                 else if (b4 > 0xf)
1594                         b4 = 0xf;
1595                 b32 = b32 >> 4 | b4 << 28;
1596         }
1597         return (b32);
1598 }
1599
1600 static const char *
1601 run_get_rf(uint16_t rev)
1602 {
1603         switch (rev) {
1604         case RT2860_RF_2820:    return "RT2820";
1605         case RT2860_RF_2850:    return "RT2850";
1606         case RT2860_RF_2720:    return "RT2720";
1607         case RT2860_RF_2750:    return "RT2750";
1608         case RT3070_RF_3020:    return "RT3020";
1609         case RT3070_RF_2020:    return "RT2020";
1610         case RT3070_RF_3021:    return "RT3021";
1611         case RT3070_RF_3022:    return "RT3022";
1612         case RT3070_RF_3052:    return "RT3052";
1613         case RT3593_RF_3053:    return "RT3053";
1614         case RT5592_RF_5592:    return "RT5592";
1615         case RT5390_RF_5370:    return "RT5370";
1616         case RT5390_RF_5372:    return "RT5372";
1617         }
1618         return ("unknown");
1619 }
1620
1621 static void
1622 run_rt3593_get_txpower(struct run_softc *sc)
1623 {
1624         uint16_t addr, val;
1625         int i;
1626
1627         /* Read power settings for 2GHz channels. */
1628         for (i = 0; i < 14; i += 2) {
1629                 addr = (sc->ntxchains == 3) ? RT3593_EEPROM_PWR2GHZ_BASE1 :
1630                     RT2860_EEPROM_PWR2GHZ_BASE1;
1631                 run_srom_read(sc, addr + i / 2, &val);
1632                 sc->txpow1[i + 0] = (int8_t)(val & 0xff);
1633                 sc->txpow1[i + 1] = (int8_t)(val >> 8);
1634
1635                 addr = (sc->ntxchains == 3) ? RT3593_EEPROM_PWR2GHZ_BASE2 :
1636                     RT2860_EEPROM_PWR2GHZ_BASE2;
1637                 run_srom_read(sc, addr + i / 2, &val);
1638                 sc->txpow2[i + 0] = (int8_t)(val & 0xff);
1639                 sc->txpow2[i + 1] = (int8_t)(val >> 8);
1640
1641                 if (sc->ntxchains == 3) {
1642                         run_srom_read(sc, RT3593_EEPROM_PWR2GHZ_BASE3 + i / 2,
1643                             &val);
1644                         sc->txpow3[i + 0] = (int8_t)(val & 0xff);
1645                         sc->txpow3[i + 1] = (int8_t)(val >> 8);
1646                 }
1647         }
1648         /* Fix broken Tx power entries. */
1649         for (i = 0; i < 14; i++) {
1650                 if (sc->txpow1[i] > 31)
1651                         sc->txpow1[i] = 5;
1652                 if (sc->txpow2[i] > 31)
1653                         sc->txpow2[i] = 5;
1654                 if (sc->ntxchains == 3) {
1655                         if (sc->txpow3[i] > 31)
1656                                 sc->txpow3[i] = 5;
1657                 }
1658         }
1659         /* Read power settings for 5GHz channels. */
1660         for (i = 0; i < 40; i += 2) {
1661                 run_srom_read(sc, RT3593_EEPROM_PWR5GHZ_BASE1 + i / 2, &val);
1662                 sc->txpow1[i + 14] = (int8_t)(val & 0xff);
1663                 sc->txpow1[i + 15] = (int8_t)(val >> 8);
1664
1665                 run_srom_read(sc, RT3593_EEPROM_PWR5GHZ_BASE2 + i / 2, &val);
1666                 sc->txpow2[i + 14] = (int8_t)(val & 0xff);
1667                 sc->txpow2[i + 15] = (int8_t)(val >> 8);
1668
1669                 if (sc->ntxchains == 3) {
1670                         run_srom_read(sc, RT3593_EEPROM_PWR5GHZ_BASE3 + i / 2,
1671                             &val);
1672                         sc->txpow3[i + 14] = (int8_t)(val & 0xff);
1673                         sc->txpow3[i + 15] = (int8_t)(val >> 8);
1674                 }
1675         }
1676 }
1677
1678 static void
1679 run_get_txpower(struct run_softc *sc)
1680 {
1681         uint16_t val;
1682         int i;
1683
1684         /* Read power settings for 2GHz channels. */
1685         for (i = 0; i < 14; i += 2) {
1686                 run_srom_read(sc, RT2860_EEPROM_PWR2GHZ_BASE1 + i / 2, &val);
1687                 sc->txpow1[i + 0] = (int8_t)(val & 0xff);
1688                 sc->txpow1[i + 1] = (int8_t)(val >> 8);
1689
1690                 if (sc->mac_ver != 0x5390) {
1691                         run_srom_read(sc,
1692                             RT2860_EEPROM_PWR2GHZ_BASE2 + i / 2, &val);
1693                         sc->txpow2[i + 0] = (int8_t)(val & 0xff);
1694                         sc->txpow2[i + 1] = (int8_t)(val >> 8);
1695                 }
1696         }
1697         /* Fix broken Tx power entries. */
1698         for (i = 0; i < 14; i++) {
1699                 if (sc->mac_ver >= 0x5390) {
1700                         if (sc->txpow1[i] < 0 || sc->txpow1[i] > 39)
1701                                 sc->txpow1[i] = 5;
1702                 } else {
1703                         if (sc->txpow1[i] < 0 || sc->txpow1[i] > 31)
1704                                 sc->txpow1[i] = 5;
1705                 }
1706                 if (sc->mac_ver > 0x5390) {
1707                         if (sc->txpow2[i] < 0 || sc->txpow2[i] > 39)
1708                                 sc->txpow2[i] = 5;
1709                 } else if (sc->mac_ver < 0x5390) {
1710                         if (sc->txpow2[i] < 0 || sc->txpow2[i] > 31)
1711                                 sc->txpow2[i] = 5;
1712                 }
1713                 DPRINTF("chan %d: power1=%d, power2=%d\n",
1714                     rt2860_rf2850[i].chan, sc->txpow1[i], sc->txpow2[i]);
1715         }
1716         /* Read power settings for 5GHz channels. */
1717         for (i = 0; i < 40; i += 2) {
1718                 run_srom_read(sc, RT2860_EEPROM_PWR5GHZ_BASE1 + i / 2, &val);
1719                 sc->txpow1[i + 14] = (int8_t)(val & 0xff);
1720                 sc->txpow1[i + 15] = (int8_t)(val >> 8);
1721
1722                 run_srom_read(sc, RT2860_EEPROM_PWR5GHZ_BASE2 + i / 2, &val);
1723                 sc->txpow2[i + 14] = (int8_t)(val & 0xff);
1724                 sc->txpow2[i + 15] = (int8_t)(val >> 8);
1725         }
1726         /* Fix broken Tx power entries. */
1727         for (i = 0; i < 40; i++ ) {
1728                 if (sc->mac_ver != 0x5592) {
1729                         if (sc->txpow1[14 + i] < -7 || sc->txpow1[14 + i] > 15)
1730                                 sc->txpow1[14 + i] = 5;
1731                         if (sc->txpow2[14 + i] < -7 || sc->txpow2[14 + i] > 15)
1732                                 sc->txpow2[14 + i] = 5;
1733                 }
1734                 DPRINTF("chan %d: power1=%d, power2=%d\n",
1735                     rt2860_rf2850[14 + i].chan, sc->txpow1[14 + i],
1736                     sc->txpow2[14 + i]);
1737         }
1738 }
1739
1740 static int
1741 run_read_eeprom(struct run_softc *sc)
1742 {
1743         struct ieee80211com *ic = &sc->sc_ic;
1744         int8_t delta_2ghz, delta_5ghz;
1745         uint32_t tmp;
1746         uint16_t val;
1747         int ridx, ant, i;
1748
1749         /* check whether the ROM is eFUSE ROM or EEPROM */
1750         sc->sc_srom_read = run_eeprom_read_2;
1751         if (sc->mac_ver >= 0x3070) {
1752                 run_read(sc, RT3070_EFUSE_CTRL, &tmp);
1753                 DPRINTF("EFUSE_CTRL=0x%08x\n", tmp);
1754                 if ((tmp & RT3070_SEL_EFUSE) || sc->mac_ver == 0x3593)
1755                         sc->sc_srom_read = run_efuse_read_2;
1756         }
1757
1758         /* read ROM version */
1759         run_srom_read(sc, RT2860_EEPROM_VERSION, &val);
1760         DPRINTF("EEPROM rev=%d, FAE=%d\n", val >> 8, val & 0xff);
1761
1762         /* read MAC address */
1763         run_srom_read(sc, RT2860_EEPROM_MAC01, &val);
1764         ic->ic_macaddr[0] = val & 0xff;
1765         ic->ic_macaddr[1] = val >> 8;
1766         run_srom_read(sc, RT2860_EEPROM_MAC23, &val);
1767         ic->ic_macaddr[2] = val & 0xff;
1768         ic->ic_macaddr[3] = val >> 8;
1769         run_srom_read(sc, RT2860_EEPROM_MAC45, &val);
1770         ic->ic_macaddr[4] = val & 0xff;
1771         ic->ic_macaddr[5] = val >> 8;
1772
1773         if (sc->mac_ver < 0x3593) {
1774                 /* read vender BBP settings */
1775                 for (i = 0; i < 10; i++) {
1776                         run_srom_read(sc, RT2860_EEPROM_BBP_BASE + i, &val);
1777                         sc->bbp[i].val = val & 0xff;
1778                         sc->bbp[i].reg = val >> 8;
1779                         DPRINTF("BBP%d=0x%02x\n", sc->bbp[i].reg,
1780                             sc->bbp[i].val);
1781                 }
1782                 if (sc->mac_ver >= 0x3071) {
1783                         /* read vendor RF settings */
1784                         for (i = 0; i < 10; i++) {
1785                                 run_srom_read(sc, RT3071_EEPROM_RF_BASE + i,
1786                                    &val);
1787                                 sc->rf[i].val = val & 0xff;
1788                                 sc->rf[i].reg = val >> 8;
1789                                 DPRINTF("RF%d=0x%02x\n", sc->rf[i].reg,
1790                                     sc->rf[i].val);
1791                         }
1792                 }
1793         }
1794
1795         /* read RF frequency offset from EEPROM */
1796         run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_FREQ_LEDS :
1797             RT3593_EEPROM_FREQ, &val);
1798         sc->freq = ((val & 0xff) != 0xff) ? val & 0xff : 0;
1799         DPRINTF("EEPROM freq offset %d\n", sc->freq & 0xff);
1800
1801         run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_FREQ_LEDS :
1802             RT3593_EEPROM_FREQ_LEDS, &val);
1803         if (val >> 8 != 0xff) {
1804                 /* read LEDs operating mode */
1805                 sc->leds = val >> 8;
1806                 run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_LED1 :
1807                     RT3593_EEPROM_LED1, &sc->led[0]);
1808                 run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_LED2 :
1809                     RT3593_EEPROM_LED2, &sc->led[1]);
1810                 run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_LED3 :
1811                     RT3593_EEPROM_LED3, &sc->led[2]);
1812         } else {
1813                 /* broken EEPROM, use default settings */
1814                 sc->leds = 0x01;
1815                 sc->led[0] = 0x5555;
1816                 sc->led[1] = 0x2221;
1817                 sc->led[2] = 0x5627;    /* differs from RT2860 */
1818         }
1819         DPRINTF("EEPROM LED mode=0x%02x, LEDs=0x%04x/0x%04x/0x%04x\n",
1820             sc->leds, sc->led[0], sc->led[1], sc->led[2]);
1821
1822         /* read RF information */
1823         if (sc->mac_ver == 0x5390 || sc->mac_ver ==0x5392)
1824                 run_srom_read(sc, 0x00, &val);
1825         else
1826                 run_srom_read(sc, RT2860_EEPROM_ANTENNA, &val);
1827
1828         if (val == 0xffff) {
1829                 device_printf(sc->sc_dev,
1830                     "invalid EEPROM antenna info, using default\n");
1831                 DPRINTF("invalid EEPROM antenna info, using default\n");
1832                 if (sc->mac_ver == 0x3572) {
1833                         /* default to RF3052 2T2R */
1834                         sc->rf_rev = RT3070_RF_3052;
1835                         sc->ntxchains = 2;
1836                         sc->nrxchains = 2;
1837                 } else if (sc->mac_ver >= 0x3070) {
1838                         /* default to RF3020 1T1R */
1839                         sc->rf_rev = RT3070_RF_3020;
1840                         sc->ntxchains = 1;
1841                         sc->nrxchains = 1;
1842                 } else {
1843                         /* default to RF2820 1T2R */
1844                         sc->rf_rev = RT2860_RF_2820;
1845                         sc->ntxchains = 1;
1846                         sc->nrxchains = 2;
1847                 }
1848         } else {
1849                 if (sc->mac_ver == 0x5390 || sc->mac_ver ==0x5392) {
1850                         sc->rf_rev = val;
1851                         run_srom_read(sc, RT2860_EEPROM_ANTENNA, &val);
1852                 } else
1853                         sc->rf_rev = (val >> 8) & 0xf;
1854                 sc->ntxchains = (val >> 4) & 0xf;
1855                 sc->nrxchains = val & 0xf;
1856         }
1857         DPRINTF("EEPROM RF rev=0x%04x chains=%dT%dR\n",
1858             sc->rf_rev, sc->ntxchains, sc->nrxchains);
1859
1860         /* check if RF supports automatic Tx access gain control */
1861         run_srom_read(sc, RT2860_EEPROM_CONFIG, &val);
1862         DPRINTF("EEPROM CFG 0x%04x\n", val);
1863         /* check if driver should patch the DAC issue */
1864         if ((val >> 8) != 0xff)
1865                 sc->patch_dac = (val >> 15) & 1;
1866         if ((val & 0xff) != 0xff) {
1867                 sc->ext_5ghz_lna = (val >> 3) & 1;
1868                 sc->ext_2ghz_lna = (val >> 2) & 1;
1869                 /* check if RF supports automatic Tx access gain control */
1870                 sc->calib_2ghz = sc->calib_5ghz = (val >> 1) & 1;
1871                 /* check if we have a hardware radio switch */
1872                 sc->rfswitch = val & 1;
1873         }
1874
1875         /* Read Tx power settings. */
1876         if (sc->mac_ver == 0x3593)
1877                 run_rt3593_get_txpower(sc);
1878         else
1879                 run_get_txpower(sc);
1880
1881         /* read Tx power compensation for each Tx rate */
1882         run_srom_read(sc, RT2860_EEPROM_DELTAPWR, &val);
1883         delta_2ghz = delta_5ghz = 0;
1884         if ((val & 0xff) != 0xff && (val & 0x80)) {
1885                 delta_2ghz = val & 0xf;
1886                 if (!(val & 0x40))      /* negative number */
1887                         delta_2ghz = -delta_2ghz;
1888         }
1889         val >>= 8;
1890         if ((val & 0xff) != 0xff && (val & 0x80)) {
1891                 delta_5ghz = val & 0xf;
1892                 if (!(val & 0x40))      /* negative number */
1893                         delta_5ghz = -delta_5ghz;
1894         }
1895         DPRINTF("power compensation=%d (2GHz), %d (5GHz)\n",
1896             delta_2ghz, delta_5ghz);
1897
1898         for (ridx = 0; ridx < 5; ridx++) {
1899                 uint32_t reg;
1900
1901                 run_srom_read(sc, RT2860_EEPROM_RPWR + ridx * 2, &val);
1902                 reg = val;
1903                 run_srom_read(sc, RT2860_EEPROM_RPWR + ridx * 2 + 1, &val);
1904                 reg |= (uint32_t)val << 16;
1905
1906                 sc->txpow20mhz[ridx] = reg;
1907                 sc->txpow40mhz_2ghz[ridx] = b4inc(reg, delta_2ghz);
1908                 sc->txpow40mhz_5ghz[ridx] = b4inc(reg, delta_5ghz);
1909
1910                 DPRINTF("ridx %d: power 20MHz=0x%08x, 40MHz/2GHz=0x%08x, "
1911                     "40MHz/5GHz=0x%08x\n", ridx, sc->txpow20mhz[ridx],
1912                     sc->txpow40mhz_2ghz[ridx], sc->txpow40mhz_5ghz[ridx]);
1913         }
1914
1915         /* Read RSSI offsets and LNA gains from EEPROM. */
1916         run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_RSSI1_2GHZ :
1917             RT3593_EEPROM_RSSI1_2GHZ, &val);
1918         sc->rssi_2ghz[0] = val & 0xff;  /* Ant A */
1919         sc->rssi_2ghz[1] = val >> 8;    /* Ant B */
1920         run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_RSSI2_2GHZ :
1921             RT3593_EEPROM_RSSI2_2GHZ, &val);
1922         if (sc->mac_ver >= 0x3070) {
1923                 if (sc->mac_ver == 0x3593) {
1924                         sc->txmixgain_2ghz = 0;
1925                         sc->rssi_2ghz[2] = val & 0xff;  /* Ant C */
1926                 } else {
1927                         /*
1928                          * On RT3070 chips (limited to 2 Rx chains), this ROM
1929                          * field contains the Tx mixer gain for the 2GHz band.
1930                          */
1931                         if ((val & 0xff) != 0xff)
1932                                 sc->txmixgain_2ghz = val & 0x7;
1933                 }
1934                 DPRINTF("tx mixer gain=%u (2GHz)\n", sc->txmixgain_2ghz);
1935         } else
1936                 sc->rssi_2ghz[2] = val & 0xff;  /* Ant C */
1937         if (sc->mac_ver == 0x3593)
1938                 run_srom_read(sc, RT3593_EEPROM_LNA_5GHZ, &val);
1939         sc->lna[2] = val >> 8;          /* channel group 2 */
1940
1941         run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_RSSI1_5GHZ :
1942             RT3593_EEPROM_RSSI1_5GHZ, &val);
1943         sc->rssi_5ghz[0] = val & 0xff;  /* Ant A */
1944         sc->rssi_5ghz[1] = val >> 8;    /* Ant B */
1945         run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_RSSI2_5GHZ :
1946             RT3593_EEPROM_RSSI2_5GHZ, &val);
1947         if (sc->mac_ver == 0x3572) {
1948                 /*
1949                  * On RT3572 chips (limited to 2 Rx chains), this ROM
1950                  * field contains the Tx mixer gain for the 5GHz band.
1951                  */
1952                 if ((val & 0xff) != 0xff)
1953                         sc->txmixgain_5ghz = val & 0x7;
1954                 DPRINTF("tx mixer gain=%u (5GHz)\n", sc->txmixgain_5ghz);
1955         } else
1956                 sc->rssi_5ghz[2] = val & 0xff;  /* Ant C */
1957         if (sc->mac_ver == 0x3593) {
1958                 sc->txmixgain_5ghz = 0;
1959                 run_srom_read(sc, RT3593_EEPROM_LNA_5GHZ, &val);
1960         }
1961         sc->lna[3] = val >> 8;          /* channel group 3 */
1962
1963         run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_LNA :
1964             RT3593_EEPROM_LNA, &val);
1965         sc->lna[0] = val & 0xff;        /* channel group 0 */
1966         sc->lna[1] = val >> 8;          /* channel group 1 */
1967
1968         /* fix broken 5GHz LNA entries */
1969         if (sc->lna[2] == 0 || sc->lna[2] == 0xff) {
1970                 DPRINTF("invalid LNA for channel group %d\n", 2);
1971                 sc->lna[2] = sc->lna[1];
1972         }
1973         if (sc->lna[3] == 0 || sc->lna[3] == 0xff) {
1974                 DPRINTF("invalid LNA for channel group %d\n", 3);
1975                 sc->lna[3] = sc->lna[1];
1976         }
1977
1978         /* fix broken RSSI offset entries */
1979         for (ant = 0; ant < 3; ant++) {
1980                 if (sc->rssi_2ghz[ant] < -10 || sc->rssi_2ghz[ant] > 10) {
1981                         DPRINTF("invalid RSSI%d offset: %d (2GHz)\n",
1982                             ant + 1, sc->rssi_2ghz[ant]);
1983                         sc->rssi_2ghz[ant] = 0;
1984                 }
1985                 if (sc->rssi_5ghz[ant] < -10 || sc->rssi_5ghz[ant] > 10) {
1986                         DPRINTF("invalid RSSI%d offset: %d (5GHz)\n",
1987                             ant + 1, sc->rssi_5ghz[ant]);
1988                         sc->rssi_5ghz[ant] = 0;
1989                 }
1990         }
1991         return (0);
1992 }
1993
1994 static struct ieee80211_node *
1995 run_node_alloc(struct ieee80211vap *vap, const uint8_t mac[IEEE80211_ADDR_LEN])
1996 {
1997         return kmalloc(sizeof (struct run_node), M_DEVBUF, M_WAITOK | M_ZERO);
1998 }
1999
2000 static int
2001 run_media_change(struct ifnet *ifp)
2002 {
2003         struct ieee80211vap *vap = ifp->if_softc;
2004         struct ieee80211com *ic = vap->iv_ic;
2005         const struct ieee80211_txparam *tp;
2006         struct run_softc *sc = ic->ic_softc;
2007         uint8_t rate, ridx;
2008         int error;
2009
2010         RUN_LOCK(sc);
2011
2012         error = ieee80211_media_change(ifp);
2013         if (error != ENETRESET) {
2014                 RUN_UNLOCK(sc);
2015                 return (error);
2016         }
2017
2018         tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)];
2019         if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) {
2020                 struct ieee80211_node *ni;
2021                 struct run_node *rn;
2022
2023                 rate = ic->ic_sup_rates[ic->ic_curmode].
2024                     rs_rates[tp->ucastrate] & IEEE80211_RATE_VAL;
2025                 for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++)
2026                         if (rt2860_rates[ridx].rate == rate)
2027                                 break;
2028                 ni = ieee80211_ref_node(vap->iv_bss);
2029                 rn = RUN_NODE(ni);
2030                 rn->fix_ridx = ridx;
2031                 DPRINTF("rate=%d, fix_ridx=%d\n", rate, rn->fix_ridx);
2032                 ieee80211_free_node(ni);
2033         }
2034
2035 #if 0
2036         if ((ifp->if_flags & IFF_UP) &&
2037             (ifp->if_drv_flags &  RUN_RUNNING)){
2038                 run_init_locked(sc);
2039         }
2040 #endif
2041
2042         RUN_UNLOCK(sc);
2043
2044         return (0);
2045 }
2046
2047 static int
2048 run_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
2049 {
2050         const struct ieee80211_txparam *tp;
2051         struct ieee80211com *ic = vap->iv_ic;
2052         struct run_softc *sc = ic->ic_softc;
2053         struct run_vap *rvp = RUN_VAP(vap);
2054         enum ieee80211_state ostate;
2055         uint32_t sta[3];
2056         uint32_t tmp;
2057         uint8_t ratectl;
2058         uint8_t restart_ratectl = 0;
2059         uint8_t bid = 1 << rvp->rvp_id;
2060
2061         ostate = vap->iv_state;
2062         DPRINTF("%s -> %s\n",
2063                 ieee80211_state_name[ostate],
2064                 ieee80211_state_name[nstate]);
2065
2066         IEEE80211_UNLOCK(ic);
2067         RUN_LOCK(sc);
2068
2069         ratectl = sc->ratectl_run; /* remember current state */
2070         sc->ratectl_run = RUN_RATECTL_OFF;
2071         usb_callout_stop(&sc->ratectl_ch);
2072
2073         if (ostate == IEEE80211_S_RUN) {
2074                 /* turn link LED off */
2075                 run_set_leds(sc, RT2860_LED_RADIO);
2076         }
2077
2078         switch (nstate) {
2079         case IEEE80211_S_INIT:
2080                 restart_ratectl = 1;
2081
2082                 if (ostate != IEEE80211_S_RUN)
2083                         break;
2084
2085                 ratectl &= ~bid;
2086                 sc->runbmap &= ~bid;
2087
2088                 /* abort TSF synchronization if there is no vap running */
2089                 if (--sc->running == 0) {
2090                         run_read(sc, RT2860_BCN_TIME_CFG, &tmp);
2091                         run_write(sc, RT2860_BCN_TIME_CFG,
2092                             tmp & ~(RT2860_BCN_TX_EN | RT2860_TSF_TIMER_EN |
2093                             RT2860_TBTT_TIMER_EN));
2094                 }
2095                 break;
2096
2097         case IEEE80211_S_RUN:
2098                 if (!(sc->runbmap & bid)) {
2099                         if(sc->running++)
2100                                 restart_ratectl = 1;
2101                         sc->runbmap |= bid;
2102                 }
2103
2104                 m_freem(rvp->beacon_mbuf);
2105                 rvp->beacon_mbuf = NULL;
2106
2107                 switch (vap->iv_opmode) {
2108                 case IEEE80211_M_HOSTAP:
2109                 case IEEE80211_M_MBSS:
2110                         sc->ap_running |= bid;
2111                         ic->ic_opmode = vap->iv_opmode;
2112                         run_update_beacon_cb(vap);
2113                         break;
2114                 case IEEE80211_M_IBSS:
2115                         sc->adhoc_running |= bid;
2116                         if (!sc->ap_running)
2117                                 ic->ic_opmode = vap->iv_opmode;
2118                         run_update_beacon_cb(vap);
2119                         break;
2120                 case IEEE80211_M_STA:
2121                         sc->sta_running |= bid;
2122                         if (!sc->ap_running && !sc->adhoc_running)
2123                                 ic->ic_opmode = vap->iv_opmode;
2124
2125                         /* read statistic counters (clear on read) */
2126                         run_read_region_1(sc, RT2860_TX_STA_CNT0,
2127                             (uint8_t *)sta, sizeof sta);
2128
2129                         break;
2130                 default:
2131                         ic->ic_opmode = vap->iv_opmode;
2132                         break;
2133                 }
2134
2135                 if (vap->iv_opmode != IEEE80211_M_MONITOR) {
2136                         struct ieee80211_node *ni;
2137
2138                         if (ic->ic_bsschan == IEEE80211_CHAN_ANYC) {
2139                                 RUN_UNLOCK(sc);
2140                                 IEEE80211_LOCK(ic);
2141                                 return (-1);
2142                         }
2143                         run_updateslot(ic);
2144                         run_enable_mrr(sc);
2145                         run_set_txpreamble(sc);
2146                         run_set_basicrates(sc);
2147                         ni = ieee80211_ref_node(vap->iv_bss);
2148                         IEEE80211_ADDR_COPY(sc->sc_bssid, ni->ni_bssid);
2149                         run_set_bssid(sc, sc->sc_bssid);
2150                         ieee80211_free_node(ni);
2151                         run_enable_tsf_sync(sc);
2152
2153                         /* enable automatic rate adaptation */
2154                         tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)];
2155                         if (tp->ucastrate == IEEE80211_FIXED_RATE_NONE)
2156                                 ratectl |= bid;
2157                 } else
2158                         run_enable_tsf(sc);
2159
2160                 /* turn link LED on */
2161                 run_set_leds(sc, RT2860_LED_RADIO |
2162                     (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan) ?
2163                      RT2860_LED_LINK_2GHZ : RT2860_LED_LINK_5GHZ));
2164
2165                 break;
2166         default:
2167                 DPRINTFN(6, "undefined case\n");
2168                 break;
2169         }
2170
2171         /* restart amrr for running VAPs */
2172         if ((sc->ratectl_run = ratectl) && restart_ratectl)
2173                 usb_callout_reset(&sc->ratectl_ch, hz, run_ratectl_to, sc);
2174
2175         RUN_UNLOCK(sc);
2176         IEEE80211_LOCK(ic);
2177
2178         return(rvp->newstate(vap, nstate, arg));
2179 }
2180
2181 static int
2182 run_wme_update(struct ieee80211com *ic)
2183 {
2184         struct run_softc *sc = ic->ic_softc;
2185         const struct wmeParams *ac =
2186             ic->ic_wme.wme_chanParams.cap_wmeParams;
2187         int aci, error = 0;
2188
2189         /* update MAC TX configuration registers */
2190         RUN_LOCK(sc);
2191         for (aci = 0; aci < WME_NUM_AC; aci++) {
2192                 error = run_write(sc, RT2860_EDCA_AC_CFG(aci),
2193                     ac[aci].wmep_logcwmax << 16 |
2194                     ac[aci].wmep_logcwmin << 12 |
2195                     ac[aci].wmep_aifsn    <<  8 |
2196                     ac[aci].wmep_txopLimit);
2197                 if (error) goto err;
2198         }
2199
2200         /* update SCH/DMA registers too */
2201         error = run_write(sc, RT2860_WMM_AIFSN_CFG,
2202             ac[WME_AC_VO].wmep_aifsn  << 12 |
2203             ac[WME_AC_VI].wmep_aifsn  <<  8 |
2204             ac[WME_AC_BK].wmep_aifsn  <<  4 |
2205             ac[WME_AC_BE].wmep_aifsn);
2206         if (error) goto err;
2207         error = run_write(sc, RT2860_WMM_CWMIN_CFG,
2208             ac[WME_AC_VO].wmep_logcwmin << 12 |
2209             ac[WME_AC_VI].wmep_logcwmin <<  8 |
2210             ac[WME_AC_BK].wmep_logcwmin <<  4 |
2211             ac[WME_AC_BE].wmep_logcwmin);
2212         if (error) goto err;
2213         error = run_write(sc, RT2860_WMM_CWMAX_CFG,
2214             ac[WME_AC_VO].wmep_logcwmax << 12 |
2215             ac[WME_AC_VI].wmep_logcwmax <<  8 |
2216             ac[WME_AC_BK].wmep_logcwmax <<  4 |
2217             ac[WME_AC_BE].wmep_logcwmax);
2218         if (error) goto err;
2219         error = run_write(sc, RT2860_WMM_TXOP0_CFG,
2220             ac[WME_AC_BK].wmep_txopLimit << 16 |
2221             ac[WME_AC_BE].wmep_txopLimit);
2222         if (error) goto err;
2223         error = run_write(sc, RT2860_WMM_TXOP1_CFG,
2224             ac[WME_AC_VO].wmep_txopLimit << 16 |
2225             ac[WME_AC_VI].wmep_txopLimit);
2226
2227 err:
2228         RUN_UNLOCK(sc);
2229         if (error)
2230                 DPRINTF("WME update failed\n");
2231
2232         return (error);
2233 }
2234
2235 static void
2236 run_key_set_cb(void *arg)
2237 {
2238         struct run_cmdq *cmdq = arg;
2239         struct ieee80211vap *vap = cmdq->arg1;
2240         struct ieee80211_key *k = cmdq->k;
2241         struct ieee80211com *ic = vap->iv_ic;
2242         struct run_softc *sc = ic->ic_softc;
2243         struct ieee80211_node *ni;
2244         u_int cipher = k->wk_cipher->ic_cipher;
2245         uint32_t attr;
2246         uint16_t base, associd;
2247         uint8_t mode, wcid, iv[8];
2248
2249         RUN_LOCK_ASSERT(sc, MA_OWNED);
2250
2251         if (vap->iv_opmode == IEEE80211_M_HOSTAP)
2252                 ni = ieee80211_find_vap_node(&ic->ic_sta, vap, cmdq->mac);
2253         else
2254                 ni = vap->iv_bss;
2255         associd = (ni != NULL) ? ni->ni_associd : 0;
2256
2257         /* map net80211 cipher to RT2860 security mode */
2258         switch (cipher) {
2259         case IEEE80211_CIPHER_WEP:
2260                 if(k->wk_keylen < 8)
2261                         mode = RT2860_MODE_WEP40;
2262                 else
2263                         mode = RT2860_MODE_WEP104;
2264                 break;
2265         case IEEE80211_CIPHER_TKIP:
2266                 mode = RT2860_MODE_TKIP;
2267                 break;
2268         case IEEE80211_CIPHER_AES_CCM:
2269                 mode = RT2860_MODE_AES_CCMP;
2270                 break;
2271         default:
2272                 DPRINTF("undefined case\n");
2273                 return;
2274         }
2275
2276         DPRINTFN(1, "associd=%x, keyix=%d, mode=%x, type=%s, tx=%s, rx=%s\n",
2277             associd, k->wk_keyix, mode,
2278             (k->wk_flags & IEEE80211_KEY_GROUP) ? "group" : "pairwise",
2279             (k->wk_flags & IEEE80211_KEY_XMIT) ? "on" : "off",
2280             (k->wk_flags & IEEE80211_KEY_RECV) ? "on" : "off");
2281
2282         if (k->wk_flags & IEEE80211_KEY_GROUP) {
2283                 wcid = 0;       /* NB: update WCID0 for group keys */
2284                 base = RT2860_SKEY(RUN_VAP(vap)->rvp_id, k->wk_keyix);
2285         } else {
2286                 wcid = (vap->iv_opmode == IEEE80211_M_STA) ?
2287                     1 : RUN_AID2WCID(associd);
2288                 base = RT2860_PKEY(wcid);
2289         }
2290
2291         if (cipher == IEEE80211_CIPHER_TKIP) {
2292                 if(run_write_region_1(sc, base, k->wk_key, 16))
2293                         return;
2294                 if(run_write_region_1(sc, base + 16, &k->wk_key[16], 8))        /* wk_txmic */
2295                         return;
2296                 if(run_write_region_1(sc, base + 24, &k->wk_key[24], 8))        /* wk_rxmic */
2297                         return;
2298         } else {
2299                 /* roundup len to 16-bit: XXX fix write_region_1() instead */
2300                 if(run_write_region_1(sc, base, k->wk_key, (k->wk_keylen + 1) & ~1))
2301                         return;
2302         }
2303
2304         if (!(k->wk_flags & IEEE80211_KEY_GROUP) ||
2305             (k->wk_flags & (IEEE80211_KEY_XMIT | IEEE80211_KEY_RECV))) {
2306                 /* set initial packet number in IV+EIV */
2307                 if (cipher == IEEE80211_CIPHER_WEP) {
2308                         memset(iv, 0, sizeof iv);
2309                         iv[3] = vap->iv_def_txkey << 6;
2310                 } else {
2311                         if (cipher == IEEE80211_CIPHER_TKIP) {
2312                                 iv[0] = k->wk_keytsc >> 8;
2313                                 iv[1] = (iv[0] | 0x20) & 0x7f;
2314                                 iv[2] = k->wk_keytsc;
2315                         } else /* CCMP */ {
2316                                 iv[0] = k->wk_keytsc;
2317                                 iv[1] = k->wk_keytsc >> 8;
2318                                 iv[2] = 0;
2319                         }
2320                         iv[3] = k->wk_keyix << 6 | IEEE80211_WEP_EXTIV;
2321                         iv[4] = k->wk_keytsc >> 16;
2322                         iv[5] = k->wk_keytsc >> 24;
2323                         iv[6] = k->wk_keytsc >> 32;
2324                         iv[7] = k->wk_keytsc >> 40;
2325                 }
2326                 if (run_write_region_1(sc, RT2860_IVEIV(wcid), iv, 8))
2327                         return;
2328         }
2329
2330         if (k->wk_flags & IEEE80211_KEY_GROUP) {
2331                 /* install group key */
2332                 if (run_read(sc, RT2860_SKEY_MODE_0_7, &attr))
2333                         return;
2334                 attr &= ~(0xf << (k->wk_keyix * 4));
2335                 attr |= mode << (k->wk_keyix * 4);
2336                 if (run_write(sc, RT2860_SKEY_MODE_0_7, attr))
2337                         return;
2338         } else {
2339                 /* install pairwise key */
2340                 if (run_read(sc, RT2860_WCID_ATTR(wcid), &attr))
2341                         return;
2342                 attr = (attr & ~0xf) | (mode << 1) | RT2860_RX_PKEY_EN;
2343                 if (run_write(sc, RT2860_WCID_ATTR(wcid), attr))
2344                         return;
2345         }
2346
2347         /* TODO create a pass-thru key entry? */
2348
2349         /* need wcid to delete the right key later */
2350         k->wk_pad = wcid;
2351 }
2352
2353 /*
2354  * Don't have to be deferred, but in order to keep order of
2355  * execution, i.e. with run_key_delete(), defer this and let
2356  * run_cmdq_cb() maintain the order.
2357  *
2358  * return 0 on error
2359  */
2360 static int
2361 run_key_set(struct ieee80211vap *vap, struct ieee80211_key *k)
2362 {
2363         struct ieee80211com *ic = vap->iv_ic;
2364         struct run_softc *sc = ic->ic_softc;
2365         uint32_t i;
2366
2367         i = RUN_CMDQ_GET(&sc->cmdq_store);
2368         DPRINTF("cmdq_store=%d\n", i);
2369         sc->cmdq[i].func = run_key_set_cb;
2370         sc->cmdq[i].arg0 = NULL;
2371         sc->cmdq[i].arg1 = vap;
2372         sc->cmdq[i].k = k;
2373         IEEE80211_ADDR_COPY(sc->cmdq[i].mac, k->wk_macaddr);
2374         ieee80211_runtask(ic, &sc->cmdq_task);
2375
2376         /*
2377          * To make sure key will be set when hostapd
2378          * calls iv_key_set() before if_init().
2379          */
2380         if (vap->iv_opmode == IEEE80211_M_HOSTAP) {
2381                 RUN_LOCK(sc);
2382                 sc->cmdq_key_set = RUN_CMDQ_GO;
2383                 RUN_UNLOCK(sc);
2384         }
2385
2386         return (1);
2387 }
2388
2389 /*
2390  * If wlan is destroyed without being brought down i.e. without
2391  * wlan down or wpa_cli terminate, this function is called after
2392  * vap is gone. Don't refer it.
2393  */
2394 static void
2395 run_key_delete_cb(void *arg)
2396 {
2397         struct run_cmdq *cmdq = arg;
2398         struct run_softc *sc = cmdq->arg1;
2399         struct ieee80211_key *k = &cmdq->key;
2400         uint32_t attr;
2401         uint8_t wcid;
2402
2403         RUN_LOCK_ASSERT(sc, MA_OWNED);
2404
2405         if (k->wk_flags & IEEE80211_KEY_GROUP) {
2406                 /* remove group key */
2407                 DPRINTF("removing group key\n");
2408                 run_read(sc, RT2860_SKEY_MODE_0_7, &attr);
2409                 attr &= ~(0xf << (k->wk_keyix * 4));
2410                 run_write(sc, RT2860_SKEY_MODE_0_7, attr);
2411         } else {
2412                 /* remove pairwise key */
2413                 DPRINTF("removing key for wcid %x\n", k->wk_pad);
2414                 /* matching wcid was written to wk_pad in run_key_set() */
2415                 wcid = k->wk_pad;
2416                 run_read(sc, RT2860_WCID_ATTR(wcid), &attr);
2417                 attr &= ~0xf;
2418                 run_write(sc, RT2860_WCID_ATTR(wcid), attr);
2419                 run_set_region_4(sc, RT2860_WCID_ENTRY(wcid), 0, 8);
2420         }
2421
2422         k->wk_pad = 0;
2423 }
2424
2425 /*
2426  * return 0 on error
2427  */
2428 static int
2429 run_key_delete(struct ieee80211vap *vap, struct ieee80211_key *k)
2430 {
2431         struct ieee80211com *ic = vap->iv_ic;
2432         struct run_softc *sc = ic->ic_softc;
2433         struct ieee80211_key *k0;
2434         uint32_t i;
2435
2436         /*
2437          * When called back, key might be gone. So, make a copy
2438          * of some values need to delete keys before deferring.
2439          * But, because of LOR with node lock, cannot use lock here.
2440          * So, use atomic instead.
2441          */
2442         i = RUN_CMDQ_GET(&sc->cmdq_store);
2443         DPRINTF("cmdq_store=%d\n", i);
2444         sc->cmdq[i].func = run_key_delete_cb;
2445         sc->cmdq[i].arg0 = NULL;
2446         sc->cmdq[i].arg1 = sc;
2447         k0 = &sc->cmdq[i].key;
2448         k0->wk_flags = k->wk_flags;
2449         k0->wk_keyix = k->wk_keyix;
2450         /* matching wcid was written to wk_pad in run_key_set() */
2451         k0->wk_pad = k->wk_pad;
2452         ieee80211_runtask(ic, &sc->cmdq_task);
2453         return (1);     /* return fake success */
2454
2455 }
2456
2457 static void
2458 run_ratectl_to(void *arg)
2459 {
2460         struct run_softc *sc = arg;
2461
2462         /* do it in a process context, so it can go sleep */
2463         ieee80211_runtask(&sc->sc_ic, &sc->ratectl_task);
2464         /* next timeout will be rescheduled in the callback task */
2465 }
2466
2467 /* ARGSUSED */
2468 static void
2469 run_ratectl_cb(void *arg, int pending)
2470 {
2471         struct run_softc *sc = arg;
2472         struct ieee80211com *ic = &sc->sc_ic;
2473         struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
2474
2475         if (vap == NULL)
2476                 return;
2477
2478         if (sc->rvp_cnt > 1 || vap->iv_opmode != IEEE80211_M_STA) {
2479                 /*
2480                  * run_reset_livelock() doesn't do anything with AMRR,
2481                  * but Ralink wants us to call it every 1 sec. So, we
2482                  * piggyback here rather than creating another callout.
2483                  * Livelock may occur only in HOSTAP or IBSS mode
2484                  * (when h/w is sending beacons).
2485                  */
2486                 RUN_LOCK(sc);
2487                 run_reset_livelock(sc);
2488                 /* just in case, there are some stats to drain */
2489                 run_drain_fifo(sc);
2490                 RUN_UNLOCK(sc);
2491         }
2492
2493         ieee80211_iterate_nodes(&ic->ic_sta, run_iter_func, sc);
2494
2495         RUN_LOCK(sc);
2496         if(sc->ratectl_run != RUN_RATECTL_OFF)
2497                 usb_callout_reset(&sc->ratectl_ch, hz, run_ratectl_to, sc);
2498         RUN_UNLOCK(sc);
2499 }
2500
2501 static void
2502 run_drain_fifo(void *arg)
2503 {
2504         struct run_softc *sc = arg;
2505         uint32_t stat;
2506         uint16_t (*wstat)[3];
2507         uint8_t wcid, mcs, pid;
2508         int8_t retry;
2509
2510         RUN_LOCK_ASSERT(sc, MA_OWNED);
2511
2512         for (;;) {
2513                 /* drain Tx status FIFO (maxsize = 16) */
2514                 run_read(sc, RT2860_TX_STAT_FIFO, &stat);
2515                 DPRINTFN(4, "tx stat 0x%08x\n", stat);
2516                 if (!(stat & RT2860_TXQ_VLD))
2517                         break;
2518
2519                 wcid = (stat >> RT2860_TXQ_WCID_SHIFT) & 0xff;
2520
2521                 /* if no ACK was requested, no feedback is available */
2522                 if (!(stat & RT2860_TXQ_ACKREQ) || wcid > RT2870_WCID_MAX ||
2523                     wcid == 0)
2524                         continue;
2525
2526                 /*
2527                  * Even though each stat is Tx-complete-status like format,
2528                  * the device can poll stats. Because there is no guarantee
2529                  * that the referring node is still around when read the stats.
2530                  * So that, if we use ieee80211_ratectl_tx_update(), we will
2531                  * have hard time not to refer already freed node.
2532                  *
2533                  * To eliminate such page faults, we poll stats in softc.
2534                  * Then, update the rates later with ieee80211_ratectl_tx_update().
2535                  */
2536                 wstat = &(sc->wcid_stats[wcid]);
2537                 (*wstat)[RUN_TXCNT]++;
2538                 if (stat & RT2860_TXQ_OK) {
2539                         (*wstat)[RUN_SUCCESS]++;
2540                 } else {
2541 #if defined(__DragonFly__)
2542                         ++sc->sc_ic.ic_oerrors;
2543 #else
2544                         counter_u64_add(sc->sc_ic.ic_oerrors, 1);
2545 #endif
2546                 }
2547                 /*
2548                  * Check if there were retries, ie if the Tx success rate is
2549                  * different from the requested rate. Note that it works only
2550                  * because we do not allow rate fallback from OFDM to CCK.
2551                  */
2552                 mcs = (stat >> RT2860_TXQ_MCS_SHIFT) & 0x7f;
2553                 pid = (stat >> RT2860_TXQ_PID_SHIFT) & 0xf;
2554                 if ((retry = pid -1 - mcs) > 0) {
2555                         (*wstat)[RUN_TXCNT] += retry;
2556                         (*wstat)[RUN_RETRY] += retry;
2557                 }
2558         }
2559         DPRINTFN(3, "count=%d\n", sc->fifo_cnt);
2560
2561         sc->fifo_cnt = 0;
2562 }
2563
2564 static void
2565 run_iter_func(void *arg, struct ieee80211_node *ni)
2566 {
2567         struct run_softc *sc = arg;
2568         struct ieee80211vap *vap = ni->ni_vap;
2569         struct run_node *rn = RUN_NODE(ni);
2570         union run_stats sta[2];
2571         uint16_t (*wstat)[3];
2572         int txcnt, success, retrycnt, error;
2573
2574         RUN_LOCK(sc);
2575
2576         /* Check for special case */
2577         if (sc->rvp_cnt <= 1 && vap->iv_opmode == IEEE80211_M_STA &&
2578             ni != vap->iv_bss)
2579                 goto fail;
2580
2581         if (sc->rvp_cnt <= 1 && (vap->iv_opmode == IEEE80211_M_IBSS ||
2582             vap->iv_opmode == IEEE80211_M_STA)) {
2583                 /* read statistic counters (clear on read) and update AMRR state */
2584                 error = run_read_region_1(sc, RT2860_TX_STA_CNT0, (uint8_t *)sta,
2585                     sizeof sta);
2586                 if (error != 0)
2587                         goto fail;
2588
2589                 /* count failed TX as errors */
2590                 if_inc_counter(vap->iv_ifp, IFCOUNTER_OERRORS,
2591                     le16toh(sta[0].error.fail));
2592
2593                 retrycnt = le16toh(sta[1].tx.retry);
2594                 success = le16toh(sta[1].tx.success);
2595                 txcnt = retrycnt + success + le16toh(sta[0].error.fail);
2596
2597                 DPRINTFN(3, "retrycnt=%d success=%d failcnt=%d\n",
2598                         retrycnt, success, le16toh(sta[0].error.fail));
2599         } else {
2600                 wstat = &(sc->wcid_stats[RUN_AID2WCID(ni->ni_associd)]);
2601
2602                 if (wstat == &(sc->wcid_stats[0]) ||
2603                     wstat > &(sc->wcid_stats[RT2870_WCID_MAX]))
2604                         goto fail;
2605
2606                 txcnt = (*wstat)[RUN_TXCNT];
2607                 success = (*wstat)[RUN_SUCCESS];
2608                 retrycnt = (*wstat)[RUN_RETRY];
2609                 DPRINTFN(3, "retrycnt=%d txcnt=%d success=%d\n",
2610                     retrycnt, txcnt, success);
2611
2612                 memset(wstat, 0, sizeof(*wstat));
2613         }
2614
2615         ieee80211_ratectl_tx_update(vap, ni, &txcnt, &success, &retrycnt);
2616         rn->amrr_ridx = ieee80211_ratectl_rate(ni, NULL, 0);
2617
2618 fail:
2619         RUN_UNLOCK(sc);
2620
2621         DPRINTFN(3, "ridx=%d\n", rn->amrr_ridx);
2622 }
2623
2624 static void
2625 run_newassoc_cb(void *arg)
2626 {
2627         struct run_cmdq *cmdq = arg;
2628         struct ieee80211_node *ni = cmdq->arg1;
2629         struct run_softc *sc = ni->ni_vap->iv_ic->ic_softc;
2630         uint8_t wcid = cmdq->wcid;
2631
2632         RUN_LOCK_ASSERT(sc, MA_OWNED);
2633
2634         run_write_region_1(sc, RT2860_WCID_ENTRY(wcid),
2635             ni->ni_macaddr, IEEE80211_ADDR_LEN);
2636
2637         memset(&(sc->wcid_stats[wcid]), 0, sizeof(sc->wcid_stats[wcid]));
2638 }
2639
2640 static void
2641 run_newassoc(struct ieee80211_node *ni, int isnew)
2642 {
2643         struct run_node *rn = RUN_NODE(ni);
2644         struct ieee80211_rateset *rs = &ni->ni_rates;
2645         struct ieee80211vap *vap = ni->ni_vap;
2646         struct ieee80211com *ic = vap->iv_ic;
2647         struct run_softc *sc = ic->ic_softc;
2648         uint8_t rate;
2649         uint8_t ridx;
2650         uint8_t wcid;
2651         int i, j;
2652
2653         wcid = (vap->iv_opmode == IEEE80211_M_STA) ?
2654             1 : RUN_AID2WCID(ni->ni_associd);
2655
2656         if (wcid > RT2870_WCID_MAX) {
2657                 device_printf(sc->sc_dev, "wcid=%d out of range\n", wcid);
2658                 return;
2659         }
2660
2661         /* only interested in true associations */
2662         if (isnew && ni->ni_associd != 0) {
2663
2664                 /*
2665                  * This function could is called though timeout function.
2666                  * Need to defer.
2667                  */
2668                 uint32_t cnt = RUN_CMDQ_GET(&sc->cmdq_store);
2669                 DPRINTF("cmdq_store=%d\n", cnt);
2670                 sc->cmdq[cnt].func = run_newassoc_cb;
2671                 sc->cmdq[cnt].arg0 = NULL;
2672                 sc->cmdq[cnt].arg1 = ni;
2673                 sc->cmdq[cnt].wcid = wcid;
2674                 ieee80211_runtask(ic, &sc->cmdq_task);
2675         }
2676
2677         DPRINTF("new assoc isnew=%d associd=%x addr=%s\n",
2678             isnew, ni->ni_associd, ether_sprintf(ni->ni_macaddr));
2679
2680         for (i = 0; i < rs->rs_nrates; i++) {
2681                 rate = rs->rs_rates[i] & IEEE80211_RATE_VAL;
2682                 /* convert 802.11 rate to hardware rate index */
2683                 for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++)
2684                         if (rt2860_rates[ridx].rate == rate)
2685                                 break;
2686                 rn->ridx[i] = ridx;
2687                 /* determine rate of control response frames */
2688                 for (j = i; j >= 0; j--) {
2689                         if ((rs->rs_rates[j] & IEEE80211_RATE_BASIC) &&
2690                             rt2860_rates[rn->ridx[i]].phy ==
2691                             rt2860_rates[rn->ridx[j]].phy)
2692                                 break;
2693                 }
2694                 if (j >= 0) {
2695                         rn->ctl_ridx[i] = rn->ridx[j];
2696                 } else {
2697                         /* no basic rate found, use mandatory one */
2698                         rn->ctl_ridx[i] = rt2860_rates[ridx].ctl_ridx;
2699                 }
2700                 DPRINTF("rate=0x%02x ridx=%d ctl_ridx=%d\n",
2701                     rs->rs_rates[i], rn->ridx[i], rn->ctl_ridx[i]);
2702         }
2703         rate = vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)].mgmtrate;
2704         for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++)
2705                 if (rt2860_rates[ridx].rate == rate)
2706                         break;
2707         rn->mgt_ridx = ridx;
2708         DPRINTF("rate=%d, mgmt_ridx=%d\n", rate, rn->mgt_ridx);
2709
2710         RUN_LOCK(sc);
2711         if(sc->ratectl_run != RUN_RATECTL_OFF)
2712                 usb_callout_reset(&sc->ratectl_ch, hz, run_ratectl_to, sc);
2713         RUN_UNLOCK(sc);
2714 }
2715
2716 /*
2717  * Return the Rx chain with the highest RSSI for a given frame.
2718  */
2719 static __inline uint8_t
2720 run_maxrssi_chain(struct run_softc *sc, const struct rt2860_rxwi *rxwi)
2721 {
2722         uint8_t rxchain = 0;
2723
2724         if (sc->nrxchains > 1) {
2725                 if (rxwi->rssi[1] > rxwi->rssi[rxchain])
2726                         rxchain = 1;
2727                 if (sc->nrxchains > 2)
2728                         if (rxwi->rssi[2] > rxwi->rssi[rxchain])
2729                                 rxchain = 2;
2730         }
2731         return (rxchain);
2732 }
2733
2734 static void
2735 run_recv_mgmt(struct ieee80211_node *ni, struct mbuf *m, int subtype,
2736     const struct ieee80211_rx_stats *rxs, int rssi, int nf)
2737 {
2738         struct ieee80211vap *vap = ni->ni_vap;
2739         struct run_softc *sc = vap->iv_ic->ic_softc;
2740         struct run_vap *rvp = RUN_VAP(vap);
2741         uint64_t ni_tstamp, rx_tstamp;
2742
2743         rvp->recv_mgmt(ni, m, subtype, rxs, rssi, nf);
2744
2745         if (vap->iv_state == IEEE80211_S_RUN &&
2746             (subtype == IEEE80211_FC0_SUBTYPE_BEACON ||
2747             subtype == IEEE80211_FC0_SUBTYPE_PROBE_RESP)) {
2748                 ni_tstamp = le64toh(ni->ni_tstamp.tsf);
2749                 RUN_LOCK(sc);
2750                 run_get_tsf(sc, &rx_tstamp);
2751                 RUN_UNLOCK(sc);
2752                 rx_tstamp = le64toh(rx_tstamp);
2753
2754                 if (ni_tstamp >= rx_tstamp) {
2755                         DPRINTF("ibss merge, tsf %ju tstamp %ju\n",
2756                             (uintmax_t)rx_tstamp, (uintmax_t)ni_tstamp);
2757                         (void) ieee80211_ibss_merge(ni);
2758                 }
2759         }
2760 }
2761
2762 static void
2763 run_rx_frame(struct run_softc *sc, struct mbuf *m, uint32_t dmalen)
2764 {
2765         struct ieee80211com *ic = &sc->sc_ic;
2766         struct ieee80211_frame *wh;
2767         struct ieee80211_node *ni;
2768         struct rt2870_rxd *rxd;
2769         struct rt2860_rxwi *rxwi;
2770         uint32_t flags;
2771         uint16_t len, rxwisize;
2772         uint8_t ant, rssi;
2773         int8_t nf;
2774
2775         rxwi = mtod(m, struct rt2860_rxwi *);
2776         len = le16toh(rxwi->len) & 0xfff;
2777         rxwisize = sizeof(struct rt2860_rxwi);
2778         if (sc->mac_ver == 0x5592)
2779                 rxwisize += sizeof(uint64_t);
2780         else if (sc->mac_ver == 0x3593)
2781                 rxwisize += sizeof(uint32_t);
2782         if (__predict_false(len > dmalen)) {
2783                 m_freem(m);
2784 #if defined(__DragonFly__)
2785                 ++ic->ic_ierrors;
2786 #else
2787                 counter_u64_add(ic->ic_ierrors, 1);
2788 #endif
2789                 DPRINTF("bad RXWI length %u > %u\n", len, dmalen);
2790                 return;
2791         }
2792         /* Rx descriptor is located at the end */
2793         rxd = (struct rt2870_rxd *)(mtod(m, caddr_t) + dmalen);
2794         flags = le32toh(rxd->flags);
2795
2796         if (__predict_false(flags & (RT2860_RX_CRCERR | RT2860_RX_ICVERR))) {
2797                 m_freem(m);
2798 #if defined(__DragonFly__)
2799                 ++ic->ic_ierrors;
2800 #else
2801                 counter_u64_add(ic->ic_ierrors, 1);
2802 #endif
2803                 DPRINTF("%s error.\n", (flags & RT2860_RX_CRCERR)?"CRC":"ICV");
2804                 return;
2805         }
2806
2807         m->m_data += rxwisize;
2808         m->m_pkthdr.len = m->m_len -= rxwisize;
2809
2810         wh = mtod(m, struct ieee80211_frame *);
2811
2812         if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
2813                 wh->i_fc[1] &= ~IEEE80211_FC1_PROTECTED;
2814                 m->m_flags |= M_WEP;
2815         }
2816
2817         if (flags & RT2860_RX_L2PAD) {
2818                 DPRINTFN(8, "received RT2860_RX_L2PAD frame\n");
2819                 len += 2;
2820         }
2821
2822         ni = ieee80211_find_rxnode(ic,
2823             mtod(m, struct ieee80211_frame_min *));
2824
2825         if (__predict_false(flags & RT2860_RX_MICERR)) {
2826                 /* report MIC failures to net80211 for TKIP */
2827                 if (ni != NULL)
2828                         ieee80211_notify_michael_failure(ni->ni_vap, wh,
2829                             rxwi->keyidx);
2830                 m_freem(m);
2831 #if defined(__DragonFly__)
2832                 ++ic->ic_ierrors;
2833 #else
2834                 counter_u64_add(ic->ic_ierrors, 1);
2835 #endif
2836                 DPRINTF("MIC error. Someone is lying.\n");
2837                 return;
2838         }
2839
2840         ant = run_maxrssi_chain(sc, rxwi);
2841         rssi = rxwi->rssi[ant];
2842         nf = run_rssi2dbm(sc, rssi, ant);
2843
2844         m->m_pkthdr.len = m->m_len = len;
2845
2846         if (__predict_false(ieee80211_radiotap_active(ic))) {
2847                 struct run_rx_radiotap_header *tap = &sc->sc_rxtap;
2848                 uint16_t phy;
2849
2850                 tap->wr_flags = 0;
2851                 tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq);
2852                 tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags);
2853                 tap->wr_antsignal = rssi;
2854                 tap->wr_antenna = ant;
2855                 tap->wr_dbm_antsignal = run_rssi2dbm(sc, rssi, ant);
2856                 tap->wr_rate = 2;       /* in case it can't be found below */
2857                 RUN_LOCK(sc);
2858                 run_get_tsf(sc, &tap->wr_tsf);
2859                 RUN_UNLOCK(sc);
2860                 phy = le16toh(rxwi->phy);
2861                 switch (phy & RT2860_PHY_MODE) {
2862                 case RT2860_PHY_CCK:
2863                         switch ((phy & RT2860_PHY_MCS) & ~RT2860_PHY_SHPRE) {
2864                         case 0: tap->wr_rate =   2; break;
2865                         case 1: tap->wr_rate =   4; break;
2866                         case 2: tap->wr_rate =  11; break;
2867                         case 3: tap->wr_rate =  22; break;
2868                         }
2869                         if (phy & RT2860_PHY_SHPRE)
2870                                 tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
2871                         break;
2872                 case RT2860_PHY_OFDM:
2873                         switch (phy & RT2860_PHY_MCS) {
2874                         case 0: tap->wr_rate =  12; break;
2875                         case 1: tap->wr_rate =  18; break;
2876                         case 2: tap->wr_rate =  24; break;
2877                         case 3: tap->wr_rate =  36; break;
2878                         case 4: tap->wr_rate =  48; break;
2879                         case 5: tap->wr_rate =  72; break;
2880                         case 6: tap->wr_rate =  96; break;
2881                         case 7: tap->wr_rate = 108; break;
2882                         }
2883                         break;
2884                 }
2885         }
2886
2887         if (ni != NULL) {
2888                 (void)ieee80211_input(ni, m, rssi, nf);
2889                 ieee80211_free_node(ni);
2890         } else {
2891                 (void)ieee80211_input_all(ic, m, rssi, nf);
2892         }
2893 }
2894
2895 static void
2896 run_bulk_rx_callback(struct usb_xfer *xfer, usb_error_t error)
2897 {
2898         struct run_softc *sc = usbd_xfer_softc(xfer);
2899         struct ieee80211com *ic = &sc->sc_ic;
2900         struct mbuf *m = NULL;
2901         struct mbuf *m0;
2902         uint32_t dmalen;
2903         uint16_t rxwisize;
2904         int xferlen;
2905
2906         rxwisize = sizeof(struct rt2860_rxwi);
2907         if (sc->mac_ver == 0x5592)
2908                 rxwisize += sizeof(uint64_t);
2909         else if (sc->mac_ver == 0x3593)
2910                 rxwisize += sizeof(uint32_t);
2911
2912         usbd_xfer_status(xfer, &xferlen, NULL, NULL, NULL);
2913
2914         switch (USB_GET_STATE(xfer)) {
2915         case USB_ST_TRANSFERRED:
2916
2917                 DPRINTFN(15, "rx done, actlen=%d\n", xferlen);
2918
2919                 if (xferlen < (int)(sizeof(uint32_t) + rxwisize +
2920                     sizeof(struct rt2870_rxd))) {
2921                         DPRINTF("xfer too short %d\n", xferlen);
2922                         goto tr_setup;
2923                 }
2924
2925                 m = sc->rx_m;
2926                 sc->rx_m = NULL;
2927
2928                 /* FALLTHROUGH */
2929         case USB_ST_SETUP:
2930 tr_setup:
2931                 if (sc->rx_m == NULL) {
2932                         sc->rx_m = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR,
2933                             MJUMPAGESIZE /* xfer can be bigger than MCLBYTES */);
2934                 }
2935                 if (sc->rx_m == NULL) {
2936                         DPRINTF("could not allocate mbuf - idle with stall\n");
2937 #if defined(__DragonFly__)
2938                         ++ic->ic_ierrors;
2939 #else
2940                         counter_u64_add(ic->ic_ierrors, 1);
2941 #endif
2942                         usbd_xfer_set_stall(xfer);
2943                         usbd_xfer_set_frames(xfer, 0);
2944                 } else {
2945                         /*
2946                          * Directly loading a mbuf cluster into DMA to
2947                          * save some data copying. This works because
2948                          * there is only one cluster.
2949                          */
2950                         usbd_xfer_set_frame_data(xfer, 0, 
2951                             mtod(sc->rx_m, caddr_t), RUN_MAX_RXSZ);
2952                         usbd_xfer_set_frames(xfer, 1);
2953                 }
2954                 usbd_transfer_submit(xfer);
2955                 break;
2956
2957         default:        /* Error */
2958                 if (error != USB_ERR_CANCELLED) {
2959                         /* try to clear stall first */
2960                         usbd_xfer_set_stall(xfer);
2961                         if (error == USB_ERR_TIMEOUT)
2962                                 device_printf(sc->sc_dev, "device timeout\n");
2963 #if defined(__DragonFly__)
2964                         ++ic->ic_ierrors;
2965 #else
2966                         counter_u64_add(ic->ic_ierrors, 1);
2967 #endif
2968                         goto tr_setup;
2969                 }
2970                 if (sc->rx_m != NULL) {
2971                         m_freem(sc->rx_m);
2972                         sc->rx_m = NULL;
2973                 }
2974                 break;
2975         }
2976
2977         if (m == NULL)
2978                 return;
2979
2980         /* inputting all the frames must be last */
2981
2982         RUN_UNLOCK(sc);
2983
2984         m->m_pkthdr.len = m->m_len = xferlen;
2985
2986         /* HW can aggregate multiple 802.11 frames in a single USB xfer */
2987         for(;;) {
2988                 dmalen = le32toh(*mtod(m, uint32_t *)) & 0xffff;
2989
2990                 if ((dmalen >= (uint32_t)-8) || (dmalen == 0) ||
2991                     ((dmalen & 3) != 0)) {
2992                         DPRINTF("bad DMA length %u\n", dmalen);
2993                         break;
2994                 }
2995                 if ((dmalen + 8) > (uint32_t)xferlen) {
2996                         DPRINTF("bad DMA length %u > %d\n",
2997                         dmalen + 8, xferlen);
2998                         break;
2999                 }
3000
3001                 /* If it is the last one or a single frame, we won't copy. */
3002                 if ((xferlen -= dmalen + 8) <= 8) {
3003                         /* trim 32-bit DMA-len header */
3004                         m->m_data += 4;
3005                         m->m_pkthdr.len = m->m_len -= 4;
3006                         run_rx_frame(sc, m, dmalen);
3007                         m = NULL;       /* don't free source buffer */
3008                         break;
3009                 }
3010
3011                 /* copy aggregated frames to another mbuf */
3012                 m0 = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
3013                 if (__predict_false(m0 == NULL)) {
3014                         DPRINTF("could not allocate mbuf\n");
3015 #if defined(__DragonFly__)
3016                         ++ic->ic_ierrors;
3017 #else
3018                         counter_u64_add(ic->ic_ierrors, 1);
3019 #endif
3020                         break;
3021                 }
3022                 m_copydata(m, 4 /* skip 32-bit DMA-len header */,
3023                     dmalen + sizeof(struct rt2870_rxd), mtod(m0, caddr_t));
3024                 m0->m_pkthdr.len = m0->m_len =
3025                     dmalen + sizeof(struct rt2870_rxd);
3026                 run_rx_frame(sc, m0, dmalen);
3027
3028                 /* update data ptr */
3029                 m->m_data += dmalen + 8;
3030                 m->m_pkthdr.len = m->m_len -= dmalen + 8;
3031         }
3032
3033         /* make sure we free the source buffer, if any */
3034         m_freem(m);
3035
3036         RUN_LOCK(sc);
3037 }
3038
3039 static void
3040 run_tx_free(struct run_endpoint_queue *pq,
3041     struct run_tx_data *data, int txerr)
3042 {
3043
3044         ieee80211_tx_complete(data->ni, data->m, txerr);
3045
3046         data->m = NULL;
3047         data->ni = NULL;
3048
3049         STAILQ_INSERT_TAIL(&pq->tx_fh, data, next);
3050         pq->tx_nfree++;
3051 }
3052
3053 static void
3054 run_bulk_tx_callbackN(struct usb_xfer *xfer, usb_error_t error, u_int index)
3055 {
3056         struct run_softc *sc = usbd_xfer_softc(xfer);
3057         struct ieee80211com *ic = &sc->sc_ic;
3058         struct run_tx_data *data;
3059         struct ieee80211vap *vap = NULL;
3060         struct usb_page_cache *pc;
3061         struct run_endpoint_queue *pq = &sc->sc_epq[index];
3062         struct mbuf *m;
3063         usb_frlength_t size;
3064         int actlen;
3065         int sumlen;
3066
3067         usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
3068
3069         switch (USB_GET_STATE(xfer)) {
3070         case USB_ST_TRANSFERRED:
3071                 DPRINTFN(11, "transfer complete: %d "
3072                     "bytes @ index %d\n", actlen, index);
3073
3074                 data = usbd_xfer_get_priv(xfer);
3075                 run_tx_free(pq, data, 0);
3076                 usbd_xfer_set_priv(xfer, NULL);
3077
3078                 /* FALLTHROUGH */
3079         case USB_ST_SETUP:
3080 tr_setup:
3081                 data = STAILQ_FIRST(&pq->tx_qh);
3082                 if (data == NULL)
3083                         break;
3084
3085                 STAILQ_REMOVE_HEAD(&pq->tx_qh, next);
3086
3087                 m = data->m;
3088                 size = (sc->mac_ver == 0x5592) ?
3089                     sizeof(data->desc) + sizeof(uint32_t) : sizeof(data->desc);
3090                 if ((m->m_pkthdr.len +
3091                     size + 3 + 8) > RUN_MAX_TXSZ) {
3092                         DPRINTF("data overflow, %u bytes\n",
3093                             m->m_pkthdr.len);
3094                         run_tx_free(pq, data, 1);
3095                         goto tr_setup;
3096                 }
3097
3098                 pc = usbd_xfer_get_frame(xfer, 0);
3099                 usbd_copy_in(pc, 0, &data->desc, size);
3100                 usbd_m_copy_in(pc, size, m, 0, m->m_pkthdr.len);
3101                 size += m->m_pkthdr.len;
3102                 /*
3103                  * Align end on a 4-byte boundary, pad 8 bytes (CRC +
3104                  * 4-byte padding), and be sure to zero those trailing
3105                  * bytes:
3106                  */
3107                 usbd_frame_zero(pc, size, ((-size) & 3) + 8);
3108                 size += ((-size) & 3) + 8;
3109
3110                 vap = data->ni->ni_vap;
3111                 if (ieee80211_radiotap_active_vap(vap)) {
3112                         struct run_tx_radiotap_header *tap = &sc->sc_txtap;
3113                         struct rt2860_txwi *txwi = 
3114                             (struct rt2860_txwi *)(&data->desc + sizeof(struct rt2870_txd));
3115                         tap->wt_flags = 0;
3116                         tap->wt_rate = rt2860_rates[data->ridx].rate;
3117                         run_get_tsf(sc, &tap->wt_tsf);
3118                         tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq);
3119                         tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags);
3120                         tap->wt_hwqueue = index;
3121                         if (le16toh(txwi->phy) & RT2860_PHY_SHPRE)
3122                                 tap->wt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
3123
3124                         ieee80211_radiotap_tx(vap, m);
3125                 }
3126
3127                 DPRINTFN(11, "sending frame len=%u/%u  @ index %d\n",
3128                     m->m_pkthdr.len, size, index);
3129
3130                 usbd_xfer_set_frame_len(xfer, 0, size);
3131                 usbd_xfer_set_priv(xfer, data);
3132                 usbd_transfer_submit(xfer);
3133                 run_start(sc);
3134
3135                 break;
3136
3137         default:
3138                 DPRINTF("USB transfer error, %s\n",
3139                     usbd_errstr(error));
3140
3141                 data = usbd_xfer_get_priv(xfer);
3142
3143                 if (data != NULL) {
3144                         if(data->ni != NULL)
3145                                 vap = data->ni->ni_vap;
3146                         run_tx_free(pq, data, error);
3147                         usbd_xfer_set_priv(xfer, NULL);
3148                 }
3149
3150                 if (vap == NULL)
3151                         vap = TAILQ_FIRST(&ic->ic_vaps);
3152
3153                 if (error != USB_ERR_CANCELLED) {
3154                         if (error == USB_ERR_TIMEOUT) {
3155                                 device_printf(sc->sc_dev, "device timeout\n");
3156                                 uint32_t i = RUN_CMDQ_GET(&sc->cmdq_store);
3157                                 DPRINTF("cmdq_store=%d\n", i);
3158                                 sc->cmdq[i].func = run_usb_timeout_cb;
3159                                 sc->cmdq[i].arg0 = vap;
3160                                 ieee80211_runtask(ic, &sc->cmdq_task);
3161                         }
3162
3163                         /*
3164                          * Try to clear stall first, also if other
3165                          * errors occur, hence clearing stall
3166                          * introduces a 50 ms delay:
3167                          */
3168                         usbd_xfer_set_stall(xfer);
3169                         goto tr_setup;
3170                 }
3171                 break;
3172         }
3173 }
3174
3175 static void
3176 run_bulk_tx_callback0(struct usb_xfer *xfer, usb_error_t error)
3177 {
3178         run_bulk_tx_callbackN(xfer, error, 0);
3179 }
3180
3181 static void
3182 run_bulk_tx_callback1(struct usb_xfer *xfer, usb_error_t error)
3183 {
3184         run_bulk_tx_callbackN(xfer, error, 1);
3185 }
3186
3187 static void
3188 run_bulk_tx_callback2(struct usb_xfer *xfer, usb_error_t error)
3189 {
3190         run_bulk_tx_callbackN(xfer, error, 2);
3191 }
3192
3193 static void
3194 run_bulk_tx_callback3(struct usb_xfer *xfer, usb_error_t error)
3195 {
3196         run_bulk_tx_callbackN(xfer, error, 3);
3197 }
3198
3199 static void
3200 run_bulk_tx_callback4(struct usb_xfer *xfer, usb_error_t error)
3201 {
3202         run_bulk_tx_callbackN(xfer, error, 4);
3203 }
3204
3205 static void
3206 run_bulk_tx_callback5(struct usb_xfer *xfer, usb_error_t error)
3207 {
3208         run_bulk_tx_callbackN(xfer, error, 5);
3209 }
3210
3211 static void
3212 run_set_tx_desc(struct run_softc *sc, struct run_tx_data *data)
3213 {
3214         struct mbuf *m = data->m;
3215         struct ieee80211com *ic = &sc->sc_ic;
3216         struct ieee80211vap *vap = data->ni->ni_vap;
3217         struct ieee80211_frame *wh;
3218         struct rt2870_txd *txd;
3219         struct rt2860_txwi *txwi;
3220         uint16_t xferlen, txwisize;
3221         uint16_t mcs;
3222         uint8_t ridx = data->ridx;
3223         uint8_t pad;
3224
3225         /* get MCS code from rate index */
3226         mcs = rt2860_rates[ridx].mcs;
3227
3228         txwisize = (sc->mac_ver == 0x5592) ?
3229             sizeof(*txwi) + sizeof(uint32_t) : sizeof(*txwi);
3230         xferlen = txwisize + m->m_pkthdr.len;
3231
3232         /* roundup to 32-bit alignment */
3233         xferlen = (xferlen + 3) & ~3;
3234
3235         txd = (struct rt2870_txd *)&data->desc;
3236         txd->len = htole16(xferlen);
3237
3238         wh = mtod(m, struct ieee80211_frame *);
3239
3240         /*
3241          * Ether both are true or both are false, the header
3242          * are nicely aligned to 32-bit. So, no L2 padding.
3243          */
3244         if(IEEE80211_HAS_ADDR4(wh) == IEEE80211_QOS_HAS_SEQ(wh))
3245                 pad = 0;
3246         else
3247                 pad = 2;
3248
3249         /* setup TX Wireless Information */
3250         txwi = (struct rt2860_txwi *)(txd + 1);
3251         txwi->len = htole16(m->m_pkthdr.len - pad);
3252         if (rt2860_rates[ridx].phy == IEEE80211_T_DS) {
3253                 mcs |= RT2860_PHY_CCK;
3254                 if (ridx != RT2860_RIDX_CCK1 &&
3255                     (ic->ic_flags & IEEE80211_F_SHPREAMBLE))
3256                         mcs |= RT2860_PHY_SHPRE;
3257         } else
3258                 mcs |= RT2860_PHY_OFDM;
3259         txwi->phy = htole16(mcs);
3260
3261         /* check if RTS/CTS or CTS-to-self protection is required */
3262         if (!IEEE80211_IS_MULTICAST(wh->i_addr1) &&
3263             (m->m_pkthdr.len + IEEE80211_CRC_LEN > vap->iv_rtsthreshold ||
3264              ((ic->ic_flags & IEEE80211_F_USEPROT) &&
3265               rt2860_rates[ridx].phy == IEEE80211_T_OFDM)))
3266                 txwi->txop |= RT2860_TX_TXOP_HT;
3267         else
3268                 txwi->txop |= RT2860_TX_TXOP_BACKOFF;
3269
3270         if (vap->iv_opmode != IEEE80211_M_STA && !IEEE80211_QOS_HAS_SEQ(wh))
3271                 txwi->xflags |= RT2860_TX_NSEQ;
3272 }
3273
3274 /* This function must be called locked */
3275 static int
3276 run_tx(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
3277 {
3278         struct ieee80211com *ic = &sc->sc_ic;
3279         struct ieee80211vap *vap = ni->ni_vap;
3280         struct ieee80211_frame *wh;
3281         struct ieee80211_channel *chan;
3282         const struct ieee80211_txparam *tp;
3283         struct run_node *rn = RUN_NODE(ni);
3284         struct run_tx_data *data;
3285         struct rt2870_txd *txd;
3286         struct rt2860_txwi *txwi;
3287         uint16_t qos;
3288         uint16_t dur;
3289         uint16_t qid;
3290         uint8_t type;
3291         uint8_t tid;
3292         uint8_t ridx;
3293         uint8_t ctl_ridx;
3294         uint8_t qflags;
3295         uint8_t xflags = 0;
3296         int hasqos;
3297
3298         RUN_LOCK_ASSERT(sc, MA_OWNED);
3299
3300         wh = mtod(m, struct ieee80211_frame *);
3301
3302         type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
3303
3304         /*
3305          * There are 7 bulk endpoints: 1 for RX
3306          * and 6 for TX (4 EDCAs + HCCA + Prio).
3307          * Update 03-14-2009:  some devices like the Planex GW-US300MiniS
3308          * seem to have only 4 TX bulk endpoints (Fukaumi Naoki).
3309          */
3310         if ((hasqos = IEEE80211_QOS_HAS_SEQ(wh))) {
3311                 uint8_t *frm;
3312
3313                 if(IEEE80211_HAS_ADDR4(wh))
3314                         frm = ((struct ieee80211_qosframe_addr4 *)wh)->i_qos;
3315                 else
3316                         frm =((struct ieee80211_qosframe *)wh)->i_qos;
3317
3318                 qos = le16toh(*(const uint16_t *)frm);
3319                 tid = qos & IEEE80211_QOS_TID;
3320                 qid = TID_TO_WME_AC(tid);
3321         } else {
3322                 qos = 0;
3323                 tid = 0;
3324                 qid = WME_AC_BE;
3325         }
3326         qflags = (qid < 4) ? RT2860_TX_QSEL_EDCA : RT2860_TX_QSEL_HCCA;
3327
3328         DPRINTFN(8, "qos %d\tqid %d\ttid %d\tqflags %x\n",
3329             qos, qid, tid, qflags);
3330
3331         chan = (ni->ni_chan != IEEE80211_CHAN_ANYC)?ni->ni_chan:ic->ic_curchan;
3332         tp = &vap->iv_txparms[ieee80211_chan2mode(chan)];
3333
3334         /* pickup a rate index */
3335         if (IEEE80211_IS_MULTICAST(wh->i_addr1) ||
3336             type != IEEE80211_FC0_TYPE_DATA || m->m_flags & M_EAPOL) {
3337                 ridx = (ic->ic_curmode == IEEE80211_MODE_11A) ?
3338                     RT2860_RIDX_OFDM6 : RT2860_RIDX_CCK1;
3339                 ctl_ridx = rt2860_rates[ridx].ctl_ridx;
3340         } else {
3341                 if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE)
3342                         ridx = rn->fix_ridx;
3343                 else
3344                         ridx = rn->amrr_ridx;
3345                 ctl_ridx = rt2860_rates[ridx].ctl_ridx;
3346         }
3347
3348         if (!IEEE80211_IS_MULTICAST(wh->i_addr1) &&
3349             (!hasqos || (qos & IEEE80211_QOS_ACKPOLICY) !=
3350              IEEE80211_QOS_ACKPOLICY_NOACK)) {
3351                 xflags |= RT2860_TX_ACK;
3352                 if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
3353                         dur = rt2860_rates[ctl_ridx].sp_ack_dur;
3354                 else
3355                         dur = rt2860_rates[ctl_ridx].lp_ack_dur;
3356                 USETW(wh->i_dur, dur);
3357         }
3358
3359         /* reserve slots for mgmt packets, just in case */
3360         if (sc->sc_epq[qid].tx_nfree < 3) {
3361                 DPRINTFN(10, "tx ring %d is full\n", qid);
3362                 return (-1);
3363         }
3364
3365         data = STAILQ_FIRST(&sc->sc_epq[qid].tx_fh);
3366         STAILQ_REMOVE_HEAD(&sc->sc_epq[qid].tx_fh, next);
3367         sc->sc_epq[qid].tx_nfree--;
3368
3369         txd = (struct rt2870_txd *)&data->desc;
3370         txd->flags = qflags;
3371         txwi = (struct rt2860_txwi *)(txd + 1);
3372         txwi->xflags = xflags;
3373         if (IEEE80211_IS_MULTICAST(wh->i_addr1))
3374                 txwi->wcid = 0;
3375         else
3376                 txwi->wcid = (vap->iv_opmode == IEEE80211_M_STA) ?
3377                     1 : RUN_AID2WCID(ni->ni_associd);
3378
3379         /* clear leftover garbage bits */
3380         txwi->flags = 0;
3381         txwi->txop = 0;
3382
3383         data->m = m;
3384         data->ni = ni;
3385         data->ridx = ridx;
3386
3387         run_set_tx_desc(sc, data);
3388
3389         /*
3390          * The chip keeps track of 2 kind of Tx stats,
3391          *  * TX_STAT_FIFO, for per WCID stats, and
3392          *  * TX_STA_CNT0 for all-TX-in-one stats.
3393          *
3394          * To use FIFO stats, we need to store MCS into the driver-private
3395          * PacketID field. So that, we can tell whose stats when we read them.
3396          * We add 1 to the MCS because setting the PacketID field to 0 means
3397          * that we don't want feedback in TX_STAT_FIFO.
3398          * And, that's what we want for STA mode, since TX_STA_CNT0 does the job.
3399          *
3400          * FIFO stats doesn't count Tx with WCID 0xff, so we do this in run_tx().
3401          */
3402         if (sc->rvp_cnt > 1 || vap->iv_opmode == IEEE80211_M_HOSTAP ||
3403             vap->iv_opmode == IEEE80211_M_MBSS) {
3404                 uint16_t pid = (rt2860_rates[ridx].mcs + 1) & 0xf;
3405                 txwi->len |= htole16(pid << RT2860_TX_PID_SHIFT);
3406
3407                 /*
3408                  * Unlike PCI based devices, we don't get any interrupt from
3409                  * USB devices, so we simulate FIFO-is-full interrupt here.
3410                  * Ralink recommends to drain FIFO stats every 100 ms, but 16 slots
3411                  * quickly get fulled. To prevent overflow, increment a counter on
3412                  * every FIFO stat request, so we know how many slots are left.
3413                  * We do this only in HOSTAP or multiple vap mode since FIFO stats
3414                  * are used only in those modes.
3415                  * We just drain stats. AMRR gets updated every 1 sec by
3416                  * run_ratectl_cb() via callout.
3417                  * Call it early. Otherwise overflow.
3418                  */
3419                 if (sc->fifo_cnt++ == 10) {
3420                         /*
3421                          * With multiple vaps or if_bridge, if_start() is called
3422                          * with a non-sleepable lock, tcpinp. So, need to defer.
3423                          */
3424                         uint32_t i = RUN_CMDQ_GET(&sc->cmdq_store);
3425                         DPRINTFN(6, "cmdq_store=%d\n", i);
3426                         sc->cmdq[i].func = run_drain_fifo;
3427                         sc->cmdq[i].arg0 = sc;
3428                         ieee80211_runtask(ic, &sc->cmdq_task);
3429                 }
3430         }
3431
3432         STAILQ_INSERT_TAIL(&sc->sc_epq[qid].tx_qh, data, next);
3433
3434         usbd_transfer_start(sc->sc_xfer[qid]);
3435
3436         DPRINTFN(8, "sending data frame len=%d rate=%d qid=%d\n",
3437             m->m_pkthdr.len + (int)(sizeof(struct rt2870_txd) +
3438             sizeof(struct rt2860_txwi)), rt2860_rates[ridx].rate, qid);
3439
3440         return (0);
3441 }
3442
3443 static int
3444 run_tx_mgt(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
3445 {
3446         struct ieee80211com *ic = &sc->sc_ic;
3447         struct run_node *rn = RUN_NODE(ni);
3448         struct run_tx_data *data;
3449         struct ieee80211_frame *wh;
3450         struct rt2870_txd *txd;
3451         struct rt2860_txwi *txwi;
3452         uint16_t dur;
3453         uint8_t ridx = rn->mgt_ridx;
3454         uint8_t type;
3455         uint8_t xflags = 0;
3456         uint8_t wflags = 0;
3457
3458         RUN_LOCK_ASSERT(sc, MA_OWNED);
3459
3460         wh = mtod(m, struct ieee80211_frame *);
3461
3462         type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
3463
3464         /* tell hardware to add timestamp for probe responses */
3465         if ((wh->i_fc[0] &
3466             (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_MASK)) ==
3467             (IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_PROBE_RESP))
3468                 wflags |= RT2860_TX_TS;
3469         else if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
3470                 xflags |= RT2860_TX_ACK;
3471
3472                 dur = ieee80211_ack_duration(ic->ic_rt, rt2860_rates[ridx].rate, 
3473                     ic->ic_flags & IEEE80211_F_SHPREAMBLE);
3474                 USETW(wh->i_dur, dur);
3475         }
3476
3477         if (sc->sc_epq[0].tx_nfree == 0)
3478                 /* let caller free mbuf */
3479                 return (EIO);
3480         data = STAILQ_FIRST(&sc->sc_epq[0].tx_fh);
3481         STAILQ_REMOVE_HEAD(&sc->sc_epq[0].tx_fh, next);
3482         sc->sc_epq[0].tx_nfree--;
3483
3484         txd = (struct rt2870_txd *)&data->desc;
3485         txd->flags = RT2860_TX_QSEL_EDCA;
3486         txwi = (struct rt2860_txwi *)(txd + 1);
3487         txwi->wcid = 0xff;
3488         txwi->flags = wflags;
3489         txwi->xflags = xflags;
3490         txwi->txop = 0; /* clear leftover garbage bits */
3491
3492         data->m = m;
3493         data->ni = ni;
3494         data->ridx = ridx;
3495
3496         run_set_tx_desc(sc, data);
3497
3498         DPRINTFN(10, "sending mgt frame len=%d rate=%d\n", m->m_pkthdr.len +
3499             (int)(sizeof(struct rt2870_txd) + sizeof(struct rt2860_txwi)),
3500             rt2860_rates[ridx].rate);
3501
3502         STAILQ_INSERT_TAIL(&sc->sc_epq[0].tx_qh, data, next);
3503
3504         usbd_transfer_start(sc->sc_xfer[0]);
3505
3506         return (0);
3507 }
3508
3509 static int
3510 run_sendprot(struct run_softc *sc,
3511     const struct mbuf *m, struct ieee80211_node *ni, int prot, int rate)
3512 {
3513         struct ieee80211com *ic = ni->ni_ic;
3514         struct ieee80211_frame *wh;
3515         struct run_tx_data *data;
3516         struct rt2870_txd *txd;
3517         struct rt2860_txwi *txwi;
3518         struct mbuf *mprot;
3519         int ridx;
3520         int protrate;
3521         int ackrate;
3522         int pktlen;
3523         int isshort;
3524         uint16_t dur;
3525         uint8_t type;
3526         uint8_t wflags = 0;
3527         uint8_t xflags = 0;
3528
3529         RUN_LOCK_ASSERT(sc, MA_OWNED);
3530
3531         KASSERT(prot == IEEE80211_PROT_RTSCTS || prot == IEEE80211_PROT_CTSONLY,
3532             ("protection %d", prot));
3533
3534         wh = mtod(m, struct ieee80211_frame *);
3535         pktlen = m->m_pkthdr.len + IEEE80211_CRC_LEN;
3536         type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
3537
3538         protrate = ieee80211_ctl_rate(ic->ic_rt, rate);
3539         ackrate = ieee80211_ack_rate(ic->ic_rt, rate);
3540
3541         isshort = (ic->ic_flags & IEEE80211_F_SHPREAMBLE) != 0;
3542         dur = ieee80211_compute_duration(ic->ic_rt, pktlen, rate, isshort)
3543             + ieee80211_ack_duration(ic->ic_rt, rate, isshort);
3544         wflags = RT2860_TX_FRAG;
3545
3546         /* check that there are free slots before allocating the mbuf */
3547         if (sc->sc_epq[0].tx_nfree == 0)
3548                 /* let caller free mbuf */
3549                 return (ENOBUFS);
3550
3551         if (prot == IEEE80211_PROT_RTSCTS) {
3552                 /* NB: CTS is the same size as an ACK */
3553                 dur += ieee80211_ack_duration(ic->ic_rt, rate, isshort);
3554                 xflags |= RT2860_TX_ACK;
3555                 mprot = ieee80211_alloc_rts(ic, wh->i_addr1, wh->i_addr2, dur);
3556         } else {
3557                 mprot = ieee80211_alloc_cts(ic, ni->ni_vap->iv_myaddr, dur);
3558         }
3559         if (mprot == NULL) {
3560                 if_inc_counter(ni->ni_vap->iv_ifp, IFCOUNTER_OERRORS, 1);
3561                 DPRINTF("could not allocate mbuf\n");
3562                 return (ENOBUFS);
3563         }
3564
3565         data = STAILQ_FIRST(&sc->sc_epq[0].tx_fh);
3566         STAILQ_REMOVE_HEAD(&sc->sc_epq[0].tx_fh, next);
3567         sc->sc_epq[0].tx_nfree--;
3568
3569         txd = (struct rt2870_txd *)&data->desc;
3570         txd->flags = RT2860_TX_QSEL_EDCA;
3571         txwi = (struct rt2860_txwi *)(txd + 1);
3572         txwi->wcid = 0xff;
3573         txwi->flags = wflags;
3574         txwi->xflags = xflags;
3575         txwi->txop = 0; /* clear leftover garbage bits */
3576
3577         data->m = mprot;
3578         data->ni = ieee80211_ref_node(ni);
3579
3580         for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++)
3581                 if (rt2860_rates[ridx].rate == protrate)
3582                         break;
3583         data->ridx = ridx;
3584
3585         run_set_tx_desc(sc, data);
3586
3587         DPRINTFN(1, "sending prot len=%u rate=%u\n",
3588             m->m_pkthdr.len, rate);
3589
3590         STAILQ_INSERT_TAIL(&sc->sc_epq[0].tx_qh, data, next);
3591
3592         usbd_transfer_start(sc->sc_xfer[0]);
3593
3594         return (0);
3595 }
3596
3597 static int
3598 run_tx_param(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni,
3599     const struct ieee80211_bpf_params *params)
3600 {
3601         struct ieee80211com *ic = ni->ni_ic;
3602         struct ieee80211_frame *wh;
3603         struct run_tx_data *data;
3604         struct rt2870_txd *txd;
3605         struct rt2860_txwi *txwi;
3606         uint8_t type;
3607         uint8_t ridx;
3608         uint8_t rate;
3609         uint8_t opflags = 0;
3610         uint8_t xflags = 0;
3611         int error;
3612
3613         RUN_LOCK_ASSERT(sc, MA_OWNED);
3614
3615         KASSERT(params != NULL, ("no raw xmit params"));
3616
3617         wh = mtod(m, struct ieee80211_frame *);
3618         type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
3619
3620         rate = params->ibp_rate0;
3621         if (!ieee80211_isratevalid(ic->ic_rt, rate)) {
3622                 /* let caller free mbuf */
3623                 return (EINVAL);
3624         }
3625
3626         if ((params->ibp_flags & IEEE80211_BPF_NOACK) == 0)
3627                 xflags |= RT2860_TX_ACK;
3628         if (params->ibp_flags & (IEEE80211_BPF_RTS|IEEE80211_BPF_CTS)) {
3629                 error = run_sendprot(sc, m, ni,
3630                     params->ibp_flags & IEEE80211_BPF_RTS ?
3631                         IEEE80211_PROT_RTSCTS : IEEE80211_PROT_CTSONLY,
3632                     rate);
3633                 if (error) {
3634                         /* let caller free mbuf */
3635                         return error;
3636                 }
3637                 opflags |= /*XXX RT2573_TX_LONG_RETRY |*/ RT2860_TX_TXOP_SIFS;
3638         }
3639
3640         if (sc->sc_epq[0].tx_nfree == 0) {
3641                 /* let caller free mbuf */
3642                 DPRINTF("sending raw frame, but tx ring is full\n");
3643                 return (EIO);
3644         }
3645         data = STAILQ_FIRST(&sc->sc_epq[0].tx_fh);
3646         STAILQ_REMOVE_HEAD(&sc->sc_epq[0].tx_fh, next);
3647         sc->sc_epq[0].tx_nfree--;
3648
3649         txd = (struct rt2870_txd *)&data->desc;
3650         txd->flags = RT2860_TX_QSEL_EDCA;
3651         txwi = (struct rt2860_txwi *)(txd + 1);
3652         txwi->wcid = 0xff;
3653         txwi->xflags = xflags;
3654         txwi->txop = opflags;
3655         txwi->flags = 0;        /* clear leftover garbage bits */
3656
3657         data->m = m;
3658         data->ni = ni;
3659         for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++)
3660                 if (rt2860_rates[ridx].rate == rate)
3661                         break;
3662         data->ridx = ridx;
3663
3664         run_set_tx_desc(sc, data);
3665
3666         DPRINTFN(10, "sending raw frame len=%u rate=%u\n",
3667             m->m_pkthdr.len, rate);
3668
3669         STAILQ_INSERT_TAIL(&sc->sc_epq[0].tx_qh, data, next);
3670
3671         usbd_transfer_start(sc->sc_xfer[0]);
3672
3673         return (0);
3674 }
3675
3676 static int
3677 run_raw_xmit(struct ieee80211_node *ni, struct mbuf *m,
3678     const struct ieee80211_bpf_params *params)
3679 {
3680         struct run_softc *sc = ni->ni_ic->ic_softc;
3681         int error = 0;
3682  
3683         RUN_LOCK(sc);
3684
3685         /* prevent management frames from being sent if we're not ready */
3686         if (!(sc->sc_flags & RUN_RUNNING)) {
3687                 error = ENETDOWN;
3688                 goto done;
3689         }
3690
3691         if (params == NULL) {
3692                 /* tx mgt packet */
3693                 if ((error = run_tx_mgt(sc, m, ni)) != 0) {
3694                         DPRINTF("mgt tx failed\n");
3695                         goto done;
3696                 }
3697         } else {
3698                 /* tx raw packet with param */
3699                 if ((error = run_tx_param(sc, m, ni, params)) != 0) {
3700                         DPRINTF("tx with param failed\n");
3701                         goto done;
3702                 }
3703         }
3704
3705 done:
3706         RUN_UNLOCK(sc);
3707
3708         if (error != 0) {
3709                 if(m != NULL)
3710                         m_freem(m);
3711         }
3712
3713         return (error);
3714 }
3715
3716 static int
3717 run_transmit(struct ieee80211com *ic, struct mbuf *m)
3718 {
3719         struct run_softc *sc = ic->ic_softc;
3720         int error;
3721
3722         RUN_LOCK(sc);
3723         if ((sc->sc_flags & RUN_RUNNING) == 0) {
3724                 RUN_UNLOCK(sc);
3725                 return (ENXIO);
3726         }
3727         error = mbufq_enqueue(&sc->sc_snd, m);
3728         if (error) {
3729                 RUN_UNLOCK(sc);
3730                 return (error);
3731         }
3732         run_start(sc);
3733         RUN_UNLOCK(sc);
3734
3735         return (0);
3736 }
3737
3738 static void
3739 run_start(struct run_softc *sc)
3740 {
3741         struct ieee80211_node *ni;
3742         struct mbuf *m;
3743
3744         RUN_LOCK_ASSERT(sc, MA_OWNED);
3745
3746         if ((sc->sc_flags & RUN_RUNNING) == 0)
3747                 return;
3748
3749         while ((m = mbufq_dequeue(&sc->sc_snd)) != NULL) {
3750                 ni = (struct ieee80211_node *)m->m_pkthdr.rcvif;
3751                 if (run_tx(sc, m, ni) != 0) {
3752                         mbufq_prepend(&sc->sc_snd, m);
3753                         break;
3754                 }
3755         }
3756 }
3757
3758 static void
3759 run_parent(struct ieee80211com *ic)
3760 {
3761         struct run_softc *sc = ic->ic_softc;
3762         int startall = 0;
3763
3764         RUN_LOCK(sc);
3765         if (sc->sc_detached) {
3766                 RUN_UNLOCK(sc);
3767                 return;
3768         }
3769
3770         if (ic->ic_nrunning > 0) {
3771                 if (!(sc->sc_flags & RUN_RUNNING)) {
3772                         startall = 1;
3773                         run_init_locked(sc);
3774                 } else
3775                         run_update_promisc_locked(sc);
3776         } else if ((sc->sc_flags & RUN_RUNNING) && sc->rvp_cnt <= 1)
3777                 run_stop(sc);
3778         RUN_UNLOCK(sc);
3779         if (startall)
3780                 ieee80211_start_all(ic);
3781 }
3782
3783 static void
3784 run_iq_calib(struct run_softc *sc, u_int chan)
3785 {
3786         uint16_t val;
3787
3788         /* Tx0 IQ gain. */
3789         run_bbp_write(sc, 158, 0x2c);
3790         if (chan <= 14)
3791                 run_efuse_read(sc, RT5390_EEPROM_IQ_GAIN_CAL_TX0_2GHZ, &val, 1);
3792         else if (chan <= 64) {
3793                 run_efuse_read(sc,
3794                     RT5390_EEPROM_IQ_GAIN_CAL_TX0_CH36_TO_CH64_5GHZ,
3795                     &val, 1);
3796         } else if (chan <= 138) {
3797                 run_efuse_read(sc,
3798                     RT5390_EEPROM_IQ_GAIN_CAL_TX0_CH100_TO_CH138_5GHZ,
3799                     &val, 1);
3800         } else if (chan <= 165) {
3801                 run_efuse_read(sc,
3802             RT5390_EEPROM_IQ_GAIN_CAL_TX0_CH140_TO_CH165_5GHZ,
3803                     &val, 1);
3804         } else
3805                 val = 0;
3806         run_bbp_write(sc, 159, val);
3807
3808         /* Tx0 IQ phase. */
3809         run_bbp_write(sc, 158, 0x2d);
3810         if (chan <= 14) {
3811                 run_efuse_read(sc, RT5390_EEPROM_IQ_PHASE_CAL_TX0_2GHZ,
3812                     &val, 1);
3813         } else if (chan <= 64) {
3814                 run_efuse_read(sc,
3815                     RT5390_EEPROM_IQ_PHASE_CAL_TX0_CH36_TO_CH64_5GHZ,
3816                     &val, 1);
3817         } else if (chan <= 138) {
3818                 run_efuse_read(sc,
3819                     RT5390_EEPROM_IQ_PHASE_CAL_TX0_CH100_TO_CH138_5GHZ,
3820                     &val, 1);
3821         } else if (chan <= 165) {
3822                 run_efuse_read(sc,
3823                     RT5390_EEPROM_IQ_PHASE_CAL_TX0_CH140_TO_CH165_5GHZ,
3824                     &val, 1);
3825         } else
3826                 val = 0;
3827         run_bbp_write(sc, 159, val);
3828
3829         /* Tx1 IQ gain. */
3830         run_bbp_write(sc, 158, 0x4a);
3831         if (chan <= 14) {
3832                 run_efuse_read(sc, RT5390_EEPROM_IQ_GAIN_CAL_TX1_2GHZ,
3833                     &val, 1);
3834         } else if (chan <= 64) {
3835                 run_efuse_read(sc,
3836                     RT5390_EEPROM_IQ_GAIN_CAL_TX1_CH36_TO_CH64_5GHZ,
3837                     &val, 1);
3838         } else if (chan <= 138) {
3839                 run_efuse_read(sc,
3840                     RT5390_EEPROM_IQ_GAIN_CAL_TX1_CH100_TO_CH138_5GHZ,
3841                     &val, 1);
3842         } else if (chan <= 165) {
3843                 run_efuse_read(sc,
3844                     RT5390_EEPROM_IQ_GAIN_CAL_TX1_CH140_TO_CH165_5GHZ,
3845                     &val, 1);
3846         } else
3847                 val = 0;
3848         run_bbp_write(sc, 159, val);
3849
3850         /* Tx1 IQ phase. */
3851         run_bbp_write(sc, 158, 0x4b);
3852         if (chan <= 14) {
3853                 run_efuse_read(sc, RT5390_EEPROM_IQ_PHASE_CAL_TX1_2GHZ,
3854                     &val, 1);
3855         } else if (chan <= 64) {
3856                 run_efuse_read(sc,
3857                     RT5390_EEPROM_IQ_PHASE_CAL_TX1_CH36_TO_CH64_5GHZ,
3858                     &val, 1);
3859         } else if (chan <= 138) {
3860                 run_efuse_read(sc,
3861                     RT5390_EEPROM_IQ_PHASE_CAL_TX1_CH100_TO_CH138_5GHZ,
3862                     &val, 1);
3863         } else if (chan <= 165) {
3864                 run_efuse_read(sc,
3865                     RT5390_EEPROM_IQ_PHASE_CAL_TX1_CH140_TO_CH165_5GHZ,
3866                     &val, 1);
3867         } else
3868                 val = 0;
3869         run_bbp_write(sc, 159, val);
3870
3871         /* RF IQ compensation control. */
3872         run_bbp_write(sc, 158, 0x04);
3873         run_efuse_read(sc, RT5390_EEPROM_RF_IQ_COMPENSATION_CTL,
3874             &val, 1);
3875         run_bbp_write(sc, 159, val);
3876
3877         /* RF IQ imbalance compensation control. */
3878         run_bbp_write(sc, 158, 0x03);
3879         run_efuse_read(sc,
3880             RT5390_EEPROM_RF_IQ_IMBALANCE_COMPENSATION_CTL, &val, 1);
3881         run_bbp_write(sc, 159, val);
3882 }
3883
3884 static void
3885 run_set_agc(struct run_softc *sc, uint8_t agc)
3886 {
3887         uint8_t bbp;
3888
3889         if (sc->mac_ver == 0x3572) {
3890                 run_bbp_read(sc, 27, &bbp);
3891                 bbp &= ~(0x3 << 5);
3892                 run_bbp_write(sc, 27, bbp | 0 << 5);    /* select Rx0 */
3893                 run_bbp_write(sc, 66, agc);
3894                 run_bbp_write(sc, 27, bbp | 1 << 5);    /* select Rx1 */
3895                 run_bbp_write(sc, 66, agc);
3896         } else
3897                 run_bbp_write(sc, 66, agc);
3898 }
3899
3900 static void
3901 run_select_chan_group(struct run_softc *sc, int group)
3902 {
3903         uint32_t tmp;
3904         uint8_t agc;
3905
3906         run_bbp_write(sc, 62, 0x37 - sc->lna[group]);
3907         run_bbp_write(sc, 63, 0x37 - sc->lna[group]);
3908         run_bbp_write(sc, 64, 0x37 - sc->lna[group]);
3909         if (sc->mac_ver < 0x3572)
3910                 run_bbp_write(sc, 86, 0x00);
3911
3912         if (sc->mac_ver == 0x3593) {
3913                 run_bbp_write(sc, 77, 0x98);
3914                 run_bbp_write(sc, 83, (group == 0) ? 0x8a : 0x9a);
3915         }
3916
3917         if (group == 0) {
3918                 if (sc->ext_2ghz_lna) {
3919                         if (sc->mac_ver >= 0x5390)
3920                                 run_bbp_write(sc, 75, 0x52);
3921                         else {
3922                                 run_bbp_write(sc, 82, 0x62);
3923                                 run_bbp_write(sc, 75, 0x46);
3924                         }
3925                 } else {
3926                         if (sc->mac_ver == 0x5592) {
3927                                 run_bbp_write(sc, 79, 0x1c);
3928                                 run_bbp_write(sc, 80, 0x0e);
3929                                 run_bbp_write(sc, 81, 0x3a);
3930                                 run_bbp_write(sc, 82, 0x62);
3931
3932                                 run_bbp_write(sc, 195, 0x80);
3933                                 run_bbp_write(sc, 196, 0xe0);
3934                                 run_bbp_write(sc, 195, 0x81);
3935                                 run_bbp_write(sc, 196, 0x1f);
3936                                 run_bbp_write(sc, 195, 0x82);
3937                                 run_bbp_write(sc, 196, 0x38);
3938                                 run_bbp_write(sc, 195, 0x83);
3939                                 run_bbp_write(sc, 196, 0x32);
3940                                 run_bbp_write(sc, 195, 0x85);
3941                                 run_bbp_write(sc, 196, 0x28);
3942                                 run_bbp_write(sc, 195, 0x86);
3943                                 run_bbp_write(sc, 196, 0x19);
3944                         } else if (sc->mac_ver >= 0x5390)
3945                                 run_bbp_write(sc, 75, 0x50);
3946                         else {
3947                                 run_bbp_write(sc, 82,
3948                                     (sc->mac_ver == 0x3593) ? 0x62 : 0x84);
3949                                 run_bbp_write(sc, 75, 0x50);
3950                         }
3951                 }
3952         } else {
3953                 if (sc->mac_ver == 0x5592) {
3954                         run_bbp_write(sc, 79, 0x18);
3955                         run_bbp_write(sc, 80, 0x08);
3956                         run_bbp_write(sc, 81, 0x38);
3957                         run_bbp_write(sc, 82, 0x92);
3958
3959                         run_bbp_write(sc, 195, 0x80);
3960                         run_bbp_write(sc, 196, 0xf0);
3961                         run_bbp_write(sc, 195, 0x81);
3962                         run_bbp_write(sc, 196, 0x1e);
3963                         run_bbp_write(sc, 195, 0x82);
3964                         run_bbp_write(sc, 196, 0x28);
3965                         run_bbp_write(sc, 195, 0x83);
3966                         run_bbp_write(sc, 196, 0x20);
3967                         run_bbp_write(sc, 195, 0x85);
3968                         run_bbp_write(sc, 196, 0x7f);
3969                         run_bbp_write(sc, 195, 0x86);
3970                         run_bbp_write(sc, 196, 0x7f);
3971                 } else if (sc->mac_ver == 0x3572)
3972                         run_bbp_write(sc, 82, 0x94);
3973                 else
3974                         run_bbp_write(sc, 82,
3975                             (sc->mac_ver == 0x3593) ? 0x82 : 0xf2);
3976                 if (sc->ext_5ghz_lna)
3977                         run_bbp_write(sc, 75, 0x46);
3978                 else 
3979                         run_bbp_write(sc, 75, 0x50);
3980         }
3981
3982         run_read(sc, RT2860_TX_BAND_CFG, &tmp);
3983         tmp &= ~(RT2860_5G_BAND_SEL_N | RT2860_5G_BAND_SEL_P);
3984         tmp |= (group == 0) ? RT2860_5G_BAND_SEL_N : RT2860_5G_BAND_SEL_P;
3985         run_write(sc, RT2860_TX_BAND_CFG, tmp);
3986
3987         /* enable appropriate Power Amplifiers and Low Noise Amplifiers */
3988         tmp = RT2860_RFTR_EN | RT2860_TRSW_EN | RT2860_LNA_PE0_EN;
3989         if (sc->mac_ver == 0x3593)
3990                 tmp |= 1 << 29 | 1 << 28;
3991         if (sc->nrxchains > 1)
3992                 tmp |= RT2860_LNA_PE1_EN;
3993         if (group == 0) {       /* 2GHz */
3994                 tmp |= RT2860_PA_PE_G0_EN;
3995                 if (sc->ntxchains > 1)
3996                         tmp |= RT2860_PA_PE_G1_EN;
3997                 if (sc->mac_ver == 0x3593) {
3998                         if (sc->ntxchains > 2)
3999                                 tmp |= 1 << 25;
4000                 }
4001         } else {                /* 5GHz */
4002                 tmp |= RT2860_PA_PE_A0_EN;
4003                 if (sc->ntxchains > 1)
4004                         tmp |= RT2860_PA_PE_A1_EN;
4005         }
4006         if (sc->mac_ver == 0x3572) {
4007                 run_rt3070_rf_write(sc, 8, 0x00);
4008                 run_write(sc, RT2860_TX_PIN_CFG, tmp);
4009                 run_rt3070_rf_write(sc, 8, 0x80);
4010         } else
4011                 run_write(sc, RT2860_TX_PIN_CFG, tmp);
4012
4013         if (sc->mac_ver == 0x5592) {
4014                 run_bbp_write(sc, 195, 0x8d);
4015                 run_bbp_write(sc, 196, 0x1a);
4016         }
4017
4018         if (sc->mac_ver == 0x3593) {
4019                 run_read(sc, RT2860_GPIO_CTRL, &tmp);
4020                 tmp &= ~0x01010000;
4021                 if (group == 0)
4022                         tmp |= 0x00010000;
4023                 tmp = (tmp & ~0x00009090) | 0x00000090;
4024                 run_write(sc, RT2860_GPIO_CTRL, tmp);
4025         }
4026
4027         /* set initial AGC value */
4028         if (group == 0) {       /* 2GHz band */
4029                 if (sc->mac_ver >= 0x3070)
4030                         agc = 0x1c + sc->lna[0] * 2;
4031                 else
4032                         agc = 0x2e + sc->lna[0];
4033         } else {                /* 5GHz band */
4034                 if (sc->mac_ver == 0x5592)
4035                         agc = 0x24 + sc->lna[group] * 2;
4036                 else if (sc->mac_ver == 0x3572 || sc->mac_ver == 0x3593)
4037                         agc = 0x22 + (sc->lna[group] * 5) / 3;
4038                 else
4039                         agc = 0x32 + (sc->lna[group] * 5) / 3;
4040         }
4041         run_set_agc(sc, agc);
4042 }
4043
4044 static void
4045 run_rt2870_set_chan(struct run_softc *sc, u_int chan)
4046 {
4047         const struct rfprog *rfprog = rt2860_rf2850;
4048         uint32_t r2, r3, r4;
4049         int8_t txpow1, txpow2;
4050         int i;
4051
4052         /* find the settings for this channel (we know it exists) */
4053         for (i = 0; rfprog[i].chan != chan; i++);
4054
4055         r2 = rfprog[i].r2;
4056         if (sc->ntxchains == 1)
4057                 r2 |= 1 << 14;          /* 1T: disable Tx chain 2 */
4058         if (sc->nrxchains == 1)
4059                 r2 |= 1 << 17 | 1 << 6; /* 1R: disable Rx chains 2 & 3 */
4060         else if (sc->nrxchains == 2)
4061                 r2 |= 1 << 6;           /* 2R: disable Rx chain 3 */
4062
4063         /* use Tx power values from EEPROM */
4064         txpow1 = sc->txpow1[i];
4065         txpow2 = sc->txpow2[i];
4066
4067         /* Initialize RF R3 and R4. */
4068         r3 = rfprog[i].r3 & 0xffffc1ff;
4069         r4 = (rfprog[i].r4 & ~(0x001f87c0)) | (sc->freq << 15);
4070         if (chan > 14) {
4071                 if (txpow1 >= 0) {
4072                         txpow1 = (txpow1 > 0xf) ? (0xf) : (txpow1);
4073                         r3 |= (txpow1 << 10) | (1 << 9);
4074                 } else {
4075                         txpow1 += 7;
4076
4077                         /* txpow1 is not possible larger than 15. */
4078                         r3 |= (txpow1 << 10);
4079                 }
4080                 if (txpow2 >= 0) {
4081                         txpow2 = (txpow2 > 0xf) ? (0xf) : (txpow2);
4082                         r4 |= (txpow2 << 7) | (1 << 6);
4083                 } else {
4084                         txpow2 += 7;
4085                         r4 |= (txpow2 << 7);
4086                 }
4087         } else {
4088                 /* Set Tx0 power. */
4089                 r3 |= (txpow1 << 9);
4090
4091                 /* Set frequency offset and Tx1 power. */
4092                 r4 |= (txpow2 << 6);
4093         }
4094
4095         run_rt2870_rf_write(sc, rfprog[i].r1);
4096         run_rt2870_rf_write(sc, r2);
4097         run_rt2870_rf_write(sc, r3 & ~(1 << 2));
4098         run_rt2870_rf_write(sc, r4);
4099
4100         run_delay(sc, 10);
4101
4102         run_rt2870_rf_write(sc, rfprog[i].r1);
4103         run_rt2870_rf_write(sc, r2);
4104         run_rt2870_rf_write(sc, r3 | (1 << 2));
4105         run_rt2870_rf_write(sc, r4);
4106
4107         run_delay(sc, 10);
4108
4109         run_rt2870_rf_write(sc, rfprog[i].r1);
4110         run_rt2870_rf_write(sc, r2);
4111         run_rt2870_rf_write(sc, r3 & ~(1 << 2));
4112         run_rt2870_rf_write(sc, r4);
4113 }
4114
4115 static void
4116 run_rt3070_set_chan(struct run_softc *sc, u_int chan)
4117 {
4118         int8_t txpow1, txpow2;
4119         uint8_t rf;
4120         int i;
4121
4122         /* find the settings for this channel (we know it exists) */
4123         for (i = 0; rt2860_rf2850[i].chan != chan; i++);
4124
4125         /* use Tx power values from EEPROM */
4126         txpow1 = sc->txpow1[i];
4127         txpow2 = sc->txpow2[i];
4128
4129         run_rt3070_rf_write(sc, 2, rt3070_freqs[i].n);
4130
4131         /* RT3370/RT3390: RF R3 [7:4] is not reserved bits. */
4132         run_rt3070_rf_read(sc, 3, &rf);
4133         rf = (rf & ~0x0f) | rt3070_freqs[i].k;
4134         run_rt3070_rf_write(sc, 3, rf);
4135
4136         run_rt3070_rf_read(sc, 6, &rf);
4137         rf = (rf & ~0x03) | rt3070_freqs[i].r;
4138         run_rt3070_rf_write(sc, 6, rf);
4139
4140         /* set Tx0 power */
4141         run_rt3070_rf_read(sc, 12, &rf);
4142         rf = (rf & ~0x1f) | txpow1;
4143         run_rt3070_rf_write(sc, 12, rf);
4144
4145         /* set Tx1 power */
4146         run_rt3070_rf_read(sc, 13, &rf);
4147         rf = (rf & ~0x1f) | txpow2;
4148         run_rt3070_rf_write(sc, 13, rf);
4149
4150         run_rt3070_rf_read(sc, 1, &rf);
4151         rf &= ~0xfc;
4152         if (sc->ntxchains == 1)
4153                 rf |= 1 << 7 | 1 << 5;  /* 1T: disable Tx chains 2 & 3 */
4154         else if (sc->ntxchains == 2)
4155                 rf |= 1 << 7;           /* 2T: disable Tx chain 3 */
4156         if (sc->nrxchains == 1)
4157                 rf |= 1 << 6 | 1 << 4;  /* 1R: disable Rx chains 2 & 3 */
4158         else if (sc->nrxchains == 2)
4159                 rf |= 1 << 6;           /* 2R: disable Rx chain 3 */
4160         run_rt3070_rf_write(sc, 1, rf);
4161
4162         /* set RF offset */
4163         run_rt3070_rf_read(sc, 23, &rf);
4164         rf = (rf & ~0x7f) | sc->freq;
4165         run_rt3070_rf_write(sc, 23, rf);
4166
4167         /* program RF filter */
4168         run_rt3070_rf_read(sc, 24, &rf);        /* Tx */
4169         rf = (rf & ~0x3f) | sc->rf24_20mhz;
4170         run_rt3070_rf_write(sc, 24, rf);
4171         run_rt3070_rf_read(sc, 31, &rf);        /* Rx */
4172         rf = (rf & ~0x3f) | sc->rf24_20mhz;
4173         run_rt3070_rf_write(sc, 31, rf);
4174
4175         /* enable RF tuning */
4176         run_rt3070_rf_read(sc, 7, &rf);
4177         run_rt3070_rf_write(sc, 7, rf | 0x01);
4178 }
4179
4180 static void
4181 run_rt3572_set_chan(struct run_softc *sc, u_int chan)
4182 {
4183         int8_t txpow1, txpow2;
4184         uint32_t tmp;
4185         uint8_t rf;
4186         int i;
4187
4188         /* find the settings for this channel (we know it exists) */
4189         for (i = 0; rt2860_rf2850[i].chan != chan; i++);
4190
4191         /* use Tx power values from EEPROM */
4192         txpow1 = sc->txpow1[i];
4193         txpow2 = sc->txpow2[i];
4194
4195         if (chan <= 14) {
4196                 run_bbp_write(sc, 25, sc->bbp25);
4197                 run_bbp_write(sc, 26, sc->bbp26);
4198         } else {
4199                 /* enable IQ phase correction */
4200                 run_bbp_write(sc, 25, 0x09);
4201                 run_bbp_write(sc, 26, 0xff);
4202         }
4203
4204         run_rt3070_rf_write(sc, 2, rt3070_freqs[i].n);
4205         run_rt3070_rf_write(sc, 3, rt3070_freqs[i].k);
4206         run_rt3070_rf_read(sc, 6, &rf);
4207         rf  = (rf & ~0x0f) | rt3070_freqs[i].r;
4208         rf |= (chan <= 14) ? 0x08 : 0x04;
4209         run_rt3070_rf_write(sc, 6, rf);
4210
4211         /* set PLL mode */
4212         run_rt3070_rf_read(sc, 5, &rf);
4213         rf &= ~(0x08 | 0x04);
4214         rf |= (chan <= 14) ? 0x04 : 0x08;
4215         run_rt3070_rf_write(sc, 5, rf);
4216
4217         /* set Tx power for chain 0 */
4218         if (chan <= 14)
4219                 rf = 0x60 | txpow1;
4220         else
4221                 rf = 0xe0 | (txpow1 & 0xc) << 1 | (txpow1 & 0x3);
4222         run_rt3070_rf_write(sc, 12, rf);
4223
4224         /* set Tx power for chain 1 */
4225         if (chan <= 14)
4226                 rf = 0x60 | txpow2;
4227         else
4228                 rf = 0xe0 | (txpow2 & 0xc) << 1 | (txpow2 & 0x3);
4229         run_rt3070_rf_write(sc, 13, rf);
4230
4231         /* set Tx/Rx streams */
4232         run_rt3070_rf_read(sc, 1, &rf);
4233         rf &= ~0xfc;
4234         if (sc->ntxchains == 1)
4235                 rf |= 1 << 7 | 1 << 5;  /* 1T: disable Tx chains 2 & 3 */
4236         else if (sc->ntxchains == 2)
4237                 rf |= 1 << 7;           /* 2T: disable Tx chain 3 */
4238         if (sc->nrxchains == 1)
4239                 rf |= 1 << 6 | 1 << 4;  /* 1R: disable Rx chains 2 & 3 */
4240         else if (sc->nrxchains == 2)
4241                 rf |= 1 << 6;           /* 2R: disable Rx chain 3 */
4242         run_rt3070_rf_write(sc, 1, rf);
4243
4244         /* set RF offset */
4245         run_rt3070_rf_read(sc, 23, &rf);
4246         rf = (rf & ~0x7f) | sc->freq;
4247         run_rt3070_rf_write(sc, 23, rf);
4248
4249         /* program RF filter */
4250         rf = sc->rf24_20mhz;
4251         run_rt3070_rf_write(sc, 24, rf);        /* Tx */
4252         run_rt3070_rf_write(sc, 31, rf);        /* Rx */
4253
4254         /* enable RF tuning */
4255         run_rt3070_rf_read(sc, 7, &rf);
4256         rf = (chan <= 14) ? 0xd8 : ((rf & ~0xc8) | 0x14);
4257         run_rt3070_rf_write(sc, 7, rf);
4258
4259         /* TSSI */
4260         rf = (chan <= 14) ? 0xc3 : 0xc0;
4261         run_rt3070_rf_write(sc, 9, rf);
4262
4263         /* set loop filter 1 */
4264         run_rt3070_rf_write(sc, 10, 0xf1);
4265         /* set loop filter 2 */
4266         run_rt3070_rf_write(sc, 11, (chan <= 14) ? 0xb9 : 0x00);
4267
4268         /* set tx_mx2_ic */
4269         run_rt3070_rf_write(sc, 15, (chan <= 14) ? 0x53 : 0x43);
4270         /* set tx_mx1_ic */
4271         if (chan <= 14)
4272                 rf = 0x48 | sc->txmixgain_2ghz;
4273         else
4274                 rf = 0x78 | sc->txmixgain_5ghz;
4275         run_rt3070_rf_write(sc, 16, rf);
4276
4277         /* set tx_lo1 */
4278         run_rt3070_rf_write(sc, 17, 0x23);
4279         /* set tx_lo2 */
4280         if (chan <= 14)
4281                 rf = 0x93;
4282         else if (chan <= 64)
4283                 rf = 0xb7;
4284         else if (chan <= 128)
4285                 rf = 0x74;
4286         else
4287                 rf = 0x72;
4288         run_rt3070_rf_write(sc, 19, rf);
4289
4290         /* set rx_lo1 */
4291         if (chan <= 14)
4292                 rf = 0xb3;
4293         else if (chan <= 64)
4294                 rf = 0xf6;
4295         else if (chan <= 128)
4296                 rf = 0xf4;
4297         else
4298                 rf = 0xf3;
4299         run_rt3070_rf_write(sc, 20, rf);
4300
4301         /* set pfd_delay */
4302         if (chan <= 14)
4303                 rf = 0x15;
4304         else if (chan <= 64)
4305                 rf = 0x3d;
4306         else
4307                 rf = 0x01;
4308         run_rt3070_rf_write(sc, 25, rf);
4309
4310         /* set rx_lo2 */
4311         run_rt3070_rf_write(sc, 26, (chan <= 14) ? 0x85 : 0x87);
4312         /* set ldo_rf_vc */
4313         run_rt3070_rf_write(sc, 27, (chan <= 14) ? 0x00 : 0x01);
4314         /* set drv_cc */
4315         run_rt3070_rf_write(sc, 29, (chan <= 14) ? 0x9b : 0x9f);
4316
4317         run_read(sc, RT2860_GPIO_CTRL, &tmp);
4318         tmp &= ~0x8080;
4319         if (chan <= 14)
4320                 tmp |= 0x80;
4321         run_write(sc, RT2860_GPIO_CTRL, tmp);
4322
4323         /* enable RF tuning */
4324         run_rt3070_rf_read(sc, 7, &rf);
4325         run_rt3070_rf_write(sc, 7, rf | 0x01);
4326
4327         run_delay(sc, 2);
4328 }
4329
4330 static void
4331 run_rt3593_set_chan(struct run_softc *sc, u_int chan)
4332 {
4333         int8_t txpow1, txpow2, txpow3;
4334         uint8_t h20mhz, rf;
4335         int i;
4336
4337         /* find the settings for this channel (we know it exists) */
4338         for (i = 0; rt2860_rf2850[i].chan != chan; i++);
4339
4340         /* use Tx power values from EEPROM */
4341         txpow1 = sc->txpow1[i];
4342         txpow2 = sc->txpow2[i];
4343         txpow3 = (sc->ntxchains == 3) ? sc->txpow3[i] : 0;
4344
4345         if (chan <= 14) {
4346                 run_bbp_write(sc, 25, sc->bbp25);
4347                 run_bbp_write(sc, 26, sc->bbp26);
4348         } else {
4349                 /* Enable IQ phase correction. */
4350                 run_bbp_write(sc, 25, 0x09);
4351                 run_bbp_write(sc, 26, 0xff);
4352         }
4353
4354         run_rt3070_rf_write(sc, 8, rt3070_freqs[i].n);
4355         run_rt3070_rf_write(sc, 9, rt3070_freqs[i].k & 0x0f);
4356         run_rt3070_rf_read(sc, 11, &rf);
4357         rf = (rf & ~0x03) | (rt3070_freqs[i].r & 0x03);
4358         run_rt3070_rf_write(sc, 11, rf);
4359
4360         /* Set pll_idoh. */
4361         run_rt3070_rf_read(sc, 11, &rf);
4362         rf &= ~0x4c;
4363         rf |= (chan <= 14) ? 0x44 : 0x48;
4364         run_rt3070_rf_write(sc, 11, rf);
4365
4366         if (chan <= 14)
4367                 rf = txpow1 & 0x1f;
4368         else
4369                 rf = 0x40 | ((txpow1 & 0x18) << 1) | (txpow1 & 0x07);
4370         run_rt3070_rf_write(sc, 53, rf);
4371
4372         if (chan <= 14)
4373                 rf = txpow2 & 0x1f;
4374         else
4375                 rf = 0x40 | ((txpow2 & 0x18) << 1) | (txpow2 & 0x07);
4376         run_rt3070_rf_write(sc, 55, rf);
4377
4378         if (chan <= 14)
4379                 rf = txpow3 & 0x1f;
4380         else
4381                 rf = 0x40 | ((txpow3 & 0x18) << 1) | (txpow3 & 0x07);
4382         run_rt3070_rf_write(sc, 54, rf);
4383
4384         rf = RT3070_RF_BLOCK | RT3070_PLL_PD;
4385         if (sc->ntxchains == 3)
4386                 rf |= RT3070_TX0_PD | RT3070_TX1_PD | RT3070_TX2_PD;
4387         else
4388                 rf |= RT3070_TX0_PD | RT3070_TX1_PD;
4389         rf |= RT3070_RX0_PD | RT3070_RX1_PD | RT3070_RX2_PD;
4390         run_rt3070_rf_write(sc, 1, rf);
4391
4392         run_adjust_freq_offset(sc);
4393
4394         run_rt3070_rf_write(sc, 31, (chan <= 14) ? 0xa0 : 0x80);
4395
4396         h20mhz = (sc->rf24_20mhz & 0x20) >> 5; 
4397         run_rt3070_rf_read(sc, 30, &rf);
4398         rf = (rf & ~0x06) | (h20mhz << 1) | (h20mhz << 2);
4399         run_rt3070_rf_write(sc, 30, rf);
4400
4401         run_rt3070_rf_read(sc, 36, &rf);
4402         if (chan <= 14)
4403                 rf |= 0x80;
4404         else
4405                 rf &= ~0x80;
4406         run_rt3070_rf_write(sc, 36, rf);
4407
4408         /* Set vcolo_bs. */
4409         run_rt3070_rf_write(sc, 34, (chan <= 14) ? 0x3c : 0x20);
4410         /* Set pfd_delay. */
4411         run_rt3070_rf_write(sc, 12, (chan <= 14) ? 0x1a : 0x12);
4412
4413         /* Set vco bias current control. */
4414         run_rt3070_rf_read(sc, 6, &rf);
4415         rf &= ~0xc0;
4416         if (chan <= 14)
4417                 rf |= 0x40;
4418         else if (chan <= 128)
4419                 rf |= 0x80;
4420         else
4421                 rf |= 0x40;
4422         run_rt3070_rf_write(sc, 6, rf);
4423
4424         run_rt3070_rf_read(sc, 30, &rf);
4425         rf = (rf & ~0x18) | 0x10;
4426         run_rt3070_rf_write(sc, 30, rf);
4427
4428         run_rt3070_rf_write(sc, 10, (chan <= 14) ? 0xd3 : 0xd8);
4429         run_rt3070_rf_write(sc, 13, (chan <= 14) ? 0x12 : 0x23);
4430
4431         run_rt3070_rf_read(sc, 51, &rf);
4432         rf = (rf & ~0x03) | 0x01;
4433         run_rt3070_rf_write(sc, 51, rf);
4434         /* Set tx_mx1_cc. */
4435         run_rt3070_rf_read(sc, 51, &rf);
4436         rf &= ~0x1c;
4437         rf |= (chan <= 14) ? 0x14 : 0x10;
4438         run_rt3070_rf_write(sc, 51, rf);
4439         /* Set tx_mx1_ic. */
4440         run_rt3070_rf_read(sc, 51, &rf);
4441         rf &= ~0xe0;
4442         rf |= (chan <= 14) ? 0x60 : 0x40;
4443         run_rt3070_rf_write(sc, 51, rf);
4444         /* Set tx_lo1_ic. */
4445         run_rt3070_rf_read(sc, 49, &rf);
4446         rf &= ~0x1c;
4447         rf |= (chan <= 14) ? 0x0c : 0x08;
4448         run_rt3070_rf_write(sc, 49, rf);
4449         /* Set tx_lo1_en. */
4450         run_rt3070_rf_read(sc, 50, &rf);
4451         run_rt3070_rf_write(sc, 50, rf & ~0x20);
4452         /* Set drv_cc. */
4453         run_rt3070_rf_read(sc, 57, &rf);
4454         rf &= ~0xfc;
4455         rf |= (chan <= 14) ?  0x6c : 0x3c;
4456         run_rt3070_rf_write(sc, 57, rf);
4457         /* Set rx_mix1_ic, rxa_lnactr, lna_vc, lna_inbias_en and lna_en. */
4458         run_rt3070_rf_write(sc, 44, (chan <= 14) ? 0x93 : 0x9b);
4459         /* Set drv_gnd_a, tx_vga_cc_a and tx_mx2_gain. */
4460         run_rt3070_rf_write(sc, 52, (chan <= 14) ? 0x45 : 0x05);
4461         /* Enable VCO calibration. */
4462         run_rt3070_rf_read(sc, 3, &rf);
4463         rf &= ~RT5390_VCOCAL;
4464         rf |= (chan <= 14) ? RT5390_VCOCAL : 0xbe;
4465         run_rt3070_rf_write(sc, 3, rf);
4466
4467         if (chan <= 14)
4468                 rf = 0x23;
4469         else if (chan <= 64)
4470                 rf = 0x36;
4471         else if (chan <= 128)
4472                 rf = 0x32;
4473         else
4474                 rf = 0x30;
4475         run_rt3070_rf_write(sc, 39, rf);
4476         if (chan <= 14)
4477                 rf = 0xbb;
4478         else if (chan <= 64)
4479                 rf = 0xeb;
4480         else if (chan <= 128)
4481                 rf = 0xb3;
4482         else
4483                 rf = 0x9b;
4484         run_rt3070_rf_write(sc, 45, rf);
4485
4486         /* Set FEQ/AEQ control. */
4487         run_bbp_write(sc, 105, 0x34);
4488 }
4489
4490 static void
4491 run_rt5390_set_chan(struct run_softc *sc, u_int chan)
4492 {
4493         int8_t txpow1, txpow2;
4494         uint8_t rf;
4495         int i;
4496
4497         /* find the settings for this channel (we know it exists) */
4498         for (i = 0; rt2860_rf2850[i].chan != chan; i++);
4499
4500         /* use Tx power values from EEPROM */
4501         txpow1 = sc->txpow1[i];
4502         txpow2 = sc->txpow2[i];
4503
4504         run_rt3070_rf_write(sc, 8, rt3070_freqs[i].n);
4505         run_rt3070_rf_write(sc, 9, rt3070_freqs[i].k & 0x0f);
4506         run_rt3070_rf_read(sc, 11, &rf);
4507         rf = (rf & ~0x03) | (rt3070_freqs[i].r & 0x03);
4508         run_rt3070_rf_write(sc, 11, rf);
4509
4510         run_rt3070_rf_read(sc, 49, &rf);
4511         rf = (rf & ~0x3f) | (txpow1 & 0x3f);
4512         /* The valid range of the RF R49 is 0x00 to 0x27. */
4513         if ((rf & 0x3f) > 0x27)
4514                 rf = (rf & ~0x3f) | 0x27;
4515         run_rt3070_rf_write(sc, 49, rf);
4516
4517         if (sc->mac_ver == 0x5392) {
4518                 run_rt3070_rf_read(sc, 50, &rf);
4519                 rf = (rf & ~0x3f) | (txpow2 & 0x3f);
4520                 /* The valid range of the RF R50 is 0x00 to 0x27. */
4521                 if ((rf & 0x3f) > 0x27)
4522                         rf = (rf & ~0x3f) | 0x27;
4523                 run_rt3070_rf_write(sc, 50, rf);
4524         }
4525
4526         run_rt3070_rf_read(sc, 1, &rf);
4527         rf |= RT3070_RF_BLOCK | RT3070_PLL_PD | RT3070_RX0_PD | RT3070_TX0_PD;
4528         if (sc->mac_ver == 0x5392)
4529                 rf |= RT3070_RX1_PD | RT3070_TX1_PD;
4530         run_rt3070_rf_write(sc, 1, rf);
4531
4532         if (sc->mac_ver != 0x5392) {
4533                 run_rt3070_rf_read(sc, 2, &rf);
4534                 rf |= 0x80;
4535                 run_rt3070_rf_write(sc, 2, rf);
4536                 run_delay(sc, 10);
4537                 rf &= 0x7f;
4538                 run_rt3070_rf_write(sc, 2, rf);
4539         }
4540
4541         run_adjust_freq_offset(sc);
4542
4543         if (sc->mac_ver == 0x5392) {
4544                 /* Fix for RT5392C. */
4545                 if (sc->mac_rev >= 0x0223) {
4546                         if (chan <= 4)
4547                                 rf = 0x0f;
4548                         else if (chan >= 5 && chan <= 7)
4549                                 rf = 0x0e;
4550                         else
4551                                 rf = 0x0d;
4552                         run_rt3070_rf_write(sc, 23, rf);
4553
4554                         if (chan <= 4)
4555                                 rf = 0x0c;
4556                         else if (chan == 5)
4557                                 rf = 0x0b;
4558                         else if (chan >= 6 && chan <= 7)
4559                                 rf = 0x0a;
4560                         else if (chan >= 8 && chan <= 10)
4561                                 rf = 0x09;
4562                         else
4563                                 rf = 0x08;
4564                         run_rt3070_rf_write(sc, 59, rf);
4565                 } else {
4566                         if (chan <= 11)
4567                                 rf = 0x0f;
4568                         else
4569                                 rf = 0x0b;
4570                         run_rt3070_rf_write(sc, 59, rf);
4571                 }
4572         } else {
4573                 /* Fix for RT5390F. */
4574                 if (sc->mac_rev >= 0x0502) {
4575                         if (chan <= 11)
4576                                 rf = 0x43;
4577                         else
4578                                 rf = 0x23;
4579                         run_rt3070_rf_write(sc, 55, rf);
4580
4581                         if (chan <= 11)
4582                                 rf = 0x0f;
4583                         else if (chan == 12)
4584                                 rf = 0x0d;
4585                         else
4586                                 rf = 0x0b;
4587                         run_rt3070_rf_write(sc, 59, rf);
4588                 } else {
4589                         run_rt3070_rf_write(sc, 55, 0x44);
4590                         run_rt3070_rf_write(sc, 59, 0x8f);
4591                 }
4592         }
4593
4594         /* Enable VCO calibration. */
4595         run_rt3070_rf_read(sc, 3, &rf);
4596         rf |= RT5390_VCOCAL;
4597         run_rt3070_rf_write(sc, 3, rf);
4598 }
4599
4600 static void
4601 run_rt5592_set_chan(struct run_softc *sc, u_int chan)
4602 {
4603         const struct rt5592_freqs *freqs;
4604         uint32_t tmp;
4605         uint8_t reg, rf, txpow_bound;
4606         int8_t txpow1, txpow2;
4607         int i;
4608
4609         run_read(sc, RT5592_DEBUG_INDEX, &tmp);
4610         freqs = (tmp & RT5592_SEL_XTAL) ?
4611             rt5592_freqs_40mhz : rt5592_freqs_20mhz;
4612
4613         /* find the settings for this channel (we know it exists) */
4614         for (i = 0; rt2860_rf2850[i].chan != chan; i++, freqs++);
4615
4616         /* use Tx power values from EEPROM */
4617         txpow1 = sc->txpow1[i];
4618         txpow2 = sc->txpow2[i];
4619
4620         run_read(sc, RT3070_LDO_CFG0, &tmp);
4621         tmp &= ~0x1c000000;
4622         if (chan > 14)
4623                 tmp |= 0x14000000;
4624         run_write(sc, RT3070_LDO_CFG0, tmp);
4625
4626         /* N setting. */
4627         run_rt3070_rf_write(sc, 8, freqs->n & 0xff);
4628         run_rt3070_rf_read(sc, 9, &rf);
4629         rf &= ~(1 << 4);
4630         rf |= ((freqs->n & 0x0100) >> 8) << 4;
4631         run_rt3070_rf_write(sc, 9, rf);
4632
4633         /* K setting. */
4634         run_rt3070_rf_read(sc, 9, &rf);
4635         rf &= ~0x0f;
4636         rf |= (freqs->k & 0x0f);
4637         run_rt3070_rf_write(sc, 9, rf);
4638
4639         /* Mode setting. */
4640         run_rt3070_rf_read(sc, 11, &rf);
4641         rf &= ~0x0c;
4642         rf |= ((freqs->m - 0x8) & 0x3) << 2;
4643         run_rt3070_rf_write(sc, 11, rf);
4644         run_rt3070_rf_read(sc, 9, &rf);
4645         rf &= ~(1 << 7);
4646         rf |= (((freqs->m - 0x8) & 0x4) >> 2) << 7;
4647         run_rt3070_rf_write(sc, 9, rf);
4648
4649         /* R setting. */
4650         run_rt3070_rf_read(sc, 11, &rf);
4651         rf &= ~0x03;
4652         rf |= (freqs->r - 0x1);
4653         run_rt3070_rf_write(sc, 11, rf);
4654
4655         if (chan <= 14) {
4656                 /* Initialize RF registers for 2GHZ. */
4657                 for (i = 0; i < nitems(rt5592_2ghz_def_rf); i++) {
4658                         run_rt3070_rf_write(sc, rt5592_2ghz_def_rf[i].reg,
4659                             rt5592_2ghz_def_rf[i].val);
4660                 }
4661
4662                 rf = (chan <= 10) ? 0x07 : 0x06;
4663                 run_rt3070_rf_write(sc, 23, rf);
4664                 run_rt3070_rf_write(sc, 59, rf);
4665
4666                 run_rt3070_rf_write(sc, 55, 0x43);
4667
4668                 /* 
4669                  * RF R49/R50 Tx power ALC code.
4670                  * G-band bit<7:6>=1:0, bit<5:0> range from 0x0 ~ 0x27.
4671                  */
4672                 reg = 2;
4673                 txpow_bound = 0x27;
4674         } else {
4675                 /* Initialize RF registers for 5GHZ. */
4676                 for (i = 0; i < nitems(rt5592_5ghz_def_rf); i++) {
4677                         run_rt3070_rf_write(sc, rt5592_5ghz_def_rf[i].reg,
4678                             rt5592_5ghz_def_rf[i].val);
4679                 }
4680                 for (i = 0; i < nitems(rt5592_chan_5ghz); i++) {
4681                         if (chan >= rt5592_chan_5ghz[i].firstchan &&
4682                             chan <= rt5592_chan_5ghz[i].lastchan) {
4683                                 run_rt3070_rf_write(sc, rt5592_chan_5ghz[i].reg,
4684                                     rt5592_chan_5ghz[i].val);
4685                         }
4686                 }
4687
4688                 /* 
4689                  * RF R49/R50 Tx power ALC code.
4690                  * A-band bit<7:6>=1:1, bit<5:0> range from 0x0 ~ 0x2b.
4691                  */
4692                 reg = 3;
4693                 txpow_bound = 0x2b;
4694         }
4695
4696         /* RF R49 ch0 Tx power ALC code. */
4697         run_rt3070_rf_read(sc, 49, &rf);
4698         rf &= ~0xc0;
4699         rf |= (reg << 6);
4700         rf = (rf & ~0x3f) | (txpow1 & 0x3f);
4701         if ((rf & 0x3f) > txpow_bound)
4702                 rf = (rf & ~0x3f) | txpow_bound;
4703         run_rt3070_rf_write(sc, 49, rf);
4704
4705         /* RF R50 ch1 Tx power ALC code. */
4706         run_rt3070_rf_read(sc, 50, &rf);
4707         rf &= ~(1 << 7 | 1 << 6);
4708         rf |= (reg << 6);
4709         rf = (rf & ~0x3f) | (txpow2 & 0x3f);
4710         if ((rf & 0x3f) > txpow_bound)
4711                 rf = (rf & ~0x3f) | txpow_bound;
4712         run_rt3070_rf_write(sc, 50, rf);
4713
4714         /* Enable RF_BLOCK, PLL_PD, RX0_PD, and TX0_PD. */
4715         run_rt3070_rf_read(sc, 1, &rf);
4716         rf |= (RT3070_RF_BLOCK | RT3070_PLL_PD | RT3070_RX0_PD | RT3070_TX0_PD);
4717         if (sc->ntxchains > 1)
4718                 rf |= RT3070_TX1_PD;
4719         if (sc->nrxchains > 1)
4720                 rf |= RT3070_RX1_PD;
4721         run_rt3070_rf_write(sc, 1, rf);
4722
4723         run_rt3070_rf_write(sc, 6, 0xe4);
4724
4725         run_rt3070_rf_write(sc, 30, 0x10);
4726         run_rt3070_rf_write(sc, 31, 0x80);
4727         run_rt3070_rf_write(sc, 32, 0x80);
4728
4729         run_adjust_freq_offset(sc);
4730
4731         /* Enable VCO calibration. */
4732         run_rt3070_rf_read(sc, 3, &rf);
4733         rf |= RT5390_VCOCAL;
4734         run_rt3070_rf_write(sc, 3, rf);
4735 }
4736
4737 static void
4738 run_set_rx_antenna(struct run_softc *sc, int aux)
4739 {
4740         uint32_t tmp;
4741         uint8_t bbp152;
4742
4743         if (aux) {
4744                 if (sc->rf_rev == RT5390_RF_5370) {
4745                         run_bbp_read(sc, 152, &bbp152);
4746                         run_bbp_write(sc, 152, bbp152 & ~0x80);
4747                 } else {
4748                         run_mcu_cmd(sc, RT2860_MCU_CMD_ANTSEL, 0);
4749                         run_read(sc, RT2860_GPIO_CTRL, &tmp);
4750                         run_write(sc, RT2860_GPIO_CTRL, (tmp & ~0x0808) | 0x08);
4751                 }
4752         } else {
4753                 if (sc->rf_rev == RT5390_RF_5370) {
4754                         run_bbp_read(sc, 152, &bbp152);
4755                         run_bbp_write(sc, 152, bbp152 | 0x80);
4756                 } else {
4757                         run_mcu_cmd(sc, RT2860_MCU_CMD_ANTSEL, 1);
4758                         run_read(sc, RT2860_GPIO_CTRL, &tmp);
4759                         run_write(sc, RT2860_GPIO_CTRL, tmp & ~0x0808);
4760                 }
4761         }
4762 }
4763
4764 static int
4765 run_set_chan(struct run_softc *sc, struct ieee80211_channel *c)
4766 {
4767         struct ieee80211com *ic = &sc->sc_ic;
4768         u_int chan, group;
4769
4770         chan = ieee80211_chan2ieee(ic, c);
4771         if (chan == 0 || chan == IEEE80211_CHAN_ANY)
4772                 return (EINVAL);
4773
4774         if (sc->mac_ver == 0x5592)
4775                 run_rt5592_set_chan(sc, chan);
4776         else if (sc->mac_ver >= 0x5390)
4777                 run_rt5390_set_chan(sc, chan);
4778         else if (sc->mac_ver == 0x3593)
4779                 run_rt3593_set_chan(sc, chan);
4780         else if (sc->mac_ver == 0x3572)
4781                 run_rt3572_set_chan(sc, chan);
4782         else if (sc->mac_ver >= 0x3070)
4783                 run_rt3070_set_chan(sc, chan);
4784         else
4785                 run_rt2870_set_chan(sc, chan);
4786
4787         /* determine channel group */
4788         if (chan <= 14)
4789                 group = 0;
4790         else if (chan <= 64)
4791                 group = 1;
4792         else if (chan <= 128)
4793                 group = 2;
4794         else
4795                 group = 3;
4796
4797         /* XXX necessary only when group has changed! */
4798         run_select_chan_group(sc, group);
4799
4800         run_delay(sc, 10);
4801
4802         /* Perform IQ calibration. */
4803         if (sc->mac_ver >= 0x5392)
4804                 run_iq_calib(sc, chan);
4805
4806         return (0);
4807 }
4808
4809 static void
4810 run_set_channel(struct ieee80211com *ic)
4811 {
4812         struct run_softc *sc = ic->ic_softc;
4813
4814         RUN_LOCK(sc);
4815         run_set_chan(sc, ic->ic_curchan);
4816         RUN_UNLOCK(sc);
4817
4818         return;
4819 }
4820
4821 static void
4822 run_scan_start(struct ieee80211com *ic)
4823 {
4824         struct run_softc *sc = ic->ic_softc;
4825         uint32_t tmp;
4826
4827         RUN_LOCK(sc);
4828
4829         /* abort TSF synchronization */
4830         run_read(sc, RT2860_BCN_TIME_CFG, &tmp);
4831         run_write(sc, RT2860_BCN_TIME_CFG,
4832             tmp & ~(RT2860_BCN_TX_EN | RT2860_TSF_TIMER_EN |
4833             RT2860_TBTT_TIMER_EN));
4834         run_set_bssid(sc, ieee80211broadcastaddr);
4835
4836         RUN_UNLOCK(sc);
4837
4838         return;
4839 }
4840
4841 static void
4842 run_scan_end(struct ieee80211com *ic)
4843 {
4844         struct run_softc *sc = ic->ic_softc;
4845
4846         RUN_LOCK(sc);
4847
4848         run_enable_tsf_sync(sc);
4849         run_set_bssid(sc, sc->sc_bssid);
4850
4851         RUN_UNLOCK(sc);
4852
4853         return;
4854 }
4855
4856 /*
4857  * Could be called from ieee80211_node_timeout()
4858  * (non-sleepable thread)
4859  */
4860 static void
4861 run_update_beacon(struct ieee80211vap *vap, int item)
4862 {
4863         struct ieee80211com *ic = vap->iv_ic;
4864         struct ieee80211_beacon_offsets *bo = &vap->iv_bcn_off;
4865         struct ieee80211_node *ni = vap->iv_bss;
4866         struct run_softc *sc = ic->ic_softc;
4867         struct run_vap *rvp = RUN_VAP(vap);
4868         int mcast = 0;
4869         uint32_t i;
4870
4871         switch (item) {
4872         case IEEE80211_BEACON_ERP:
4873                 run_updateslot(ic);
4874                 break;
4875         case IEEE80211_BEACON_HTINFO:
4876                 run_updateprot(ic);
4877                 break;
4878         case IEEE80211_BEACON_TIM:
4879                 mcast = 1;      /*TODO*/
4880                 break;
4881         default:
4882                 break;
4883         }
4884
4885         setbit(bo->bo_flags, item);
4886         if (rvp->beacon_mbuf == NULL) {
4887                 rvp->beacon_mbuf = ieee80211_beacon_alloc(ni);
4888                 if (rvp->beacon_mbuf == NULL)
4889                         return;
4890         }
4891         ieee80211_beacon_update(ni, rvp->beacon_mbuf, mcast);
4892
4893         i = RUN_CMDQ_GET(&sc->cmdq_store);
4894         DPRINTF("cmdq_store=%d\n", i);
4895         sc->cmdq[i].func = run_update_beacon_cb;
4896         sc->cmdq[i].arg0 = vap;
4897         ieee80211_runtask(ic, &sc->cmdq_task);
4898
4899         return;
4900 }
4901
4902 static void
4903 run_update_beacon_cb(void *arg)
4904 {
4905         struct ieee80211vap *vap = arg;
4906         struct ieee80211_node *ni = vap->iv_bss;
4907         struct run_vap *rvp = RUN_VAP(vap);
4908         struct ieee80211com *ic = vap->iv_ic;
4909         struct run_softc *sc = ic->ic_softc;
4910         struct rt2860_txwi txwi;
4911         struct mbuf *m;
4912         uint16_t txwisize;
4913         uint8_t ridx;
4914
4915         if (ni->ni_chan == IEEE80211_CHAN_ANYC)
4916                 return;
4917         if (ic->ic_bsschan == IEEE80211_CHAN_ANYC)
4918                 return;
4919
4920         /*
4921          * No need to call ieee80211_beacon_update(), run_update_beacon()
4922          * is taking care of appropriate calls.
4923          */
4924         if (rvp->beacon_mbuf == NULL) {
4925                 rvp->beacon_mbuf = ieee80211_beacon_alloc(ni);
4926                 if (rvp->beacon_mbuf == NULL)
4927                         return;
4928         }
4929         m = rvp->beacon_mbuf;
4930
4931         memset(&txwi, 0, sizeof(txwi));
4932         txwi.wcid = 0xff;
4933         txwi.len = htole16(m->m_pkthdr.len);
4934
4935         /* send beacons at the lowest available rate */
4936         ridx = (ic->ic_curmode == IEEE80211_MODE_11A) ?
4937             RT2860_RIDX_OFDM6 : RT2860_RIDX_CCK1;
4938         txwi.phy = htole16(rt2860_rates[ridx].mcs);
4939         if (rt2860_rates[ridx].phy == IEEE80211_T_OFDM)
4940                 txwi.phy |= htole16(RT2860_PHY_OFDM);
4941         txwi.txop = RT2860_TX_TXOP_HT;
4942         txwi.flags = RT2860_TX_TS;
4943         txwi.xflags = RT2860_TX_NSEQ;
4944
4945         txwisize = (sc->mac_ver == 0x5592) ?
4946             sizeof(txwi) + sizeof(uint32_t) : sizeof(txwi);
4947         run_write_region_1(sc, RT2860_BCN_BASE(rvp->rvp_id), (uint8_t *)&txwi,
4948             txwisize);
4949         run_write_region_1(sc, RT2860_BCN_BASE(rvp->rvp_id) + txwisize,
4950             mtod(m, uint8_t *), (m->m_pkthdr.len + 1) & ~1);
4951 }
4952
4953 static void
4954 run_updateprot(struct ieee80211com *ic)
4955 {
4956         struct run_softc *sc = ic->ic_softc;
4957         uint32_t i;
4958
4959         i = RUN_CMDQ_GET(&sc->cmdq_store);
4960         DPRINTF("cmdq_store=%d\n", i);
4961         sc->cmdq[i].func = run_updateprot_cb;
4962         sc->cmdq[i].arg0 = ic;
4963         ieee80211_runtask(ic, &sc->cmdq_task);
4964 }
4965
4966 static void
4967 run_updateprot_cb(void *arg)
4968 {
4969         struct ieee80211com *ic = arg;
4970         struct run_softc *sc = ic->ic_softc;
4971         uint32_t tmp;
4972
4973         tmp = RT2860_RTSTH_EN | RT2860_PROT_NAV_SHORT | RT2860_TXOP_ALLOW_ALL;
4974         /* setup protection frame rate (MCS code) */
4975         tmp |= (ic->ic_curmode == IEEE80211_MODE_11A) ?
4976             rt2860_rates[RT2860_RIDX_OFDM6].mcs | RT2860_PHY_OFDM :
4977             rt2860_rates[RT2860_RIDX_CCK11].mcs;
4978
4979         /* CCK frames don't require protection */
4980         run_write(sc, RT2860_CCK_PROT_CFG, tmp);
4981         if (ic->ic_flags & IEEE80211_F_USEPROT) {
4982                 if (ic->ic_protmode == IEEE80211_PROT_RTSCTS)
4983                         tmp |= RT2860_PROT_CTRL_RTS_CTS;
4984                 else if (ic->ic_protmode == IEEE80211_PROT_CTSONLY)
4985                         tmp |= RT2860_PROT_CTRL_CTS;
4986         }
4987         run_write(sc, RT2860_OFDM_PROT_CFG, tmp);
4988 }
4989
4990 static void
4991 run_usb_timeout_cb(void *arg)
4992 {
4993         struct ieee80211vap *vap = arg;
4994         struct run_softc *sc = vap->iv_ic->ic_softc;
4995
4996         RUN_LOCK_ASSERT(sc, MA_OWNED);
4997
4998         if(vap->iv_state == IEEE80211_S_RUN &&
4999             vap->iv_opmode != IEEE80211_M_STA)
5000                 run_reset_livelock(sc);
5001         else if (vap->iv_state == IEEE80211_S_SCAN) {
5002                 DPRINTF("timeout caused by scan\n");
5003                 /* cancel bgscan */
5004                 ieee80211_cancel_scan(vap);
5005         } else
5006                 DPRINTF("timeout by unknown cause\n");
5007 }
5008
5009 static void
5010 run_reset_livelock(struct run_softc *sc)
5011 {
5012         uint32_t tmp;
5013
5014         RUN_LOCK_ASSERT(sc, MA_OWNED);
5015
5016         /*
5017          * In IBSS or HostAP modes (when the hardware sends beacons), the MAC
5018          * can run into a livelock and start sending CTS-to-self frames like
5019          * crazy if protection is enabled.  Reset MAC/BBP for a while
5020          */
5021         run_read(sc, RT2860_DEBUG, &tmp);
5022         DPRINTFN(3, "debug reg %08x\n", tmp);
5023         if ((tmp & (1 << 29)) && (tmp & (1 << 7 | 1 << 5))) {
5024                 DPRINTF("CTS-to-self livelock detected\n");
5025                 run_write(sc, RT2860_MAC_SYS_CTRL, RT2860_MAC_SRST);
5026                 run_delay(sc, 1);
5027                 run_write(sc, RT2860_MAC_SYS_CTRL,
5028                     RT2860_MAC_RX_EN | RT2860_MAC_TX_EN);
5029         }
5030 }
5031
5032 static void
5033 run_update_promisc_locked(struct run_softc *sc)
5034 {
5035         uint32_t tmp;
5036
5037         run_read(sc, RT2860_RX_FILTR_CFG, &tmp);
5038
5039         tmp |= RT2860_DROP_UC_NOME;
5040         if (sc->sc_ic.ic_promisc > 0)
5041                 tmp &= ~RT2860_DROP_UC_NOME;
5042
5043         run_write(sc, RT2860_RX_FILTR_CFG, tmp);
5044
5045         DPRINTF("%s promiscuous mode\n", (sc->sc_ic.ic_promisc > 0) ?
5046             "entering" : "leaving");
5047 }
5048
5049 static void
5050 run_update_promisc(struct ieee80211com *ic)
5051 {
5052         struct run_softc *sc = ic->ic_softc;
5053
5054         if ((sc->sc_flags & RUN_RUNNING) == 0)
5055                 return;
5056
5057         RUN_LOCK(sc);
5058         run_update_promisc_locked(sc);
5059         RUN_UNLOCK(sc);
5060 }
5061
5062 static void
5063 run_enable_tsf_sync(struct run_softc *sc)
5064 {
5065         struct ieee80211com *ic = &sc->sc_ic;
5066         struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
5067         uint32_t tmp;
5068
5069         DPRINTF("rvp_id=%d ic_opmode=%d\n", RUN_VAP(vap)->rvp_id,
5070             ic->ic_opmode);
5071
5072         run_read(sc, RT2860_BCN_TIME_CFG, &tmp);
5073         tmp &= ~0x1fffff;
5074         tmp |= vap->iv_bss->ni_intval * 16;
5075         tmp |= RT2860_TSF_TIMER_EN | RT2860_TBTT_TIMER_EN;
5076
5077         if (ic->ic_opmode == IEEE80211_M_STA) {
5078                 /*
5079                  * Local TSF is always updated with remote TSF on beacon
5080                  * reception.
5081                  */
5082                 tmp |= 1 << RT2860_TSF_SYNC_MODE_SHIFT;
5083         } else if (ic->ic_opmode == IEEE80211_M_IBSS) {
5084                 tmp |= RT2860_BCN_TX_EN;
5085                 /*
5086                  * Local TSF is updated with remote TSF on beacon reception
5087                  * only if the remote TSF is greater than local TSF.
5088                  */
5089                 tmp |= 2 << RT2860_TSF_SYNC_MODE_SHIFT;
5090         } else if (ic->ic_opmode == IEEE80211_M_HOSTAP ||
5091                     ic->ic_opmode == IEEE80211_M_MBSS) {
5092                 tmp |= RT2860_BCN_TX_EN;
5093                 /* SYNC with nobody */
5094                 tmp |= 3 << RT2860_TSF_SYNC_MODE_SHIFT;
5095         } else {
5096                 DPRINTF("Enabling TSF failed. undefined opmode\n");
5097                 return;
5098         }
5099
5100         run_write(sc, RT2860_BCN_TIME_CFG, tmp);
5101 }
5102
5103 static void
5104 run_enable_tsf(struct run_softc *sc)
5105 {
5106         uint32_t tmp;
5107
5108         if (run_read(sc, RT2860_BCN_TIME_CFG, &tmp) == 0) {
5109                 tmp &= ~(RT2860_BCN_TX_EN | RT2860_TBTT_TIMER_EN);
5110                 tmp |= RT2860_TSF_TIMER_EN;
5111                 run_write(sc, RT2860_BCN_TIME_CFG, tmp);
5112         }
5113 }
5114
5115 static void
5116 run_get_tsf(struct run_softc *sc, uint64_t *buf)
5117 {
5118         run_read_region_1(sc, RT2860_TSF_TIMER_DW0, (uint8_t *)buf,
5119             sizeof(*buf));
5120 }
5121
5122 static void
5123 run_enable_mrr(struct run_softc *sc)
5124 {
5125 #define CCK(mcs)        (mcs)
5126 #define OFDM(mcs)       (1 << 3 | (mcs))
5127         run_write(sc, RT2860_LG_FBK_CFG0,
5128             OFDM(6) << 28 |     /* 54->48 */
5129             OFDM(5) << 24 |     /* 48->36 */
5130             OFDM(4) << 20 |     /* 36->24 */
5131             OFDM(3) << 16 |     /* 24->18 */
5132             OFDM(2) << 12 |     /* 18->12 */
5133             OFDM(1) <<  8 |     /* 12-> 9 */
5134             OFDM(0) <<  4 |     /*  9-> 6 */
5135             OFDM(0));           /*  6-> 6 */
5136
5137         run_write(sc, RT2860_LG_FBK_CFG1,
5138             CCK(2) << 12 |      /* 11->5.5 */
5139             CCK(1) <<  8 |      /* 5.5-> 2 */
5140             CCK(0) <<  4 |      /*   2-> 1 */
5141             CCK(0));            /*   1-> 1 */
5142 #undef OFDM
5143 #undef CCK
5144 }
5145
5146 static void
5147 run_set_txpreamble(struct run_softc *sc)
5148 {
5149         struct ieee80211com *ic = &sc->sc_ic;
5150         uint32_t tmp;
5151
5152         run_read(sc, RT2860_AUTO_RSP_CFG, &tmp);
5153         if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
5154                 tmp |= RT2860_CCK_SHORT_EN;
5155         else
5156                 tmp &= ~RT2860_CCK_SHORT_EN;
5157         run_write(sc, RT2860_AUTO_RSP_CFG, tmp);
5158 }
5159
5160 static void
5161 run_set_basicrates(struct run_softc *sc)
5162 {
5163         struct ieee80211com *ic = &sc->sc_ic;
5164
5165         /* set basic rates mask */
5166         if (ic->ic_curmode == IEEE80211_MODE_11B)
5167                 run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x003);
5168         else if (ic->ic_curmode == IEEE80211_MODE_11A)
5169                 run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x150);
5170         else    /* 11g */
5171                 run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x15f);
5172 }
5173
5174 static void
5175 run_set_leds(struct run_softc *sc, uint16_t which)
5176 {
5177         (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LEDS,
5178             which | (sc->leds & 0x7f));
5179 }
5180
5181 static void
5182 run_set_bssid(struct run_softc *sc, const uint8_t *bssid)
5183 {
5184         run_write(sc, RT2860_MAC_BSSID_DW0,
5185             bssid[0] | bssid[1] << 8 | bssid[2] << 16 | bssid[3] << 24);
5186         run_write(sc, RT2860_MAC_BSSID_DW1,
5187             bssid[4] | bssid[5] << 8);
5188 }
5189
5190 static void
5191 run_set_macaddr(struct run_softc *sc, const uint8_t *addr)
5192 {
5193         run_write(sc, RT2860_MAC_ADDR_DW0,
5194             addr[0] | addr[1] << 8 | addr[2] << 16 | addr[3] << 24);
5195         run_write(sc, RT2860_MAC_ADDR_DW1,
5196             addr[4] | addr[5] << 8 | 0xff << 16);
5197 }
5198
5199 static void
5200 run_updateslot(struct ieee80211com *ic)
5201 {
5202         struct run_softc *sc = ic->ic_softc;
5203         uint32_t i;
5204
5205         i = RUN_CMDQ_GET(&sc->cmdq_store);
5206         DPRINTF("cmdq_store=%d\n", i);
5207         sc->cmdq[i].func = run_updateslot_cb;
5208         sc->cmdq[i].arg0 = ic;
5209         ieee80211_runtask(ic, &sc->cmdq_task);
5210
5211         return;
5212 }
5213
5214 /* ARGSUSED */
5215 static void
5216 run_updateslot_cb(void *arg)
5217 {
5218         struct ieee80211com *ic = arg;
5219         struct run_softc *sc = ic->ic_softc;
5220         uint32_t tmp;
5221
5222         run_read(sc, RT2860_BKOFF_SLOT_CFG, &tmp);
5223         tmp &= ~0xff;
5224         tmp |= IEEE80211_GET_SLOTTIME(ic);
5225         run_write(sc, RT2860_BKOFF_SLOT_CFG, tmp);
5226 }
5227
5228 static void
5229 run_update_mcast(struct ieee80211com *ic)
5230 {
5231 }
5232
5233 static int8_t
5234 run_rssi2dbm(struct run_softc *sc, uint8_t rssi, uint8_t rxchain)
5235 {
5236         struct ieee80211com *ic = &sc->sc_ic;
5237         struct ieee80211_channel *c = ic->ic_curchan;
5238         int delta;
5239
5240         if (IEEE80211_IS_CHAN_5GHZ(c)) {
5241                 u_int chan = ieee80211_chan2ieee(ic, c);
5242                 delta = sc->rssi_5ghz[rxchain];
5243
5244                 /* determine channel group */
5245                 if (chan <= 64)
5246                         delta -= sc->lna[1];
5247                 else if (chan <= 128)
5248                         delta -= sc->lna[2];
5249                 else
5250                         delta -= sc->lna[3];
5251         } else
5252                 delta = sc->rssi_2ghz[rxchain] - sc->lna[0];
5253
5254         return (-12 - delta - rssi);
5255 }
5256
5257 static void
5258 run_rt5390_bbp_init(struct run_softc *sc)
5259 {
5260         u_int i;
5261         uint8_t bbp;
5262
5263         /* Apply maximum likelihood detection for 2 stream case. */
5264         run_bbp_read(sc, 105, &bbp);
5265         if (sc->nrxchains > 1)
5266                 run_bbp_write(sc, 105, bbp | RT5390_MLD);
5267
5268         /* Avoid data lost and CRC error. */
5269         run_bbp_read(sc, 4, &bbp);
5270         run_bbp_write(sc, 4, bbp | RT5390_MAC_IF_CTRL);
5271
5272         if (sc->mac_ver == 0x5592) {
5273                 for (i = 0; i < nitems(rt5592_def_bbp); i++) {
5274                         run_bbp_write(sc, rt5592_def_bbp[i].reg,
5275                             rt5592_def_bbp[i].val);
5276                 }
5277                 for (i = 0; i < nitems(rt5592_bbp_r196); i++) {
5278                         run_bbp_write(sc, 195, i + 0x80);
5279                         run_bbp_write(sc, 196, rt5592_bbp_r196[i]);
5280                 }
5281         } else {
5282                 for (i = 0; i < nitems(rt5390_def_bbp); i++) {
5283                         run_bbp_write(sc, rt5390_def_bbp[i].reg,
5284                             rt5390_def_bbp[i].val);
5285                 }
5286         }
5287         if (sc->mac_ver == 0x5392) {
5288                 run_bbp_write(sc, 88, 0x90);
5289                 run_bbp_write(sc, 95, 0x9a);
5290                 run_bbp_write(sc, 98, 0x12);
5291                 run_bbp_write(sc, 106, 0x12);
5292                 run_bbp_write(sc, 134, 0xd0);
5293                 run_bbp_write(sc, 135, 0xf6);
5294                 run_bbp_write(sc, 148, 0x84);
5295         }
5296
5297         run_bbp_read(sc, 152, &bbp);
5298         run_bbp_write(sc, 152, bbp | 0x80);
5299
5300         /* Fix BBP254 for RT5592C. */
5301         if (sc->mac_ver == 0x5592 && sc->mac_rev >= 0x0221) {
5302                 run_bbp_read(sc, 254, &bbp);
5303                 run_bbp_write(sc, 254, bbp | 0x80);
5304         }
5305
5306         /* Disable hardware antenna diversity. */
5307         if (sc->mac_ver == 0x5390)
5308                 run_bbp_write(sc, 154, 0);
5309
5310         /* Initialize Rx CCK/OFDM frequency offset report. */
5311         run_bbp_write(sc, 142, 1);
5312         run_bbp_write(sc, 143, 57);
5313 }
5314
5315 static int
5316 run_bbp_init(struct run_softc *sc)
5317 {
5318         int i, error, ntries;
5319         uint8_t bbp0;
5320
5321         /* wait for BBP to wake up */
5322         for (ntries = 0; ntries < 20; ntries++) {
5323                 if ((error = run_bbp_read(sc, 0, &bbp0)) != 0)
5324                         return error;
5325                 if (bbp0 != 0 && bbp0 != 0xff)
5326                         break;
5327         }
5328         if (ntries == 20)
5329                 return (ETIMEDOUT);
5330
5331         /* initialize BBP registers to default values */
5332         if (sc->mac_ver >= 0x5390)
5333                 run_rt5390_bbp_init(sc);
5334         else {
5335                 for (i = 0; i < nitems(rt2860_def_bbp); i++) {
5336                         run_bbp_write(sc, rt2860_def_bbp[i].reg,
5337                             rt2860_def_bbp[i].val);
5338                 }
5339         }
5340
5341         if (sc->mac_ver == 0x3593) {
5342                 run_bbp_write(sc, 79, 0x13);
5343                 run_bbp_write(sc, 80, 0x05);
5344                 run_bbp_write(sc, 81, 0x33);
5345                 run_bbp_write(sc, 86, 0x46);
5346                 run_bbp_write(sc, 137, 0x0f);
5347         }
5348
5349         /* fix BBP84 for RT2860E */
5350         if (sc->mac_ver == 0x2860 && sc->mac_rev != 0x0101)
5351                 run_bbp_write(sc, 84, 0x19);
5352
5353         if (sc->mac_ver >= 0x3070 && (sc->mac_ver != 0x3593 &&
5354             sc->mac_ver != 0x5592)) {
5355                 run_bbp_write(sc, 79, 0x13);
5356                 run_bbp_write(sc, 80, 0x05);
5357                 run_bbp_write(sc, 81, 0x33);
5358         } else if (sc->mac_ver == 0x2860 && sc->mac_rev == 0x0100) {
5359                 run_bbp_write(sc, 69, 0x16);
5360                 run_bbp_write(sc, 73, 0x12);
5361         }
5362         return (0);
5363 }
5364
5365 static int
5366 run_rt3070_rf_init(struct run_softc *sc)
5367 {
5368         uint32_t tmp;
5369         uint8_t bbp4, mingain, rf, target;
5370         u_int i;
5371
5372         run_rt3070_rf_read(sc, 30, &rf);
5373         /* toggle RF R30 bit 7 */
5374         run_rt3070_rf_write(sc, 30, rf | 0x80);
5375         run_delay(sc, 10);
5376         run_rt3070_rf_write(sc, 30, rf & ~0x80);
5377
5378         /* initialize RF registers to default value */
5379         if (sc->mac_ver == 0x3572) {
5380                 for (i = 0; i < nitems(rt3572_def_rf); i++) {
5381                         run_rt3070_rf_write(sc, rt3572_def_rf[i].reg,
5382                             rt3572_def_rf[i].val);
5383                 }
5384         } else {
5385                 for (i = 0; i < nitems(rt3070_def_rf); i++) {
5386                         run_rt3070_rf_write(sc, rt3070_def_rf[i].reg,
5387                             rt3070_def_rf[i].val);
5388                 }
5389         }
5390
5391         if (sc->mac_ver == 0x3070 && sc->mac_rev < 0x0201) {
5392                 /* 
5393                  * Change voltage from 1.2V to 1.35V for RT3070.
5394                  * The DAC issue (RT3070_LDO_CFG0) has been fixed
5395                  * in RT3070(F).
5396                  */
5397                 run_read(sc, RT3070_LDO_CFG0, &tmp);
5398                 tmp = (tmp & ~0x0f000000) | 0x0d000000;
5399                 run_write(sc, RT3070_LDO_CFG0, tmp);
5400
5401         } else if (sc->mac_ver == 0x3071) {
5402                 run_rt3070_rf_read(sc, 6, &rf);
5403                 run_rt3070_rf_write(sc, 6, rf | 0x40);
5404                 run_rt3070_rf_write(sc, 31, 0x14);
5405
5406                 run_read(sc, RT3070_LDO_CFG0, &tmp);
5407                 tmp &= ~0x1f000000;
5408                 if (sc->mac_rev < 0x0211)
5409                         tmp |= 0x0d000000;      /* 1.3V */
5410                 else
5411                         tmp |= 0x01000000;      /* 1.2V */
5412                 run_write(sc, RT3070_LDO_CFG0, tmp);
5413
5414                 /* patch LNA_PE_G1 */
5415                 run_read(sc, RT3070_GPIO_SWITCH, &tmp);
5416                 run_write(sc, RT3070_GPIO_SWITCH, tmp & ~0x20);
5417
5418         } else if (sc->mac_ver == 0x3572) {
5419                 run_rt3070_rf_read(sc, 6, &rf);
5420                 run_rt3070_rf_write(sc, 6, rf | 0x40);
5421
5422                 /* increase voltage from 1.2V to 1.35V */
5423                 run_read(sc, RT3070_LDO_CFG0, &tmp);
5424                 tmp = (tmp & ~0x1f000000) | 0x0d000000;
5425                 run_write(sc, RT3070_LDO_CFG0, tmp);
5426
5427                 if (sc->mac_rev < 0x0211 || !sc->patch_dac) {
5428                         run_delay(sc, 1);       /* wait for 1msec */
5429                         /* decrease voltage back to 1.2V */
5430                         tmp = (tmp & ~0x1f000000) | 0x01000000;
5431                         run_write(sc, RT3070_LDO_CFG0, tmp);
5432                 }
5433         }
5434
5435         /* select 20MHz bandwidth */
5436         run_rt3070_rf_read(sc, 31, &rf);
5437         run_rt3070_rf_write(sc, 31, rf & ~0x20);
5438
5439         /* calibrate filter for 20MHz bandwidth */
5440         sc->rf24_20mhz = 0x1f;  /* default value */
5441         target = (sc->mac_ver < 0x3071) ? 0x16 : 0x13;
5442         run_rt3070_filter_calib(sc, 0x07, target, &sc->rf24_20mhz);
5443
5444         /* select 40MHz bandwidth */
5445         run_bbp_read(sc, 4, &bbp4);
5446         run_bbp_write(sc, 4, (bbp4 & ~0x18) | 0x10);
5447         run_rt3070_rf_read(sc, 31, &rf);
5448         run_rt3070_rf_write(sc, 31, rf | 0x20);
5449
5450         /* calibrate filter for 40MHz bandwidth */
5451         sc->rf24_40mhz = 0x2f;  /* default value */
5452         target = (sc->mac_ver < 0x3071) ? 0x19 : 0x15;
5453         run_rt3070_filter_calib(sc, 0x27, target, &sc->rf24_40mhz);
5454
5455         /* go back to 20MHz bandwidth */
5456         run_bbp_read(sc, 4, &bbp4);
5457         run_bbp_write(sc, 4, bbp4 & ~0x18);
5458
5459         if (sc->mac_ver == 0x3572) {
5460                 /* save default BBP registers 25 and 26 values */
5461                 run_bbp_read(sc, 25, &sc->bbp25);
5462                 run_bbp_read(sc, 26, &sc->bbp26);
5463         } else if (sc->mac_rev < 0x0201 || sc->mac_rev < 0x0211)
5464                 run_rt3070_rf_write(sc, 27, 0x03);
5465
5466         run_read(sc, RT3070_OPT_14, &tmp);
5467         run_write(sc, RT3070_OPT_14, tmp | 1);
5468
5469         if (sc->mac_ver == 0x3070 || sc->mac_ver == 0x3071) {
5470                 run_rt3070_rf_read(sc, 17, &rf);
5471                 rf &= ~RT3070_TX_LO1;
5472                 if ((sc->mac_ver == 0x3070 ||
5473                      (sc->mac_ver == 0x3071 && sc->mac_rev >= 0x0211)) &&
5474                     !sc->ext_2ghz_lna)
5475                         rf |= 0x20;     /* fix for long range Rx issue */
5476                 mingain = (sc->mac_ver == 0x3070) ? 1 : 2;
5477                 if (sc->txmixgain_2ghz >= mingain)
5478                         rf = (rf & ~0x7) | sc->txmixgain_2ghz;
5479                 run_rt3070_rf_write(sc, 17, rf);
5480         }
5481
5482         if (sc->mac_ver == 0x3071) {
5483                 run_rt3070_rf_read(sc, 1, &rf);
5484                 rf &= ~(RT3070_RX0_PD | RT3070_TX0_PD);
5485                 rf |= RT3070_RF_BLOCK | RT3070_RX1_PD | RT3070_TX1_PD;
5486                 run_rt3070_rf_write(sc, 1, rf);
5487
5488                 run_rt3070_rf_read(sc, 15, &rf);
5489                 run_rt3070_rf_write(sc, 15, rf & ~RT3070_TX_LO2);
5490
5491                 run_rt3070_rf_read(sc, 20, &rf);
5492                 run_rt3070_rf_write(sc, 20, rf & ~RT3070_RX_LO1);
5493
5494                 run_rt3070_rf_read(sc, 21, &rf);
5495                 run_rt3070_rf_write(sc, 21, rf & ~RT3070_RX_LO2);
5496         }
5497
5498         if (sc->mac_ver == 0x3070 || sc->mac_ver == 0x3071) {
5499                 /* fix Tx to Rx IQ glitch by raising RF voltage */
5500                 run_rt3070_rf_read(sc, 27, &rf);
5501                 rf &= ~0x77;
5502                 if (sc->mac_rev < 0x0211)
5503                         rf |= 0x03;
5504                 run_rt3070_rf_write(sc, 27, rf);
5505         }
5506         return (0);
5507 }
5508
5509 static void
5510 run_rt3593_rf_init(struct run_softc *sc)
5511 {
5512         uint32_t tmp;
5513         uint8_t rf;
5514         u_int i;
5515
5516         /* Disable the GPIO bits 4 and 7 for LNA PE control. */
5517         run_read(sc, RT3070_GPIO_SWITCH, &tmp);
5518         tmp &= ~(1 << 4 | 1 << 7);
5519         run_write(sc, RT3070_GPIO_SWITCH, tmp);
5520
5521         /* Initialize RF registers to default value. */
5522         for (i = 0; i < nitems(rt3593_def_rf); i++) {
5523                 run_rt3070_rf_write(sc, rt3593_def_rf[i].reg,
5524                     rt3593_def_rf[i].val);
5525         }
5526
5527         /* Toggle RF R2 to initiate calibration. */
5528         run_rt3070_rf_write(sc, 2, RT5390_RESCAL);
5529
5530         /* Initialize RF frequency offset. */
5531         run_adjust_freq_offset(sc);
5532
5533         run_rt3070_rf_read(sc, 18, &rf);
5534         run_rt3070_rf_write(sc, 18, rf | RT3593_AUTOTUNE_BYPASS);
5535
5536         /*
5537          * Increase voltage from 1.2V to 1.35V, wait for 1 msec to
5538          * decrease voltage back to 1.2V.
5539          */
5540         run_read(sc, RT3070_LDO_CFG0, &tmp);
5541         tmp = (tmp & ~0x1f000000) | 0x0d000000;
5542         run_write(sc, RT3070_LDO_CFG0, tmp);
5543         run_delay(sc, 1);
5544         tmp = (tmp & ~0x1f000000) | 0x01000000;
5545         run_write(sc, RT3070_LDO_CFG0, tmp);
5546
5547         sc->rf24_20mhz = 0x1f;
5548         sc->rf24_40mhz = 0x2f;
5549
5550         /* Save default BBP registers 25 and 26 values. */
5551         run_bbp_read(sc, 25, &sc->bbp25);
5552         run_bbp_read(sc, 26, &sc->bbp26);
5553
5554         run_read(sc, RT3070_OPT_14, &tmp);
5555         run_write(sc, RT3070_OPT_14, tmp | 1);
5556 }
5557
5558 static void
5559 run_rt5390_rf_init(struct run_softc *sc)
5560 {
5561         uint32_t tmp;
5562         uint8_t rf;
5563         u_int i;
5564
5565         /* Toggle RF R2 to initiate calibration. */
5566         if (sc->mac_ver == 0x5390) {
5567                 run_rt3070_rf_read(sc, 2, &rf);
5568                 run_rt3070_rf_write(sc, 2, rf | RT5390_RESCAL);
5569                 run_delay(sc, 10);
5570                 run_rt3070_rf_write(sc, 2, rf & ~RT5390_RESCAL);
5571         } else {
5572                 run_rt3070_rf_write(sc, 2, RT5390_RESCAL);
5573                 run_delay(sc, 10);
5574         }
5575
5576         /* Initialize RF registers to default value. */
5577         if (sc->mac_ver == 0x5592) {
5578                 for (i = 0; i < nitems(rt5592_def_rf); i++) {
5579                         run_rt3070_rf_write(sc, rt5592_def_rf[i].reg,
5580                             rt5592_def_rf[i].val);
5581                 }
5582                 /* Initialize RF frequency offset. */
5583                 run_adjust_freq_offset(sc);
5584         } else if (sc->mac_ver == 0x5392) {
5585                 for (i = 0; i < nitems(rt5392_def_rf); i++) {
5586                         run_rt3070_rf_write(sc, rt5392_def_rf[i].reg,
5587                             rt5392_def_rf[i].val);
5588                 }
5589                 if (sc->mac_rev >= 0x0223) {
5590                         run_rt3070_rf_write(sc, 23, 0x0f);
5591                         run_rt3070_rf_write(sc, 24, 0x3e);
5592                         run_rt3070_rf_write(sc, 51, 0x32);
5593                         run_rt3070_rf_write(sc, 53, 0x22);
5594                         run_rt3070_rf_write(sc, 56, 0xc1);
5595                         run_rt3070_rf_write(sc, 59, 0x0f);
5596                 }
5597         } else {
5598                 for (i = 0; i < nitems(rt5390_def_rf); i++) {
5599                         run_rt3070_rf_write(sc, rt5390_def_rf[i].reg,
5600                             rt5390_def_rf[i].val);
5601                 }
5602                 if (sc->mac_rev >= 0x0502) {
5603                         run_rt3070_rf_write(sc, 6, 0xe0);
5604                         run_rt3070_rf_write(sc, 25, 0x80);
5605                         run_rt3070_rf_write(sc, 46, 0x73);
5606                         run_rt3070_rf_write(sc, 53, 0x00);
5607                         run_rt3070_rf_write(sc, 56, 0x42);
5608                         run_rt3070_rf_write(sc, 61, 0xd1);
5609                 }
5610         }
5611
5612         sc->rf24_20mhz = 0x1f;  /* default value */
5613         sc->rf24_40mhz = (sc->mac_ver == 0x5592) ? 0 : 0x2f;
5614
5615         if (sc->mac_rev < 0x0211)
5616                 run_rt3070_rf_write(sc, 27, 0x3);
5617
5618         run_read(sc, RT3070_OPT_14, &tmp);
5619         run_write(sc, RT3070_OPT_14, tmp | 1);
5620 }
5621
5622 static int
5623 run_rt3070_filter_calib(struct run_softc *sc, uint8_t init, uint8_t target,
5624     uint8_t *val)
5625 {
5626         uint8_t rf22, rf24;
5627         uint8_t bbp55_pb, bbp55_sb, delta;
5628         int ntries;
5629
5630         /* program filter */
5631         run_rt3070_rf_read(sc, 24, &rf24);
5632         rf24 = (rf24 & 0xc0) | init;    /* initial filter value */
5633         run_rt3070_rf_write(sc, 24, rf24);
5634
5635         /* enable baseband loopback mode */
5636         run_rt3070_rf_read(sc, 22, &rf22);
5637         run_rt3070_rf_write(sc, 22, rf22 | 0x01);
5638
5639         /* set power and frequency of passband test tone */
5640         run_bbp_write(sc, 24, 0x00);
5641         for (ntries = 0; ntries < 100; ntries++) {
5642                 /* transmit test tone */
5643                 run_bbp_write(sc, 25, 0x90);
5644                 run_delay(sc, 10);
5645                 /* read received power */
5646                 run_bbp_read(sc, 55, &bbp55_pb);
5647                 if (bbp55_pb != 0)
5648                         break;
5649         }
5650         if (ntries == 100)
5651                 return (ETIMEDOUT);
5652
5653         /* set power and frequency of stopband test tone */
5654         run_bbp_write(sc, 24, 0x06);
5655         for (ntries = 0; ntries < 100; ntries++) {
5656                 /* transmit test tone */
5657                 run_bbp_write(sc, 25, 0x90);
5658                 run_delay(sc, 10);
5659                 /* read received power */
5660                 run_bbp_read(sc, 55, &bbp55_sb);
5661
5662                 delta = bbp55_pb - bbp55_sb;
5663                 if (delta > target)
5664                         break;
5665
5666                 /* reprogram filter */
5667                 rf24++;
5668                 run_rt3070_rf_write(sc, 24, rf24);
5669         }
5670         if (ntries < 100) {
5671                 if (rf24 != init)
5672                         rf24--; /* backtrack */
5673                 *val = rf24;
5674                 run_rt3070_rf_write(sc, 24, rf24);
5675         }
5676
5677         /* restore initial state */
5678         run_bbp_write(sc, 24, 0x00);
5679
5680         /* disable baseband loopback mode */
5681         run_rt3070_rf_read(sc, 22, &rf22);
5682         run_rt3070_rf_write(sc, 22, rf22 & ~0x01);
5683
5684         return (0);
5685 }
5686
5687 static void
5688 run_rt3070_rf_setup(struct run_softc *sc)
5689 {
5690         uint8_t bbp, rf;
5691         int i;
5692
5693         if (sc->mac_ver == 0x3572) {
5694                 /* enable DC filter */
5695                 if (sc->mac_rev >= 0x0201)
5696                         run_bbp_write(sc, 103, 0xc0);
5697
5698                 run_bbp_read(sc, 138, &bbp);
5699                 if (sc->ntxchains == 1)
5700                         bbp |= 0x20;    /* turn off DAC1 */
5701                 if (sc->nrxchains == 1)
5702                         bbp &= ~0x02;   /* turn off ADC1 */
5703                 run_bbp_write(sc, 138, bbp);
5704
5705                 if (sc->mac_rev >= 0x0211) {
5706                         /* improve power consumption */
5707                         run_bbp_read(sc, 31, &bbp);
5708                         run_bbp_write(sc, 31, bbp & ~0x03);
5709                 }
5710
5711                 run_rt3070_rf_read(sc, 16, &rf);
5712                 rf = (rf & ~0x07) | sc->txmixgain_2ghz;
5713                 run_rt3070_rf_write(sc, 16, rf);
5714
5715         } else if (sc->mac_ver == 0x3071) {
5716                 if (sc->mac_rev >= 0x0211) {
5717                         /* enable DC filter */
5718                         run_bbp_write(sc, 103, 0xc0);
5719
5720                         /* improve power consumption */
5721                         run_bbp_read(sc, 31, &bbp);
5722                         run_bbp_write(sc, 31, bbp & ~0x03);
5723                 }
5724
5725                 run_bbp_read(sc, 138, &bbp);
5726                 if (sc->ntxchains == 1)
5727                         bbp |= 0x20;    /* turn off DAC1 */
5728                 if (sc->nrxchains == 1)
5729                         bbp &= ~0x02;   /* turn off ADC1 */
5730                 run_bbp_write(sc, 138, bbp);
5731
5732                 run_write(sc, RT2860_TX_SW_CFG1, 0);
5733                 if (sc->mac_rev < 0x0211) {
5734                         run_write(sc, RT2860_TX_SW_CFG2,
5735                             sc->patch_dac ? 0x2c : 0x0f);
5736                 } else
5737                         run_write(sc, RT2860_TX_SW_CFG2, 0);
5738
5739         } else if (sc->mac_ver == 0x3070) {
5740                 if (sc->mac_rev >= 0x0201) {
5741                         /* enable DC filter */
5742                         run_bbp_write(sc, 103, 0xc0);
5743
5744                         /* improve power consumption */
5745                         run_bbp_read(sc, 31, &bbp);
5746                         run_bbp_write(sc, 31, bbp & ~0x03);
5747                 }
5748
5749                 if (sc->mac_rev < 0x0201) {
5750                         run_write(sc, RT2860_TX_SW_CFG1, 0);
5751                         run_write(sc, RT2860_TX_SW_CFG2, 0x2c);
5752                 } else
5753                         run_write(sc, RT2860_TX_SW_CFG2, 0);
5754         }
5755
5756         /* initialize RF registers from ROM for >=RT3071*/
5757         if (sc->mac_ver >= 0x3071) {
5758                 for (i = 0; i < 10; i++) {
5759                         if (sc->rf[i].reg == 0 || sc->rf[i].reg == 0xff)
5760                                 continue;
5761                         run_rt3070_rf_write(sc, sc->rf[i].reg, sc->rf[i].val);
5762                 }
5763         }
5764 }
5765
5766 static void
5767 run_rt3593_rf_setup(struct run_softc *sc)
5768 {
5769         uint8_t bbp, rf;
5770
5771         if (sc->mac_rev >= 0x0211) {
5772                 /* Enable DC filter. */
5773                 run_bbp_write(sc, 103, 0xc0);
5774         }
5775         run_write(sc, RT2860_TX_SW_CFG1, 0);
5776         if (sc->mac_rev < 0x0211) {
5777                 run_write(sc, RT2860_TX_SW_CFG2,
5778                     sc->patch_dac ? 0x2c : 0x0f);
5779         } else
5780                 run_write(sc, RT2860_TX_SW_CFG2, 0);
5781
5782         run_rt3070_rf_read(sc, 50, &rf);
5783         run_rt3070_rf_write(sc, 50, rf & ~RT3593_TX_LO2);
5784
5785         run_rt3070_rf_read(sc, 51, &rf);
5786         rf = (rf & ~(RT3593_TX_LO1 | 0x0c)) |
5787             ((sc->txmixgain_2ghz & 0x07) << 2);
5788         run_rt3070_rf_write(sc, 51, rf);
5789
5790         run_rt3070_rf_read(sc, 38, &rf);
5791         run_rt3070_rf_write(sc, 38, rf & ~RT5390_RX_LO1);
5792
5793         run_rt3070_rf_read(sc, 39, &rf);
5794         run_rt3070_rf_write(sc, 39, rf & ~RT5390_RX_LO2);
5795
5796         run_rt3070_rf_read(sc, 1, &rf);
5797         run_rt3070_rf_write(sc, 1, rf & ~(RT3070_RF_BLOCK | RT3070_PLL_PD));
5798
5799         run_rt3070_rf_read(sc, 30, &rf);
5800         rf = (rf & ~0x18) | 0x10;
5801         run_rt3070_rf_write(sc, 30, rf);
5802
5803         /* Apply maximum likelihood detection for 2 stream case. */
5804         run_bbp_read(sc, 105, &bbp);
5805         if (sc->nrxchains > 1)
5806                 run_bbp_write(sc, 105, bbp | RT5390_MLD);
5807
5808         /* Avoid data lost and CRC error. */
5809         run_bbp_read(sc, 4, &bbp);
5810         run_bbp_write(sc, 4, bbp | RT5390_MAC_IF_CTRL);
5811
5812         run_bbp_write(sc, 92, 0x02);
5813         run_bbp_write(sc, 82, 0x82);
5814         run_bbp_write(sc, 106, 0x05);
5815         run_bbp_write(sc, 104, 0x92);
5816         run_bbp_write(sc, 88, 0x90);
5817         run_bbp_write(sc, 148, 0xc8);
5818         run_bbp_write(sc, 47, 0x48);
5819         run_bbp_write(sc, 120, 0x50);
5820
5821         run_bbp_write(sc, 163, 0x9d);
5822
5823         /* SNR mapping. */
5824         run_bbp_write(sc, 142, 0x06);
5825         run_bbp_write(sc, 143, 0xa0);
5826         run_bbp_write(sc, 142, 0x07);
5827         run_bbp_write(sc, 143, 0xa1);
5828         run_bbp_write(sc, 142, 0x08);
5829         run_bbp_write(sc, 143, 0xa2);
5830
5831         run_bbp_write(sc, 31, 0x08);
5832         run_bbp_write(sc, 68, 0x0b);
5833         run_bbp_write(sc, 105, 0x04);
5834 }
5835
5836 static void
5837 run_rt5390_rf_setup(struct run_softc *sc)
5838 {
5839         uint8_t bbp, rf;
5840
5841         if (sc->mac_rev >= 0x0211) {
5842                 /* Enable DC filter. */
5843                 run_bbp_write(sc, 103, 0xc0);
5844
5845                 if (sc->mac_ver != 0x5592) {
5846                         /* Improve power consumption. */
5847                         run_bbp_read(sc, 31, &bbp);
5848                         run_bbp_write(sc, 31, bbp & ~0x03);
5849                 }
5850         }
5851
5852         run_bbp_read(sc, 138, &bbp);
5853         if (sc->ntxchains == 1)
5854                 bbp |= 0x20;    /* turn off DAC1 */
5855         if (sc->nrxchains == 1)
5856                 bbp &= ~0x02;   /* turn off ADC1 */
5857         run_bbp_write(sc, 138, bbp);
5858
5859         run_rt3070_rf_read(sc, 38, &rf);
5860         run_rt3070_rf_write(sc, 38, rf & ~RT5390_RX_LO1);
5861
5862         run_rt3070_rf_read(sc, 39, &rf);
5863         run_rt3070_rf_write(sc, 39, rf & ~RT5390_RX_LO2);
5864
5865         /* Avoid data lost and CRC error. */
5866         run_bbp_read(sc, 4, &bbp);
5867         run_bbp_write(sc, 4, bbp | RT5390_MAC_IF_CTRL);
5868
5869         run_rt3070_rf_read(sc, 30, &rf);
5870         rf = (rf & ~0x18) | 0x10;
5871         run_rt3070_rf_write(sc, 30, rf);
5872
5873         if (sc->mac_ver != 0x5592) {
5874                 run_write(sc, RT2860_TX_SW_CFG1, 0);
5875                 if (sc->mac_rev < 0x0211) {
5876                         run_write(sc, RT2860_TX_SW_CFG2,
5877                             sc->patch_dac ? 0x2c : 0x0f);
5878                 } else
5879                         run_write(sc, RT2860_TX_SW_CFG2, 0);
5880         }
5881 }
5882
5883 static int
5884 run_txrx_enable(struct run_softc *sc)
5885 {
5886         struct ieee80211com *ic = &sc->sc_ic;
5887         uint32_t tmp;
5888         int error, ntries;
5889
5890         run_write(sc, RT2860_MAC_SYS_CTRL, RT2860_MAC_TX_EN);
5891         for (ntries = 0; ntries < 200; ntries++) {
5892                 if ((error = run_read(sc, RT2860_WPDMA_GLO_CFG, &tmp)) != 0)
5893                         return (error);
5894                 if ((tmp & (RT2860_TX_DMA_BUSY | RT2860_RX_DMA_BUSY)) == 0)
5895                         break;
5896                 run_delay(sc, 50);
5897         }
5898         if (ntries == 200)
5899                 return (ETIMEDOUT);
5900
5901         run_delay(sc, 50);
5902
5903         tmp |= RT2860_RX_DMA_EN | RT2860_TX_DMA_EN | RT2860_TX_WB_DDONE;
5904         run_write(sc, RT2860_WPDMA_GLO_CFG, tmp);
5905
5906         /* enable Rx bulk aggregation (set timeout and limit) */
5907         tmp = RT2860_USB_TX_EN | RT2860_USB_RX_EN | RT2860_USB_RX_AGG_EN |
5908             RT2860_USB_RX_AGG_TO(128) | RT2860_USB_RX_AGG_LMT(2);
5909         run_write(sc, RT2860_USB_DMA_CFG, tmp);
5910
5911         /* set Rx filter */
5912         tmp = RT2860_DROP_CRC_ERR | RT2860_DROP_PHY_ERR;
5913         if (ic->ic_opmode != IEEE80211_M_MONITOR) {
5914                 tmp |= RT2860_DROP_UC_NOME | RT2860_DROP_DUPL |
5915                     RT2860_DROP_CTS | RT2860_DROP_BA | RT2860_DROP_ACK |
5916                     RT2860_DROP_VER_ERR | RT2860_DROP_CTRL_RSV |
5917                     RT2860_DROP_CFACK | RT2860_DROP_CFEND;
5918                 if (ic->ic_opmode == IEEE80211_M_STA)
5919                         tmp |= RT2860_DROP_RTS | RT2860_DROP_PSPOLL;
5920         }
5921         run_write(sc, RT2860_RX_FILTR_CFG, tmp);
5922
5923         run_write(sc, RT2860_MAC_SYS_CTRL,
5924             RT2860_MAC_RX_EN | RT2860_MAC_TX_EN);
5925
5926         return (0);
5927 }
5928
5929 static void
5930 run_adjust_freq_offset(struct run_softc *sc)
5931 {
5932         uint8_t rf, tmp;
5933
5934         run_rt3070_rf_read(sc, 17, &rf);
5935         tmp = rf;
5936         rf = (rf & ~0x7f) | (sc->freq & 0x7f);
5937         rf = MIN(rf, 0x5f);
5938
5939         if (tmp != rf)
5940                 run_mcu_cmd(sc, 0x74, (tmp << 8 ) | rf);
5941 }
5942
5943 static void
5944 run_init_locked(struct run_softc *sc)
5945 {
5946         struct ieee80211com *ic = &sc->sc_ic;
5947         struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
5948         uint32_t tmp;
5949         uint8_t bbp1, bbp3;
5950         int i;
5951         int ridx;
5952         int ntries;
5953
5954         if (ic->ic_nrunning > 1)
5955                 return;
5956
5957         run_stop(sc);
5958
5959         if (run_load_microcode(sc) != 0) {
5960                 device_printf(sc->sc_dev, "could not load 8051 microcode\n");
5961                 goto fail;
5962         }
5963
5964         for (ntries = 0; ntries < 100; ntries++) {
5965                 if (run_read(sc, RT2860_ASIC_VER_ID, &tmp) != 0)
5966                         goto fail;
5967                 if (tmp != 0 && tmp != 0xffffffff)
5968                         break;
5969                 run_delay(sc, 10);
5970         }
5971         if (ntries == 100)
5972                 goto fail;
5973
5974         for (i = 0; i != RUN_EP_QUEUES; i++)
5975                 run_setup_tx_list(sc, &sc->sc_epq[i]);
5976
5977         run_set_macaddr(sc, vap ? vap->iv_myaddr : ic->ic_macaddr);
5978
5979         for (ntries = 0; ntries < 100; ntries++) {
5980                 if (run_read(sc, RT2860_WPDMA_GLO_CFG, &tmp) != 0)
5981                         goto fail;
5982                 if ((tmp & (RT2860_TX_DMA_BUSY | RT2860_RX_DMA_BUSY)) == 0)
5983                         break;
5984                 run_delay(sc, 10);
5985         }
5986         if (ntries == 100) {
5987                 device_printf(sc->sc_dev, "timeout waiting for DMA engine\n");
5988                 goto fail;
5989         }
5990         tmp &= 0xff0;
5991         tmp |= RT2860_TX_WB_DDONE;
5992         run_write(sc, RT2860_WPDMA_GLO_CFG, tmp);
5993
5994         /* turn off PME_OEN to solve high-current issue */
5995         run_read(sc, RT2860_SYS_CTRL, &tmp);
5996         run_write(sc, RT2860_SYS_CTRL, tmp & ~RT2860_PME_OEN);
5997
5998         run_write(sc, RT2860_MAC_SYS_CTRL,
5999             RT2860_BBP_HRST | RT2860_MAC_SRST);
6000         run_write(sc, RT2860_USB_DMA_CFG, 0);
6001
6002         if (run_reset(sc) != 0) {
6003                 device_printf(sc->sc_dev, "could not reset chipset\n");
6004                 goto fail;
6005         }
6006
6007         run_write(sc, RT2860_MAC_SYS_CTRL, 0);
6008
6009         /* init Tx power for all Tx rates (from EEPROM) */
6010         for (ridx = 0; ridx < 5; ridx++) {
6011                 if (sc->txpow20mhz[ridx] == 0xffffffff)
6012                         continue;
6013                 run_write(sc, RT2860_TX_PWR_CFG(ridx), sc->txpow20mhz[ridx]);
6014         }
6015
6016         for (i = 0; i < nitems(rt2870_def_mac); i++)
6017                 run_write(sc, rt2870_def_mac[i].reg, rt2870_def_mac[i].val);
6018         run_write(sc, RT2860_WMM_AIFSN_CFG, 0x00002273);
6019         run_write(sc, RT2860_WMM_CWMIN_CFG, 0x00002344);
6020         run_write(sc, RT2860_WMM_CWMAX_CFG, 0x000034aa);
6021
6022         if (sc->mac_ver >= 0x5390) {
6023                 run_write(sc, RT2860_TX_SW_CFG0,
6024                     4 << RT2860_DLY_PAPE_EN_SHIFT | 4);
6025                 if (sc->mac_ver >= 0x5392) {
6026                         run_write(sc, RT2860_MAX_LEN_CFG, 0x00002fff);
6027                         if (sc->mac_ver == 0x5592) {
6028                                 run_write(sc, RT2860_HT_FBK_CFG1, 0xedcba980);
6029                                 run_write(sc, RT2860_TXOP_HLDR_ET, 0x00000082);
6030                         } else {
6031                                 run_write(sc, RT2860_HT_FBK_CFG1, 0xedcb4980);
6032                                 run_write(sc, RT2860_LG_FBK_CFG0, 0xedcba322);
6033                         }
6034                 }
6035         } else if (sc->mac_ver == 0x3593) {
6036                 run_write(sc, RT2860_TX_SW_CFG0,
6037                     4 << RT2860_DLY_PAPE_EN_SHIFT | 2);
6038         } else if (sc->mac_ver >= 0x3070) {
6039                 /* set delay of PA_PE assertion to 1us (unit of 0.25us) */
6040                 run_write(sc, RT2860_TX_SW_CFG0,
6041                     4 << RT2860_DLY_PAPE_EN_SHIFT);
6042         }
6043
6044         /* wait while MAC is busy */
6045         for (ntries = 0; ntries < 100; ntries++) {
6046                 if (run_read(sc, RT2860_MAC_STATUS_REG, &tmp) != 0)
6047                         goto fail;
6048                 if (!(tmp & (RT2860_RX_STATUS_BUSY | RT2860_TX_STATUS_BUSY)))
6049                         break;
6050                 run_delay(sc, 10);
6051         }
6052         if (ntries == 100)
6053                 goto fail;
6054
6055         /* clear Host to MCU mailbox */
6056         run_write(sc, RT2860_H2M_BBPAGENT, 0);
6057         run_write(sc, RT2860_H2M_MAILBOX, 0);
6058         run_delay(sc, 10);
6059
6060         if (run_bbp_init(sc) != 0) {
6061                 device_printf(sc->sc_dev, "could not initialize BBP\n");
6062                 goto fail;
6063         }
6064
6065         /* abort TSF synchronization */
6066         run_read(sc, RT2860_BCN_TIME_CFG, &tmp);
6067         tmp &= ~(RT2860_BCN_TX_EN | RT2860_TSF_TIMER_EN |
6068             RT2860_TBTT_TIMER_EN);
6069         run_write(sc, RT2860_BCN_TIME_CFG, tmp);
6070
6071         /* clear RX WCID search table */
6072         run_set_region_4(sc, RT2860_WCID_ENTRY(0), 0, 512);
6073         /* clear WCID attribute table */
6074         run_set_region_4(sc, RT2860_WCID_ATTR(0), 0, 8 * 32);
6075
6076         /* hostapd sets a key before init. So, don't clear it. */
6077         if (sc->cmdq_key_set != RUN_CMDQ_GO) {
6078                 /* clear shared key table */
6079                 run_set_region_4(sc, RT2860_SKEY(0, 0), 0, 8 * 32);
6080                 /* clear shared key mode */
6081                 run_set_region_4(sc, RT2860_SKEY_MODE_0_7, 0, 4);
6082         }
6083
6084         run_read(sc, RT2860_US_CYC_CNT, &tmp);
6085         tmp = (tmp & ~0xff) | 0x1e;
6086         run_write(sc, RT2860_US_CYC_CNT, tmp);
6087
6088         if (sc->mac_rev != 0x0101)
6089                 run_write(sc, RT2860_TXOP_CTRL_CFG, 0x0000583f);
6090
6091         run_write(sc, RT2860_WMM_TXOP0_CFG, 0);
6092         run_write(sc, RT2860_WMM_TXOP1_CFG, 48 << 16 | 96);
6093
6094         /* write vendor-specific BBP values (from EEPROM) */
6095         if (sc->mac_ver < 0x3593) {
6096                 for (i = 0; i < 10; i++) {
6097                         if (sc->bbp[i].reg == 0 || sc->bbp[i].reg == 0xff)
6098                                 continue;
6099                         run_bbp_write(sc, sc->bbp[i].reg, sc->bbp[i].val);
6100                 }
6101         }
6102
6103         /* select Main antenna for 1T1R devices */
6104         if (sc->rf_rev == RT3070_RF_3020 || sc->rf_rev == RT5390_RF_5370)
6105                 run_set_rx_antenna(sc, 0);
6106
6107         /* send LEDs operating mode to microcontroller */
6108         (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED1, sc->led[0]);
6109         (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED2, sc->led[1]);
6110         (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED3, sc->led[2]);
6111
6112         if (sc->mac_ver >= 0x5390)
6113                 run_rt5390_rf_init(sc);
6114         else if (sc->mac_ver == 0x3593)
6115                 run_rt3593_rf_init(sc);
6116         else if (sc->mac_ver >= 0x3070)
6117                 run_rt3070_rf_init(sc);
6118
6119         /* disable non-existing Rx chains */
6120         run_bbp_read(sc, 3, &bbp3);
6121         bbp3 &= ~(1 << 3 | 1 << 4);
6122         if (sc->nrxchains == 2)
6123                 bbp3 |= 1 << 3;
6124         else if (sc->nrxchains == 3)
6125                 bbp3 |= 1 << 4;
6126         run_bbp_write(sc, 3, bbp3);
6127
6128         /* disable non-existing Tx chains */
6129         run_bbp_read(sc, 1, &bbp1);
6130         if (sc->ntxchains == 1)
6131                 bbp1 &= ~(1 << 3 | 1 << 4);
6132         run_bbp_write(sc, 1, bbp1);
6133
6134         if (sc->mac_ver >= 0x5390)
6135                 run_rt5390_rf_setup(sc);
6136         else if (sc->mac_ver == 0x3593)
6137                 run_rt3593_rf_setup(sc);
6138         else if (sc->mac_ver >= 0x3070)
6139                 run_rt3070_rf_setup(sc);
6140
6141         /* select default channel */
6142         run_set_chan(sc, ic->ic_curchan);
6143
6144         /* setup initial protection mode */
6145         run_updateprot_cb(ic);
6146
6147         /* turn radio LED on */
6148         run_set_leds(sc, RT2860_LED_RADIO);
6149
6150         sc->sc_flags |= RUN_RUNNING;
6151         sc->cmdq_run = RUN_CMDQ_GO;
6152
6153         for (i = 0; i != RUN_N_XFER; i++)
6154                 usbd_xfer_set_stall(sc->sc_xfer[i]);
6155
6156         usbd_transfer_start(sc->sc_xfer[RUN_BULK_RX]);
6157
6158         if (run_txrx_enable(sc) != 0)
6159                 goto fail;
6160
6161         return;
6162
6163 fail:
6164         run_stop(sc);
6165 }
6166
6167 static void
6168 run_stop(void *arg)
6169 {
6170         struct run_softc *sc = (struct run_softc *)arg;
6171         uint32_t tmp;
6172         int i;
6173         int ntries;
6174
6175         RUN_LOCK_ASSERT(sc, MA_OWNED);
6176
6177         if (sc->sc_flags & RUN_RUNNING)
6178                 run_set_leds(sc, 0);    /* turn all LEDs off */
6179
6180         sc->sc_flags &= ~RUN_RUNNING;
6181
6182         sc->ratectl_run = RUN_RATECTL_OFF;
6183         sc->cmdq_run = sc->cmdq_key_set;
6184
6185         RUN_UNLOCK(sc);
6186
6187         for(i = 0; i < RUN_N_XFER; i++)
6188                 usbd_transfer_drain(sc->sc_xfer[i]);
6189
6190         RUN_LOCK(sc);
6191
6192         run_drain_mbufq(sc);
6193
6194         if (sc->rx_m != NULL) {
6195                 m_free(sc->rx_m);
6196                 sc->rx_m = NULL;
6197         }
6198
6199         /* Disable Tx/Rx DMA. */
6200         if (run_read(sc, RT2860_WPDMA_GLO_CFG, &tmp) != 0)
6201                 return;
6202         tmp &= ~(RT2860_RX_DMA_EN | RT2860_TX_DMA_EN);
6203         run_write(sc, RT2860_WPDMA_GLO_CFG, tmp);
6204
6205         for (ntries = 0; ntries < 100; ntries++) {
6206                 if (run_read(sc, RT2860_WPDMA_GLO_CFG, &tmp) != 0)
6207                         return;
6208                 if ((tmp & (RT2860_TX_DMA_BUSY | RT2860_RX_DMA_BUSY)) == 0)
6209                                 break;
6210                 run_delay(sc, 10);
6211         }
6212         if (ntries == 100) {
6213                 device_printf(sc->sc_dev, "timeout waiting for DMA engine\n");
6214                 return;
6215         }
6216
6217         /* disable Tx/Rx */
6218         run_read(sc, RT2860_MAC_SYS_CTRL, &tmp);
6219         tmp &= ~(RT2860_MAC_RX_EN | RT2860_MAC_TX_EN);
6220         run_write(sc, RT2860_MAC_SYS_CTRL, tmp);
6221
6222         /* wait for pending Tx to complete */
6223         for (ntries = 0; ntries < 100; ntries++) {
6224                 if (run_read(sc, RT2860_TXRXQ_PCNT, &tmp) != 0) {
6225                         DPRINTF("Cannot read Tx queue count\n");
6226                         break;
6227                 }
6228                 if ((tmp & RT2860_TX2Q_PCNT_MASK) == 0) {
6229                         DPRINTF("All Tx cleared\n");
6230                         break;
6231                 }
6232                 run_delay(sc, 10);
6233         }
6234         if (ntries >= 100)
6235                 DPRINTF("There are still pending Tx\n");
6236         run_delay(sc, 10);
6237         run_write(sc, RT2860_USB_DMA_CFG, 0);
6238
6239         run_write(sc, RT2860_MAC_SYS_CTRL, RT2860_BBP_HRST | RT2860_MAC_SRST);
6240         run_write(sc, RT2860_MAC_SYS_CTRL, 0);
6241
6242         for (i = 0; i != RUN_EP_QUEUES; i++)
6243                 run_unsetup_tx_list(sc, &sc->sc_epq[i]);
6244 }
6245
6246 static void
6247 run_delay(struct run_softc *sc, u_int ms)
6248 {
6249         usb_pause_mtx(lockowned(&sc->sc_lock) ? &sc->sc_lock : NULL,
6250             USB_MS_TO_TICKS(ms));
6251 }
6252
6253 static device_method_t run_methods[] = {
6254         /* Device interface */
6255         DEVMETHOD(device_probe,         run_match),
6256         DEVMETHOD(device_attach,        run_attach),
6257         DEVMETHOD(device_detach,        run_detach),
6258         DEVMETHOD_END
6259 };
6260
6261 static driver_t run_driver = {
6262         .name = "run",
6263         .methods = run_methods,
6264         .size = sizeof(struct run_softc)
6265 };
6266
6267 static devclass_t run_devclass;
6268
6269 DRIVER_MODULE(run, uhub, run_driver, run_devclass, run_driver_loaded, NULL);
6270 MODULE_DEPEND(run, wlan, 1, 1, 1);
6271 MODULE_DEPEND(run, usb, 1, 1, 1);
6272 MODULE_DEPEND(run, firmware, 1, 1, 1);
6273 MODULE_VERSION(run, 1);
6274 #if 0   /* Not implemented by DragonFly */
6275 USB_PNP_HOST_INFO(run_devs);
6276 #endif