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