if_urtwn.c revision 300433
1133359Sobrien/*	$OpenBSD: if_urtwn.c,v 1.16 2011/02/10 17:26:40 jakemsr Exp $	*/
2133359Sobrien
3330569Sgordon/*-
4133359Sobrien * Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr>
5133359Sobrien * Copyright (c) 2014 Kevin Lo <kevlo@FreeBSD.org>
6330569Sgordon * Copyright (c) 2015 Andriy Voskoboinyk <avos@FreeBSD.org>
7133359Sobrien *
8133359Sobrien * Permission to use, copy, modify, and distribute this software for any
9133359Sobrien * purpose with or without fee is hereby granted, provided that the above
10133359Sobrien * copyright notice and this permission notice appear in all copies.
11133359Sobrien *
12133359Sobrien * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13267843Sdelphij * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14133359Sobrien * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15133359Sobrien * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16133359Sobrien * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17169942Sobrien * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18133359Sobrien * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19133359Sobrien */
20133359Sobrien
21267843Sdelphij#include <sys/cdefs.h>
22267843Sdelphij__FBSDID("$FreeBSD: head/sys/dev/urtwn/if_urtwn.c 300433 2016-05-22 19:43:40Z avos $");
23267843Sdelphij
24267843Sdelphij/*
25226048Sobrien * Driver for Realtek RTL8188CE-VAU/RTL8188CUS/RTL8188EU/RTL8188RU/RTL8192CU.
26226048Sobrien */
27191736Sobrien
28191736Sobrien#include "opt_wlan.h"
29191736Sobrien#include "opt_urtwn.h"
30191736Sobrien
31191736Sobrien#include <sys/param.h>
32191736Sobrien#include <sys/sockio.h>
33191736Sobrien#include <sys/sysctl.h>
34267843Sdelphij#include <sys/lock.h>
35267843Sdelphij#include <sys/mutex.h>
36#include <sys/condvar.h>
37#include <sys/mbuf.h>
38#include <sys/kernel.h>
39#include <sys/socket.h>
40#include <sys/systm.h>
41#include <sys/malloc.h>
42#include <sys/module.h>
43#include <sys/bus.h>
44#include <sys/endian.h>
45#include <sys/linker.h>
46#include <sys/firmware.h>
47#include <sys/kdb.h>
48
49#include <machine/bus.h>
50#include <machine/resource.h>
51#include <sys/rman.h>
52
53#include <net/bpf.h>
54#include <net/if.h>
55#include <net/if_var.h>
56#include <net/if_arp.h>
57#include <net/ethernet.h>
58#include <net/if_dl.h>
59#include <net/if_media.h>
60#include <net/if_types.h>
61
62#include <netinet/in.h>
63#include <netinet/in_systm.h>
64#include <netinet/in_var.h>
65#include <netinet/if_ether.h>
66#include <netinet/ip.h>
67
68#include <net80211/ieee80211_var.h>
69#include <net80211/ieee80211_regdomain.h>
70#include <net80211/ieee80211_radiotap.h>
71#include <net80211/ieee80211_ratectl.h>
72#ifdef	IEEE80211_SUPPORT_SUPERG
73#include <net80211/ieee80211_superg.h>
74#endif
75
76#include <dev/usb/usb.h>
77#include <dev/usb/usbdi.h>
78#include <dev/usb/usb_device.h>
79#include "usbdevs.h"
80
81#include <dev/usb/usb_debug.h>
82
83#include <dev/urtwn/if_urtwnreg.h>
84#include <dev/urtwn/if_urtwnvar.h>
85
86#ifdef USB_DEBUG
87enum {
88	URTWN_DEBUG_XMIT	= 0x00000001,	/* basic xmit operation */
89	URTWN_DEBUG_RECV	= 0x00000002,	/* basic recv operation */
90	URTWN_DEBUG_STATE	= 0x00000004,	/* 802.11 state transitions */
91	URTWN_DEBUG_RA		= 0x00000008,	/* f/w rate adaptation setup */
92	URTWN_DEBUG_USB		= 0x00000010,	/* usb requests */
93	URTWN_DEBUG_FIRMWARE	= 0x00000020,	/* firmware(9) loading debug */
94	URTWN_DEBUG_BEACON	= 0x00000040,	/* beacon handling */
95	URTWN_DEBUG_INTR	= 0x00000080,	/* ISR */
96	URTWN_DEBUG_TEMP	= 0x00000100,	/* temperature calibration */
97	URTWN_DEBUG_ROM		= 0x00000200,	/* various ROM info */
98	URTWN_DEBUG_KEY		= 0x00000400,	/* crypto keys management */
99	URTWN_DEBUG_TXPWR	= 0x00000800,	/* dump Tx power values */
100	URTWN_DEBUG_RSSI	= 0x00001000,	/* dump RSSI lookups */
101	URTWN_DEBUG_ANY		= 0xffffffff
102};
103
104#define URTWN_DPRINTF(_sc, _m, ...) do {			\
105	if ((_sc)->sc_debug & (_m))				\
106		device_printf((_sc)->sc_dev, __VA_ARGS__);	\
107} while(0)
108
109#else
110#define URTWN_DPRINTF(_sc, _m, ...)	do { (void) sc; } while (0)
111#endif
112
113#define	IEEE80211_HAS_ADDR4(wh)	IEEE80211_IS_DSTODS(wh)
114
115static int urtwn_enable_11n = 1;
116TUNABLE_INT("hw.usb.urtwn.enable_11n", &urtwn_enable_11n);
117
118/* various supported device vendors/products */
119static const STRUCT_USB_HOST_ID urtwn_devs[] = {
120#define URTWN_DEV(v,p)  { USB_VP(USB_VENDOR_##v, USB_PRODUCT_##v##_##p) }
121#define	URTWN_RTL8188E_DEV(v,p)	\
122	{ USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, URTWN_RTL8188E) }
123#define URTWN_RTL8188E  1
124	URTWN_DEV(ABOCOM,	RTL8188CU_1),
125	URTWN_DEV(ABOCOM,	RTL8188CU_2),
126	URTWN_DEV(ABOCOM,	RTL8192CU),
127	URTWN_DEV(ASUS,		RTL8192CU),
128	URTWN_DEV(ASUS,		USBN10NANO),
129	URTWN_DEV(AZUREWAVE,	RTL8188CE_1),
130	URTWN_DEV(AZUREWAVE,	RTL8188CE_2),
131	URTWN_DEV(AZUREWAVE,	RTL8188CU),
132	URTWN_DEV(BELKIN,	F7D2102),
133	URTWN_DEV(BELKIN,	RTL8188CU),
134	URTWN_DEV(BELKIN,	RTL8192CU),
135	URTWN_DEV(CHICONY,	RTL8188CUS_1),
136	URTWN_DEV(CHICONY,	RTL8188CUS_2),
137	URTWN_DEV(CHICONY,	RTL8188CUS_3),
138	URTWN_DEV(CHICONY,	RTL8188CUS_4),
139	URTWN_DEV(CHICONY,	RTL8188CUS_5),
140	URTWN_DEV(COREGA,	RTL8192CU),
141	URTWN_DEV(DLINK,	RTL8188CU),
142	URTWN_DEV(DLINK,	RTL8192CU_1),
143	URTWN_DEV(DLINK,	RTL8192CU_2),
144	URTWN_DEV(DLINK,	RTL8192CU_3),
145	URTWN_DEV(DLINK,	DWA131B),
146	URTWN_DEV(EDIMAX,	EW7811UN),
147	URTWN_DEV(EDIMAX,	RTL8192CU),
148	URTWN_DEV(FEIXUN,	RTL8188CU),
149	URTWN_DEV(FEIXUN,	RTL8192CU),
150	URTWN_DEV(GUILLEMOT,	HWNUP150),
151	URTWN_DEV(HAWKING,	RTL8192CU),
152	URTWN_DEV(HP3,		RTL8188CU),
153	URTWN_DEV(NETGEAR,	WNA1000M),
154	URTWN_DEV(NETGEAR,	RTL8192CU),
155	URTWN_DEV(NETGEAR4,	RTL8188CU),
156	URTWN_DEV(NOVATECH,	RTL8188CU),
157	URTWN_DEV(PLANEX2,	RTL8188CU_1),
158	URTWN_DEV(PLANEX2,	RTL8188CU_2),
159	URTWN_DEV(PLANEX2,	RTL8188CU_3),
160	URTWN_DEV(PLANEX2,	RTL8188CU_4),
161	URTWN_DEV(PLANEX2,	RTL8188CUS),
162	URTWN_DEV(PLANEX2,	RTL8192CU),
163	URTWN_DEV(REALTEK,	RTL8188CE_0),
164	URTWN_DEV(REALTEK,	RTL8188CE_1),
165	URTWN_DEV(REALTEK,	RTL8188CTV),
166	URTWN_DEV(REALTEK,	RTL8188CU_0),
167	URTWN_DEV(REALTEK,	RTL8188CU_1),
168	URTWN_DEV(REALTEK,	RTL8188CU_2),
169	URTWN_DEV(REALTEK,	RTL8188CU_3),
170	URTWN_DEV(REALTEK,	RTL8188CU_COMBO),
171	URTWN_DEV(REALTEK,	RTL8188CUS),
172	URTWN_DEV(REALTEK,	RTL8188RU_1),
173	URTWN_DEV(REALTEK,	RTL8188RU_2),
174	URTWN_DEV(REALTEK,	RTL8188RU_3),
175	URTWN_DEV(REALTEK,	RTL8191CU),
176	URTWN_DEV(REALTEK,	RTL8192CE),
177	URTWN_DEV(REALTEK,	RTL8192CU),
178	URTWN_DEV(SITECOMEU,	RTL8188CU_1),
179	URTWN_DEV(SITECOMEU,	RTL8188CU_2),
180	URTWN_DEV(SITECOMEU,	RTL8192CU),
181	URTWN_DEV(TRENDNET,	RTL8188CU),
182	URTWN_DEV(TRENDNET,	RTL8192CU),
183	URTWN_DEV(ZYXEL,	RTL8192CU),
184	/* URTWN_RTL8188E */
185	URTWN_RTL8188E_DEV(ABOCOM,	RTL8188EU),
186	URTWN_RTL8188E_DEV(DLINK,	DWA123D1),
187	URTWN_RTL8188E_DEV(DLINK,	DWA125D1),
188	URTWN_RTL8188E_DEV(ELECOM,	WDC150SU2M),
189	URTWN_RTL8188E_DEV(REALTEK,	RTL8188ETV),
190	URTWN_RTL8188E_DEV(REALTEK,	RTL8188EU),
191#undef URTWN_RTL8188E_DEV
192#undef URTWN_DEV
193};
194
195static device_probe_t	urtwn_match;
196static device_attach_t	urtwn_attach;
197static device_detach_t	urtwn_detach;
198
199static usb_callback_t   urtwn_bulk_tx_callback;
200static usb_callback_t	urtwn_bulk_rx_callback;
201
202static void		urtwn_sysctlattach(struct urtwn_softc *);
203static void		urtwn_drain_mbufq(struct urtwn_softc *);
204static usb_error_t	urtwn_do_request(struct urtwn_softc *,
205			    struct usb_device_request *, void *);
206static struct ieee80211vap *urtwn_vap_create(struct ieee80211com *,
207		    const char [IFNAMSIZ], int, enum ieee80211_opmode, int,
208                    const uint8_t [IEEE80211_ADDR_LEN],
209                    const uint8_t [IEEE80211_ADDR_LEN]);
210static void		urtwn_vap_delete(struct ieee80211vap *);
211static struct mbuf *	urtwn_rx_copy_to_mbuf(struct urtwn_softc *,
212			    struct r92c_rx_stat *, int);
213static struct mbuf *	urtwn_report_intr(struct usb_xfer *,
214			    struct urtwn_data *);
215static struct mbuf *	urtwn_rxeof(struct urtwn_softc *, uint8_t *, int);
216static void		urtwn_r88e_ratectl_tx_complete(struct urtwn_softc *,
217			    void *);
218static struct ieee80211_node *urtwn_rx_frame(struct urtwn_softc *,
219			    struct mbuf *, int8_t *);
220static void		urtwn_txeof(struct urtwn_softc *, struct urtwn_data *,
221			    int);
222static int		urtwn_alloc_list(struct urtwn_softc *,
223			    struct urtwn_data[], int, int);
224static int		urtwn_alloc_rx_list(struct urtwn_softc *);
225static int		urtwn_alloc_tx_list(struct urtwn_softc *);
226static void		urtwn_free_list(struct urtwn_softc *,
227			    struct urtwn_data data[], int);
228static void		urtwn_free_rx_list(struct urtwn_softc *);
229static void		urtwn_free_tx_list(struct urtwn_softc *);
230static struct urtwn_data *	_urtwn_getbuf(struct urtwn_softc *);
231static struct urtwn_data *	urtwn_getbuf(struct urtwn_softc *);
232static usb_error_t	urtwn_write_region_1(struct urtwn_softc *, uint16_t,
233			    uint8_t *, int);
234static usb_error_t	urtwn_write_1(struct urtwn_softc *, uint16_t, uint8_t);
235static usb_error_t	urtwn_write_2(struct urtwn_softc *, uint16_t, uint16_t);
236static usb_error_t	urtwn_write_4(struct urtwn_softc *, uint16_t, uint32_t);
237static usb_error_t	urtwn_read_region_1(struct urtwn_softc *, uint16_t,
238			    uint8_t *, int);
239static uint8_t		urtwn_read_1(struct urtwn_softc *, uint16_t);
240static uint16_t		urtwn_read_2(struct urtwn_softc *, uint16_t);
241static uint32_t		urtwn_read_4(struct urtwn_softc *, uint16_t);
242static int		urtwn_fw_cmd(struct urtwn_softc *, uint8_t,
243			    const void *, int);
244static void		urtwn_cmdq_cb(void *, int);
245static int		urtwn_cmd_sleepable(struct urtwn_softc *, const void *,
246			    size_t, CMD_FUNC_PROTO);
247static void		urtwn_r92c_rf_write(struct urtwn_softc *, int,
248			    uint8_t, uint32_t);
249static void		urtwn_r88e_rf_write(struct urtwn_softc *, int,
250			    uint8_t, uint32_t);
251static uint32_t		urtwn_rf_read(struct urtwn_softc *, int, uint8_t);
252static int		urtwn_llt_write(struct urtwn_softc *, uint32_t,
253			    uint32_t);
254static int		urtwn_efuse_read_next(struct urtwn_softc *, uint8_t *);
255static int		urtwn_efuse_read_data(struct urtwn_softc *, uint8_t *,
256			    uint8_t, uint8_t);
257#ifdef USB_DEBUG
258static void		urtwn_dump_rom_contents(struct urtwn_softc *,
259			    uint8_t *, uint16_t);
260#endif
261static int		urtwn_efuse_read(struct urtwn_softc *, uint8_t *,
262			    uint16_t);
263static int		urtwn_efuse_switch_power(struct urtwn_softc *);
264static int		urtwn_read_chipid(struct urtwn_softc *);
265static int		urtwn_read_rom(struct urtwn_softc *);
266static int		urtwn_r88e_read_rom(struct urtwn_softc *);
267static int		urtwn_ra_init(struct urtwn_softc *);
268static void		urtwn_init_beacon(struct urtwn_softc *,
269			    struct urtwn_vap *);
270static int		urtwn_setup_beacon(struct urtwn_softc *,
271			    struct ieee80211_node *);
272static void		urtwn_update_beacon(struct ieee80211vap *, int);
273static int		urtwn_tx_beacon(struct urtwn_softc *sc,
274			    struct urtwn_vap *);
275static int		urtwn_key_alloc(struct ieee80211vap *,
276			    struct ieee80211_key *, ieee80211_keyix *,
277			    ieee80211_keyix *);
278static void		urtwn_key_set_cb(struct urtwn_softc *,
279			    union sec_param *);
280static void		urtwn_key_del_cb(struct urtwn_softc *,
281			    union sec_param *);
282static int		urtwn_key_set(struct ieee80211vap *,
283			    const struct ieee80211_key *);
284static int		urtwn_key_delete(struct ieee80211vap *,
285			    const struct ieee80211_key *);
286static void		urtwn_tsf_task_adhoc(void *, int);
287static void		urtwn_tsf_sync_enable(struct urtwn_softc *,
288			    struct ieee80211vap *);
289static void		urtwn_get_tsf(struct urtwn_softc *, uint64_t *);
290static void		urtwn_set_led(struct urtwn_softc *, int, int);
291static void		urtwn_set_mode(struct urtwn_softc *, uint8_t);
292static void		urtwn_ibss_recv_mgmt(struct ieee80211_node *,
293			    struct mbuf *, int,
294			    const struct ieee80211_rx_stats *, int, int);
295static int		urtwn_newstate(struct ieee80211vap *,
296			    enum ieee80211_state, int);
297static void		urtwn_calib_to(void *);
298static void		urtwn_calib_cb(struct urtwn_softc *,
299			    union sec_param *);
300static void		urtwn_watchdog(void *);
301static void		urtwn_update_avgrssi(struct urtwn_softc *, int, int8_t);
302static int8_t		urtwn_get_rssi(struct urtwn_softc *, int, void *);
303static int8_t		urtwn_r88e_get_rssi(struct urtwn_softc *, int, void *);
304static int		urtwn_tx_data(struct urtwn_softc *,
305			    struct ieee80211_node *, struct mbuf *,
306			    struct urtwn_data *);
307static int		urtwn_tx_raw(struct urtwn_softc *,
308			    struct ieee80211_node *, struct mbuf *,
309			    struct urtwn_data *,
310			    const struct ieee80211_bpf_params *);
311static void		urtwn_tx_start(struct urtwn_softc *, struct mbuf *,
312			    uint8_t, struct urtwn_data *);
313static int		urtwn_transmit(struct ieee80211com *, struct mbuf *);
314static void		urtwn_start(struct urtwn_softc *);
315static void		urtwn_parent(struct ieee80211com *);
316static int		urtwn_r92c_power_on(struct urtwn_softc *);
317static int		urtwn_r88e_power_on(struct urtwn_softc *);
318static void		urtwn_r92c_power_off(struct urtwn_softc *);
319static void		urtwn_r88e_power_off(struct urtwn_softc *);
320static int		urtwn_llt_init(struct urtwn_softc *);
321#ifndef URTWN_WITHOUT_UCODE
322static void		urtwn_fw_reset(struct urtwn_softc *);
323static void		urtwn_r88e_fw_reset(struct urtwn_softc *);
324static int		urtwn_fw_loadpage(struct urtwn_softc *, int,
325			    const uint8_t *, int);
326static int		urtwn_load_firmware(struct urtwn_softc *);
327#endif
328static int		urtwn_dma_init(struct urtwn_softc *);
329static int		urtwn_mac_init(struct urtwn_softc *);
330static void		urtwn_bb_init(struct urtwn_softc *);
331static void		urtwn_rf_init(struct urtwn_softc *);
332static void		urtwn_cam_init(struct urtwn_softc *);
333static int		urtwn_cam_write(struct urtwn_softc *, uint32_t,
334			    uint32_t);
335static void		urtwn_pa_bias_init(struct urtwn_softc *);
336static void		urtwn_rxfilter_init(struct urtwn_softc *);
337static void		urtwn_edca_init(struct urtwn_softc *);
338static void		urtwn_write_txpower(struct urtwn_softc *, int,
339			    uint16_t[]);
340static void		urtwn_get_txpower(struct urtwn_softc *, int,
341		      	    struct ieee80211_channel *,
342			    struct ieee80211_channel *, uint16_t[]);
343static void		urtwn_r88e_get_txpower(struct urtwn_softc *, int,
344		      	    struct ieee80211_channel *,
345			    struct ieee80211_channel *, uint16_t[]);
346static void		urtwn_set_txpower(struct urtwn_softc *,
347		    	    struct ieee80211_channel *,
348			    struct ieee80211_channel *);
349static void		urtwn_set_rx_bssid_all(struct urtwn_softc *, int);
350static void		urtwn_set_gain(struct urtwn_softc *, uint8_t);
351static void		urtwn_scan_start(struct ieee80211com *);
352static void		urtwn_scan_end(struct ieee80211com *);
353static void		urtwn_set_channel(struct ieee80211com *);
354static int		urtwn_wme_update(struct ieee80211com *);
355static void		urtwn_update_slot(struct ieee80211com *);
356static void		urtwn_update_slot_cb(struct urtwn_softc *,
357			    union sec_param *);
358static void		urtwn_update_aifs(struct urtwn_softc *, uint8_t);
359static uint8_t		urtwn_get_multi_pos(const uint8_t[]);
360static void		urtwn_set_multi(struct urtwn_softc *);
361static void		urtwn_set_promisc(struct urtwn_softc *);
362static void		urtwn_update_promisc(struct ieee80211com *);
363static void		urtwn_update_mcast(struct ieee80211com *);
364static struct ieee80211_node *urtwn_node_alloc(struct ieee80211vap *,
365			    const uint8_t mac[IEEE80211_ADDR_LEN]);
366static void		urtwn_newassoc(struct ieee80211_node *, int);
367static void		urtwn_node_free(struct ieee80211_node *);
368static void		urtwn_set_chan(struct urtwn_softc *,
369		    	    struct ieee80211_channel *,
370			    struct ieee80211_channel *);
371static void		urtwn_iq_calib(struct urtwn_softc *);
372static void		urtwn_lc_calib(struct urtwn_softc *);
373static void		urtwn_temp_calib(struct urtwn_softc *);
374static int		urtwn_init(struct urtwn_softc *);
375static void		urtwn_stop(struct urtwn_softc *);
376static void		urtwn_abort_xfers(struct urtwn_softc *);
377static int		urtwn_raw_xmit(struct ieee80211_node *, struct mbuf *,
378			    const struct ieee80211_bpf_params *);
379static void		urtwn_ms_delay(struct urtwn_softc *);
380
381/* Aliases. */
382#define	urtwn_bb_write	urtwn_write_4
383#define urtwn_bb_read	urtwn_read_4
384
385static const struct usb_config urtwn_config[URTWN_N_TRANSFER] = {
386	[URTWN_BULK_RX] = {
387		.type = UE_BULK,
388		.endpoint = UE_ADDR_ANY,
389		.direction = UE_DIR_IN,
390		.bufsize = URTWN_RXBUFSZ,
391		.flags = {
392			.pipe_bof = 1,
393			.short_xfer_ok = 1
394		},
395		.callback = urtwn_bulk_rx_callback,
396	},
397	[URTWN_BULK_TX_BE] = {
398		.type = UE_BULK,
399		.endpoint = 0x03,
400		.direction = UE_DIR_OUT,
401		.bufsize = URTWN_TXBUFSZ,
402		.flags = {
403			.ext_buffer = 1,
404			.pipe_bof = 1,
405			.force_short_xfer = 1
406		},
407		.callback = urtwn_bulk_tx_callback,
408		.timeout = URTWN_TX_TIMEOUT,	/* ms */
409	},
410	[URTWN_BULK_TX_BK] = {
411		.type = UE_BULK,
412		.endpoint = 0x03,
413		.direction = UE_DIR_OUT,
414		.bufsize = URTWN_TXBUFSZ,
415		.flags = {
416			.ext_buffer = 1,
417			.pipe_bof = 1,
418			.force_short_xfer = 1,
419		},
420		.callback = urtwn_bulk_tx_callback,
421		.timeout = URTWN_TX_TIMEOUT,	/* ms */
422	},
423	[URTWN_BULK_TX_VI] = {
424		.type = UE_BULK,
425		.endpoint = 0x02,
426		.direction = UE_DIR_OUT,
427		.bufsize = URTWN_TXBUFSZ,
428		.flags = {
429			.ext_buffer = 1,
430			.pipe_bof = 1,
431			.force_short_xfer = 1
432		},
433		.callback = urtwn_bulk_tx_callback,
434		.timeout = URTWN_TX_TIMEOUT,	/* ms */
435	},
436	[URTWN_BULK_TX_VO] = {
437		.type = UE_BULK,
438		.endpoint = 0x02,
439		.direction = UE_DIR_OUT,
440		.bufsize = URTWN_TXBUFSZ,
441		.flags = {
442			.ext_buffer = 1,
443			.pipe_bof = 1,
444			.force_short_xfer = 1
445		},
446		.callback = urtwn_bulk_tx_callback,
447		.timeout = URTWN_TX_TIMEOUT,	/* ms */
448	},
449};
450
451static const struct wme_to_queue {
452	uint16_t reg;
453	uint8_t qid;
454} wme2queue[WME_NUM_AC] = {
455	{ R92C_EDCA_BE_PARAM, URTWN_BULK_TX_BE},
456	{ R92C_EDCA_BK_PARAM, URTWN_BULK_TX_BK},
457	{ R92C_EDCA_VI_PARAM, URTWN_BULK_TX_VI},
458	{ R92C_EDCA_VO_PARAM, URTWN_BULK_TX_VO}
459};
460
461static int
462urtwn_match(device_t self)
463{
464	struct usb_attach_arg *uaa = device_get_ivars(self);
465
466	if (uaa->usb_mode != USB_MODE_HOST)
467		return (ENXIO);
468	if (uaa->info.bConfigIndex != URTWN_CONFIG_INDEX)
469		return (ENXIO);
470	if (uaa->info.bIfaceIndex != URTWN_IFACE_INDEX)
471		return (ENXIO);
472
473	return (usbd_lookup_id_by_uaa(urtwn_devs, sizeof(urtwn_devs), uaa));
474}
475
476static void
477urtwn_update_chw(struct ieee80211com *ic)
478{
479}
480
481static int
482urtwn_ampdu_enable(struct ieee80211_node *ni, struct ieee80211_tx_ampdu *tap)
483{
484
485	/* We're driving this ourselves (eventually); don't involve net80211 */
486	return (0);
487}
488
489static int
490urtwn_attach(device_t self)
491{
492	struct usb_attach_arg *uaa = device_get_ivars(self);
493	struct urtwn_softc *sc = device_get_softc(self);
494	struct ieee80211com *ic = &sc->sc_ic;
495	uint8_t bands[IEEE80211_MODE_BYTES];
496	int error;
497
498	device_set_usb_desc(self);
499	sc->sc_udev = uaa->device;
500	sc->sc_dev = self;
501	if (USB_GET_DRIVER_INFO(uaa) == URTWN_RTL8188E)
502		sc->chip |= URTWN_CHIP_88E;
503
504#ifdef USB_DEBUG
505	int debug;
506	if (resource_int_value(device_get_name(sc->sc_dev),
507	    device_get_unit(sc->sc_dev), "debug", &debug) == 0)
508		sc->sc_debug = debug;
509#endif
510
511	mtx_init(&sc->sc_mtx, device_get_nameunit(self),
512	    MTX_NETWORK_LOCK, MTX_DEF);
513	URTWN_CMDQ_LOCK_INIT(sc);
514	URTWN_NT_LOCK_INIT(sc);
515	callout_init(&sc->sc_calib_to, 0);
516	callout_init(&sc->sc_watchdog_ch, 0);
517	mbufq_init(&sc->sc_snd, ifqmaxlen);
518
519	sc->sc_iface_index = URTWN_IFACE_INDEX;
520	error = usbd_transfer_setup(uaa->device, &sc->sc_iface_index,
521	    sc->sc_xfer, urtwn_config, URTWN_N_TRANSFER, sc, &sc->sc_mtx);
522	if (error) {
523		device_printf(self, "could not allocate USB transfers, "
524		    "err=%s\n", usbd_errstr(error));
525		goto detach;
526	}
527
528	URTWN_LOCK(sc);
529
530	error = urtwn_read_chipid(sc);
531	if (error) {
532		device_printf(sc->sc_dev, "unsupported test chip\n");
533		URTWN_UNLOCK(sc);
534		goto detach;
535	}
536
537	/* Determine number of Tx/Rx chains. */
538	if (sc->chip & URTWN_CHIP_92C) {
539		sc->ntxchains = (sc->chip & URTWN_CHIP_92C_1T2R) ? 1 : 2;
540		sc->nrxchains = 2;
541	} else {
542		sc->ntxchains = 1;
543		sc->nrxchains = 1;
544	}
545
546	if (sc->chip & URTWN_CHIP_88E)
547		error = urtwn_r88e_read_rom(sc);
548	else
549		error = urtwn_read_rom(sc);
550	if (error != 0) {
551		device_printf(sc->sc_dev, "%s: cannot read rom, error %d\n",
552		    __func__, error);
553		URTWN_UNLOCK(sc);
554		goto detach;
555	}
556
557	device_printf(sc->sc_dev, "MAC/BB RTL%s, RF 6052 %dT%dR\n",
558	    (sc->chip & URTWN_CHIP_92C) ? "8192CU" :
559	    (sc->chip & URTWN_CHIP_88E) ? "8188EU" :
560	    (sc->board_type == R92C_BOARD_TYPE_HIGHPA) ? "8188RU" :
561	    (sc->board_type == R92C_BOARD_TYPE_MINICARD) ? "8188CE-VAU" :
562	    "8188CUS", sc->ntxchains, sc->nrxchains);
563
564	URTWN_UNLOCK(sc);
565
566	ic->ic_softc = sc;
567	ic->ic_name = device_get_nameunit(self);
568	ic->ic_phytype = IEEE80211_T_OFDM;	/* not only, but not used */
569	ic->ic_opmode = IEEE80211_M_STA;	/* default to BSS mode */
570
571	/* set device capabilities */
572	ic->ic_caps =
573		  IEEE80211_C_STA		/* station mode */
574		| IEEE80211_C_MONITOR		/* monitor mode */
575		| IEEE80211_C_IBSS		/* adhoc mode */
576		| IEEE80211_C_HOSTAP		/* hostap mode */
577		| IEEE80211_C_SHPREAMBLE	/* short preamble supported */
578		| IEEE80211_C_SHSLOT		/* short slot time supported */
579#if 0
580		| IEEE80211_C_BGSCAN		/* capable of bg scanning */
581#endif
582		| IEEE80211_C_WPA		/* 802.11i */
583		| IEEE80211_C_WME		/* 802.11e */
584		| IEEE80211_C_SWAMSDUTX		/* Do software A-MSDU TX */
585		| IEEE80211_C_FF		/* Atheros fast-frames */
586		;
587
588	ic->ic_cryptocaps =
589	    IEEE80211_CRYPTO_WEP |
590	    IEEE80211_CRYPTO_TKIP |
591	    IEEE80211_CRYPTO_AES_CCM;
592
593	/* Assume they're all 11n capable for now */
594	if (urtwn_enable_11n) {
595		device_printf(self, "enabling 11n\n");
596		ic->ic_htcaps = IEEE80211_HTC_HT |
597#if 0
598		    IEEE80211_HTC_AMPDU |
599#endif
600		    IEEE80211_HTC_AMSDU |
601		    IEEE80211_HTCAP_MAXAMSDU_3839 |
602		    IEEE80211_HTCAP_SMPS_OFF;
603		/* no HT40 just yet */
604		// ic->ic_htcaps |= IEEE80211_HTCAP_CHWIDTH40;
605
606		/* XXX TODO: verify chains versus streams for urtwn */
607		ic->ic_txstream = sc->ntxchains;
608		ic->ic_rxstream = sc->nrxchains;
609	}
610
611	memset(bands, 0, sizeof(bands));
612	setbit(bands, IEEE80211_MODE_11B);
613	setbit(bands, IEEE80211_MODE_11G);
614	if (urtwn_enable_11n)
615		setbit(bands, IEEE80211_MODE_11NG);
616	ieee80211_init_channels(ic, NULL, bands);
617
618	ieee80211_ifattach(ic);
619	ic->ic_raw_xmit = urtwn_raw_xmit;
620	ic->ic_scan_start = urtwn_scan_start;
621	ic->ic_scan_end = urtwn_scan_end;
622	ic->ic_set_channel = urtwn_set_channel;
623	ic->ic_transmit = urtwn_transmit;
624	ic->ic_parent = urtwn_parent;
625	ic->ic_vap_create = urtwn_vap_create;
626	ic->ic_vap_delete = urtwn_vap_delete;
627	ic->ic_wme.wme_update = urtwn_wme_update;
628	ic->ic_updateslot = urtwn_update_slot;
629	ic->ic_update_promisc = urtwn_update_promisc;
630	ic->ic_update_mcast = urtwn_update_mcast;
631	if (sc->chip & URTWN_CHIP_88E) {
632		ic->ic_node_alloc = urtwn_node_alloc;
633		ic->ic_newassoc = urtwn_newassoc;
634		sc->sc_node_free = ic->ic_node_free;
635		ic->ic_node_free = urtwn_node_free;
636	}
637	ic->ic_update_chw = urtwn_update_chw;
638	ic->ic_ampdu_enable = urtwn_ampdu_enable;
639
640	ieee80211_radiotap_attach(ic, &sc->sc_txtap.wt_ihdr,
641	    sizeof(sc->sc_txtap), URTWN_TX_RADIOTAP_PRESENT,
642	    &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap),
643	    URTWN_RX_RADIOTAP_PRESENT);
644
645	TASK_INIT(&sc->cmdq_task, 0, urtwn_cmdq_cb, sc);
646
647	urtwn_sysctlattach(sc);
648
649	if (bootverbose)
650		ieee80211_announce(ic);
651
652	return (0);
653
654detach:
655	urtwn_detach(self);
656	return (ENXIO);			/* failure */
657}
658
659static void
660urtwn_sysctlattach(struct urtwn_softc *sc)
661{
662#ifdef USB_DEBUG
663	struct sysctl_ctx_list *ctx = device_get_sysctl_ctx(sc->sc_dev);
664	struct sysctl_oid *tree = device_get_sysctl_tree(sc->sc_dev);
665
666	SYSCTL_ADD_U32(ctx, SYSCTL_CHILDREN(tree), OID_AUTO,
667	    "debug", CTLFLAG_RW, &sc->sc_debug, sc->sc_debug,
668	    "control debugging printfs");
669#endif
670}
671
672static int
673urtwn_detach(device_t self)
674{
675	struct urtwn_softc *sc = device_get_softc(self);
676	struct ieee80211com *ic = &sc->sc_ic;
677	unsigned int x;
678
679	/* Prevent further ioctls. */
680	URTWN_LOCK(sc);
681	sc->sc_flags |= URTWN_DETACHED;
682	URTWN_UNLOCK(sc);
683
684	urtwn_stop(sc);
685
686	callout_drain(&sc->sc_watchdog_ch);
687	callout_drain(&sc->sc_calib_to);
688
689	/* stop all USB transfers */
690	usbd_transfer_unsetup(sc->sc_xfer, URTWN_N_TRANSFER);
691
692	/* Prevent further allocations from RX/TX data lists. */
693	URTWN_LOCK(sc);
694	STAILQ_INIT(&sc->sc_tx_active);
695	STAILQ_INIT(&sc->sc_tx_inactive);
696	STAILQ_INIT(&sc->sc_tx_pending);
697
698	STAILQ_INIT(&sc->sc_rx_active);
699	STAILQ_INIT(&sc->sc_rx_inactive);
700	URTWN_UNLOCK(sc);
701
702	/* drain USB transfers */
703	for (x = 0; x != URTWN_N_TRANSFER; x++)
704		usbd_transfer_drain(sc->sc_xfer[x]);
705
706	/* Free data buffers. */
707	URTWN_LOCK(sc);
708	urtwn_free_tx_list(sc);
709	urtwn_free_rx_list(sc);
710	URTWN_UNLOCK(sc);
711
712	if (ic->ic_softc == sc) {
713		ieee80211_draintask(ic, &sc->cmdq_task);
714		ieee80211_ifdetach(ic);
715	}
716
717	URTWN_NT_LOCK_DESTROY(sc);
718	URTWN_CMDQ_LOCK_DESTROY(sc);
719	mtx_destroy(&sc->sc_mtx);
720
721	return (0);
722}
723
724static void
725urtwn_drain_mbufq(struct urtwn_softc *sc)
726{
727	struct mbuf *m;
728	struct ieee80211_node *ni;
729	URTWN_ASSERT_LOCKED(sc);
730	while ((m = mbufq_dequeue(&sc->sc_snd)) != NULL) {
731		ni = (struct ieee80211_node *)m->m_pkthdr.rcvif;
732		m->m_pkthdr.rcvif = NULL;
733		ieee80211_free_node(ni);
734		m_freem(m);
735	}
736}
737
738static usb_error_t
739urtwn_do_request(struct urtwn_softc *sc, struct usb_device_request *req,
740    void *data)
741{
742	usb_error_t err;
743	int ntries = 10;
744
745	URTWN_ASSERT_LOCKED(sc);
746
747	while (ntries--) {
748		err = usbd_do_request_flags(sc->sc_udev, &sc->sc_mtx,
749		    req, data, 0, NULL, 250 /* ms */);
750		if (err == 0)
751			break;
752
753		URTWN_DPRINTF(sc, URTWN_DEBUG_USB,
754		    "%s: control request failed, %s (retries left: %d)\n",
755		    __func__, usbd_errstr(err), ntries);
756		usb_pause_mtx(&sc->sc_mtx, hz / 100);
757	}
758	return (err);
759}
760
761static struct ieee80211vap *
762urtwn_vap_create(struct ieee80211com *ic, const char name[IFNAMSIZ], int unit,
763    enum ieee80211_opmode opmode, int flags,
764    const uint8_t bssid[IEEE80211_ADDR_LEN],
765    const uint8_t mac[IEEE80211_ADDR_LEN])
766{
767	struct urtwn_softc *sc = ic->ic_softc;
768	struct urtwn_vap *uvp;
769	struct ieee80211vap *vap;
770
771	if (!TAILQ_EMPTY(&ic->ic_vaps))		/* only one at a time */
772		return (NULL);
773
774	uvp = malloc(sizeof(struct urtwn_vap), M_80211_VAP, M_WAITOK | M_ZERO);
775	vap = &uvp->vap;
776	/* enable s/w bmiss handling for sta mode */
777
778	if (ieee80211_vap_setup(ic, vap, name, unit, opmode,
779	    flags | IEEE80211_CLONE_NOBEACONS, bssid) != 0) {
780		/* out of memory */
781		free(uvp, M_80211_VAP);
782		return (NULL);
783	}
784
785	if (opmode == IEEE80211_M_HOSTAP || opmode == IEEE80211_M_IBSS)
786		urtwn_init_beacon(sc, uvp);
787
788	/* override state transition machine */
789	uvp->newstate = vap->iv_newstate;
790	vap->iv_newstate = urtwn_newstate;
791	vap->iv_update_beacon = urtwn_update_beacon;
792	vap->iv_key_alloc = urtwn_key_alloc;
793	vap->iv_key_set = urtwn_key_set;
794	vap->iv_key_delete = urtwn_key_delete;
795
796	/* 802.11n parameters */
797	vap->iv_ampdu_density = IEEE80211_HTCAP_MPDUDENSITY_16;
798	vap->iv_ampdu_rxmax = IEEE80211_HTCAP_MAXRXAMPDU_64K;
799
800	if (opmode == IEEE80211_M_IBSS) {
801		uvp->recv_mgmt = vap->iv_recv_mgmt;
802		vap->iv_recv_mgmt = urtwn_ibss_recv_mgmt;
803		TASK_INIT(&uvp->tsf_task_adhoc, 0, urtwn_tsf_task_adhoc, vap);
804	}
805
806	if (URTWN_CHIP_HAS_RATECTL(sc))
807		ieee80211_ratectl_init(vap);
808	/* complete setup */
809	ieee80211_vap_attach(vap, ieee80211_media_change,
810	    ieee80211_media_status, mac);
811	ic->ic_opmode = opmode;
812	return (vap);
813}
814
815static void
816urtwn_vap_delete(struct ieee80211vap *vap)
817{
818	struct ieee80211com *ic = vap->iv_ic;
819	struct urtwn_softc *sc = ic->ic_softc;
820	struct urtwn_vap *uvp = URTWN_VAP(vap);
821
822	if (uvp->bcn_mbuf != NULL)
823		m_freem(uvp->bcn_mbuf);
824	if (vap->iv_opmode == IEEE80211_M_IBSS)
825		ieee80211_draintask(ic, &uvp->tsf_task_adhoc);
826	if (URTWN_CHIP_HAS_RATECTL(sc))
827		ieee80211_ratectl_deinit(vap);
828	ieee80211_vap_detach(vap);
829	free(uvp, M_80211_VAP);
830}
831
832static struct mbuf *
833urtwn_rx_copy_to_mbuf(struct urtwn_softc *sc, struct r92c_rx_stat *stat,
834    int totlen)
835{
836	struct ieee80211com *ic = &sc->sc_ic;
837	struct mbuf *m;
838	uint32_t rxdw0;
839	int pktlen;
840
841	/*
842	 * don't pass packets to the ieee80211 framework if the driver isn't
843	 * RUNNING.
844	 */
845	if (!(sc->sc_flags & URTWN_RUNNING))
846		return (NULL);
847
848	rxdw0 = le32toh(stat->rxdw0);
849	if (rxdw0 & (R92C_RXDW0_CRCERR | R92C_RXDW0_ICVERR)) {
850		/*
851		 * This should not happen since we setup our Rx filter
852		 * to not receive these frames.
853		 */
854		URTWN_DPRINTF(sc, URTWN_DEBUG_RECV,
855		    "%s: RX flags error (%s)\n", __func__,
856		    rxdw0 & R92C_RXDW0_CRCERR ? "CRC" : "ICV");
857		goto fail;
858	}
859
860	pktlen = MS(rxdw0, R92C_RXDW0_PKTLEN);
861	if (pktlen < sizeof(struct ieee80211_frame_ack)) {
862		URTWN_DPRINTF(sc, URTWN_DEBUG_RECV,
863		    "%s: frame is too short: %d\n", __func__, pktlen);
864		goto fail;
865	}
866
867	if (__predict_false(totlen > MCLBYTES)) {
868		/* convert to m_getjcl if this happens */
869		device_printf(sc->sc_dev, "%s: frame too long: %d (%d)\n",
870		    __func__, pktlen, totlen);
871		goto fail;
872	}
873
874	m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
875	if (__predict_false(m == NULL)) {
876		device_printf(sc->sc_dev, "%s: could not allocate RX mbuf\n",
877		    __func__);
878		goto fail;
879	}
880
881	/* Finalize mbuf. */
882	memcpy(mtod(m, uint8_t *), (uint8_t *)stat, totlen);
883	m->m_pkthdr.len = m->m_len = totlen;
884
885	return (m);
886fail:
887	counter_u64_add(ic->ic_ierrors, 1);
888	return (NULL);
889}
890
891static struct mbuf *
892urtwn_report_intr(struct usb_xfer *xfer, struct urtwn_data *data)
893{
894	struct urtwn_softc *sc = data->sc;
895	struct ieee80211com *ic = &sc->sc_ic;
896	struct r92c_rx_stat *stat;
897	uint8_t *buf;
898	int len;
899
900	usbd_xfer_status(xfer, &len, NULL, NULL, NULL);
901
902	if (len < sizeof(*stat)) {
903		counter_u64_add(ic->ic_ierrors, 1);
904		return (NULL);
905	}
906
907	buf = data->buf;
908	stat = (struct r92c_rx_stat *)buf;
909
910	/*
911	 * For 88E chips we can tie the FF flushing here;
912	 * this is where we do know exactly how deep the
913	 * transmit queue is.
914	 *
915	 * But it won't work for R92 chips, so we can't
916	 * take the easy way out.
917	 */
918
919	if (sc->chip & URTWN_CHIP_88E) {
920		int report_sel = MS(le32toh(stat->rxdw3), R88E_RXDW3_RPT);
921
922		switch (report_sel) {
923		case R88E_RXDW3_RPT_RX:
924			return (urtwn_rxeof(sc, buf, len));
925		case R88E_RXDW3_RPT_TX1:
926			urtwn_r88e_ratectl_tx_complete(sc, &stat[1]);
927			break;
928		default:
929			URTWN_DPRINTF(sc, URTWN_DEBUG_INTR,
930			    "%s: case %d was not handled\n", __func__,
931			    report_sel);
932			break;
933		}
934	} else
935		return (urtwn_rxeof(sc, buf, len));
936
937	return (NULL);
938}
939
940static struct mbuf *
941urtwn_rxeof(struct urtwn_softc *sc, uint8_t *buf, int len)
942{
943	struct r92c_rx_stat *stat;
944	struct mbuf *m, *m0 = NULL, *prevm = NULL;
945	uint32_t rxdw0;
946	int totlen, pktlen, infosz, npkts;
947
948	/* Get the number of encapsulated frames. */
949	stat = (struct r92c_rx_stat *)buf;
950	npkts = MS(le32toh(stat->rxdw2), R92C_RXDW2_PKTCNT);
951	URTWN_DPRINTF(sc, URTWN_DEBUG_RECV,
952	    "%s: Rx %d frames in one chunk\n", __func__, npkts);
953
954	/* Process all of them. */
955	while (npkts-- > 0) {
956		if (len < sizeof(*stat))
957			break;
958		stat = (struct r92c_rx_stat *)buf;
959		rxdw0 = le32toh(stat->rxdw0);
960
961		pktlen = MS(rxdw0, R92C_RXDW0_PKTLEN);
962		if (pktlen == 0)
963			break;
964
965		infosz = MS(rxdw0, R92C_RXDW0_INFOSZ) * 8;
966
967		/* Make sure everything fits in xfer. */
968		totlen = sizeof(*stat) + infosz + pktlen;
969		if (totlen > len)
970			break;
971
972		m = urtwn_rx_copy_to_mbuf(sc, stat, totlen);
973		if (m0 == NULL)
974			m0 = m;
975		if (prevm == NULL)
976			prevm = m;
977		else {
978			prevm->m_next = m;
979			prevm = m;
980		}
981
982		/* Next chunk is 128-byte aligned. */
983		totlen = (totlen + 127) & ~127;
984		buf += totlen;
985		len -= totlen;
986	}
987
988	return (m0);
989}
990
991static void
992urtwn_r88e_ratectl_tx_complete(struct urtwn_softc *sc, void *arg)
993{
994	struct r88e_tx_rpt_ccx *rpt = arg;
995	struct ieee80211vap *vap;
996	struct ieee80211_node *ni;
997	uint8_t macid;
998	int ntries;
999
1000	macid = MS(rpt->rptb1, R88E_RPTB1_MACID);
1001	ntries = MS(rpt->rptb2, R88E_RPTB2_RETRY_CNT);
1002
1003	URTWN_NT_LOCK(sc);
1004	ni = sc->node_list[macid];
1005	if (ni != NULL) {
1006		vap = ni->ni_vap;
1007		URTWN_DPRINTF(sc, URTWN_DEBUG_INTR, "%s: frame for macid %d was"
1008		    "%s sent (%d retries)\n", __func__, macid,
1009		    (rpt->rptb1 & R88E_RPTB1_PKT_OK) ? "" : " not",
1010		    ntries);
1011
1012		if (rpt->rptb1 & R88E_RPTB1_PKT_OK) {
1013			ieee80211_ratectl_tx_complete(vap, ni,
1014			    IEEE80211_RATECTL_TX_SUCCESS, &ntries, NULL);
1015		} else {
1016			ieee80211_ratectl_tx_complete(vap, ni,
1017			    IEEE80211_RATECTL_TX_FAILURE, &ntries, NULL);
1018		}
1019	} else {
1020		URTWN_DPRINTF(sc, URTWN_DEBUG_INTR, "%s: macid %d, ni is NULL\n",
1021		    __func__, macid);
1022	}
1023	URTWN_NT_UNLOCK(sc);
1024}
1025
1026static struct ieee80211_node *
1027urtwn_rx_frame(struct urtwn_softc *sc, struct mbuf *m, int8_t *rssi_p)
1028{
1029	struct ieee80211com *ic = &sc->sc_ic;
1030	struct ieee80211_frame_min *wh;
1031	struct r92c_rx_stat *stat;
1032	uint32_t rxdw0, rxdw3;
1033	uint8_t rate, cipher;
1034	int8_t rssi = -127;
1035	int infosz;
1036
1037	stat = mtod(m, struct r92c_rx_stat *);
1038	rxdw0 = le32toh(stat->rxdw0);
1039	rxdw3 = le32toh(stat->rxdw3);
1040
1041	rate = MS(rxdw3, R92C_RXDW3_RATE);
1042	cipher = MS(rxdw0, R92C_RXDW0_CIPHER);
1043	infosz = MS(rxdw0, R92C_RXDW0_INFOSZ) * 8;
1044
1045	/* Get RSSI from PHY status descriptor if present. */
1046	if (infosz != 0 && (rxdw0 & R92C_RXDW0_PHYST)) {
1047		if (sc->chip & URTWN_CHIP_88E)
1048			rssi = urtwn_r88e_get_rssi(sc, rate, &stat[1]);
1049		else
1050			rssi = urtwn_get_rssi(sc, rate, &stat[1]);
1051		URTWN_DPRINTF(sc, URTWN_DEBUG_RSSI, "%s: rssi=%d\n", __func__, rssi);
1052		/* Update our average RSSI. */
1053		urtwn_update_avgrssi(sc, rate, rssi);
1054	}
1055
1056	if (ieee80211_radiotap_active(ic)) {
1057		struct urtwn_rx_radiotap_header *tap = &sc->sc_rxtap;
1058
1059		tap->wr_flags = 0;
1060
1061		urtwn_get_tsf(sc, &tap->wr_tsft);
1062		if (__predict_false(le32toh((uint32_t)tap->wr_tsft) <
1063				    le32toh(stat->rxdw5))) {
1064			tap->wr_tsft = le32toh(tap->wr_tsft  >> 32) - 1;
1065			tap->wr_tsft = (uint64_t)htole32(tap->wr_tsft) << 32;
1066		} else
1067			tap->wr_tsft &= 0xffffffff00000000;
1068		tap->wr_tsft += stat->rxdw5;
1069
1070		/* XXX 20/40? */
1071		/* XXX shortgi? */
1072
1073		/* Map HW rate index to 802.11 rate. */
1074		if (!(rxdw3 & R92C_RXDW3_HT)) {
1075			tap->wr_rate = ridx2rate[rate];
1076		} else if (rate >= 12) {	/* MCS0~15. */
1077			/* Bit 7 set means HT MCS instead of rate. */
1078			tap->wr_rate = 0x80 | (rate - 12);
1079		}
1080
1081		/* XXX TODO: this isn't right; should use the last good RSSI */
1082		tap->wr_dbm_antsignal = rssi;
1083		tap->wr_dbm_antnoise = URTWN_NOISE_FLOOR;
1084	}
1085
1086	*rssi_p = rssi;
1087
1088	/* Drop descriptor. */
1089	m_adj(m, sizeof(*stat) + infosz);
1090	wh = mtod(m, struct ieee80211_frame_min *);
1091
1092	if ((wh->i_fc[1] & IEEE80211_FC1_PROTECTED) &&
1093	    cipher != R92C_CAM_ALGO_NONE) {
1094		m->m_flags |= M_WEP;
1095	}
1096
1097	if (m->m_len >= sizeof(*wh))
1098		return (ieee80211_find_rxnode(ic, wh));
1099
1100	return (NULL);
1101}
1102
1103static void
1104urtwn_bulk_rx_callback(struct usb_xfer *xfer, usb_error_t error)
1105{
1106	struct urtwn_softc *sc = usbd_xfer_softc(xfer);
1107	struct ieee80211com *ic = &sc->sc_ic;
1108	struct ieee80211_node *ni;
1109	struct mbuf *m = NULL, *next;
1110	struct urtwn_data *data;
1111	int8_t nf, rssi;
1112
1113	URTWN_ASSERT_LOCKED(sc);
1114
1115	switch (USB_GET_STATE(xfer)) {
1116	case USB_ST_TRANSFERRED:
1117		data = STAILQ_FIRST(&sc->sc_rx_active);
1118		if (data == NULL)
1119			goto tr_setup;
1120		STAILQ_REMOVE_HEAD(&sc->sc_rx_active, next);
1121		m = urtwn_report_intr(xfer, data);
1122		STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next);
1123		/* FALLTHROUGH */
1124	case USB_ST_SETUP:
1125tr_setup:
1126		data = STAILQ_FIRST(&sc->sc_rx_inactive);
1127		if (data == NULL) {
1128			KASSERT(m == NULL, ("mbuf isn't NULL"));
1129			goto finish;
1130		}
1131		STAILQ_REMOVE_HEAD(&sc->sc_rx_inactive, next);
1132		STAILQ_INSERT_TAIL(&sc->sc_rx_active, data, next);
1133		usbd_xfer_set_frame_data(xfer, 0, data->buf,
1134		    usbd_xfer_max_len(xfer));
1135		usbd_transfer_submit(xfer);
1136
1137		/*
1138		 * To avoid LOR we should unlock our private mutex here to call
1139		 * ieee80211_input() because here is at the end of a USB
1140		 * callback and safe to unlock.
1141		 */
1142		while (m != NULL) {
1143			next = m->m_next;
1144			m->m_next = NULL;
1145
1146			ni = urtwn_rx_frame(sc, m, &rssi);
1147
1148			/* Store a global last-good RSSI */
1149			if (rssi != -127)
1150				sc->last_rssi = rssi;
1151
1152			URTWN_UNLOCK(sc);
1153
1154			nf = URTWN_NOISE_FLOOR;
1155			if (ni != NULL) {
1156				if (rssi != -127)
1157					URTWN_NODE(ni)->last_rssi = rssi;
1158				if (ni->ni_flags & IEEE80211_NODE_HT)
1159					m->m_flags |= M_AMPDU;
1160				(void)ieee80211_input(ni, m,
1161				    URTWN_NODE(ni)->last_rssi - nf, nf);
1162				ieee80211_free_node(ni);
1163			} else {
1164				/* Use last good global RSSI */
1165				(void)ieee80211_input_all(ic, m,
1166				    sc->last_rssi - nf, nf);
1167			}
1168			URTWN_LOCK(sc);
1169			m = next;
1170		}
1171		break;
1172	default:
1173		/* needs it to the inactive queue due to a error. */
1174		data = STAILQ_FIRST(&sc->sc_rx_active);
1175		if (data != NULL) {
1176			STAILQ_REMOVE_HEAD(&sc->sc_rx_active, next);
1177			STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next);
1178		}
1179		if (error != USB_ERR_CANCELLED) {
1180			usbd_xfer_set_stall(xfer);
1181			counter_u64_add(ic->ic_ierrors, 1);
1182			goto tr_setup;
1183		}
1184		break;
1185	}
1186finish:
1187	/* Finished receive; age anything left on the FF queue by a little bump */
1188	/*
1189	 * XXX TODO: just make this a callout timer schedule so we can
1190	 * flush the FF staging queue if we're approaching idle.
1191	 */
1192#ifdef	IEEE80211_SUPPORT_SUPERG
1193	URTWN_UNLOCK(sc);
1194	ieee80211_ff_age_all(ic, 1);
1195	URTWN_LOCK(sc);
1196#endif
1197
1198	/* Kick-start more transmit in case we stalled */
1199	urtwn_start(sc);
1200}
1201
1202static void
1203urtwn_txeof(struct urtwn_softc *sc, struct urtwn_data *data, int status)
1204{
1205
1206	URTWN_ASSERT_LOCKED(sc);
1207
1208	if (data->ni != NULL)	/* not a beacon frame */
1209		ieee80211_tx_complete(data->ni, data->m, status);
1210
1211	if (sc->sc_tx_n_active > 0)
1212		sc->sc_tx_n_active--;
1213
1214	data->ni = NULL;
1215	data->m = NULL;
1216
1217	sc->sc_txtimer = 0;
1218
1219	STAILQ_INSERT_TAIL(&sc->sc_tx_inactive, data, next);
1220}
1221
1222static int
1223urtwn_alloc_list(struct urtwn_softc *sc, struct urtwn_data data[],
1224    int ndata, int maxsz)
1225{
1226	int i, error;
1227
1228	for (i = 0; i < ndata; i++) {
1229		struct urtwn_data *dp = &data[i];
1230		dp->sc = sc;
1231		dp->m = NULL;
1232		dp->buf = malloc(maxsz, M_USBDEV, M_NOWAIT);
1233		if (dp->buf == NULL) {
1234			device_printf(sc->sc_dev,
1235			    "could not allocate buffer\n");
1236			error = ENOMEM;
1237			goto fail;
1238		}
1239		dp->ni = NULL;
1240	}
1241
1242	return (0);
1243fail:
1244	urtwn_free_list(sc, data, ndata);
1245	return (error);
1246}
1247
1248static int
1249urtwn_alloc_rx_list(struct urtwn_softc *sc)
1250{
1251        int error, i;
1252
1253	error = urtwn_alloc_list(sc, sc->sc_rx, URTWN_RX_LIST_COUNT,
1254	    URTWN_RXBUFSZ);
1255	if (error != 0)
1256		return (error);
1257
1258	STAILQ_INIT(&sc->sc_rx_active);
1259	STAILQ_INIT(&sc->sc_rx_inactive);
1260
1261	for (i = 0; i < URTWN_RX_LIST_COUNT; i++)
1262		STAILQ_INSERT_HEAD(&sc->sc_rx_inactive, &sc->sc_rx[i], next);
1263
1264	return (0);
1265}
1266
1267static int
1268urtwn_alloc_tx_list(struct urtwn_softc *sc)
1269{
1270	int error, i;
1271
1272	error = urtwn_alloc_list(sc, sc->sc_tx, URTWN_TX_LIST_COUNT,
1273	    URTWN_TXBUFSZ);
1274	if (error != 0)
1275		return (error);
1276
1277	STAILQ_INIT(&sc->sc_tx_active);
1278	STAILQ_INIT(&sc->sc_tx_inactive);
1279	STAILQ_INIT(&sc->sc_tx_pending);
1280
1281	for (i = 0; i < URTWN_TX_LIST_COUNT; i++)
1282		STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, &sc->sc_tx[i], next);
1283
1284	return (0);
1285}
1286
1287static void
1288urtwn_free_list(struct urtwn_softc *sc, struct urtwn_data data[], int ndata)
1289{
1290	int i;
1291
1292	for (i = 0; i < ndata; i++) {
1293		struct urtwn_data *dp = &data[i];
1294
1295		if (dp->buf != NULL) {
1296			free(dp->buf, M_USBDEV);
1297			dp->buf = NULL;
1298		}
1299		if (dp->ni != NULL) {
1300			ieee80211_free_node(dp->ni);
1301			dp->ni = NULL;
1302		}
1303	}
1304}
1305
1306static void
1307urtwn_free_rx_list(struct urtwn_softc *sc)
1308{
1309	urtwn_free_list(sc, sc->sc_rx, URTWN_RX_LIST_COUNT);
1310}
1311
1312static void
1313urtwn_free_tx_list(struct urtwn_softc *sc)
1314{
1315	urtwn_free_list(sc, sc->sc_tx, URTWN_TX_LIST_COUNT);
1316}
1317
1318static void
1319urtwn_bulk_tx_callback(struct usb_xfer *xfer, usb_error_t error)
1320{
1321	struct urtwn_softc *sc = usbd_xfer_softc(xfer);
1322#ifdef	IEEE80211_SUPPORT_SUPERG
1323	struct ieee80211com *ic = &sc->sc_ic;
1324#endif
1325	struct urtwn_data *data;
1326
1327	URTWN_ASSERT_LOCKED(sc);
1328
1329	switch (USB_GET_STATE(xfer)){
1330	case USB_ST_TRANSFERRED:
1331		data = STAILQ_FIRST(&sc->sc_tx_active);
1332		if (data == NULL)
1333			goto tr_setup;
1334		STAILQ_REMOVE_HEAD(&sc->sc_tx_active, next);
1335		urtwn_txeof(sc, data, 0);
1336		/* FALLTHROUGH */
1337	case USB_ST_SETUP:
1338tr_setup:
1339		data = STAILQ_FIRST(&sc->sc_tx_pending);
1340		if (data == NULL) {
1341			URTWN_DPRINTF(sc, URTWN_DEBUG_XMIT,
1342			    "%s: empty pending queue\n", __func__);
1343			sc->sc_tx_n_active = 0;
1344			goto finish;
1345		}
1346		STAILQ_REMOVE_HEAD(&sc->sc_tx_pending, next);
1347		STAILQ_INSERT_TAIL(&sc->sc_tx_active, data, next);
1348		usbd_xfer_set_frame_data(xfer, 0, data->buf, data->buflen);
1349		usbd_transfer_submit(xfer);
1350		sc->sc_tx_n_active++;
1351		break;
1352	default:
1353		data = STAILQ_FIRST(&sc->sc_tx_active);
1354		if (data == NULL)
1355			goto tr_setup;
1356		STAILQ_REMOVE_HEAD(&sc->sc_tx_active, next);
1357		urtwn_txeof(sc, data, 1);
1358		if (error != USB_ERR_CANCELLED) {
1359			usbd_xfer_set_stall(xfer);
1360			goto tr_setup;
1361		}
1362		break;
1363	}
1364finish:
1365#ifdef	IEEE80211_SUPPORT_SUPERG
1366	/*
1367	 * If the TX active queue drops below a certain
1368	 * threshold, ensure we age fast-frames out so they're
1369	 * transmitted.
1370	 */
1371	if (sc->sc_tx_n_active <= 1) {
1372		/* XXX ew - net80211 should defer this for us! */
1373
1374		/*
1375		 * Note: this sc_tx_n_active currently tracks
1376		 * the number of pending transmit submissions
1377		 * and not the actual depth of the TX frames
1378		 * pending to the hardware.  That means that
1379		 * we're going to end up with some sub-optimal
1380		 * aggregation behaviour.
1381		 */
1382		/*
1383		 * XXX TODO: just make this a callout timer schedule so we can
1384		 * flush the FF staging queue if we're approaching idle.
1385		 */
1386		URTWN_UNLOCK(sc);
1387		ieee80211_ff_flush(ic, WME_AC_VO);
1388		ieee80211_ff_flush(ic, WME_AC_VI);
1389		ieee80211_ff_flush(ic, WME_AC_BE);
1390		ieee80211_ff_flush(ic, WME_AC_BK);
1391		URTWN_LOCK(sc);
1392	}
1393#endif
1394	/* Kick-start more transmit */
1395	urtwn_start(sc);
1396}
1397
1398static struct urtwn_data *
1399_urtwn_getbuf(struct urtwn_softc *sc)
1400{
1401	struct urtwn_data *bf;
1402
1403	bf = STAILQ_FIRST(&sc->sc_tx_inactive);
1404	if (bf != NULL)
1405		STAILQ_REMOVE_HEAD(&sc->sc_tx_inactive, next);
1406	else {
1407		URTWN_DPRINTF(sc, URTWN_DEBUG_XMIT,
1408		    "%s: out of xmit buffers\n", __func__);
1409	}
1410	return (bf);
1411}
1412
1413static struct urtwn_data *
1414urtwn_getbuf(struct urtwn_softc *sc)
1415{
1416        struct urtwn_data *bf;
1417
1418	URTWN_ASSERT_LOCKED(sc);
1419
1420	bf = _urtwn_getbuf(sc);
1421	if (bf == NULL) {
1422		URTWN_DPRINTF(sc, URTWN_DEBUG_XMIT, "%s: stop queue\n",
1423		    __func__);
1424	}
1425	return (bf);
1426}
1427
1428static usb_error_t
1429urtwn_write_region_1(struct urtwn_softc *sc, uint16_t addr, uint8_t *buf,
1430    int len)
1431{
1432	usb_device_request_t req;
1433
1434	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1435	req.bRequest = R92C_REQ_REGS;
1436	USETW(req.wValue, addr);
1437	USETW(req.wIndex, 0);
1438	USETW(req.wLength, len);
1439	return (urtwn_do_request(sc, &req, buf));
1440}
1441
1442static usb_error_t
1443urtwn_write_1(struct urtwn_softc *sc, uint16_t addr, uint8_t val)
1444{
1445	return (urtwn_write_region_1(sc, addr, &val, sizeof(val)));
1446}
1447
1448static usb_error_t
1449urtwn_write_2(struct urtwn_softc *sc, uint16_t addr, uint16_t val)
1450{
1451	val = htole16(val);
1452	return (urtwn_write_region_1(sc, addr, (uint8_t *)&val, sizeof(val)));
1453}
1454
1455static usb_error_t
1456urtwn_write_4(struct urtwn_softc *sc, uint16_t addr, uint32_t val)
1457{
1458	val = htole32(val);
1459	return (urtwn_write_region_1(sc, addr, (uint8_t *)&val, sizeof(val)));
1460}
1461
1462static usb_error_t
1463urtwn_read_region_1(struct urtwn_softc *sc, uint16_t addr, uint8_t *buf,
1464    int len)
1465{
1466	usb_device_request_t req;
1467
1468	req.bmRequestType = UT_READ_VENDOR_DEVICE;
1469	req.bRequest = R92C_REQ_REGS;
1470	USETW(req.wValue, addr);
1471	USETW(req.wIndex, 0);
1472	USETW(req.wLength, len);
1473	return (urtwn_do_request(sc, &req, buf));
1474}
1475
1476static uint8_t
1477urtwn_read_1(struct urtwn_softc *sc, uint16_t addr)
1478{
1479	uint8_t val;
1480
1481	if (urtwn_read_region_1(sc, addr, &val, 1) != 0)
1482		return (0xff);
1483	return (val);
1484}
1485
1486static uint16_t
1487urtwn_read_2(struct urtwn_softc *sc, uint16_t addr)
1488{
1489	uint16_t val;
1490
1491	if (urtwn_read_region_1(sc, addr, (uint8_t *)&val, 2) != 0)
1492		return (0xffff);
1493	return (le16toh(val));
1494}
1495
1496static uint32_t
1497urtwn_read_4(struct urtwn_softc *sc, uint16_t addr)
1498{
1499	uint32_t val;
1500
1501	if (urtwn_read_region_1(sc, addr, (uint8_t *)&val, 4) != 0)
1502		return (0xffffffff);
1503	return (le32toh(val));
1504}
1505
1506static int
1507urtwn_fw_cmd(struct urtwn_softc *sc, uint8_t id, const void *buf, int len)
1508{
1509	struct r92c_fw_cmd cmd;
1510	usb_error_t error;
1511	int ntries;
1512
1513	if (!(sc->sc_flags & URTWN_FW_LOADED)) {
1514		URTWN_DPRINTF(sc, URTWN_DEBUG_FIRMWARE, "%s: firmware "
1515		    "was not loaded; command (id %d) will be discarded\n",
1516		    __func__, id);
1517		return (0);
1518	}
1519
1520	/* Wait for current FW box to be empty. */
1521	for (ntries = 0; ntries < 100; ntries++) {
1522		if (!(urtwn_read_1(sc, R92C_HMETFR) & (1 << sc->fwcur)))
1523			break;
1524		urtwn_ms_delay(sc);
1525	}
1526	if (ntries == 100) {
1527		device_printf(sc->sc_dev,
1528		    "could not send firmware command\n");
1529		return (ETIMEDOUT);
1530	}
1531	memset(&cmd, 0, sizeof(cmd));
1532	cmd.id = id;
1533	if (len > 3)
1534		cmd.id |= R92C_CMD_FLAG_EXT;
1535	KASSERT(len <= sizeof(cmd.msg), ("urtwn_fw_cmd\n"));
1536	memcpy(cmd.msg, buf, len);
1537
1538	/* Write the first word last since that will trigger the FW. */
1539	error = urtwn_write_region_1(sc, R92C_HMEBOX_EXT(sc->fwcur),
1540	    (uint8_t *)&cmd + 4, 2);
1541	if (error != USB_ERR_NORMAL_COMPLETION)
1542		return (EIO);
1543	error = urtwn_write_region_1(sc, R92C_HMEBOX(sc->fwcur),
1544	    (uint8_t *)&cmd + 0, 4);
1545	if (error != USB_ERR_NORMAL_COMPLETION)
1546		return (EIO);
1547
1548	sc->fwcur = (sc->fwcur + 1) % R92C_H2C_NBOX;
1549	return (0);
1550}
1551
1552static void
1553urtwn_cmdq_cb(void *arg, int pending)
1554{
1555	struct urtwn_softc *sc = arg;
1556	struct urtwn_cmdq *item;
1557
1558	/*
1559	 * Device must be powered on (via urtwn_power_on())
1560	 * before any command may be sent.
1561	 */
1562	URTWN_LOCK(sc);
1563	if (!(sc->sc_flags & URTWN_RUNNING)) {
1564		URTWN_UNLOCK(sc);
1565		return;
1566	}
1567
1568	URTWN_CMDQ_LOCK(sc);
1569	while (sc->cmdq[sc->cmdq_first].func != NULL) {
1570		item = &sc->cmdq[sc->cmdq_first];
1571		sc->cmdq_first = (sc->cmdq_first + 1) % URTWN_CMDQ_SIZE;
1572		URTWN_CMDQ_UNLOCK(sc);
1573
1574		item->func(sc, &item->data);
1575
1576		URTWN_CMDQ_LOCK(sc);
1577		memset(item, 0, sizeof (*item));
1578	}
1579	URTWN_CMDQ_UNLOCK(sc);
1580	URTWN_UNLOCK(sc);
1581}
1582
1583static int
1584urtwn_cmd_sleepable(struct urtwn_softc *sc, const void *ptr, size_t len,
1585    CMD_FUNC_PROTO)
1586{
1587	struct ieee80211com *ic = &sc->sc_ic;
1588
1589	KASSERT(len <= sizeof(union sec_param), ("buffer overflow"));
1590
1591	URTWN_CMDQ_LOCK(sc);
1592	if (sc->cmdq[sc->cmdq_last].func != NULL) {
1593		device_printf(sc->sc_dev, "%s: cmdq overflow\n", __func__);
1594		URTWN_CMDQ_UNLOCK(sc);
1595
1596		return (EAGAIN);
1597	}
1598
1599	if (ptr != NULL)
1600		memcpy(&sc->cmdq[sc->cmdq_last].data, ptr, len);
1601	sc->cmdq[sc->cmdq_last].func = func;
1602	sc->cmdq_last = (sc->cmdq_last + 1) % URTWN_CMDQ_SIZE;
1603	URTWN_CMDQ_UNLOCK(sc);
1604
1605	ieee80211_runtask(ic, &sc->cmdq_task);
1606
1607	return (0);
1608}
1609
1610static __inline void
1611urtwn_rf_write(struct urtwn_softc *sc, int chain, uint8_t addr, uint32_t val)
1612{
1613
1614	sc->sc_rf_write(sc, chain, addr, val);
1615}
1616
1617static void
1618urtwn_r92c_rf_write(struct urtwn_softc *sc, int chain, uint8_t addr,
1619    uint32_t val)
1620{
1621	urtwn_bb_write(sc, R92C_LSSI_PARAM(chain),
1622	    SM(R92C_LSSI_PARAM_ADDR, addr) |
1623	    SM(R92C_LSSI_PARAM_DATA, val));
1624}
1625
1626static void
1627urtwn_r88e_rf_write(struct urtwn_softc *sc, int chain, uint8_t addr,
1628uint32_t val)
1629{
1630	urtwn_bb_write(sc, R92C_LSSI_PARAM(chain),
1631	    SM(R88E_LSSI_PARAM_ADDR, addr) |
1632	    SM(R92C_LSSI_PARAM_DATA, val));
1633}
1634
1635static uint32_t
1636urtwn_rf_read(struct urtwn_softc *sc, int chain, uint8_t addr)
1637{
1638	uint32_t reg[R92C_MAX_CHAINS], val;
1639
1640	reg[0] = urtwn_bb_read(sc, R92C_HSSI_PARAM2(0));
1641	if (chain != 0)
1642		reg[chain] = urtwn_bb_read(sc, R92C_HSSI_PARAM2(chain));
1643
1644	urtwn_bb_write(sc, R92C_HSSI_PARAM2(0),
1645	    reg[0] & ~R92C_HSSI_PARAM2_READ_EDGE);
1646	urtwn_ms_delay(sc);
1647
1648	urtwn_bb_write(sc, R92C_HSSI_PARAM2(chain),
1649	    RW(reg[chain], R92C_HSSI_PARAM2_READ_ADDR, addr) |
1650	    R92C_HSSI_PARAM2_READ_EDGE);
1651	urtwn_ms_delay(sc);
1652
1653	urtwn_bb_write(sc, R92C_HSSI_PARAM2(0),
1654	    reg[0] | R92C_HSSI_PARAM2_READ_EDGE);
1655	urtwn_ms_delay(sc);
1656
1657	if (urtwn_bb_read(sc, R92C_HSSI_PARAM1(chain)) & R92C_HSSI_PARAM1_PI)
1658		val = urtwn_bb_read(sc, R92C_HSPI_READBACK(chain));
1659	else
1660		val = urtwn_bb_read(sc, R92C_LSSI_READBACK(chain));
1661	return (MS(val, R92C_LSSI_READBACK_DATA));
1662}
1663
1664static int
1665urtwn_llt_write(struct urtwn_softc *sc, uint32_t addr, uint32_t data)
1666{
1667	usb_error_t error;
1668	int ntries;
1669
1670	error = urtwn_write_4(sc, R92C_LLT_INIT,
1671	    SM(R92C_LLT_INIT_OP, R92C_LLT_INIT_OP_WRITE) |
1672	    SM(R92C_LLT_INIT_ADDR, addr) |
1673	    SM(R92C_LLT_INIT_DATA, data));
1674	if (error != USB_ERR_NORMAL_COMPLETION)
1675		return (EIO);
1676	/* Wait for write operation to complete. */
1677	for (ntries = 0; ntries < 20; ntries++) {
1678		if (MS(urtwn_read_4(sc, R92C_LLT_INIT), R92C_LLT_INIT_OP) ==
1679		    R92C_LLT_INIT_OP_NO_ACTIVE)
1680			return (0);
1681		urtwn_ms_delay(sc);
1682	}
1683	return (ETIMEDOUT);
1684}
1685
1686static int
1687urtwn_efuse_read_next(struct urtwn_softc *sc, uint8_t *val)
1688{
1689	uint32_t reg;
1690	usb_error_t error;
1691	int ntries;
1692
1693	if (sc->last_rom_addr >= URTWN_EFUSE_MAX_LEN)
1694		return (EFAULT);
1695
1696	reg = urtwn_read_4(sc, R92C_EFUSE_CTRL);
1697	reg = RW(reg, R92C_EFUSE_CTRL_ADDR, sc->last_rom_addr);
1698	reg &= ~R92C_EFUSE_CTRL_VALID;
1699
1700	error = urtwn_write_4(sc, R92C_EFUSE_CTRL, reg);
1701	if (error != USB_ERR_NORMAL_COMPLETION)
1702		return (EIO);
1703	/* Wait for read operation to complete. */
1704	for (ntries = 0; ntries < 100; ntries++) {
1705		reg = urtwn_read_4(sc, R92C_EFUSE_CTRL);
1706		if (reg & R92C_EFUSE_CTRL_VALID)
1707			break;
1708		urtwn_ms_delay(sc);
1709	}
1710	if (ntries == 100) {
1711		device_printf(sc->sc_dev,
1712		    "could not read efuse byte at address 0x%x\n",
1713		    sc->last_rom_addr);
1714		return (ETIMEDOUT);
1715	}
1716
1717	*val = MS(reg, R92C_EFUSE_CTRL_DATA);
1718	sc->last_rom_addr++;
1719
1720	return (0);
1721}
1722
1723static int
1724urtwn_efuse_read_data(struct urtwn_softc *sc, uint8_t *rom, uint8_t off,
1725    uint8_t msk)
1726{
1727	uint8_t reg;
1728	int i, error;
1729
1730	for (i = 0; i < 4; i++) {
1731		if (msk & (1 << i))
1732			continue;
1733		error = urtwn_efuse_read_next(sc, &reg);
1734		if (error != 0)
1735			return (error);
1736		URTWN_DPRINTF(sc, URTWN_DEBUG_ROM, "rom[0x%03X] == 0x%02X\n",
1737		    off * 8 + i * 2, reg);
1738		rom[off * 8 + i * 2 + 0] = reg;
1739
1740		error = urtwn_efuse_read_next(sc, &reg);
1741		if (error != 0)
1742			return (error);
1743		URTWN_DPRINTF(sc, URTWN_DEBUG_ROM, "rom[0x%03X] == 0x%02X\n",
1744		    off * 8 + i * 2 + 1, reg);
1745		rom[off * 8 + i * 2 + 1] = reg;
1746	}
1747
1748	return (0);
1749}
1750
1751#ifdef USB_DEBUG
1752static void
1753urtwn_dump_rom_contents(struct urtwn_softc *sc, uint8_t *rom, uint16_t size)
1754{
1755	int i;
1756
1757	/* Dump ROM contents. */
1758	device_printf(sc->sc_dev, "%s:", __func__);
1759	for (i = 0; i < size; i++) {
1760		if (i % 32 == 0)
1761			printf("\n%03X: ", i);
1762		else if (i % 4 == 0)
1763			printf(" ");
1764
1765		printf("%02X", rom[i]);
1766	}
1767	printf("\n");
1768}
1769#endif
1770
1771static int
1772urtwn_efuse_read(struct urtwn_softc *sc, uint8_t *rom, uint16_t size)
1773{
1774#define URTWN_CHK(res) do {	\
1775	if ((error = res) != 0)	\
1776		goto end;	\
1777} while(0)
1778	uint8_t msk, off, reg;
1779	int error;
1780
1781	URTWN_CHK(urtwn_efuse_switch_power(sc));
1782
1783	/* Read full ROM image. */
1784	sc->last_rom_addr = 0;
1785	memset(rom, 0xff, size);
1786
1787	URTWN_CHK(urtwn_efuse_read_next(sc, &reg));
1788	while (reg != 0xff) {
1789		/* check for extended header */
1790		if ((sc->chip & URTWN_CHIP_88E) && (reg & 0x1f) == 0x0f) {
1791			off = reg >> 5;
1792			URTWN_CHK(urtwn_efuse_read_next(sc, &reg));
1793
1794			if ((reg & 0x0f) != 0x0f)
1795				off = ((reg & 0xf0) >> 1) | off;
1796			else
1797				continue;
1798		} else
1799			off = reg >> 4;
1800		msk = reg & 0xf;
1801
1802		URTWN_CHK(urtwn_efuse_read_data(sc, rom, off, msk));
1803		URTWN_CHK(urtwn_efuse_read_next(sc, &reg));
1804	}
1805
1806end:
1807
1808#ifdef USB_DEBUG
1809	if (sc->sc_debug & URTWN_DEBUG_ROM)
1810		urtwn_dump_rom_contents(sc, rom, size);
1811#endif
1812
1813	urtwn_write_1(sc, R92C_EFUSE_ACCESS, R92C_EFUSE_ACCESS_OFF);
1814
1815	if (error != 0) {
1816		device_printf(sc->sc_dev, "%s: error while reading ROM\n",
1817		    __func__);
1818	}
1819
1820	return (error);
1821#undef URTWN_CHK
1822}
1823
1824static int
1825urtwn_efuse_switch_power(struct urtwn_softc *sc)
1826{
1827	usb_error_t error;
1828	uint32_t reg;
1829
1830	error = urtwn_write_1(sc, R92C_EFUSE_ACCESS, R92C_EFUSE_ACCESS_ON);
1831	if (error != USB_ERR_NORMAL_COMPLETION)
1832		return (EIO);
1833
1834	reg = urtwn_read_2(sc, R92C_SYS_ISO_CTRL);
1835	if (!(reg & R92C_SYS_ISO_CTRL_PWC_EV12V)) {
1836		error = urtwn_write_2(sc, R92C_SYS_ISO_CTRL,
1837		    reg | R92C_SYS_ISO_CTRL_PWC_EV12V);
1838		if (error != USB_ERR_NORMAL_COMPLETION)
1839			return (EIO);
1840	}
1841	reg = urtwn_read_2(sc, R92C_SYS_FUNC_EN);
1842	if (!(reg & R92C_SYS_FUNC_EN_ELDR)) {
1843		error = urtwn_write_2(sc, R92C_SYS_FUNC_EN,
1844		    reg | R92C_SYS_FUNC_EN_ELDR);
1845		if (error != USB_ERR_NORMAL_COMPLETION)
1846			return (EIO);
1847	}
1848	reg = urtwn_read_2(sc, R92C_SYS_CLKR);
1849	if ((reg & (R92C_SYS_CLKR_LOADER_EN | R92C_SYS_CLKR_ANA8M)) !=
1850	    (R92C_SYS_CLKR_LOADER_EN | R92C_SYS_CLKR_ANA8M)) {
1851		error = urtwn_write_2(sc, R92C_SYS_CLKR,
1852		    reg | R92C_SYS_CLKR_LOADER_EN | R92C_SYS_CLKR_ANA8M);
1853		if (error != USB_ERR_NORMAL_COMPLETION)
1854			return (EIO);
1855	}
1856
1857	return (0);
1858}
1859
1860static int
1861urtwn_read_chipid(struct urtwn_softc *sc)
1862{
1863	uint32_t reg;
1864
1865	if (sc->chip & URTWN_CHIP_88E)
1866		return (0);
1867
1868	reg = urtwn_read_4(sc, R92C_SYS_CFG);
1869	if (reg & R92C_SYS_CFG_TRP_VAUX_EN)
1870		return (EIO);
1871
1872	if (reg & R92C_SYS_CFG_TYPE_92C) {
1873		sc->chip |= URTWN_CHIP_92C;
1874		/* Check if it is a castrated 8192C. */
1875		if (MS(urtwn_read_4(sc, R92C_HPON_FSM),
1876		    R92C_HPON_FSM_CHIP_BONDING_ID) ==
1877		    R92C_HPON_FSM_CHIP_BONDING_ID_92C_1T2R)
1878			sc->chip |= URTWN_CHIP_92C_1T2R;
1879	}
1880	if (reg & R92C_SYS_CFG_VENDOR_UMC) {
1881		sc->chip |= URTWN_CHIP_UMC;
1882		if (MS(reg, R92C_SYS_CFG_CHIP_VER_RTL) == 0)
1883			sc->chip |= URTWN_CHIP_UMC_A_CUT;
1884	}
1885	return (0);
1886}
1887
1888static int
1889urtwn_read_rom(struct urtwn_softc *sc)
1890{
1891	struct r92c_rom *rom = &sc->rom.r92c_rom;
1892	int error;
1893
1894	/* Read full ROM image. */
1895	error = urtwn_efuse_read(sc, (uint8_t *)rom, sizeof(*rom));
1896	if (error != 0)
1897		return (error);
1898
1899	/* XXX Weird but this is what the vendor driver does. */
1900	sc->last_rom_addr = 0x1fa;
1901	error = urtwn_efuse_read_next(sc, &sc->pa_setting);
1902	if (error != 0)
1903		return (error);
1904	URTWN_DPRINTF(sc, URTWN_DEBUG_ROM, "%s: PA setting=0x%x\n", __func__,
1905	    sc->pa_setting);
1906
1907	sc->board_type = MS(rom->rf_opt1, R92C_ROM_RF1_BOARD_TYPE);
1908
1909	sc->regulatory = MS(rom->rf_opt1, R92C_ROM_RF1_REGULATORY);
1910	URTWN_DPRINTF(sc, URTWN_DEBUG_ROM, "%s: regulatory type=%d\n",
1911	    __func__, sc->regulatory);
1912	IEEE80211_ADDR_COPY(sc->sc_ic.ic_macaddr, rom->macaddr);
1913
1914	sc->sc_rf_write = urtwn_r92c_rf_write;
1915	sc->sc_power_on = urtwn_r92c_power_on;
1916	sc->sc_power_off = urtwn_r92c_power_off;
1917
1918	return (0);
1919}
1920
1921static int
1922urtwn_r88e_read_rom(struct urtwn_softc *sc)
1923{
1924	struct r88e_rom *rom = &sc->rom.r88e_rom;
1925	int error;
1926
1927	error = urtwn_efuse_read(sc, (uint8_t *)rom, sizeof(sc->rom.r88e_rom));
1928	if (error != 0)
1929		return (error);
1930
1931	sc->bw20_tx_pwr_diff = (rom->tx_pwr_diff >> 4);
1932	if (sc->bw20_tx_pwr_diff & 0x08)
1933		sc->bw20_tx_pwr_diff |= 0xf0;
1934	sc->ofdm_tx_pwr_diff = (rom->tx_pwr_diff & 0xf);
1935	if (sc->ofdm_tx_pwr_diff & 0x08)
1936		sc->ofdm_tx_pwr_diff |= 0xf0;
1937	sc->regulatory = MS(rom->rf_board_opt, R92C_ROM_RF1_REGULATORY);
1938	URTWN_DPRINTF(sc, URTWN_DEBUG_ROM, "%s: regulatory type %d\n",
1939	    __func__,sc->regulatory);
1940	IEEE80211_ADDR_COPY(sc->sc_ic.ic_macaddr, rom->macaddr);
1941
1942	sc->sc_rf_write = urtwn_r88e_rf_write;
1943	sc->sc_power_on = urtwn_r88e_power_on;
1944	sc->sc_power_off = urtwn_r88e_power_off;
1945
1946	return (0);
1947}
1948
1949static __inline uint8_t
1950rate2ridx(uint8_t rate)
1951{
1952	if (rate & IEEE80211_RATE_MCS) {
1953		/* 11n rates start at idx 12 */
1954		return ((rate & 0xf) + 12);
1955	}
1956	switch (rate) {
1957	/* 11g */
1958	case 12:	return 4;
1959	case 18:	return 5;
1960	case 24:	return 6;
1961	case 36:	return 7;
1962	case 48:	return 8;
1963	case 72:	return 9;
1964	case 96:	return 10;
1965	case 108:	return 11;
1966	/* 11b */
1967	case 2:		return 0;
1968	case 4:		return 1;
1969	case 11:	return 2;
1970	case 22:	return 3;
1971	default:	return URTWN_RIDX_UNKNOWN;
1972	}
1973}
1974
1975/*
1976 * Initialize rate adaptation in firmware.
1977 */
1978static int
1979urtwn_ra_init(struct urtwn_softc *sc)
1980{
1981	struct ieee80211com *ic = &sc->sc_ic;
1982	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
1983	struct ieee80211_node *ni;
1984	struct ieee80211_rateset *rs, *rs_ht;
1985	struct r92c_fw_cmd_macid_cfg cmd;
1986	uint32_t rates, basicrates;
1987	uint8_t mode, ridx;
1988	int maxrate, maxbasicrate, error, i;
1989
1990	ni = ieee80211_ref_node(vap->iv_bss);
1991	rs = &ni->ni_rates;
1992	rs_ht = (struct ieee80211_rateset *) &ni->ni_htrates;
1993
1994	/* Get normal and basic rates mask. */
1995	rates = basicrates = 0;
1996	maxrate = maxbasicrate = 0;
1997
1998	/* This is for 11bg */
1999	for (i = 0; i < rs->rs_nrates; i++) {
2000		/* Convert 802.11 rate to HW rate index. */
2001		ridx = rate2ridx(IEEE80211_RV(rs->rs_rates[i]));
2002		if (ridx == URTWN_RIDX_UNKNOWN)	/* Unknown rate, skip. */
2003			continue;
2004		rates |= 1 << ridx;
2005		if (ridx > maxrate)
2006			maxrate = ridx;
2007		if (rs->rs_rates[i] & IEEE80211_RATE_BASIC) {
2008			basicrates |= 1 << ridx;
2009			if (ridx > maxbasicrate)
2010				maxbasicrate = ridx;
2011		}
2012	}
2013
2014	/* If we're doing 11n, enable 11n rates */
2015	if (ni->ni_flags & IEEE80211_NODE_HT) {
2016		for (i = 0; i < rs_ht->rs_nrates; i++) {
2017			if ((rs_ht->rs_rates[i] & 0x7f) > 0xf)
2018				continue;
2019			/* 11n rates start at index 12 */
2020			ridx = ((rs_ht->rs_rates[i]) & 0xf) + 12;
2021			rates |= (1 << ridx);
2022
2023			/* Guard against the rate table being oddly ordered */
2024			if (ridx > maxrate)
2025				maxrate = ridx;
2026		}
2027	}
2028
2029#if 0
2030	if (ic->ic_curmode == IEEE80211_MODE_11NG)
2031		raid = R92C_RAID_11GN;
2032#endif
2033	/* NB: group addressed frames are done at 11bg rates for now */
2034	if (ic->ic_curmode == IEEE80211_MODE_11B)
2035		mode = R92C_RAID_11B;
2036	else
2037		mode = R92C_RAID_11BG;
2038	/* XXX misleading 'mode' value here for unicast frames */
2039	URTWN_DPRINTF(sc, URTWN_DEBUG_RA,
2040	    "%s: mode 0x%x, rates 0x%08x, basicrates 0x%08x\n", __func__,
2041	    mode, rates, basicrates);
2042
2043	/* Set rates mask for group addressed frames. */
2044	cmd.macid = URTWN_MACID_BC | URTWN_MACID_VALID;
2045	cmd.mask = htole32(mode << 28 | basicrates);
2046	error = urtwn_fw_cmd(sc, R92C_CMD_MACID_CONFIG, &cmd, sizeof(cmd));
2047	if (error != 0) {
2048		ieee80211_free_node(ni);
2049		device_printf(sc->sc_dev,
2050		    "could not add broadcast station\n");
2051		return (error);
2052	}
2053
2054	/* Set initial MRR rate. */
2055	URTWN_DPRINTF(sc, URTWN_DEBUG_RA, "%s: maxbasicrate %d\n", __func__,
2056	    maxbasicrate);
2057	urtwn_write_1(sc, R92C_INIDATA_RATE_SEL(URTWN_MACID_BC),
2058	    maxbasicrate);
2059
2060	/* Set rates mask for unicast frames. */
2061	if (ni->ni_flags & IEEE80211_NODE_HT)
2062		mode = R92C_RAID_11GN;
2063	else if (ic->ic_curmode == IEEE80211_MODE_11B)
2064		mode = R92C_RAID_11B;
2065	else
2066		mode = R92C_RAID_11BG;
2067	cmd.macid = URTWN_MACID_BSS | URTWN_MACID_VALID;
2068	cmd.mask = htole32(mode << 28 | rates);
2069	error = urtwn_fw_cmd(sc, R92C_CMD_MACID_CONFIG, &cmd, sizeof(cmd));
2070	if (error != 0) {
2071		ieee80211_free_node(ni);
2072		device_printf(sc->sc_dev, "could not add BSS station\n");
2073		return (error);
2074	}
2075	/* Set initial MRR rate. */
2076	URTWN_DPRINTF(sc, URTWN_DEBUG_RA, "%s: maxrate %d\n", __func__,
2077	    maxrate);
2078	urtwn_write_1(sc, R92C_INIDATA_RATE_SEL(URTWN_MACID_BSS),
2079	    maxrate);
2080
2081	/* Indicate highest supported rate. */
2082	if (ni->ni_flags & IEEE80211_NODE_HT)
2083		ni->ni_txrate = rs_ht->rs_rates[rs_ht->rs_nrates - 1]
2084		    | IEEE80211_RATE_MCS;
2085	else
2086		ni->ni_txrate = rs->rs_rates[rs->rs_nrates - 1];
2087	ieee80211_free_node(ni);
2088
2089	return (0);
2090}
2091
2092static void
2093urtwn_init_beacon(struct urtwn_softc *sc, struct urtwn_vap *uvp)
2094{
2095	struct r92c_tx_desc *txd = &uvp->bcn_desc;
2096
2097	txd->txdw0 = htole32(
2098	    SM(R92C_TXDW0_OFFSET, sizeof(*txd)) | R92C_TXDW0_BMCAST |
2099	    R92C_TXDW0_OWN | R92C_TXDW0_FSG | R92C_TXDW0_LSG);
2100	txd->txdw1 = htole32(
2101	    SM(R92C_TXDW1_QSEL, R92C_TXDW1_QSEL_BEACON) |
2102	    SM(R92C_TXDW1_RAID, R92C_RAID_11B));
2103
2104	if (sc->chip & URTWN_CHIP_88E) {
2105		txd->txdw1 |= htole32(SM(R88E_TXDW1_MACID, URTWN_MACID_BC));
2106		txd->txdseq |= htole16(R88E_TXDSEQ_HWSEQ_EN);
2107	} else {
2108		txd->txdw1 |= htole32(SM(R92C_TXDW1_MACID, URTWN_MACID_BC));
2109		txd->txdw4 |= htole32(R92C_TXDW4_HWSEQ_EN);
2110	}
2111
2112	txd->txdw4 = htole32(R92C_TXDW4_DRVRATE);
2113	txd->txdw5 = htole32(SM(R92C_TXDW5_DATARATE, URTWN_RIDX_CCK1));
2114}
2115
2116static int
2117urtwn_setup_beacon(struct urtwn_softc *sc, struct ieee80211_node *ni)
2118{
2119 	struct ieee80211vap *vap = ni->ni_vap;
2120	struct urtwn_vap *uvp = URTWN_VAP(vap);
2121	struct mbuf *m;
2122	int error;
2123
2124	URTWN_ASSERT_LOCKED(sc);
2125
2126	if (ni->ni_chan == IEEE80211_CHAN_ANYC)
2127		return (EINVAL);
2128
2129	m = ieee80211_beacon_alloc(ni);
2130	if (m == NULL) {
2131		device_printf(sc->sc_dev,
2132		    "%s: could not allocate beacon frame\n", __func__);
2133		return (ENOMEM);
2134	}
2135
2136	if (uvp->bcn_mbuf != NULL)
2137		m_freem(uvp->bcn_mbuf);
2138
2139	uvp->bcn_mbuf = m;
2140
2141	if ((error = urtwn_tx_beacon(sc, uvp)) != 0)
2142		return (error);
2143
2144	/* XXX bcnq stuck workaround */
2145	if ((error = urtwn_tx_beacon(sc, uvp)) != 0)
2146		return (error);
2147
2148	URTWN_DPRINTF(sc, URTWN_DEBUG_BEACON, "%s: beacon was %srecognized\n",
2149	    __func__, urtwn_read_1(sc, R92C_TDECTRL + 2) &
2150	    (R92C_TDECTRL_BCN_VALID >> 16) ? "" : "not ");
2151
2152	return (0);
2153}
2154
2155static void
2156urtwn_update_beacon(struct ieee80211vap *vap, int item)
2157{
2158	struct urtwn_softc *sc = vap->iv_ic->ic_softc;
2159	struct urtwn_vap *uvp = URTWN_VAP(vap);
2160	struct ieee80211_beacon_offsets *bo = &vap->iv_bcn_off;
2161	struct ieee80211_node *ni = vap->iv_bss;
2162	int mcast = 0;
2163
2164	URTWN_LOCK(sc);
2165	if (uvp->bcn_mbuf == NULL) {
2166		uvp->bcn_mbuf = ieee80211_beacon_alloc(ni);
2167		if (uvp->bcn_mbuf == NULL) {
2168			device_printf(sc->sc_dev,
2169			    "%s: could not allocate beacon frame\n", __func__);
2170			URTWN_UNLOCK(sc);
2171			return;
2172		}
2173	}
2174	URTWN_UNLOCK(sc);
2175
2176	if (item == IEEE80211_BEACON_TIM)
2177		mcast = 1;	/* XXX */
2178
2179	setbit(bo->bo_flags, item);
2180	ieee80211_beacon_update(ni, uvp->bcn_mbuf, mcast);
2181
2182	URTWN_LOCK(sc);
2183	urtwn_tx_beacon(sc, uvp);
2184	URTWN_UNLOCK(sc);
2185}
2186
2187/*
2188 * Push a beacon frame into the chip. Beacon will
2189 * be repeated by the chip every R92C_BCN_INTERVAL.
2190 */
2191static int
2192urtwn_tx_beacon(struct urtwn_softc *sc, struct urtwn_vap *uvp)
2193{
2194	struct r92c_tx_desc *desc = &uvp->bcn_desc;
2195	struct urtwn_data *bf;
2196
2197	URTWN_ASSERT_LOCKED(sc);
2198
2199	bf = urtwn_getbuf(sc);
2200	if (bf == NULL)
2201		return (ENOMEM);
2202
2203	memcpy(bf->buf, desc, sizeof(*desc));
2204	urtwn_tx_start(sc, uvp->bcn_mbuf, IEEE80211_FC0_TYPE_MGT, bf);
2205
2206	sc->sc_txtimer = 5;
2207	callout_reset(&sc->sc_watchdog_ch, hz, urtwn_watchdog, sc);
2208
2209	return (0);
2210}
2211
2212static int
2213urtwn_key_alloc(struct ieee80211vap *vap, struct ieee80211_key *k,
2214    ieee80211_keyix *keyix, ieee80211_keyix *rxkeyix)
2215{
2216	struct urtwn_softc *sc = vap->iv_ic->ic_softc;
2217	uint8_t i;
2218
2219	if (!(&vap->iv_nw_keys[0] <= k &&
2220	     k < &vap->iv_nw_keys[IEEE80211_WEP_NKID])) {
2221		if (!(k->wk_flags & IEEE80211_KEY_SWCRYPT)) {
2222			URTWN_LOCK(sc);
2223			/*
2224			 * First 4 slots for group keys,
2225			 * what is left - for pairwise.
2226			 * XXX incompatible with IBSS RSN.
2227			 */
2228			for (i = IEEE80211_WEP_NKID;
2229			     i < R92C_CAM_ENTRY_COUNT; i++) {
2230				if ((sc->keys_bmap & (1 << i)) == 0) {
2231					sc->keys_bmap |= 1 << i;
2232					*keyix = i;
2233					break;
2234				}
2235			}
2236			URTWN_UNLOCK(sc);
2237			if (i == R92C_CAM_ENTRY_COUNT) {
2238				device_printf(sc->sc_dev,
2239				    "%s: no free space in the key table\n",
2240				    __func__);
2241				return 0;
2242			}
2243		} else
2244			*keyix = 0;
2245	} else {
2246		*keyix = k - vap->iv_nw_keys;
2247	}
2248	*rxkeyix = *keyix;
2249	return 1;
2250}
2251
2252static void
2253urtwn_key_set_cb(struct urtwn_softc *sc, union sec_param *data)
2254{
2255	struct ieee80211_key *k = &data->key;
2256	uint8_t algo, keyid;
2257	int i, error;
2258
2259	if (k->wk_keyix < IEEE80211_WEP_NKID)
2260		keyid = k->wk_keyix;
2261	else
2262		keyid = 0;
2263
2264	/* Map net80211 cipher to HW crypto algorithm. */
2265	switch (k->wk_cipher->ic_cipher) {
2266	case IEEE80211_CIPHER_WEP:
2267		if (k->wk_keylen < 8)
2268			algo = R92C_CAM_ALGO_WEP40;
2269		else
2270			algo = R92C_CAM_ALGO_WEP104;
2271		break;
2272	case IEEE80211_CIPHER_TKIP:
2273		algo = R92C_CAM_ALGO_TKIP;
2274		break;
2275	case IEEE80211_CIPHER_AES_CCM:
2276		algo = R92C_CAM_ALGO_AES;
2277		break;
2278	default:
2279		device_printf(sc->sc_dev, "%s: undefined cipher %d\n",
2280		    __func__, k->wk_cipher->ic_cipher);
2281		return;
2282	}
2283
2284	URTWN_DPRINTF(sc, URTWN_DEBUG_KEY,
2285	    "%s: keyix %d, keyid %d, algo %d/%d, flags %04X, len %d, "
2286	    "macaddr %s\n", __func__, k->wk_keyix, keyid,
2287	    k->wk_cipher->ic_cipher, algo, k->wk_flags, k->wk_keylen,
2288	    ether_sprintf(k->wk_macaddr));
2289
2290	/* Write key. */
2291	for (i = 0; i < 4; i++) {
2292		error = urtwn_cam_write(sc, R92C_CAM_KEY(k->wk_keyix, i),
2293		    le32dec(&k->wk_key[i * 4]));
2294		if (error != 0)
2295			goto fail;
2296	}
2297
2298	/* Write CTL0 last since that will validate the CAM entry. */
2299	error = urtwn_cam_write(sc, R92C_CAM_CTL1(k->wk_keyix),
2300	    le32dec(&k->wk_macaddr[2]));
2301	if (error != 0)
2302		goto fail;
2303	error = urtwn_cam_write(sc, R92C_CAM_CTL0(k->wk_keyix),
2304	    SM(R92C_CAM_ALGO, algo) |
2305	    SM(R92C_CAM_KEYID, keyid) |
2306	    SM(R92C_CAM_MACLO, le16dec(&k->wk_macaddr[0])) |
2307	    R92C_CAM_VALID);
2308	if (error != 0)
2309		goto fail;
2310
2311	return;
2312
2313fail:
2314	device_printf(sc->sc_dev, "%s fails, error %d\n", __func__, error);
2315}
2316
2317static void
2318urtwn_key_del_cb(struct urtwn_softc *sc, union sec_param *data)
2319{
2320	struct ieee80211_key *k = &data->key;
2321	int i;
2322
2323	URTWN_DPRINTF(sc, URTWN_DEBUG_KEY,
2324	    "%s: keyix %d, flags %04X, macaddr %s\n", __func__,
2325	    k->wk_keyix, k->wk_flags, ether_sprintf(k->wk_macaddr));
2326
2327	urtwn_cam_write(sc, R92C_CAM_CTL0(k->wk_keyix), 0);
2328	urtwn_cam_write(sc, R92C_CAM_CTL1(k->wk_keyix), 0);
2329
2330	/* Clear key. */
2331	for (i = 0; i < 4; i++)
2332		urtwn_cam_write(sc, R92C_CAM_KEY(k->wk_keyix, i), 0);
2333	sc->keys_bmap &= ~(1 << k->wk_keyix);
2334}
2335
2336static int
2337urtwn_key_set(struct ieee80211vap *vap, const struct ieee80211_key *k)
2338{
2339	struct urtwn_softc *sc = vap->iv_ic->ic_softc;
2340
2341	if (k->wk_flags & IEEE80211_KEY_SWCRYPT) {
2342		/* Not for us. */
2343		return (1);
2344	}
2345
2346	return (!urtwn_cmd_sleepable(sc, k, sizeof(*k), urtwn_key_set_cb));
2347}
2348
2349static int
2350urtwn_key_delete(struct ieee80211vap *vap, const struct ieee80211_key *k)
2351{
2352	struct urtwn_softc *sc = vap->iv_ic->ic_softc;
2353
2354	if (k->wk_flags & IEEE80211_KEY_SWCRYPT) {
2355		/* Not for us. */
2356		return (1);
2357	}
2358
2359	return (!urtwn_cmd_sleepable(sc, k, sizeof(*k), urtwn_key_del_cb));
2360}
2361
2362static void
2363urtwn_tsf_task_adhoc(void *arg, int pending)
2364{
2365	struct ieee80211vap *vap = arg;
2366	struct urtwn_softc *sc = vap->iv_ic->ic_softc;
2367	struct ieee80211_node *ni;
2368	uint32_t reg;
2369
2370	URTWN_LOCK(sc);
2371	ni = ieee80211_ref_node(vap->iv_bss);
2372	reg = urtwn_read_1(sc, R92C_BCN_CTRL);
2373
2374	/* Accept beacons with the same BSSID. */
2375	urtwn_set_rx_bssid_all(sc, 0);
2376
2377	/* Enable synchronization. */
2378	reg &= ~R92C_BCN_CTRL_DIS_TSF_UDT0;
2379	urtwn_write_1(sc, R92C_BCN_CTRL, reg);
2380
2381	/* Synchronize. */
2382	usb_pause_mtx(&sc->sc_mtx, hz * ni->ni_intval * 5 / 1000);
2383
2384	/* Disable synchronization. */
2385	reg |= R92C_BCN_CTRL_DIS_TSF_UDT0;
2386	urtwn_write_1(sc, R92C_BCN_CTRL, reg);
2387
2388	/* Remove beacon filter. */
2389	urtwn_set_rx_bssid_all(sc, 1);
2390
2391	/* Enable beaconing. */
2392	urtwn_write_1(sc, R92C_MBID_NUM,
2393	    urtwn_read_1(sc, R92C_MBID_NUM) | R92C_MBID_TXBCN_RPT0);
2394	reg |= R92C_BCN_CTRL_EN_BCN;
2395
2396	urtwn_write_1(sc, R92C_BCN_CTRL, reg);
2397	ieee80211_free_node(ni);
2398	URTWN_UNLOCK(sc);
2399}
2400
2401static void
2402urtwn_tsf_sync_enable(struct urtwn_softc *sc, struct ieee80211vap *vap)
2403{
2404	struct ieee80211com *ic = &sc->sc_ic;
2405	struct urtwn_vap *uvp = URTWN_VAP(vap);
2406
2407	/* Reset TSF. */
2408	urtwn_write_1(sc, R92C_DUAL_TSF_RST, R92C_DUAL_TSF_RST0);
2409
2410	switch (vap->iv_opmode) {
2411	case IEEE80211_M_STA:
2412		/* Enable TSF synchronization. */
2413		urtwn_write_1(sc, R92C_BCN_CTRL,
2414		    urtwn_read_1(sc, R92C_BCN_CTRL) &
2415		    ~R92C_BCN_CTRL_DIS_TSF_UDT0);
2416		break;
2417	case IEEE80211_M_IBSS:
2418		ieee80211_runtask(ic, &uvp->tsf_task_adhoc);
2419		break;
2420	case IEEE80211_M_HOSTAP:
2421		/* Enable beaconing. */
2422		urtwn_write_1(sc, R92C_MBID_NUM,
2423		    urtwn_read_1(sc, R92C_MBID_NUM) | R92C_MBID_TXBCN_RPT0);
2424		urtwn_write_1(sc, R92C_BCN_CTRL,
2425		    urtwn_read_1(sc, R92C_BCN_CTRL) | R92C_BCN_CTRL_EN_BCN);
2426		break;
2427	default:
2428		device_printf(sc->sc_dev, "undefined opmode %d\n",
2429		    vap->iv_opmode);
2430		return;
2431	}
2432}
2433
2434static void
2435urtwn_get_tsf(struct urtwn_softc *sc, uint64_t *buf)
2436{
2437	urtwn_read_region_1(sc, R92C_TSFTR, (uint8_t *)buf, sizeof(*buf));
2438}
2439
2440static void
2441urtwn_set_led(struct urtwn_softc *sc, int led, int on)
2442{
2443	uint8_t reg;
2444
2445	if (led == URTWN_LED_LINK) {
2446		if (sc->chip & URTWN_CHIP_88E) {
2447			reg = urtwn_read_1(sc, R92C_LEDCFG2) & 0xf0;
2448			urtwn_write_1(sc, R92C_LEDCFG2, reg | 0x60);
2449			if (!on) {
2450				reg = urtwn_read_1(sc, R92C_LEDCFG2) & 0x90;
2451				urtwn_write_1(sc, R92C_LEDCFG2,
2452				    reg | R92C_LEDCFG0_DIS);
2453				urtwn_write_1(sc, R92C_MAC_PINMUX_CFG,
2454				    urtwn_read_1(sc, R92C_MAC_PINMUX_CFG) &
2455				    0xfe);
2456			}
2457		} else {
2458			reg = urtwn_read_1(sc, R92C_LEDCFG0) & 0x70;
2459			if (!on)
2460				reg |= R92C_LEDCFG0_DIS;
2461			urtwn_write_1(sc, R92C_LEDCFG0, reg);
2462		}
2463		sc->ledlink = on;       /* Save LED state. */
2464	}
2465}
2466
2467static void
2468urtwn_set_mode(struct urtwn_softc *sc, uint8_t mode)
2469{
2470	uint8_t reg;
2471
2472	reg = urtwn_read_1(sc, R92C_MSR);
2473	reg = (reg & ~R92C_MSR_MASK) | mode;
2474	urtwn_write_1(sc, R92C_MSR, reg);
2475}
2476
2477static void
2478urtwn_ibss_recv_mgmt(struct ieee80211_node *ni, struct mbuf *m, int subtype,
2479    const struct ieee80211_rx_stats *rxs,
2480    int rssi, int nf)
2481{
2482	struct ieee80211vap *vap = ni->ni_vap;
2483	struct urtwn_softc *sc = vap->iv_ic->ic_softc;
2484	struct urtwn_vap *uvp = URTWN_VAP(vap);
2485	uint64_t ni_tstamp, curr_tstamp;
2486
2487	uvp->recv_mgmt(ni, m, subtype, rxs, rssi, nf);
2488
2489	if (vap->iv_state == IEEE80211_S_RUN &&
2490	    (subtype == IEEE80211_FC0_SUBTYPE_BEACON ||
2491	    subtype == IEEE80211_FC0_SUBTYPE_PROBE_RESP)) {
2492		ni_tstamp = le64toh(ni->ni_tstamp.tsf);
2493		URTWN_LOCK(sc);
2494		urtwn_get_tsf(sc, &curr_tstamp);
2495		URTWN_UNLOCK(sc);
2496		curr_tstamp = le64toh(curr_tstamp);
2497
2498		if (ni_tstamp >= curr_tstamp)
2499			(void) ieee80211_ibss_merge(ni);
2500	}
2501}
2502
2503static int
2504urtwn_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
2505{
2506	struct urtwn_vap *uvp = URTWN_VAP(vap);
2507	struct ieee80211com *ic = vap->iv_ic;
2508	struct urtwn_softc *sc = ic->ic_softc;
2509	struct ieee80211_node *ni;
2510	enum ieee80211_state ostate;
2511	uint32_t reg;
2512	uint8_t mode;
2513	int error = 0;
2514
2515	ostate = vap->iv_state;
2516	URTWN_DPRINTF(sc, URTWN_DEBUG_STATE, "%s -> %s\n",
2517	    ieee80211_state_name[ostate], ieee80211_state_name[nstate]);
2518
2519	IEEE80211_UNLOCK(ic);
2520	URTWN_LOCK(sc);
2521	callout_stop(&sc->sc_watchdog_ch);
2522
2523	if (ostate == IEEE80211_S_RUN) {
2524		/* Stop calibration. */
2525		callout_stop(&sc->sc_calib_to);
2526
2527		/* Turn link LED off. */
2528		urtwn_set_led(sc, URTWN_LED_LINK, 0);
2529
2530		/* Set media status to 'No Link'. */
2531		urtwn_set_mode(sc, R92C_MSR_NOLINK);
2532
2533		/* Stop Rx of data frames. */
2534		urtwn_write_2(sc, R92C_RXFLTMAP2, 0);
2535
2536		/* Disable TSF synchronization. */
2537		urtwn_write_1(sc, R92C_BCN_CTRL,
2538		    (urtwn_read_1(sc, R92C_BCN_CTRL) & ~R92C_BCN_CTRL_EN_BCN) |
2539		    R92C_BCN_CTRL_DIS_TSF_UDT0);
2540
2541		/* Disable beaconing. */
2542		urtwn_write_1(sc, R92C_MBID_NUM,
2543		    urtwn_read_1(sc, R92C_MBID_NUM) & ~R92C_MBID_TXBCN_RPT0);
2544
2545		/* Reset TSF. */
2546		urtwn_write_1(sc, R92C_DUAL_TSF_RST, R92C_DUAL_TSF_RST0);
2547
2548		/* Reset EDCA parameters. */
2549		urtwn_write_4(sc, R92C_EDCA_VO_PARAM, 0x002f3217);
2550		urtwn_write_4(sc, R92C_EDCA_VI_PARAM, 0x005e4317);
2551		urtwn_write_4(sc, R92C_EDCA_BE_PARAM, 0x00105320);
2552		urtwn_write_4(sc, R92C_EDCA_BK_PARAM, 0x0000a444);
2553	}
2554
2555	switch (nstate) {
2556	case IEEE80211_S_INIT:
2557		/* Turn link LED off. */
2558		urtwn_set_led(sc, URTWN_LED_LINK, 0);
2559		break;
2560	case IEEE80211_S_SCAN:
2561		/* Pause AC Tx queues. */
2562		urtwn_write_1(sc, R92C_TXPAUSE,
2563		    urtwn_read_1(sc, R92C_TXPAUSE) | R92C_TX_QUEUE_AC);
2564		break;
2565	case IEEE80211_S_AUTH:
2566		urtwn_set_chan(sc, ic->ic_curchan, NULL);
2567		break;
2568	case IEEE80211_S_RUN:
2569		if (vap->iv_opmode == IEEE80211_M_MONITOR) {
2570			/* Turn link LED on. */
2571			urtwn_set_led(sc, URTWN_LED_LINK, 1);
2572			break;
2573		}
2574
2575		ni = ieee80211_ref_node(vap->iv_bss);
2576
2577		if (ic->ic_bsschan == IEEE80211_CHAN_ANYC ||
2578		    ni->ni_chan == IEEE80211_CHAN_ANYC) {
2579			device_printf(sc->sc_dev,
2580			    "%s: could not move to RUN state\n", __func__);
2581			error = EINVAL;
2582			goto end_run;
2583		}
2584
2585		switch (vap->iv_opmode) {
2586		case IEEE80211_M_STA:
2587			mode = R92C_MSR_INFRA;
2588			break;
2589		case IEEE80211_M_IBSS:
2590			mode = R92C_MSR_ADHOC;
2591			break;
2592		case IEEE80211_M_HOSTAP:
2593			mode = R92C_MSR_AP;
2594			break;
2595		default:
2596			device_printf(sc->sc_dev, "undefined opmode %d\n",
2597			    vap->iv_opmode);
2598			error = EINVAL;
2599			goto end_run;
2600		}
2601
2602		/* Set media status to 'Associated'. */
2603		urtwn_set_mode(sc, mode);
2604
2605		/* Set BSSID. */
2606		urtwn_write_4(sc, R92C_BSSID + 0, le32dec(&ni->ni_bssid[0]));
2607		urtwn_write_4(sc, R92C_BSSID + 4, le16dec(&ni->ni_bssid[4]));
2608
2609		if (ic->ic_curmode == IEEE80211_MODE_11B)
2610			urtwn_write_1(sc, R92C_INIRTS_RATE_SEL, 0);
2611		else	/* 802.11b/g */
2612			urtwn_write_1(sc, R92C_INIRTS_RATE_SEL, 3);
2613
2614		/* Enable Rx of data frames. */
2615		urtwn_write_2(sc, R92C_RXFLTMAP2, 0xffff);
2616
2617		/* Flush all AC queues. */
2618		urtwn_write_1(sc, R92C_TXPAUSE, 0);
2619
2620		/* Set beacon interval. */
2621		urtwn_write_2(sc, R92C_BCN_INTERVAL, ni->ni_intval);
2622
2623		/* Allow Rx from our BSSID only. */
2624		if (ic->ic_promisc == 0) {
2625			reg = urtwn_read_4(sc, R92C_RCR);
2626
2627			if (vap->iv_opmode != IEEE80211_M_HOSTAP)
2628				reg |= R92C_RCR_CBSSID_DATA;
2629			if (vap->iv_opmode != IEEE80211_M_IBSS)
2630				reg |= R92C_RCR_CBSSID_BCN;
2631
2632			urtwn_write_4(sc, R92C_RCR, reg);
2633		}
2634
2635		if (vap->iv_opmode == IEEE80211_M_HOSTAP ||
2636		    vap->iv_opmode == IEEE80211_M_IBSS) {
2637			error = urtwn_setup_beacon(sc, ni);
2638			if (error != 0) {
2639				device_printf(sc->sc_dev,
2640				    "unable to push beacon into the chip, "
2641				    "error %d\n", error);
2642				goto end_run;
2643			}
2644		}
2645
2646		/* Enable TSF synchronization. */
2647		urtwn_tsf_sync_enable(sc, vap);
2648
2649		urtwn_write_1(sc, R92C_SIFS_CCK + 1, 10);
2650		urtwn_write_1(sc, R92C_SIFS_OFDM + 1, 10);
2651		urtwn_write_1(sc, R92C_SPEC_SIFS + 1, 10);
2652		urtwn_write_1(sc, R92C_MAC_SPEC_SIFS + 1, 10);
2653		urtwn_write_1(sc, R92C_R2T_SIFS + 1, 10);
2654		urtwn_write_1(sc, R92C_T2T_SIFS + 1, 10);
2655
2656		/* Intialize rate adaptation. */
2657		if (!(sc->chip & URTWN_CHIP_88E))
2658			urtwn_ra_init(sc);
2659		/* Turn link LED on. */
2660		urtwn_set_led(sc, URTWN_LED_LINK, 1);
2661
2662		sc->avg_pwdb = -1;	/* Reset average RSSI. */
2663		/* Reset temperature calibration state machine. */
2664		sc->sc_flags &= ~URTWN_TEMP_MEASURED;
2665		sc->thcal_lctemp = 0;
2666		/* Start periodic calibration. */
2667		callout_reset(&sc->sc_calib_to, 2*hz, urtwn_calib_to, sc);
2668
2669end_run:
2670		ieee80211_free_node(ni);
2671		break;
2672	default:
2673		break;
2674	}
2675
2676	URTWN_UNLOCK(sc);
2677	IEEE80211_LOCK(ic);
2678	return (error != 0 ? error : uvp->newstate(vap, nstate, arg));
2679}
2680
2681static void
2682urtwn_calib_to(void *arg)
2683{
2684	struct urtwn_softc *sc = arg;
2685
2686	/* Do it in a process context. */
2687	urtwn_cmd_sleepable(sc, NULL, 0, urtwn_calib_cb);
2688}
2689
2690static void
2691urtwn_calib_cb(struct urtwn_softc *sc, union sec_param *data)
2692{
2693	/* Do temperature compensation. */
2694	urtwn_temp_calib(sc);
2695
2696	if ((urtwn_read_1(sc, R92C_MSR) & R92C_MSR_MASK) != R92C_MSR_NOLINK)
2697		callout_reset(&sc->sc_calib_to, 2*hz, urtwn_calib_to, sc);
2698}
2699
2700static void
2701urtwn_watchdog(void *arg)
2702{
2703	struct urtwn_softc *sc = arg;
2704
2705	if (sc->sc_txtimer > 0) {
2706		if (--sc->sc_txtimer == 0) {
2707			device_printf(sc->sc_dev, "device timeout\n");
2708			counter_u64_add(sc->sc_ic.ic_oerrors, 1);
2709			return;
2710		}
2711		callout_reset(&sc->sc_watchdog_ch, hz, urtwn_watchdog, sc);
2712	}
2713}
2714
2715static void
2716urtwn_update_avgrssi(struct urtwn_softc *sc, int rate, int8_t rssi)
2717{
2718	int pwdb;
2719
2720	/* Convert antenna signal to percentage. */
2721	if (rssi <= -100 || rssi >= 20)
2722		pwdb = 0;
2723	else if (rssi >= 0)
2724		pwdb = 100;
2725	else
2726		pwdb = 100 + rssi;
2727	if (!(sc->chip & URTWN_CHIP_88E)) {
2728		if (rate <= URTWN_RIDX_CCK11) {
2729			/* CCK gain is smaller than OFDM/MCS gain. */
2730			pwdb += 6;
2731			if (pwdb > 100)
2732				pwdb = 100;
2733			if (pwdb <= 14)
2734				pwdb -= 4;
2735			else if (pwdb <= 26)
2736				pwdb -= 8;
2737			else if (pwdb <= 34)
2738				pwdb -= 6;
2739			else if (pwdb <= 42)
2740				pwdb -= 2;
2741		}
2742	}
2743	if (sc->avg_pwdb == -1)	/* Init. */
2744		sc->avg_pwdb = pwdb;
2745	else if (sc->avg_pwdb < pwdb)
2746		sc->avg_pwdb = ((sc->avg_pwdb * 19 + pwdb) / 20) + 1;
2747	else
2748		sc->avg_pwdb = ((sc->avg_pwdb * 19 + pwdb) / 20);
2749	URTWN_DPRINTF(sc, URTWN_DEBUG_RSSI, "%s: PWDB %d, EMA %d\n", __func__,
2750	    pwdb, sc->avg_pwdb);
2751}
2752
2753static int8_t
2754urtwn_get_rssi(struct urtwn_softc *sc, int rate, void *physt)
2755{
2756	static const int8_t cckoff[] = { 16, -12, -26, -46 };
2757	struct r92c_rx_phystat *phy;
2758	struct r92c_rx_cck *cck;
2759	uint8_t rpt;
2760	int8_t rssi;
2761
2762	if (rate <= URTWN_RIDX_CCK11) {
2763		cck = (struct r92c_rx_cck *)physt;
2764		if (sc->sc_flags & URTWN_FLAG_CCK_HIPWR) {
2765			rpt = (cck->agc_rpt >> 5) & 0x3;
2766			rssi = (cck->agc_rpt & 0x1f) << 1;
2767		} else {
2768			rpt = (cck->agc_rpt >> 6) & 0x3;
2769			rssi = cck->agc_rpt & 0x3e;
2770		}
2771		rssi = cckoff[rpt] - rssi;
2772	} else {	/* OFDM/HT. */
2773		phy = (struct r92c_rx_phystat *)physt;
2774		rssi = ((le32toh(phy->phydw1) >> 1) & 0x7f) - 110;
2775	}
2776	return (rssi);
2777}
2778
2779static int8_t
2780urtwn_r88e_get_rssi(struct urtwn_softc *sc, int rate, void *physt)
2781{
2782	struct r92c_rx_phystat *phy;
2783	struct r88e_rx_cck *cck;
2784	uint8_t cck_agc_rpt, lna_idx, vga_idx;
2785	int8_t rssi;
2786
2787	rssi = 0;
2788	if (rate <= URTWN_RIDX_CCK11) {
2789		cck = (struct r88e_rx_cck *)physt;
2790		cck_agc_rpt = cck->agc_rpt;
2791		lna_idx = (cck_agc_rpt & 0xe0) >> 5;
2792		vga_idx = cck_agc_rpt & 0x1f;
2793		switch (lna_idx) {
2794		case 7:
2795			if (vga_idx <= 27)
2796				rssi = -100 + 2* (27 - vga_idx);
2797			else
2798				rssi = -100;
2799			break;
2800		case 6:
2801			rssi = -48 + 2 * (2 - vga_idx);
2802			break;
2803		case 5:
2804			rssi = -42 + 2 * (7 - vga_idx);
2805			break;
2806		case 4:
2807			rssi = -36 + 2 * (7 - vga_idx);
2808			break;
2809		case 3:
2810			rssi = -24 + 2 * (7 - vga_idx);
2811			break;
2812		case 2:
2813			rssi = -12 + 2 * (5 - vga_idx);
2814			break;
2815		case 1:
2816			rssi = 8 - (2 * vga_idx);
2817			break;
2818		case 0:
2819			rssi = 14 - (2 * vga_idx);
2820			break;
2821		}
2822		rssi += 6;
2823	} else {	/* OFDM/HT. */
2824		phy = (struct r92c_rx_phystat *)physt;
2825		rssi = ((le32toh(phy->phydw1) >> 1) & 0x7f) - 110;
2826	}
2827	return (rssi);
2828}
2829
2830static int
2831urtwn_tx_data(struct urtwn_softc *sc, struct ieee80211_node *ni,
2832    struct mbuf *m, struct urtwn_data *data)
2833{
2834	const struct ieee80211_txparam *tp;
2835	struct ieee80211com *ic = &sc->sc_ic;
2836	struct ieee80211vap *vap = ni->ni_vap;
2837	struct ieee80211_key *k = NULL;
2838	struct ieee80211_channel *chan;
2839	struct ieee80211_frame *wh;
2840	struct r92c_tx_desc *txd;
2841	uint8_t macid, raid, rate, ridx, subtype, type, tid, qos, qsel;
2842	int hasqos, ismcast;
2843
2844	URTWN_ASSERT_LOCKED(sc);
2845
2846	/*
2847	 * Software crypto.
2848	 */
2849	wh = mtod(m, struct ieee80211_frame *);
2850	type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
2851	subtype = wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK;
2852	hasqos = IEEE80211_QOS_HAS_SEQ(wh);
2853	ismcast = IEEE80211_IS_MULTICAST(wh->i_addr1);
2854
2855	/* Select TX ring for this frame. */
2856	if (hasqos) {
2857		qos = ((const struct ieee80211_qosframe *)wh)->i_qos[0];
2858		tid = qos & IEEE80211_QOS_TID;
2859	} else {
2860		qos = 0;
2861		tid = 0;
2862	}
2863
2864	chan = (ni->ni_chan != IEEE80211_CHAN_ANYC) ?
2865		ni->ni_chan : ic->ic_curchan;
2866	tp = &vap->iv_txparms[ieee80211_chan2mode(chan)];
2867
2868	/* Choose a TX rate index. */
2869	if (type == IEEE80211_FC0_TYPE_MGT)
2870		rate = tp->mgmtrate;
2871	else if (ismcast)
2872		rate = tp->mcastrate;
2873	else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE)
2874		rate = tp->ucastrate;
2875	else if (m->m_flags & M_EAPOL)
2876		rate = tp->mgmtrate;
2877	else {
2878		if (URTWN_CHIP_HAS_RATECTL(sc)) {
2879			/* XXX pass pktlen */
2880			(void) ieee80211_ratectl_rate(ni, NULL, 0);
2881			rate = ni->ni_txrate;
2882		} else {
2883			/* XXX TODO: drop the default rate for 11b/11g? */
2884			if (ni->ni_flags & IEEE80211_NODE_HT)
2885				rate = IEEE80211_RATE_MCS | 0x4; /* MCS4 */
2886			else if (ic->ic_curmode != IEEE80211_MODE_11B)
2887				rate = 108;
2888			else
2889				rate = 22;
2890		}
2891	}
2892
2893	/*
2894	 * XXX TODO: this should be per-node, for 11b versus 11bg
2895	 * nodes in hostap mode
2896	 */
2897	ridx = rate2ridx(rate);
2898	if (ni->ni_flags & IEEE80211_NODE_HT)
2899		raid = R92C_RAID_11GN;
2900	else if (ic->ic_curmode != IEEE80211_MODE_11B)
2901		raid = R92C_RAID_11BG;
2902	else
2903		raid = R92C_RAID_11B;
2904
2905	if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
2906		k = ieee80211_crypto_encap(ni, m);
2907		if (k == NULL) {
2908			device_printf(sc->sc_dev,
2909			    "ieee80211_crypto_encap returns NULL.\n");
2910			return (ENOBUFS);
2911		}
2912
2913		/* in case packet header moved, reset pointer */
2914		wh = mtod(m, struct ieee80211_frame *);
2915	}
2916
2917	/* Fill Tx descriptor. */
2918	txd = (struct r92c_tx_desc *)data->buf;
2919	memset(txd, 0, sizeof(*txd));
2920
2921	txd->txdw0 |= htole32(
2922	    SM(R92C_TXDW0_OFFSET, sizeof(*txd)) |
2923	    R92C_TXDW0_OWN | R92C_TXDW0_FSG | R92C_TXDW0_LSG);
2924	if (ismcast)
2925		txd->txdw0 |= htole32(R92C_TXDW0_BMCAST);
2926
2927	if (!ismcast) {
2928		/* Unicast frame, check if an ACK is expected. */
2929		if (!qos || (qos & IEEE80211_QOS_ACKPOLICY) !=
2930		    IEEE80211_QOS_ACKPOLICY_NOACK) {
2931			txd->txdw5 |= htole32(R92C_TXDW5_RTY_LMT_ENA);
2932			txd->txdw5 |= htole32(SM(R92C_TXDW5_RTY_LMT,
2933			    tp->maxretry));
2934		}
2935
2936		if (sc->chip & URTWN_CHIP_88E) {
2937			struct urtwn_node *un = URTWN_NODE(ni);
2938			macid = un->id;
2939		} else
2940			macid = URTWN_MACID_BSS;
2941
2942		if (type == IEEE80211_FC0_TYPE_DATA) {
2943			qsel = tid % URTWN_MAX_TID;
2944
2945			if (sc->chip & URTWN_CHIP_88E) {
2946				txd->txdw2 |= htole32(
2947				    R88E_TXDW2_AGGBK |
2948				    R88E_TXDW2_CCX_RPT);
2949			} else
2950				txd->txdw1 |= htole32(R92C_TXDW1_AGGBK);
2951
2952			/* protmode, non-HT */
2953			/* XXX TODO: noack frames? */
2954			if ((rate & 0x80) == 0 &&
2955			    (ic->ic_flags & IEEE80211_F_USEPROT)) {
2956				switch (ic->ic_protmode) {
2957				case IEEE80211_PROT_CTSONLY:
2958					txd->txdw4 |= htole32(
2959					    R92C_TXDW4_CTS2SELF |
2960					    R92C_TXDW4_HWRTSEN);
2961					break;
2962				case IEEE80211_PROT_RTSCTS:
2963					txd->txdw4 |= htole32(
2964					    R92C_TXDW4_RTSEN |
2965					    R92C_TXDW4_HWRTSEN);
2966					break;
2967				default:
2968					break;
2969				}
2970			}
2971
2972			/* protmode, HT */
2973			/* XXX TODO: noack frames? */
2974			if ((rate & 0x80) &&
2975			    (ic->ic_htprotmode == IEEE80211_PROT_RTSCTS)) {
2976				txd->txdw4 |= htole32(
2977				    R92C_TXDW4_RTSEN |
2978				    R92C_TXDW4_HWRTSEN);
2979			}
2980
2981			/* XXX TODO: rtsrate is configurable? 24mbit may
2982			 * be a bit high for RTS rate? */
2983			txd->txdw4 |= htole32(SM(R92C_TXDW4_RTSRATE,
2984			    URTWN_RIDX_OFDM24));
2985
2986			txd->txdw5 |= htole32(0x0001ff00);
2987		} else	/* IEEE80211_FC0_TYPE_MGT */
2988			qsel = R92C_TXDW1_QSEL_MGNT;
2989	} else {
2990		macid = URTWN_MACID_BC;
2991		qsel = R92C_TXDW1_QSEL_MGNT;
2992	}
2993
2994	txd->txdw1 |= htole32(
2995	    SM(R92C_TXDW1_QSEL, qsel) |
2996	    SM(R92C_TXDW1_RAID, raid));
2997
2998	/* XXX TODO: 40MHZ flag? */
2999	/* XXX TODO: AMPDU flag? (AGG_ENABLE or AGG_BREAK?) Density shift? */
3000	/* XXX Short preamble? */
3001	/* XXX Short-GI? */
3002
3003	if (sc->chip & URTWN_CHIP_88E)
3004		txd->txdw1 |= htole32(SM(R88E_TXDW1_MACID, macid));
3005	else
3006		txd->txdw1 |= htole32(SM(R92C_TXDW1_MACID, macid));
3007
3008	txd->txdw5 |= htole32(SM(R92C_TXDW5_DATARATE, ridx));
3009
3010	/* Force this rate if needed. */
3011	if (URTWN_CHIP_HAS_RATECTL(sc) || ismcast ||
3012	    (tp->ucastrate != IEEE80211_FIXED_RATE_NONE) ||
3013	    (m->m_flags & M_EAPOL) || type != IEEE80211_FC0_TYPE_DATA)
3014		txd->txdw4 |= htole32(R92C_TXDW4_DRVRATE);
3015
3016	if (!hasqos) {
3017		/* Use HW sequence numbering for non-QoS frames. */
3018		if (sc->chip & URTWN_CHIP_88E)
3019			txd->txdseq = htole16(R88E_TXDSEQ_HWSEQ_EN);
3020		else
3021			txd->txdw4 |= htole32(R92C_TXDW4_HWSEQ_EN);
3022	} else {
3023		/* Set sequence number. */
3024		txd->txdseq = htole16(M_SEQNO_GET(m) % IEEE80211_SEQ_RANGE);
3025	}
3026
3027	if (k != NULL && !(k->wk_flags & IEEE80211_KEY_SWCRYPT)) {
3028		uint8_t cipher;
3029
3030		switch (k->wk_cipher->ic_cipher) {
3031		case IEEE80211_CIPHER_WEP:
3032		case IEEE80211_CIPHER_TKIP:
3033			cipher = R92C_TXDW1_CIPHER_RC4;
3034			break;
3035		case IEEE80211_CIPHER_AES_CCM:
3036			cipher = R92C_TXDW1_CIPHER_AES;
3037			break;
3038		default:
3039			device_printf(sc->sc_dev, "%s: unknown cipher %d\n",
3040			    __func__, k->wk_cipher->ic_cipher);
3041			return (EINVAL);
3042		}
3043
3044		txd->txdw1 |= htole32(SM(R92C_TXDW1_CIPHER, cipher));
3045	}
3046
3047	if (ieee80211_radiotap_active_vap(vap)) {
3048		struct urtwn_tx_radiotap_header *tap = &sc->sc_txtap;
3049
3050		tap->wt_flags = 0;
3051		if (k != NULL)
3052			tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP;
3053		ieee80211_radiotap_tx(vap, m);
3054	}
3055
3056	data->ni = ni;
3057
3058	urtwn_tx_start(sc, m, type, data);
3059
3060	return (0);
3061}
3062
3063static int
3064urtwn_tx_raw(struct urtwn_softc *sc, struct ieee80211_node *ni,
3065    struct mbuf *m, struct urtwn_data *data,
3066    const struct ieee80211_bpf_params *params)
3067{
3068	struct ieee80211vap *vap = ni->ni_vap;
3069	struct ieee80211_key *k = NULL;
3070	struct ieee80211_frame *wh;
3071	struct r92c_tx_desc *txd;
3072	uint8_t cipher, ridx, type;
3073
3074	/* Encrypt the frame if need be. */
3075	cipher = R92C_TXDW1_CIPHER_NONE;
3076	if (params->ibp_flags & IEEE80211_BPF_CRYPTO) {
3077		/* Retrieve key for TX. */
3078		k = ieee80211_crypto_encap(ni, m);
3079		if (k == NULL)
3080			return (ENOBUFS);
3081
3082		if (!(k->wk_flags & IEEE80211_KEY_SWCRYPT)) {
3083			switch (k->wk_cipher->ic_cipher) {
3084			case IEEE80211_CIPHER_WEP:
3085			case IEEE80211_CIPHER_TKIP:
3086				cipher = R92C_TXDW1_CIPHER_RC4;
3087				break;
3088			case IEEE80211_CIPHER_AES_CCM:
3089				cipher = R92C_TXDW1_CIPHER_AES;
3090				break;
3091			default:
3092				device_printf(sc->sc_dev,
3093				    "%s: unknown cipher %d\n",
3094				    __func__, k->wk_cipher->ic_cipher);
3095				return (EINVAL);
3096			}
3097		}
3098	}
3099
3100	/* XXX TODO: 11n checks, matching urtwn_tx_data() */
3101
3102	wh = mtod(m, struct ieee80211_frame *);
3103	type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
3104
3105	/* Fill Tx descriptor. */
3106	txd = (struct r92c_tx_desc *)data->buf;
3107	memset(txd, 0, sizeof(*txd));
3108
3109	txd->txdw0 |= htole32(
3110	    SM(R92C_TXDW0_OFFSET, sizeof(*txd)) |
3111	    R92C_TXDW0_OWN | R92C_TXDW0_FSG | R92C_TXDW0_LSG);
3112	if (IEEE80211_IS_MULTICAST(wh->i_addr1))
3113		txd->txdw0 |= htole32(R92C_TXDW0_BMCAST);
3114
3115	if ((params->ibp_flags & IEEE80211_BPF_NOACK) == 0) {
3116		txd->txdw5 |= htole32(R92C_TXDW5_RTY_LMT_ENA);
3117		txd->txdw5 |= htole32(SM(R92C_TXDW5_RTY_LMT,
3118		    params->ibp_try0));
3119	}
3120	if (params->ibp_flags & IEEE80211_BPF_RTS)
3121		txd->txdw4 |= htole32(R92C_TXDW4_RTSEN);
3122	if (params->ibp_flags & IEEE80211_BPF_CTS)
3123		txd->txdw4 |= htole32(R92C_TXDW4_CTS2SELF);
3124	if (txd->txdw4 & htole32(R92C_TXDW4_RTSEN | R92C_TXDW4_CTS2SELF)) {
3125		txd->txdw4 |= htole32(R92C_TXDW4_HWRTSEN);
3126		txd->txdw4 |= htole32(SM(R92C_TXDW4_RTSRATE,
3127		    URTWN_RIDX_OFDM24));
3128	}
3129
3130	if (sc->chip & URTWN_CHIP_88E)
3131		txd->txdw1 |= htole32(SM(R88E_TXDW1_MACID, URTWN_MACID_BC));
3132	else
3133		txd->txdw1 |= htole32(SM(R92C_TXDW1_MACID, URTWN_MACID_BC));
3134
3135	/* XXX TODO: rate index/config (RAID) for 11n? */
3136	txd->txdw1 |= htole32(SM(R92C_TXDW1_QSEL, R92C_TXDW1_QSEL_MGNT));
3137	txd->txdw1 |= htole32(SM(R92C_TXDW1_CIPHER, cipher));
3138
3139	/* Choose a TX rate index. */
3140	ridx = rate2ridx(params->ibp_rate0);
3141	txd->txdw5 |= htole32(SM(R92C_TXDW5_DATARATE, ridx));
3142	txd->txdw5 |= htole32(0x0001ff00);
3143	txd->txdw4 |= htole32(R92C_TXDW4_DRVRATE);
3144
3145	if (!IEEE80211_QOS_HAS_SEQ(wh)) {
3146		/* Use HW sequence numbering for non-QoS frames. */
3147		if (sc->chip & URTWN_CHIP_88E)
3148			txd->txdseq = htole16(R88E_TXDSEQ_HWSEQ_EN);
3149		else
3150			txd->txdw4 |= htole32(R92C_TXDW4_HWSEQ_EN);
3151	} else {
3152		/* Set sequence number. */
3153		txd->txdseq = htole16(M_SEQNO_GET(m) % IEEE80211_SEQ_RANGE);
3154	}
3155
3156	if (ieee80211_radiotap_active_vap(vap)) {
3157		struct urtwn_tx_radiotap_header *tap = &sc->sc_txtap;
3158
3159		tap->wt_flags = 0;
3160		if (k != NULL)
3161			tap->wt_flags |= IEEE80211_RADIOTAP_F_WEP;
3162		ieee80211_radiotap_tx(vap, m);
3163	}
3164
3165	data->ni = ni;
3166
3167	urtwn_tx_start(sc, m, type, data);
3168
3169	return (0);
3170}
3171
3172static void
3173urtwn_tx_start(struct urtwn_softc *sc, struct mbuf *m, uint8_t type,
3174    struct urtwn_data *data)
3175{
3176	struct usb_xfer *xfer;
3177	struct r92c_tx_desc *txd;
3178	uint16_t ac, sum;
3179	int i, xferlen;
3180
3181	URTWN_ASSERT_LOCKED(sc);
3182
3183	ac = M_WME_GETAC(m);
3184
3185	switch (type) {
3186	case IEEE80211_FC0_TYPE_CTL:
3187	case IEEE80211_FC0_TYPE_MGT:
3188		xfer = sc->sc_xfer[URTWN_BULK_TX_VO];
3189		break;
3190	default:
3191		xfer = sc->sc_xfer[wme2queue[ac].qid];
3192		break;
3193	}
3194
3195	txd = (struct r92c_tx_desc *)data->buf;
3196	txd->txdw0 |= htole32(SM(R92C_TXDW0_PKTLEN, m->m_pkthdr.len));
3197
3198	/* Compute Tx descriptor checksum. */
3199	sum = 0;
3200	for (i = 0; i < sizeof(*txd) / 2; i++)
3201		sum ^= ((uint16_t *)txd)[i];
3202	txd->txdsum = sum;	/* NB: already little endian. */
3203
3204	xferlen = sizeof(*txd) + m->m_pkthdr.len;
3205	m_copydata(m, 0, m->m_pkthdr.len, (caddr_t)&txd[1]);
3206
3207	data->buflen = xferlen;
3208	data->m = m;
3209
3210	STAILQ_INSERT_TAIL(&sc->sc_tx_pending, data, next);
3211	usbd_transfer_start(xfer);
3212}
3213
3214static int
3215urtwn_transmit(struct ieee80211com *ic, struct mbuf *m)
3216{
3217	struct urtwn_softc *sc = ic->ic_softc;
3218	int error;
3219
3220	URTWN_LOCK(sc);
3221	if ((sc->sc_flags & URTWN_RUNNING) == 0) {
3222		URTWN_UNLOCK(sc);
3223		return (ENXIO);
3224	}
3225	error = mbufq_enqueue(&sc->sc_snd, m);
3226	if (error) {
3227		URTWN_UNLOCK(sc);
3228		return (error);
3229	}
3230	urtwn_start(sc);
3231	URTWN_UNLOCK(sc);
3232
3233	return (0);
3234}
3235
3236static void
3237urtwn_start(struct urtwn_softc *sc)
3238{
3239	struct ieee80211_node *ni;
3240	struct mbuf *m;
3241	struct urtwn_data *bf;
3242
3243	URTWN_ASSERT_LOCKED(sc);
3244	while ((m = mbufq_dequeue(&sc->sc_snd)) != NULL) {
3245		bf = urtwn_getbuf(sc);
3246		if (bf == NULL) {
3247			mbufq_prepend(&sc->sc_snd, m);
3248			break;
3249		}
3250		ni = (struct ieee80211_node *)m->m_pkthdr.rcvif;
3251		m->m_pkthdr.rcvif = NULL;
3252
3253		URTWN_DPRINTF(sc, URTWN_DEBUG_XMIT, "%s: called; m=%p\n",
3254		    __func__,
3255		    m);
3256
3257		if (urtwn_tx_data(sc, ni, m, bf) != 0) {
3258			if_inc_counter(ni->ni_vap->iv_ifp,
3259			    IFCOUNTER_OERRORS, 1);
3260			STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next);
3261			m_freem(m);
3262			ieee80211_free_node(ni);
3263			break;
3264		}
3265		sc->sc_txtimer = 5;
3266		callout_reset(&sc->sc_watchdog_ch, hz, urtwn_watchdog, sc);
3267	}
3268}
3269
3270static void
3271urtwn_parent(struct ieee80211com *ic)
3272{
3273	struct urtwn_softc *sc = ic->ic_softc;
3274
3275	URTWN_LOCK(sc);
3276	if (sc->sc_flags & URTWN_DETACHED) {
3277		URTWN_UNLOCK(sc);
3278		return;
3279	}
3280	URTWN_UNLOCK(sc);
3281
3282	if (ic->ic_nrunning > 0) {
3283		if (urtwn_init(sc) != 0) {
3284			struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
3285			if (vap != NULL)
3286				ieee80211_stop(vap);
3287		} else
3288			ieee80211_start_all(ic);
3289	} else
3290		urtwn_stop(sc);
3291}
3292
3293static __inline int
3294urtwn_power_on(struct urtwn_softc *sc)
3295{
3296
3297	return sc->sc_power_on(sc);
3298}
3299
3300static int
3301urtwn_r92c_power_on(struct urtwn_softc *sc)
3302{
3303	uint32_t reg;
3304	usb_error_t error;
3305	int ntries;
3306
3307	/* Wait for autoload done bit. */
3308	for (ntries = 0; ntries < 1000; ntries++) {
3309		if (urtwn_read_1(sc, R92C_APS_FSMCO) & R92C_APS_FSMCO_PFM_ALDN)
3310			break;
3311		urtwn_ms_delay(sc);
3312	}
3313	if (ntries == 1000) {
3314		device_printf(sc->sc_dev,
3315		    "timeout waiting for chip autoload\n");
3316		return (ETIMEDOUT);
3317	}
3318
3319	/* Unlock ISO/CLK/Power control register. */
3320	error = urtwn_write_1(sc, R92C_RSV_CTRL, 0);
3321	if (error != USB_ERR_NORMAL_COMPLETION)
3322		return (EIO);
3323	/* Move SPS into PWM mode. */
3324	error = urtwn_write_1(sc, R92C_SPS0_CTRL, 0x2b);
3325	if (error != USB_ERR_NORMAL_COMPLETION)
3326		return (EIO);
3327	urtwn_ms_delay(sc);
3328
3329	reg = urtwn_read_1(sc, R92C_LDOV12D_CTRL);
3330	if (!(reg & R92C_LDOV12D_CTRL_LDV12_EN)) {
3331		error = urtwn_write_1(sc, R92C_LDOV12D_CTRL,
3332		    reg | R92C_LDOV12D_CTRL_LDV12_EN);
3333		if (error != USB_ERR_NORMAL_COMPLETION)
3334			return (EIO);
3335		urtwn_ms_delay(sc);
3336		error = urtwn_write_1(sc, R92C_SYS_ISO_CTRL,
3337		    urtwn_read_1(sc, R92C_SYS_ISO_CTRL) &
3338		    ~R92C_SYS_ISO_CTRL_MD2PP);
3339		if (error != USB_ERR_NORMAL_COMPLETION)
3340			return (EIO);
3341	}
3342
3343	/* Auto enable WLAN. */
3344	error = urtwn_write_2(sc, R92C_APS_FSMCO,
3345	    urtwn_read_2(sc, R92C_APS_FSMCO) | R92C_APS_FSMCO_APFM_ONMAC);
3346	if (error != USB_ERR_NORMAL_COMPLETION)
3347		return (EIO);
3348	for (ntries = 0; ntries < 1000; ntries++) {
3349		if (!(urtwn_read_2(sc, R92C_APS_FSMCO) &
3350		    R92C_APS_FSMCO_APFM_ONMAC))
3351			break;
3352		urtwn_ms_delay(sc);
3353	}
3354	if (ntries == 1000) {
3355		device_printf(sc->sc_dev,
3356		    "timeout waiting for MAC auto ON\n");
3357		return (ETIMEDOUT);
3358	}
3359
3360	/* Enable radio, GPIO and LED functions. */
3361	error = urtwn_write_2(sc, R92C_APS_FSMCO,
3362	    R92C_APS_FSMCO_AFSM_HSUS |
3363	    R92C_APS_FSMCO_PDN_EN |
3364	    R92C_APS_FSMCO_PFM_ALDN);
3365	if (error != USB_ERR_NORMAL_COMPLETION)
3366		return (EIO);
3367	/* Release RF digital isolation. */
3368	error = urtwn_write_2(sc, R92C_SYS_ISO_CTRL,
3369	    urtwn_read_2(sc, R92C_SYS_ISO_CTRL) & ~R92C_SYS_ISO_CTRL_DIOR);
3370	if (error != USB_ERR_NORMAL_COMPLETION)
3371		return (EIO);
3372
3373	/* Initialize MAC. */
3374	error = urtwn_write_1(sc, R92C_APSD_CTRL,
3375	    urtwn_read_1(sc, R92C_APSD_CTRL) & ~R92C_APSD_CTRL_OFF);
3376	if (error != USB_ERR_NORMAL_COMPLETION)
3377		return (EIO);
3378	for (ntries = 0; ntries < 200; ntries++) {
3379		if (!(urtwn_read_1(sc, R92C_APSD_CTRL) &
3380		    R92C_APSD_CTRL_OFF_STATUS))
3381			break;
3382		urtwn_ms_delay(sc);
3383	}
3384	if (ntries == 200) {
3385		device_printf(sc->sc_dev,
3386		    "timeout waiting for MAC initialization\n");
3387		return (ETIMEDOUT);
3388	}
3389
3390	/* Enable MAC DMA/WMAC/SCHEDULE/SEC blocks. */
3391	reg = urtwn_read_2(sc, R92C_CR);
3392	reg |= R92C_CR_HCI_TXDMA_EN | R92C_CR_HCI_RXDMA_EN |
3393	    R92C_CR_TXDMA_EN | R92C_CR_RXDMA_EN | R92C_CR_PROTOCOL_EN |
3394	    R92C_CR_SCHEDULE_EN | R92C_CR_MACTXEN | R92C_CR_MACRXEN |
3395	    R92C_CR_ENSEC;
3396	error = urtwn_write_2(sc, R92C_CR, reg);
3397	if (error != USB_ERR_NORMAL_COMPLETION)
3398		return (EIO);
3399
3400	error = urtwn_write_1(sc, 0xfe10, 0x19);
3401	if (error != USB_ERR_NORMAL_COMPLETION)
3402		return (EIO);
3403	return (0);
3404}
3405
3406static int
3407urtwn_r88e_power_on(struct urtwn_softc *sc)
3408{
3409	uint32_t reg;
3410	usb_error_t error;
3411	int ntries;
3412
3413	/* Wait for power ready bit. */
3414	for (ntries = 0; ntries < 5000; ntries++) {
3415		if (urtwn_read_4(sc, R92C_APS_FSMCO) & R92C_APS_FSMCO_SUS_HOST)
3416			break;
3417		urtwn_ms_delay(sc);
3418	}
3419	if (ntries == 5000) {
3420		device_printf(sc->sc_dev,
3421		    "timeout waiting for chip power up\n");
3422		return (ETIMEDOUT);
3423	}
3424
3425	/* Reset BB. */
3426	error = urtwn_write_1(sc, R92C_SYS_FUNC_EN,
3427	    urtwn_read_1(sc, R92C_SYS_FUNC_EN) & ~(R92C_SYS_FUNC_EN_BBRSTB |
3428	    R92C_SYS_FUNC_EN_BB_GLB_RST));
3429	if (error != USB_ERR_NORMAL_COMPLETION)
3430		return (EIO);
3431
3432	error = urtwn_write_1(sc, R92C_AFE_XTAL_CTRL + 2,
3433	    urtwn_read_1(sc, R92C_AFE_XTAL_CTRL + 2) | 0x80);
3434	if (error != USB_ERR_NORMAL_COMPLETION)
3435		return (EIO);
3436
3437	/* Disable HWPDN. */
3438	error = urtwn_write_2(sc, R92C_APS_FSMCO,
3439	    urtwn_read_2(sc, R92C_APS_FSMCO) & ~R92C_APS_FSMCO_APDM_HPDN);
3440	if (error != USB_ERR_NORMAL_COMPLETION)
3441		return (EIO);
3442
3443	/* Disable WL suspend. */
3444	error = urtwn_write_2(sc, R92C_APS_FSMCO,
3445	    urtwn_read_2(sc, R92C_APS_FSMCO) &
3446	    ~(R92C_APS_FSMCO_AFSM_HSUS | R92C_APS_FSMCO_AFSM_PCIE));
3447	if (error != USB_ERR_NORMAL_COMPLETION)
3448		return (EIO);
3449
3450	error = urtwn_write_2(sc, R92C_APS_FSMCO,
3451	    urtwn_read_2(sc, R92C_APS_FSMCO) | R92C_APS_FSMCO_APFM_ONMAC);
3452	if (error != USB_ERR_NORMAL_COMPLETION)
3453		return (EIO);
3454	for (ntries = 0; ntries < 5000; ntries++) {
3455		if (!(urtwn_read_2(sc, R92C_APS_FSMCO) &
3456		    R92C_APS_FSMCO_APFM_ONMAC))
3457			break;
3458		urtwn_ms_delay(sc);
3459	}
3460	if (ntries == 5000)
3461		return (ETIMEDOUT);
3462
3463	/* Enable LDO normal mode. */
3464	error = urtwn_write_1(sc, R92C_LPLDO_CTRL,
3465	    urtwn_read_1(sc, R92C_LPLDO_CTRL) & ~R92C_LPLDO_CTRL_SLEEP);
3466	if (error != USB_ERR_NORMAL_COMPLETION)
3467		return (EIO);
3468
3469	/* Enable MAC DMA/WMAC/SCHEDULE/SEC blocks. */
3470	error = urtwn_write_2(sc, R92C_CR, 0);
3471	if (error != USB_ERR_NORMAL_COMPLETION)
3472		return (EIO);
3473	reg = urtwn_read_2(sc, R92C_CR);
3474	reg |= R92C_CR_HCI_TXDMA_EN | R92C_CR_HCI_RXDMA_EN |
3475	    R92C_CR_TXDMA_EN | R92C_CR_RXDMA_EN | R92C_CR_PROTOCOL_EN |
3476	    R92C_CR_SCHEDULE_EN | R92C_CR_ENSEC | R92C_CR_CALTMR_EN;
3477	error = urtwn_write_2(sc, R92C_CR, reg);
3478	if (error != USB_ERR_NORMAL_COMPLETION)
3479		return (EIO);
3480
3481	return (0);
3482}
3483
3484static __inline void
3485urtwn_power_off(struct urtwn_softc *sc)
3486{
3487
3488	return sc->sc_power_off(sc);
3489}
3490
3491static void
3492urtwn_r92c_power_off(struct urtwn_softc *sc)
3493{
3494	uint32_t reg;
3495
3496	/* Block all Tx queues. */
3497	urtwn_write_1(sc, R92C_TXPAUSE, R92C_TX_QUEUE_ALL);
3498
3499	/* Disable RF */
3500	urtwn_rf_write(sc, 0, 0, 0);
3501
3502	urtwn_write_1(sc, R92C_APSD_CTRL, R92C_APSD_CTRL_OFF);
3503
3504	/* Reset BB state machine */
3505	urtwn_write_1(sc, R92C_SYS_FUNC_EN,
3506	    R92C_SYS_FUNC_EN_USBD | R92C_SYS_FUNC_EN_USBA |
3507	    R92C_SYS_FUNC_EN_BB_GLB_RST);
3508	urtwn_write_1(sc, R92C_SYS_FUNC_EN,
3509	    R92C_SYS_FUNC_EN_USBD | R92C_SYS_FUNC_EN_USBA);
3510
3511	/*
3512	 * Reset digital sequence
3513	 */
3514#ifndef URTWN_WITHOUT_UCODE
3515	if (urtwn_read_1(sc, R92C_MCUFWDL) & R92C_MCUFWDL_RDY) {
3516		/* Reset MCU ready status */
3517		urtwn_write_1(sc, R92C_MCUFWDL, 0);
3518
3519		/* If firmware in ram code, do reset */
3520		urtwn_fw_reset(sc);
3521	}
3522#endif
3523
3524	/* Reset MAC and Enable 8051 */
3525	urtwn_write_1(sc, R92C_SYS_FUNC_EN + 1,
3526	    (R92C_SYS_FUNC_EN_CPUEN |
3527	     R92C_SYS_FUNC_EN_ELDR |
3528	     R92C_SYS_FUNC_EN_HWPDN) >> 8);
3529
3530	/* Reset MCU ready status */
3531	urtwn_write_1(sc, R92C_MCUFWDL, 0);
3532
3533	/* Disable MAC clock */
3534	urtwn_write_2(sc, R92C_SYS_CLKR,
3535	    R92C_SYS_CLKR_ANAD16V_EN |
3536	    R92C_SYS_CLKR_ANA8M |
3537	    R92C_SYS_CLKR_LOADER_EN |
3538	    R92C_SYS_CLKR_80M_SSC_DIS |
3539	    R92C_SYS_CLKR_SYS_EN |
3540	    R92C_SYS_CLKR_RING_EN |
3541	    0x4000);
3542
3543	/* Disable AFE PLL */
3544	urtwn_write_1(sc, R92C_AFE_PLL_CTRL, 0x80);
3545
3546	/* Gated AFE DIG_CLOCK */
3547	urtwn_write_2(sc, R92C_AFE_XTAL_CTRL, 0x880F);
3548
3549	/* Isolated digital to PON */
3550	urtwn_write_1(sc, R92C_SYS_ISO_CTRL,
3551	    R92C_SYS_ISO_CTRL_MD2PP |
3552	    R92C_SYS_ISO_CTRL_PA2PCIE |
3553	    R92C_SYS_ISO_CTRL_PD2CORE |
3554	    R92C_SYS_ISO_CTRL_IP2MAC |
3555	    R92C_SYS_ISO_CTRL_DIOP |
3556	    R92C_SYS_ISO_CTRL_DIOE);
3557
3558	/*
3559	 * Pull GPIO PIN to balance level and LED control
3560	 */
3561	/* 1. Disable GPIO[7:0] */
3562	urtwn_write_2(sc, R92C_GPIO_IOSEL, 0x0000);
3563
3564	reg = urtwn_read_4(sc, R92C_GPIO_PIN_CTRL) & ~0x0000ff00;
3565	reg |= ((reg << 8) & 0x0000ff00) | 0x00ff0000;
3566	urtwn_write_4(sc, R92C_GPIO_PIN_CTRL, reg);
3567
3568	/* Disable GPIO[10:8] */
3569	urtwn_write_1(sc, R92C_MAC_PINMUX_CFG, 0x00);
3570
3571	reg = urtwn_read_2(sc, R92C_GPIO_IO_SEL) & ~0x00f0;
3572	reg |= (((reg & 0x000f) << 4) | 0x0780);
3573	urtwn_write_2(sc, R92C_GPIO_IO_SEL, reg);
3574
3575	/* Disable LED0 & 1 */
3576	urtwn_write_2(sc, R92C_LEDCFG0, 0x8080);
3577
3578	/*
3579	 * Reset digital sequence
3580	 */
3581	/* Disable ELDR clock */
3582	urtwn_write_2(sc, R92C_SYS_CLKR,
3583	    R92C_SYS_CLKR_ANAD16V_EN |
3584	    R92C_SYS_CLKR_ANA8M |
3585	    R92C_SYS_CLKR_LOADER_EN |
3586	    R92C_SYS_CLKR_80M_SSC_DIS |
3587	    R92C_SYS_CLKR_SYS_EN |
3588	    R92C_SYS_CLKR_RING_EN |
3589	    0x4000);
3590
3591	/* Isolated ELDR to PON */
3592	urtwn_write_1(sc, R92C_SYS_ISO_CTRL + 1,
3593	    (R92C_SYS_ISO_CTRL_DIOR |
3594	     R92C_SYS_ISO_CTRL_PWC_EV12V) >> 8);
3595
3596	/*
3597	 * Disable analog sequence
3598	 */
3599	/* Disable A15 power */
3600	urtwn_write_1(sc, R92C_LDOA15_CTRL, R92C_LDOA15_CTRL_OBUF);
3601	/* Disable digital core power */
3602	urtwn_write_1(sc, R92C_LDOV12D_CTRL,
3603	    urtwn_read_1(sc, R92C_LDOV12D_CTRL) &
3604	      ~R92C_LDOV12D_CTRL_LDV12_EN);
3605
3606	/* Enter PFM mode */
3607	urtwn_write_1(sc, R92C_SPS0_CTRL, 0x23);
3608
3609	/* Set USB suspend */
3610	urtwn_write_2(sc, R92C_APS_FSMCO,
3611	    R92C_APS_FSMCO_APDM_HOST |
3612	    R92C_APS_FSMCO_AFSM_HSUS |
3613	    R92C_APS_FSMCO_PFM_ALDN);
3614
3615	/* Lock ISO/CLK/Power control register. */
3616	urtwn_write_1(sc, R92C_RSV_CTRL, 0x0E);
3617}
3618
3619static void
3620urtwn_r88e_power_off(struct urtwn_softc *sc)
3621{
3622	uint8_t reg;
3623	int ntries;
3624
3625	/* Disable any kind of TX reports. */
3626	urtwn_write_1(sc, R88E_TX_RPT_CTRL,
3627	    urtwn_read_1(sc, R88E_TX_RPT_CTRL) &
3628	      ~(R88E_TX_RPT1_ENA | R88E_TX_RPT2_ENA));
3629
3630	/* Stop Rx. */
3631	urtwn_write_1(sc, R92C_CR, 0);
3632
3633	/* Move card to Low Power State. */
3634	/* Block all Tx queues. */
3635	urtwn_write_1(sc, R92C_TXPAUSE, R92C_TX_QUEUE_ALL);
3636
3637	for (ntries = 0; ntries < 20; ntries++) {
3638		/* Should be zero if no packet is transmitting. */
3639		if (urtwn_read_4(sc, R88E_SCH_TXCMD) == 0)
3640			break;
3641
3642		urtwn_ms_delay(sc);
3643	}
3644	if (ntries == 20) {
3645		device_printf(sc->sc_dev, "%s: failed to block Tx queues\n",
3646		    __func__);
3647		return;
3648	}
3649
3650	/* CCK and OFDM are disabled, and clock are gated. */
3651	urtwn_write_1(sc, R92C_SYS_FUNC_EN,
3652	    urtwn_read_1(sc, R92C_SYS_FUNC_EN) & ~R92C_SYS_FUNC_EN_BBRSTB);
3653
3654	urtwn_ms_delay(sc);
3655
3656	/* Reset MAC TRX */
3657	urtwn_write_1(sc, R92C_CR,
3658	    R92C_CR_HCI_TXDMA_EN | R92C_CR_HCI_RXDMA_EN |
3659	    R92C_CR_TXDMA_EN | R92C_CR_RXDMA_EN |
3660	    R92C_CR_PROTOCOL_EN | R92C_CR_SCHEDULE_EN);
3661
3662	/* check if removed later */
3663	urtwn_write_1(sc, R92C_CR + 1,
3664	    urtwn_read_1(sc, R92C_CR + 1) & ~(R92C_CR_ENSEC >> 8));
3665
3666	/* Respond TxOK to scheduler */
3667	urtwn_write_1(sc, R92C_DUAL_TSF_RST,
3668	    urtwn_read_1(sc, R92C_DUAL_TSF_RST) | 0x20);
3669
3670	/* If firmware in ram code, do reset. */
3671#ifndef URTWN_WITHOUT_UCODE
3672	if (urtwn_read_1(sc, R92C_MCUFWDL) & R92C_MCUFWDL_RDY)
3673		urtwn_r88e_fw_reset(sc);
3674#endif
3675
3676	/* Reset MCU ready status. */
3677	urtwn_write_1(sc, R92C_MCUFWDL, 0x00);
3678
3679	/* Disable 32k. */
3680	urtwn_write_1(sc, R88E_32K_CTRL,
3681	    urtwn_read_1(sc, R88E_32K_CTRL) & ~0x01);
3682
3683	/* Move card to Disabled state. */
3684	/* Turn off RF. */
3685	urtwn_write_1(sc, R92C_RF_CTRL, 0);
3686
3687	/* LDO Sleep mode. */
3688	urtwn_write_1(sc, R92C_LPLDO_CTRL,
3689	    urtwn_read_1(sc, R92C_LPLDO_CTRL) | R92C_LPLDO_CTRL_SLEEP);
3690
3691	/* Turn off MAC by HW state machine */
3692	urtwn_write_1(sc, R92C_APS_FSMCO + 1,
3693	    urtwn_read_1(sc, R92C_APS_FSMCO + 1) |
3694	    (R92C_APS_FSMCO_APFM_OFF >> 8));
3695
3696	for (ntries = 0; ntries < 20; ntries++) {
3697		/* Wait until it will be disabled. */
3698		if ((urtwn_read_1(sc, R92C_APS_FSMCO + 1) &
3699		    (R92C_APS_FSMCO_APFM_OFF >> 8)) == 0)
3700			break;
3701
3702		urtwn_ms_delay(sc);
3703	}
3704	if (ntries == 20) {
3705		device_printf(sc->sc_dev, "%s: could not turn off MAC\n",
3706		    __func__);
3707		return;
3708	}
3709
3710	/* schmit trigger */
3711	urtwn_write_1(sc, R92C_AFE_XTAL_CTRL + 2,
3712	    urtwn_read_1(sc, R92C_AFE_XTAL_CTRL + 2) | 0x80);
3713
3714	/* Enable WL suspend. */
3715	urtwn_write_1(sc, R92C_APS_FSMCO + 1,
3716	    (urtwn_read_1(sc, R92C_APS_FSMCO + 1) & ~0x10) | 0x08);
3717
3718	/* Enable bandgap mbias in suspend. */
3719	urtwn_write_1(sc, R92C_APS_FSMCO + 3, 0);
3720
3721	/* Clear SIC_EN register. */
3722	urtwn_write_1(sc, R92C_GPIO_MUXCFG + 1,
3723	    urtwn_read_1(sc, R92C_GPIO_MUXCFG + 1) & ~0x10);
3724
3725	/* Set USB suspend enable local register */
3726	urtwn_write_1(sc, R92C_USB_SUSPEND,
3727	    urtwn_read_1(sc, R92C_USB_SUSPEND) | 0x10);
3728
3729	/* Reset MCU IO Wrapper. */
3730	reg = urtwn_read_1(sc, R92C_RSV_CTRL + 1);
3731	urtwn_write_1(sc, R92C_RSV_CTRL + 1, reg & ~0x08);
3732	urtwn_write_1(sc, R92C_RSV_CTRL + 1, reg | 0x08);
3733
3734	/* marked as 'For Power Consumption' code. */
3735	urtwn_write_1(sc, R92C_GPIO_OUT, urtwn_read_1(sc, R92C_GPIO_IN));
3736	urtwn_write_1(sc, R92C_GPIO_IOSEL, 0xff);
3737
3738	urtwn_write_1(sc, R92C_GPIO_IO_SEL,
3739	    urtwn_read_1(sc, R92C_GPIO_IO_SEL) << 4);
3740	urtwn_write_1(sc, R92C_GPIO_MOD,
3741	    urtwn_read_1(sc, R92C_GPIO_MOD) | 0x0f);
3742
3743	/* Set LNA, TRSW, EX_PA Pin to output mode. */
3744	urtwn_write_4(sc, R88E_BB_PAD_CTRL, 0x00080808);
3745}
3746
3747static int
3748urtwn_llt_init(struct urtwn_softc *sc)
3749{
3750	int i, error, page_count, pktbuf_count;
3751
3752	page_count = (sc->chip & URTWN_CHIP_88E) ?
3753	    R88E_TX_PAGE_COUNT : R92C_TX_PAGE_COUNT;
3754	pktbuf_count = (sc->chip & URTWN_CHIP_88E) ?
3755	    R88E_TXPKTBUF_COUNT : R92C_TXPKTBUF_COUNT;
3756
3757	/* Reserve pages [0; page_count]. */
3758	for (i = 0; i < page_count; i++) {
3759		if ((error = urtwn_llt_write(sc, i, i + 1)) != 0)
3760			return (error);
3761	}
3762	/* NB: 0xff indicates end-of-list. */
3763	if ((error = urtwn_llt_write(sc, i, 0xff)) != 0)
3764		return (error);
3765	/*
3766	 * Use pages [page_count + 1; pktbuf_count - 1]
3767	 * as ring buffer.
3768	 */
3769	for (++i; i < pktbuf_count - 1; i++) {
3770		if ((error = urtwn_llt_write(sc, i, i + 1)) != 0)
3771			return (error);
3772	}
3773	/* Make the last page point to the beginning of the ring buffer. */
3774	error = urtwn_llt_write(sc, i, page_count + 1);
3775	return (error);
3776}
3777
3778#ifndef URTWN_WITHOUT_UCODE
3779static void
3780urtwn_fw_reset(struct urtwn_softc *sc)
3781{
3782	uint16_t reg;
3783	int ntries;
3784
3785	/* Tell 8051 to reset itself. */
3786	urtwn_write_1(sc, R92C_HMETFR + 3, 0x20);
3787
3788	/* Wait until 8051 resets by itself. */
3789	for (ntries = 0; ntries < 100; ntries++) {
3790		reg = urtwn_read_2(sc, R92C_SYS_FUNC_EN);
3791		if (!(reg & R92C_SYS_FUNC_EN_CPUEN))
3792			return;
3793		urtwn_ms_delay(sc);
3794	}
3795	/* Force 8051 reset. */
3796	urtwn_write_2(sc, R92C_SYS_FUNC_EN, reg & ~R92C_SYS_FUNC_EN_CPUEN);
3797}
3798
3799static void
3800urtwn_r88e_fw_reset(struct urtwn_softc *sc)
3801{
3802	uint16_t reg;
3803
3804	reg = urtwn_read_2(sc, R92C_SYS_FUNC_EN);
3805	urtwn_write_2(sc, R92C_SYS_FUNC_EN, reg & ~R92C_SYS_FUNC_EN_CPUEN);
3806	urtwn_write_2(sc, R92C_SYS_FUNC_EN, reg | R92C_SYS_FUNC_EN_CPUEN);
3807}
3808
3809static int
3810urtwn_fw_loadpage(struct urtwn_softc *sc, int page, const uint8_t *buf, int len)
3811{
3812	uint32_t reg;
3813	usb_error_t error = USB_ERR_NORMAL_COMPLETION;
3814	int off, mlen;
3815
3816	reg = urtwn_read_4(sc, R92C_MCUFWDL);
3817	reg = RW(reg, R92C_MCUFWDL_PAGE, page);
3818	urtwn_write_4(sc, R92C_MCUFWDL, reg);
3819
3820	off = R92C_FW_START_ADDR;
3821	while (len > 0) {
3822		if (len > 196)
3823			mlen = 196;
3824		else if (len > 4)
3825			mlen = 4;
3826		else
3827			mlen = 1;
3828		/* XXX fix this deconst */
3829		error = urtwn_write_region_1(sc, off,
3830		    __DECONST(uint8_t *, buf), mlen);
3831		if (error != USB_ERR_NORMAL_COMPLETION)
3832			break;
3833		off += mlen;
3834		buf += mlen;
3835		len -= mlen;
3836	}
3837	return (error);
3838}
3839
3840static int
3841urtwn_load_firmware(struct urtwn_softc *sc)
3842{
3843	const struct firmware *fw;
3844	const struct r92c_fw_hdr *hdr;
3845	const char *imagename;
3846	const u_char *ptr;
3847	size_t len;
3848	uint32_t reg;
3849	int mlen, ntries, page, error;
3850
3851	URTWN_UNLOCK(sc);
3852	/* Read firmware image from the filesystem. */
3853	if (sc->chip & URTWN_CHIP_88E)
3854		imagename = "urtwn-rtl8188eufw";
3855	else if ((sc->chip & (URTWN_CHIP_UMC_A_CUT | URTWN_CHIP_92C)) ==
3856		    URTWN_CHIP_UMC_A_CUT)
3857		imagename = "urtwn-rtl8192cfwU";
3858	else
3859		imagename = "urtwn-rtl8192cfwT";
3860
3861	fw = firmware_get(imagename);
3862	URTWN_LOCK(sc);
3863	if (fw == NULL) {
3864		device_printf(sc->sc_dev,
3865		    "failed loadfirmware of file %s\n", imagename);
3866		return (ENOENT);
3867	}
3868
3869	len = fw->datasize;
3870
3871	if (len < sizeof(*hdr)) {
3872		device_printf(sc->sc_dev, "firmware too short\n");
3873		error = EINVAL;
3874		goto fail;
3875	}
3876	ptr = fw->data;
3877	hdr = (const struct r92c_fw_hdr *)ptr;
3878	/* Check if there is a valid FW header and skip it. */
3879	if ((le16toh(hdr->signature) >> 4) == 0x88c ||
3880	    (le16toh(hdr->signature) >> 4) == 0x88e ||
3881	    (le16toh(hdr->signature) >> 4) == 0x92c) {
3882		URTWN_DPRINTF(sc, URTWN_DEBUG_FIRMWARE,
3883		    "FW V%d.%d %02d-%02d %02d:%02d\n",
3884		    le16toh(hdr->version), le16toh(hdr->subversion),
3885		    hdr->month, hdr->date, hdr->hour, hdr->minute);
3886		ptr += sizeof(*hdr);
3887		len -= sizeof(*hdr);
3888	}
3889
3890	if (urtwn_read_1(sc, R92C_MCUFWDL) & R92C_MCUFWDL_RAM_DL_SEL) {
3891		if (sc->chip & URTWN_CHIP_88E)
3892			urtwn_r88e_fw_reset(sc);
3893		else
3894			urtwn_fw_reset(sc);
3895		urtwn_write_1(sc, R92C_MCUFWDL, 0);
3896	}
3897
3898	if (!(sc->chip & URTWN_CHIP_88E)) {
3899		urtwn_write_2(sc, R92C_SYS_FUNC_EN,
3900		    urtwn_read_2(sc, R92C_SYS_FUNC_EN) |
3901		    R92C_SYS_FUNC_EN_CPUEN);
3902	}
3903	urtwn_write_1(sc, R92C_MCUFWDL,
3904	    urtwn_read_1(sc, R92C_MCUFWDL) | R92C_MCUFWDL_EN);
3905	urtwn_write_1(sc, R92C_MCUFWDL + 2,
3906	    urtwn_read_1(sc, R92C_MCUFWDL + 2) & ~0x08);
3907
3908	/* Reset the FWDL checksum. */
3909	urtwn_write_1(sc, R92C_MCUFWDL,
3910	    urtwn_read_1(sc, R92C_MCUFWDL) | R92C_MCUFWDL_CHKSUM_RPT);
3911
3912	for (page = 0; len > 0; page++) {
3913		mlen = min(len, R92C_FW_PAGE_SIZE);
3914		error = urtwn_fw_loadpage(sc, page, ptr, mlen);
3915		if (error != 0) {
3916			device_printf(sc->sc_dev,
3917			    "could not load firmware page\n");
3918			goto fail;
3919		}
3920		ptr += mlen;
3921		len -= mlen;
3922	}
3923	urtwn_write_1(sc, R92C_MCUFWDL,
3924	    urtwn_read_1(sc, R92C_MCUFWDL) & ~R92C_MCUFWDL_EN);
3925	urtwn_write_1(sc, R92C_MCUFWDL + 1, 0);
3926
3927	/* Wait for checksum report. */
3928	for (ntries = 0; ntries < 1000; ntries++) {
3929		if (urtwn_read_4(sc, R92C_MCUFWDL) & R92C_MCUFWDL_CHKSUM_RPT)
3930			break;
3931		urtwn_ms_delay(sc);
3932	}
3933	if (ntries == 1000) {
3934		device_printf(sc->sc_dev,
3935		    "timeout waiting for checksum report\n");
3936		error = ETIMEDOUT;
3937		goto fail;
3938	}
3939
3940	reg = urtwn_read_4(sc, R92C_MCUFWDL);
3941	reg = (reg & ~R92C_MCUFWDL_WINTINI_RDY) | R92C_MCUFWDL_RDY;
3942	urtwn_write_4(sc, R92C_MCUFWDL, reg);
3943	if (sc->chip & URTWN_CHIP_88E)
3944		urtwn_r88e_fw_reset(sc);
3945	/* Wait for firmware readiness. */
3946	for (ntries = 0; ntries < 1000; ntries++) {
3947		if (urtwn_read_4(sc, R92C_MCUFWDL) & R92C_MCUFWDL_WINTINI_RDY)
3948			break;
3949		urtwn_ms_delay(sc);
3950	}
3951	if (ntries == 1000) {
3952		device_printf(sc->sc_dev,
3953		    "timeout waiting for firmware readiness\n");
3954		error = ETIMEDOUT;
3955		goto fail;
3956	}
3957fail:
3958	firmware_put(fw, FIRMWARE_UNLOAD);
3959	return (error);
3960}
3961#endif
3962
3963static int
3964urtwn_dma_init(struct urtwn_softc *sc)
3965{
3966	struct usb_endpoint *ep, *ep_end;
3967	usb_error_t usb_err;
3968	uint32_t reg;
3969	int hashq, hasnq, haslq, nqueues, ntx;
3970	int error, pagecount, npubqpages, nqpages, nrempages, tx_boundary;
3971
3972	/* Initialize LLT table. */
3973	error = urtwn_llt_init(sc);
3974	if (error != 0)
3975		return (error);
3976
3977	/* Determine the number of bulk-out pipes. */
3978	ntx = 0;
3979	ep = sc->sc_udev->endpoints;
3980	ep_end = sc->sc_udev->endpoints + sc->sc_udev->endpoints_max;
3981	for (; ep != ep_end; ep++) {
3982		if ((ep->edesc == NULL) ||
3983		    (ep->iface_index != sc->sc_iface_index))
3984			continue;
3985		if (UE_GET_DIR(ep->edesc->bEndpointAddress) == UE_DIR_OUT)
3986			ntx++;
3987	}
3988	if (ntx == 0) {
3989		device_printf(sc->sc_dev,
3990		    "%d: invalid number of Tx bulk pipes\n", ntx);
3991		return (EIO);
3992	}
3993
3994	/* Get Tx queues to USB endpoints mapping. */
3995	hashq = hasnq = haslq = nqueues = 0;
3996	switch (ntx) {
3997	case 1: hashq = 1; break;
3998	case 2: hashq = hasnq = 1; break;
3999	case 3: case 4: hashq = hasnq = haslq = 1; break;
4000	}
4001	nqueues = hashq + hasnq + haslq;
4002	if (nqueues == 0)
4003		return (EIO);
4004
4005	npubqpages = nqpages = nrempages = pagecount = 0;
4006	if (sc->chip & URTWN_CHIP_88E)
4007		tx_boundary = R88E_TX_PAGE_BOUNDARY;
4008	else {
4009		pagecount = R92C_TX_PAGE_COUNT;
4010		npubqpages = R92C_PUBQ_NPAGES;
4011		tx_boundary = R92C_TX_PAGE_BOUNDARY;
4012	}
4013
4014	/* Set number of pages for normal priority queue. */
4015	if (sc->chip & URTWN_CHIP_88E) {
4016		usb_err = urtwn_write_2(sc, R92C_RQPN_NPQ, 0xd);
4017		if (usb_err != USB_ERR_NORMAL_COMPLETION)
4018			return (EIO);
4019		usb_err = urtwn_write_4(sc, R92C_RQPN, 0x808e000d);
4020		if (usb_err != USB_ERR_NORMAL_COMPLETION)
4021			return (EIO);
4022	} else {
4023		/* Get the number of pages for each queue. */
4024		nqpages = (pagecount - npubqpages) / nqueues;
4025		/*
4026		 * The remaining pages are assigned to the high priority
4027		 * queue.
4028		 */
4029		nrempages = (pagecount - npubqpages) % nqueues;
4030		usb_err = urtwn_write_1(sc, R92C_RQPN_NPQ, hasnq ? nqpages : 0);
4031		if (usb_err != USB_ERR_NORMAL_COMPLETION)
4032			return (EIO);
4033		usb_err = urtwn_write_4(sc, R92C_RQPN,
4034		    /* Set number of pages for public queue. */
4035		    SM(R92C_RQPN_PUBQ, npubqpages) |
4036		    /* Set number of pages for high priority queue. */
4037		    SM(R92C_RQPN_HPQ, hashq ? nqpages + nrempages : 0) |
4038		    /* Set number of pages for low priority queue. */
4039		    SM(R92C_RQPN_LPQ, haslq ? nqpages : 0) |
4040		    /* Load values. */
4041		    R92C_RQPN_LD);
4042		if (usb_err != USB_ERR_NORMAL_COMPLETION)
4043			return (EIO);
4044	}
4045
4046	usb_err = urtwn_write_1(sc, R92C_TXPKTBUF_BCNQ_BDNY, tx_boundary);
4047	if (usb_err != USB_ERR_NORMAL_COMPLETION)
4048		return (EIO);
4049	usb_err = urtwn_write_1(sc, R92C_TXPKTBUF_MGQ_BDNY, tx_boundary);
4050	if (usb_err != USB_ERR_NORMAL_COMPLETION)
4051		return (EIO);
4052	usb_err = urtwn_write_1(sc, R92C_TXPKTBUF_WMAC_LBK_BF_HD, tx_boundary);
4053	if (usb_err != USB_ERR_NORMAL_COMPLETION)
4054		return (EIO);
4055	usb_err = urtwn_write_1(sc, R92C_TRXFF_BNDY, tx_boundary);
4056	if (usb_err != USB_ERR_NORMAL_COMPLETION)
4057		return (EIO);
4058	usb_err = urtwn_write_1(sc, R92C_TDECTRL + 1, tx_boundary);
4059	if (usb_err != USB_ERR_NORMAL_COMPLETION)
4060		return (EIO);
4061
4062	/* Set queue to USB pipe mapping. */
4063	reg = urtwn_read_2(sc, R92C_TRXDMA_CTRL);
4064	reg &= ~R92C_TRXDMA_CTRL_QMAP_M;
4065	if (nqueues == 1) {
4066		if (hashq)
4067			reg |= R92C_TRXDMA_CTRL_QMAP_HQ;
4068		else if (hasnq)
4069			reg |= R92C_TRXDMA_CTRL_QMAP_NQ;
4070		else
4071			reg |= R92C_TRXDMA_CTRL_QMAP_LQ;
4072	} else if (nqueues == 2) {
4073		/*
4074		 * All 2-endpoints configs have high and normal
4075		 * priority queues.
4076		 */
4077		reg |= R92C_TRXDMA_CTRL_QMAP_HQ_NQ;
4078	} else
4079		reg |= R92C_TRXDMA_CTRL_QMAP_3EP;
4080	usb_err = urtwn_write_2(sc, R92C_TRXDMA_CTRL, reg);
4081	if (usb_err != USB_ERR_NORMAL_COMPLETION)
4082		return (EIO);
4083
4084	/* Set Tx/Rx transfer page boundary. */
4085	usb_err = urtwn_write_2(sc, R92C_TRXFF_BNDY + 2,
4086	    (sc->chip & URTWN_CHIP_88E) ? 0x23ff : 0x27ff);
4087	if (usb_err != USB_ERR_NORMAL_COMPLETION)
4088		return (EIO);
4089
4090	/* Set Tx/Rx transfer page size. */
4091	usb_err = urtwn_write_1(sc, R92C_PBP,
4092	    SM(R92C_PBP_PSRX, R92C_PBP_128) |
4093	    SM(R92C_PBP_PSTX, R92C_PBP_128));
4094	if (usb_err != USB_ERR_NORMAL_COMPLETION)
4095		return (EIO);
4096
4097	return (0);
4098}
4099
4100static int
4101urtwn_mac_init(struct urtwn_softc *sc)
4102{
4103	usb_error_t error;
4104	int i;
4105
4106	/* Write MAC initialization values. */
4107	if (sc->chip & URTWN_CHIP_88E) {
4108		for (i = 0; i < nitems(rtl8188eu_mac); i++) {
4109			error = urtwn_write_1(sc, rtl8188eu_mac[i].reg,
4110			    rtl8188eu_mac[i].val);
4111			if (error != USB_ERR_NORMAL_COMPLETION)
4112				return (EIO);
4113		}
4114		urtwn_write_1(sc, R92C_MAX_AGGR_NUM, 0x07);
4115	} else {
4116		for (i = 0; i < nitems(rtl8192cu_mac); i++)
4117			error = urtwn_write_1(sc, rtl8192cu_mac[i].reg,
4118			    rtl8192cu_mac[i].val);
4119			if (error != USB_ERR_NORMAL_COMPLETION)
4120				return (EIO);
4121	}
4122
4123	return (0);
4124}
4125
4126static void
4127urtwn_bb_init(struct urtwn_softc *sc)
4128{
4129	const struct urtwn_bb_prog *prog;
4130	uint32_t reg;
4131	uint8_t crystalcap;
4132	int i;
4133
4134	/* Enable BB and RF. */
4135	urtwn_write_2(sc, R92C_SYS_FUNC_EN,
4136	    urtwn_read_2(sc, R92C_SYS_FUNC_EN) |
4137	    R92C_SYS_FUNC_EN_BBRSTB | R92C_SYS_FUNC_EN_BB_GLB_RST |
4138	    R92C_SYS_FUNC_EN_DIO_RF);
4139
4140	if (!(sc->chip & URTWN_CHIP_88E))
4141		urtwn_write_2(sc, R92C_AFE_PLL_CTRL, 0xdb83);
4142
4143	urtwn_write_1(sc, R92C_RF_CTRL,
4144	    R92C_RF_CTRL_EN | R92C_RF_CTRL_RSTB | R92C_RF_CTRL_SDMRSTB);
4145	urtwn_write_1(sc, R92C_SYS_FUNC_EN,
4146	    R92C_SYS_FUNC_EN_USBA | R92C_SYS_FUNC_EN_USBD |
4147	    R92C_SYS_FUNC_EN_BB_GLB_RST | R92C_SYS_FUNC_EN_BBRSTB);
4148
4149	if (!(sc->chip & URTWN_CHIP_88E)) {
4150		urtwn_write_1(sc, R92C_LDOHCI12_CTRL, 0x0f);
4151		urtwn_write_1(sc, 0x15, 0xe9);
4152		urtwn_write_1(sc, R92C_AFE_XTAL_CTRL + 1, 0x80);
4153	}
4154
4155	/* Select BB programming based on board type. */
4156	if (sc->chip & URTWN_CHIP_88E)
4157		prog = &rtl8188eu_bb_prog;
4158	else if (!(sc->chip & URTWN_CHIP_92C)) {
4159		if (sc->board_type == R92C_BOARD_TYPE_MINICARD)
4160			prog = &rtl8188ce_bb_prog;
4161		else if (sc->board_type == R92C_BOARD_TYPE_HIGHPA)
4162			prog = &rtl8188ru_bb_prog;
4163		else
4164			prog = &rtl8188cu_bb_prog;
4165	} else {
4166		if (sc->board_type == R92C_BOARD_TYPE_MINICARD)
4167			prog = &rtl8192ce_bb_prog;
4168		else
4169			prog = &rtl8192cu_bb_prog;
4170	}
4171	/* Write BB initialization values. */
4172	for (i = 0; i < prog->count; i++) {
4173		urtwn_bb_write(sc, prog->regs[i], prog->vals[i]);
4174		urtwn_ms_delay(sc);
4175	}
4176
4177	if (sc->chip & URTWN_CHIP_92C_1T2R) {
4178		/* 8192C 1T only configuration. */
4179		reg = urtwn_bb_read(sc, R92C_FPGA0_TXINFO);
4180		reg = (reg & ~0x00000003) | 0x2;
4181		urtwn_bb_write(sc, R92C_FPGA0_TXINFO, reg);
4182
4183		reg = urtwn_bb_read(sc, R92C_FPGA1_TXINFO);
4184		reg = (reg & ~0x00300033) | 0x00200022;
4185		urtwn_bb_write(sc, R92C_FPGA1_TXINFO, reg);
4186
4187		reg = urtwn_bb_read(sc, R92C_CCK0_AFESETTING);
4188		reg = (reg & ~0xff000000) | 0x45 << 24;
4189		urtwn_bb_write(sc, R92C_CCK0_AFESETTING, reg);
4190
4191		reg = urtwn_bb_read(sc, R92C_OFDM0_TRXPATHENA);
4192		reg = (reg & ~0x000000ff) | 0x23;
4193		urtwn_bb_write(sc, R92C_OFDM0_TRXPATHENA, reg);
4194
4195		reg = urtwn_bb_read(sc, R92C_OFDM0_AGCPARAM1);
4196		reg = (reg & ~0x00000030) | 1 << 4;
4197		urtwn_bb_write(sc, R92C_OFDM0_AGCPARAM1, reg);
4198
4199		reg = urtwn_bb_read(sc, 0xe74);
4200		reg = (reg & ~0x0c000000) | 2 << 26;
4201		urtwn_bb_write(sc, 0xe74, reg);
4202		reg = urtwn_bb_read(sc, 0xe78);
4203		reg = (reg & ~0x0c000000) | 2 << 26;
4204		urtwn_bb_write(sc, 0xe78, reg);
4205		reg = urtwn_bb_read(sc, 0xe7c);
4206		reg = (reg & ~0x0c000000) | 2 << 26;
4207		urtwn_bb_write(sc, 0xe7c, reg);
4208		reg = urtwn_bb_read(sc, 0xe80);
4209		reg = (reg & ~0x0c000000) | 2 << 26;
4210		urtwn_bb_write(sc, 0xe80, reg);
4211		reg = urtwn_bb_read(sc, 0xe88);
4212		reg = (reg & ~0x0c000000) | 2 << 26;
4213		urtwn_bb_write(sc, 0xe88, reg);
4214	}
4215
4216	/* Write AGC values. */
4217	for (i = 0; i < prog->agccount; i++) {
4218		urtwn_bb_write(sc, R92C_OFDM0_AGCRSSITABLE,
4219		    prog->agcvals[i]);
4220		urtwn_ms_delay(sc);
4221	}
4222
4223	if (sc->chip & URTWN_CHIP_88E) {
4224		urtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(0), 0x69553422);
4225		urtwn_ms_delay(sc);
4226		urtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(0), 0x69553420);
4227		urtwn_ms_delay(sc);
4228
4229		crystalcap = sc->rom.r88e_rom.crystalcap;
4230		if (crystalcap == 0xff)
4231			crystalcap = 0x20;
4232		crystalcap &= 0x3f;
4233		reg = urtwn_bb_read(sc, R92C_AFE_XTAL_CTRL);
4234		urtwn_bb_write(sc, R92C_AFE_XTAL_CTRL,
4235		    RW(reg, R92C_AFE_XTAL_CTRL_ADDR,
4236		    crystalcap | crystalcap << 6));
4237	} else {
4238		if (urtwn_bb_read(sc, R92C_HSSI_PARAM2(0)) &
4239		    R92C_HSSI_PARAM2_CCK_HIPWR)
4240			sc->sc_flags |= URTWN_FLAG_CCK_HIPWR;
4241	}
4242}
4243
4244static void
4245urtwn_rf_init(struct urtwn_softc *sc)
4246{
4247	const struct urtwn_rf_prog *prog;
4248	uint32_t reg, type;
4249	int i, j, idx, off;
4250
4251	/* Select RF programming based on board type. */
4252	if (sc->chip & URTWN_CHIP_88E)
4253		prog = rtl8188eu_rf_prog;
4254	else if (!(sc->chip & URTWN_CHIP_92C)) {
4255		if (sc->board_type == R92C_BOARD_TYPE_MINICARD)
4256			prog = rtl8188ce_rf_prog;
4257		else if (sc->board_type == R92C_BOARD_TYPE_HIGHPA)
4258			prog = rtl8188ru_rf_prog;
4259		else
4260			prog = rtl8188cu_rf_prog;
4261	} else
4262		prog = rtl8192ce_rf_prog;
4263
4264	for (i = 0; i < sc->nrxchains; i++) {
4265		/* Save RF_ENV control type. */
4266		idx = i / 2;
4267		off = (i % 2) * 16;
4268		reg = urtwn_bb_read(sc, R92C_FPGA0_RFIFACESW(idx));
4269		type = (reg >> off) & 0x10;
4270
4271		/* Set RF_ENV enable. */
4272		reg = urtwn_bb_read(sc, R92C_FPGA0_RFIFACEOE(i));
4273		reg |= 0x100000;
4274		urtwn_bb_write(sc, R92C_FPGA0_RFIFACEOE(i), reg);
4275		urtwn_ms_delay(sc);
4276		/* Set RF_ENV output high. */
4277		reg = urtwn_bb_read(sc, R92C_FPGA0_RFIFACEOE(i));
4278		reg |= 0x10;
4279		urtwn_bb_write(sc, R92C_FPGA0_RFIFACEOE(i), reg);
4280		urtwn_ms_delay(sc);
4281		/* Set address and data lengths of RF registers. */
4282		reg = urtwn_bb_read(sc, R92C_HSSI_PARAM2(i));
4283		reg &= ~R92C_HSSI_PARAM2_ADDR_LENGTH;
4284		urtwn_bb_write(sc, R92C_HSSI_PARAM2(i), reg);
4285		urtwn_ms_delay(sc);
4286		reg = urtwn_bb_read(sc, R92C_HSSI_PARAM2(i));
4287		reg &= ~R92C_HSSI_PARAM2_DATA_LENGTH;
4288		urtwn_bb_write(sc, R92C_HSSI_PARAM2(i), reg);
4289		urtwn_ms_delay(sc);
4290
4291		/* Write RF initialization values for this chain. */
4292		for (j = 0; j < prog[i].count; j++) {
4293			if (prog[i].regs[j] >= 0xf9 &&
4294			    prog[i].regs[j] <= 0xfe) {
4295				/*
4296				 * These are fake RF registers offsets that
4297				 * indicate a delay is required.
4298				 */
4299				usb_pause_mtx(&sc->sc_mtx, hz / 20);	/* 50ms */
4300				continue;
4301			}
4302			urtwn_rf_write(sc, i, prog[i].regs[j],
4303			    prog[i].vals[j]);
4304			urtwn_ms_delay(sc);
4305		}
4306
4307		/* Restore RF_ENV control type. */
4308		reg = urtwn_bb_read(sc, R92C_FPGA0_RFIFACESW(idx));
4309		reg &= ~(0x10 << off) | (type << off);
4310		urtwn_bb_write(sc, R92C_FPGA0_RFIFACESW(idx), reg);
4311
4312		/* Cache RF register CHNLBW. */
4313		sc->rf_chnlbw[i] = urtwn_rf_read(sc, i, R92C_RF_CHNLBW);
4314	}
4315
4316	if ((sc->chip & (URTWN_CHIP_UMC_A_CUT | URTWN_CHIP_92C)) ==
4317	    URTWN_CHIP_UMC_A_CUT) {
4318		urtwn_rf_write(sc, 0, R92C_RF_RX_G1, 0x30255);
4319		urtwn_rf_write(sc, 0, R92C_RF_RX_G2, 0x50a00);
4320	}
4321}
4322
4323static void
4324urtwn_cam_init(struct urtwn_softc *sc)
4325{
4326	/* Invalidate all CAM entries. */
4327	urtwn_write_4(sc, R92C_CAMCMD,
4328	    R92C_CAMCMD_POLLING | R92C_CAMCMD_CLR);
4329}
4330
4331static int
4332urtwn_cam_write(struct urtwn_softc *sc, uint32_t addr, uint32_t data)
4333{
4334	usb_error_t error;
4335
4336	error = urtwn_write_4(sc, R92C_CAMWRITE, data);
4337	if (error != USB_ERR_NORMAL_COMPLETION)
4338		return (EIO);
4339	error = urtwn_write_4(sc, R92C_CAMCMD,
4340	    R92C_CAMCMD_POLLING | R92C_CAMCMD_WRITE |
4341	    SM(R92C_CAMCMD_ADDR, addr));
4342	if (error != USB_ERR_NORMAL_COMPLETION)
4343		return (EIO);
4344
4345	return (0);
4346}
4347
4348static void
4349urtwn_pa_bias_init(struct urtwn_softc *sc)
4350{
4351	uint8_t reg;
4352	int i;
4353
4354	for (i = 0; i < sc->nrxchains; i++) {
4355		if (sc->pa_setting & (1 << i))
4356			continue;
4357		urtwn_rf_write(sc, i, R92C_RF_IPA, 0x0f406);
4358		urtwn_rf_write(sc, i, R92C_RF_IPA, 0x4f406);
4359		urtwn_rf_write(sc, i, R92C_RF_IPA, 0x8f406);
4360		urtwn_rf_write(sc, i, R92C_RF_IPA, 0xcf406);
4361	}
4362	if (!(sc->pa_setting & 0x10)) {
4363		reg = urtwn_read_1(sc, 0x16);
4364		reg = (reg & ~0xf0) | 0x90;
4365		urtwn_write_1(sc, 0x16, reg);
4366	}
4367}
4368
4369static void
4370urtwn_rxfilter_init(struct urtwn_softc *sc)
4371{
4372	struct ieee80211com *ic = &sc->sc_ic;
4373	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
4374	uint32_t rcr;
4375	uint16_t filter;
4376
4377	URTWN_ASSERT_LOCKED(sc);
4378
4379	/* Setup multicast filter. */
4380	urtwn_set_multi(sc);
4381
4382	/* Filter for management frames. */
4383	filter = 0x7f3f;
4384	switch (vap->iv_opmode) {
4385	case IEEE80211_M_STA:
4386		filter &= ~(
4387		    R92C_RXFLTMAP_SUBTYPE(IEEE80211_FC0_SUBTYPE_ASSOC_REQ) |
4388		    R92C_RXFLTMAP_SUBTYPE(IEEE80211_FC0_SUBTYPE_REASSOC_REQ) |
4389		    R92C_RXFLTMAP_SUBTYPE(IEEE80211_FC0_SUBTYPE_PROBE_REQ));
4390		break;
4391	case IEEE80211_M_HOSTAP:
4392		filter &= ~(
4393		    R92C_RXFLTMAP_SUBTYPE(IEEE80211_FC0_SUBTYPE_ASSOC_RESP) |
4394		    R92C_RXFLTMAP_SUBTYPE(IEEE80211_FC0_SUBTYPE_REASSOC_RESP));
4395		break;
4396	case IEEE80211_M_MONITOR:
4397	case IEEE80211_M_IBSS:
4398		break;
4399	default:
4400		device_printf(sc->sc_dev, "%s: undefined opmode %d\n",
4401		    __func__, vap->iv_opmode);
4402		break;
4403	}
4404	urtwn_write_2(sc, R92C_RXFLTMAP0, filter);
4405
4406	/* Reject all control frames. */
4407	urtwn_write_2(sc, R92C_RXFLTMAP1, 0x0000);
4408
4409	/* Reject all data frames. */
4410	urtwn_write_2(sc, R92C_RXFLTMAP2, 0x0000);
4411
4412	rcr = R92C_RCR_AM | R92C_RCR_AB | R92C_RCR_APM |
4413	      R92C_RCR_HTC_LOC_CTRL | R92C_RCR_APP_PHYSTS |
4414	      R92C_RCR_APP_ICV | R92C_RCR_APP_MIC;
4415
4416	if (vap->iv_opmode == IEEE80211_M_MONITOR) {
4417		/* Accept all frames. */
4418		rcr |= R92C_RCR_ACF | R92C_RCR_ADF | R92C_RCR_AMF |
4419		       R92C_RCR_AAP;
4420	}
4421
4422	/* Set Rx filter. */
4423	urtwn_write_4(sc, R92C_RCR, rcr);
4424
4425	if (ic->ic_promisc != 0) {
4426		/* Update Rx filter. */
4427		urtwn_set_promisc(sc);
4428	}
4429}
4430
4431static void
4432urtwn_edca_init(struct urtwn_softc *sc)
4433{
4434	urtwn_write_2(sc, R92C_SPEC_SIFS, 0x100a);
4435	urtwn_write_2(sc, R92C_MAC_SPEC_SIFS, 0x100a);
4436	urtwn_write_2(sc, R92C_SIFS_CCK, 0x100a);
4437	urtwn_write_2(sc, R92C_SIFS_OFDM, 0x100a);
4438	urtwn_write_4(sc, R92C_EDCA_BE_PARAM, 0x005ea42b);
4439	urtwn_write_4(sc, R92C_EDCA_BK_PARAM, 0x0000a44f);
4440	urtwn_write_4(sc, R92C_EDCA_VI_PARAM, 0x005ea324);
4441	urtwn_write_4(sc, R92C_EDCA_VO_PARAM, 0x002fa226);
4442}
4443
4444static void
4445urtwn_write_txpower(struct urtwn_softc *sc, int chain,
4446    uint16_t power[URTWN_RIDX_COUNT])
4447{
4448	uint32_t reg;
4449
4450	/* Write per-CCK rate Tx power. */
4451	if (chain == 0) {
4452		reg = urtwn_bb_read(sc, R92C_TXAGC_A_CCK1_MCS32);
4453		reg = RW(reg, R92C_TXAGC_A_CCK1,  power[0]);
4454		urtwn_bb_write(sc, R92C_TXAGC_A_CCK1_MCS32, reg);
4455		reg = urtwn_bb_read(sc, R92C_TXAGC_B_CCK11_A_CCK2_11);
4456		reg = RW(reg, R92C_TXAGC_A_CCK2,  power[1]);
4457		reg = RW(reg, R92C_TXAGC_A_CCK55, power[2]);
4458		reg = RW(reg, R92C_TXAGC_A_CCK11, power[3]);
4459		urtwn_bb_write(sc, R92C_TXAGC_B_CCK11_A_CCK2_11, reg);
4460	} else {
4461		reg = urtwn_bb_read(sc, R92C_TXAGC_B_CCK1_55_MCS32);
4462		reg = RW(reg, R92C_TXAGC_B_CCK1,  power[0]);
4463		reg = RW(reg, R92C_TXAGC_B_CCK2,  power[1]);
4464		reg = RW(reg, R92C_TXAGC_B_CCK55, power[2]);
4465		urtwn_bb_write(sc, R92C_TXAGC_B_CCK1_55_MCS32, reg);
4466		reg = urtwn_bb_read(sc, R92C_TXAGC_B_CCK11_A_CCK2_11);
4467		reg = RW(reg, R92C_TXAGC_B_CCK11, power[3]);
4468		urtwn_bb_write(sc, R92C_TXAGC_B_CCK11_A_CCK2_11, reg);
4469	}
4470	/* Write per-OFDM rate Tx power. */
4471	urtwn_bb_write(sc, R92C_TXAGC_RATE18_06(chain),
4472	    SM(R92C_TXAGC_RATE06, power[ 4]) |
4473	    SM(R92C_TXAGC_RATE09, power[ 5]) |
4474	    SM(R92C_TXAGC_RATE12, power[ 6]) |
4475	    SM(R92C_TXAGC_RATE18, power[ 7]));
4476	urtwn_bb_write(sc, R92C_TXAGC_RATE54_24(chain),
4477	    SM(R92C_TXAGC_RATE24, power[ 8]) |
4478	    SM(R92C_TXAGC_RATE36, power[ 9]) |
4479	    SM(R92C_TXAGC_RATE48, power[10]) |
4480	    SM(R92C_TXAGC_RATE54, power[11]));
4481	/* Write per-MCS Tx power. */
4482	urtwn_bb_write(sc, R92C_TXAGC_MCS03_MCS00(chain),
4483	    SM(R92C_TXAGC_MCS00,  power[12]) |
4484	    SM(R92C_TXAGC_MCS01,  power[13]) |
4485	    SM(R92C_TXAGC_MCS02,  power[14]) |
4486	    SM(R92C_TXAGC_MCS03,  power[15]));
4487	urtwn_bb_write(sc, R92C_TXAGC_MCS07_MCS04(chain),
4488	    SM(R92C_TXAGC_MCS04,  power[16]) |
4489	    SM(R92C_TXAGC_MCS05,  power[17]) |
4490	    SM(R92C_TXAGC_MCS06,  power[18]) |
4491	    SM(R92C_TXAGC_MCS07,  power[19]));
4492	urtwn_bb_write(sc, R92C_TXAGC_MCS11_MCS08(chain),
4493	    SM(R92C_TXAGC_MCS08,  power[20]) |
4494	    SM(R92C_TXAGC_MCS09,  power[21]) |
4495	    SM(R92C_TXAGC_MCS10,  power[22]) |
4496	    SM(R92C_TXAGC_MCS11,  power[23]));
4497	urtwn_bb_write(sc, R92C_TXAGC_MCS15_MCS12(chain),
4498	    SM(R92C_TXAGC_MCS12,  power[24]) |
4499	    SM(R92C_TXAGC_MCS13,  power[25]) |
4500	    SM(R92C_TXAGC_MCS14,  power[26]) |
4501	    SM(R92C_TXAGC_MCS15,  power[27]));
4502}
4503
4504static void
4505urtwn_get_txpower(struct urtwn_softc *sc, int chain,
4506    struct ieee80211_channel *c, struct ieee80211_channel *extc,
4507    uint16_t power[URTWN_RIDX_COUNT])
4508{
4509	struct ieee80211com *ic = &sc->sc_ic;
4510	struct r92c_rom *rom = &sc->rom.r92c_rom;
4511	uint16_t cckpow, ofdmpow, htpow, diff, max;
4512	const struct urtwn_txpwr *base;
4513	int ridx, chan, group;
4514
4515	/* Determine channel group. */
4516	chan = ieee80211_chan2ieee(ic, c);	/* XXX center freq! */
4517	if (chan <= 3)
4518		group = 0;
4519	else if (chan <= 9)
4520		group = 1;
4521	else
4522		group = 2;
4523
4524	/* Get original Tx power based on board type and RF chain. */
4525	if (!(sc->chip & URTWN_CHIP_92C)) {
4526		if (sc->board_type == R92C_BOARD_TYPE_HIGHPA)
4527			base = &rtl8188ru_txagc[chain];
4528		else
4529			base = &rtl8192cu_txagc[chain];
4530	} else
4531		base = &rtl8192cu_txagc[chain];
4532
4533	memset(power, 0, URTWN_RIDX_COUNT * sizeof(power[0]));
4534	if (sc->regulatory == 0) {
4535		for (ridx = URTWN_RIDX_CCK1; ridx <= URTWN_RIDX_CCK11; ridx++)
4536			power[ridx] = base->pwr[0][ridx];
4537	}
4538	for (ridx = URTWN_RIDX_OFDM6; ridx < URTWN_RIDX_COUNT; ridx++) {
4539		if (sc->regulatory == 3) {
4540			power[ridx] = base->pwr[0][ridx];
4541			/* Apply vendor limits. */
4542			if (extc != NULL)
4543				max = rom->ht40_max_pwr[group];
4544			else
4545				max = rom->ht20_max_pwr[group];
4546			max = (max >> (chain * 4)) & 0xf;
4547			if (power[ridx] > max)
4548				power[ridx] = max;
4549		} else if (sc->regulatory == 1) {
4550			if (extc == NULL)
4551				power[ridx] = base->pwr[group][ridx];
4552		} else if (sc->regulatory != 2)
4553			power[ridx] = base->pwr[0][ridx];
4554	}
4555
4556	/* Compute per-CCK rate Tx power. */
4557	cckpow = rom->cck_tx_pwr[chain][group];
4558	for (ridx = URTWN_RIDX_CCK1; ridx <= URTWN_RIDX_CCK11; ridx++) {
4559		power[ridx] += cckpow;
4560		if (power[ridx] > R92C_MAX_TX_PWR)
4561			power[ridx] = R92C_MAX_TX_PWR;
4562	}
4563
4564	htpow = rom->ht40_1s_tx_pwr[chain][group];
4565	if (sc->ntxchains > 1) {
4566		/* Apply reduction for 2 spatial streams. */
4567		diff = rom->ht40_2s_tx_pwr_diff[group];
4568		diff = (diff >> (chain * 4)) & 0xf;
4569		htpow = (htpow > diff) ? htpow - diff : 0;
4570	}
4571
4572	/* Compute per-OFDM rate Tx power. */
4573	diff = rom->ofdm_tx_pwr_diff[group];
4574	diff = (diff >> (chain * 4)) & 0xf;
4575	ofdmpow = htpow + diff;	/* HT->OFDM correction. */
4576	for (ridx = URTWN_RIDX_OFDM6; ridx <= URTWN_RIDX_OFDM54; ridx++) {
4577		power[ridx] += ofdmpow;
4578		if (power[ridx] > R92C_MAX_TX_PWR)
4579			power[ridx] = R92C_MAX_TX_PWR;
4580	}
4581
4582	/* Compute per-MCS Tx power. */
4583	if (extc == NULL) {
4584		diff = rom->ht20_tx_pwr_diff[group];
4585		diff = (diff >> (chain * 4)) & 0xf;
4586		htpow += diff;	/* HT40->HT20 correction. */
4587	}
4588	for (ridx = 12; ridx <= 27; ridx++) {
4589		power[ridx] += htpow;
4590		if (power[ridx] > R92C_MAX_TX_PWR)
4591			power[ridx] = R92C_MAX_TX_PWR;
4592	}
4593#ifdef USB_DEBUG
4594	if (sc->sc_debug & URTWN_DEBUG_TXPWR) {
4595		/* Dump per-rate Tx power values. */
4596		printf("Tx power for chain %d:\n", chain);
4597		for (ridx = URTWN_RIDX_CCK1; ridx < URTWN_RIDX_COUNT; ridx++)
4598			printf("Rate %d = %u\n", ridx, power[ridx]);
4599	}
4600#endif
4601}
4602
4603static void
4604urtwn_r88e_get_txpower(struct urtwn_softc *sc, int chain,
4605    struct ieee80211_channel *c, struct ieee80211_channel *extc,
4606    uint16_t power[URTWN_RIDX_COUNT])
4607{
4608	struct ieee80211com *ic = &sc->sc_ic;
4609	struct r88e_rom *rom = &sc->rom.r88e_rom;
4610	uint16_t cckpow, ofdmpow, bw20pow, htpow;
4611	const struct urtwn_r88e_txpwr *base;
4612	int ridx, chan, group;
4613
4614	/* Determine channel group. */
4615	chan = ieee80211_chan2ieee(ic, c);	/* XXX center freq! */
4616	if (chan <= 2)
4617		group = 0;
4618	else if (chan <= 5)
4619		group = 1;
4620	else if (chan <= 8)
4621		group = 2;
4622	else if (chan <= 11)
4623		group = 3;
4624	else if (chan <= 13)
4625		group = 4;
4626	else
4627		group = 5;
4628
4629	/* Get original Tx power based on board type and RF chain. */
4630	base = &rtl8188eu_txagc[chain];
4631
4632	memset(power, 0, URTWN_RIDX_COUNT * sizeof(power[0]));
4633	if (sc->regulatory == 0) {
4634		for (ridx = URTWN_RIDX_CCK1; ridx <= URTWN_RIDX_CCK11; ridx++)
4635			power[ridx] = base->pwr[0][ridx];
4636	}
4637	for (ridx = URTWN_RIDX_OFDM6; ridx < URTWN_RIDX_COUNT; ridx++) {
4638		if (sc->regulatory == 3)
4639			power[ridx] = base->pwr[0][ridx];
4640		else if (sc->regulatory == 1) {
4641			if (extc == NULL)
4642				power[ridx] = base->pwr[group][ridx];
4643		} else if (sc->regulatory != 2)
4644			power[ridx] = base->pwr[0][ridx];
4645	}
4646
4647	/* Compute per-CCK rate Tx power. */
4648	cckpow = rom->cck_tx_pwr[group];
4649	for (ridx = URTWN_RIDX_CCK1; ridx <= URTWN_RIDX_CCK11; ridx++) {
4650		power[ridx] += cckpow;
4651		if (power[ridx] > R92C_MAX_TX_PWR)
4652			power[ridx] = R92C_MAX_TX_PWR;
4653	}
4654
4655	htpow = rom->ht40_tx_pwr[group];
4656
4657	/* Compute per-OFDM rate Tx power. */
4658	ofdmpow = htpow + sc->ofdm_tx_pwr_diff;
4659	for (ridx = URTWN_RIDX_OFDM6; ridx <= URTWN_RIDX_OFDM54; ridx++) {
4660		power[ridx] += ofdmpow;
4661		if (power[ridx] > R92C_MAX_TX_PWR)
4662			power[ridx] = R92C_MAX_TX_PWR;
4663	}
4664
4665	bw20pow = htpow + sc->bw20_tx_pwr_diff;
4666	for (ridx = 12; ridx <= 27; ridx++) {
4667		power[ridx] += bw20pow;
4668		if (power[ridx] > R92C_MAX_TX_PWR)
4669			power[ridx] = R92C_MAX_TX_PWR;
4670	}
4671}
4672
4673static void
4674urtwn_set_txpower(struct urtwn_softc *sc, struct ieee80211_channel *c,
4675    struct ieee80211_channel *extc)
4676{
4677	uint16_t power[URTWN_RIDX_COUNT];
4678	int i;
4679
4680	for (i = 0; i < sc->ntxchains; i++) {
4681		/* Compute per-rate Tx power values. */
4682		if (sc->chip & URTWN_CHIP_88E)
4683			urtwn_r88e_get_txpower(sc, i, c, extc, power);
4684		else
4685			urtwn_get_txpower(sc, i, c, extc, power);
4686		/* Write per-rate Tx power values to hardware. */
4687		urtwn_write_txpower(sc, i, power);
4688	}
4689}
4690
4691static void
4692urtwn_set_rx_bssid_all(struct urtwn_softc *sc, int enable)
4693{
4694	uint32_t reg;
4695
4696	reg = urtwn_read_4(sc, R92C_RCR);
4697	if (enable)
4698		reg &= ~R92C_RCR_CBSSID_BCN;
4699	else
4700		reg |= R92C_RCR_CBSSID_BCN;
4701	urtwn_write_4(sc, R92C_RCR, reg);
4702}
4703
4704static void
4705urtwn_set_gain(struct urtwn_softc *sc, uint8_t gain)
4706{
4707	uint32_t reg;
4708
4709	reg = urtwn_bb_read(sc, R92C_OFDM0_AGCCORE1(0));
4710	reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, gain);
4711	urtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(0), reg);
4712
4713	if (!(sc->chip & URTWN_CHIP_88E)) {
4714		reg = urtwn_bb_read(sc, R92C_OFDM0_AGCCORE1(1));
4715		reg = RW(reg, R92C_OFDM0_AGCCORE1_GAIN, gain);
4716		urtwn_bb_write(sc, R92C_OFDM0_AGCCORE1(1), reg);
4717	}
4718}
4719
4720static void
4721urtwn_scan_start(struct ieee80211com *ic)
4722{
4723	struct urtwn_softc *sc = ic->ic_softc;
4724
4725	URTWN_LOCK(sc);
4726	/* Receive beacons / probe responses from any BSSID. */
4727	if (ic->ic_opmode != IEEE80211_M_IBSS)
4728		urtwn_set_rx_bssid_all(sc, 1);
4729
4730	/* Set gain for scanning. */
4731	urtwn_set_gain(sc, 0x20);
4732	URTWN_UNLOCK(sc);
4733}
4734
4735static void
4736urtwn_scan_end(struct ieee80211com *ic)
4737{
4738	struct urtwn_softc *sc = ic->ic_softc;
4739
4740	URTWN_LOCK(sc);
4741	/* Restore limitations. */
4742	if (ic->ic_promisc == 0 && ic->ic_opmode != IEEE80211_M_IBSS)
4743		urtwn_set_rx_bssid_all(sc, 0);
4744
4745	/* Set gain under link. */
4746	urtwn_set_gain(sc, 0x32);
4747	URTWN_UNLOCK(sc);
4748}
4749
4750static void
4751urtwn_set_channel(struct ieee80211com *ic)
4752{
4753	struct urtwn_softc *sc = ic->ic_softc;
4754	struct ieee80211_channel *c = ic->ic_curchan;
4755	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
4756
4757	URTWN_LOCK(sc);
4758	if (vap->iv_state == IEEE80211_S_SCAN) {
4759		/* Make link LED blink during scan. */
4760		urtwn_set_led(sc, URTWN_LED_LINK, !sc->ledlink);
4761	}
4762	urtwn_set_chan(sc, c, NULL);
4763	sc->sc_rxtap.wr_chan_freq = htole16(c->ic_freq);
4764	sc->sc_rxtap.wr_chan_flags = htole16(c->ic_flags);
4765	sc->sc_txtap.wt_chan_freq = htole16(c->ic_freq);
4766	sc->sc_txtap.wt_chan_flags = htole16(c->ic_flags);
4767	URTWN_UNLOCK(sc);
4768}
4769
4770static int
4771urtwn_wme_update(struct ieee80211com *ic)
4772{
4773	const struct wmeParams *wmep =
4774	    ic->ic_wme.wme_chanParams.cap_wmeParams;
4775	struct urtwn_softc *sc = ic->ic_softc;
4776	uint8_t aifs, acm, slottime;
4777	int ac;
4778
4779	acm = 0;
4780	slottime = IEEE80211_GET_SLOTTIME(ic);
4781
4782	URTWN_LOCK(sc);
4783	for (ac = WME_AC_BE; ac < WME_NUM_AC; ac++) {
4784		/* AIFS[AC] = AIFSN[AC] * aSlotTime + aSIFSTime. */
4785		aifs = wmep[ac].wmep_aifsn * slottime + IEEE80211_DUR_SIFS;
4786		urtwn_write_4(sc, wme2queue[ac].reg,
4787		    SM(R92C_EDCA_PARAM_TXOP, wmep[ac].wmep_txopLimit) |
4788		    SM(R92C_EDCA_PARAM_ECWMIN, wmep[ac].wmep_logcwmin) |
4789		    SM(R92C_EDCA_PARAM_ECWMAX, wmep[ac].wmep_logcwmax) |
4790		    SM(R92C_EDCA_PARAM_AIFS, aifs));
4791		if (ac != WME_AC_BE)
4792			acm |= wmep[ac].wmep_acm << ac;
4793	}
4794
4795	if (acm != 0)
4796		acm |= R92C_ACMHWCTRL_EN;
4797	urtwn_write_1(sc, R92C_ACMHWCTRL,
4798	    (urtwn_read_1(sc, R92C_ACMHWCTRL) & ~R92C_ACMHWCTRL_ACM_MASK) |
4799	    acm);
4800
4801	URTWN_UNLOCK(sc);
4802
4803	return 0;
4804}
4805
4806static void
4807urtwn_update_slot(struct ieee80211com *ic)
4808{
4809	urtwn_cmd_sleepable(ic->ic_softc, NULL, 0, urtwn_update_slot_cb);
4810}
4811
4812static void
4813urtwn_update_slot_cb(struct urtwn_softc *sc, union sec_param *data)
4814{
4815	struct ieee80211com *ic = &sc->sc_ic;
4816	uint8_t slottime;
4817
4818	slottime = IEEE80211_GET_SLOTTIME(ic);
4819
4820	URTWN_DPRINTF(sc, URTWN_DEBUG_ANY, "%s: setting slot time to %uus\n",
4821	    __func__, slottime);
4822
4823	urtwn_write_1(sc, R92C_SLOT, slottime);
4824	urtwn_update_aifs(sc, slottime);
4825}
4826
4827static void
4828urtwn_update_aifs(struct urtwn_softc *sc, uint8_t slottime)
4829{
4830	const struct wmeParams *wmep =
4831	    sc->sc_ic.ic_wme.wme_chanParams.cap_wmeParams;
4832	uint8_t aifs, ac;
4833
4834	for (ac = WME_AC_BE; ac < WME_NUM_AC; ac++) {
4835		/* AIFS[AC] = AIFSN[AC] * aSlotTime + aSIFSTime. */
4836		aifs = wmep[ac].wmep_aifsn * slottime + IEEE80211_DUR_SIFS;
4837		urtwn_write_1(sc, wme2queue[ac].reg, aifs);
4838        }
4839}
4840
4841static uint8_t
4842urtwn_get_multi_pos(const uint8_t maddr[])
4843{
4844	uint64_t mask = 0x00004d101df481b4;
4845	uint8_t pos = 0x27;	/* initial value */
4846	int i, j;
4847
4848	for (i = 0; i < IEEE80211_ADDR_LEN; i++)
4849		for (j = (i == 0) ? 1 : 0; j < 8; j++)
4850			if ((maddr[i] >> j) & 1)
4851				pos ^= (mask >> (i * 8 + j - 1));
4852
4853	pos &= 0x3f;
4854
4855	return (pos);
4856}
4857
4858static void
4859urtwn_set_multi(struct urtwn_softc *sc)
4860{
4861	struct ieee80211com *ic = &sc->sc_ic;
4862	uint32_t mfilt[2];
4863
4864	URTWN_ASSERT_LOCKED(sc);
4865
4866	/* general structure was copied from ath(4). */
4867	if (ic->ic_allmulti == 0) {
4868		struct ieee80211vap *vap;
4869		struct ifnet *ifp;
4870		struct ifmultiaddr *ifma;
4871
4872		/*
4873		 * Merge multicast addresses to form the hardware filter.
4874		 */
4875		mfilt[0] = mfilt[1] = 0;
4876		TAILQ_FOREACH(vap, &ic->ic_vaps, iv_next) {
4877			ifp = vap->iv_ifp;
4878			if_maddr_rlock(ifp);
4879			TAILQ_FOREACH(ifma, &ifp->if_multiaddrs, ifma_link) {
4880				caddr_t dl;
4881				uint8_t pos;
4882
4883				dl = LLADDR((struct sockaddr_dl *)
4884				    ifma->ifma_addr);
4885				pos = urtwn_get_multi_pos(dl);
4886
4887				mfilt[pos / 32] |= (1 << (pos % 32));
4888			}
4889			if_maddr_runlock(ifp);
4890		}
4891	} else
4892		mfilt[0] = mfilt[1] = ~0;
4893
4894
4895	urtwn_write_4(sc, R92C_MAR + 0, mfilt[0]);
4896	urtwn_write_4(sc, R92C_MAR + 4, mfilt[1]);
4897
4898	URTWN_DPRINTF(sc, URTWN_DEBUG_STATE, "%s: MC filter %08x:%08x\n",
4899	     __func__, mfilt[0], mfilt[1]);
4900}
4901
4902static void
4903urtwn_set_promisc(struct urtwn_softc *sc)
4904{
4905	struct ieee80211com *ic = &sc->sc_ic;
4906	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
4907	uint32_t rcr, mask1, mask2;
4908
4909	URTWN_ASSERT_LOCKED(sc);
4910
4911	if (vap->iv_opmode == IEEE80211_M_MONITOR)
4912		return;
4913
4914	mask1 = R92C_RCR_ACF | R92C_RCR_ADF | R92C_RCR_AMF | R92C_RCR_AAP;
4915	mask2 = R92C_RCR_APM;
4916
4917	if (vap->iv_state == IEEE80211_S_RUN) {
4918		switch (vap->iv_opmode) {
4919		case IEEE80211_M_STA:
4920			mask2 |= R92C_RCR_CBSSID_DATA;
4921			/* FALLTHROUGH */
4922		case IEEE80211_M_HOSTAP:
4923			mask2 |= R92C_RCR_CBSSID_BCN;
4924			break;
4925		case IEEE80211_M_IBSS:
4926			mask2 |= R92C_RCR_CBSSID_DATA;
4927			break;
4928		default:
4929			device_printf(sc->sc_dev, "%s: undefined opmode %d\n",
4930			    __func__, vap->iv_opmode);
4931			return;
4932		}
4933	}
4934
4935	rcr = urtwn_read_4(sc, R92C_RCR);
4936	if (ic->ic_promisc == 0)
4937		rcr = (rcr & ~mask1) | mask2;
4938	else
4939		rcr = (rcr & ~mask2) | mask1;
4940	urtwn_write_4(sc, R92C_RCR, rcr);
4941}
4942
4943static void
4944urtwn_update_promisc(struct ieee80211com *ic)
4945{
4946	struct urtwn_softc *sc = ic->ic_softc;
4947
4948	URTWN_LOCK(sc);
4949	if (sc->sc_flags & URTWN_RUNNING)
4950		urtwn_set_promisc(sc);
4951	URTWN_UNLOCK(sc);
4952}
4953
4954static void
4955urtwn_update_mcast(struct ieee80211com *ic)
4956{
4957	struct urtwn_softc *sc = ic->ic_softc;
4958
4959	URTWN_LOCK(sc);
4960	if (sc->sc_flags & URTWN_RUNNING)
4961		urtwn_set_multi(sc);
4962	URTWN_UNLOCK(sc);
4963}
4964
4965static struct ieee80211_node *
4966urtwn_node_alloc(struct ieee80211vap *vap,
4967    const uint8_t mac[IEEE80211_ADDR_LEN])
4968{
4969	struct urtwn_node *un;
4970
4971	un = malloc(sizeof (struct urtwn_node), M_80211_NODE,
4972	    M_NOWAIT | M_ZERO);
4973
4974	if (un == NULL)
4975		return NULL;
4976
4977	un->id = URTWN_MACID_UNDEFINED;
4978
4979	return &un->ni;
4980}
4981
4982static void
4983urtwn_newassoc(struct ieee80211_node *ni, int isnew)
4984{
4985	struct urtwn_softc *sc = ni->ni_ic->ic_softc;
4986	struct urtwn_node *un = URTWN_NODE(ni);
4987	uint8_t id;
4988
4989	/* Only do this bit for R88E chips */
4990	if (! (sc->chip & URTWN_CHIP_88E))
4991		return;
4992
4993	if (!isnew)
4994		return;
4995
4996	URTWN_NT_LOCK(sc);
4997	for (id = 0; id <= URTWN_MACID_MAX(sc); id++) {
4998		if (id != URTWN_MACID_BC && sc->node_list[id] == NULL) {
4999			un->id = id;
5000			sc->node_list[id] = ni;
5001			break;
5002		}
5003	}
5004	URTWN_NT_UNLOCK(sc);
5005
5006	if (id > URTWN_MACID_MAX(sc)) {
5007		device_printf(sc->sc_dev, "%s: node table is full\n",
5008		    __func__);
5009	}
5010}
5011
5012static void
5013urtwn_node_free(struct ieee80211_node *ni)
5014{
5015	struct urtwn_softc *sc = ni->ni_ic->ic_softc;
5016	struct urtwn_node *un = URTWN_NODE(ni);
5017
5018	URTWN_NT_LOCK(sc);
5019	if (un->id != URTWN_MACID_UNDEFINED)
5020		sc->node_list[un->id] = NULL;
5021	URTWN_NT_UNLOCK(sc);
5022
5023	sc->sc_node_free(ni);
5024}
5025
5026static void
5027urtwn_set_chan(struct urtwn_softc *sc, struct ieee80211_channel *c,
5028    struct ieee80211_channel *extc)
5029{
5030	struct ieee80211com *ic = &sc->sc_ic;
5031	uint32_t reg;
5032	u_int chan;
5033	int i;
5034
5035	chan = ieee80211_chan2ieee(ic, c);	/* XXX center freq! */
5036	if (chan == 0 || chan == IEEE80211_CHAN_ANY) {
5037		device_printf(sc->sc_dev,
5038		    "%s: invalid channel %x\n", __func__, chan);
5039		return;
5040	}
5041
5042	/* Set Tx power for this new channel. */
5043	urtwn_set_txpower(sc, c, extc);
5044
5045	for (i = 0; i < sc->nrxchains; i++) {
5046		urtwn_rf_write(sc, i, R92C_RF_CHNLBW,
5047		    RW(sc->rf_chnlbw[i], R92C_RF_CHNLBW_CHNL, chan));
5048	}
5049#ifndef IEEE80211_NO_HT
5050	if (extc != NULL) {
5051		/* Is secondary channel below or above primary? */
5052		int prichlo = c->ic_freq < extc->ic_freq;
5053
5054		urtwn_write_1(sc, R92C_BWOPMODE,
5055		    urtwn_read_1(sc, R92C_BWOPMODE) & ~R92C_BWOPMODE_20MHZ);
5056
5057		reg = urtwn_read_1(sc, R92C_RRSR + 2);
5058		reg = (reg & ~0x6f) | (prichlo ? 1 : 2) << 5;
5059		urtwn_write_1(sc, R92C_RRSR + 2, reg);
5060
5061		urtwn_bb_write(sc, R92C_FPGA0_RFMOD,
5062		    urtwn_bb_read(sc, R92C_FPGA0_RFMOD) | R92C_RFMOD_40MHZ);
5063		urtwn_bb_write(sc, R92C_FPGA1_RFMOD,
5064		    urtwn_bb_read(sc, R92C_FPGA1_RFMOD) | R92C_RFMOD_40MHZ);
5065
5066		/* Set CCK side band. */
5067		reg = urtwn_bb_read(sc, R92C_CCK0_SYSTEM);
5068		reg = (reg & ~0x00000010) | (prichlo ? 0 : 1) << 4;
5069		urtwn_bb_write(sc, R92C_CCK0_SYSTEM, reg);
5070
5071		reg = urtwn_bb_read(sc, R92C_OFDM1_LSTF);
5072		reg = (reg & ~0x00000c00) | (prichlo ? 1 : 2) << 10;
5073		urtwn_bb_write(sc, R92C_OFDM1_LSTF, reg);
5074
5075		urtwn_bb_write(sc, R92C_FPGA0_ANAPARAM2,
5076		    urtwn_bb_read(sc, R92C_FPGA0_ANAPARAM2) &
5077		    ~R92C_FPGA0_ANAPARAM2_CBW20);
5078
5079		reg = urtwn_bb_read(sc, 0x818);
5080		reg = (reg & ~0x0c000000) | (prichlo ? 2 : 1) << 26;
5081		urtwn_bb_write(sc, 0x818, reg);
5082
5083		/* Select 40MHz bandwidth. */
5084		urtwn_rf_write(sc, 0, R92C_RF_CHNLBW,
5085		    (sc->rf_chnlbw[0] & ~0xfff) | chan);
5086	} else
5087#endif
5088	{
5089		urtwn_write_1(sc, R92C_BWOPMODE,
5090		    urtwn_read_1(sc, R92C_BWOPMODE) | R92C_BWOPMODE_20MHZ);
5091
5092		urtwn_bb_write(sc, R92C_FPGA0_RFMOD,
5093		    urtwn_bb_read(sc, R92C_FPGA0_RFMOD) & ~R92C_RFMOD_40MHZ);
5094		urtwn_bb_write(sc, R92C_FPGA1_RFMOD,
5095		    urtwn_bb_read(sc, R92C_FPGA1_RFMOD) & ~R92C_RFMOD_40MHZ);
5096
5097		if (!(sc->chip & URTWN_CHIP_88E)) {
5098			urtwn_bb_write(sc, R92C_FPGA0_ANAPARAM2,
5099			    urtwn_bb_read(sc, R92C_FPGA0_ANAPARAM2) |
5100			    R92C_FPGA0_ANAPARAM2_CBW20);
5101		}
5102
5103		/* Select 20MHz bandwidth. */
5104		urtwn_rf_write(sc, 0, R92C_RF_CHNLBW,
5105		    (sc->rf_chnlbw[0] & ~0xfff) | chan |
5106		    ((sc->chip & URTWN_CHIP_88E) ? R88E_RF_CHNLBW_BW20 :
5107		    R92C_RF_CHNLBW_BW20));
5108	}
5109}
5110
5111static void
5112urtwn_iq_calib(struct urtwn_softc *sc)
5113{
5114	/* TODO */
5115}
5116
5117static void
5118urtwn_lc_calib(struct urtwn_softc *sc)
5119{
5120	uint32_t rf_ac[2];
5121	uint8_t txmode;
5122	int i;
5123
5124	txmode = urtwn_read_1(sc, R92C_OFDM1_LSTF + 3);
5125	if ((txmode & 0x70) != 0) {
5126		/* Disable all continuous Tx. */
5127		urtwn_write_1(sc, R92C_OFDM1_LSTF + 3, txmode & ~0x70);
5128
5129		/* Set RF mode to standby mode. */
5130		for (i = 0; i < sc->nrxchains; i++) {
5131			rf_ac[i] = urtwn_rf_read(sc, i, R92C_RF_AC);
5132			urtwn_rf_write(sc, i, R92C_RF_AC,
5133			    RW(rf_ac[i], R92C_RF_AC_MODE,
5134				R92C_RF_AC_MODE_STANDBY));
5135		}
5136	} else {
5137		/* Block all Tx queues. */
5138		urtwn_write_1(sc, R92C_TXPAUSE, R92C_TX_QUEUE_ALL);
5139	}
5140	/* Start calibration. */
5141	urtwn_rf_write(sc, 0, R92C_RF_CHNLBW,
5142	    urtwn_rf_read(sc, 0, R92C_RF_CHNLBW) | R92C_RF_CHNLBW_LCSTART);
5143
5144	/* Give calibration the time to complete. */
5145	usb_pause_mtx(&sc->sc_mtx, hz / 10);		/* 100ms */
5146
5147	/* Restore configuration. */
5148	if ((txmode & 0x70) != 0) {
5149		/* Restore Tx mode. */
5150		urtwn_write_1(sc, R92C_OFDM1_LSTF + 3, txmode);
5151		/* Restore RF mode. */
5152		for (i = 0; i < sc->nrxchains; i++)
5153			urtwn_rf_write(sc, i, R92C_RF_AC, rf_ac[i]);
5154	} else {
5155		/* Unblock all Tx queues. */
5156		urtwn_write_1(sc, R92C_TXPAUSE, 0x00);
5157	}
5158}
5159
5160static void
5161urtwn_temp_calib(struct urtwn_softc *sc)
5162{
5163	uint8_t temp;
5164
5165	URTWN_ASSERT_LOCKED(sc);
5166
5167	if (!(sc->sc_flags & URTWN_TEMP_MEASURED)) {
5168		/* Start measuring temperature. */
5169		URTWN_DPRINTF(sc, URTWN_DEBUG_TEMP,
5170		    "%s: start measuring temperature\n", __func__);
5171		if (sc->chip & URTWN_CHIP_88E) {
5172			urtwn_rf_write(sc, 0, R88E_RF_T_METER,
5173			    R88E_RF_T_METER_START);
5174		} else {
5175			urtwn_rf_write(sc, 0, R92C_RF_T_METER,
5176			    R92C_RF_T_METER_START);
5177		}
5178		sc->sc_flags |= URTWN_TEMP_MEASURED;
5179		return;
5180	}
5181	sc->sc_flags &= ~URTWN_TEMP_MEASURED;
5182
5183	/* Read measured temperature. */
5184	if (sc->chip & URTWN_CHIP_88E) {
5185		temp = MS(urtwn_rf_read(sc, 0, R88E_RF_T_METER),
5186		    R88E_RF_T_METER_VAL);
5187	} else {
5188		temp = MS(urtwn_rf_read(sc, 0, R92C_RF_T_METER),
5189		    R92C_RF_T_METER_VAL);
5190	}
5191	if (temp == 0) {	/* Read failed, skip. */
5192		URTWN_DPRINTF(sc, URTWN_DEBUG_TEMP,
5193		    "%s: temperature read failed, skipping\n", __func__);
5194		return;
5195	}
5196
5197	URTWN_DPRINTF(sc, URTWN_DEBUG_TEMP,
5198	    "%s: temperature: previous %u, current %u\n",
5199	    __func__, sc->thcal_lctemp, temp);
5200
5201	/*
5202	 * Redo LC calibration if temperature changed significantly since
5203	 * last calibration.
5204	 */
5205	if (sc->thcal_lctemp == 0) {
5206		/* First LC calibration is performed in urtwn_init(). */
5207		sc->thcal_lctemp = temp;
5208	} else if (abs(temp - sc->thcal_lctemp) > 1) {
5209		URTWN_DPRINTF(sc, URTWN_DEBUG_TEMP,
5210		    "%s: LC calib triggered by temp: %u -> %u\n",
5211		    __func__, sc->thcal_lctemp, temp);
5212		urtwn_lc_calib(sc);
5213		/* Record temperature of last LC calibration. */
5214		sc->thcal_lctemp = temp;
5215	}
5216}
5217
5218static int
5219urtwn_init(struct urtwn_softc *sc)
5220{
5221	struct ieee80211com *ic = &sc->sc_ic;
5222	struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
5223	uint8_t macaddr[IEEE80211_ADDR_LEN];
5224	uint32_t reg;
5225	usb_error_t usb_err = USB_ERR_NORMAL_COMPLETION;
5226	int error;
5227
5228	URTWN_LOCK(sc);
5229	if (sc->sc_flags & URTWN_RUNNING) {
5230		URTWN_UNLOCK(sc);
5231		return (0);
5232	}
5233
5234	/* Init firmware commands ring. */
5235	sc->fwcur = 0;
5236
5237	/* Allocate Tx/Rx buffers. */
5238	error = urtwn_alloc_rx_list(sc);
5239	if (error != 0)
5240		goto fail;
5241
5242	error = urtwn_alloc_tx_list(sc);
5243	if (error != 0)
5244		goto fail;
5245
5246	/* Power on adapter. */
5247	error = urtwn_power_on(sc);
5248	if (error != 0)
5249		goto fail;
5250
5251	/* Initialize DMA. */
5252	error = urtwn_dma_init(sc);
5253	if (error != 0)
5254		goto fail;
5255
5256	/* Set info size in Rx descriptors (in 64-bit words). */
5257	urtwn_write_1(sc, R92C_RX_DRVINFO_SZ, 4);
5258
5259	/* Init interrupts. */
5260	if (sc->chip & URTWN_CHIP_88E) {
5261		usb_err = urtwn_write_4(sc, R88E_HISR, 0xffffffff);
5262		if (usb_err != USB_ERR_NORMAL_COMPLETION)
5263			goto fail;
5264		usb_err = urtwn_write_4(sc, R88E_HIMR, R88E_HIMR_CPWM | R88E_HIMR_CPWM2 |
5265		    R88E_HIMR_TBDER | R88E_HIMR_PSTIMEOUT);
5266		if (usb_err != USB_ERR_NORMAL_COMPLETION)
5267			goto fail;
5268		usb_err = urtwn_write_4(sc, R88E_HIMRE, R88E_HIMRE_RXFOVW |
5269		    R88E_HIMRE_TXFOVW | R88E_HIMRE_RXERR | R88E_HIMRE_TXERR);
5270		if (usb_err != USB_ERR_NORMAL_COMPLETION)
5271			goto fail;
5272		usb_err = urtwn_write_1(sc, R92C_USB_SPECIAL_OPTION,
5273		    urtwn_read_1(sc, R92C_USB_SPECIAL_OPTION) |
5274		    R92C_USB_SPECIAL_OPTION_INT_BULK_SEL);
5275		if (usb_err != USB_ERR_NORMAL_COMPLETION)
5276			goto fail;
5277	} else {
5278		usb_err = urtwn_write_4(sc, R92C_HISR, 0xffffffff);
5279		if (usb_err != USB_ERR_NORMAL_COMPLETION)
5280			goto fail;
5281		usb_err = urtwn_write_4(sc, R92C_HIMR, 0xffffffff);
5282		if (usb_err != USB_ERR_NORMAL_COMPLETION)
5283			goto fail;
5284	}
5285
5286	/* Set MAC address. */
5287	IEEE80211_ADDR_COPY(macaddr, vap ? vap->iv_myaddr : ic->ic_macaddr);
5288	usb_err = urtwn_write_region_1(sc, R92C_MACID, macaddr, IEEE80211_ADDR_LEN);
5289	if (usb_err != USB_ERR_NORMAL_COMPLETION)
5290		goto fail;
5291
5292	/* Set initial network type. */
5293	urtwn_set_mode(sc, R92C_MSR_INFRA);
5294
5295	/* Initialize Rx filter. */
5296	urtwn_rxfilter_init(sc);
5297
5298	/* Set response rate. */
5299	reg = urtwn_read_4(sc, R92C_RRSR);
5300	reg = RW(reg, R92C_RRSR_RATE_BITMAP, R92C_RRSR_RATE_CCK_ONLY_1M);
5301	urtwn_write_4(sc, R92C_RRSR, reg);
5302
5303	/* Set short/long retry limits. */
5304	urtwn_write_2(sc, R92C_RL,
5305	    SM(R92C_RL_SRL, 0x30) | SM(R92C_RL_LRL, 0x30));
5306
5307	/* Initialize EDCA parameters. */
5308	urtwn_edca_init(sc);
5309
5310	/* Setup rate fallback. */
5311	if (!(sc->chip & URTWN_CHIP_88E)) {
5312		urtwn_write_4(sc, R92C_DARFRC + 0, 0x00000000);
5313		urtwn_write_4(sc, R92C_DARFRC + 4, 0x10080404);
5314		urtwn_write_4(sc, R92C_RARFRC + 0, 0x04030201);
5315		urtwn_write_4(sc, R92C_RARFRC + 4, 0x08070605);
5316	}
5317
5318	urtwn_write_1(sc, R92C_FWHW_TXQ_CTRL,
5319	    urtwn_read_1(sc, R92C_FWHW_TXQ_CTRL) |
5320	    R92C_FWHW_TXQ_CTRL_AMPDU_RTY_NEW);
5321	/* Set ACK timeout. */
5322	urtwn_write_1(sc, R92C_ACKTO, 0x40);
5323
5324	/* Setup USB aggregation. */
5325	reg = urtwn_read_4(sc, R92C_TDECTRL);
5326	reg = RW(reg, R92C_TDECTRL_BLK_DESC_NUM, 6);
5327	urtwn_write_4(sc, R92C_TDECTRL, reg);
5328	urtwn_write_1(sc, R92C_TRXDMA_CTRL,
5329	    urtwn_read_1(sc, R92C_TRXDMA_CTRL) |
5330	    R92C_TRXDMA_CTRL_RXDMA_AGG_EN);
5331	urtwn_write_1(sc, R92C_RXDMA_AGG_PG_TH, 48);
5332	if (sc->chip & URTWN_CHIP_88E)
5333		urtwn_write_1(sc, R92C_RXDMA_AGG_PG_TH + 1, 4);
5334	else {
5335		urtwn_write_1(sc, R92C_USB_DMA_AGG_TO, 4);
5336		urtwn_write_1(sc, R92C_USB_SPECIAL_OPTION,
5337		    urtwn_read_1(sc, R92C_USB_SPECIAL_OPTION) |
5338		    R92C_USB_SPECIAL_OPTION_AGG_EN);
5339		urtwn_write_1(sc, R92C_USB_AGG_TH, 8);
5340		urtwn_write_1(sc, R92C_USB_AGG_TO, 6);
5341	}
5342
5343	/* Initialize beacon parameters. */
5344	urtwn_write_2(sc, R92C_BCN_CTRL, 0x1010);
5345	urtwn_write_2(sc, R92C_TBTT_PROHIBIT, 0x6404);
5346	urtwn_write_1(sc, R92C_DRVERLYINT, 0x05);
5347	urtwn_write_1(sc, R92C_BCNDMATIM, 0x02);
5348	urtwn_write_2(sc, R92C_BCNTCFG, 0x660f);
5349
5350	if (!(sc->chip & URTWN_CHIP_88E)) {
5351		/* Setup AMPDU aggregation. */
5352		urtwn_write_4(sc, R92C_AGGLEN_LMT, 0x99997631);	/* MCS7~0 */
5353		urtwn_write_1(sc, R92C_AGGR_BREAK_TIME, 0x16);
5354		urtwn_write_2(sc, R92C_MAX_AGGR_NUM, 0x0708);
5355
5356		urtwn_write_1(sc, R92C_BCN_MAX_ERR, 0xff);
5357	}
5358
5359#ifndef URTWN_WITHOUT_UCODE
5360	/* Load 8051 microcode. */
5361	error = urtwn_load_firmware(sc);
5362	if (error == 0)
5363		sc->sc_flags |= URTWN_FW_LOADED;
5364#endif
5365
5366	/* Initialize MAC/BB/RF blocks. */
5367	error = urtwn_mac_init(sc);
5368	if (error != 0) {
5369		device_printf(sc->sc_dev,
5370		    "%s: error while initializing MAC block\n", __func__);
5371		goto fail;
5372	}
5373	urtwn_bb_init(sc);
5374	urtwn_rf_init(sc);
5375
5376	/* Reinitialize Rx filter (D3845 is not committed yet). */
5377	urtwn_rxfilter_init(sc);
5378
5379	if (sc->chip & URTWN_CHIP_88E) {
5380		urtwn_write_2(sc, R92C_CR,
5381		    urtwn_read_2(sc, R92C_CR) | R92C_CR_MACTXEN |
5382		    R92C_CR_MACRXEN);
5383	}
5384
5385	/* Turn CCK and OFDM blocks on. */
5386	reg = urtwn_bb_read(sc, R92C_FPGA0_RFMOD);
5387	reg |= R92C_RFMOD_CCK_EN;
5388	usb_err = urtwn_bb_write(sc, R92C_FPGA0_RFMOD, reg);
5389	if (usb_err != USB_ERR_NORMAL_COMPLETION)
5390		goto fail;
5391	reg = urtwn_bb_read(sc, R92C_FPGA0_RFMOD);
5392	reg |= R92C_RFMOD_OFDM_EN;
5393	usb_err = urtwn_bb_write(sc, R92C_FPGA0_RFMOD, reg);
5394	if (usb_err != USB_ERR_NORMAL_COMPLETION)
5395		goto fail;
5396
5397	/* Clear per-station keys table. */
5398	urtwn_cam_init(sc);
5399
5400	/* Enable decryption / encryption. */
5401	urtwn_write_2(sc, R92C_SECCFG,
5402	    R92C_SECCFG_TXUCKEY_DEF | R92C_SECCFG_RXUCKEY_DEF |
5403	    R92C_SECCFG_TXENC_ENA | R92C_SECCFG_RXDEC_ENA |
5404	    R92C_SECCFG_TXBCKEY_DEF | R92C_SECCFG_RXBCKEY_DEF);
5405
5406	/*
5407	 * Install static keys (if any).
5408	 * Must be called after urtwn_cam_init().
5409	 */
5410	ieee80211_runtask(ic, &sc->cmdq_task);
5411
5412	/* Enable hardware sequence numbering. */
5413	urtwn_write_1(sc, R92C_HWSEQ_CTRL, R92C_TX_QUEUE_ALL);
5414
5415	/* Enable per-packet TX report. */
5416	if (sc->chip & URTWN_CHIP_88E) {
5417		urtwn_write_1(sc, R88E_TX_RPT_CTRL,
5418		    urtwn_read_1(sc, R88E_TX_RPT_CTRL) | R88E_TX_RPT1_ENA);
5419	}
5420
5421	/* Perform LO and IQ calibrations. */
5422	urtwn_iq_calib(sc);
5423	/* Perform LC calibration. */
5424	urtwn_lc_calib(sc);
5425
5426	/* Fix USB interference issue. */
5427	if (!(sc->chip & URTWN_CHIP_88E)) {
5428		urtwn_write_1(sc, 0xfe40, 0xe0);
5429		urtwn_write_1(sc, 0xfe41, 0x8d);
5430		urtwn_write_1(sc, 0xfe42, 0x80);
5431
5432		urtwn_pa_bias_init(sc);
5433	}
5434
5435	/* Initialize GPIO setting. */
5436	urtwn_write_1(sc, R92C_GPIO_MUXCFG,
5437	    urtwn_read_1(sc, R92C_GPIO_MUXCFG) & ~R92C_GPIO_MUXCFG_ENBT);
5438
5439	/* Fix for lower temperature. */
5440	if (!(sc->chip & URTWN_CHIP_88E))
5441		urtwn_write_1(sc, 0x15, 0xe9);
5442
5443	usbd_transfer_start(sc->sc_xfer[URTWN_BULK_RX]);
5444
5445	sc->sc_flags |= URTWN_RUNNING;
5446
5447	callout_reset(&sc->sc_watchdog_ch, hz, urtwn_watchdog, sc);
5448fail:
5449	if (usb_err != USB_ERR_NORMAL_COMPLETION)
5450		error = EIO;
5451
5452	URTWN_UNLOCK(sc);
5453
5454	return (error);
5455}
5456
5457static void
5458urtwn_stop(struct urtwn_softc *sc)
5459{
5460
5461	URTWN_LOCK(sc);
5462	if (!(sc->sc_flags & URTWN_RUNNING)) {
5463		URTWN_UNLOCK(sc);
5464		return;
5465	}
5466
5467	sc->sc_flags &= ~(URTWN_RUNNING | URTWN_FW_LOADED |
5468	    URTWN_TEMP_MEASURED);
5469	sc->thcal_lctemp = 0;
5470	callout_stop(&sc->sc_watchdog_ch);
5471
5472	urtwn_abort_xfers(sc);
5473	urtwn_drain_mbufq(sc);
5474	urtwn_power_off(sc);
5475	URTWN_UNLOCK(sc);
5476}
5477
5478static void
5479urtwn_abort_xfers(struct urtwn_softc *sc)
5480{
5481	int i;
5482
5483	URTWN_ASSERT_LOCKED(sc);
5484
5485	/* abort any pending transfers */
5486	for (i = 0; i < URTWN_N_TRANSFER; i++)
5487		usbd_transfer_stop(sc->sc_xfer[i]);
5488}
5489
5490static int
5491urtwn_raw_xmit(struct ieee80211_node *ni, struct mbuf *m,
5492    const struct ieee80211_bpf_params *params)
5493{
5494	struct ieee80211com *ic = ni->ni_ic;
5495	struct urtwn_softc *sc = ic->ic_softc;
5496	struct urtwn_data *bf;
5497	int error;
5498
5499	URTWN_DPRINTF(sc, URTWN_DEBUG_XMIT, "%s: called; m=%p\n",
5500	    __func__,
5501	    m);
5502
5503	/* prevent management frames from being sent if we're not ready */
5504	URTWN_LOCK(sc);
5505	if (!(sc->sc_flags & URTWN_RUNNING)) {
5506		error = ENETDOWN;
5507		goto end;
5508	}
5509
5510	bf = urtwn_getbuf(sc);
5511	if (bf == NULL) {
5512		error = ENOBUFS;
5513		goto end;
5514	}
5515
5516	if (params == NULL) {
5517		/*
5518		 * Legacy path; interpret frame contents to decide
5519		 * precisely how to send the frame.
5520		 */
5521		error = urtwn_tx_data(sc, ni, m, bf);
5522	} else {
5523		/*
5524		 * Caller supplied explicit parameters to use in
5525		 * sending the frame.
5526		 */
5527		error = urtwn_tx_raw(sc, ni, m, bf, params);
5528	}
5529	if (error != 0) {
5530		STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next);
5531		goto end;
5532	}
5533
5534	sc->sc_txtimer = 5;
5535	callout_reset(&sc->sc_watchdog_ch, hz, urtwn_watchdog, sc);
5536
5537end:
5538	if (error != 0)
5539		m_freem(m);
5540
5541	URTWN_UNLOCK(sc);
5542
5543	return (error);
5544}
5545
5546static void
5547urtwn_ms_delay(struct urtwn_softc *sc)
5548{
5549	usb_pause_mtx(&sc->sc_mtx, hz / 1000);
5550}
5551
5552static device_method_t urtwn_methods[] = {
5553	/* Device interface */
5554	DEVMETHOD(device_probe,		urtwn_match),
5555	DEVMETHOD(device_attach,	urtwn_attach),
5556	DEVMETHOD(device_detach,	urtwn_detach),
5557
5558	DEVMETHOD_END
5559};
5560
5561static driver_t urtwn_driver = {
5562	"urtwn",
5563	urtwn_methods,
5564	sizeof(struct urtwn_softc)
5565};
5566
5567static devclass_t urtwn_devclass;
5568
5569DRIVER_MODULE(urtwn, uhub, urtwn_driver, urtwn_devclass, NULL, NULL);
5570MODULE_DEPEND(urtwn, usb, 1, 1, 1);
5571MODULE_DEPEND(urtwn, wlan, 1, 1, 1);
5572#ifndef URTWN_WITHOUT_UCODE
5573MODULE_DEPEND(urtwn, firmware, 1, 1, 1);
5574#endif
5575MODULE_VERSION(urtwn, 1);
5576USB_PNP_HOST_INFO(urtwn_devs);
5577