3e7563e89c439b558ba0ced4822cbbd1d06754cf
[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  *
6  * Permission to use, copy, modify, and distribute this software for any
7  * purpose with or without fee is hereby granted, provided that the above
8  * copyright notice and this permission notice appear in all copies.
9  *
10  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17  */
18
19 #include <sys/cdefs.h>
20 __FBSDID("$FreeBSD$");
21
22 /*-
23  * Ralink Technology RT2700U/RT2800U/RT3000U 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/mutex.h>
32 #include <sys/mbuf.h>
33 #include <sys/kernel.h>
34 #include <sys/socket.h>
35 #include <sys/systm.h>
36 #include <sys/malloc.h>
37 #include <sys/module.h>
38 #include <sys/bus.h>
39 #include <sys/endian.h>
40 #include <sys/linker.h>
41 #include <sys/firmware.h>
42 #include <sys/kdb.h>
43
44 #include <machine/bus.h>
45 #include <machine/resource.h>
46 #include <sys/rman.h>
47
48 #include <net/bpf.h>
49 #include <net/if.h>
50 #include <net/if_arp.h>
51 #include <net/ethernet.h>
52 #include <net/if_dl.h>
53 #include <net/if_media.h>
54 #include <net/if_types.h>
55
56 #include <netinet/in.h>
57 #include <netinet/in_systm.h>
58 #include <netinet/in_var.h>
59 #include <netinet/if_ether.h>
60 #include <netinet/ip.h>
61
62 #include <net80211/ieee80211_var.h>
63 #include <net80211/ieee80211_regdomain.h>
64 #include <net80211/ieee80211_radiotap.h>
65 #include <net80211/ieee80211_ratectl.h>
66
67 #include <dev/usb/usb.h>
68 #include <dev/usb/usbdi.h>
69 #include "usbdevs.h"
70
71 #define USB_DEBUG_VAR run_debug
72 #include <dev/usb/usb_debug.h>
73
74 #include <dev/usb/wlan/if_runreg.h>
75 #include <dev/usb/wlan/if_runvar.h>
76
77 #define nitems(_a)      (sizeof((_a)) / sizeof((_a)[0]))
78
79 #ifdef  USB_DEBUG
80 #define RUN_DEBUG
81 #endif
82
83 #ifdef  RUN_DEBUG
84 int run_debug = 0;
85 static SYSCTL_NODE(_hw_usb, OID_AUTO, run, CTLFLAG_RW, 0, "USB run");
86 SYSCTL_INT(_hw_usb_run, OID_AUTO, debug, CTLFLAG_RW, &run_debug, 0,
87     "run debug level");
88 #endif
89
90 #define IEEE80211_HAS_ADDR4(wh) \
91         (((wh)->i_fc[1] & IEEE80211_FC1_DIR_MASK) == IEEE80211_FC1_DIR_DSTODS)
92
93 /*
94  * Because of LOR in run_key_delete(), use atomic instead.
95  * '& RUN_CMDQ_MASQ' is to loop cmdq[].
96  */
97 #define RUN_CMDQ_GET(c) (atomic_fetchadd_32((c), 1) & RUN_CMDQ_MASQ)
98
99 static const STRUCT_USB_HOST_ID run_devs[] = {
100 #define RUN_DEV(v,p) { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) }
101     RUN_DEV(ABOCOM,             RT2770),
102     RUN_DEV(ABOCOM,             RT2870),
103     RUN_DEV(ABOCOM,             RT3070),
104     RUN_DEV(ABOCOM,             RT3071),
105     RUN_DEV(ABOCOM,             RT3072),
106     RUN_DEV(ABOCOM2,            RT2870_1),
107     RUN_DEV(ACCTON,             RT2770),
108     RUN_DEV(ACCTON,             RT2870_1),
109     RUN_DEV(ACCTON,             RT2870_2),
110     RUN_DEV(ACCTON,             RT2870_3),
111     RUN_DEV(ACCTON,             RT2870_4),
112     RUN_DEV(ACCTON,             RT2870_5),
113     RUN_DEV(ACCTON,             RT3070),
114     RUN_DEV(ACCTON,             RT3070_1),
115     RUN_DEV(ACCTON,             RT3070_2),
116     RUN_DEV(ACCTON,             RT3070_3),
117     RUN_DEV(ACCTON,             RT3070_4),
118     RUN_DEV(ACCTON,             RT3070_5),
119     RUN_DEV(AIRTIES,            RT3070),
120     RUN_DEV(ALLWIN,             RT2070),
121     RUN_DEV(ALLWIN,             RT2770),
122     RUN_DEV(ALLWIN,             RT2870),
123     RUN_DEV(ALLWIN,             RT3070),
124     RUN_DEV(ALLWIN,             RT3071),
125     RUN_DEV(ALLWIN,             RT3072),
126     RUN_DEV(ALLWIN,             RT3572),
127     RUN_DEV(AMIGO,              RT2870_1),
128     RUN_DEV(AMIGO,              RT2870_2),
129     RUN_DEV(AMIT,               CGWLUSB2GNR),
130     RUN_DEV(AMIT,               RT2870_1),
131     RUN_DEV(AMIT2,              RT2870),
132     RUN_DEV(ASUS,               RT2870_1),
133     RUN_DEV(ASUS,               RT2870_2),
134     RUN_DEV(ASUS,               RT2870_3),
135     RUN_DEV(ASUS,               RT2870_4),
136     RUN_DEV(ASUS,               RT2870_5),
137     RUN_DEV(ASUS,               USBN13),
138     RUN_DEV(ASUS,               RT3070_1),
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,             F5D8053V3),
146     RUN_DEV(BELKIN,             F5D8055),
147     RUN_DEV(BELKIN,             F5D8055V2),
148     RUN_DEV(BELKIN,             F6D4050V1),
149     RUN_DEV(BELKIN,             RT2870_1),
150     RUN_DEV(BELKIN,             RT2870_2),
151     RUN_DEV(CISCOLINKSYS,       AE1000),
152     RUN_DEV(CISCOLINKSYS2,      RT3070),
153     RUN_DEV(CISCOLINKSYS3,      RT3070),
154     RUN_DEV(CONCEPTRONIC2,      RT2870_1),
155     RUN_DEV(CONCEPTRONIC2,      RT2870_2),
156     RUN_DEV(CONCEPTRONIC2,      RT2870_3),
157     RUN_DEV(CONCEPTRONIC2,      RT2870_4),
158     RUN_DEV(CONCEPTRONIC2,      RT2870_5),
159     RUN_DEV(CONCEPTRONIC2,      RT2870_6),
160     RUN_DEV(CONCEPTRONIC2,      RT2870_7),
161     RUN_DEV(CONCEPTRONIC2,      RT2870_8),
162     RUN_DEV(CONCEPTRONIC2,      RT3070_1),
163     RUN_DEV(CONCEPTRONIC2,      RT3070_2),
164     RUN_DEV(CONCEPTRONIC2,      VIGORN61),
165     RUN_DEV(COREGA,             CGWLUSB300GNM),
166     RUN_DEV(COREGA,             RT2870_1),
167     RUN_DEV(COREGA,             RT2870_2),
168     RUN_DEV(COREGA,             RT2870_3),
169     RUN_DEV(COREGA,             RT3070),
170     RUN_DEV(CYBERTAN,           RT2870),
171     RUN_DEV(DLINK,              RT2870),
172     RUN_DEV(DLINK,              RT3072),
173     RUN_DEV(DLINK2,             DWA130),
174     RUN_DEV(DLINK2,             RT2870_1),
175     RUN_DEV(DLINK2,             RT2870_2),
176     RUN_DEV(DLINK2,             RT3070_1),
177     RUN_DEV(DLINK2,             RT3070_2),
178     RUN_DEV(DLINK2,             RT3070_3),
179     RUN_DEV(DLINK2,             RT3070_4),
180     RUN_DEV(DLINK2,             RT3070_5),
181     RUN_DEV(DLINK2,             RT3072),
182     RUN_DEV(DLINK2,             RT3072_1),
183     RUN_DEV(EDIMAX,             EW7717),
184     RUN_DEV(EDIMAX,             EW7718),
185     RUN_DEV(EDIMAX,             RT2870_1),
186     RUN_DEV(ENCORE,             RT3070_1),
187     RUN_DEV(ENCORE,             RT3070_2),
188     RUN_DEV(ENCORE,             RT3070_3),
189     RUN_DEV(GIGABYTE,           GNWB31N),
190     RUN_DEV(GIGABYTE,           GNWB32L),
191     RUN_DEV(GIGABYTE,           RT2870_1),
192     RUN_DEV(GIGASET,            RT3070_1),
193     RUN_DEV(GIGASET,            RT3070_2),
194     RUN_DEV(GUILLEMOT,          HWNU300),
195     RUN_DEV(HAWKING,            HWUN2),
196     RUN_DEV(HAWKING,            RT2870_1),
197     RUN_DEV(HAWKING,            RT2870_2),
198     RUN_DEV(HAWKING,            RT3070),
199     RUN_DEV(IODATA,             RT3072_1),
200     RUN_DEV(IODATA,             RT3072_2),
201     RUN_DEV(IODATA,             RT3072_3),
202     RUN_DEV(IODATA,             RT3072_4),
203     RUN_DEV(LINKSYS4,           RT3070),
204     RUN_DEV(LINKSYS4,           WUSB100),
205     RUN_DEV(LINKSYS4,           WUSB54GCV3),
206     RUN_DEV(LINKSYS4,           WUSB600N),
207     RUN_DEV(LINKSYS4,           WUSB600NV2),
208     RUN_DEV(LOGITEC,            RT2870_1),
209     RUN_DEV(LOGITEC,            RT2870_2),
210     RUN_DEV(LOGITEC,            RT2870_3),
211     RUN_DEV(LOGITEC,            LANW300NU2),
212     RUN_DEV(MELCO,              RT2870_1),
213     RUN_DEV(MELCO,              RT2870_2),
214     RUN_DEV(MELCO,              WLIUCAG300N),
215     RUN_DEV(MELCO,              WLIUCG300N),
216     RUN_DEV(MELCO,              WLIUCG301N),
217     RUN_DEV(MELCO,              WLIUCGN),
218     RUN_DEV(MELCO,              WLIUCGNM),
219     RUN_DEV(MOTOROLA4,          RT2770),
220     RUN_DEV(MOTOROLA4,          RT3070),
221     RUN_DEV(MSI,                RT3070_1),
222     RUN_DEV(MSI,                RT3070_2),
223     RUN_DEV(MSI,                RT3070_3),
224     RUN_DEV(MSI,                RT3070_4),
225     RUN_DEV(MSI,                RT3070_5),
226     RUN_DEV(MSI,                RT3070_6),
227     RUN_DEV(MSI,                RT3070_7),
228     RUN_DEV(MSI,                RT3070_8),
229     RUN_DEV(MSI,                RT3070_9),
230     RUN_DEV(MSI,                RT3070_10),
231     RUN_DEV(MSI,                RT3070_11),
232     RUN_DEV(OVISLINK,           RT3072),
233     RUN_DEV(PARA,               RT3070),
234     RUN_DEV(PEGATRON,           RT2870),
235     RUN_DEV(PEGATRON,           RT3070),
236     RUN_DEV(PEGATRON,           RT3070_2),
237     RUN_DEV(PEGATRON,           RT3070_3),
238     RUN_DEV(PHILIPS,            RT2870),
239     RUN_DEV(PLANEX2,            GWUS300MINIS),
240     RUN_DEV(PLANEX2,            GWUSMICRON),
241     RUN_DEV(PLANEX2,            RT2870),
242     RUN_DEV(PLANEX2,            RT3070),
243     RUN_DEV(QCOM,               RT2870),
244     RUN_DEV(QUANTA,             RT3070),
245     RUN_DEV(RALINK,             RT2070),
246     RUN_DEV(RALINK,             RT2770),
247     RUN_DEV(RALINK,             RT2870),
248     RUN_DEV(RALINK,             RT3070),
249     RUN_DEV(RALINK,             RT3071),
250     RUN_DEV(RALINK,             RT3072),
251     RUN_DEV(RALINK,             RT3370),
252     RUN_DEV(RALINK,             RT3572),
253     RUN_DEV(RALINK,             RT8070),
254     RUN_DEV(SAMSUNG,            WIS09ABGN),
255     RUN_DEV(SAMSUNG2,           RT2870_1),
256     RUN_DEV(SENAO,              RT2870_1),
257     RUN_DEV(SENAO,              RT2870_2),
258     RUN_DEV(SENAO,              RT2870_3),
259     RUN_DEV(SENAO,              RT2870_4),
260     RUN_DEV(SENAO,              RT3070),
261     RUN_DEV(SENAO,              RT3071),
262     RUN_DEV(SENAO,              RT3072_1),
263     RUN_DEV(SENAO,              RT3072_2),
264     RUN_DEV(SENAO,              RT3072_3),
265     RUN_DEV(SENAO,              RT3072_4),
266     RUN_DEV(SENAO,              RT3072_5),
267     RUN_DEV(SITECOMEU,          RT2770),
268     RUN_DEV(SITECOMEU,          RT2870_1),
269     RUN_DEV(SITECOMEU,          RT2870_2),
270     RUN_DEV(SITECOMEU,          RT2870_3),
271     RUN_DEV(SITECOMEU,          RT2870_4),
272     RUN_DEV(SITECOMEU,          RT3070),
273     RUN_DEV(SITECOMEU,          RT3070_2),
274     RUN_DEV(SITECOMEU,          RT3070_3),
275     RUN_DEV(SITECOMEU,          RT3070_4),
276     RUN_DEV(SITECOMEU,          RT3071),
277     RUN_DEV(SITECOMEU,          RT3072_1),
278     RUN_DEV(SITECOMEU,          RT3072_2),
279     RUN_DEV(SITECOMEU,          RT3072_3),
280     RUN_DEV(SITECOMEU,          RT3072_4),
281     RUN_DEV(SITECOMEU,          RT3072_5),
282     RUN_DEV(SITECOMEU,          RT3072_6),
283     RUN_DEV(SITECOMEU,          WL608),
284     RUN_DEV(SPARKLAN,           RT2870_1),
285     RUN_DEV(SPARKLAN,           RT3070),
286     RUN_DEV(SWEEX2,             LW153),
287     RUN_DEV(SWEEX2,             LW303),
288     RUN_DEV(SWEEX2,             LW313),
289     RUN_DEV(TOSHIBA,            RT3070),
290     RUN_DEV(UMEDIA,             RT2870_1),
291     RUN_DEV(ZCOM,               RT2870_1),
292     RUN_DEV(ZCOM,               RT2870_2),
293     RUN_DEV(ZINWELL,            RT2870_1),
294     RUN_DEV(ZINWELL,            RT2870_2),
295     RUN_DEV(ZINWELL,            RT3070),
296     RUN_DEV(ZINWELL,            RT3072_1),
297     RUN_DEV(ZINWELL,            RT3072_2),
298     RUN_DEV(ZYXEL,              RT2870_1),
299     RUN_DEV(ZYXEL,              RT2870_2),
300 #undef RUN_DEV
301 };
302
303 static device_probe_t   run_match;
304 static device_attach_t  run_attach;
305 static device_detach_t  run_detach;
306
307 static usb_callback_t   run_bulk_rx_callback;
308 static usb_callback_t   run_bulk_tx_callback0;
309 static usb_callback_t   run_bulk_tx_callback1;
310 static usb_callback_t   run_bulk_tx_callback2;
311 static usb_callback_t   run_bulk_tx_callback3;
312 static usb_callback_t   run_bulk_tx_callback4;
313 static usb_callback_t   run_bulk_tx_callback5;
314
315 static void     run_bulk_tx_callbackN(struct usb_xfer *xfer,
316                     usb_error_t error, unsigned int index);
317 static struct ieee80211vap *run_vap_create(struct ieee80211com *,
318                     const char [IFNAMSIZ], int, enum ieee80211_opmode, int,
319                     const uint8_t [IEEE80211_ADDR_LEN],
320                     const uint8_t [IEEE80211_ADDR_LEN]);
321 static void     run_vap_delete(struct ieee80211vap *);
322 static void     run_cmdq_cb(void *, int);
323 static void     run_setup_tx_list(struct run_softc *,
324                     struct run_endpoint_queue *);
325 static void     run_unsetup_tx_list(struct run_softc *,
326                     struct run_endpoint_queue *);
327 static int      run_load_microcode(struct run_softc *);
328 static int      run_reset(struct run_softc *);
329 static usb_error_t run_do_request(struct run_softc *,
330                     struct usb_device_request *, void *);
331 static int      run_read(struct run_softc *, uint16_t, uint32_t *);
332 static int      run_read_region_1(struct run_softc *, uint16_t, uint8_t *, int);
333 static int      run_write_2(struct run_softc *, uint16_t, uint16_t);
334 static int      run_write(struct run_softc *, uint16_t, uint32_t);
335 static int      run_write_region_1(struct run_softc *, uint16_t,
336                     const uint8_t *, int);
337 static int      run_set_region_4(struct run_softc *, uint16_t, uint32_t, int);
338 static int      run_efuse_read_2(struct run_softc *, uint16_t, uint16_t *);
339 static int      run_eeprom_read_2(struct run_softc *, uint16_t, uint16_t *);
340 static int      run_rt2870_rf_write(struct run_softc *, uint8_t, uint32_t);
341 static int      run_rt3070_rf_read(struct run_softc *, uint8_t, uint8_t *);
342 static int      run_rt3070_rf_write(struct run_softc *, uint8_t, uint8_t);
343 static int      run_bbp_read(struct run_softc *, uint8_t, uint8_t *);
344 static int      run_bbp_write(struct run_softc *, uint8_t, uint8_t);
345 static int      run_mcu_cmd(struct run_softc *, uint8_t, uint16_t);
346 static const char *run_get_rf(int);
347 static int      run_read_eeprom(struct run_softc *);
348 static struct ieee80211_node *run_node_alloc(struct ieee80211vap *,
349                             const uint8_t mac[IEEE80211_ADDR_LEN]);
350 static int      run_media_change(struct ifnet *);
351 static int      run_newstate(struct ieee80211vap *, enum ieee80211_state, int);
352 static int      run_wme_update(struct ieee80211com *);
353 static void     run_wme_update_cb(void *);
354 static void     run_key_update_begin(struct ieee80211vap *);
355 static void     run_key_update_end(struct ieee80211vap *);
356 static void     run_key_set_cb(void *);
357 static int      run_key_set(struct ieee80211vap *, struct ieee80211_key *,
358                             const uint8_t mac[IEEE80211_ADDR_LEN]);
359 static void     run_key_delete_cb(void *);
360 static int      run_key_delete(struct ieee80211vap *, struct ieee80211_key *);
361 static void     run_ratectl_to(void *);
362 static void     run_ratectl_cb(void *, int);
363 static void     run_drain_fifo(void *);
364 static void     run_iter_func(void *, struct ieee80211_node *);
365 static void     run_newassoc_cb(void *);
366 static void     run_newassoc(struct ieee80211_node *, int);
367 static void     run_rx_frame(struct run_softc *, struct mbuf *, uint32_t);
368 static void     run_tx_free(struct run_endpoint_queue *pq,
369                     struct run_tx_data *, int);
370 static void     run_set_tx_desc(struct run_softc *, struct run_tx_data *);
371 static int      run_tx(struct run_softc *, struct mbuf *,
372                     struct ieee80211_node *);
373 static int      run_tx_mgt(struct run_softc *, struct mbuf *,
374                     struct ieee80211_node *);
375 static int      run_sendprot(struct run_softc *, const struct mbuf *,
376                     struct ieee80211_node *, int, int);
377 static int      run_tx_param(struct run_softc *, struct mbuf *,
378                     struct ieee80211_node *,
379                     const struct ieee80211_bpf_params *);
380 static int      run_raw_xmit(struct ieee80211_node *, struct mbuf *,
381                     const struct ieee80211_bpf_params *);
382 static void     run_start(struct ifnet *);
383 static int      run_ioctl(struct ifnet *, u_long, caddr_t);
384 static void     run_set_agc(struct run_softc *, uint8_t);
385 static void     run_select_chan_group(struct run_softc *, int);
386 static void     run_set_rx_antenna(struct run_softc *, int);
387 static void     run_rt2870_set_chan(struct run_softc *, u_int);
388 static void     run_rt3070_set_chan(struct run_softc *, u_int);
389 static void     run_rt3572_set_chan(struct run_softc *, u_int);
390 static int      run_set_chan(struct run_softc *, struct ieee80211_channel *);
391 static void     run_set_channel(struct ieee80211com *);
392 static void     run_scan_start(struct ieee80211com *);
393 static void     run_scan_end(struct ieee80211com *);
394 static void     run_update_beacon(struct ieee80211vap *, int);
395 static void     run_update_beacon_cb(void *);
396 static void     run_updateprot(struct ieee80211com *);
397 static void     run_updateprot_cb(void *);
398 static void     run_usb_timeout_cb(void *);
399 static void     run_reset_livelock(struct run_softc *);
400 static void     run_enable_tsf_sync(struct run_softc *);
401 static void     run_enable_mrr(struct run_softc *);
402 static void     run_set_txpreamble(struct run_softc *);
403 static void     run_set_basicrates(struct run_softc *);
404 static void     run_set_leds(struct run_softc *, uint16_t);
405 static void     run_set_bssid(struct run_softc *, const uint8_t *);
406 static void     run_set_macaddr(struct run_softc *, const uint8_t *);
407 static void     run_updateslot(struct ifnet *);
408 static void     run_updateslot_cb(void *);
409 static void     run_update_mcast(struct ifnet *);
410 static int8_t   run_rssi2dbm(struct run_softc *, uint8_t, uint8_t);
411 static void     run_update_promisc_locked(struct ifnet *);
412 static void     run_update_promisc(struct ifnet *);
413 static int      run_bbp_init(struct run_softc *);
414 static int      run_rt3070_rf_init(struct run_softc *);
415 static int      run_rt3070_filter_calib(struct run_softc *, uint8_t, uint8_t,
416                     uint8_t *);
417 static void     run_rt3070_rf_setup(struct run_softc *);
418 static int      run_txrx_enable(struct run_softc *);
419 static void     run_init(void *);
420 static void     run_init_locked(struct run_softc *);
421 static void     run_stop(void *);
422 static void     run_delay(struct run_softc *, unsigned int);
423
424 static const struct {
425         uint16_t        reg;
426         uint32_t        val;
427 } rt2870_def_mac[] = {
428         RT2870_DEF_MAC
429 };
430
431 static const struct {
432         uint8_t reg;
433         uint8_t val;
434 } rt2860_def_bbp[] = {
435         RT2860_DEF_BBP
436 };
437
438 static const struct rfprog {
439         uint8_t         chan;
440         uint32_t        r1, r2, r3, r4;
441 } rt2860_rf2850[] = {
442         RT2860_RF2850
443 };
444
445 struct {
446         uint8_t n, r, k;
447 } rt3070_freqs[] = {
448         RT3070_RF3052
449 };
450
451 static const struct {
452         uint8_t reg;
453         uint8_t val;
454 } rt3070_def_rf[] = {
455         RT3070_DEF_RF
456 },rt3572_def_rf[] = {
457         RT3572_DEF_RF
458 };
459
460 static const struct usb_config run_config[RUN_N_XFER] = {
461     [RUN_BULK_TX_BE] = {
462         .type = UE_BULK,
463         .endpoint = UE_ADDR_ANY,
464         .ep_index = 0,
465         .direction = UE_DIR_OUT,
466         .bufsize = RUN_MAX_TXSZ,
467         .flags = {.pipe_bof = 1,.force_short_xfer = 1,},
468         .callback = run_bulk_tx_callback0,
469         .timeout = 5000,        /* ms */
470     },
471     [RUN_BULK_TX_BK] = {
472         .type = UE_BULK,
473         .endpoint = UE_ADDR_ANY,
474         .direction = UE_DIR_OUT,
475         .ep_index = 1,
476         .bufsize = RUN_MAX_TXSZ,
477         .flags = {.pipe_bof = 1,.force_short_xfer = 1,},
478         .callback = run_bulk_tx_callback1,
479         .timeout = 5000,        /* ms */
480     },
481     [RUN_BULK_TX_VI] = {
482         .type = UE_BULK,
483         .endpoint = UE_ADDR_ANY,
484         .direction = UE_DIR_OUT,
485         .ep_index = 2,
486         .bufsize = RUN_MAX_TXSZ,
487         .flags = {.pipe_bof = 1,.force_short_xfer = 1,},
488         .callback = run_bulk_tx_callback2,
489         .timeout = 5000,        /* ms */
490     },
491     [RUN_BULK_TX_VO] = {
492         .type = UE_BULK,
493         .endpoint = UE_ADDR_ANY,
494         .direction = UE_DIR_OUT,
495         .ep_index = 3,
496         .bufsize = RUN_MAX_TXSZ,
497         .flags = {.pipe_bof = 1,.force_short_xfer = 1,},
498         .callback = run_bulk_tx_callback3,
499         .timeout = 5000,        /* ms */
500     },
501     [RUN_BULK_TX_HCCA] = {
502         .type = UE_BULK,
503         .endpoint = UE_ADDR_ANY,
504         .direction = UE_DIR_OUT,
505         .ep_index = 4,
506         .bufsize = RUN_MAX_TXSZ,
507         .flags = {.pipe_bof = 1,.force_short_xfer = 1,.no_pipe_ok = 1,},
508         .callback = run_bulk_tx_callback4,
509         .timeout = 5000,        /* ms */
510     },
511     [RUN_BULK_TX_PRIO] = {
512         .type = UE_BULK,
513         .endpoint = UE_ADDR_ANY,
514         .direction = UE_DIR_OUT,
515         .ep_index = 5,
516         .bufsize = RUN_MAX_TXSZ,
517         .flags = {.pipe_bof = 1,.force_short_xfer = 1,.no_pipe_ok = 1,},
518         .callback = run_bulk_tx_callback5,
519         .timeout = 5000,        /* ms */
520     },
521     [RUN_BULK_RX] = {
522         .type = UE_BULK,
523         .endpoint = UE_ADDR_ANY,
524         .direction = UE_DIR_IN,
525         .bufsize = RUN_MAX_RXSZ,
526         .flags = {.pipe_bof = 1,.short_xfer_ok = 1,},
527         .callback = run_bulk_rx_callback,
528     }
529 };
530
531 static int
532 run_match(device_t self)
533 {
534         struct usb_attach_arg *uaa = device_get_ivars(self);
535
536         if (uaa->usb_mode != USB_MODE_HOST)
537                 return (ENXIO);
538         if (uaa->info.bConfigIndex != 0)
539                 return (ENXIO);
540         if (uaa->info.bIfaceIndex != RT2860_IFACE_INDEX)
541                 return (ENXIO);
542
543         return (usbd_lookup_id_by_uaa(run_devs, sizeof(run_devs), uaa));
544 }
545
546 static int
547 run_attach(device_t self)
548 {
549         struct run_softc *sc = device_get_softc(self);
550         struct usb_attach_arg *uaa = device_get_ivars(self);
551         struct ieee80211com *ic;
552         struct ifnet *ifp;
553         uint32_t ver;
554         int i, ntries, error;
555         uint8_t iface_index, bands;
556
557         device_set_usb_desc(self);
558         sc->sc_udev = uaa->device;
559         sc->sc_dev = self;
560
561         mtx_init(&sc->sc_mtx, device_get_nameunit(sc->sc_dev),
562             MTX_NETWORK_LOCK, MTX_DEF);
563
564         iface_index = RT2860_IFACE_INDEX;
565
566         error = usbd_transfer_setup(uaa->device, &iface_index,
567             sc->sc_xfer, run_config, RUN_N_XFER, sc, &sc->sc_mtx);
568         if (error) {
569                 device_printf(self, "could not allocate USB transfers, "
570                     "err=%s\n", usbd_errstr(error));
571                 goto detach;
572         }
573
574         RUN_LOCK(sc);
575
576         /* wait for the chip to settle */
577         for (ntries = 0; ntries < 100; ntries++) {
578                 if (run_read(sc, RT2860_ASIC_VER_ID, &ver) != 0) {
579                         RUN_UNLOCK(sc);
580                         goto detach;
581                 }
582                 if (ver != 0 && ver != 0xffffffff)
583                         break;
584                 run_delay(sc, 10);
585         }
586         if (ntries == 100) {
587                 device_printf(sc->sc_dev,
588                     "timeout waiting for NIC to initialize\n");
589                 RUN_UNLOCK(sc);
590                 goto detach;
591         }
592         sc->mac_ver = ver >> 16;
593         sc->mac_rev = ver & 0xffff;
594
595         /* retrieve RF rev. no and various other things from EEPROM */
596         run_read_eeprom(sc);
597
598         device_printf(sc->sc_dev,
599             "MAC/BBP RT%04X (rev 0x%04X), RF %s (MIMO %dT%dR), address %s\n",
600             sc->mac_ver, sc->mac_rev, run_get_rf(sc->rf_rev),
601             sc->ntxchains, sc->nrxchains, ether_sprintf(sc->sc_bssid));
602
603         if ((error = run_load_microcode(sc)) != 0) {
604                 device_printf(sc->sc_dev, "could not load 8051 microcode\n");
605                 RUN_UNLOCK(sc);
606                 goto detach;
607         }
608
609         RUN_UNLOCK(sc);
610
611         ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211);
612         if (ifp == NULL) {
613                 device_printf(sc->sc_dev, "can not if_alloc()\n");
614                 goto detach;
615         }
616         ic = ifp->if_l2com;
617
618         ifp->if_softc = sc;
619         if_initname(ifp, "run", device_get_unit(sc->sc_dev));
620         ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
621         ifp->if_init = run_init;
622         ifp->if_ioctl = run_ioctl;
623         ifp->if_start = run_start;
624         IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen);
625         ifp->if_snd.ifq_drv_maxlen = ifqmaxlen;
626         IFQ_SET_READY(&ifp->if_snd);
627
628         ic->ic_ifp = ifp;
629         ic->ic_phytype = IEEE80211_T_OFDM;      /* not only, but not used */
630         ic->ic_opmode = IEEE80211_M_STA;        /* default to BSS mode */
631
632         /* set device capabilities */
633         ic->ic_caps =
634             IEEE80211_C_STA |           /* station mode supported */
635             IEEE80211_C_MONITOR |       /* monitor mode supported */
636             IEEE80211_C_IBSS |
637             IEEE80211_C_HOSTAP |
638             IEEE80211_C_WDS |           /* 4-address traffic works */
639             IEEE80211_C_MBSS |
640             IEEE80211_C_SHPREAMBLE |    /* short preamble supported */
641             IEEE80211_C_SHSLOT |        /* short slot time supported */
642             IEEE80211_C_WME |           /* WME */
643             IEEE80211_C_WPA;            /* WPA1|WPA2(RSN) */
644
645         ic->ic_cryptocaps =
646             IEEE80211_CRYPTO_WEP |
647             IEEE80211_CRYPTO_AES_CCM |
648             IEEE80211_CRYPTO_TKIPMIC |
649             IEEE80211_CRYPTO_TKIP;
650
651         ic->ic_flags |= IEEE80211_F_DATAPAD;
652         ic->ic_flags_ext |= IEEE80211_FEXT_SWBMISS;
653
654         bands = 0;
655         setbit(&bands, IEEE80211_MODE_11B);
656         setbit(&bands, IEEE80211_MODE_11G);
657         ieee80211_init_channels(ic, NULL, &bands);
658
659         /*
660          * Do this by own because h/w supports
661          * more channels than ieee80211_init_channels()
662          */
663         if (sc->rf_rev == RT2860_RF_2750 ||
664             sc->rf_rev == RT2860_RF_2850 ||
665             sc->rf_rev == RT3070_RF_3052) {
666                 /* set supported .11a rates */
667                 for (i = 14; i < nitems(rt2860_rf2850); i++) {
668                         uint8_t chan = rt2860_rf2850[i].chan;
669                         ic->ic_channels[ic->ic_nchans].ic_freq =
670                             ieee80211_ieee2mhz(chan, IEEE80211_CHAN_A);
671                         ic->ic_channels[ic->ic_nchans].ic_ieee = chan;
672                         ic->ic_channels[ic->ic_nchans].ic_flags = IEEE80211_CHAN_A;
673                         ic->ic_channels[ic->ic_nchans].ic_extieee = 0;
674                         ic->ic_nchans++;
675                 }
676         }
677
678         ieee80211_ifattach(ic, sc->sc_bssid);
679
680         ic->ic_scan_start = run_scan_start;
681         ic->ic_scan_end = run_scan_end;
682         ic->ic_set_channel = run_set_channel;
683         ic->ic_node_alloc = run_node_alloc;
684         ic->ic_newassoc = run_newassoc;
685         ic->ic_updateslot = run_updateslot;
686         ic->ic_update_mcast = run_update_mcast;
687         ic->ic_wme.wme_update = run_wme_update;
688         ic->ic_raw_xmit = run_raw_xmit;
689         ic->ic_update_promisc = run_update_promisc;
690
691         ic->ic_vap_create = run_vap_create;
692         ic->ic_vap_delete = run_vap_delete;
693
694         ieee80211_radiotap_attach(ic,
695             &sc->sc_txtap.wt_ihdr, sizeof(sc->sc_txtap),
696                 RUN_TX_RADIOTAP_PRESENT,
697             &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap),
698                 RUN_RX_RADIOTAP_PRESENT);
699
700         TASK_INIT(&sc->cmdq_task, 0, run_cmdq_cb, sc);
701         TASK_INIT(&sc->ratectl_task, 0, run_ratectl_cb, sc);
702         callout_init((struct callout *)&sc->ratectl_ch, 1);
703
704         if (bootverbose)
705                 ieee80211_announce(ic);
706
707         return (0);
708
709 detach:
710         run_detach(self);
711         return (ENXIO);
712 }
713
714 static int
715 run_detach(device_t self)
716 {
717         struct run_softc *sc = device_get_softc(self);
718         struct ifnet *ifp = sc->sc_ifp;
719         struct ieee80211com *ic;
720         int i;
721
722         /* stop all USB transfers */
723         usbd_transfer_unsetup(sc->sc_xfer, RUN_N_XFER);
724
725         RUN_LOCK(sc);
726
727         sc->ratectl_run = RUN_RATECTL_OFF;
728         sc->cmdq_run = sc->cmdq_key_set = RUN_CMDQ_ABORT;
729
730         /* free TX list, if any */
731         for (i = 0; i != RUN_EP_QUEUES; i++)
732                 run_unsetup_tx_list(sc, &sc->sc_epq[i]);
733         RUN_UNLOCK(sc);
734
735         if (ifp) {
736                 ic = ifp->if_l2com;
737                 /* drain tasks */
738                 usb_callout_drain(&sc->ratectl_ch);
739                 ieee80211_draintask(ic, &sc->cmdq_task);
740                 ieee80211_draintask(ic, &sc->ratectl_task);
741                 ieee80211_ifdetach(ic);
742                 if_free(ifp);
743         }
744
745         mtx_destroy(&sc->sc_mtx);
746
747         return (0);
748 }
749
750 static struct ieee80211vap *
751 run_vap_create(struct ieee80211com *ic, const char name[IFNAMSIZ], int unit,
752     enum ieee80211_opmode opmode, int flags,
753     const uint8_t bssid[IEEE80211_ADDR_LEN],
754     const uint8_t mac[IEEE80211_ADDR_LEN])
755 {
756         struct ifnet *ifp = ic->ic_ifp;
757         struct run_softc *sc = ifp->if_softc;
758         struct run_vap *rvp;
759         struct ieee80211vap *vap;
760         int i;
761
762         if (sc->rvp_cnt >= RUN_VAP_MAX) {
763                 if_printf(ifp, "number of VAPs maxed out\n");
764                 return (NULL);
765         }
766
767         switch (opmode) {
768         case IEEE80211_M_STA:
769                 /* enable s/w bmiss handling for sta mode */
770                 flags |= IEEE80211_CLONE_NOBEACONS; 
771                 /* fall though */
772         case IEEE80211_M_IBSS:
773         case IEEE80211_M_MONITOR:
774         case IEEE80211_M_HOSTAP:
775         case IEEE80211_M_MBSS:
776                 /* other than WDS vaps, only one at a time */
777                 if (!TAILQ_EMPTY(&ic->ic_vaps))
778                         return (NULL);
779                 break;
780         case IEEE80211_M_WDS:
781                 TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next){
782                         if(vap->iv_opmode != IEEE80211_M_HOSTAP)
783                                 continue;
784                         /* WDS vap's always share the local mac address. */
785                         flags &= ~IEEE80211_CLONE_BSSID;
786                         break;
787                 }
788                 if (vap == NULL) {
789                         if_printf(ifp, "wds only supported in ap mode\n");
790                         return (NULL);
791                 }
792                 break;
793         default:
794                 if_printf(ifp, "unknown opmode %d\n", opmode);
795                 return (NULL);
796         }
797
798         rvp = (struct run_vap *) malloc(sizeof(struct run_vap),
799             M_80211_VAP, M_WAITOK | M_ZERO);
800         if (rvp == NULL)
801                 return (NULL);
802         vap = &rvp->vap;
803         ieee80211_vap_setup(ic, vap, name, unit, opmode, flags, bssid, mac);
804
805         vap->iv_key_update_begin = run_key_update_begin;
806         vap->iv_key_update_end = run_key_update_end;
807         vap->iv_update_beacon = run_update_beacon;
808         vap->iv_max_aid = RT2870_WCID_MAX;
809         /*
810          * To delete the right key from h/w, we need wcid.
811          * Luckily, there is unused space in ieee80211_key{}, wk_pad,
812          * and matching wcid will be written into there. So, cast
813          * some spells to remove 'const' from ieee80211_key{}
814          */
815         vap->iv_key_delete = (void *)run_key_delete;
816         vap->iv_key_set = (void *)run_key_set;
817
818         /* override state transition machine */
819         rvp->newstate = vap->iv_newstate;
820         vap->iv_newstate = run_newstate;
821
822         ieee80211_ratectl_init(vap);
823         ieee80211_ratectl_setinterval(vap, 1000 /* 1 sec */);
824
825         /* complete setup */
826         ieee80211_vap_attach(vap, run_media_change, ieee80211_media_status);
827
828         /* make sure id is always unique */
829         for (i = 0; i < RUN_VAP_MAX; i++) {
830                 if((sc->rvp_bmap & 1 << i) == 0){
831                         sc->rvp_bmap |= 1 << i;
832                         rvp->rvp_id = i;
833                         break;
834                 }
835         }
836         if (sc->rvp_cnt++ == 0)
837                 ic->ic_opmode = opmode;
838
839         if (opmode == IEEE80211_M_HOSTAP)
840                 sc->cmdq_run = RUN_CMDQ_GO;
841
842         DPRINTF("rvp_id=%d bmap=%x rvp_cnt=%d\n",
843             rvp->rvp_id, sc->rvp_bmap, sc->rvp_cnt);
844
845         return (vap);
846 }
847
848 static void
849 run_vap_delete(struct ieee80211vap *vap)
850 {
851         struct run_vap *rvp = RUN_VAP(vap);
852         struct ifnet *ifp;
853         struct ieee80211com *ic;
854         struct run_softc *sc;
855         uint8_t rvp_id;
856
857         if (vap == NULL)
858                 return;
859
860         ic = vap->iv_ic;
861         ifp = ic->ic_ifp;
862
863         sc = ifp->if_softc;
864
865         RUN_LOCK(sc);
866
867         m_freem(rvp->beacon_mbuf);
868         rvp->beacon_mbuf = NULL;
869
870         rvp_id = rvp->rvp_id;
871         sc->ratectl_run &= ~(1 << rvp_id);
872         sc->rvp_bmap &= ~(1 << rvp_id);
873         run_set_region_4(sc, RT2860_SKEY(rvp_id, 0), 0, 128);
874         run_set_region_4(sc, RT2860_BCN_BASE(rvp_id), 0, 512);
875         --sc->rvp_cnt;
876
877         DPRINTF("vap=%p rvp_id=%d bmap=%x rvp_cnt=%d\n",
878             vap, rvp_id, sc->rvp_bmap, sc->rvp_cnt);
879
880         RUN_UNLOCK(sc);
881
882         ieee80211_ratectl_deinit(vap);
883         ieee80211_vap_detach(vap);
884         free(rvp, M_80211_VAP);
885 }
886
887 /*
888  * There are numbers of functions need to be called in context thread.
889  * Rather than creating taskqueue event for each of those functions,
890  * here is all-for-one taskqueue callback function. This function
891  * gurantees deferred functions are executed in the same order they
892  * were enqueued.
893  * '& RUN_CMDQ_MASQ' is to loop cmdq[].
894  */
895 static void
896 run_cmdq_cb(void *arg, int pending)
897 {
898         struct run_softc *sc = arg;
899         uint8_t i;
900
901         /* call cmdq[].func locked */
902         RUN_LOCK(sc);
903         for (i = sc->cmdq_exec; sc->cmdq[i].func && pending;
904             i = sc->cmdq_exec, pending--) {
905                 DPRINTFN(6, "cmdq_exec=%d pending=%d\n", i, pending);
906                 if (sc->cmdq_run == RUN_CMDQ_GO) {
907                         /*
908                          * If arg0 is NULL, callback func needs more
909                          * than one arg. So, pass ptr to cmdq struct.
910                          */
911                         if (sc->cmdq[i].arg0)
912                                 sc->cmdq[i].func(sc->cmdq[i].arg0);
913                         else
914                                 sc->cmdq[i].func(&sc->cmdq[i]);
915                 }
916                 sc->cmdq[i].arg0 = NULL;
917                 sc->cmdq[i].func = NULL;
918                 sc->cmdq_exec++;
919                 sc->cmdq_exec &= RUN_CMDQ_MASQ;
920         }
921         RUN_UNLOCK(sc);
922 }
923
924 static void
925 run_setup_tx_list(struct run_softc *sc, struct run_endpoint_queue *pq)
926 {
927         struct run_tx_data *data;
928
929         memset(pq, 0, sizeof(*pq));
930
931         STAILQ_INIT(&pq->tx_qh);
932         STAILQ_INIT(&pq->tx_fh);
933
934         for (data = &pq->tx_data[0];
935             data < &pq->tx_data[RUN_TX_RING_COUNT]; data++) {
936                 data->sc = sc;
937                 STAILQ_INSERT_TAIL(&pq->tx_fh, data, next);
938         }
939         pq->tx_nfree = RUN_TX_RING_COUNT;
940 }
941
942 static void
943 run_unsetup_tx_list(struct run_softc *sc, struct run_endpoint_queue *pq)
944 {
945         struct run_tx_data *data;
946
947         /* make sure any subsequent use of the queues will fail */
948         pq->tx_nfree = 0;
949         STAILQ_INIT(&pq->tx_fh);
950         STAILQ_INIT(&pq->tx_qh);
951
952         /* free up all node references and mbufs */
953         for (data = &pq->tx_data[0];
954             data < &pq->tx_data[RUN_TX_RING_COUNT]; data++) {
955                 if (data->m != NULL) {
956                         m_freem(data->m);
957                         data->m = NULL;
958                 }
959                 if (data->ni != NULL) {
960                         ieee80211_free_node(data->ni);
961                         data->ni = NULL;
962                 }
963         }
964 }
965
966 static int
967 run_load_microcode(struct run_softc *sc)
968 {
969         usb_device_request_t req;
970         const struct firmware *fw;
971         const u_char *base;
972         uint32_t tmp;
973         int ntries, error;
974         const uint64_t *temp;
975         uint64_t bytes;
976
977         RUN_UNLOCK(sc);
978         fw = firmware_get("runfw");
979         RUN_LOCK(sc);
980         if (fw == NULL) {
981                 device_printf(sc->sc_dev,
982                     "failed loadfirmware of file %s\n", "runfw");
983                 return ENOENT;
984         }
985
986         if (fw->datasize != 8192) {
987                 device_printf(sc->sc_dev,
988                     "invalid firmware size (should be 8KB)\n");
989                 error = EINVAL;
990                 goto fail;
991         }
992
993         /*
994          * RT3071/RT3072 use a different firmware
995          * run-rt2870 (8KB) contains both,
996          * first half (4KB) is for rt2870,
997          * last half is for rt3071.
998          */
999         base = fw->data;
1000         if ((sc->mac_ver) != 0x2860 &&
1001             (sc->mac_ver) != 0x2872 &&
1002             (sc->mac_ver) != 0x3070) { 
1003                 base += 4096;
1004         }
1005
1006         /* cheap sanity check */
1007         temp = fw->data;
1008         bytes = *temp;
1009         if (bytes != be64toh(0xffffff0210280210)) {
1010                 device_printf(sc->sc_dev, "firmware checksum failed\n");
1011                 error = EINVAL;
1012                 goto fail;
1013         }
1014
1015         run_read(sc, RT2860_ASIC_VER_ID, &tmp);
1016         /* write microcode image */
1017         run_write_region_1(sc, RT2870_FW_BASE, base, 4096);
1018         run_write(sc, RT2860_H2M_MAILBOX_CID, 0xffffffff);
1019         run_write(sc, RT2860_H2M_MAILBOX_STATUS, 0xffffffff);
1020
1021         req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1022         req.bRequest = RT2870_RESET;
1023         USETW(req.wValue, 8);
1024         USETW(req.wIndex, 0);
1025         USETW(req.wLength, 0);
1026         if ((error = usbd_do_request(sc->sc_udev, &sc->sc_mtx, &req, NULL))
1027             != 0) {
1028                 device_printf(sc->sc_dev, "firmware reset failed\n");
1029                 goto fail;
1030         }
1031
1032         run_delay(sc, 10);
1033
1034         run_write(sc, RT2860_H2M_MAILBOX, 0);
1035         if ((error = run_mcu_cmd(sc, RT2860_MCU_CMD_RFRESET, 0)) != 0)
1036                 goto fail;
1037
1038         /* wait until microcontroller is ready */
1039         for (ntries = 0; ntries < 1000; ntries++) {
1040                 if ((error = run_read(sc, RT2860_SYS_CTRL, &tmp)) != 0) {
1041                         goto fail;
1042                 }
1043                 if (tmp & RT2860_MCU_READY)
1044                         break;
1045                 run_delay(sc, 10);
1046         }
1047         if (ntries == 1000) {
1048                 device_printf(sc->sc_dev,
1049                     "timeout waiting for MCU to initialize\n");
1050                 error = ETIMEDOUT;
1051                 goto fail;
1052         }
1053         device_printf(sc->sc_dev, "firmware %s loaded\n",
1054             (base == fw->data) ? "RT2870" : "RT3071");
1055
1056 fail:
1057         firmware_put(fw, FIRMWARE_UNLOAD);
1058         return (error);
1059 }
1060
1061 int
1062 run_reset(struct run_softc *sc)
1063 {
1064         usb_device_request_t req;
1065
1066         req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1067         req.bRequest = RT2870_RESET;
1068         USETW(req.wValue, 1);
1069         USETW(req.wIndex, 0);
1070         USETW(req.wLength, 0);
1071         return (usbd_do_request(sc->sc_udev, &sc->sc_mtx, &req, NULL));
1072 }
1073
1074 static usb_error_t
1075 run_do_request(struct run_softc *sc,
1076     struct usb_device_request *req, void *data)
1077 {
1078         usb_error_t err;
1079         int ntries = 10;
1080
1081         RUN_LOCK_ASSERT(sc, MA_OWNED);
1082
1083         while (ntries--) {
1084                 err = usbd_do_request_flags(sc->sc_udev, &sc->sc_mtx,
1085                     req, data, 0, NULL, 250 /* ms */);
1086                 if (err == 0)
1087                         break;
1088                 DPRINTFN(1, "Control request failed, %s (retrying)\n",
1089                     usbd_errstr(err));
1090                 run_delay(sc, 10);
1091         }
1092         return (err);
1093 }
1094
1095 static int
1096 run_read(struct run_softc *sc, uint16_t reg, uint32_t *val)
1097 {
1098         uint32_t tmp;
1099         int error;
1100
1101         error = run_read_region_1(sc, reg, (uint8_t *)&tmp, sizeof tmp);
1102         if (error == 0)
1103                 *val = le32toh(tmp);
1104         else
1105                 *val = 0xffffffff;
1106         return (error);
1107 }
1108
1109 static int
1110 run_read_region_1(struct run_softc *sc, uint16_t reg, uint8_t *buf, int len)
1111 {
1112         usb_device_request_t req;
1113
1114         req.bmRequestType = UT_READ_VENDOR_DEVICE;
1115         req.bRequest = RT2870_READ_REGION_1;
1116         USETW(req.wValue, 0);
1117         USETW(req.wIndex, reg);
1118         USETW(req.wLength, len);
1119
1120         return (run_do_request(sc, &req, buf));
1121 }
1122
1123 static int
1124 run_write_2(struct run_softc *sc, uint16_t reg, uint16_t val)
1125 {
1126         usb_device_request_t req;
1127
1128         req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1129         req.bRequest = RT2870_WRITE_2;
1130         USETW(req.wValue, val);
1131         USETW(req.wIndex, reg);
1132         USETW(req.wLength, 0);
1133
1134         return (run_do_request(sc, &req, NULL));
1135 }
1136
1137 static int
1138 run_write(struct run_softc *sc, uint16_t reg, uint32_t val)
1139 {
1140         int error;
1141
1142         if ((error = run_write_2(sc, reg, val & 0xffff)) == 0)
1143                 error = run_write_2(sc, reg + 2, val >> 16);
1144         return (error);
1145 }
1146
1147 static int
1148 run_write_region_1(struct run_softc *sc, uint16_t reg, const uint8_t *buf,
1149     int len)
1150 {
1151 #if 1
1152         int i, error = 0;
1153         /*
1154          * NB: the WRITE_REGION_1 command is not stable on RT2860.
1155          * We thus issue multiple WRITE_2 commands instead.
1156          */
1157         KASSERT((len & 1) == 0, ("run_write_region_1: Data too long.\n"));
1158         for (i = 0; i < len && error == 0; i += 2)
1159                 error = run_write_2(sc, reg + i, buf[i] | buf[i + 1] << 8);
1160         return (error);
1161 #else
1162         usb_device_request_t req;
1163
1164         req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1165         req.bRequest = RT2870_WRITE_REGION_1;
1166         USETW(req.wValue, 0);
1167         USETW(req.wIndex, reg);
1168         USETW(req.wLength, len);
1169         return (run_do_request(sc, &req, buf));
1170 #endif
1171 }
1172
1173 static int
1174 run_set_region_4(struct run_softc *sc, uint16_t reg, uint32_t val, int len)
1175 {
1176         int i, error = 0;
1177
1178         KASSERT((len & 3) == 0, ("run_set_region_4: Invalid data length.\n"));
1179         for (i = 0; i < len && error == 0; i += 4)
1180                 error = run_write(sc, reg + i, val);
1181         return (error);
1182 }
1183
1184 /* Read 16-bit from eFUSE ROM (RT3070 only.) */
1185 static int
1186 run_efuse_read_2(struct run_softc *sc, uint16_t addr, uint16_t *val)
1187 {
1188         uint32_t tmp;
1189         uint16_t reg;
1190         int error, ntries;
1191
1192         if ((error = run_read(sc, RT3070_EFUSE_CTRL, &tmp)) != 0)
1193                 return (error);
1194
1195         addr *= 2;
1196         /*-
1197          * Read one 16-byte block into registers EFUSE_DATA[0-3]:
1198          * DATA0: F E D C
1199          * DATA1: B A 9 8
1200          * DATA2: 7 6 5 4
1201          * DATA3: 3 2 1 0
1202          */
1203         tmp &= ~(RT3070_EFSROM_MODE_MASK | RT3070_EFSROM_AIN_MASK);
1204         tmp |= (addr & ~0xf) << RT3070_EFSROM_AIN_SHIFT | RT3070_EFSROM_KICK;
1205         run_write(sc, RT3070_EFUSE_CTRL, tmp);
1206         for (ntries = 0; ntries < 100; ntries++) {
1207                 if ((error = run_read(sc, RT3070_EFUSE_CTRL, &tmp)) != 0)
1208                         return (error);
1209                 if (!(tmp & RT3070_EFSROM_KICK))
1210                         break;
1211                 run_delay(sc, 2);
1212         }
1213         if (ntries == 100)
1214                 return (ETIMEDOUT);
1215
1216         if ((tmp & RT3070_EFUSE_AOUT_MASK) == RT3070_EFUSE_AOUT_MASK) {
1217                 *val = 0xffff;  /* address not found */
1218                 return (0);
1219         }
1220         /* determine to which 32-bit register our 16-bit word belongs */
1221         reg = RT3070_EFUSE_DATA3 - (addr & 0xc);
1222         if ((error = run_read(sc, reg, &tmp)) != 0)
1223                 return (error);
1224
1225         *val = (addr & 2) ? tmp >> 16 : tmp & 0xffff;
1226         return (0);
1227 }
1228
1229 static int
1230 run_eeprom_read_2(struct run_softc *sc, uint16_t addr, uint16_t *val)
1231 {
1232         usb_device_request_t req;
1233         uint16_t tmp;
1234         int error;
1235
1236         addr *= 2;
1237         req.bmRequestType = UT_READ_VENDOR_DEVICE;
1238         req.bRequest = RT2870_EEPROM_READ;
1239         USETW(req.wValue, 0);
1240         USETW(req.wIndex, addr);
1241         USETW(req.wLength, sizeof tmp);
1242
1243         error = usbd_do_request(sc->sc_udev, &sc->sc_mtx, &req, &tmp);
1244         if (error == 0)
1245                 *val = le16toh(tmp);
1246         else
1247                 *val = 0xffff;
1248         return (error);
1249 }
1250
1251 static __inline int
1252 run_srom_read(struct run_softc *sc, uint16_t addr, uint16_t *val)
1253 {
1254         /* either eFUSE ROM or EEPROM */
1255         return sc->sc_srom_read(sc, addr, val);
1256 }
1257
1258 static int
1259 run_rt2870_rf_write(struct run_softc *sc, uint8_t reg, uint32_t val)
1260 {
1261         uint32_t tmp;
1262         int error, ntries;
1263
1264         for (ntries = 0; ntries < 10; ntries++) {
1265                 if ((error = run_read(sc, RT2860_RF_CSR_CFG0, &tmp)) != 0)
1266                         return (error);
1267                 if (!(tmp & RT2860_RF_REG_CTRL))
1268                         break;
1269         }
1270         if (ntries == 10)
1271                 return (ETIMEDOUT);
1272
1273         /* RF registers are 24-bit on the RT2860 */
1274         tmp = RT2860_RF_REG_CTRL | 24 << RT2860_RF_REG_WIDTH_SHIFT |
1275             (val & 0x3fffff) << 2 | (reg & 3);
1276         return (run_write(sc, RT2860_RF_CSR_CFG0, tmp));
1277 }
1278
1279 static int
1280 run_rt3070_rf_read(struct run_softc *sc, uint8_t reg, uint8_t *val)
1281 {
1282         uint32_t tmp;
1283         int error, ntries;
1284
1285         for (ntries = 0; ntries < 100; ntries++) {
1286                 if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0)
1287                         return (error);
1288                 if (!(tmp & RT3070_RF_KICK))
1289                         break;
1290         }
1291         if (ntries == 100)
1292                 return (ETIMEDOUT);
1293
1294         tmp = RT3070_RF_KICK | reg << 8;
1295         if ((error = run_write(sc, RT3070_RF_CSR_CFG, tmp)) != 0)
1296                 return (error);
1297
1298         for (ntries = 0; ntries < 100; ntries++) {
1299                 if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0)
1300                         return (error);
1301                 if (!(tmp & RT3070_RF_KICK))
1302                         break;
1303         }
1304         if (ntries == 100)
1305                 return (ETIMEDOUT);
1306
1307         *val = tmp & 0xff;
1308         return (0);
1309 }
1310
1311 static int
1312 run_rt3070_rf_write(struct run_softc *sc, uint8_t reg, uint8_t val)
1313 {
1314         uint32_t tmp;
1315         int error, ntries;
1316
1317         for (ntries = 0; ntries < 10; ntries++) {
1318                 if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0)
1319                         return (error);
1320                 if (!(tmp & RT3070_RF_KICK))
1321                         break;
1322         }
1323         if (ntries == 10)
1324                 return (ETIMEDOUT);
1325
1326         tmp = RT3070_RF_WRITE | RT3070_RF_KICK | reg << 8 | val;
1327         return (run_write(sc, RT3070_RF_CSR_CFG, tmp));
1328 }
1329
1330 static int
1331 run_bbp_read(struct run_softc *sc, uint8_t reg, uint8_t *val)
1332 {
1333         uint32_t tmp;
1334         int ntries, error;
1335
1336         for (ntries = 0; ntries < 10; ntries++) {
1337                 if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0)
1338                         return (error);
1339                 if (!(tmp & RT2860_BBP_CSR_KICK))
1340                         break;
1341         }
1342         if (ntries == 10)
1343                 return (ETIMEDOUT);
1344
1345         tmp = RT2860_BBP_CSR_READ | RT2860_BBP_CSR_KICK | reg << 8;
1346         if ((error = run_write(sc, RT2860_BBP_CSR_CFG, tmp)) != 0)
1347                 return (error);
1348
1349         for (ntries = 0; ntries < 10; ntries++) {
1350                 if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0)
1351                         return (error);
1352                 if (!(tmp & RT2860_BBP_CSR_KICK))
1353                         break;
1354         }
1355         if (ntries == 10)
1356                 return (ETIMEDOUT);
1357
1358         *val = tmp & 0xff;
1359         return (0);
1360 }
1361
1362 static int
1363 run_bbp_write(struct run_softc *sc, uint8_t reg, uint8_t val)
1364 {
1365         uint32_t tmp;
1366         int ntries, error;
1367
1368         for (ntries = 0; ntries < 10; ntries++) {
1369                 if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0)
1370                         return (error);
1371                 if (!(tmp & RT2860_BBP_CSR_KICK))
1372                         break;
1373         }
1374         if (ntries == 10)
1375                 return (ETIMEDOUT);
1376
1377         tmp = RT2860_BBP_CSR_KICK | reg << 8 | val;
1378         return (run_write(sc, RT2860_BBP_CSR_CFG, tmp));
1379 }
1380
1381 /*
1382  * Send a command to the 8051 microcontroller unit.
1383  */
1384 static int
1385 run_mcu_cmd(struct run_softc *sc, uint8_t cmd, uint16_t arg)
1386 {
1387         uint32_t tmp;
1388         int error, ntries;
1389
1390         for (ntries = 0; ntries < 100; ntries++) {
1391                 if ((error = run_read(sc, RT2860_H2M_MAILBOX, &tmp)) != 0)
1392                         return error;
1393                 if (!(tmp & RT2860_H2M_BUSY))
1394                         break;
1395         }
1396         if (ntries == 100)
1397                 return ETIMEDOUT;
1398
1399         tmp = RT2860_H2M_BUSY | RT2860_TOKEN_NO_INTR << 16 | arg;
1400         if ((error = run_write(sc, RT2860_H2M_MAILBOX, tmp)) == 0)
1401                 error = run_write(sc, RT2860_HOST_CMD, cmd);
1402         return (error);
1403 }
1404
1405 /*
1406  * Add `delta' (signed) to each 4-bit sub-word of a 32-bit word.
1407  * Used to adjust per-rate Tx power registers.
1408  */
1409 static __inline uint32_t
1410 b4inc(uint32_t b32, int8_t delta)
1411 {
1412         int8_t i, b4;
1413
1414         for (i = 0; i < 8; i++) {
1415                 b4 = b32 & 0xf;
1416                 b4 += delta;
1417                 if (b4 < 0)
1418                         b4 = 0;
1419                 else if (b4 > 0xf)
1420                         b4 = 0xf;
1421                 b32 = b32 >> 4 | b4 << 28;
1422         }
1423         return (b32);
1424 }
1425
1426 static const char *
1427 run_get_rf(int rev)
1428 {
1429         switch (rev) {
1430         case RT2860_RF_2820:    return "RT2820";
1431         case RT2860_RF_2850:    return "RT2850";
1432         case RT2860_RF_2720:    return "RT2720";
1433         case RT2860_RF_2750:    return "RT2750";
1434         case RT3070_RF_3020:    return "RT3020";
1435         case RT3070_RF_2020:    return "RT2020";
1436         case RT3070_RF_3021:    return "RT3021";
1437         case RT3070_RF_3022:    return "RT3022";
1438         case RT3070_RF_3052:    return "RT3052";
1439         }
1440         return ("unknown");
1441 }
1442
1443 int
1444 run_read_eeprom(struct run_softc *sc)
1445 {
1446         int8_t delta_2ghz, delta_5ghz;
1447         uint32_t tmp;
1448         uint16_t val;
1449         int ridx, ant, i;
1450
1451         /* check whether the ROM is eFUSE ROM or EEPROM */
1452         sc->sc_srom_read = run_eeprom_read_2;
1453         if (sc->mac_ver >= 0x3070) {
1454                 run_read(sc, RT3070_EFUSE_CTRL, &tmp);
1455                 DPRINTF("EFUSE_CTRL=0x%08x\n", tmp);
1456                 if (tmp & RT3070_SEL_EFUSE)
1457                         sc->sc_srom_read = run_efuse_read_2;
1458         }
1459
1460         /* read ROM version */
1461         run_srom_read(sc, RT2860_EEPROM_VERSION, &val);
1462         DPRINTF("EEPROM rev=%d, FAE=%d\n", val & 0xff, val >> 8);
1463
1464         /* read MAC address */
1465         run_srom_read(sc, RT2860_EEPROM_MAC01, &val);
1466         sc->sc_bssid[0] = val & 0xff;
1467         sc->sc_bssid[1] = val >> 8;
1468         run_srom_read(sc, RT2860_EEPROM_MAC23, &val);
1469         sc->sc_bssid[2] = val & 0xff;
1470         sc->sc_bssid[3] = val >> 8;
1471         run_srom_read(sc, RT2860_EEPROM_MAC45, &val);
1472         sc->sc_bssid[4] = val & 0xff;
1473         sc->sc_bssid[5] = val >> 8;
1474
1475         /* read vender BBP settings */
1476         for (i = 0; i < 10; i++) {
1477                 run_srom_read(sc, RT2860_EEPROM_BBP_BASE + i, &val);
1478                 sc->bbp[i].val = val & 0xff;
1479                 sc->bbp[i].reg = val >> 8;
1480                 DPRINTF("BBP%d=0x%02x\n", sc->bbp[i].reg, sc->bbp[i].val);
1481         }
1482         if (sc->mac_ver >= 0x3071) {
1483                 /* read vendor RF settings */
1484                 for (i = 0; i < 10; i++) {
1485                         run_srom_read(sc, RT3071_EEPROM_RF_BASE + i, &val);
1486                         sc->rf[i].val = val & 0xff;
1487                         sc->rf[i].reg = val >> 8;
1488                         DPRINTF("RF%d=0x%02x\n", sc->rf[i].reg,
1489                             sc->rf[i].val);
1490                 }
1491         }
1492
1493         /* read RF frequency offset from EEPROM */
1494         run_srom_read(sc, RT2860_EEPROM_FREQ_LEDS, &val);
1495         sc->freq = ((val & 0xff) != 0xff) ? val & 0xff : 0;
1496         DPRINTF("EEPROM freq offset %d\n", sc->freq & 0xff);
1497
1498         if (val >> 8 != 0xff) {
1499                 /* read LEDs operating mode */
1500                 sc->leds = val >> 8;
1501                 run_srom_read(sc, RT2860_EEPROM_LED1, &sc->led[0]);
1502                 run_srom_read(sc, RT2860_EEPROM_LED2, &sc->led[1]);
1503                 run_srom_read(sc, RT2860_EEPROM_LED3, &sc->led[2]);
1504         } else {
1505                 /* broken EEPROM, use default settings */
1506                 sc->leds = 0x01;
1507                 sc->led[0] = 0x5555;
1508                 sc->led[1] = 0x2221;
1509                 sc->led[2] = 0x5627;    /* differs from RT2860 */
1510         }
1511         DPRINTF("EEPROM LED mode=0x%02x, LEDs=0x%04x/0x%04x/0x%04x\n",
1512             sc->leds, sc->led[0], sc->led[1], sc->led[2]);
1513
1514         /* read RF information */
1515         run_srom_read(sc, RT2860_EEPROM_ANTENNA, &val);
1516         if (val == 0xffff) {
1517                 DPRINTF("invalid EEPROM antenna info, using default\n");
1518                 if (sc->mac_ver == 0x3572) {
1519                         /* default to RF3052 2T2R */
1520                         sc->rf_rev = RT3070_RF_3052;
1521                         sc->ntxchains = 2;
1522                         sc->nrxchains = 2;
1523                 } else if (sc->mac_ver >= 0x3070) {
1524                         /* default to RF3020 1T1R */
1525                         sc->rf_rev = RT3070_RF_3020;
1526                         sc->ntxchains = 1;
1527                         sc->nrxchains = 1;
1528                 } else {
1529                         /* default to RF2820 1T2R */
1530                         sc->rf_rev = RT2860_RF_2820;
1531                         sc->ntxchains = 1;
1532                         sc->nrxchains = 2;
1533                 }
1534         } else {
1535                 sc->rf_rev = (val >> 8) & 0xf;
1536                 sc->ntxchains = (val >> 4) & 0xf;
1537                 sc->nrxchains = val & 0xf;
1538         }
1539         DPRINTF("EEPROM RF rev=0x%02x chains=%dT%dR\n",
1540             sc->rf_rev, sc->ntxchains, sc->nrxchains);
1541
1542         /* check if RF supports automatic Tx access gain control */
1543         run_srom_read(sc, RT2860_EEPROM_CONFIG, &val);
1544         DPRINTF("EEPROM CFG 0x%04x\n", val);
1545         /* check if driver should patch the DAC issue */
1546         if ((val >> 8) != 0xff)
1547                 sc->patch_dac = (val >> 15) & 1;
1548         if ((val & 0xff) != 0xff) {
1549                 sc->ext_5ghz_lna = (val >> 3) & 1;
1550                 sc->ext_2ghz_lna = (val >> 2) & 1;
1551                 /* check if RF supports automatic Tx access gain control */
1552                 sc->calib_2ghz = sc->calib_5ghz = (val >> 1) & 1;
1553                 /* check if we have a hardware radio switch */
1554                 sc->rfswitch = val & 1;
1555         }
1556
1557         /* read power settings for 2GHz channels */
1558         for (i = 0; i < 14; i += 2) {
1559                 run_srom_read(sc, RT2860_EEPROM_PWR2GHZ_BASE1 + i / 2, &val);
1560                 sc->txpow1[i + 0] = (int8_t)(val & 0xff);
1561                 sc->txpow1[i + 1] = (int8_t)(val >> 8);
1562
1563                 run_srom_read(sc, RT2860_EEPROM_PWR2GHZ_BASE2 + i / 2, &val);
1564                 sc->txpow2[i + 0] = (int8_t)(val & 0xff);
1565                 sc->txpow2[i + 1] = (int8_t)(val >> 8);
1566         }
1567         /* fix broken Tx power entries */
1568         for (i = 0; i < 14; i++) {
1569                 if (sc->txpow1[i] < 0 || sc->txpow1[i] > 31)
1570                         sc->txpow1[i] = 5;
1571                 if (sc->txpow2[i] < 0 || sc->txpow2[i] > 31)
1572                         sc->txpow2[i] = 5;
1573                 DPRINTF("chan %d: power1=%d, power2=%d\n",
1574                     rt2860_rf2850[i].chan, sc->txpow1[i], sc->txpow2[i]);
1575         }
1576         /* read power settings for 5GHz channels */
1577         for (i = 0; i < 40; i += 2) {
1578                 run_srom_read(sc, RT2860_EEPROM_PWR5GHZ_BASE1 + i / 2, &val);
1579                 sc->txpow1[i + 14] = (int8_t)(val & 0xff);
1580                 sc->txpow1[i + 15] = (int8_t)(val >> 8);
1581
1582                 run_srom_read(sc, RT2860_EEPROM_PWR5GHZ_BASE2 + i / 2, &val);
1583                 sc->txpow2[i + 14] = (int8_t)(val & 0xff);
1584                 sc->txpow2[i + 15] = (int8_t)(val >> 8);
1585         }
1586         /* fix broken Tx power entries */
1587         for (i = 0; i < 40; i++) {
1588                 if (sc->txpow1[14 + i] < -7 || sc->txpow1[14 + i] > 15)
1589                         sc->txpow1[14 + i] = 5;
1590                 if (sc->txpow2[14 + i] < -7 || sc->txpow2[14 + i] > 15)
1591                         sc->txpow2[14 + i] = 5;
1592                 DPRINTF("chan %d: power1=%d, power2=%d\n",
1593                     rt2860_rf2850[14 + i].chan, sc->txpow1[14 + i],
1594                     sc->txpow2[14 + i]);
1595         }
1596
1597         /* read Tx power compensation for each Tx rate */
1598         run_srom_read(sc, RT2860_EEPROM_DELTAPWR, &val);
1599         delta_2ghz = delta_5ghz = 0;
1600         if ((val & 0xff) != 0xff && (val & 0x80)) {
1601                 delta_2ghz = val & 0xf;
1602                 if (!(val & 0x40))      /* negative number */
1603                         delta_2ghz = -delta_2ghz;
1604         }
1605         val >>= 8;
1606         if ((val & 0xff) != 0xff && (val & 0x80)) {
1607                 delta_5ghz = val & 0xf;
1608                 if (!(val & 0x40))      /* negative number */
1609                         delta_5ghz = -delta_5ghz;
1610         }
1611         DPRINTF("power compensation=%d (2GHz), %d (5GHz)\n",
1612             delta_2ghz, delta_5ghz);
1613
1614         for (ridx = 0; ridx < 5; ridx++) {
1615                 uint32_t reg;
1616
1617                 run_srom_read(sc, RT2860_EEPROM_RPWR + ridx * 2, &val);
1618                 reg = val;
1619                 run_srom_read(sc, RT2860_EEPROM_RPWR + ridx * 2 + 1, &val);
1620                 reg |= (uint32_t)val << 16;
1621
1622                 sc->txpow20mhz[ridx] = reg;
1623                 sc->txpow40mhz_2ghz[ridx] = b4inc(reg, delta_2ghz);
1624                 sc->txpow40mhz_5ghz[ridx] = b4inc(reg, delta_5ghz);
1625
1626                 DPRINTF("ridx %d: power 20MHz=0x%08x, 40MHz/2GHz=0x%08x, "
1627                     "40MHz/5GHz=0x%08x\n", ridx, sc->txpow20mhz[ridx],
1628                     sc->txpow40mhz_2ghz[ridx], sc->txpow40mhz_5ghz[ridx]);
1629         }
1630
1631         /* read RSSI offsets and LNA gains from EEPROM */
1632         run_srom_read(sc, RT2860_EEPROM_RSSI1_2GHZ, &val);
1633         sc->rssi_2ghz[0] = val & 0xff;  /* Ant A */
1634         sc->rssi_2ghz[1] = val >> 8;    /* Ant B */
1635         run_srom_read(sc, RT2860_EEPROM_RSSI2_2GHZ, &val);
1636         if (sc->mac_ver >= 0x3070) {
1637                 /*
1638                  * On RT3070 chips (limited to 2 Rx chains), this ROM
1639                  * field contains the Tx mixer gain for the 2GHz band.
1640                  */
1641                 if ((val & 0xff) != 0xff)
1642                         sc->txmixgain_2ghz = val & 0x7;
1643                 DPRINTF("tx mixer gain=%u (2GHz)\n", sc->txmixgain_2ghz);
1644         } else
1645                 sc->rssi_2ghz[2] = val & 0xff;  /* Ant C */
1646         sc->lna[2] = val >> 8;          /* channel group 2 */
1647
1648         run_srom_read(sc, RT2860_EEPROM_RSSI1_5GHZ, &val);
1649         sc->rssi_5ghz[0] = val & 0xff;  /* Ant A */
1650         sc->rssi_5ghz[1] = val >> 8;    /* Ant B */
1651         run_srom_read(sc, RT2860_EEPROM_RSSI2_5GHZ, &val);
1652         if (sc->mac_ver == 0x3572) {
1653                 /*
1654                  * On RT3572 chips (limited to 2 Rx chains), this ROM
1655                  * field contains the Tx mixer gain for the 5GHz band.
1656                  */
1657                 if ((val & 0xff) != 0xff)
1658                         sc->txmixgain_5ghz = val & 0x7;
1659                 DPRINTF("tx mixer gain=%u (5GHz)\n", sc->txmixgain_5ghz);
1660         } else
1661                 sc->rssi_5ghz[2] = val & 0xff;  /* Ant C */
1662         sc->lna[3] = val >> 8;          /* channel group 3 */
1663
1664         run_srom_read(sc, RT2860_EEPROM_LNA, &val);
1665         sc->lna[0] = val & 0xff;        /* channel group 0 */
1666         sc->lna[1] = val >> 8;          /* channel group 1 */
1667
1668         /* fix broken 5GHz LNA entries */
1669         if (sc->lna[2] == 0 || sc->lna[2] == 0xff) {
1670                 DPRINTF("invalid LNA for channel group %d\n", 2);
1671                 sc->lna[2] = sc->lna[1];
1672         }
1673         if (sc->lna[3] == 0 || sc->lna[3] == 0xff) {
1674                 DPRINTF("invalid LNA for channel group %d\n", 3);
1675                 sc->lna[3] = sc->lna[1];
1676         }
1677
1678         /* fix broken RSSI offset entries */
1679         for (ant = 0; ant < 3; ant++) {
1680                 if (sc->rssi_2ghz[ant] < -10 || sc->rssi_2ghz[ant] > 10) {
1681                         DPRINTF("invalid RSSI%d offset: %d (2GHz)\n",
1682                             ant + 1, sc->rssi_2ghz[ant]);
1683                         sc->rssi_2ghz[ant] = 0;
1684                 }
1685                 if (sc->rssi_5ghz[ant] < -10 || sc->rssi_5ghz[ant] > 10) {
1686                         DPRINTF("invalid RSSI%d offset: %d (5GHz)\n",
1687                             ant + 1, sc->rssi_5ghz[ant]);
1688                         sc->rssi_5ghz[ant] = 0;
1689                 }
1690         }
1691         return (0);
1692 }
1693
1694 static struct ieee80211_node *
1695 run_node_alloc(struct ieee80211vap *vap, const uint8_t mac[IEEE80211_ADDR_LEN])
1696 {
1697         return malloc(sizeof (struct run_node), M_DEVBUF, M_WAITOK | M_ZERO);
1698 }
1699
1700 static int
1701 run_media_change(struct ifnet *ifp)
1702 {
1703         struct ieee80211vap *vap = ifp->if_softc;
1704         struct ieee80211com *ic = vap->iv_ic;
1705         const struct ieee80211_txparam *tp;
1706         struct run_softc *sc = ic->ic_ifp->if_softc;
1707         uint8_t rate, ridx;
1708         int error;
1709
1710         RUN_LOCK(sc);
1711
1712         error = ieee80211_media_change(ifp);
1713         if (error != ENETRESET) {
1714                 RUN_UNLOCK(sc);
1715                 return (error);
1716         }
1717
1718         tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)];
1719         if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) {
1720                 struct ieee80211_node *ni;
1721                 struct run_node *rn;
1722
1723                 rate = ic->ic_sup_rates[ic->ic_curmode].
1724                     rs_rates[tp->ucastrate] & IEEE80211_RATE_VAL;
1725                 for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++)
1726                         if (rt2860_rates[ridx].rate == rate)
1727                                 break;
1728                 ni = ieee80211_ref_node(vap->iv_bss);
1729                 rn = (struct run_node *)ni;
1730                 rn->fix_ridx = ridx;
1731                 DPRINTF("rate=%d, fix_ridx=%d\n", rate, rn->fix_ridx);
1732                 ieee80211_free_node(ni);
1733         }
1734
1735 #if 0
1736         if ((ifp->if_flags & IFF_UP) &&
1737             (ifp->if_drv_flags &  IFF_DRV_RUNNING)){
1738                 run_init_locked(sc);
1739         }
1740 #endif
1741
1742         RUN_UNLOCK(sc);
1743
1744         return (0);
1745 }
1746
1747 static int
1748 run_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
1749 {
1750         const struct ieee80211_txparam *tp;
1751         struct ieee80211com *ic = vap->iv_ic;
1752         struct run_softc *sc = ic->ic_ifp->if_softc;
1753         struct run_vap *rvp = RUN_VAP(vap);
1754         enum ieee80211_state ostate;
1755         uint32_t sta[3];
1756         uint32_t tmp;
1757         uint8_t ratectl;
1758         uint8_t restart_ratectl = 0;
1759         uint8_t bid = 1 << rvp->rvp_id;
1760
1761         ostate = vap->iv_state;
1762         DPRINTF("%s -> %s\n",
1763                 ieee80211_state_name[ostate],
1764                 ieee80211_state_name[nstate]);
1765
1766         IEEE80211_UNLOCK(ic);
1767         RUN_LOCK(sc);
1768
1769         ratectl = sc->ratectl_run; /* remember current state */
1770         sc->ratectl_run = RUN_RATECTL_OFF;
1771         usb_callout_stop(&sc->ratectl_ch);
1772
1773         if (ostate == IEEE80211_S_RUN) {
1774                 /* turn link LED off */
1775                 run_set_leds(sc, RT2860_LED_RADIO);
1776         }
1777
1778         switch (nstate) {
1779         case IEEE80211_S_INIT:
1780                 restart_ratectl = 1;
1781
1782                 if (ostate != IEEE80211_S_RUN)
1783                         break;
1784
1785                 ratectl &= ~bid;
1786                 sc->runbmap &= ~bid;
1787
1788                 /* abort TSF synchronization if there is no vap running */
1789                 if (--sc->running == 0) {
1790                         run_read(sc, RT2860_BCN_TIME_CFG, &tmp);
1791                         run_write(sc, RT2860_BCN_TIME_CFG,
1792                             tmp & ~(RT2860_BCN_TX_EN | RT2860_TSF_TIMER_EN |
1793                             RT2860_TBTT_TIMER_EN));
1794                 }
1795                 break;
1796
1797         case IEEE80211_S_RUN:
1798                 if (!(sc->runbmap & bid)) {
1799                         if(sc->running++)
1800                                 restart_ratectl = 1;
1801                         sc->runbmap |= bid;
1802                 }
1803
1804                 m_freem(rvp->beacon_mbuf);
1805                 rvp->beacon_mbuf = NULL;
1806
1807                 switch (vap->iv_opmode) {
1808                 case IEEE80211_M_HOSTAP:
1809                 case IEEE80211_M_MBSS:
1810                         sc->ap_running |= bid;
1811                         ic->ic_opmode = vap->iv_opmode;
1812                         run_update_beacon_cb(vap);
1813                         break;
1814                 case IEEE80211_M_IBSS:
1815                         sc->adhoc_running |= bid;
1816                         if (!sc->ap_running)
1817                                 ic->ic_opmode = vap->iv_opmode;
1818                         run_update_beacon_cb(vap);
1819                         break;
1820                 case IEEE80211_M_STA:
1821                         sc->sta_running |= bid;
1822                         if (!sc->ap_running && !sc->adhoc_running)
1823                                 ic->ic_opmode = vap->iv_opmode;
1824
1825                         /* read statistic counters (clear on read) */
1826                         run_read_region_1(sc, RT2860_TX_STA_CNT0,
1827                             (uint8_t *)sta, sizeof sta);
1828
1829                         break;
1830                 default:
1831                         ic->ic_opmode = vap->iv_opmode;
1832                         break;
1833                 }
1834
1835                 if (vap->iv_opmode != IEEE80211_M_MONITOR) {
1836                         struct ieee80211_node *ni;
1837
1838                         run_updateslot(ic->ic_ifp);
1839                         run_enable_mrr(sc);
1840                         run_set_txpreamble(sc);
1841                         run_set_basicrates(sc);
1842                         ni = ieee80211_ref_node(vap->iv_bss);
1843                         IEEE80211_ADDR_COPY(sc->sc_bssid, ni->ni_bssid);
1844                         run_set_bssid(sc, ni->ni_bssid);
1845                         ieee80211_free_node(ni);
1846                         run_enable_tsf_sync(sc);
1847
1848                         /* enable automatic rate adaptation */
1849                         tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)];
1850                         if (tp->ucastrate == IEEE80211_FIXED_RATE_NONE)
1851                                 ratectl |= bid;
1852                 }
1853
1854                 /* turn link LED on */
1855                 run_set_leds(sc, RT2860_LED_RADIO |
1856                     (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan) ?
1857                      RT2860_LED_LINK_2GHZ : RT2860_LED_LINK_5GHZ));
1858
1859                 break;
1860         default:
1861                 DPRINTFN(6, "undefined case\n");
1862                 break;
1863         }
1864
1865         /* restart amrr for running VAPs */
1866         if ((sc->ratectl_run = ratectl) && restart_ratectl)
1867                 usb_callout_reset(&sc->ratectl_ch, hz, run_ratectl_to, sc);
1868
1869         RUN_UNLOCK(sc);
1870         IEEE80211_LOCK(ic);
1871
1872         return(rvp->newstate(vap, nstate, arg));
1873 }
1874
1875 /* ARGSUSED */
1876 static void
1877 run_wme_update_cb(void *arg)
1878 {
1879         struct ieee80211com *ic = arg;
1880         struct run_softc *sc = ic->ic_ifp->if_softc;
1881         struct ieee80211_wme_state *wmesp = &ic->ic_wme;
1882         int aci, error = 0;
1883
1884         RUN_LOCK_ASSERT(sc, MA_OWNED);
1885
1886         /* update MAC TX configuration registers */
1887         for (aci = 0; aci < WME_NUM_AC; aci++) {
1888                 error = run_write(sc, RT2860_EDCA_AC_CFG(aci),
1889                     wmesp->wme_params[aci].wmep_logcwmax << 16 |
1890                     wmesp->wme_params[aci].wmep_logcwmin << 12 |
1891                     wmesp->wme_params[aci].wmep_aifsn  <<  8 |
1892                     wmesp->wme_params[aci].wmep_txopLimit);
1893                 if (error) goto err;
1894         }
1895
1896         /* update SCH/DMA registers too */
1897         error = run_write(sc, RT2860_WMM_AIFSN_CFG,
1898             wmesp->wme_params[WME_AC_VO].wmep_aifsn  << 12 |
1899             wmesp->wme_params[WME_AC_VI].wmep_aifsn  <<  8 |
1900             wmesp->wme_params[WME_AC_BK].wmep_aifsn  <<  4 |
1901             wmesp->wme_params[WME_AC_BE].wmep_aifsn);
1902         if (error) goto err;
1903         error = run_write(sc, RT2860_WMM_CWMIN_CFG,
1904             wmesp->wme_params[WME_AC_VO].wmep_logcwmin << 12 |
1905             wmesp->wme_params[WME_AC_VI].wmep_logcwmin <<  8 |
1906             wmesp->wme_params[WME_AC_BK].wmep_logcwmin <<  4 |
1907             wmesp->wme_params[WME_AC_BE].wmep_logcwmin);
1908         if (error) goto err;
1909         error = run_write(sc, RT2860_WMM_CWMAX_CFG,
1910             wmesp->wme_params[WME_AC_VO].wmep_logcwmax << 12 |
1911             wmesp->wme_params[WME_AC_VI].wmep_logcwmax <<  8 |
1912             wmesp->wme_params[WME_AC_BK].wmep_logcwmax <<  4 |
1913             wmesp->wme_params[WME_AC_BE].wmep_logcwmax);
1914         if (error) goto err;
1915         error = run_write(sc, RT2860_WMM_TXOP0_CFG,
1916             wmesp->wme_params[WME_AC_BK].wmep_txopLimit << 16 |
1917             wmesp->wme_params[WME_AC_BE].wmep_txopLimit);
1918         if (error) goto err;
1919         error = run_write(sc, RT2860_WMM_TXOP1_CFG,
1920             wmesp->wme_params[WME_AC_VO].wmep_txopLimit << 16 |
1921             wmesp->wme_params[WME_AC_VI].wmep_txopLimit);
1922
1923 err:
1924         if (error)
1925                 DPRINTF("WME update failed\n");
1926
1927         return;
1928 }
1929
1930 static int
1931 run_wme_update(struct ieee80211com *ic)
1932 {
1933         struct run_softc *sc = ic->ic_ifp->if_softc;
1934
1935         /* sometime called wothout lock */
1936         if (mtx_owned(&ic->ic_comlock.mtx)) {
1937                 uint32_t i = RUN_CMDQ_GET(&sc->cmdq_store);
1938                 DPRINTF("cmdq_store=%d\n", i);
1939                 sc->cmdq[i].func = run_wme_update_cb;
1940                 sc->cmdq[i].arg0 = ic;
1941                 ieee80211_runtask(ic, &sc->cmdq_task);
1942                 return (0);
1943         }
1944
1945         RUN_LOCK(sc);
1946         run_wme_update_cb(ic);
1947         RUN_UNLOCK(sc);
1948
1949         /* return whatever, upper layer desn't care anyway */
1950         return (0);
1951 }
1952
1953 static void
1954 run_key_update_begin(struct ieee80211vap *vap)
1955 {
1956         /*
1957          * To avoid out-of-order events, both run_key_set() and
1958          * _delete() are deferred and handled by run_cmdq_cb().
1959          * So, there is nothing we need to do here.
1960          */
1961 }
1962
1963 static void
1964 run_key_update_end(struct ieee80211vap *vap)
1965 {
1966         /* null */
1967 }
1968
1969 static void
1970 run_key_set_cb(void *arg)
1971 {
1972         struct run_cmdq *cmdq = arg;
1973         struct ieee80211vap *vap = cmdq->arg1;
1974         struct ieee80211_key *k = cmdq->k;
1975         struct ieee80211com *ic = vap->iv_ic;
1976         struct run_softc *sc = ic->ic_ifp->if_softc;
1977         struct ieee80211_node *ni;
1978         uint32_t attr;
1979         uint16_t base, associd;
1980         uint8_t mode, wcid, iv[8];
1981
1982         RUN_LOCK_ASSERT(sc, MA_OWNED);
1983
1984         if (vap->iv_opmode == IEEE80211_M_HOSTAP)
1985                 ni = ieee80211_find_vap_node(&ic->ic_sta, vap, cmdq->mac);
1986         else
1987                 ni = vap->iv_bss;
1988         associd = (ni != NULL) ? ni->ni_associd : 0;
1989
1990         /* map net80211 cipher to RT2860 security mode */
1991         switch (k->wk_cipher->ic_cipher) {
1992         case IEEE80211_CIPHER_WEP:
1993                 if(k->wk_keylen < 8)
1994                         mode = RT2860_MODE_WEP40;
1995                 else
1996                         mode = RT2860_MODE_WEP104;
1997                 break;
1998         case IEEE80211_CIPHER_TKIP:
1999                 mode = RT2860_MODE_TKIP;
2000                 break;
2001         case IEEE80211_CIPHER_AES_CCM:
2002                 mode = RT2860_MODE_AES_CCMP;
2003                 break;
2004         default:
2005                 DPRINTF("undefined case\n");
2006                 return;
2007         }
2008
2009         DPRINTFN(1, "associd=%x, keyix=%d, mode=%x, type=%s, tx=%s, rx=%s\n",
2010             associd, k->wk_keyix, mode,
2011             (k->wk_flags & IEEE80211_KEY_GROUP) ? "group" : "pairwise",
2012             (k->wk_flags & IEEE80211_KEY_XMIT) ? "on" : "off",
2013             (k->wk_flags & IEEE80211_KEY_RECV) ? "on" : "off");
2014
2015         if (k->wk_flags & IEEE80211_KEY_GROUP) {
2016                 wcid = 0;       /* NB: update WCID0 for group keys */
2017                 base = RT2860_SKEY(RUN_VAP(vap)->rvp_id, k->wk_keyix);
2018         } else {
2019                 wcid = RUN_AID2WCID(associd);
2020                 base = RT2860_PKEY(wcid);
2021         }
2022
2023         if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_TKIP) {
2024                 if(run_write_region_1(sc, base, k->wk_key, 16))
2025                         return;
2026                 if(run_write_region_1(sc, base + 16, &k->wk_key[16], 8))        /* wk_txmic */
2027                         return;
2028                 if(run_write_region_1(sc, base + 24, &k->wk_key[24], 8))        /* wk_rxmic */
2029                         return;
2030         } else {
2031                 /* roundup len to 16-bit: XXX fix write_region_1() instead */
2032                 if(run_write_region_1(sc, base, k->wk_key, (k->wk_keylen + 1) & ~1))
2033                         return;
2034         }
2035
2036         if (!(k->wk_flags & IEEE80211_KEY_GROUP) ||
2037             (k->wk_flags & (IEEE80211_KEY_XMIT | IEEE80211_KEY_RECV))) {
2038                 /* set initial packet number in IV+EIV */
2039                 if (k->wk_cipher == IEEE80211_CIPHER_WEP) {
2040                         memset(iv, 0, sizeof iv);
2041                         iv[3] = vap->iv_def_txkey << 6;
2042                 } else {
2043                         if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_TKIP) {
2044                                 iv[0] = k->wk_keytsc >> 8;
2045                                 iv[1] = (iv[0] | 0x20) & 0x7f;
2046                                 iv[2] = k->wk_keytsc;
2047                         } else /* CCMP */ {
2048                                 iv[0] = k->wk_keytsc;
2049                                 iv[1] = k->wk_keytsc >> 8;
2050                                 iv[2] = 0;
2051                         }
2052                         iv[3] = k->wk_keyix << 6 | IEEE80211_WEP_EXTIV;
2053                         iv[4] = k->wk_keytsc >> 16;
2054                         iv[5] = k->wk_keytsc >> 24;
2055                         iv[6] = k->wk_keytsc >> 32;
2056                         iv[7] = k->wk_keytsc >> 40;
2057                 }
2058                 if (run_write_region_1(sc, RT2860_IVEIV(wcid), iv, 8))
2059                         return;
2060         }
2061
2062         if (k->wk_flags & IEEE80211_KEY_GROUP) {
2063                 /* install group key */
2064                 if (run_read(sc, RT2860_SKEY_MODE_0_7, &attr))
2065                         return;
2066                 attr &= ~(0xf << (k->wk_keyix * 4));
2067                 attr |= mode << (k->wk_keyix * 4);
2068                 if (run_write(sc, RT2860_SKEY_MODE_0_7, attr))
2069                         return;
2070         } else {
2071                 /* install pairwise key */
2072                 if (run_read(sc, RT2860_WCID_ATTR(wcid), &attr))
2073                         return;
2074                 attr = (attr & ~0xf) | (mode << 1) | RT2860_RX_PKEY_EN;
2075                 if (run_write(sc, RT2860_WCID_ATTR(wcid), attr))
2076                         return;
2077         }
2078
2079         /* TODO create a pass-thru key entry? */
2080
2081         /* need wcid to delete the right key later */
2082         k->wk_pad = wcid;
2083 }
2084
2085 /*
2086  * Don't have to be deferred, but in order to keep order of
2087  * execution, i.e. with run_key_delete(), defer this and let
2088  * run_cmdq_cb() maintain the order.
2089  *
2090  * return 0 on error
2091  */
2092 static int
2093 run_key_set(struct ieee80211vap *vap, struct ieee80211_key *k,
2094                 const uint8_t mac[IEEE80211_ADDR_LEN])
2095 {
2096         struct ieee80211com *ic = vap->iv_ic;
2097         struct run_softc *sc = ic->ic_ifp->if_softc;
2098         uint32_t i;
2099
2100         i = RUN_CMDQ_GET(&sc->cmdq_store);
2101         DPRINTF("cmdq_store=%d\n", i);
2102         sc->cmdq[i].func = run_key_set_cb;
2103         sc->cmdq[i].arg0 = NULL;
2104         sc->cmdq[i].arg1 = vap;
2105         sc->cmdq[i].k = k;
2106         IEEE80211_ADDR_COPY(sc->cmdq[i].mac, mac);
2107         ieee80211_runtask(ic, &sc->cmdq_task);
2108
2109         /*
2110          * To make sure key will be set when hostapd
2111          * calls iv_key_set() before if_init().
2112          */
2113         if (vap->iv_opmode == IEEE80211_M_HOSTAP) {
2114                 RUN_LOCK(sc);
2115                 sc->cmdq_key_set = RUN_CMDQ_GO;
2116                 RUN_UNLOCK(sc);
2117         }
2118
2119         return (1);
2120 }
2121
2122 /*
2123  * If wlan is destroyed without being brought down i.e. without
2124  * wlan down or wpa_cli terminate, this function is called after
2125  * vap is gone. Don't refer it.
2126  */
2127 static void
2128 run_key_delete_cb(void *arg)
2129 {
2130         struct run_cmdq *cmdq = arg;
2131         struct run_softc *sc = cmdq->arg1;
2132         struct ieee80211_key *k = &cmdq->key;
2133         uint32_t attr;
2134         uint8_t wcid;
2135
2136         RUN_LOCK_ASSERT(sc, MA_OWNED);
2137
2138         if (k->wk_flags & IEEE80211_KEY_GROUP) {
2139                 /* remove group key */
2140                 DPRINTF("removing group key\n");
2141                 run_read(sc, RT2860_SKEY_MODE_0_7, &attr);
2142                 attr &= ~(0xf << (k->wk_keyix * 4));
2143                 run_write(sc, RT2860_SKEY_MODE_0_7, attr);
2144         } else {
2145                 /* remove pairwise key */
2146                 DPRINTF("removing key for wcid %x\n", k->wk_pad);
2147                 /* matching wcid was written to wk_pad in run_key_set() */
2148                 wcid = k->wk_pad;
2149                 run_read(sc, RT2860_WCID_ATTR(wcid), &attr);
2150                 attr &= ~0xf;
2151                 run_write(sc, RT2860_WCID_ATTR(wcid), attr);
2152                 run_set_region_4(sc, RT2860_WCID_ENTRY(wcid), 0, 8);
2153         }
2154
2155         k->wk_pad = 0;
2156 }
2157
2158 /*
2159  * return 0 on error
2160  */
2161 static int
2162 run_key_delete(struct ieee80211vap *vap, struct ieee80211_key *k)
2163 {
2164         struct ieee80211com *ic = vap->iv_ic;
2165         struct run_softc *sc = ic->ic_ifp->if_softc;
2166         struct ieee80211_key *k0;
2167         uint32_t i;
2168
2169         /*
2170          * When called back, key might be gone. So, make a copy
2171          * of some values need to delete keys before deferring.
2172          * But, because of LOR with node lock, cannot use lock here.
2173          * So, use atomic instead.
2174          */
2175         i = RUN_CMDQ_GET(&sc->cmdq_store);
2176         DPRINTF("cmdq_store=%d\n", i);
2177         sc->cmdq[i].func = run_key_delete_cb;
2178         sc->cmdq[i].arg0 = NULL;
2179         sc->cmdq[i].arg1 = sc;
2180         k0 = &sc->cmdq[i].key;
2181         k0->wk_flags = k->wk_flags;
2182         k0->wk_keyix = k->wk_keyix;
2183         /* matching wcid was written to wk_pad in run_key_set() */
2184         k0->wk_pad = k->wk_pad;
2185         ieee80211_runtask(ic, &sc->cmdq_task);
2186         return (1);     /* return fake success */
2187
2188 }
2189
2190 static void
2191 run_ratectl_to(void *arg)
2192 {
2193         struct run_softc *sc = arg;
2194
2195         /* do it in a process context, so it can go sleep */
2196         ieee80211_runtask(sc->sc_ifp->if_l2com, &sc->ratectl_task);
2197         /* next timeout will be rescheduled in the callback task */
2198 }
2199
2200 /* ARGSUSED */
2201 static void
2202 run_ratectl_cb(void *arg, int pending)
2203 {
2204         struct run_softc *sc = arg;
2205         struct ieee80211com *ic = sc->sc_ifp->if_l2com;
2206         struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
2207
2208         if (vap == NULL)
2209                 return;
2210
2211         if (sc->rvp_cnt <= 1 && vap->iv_opmode == IEEE80211_M_STA)
2212                 run_iter_func(sc, vap->iv_bss);
2213         else {
2214                 /*
2215                  * run_reset_livelock() doesn't do anything with AMRR,
2216                  * but Ralink wants us to call it every 1 sec. So, we
2217                  * piggyback here rather than creating another callout.
2218                  * Livelock may occur only in HOSTAP or IBSS mode
2219                  * (when h/w is sending beacons).
2220                  */
2221                 RUN_LOCK(sc);
2222                 run_reset_livelock(sc);
2223                 /* just in case, there are some stats to drain */
2224                 run_drain_fifo(sc);
2225                 RUN_UNLOCK(sc);
2226                 ieee80211_iterate_nodes(&ic->ic_sta, run_iter_func, sc);
2227         }
2228
2229         if(sc->ratectl_run != RUN_RATECTL_OFF)
2230                 usb_callout_reset(&sc->ratectl_ch, hz, run_ratectl_to, sc);
2231 }
2232
2233 static void
2234 run_drain_fifo(void *arg)
2235 {
2236         struct run_softc *sc = arg;
2237         struct ifnet *ifp = sc->sc_ifp;
2238         uint32_t stat;
2239         uint16_t (*wstat)[3];
2240         uint8_t wcid, mcs, pid;
2241         int8_t retry;
2242
2243         RUN_LOCK_ASSERT(sc, MA_OWNED);
2244
2245         for (;;) {
2246                 /* drain Tx status FIFO (maxsize = 16) */
2247                 run_read(sc, RT2860_TX_STAT_FIFO, &stat);
2248                 DPRINTFN(4, "tx stat 0x%08x\n", stat);
2249                 if (!(stat & RT2860_TXQ_VLD))
2250                         break;
2251
2252                 wcid = (stat >> RT2860_TXQ_WCID_SHIFT) & 0xff;
2253
2254                 /* if no ACK was requested, no feedback is available */
2255                 if (!(stat & RT2860_TXQ_ACKREQ) || wcid > RT2870_WCID_MAX ||
2256                     wcid == 0)
2257                         continue;
2258
2259                 /*
2260                  * Even though each stat is Tx-complete-status like format,
2261                  * the device can poll stats. Because there is no guarantee
2262                  * that the referring node is still around when read the stats.
2263                  * So that, if we use ieee80211_ratectl_tx_update(), we will
2264                  * have hard time not to refer already freed node.
2265                  *
2266                  * To eliminate such page faults, we poll stats in softc.
2267                  * Then, update the rates later with ieee80211_ratectl_tx_update().
2268                  */
2269                 wstat = &(sc->wcid_stats[wcid]);
2270                 (*wstat)[RUN_TXCNT]++;
2271                 if (stat & RT2860_TXQ_OK)
2272                         (*wstat)[RUN_SUCCESS]++;
2273                 else
2274                         ifp->if_oerrors++;
2275                 /*
2276                  * Check if there were retries, ie if the Tx success rate is
2277                  * different from the requested rate. Note that it works only
2278                  * because we do not allow rate fallback from OFDM to CCK.
2279                  */
2280                 mcs = (stat >> RT2860_TXQ_MCS_SHIFT) & 0x7f;
2281                 pid = (stat >> RT2860_TXQ_PID_SHIFT) & 0xf;
2282                 if ((retry = pid -1 - mcs) > 0) {
2283                         (*wstat)[RUN_TXCNT] += retry;
2284                         (*wstat)[RUN_RETRY] += retry;
2285                 }
2286         }
2287         DPRINTFN(3, "count=%d\n", sc->fifo_cnt);
2288
2289         sc->fifo_cnt = 0;
2290 }
2291
2292 static void
2293 run_iter_func(void *arg, struct ieee80211_node *ni)
2294 {
2295         struct run_softc *sc = arg;
2296         struct ieee80211vap *vap = ni->ni_vap;
2297         struct ieee80211com *ic = ni->ni_ic;
2298         struct ifnet *ifp = ic->ic_ifp;
2299         struct run_node *rn = (void *)ni;
2300         union run_stats sta[2];
2301         uint16_t (*wstat)[3];
2302         int txcnt, success, retrycnt, error;
2303
2304         RUN_LOCK(sc);
2305
2306         if (sc->rvp_cnt <= 1 && (vap->iv_opmode == IEEE80211_M_IBSS ||
2307             vap->iv_opmode == IEEE80211_M_STA)) {
2308                 /* read statistic counters (clear on read) and update AMRR state */
2309                 error = run_read_region_1(sc, RT2860_TX_STA_CNT0, (uint8_t *)sta,
2310                     sizeof sta);
2311                 if (error != 0)
2312                         goto fail;
2313
2314                 /* count failed TX as errors */
2315                 ifp->if_oerrors += le16toh(sta[0].error.fail);
2316
2317                 retrycnt = le16toh(sta[1].tx.retry);
2318                 success = le16toh(sta[1].tx.success);
2319                 txcnt = retrycnt + success + le16toh(sta[0].error.fail);
2320
2321                 DPRINTFN(3, "retrycnt=%d success=%d failcnt=%d\n",
2322                         retrycnt, success, le16toh(sta[0].error.fail));
2323         } else {
2324                 wstat = &(sc->wcid_stats[RUN_AID2WCID(ni->ni_associd)]);
2325
2326                 if (wstat == &(sc->wcid_stats[0]) ||
2327                     wstat > &(sc->wcid_stats[RT2870_WCID_MAX]))
2328                         goto fail;
2329
2330                 txcnt = (*wstat)[RUN_TXCNT];
2331                 success = (*wstat)[RUN_SUCCESS];
2332                 retrycnt = (*wstat)[RUN_RETRY];
2333                 DPRINTFN(3, "retrycnt=%d txcnt=%d success=%d\n",
2334                     retrycnt, txcnt, success);
2335
2336                 memset(wstat, 0, sizeof(*wstat));
2337         }
2338
2339         ieee80211_ratectl_tx_update(vap, ni, &txcnt, &success, &retrycnt);
2340         rn->amrr_ridx = ieee80211_ratectl_rate(ni, NULL, 0);
2341
2342 fail:
2343         RUN_UNLOCK(sc);
2344
2345         DPRINTFN(3, "ridx=%d\n", rn->amrr_ridx);
2346 }
2347
2348 static void
2349 run_newassoc_cb(void *arg)
2350 {
2351         struct run_cmdq *cmdq = arg;
2352         struct ieee80211_node *ni = cmdq->arg1;
2353         struct run_softc *sc = ni->ni_vap->iv_ic->ic_ifp->if_softc;
2354         uint8_t wcid = cmdq->wcid;
2355
2356         RUN_LOCK_ASSERT(sc, MA_OWNED);
2357
2358         run_write_region_1(sc, RT2860_WCID_ENTRY(wcid),
2359             ni->ni_macaddr, IEEE80211_ADDR_LEN);
2360
2361         memset(&(sc->wcid_stats[wcid]), 0, sizeof(sc->wcid_stats[wcid]));
2362 }
2363
2364 static void
2365 run_newassoc(struct ieee80211_node *ni, int isnew)
2366 {
2367         struct run_node *rn = (void *)ni;
2368         struct ieee80211_rateset *rs = &ni->ni_rates;
2369         struct ieee80211vap *vap = ni->ni_vap;
2370         struct ieee80211com *ic = vap->iv_ic;
2371         struct run_softc *sc = ic->ic_ifp->if_softc;
2372         uint8_t rate;
2373         uint8_t ridx;
2374         uint8_t wcid = RUN_AID2WCID(ni->ni_associd);
2375         int i, j;
2376
2377         if (wcid > RT2870_WCID_MAX) {
2378                 device_printf(sc->sc_dev, "wcid=%d out of range\n", wcid);
2379                 return;
2380         }
2381
2382         /* only interested in true associations */
2383         if (isnew && ni->ni_associd != 0) {
2384
2385                 /*
2386                  * This function could is called though timeout function.
2387                  * Need to defer.
2388                  */
2389                 uint32_t cnt = RUN_CMDQ_GET(&sc->cmdq_store);
2390                 DPRINTF("cmdq_store=%d\n", cnt);
2391                 sc->cmdq[cnt].func = run_newassoc_cb;
2392                 sc->cmdq[cnt].arg0 = NULL;
2393                 sc->cmdq[cnt].arg1 = ni;
2394                 sc->cmdq[cnt].wcid = wcid;
2395                 ieee80211_runtask(ic, &sc->cmdq_task);
2396         }
2397
2398         DPRINTF("new assoc isnew=%d associd=%x addr=%s\n",
2399             isnew, ni->ni_associd, ether_sprintf(ni->ni_macaddr));
2400
2401         for (i = 0; i < rs->rs_nrates; i++) {
2402                 rate = rs->rs_rates[i] & IEEE80211_RATE_VAL;
2403                 /* convert 802.11 rate to hardware rate index */
2404                 for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++)
2405                         if (rt2860_rates[ridx].rate == rate)
2406                                 break;
2407                 rn->ridx[i] = ridx;
2408                 /* determine rate of control response frames */
2409                 for (j = i; j >= 0; j--) {
2410                         if ((rs->rs_rates[j] & IEEE80211_RATE_BASIC) &&
2411                             rt2860_rates[rn->ridx[i]].phy ==
2412                             rt2860_rates[rn->ridx[j]].phy)
2413                                 break;
2414                 }
2415                 if (j >= 0) {
2416                         rn->ctl_ridx[i] = rn->ridx[j];
2417                 } else {
2418                         /* no basic rate found, use mandatory one */
2419                         rn->ctl_ridx[i] = rt2860_rates[ridx].ctl_ridx;
2420                 }
2421                 DPRINTF("rate=0x%02x ridx=%d ctl_ridx=%d\n",
2422                     rs->rs_rates[i], rn->ridx[i], rn->ctl_ridx[i]);
2423         }
2424         rate = vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)].mgmtrate;
2425         for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++)
2426                 if (rt2860_rates[ridx].rate == rate)
2427                         break;
2428         rn->mgt_ridx = ridx;
2429         DPRINTF("rate=%d, mgmt_ridx=%d\n", rate, rn->mgt_ridx);
2430
2431         usb_callout_reset(&sc->ratectl_ch, hz, run_ratectl_to, sc);
2432 }
2433
2434 /*
2435  * Return the Rx chain with the highest RSSI for a given frame.
2436  */
2437 static __inline uint8_t
2438 run_maxrssi_chain(struct run_softc *sc, const struct rt2860_rxwi *rxwi)
2439 {
2440         uint8_t rxchain = 0;
2441
2442         if (sc->nrxchains > 1) {
2443                 if (rxwi->rssi[1] > rxwi->rssi[rxchain])
2444                         rxchain = 1;
2445                 if (sc->nrxchains > 2)
2446                         if (rxwi->rssi[2] > rxwi->rssi[rxchain])
2447                                 rxchain = 2;
2448         }
2449         return (rxchain);
2450 }
2451
2452 static void
2453 run_rx_frame(struct run_softc *sc, struct mbuf *m, uint32_t dmalen)
2454 {
2455         struct ifnet *ifp = sc->sc_ifp;
2456         struct ieee80211com *ic = ifp->if_l2com;
2457         struct ieee80211_frame *wh;
2458         struct ieee80211_node *ni;
2459         struct rt2870_rxd *rxd;
2460         struct rt2860_rxwi *rxwi;
2461         uint32_t flags;
2462         uint16_t len, phy;
2463         uint8_t ant, rssi;
2464         int8_t nf;
2465
2466         rxwi = mtod(m, struct rt2860_rxwi *);
2467         len = le16toh(rxwi->len) & 0xfff;
2468         if (__predict_false(len > dmalen)) {
2469                 m_freem(m);
2470                 ifp->if_ierrors++;
2471                 DPRINTF("bad RXWI length %u > %u\n", len, dmalen);
2472                 return;
2473         }
2474         /* Rx descriptor is located at the end */
2475         rxd = (struct rt2870_rxd *)(mtod(m, caddr_t) + dmalen);
2476         flags = le32toh(rxd->flags);
2477
2478         if (__predict_false(flags & (RT2860_RX_CRCERR | RT2860_RX_ICVERR))) {
2479                 m_freem(m);
2480                 ifp->if_ierrors++;
2481                 DPRINTF("%s error.\n", (flags & RT2860_RX_CRCERR)?"CRC":"ICV");
2482                 return;
2483         }
2484
2485         m->m_data += sizeof(struct rt2860_rxwi);
2486         m->m_pkthdr.len = m->m_len -= sizeof(struct rt2860_rxwi);
2487
2488         wh = mtod(m, struct ieee80211_frame *);
2489
2490         if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
2491                 wh->i_fc[1] &= ~IEEE80211_FC1_WEP;
2492                 m->m_flags |= M_WEP;
2493         }
2494
2495         if (flags & RT2860_RX_L2PAD) {
2496                 DPRINTFN(8, "received RT2860_RX_L2PAD frame\n");
2497                 len += 2;
2498         }
2499
2500         ni = ieee80211_find_rxnode(ic,
2501             mtod(m, struct ieee80211_frame_min *));
2502
2503         if (__predict_false(flags & RT2860_RX_MICERR)) {
2504                 /* report MIC failures to net80211 for TKIP */
2505                 if (ni != NULL)
2506                         ieee80211_notify_michael_failure(ni->ni_vap, wh, rxwi->keyidx);
2507                 m_freem(m);
2508                 ifp->if_ierrors++;
2509                 DPRINTF("MIC error. Someone is lying.\n");
2510                 return;
2511         }
2512
2513         ant = run_maxrssi_chain(sc, rxwi);
2514         rssi = rxwi->rssi[ant];
2515         nf = run_rssi2dbm(sc, rssi, ant);
2516
2517         m->m_pkthdr.rcvif = ifp;
2518         m->m_pkthdr.len = m->m_len = len;
2519
2520         if (ni != NULL) {
2521                 (void)ieee80211_input(ni, m, rssi, nf);
2522                 ieee80211_free_node(ni);
2523         } else {
2524                 (void)ieee80211_input_all(ic, m, rssi, nf);
2525         }
2526
2527         if (__predict_false(ieee80211_radiotap_active(ic))) {
2528                 struct run_rx_radiotap_header *tap = &sc->sc_rxtap;
2529
2530                 tap->wr_flags = 0;
2531                 tap->wr_chan_freq = htole16(ic->ic_bsschan->ic_freq);
2532                 tap->wr_chan_flags = htole16(ic->ic_bsschan->ic_flags);
2533                 tap->wr_antsignal = rssi;
2534                 tap->wr_antenna = ant;
2535                 tap->wr_dbm_antsignal = run_rssi2dbm(sc, rssi, ant);
2536                 tap->wr_rate = 2;       /* in case it can't be found below */
2537                 phy = le16toh(rxwi->phy);
2538                 switch (phy & RT2860_PHY_MODE) {
2539                 case RT2860_PHY_CCK:
2540                         switch ((phy & RT2860_PHY_MCS) & ~RT2860_PHY_SHPRE) {
2541                         case 0: tap->wr_rate =   2; break;
2542                         case 1: tap->wr_rate =   4; break;
2543                         case 2: tap->wr_rate =  11; break;
2544                         case 3: tap->wr_rate =  22; break;
2545                         }
2546                         if (phy & RT2860_PHY_SHPRE)
2547                                 tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
2548                         break;
2549                 case RT2860_PHY_OFDM:
2550                         switch (phy & RT2860_PHY_MCS) {
2551                         case 0: tap->wr_rate =  12; break;
2552                         case 1: tap->wr_rate =  18; break;
2553                         case 2: tap->wr_rate =  24; break;
2554                         case 3: tap->wr_rate =  36; break;
2555                         case 4: tap->wr_rate =  48; break;
2556                         case 5: tap->wr_rate =  72; break;
2557                         case 6: tap->wr_rate =  96; break;
2558                         case 7: tap->wr_rate = 108; break;
2559                         }
2560                         break;
2561                 }
2562         }
2563 }
2564
2565 static void
2566 run_bulk_rx_callback(struct usb_xfer *xfer, usb_error_t error)
2567 {
2568         struct run_softc *sc = usbd_xfer_softc(xfer);
2569         struct ifnet *ifp = sc->sc_ifp;
2570         struct mbuf *m = NULL;
2571         struct mbuf *m0;
2572         uint32_t dmalen;
2573         int xferlen;
2574
2575         usbd_xfer_status(xfer, &xferlen, NULL, NULL, NULL);
2576
2577         switch (USB_GET_STATE(xfer)) {
2578         case USB_ST_TRANSFERRED:
2579
2580                 DPRINTFN(15, "rx done, actlen=%d\n", xferlen);
2581
2582                 if (xferlen < sizeof (uint32_t) +
2583                     sizeof (struct rt2860_rxwi) + sizeof (struct rt2870_rxd)) {
2584                         DPRINTF("xfer too short %d\n", xferlen);
2585                         goto tr_setup;
2586                 }
2587
2588                 m = sc->rx_m;
2589                 sc->rx_m = NULL;
2590
2591                 /* FALLTHROUGH */
2592         case USB_ST_SETUP:
2593 tr_setup:
2594                 if (sc->rx_m == NULL) {
2595                         sc->rx_m = m_getjcl(M_DONTWAIT, MT_DATA, M_PKTHDR,
2596                             MJUMPAGESIZE /* xfer can be bigger than MCLBYTES */);
2597                 }
2598                 if (sc->rx_m == NULL) {
2599                         DPRINTF("could not allocate mbuf - idle with stall\n");
2600                         ifp->if_ierrors++;
2601                         usbd_xfer_set_stall(xfer);
2602                         usbd_xfer_set_frames(xfer, 0);
2603                 } else {
2604                         /*
2605                          * Directly loading a mbuf cluster into DMA to
2606                          * save some data copying. This works because
2607                          * there is only one cluster.
2608                          */
2609                         usbd_xfer_set_frame_data(xfer, 0, 
2610                             mtod(sc->rx_m, caddr_t), RUN_MAX_RXSZ);
2611                         usbd_xfer_set_frames(xfer, 1);
2612                 }
2613                 usbd_transfer_submit(xfer);
2614                 break;
2615
2616         default:        /* Error */
2617                 if (error != USB_ERR_CANCELLED) {
2618                         /* try to clear stall first */
2619                         usbd_xfer_set_stall(xfer);
2620
2621                         if (error == USB_ERR_TIMEOUT)
2622                                 device_printf(sc->sc_dev, "device timeout\n");
2623
2624                         ifp->if_ierrors++;
2625
2626                         goto tr_setup;
2627                 }
2628                 if (sc->rx_m != NULL) {
2629                         m_freem(sc->rx_m);
2630                         sc->rx_m = NULL;
2631                 }
2632                 break;
2633         }
2634
2635         if (m == NULL)
2636                 return;
2637
2638         /* inputting all the frames must be last */
2639
2640         RUN_UNLOCK(sc);
2641
2642         m->m_pkthdr.len = m->m_len = xferlen;
2643
2644         /* HW can aggregate multiple 802.11 frames in a single USB xfer */
2645         for(;;) {
2646                 dmalen = le32toh(*mtod(m, uint32_t *)) & 0xffff;
2647
2648                 if ((dmalen == 0) || ((dmalen & 3) != 0)) {
2649                         DPRINTF("bad DMA length %u\n", dmalen);
2650                         break;
2651                 }
2652                 if ((dmalen + 8) > xferlen) {
2653                         DPRINTF("bad DMA length %u > %d\n",
2654                         dmalen + 8, xferlen);
2655                         break;
2656                 }
2657
2658                 /* If it is the last one or a single frame, we won't copy. */
2659                 if ((xferlen -= dmalen + 8) <= 8) {
2660                         /* trim 32-bit DMA-len header */
2661                         m->m_data += 4;
2662                         m->m_pkthdr.len = m->m_len -= 4;
2663                         run_rx_frame(sc, m, dmalen);
2664                         break;
2665                 }
2666
2667                 /* copy aggregated frames to another mbuf */
2668                 m0 = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
2669                 if (__predict_false(m0 == NULL)) {
2670                         DPRINTF("could not allocate mbuf\n");
2671                         ifp->if_ierrors++;
2672                         break;
2673                 }
2674                 m_copydata(m, 4 /* skip 32-bit DMA-len header */,
2675                     dmalen + sizeof(struct rt2870_rxd), mtod(m0, caddr_t));
2676                 m0->m_pkthdr.len = m0->m_len =
2677                     dmalen + sizeof(struct rt2870_rxd);
2678                 run_rx_frame(sc, m0, dmalen);
2679
2680                 /* update data ptr */
2681                 m->m_data += dmalen + 8;
2682                 m->m_pkthdr.len = m->m_len -= dmalen + 8;
2683         }
2684
2685         RUN_LOCK(sc);
2686 }
2687
2688 static void
2689 run_tx_free(struct run_endpoint_queue *pq,
2690     struct run_tx_data *data, int txerr)
2691 {
2692         if (data->m != NULL) {
2693                 if (data->m->m_flags & M_TXCB)
2694                         ieee80211_process_callback(data->ni, data->m,
2695                             txerr ? ETIMEDOUT : 0);
2696                 m_freem(data->m);
2697                 data->m = NULL;
2698
2699                 if (data->ni == NULL) {
2700                         DPRINTF("no node\n");
2701                 } else {
2702                         ieee80211_free_node(data->ni);
2703                         data->ni = NULL;
2704                 }
2705         }
2706
2707         STAILQ_INSERT_TAIL(&pq->tx_fh, data, next);
2708         pq->tx_nfree++;
2709 }
2710
2711 static void
2712 run_bulk_tx_callbackN(struct usb_xfer *xfer, usb_error_t error, unsigned int index)
2713 {
2714         struct run_softc *sc = usbd_xfer_softc(xfer);
2715         struct ifnet *ifp = sc->sc_ifp;
2716         struct ieee80211com *ic = ifp->if_l2com;
2717         struct run_tx_data *data;
2718         struct ieee80211vap *vap = NULL;
2719         struct usb_page_cache *pc;
2720         struct run_endpoint_queue *pq = &sc->sc_epq[index];
2721         struct mbuf *m;
2722         usb_frlength_t size;
2723         int actlen;
2724         int sumlen;
2725
2726         usbd_xfer_status(xfer, &actlen, &sumlen, NULL, NULL);
2727
2728         switch (USB_GET_STATE(xfer)) {
2729         case USB_ST_TRANSFERRED:
2730                 DPRINTFN(11, "transfer complete: %d "
2731                     "bytes @ index %d\n", actlen, index);
2732
2733                 data = usbd_xfer_get_priv(xfer);
2734
2735                 run_tx_free(pq, data, 0);
2736                 ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
2737
2738                 usbd_xfer_set_priv(xfer, NULL);
2739
2740                 ifp->if_opackets++;
2741
2742                 /* FALLTHROUGH */
2743         case USB_ST_SETUP:
2744 tr_setup:
2745                 data = STAILQ_FIRST(&pq->tx_qh);
2746                 if (data == NULL)
2747                         break;
2748
2749                 STAILQ_REMOVE_HEAD(&pq->tx_qh, next);
2750
2751                 m = data->m;
2752                 if ((m->m_pkthdr.len +
2753                     sizeof(data->desc) + 3 + 8) > RUN_MAX_TXSZ) {
2754                         DPRINTF("data overflow, %u bytes\n",
2755                             m->m_pkthdr.len);
2756
2757                         ifp->if_oerrors++;
2758
2759                         run_tx_free(pq, data, 1);
2760
2761                         goto tr_setup;
2762                 }
2763
2764                 pc = usbd_xfer_get_frame(xfer, 0);
2765                 size = sizeof(data->desc);
2766                 usbd_copy_in(pc, 0, &data->desc, size);
2767                 usbd_m_copy_in(pc, size, m, 0, m->m_pkthdr.len);
2768                 size += m->m_pkthdr.len;
2769                 /*
2770                  * Align end on a 4-byte boundary, pad 8 bytes (CRC +
2771                  * 4-byte padding), and be sure to zero those trailing
2772                  * bytes:
2773                  */
2774                 usbd_frame_zero(pc, size, ((-size) & 3) + 8);
2775                 size += ((-size) & 3) + 8;
2776
2777                 vap = data->ni->ni_vap;
2778                 if (ieee80211_radiotap_active_vap(vap)) {
2779                         struct run_tx_radiotap_header *tap = &sc->sc_txtap;
2780                         struct rt2860_txwi *txwi =
2781                             (struct rt2860_txwi *)(&data->desc + sizeof(struct rt2870_txd));
2782
2783                         tap->wt_flags = 0;
2784                         tap->wt_rate = rt2860_rates[data->ridx].rate;
2785                         tap->wt_chan_freq = htole16(vap->iv_bss->ni_chan->ic_freq);
2786                         tap->wt_chan_flags = htole16(vap->iv_bss->ni_chan->ic_flags);
2787                         tap->wt_hwqueue = index;
2788                         if (le16toh(txwi->phy) & RT2860_PHY_SHPRE)
2789                                 tap->wt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
2790
2791                         ieee80211_radiotap_tx(vap, m);
2792                 }
2793
2794                 DPRINTFN(11, "sending frame len=%u/%u  @ index %d\n",
2795                     m->m_pkthdr.len, size, index);
2796
2797                 usbd_xfer_set_frame_len(xfer, 0, size);
2798                 usbd_xfer_set_priv(xfer, data);
2799
2800                 usbd_transfer_submit(xfer);
2801
2802                 RUN_UNLOCK(sc);
2803                 run_start(ifp);
2804                 RUN_LOCK(sc);
2805
2806                 break;
2807
2808         default:
2809                 DPRINTF("USB transfer error, %s\n",
2810                     usbd_errstr(error));
2811
2812                 data = usbd_xfer_get_priv(xfer);
2813
2814                 ifp->if_oerrors++;
2815
2816                 if (data != NULL) {
2817                         if(data->ni != NULL)
2818                                 vap = data->ni->ni_vap;
2819                         run_tx_free(pq, data, error);
2820                         usbd_xfer_set_priv(xfer, NULL);
2821                 }
2822                 if (vap == NULL)
2823                         vap = TAILQ_FIRST(&ic->ic_vaps);
2824
2825                 if (error != USB_ERR_CANCELLED) {
2826                         if (error == USB_ERR_TIMEOUT) {
2827                                 device_printf(sc->sc_dev, "device timeout\n");
2828                                 uint32_t i = RUN_CMDQ_GET(&sc->cmdq_store);
2829                                 DPRINTF("cmdq_store=%d\n", i);
2830                                 sc->cmdq[i].func = run_usb_timeout_cb;
2831                                 sc->cmdq[i].arg0 = vap;
2832                                 ieee80211_runtask(ic, &sc->cmdq_task);
2833                         }
2834
2835                         /*
2836                          * Try to clear stall first, also if other
2837                          * errors occur, hence clearing stall
2838                          * introduces a 50 ms delay:
2839                          */
2840                         usbd_xfer_set_stall(xfer);
2841                         goto tr_setup;
2842                 }
2843                 break;
2844         }
2845 }
2846
2847 static void
2848 run_bulk_tx_callback0(struct usb_xfer *xfer, usb_error_t error)
2849 {
2850         run_bulk_tx_callbackN(xfer, error, 0);
2851 }
2852
2853 static void
2854 run_bulk_tx_callback1(struct usb_xfer *xfer, usb_error_t error)
2855 {
2856         run_bulk_tx_callbackN(xfer, error, 1);
2857 }
2858
2859 static void
2860 run_bulk_tx_callback2(struct usb_xfer *xfer, usb_error_t error)
2861 {
2862         run_bulk_tx_callbackN(xfer, error, 2);
2863 }
2864
2865 static void
2866 run_bulk_tx_callback3(struct usb_xfer *xfer, usb_error_t error)
2867 {
2868         run_bulk_tx_callbackN(xfer, error, 3);
2869 }
2870
2871 static void
2872 run_bulk_tx_callback4(struct usb_xfer *xfer, usb_error_t error)
2873 {
2874         run_bulk_tx_callbackN(xfer, error, 4);
2875 }
2876
2877 static void
2878 run_bulk_tx_callback5(struct usb_xfer *xfer, usb_error_t error)
2879 {
2880         run_bulk_tx_callbackN(xfer, error, 5);
2881 }
2882
2883 static void
2884 run_set_tx_desc(struct run_softc *sc, struct run_tx_data *data)
2885 {
2886         struct mbuf *m = data->m;
2887         struct ieee80211com *ic = sc->sc_ifp->if_l2com;
2888         struct ieee80211vap *vap = data->ni->ni_vap;
2889         struct ieee80211_frame *wh;
2890         struct rt2870_txd *txd;
2891         struct rt2860_txwi *txwi;
2892         uint16_t xferlen;
2893         uint16_t mcs;
2894         uint8_t ridx = data->ridx;
2895         uint8_t pad;
2896
2897         /* get MCS code from rate index */
2898         mcs = rt2860_rates[ridx].mcs;
2899
2900         xferlen = sizeof(*txwi) + m->m_pkthdr.len;
2901
2902         /* roundup to 32-bit alignment */
2903         xferlen = (xferlen + 3) & ~3;
2904
2905         txd = (struct rt2870_txd *)&data->desc;
2906         txd->len = htole16(xferlen);
2907
2908         wh = mtod(m, struct ieee80211_frame *);
2909
2910         /*
2911          * Ether both are true or both are false, the header
2912          * are nicely aligned to 32-bit. So, no L2 padding.
2913          */
2914         if(IEEE80211_HAS_ADDR4(wh) == IEEE80211_QOS_HAS_SEQ(wh))
2915                 pad = 0;
2916         else
2917                 pad = 2;
2918
2919         /* setup TX Wireless Information */
2920         txwi = (struct rt2860_txwi *)(txd + 1);
2921         txwi->len = htole16(m->m_pkthdr.len - pad);
2922         if (rt2860_rates[ridx].phy == IEEE80211_T_DS) {
2923                 txwi->phy = htole16(RT2860_PHY_CCK);
2924                 if (ridx != RT2860_RIDX_CCK1 &&
2925                     (ic->ic_flags & IEEE80211_F_SHPREAMBLE))
2926                         mcs |= RT2860_PHY_SHPRE;
2927         } else
2928                 txwi->phy = htole16(RT2860_PHY_OFDM);
2929         txwi->phy |= htole16(mcs);
2930
2931         /* check if RTS/CTS or CTS-to-self protection is required */
2932         if (!IEEE80211_IS_MULTICAST(wh->i_addr1) &&
2933             (m->m_pkthdr.len + IEEE80211_CRC_LEN > vap->iv_rtsthreshold ||
2934              ((ic->ic_flags & IEEE80211_F_USEPROT) &&
2935               rt2860_rates[ridx].phy == IEEE80211_T_OFDM)))
2936                 txwi->txop |= RT2860_TX_TXOP_HT;
2937         else
2938                 txwi->txop |= RT2860_TX_TXOP_BACKOFF;
2939
2940         if (vap->iv_opmode != IEEE80211_M_STA && !IEEE80211_QOS_HAS_SEQ(wh))
2941                 txwi->xflags |= RT2860_TX_NSEQ;
2942 }
2943
2944 /* This function must be called locked */
2945 static int
2946 run_tx(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
2947 {
2948         struct ieee80211com *ic = sc->sc_ifp->if_l2com;
2949         struct ieee80211vap *vap = ni->ni_vap;
2950         struct ieee80211_frame *wh;
2951         struct ieee80211_channel *chan;
2952         const struct ieee80211_txparam *tp;
2953         struct run_node *rn = (void *)ni;
2954         struct run_tx_data *data;
2955         struct rt2870_txd *txd;
2956         struct rt2860_txwi *txwi;
2957         uint16_t qos;
2958         uint16_t dur;
2959         uint16_t qid;
2960         uint8_t type;
2961         uint8_t tid;
2962         uint8_t ridx;
2963         uint8_t ctl_ridx;
2964         uint8_t qflags;
2965         uint8_t xflags = 0;
2966         int hasqos;
2967
2968         RUN_LOCK_ASSERT(sc, MA_OWNED);
2969
2970         wh = mtod(m, struct ieee80211_frame *);
2971
2972         type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
2973
2974         /*
2975          * There are 7 bulk endpoints: 1 for RX
2976          * and 6 for TX (4 EDCAs + HCCA + Prio).
2977          * Update 03-14-2009:  some devices like the Planex GW-US300MiniS
2978          * seem to have only 4 TX bulk endpoints (Fukaumi Naoki).
2979          */
2980         if ((hasqos = IEEE80211_QOS_HAS_SEQ(wh))) {
2981                 uint8_t *frm;
2982
2983                 if(IEEE80211_HAS_ADDR4(wh))
2984                         frm = ((struct ieee80211_qosframe_addr4 *)wh)->i_qos;
2985                 else
2986                         frm =((struct ieee80211_qosframe *)wh)->i_qos;
2987
2988                 qos = le16toh(*(const uint16_t *)frm);
2989                 tid = qos & IEEE80211_QOS_TID;
2990                 qid = TID_TO_WME_AC(tid);
2991         } else {
2992                 qos = 0;
2993                 tid = 0;
2994                 qid = WME_AC_BE;
2995         }
2996         qflags = (qid < 4) ? RT2860_TX_QSEL_EDCA : RT2860_TX_QSEL_HCCA;
2997
2998         DPRINTFN(8, "qos %d\tqid %d\ttid %d\tqflags %x\n",
2999             qos, qid, tid, qflags);
3000
3001         chan = (ni->ni_chan != IEEE80211_CHAN_ANYC)?ni->ni_chan:ic->ic_curchan;
3002         tp = &vap->iv_txparms[ieee80211_chan2mode(chan)];
3003
3004         /* pickup a rate index */
3005         if (IEEE80211_IS_MULTICAST(wh->i_addr1) ||
3006             type != IEEE80211_FC0_TYPE_DATA) {
3007                 ridx = (ic->ic_curmode == IEEE80211_MODE_11A) ?
3008                     RT2860_RIDX_OFDM6 : RT2860_RIDX_CCK1;
3009                 ctl_ridx = rt2860_rates[ridx].ctl_ridx;
3010         } else {
3011                 if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE)
3012                         ridx = rn->fix_ridx;
3013                 else
3014                         ridx = rn->amrr_ridx;
3015                 ctl_ridx = rt2860_rates[ridx].ctl_ridx;
3016         }
3017
3018         if (!IEEE80211_IS_MULTICAST(wh->i_addr1) &&
3019             (!hasqos || (qos & IEEE80211_QOS_ACKPOLICY) !=
3020              IEEE80211_QOS_ACKPOLICY_NOACK)) {
3021                 xflags |= RT2860_TX_ACK;
3022                 if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
3023                         dur = rt2860_rates[ctl_ridx].sp_ack_dur;
3024                 else
3025                         dur = rt2860_rates[ctl_ridx].lp_ack_dur;
3026                 *(uint16_t *)wh->i_dur = htole16(dur);
3027         }
3028
3029         /* reserve slots for mgmt packets, just in case */
3030         if (sc->sc_epq[qid].tx_nfree < 3) {
3031                 DPRINTFN(10, "tx ring %d is full\n", qid);
3032                 return (-1);
3033         }
3034
3035         data = STAILQ_FIRST(&sc->sc_epq[qid].tx_fh);
3036         STAILQ_REMOVE_HEAD(&sc->sc_epq[qid].tx_fh, next);
3037         sc->sc_epq[qid].tx_nfree--;
3038
3039         txd = (struct rt2870_txd *)&data->desc;
3040         txd->flags = qflags;
3041         txwi = (struct rt2860_txwi *)(txd + 1);
3042         txwi->xflags = xflags;
3043         txwi->wcid = IEEE80211_IS_MULTICAST(wh->i_addr1) ?
3044             0 : RUN_AID2WCID(ni->ni_associd);
3045         /* clear leftover garbage bits */
3046         txwi->flags = 0;
3047         txwi->txop = 0;
3048
3049         data->m = m;
3050         data->ni = ni;
3051         data->ridx = ridx;
3052
3053         run_set_tx_desc(sc, data);
3054
3055         /*
3056          * The chip keeps track of 2 kind of Tx stats,
3057          *  * TX_STAT_FIFO, for per WCID stats, and
3058          *  * TX_STA_CNT0 for all-TX-in-one stats.
3059          *
3060          * To use FIFO stats, we need to store MCS into the driver-private
3061          * PacketID field. So that, we can tell whose stats when we read them.
3062          * We add 1 to the MCS because setting the PacketID field to 0 means
3063          * that we don't want feedback in TX_STAT_FIFO.
3064          * And, that's what we want for STA mode, since TX_STA_CNT0 does the job.
3065          *
3066          * FIFO stats doesn't count Tx with WCID 0xff, so we do this in run_tx().
3067          */
3068         if (sc->rvp_cnt > 1 || vap->iv_opmode == IEEE80211_M_HOSTAP ||
3069             vap->iv_opmode == IEEE80211_M_MBSS) {
3070                 uint16_t pid = (rt2860_rates[ridx].mcs + 1) & 0xf;
3071                 txwi->len |= htole16(pid << RT2860_TX_PID_SHIFT);
3072
3073                 /*
3074                  * Unlike PCI based devices, we don't get any interrupt from
3075                  * USB devices, so we simulate FIFO-is-full interrupt here.
3076                  * Ralink recomends to drain FIFO stats every 100 ms, but 16 slots
3077                  * quickly get fulled. To prevent overflow, increment a counter on
3078                  * every FIFO stat request, so we know how many slots are left.
3079                  * We do this only in HOSTAP or multiple vap mode since FIFO stats
3080                  * are used only in those modes.
3081                  * We just drain stats. AMRR gets updated every 1 sec by
3082                  * run_ratectl_cb() via callout.
3083                  * Call it early. Otherwise overflow.
3084                  */
3085                 if (sc->fifo_cnt++ == 10) {
3086                         /*
3087                          * With multiple vaps or if_bridge, if_start() is called
3088                          * with a non-sleepable lock, tcpinp. So, need to defer.
3089                          */
3090                         uint32_t i = RUN_CMDQ_GET(&sc->cmdq_store);
3091                         DPRINTFN(6, "cmdq_store=%d\n", i);
3092                         sc->cmdq[i].func = run_drain_fifo;
3093                         sc->cmdq[i].arg0 = sc;
3094                         ieee80211_runtask(ic, &sc->cmdq_task);
3095                 }
3096         }
3097
3098         STAILQ_INSERT_TAIL(&sc->sc_epq[qid].tx_qh, data, next);
3099
3100         usbd_transfer_start(sc->sc_xfer[qid]);
3101
3102         DPRINTFN(8, "sending data frame len=%d rate=%d qid=%d\n", m->m_pkthdr.len +
3103             (int)(sizeof (struct rt2870_txd) + sizeof (struct rt2860_rxwi)),
3104             rt2860_rates[ridx].rate, qid);
3105
3106         return (0);
3107 }
3108
3109 static int
3110 run_tx_mgt(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
3111 {
3112         struct ifnet *ifp = sc->sc_ifp;
3113         struct ieee80211com *ic = ifp->if_l2com;
3114         struct run_node *rn = (void *)ni;
3115         struct run_tx_data *data;
3116         struct ieee80211_frame *wh;
3117         struct rt2870_txd *txd;
3118         struct rt2860_txwi *txwi;
3119         uint16_t dur;
3120         uint8_t ridx = rn->mgt_ridx;
3121         uint8_t type;
3122         uint8_t xflags = 0;
3123         uint8_t wflags = 0;
3124
3125         RUN_LOCK_ASSERT(sc, MA_OWNED);
3126
3127         wh = mtod(m, struct ieee80211_frame *);
3128
3129         type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
3130
3131         /* tell hardware to add timestamp for probe responses */
3132         if ((wh->i_fc[0] &
3133             (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_MASK)) ==
3134             (IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_PROBE_RESP))
3135                 wflags |= RT2860_TX_TS;
3136         else if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
3137                 xflags |= RT2860_TX_ACK;
3138
3139                 dur = ieee80211_ack_duration(ic->ic_rt, rt2860_rates[ridx].rate, 
3140                     ic->ic_flags & IEEE80211_F_SHPREAMBLE);
3141                 *(uint16_t *)wh->i_dur = htole16(dur);
3142         }
3143
3144         if (sc->sc_epq[0].tx_nfree == 0) {
3145                 /* let caller free mbuf */
3146                 ifp->if_drv_flags |= IFF_DRV_OACTIVE;
3147                 return (EIO);
3148         }
3149         data = STAILQ_FIRST(&sc->sc_epq[0].tx_fh);
3150         STAILQ_REMOVE_HEAD(&sc->sc_epq[0].tx_fh, next);
3151         sc->sc_epq[0].tx_nfree--;
3152
3153         txd = (struct rt2870_txd *)&data->desc;
3154         txd->flags = RT2860_TX_QSEL_EDCA;
3155         txwi = (struct rt2860_txwi *)(txd + 1);
3156         txwi->wcid = 0xff;
3157         txwi->flags = wflags;
3158         txwi->xflags = xflags;
3159         txwi->txop = 0; /* clear leftover garbage bits */
3160
3161         data->m = m;
3162         data->ni = ni;
3163         data->ridx = ridx;
3164
3165         run_set_tx_desc(sc, data);
3166
3167         DPRINTFN(10, "sending mgt frame len=%d rate=%d\n", m->m_pkthdr.len +
3168             (int)(sizeof (struct rt2870_txd) + sizeof (struct rt2860_rxwi)),
3169             rt2860_rates[ridx].rate);
3170
3171         STAILQ_INSERT_TAIL(&sc->sc_epq[0].tx_qh, data, next);
3172
3173         usbd_transfer_start(sc->sc_xfer[0]);
3174
3175         return (0);
3176 }
3177
3178 static int
3179 run_sendprot(struct run_softc *sc,
3180     const struct mbuf *m, struct ieee80211_node *ni, int prot, int rate)
3181 {
3182         struct ieee80211com *ic = ni->ni_ic;
3183         struct ieee80211_frame *wh;
3184         struct run_tx_data *data;
3185         struct rt2870_txd *txd;
3186         struct rt2860_txwi *txwi;
3187         struct mbuf *mprot;
3188         int ridx;
3189         int protrate;
3190         int ackrate;
3191         int pktlen;
3192         int isshort;
3193         uint16_t dur;
3194         uint8_t type;
3195         uint8_t wflags = 0;
3196         uint8_t xflags = 0;
3197
3198         RUN_LOCK_ASSERT(sc, MA_OWNED);
3199
3200         KASSERT(prot == IEEE80211_PROT_RTSCTS || prot == IEEE80211_PROT_CTSONLY,
3201             ("protection %d", prot));
3202
3203         wh = mtod(m, struct ieee80211_frame *);
3204         pktlen = m->m_pkthdr.len + IEEE80211_CRC_LEN;
3205         type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
3206
3207         protrate = ieee80211_ctl_rate(ic->ic_rt, rate);
3208         ackrate = ieee80211_ack_rate(ic->ic_rt, rate);
3209
3210         isshort = (ic->ic_flags & IEEE80211_F_SHPREAMBLE) != 0;
3211         dur = ieee80211_compute_duration(ic->ic_rt, pktlen, rate, isshort)
3212             + ieee80211_ack_duration(ic->ic_rt, rate, isshort);
3213         wflags = RT2860_TX_FRAG;
3214
3215         /* check that there are free slots before allocating the mbuf */
3216         if (sc->sc_epq[0].tx_nfree == 0) {
3217                 /* let caller free mbuf */
3218                 sc->sc_ifp->if_drv_flags |= IFF_DRV_OACTIVE;
3219                 return (ENOBUFS);
3220         }
3221
3222         if (prot == IEEE80211_PROT_RTSCTS) {
3223                 /* NB: CTS is the same size as an ACK */
3224                 dur += ieee80211_ack_duration(ic->ic_rt, rate, isshort);
3225                 xflags |= RT2860_TX_ACK;
3226                 mprot = ieee80211_alloc_rts(ic, wh->i_addr1, wh->i_addr2, dur);
3227         } else {
3228                 mprot = ieee80211_alloc_cts(ic, ni->ni_vap->iv_myaddr, dur);
3229         }
3230         if (mprot == NULL) {
3231                 sc->sc_ifp->if_oerrors++;
3232                 DPRINTF("could not allocate mbuf\n");
3233                 return (ENOBUFS);
3234         }
3235
3236         data = STAILQ_FIRST(&sc->sc_epq[0].tx_fh);
3237         STAILQ_REMOVE_HEAD(&sc->sc_epq[0].tx_fh, next);
3238         sc->sc_epq[0].tx_nfree--;
3239
3240         txd = (struct rt2870_txd *)&data->desc;
3241         txd->flags = RT2860_TX_QSEL_EDCA;
3242         txwi = (struct rt2860_txwi *)(txd + 1);
3243         txwi->wcid = 0xff;
3244         txwi->flags = wflags;
3245         txwi->xflags = xflags;
3246         txwi->txop = 0; /* clear leftover garbage bits */
3247
3248         data->m = mprot;
3249         data->ni = ieee80211_ref_node(ni);
3250
3251         for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++)
3252                 if (rt2860_rates[ridx].rate == protrate)
3253                         break;
3254         data->ridx = ridx;
3255
3256         run_set_tx_desc(sc, data);
3257
3258         DPRINTFN(1, "sending prot len=%u rate=%u\n",
3259             m->m_pkthdr.len, rate);
3260
3261         STAILQ_INSERT_TAIL(&sc->sc_epq[0].tx_qh, data, next);
3262
3263         usbd_transfer_start(sc->sc_xfer[0]);
3264
3265         return (0);
3266 }
3267
3268 static int
3269 run_tx_param(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni,
3270     const struct ieee80211_bpf_params *params)
3271 {
3272         struct ieee80211com *ic = ni->ni_ic;
3273         struct ieee80211_frame *wh;
3274         struct run_tx_data *data;
3275         struct rt2870_txd *txd;
3276         struct rt2860_txwi *txwi;
3277         uint8_t type;
3278         uint8_t ridx;
3279         uint8_t rate;
3280         uint8_t opflags = 0;
3281         uint8_t xflags = 0;
3282         int error;
3283
3284         RUN_LOCK_ASSERT(sc, MA_OWNED);
3285
3286         KASSERT(params != NULL, ("no raw xmit params"));
3287
3288         wh = mtod(m, struct ieee80211_frame *);
3289         type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
3290
3291         rate = params->ibp_rate0;
3292         if (!ieee80211_isratevalid(ic->ic_rt, rate)) {
3293                 /* let caller free mbuf */
3294                 return (EINVAL);
3295         }
3296
3297         if ((params->ibp_flags & IEEE80211_BPF_NOACK) == 0)
3298                 xflags |= RT2860_TX_ACK;
3299         if (params->ibp_flags & (IEEE80211_BPF_RTS|IEEE80211_BPF_CTS)) {
3300                 error = run_sendprot(sc, m, ni,
3301                     params->ibp_flags & IEEE80211_BPF_RTS ?
3302                         IEEE80211_PROT_RTSCTS : IEEE80211_PROT_CTSONLY,
3303                     rate);
3304                 if (error) {
3305                         /* let caller free mbuf */
3306                         return error;
3307                 }
3308                 opflags |= /*XXX RT2573_TX_LONG_RETRY |*/ RT2860_TX_TXOP_SIFS;
3309         }
3310
3311         if (sc->sc_epq[0].tx_nfree == 0) {
3312                 /* let caller free mbuf */
3313                 sc->sc_ifp->if_drv_flags |= IFF_DRV_OACTIVE;
3314                 DPRINTF("sending raw frame, but tx ring is full\n");
3315                 return (EIO);
3316         }
3317         data = STAILQ_FIRST(&sc->sc_epq[0].tx_fh);
3318         STAILQ_REMOVE_HEAD(&sc->sc_epq[0].tx_fh, next);
3319         sc->sc_epq[0].tx_nfree--;
3320
3321         txd = (struct rt2870_txd *)&data->desc;
3322         txd->flags = RT2860_TX_QSEL_EDCA;
3323         txwi = (struct rt2860_txwi *)(txd + 1);
3324         txwi->wcid = 0xff;
3325         txwi->xflags = xflags;
3326         txwi->txop = opflags;
3327         txwi->flags = 0;        /* clear leftover garbage bits */
3328
3329         data->m = m;
3330         data->ni = ni;
3331         for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++)
3332                 if (rt2860_rates[ridx].rate == rate)
3333                         break;
3334         data->ridx = ridx;
3335
3336         run_set_tx_desc(sc, data);
3337
3338         DPRINTFN(10, "sending raw frame len=%u rate=%u\n",
3339             m->m_pkthdr.len, rate);
3340
3341         STAILQ_INSERT_TAIL(&sc->sc_epq[0].tx_qh, data, next);
3342
3343         usbd_transfer_start(sc->sc_xfer[0]);
3344
3345         return (0);
3346 }
3347
3348 static int
3349 run_raw_xmit(struct ieee80211_node *ni, struct mbuf *m,
3350     const struct ieee80211_bpf_params *params)
3351 {
3352         struct ifnet *ifp = ni->ni_ic->ic_ifp;
3353         struct run_softc *sc = ifp->if_softc;
3354         int error = 0;
3355  
3356         RUN_LOCK(sc);
3357
3358         /* prevent management frames from being sent if we're not ready */
3359         if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
3360                 error =  ENETDOWN;
3361                 goto done;
3362         }
3363
3364         if (params == NULL) {
3365                 /* tx mgt packet */
3366                 if ((error = run_tx_mgt(sc, m, ni)) != 0) {
3367                         ifp->if_oerrors++;
3368                         DPRINTF("mgt tx failed\n");
3369                         goto done;
3370                 }
3371         } else {
3372                 /* tx raw packet with param */
3373                 if ((error = run_tx_param(sc, m, ni, params)) != 0) {
3374                         ifp->if_oerrors++;
3375                         DPRINTF("tx with param failed\n");
3376                         goto done;
3377                 }
3378         }
3379
3380         ifp->if_opackets++;
3381
3382 done:
3383         RUN_UNLOCK(sc);
3384
3385         if (error != 0) {
3386                 if(m != NULL)
3387                         m_freem(m);
3388                 ieee80211_free_node(ni);
3389         }
3390
3391         return (error);
3392 }
3393
3394 static void
3395 run_start(struct ifnet *ifp)
3396 {
3397         struct run_softc *sc = ifp->if_softc;
3398         struct ieee80211_node *ni;
3399         struct mbuf *m;
3400
3401         RUN_LOCK(sc);
3402
3403         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0) {
3404                 RUN_UNLOCK(sc);
3405                 return;
3406         }
3407
3408         for (;;) {
3409                 /* send data frames */
3410                 IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
3411                 if (m == NULL)
3412                         break;
3413
3414                 ni = (struct ieee80211_node *)m->m_pkthdr.rcvif;
3415                 if (run_tx(sc, m, ni) != 0) {
3416                         IFQ_DRV_PREPEND(&ifp->if_snd, m);
3417                         ifp->if_drv_flags |= IFF_DRV_OACTIVE;
3418                         break;
3419                 }
3420         }
3421
3422         RUN_UNLOCK(sc);
3423 }
3424
3425 static int
3426 run_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
3427 {
3428         struct run_softc *sc = ifp->if_softc;
3429         struct ieee80211com *ic = sc->sc_ifp->if_l2com;
3430         struct ifreq *ifr = (struct ifreq *) data;
3431         int startall = 0;
3432         int error = 0;
3433
3434         switch (cmd) {
3435         case SIOCSIFFLAGS:
3436                 RUN_LOCK(sc);
3437                 if (ifp->if_flags & IFF_UP) {
3438                         if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)){
3439                                 startall = 1;
3440                                 run_init_locked(sc);
3441                         } else
3442                                 run_update_promisc_locked(ifp);
3443                 } else {
3444                         if (ifp->if_drv_flags & IFF_DRV_RUNNING &&
3445                             (ic->ic_nrunning == 0 || sc->rvp_cnt <= 1)) {
3446                                         run_stop(sc);
3447                         }
3448                 }
3449                 RUN_UNLOCK(sc);
3450                 if (startall)
3451                         ieee80211_start_all(ic);
3452                 break;
3453         case SIOCGIFMEDIA:
3454                 error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd);
3455                 break;
3456         case SIOCGIFADDR:
3457                 error = ether_ioctl(ifp, cmd, data);
3458                 break;
3459         default:
3460                 error = EINVAL;
3461                 break;
3462         }
3463
3464         return (error);
3465 }
3466
3467 static void
3468 run_set_agc(struct run_softc *sc, uint8_t agc)
3469 {
3470         uint8_t bbp;
3471
3472         if (sc->mac_ver == 0x3572) {
3473                 run_bbp_read(sc, 27, &bbp);
3474                 bbp &= ~(0x3 << 5);
3475                 run_bbp_write(sc, 27, bbp | 0 << 5);    /* select Rx0 */
3476                 run_bbp_write(sc, 66, agc);
3477                 run_bbp_write(sc, 27, bbp | 1 << 5);    /* select Rx1 */
3478                 run_bbp_write(sc, 66, agc);
3479         } else
3480                 run_bbp_write(sc, 66, agc);
3481 }
3482
3483 static void
3484 run_select_chan_group(struct run_softc *sc, int group)
3485 {
3486         uint32_t tmp;
3487         uint8_t agc;
3488
3489         run_bbp_write(sc, 62, 0x37 - sc->lna[group]);
3490         run_bbp_write(sc, 63, 0x37 - sc->lna[group]);
3491         run_bbp_write(sc, 64, 0x37 - sc->lna[group]);
3492         run_bbp_write(sc, 86, 0x00);
3493
3494         if (group == 0) {
3495                 if (sc->ext_2ghz_lna) {
3496                         run_bbp_write(sc, 82, 0x62);
3497                         run_bbp_write(sc, 75, 0x46);
3498                 } else {
3499                         run_bbp_write(sc, 82, 0x84);
3500                         run_bbp_write(sc, 75, 0x50);
3501                 }
3502         } else {
3503                 if (sc->mac_ver == 0x3572)
3504                         run_bbp_write(sc, 82, 0x94);
3505                 else
3506                         run_bbp_write(sc, 82, 0xf2);
3507                 if (sc->ext_5ghz_lna)
3508                         run_bbp_write(sc, 75, 0x46);
3509                 else 
3510                         run_bbp_write(sc, 75, 0x50);
3511         }
3512
3513         run_read(sc, RT2860_TX_BAND_CFG, &tmp);
3514         tmp &= ~(RT2860_5G_BAND_SEL_N | RT2860_5G_BAND_SEL_P);
3515         tmp |= (group == 0) ? RT2860_5G_BAND_SEL_N : RT2860_5G_BAND_SEL_P;
3516         run_write(sc, RT2860_TX_BAND_CFG, tmp);
3517
3518         /* enable appropriate Power Amplifiers and Low Noise Amplifiers */
3519         tmp = RT2860_RFTR_EN | RT2860_TRSW_EN | RT2860_LNA_PE0_EN;
3520         if (sc->nrxchains > 1)
3521                 tmp |= RT2860_LNA_PE1_EN;
3522         if (group == 0) {       /* 2GHz */
3523                 tmp |= RT2860_PA_PE_G0_EN;
3524                 if (sc->ntxchains > 1)
3525                         tmp |= RT2860_PA_PE_G1_EN;
3526         } else {                /* 5GHz */
3527                 tmp |= RT2860_PA_PE_A0_EN;
3528                 if (sc->ntxchains > 1)
3529                         tmp |= RT2860_PA_PE_A1_EN;
3530         }
3531         if (sc->mac_ver == 0x3572) {
3532                 run_rt3070_rf_write(sc, 8, 0x00);
3533                 run_write(sc, RT2860_TX_PIN_CFG, tmp);
3534                 run_rt3070_rf_write(sc, 8, 0x80);
3535         } else
3536                 run_write(sc, RT2860_TX_PIN_CFG, tmp);
3537
3538         /* set initial AGC value */
3539         if (group == 0) {       /* 2GHz band */
3540                 if (sc->mac_ver >= 0x3070)
3541                         agc = 0x1c + sc->lna[0] * 2;
3542                 else
3543                         agc = 0x2e + sc->lna[0];
3544         } else {                /* 5GHz band */
3545                 if (sc->mac_ver == 0x3572)
3546                         agc = 0x22 + (sc->lna[group] * 5) / 3;
3547                 else
3548                         agc = 0x32 + (sc->lna[group] * 5) / 3;
3549         }
3550         run_set_agc(sc, agc);
3551 }
3552
3553 static void
3554 run_rt2870_set_chan(struct run_softc *sc, uint32_t chan)
3555 {
3556         const struct rfprog *rfprog = rt2860_rf2850;
3557         uint32_t r2, r3, r4;
3558         int8_t txpow1, txpow2;
3559         int i;
3560
3561         /* find the settings for this channel (we know it exists) */
3562         for (i = 0; rfprog[i].chan != chan; i++);
3563
3564         r2 = rfprog[i].r2;
3565         if (sc->ntxchains == 1)
3566                 r2 |= 1 << 12;          /* 1T: disable Tx chain 2 */
3567         if (sc->nrxchains == 1)
3568                 r2 |= 1 << 15 | 1 << 4; /* 1R: disable Rx chains 2 & 3 */
3569         else if (sc->nrxchains == 2)
3570                 r2 |= 1 << 4;           /* 2R: disable Rx chain 3 */
3571
3572         /* use Tx power values from EEPROM */
3573         txpow1 = sc->txpow1[i];
3574         txpow2 = sc->txpow2[i];
3575         if (chan > 14) {
3576                 if (txpow1 >= 0)
3577                         txpow1 = txpow1 << 1 | 1;
3578                 else
3579                         txpow1 = (7 + txpow1) << 1;
3580                 if (txpow2 >= 0)
3581                         txpow2 = txpow2 << 1 | 1;
3582                 else
3583                         txpow2 = (7 + txpow2) << 1;
3584         }
3585         r3 = rfprog[i].r3 | txpow1 << 7;
3586         r4 = rfprog[i].r4 | sc->freq << 13 | txpow2 << 4;
3587
3588         run_rt2870_rf_write(sc, RT2860_RF1, rfprog[i].r1);
3589         run_rt2870_rf_write(sc, RT2860_RF2, r2);
3590         run_rt2870_rf_write(sc, RT2860_RF3, r3);
3591         run_rt2870_rf_write(sc, RT2860_RF4, r4);
3592
3593         run_delay(sc, 10);
3594
3595         run_rt2870_rf_write(sc, RT2860_RF1, rfprog[i].r1);
3596         run_rt2870_rf_write(sc, RT2860_RF2, r2);
3597         run_rt2870_rf_write(sc, RT2860_RF3, r3 | 1);
3598         run_rt2870_rf_write(sc, RT2860_RF4, r4);
3599
3600         run_delay(sc, 10);
3601
3602         run_rt2870_rf_write(sc, RT2860_RF1, rfprog[i].r1);
3603         run_rt2870_rf_write(sc, RT2860_RF2, r2);
3604         run_rt2870_rf_write(sc, RT2860_RF3, r3);
3605         run_rt2870_rf_write(sc, RT2860_RF4, r4);
3606 }
3607
3608 static void
3609 run_rt3070_set_chan(struct run_softc *sc, uint32_t chan)
3610 {
3611         int8_t txpow1, txpow2;
3612         uint8_t rf;
3613         int i;
3614
3615         /* RT3070 is 2GHz only */
3616         KASSERT(chan >= 1 && chan <= 14, ("wrong channel selected\n"));
3617
3618         /* find the settings for this channel (we know it exists) */
3619         for (i = 0; rt2860_rf2850[i].chan != chan; i++);
3620
3621         /* use Tx power values from EEPROM */
3622         txpow1 = sc->txpow1[i];
3623         txpow2 = sc->txpow2[i];
3624
3625         run_rt3070_rf_write(sc, 2, rt3070_freqs[i].n);
3626         run_rt3070_rf_write(sc, 3, rt3070_freqs[i].k);
3627         run_rt3070_rf_read(sc, 6, &rf);
3628         rf = (rf & ~0x03) | rt3070_freqs[i].r;
3629         run_rt3070_rf_write(sc, 6, rf);
3630
3631         /* set Tx0 power */
3632         run_rt3070_rf_read(sc, 12, &rf);
3633         rf = (rf & ~0x1f) | txpow1;
3634         run_rt3070_rf_write(sc, 12, rf);
3635
3636         /* set Tx1 power */
3637         run_rt3070_rf_read(sc, 13, &rf);
3638         rf = (rf & ~0x1f) | txpow2;
3639         run_rt3070_rf_write(sc, 13, rf);
3640
3641         run_rt3070_rf_read(sc, 1, &rf);
3642         rf &= ~0xfc;
3643         if (sc->ntxchains == 1)
3644                 rf |= 1 << 7 | 1 << 5;  /* 1T: disable Tx chains 2 & 3 */
3645         else if (sc->ntxchains == 2)
3646                 rf |= 1 << 7;           /* 2T: disable Tx chain 3 */
3647         if (sc->nrxchains == 1)
3648                 rf |= 1 << 6 | 1 << 4;  /* 1R: disable Rx chains 2 & 3 */
3649         else if (sc->nrxchains == 2)
3650                 rf |= 1 << 6;           /* 2R: disable Rx chain 3 */
3651         run_rt3070_rf_write(sc, 1, rf);
3652
3653         /* set RF offset */
3654         run_rt3070_rf_read(sc, 23, &rf);
3655         rf = (rf & ~0x7f) | sc->freq;
3656         run_rt3070_rf_write(sc, 23, rf);
3657
3658         /* program RF filter */
3659         run_rt3070_rf_read(sc, 24, &rf);        /* Tx */
3660         rf = (rf & ~0x3f) | sc->rf24_20mhz;
3661         run_rt3070_rf_write(sc, 24, rf);
3662         run_rt3070_rf_read(sc, 31, &rf);        /* Rx */
3663         rf = (rf & ~0x3f) | sc->rf24_20mhz;
3664         run_rt3070_rf_write(sc, 31, rf);
3665
3666         /* enable RF tuning */
3667         run_rt3070_rf_read(sc, 7, &rf);
3668         run_rt3070_rf_write(sc, 7, rf | 0x01);
3669 }
3670
3671 static void
3672 run_rt3572_set_chan(struct run_softc *sc, u_int chan)
3673 {
3674         int8_t txpow1, txpow2;
3675         uint32_t tmp;
3676         uint8_t rf;
3677         int i;
3678
3679         /* find the settings for this channel (we know it exists) */
3680         for (i = 0; rt2860_rf2850[i].chan != chan; i++);
3681
3682         /* use Tx power values from EEPROM */
3683         txpow1 = sc->txpow1[i];
3684         txpow2 = sc->txpow2[i];
3685
3686         if (chan <= 14) {
3687                 run_bbp_write(sc, 25, sc->bbp25);
3688                 run_bbp_write(sc, 26, sc->bbp26);
3689         } else {
3690                 /* enable IQ phase correction */
3691                 run_bbp_write(sc, 25, 0x09);
3692                 run_bbp_write(sc, 26, 0xff);
3693         }
3694
3695         run_rt3070_rf_write(sc, 2, rt3070_freqs[i].n);
3696         run_rt3070_rf_write(sc, 3, rt3070_freqs[i].k);
3697         run_rt3070_rf_read(sc, 6, &rf);
3698         rf  = (rf & ~0x0f) | rt3070_freqs[i].r;
3699         rf |= (chan <= 14) ? 0x08 : 0x04;
3700         run_rt3070_rf_write(sc, 6, rf);
3701
3702         /* set PLL mode */
3703         run_rt3070_rf_read(sc, 5, &rf);
3704         rf &= ~(0x08 | 0x04);
3705         rf |= (chan <= 14) ? 0x04 : 0x08;
3706         run_rt3070_rf_write(sc, 5, rf);
3707
3708         /* set Tx power for chain 0 */
3709         if (chan <= 14)
3710                 rf = 0x60 | txpow1;
3711         else
3712                 rf = 0xe0 | (txpow1 & 0xc) << 1 | (txpow1 & 0x3);
3713         run_rt3070_rf_write(sc, 12, rf);
3714
3715         /* set Tx power for chain 1 */
3716         if (chan <= 14)
3717                 rf = 0x60 | txpow2;
3718         else
3719                 rf = 0xe0 | (txpow2 & 0xc) << 1 | (txpow2 & 0x3);
3720         run_rt3070_rf_write(sc, 13, rf);
3721
3722         /* set Tx/Rx streams */
3723         run_rt3070_rf_read(sc, 1, &rf);
3724         rf &= ~0xfc;
3725         if (sc->ntxchains == 1)
3726                 rf |= 1 << 7 | 1 << 5;  /* 1T: disable Tx chains 2 & 3 */
3727         else if (sc->ntxchains == 2)
3728                 rf |= 1 << 7;           /* 2T: disable Tx chain 3 */
3729         if (sc->nrxchains == 1)
3730                 rf |= 1 << 6 | 1 << 4;  /* 1R: disable Rx chains 2 & 3 */
3731         else if (sc->nrxchains == 2)
3732                 rf |= 1 << 6;           /* 2R: disable Rx chain 3 */
3733         run_rt3070_rf_write(sc, 1, rf);
3734
3735         /* set RF offset */
3736         run_rt3070_rf_read(sc, 23, &rf);
3737         rf = (rf & ~0x7f) | sc->freq;
3738         run_rt3070_rf_write(sc, 23, rf);
3739
3740         /* program RF filter */
3741         rf = sc->rf24_20mhz;
3742         run_rt3070_rf_write(sc, 24, rf);        /* Tx */
3743         run_rt3070_rf_write(sc, 31, rf);        /* Rx */
3744
3745         /* enable RF tuning */
3746         run_rt3070_rf_read(sc, 7, &rf);
3747         rf = (chan <= 14) ? 0xd8 : ((rf & ~0xc8) | 0x14);
3748         run_rt3070_rf_write(sc, 7, rf);
3749
3750         /* TSSI */
3751         rf = (chan <= 14) ? 0xc3 : 0xc0;
3752         run_rt3070_rf_write(sc, 9, rf);
3753
3754         /* set loop filter 1 */
3755         run_rt3070_rf_write(sc, 10, 0xf1);
3756         /* set loop filter 2 */
3757         run_rt3070_rf_write(sc, 11, (chan <= 14) ? 0xb9 : 0x00);
3758
3759         /* set tx_mx2_ic */
3760         run_rt3070_rf_write(sc, 15, (chan <= 14) ? 0x53 : 0x43);
3761         /* set tx_mx1_ic */
3762         if (chan <= 14)
3763                 rf = 0x48 | sc->txmixgain_2ghz;
3764         else
3765                 rf = 0x78 | sc->txmixgain_5ghz;
3766         run_rt3070_rf_write(sc, 16, rf);
3767
3768         /* set tx_lo1 */
3769         run_rt3070_rf_write(sc, 17, 0x23);
3770         /* set tx_lo2 */
3771         if (chan <= 14)
3772                 rf = 0x93;
3773         else if (chan <= 64)
3774                 rf = 0xb7;
3775         else if (chan <= 128)
3776                 rf = 0x74;
3777         else
3778                 rf = 0x72;
3779         run_rt3070_rf_write(sc, 19, rf);
3780
3781         /* set rx_lo1 */
3782         if (chan <= 14)
3783                 rf = 0xb3;
3784         else if (chan <= 64)
3785                 rf = 0xf6;
3786         else if (chan <= 128)
3787                 rf = 0xf4;
3788         else
3789                 rf = 0xf3;
3790         run_rt3070_rf_write(sc, 20, rf);
3791
3792         /* set pfd_delay */
3793         if (chan <= 14)
3794                 rf = 0x15;
3795         else if (chan <= 64)
3796                 rf = 0x3d;
3797         else
3798                 rf = 0x01;
3799         run_rt3070_rf_write(sc, 25, rf);
3800
3801         /* set rx_lo2 */
3802         run_rt3070_rf_write(sc, 26, (chan <= 14) ? 0x85 : 0x87);
3803         /* set ldo_rf_vc */
3804         run_rt3070_rf_write(sc, 27, (chan <= 14) ? 0x00 : 0x01);
3805         /* set drv_cc */
3806         run_rt3070_rf_write(sc, 29, (chan <= 14) ? 0x9b : 0x9f);
3807
3808         run_read(sc, RT2860_GPIO_CTRL, &tmp);
3809         tmp &= ~0x8080;
3810         if (chan <= 14)
3811                 tmp |= 0x80;
3812         run_write(sc, RT2860_GPIO_CTRL, tmp);
3813
3814         /* enable RF tuning */
3815         run_rt3070_rf_read(sc, 7, &rf);
3816         run_rt3070_rf_write(sc, 7, rf | 0x01);
3817
3818         run_delay(sc, 2);
3819 }
3820
3821 static void
3822 run_set_rx_antenna(struct run_softc *sc, int aux)
3823 {
3824         uint32_t tmp;
3825
3826         if (aux) {
3827                 run_mcu_cmd(sc, RT2860_MCU_CMD_ANTSEL, 0);
3828                 run_read(sc, RT2860_GPIO_CTRL, &tmp);
3829                 run_write(sc, RT2860_GPIO_CTRL, (tmp & ~0x0808) | 0x08);
3830         } else {
3831                 run_mcu_cmd(sc, RT2860_MCU_CMD_ANTSEL, 1);
3832                 run_read(sc, RT2860_GPIO_CTRL, &tmp);
3833                 run_write(sc, RT2860_GPIO_CTRL, tmp & ~0x0808);
3834         }
3835 }
3836
3837 static int
3838 run_set_chan(struct run_softc *sc, struct ieee80211_channel *c)
3839 {
3840         struct ieee80211com *ic = sc->sc_ifp->if_l2com;
3841         uint32_t chan, group;
3842
3843         chan = ieee80211_chan2ieee(ic, c);
3844         if (chan == 0 || chan == IEEE80211_CHAN_ANY)
3845                 return (EINVAL);
3846
3847         if (sc->mac_ver == 0x3572)
3848                 run_rt3572_set_chan(sc, chan);
3849         else if (sc->mac_ver >= 0x3070)
3850                 run_rt3070_set_chan(sc, chan);
3851         else
3852                 run_rt2870_set_chan(sc, chan);
3853
3854         /* determine channel group */
3855         if (chan <= 14)
3856                 group = 0;
3857         else if (chan <= 64)
3858                 group = 1;
3859         else if (chan <= 128)
3860                 group = 2;
3861         else
3862                 group = 3;
3863
3864         /* XXX necessary only when group has changed! */
3865         run_select_chan_group(sc, group);
3866
3867         run_delay(sc, 10);
3868
3869         return (0);
3870 }
3871
3872 static void
3873 run_set_channel(struct ieee80211com *ic)
3874 {
3875         struct run_softc *sc = ic->ic_ifp->if_softc;
3876
3877         RUN_LOCK(sc);
3878         run_set_chan(sc, ic->ic_curchan);
3879         RUN_UNLOCK(sc);
3880
3881         return;
3882 }
3883
3884 static void
3885 run_scan_start(struct ieee80211com *ic)
3886 {
3887         struct run_softc *sc = ic->ic_ifp->if_softc;
3888         uint32_t tmp;
3889
3890         RUN_LOCK(sc);
3891
3892         /* abort TSF synchronization */
3893         run_read(sc, RT2860_BCN_TIME_CFG, &tmp);
3894         run_write(sc, RT2860_BCN_TIME_CFG,
3895             tmp & ~(RT2860_BCN_TX_EN | RT2860_TSF_TIMER_EN |
3896             RT2860_TBTT_TIMER_EN));
3897         run_set_bssid(sc, sc->sc_ifp->if_broadcastaddr);
3898
3899         RUN_UNLOCK(sc);
3900
3901         return;
3902 }
3903
3904 static void
3905 run_scan_end(struct ieee80211com *ic)
3906 {
3907         struct run_softc *sc = ic->ic_ifp->if_softc;
3908
3909         RUN_LOCK(sc);
3910
3911         run_enable_tsf_sync(sc);
3912         /* XXX keep local copy */
3913         run_set_bssid(sc, sc->sc_bssid);
3914
3915         RUN_UNLOCK(sc);
3916
3917         return;
3918 }
3919
3920 /*
3921  * Could be called from ieee80211_node_timeout()
3922  * (non-sleepable thread)
3923  */
3924 static void
3925 run_update_beacon(struct ieee80211vap *vap, int item)
3926 {
3927         struct ieee80211com *ic = vap->iv_ic;
3928         struct run_softc *sc = ic->ic_ifp->if_softc;
3929         struct run_vap *rvp = RUN_VAP(vap);
3930         int mcast = 0;
3931         uint32_t i;
3932
3933         KASSERT(vap != NULL, ("no beacon"));
3934
3935         switch (item) {
3936         case IEEE80211_BEACON_ERP:
3937                 run_updateslot(ic->ic_ifp);
3938                 break;
3939         case IEEE80211_BEACON_HTINFO:
3940                 run_updateprot(ic);
3941                 break;
3942         case IEEE80211_BEACON_TIM:
3943                 mcast = 1;      /*TODO*/
3944                 break;
3945         default:
3946                 break;
3947         }
3948
3949         setbit(rvp->bo.bo_flags, item);
3950         ieee80211_beacon_update(vap->iv_bss, &rvp->bo, rvp->beacon_mbuf, mcast);
3951
3952         i = RUN_CMDQ_GET(&sc->cmdq_store);
3953         DPRINTF("cmdq_store=%d\n", i);
3954         sc->cmdq[i].func = run_update_beacon_cb;
3955         sc->cmdq[i].arg0 = vap;
3956         ieee80211_runtask(ic, &sc->cmdq_task);
3957
3958         return;
3959 }
3960
3961 static void
3962 run_update_beacon_cb(void *arg)
3963 {
3964         struct ieee80211vap *vap = arg;
3965         struct run_vap *rvp = RUN_VAP(vap);
3966         struct ieee80211com *ic = vap->iv_ic;
3967         struct run_softc *sc = ic->ic_ifp->if_softc;
3968         struct rt2860_txwi txwi;
3969         struct mbuf *m;
3970         uint8_t ridx;
3971
3972         if (vap->iv_bss->ni_chan == IEEE80211_CHAN_ANYC)
3973                 return;
3974
3975         /*
3976          * No need to call ieee80211_beacon_update(), run_update_beacon()
3977          * is taking care of apropriate calls.
3978          */
3979         if (rvp->beacon_mbuf == NULL) {
3980                 rvp->beacon_mbuf = ieee80211_beacon_alloc(vap->iv_bss,
3981                     &rvp->bo);
3982                 if (rvp->beacon_mbuf == NULL)
3983                         return;
3984         }
3985         m = rvp->beacon_mbuf;
3986
3987         memset(&txwi, 0, sizeof txwi);
3988         txwi.wcid = 0xff;
3989         txwi.len = htole16(m->m_pkthdr.len);
3990         /* send beacons at the lowest available rate */
3991         ridx = (ic->ic_curmode == IEEE80211_MODE_11A) ?
3992             RT2860_RIDX_OFDM6 : RT2860_RIDX_CCK1;
3993         txwi.phy = htole16(rt2860_rates[ridx].mcs);
3994         if (rt2860_rates[ridx].phy == IEEE80211_T_OFDM)
3995                 txwi.phy |= htole16(RT2860_PHY_OFDM);
3996         txwi.txop = RT2860_TX_TXOP_HT;
3997         txwi.flags = RT2860_TX_TS;
3998         txwi.xflags = RT2860_TX_NSEQ;
3999
4000         run_write_region_1(sc, RT2860_BCN_BASE(rvp->rvp_id),
4001             (uint8_t *)&txwi, sizeof txwi);
4002         run_write_region_1(sc, RT2860_BCN_BASE(rvp->rvp_id) + sizeof txwi,
4003             mtod(m, uint8_t *), (m->m_pkthdr.len + 1) & ~1);    /* roundup len */
4004
4005         return;
4006 }
4007
4008 static void
4009 run_updateprot(struct ieee80211com *ic)
4010 {
4011         struct run_softc *sc = ic->ic_ifp->if_softc;
4012         uint32_t i;
4013
4014         i = RUN_CMDQ_GET(&sc->cmdq_store);
4015         DPRINTF("cmdq_store=%d\n", i);
4016         sc->cmdq[i].func = run_updateprot_cb;
4017         sc->cmdq[i].arg0 = ic;
4018         ieee80211_runtask(ic, &sc->cmdq_task);
4019 }
4020
4021 static void
4022 run_updateprot_cb(void *arg)
4023 {
4024         struct ieee80211com *ic = arg;
4025         struct run_softc *sc = ic->ic_ifp->if_softc;
4026         uint32_t tmp;
4027
4028         tmp = RT2860_RTSTH_EN | RT2860_PROT_NAV_SHORT | RT2860_TXOP_ALLOW_ALL;
4029         /* setup protection frame rate (MCS code) */
4030         tmp |= (ic->ic_curmode == IEEE80211_MODE_11A) ?
4031             rt2860_rates[RT2860_RIDX_OFDM6].mcs :
4032             rt2860_rates[RT2860_RIDX_CCK11].mcs;
4033
4034         /* CCK frames don't require protection */
4035         run_write(sc, RT2860_CCK_PROT_CFG, tmp);
4036         if (ic->ic_flags & IEEE80211_F_USEPROT) {
4037                 if (ic->ic_protmode == IEEE80211_PROT_RTSCTS)
4038                         tmp |= RT2860_PROT_CTRL_RTS_CTS;
4039                 else if (ic->ic_protmode == IEEE80211_PROT_CTSONLY)
4040                         tmp |= RT2860_PROT_CTRL_CTS;
4041         }
4042         run_write(sc, RT2860_OFDM_PROT_CFG, tmp);
4043 }
4044
4045 static void
4046 run_usb_timeout_cb(void *arg)
4047 {
4048         struct ieee80211vap *vap = arg;
4049         struct run_softc *sc = vap->iv_ic->ic_ifp->if_softc;
4050
4051         RUN_LOCK_ASSERT(sc, MA_OWNED);
4052
4053         if(vap->iv_state == IEEE80211_S_RUN &&
4054             vap->iv_opmode != IEEE80211_M_STA)
4055                 run_reset_livelock(sc);
4056         else if (vap->iv_state == IEEE80211_S_SCAN) {
4057                 DPRINTF("timeout caused by scan\n");
4058                 /* cancel bgscan */
4059                 ieee80211_cancel_scan(vap);
4060         } else
4061                 DPRINTF("timeout by unknown cause\n");
4062 }
4063
4064 static void
4065 run_reset_livelock(struct run_softc *sc)
4066 {
4067         uint32_t tmp;
4068
4069         RUN_LOCK_ASSERT(sc, MA_OWNED);
4070
4071         /*
4072          * In IBSS or HostAP modes (when the hardware sends beacons), the MAC
4073          * can run into a livelock and start sending CTS-to-self frames like
4074          * crazy if protection is enabled.  Reset MAC/BBP for a while
4075          */
4076         run_read(sc, RT2860_DEBUG, &tmp);
4077         DPRINTFN(3, "debug reg %08x\n", tmp);
4078         if ((tmp & (1 << 29)) && (tmp & (1 << 7 | 1 << 5))) {
4079                 DPRINTF("CTS-to-self livelock detected\n");
4080                 run_write(sc, RT2860_MAC_SYS_CTRL, RT2860_MAC_SRST);
4081                 run_delay(sc, 1);
4082                 run_write(sc, RT2860_MAC_SYS_CTRL,
4083                     RT2860_MAC_RX_EN | RT2860_MAC_TX_EN);
4084         }
4085 }
4086
4087 static void
4088 run_update_promisc_locked(struct ifnet *ifp)
4089 {
4090         struct run_softc *sc = ifp->if_softc;
4091         uint32_t tmp;
4092
4093         run_read(sc, RT2860_RX_FILTR_CFG, &tmp);
4094
4095         tmp |= RT2860_DROP_UC_NOME;
4096         if (ifp->if_flags & IFF_PROMISC)
4097                 tmp &= ~RT2860_DROP_UC_NOME;
4098
4099         run_write(sc, RT2860_RX_FILTR_CFG, tmp);
4100
4101         DPRINTF("%s promiscuous mode\n", (ifp->if_flags & IFF_PROMISC) ?
4102             "entering" : "leaving");
4103 }
4104
4105 static void
4106 run_update_promisc(struct ifnet *ifp)
4107 {
4108         struct run_softc *sc = ifp->if_softc;
4109
4110         if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
4111                 return;
4112
4113         RUN_LOCK(sc);
4114         run_update_promisc_locked(ifp);
4115         RUN_UNLOCK(sc);
4116 }
4117
4118 static void
4119 run_enable_tsf_sync(struct run_softc *sc)
4120 {
4121         struct ieee80211com *ic = sc->sc_ifp->if_l2com;
4122         struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
4123         uint32_t tmp;
4124
4125         DPRINTF("rvp_id=%d ic_opmode=%d\n", RUN_VAP(vap)->rvp_id, ic->ic_opmode);
4126
4127         run_read(sc, RT2860_BCN_TIME_CFG, &tmp);
4128         tmp &= ~0x1fffff;
4129         tmp |= vap->iv_bss->ni_intval * 16;
4130         tmp |= RT2860_TSF_TIMER_EN | RT2860_TBTT_TIMER_EN;
4131
4132         if (ic->ic_opmode == IEEE80211_M_STA) {
4133                 /*
4134                  * Local TSF is always updated with remote TSF on beacon
4135                  * reception.
4136                  */
4137                 tmp |= 1 << RT2860_TSF_SYNC_MODE_SHIFT;
4138         } else if (ic->ic_opmode == IEEE80211_M_IBSS) {
4139                 tmp |= RT2860_BCN_TX_EN;
4140                 /*
4141                  * Local TSF is updated with remote TSF on beacon reception
4142                  * only if the remote TSF is greater than local TSF.
4143                  */
4144                 tmp |= 2 << RT2860_TSF_SYNC_MODE_SHIFT;
4145         } else if (ic->ic_opmode == IEEE80211_M_HOSTAP ||
4146                     ic->ic_opmode == IEEE80211_M_MBSS) {
4147                 tmp |= RT2860_BCN_TX_EN;
4148                 /* SYNC with nobody */
4149                 tmp |= 3 << RT2860_TSF_SYNC_MODE_SHIFT;
4150         } else {
4151                 DPRINTF("Enabling TSF failed. undefined opmode\n");
4152                 return;
4153         }
4154
4155         run_write(sc, RT2860_BCN_TIME_CFG, tmp);
4156 }
4157
4158 static void
4159 run_enable_mrr(struct run_softc *sc)
4160 {
4161 #define CCK(mcs)        (mcs)
4162 #define OFDM(mcs)       (1 << 3 | (mcs))
4163         run_write(sc, RT2860_LG_FBK_CFG0,
4164             OFDM(6) << 28 |     /* 54->48 */
4165             OFDM(5) << 24 |     /* 48->36 */
4166             OFDM(4) << 20 |     /* 36->24 */
4167             OFDM(3) << 16 |     /* 24->18 */
4168             OFDM(2) << 12 |     /* 18->12 */
4169             OFDM(1) <<  8 |     /* 12-> 9 */
4170             OFDM(0) <<  4 |     /*  9-> 6 */
4171             OFDM(0));           /*  6-> 6 */
4172
4173         run_write(sc, RT2860_LG_FBK_CFG1,
4174             CCK(2) << 12 |      /* 11->5.5 */
4175             CCK(1) <<  8 |      /* 5.5-> 2 */
4176             CCK(0) <<  4 |      /*   2-> 1 */
4177             CCK(0));            /*   1-> 1 */
4178 #undef OFDM
4179 #undef CCK
4180 }
4181
4182 static void
4183 run_set_txpreamble(struct run_softc *sc)
4184 {
4185         struct ieee80211com *ic = sc->sc_ifp->if_l2com;
4186         uint32_t tmp;
4187
4188         run_read(sc, RT2860_AUTO_RSP_CFG, &tmp);
4189         if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
4190                 tmp |= RT2860_CCK_SHORT_EN;
4191         else
4192                 tmp &= ~RT2860_CCK_SHORT_EN;
4193         run_write(sc, RT2860_AUTO_RSP_CFG, tmp);
4194 }
4195
4196 static void
4197 run_set_basicrates(struct run_softc *sc)
4198 {
4199         struct ieee80211com *ic = sc->sc_ifp->if_l2com;
4200
4201         /* set basic rates mask */
4202         if (ic->ic_curmode == IEEE80211_MODE_11B)
4203                 run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x003);
4204         else if (ic->ic_curmode == IEEE80211_MODE_11A)
4205                 run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x150);
4206         else    /* 11g */
4207                 run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x15f);
4208 }
4209
4210 static void
4211 run_set_leds(struct run_softc *sc, uint16_t which)
4212 {
4213         (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LEDS,
4214             which | (sc->leds & 0x7f));
4215 }
4216
4217 static void
4218 run_set_bssid(struct run_softc *sc, const uint8_t *bssid)
4219 {
4220         run_write(sc, RT2860_MAC_BSSID_DW0,
4221             bssid[0] | bssid[1] << 8 | bssid[2] << 16 | bssid[3] << 24);
4222         run_write(sc, RT2860_MAC_BSSID_DW1,
4223             bssid[4] | bssid[5] << 8);
4224 }
4225
4226 static void
4227 run_set_macaddr(struct run_softc *sc, const uint8_t *addr)
4228 {
4229         run_write(sc, RT2860_MAC_ADDR_DW0,
4230             addr[0] | addr[1] << 8 | addr[2] << 16 | addr[3] << 24);
4231         run_write(sc, RT2860_MAC_ADDR_DW1,
4232             addr[4] | addr[5] << 8 | 0xff << 16);
4233 }
4234
4235 static void
4236 run_updateslot(struct ifnet *ifp)
4237 {
4238         struct run_softc *sc = ifp->if_softc;
4239         struct ieee80211com *ic = ifp->if_l2com;
4240         uint32_t i;
4241
4242         i = RUN_CMDQ_GET(&sc->cmdq_store);
4243         DPRINTF("cmdq_store=%d\n", i);
4244         sc->cmdq[i].func = run_updateslot_cb;
4245         sc->cmdq[i].arg0 = ifp;
4246         ieee80211_runtask(ic, &sc->cmdq_task);
4247
4248         return;
4249 }
4250
4251 /* ARGSUSED */
4252 static void
4253 run_updateslot_cb(void *arg)
4254 {
4255         struct ifnet *ifp = arg;
4256         struct run_softc *sc = ifp->if_softc;
4257         struct ieee80211com *ic = ifp->if_l2com;
4258         uint32_t tmp;
4259
4260         run_read(sc, RT2860_BKOFF_SLOT_CFG, &tmp);
4261         tmp &= ~0xff;
4262         tmp |= (ic->ic_flags & IEEE80211_F_SHSLOT) ? 9 : 20;
4263         run_write(sc, RT2860_BKOFF_SLOT_CFG, tmp);
4264 }
4265
4266 static void
4267 run_update_mcast(struct ifnet *ifp)
4268 {
4269         /* h/w filter supports getting everything or nothing */
4270         ifp->if_flags |= IFF_ALLMULTI;
4271 }
4272
4273 static int8_t
4274 run_rssi2dbm(struct run_softc *sc, uint8_t rssi, uint8_t rxchain)
4275 {
4276         struct ieee80211com *ic = sc->sc_ifp->if_l2com;
4277         struct ieee80211_channel *c = ic->ic_curchan;
4278         int delta;
4279
4280         if (IEEE80211_IS_CHAN_5GHZ(c)) {
4281                 uint32_t chan = ieee80211_chan2ieee(ic, c);
4282                 delta = sc->rssi_5ghz[rxchain];
4283
4284                 /* determine channel group */
4285                 if (chan <= 64)
4286                         delta -= sc->lna[1];
4287                 else if (chan <= 128)
4288                         delta -= sc->lna[2];
4289                 else
4290                         delta -= sc->lna[3];
4291         } else
4292                 delta = sc->rssi_2ghz[rxchain] - sc->lna[0];
4293
4294         return (-12 - delta - rssi);
4295 }
4296
4297 static int
4298 run_bbp_init(struct run_softc *sc)
4299 {
4300         int i, error, ntries;
4301         uint8_t bbp0;
4302
4303         /* wait for BBP to wake up */
4304         for (ntries = 0; ntries < 20; ntries++) {
4305                 if ((error = run_bbp_read(sc, 0, &bbp0)) != 0)
4306                         return error;
4307                 if (bbp0 != 0 && bbp0 != 0xff)
4308                         break;
4309         }
4310         if (ntries == 20)
4311                 return (ETIMEDOUT);
4312
4313         /* initialize BBP registers to default values */
4314         for (i = 0; i < nitems(rt2860_def_bbp); i++) {
4315                 run_bbp_write(sc, rt2860_def_bbp[i].reg,
4316                     rt2860_def_bbp[i].val);
4317         }
4318
4319         /* fix BBP84 for RT2860E */
4320         if (sc->mac_ver == 0x2860 && sc->mac_rev != 0x0101)
4321                 run_bbp_write(sc, 84, 0x19);
4322
4323         if (sc->mac_ver >= 0x3070) {
4324                 run_bbp_write(sc, 79, 0x13);
4325                 run_bbp_write(sc, 80, 0x05);
4326                 run_bbp_write(sc, 81, 0x33);
4327         } else if (sc->mac_ver == 0x2860 && sc->mac_rev == 0x0100) {
4328                 run_bbp_write(sc, 69, 0x16);
4329                 run_bbp_write(sc, 73, 0x12);
4330         }
4331         return (0);
4332 }
4333
4334 static int
4335 run_rt3070_rf_init(struct run_softc *sc)
4336 {
4337         uint32_t tmp;
4338         uint8_t rf, target, bbp4;
4339         int i;
4340
4341         run_rt3070_rf_read(sc, 30, &rf);
4342         /* toggle RF R30 bit 7 */
4343         run_rt3070_rf_write(sc, 30, rf | 0x80);
4344         run_delay(sc, 10);
4345         run_rt3070_rf_write(sc, 30, rf & ~0x80);
4346
4347         /* initialize RF registers to default value */
4348         if (sc->mac_ver == 0x3572) {
4349                 for (i = 0; i < nitems(rt3572_def_rf); i++) {
4350                         run_rt3070_rf_write(sc, rt3572_def_rf[i].reg,
4351                             rt3572_def_rf[i].val);
4352                 }
4353         } else {
4354                 for (i = 0; i < nitems(rt3070_def_rf); i++) {
4355                         run_rt3070_rf_write(sc, rt3070_def_rf[i].reg,
4356                             rt3070_def_rf[i].val);
4357                 }
4358         }
4359
4360         if (sc->mac_ver == 0x3070) {
4361                 /* change voltage from 1.2V to 1.35V for RT3070 */
4362                 run_read(sc, RT3070_LDO_CFG0, &tmp);
4363                 tmp = (tmp & ~0x0f000000) | 0x0d000000;
4364                 run_write(sc, RT3070_LDO_CFG0, tmp);
4365
4366         } else if (sc->mac_ver == 0x3071) {
4367                 run_rt3070_rf_read(sc, 6, &rf);
4368                 run_rt3070_rf_write(sc, 6, rf | 0x40);
4369                 run_rt3070_rf_write(sc, 31, 0x14);
4370
4371                 run_read(sc, RT3070_LDO_CFG0, &tmp);
4372                 tmp &= ~0x1f000000;
4373                 if (sc->mac_rev < 0x0211)
4374                         tmp |= 0x0d000000;      /* 1.3V */
4375                 else
4376                         tmp |= 0x01000000;      /* 1.2V */
4377                 run_write(sc, RT3070_LDO_CFG0, tmp);
4378
4379                 /* patch LNA_PE_G1 */
4380                 run_read(sc, RT3070_GPIO_SWITCH, &tmp);
4381                 run_write(sc, RT3070_GPIO_SWITCH, tmp & ~0x20);
4382
4383         } else if (sc->mac_ver == 0x3572) {
4384                 run_rt3070_rf_read(sc, 6, &rf);
4385                 run_rt3070_rf_write(sc, 6, rf | 0x40);
4386
4387                 /* increase voltage from 1.2V to 1.35V */
4388                 run_read(sc, RT3070_LDO_CFG0, &tmp);
4389                 tmp = (tmp & ~0x1f000000) | 0x0d000000;
4390                 run_write(sc, RT3070_LDO_CFG0, tmp);
4391
4392                 if (sc->mac_rev < 0x0211 || !sc->patch_dac) {
4393                         run_delay(sc, 1);       /* wait for 1msec */
4394                         /* decrease voltage back to 1.2V */
4395                         tmp = (tmp & ~0x1f000000) | 0x01000000;
4396                         run_write(sc, RT3070_LDO_CFG0, tmp);
4397                 }
4398         }
4399
4400         /* select 20MHz bandwidth */
4401         run_rt3070_rf_read(sc, 31, &rf);
4402         run_rt3070_rf_write(sc, 31, rf & ~0x20);
4403
4404         /* calibrate filter for 20MHz bandwidth */
4405         sc->rf24_20mhz = 0x1f;  /* default value */
4406         target = (sc->mac_ver < 0x3071) ? 0x16 : 0x13;
4407         run_rt3070_filter_calib(sc, 0x07, target, &sc->rf24_20mhz);
4408
4409         /* select 40MHz bandwidth */
4410         run_bbp_read(sc, 4, &bbp4);
4411         run_bbp_write(sc, 4, (bbp4 & ~0x08) | 0x10);
4412         run_rt3070_rf_read(sc, 31, &rf);
4413         run_rt3070_rf_write(sc, 31, rf | 0x20);
4414
4415         /* calibrate filter for 40MHz bandwidth */
4416         sc->rf24_40mhz = 0x2f;  /* default value */
4417         target = (sc->mac_ver < 0x3071) ? 0x19 : 0x15;
4418         run_rt3070_filter_calib(sc, 0x27, target, &sc->rf24_40mhz);
4419
4420         /* go back to 20MHz bandwidth */
4421         run_bbp_read(sc, 4, &bbp4);
4422         run_bbp_write(sc, 4, bbp4 & ~0x18);
4423
4424         if (sc->mac_ver == 0x3572) {
4425                 /* save default BBP registers 25 and 26 values */
4426                 run_bbp_read(sc, 25, &sc->bbp25);
4427                 run_bbp_read(sc, 26, &sc->bbp26);
4428         } else if (sc->mac_rev < 0x0211)
4429                 run_rt3070_rf_write(sc, 27, 0x03);
4430
4431         run_read(sc, RT3070_OPT_14, &tmp);
4432         run_write(sc, RT3070_OPT_14, tmp | 1);
4433
4434         if (sc->mac_ver == 0x3070 || sc->mac_ver == 0x3071) {
4435                 run_rt3070_rf_read(sc, 17, &rf);
4436                 rf &= ~RT3070_TX_LO1;
4437                 if ((sc->mac_ver == 0x3070 ||
4438                      (sc->mac_ver == 0x3071 && sc->mac_rev >= 0x0211)) &&
4439                     !sc->ext_2ghz_lna)
4440                         rf |= 0x20;     /* fix for long range Rx issue */
4441                 if (sc->txmixgain_2ghz >= 1)
4442                         rf = (rf & ~0x7) | sc->txmixgain_2ghz;
4443                 run_rt3070_rf_write(sc, 17, rf);
4444         }
4445
4446         if (sc->mac_rev == 0x3071) {
4447                 run_rt3070_rf_read(sc, 1, &rf);
4448                 rf &= ~(RT3070_RX0_PD | RT3070_TX0_PD);
4449                 rf |= RT3070_RF_BLOCK | RT3070_RX1_PD | RT3070_TX1_PD;
4450                 run_rt3070_rf_write(sc, 1, rf);
4451
4452                 run_rt3070_rf_read(sc, 15, &rf);
4453                 run_rt3070_rf_write(sc, 15, rf & ~RT3070_TX_LO2);
4454
4455                 run_rt3070_rf_read(sc, 20, &rf);
4456                 run_rt3070_rf_write(sc, 20, rf & ~RT3070_RX_LO1);
4457
4458                 run_rt3070_rf_read(sc, 21, &rf);
4459                 run_rt3070_rf_write(sc, 21, rf & ~RT3070_RX_LO2);
4460         }
4461
4462         if (sc->mac_ver == 0x3070 || sc->mac_ver == 0x3071) {
4463                 /* fix Tx to Rx IQ glitch by raising RF voltage */
4464                 run_rt3070_rf_read(sc, 27, &rf);
4465                 rf &= ~0x77;
4466                 if (sc->mac_rev < 0x0211)
4467                         rf |= 0x03;
4468                 run_rt3070_rf_write(sc, 27, rf);
4469         }
4470         return (0);
4471 }
4472
4473 static int
4474 run_rt3070_filter_calib(struct run_softc *sc, uint8_t init, uint8_t target,
4475     uint8_t *val)
4476 {
4477         uint8_t rf22, rf24;
4478         uint8_t bbp55_pb, bbp55_sb, delta;
4479         int ntries;
4480
4481         /* program filter */
4482         run_rt3070_rf_read(sc, 24, &rf24);
4483         rf24 = (rf24 & 0xc0) | init;    /* initial filter value */
4484         run_rt3070_rf_write(sc, 24, rf24);
4485
4486         /* enable baseband loopback mode */
4487         run_rt3070_rf_read(sc, 22, &rf22);
4488         run_rt3070_rf_write(sc, 22, rf22 | 0x01);
4489
4490         /* set power and frequency of passband test tone */
4491         run_bbp_write(sc, 24, 0x00);
4492         for (ntries = 0; ntries < 100; ntries++) {
4493                 /* transmit test tone */
4494                 run_bbp_write(sc, 25, 0x90);
4495                 run_delay(sc, 10);
4496                 /* read received power */
4497                 run_bbp_read(sc, 55, &bbp55_pb);
4498                 if (bbp55_pb != 0)
4499                         break;
4500         }
4501         if (ntries == 100)
4502                 return ETIMEDOUT;
4503
4504         /* set power and frequency of stopband test tone */
4505         run_bbp_write(sc, 24, 0x06);
4506         for (ntries = 0; ntries < 100; ntries++) {
4507                 /* transmit test tone */
4508                 run_bbp_write(sc, 25, 0x90);
4509                 run_delay(sc, 10);
4510                 /* read received power */
4511                 run_bbp_read(sc, 55, &bbp55_sb);
4512
4513                 delta = bbp55_pb - bbp55_sb;
4514                 if (delta > target)
4515                         break;
4516
4517                 /* reprogram filter */
4518                 rf24++;
4519                 run_rt3070_rf_write(sc, 24, rf24);
4520         }
4521         if (ntries < 100) {
4522                 if (rf24 != init)
4523                         rf24--; /* backtrack */
4524                 *val = rf24;
4525                 run_rt3070_rf_write(sc, 24, rf24);
4526         }
4527
4528         /* restore initial state */
4529         run_bbp_write(sc, 24, 0x00);
4530
4531         /* disable baseband loopback mode */
4532         run_rt3070_rf_read(sc, 22, &rf22);
4533         run_rt3070_rf_write(sc, 22, rf22 & ~0x01);
4534
4535         return (0);
4536 }
4537
4538 static void
4539 run_rt3070_rf_setup(struct run_softc *sc)
4540 {
4541         uint8_t bbp, rf;
4542         int i;
4543
4544         if (sc->mac_ver == 0x3572) {
4545                 /* enable DC filter */
4546                 if (sc->mac_rev >= 0x0201)
4547                         run_bbp_write(sc, 103, 0xc0);
4548
4549                 run_bbp_read(sc, 138, &bbp);
4550                 if (sc->ntxchains == 1)
4551                         bbp |= 0x20;    /* turn off DAC1 */
4552                 if (sc->nrxchains == 1)
4553                         bbp &= ~0x02;   /* turn off ADC1 */
4554                 run_bbp_write(sc, 138, bbp);
4555
4556                 if (sc->mac_rev >= 0x0211) {
4557                         /* improve power consumption */
4558                         run_bbp_read(sc, 31, &bbp);
4559                         run_bbp_write(sc, 31, bbp & ~0x03);
4560                 }
4561
4562                 run_rt3070_rf_read(sc, 16, &rf);
4563                 rf = (rf & ~0x07) | sc->txmixgain_2ghz;
4564                 run_rt3070_rf_write(sc, 16, rf);
4565
4566         } else if (sc->mac_ver == 0x3071) {
4567                 /* enable DC filter */
4568                 if (sc->mac_rev >= 0x0201)
4569                         run_bbp_write(sc, 103, 0xc0);
4570
4571                 run_bbp_read(sc, 138, &bbp);
4572                 if (sc->ntxchains == 1)
4573                         bbp |= 0x20;    /* turn off DAC1 */
4574                 if (sc->nrxchains == 1)
4575                         bbp &= ~0x02;   /* turn off ADC1 */
4576                 run_bbp_write(sc, 138, bbp);
4577
4578                 if (sc->mac_rev >= 0x0211) {
4579                         /* improve power consumption */
4580                         run_bbp_read(sc, 31, &bbp);
4581                         run_bbp_write(sc, 31, bbp & ~0x03);
4582                 }
4583
4584                 run_write(sc, RT2860_TX_SW_CFG1, 0);
4585                 if (sc->mac_rev < 0x0211) {
4586                         run_write(sc, RT2860_TX_SW_CFG2,
4587                             sc->patch_dac ? 0x2c : 0x0f);
4588                 } else
4589                         run_write(sc, RT2860_TX_SW_CFG2, 0);
4590
4591         } else if (sc->mac_ver == 0x3070) {
4592                 if (sc->mac_rev >= 0x0201) {
4593                         /* enable DC filter */
4594                         run_bbp_write(sc, 103, 0xc0);
4595
4596                         /* improve power consumption */
4597                         run_bbp_read(sc, 31, &bbp);
4598                         run_bbp_write(sc, 31, bbp & ~0x03);
4599                 }
4600
4601                 if (sc->mac_rev < 0x0211) {
4602                         run_write(sc, RT2860_TX_SW_CFG1, 0);
4603                         run_write(sc, RT2860_TX_SW_CFG2, 0x2c);
4604                 } else
4605                         run_write(sc, RT2860_TX_SW_CFG2, 0);
4606         }
4607
4608         /* initialize RF registers from ROM for >=RT3071*/
4609         if (sc->mac_ver >= 0x3071) {
4610                 for (i = 0; i < 10; i++) {
4611                         if (sc->rf[i].reg == 0 || sc->rf[i].reg == 0xff)
4612                                 continue;
4613                         run_rt3070_rf_write(sc, sc->rf[i].reg, sc->rf[i].val);
4614                 }
4615         }
4616 }
4617
4618 static int
4619 run_txrx_enable(struct run_softc *sc)
4620 {
4621         struct ieee80211com *ic = sc->sc_ifp->if_l2com;
4622         uint32_t tmp;
4623         int error, ntries;
4624
4625         run_write(sc, RT2860_MAC_SYS_CTRL, RT2860_MAC_TX_EN);
4626         for (ntries = 0; ntries < 200; ntries++) {
4627                 if ((error = run_read(sc, RT2860_WPDMA_GLO_CFG, &tmp)) != 0)
4628                         return error;
4629                 if ((tmp & (RT2860_TX_DMA_BUSY | RT2860_RX_DMA_BUSY)) == 0)
4630                         break;
4631                 run_delay(sc, 50);
4632         }
4633         if (ntries == 200)
4634                 return ETIMEDOUT;
4635
4636         run_delay(sc, 50);
4637
4638         tmp |= RT2860_RX_DMA_EN | RT2860_TX_DMA_EN | RT2860_TX_WB_DDONE;
4639         run_write(sc, RT2860_WPDMA_GLO_CFG, tmp);
4640
4641         /* enable Rx bulk aggregation (set timeout and limit) */
4642         tmp = RT2860_USB_TX_EN | RT2860_USB_RX_EN | RT2860_USB_RX_AGG_EN |
4643             RT2860_USB_RX_AGG_TO(128) | RT2860_USB_RX_AGG_LMT(2);
4644         run_write(sc, RT2860_USB_DMA_CFG, tmp);
4645
4646         /* set Rx filter */
4647         tmp = RT2860_DROP_CRC_ERR | RT2860_DROP_PHY_ERR;
4648         if (ic->ic_opmode != IEEE80211_M_MONITOR) {
4649                 tmp |= RT2860_DROP_UC_NOME | RT2860_DROP_DUPL |
4650                     RT2860_DROP_CTS | RT2860_DROP_BA | RT2860_DROP_ACK |
4651                     RT2860_DROP_VER_ERR | RT2860_DROP_CTRL_RSV |
4652                     RT2860_DROP_CFACK | RT2860_DROP_CFEND;
4653                 if (ic->ic_opmode == IEEE80211_M_STA)
4654                         tmp |= RT2860_DROP_RTS | RT2860_DROP_PSPOLL;
4655         }
4656         run_write(sc, RT2860_RX_FILTR_CFG, tmp);
4657
4658         run_write(sc, RT2860_MAC_SYS_CTRL,
4659             RT2860_MAC_RX_EN | RT2860_MAC_TX_EN);
4660
4661         return (0);
4662 }
4663
4664 static void
4665 run_init_locked(struct run_softc *sc)
4666 {
4667         struct ifnet *ifp = sc->sc_ifp;
4668         struct ieee80211com *ic = ifp->if_l2com;
4669         uint32_t tmp;
4670         uint8_t bbp1, bbp3;
4671         int i;
4672         int ridx;
4673         int ntries;
4674
4675         if (ic->ic_nrunning > 1)
4676                 return;
4677
4678         run_stop(sc);
4679
4680         for (ntries = 0; ntries < 100; ntries++) {
4681                 if (run_read(sc, RT2860_ASIC_VER_ID, &tmp) != 0)
4682                         goto fail;
4683                 if (tmp != 0 && tmp != 0xffffffff)
4684                         break;
4685                 run_delay(sc, 10);
4686         }
4687         if (ntries == 100)
4688                 goto fail;
4689
4690         for (i = 0; i != RUN_EP_QUEUES; i++)
4691                 run_setup_tx_list(sc, &sc->sc_epq[i]);
4692
4693         run_set_macaddr(sc, IF_LLADDR(ifp));
4694
4695         for (ntries = 0; ntries < 100; ntries++) {
4696                 if (run_read(sc, RT2860_WPDMA_GLO_CFG, &tmp) != 0)
4697                         goto fail;
4698                 if ((tmp & (RT2860_TX_DMA_BUSY | RT2860_RX_DMA_BUSY)) == 0)
4699                         break;
4700                 run_delay(sc, 10);
4701         }
4702         if (ntries == 100) {
4703                 device_printf(sc->sc_dev, "timeout waiting for DMA engine\n");
4704                 goto fail;
4705         }
4706         tmp &= 0xff0;
4707         tmp |= RT2860_TX_WB_DDONE;
4708         run_write(sc, RT2860_WPDMA_GLO_CFG, tmp);
4709
4710         /* turn off PME_OEN to solve high-current issue */
4711         run_read(sc, RT2860_SYS_CTRL, &tmp);
4712         run_write(sc, RT2860_SYS_CTRL, tmp & ~RT2860_PME_OEN);
4713
4714         run_write(sc, RT2860_MAC_SYS_CTRL,
4715             RT2860_BBP_HRST | RT2860_MAC_SRST);
4716         run_write(sc, RT2860_USB_DMA_CFG, 0);
4717
4718         if (run_reset(sc) != 0) {
4719                 device_printf(sc->sc_dev, "could not reset chipset\n");
4720                 goto fail;
4721         }
4722
4723         run_write(sc, RT2860_MAC_SYS_CTRL, 0);
4724
4725         /* init Tx power for all Tx rates (from EEPROM) */
4726         for (ridx = 0; ridx < 5; ridx++) {
4727                 if (sc->txpow20mhz[ridx] == 0xffffffff)
4728                         continue;
4729                 run_write(sc, RT2860_TX_PWR_CFG(ridx), sc->txpow20mhz[ridx]);
4730         }
4731
4732         for (i = 0; i < nitems(rt2870_def_mac); i++)
4733                 run_write(sc, rt2870_def_mac[i].reg, rt2870_def_mac[i].val);
4734         run_write(sc, RT2860_WMM_AIFSN_CFG, 0x00002273);
4735         run_write(sc, RT2860_WMM_CWMIN_CFG, 0x00002344);
4736         run_write(sc, RT2860_WMM_CWMAX_CFG, 0x000034aa);
4737
4738         if (sc->mac_ver >= 0x3070) {
4739                 /* set delay of PA_PE assertion to 1us (unit of 0.25us) */
4740                 run_write(sc, RT2860_TX_SW_CFG0,
4741                     4 << RT2860_DLY_PAPE_EN_SHIFT);
4742         }
4743
4744         /* wait while MAC is busy */
4745         for (ntries = 0; ntries < 100; ntries++) {
4746                 if (run_read(sc, RT2860_MAC_STATUS_REG, &tmp) != 0)
4747                         goto fail;
4748                 if (!(tmp & (RT2860_RX_STATUS_BUSY | RT2860_TX_STATUS_BUSY)))
4749                         break;
4750                 run_delay(sc, 10);
4751         }
4752         if (ntries == 100)
4753                 goto fail;
4754
4755         /* clear Host to MCU mailbox */
4756         run_write(sc, RT2860_H2M_BBPAGENT, 0);
4757         run_write(sc, RT2860_H2M_MAILBOX, 0);
4758         run_delay(sc, 10);
4759
4760         if (run_bbp_init(sc) != 0) {
4761                 device_printf(sc->sc_dev, "could not initialize BBP\n");
4762                 goto fail;
4763         }
4764
4765         /* abort TSF synchronization */
4766         run_read(sc, RT2860_BCN_TIME_CFG, &tmp);
4767         tmp &= ~(RT2860_BCN_TX_EN | RT2860_TSF_TIMER_EN |
4768             RT2860_TBTT_TIMER_EN);
4769         run_write(sc, RT2860_BCN_TIME_CFG, tmp);
4770
4771         /* clear RX WCID search table */
4772         run_set_region_4(sc, RT2860_WCID_ENTRY(0), 0, 512);
4773         /* clear WCID attribute table */
4774         run_set_region_4(sc, RT2860_WCID_ATTR(0), 0, 8 * 32);
4775
4776         /* hostapd sets a key before init. So, don't clear it. */
4777         if (sc->cmdq_key_set != RUN_CMDQ_GO) {
4778                 /* clear shared key table */
4779                 run_set_region_4(sc, RT2860_SKEY(0, 0), 0, 8 * 32);
4780                 /* clear shared key mode */
4781                 run_set_region_4(sc, RT2860_SKEY_MODE_0_7, 0, 4);
4782         }
4783
4784         run_read(sc, RT2860_US_CYC_CNT, &tmp);
4785         tmp = (tmp & ~0xff) | 0x1e;
4786         run_write(sc, RT2860_US_CYC_CNT, tmp);
4787
4788         if (sc->mac_rev != 0x0101)
4789                 run_write(sc, RT2860_TXOP_CTRL_CFG, 0x0000583f);
4790
4791         run_write(sc, RT2860_WMM_TXOP0_CFG, 0);
4792         run_write(sc, RT2860_WMM_TXOP1_CFG, 48 << 16 | 96);
4793
4794         /* write vendor-specific BBP values (from EEPROM) */
4795         for (i = 0; i < 10; i++) {
4796                 if (sc->bbp[i].reg == 0 || sc->bbp[i].reg == 0xff)
4797                         continue;
4798                 run_bbp_write(sc, sc->bbp[i].reg, sc->bbp[i].val);
4799         }
4800
4801         /* select Main antenna for 1T1R devices */
4802         if (sc->rf_rev == RT3070_RF_3020)
4803                 run_set_rx_antenna(sc, 0);
4804
4805         /* send LEDs operating mode to microcontroller */
4806         (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED1, sc->led[0]);
4807         (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED2, sc->led[1]);
4808         (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED3, sc->led[2]);
4809
4810         if (sc->mac_ver >= 0x3070)
4811                 run_rt3070_rf_init(sc);
4812
4813         /* disable non-existing Rx chains */
4814         run_bbp_read(sc, 3, &bbp3);
4815         bbp3 &= ~(1 << 3 | 1 << 4);
4816         if (sc->nrxchains == 2)
4817                 bbp3 |= 1 << 3;
4818         else if (sc->nrxchains == 3)
4819                 bbp3 |= 1 << 4;
4820         run_bbp_write(sc, 3, bbp3);
4821
4822         /* disable non-existing Tx chains */
4823         run_bbp_read(sc, 1, &bbp1);
4824         if (sc->ntxchains == 1)
4825                 bbp1 &= ~(1 << 3 | 1 << 4);
4826         run_bbp_write(sc, 1, bbp1);
4827
4828         if (sc->mac_ver >= 0x3070)
4829                 run_rt3070_rf_setup(sc);
4830
4831         /* select default channel */
4832         run_set_chan(sc, ic->ic_curchan);
4833
4834         /* setup initial protection mode */
4835         run_updateprot_cb(ic);
4836
4837         /* turn radio LED on */
4838         run_set_leds(sc, RT2860_LED_RADIO);
4839
4840         ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
4841         ifp->if_drv_flags |= IFF_DRV_RUNNING;
4842         sc->cmdq_run = RUN_CMDQ_GO;
4843
4844         for (i = 0; i != RUN_N_XFER; i++)
4845                 usbd_xfer_set_stall(sc->sc_xfer[i]);
4846
4847         usbd_transfer_start(sc->sc_xfer[RUN_BULK_RX]);
4848
4849         if (run_txrx_enable(sc) != 0)
4850                 goto fail;
4851
4852         return;
4853
4854 fail:
4855         run_stop(sc);
4856 }
4857
4858 static void
4859 run_init(void *arg)
4860 {
4861         struct run_softc *sc = arg;
4862         struct ifnet *ifp = sc->sc_ifp;
4863         struct ieee80211com *ic = ifp->if_l2com;
4864
4865         RUN_LOCK(sc);
4866         run_init_locked(sc);
4867         RUN_UNLOCK(sc);
4868
4869         if (ifp->if_drv_flags & IFF_DRV_RUNNING)
4870                 ieee80211_start_all(ic);
4871 }
4872
4873 static void
4874 run_stop(void *arg)
4875 {
4876         struct run_softc *sc = (struct run_softc *)arg;
4877         struct ifnet *ifp = sc->sc_ifp;
4878         uint32_t tmp;
4879         int i;
4880         int ntries;
4881
4882         RUN_LOCK_ASSERT(sc, MA_OWNED);
4883
4884         if (ifp->if_drv_flags & IFF_DRV_RUNNING)
4885                 run_set_leds(sc, 0);    /* turn all LEDs off */
4886
4887         ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
4888
4889         sc->ratectl_run = RUN_RATECTL_OFF;
4890         sc->cmdq_run = sc->cmdq_key_set;
4891
4892         RUN_UNLOCK(sc);
4893
4894         for(i = 0; i < RUN_N_XFER; i++)
4895                 usbd_transfer_drain(sc->sc_xfer[i]);
4896
4897         RUN_LOCK(sc);
4898
4899         if (sc->rx_m != NULL) {
4900                 m_free(sc->rx_m);
4901                 sc->rx_m = NULL;
4902         }
4903
4904         /* disable Tx/Rx */
4905         run_read(sc, RT2860_MAC_SYS_CTRL, &tmp);
4906         tmp &= ~(RT2860_MAC_RX_EN | RT2860_MAC_TX_EN);
4907         run_write(sc, RT2860_MAC_SYS_CTRL, tmp);
4908
4909         /* wait for pending Tx to complete */
4910         for (ntries = 0; ntries < 100; ntries++) {
4911                 if (run_read(sc, RT2860_TXRXQ_PCNT, &tmp) != 0) {
4912                         DPRINTF("Cannot read Tx queue count\n");
4913                         break;
4914                 }
4915                 if ((tmp & RT2860_TX2Q_PCNT_MASK) == 0) {
4916                         DPRINTF("All Tx cleared\n");
4917                         break;
4918                 }
4919                 run_delay(sc, 10);
4920         }
4921         if (ntries >= 100)
4922                 DPRINTF("There are still pending Tx\n");
4923         run_delay(sc, 10);
4924         run_write(sc, RT2860_USB_DMA_CFG, 0);
4925
4926         run_write(sc, RT2860_MAC_SYS_CTRL, RT2860_BBP_HRST | RT2860_MAC_SRST);
4927         run_write(sc, RT2860_MAC_SYS_CTRL, 0);
4928
4929         for (i = 0; i != RUN_EP_QUEUES; i++)
4930                 run_unsetup_tx_list(sc, &sc->sc_epq[i]);
4931
4932         return;
4933 }
4934
4935 static void
4936 run_delay(struct run_softc *sc, unsigned int ms)
4937 {
4938         usb_pause_mtx(mtx_owned(&sc->sc_mtx) ? 
4939             &sc->sc_mtx : NULL, USB_MS_TO_TICKS(ms));
4940 }
4941
4942 static device_method_t run_methods[] = {
4943         /* Device interface */
4944         DEVMETHOD(device_probe,         run_match),
4945         DEVMETHOD(device_attach,        run_attach),
4946         DEVMETHOD(device_detach,        run_detach),
4947
4948         { 0, 0 }
4949 };
4950
4951 static driver_t run_driver = {
4952         "run",
4953         run_methods,
4954         sizeof(struct run_softc)
4955 };
4956
4957 static devclass_t run_devclass;
4958
4959 DRIVER_MODULE(run, uhub, run_driver, run_devclass, NULL, 0);
4960 MODULE_DEPEND(run, wlan, 1, 1, 1);
4961 MODULE_DEPEND(run, usb, 1, 1, 1);
4962 MODULE_DEPEND(run, firmware, 1, 1, 1);
4963 MODULE_VERSION(run, 1);