xref: /freebsd/sys/dev/usb/wlan/if_urtw.c (revision 641a6cfb86023499caafe26a4d821a0b885cf00b)
1 /*-
2  * Copyright (c) 2008 Weongyo Jeong <weongyo@FreeBSD.org>
3  *
4  * Permission to use, copy, modify, and distribute this software for any
5  * purpose with or without fee is hereby granted, provided that the above
6  * copyright notice and this permission notice appear in all copies.
7  *
8  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15  */
16 
17 #include <sys/cdefs.h>
18 __FBSDID("$FreeBSD$");
19 #include <sys/param.h>
20 #include <sys/sockio.h>
21 #include <sys/sysctl.h>
22 #include <sys/lock.h>
23 #include <sys/mutex.h>
24 #include <sys/mbuf.h>
25 #include <sys/kernel.h>
26 #include <sys/socket.h>
27 #include <sys/systm.h>
28 #include <sys/malloc.h>
29 #include <sys/module.h>
30 #include <sys/bus.h>
31 #include <sys/endian.h>
32 #include <sys/kdb.h>
33 
34 #include <machine/bus.h>
35 #include <machine/resource.h>
36 #include <sys/rman.h>
37 
38 #include <net/if.h>
39 #include <net/if_arp.h>
40 #include <net/ethernet.h>
41 #include <net/if_dl.h>
42 #include <net/if_media.h>
43 #include <net/if_types.h>
44 
45 #ifdef INET
46 #include <netinet/in.h>
47 #include <netinet/in_systm.h>
48 #include <netinet/in_var.h>
49 #include <netinet/if_ether.h>
50 #include <netinet/ip.h>
51 #endif
52 
53 #include <net80211/ieee80211_var.h>
54 #include <net80211/ieee80211_regdomain.h>
55 #include <net80211/ieee80211_radiotap.h>
56 
57 #include <dev/usb/usb.h>
58 #include <dev/usb/usbdi.h>
59 #include "usbdevs.h"
60 
61 #include <dev/usb/wlan/if_urtwreg.h>
62 #include <dev/usb/wlan/if_urtwvar.h>
63 
64 static SYSCTL_NODE(_hw_usb, OID_AUTO, urtw, CTLFLAG_RW, 0, "USB Realtek 8187L");
65 #ifdef URTW_DEBUG
66 int urtw_debug = 0;
67 SYSCTL_INT(_hw_usb_urtw, OID_AUTO, debug, CTLFLAG_RW, &urtw_debug, 0,
68     "control debugging printfs");
69 TUNABLE_INT("hw.usb.urtw.debug", &urtw_debug);
70 enum {
71 	URTW_DEBUG_XMIT		= 0x00000001,	/* basic xmit operation */
72 	URTW_DEBUG_RECV		= 0x00000002,	/* basic recv operation */
73 	URTW_DEBUG_RESET	= 0x00000004,	/* reset processing */
74 	URTW_DEBUG_TX_PROC	= 0x00000008,	/* tx ISR proc */
75 	URTW_DEBUG_RX_PROC	= 0x00000010,	/* rx ISR proc */
76 	URTW_DEBUG_STATE	= 0x00000020,	/* 802.11 state transitions */
77 	URTW_DEBUG_STAT		= 0x00000040,	/* statistic */
78 	URTW_DEBUG_INIT		= 0x00000080,	/* initialization of dev */
79 	URTW_DEBUG_TXSTATUS	= 0x00000100,	/* tx status */
80 	URTW_DEBUG_ANY		= 0xffffffff
81 };
82 #define	DPRINTF(sc, m, fmt, ...) do {				\
83 	if (sc->sc_debug & (m))					\
84 		printf(fmt, __VA_ARGS__);			\
85 } while (0)
86 #else
87 #define	DPRINTF(sc, m, fmt, ...) do {				\
88 	(void) sc;						\
89 } while (0)
90 #endif
91 static int urtw_preamble_mode = URTW_PREAMBLE_MODE_LONG;
92 SYSCTL_INT(_hw_usb_urtw, OID_AUTO, preamble_mode, CTLFLAG_RW,
93     &urtw_preamble_mode, 0, "set the preable mode (long or short)");
94 TUNABLE_INT("hw.usb.urtw.preamble_mode", &urtw_preamble_mode);
95 
96 /* recognized device vendors/products */
97 #define urtw_lookup(v, p)						\
98 	((const struct urtw_type *)usb_lookup(urtw_devs, v, p))
99 #define	URTW_DEV_B(v,p)							\
100 	{ USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, URTW_REV_RTL8187B) }
101 #define	URTW_DEV_L(v,p)							\
102 	{ USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, URTW_REV_RTL8187L) }
103 #define	URTW_REV_RTL8187B	0
104 #define	URTW_REV_RTL8187L	1
105 static const STRUCT_USB_HOST_ID urtw_devs[] = {
106 	URTW_DEV_B(NETGEAR, WG111V3),
107 	URTW_DEV_B(REALTEK, RTL8187B_0),
108 	URTW_DEV_B(REALTEK, RTL8187B_1),
109 	URTW_DEV_B(REALTEK, RTL8187B_2),
110 	URTW_DEV_B(SITECOMEU, WL168V4),
111 	URTW_DEV_L(ASUS, P5B_WIFI),
112 	URTW_DEV_L(BELKIN, F5D7050E),
113 	URTW_DEV_L(LINKSYS4, WUSB54GCV2),
114 	URTW_DEV_L(NETGEAR, WG111V2),
115 	URTW_DEV_L(REALTEK, RTL8187),
116 	URTW_DEV_L(SITECOMEU, WL168V1),
117 	URTW_DEV_L(SURECOM, EP9001G2A),
118 	{ USB_VPI(USB_VENDOR_OVISLINK, 0x8187, URTW_REV_RTL8187L) },
119 	{ USB_VPI(USB_VENDOR_DICKSMITH, 0x9401, URTW_REV_RTL8187L) },
120 	{ USB_VPI(USB_VENDOR_HP, 0xca02, URTW_REV_RTL8187L) },
121 	{ USB_VPI(USB_VENDOR_LOGITEC, 0x010c, URTW_REV_RTL8187L) },
122 	{ USB_VPI(USB_VENDOR_NETGEAR, 0x6100, URTW_REV_RTL8187L) },
123 	{ USB_VPI(USB_VENDOR_SPHAIRON, 0x0150, URTW_REV_RTL8187L) },
124 	{ USB_VPI(USB_VENDOR_QCOM, 0x6232, URTW_REV_RTL8187L) },
125 #undef URTW_DEV_L
126 #undef URTW_DEV_B
127 };
128 
129 #define urtw_read8_m(sc, val, data)	do {			\
130 	error = urtw_read8_c(sc, val, data);			\
131 	if (error != 0)						\
132 		goto fail;					\
133 } while (0)
134 #define urtw_write8_m(sc, val, data)	do {			\
135 	error = urtw_write8_c(sc, val, data);			\
136 	if (error != 0)						\
137 		goto fail;					\
138 } while (0)
139 #define urtw_read16_m(sc, val, data)	do {			\
140 	error = urtw_read16_c(sc, val, data);			\
141 	if (error != 0)						\
142 		goto fail;					\
143 } while (0)
144 #define urtw_write16_m(sc, val, data)	do {			\
145 	error = urtw_write16_c(sc, val, data);			\
146 	if (error != 0)						\
147 		goto fail;					\
148 } while (0)
149 #define urtw_read32_m(sc, val, data)	do {			\
150 	error = urtw_read32_c(sc, val, data);			\
151 	if (error != 0)						\
152 		goto fail;					\
153 } while (0)
154 #define urtw_write32_m(sc, val, data)	do {			\
155 	error = urtw_write32_c(sc, val, data);			\
156 	if (error != 0)						\
157 		goto fail;					\
158 } while (0)
159 #define urtw_8187_write_phy_ofdm(sc, val, data)	do {		\
160 	error = urtw_8187_write_phy_ofdm_c(sc, val, data);	\
161 	if (error != 0)						\
162 		goto fail;					\
163 } while (0)
164 #define urtw_8187_write_phy_cck(sc, val, data)	do {		\
165 	error = urtw_8187_write_phy_cck_c(sc, val, data);	\
166 	if (error != 0)						\
167 		goto fail;					\
168 } while (0)
169 #define urtw_8225_write(sc, val, data)	do {			\
170 	error = urtw_8225_write_c(sc, val, data);		\
171 	if (error != 0)						\
172 		goto fail;					\
173 } while (0)
174 
175 struct urtw_pair {
176 	uint32_t	reg;
177 	uint32_t	val;
178 };
179 
180 static uint8_t urtw_8225_agc[] = {
181 	0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9d, 0x9c, 0x9b,
182 	0x9a, 0x99, 0x98, 0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90,
183 	0x8f, 0x8e, 0x8d, 0x8c, 0x8b, 0x8a, 0x89, 0x88, 0x87, 0x86, 0x85,
184 	0x84, 0x83, 0x82, 0x81, 0x80, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a,
185 	0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30, 0x2f,
186 	0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26, 0x25, 0x24,
187 	0x23, 0x22, 0x21, 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19,
188 	0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e,
189 	0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03,
190 	0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
191 	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
192 	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
193 };
194 
195 static uint8_t urtw_8225z2_agc[] = {
196 	0x5e, 0x5e, 0x5e, 0x5e, 0x5d, 0x5b, 0x59, 0x57, 0x55, 0x53, 0x51,
197 	0x4f, 0x4d, 0x4b, 0x49, 0x47, 0x45, 0x43, 0x41, 0x3f, 0x3d, 0x3b,
198 	0x39, 0x37, 0x35, 0x33, 0x31, 0x2f, 0x2d, 0x2b, 0x29, 0x27, 0x25,
199 	0x23, 0x21, 0x1f, 0x1d, 0x1b, 0x19, 0x17, 0x15, 0x13, 0x11, 0x0f,
200 	0x0d, 0x0b, 0x09, 0x07, 0x05, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01,
201 	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x19, 0x19,
202 	0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x20, 0x21, 0x22, 0x23,
203 	0x24, 0x25, 0x26, 0x26, 0x27, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2a,
204 	0x2a, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2d,
205 	0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x30, 0x30, 0x31, 0x31,
206 	0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31,
207 	0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31
208 };
209 
210 static uint32_t urtw_8225_channel[] = {
211 	0x0000,		/* dummy channel 0  */
212 	0x085c,		/* 1  */
213 	0x08dc,		/* 2  */
214 	0x095c,		/* 3  */
215 	0x09dc,		/* 4  */
216 	0x0a5c,		/* 5  */
217 	0x0adc,		/* 6  */
218 	0x0b5c,		/* 7  */
219 	0x0bdc,		/* 8  */
220 	0x0c5c,		/* 9  */
221 	0x0cdc,		/* 10  */
222 	0x0d5c,		/* 11  */
223 	0x0ddc,		/* 12  */
224 	0x0e5c,		/* 13  */
225 	0x0f72,		/* 14  */
226 };
227 
228 static uint8_t urtw_8225_gain[] = {
229 	0x23, 0x88, 0x7c, 0xa5,		/* -82dbm  */
230 	0x23, 0x88, 0x7c, 0xb5,		/* -82dbm  */
231 	0x23, 0x88, 0x7c, 0xc5,		/* -82dbm  */
232 	0x33, 0x80, 0x79, 0xc5,		/* -78dbm  */
233 	0x43, 0x78, 0x76, 0xc5,		/* -74dbm  */
234 	0x53, 0x60, 0x73, 0xc5,		/* -70dbm  */
235 	0x63, 0x58, 0x70, 0xc5,		/* -66dbm  */
236 };
237 
238 static struct urtw_pair urtw_8225_rf_part1[] = {
239 	{ 0x00, 0x0067 }, { 0x01, 0x0fe0 }, { 0x02, 0x044d }, { 0x03, 0x0441 },
240 	{ 0x04, 0x0486 }, { 0x05, 0x0bc0 }, { 0x06, 0x0ae6 }, { 0x07, 0x082a },
241 	{ 0x08, 0x001f }, { 0x09, 0x0334 }, { 0x0a, 0x0fd4 }, { 0x0b, 0x0391 },
242 	{ 0x0c, 0x0050 }, { 0x0d, 0x06db }, { 0x0e, 0x0029 }, { 0x0f, 0x0914 },
243 };
244 
245 static struct urtw_pair urtw_8225_rf_part2[] = {
246 	{ 0x00, 0x01 }, { 0x01, 0x02 }, { 0x02, 0x42 }, { 0x03, 0x00 },
247 	{ 0x04, 0x00 }, { 0x05, 0x00 }, { 0x06, 0x40 }, { 0x07, 0x00 },
248 	{ 0x08, 0x40 }, { 0x09, 0xfe }, { 0x0a, 0x09 }, { 0x0b, 0x80 },
249 	{ 0x0c, 0x01 }, { 0x0e, 0xd3 }, { 0x0f, 0x38 }, { 0x10, 0x84 },
250 	{ 0x11, 0x06 }, { 0x12, 0x20 }, { 0x13, 0x20 }, { 0x14, 0x00 },
251 	{ 0x15, 0x40 }, { 0x16, 0x00 }, { 0x17, 0x40 }, { 0x18, 0xef },
252 	{ 0x19, 0x19 }, { 0x1a, 0x20 }, { 0x1b, 0x76 }, { 0x1c, 0x04 },
253 	{ 0x1e, 0x95 }, { 0x1f, 0x75 }, { 0x20, 0x1f }, { 0x21, 0x27 },
254 	{ 0x22, 0x16 }, { 0x24, 0x46 }, { 0x25, 0x20 }, { 0x26, 0x90 },
255 	{ 0x27, 0x88 }
256 };
257 
258 static struct urtw_pair urtw_8225_rf_part3[] = {
259 	{ 0x00, 0x98 }, { 0x03, 0x20 }, { 0x04, 0x7e }, { 0x05, 0x12 },
260 	{ 0x06, 0xfc }, { 0x07, 0x78 }, { 0x08, 0x2e }, { 0x10, 0x9b },
261 	{ 0x11, 0x88 }, { 0x12, 0x47 }, { 0x13, 0xd0 }, { 0x19, 0x00 },
262 	{ 0x1a, 0xa0 }, { 0x1b, 0x08 }, { 0x40, 0x86 }, { 0x41, 0x8d },
263 	{ 0x42, 0x15 }, { 0x43, 0x18 }, { 0x44, 0x1f }, { 0x45, 0x1e },
264 	{ 0x46, 0x1a }, { 0x47, 0x15 }, { 0x48, 0x10 }, { 0x49, 0x0a },
265 	{ 0x4a, 0x05 }, { 0x4b, 0x02 }, { 0x4c, 0x05 }
266 };
267 
268 static uint16_t urtw_8225_rxgain[] = {
269 	0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409,
270 	0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541,
271 	0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583,
272 	0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644,
273 	0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688,
274 	0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745,
275 	0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789,
276 	0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793,
277 	0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d,
278 	0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9,
279 	0x07aa, 0x07ab, 0x07ac, 0x07ad, 0x07b0, 0x07b1, 0x07b2, 0x07b3,
280 	0x07b4, 0x07b5, 0x07b8, 0x07b9, 0x07ba, 0x07bb, 0x07bb
281 };
282 
283 static uint8_t urtw_8225_threshold[] = {
284 	0x8d, 0x8d, 0x8d, 0x8d, 0x9d, 0xad, 0xbd,
285 };
286 
287 static uint8_t urtw_8225_tx_gain_cck_ofdm[] = {
288 	0x02, 0x06, 0x0e, 0x1e, 0x3e, 0x7e
289 };
290 
291 static uint8_t urtw_8225_txpwr_cck[] = {
292 	0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02,
293 	0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02,
294 	0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02,
295 	0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02,
296 	0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03,
297 	0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03
298 };
299 
300 static uint8_t urtw_8225_txpwr_cck_ch14[] = {
301 	0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00,
302 	0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00,
303 	0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00,
304 	0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00,
305 	0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00,
306 	0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00
307 };
308 
309 static uint8_t urtw_8225_txpwr_ofdm[]={
310 	0x80, 0x90, 0xa2, 0xb5, 0xcb, 0xe4
311 };
312 
313 static uint8_t urtw_8225v2_gain_bg[]={
314 	0x23, 0x15, 0xa5,		/* -82-1dbm  */
315 	0x23, 0x15, 0xb5,		/* -82-2dbm  */
316 	0x23, 0x15, 0xc5,		/* -82-3dbm  */
317 	0x33, 0x15, 0xc5,		/* -78dbm  */
318 	0x43, 0x15, 0xc5,		/* -74dbm  */
319 	0x53, 0x15, 0xc5,		/* -70dbm  */
320 	0x63, 0x15, 0xc5,		/* -66dbm  */
321 };
322 
323 static struct urtw_pair urtw_8225v2_rf_part1[] = {
324 	{ 0x00, 0x02bf }, { 0x01, 0x0ee0 }, { 0x02, 0x044d }, { 0x03, 0x0441 },
325 	{ 0x04, 0x08c3 }, { 0x05, 0x0c72 }, { 0x06, 0x00e6 }, { 0x07, 0x082a },
326 	{ 0x08, 0x003f }, { 0x09, 0x0335 }, { 0x0a, 0x09d4 }, { 0x0b, 0x07bb },
327 	{ 0x0c, 0x0850 }, { 0x0d, 0x0cdf }, { 0x0e, 0x002b }, { 0x0f, 0x0114 }
328 };
329 
330 static struct urtw_pair urtw_8225v2b_rf_part0[] = {
331 	{ 0x00, 0x00b7 }, { 0x01, 0x0ee0 }, { 0x02, 0x044d }, { 0x03, 0x0441 },
332 	{ 0x04, 0x08c3 }, { 0x05, 0x0c72 }, { 0x06, 0x00e6 }, { 0x07, 0x082a },
333 	{ 0x08, 0x003f }, { 0x09, 0x0335 }, { 0x0a, 0x09d4 }, { 0x0b, 0x07bb },
334 	{ 0x0c, 0x0850 }, { 0x0d, 0x0cdf }, { 0x0e, 0x002b }, { 0x0f, 0x0114 }
335 };
336 
337 static struct urtw_pair urtw_8225v2b_rf_part1[] = {
338 	{0x0f0, 0x32}, {0x0f1, 0x32}, {0x0f2, 0x00},
339 	{0x0f3, 0x00}, {0x0f4, 0x32}, {0x0f5, 0x43},
340 	{0x0f6, 0x00}, {0x0f7, 0x00}, {0x0f8, 0x46},
341 	{0x0f9, 0xa4}, {0x0fa, 0x00}, {0x0fb, 0x00},
342 	{0x0fc, 0x96}, {0x0fd, 0xa4}, {0x0fe, 0x00},
343 	{0x0ff, 0x00}, {0x158, 0x4b}, {0x159, 0x00},
344 	{0x15a, 0x4b}, {0x15b, 0x00}, {0x160, 0x4b},
345 	{0x161, 0x09}, {0x162, 0x4b}, {0x163, 0x09},
346 	{0x1ce, 0x0f}, {0x1cf, 0x00}, {0x1e0, 0xff},
347 	{0x1e1, 0x0f}, {0x1e2, 0x00}, {0x1f0, 0x4e},
348 	{0x1f1, 0x01}, {0x1f2, 0x02}, {0x1f3, 0x03},
349 	{0x1f4, 0x04}, {0x1f5, 0x05}, {0x1f6, 0x06},
350 	{0x1f7, 0x07}, {0x1f8, 0x08}, {0x24e, 0x00},
351 	{0x20c, 0x04}, {0x221, 0x61}, {0x222, 0x68},
352 	{0x223, 0x6f}, {0x224, 0x76}, {0x225, 0x7d},
353 	{0x226, 0x84}, {0x227, 0x8d}, {0x24d, 0x08},
354 	{0x250, 0x05}, {0x251, 0xf5}, {0x252, 0x04},
355 	{0x253, 0xa0}, {0x254, 0x1f}, {0x255, 0x23},
356 	{0x256, 0x45}, {0x257, 0x67}, {0x258, 0x08},
357 	{0x259, 0x08}, {0x25a, 0x08}, {0x25b, 0x08},
358 	{0x260, 0x08}, {0x261, 0x08}, {0x262, 0x08},
359 	{0x263, 0x08}, {0x264, 0xcf}, {0x272, 0x56},
360 	{0x273, 0x9a}, {0x034, 0xf0}, {0x035, 0x0f},
361 	{0x05b, 0x40}, {0x084, 0x88}, {0x085, 0x24},
362 	{0x088, 0x54}, {0x08b, 0xb8}, {0x08c, 0x07},
363 	{0x08d, 0x00}, {0x094, 0x1b}, {0x095, 0x12},
364 	{0x096, 0x00}, {0x097, 0x06}, {0x09d, 0x1a},
365 	{0x09f, 0x10}, {0x0b4, 0x22}, {0x0be, 0x80},
366 	{0x0db, 0x00}, {0x0ee, 0x00}, {0x091, 0x03},
367 	{0x24c, 0x00}, {0x39f, 0x00}, {0x08c, 0x01},
368 	{0x08d, 0x10}, {0x08e, 0x08}, {0x08f, 0x00}
369 };
370 
371 static struct urtw_pair urtw_8225v2_rf_part2[] = {
372 	{ 0x00, 0x01 }, { 0x01, 0x02 }, { 0x02, 0x42 }, { 0x03, 0x00 },
373 	{ 0x04, 0x00 },	{ 0x05, 0x00 }, { 0x06, 0x40 }, { 0x07, 0x00 },
374 	{ 0x08, 0x40 }, { 0x09, 0xfe }, { 0x0a, 0x08 }, { 0x0b, 0x80 },
375 	{ 0x0c, 0x01 }, { 0x0d, 0x43 }, { 0x0e, 0xd3 }, { 0x0f, 0x38 },
376 	{ 0x10, 0x84 }, { 0x11, 0x07 }, { 0x12, 0x20 }, { 0x13, 0x20 },
377 	{ 0x14, 0x00 }, { 0x15, 0x40 }, { 0x16, 0x00 }, { 0x17, 0x40 },
378 	{ 0x18, 0xef }, { 0x19, 0x19 }, { 0x1a, 0x20 }, { 0x1b, 0x15 },
379 	{ 0x1c, 0x04 }, { 0x1d, 0xc5 }, { 0x1e, 0x95 }, { 0x1f, 0x75 },
380 	{ 0x20, 0x1f }, { 0x21, 0x17 }, { 0x22, 0x16 }, { 0x23, 0x80 },
381 	{ 0x24, 0x46 }, { 0x25, 0x00 }, { 0x26, 0x90 }, { 0x27, 0x88 }
382 };
383 
384 static struct urtw_pair urtw_8225v2b_rf_part2[] = {
385 	{ 0x00, 0x10 }, { 0x01, 0x0d }, { 0x02, 0x01 }, { 0x03, 0x00 },
386 	{ 0x04, 0x14 }, { 0x05, 0xfb }, { 0x06, 0xfb }, { 0x07, 0x60 },
387 	{ 0x08, 0x00 }, { 0x09, 0x60 }, { 0x0a, 0x00 }, { 0x0b, 0x00 },
388 	{ 0x0c, 0x00 }, { 0x0d, 0x5c }, { 0x0e, 0x00 }, { 0x0f, 0x00 },
389 	{ 0x10, 0x40 }, { 0x11, 0x00 }, { 0x12, 0x40 }, { 0x13, 0x00 },
390 	{ 0x14, 0x00 }, { 0x15, 0x00 }, { 0x16, 0xa8 }, { 0x17, 0x26 },
391 	{ 0x18, 0x32 }, { 0x19, 0x33 }, { 0x1a, 0x07 }, { 0x1b, 0xa5 },
392 	{ 0x1c, 0x6f }, { 0x1d, 0x55 }, { 0x1e, 0xc8 }, { 0x1f, 0xb3 },
393 	{ 0x20, 0x0a }, { 0x21, 0xe1 }, { 0x22, 0x2C }, { 0x23, 0x8a },
394 	{ 0x24, 0x86 }, { 0x25, 0x83 }, { 0x26, 0x34 }, { 0x27, 0x0f },
395 	{ 0x28, 0x4f }, { 0x29, 0x24 }, { 0x2a, 0x6f }, { 0x2b, 0xc2 },
396 	{ 0x2c, 0x6b }, { 0x2d, 0x40 }, { 0x2e, 0x80 }, { 0x2f, 0x00 },
397 	{ 0x30, 0xc0 }, { 0x31, 0xc1 }, { 0x32, 0x58 }, { 0x33, 0xf1 },
398 	{ 0x34, 0x00 }, { 0x35, 0xe4 }, { 0x36, 0x90 }, { 0x37, 0x3e },
399 	{ 0x38, 0x6d }, { 0x39, 0x3c }, { 0x3a, 0xfb }, { 0x3b, 0x07 }
400 };
401 
402 static struct urtw_pair urtw_8225v2_rf_part3[] = {
403 	{ 0x00, 0x98 }, { 0x03, 0x20 }, { 0x04, 0x7e }, { 0x05, 0x12 },
404 	{ 0x06, 0xfc }, { 0x07, 0x78 }, { 0x08, 0x2e }, { 0x09, 0x11 },
405 	{ 0x0a, 0x17 }, { 0x0b, 0x11 }, { 0x10, 0x9b }, { 0x11, 0x88 },
406 	{ 0x12, 0x47 }, { 0x13, 0xd0 }, { 0x19, 0x00 }, { 0x1a, 0xa0 },
407 	{ 0x1b, 0x08 }, { 0x1d, 0x00 }, { 0x40, 0x86 }, { 0x41, 0x9d },
408 	{ 0x42, 0x15 }, { 0x43, 0x18 }, { 0x44, 0x36 }, { 0x45, 0x35 },
409 	{ 0x46, 0x2e }, { 0x47, 0x25 }, { 0x48, 0x1c }, { 0x49, 0x12 },
410 	{ 0x4a, 0x09 }, { 0x4b, 0x04 }, { 0x4c, 0x05 }
411 };
412 
413 static uint16_t urtw_8225v2_rxgain[] = {
414 	0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0008, 0x0009,
415 	0x000a, 0x000b, 0x0102, 0x0103, 0x0104, 0x0105, 0x0140, 0x0141,
416 	0x0142, 0x0143, 0x0144, 0x0145, 0x0180, 0x0181, 0x0182, 0x0183,
417 	0x0184, 0x0185, 0x0188, 0x0189, 0x018a, 0x018b, 0x0243, 0x0244,
418 	0x0245, 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0288,
419 	0x0289, 0x028a, 0x028b, 0x028c, 0x0342, 0x0343, 0x0344, 0x0345,
420 	0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0388, 0x0389,
421 	0x038a, 0x038b, 0x038c, 0x038d, 0x0390, 0x0391, 0x0392, 0x0393,
422 	0x0394, 0x0395, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d,
423 	0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a8, 0x03a9,
424 	0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3,
425 	0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb
426 };
427 
428 static uint16_t urtw_8225v2b_rxgain[] = {
429 	0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409,
430 	0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541,
431 	0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583,
432 	0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644,
433 	0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688,
434 	0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745,
435 	0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789,
436 	0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793,
437 	0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d,
438 	0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9,
439 	0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3,
440 	0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb
441 };
442 
443 static uint8_t urtw_8225v2_tx_gain_cck_ofdm[] = {
444 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
445 	0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
446 	0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
447 	0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
448 	0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
449 	0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
450 };
451 
452 static uint8_t urtw_8225v2_txpwr_cck[] = {
453 	0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04
454 };
455 
456 static uint8_t urtw_8225v2_txpwr_cck_ch14[] = {
457 	0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00
458 };
459 
460 static uint8_t urtw_8225v2b_txpwr_cck[] = {
461 	0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04,
462 	0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03,
463 	0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03,
464 	0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03
465 };
466 
467 static uint8_t urtw_8225v2b_txpwr_cck_ch14[] = {
468 	0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00,
469 	0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00,
470 	0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00,
471 	0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00
472 };
473 
474 static struct urtw_pair urtw_ratetable[] = {
475 	{  2,  0 }, {   4,  1 }, { 11, 2 }, { 12, 4 }, { 18, 5 },
476 	{ 22,  3 }, {  24,  6 }, { 36, 7 }, { 48, 8 }, { 72, 9 },
477 	{ 96, 10 }, { 108, 11 }
478 };
479 
480 static const uint8_t urtw_8187b_reg_table[][3] = {
481 	{ 0xf0, 0x32, 0 }, { 0xf1, 0x32, 0 }, { 0xf2, 0x00, 0 },
482 	{ 0xf3, 0x00, 0 }, { 0xf4, 0x32, 0 }, { 0xf5, 0x43, 0 },
483 	{ 0xf6, 0x00, 0 }, { 0xf7, 0x00, 0 }, { 0xf8, 0x46, 0 },
484 	{ 0xf9, 0xa4, 0 }, { 0xfa, 0x00, 0 }, { 0xfb, 0x00, 0 },
485 	{ 0xfc, 0x96, 0 }, { 0xfd, 0xa4, 0 }, { 0xfe, 0x00, 0 },
486 	{ 0xff, 0x00, 0 }, { 0x58, 0x4b, 1 }, { 0x59, 0x00, 1 },
487 	{ 0x5a, 0x4b, 1 }, { 0x5b, 0x00, 1 }, { 0x60, 0x4b, 1 },
488 	{ 0x61, 0x09, 1 }, { 0x62, 0x4b, 1 }, { 0x63, 0x09, 1 },
489 	{ 0xce, 0x0f, 1 }, { 0xcf, 0x00, 1 }, { 0xe0, 0xff, 1 },
490 	{ 0xe1, 0x0f, 1 }, { 0xe2, 0x00, 1 }, { 0xf0, 0x4e, 1 },
491 	{ 0xf1, 0x01, 1 }, { 0xf2, 0x02, 1 }, { 0xf3, 0x03, 1 },
492 	{ 0xf4, 0x04, 1 }, { 0xf5, 0x05, 1 }, { 0xf6, 0x06, 1 },
493 	{ 0xf7, 0x07, 1 }, { 0xf8, 0x08, 1 }, { 0x4e, 0x00, 2 },
494 	{ 0x0c, 0x04, 2 }, { 0x21, 0x61, 2 }, { 0x22, 0x68, 2 },
495 	{ 0x23, 0x6f, 2 }, { 0x24, 0x76, 2 }, { 0x25, 0x7d, 2 },
496 	{ 0x26, 0x84, 2 }, { 0x27, 0x8d, 2 }, { 0x4d, 0x08, 2 },
497 	{ 0x50, 0x05, 2 }, { 0x51, 0xf5, 2 }, { 0x52, 0x04, 2 },
498 	{ 0x53, 0xa0, 2 }, { 0x54, 0x1f, 2 }, { 0x55, 0x23, 2 },
499 	{ 0x56, 0x45, 2 }, { 0x57, 0x67, 2 }, { 0x58, 0x08, 2 },
500 	{ 0x59, 0x08, 2 }, { 0x5a, 0x08, 2 }, { 0x5b, 0x08, 2 },
501 	{ 0x60, 0x08, 2 }, { 0x61, 0x08, 2 }, { 0x62, 0x08, 2 },
502 	{ 0x63, 0x08, 2 }, { 0x64, 0xcf, 2 }, { 0x72, 0x56, 2 },
503 	{ 0x73, 0x9a, 2 }, { 0x34, 0xf0, 0 }, { 0x35, 0x0f, 0 },
504 	{ 0x5b, 0x40, 0 }, { 0x84, 0x88, 0 }, { 0x85, 0x24, 0 },
505 	{ 0x88, 0x54, 0 }, { 0x8b, 0xb8, 0 }, { 0x8c, 0x07, 0 },
506 	{ 0x8d, 0x00, 0 }, { 0x94, 0x1b, 0 }, { 0x95, 0x12, 0 },
507 	{ 0x96, 0x00, 0 }, { 0x97, 0x06, 0 }, { 0x9d, 0x1a, 0 },
508 	{ 0x9f, 0x10, 0 }, { 0xb4, 0x22, 0 }, { 0xbe, 0x80, 0 },
509 	{ 0xdb, 0x00, 0 }, { 0xee, 0x00, 0 }, { 0x91, 0x03, 0 },
510 	{ 0x4c, 0x00, 2 }, { 0x9f, 0x00, 3 }, { 0x8c, 0x01, 0 },
511 	{ 0x8d, 0x10, 0 }, { 0x8e, 0x08, 0 }, { 0x8f, 0x00, 0 }
512 };
513 
514 static usb_callback_t urtw_bulk_rx_callback;
515 static usb_callback_t urtw_bulk_tx_callback;
516 static usb_callback_t urtw_bulk_tx_status_callback;
517 
518 static const struct usb_config urtw_8187b_usbconfig[URTW_8187B_N_XFERS] = {
519 	[URTW_8187B_BULK_RX] = {
520 		.type = UE_BULK,
521 		.endpoint = 0x83,
522 		.direction = UE_DIR_IN,
523 		.bufsize = MCLBYTES,
524 		.flags = {
525 			.ext_buffer = 1,
526 			.pipe_bof = 1,
527 			.short_xfer_ok = 1
528 		},
529 		.callback = urtw_bulk_rx_callback
530 	},
531 	[URTW_8187B_BULK_TX_STATUS] = {
532 		.type = UE_BULK,
533 		.endpoint = 0x89,
534 		.direction = UE_DIR_IN,
535 		.bufsize = MCLBYTES,
536 		.flags = {
537 			.ext_buffer = 1,
538 			.pipe_bof = 1,
539 			.short_xfer_ok = 1
540 		},
541 		.callback = urtw_bulk_tx_status_callback
542 	},
543 	[URTW_8187B_BULK_TX_BE] = {
544 		.type = UE_BULK,
545 		.endpoint = URTW_8187B_TXPIPE_BE,
546 		.direction = UE_DIR_OUT,
547 		.bufsize = URTW_TX_MAXSIZE,
548 		.flags = {
549 			.ext_buffer = 1,
550 			.force_short_xfer = 1,
551 			.pipe_bof = 1,
552 		},
553 		.callback = urtw_bulk_tx_callback,
554 		.timeout = URTW_DATA_TIMEOUT
555 	},
556 	[URTW_8187B_BULK_TX_BK] = {
557 		.type = UE_BULK,
558 		.endpoint = URTW_8187B_TXPIPE_BK,
559 		.direction = UE_DIR_OUT,
560 		.bufsize = URTW_TX_MAXSIZE,
561 		.flags = {
562 			.ext_buffer = 1,
563 			.force_short_xfer = 1,
564 			.pipe_bof = 1,
565 		},
566 		.callback = urtw_bulk_tx_callback,
567 		.timeout = URTW_DATA_TIMEOUT
568 	},
569 	[URTW_8187B_BULK_TX_VI] = {
570 		.type = UE_BULK,
571 		.endpoint = URTW_8187B_TXPIPE_VI,
572 		.direction = UE_DIR_OUT,
573 		.bufsize = URTW_TX_MAXSIZE,
574 		.flags = {
575 			.ext_buffer = 1,
576 			.force_short_xfer = 1,
577 			.pipe_bof = 1,
578 		},
579 		.callback = urtw_bulk_tx_callback,
580 		.timeout = URTW_DATA_TIMEOUT
581 	},
582 	[URTW_8187B_BULK_TX_VO] = {
583 		.type = UE_BULK,
584 		.endpoint = URTW_8187B_TXPIPE_VO,
585 		.direction = UE_DIR_OUT,
586 		.bufsize = URTW_TX_MAXSIZE,
587 		.flags = {
588 			.ext_buffer = 1,
589 			.force_short_xfer = 1,
590 			.pipe_bof = 1,
591 		},
592 		.callback = urtw_bulk_tx_callback,
593 		.timeout = URTW_DATA_TIMEOUT
594 	},
595 	[URTW_8187B_BULK_TX_EP12] = {
596 		.type = UE_BULK,
597 		.endpoint = 0xc,
598 		.direction = UE_DIR_OUT,
599 		.bufsize = URTW_TX_MAXSIZE,
600 		.flags = {
601 			.ext_buffer = 1,
602 			.force_short_xfer = 1,
603 			.pipe_bof = 1,
604 		},
605 		.callback = urtw_bulk_tx_callback,
606 		.timeout = URTW_DATA_TIMEOUT
607 	}
608 };
609 
610 static const struct usb_config urtw_8187l_usbconfig[URTW_8187L_N_XFERS] = {
611 	[URTW_8187L_BULK_RX] = {
612 		.type = UE_BULK,
613 		.endpoint = 0x81,
614 		.direction = UE_DIR_IN,
615 		.bufsize = MCLBYTES,
616 		.flags = {
617 			.ext_buffer = 1,
618 			.pipe_bof = 1,
619 			.short_xfer_ok = 1
620 		},
621 		.callback = urtw_bulk_rx_callback
622 	},
623 	[URTW_8187L_BULK_TX_LOW] = {
624 		.type = UE_BULK,
625 		.endpoint = 0x2,
626 		.direction = UE_DIR_OUT,
627 		.bufsize = URTW_TX_MAXSIZE,
628 		.flags = {
629 			.ext_buffer = 1,
630 			.force_short_xfer = 1,
631 			.pipe_bof = 1,
632 		},
633 		.callback = urtw_bulk_tx_callback,
634 		.timeout = URTW_DATA_TIMEOUT
635 	},
636 	[URTW_8187L_BULK_TX_NORMAL] = {
637 		.type = UE_BULK,
638 		.endpoint = 0x3,
639 		.direction = UE_DIR_OUT,
640 		.bufsize = URTW_TX_MAXSIZE,
641 		.flags = {
642 			.ext_buffer = 1,
643 			.force_short_xfer = 1,
644 			.pipe_bof = 1,
645 		},
646 		.callback = urtw_bulk_tx_callback,
647 		.timeout = URTW_DATA_TIMEOUT
648 	},
649 };
650 
651 static struct ieee80211vap *urtw_vap_create(struct ieee80211com *,
652 			    const char [IFNAMSIZ], int, enum ieee80211_opmode,
653 			    int, const uint8_t [IEEE80211_ADDR_LEN],
654 			    const uint8_t [IEEE80211_ADDR_LEN]);
655 static void		urtw_vap_delete(struct ieee80211vap *);
656 static void		urtw_init(void *);
657 static void		urtw_stop(struct ifnet *, int);
658 static void		urtw_stop_locked(struct ifnet *, int);
659 static int		urtw_ioctl(struct ifnet *, u_long, caddr_t);
660 static void		urtw_start(struct ifnet *);
661 static int		urtw_alloc_rx_data_list(struct urtw_softc *);
662 static int		urtw_alloc_tx_data_list(struct urtw_softc *);
663 static int		urtw_raw_xmit(struct ieee80211_node *, struct mbuf *,
664 			    const struct ieee80211_bpf_params *);
665 static void		urtw_scan_start(struct ieee80211com *);
666 static void		urtw_scan_end(struct ieee80211com *);
667 static void		urtw_set_channel(struct ieee80211com *);
668 static void		urtw_update_mcast(struct ifnet *);
669 static int		urtw_tx_start(struct urtw_softc *,
670 			    struct ieee80211_node *, struct mbuf *,
671 			    struct urtw_data *, int);
672 static int		urtw_newstate(struct ieee80211vap *,
673 			    enum ieee80211_state, int);
674 static void		urtw_led_ch(void *);
675 static void		urtw_ledtask(void *, int);
676 static void		urtw_watchdog(void *);
677 static void		urtw_set_multi(void *);
678 static int		urtw_isbmode(uint16_t);
679 static uint16_t		urtw_rate2rtl(uint32_t);
680 static uint16_t		urtw_rtl2rate(uint32_t);
681 static usb_error_t	urtw_set_rate(struct urtw_softc *);
682 static usb_error_t	urtw_update_msr(struct urtw_softc *);
683 static usb_error_t	urtw_read8_c(struct urtw_softc *, int, uint8_t *);
684 static usb_error_t	urtw_read16_c(struct urtw_softc *, int, uint16_t *);
685 static usb_error_t	urtw_read32_c(struct urtw_softc *, int, uint32_t *);
686 static usb_error_t	urtw_write8_c(struct urtw_softc *, int, uint8_t);
687 static usb_error_t	urtw_write16_c(struct urtw_softc *, int, uint16_t);
688 static usb_error_t	urtw_write32_c(struct urtw_softc *, int, uint32_t);
689 static usb_error_t	urtw_eprom_cs(struct urtw_softc *, int);
690 static usb_error_t	urtw_eprom_ck(struct urtw_softc *);
691 static usb_error_t	urtw_eprom_sendbits(struct urtw_softc *, int16_t *,
692 			    int);
693 static usb_error_t	urtw_eprom_read32(struct urtw_softc *, uint32_t,
694 			    uint32_t *);
695 static usb_error_t	urtw_eprom_readbit(struct urtw_softc *, int16_t *);
696 static usb_error_t	urtw_eprom_writebit(struct urtw_softc *, int16_t);
697 static usb_error_t	urtw_get_macaddr(struct urtw_softc *);
698 static usb_error_t	urtw_get_txpwr(struct urtw_softc *);
699 static usb_error_t	urtw_get_rfchip(struct urtw_softc *);
700 static usb_error_t	urtw_led_init(struct urtw_softc *);
701 static usb_error_t	urtw_8185_rf_pins_enable(struct urtw_softc *);
702 static usb_error_t	urtw_8185_tx_antenna(struct urtw_softc *, uint8_t);
703 static usb_error_t	urtw_8187_write_phy(struct urtw_softc *, uint8_t,
704 			    uint32_t);
705 static usb_error_t	urtw_8187_write_phy_ofdm_c(struct urtw_softc *,
706 			    uint8_t, uint32_t);
707 static usb_error_t	urtw_8187_write_phy_cck_c(struct urtw_softc *, uint8_t,
708 			    uint32_t);
709 static usb_error_t	urtw_8225_setgain(struct urtw_softc *, int16_t);
710 static usb_error_t	urtw_8225_usb_init(struct urtw_softc *);
711 static usb_error_t	urtw_8225_write_c(struct urtw_softc *, uint8_t,
712 			    uint16_t);
713 static usb_error_t	urtw_8225_write_s16(struct urtw_softc *, uint8_t, int,
714 			    uint16_t *);
715 static usb_error_t	urtw_8225_read(struct urtw_softc *, uint8_t,
716 			    uint32_t *);
717 static usb_error_t	urtw_8225_rf_init(struct urtw_softc *);
718 static usb_error_t	urtw_8225_rf_set_chan(struct urtw_softc *, int);
719 static usb_error_t	urtw_8225_rf_set_sens(struct urtw_softc *, int);
720 static usb_error_t	urtw_8225_set_txpwrlvl(struct urtw_softc *, int);
721 static usb_error_t	urtw_8225_rf_stop(struct urtw_softc *);
722 static usb_error_t	urtw_8225v2_rf_init(struct urtw_softc *);
723 static usb_error_t	urtw_8225v2_rf_set_chan(struct urtw_softc *, int);
724 static usb_error_t	urtw_8225v2_set_txpwrlvl(struct urtw_softc *, int);
725 static usb_error_t	urtw_8225v2_setgain(struct urtw_softc *, int16_t);
726 static usb_error_t	urtw_8225_isv2(struct urtw_softc *, int *);
727 static usb_error_t	urtw_8225v2b_rf_init(struct urtw_softc *);
728 static usb_error_t	urtw_8225v2b_rf_set_chan(struct urtw_softc *, int);
729 static usb_error_t	urtw_read8e(struct urtw_softc *, int, uint8_t *);
730 static usb_error_t	urtw_write8e(struct urtw_softc *, int, uint8_t);
731 static usb_error_t	urtw_8180_set_anaparam(struct urtw_softc *, uint32_t);
732 static usb_error_t	urtw_8185_set_anaparam2(struct urtw_softc *, uint32_t);
733 static usb_error_t	urtw_intr_enable(struct urtw_softc *);
734 static usb_error_t	urtw_intr_disable(struct urtw_softc *);
735 static usb_error_t	urtw_reset(struct urtw_softc *);
736 static usb_error_t	urtw_led_on(struct urtw_softc *, int);
737 static usb_error_t	urtw_led_ctl(struct urtw_softc *, int);
738 static usb_error_t	urtw_led_blink(struct urtw_softc *);
739 static usb_error_t	urtw_led_mode0(struct urtw_softc *, int);
740 static usb_error_t	urtw_led_mode1(struct urtw_softc *, int);
741 static usb_error_t	urtw_led_mode2(struct urtw_softc *, int);
742 static usb_error_t	urtw_led_mode3(struct urtw_softc *, int);
743 static usb_error_t	urtw_rx_setconf(struct urtw_softc *);
744 static usb_error_t	urtw_rx_enable(struct urtw_softc *);
745 static usb_error_t	urtw_tx_enable(struct urtw_softc *sc);
746 static void		urtw_free_tx_data_list(struct urtw_softc *);
747 static void		urtw_free_rx_data_list(struct urtw_softc *);
748 static void		urtw_free_data_list(struct urtw_softc *,
749 			    struct urtw_data data[], int, int);
750 static usb_error_t	urtw_adapter_start(struct urtw_softc *);
751 static usb_error_t	urtw_adapter_start_b(struct urtw_softc *);
752 static usb_error_t	urtw_set_mode(struct urtw_softc *, uint32_t);
753 static usb_error_t	urtw_8187b_cmd_reset(struct urtw_softc *);
754 static usb_error_t	urtw_do_request(struct urtw_softc *,
755 			    struct usb_device_request *, void *);
756 static usb_error_t	urtw_8225v2b_set_txpwrlvl(struct urtw_softc *, int);
757 static usb_error_t	urtw_led_off(struct urtw_softc *, int);
758 static void		urtw_abort_xfers(struct urtw_softc *);
759 static struct urtw_data *
760 			urtw_getbuf(struct urtw_softc *sc);
761 static int		urtw_compute_txtime(uint16_t, uint16_t, uint8_t,
762 			    uint8_t);
763 static void		urtw_updateslot(struct ifnet *);
764 static void		urtw_updateslottask(void *, int);
765 static void		urtw_sysctl_node(struct urtw_softc *);
766 
767 static int
768 urtw_match(device_t dev)
769 {
770 	struct usb_attach_arg *uaa = device_get_ivars(dev);
771 
772 	if (uaa->usb_mode != USB_MODE_HOST)
773 		return (ENXIO);
774 	if (uaa->info.bConfigIndex != URTW_CONFIG_INDEX)
775 		return (ENXIO);
776 	if (uaa->info.bIfaceIndex != URTW_IFACE_INDEX)
777 		return (ENXIO);
778 
779 	return (usbd_lookup_id_by_uaa(urtw_devs, sizeof(urtw_devs), uaa));
780 }
781 
782 static int
783 urtw_attach(device_t dev)
784 {
785 	const struct usb_config *setup_start;
786 	int ret = ENXIO;
787 	struct urtw_softc *sc = device_get_softc(dev);
788 	struct usb_attach_arg *uaa = device_get_ivars(dev);
789 	struct ieee80211com *ic;
790 	struct ifnet *ifp;
791 	uint8_t bands, iface_index = URTW_IFACE_INDEX;		/* XXX */
792 	uint16_t n_setup;
793 	uint32_t data;
794 	usb_error_t error;
795 
796 	device_set_usb_desc(dev);
797 
798 	sc->sc_dev = dev;
799 	sc->sc_udev = uaa->device;
800 	if (USB_GET_DRIVER_INFO(uaa) == URTW_REV_RTL8187B)
801 		sc->sc_flags |= URTW_RTL8187B;
802 #ifdef URTW_DEBUG
803 	sc->sc_debug = urtw_debug;
804 #endif
805 
806 	mtx_init(&sc->sc_mtx, device_get_nameunit(sc->sc_dev), MTX_NETWORK_LOCK,
807 	    MTX_DEF);
808 	usb_callout_init_mtx(&sc->sc_led_ch, &sc->sc_mtx, 0);
809 	TASK_INIT(&sc->sc_led_task, 0, urtw_ledtask, sc);
810 	TASK_INIT(&sc->sc_updateslot_task, 0, urtw_updateslottask, sc);
811 	callout_init(&sc->sc_watchdog_ch, 0);
812 
813 	if (sc->sc_flags & URTW_RTL8187B) {
814 		setup_start = urtw_8187b_usbconfig;
815 		n_setup = URTW_8187B_N_XFERS;
816 	} else {
817 		setup_start = urtw_8187l_usbconfig;
818 		n_setup = URTW_8187L_N_XFERS;
819 	}
820 
821 	error = usbd_transfer_setup(uaa->device, &iface_index, sc->sc_xfer,
822 	    setup_start, n_setup, sc, &sc->sc_mtx);
823 	if (error) {
824 		device_printf(dev, "could not allocate USB transfers, "
825 		    "err=%s\n", usbd_errstr(error));
826 		ret = ENXIO;
827 		goto fail0;
828 	}
829 
830 	URTW_LOCK(sc);
831 
832 	urtw_read32_m(sc, URTW_RX, &data);
833 	sc->sc_epromtype = (data & URTW_RX_9356SEL) ? URTW_EEPROM_93C56 :
834 	    URTW_EEPROM_93C46;
835 
836 	error = urtw_get_rfchip(sc);
837 	if (error != 0)
838 		goto fail;
839 	error = urtw_get_macaddr(sc);
840 	if (error != 0)
841 		goto fail;
842 	error = urtw_get_txpwr(sc);
843 	if (error != 0)
844 		goto fail;
845 	error = urtw_led_init(sc);
846 	if (error != 0)
847 		goto fail;
848 
849 	URTW_UNLOCK(sc);
850 
851 	sc->sc_rts_retry = URTW_DEFAULT_RTS_RETRY;
852 	sc->sc_tx_retry = URTW_DEFAULT_TX_RETRY;
853 	sc->sc_currate = 3;
854 	sc->sc_preamble_mode = urtw_preamble_mode;
855 
856 	ifp = sc->sc_ifp = if_alloc(IFT_IEEE80211);
857 	if (ifp == NULL) {
858 		device_printf(sc->sc_dev, "can not allocate ifnet\n");
859 		ret = ENOMEM;
860 		goto fail1;
861 	}
862 
863 	ifp->if_softc = sc;
864 	if_initname(ifp, "urtw", device_get_unit(sc->sc_dev));
865 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
866 	ifp->if_init = urtw_init;
867 	ifp->if_ioctl = urtw_ioctl;
868 	ifp->if_start = urtw_start;
869 	/* XXX URTW_TX_DATA_LIST_COUNT */
870 	IFQ_SET_MAXLEN(&ifp->if_snd, ifqmaxlen);
871 	ifp->if_snd.ifq_drv_maxlen = ifqmaxlen;
872 	IFQ_SET_READY(&ifp->if_snd);
873 
874 	ic = ifp->if_l2com;
875 	ic->ic_ifp = ifp;
876 	ic->ic_phytype = IEEE80211_T_OFDM;	/* not only, but not used */
877 	ic->ic_opmode = IEEE80211_M_STA;	/* default to BSS mode */
878 
879 	/* set device capabilities */
880 	ic->ic_caps =
881 	    IEEE80211_C_STA |		/* station mode */
882 	    IEEE80211_C_MONITOR |	/* monitor mode supported */
883 	    IEEE80211_C_TXPMGT |	/* tx power management */
884 	    IEEE80211_C_SHPREAMBLE |	/* short preamble supported */
885 	    IEEE80211_C_SHSLOT |	/* short slot time supported */
886 	    IEEE80211_C_BGSCAN |	/* capable of bg scanning */
887 	    IEEE80211_C_WPA;		/* 802.11i */
888 
889 	bands = 0;
890 	setbit(&bands, IEEE80211_MODE_11B);
891 	setbit(&bands, IEEE80211_MODE_11G);
892 	ieee80211_init_channels(ic, NULL, &bands);
893 
894 	ieee80211_ifattach(ic, sc->sc_bssid);
895 	ic->ic_raw_xmit = urtw_raw_xmit;
896 	ic->ic_scan_start = urtw_scan_start;
897 	ic->ic_scan_end = urtw_scan_end;
898 	ic->ic_set_channel = urtw_set_channel;
899 	ic->ic_updateslot = urtw_updateslot;
900 	ic->ic_vap_create = urtw_vap_create;
901 	ic->ic_vap_delete = urtw_vap_delete;
902 	ic->ic_update_mcast = urtw_update_mcast;
903 
904 	ieee80211_radiotap_attach(ic,
905 	    &sc->sc_txtap.wt_ihdr, sizeof(sc->sc_txtap),
906 	    URTW_TX_RADIOTAP_PRESENT,
907 	    &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap),
908 	    URTW_RX_RADIOTAP_PRESENT);
909 
910 	urtw_sysctl_node(sc);
911 
912 	if (bootverbose)
913 		ieee80211_announce(ic);
914 	return (0);
915 
916 fail:	URTW_UNLOCK(sc);
917 fail1:	usbd_transfer_unsetup(sc->sc_xfer, (sc->sc_flags & URTW_RTL8187B) ?
918 	    URTW_8187B_N_XFERS : URTW_8187L_N_XFERS);
919 fail0:
920 	return (ret);
921 }
922 
923 static int
924 urtw_detach(device_t dev)
925 {
926 	struct urtw_softc *sc = device_get_softc(dev);
927 	struct ifnet *ifp = sc->sc_ifp;
928 	struct ieee80211com *ic = ifp->if_l2com;
929 
930 	if (!device_is_attached(dev))
931 		return (0);
932 
933 	urtw_stop(ifp, 1);
934 	ieee80211_draintask(ic, &sc->sc_updateslot_task);
935 	ieee80211_draintask(ic, &sc->sc_led_task);
936 
937 	usb_callout_drain(&sc->sc_led_ch);
938 	callout_drain(&sc->sc_watchdog_ch);
939 
940 	usbd_transfer_unsetup(sc->sc_xfer, (sc->sc_flags & URTW_RTL8187B) ?
941 	    URTW_8187B_N_XFERS : URTW_8187L_N_XFERS);
942 	ieee80211_ifdetach(ic);
943 
944 	urtw_free_tx_data_list(sc);
945 	urtw_free_rx_data_list(sc);
946 
947 	if_free(ifp);
948 	mtx_destroy(&sc->sc_mtx);
949 
950 	return (0);
951 }
952 
953 static void
954 urtw_free_tx_data_list(struct urtw_softc *sc)
955 {
956 
957 	urtw_free_data_list(sc, sc->sc_tx, URTW_TX_DATA_LIST_COUNT, 0);
958 }
959 
960 static void
961 urtw_free_rx_data_list(struct urtw_softc *sc)
962 {
963 
964 	urtw_free_data_list(sc, sc->sc_rx, URTW_RX_DATA_LIST_COUNT, 1);
965 }
966 
967 static void
968 urtw_free_data_list(struct urtw_softc *sc, struct urtw_data data[], int ndata,
969     int fillmbuf)
970 {
971 	int i;
972 
973 	for (i = 0; i < ndata; i++) {
974 		struct urtw_data *dp = &data[i];
975 
976 		if (fillmbuf == 1) {
977 			if (dp->m != NULL) {
978 				m_freem(dp->m);
979 				dp->m = NULL;
980 				dp->buf = NULL;
981 			}
982 		} else {
983 			if (dp->buf != NULL) {
984 				free(dp->buf, M_USBDEV);
985 				dp->buf = NULL;
986 			}
987 		}
988 		if (dp->ni != NULL) {
989 			ieee80211_free_node(dp->ni);
990 			dp->ni = NULL;
991 		}
992 	}
993 }
994 
995 static struct ieee80211vap *
996 urtw_vap_create(struct ieee80211com *ic, const char name[IFNAMSIZ], int unit,
997     enum ieee80211_opmode opmode, int flags,
998     const uint8_t bssid[IEEE80211_ADDR_LEN],
999     const uint8_t mac[IEEE80211_ADDR_LEN])
1000 {
1001 	struct urtw_vap *uvp;
1002 	struct ieee80211vap *vap;
1003 
1004 	if (!TAILQ_EMPTY(&ic->ic_vaps))		/* only one at a time */
1005 		return (NULL);
1006 	uvp = (struct urtw_vap *) malloc(sizeof(struct urtw_vap),
1007 	    M_80211_VAP, M_NOWAIT | M_ZERO);
1008 	if (uvp == NULL)
1009 		return (NULL);
1010 	vap = &uvp->vap;
1011 	/* enable s/w bmiss handling for sta mode */
1012 	ieee80211_vap_setup(ic, vap, name, unit, opmode,
1013 	    flags | IEEE80211_CLONE_NOBEACONS, bssid, mac);
1014 
1015 	/* override state transition machine */
1016 	uvp->newstate = vap->iv_newstate;
1017 	vap->iv_newstate = urtw_newstate;
1018 
1019 	/* complete setup */
1020 	ieee80211_vap_attach(vap, ieee80211_media_change,
1021 	    ieee80211_media_status);
1022 	ic->ic_opmode = opmode;
1023 	return (vap);
1024 }
1025 
1026 static void
1027 urtw_vap_delete(struct ieee80211vap *vap)
1028 {
1029 	struct urtw_vap *uvp = URTW_VAP(vap);
1030 
1031 	ieee80211_vap_detach(vap);
1032 	free(uvp, M_80211_VAP);
1033 }
1034 
1035 static void
1036 urtw_init_locked(void *arg)
1037 {
1038 	int ret;
1039 	struct urtw_softc *sc = arg;
1040 	struct ifnet *ifp = sc->sc_ifp;
1041 	usb_error_t error;
1042 
1043 	if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1044 		urtw_stop_locked(ifp, 0);
1045 
1046 	error = (sc->sc_flags & URTW_RTL8187B) ? urtw_adapter_start_b(sc) :
1047 	    urtw_adapter_start(sc);
1048 	if (error != 0)
1049 		goto fail;
1050 
1051 	/* reset softc variables  */
1052 	sc->sc_txtimer = 0;
1053 
1054 	if (!(sc->sc_flags & URTW_INIT_ONCE)) {
1055 		ret = urtw_alloc_rx_data_list(sc);
1056 		if (ret != 0)
1057 			goto fail;
1058 		ret = urtw_alloc_tx_data_list(sc);
1059 		if (ret != 0)
1060 			goto fail;
1061 		sc->sc_flags |= URTW_INIT_ONCE;
1062 	}
1063 
1064 	error = urtw_rx_enable(sc);
1065 	if (error != 0)
1066 		goto fail;
1067 	error = urtw_tx_enable(sc);
1068 	if (error != 0)
1069 		goto fail;
1070 
1071 	if (sc->sc_flags & URTW_RTL8187B)
1072 		usbd_transfer_start(sc->sc_xfer[URTW_8187B_BULK_TX_STATUS]);
1073 
1074 	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
1075 	ifp->if_drv_flags |= IFF_DRV_RUNNING;
1076 
1077 	callout_reset(&sc->sc_watchdog_ch, hz, urtw_watchdog, sc);
1078 fail:
1079 	return;
1080 }
1081 
1082 static void
1083 urtw_init(void *arg)
1084 {
1085 	struct urtw_softc *sc = arg;
1086 
1087 	URTW_LOCK(sc);
1088 	urtw_init_locked(arg);
1089 	URTW_UNLOCK(sc);
1090 }
1091 
1092 static usb_error_t
1093 urtw_adapter_start_b(struct urtw_softc *sc)
1094 {
1095 #define N(a)	((int)(sizeof(a) / sizeof((a)[0])))
1096 	uint8_t data8;
1097 	usb_error_t error;
1098 
1099 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
1100 	if (error)
1101 		goto fail;
1102 
1103 	urtw_read8_m(sc, URTW_CONFIG3, &data8);
1104 	urtw_write8_m(sc, URTW_CONFIG3,
1105 	    data8 | URTW_CONFIG3_ANAPARAM_WRITE | URTW_CONFIG3_GNT_SELECT);
1106 	urtw_write32_m(sc, URTW_ANAPARAM2, URTW_8187B_8225_ANAPARAM2_ON);
1107 	urtw_write32_m(sc, URTW_ANAPARAM, URTW_8187B_8225_ANAPARAM_ON);
1108 	urtw_write8_m(sc, URTW_ANAPARAM3, URTW_8187B_8225_ANAPARAM3_ON);
1109 
1110 	urtw_write8_m(sc, 0x61, 0x10);
1111 	urtw_read8_m(sc, 0x62, &data8);
1112 	urtw_write8_m(sc, 0x62, data8 & ~(1 << 5));
1113 	urtw_write8_m(sc, 0x62, data8 | (1 << 5));
1114 
1115 	urtw_read8_m(sc, URTW_CONFIG3, &data8);
1116 	data8 &= ~URTW_CONFIG3_ANAPARAM_WRITE;
1117 	urtw_write8_m(sc, URTW_CONFIG3, data8);
1118 
1119 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
1120 	if (error)
1121 		goto fail;
1122 
1123 	error = urtw_8187b_cmd_reset(sc);
1124 	if (error)
1125 		goto fail;
1126 
1127 	error = sc->sc_rf_init(sc);
1128 	if (error != 0)
1129 		goto fail;
1130 	urtw_write8_m(sc, URTW_CMD, URTW_CMD_RX_ENABLE | URTW_CMD_TX_ENABLE);
1131 
1132 	/* fix RTL8187B RX stall */
1133 	error = urtw_intr_enable(sc);
1134 	if (error)
1135 		goto fail;
1136 
1137 	error = urtw_write8e(sc, 0x41, 0xf4);
1138 	if (error)
1139 		goto fail;
1140 	error = urtw_write8e(sc, 0x40, 0x00);
1141 	if (error)
1142 		goto fail;
1143 	error = urtw_write8e(sc, 0x42, 0x00);
1144 	if (error)
1145 		goto fail;
1146 	error = urtw_write8e(sc, 0x42, 0x01);
1147 	if (error)
1148 		goto fail;
1149 	error = urtw_write8e(sc, 0x40, 0x0f);
1150 	if (error)
1151 		goto fail;
1152 	error = urtw_write8e(sc, 0x42, 0x00);
1153 	if (error)
1154 		goto fail;
1155 	error = urtw_write8e(sc, 0x42, 0x01);
1156 	if (error)
1157 		goto fail;
1158 
1159 	urtw_read8_m(sc, 0xdb, &data8);
1160 	urtw_write8_m(sc, 0xdb, data8 | (1 << 2));
1161 	urtw_write16_m(sc, 0x372, 0x59fa);
1162 	urtw_write16_m(sc, 0x374, 0x59d2);
1163 	urtw_write16_m(sc, 0x376, 0x59d2);
1164 	urtw_write16_m(sc, 0x378, 0x19fa);
1165 	urtw_write16_m(sc, 0x37a, 0x19fa);
1166 	urtw_write16_m(sc, 0x37c, 0x00d0);
1167 	urtw_write8_m(sc, 0x61, 0);
1168 
1169 	urtw_write8_m(sc, 0x180, 0x0f);
1170 	urtw_write8_m(sc, 0x183, 0x03);
1171 	urtw_write8_m(sc, 0xda, 0x10);
1172 	urtw_write8_m(sc, 0x24d, 0x08);
1173 	urtw_write32_m(sc, URTW_HSSI_PARA, 0x0600321b);
1174 
1175 	urtw_write16_m(sc, 0x1ec, 0x800);	/* RX MAX SIZE */
1176 fail:
1177 	return (error);
1178 #undef N
1179 }
1180 
1181 static usb_error_t
1182 urtw_adapter_start(struct urtw_softc *sc)
1183 {
1184 	usb_error_t error;
1185 
1186 	error = urtw_reset(sc);
1187 	if (error)
1188 		goto fail;
1189 
1190 	urtw_write8_m(sc, URTW_ADDR_MAGIC1, 0);
1191 	urtw_write8_m(sc, URTW_GPIO, 0);
1192 
1193 	/* for led  */
1194 	urtw_write8_m(sc, URTW_ADDR_MAGIC1, 4);
1195 	error = urtw_led_ctl(sc, URTW_LED_CTL_POWER_ON);
1196 	if (error != 0)
1197 		goto fail;
1198 
1199 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
1200 	if (error)
1201 		goto fail;
1202 	/* applying MAC address again.  */
1203 	urtw_write32_m(sc, URTW_MAC0, ((uint32_t *)sc->sc_bssid)[0]);
1204 	urtw_write16_m(sc, URTW_MAC4, ((uint32_t *)sc->sc_bssid)[1] & 0xffff);
1205 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
1206 	if (error)
1207 		goto fail;
1208 
1209 	error = urtw_update_msr(sc);
1210 	if (error)
1211 		goto fail;
1212 
1213 	urtw_write32_m(sc, URTW_INT_TIMEOUT, 0);
1214 	urtw_write8_m(sc, URTW_WPA_CONFIG, 0);
1215 	urtw_write8_m(sc, URTW_RATE_FALLBACK, URTW_RATE_FALLBACK_ENABLE | 0x1);
1216 	error = urtw_set_rate(sc);
1217 	if (error != 0)
1218 		goto fail;
1219 
1220 	error = sc->sc_rf_init(sc);
1221 	if (error != 0)
1222 		goto fail;
1223 	if (sc->sc_rf_set_sens != NULL)
1224 		sc->sc_rf_set_sens(sc, sc->sc_sens);
1225 
1226 	/* XXX correct? to call write16  */
1227 	urtw_write16_m(sc, URTW_PSR, 1);
1228 	urtw_write16_m(sc, URTW_ADDR_MAGIC2, 0x10);
1229 	urtw_write8_m(sc, URTW_TALLY_SEL, 0x80);
1230 	urtw_write8_m(sc, URTW_ADDR_MAGIC3, 0x60);
1231 	/* XXX correct? to call write16  */
1232 	urtw_write16_m(sc, URTW_PSR, 0);
1233 	urtw_write8_m(sc, URTW_ADDR_MAGIC1, 4);
1234 
1235 	error = urtw_intr_enable(sc);
1236 	if (error != 0)
1237 		goto fail;
1238 
1239 fail:
1240 	return (error);
1241 }
1242 
1243 static usb_error_t
1244 urtw_set_mode(struct urtw_softc *sc, uint32_t mode)
1245 {
1246 	uint8_t data;
1247 	usb_error_t error;
1248 
1249 	urtw_read8_m(sc, URTW_EPROM_CMD, &data);
1250 	data = (data & ~URTW_EPROM_CMD_MASK) | (mode << URTW_EPROM_CMD_SHIFT);
1251 	data = data & ~(URTW_EPROM_CS | URTW_EPROM_CK);
1252 	urtw_write8_m(sc, URTW_EPROM_CMD, data);
1253 fail:
1254 	return (error);
1255 }
1256 
1257 static usb_error_t
1258 urtw_8187b_cmd_reset(struct urtw_softc *sc)
1259 {
1260 	int i;
1261 	uint8_t data8;
1262 	usb_error_t error;
1263 
1264 	/* XXX the code can be duplicate with urtw_reset().  */
1265 	urtw_read8_m(sc, URTW_CMD, &data8);
1266 	data8 = (data8 & 0x2) | URTW_CMD_RST;
1267 	urtw_write8_m(sc, URTW_CMD, data8);
1268 
1269 	for (i = 0; i < 20; i++) {
1270 		usb_pause_mtx(&sc->sc_mtx, 2);
1271 		urtw_read8_m(sc, URTW_CMD, &data8);
1272 		if (!(data8 & URTW_CMD_RST))
1273 			break;
1274 	}
1275 	if (i >= 20) {
1276 		device_printf(sc->sc_dev, "reset timeout\n");
1277 		goto fail;
1278 	}
1279 fail:
1280 	return (error);
1281 }
1282 
1283 static usb_error_t
1284 urtw_do_request(struct urtw_softc *sc,
1285     struct usb_device_request *req, void *data)
1286 {
1287 	usb_error_t err;
1288 	int ntries = 10;
1289 
1290 	URTW_ASSERT_LOCKED(sc);
1291 
1292 	while (ntries--) {
1293 		err = usbd_do_request_flags(sc->sc_udev, &sc->sc_mtx,
1294 		    req, data, 0, NULL, 250 /* ms */);
1295 		if (err == 0)
1296 			break;
1297 
1298 		DPRINTF(sc, URTW_DEBUG_INIT,
1299 		    "Control request failed, %s (retrying)\n",
1300 		    usbd_errstr(err));
1301 		usb_pause_mtx(&sc->sc_mtx, hz / 100);
1302 	}
1303 	return (err);
1304 }
1305 
1306 static void
1307 urtw_stop_locked(struct ifnet *ifp, int disable)
1308 {
1309 	struct urtw_softc *sc = ifp->if_softc;
1310 	uint8_t data8;
1311 	usb_error_t error;
1312 
1313 	(void)disable;
1314 	ifp->if_drv_flags &= ~(IFF_DRV_RUNNING | IFF_DRV_OACTIVE);
1315 
1316 	error = urtw_intr_disable(sc);
1317 	if (error)
1318 		goto fail;
1319 	urtw_read8_m(sc, URTW_CMD, &data8);
1320 	data8 &= ~(URTW_CMD_RX_ENABLE | URTW_CMD_TX_ENABLE);
1321 	urtw_write8_m(sc, URTW_CMD, data8);
1322 
1323 	error = sc->sc_rf_stop(sc);
1324 	if (error != 0)
1325 		goto fail;
1326 
1327 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
1328 	if (error)
1329 		goto fail;
1330 	urtw_read8_m(sc, URTW_CONFIG4, &data8);
1331 	urtw_write8_m(sc, URTW_CONFIG4, data8 | URTW_CONFIG4_VCOOFF);
1332 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
1333 	if (error)
1334 		goto fail;
1335 fail:
1336 	if (error)
1337 		device_printf(sc->sc_dev, "failed to stop (%s)\n",
1338 		    usbd_errstr(error));
1339 
1340 	usb_callout_stop(&sc->sc_led_ch);
1341 	callout_stop(&sc->sc_watchdog_ch);
1342 
1343 	urtw_abort_xfers(sc);
1344 }
1345 
1346 static void
1347 urtw_stop(struct ifnet *ifp, int disable)
1348 {
1349 	struct urtw_softc *sc = ifp->if_softc;
1350 
1351 	URTW_LOCK(sc);
1352 	urtw_stop_locked(ifp, disable);
1353 	URTW_UNLOCK(sc);
1354 }
1355 
1356 static void
1357 urtw_abort_xfers(struct urtw_softc *sc)
1358 {
1359 	int i, max;
1360 
1361 	URTW_ASSERT_LOCKED(sc);
1362 
1363 	max = (sc->sc_flags & URTW_RTL8187B) ? URTW_8187B_N_XFERS :
1364 	    URTW_8187L_N_XFERS;
1365 
1366 	/* abort any pending transfers */
1367 	for (i = 0; i < max; i++)
1368 		usbd_transfer_stop(sc->sc_xfer[i]);
1369 }
1370 
1371 static int
1372 urtw_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data)
1373 {
1374 	struct urtw_softc *sc = ifp->if_softc;
1375 	struct ieee80211com *ic = ifp->if_l2com;
1376 	struct ifreq *ifr = (struct ifreq *) data;
1377 	int error = 0, startall = 0;
1378 
1379 	switch (cmd) {
1380 	case SIOCSIFFLAGS:
1381 		if (ifp->if_flags & IFF_UP) {
1382 			if (ifp->if_drv_flags & IFF_DRV_RUNNING) {
1383 				if ((ifp->if_flags ^ sc->sc_if_flags) &
1384 				    (IFF_ALLMULTI | IFF_PROMISC))
1385 					urtw_set_multi(sc);
1386 			} else {
1387 				urtw_init(ifp->if_softc);
1388 				startall = 1;
1389 			}
1390 		} else {
1391 			if (ifp->if_drv_flags & IFF_DRV_RUNNING)
1392 				urtw_stop(ifp, 1);
1393 		}
1394 		sc->sc_if_flags = ifp->if_flags;
1395 		if (startall)
1396 			ieee80211_start_all(ic);
1397 		break;
1398 	case SIOCGIFMEDIA:
1399 		error = ifmedia_ioctl(ifp, ifr, &ic->ic_media, cmd);
1400 		break;
1401 	case SIOCGIFADDR:
1402 		error = ether_ioctl(ifp, cmd, data);
1403 		break;
1404 	default:
1405 		error = EINVAL;
1406 		break;
1407 	}
1408 
1409 	return (error);
1410 }
1411 
1412 static void
1413 urtw_start(struct ifnet *ifp)
1414 {
1415 	struct urtw_data *bf;
1416 	struct urtw_softc *sc = ifp->if_softc;
1417 	struct ieee80211_node *ni;
1418 	struct mbuf *m;
1419 
1420 	if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
1421 		return;
1422 
1423 	URTW_LOCK(sc);
1424 	for (;;) {
1425 		IFQ_DRV_DEQUEUE(&ifp->if_snd, m);
1426 		if (m == NULL)
1427 			break;
1428 		bf = urtw_getbuf(sc);
1429 		if (bf == NULL) {
1430 			IFQ_DRV_PREPEND(&ifp->if_snd, m);
1431 			break;
1432 		}
1433 
1434 		ni = (struct ieee80211_node *)m->m_pkthdr.rcvif;
1435 		m->m_pkthdr.rcvif = NULL;
1436 
1437 		if (urtw_tx_start(sc, ni, m, bf, URTW_PRIORITY_NORMAL) != 0) {
1438 			ifp->if_oerrors++;
1439 			STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next);
1440 			ieee80211_free_node(ni);
1441 			break;
1442 		}
1443 
1444 		sc->sc_txtimer = 5;
1445 		callout_reset(&sc->sc_watchdog_ch, hz, urtw_watchdog, sc);
1446 	}
1447 	URTW_UNLOCK(sc);
1448 }
1449 
1450 static int
1451 urtw_alloc_data_list(struct urtw_softc *sc, struct urtw_data data[],
1452 	int ndata, int maxsz, int fillmbuf)
1453 {
1454 	int i, error;
1455 
1456 	for (i = 0; i < ndata; i++) {
1457 		struct urtw_data *dp = &data[i];
1458 
1459 		dp->sc = sc;
1460 		if (fillmbuf) {
1461 			dp->m = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
1462 			if (dp->m == NULL) {
1463 				device_printf(sc->sc_dev,
1464 				    "could not allocate rx mbuf\n");
1465 				error = ENOMEM;
1466 				goto fail;
1467 			}
1468 			dp->buf = mtod(dp->m, uint8_t *);
1469 		} else {
1470 			dp->m = NULL;
1471 			dp->buf = malloc(maxsz, M_USBDEV, M_NOWAIT);
1472 			if (dp->buf == NULL) {
1473 				device_printf(sc->sc_dev,
1474 				    "could not allocate buffer\n");
1475 				error = ENOMEM;
1476 				goto fail;
1477 			}
1478 			if (((unsigned long)dp->buf) % 4)
1479 				device_printf(sc->sc_dev,
1480 				    "warn: unaligned buffer %p\n", dp->buf);
1481 		}
1482 		dp->ni = NULL;
1483 	}
1484 
1485 	return 0;
1486 
1487 fail:	urtw_free_data_list(sc, data, ndata, fillmbuf);
1488 	return error;
1489 }
1490 
1491 static int
1492 urtw_alloc_rx_data_list(struct urtw_softc *sc)
1493 {
1494 	int error, i;
1495 
1496 	error = urtw_alloc_data_list(sc,
1497 	    sc->sc_rx, URTW_RX_DATA_LIST_COUNT, MCLBYTES, 1 /* mbufs */);
1498 	if (error != 0)
1499 		return (error);
1500 
1501 	STAILQ_INIT(&sc->sc_rx_active);
1502 	STAILQ_INIT(&sc->sc_rx_inactive);
1503 
1504 	for (i = 0; i < URTW_RX_DATA_LIST_COUNT; i++)
1505 		STAILQ_INSERT_HEAD(&sc->sc_rx_inactive, &sc->sc_rx[i], next);
1506 
1507 	return (0);
1508 }
1509 
1510 static int
1511 urtw_alloc_tx_data_list(struct urtw_softc *sc)
1512 {
1513 	int error, i;
1514 
1515 	error = urtw_alloc_data_list(sc,
1516 	    sc->sc_tx, URTW_TX_DATA_LIST_COUNT, URTW_TX_MAXSIZE,
1517 	    0 /* no mbufs */);
1518 	if (error != 0)
1519 		return (error);
1520 
1521 	STAILQ_INIT(&sc->sc_tx_active);
1522 	STAILQ_INIT(&sc->sc_tx_inactive);
1523 	STAILQ_INIT(&sc->sc_tx_pending);
1524 
1525 	for (i = 0; i < URTW_TX_DATA_LIST_COUNT; i++)
1526 		STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, &sc->sc_tx[i],
1527 		    next);
1528 
1529 	return (0);
1530 }
1531 
1532 static int
1533 urtw_raw_xmit(struct ieee80211_node *ni, struct mbuf *m,
1534     const struct ieee80211_bpf_params *params)
1535 {
1536 	struct ieee80211com *ic = ni->ni_ic;
1537 	struct ifnet *ifp = ic->ic_ifp;
1538 	struct urtw_data *bf;
1539 	struct urtw_softc *sc = ifp->if_softc;
1540 
1541 	/* prevent management frames from being sent if we're not ready */
1542 	if (!(ifp->if_drv_flags & IFF_DRV_RUNNING)) {
1543 		m_freem(m);
1544 		ieee80211_free_node(ni);
1545 		return ENETDOWN;
1546 	}
1547 	URTW_LOCK(sc);
1548 	bf = urtw_getbuf(sc);
1549 	if (bf == NULL) {
1550 		ieee80211_free_node(ni);
1551 		m_freem(m);
1552 		URTW_UNLOCK(sc);
1553 		return (ENOBUFS);		/* XXX */
1554 	}
1555 
1556 	ifp->if_opackets++;
1557 	if (urtw_tx_start(sc, ni, m, bf, URTW_PRIORITY_LOW) != 0) {
1558 		ieee80211_free_node(ni);
1559 		ifp->if_oerrors++;
1560 		STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next);
1561 		URTW_UNLOCK(sc);
1562 		return (EIO);
1563 	}
1564 	URTW_UNLOCK(sc);
1565 
1566 	sc->sc_txtimer = 5;
1567 	return (0);
1568 }
1569 
1570 static void
1571 urtw_scan_start(struct ieee80211com *ic)
1572 {
1573 
1574 	/* XXX do nothing?  */
1575 }
1576 
1577 static void
1578 urtw_scan_end(struct ieee80211com *ic)
1579 {
1580 
1581 	/* XXX do nothing?  */
1582 }
1583 
1584 static void
1585 urtw_set_channel(struct ieee80211com *ic)
1586 {
1587 	struct urtw_softc *sc  = ic->ic_ifp->if_softc;
1588 	struct ifnet *ifp = sc->sc_ifp;
1589 	uint32_t data, orig;
1590 	usb_error_t error;
1591 
1592 	/*
1593 	 * if the user set a channel explicitly using ifconfig(8) this function
1594 	 * can be called earlier than we're expected that in some cases the
1595 	 * initialization would be failed if setting a channel is called before
1596 	 * the init have done.
1597 	 */
1598 	if (!(ifp->if_drv_flags & IFF_DRV_RUNNING))
1599 		return;
1600 
1601 	if (sc->sc_curchan != NULL && sc->sc_curchan == ic->ic_curchan)
1602 		return;
1603 
1604 	URTW_LOCK(sc);
1605 
1606 	/*
1607 	 * during changing th channel we need to temporarily be disable
1608 	 * TX.
1609 	 */
1610 	urtw_read32_m(sc, URTW_TX_CONF, &orig);
1611 	data = orig & ~URTW_TX_LOOPBACK_MASK;
1612 	urtw_write32_m(sc, URTW_TX_CONF, data | URTW_TX_LOOPBACK_MAC);
1613 
1614 	error = sc->sc_rf_set_chan(sc, ieee80211_chan2ieee(ic, ic->ic_curchan));
1615 	if (error != 0)
1616 		goto fail;
1617 	usb_pause_mtx(&sc->sc_mtx, 10);
1618 	urtw_write32_m(sc, URTW_TX_CONF, orig);
1619 
1620 	urtw_write16_m(sc, URTW_ATIM_WND, 2);
1621 	urtw_write16_m(sc, URTW_ATIM_TR_ITV, 100);
1622 	urtw_write16_m(sc, URTW_BEACON_INTERVAL, 100);
1623 	urtw_write16_m(sc, URTW_BEACON_INTERVAL_TIME, 100);
1624 
1625 fail:
1626 	URTW_UNLOCK(sc);
1627 
1628 	sc->sc_curchan = ic->ic_curchan;
1629 
1630 	if (error != 0)
1631 		device_printf(sc->sc_dev, "could not change the channel\n");
1632 }
1633 
1634 static void
1635 urtw_update_mcast(struct ifnet *ifp)
1636 {
1637 
1638 	/* XXX do nothing?  */
1639 }
1640 
1641 static int
1642 urtw_tx_start(struct urtw_softc *sc, struct ieee80211_node *ni, struct mbuf *m0,
1643     struct urtw_data *data, int prior)
1644 {
1645 	struct ifnet *ifp = sc->sc_ifp;
1646 	struct ieee80211_frame *wh = mtod(m0, struct ieee80211_frame *);
1647 	struct ieee80211_key *k;
1648 	const struct ieee80211_txparam *tp;
1649 	struct ieee80211com *ic = ifp->if_l2com;
1650 	struct ieee80211vap *vap = ni->ni_vap;
1651 	struct usb_xfer *rtl8187b_pipes[URTW_8187B_TXPIPE_MAX] = {
1652 		sc->sc_xfer[URTW_8187B_BULK_TX_BE],
1653 		sc->sc_xfer[URTW_8187B_BULK_TX_BK],
1654 		sc->sc_xfer[URTW_8187B_BULK_TX_VI],
1655 		sc->sc_xfer[URTW_8187B_BULK_TX_VO]
1656 	};
1657 	struct usb_xfer *xfer;
1658 	int dur = 0, rtsdur = 0, rtsenable = 0, ctsenable = 0, rate,
1659 	    pkttime = 0, txdur = 0, isshort = 0, xferlen;
1660 	uint16_t acktime, rtstime, ctstime;
1661 	uint32_t flags;
1662 	usb_error_t error;
1663 
1664 	URTW_ASSERT_LOCKED(sc);
1665 
1666 	/*
1667 	 * Software crypto.
1668 	 */
1669 	if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
1670 		k = ieee80211_crypto_encap(ni, m0);
1671 		if (k == NULL) {
1672 			device_printf(sc->sc_dev,
1673 			    "ieee80211_crypto_encap returns NULL.\n");
1674 			/* XXX we don't expect the fragmented frames  */
1675 			m_freem(m0);
1676 			return (ENOBUFS);
1677 		}
1678 
1679 		/* in case packet header moved, reset pointer */
1680 		wh = mtod(m0, struct ieee80211_frame *);
1681 	}
1682 
1683 	if (ieee80211_radiotap_active_vap(vap)) {
1684 		struct urtw_tx_radiotap_header *tap = &sc->sc_txtap;
1685 
1686 		/* XXX Are variables correct?  */
1687 		tap->wt_flags = 0;
1688 		tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq);
1689 		tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags);
1690 
1691 		ieee80211_radiotap_tx(vap, m0);
1692 	}
1693 
1694 	if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_MGT ||
1695 	    (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_CTL) {
1696 		tp = &vap->iv_txparms[ieee80211_chan2mode(ic->ic_curchan)];
1697 		rate = tp->mgmtrate;
1698 	} else {
1699 		tp = &vap->iv_txparms[ieee80211_chan2mode(ni->ni_chan)];
1700 		/* for data frames */
1701 		if (IEEE80211_IS_MULTICAST(wh->i_addr1))
1702 			rate = tp->mcastrate;
1703 		else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE)
1704 			rate = tp->ucastrate;
1705 		else
1706 			rate = urtw_rtl2rate(sc->sc_currate);
1707 	}
1708 
1709 	sc->sc_stats.txrates[sc->sc_currate]++;
1710 
1711 	if (IEEE80211_IS_MULTICAST(wh->i_addr1))
1712 		txdur = pkttime = urtw_compute_txtime(m0->m_pkthdr.len +
1713 		    IEEE80211_CRC_LEN, rate, 0, 0);
1714 	else {
1715 		acktime = urtw_compute_txtime(14, 2,0, 0);
1716 		if ((m0->m_pkthdr.len + 4) > vap->iv_rtsthreshold) {
1717 			rtsenable = 1;
1718 			ctsenable = 0;
1719 			rtstime = urtw_compute_txtime(URTW_ACKCTS_LEN, 2, 0, 0);
1720 			ctstime = urtw_compute_txtime(14, 2, 0, 0);
1721 			pkttime = urtw_compute_txtime(m0->m_pkthdr.len +
1722 			    IEEE80211_CRC_LEN, rate, 0, isshort);
1723 			rtsdur = ctstime + pkttime + acktime +
1724 			    3 * URTW_ASIFS_TIME;
1725 			txdur = rtstime + rtsdur;
1726 		} else {
1727 			rtsenable = ctsenable = rtsdur = 0;
1728 			pkttime = urtw_compute_txtime(m0->m_pkthdr.len +
1729 			    IEEE80211_CRC_LEN, rate, 0, isshort);
1730 			txdur = pkttime + URTW_ASIFS_TIME + acktime;
1731 		}
1732 
1733 		if (wh->i_fc[1] & IEEE80211_FC1_MORE_FRAG)
1734 			dur = urtw_compute_txtime(m0->m_pkthdr.len +
1735 			    IEEE80211_CRC_LEN, rate, 0, isshort) +
1736 			    3 * URTW_ASIFS_TIME +
1737 			    2 * acktime;
1738 		else
1739 			dur = URTW_ASIFS_TIME + acktime;
1740 	}
1741 	*(uint16_t *)wh->i_dur = htole16(dur);
1742 
1743 	xferlen = m0->m_pkthdr.len;
1744 	xferlen += (sc->sc_flags & URTW_RTL8187B) ? (4 * 8) : (4 * 3);
1745 	if ((0 == xferlen % 64) || (0 == xferlen % 512))
1746 		xferlen += 1;
1747 
1748 	memset(data->buf, 0, URTW_TX_MAXSIZE);
1749 	flags = m0->m_pkthdr.len & 0xfff;
1750 	flags |= URTW_TX_FLAG_NO_ENC;
1751 	if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) &&
1752 	    (ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_PREAMBLE) &&
1753 	    (sc->sc_preamble_mode == URTW_PREAMBLE_MODE_SHORT) &&
1754 	    (sc->sc_currate != 0))
1755 		flags |= URTW_TX_FLAG_SPLCP;
1756 	if (wh->i_fc[1] & IEEE80211_FC1_MORE_FRAG)
1757 		flags |= URTW_TX_FLAG_MOREFRAG;
1758 
1759 	flags |= (sc->sc_currate & 0xf) << URTW_TX_FLAG_TXRATE_SHIFT;
1760 
1761 	if (sc->sc_flags & URTW_RTL8187B) {
1762 		struct urtw_8187b_txhdr *tx;
1763 
1764 		tx = (struct urtw_8187b_txhdr *)data->buf;
1765 		if (ctsenable)
1766 			flags |= URTW_TX_FLAG_CTS;
1767 		if (rtsenable) {
1768 			flags |= URTW_TX_FLAG_RTS;
1769 			flags |= (urtw_rate2rtl(11) & 0xf) <<
1770 			    URTW_TX_FLAG_RTSRATE_SHIFT;
1771 			tx->rtsdur = rtsdur;
1772 		}
1773 		tx->flag = htole32(flags);
1774 		tx->txdur = txdur;
1775 		if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) ==
1776 		    IEEE80211_FC0_TYPE_MGT &&
1777 		    (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) ==
1778 		    IEEE80211_FC0_SUBTYPE_PROBE_RESP)
1779 			tx->retry = 1;
1780 		else
1781 			tx->retry = URTW_TX_MAXRETRY;
1782 		m_copydata(m0, 0, m0->m_pkthdr.len, (uint8_t *)(tx + 1));
1783 	} else {
1784 		struct urtw_8187l_txhdr *tx;
1785 
1786 		tx = (struct urtw_8187l_txhdr *)data->buf;
1787 		if (rtsenable) {
1788 			flags |= URTW_TX_FLAG_RTS;
1789 			tx->rtsdur = rtsdur;
1790 		}
1791 		flags |= (urtw_rate2rtl(11) & 0xf) << URTW_TX_FLAG_RTSRATE_SHIFT;
1792 		tx->flag = htole32(flags);
1793 		tx->retry = 3;		/* CW minimum  */
1794 		tx->retry = 7 << 4;	/* CW maximum  */
1795 		tx->retry = URTW_TX_MAXRETRY << 8;	/* retry limitation  */
1796 		m_copydata(m0, 0, m0->m_pkthdr.len, (uint8_t *)(tx + 1));
1797 	}
1798 
1799 	data->buflen = xferlen;
1800 	data->ni = ni;
1801 	data->m = m0;
1802 
1803 	if (sc->sc_flags & URTW_RTL8187B) {
1804 		switch (wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) {
1805 		case IEEE80211_FC0_TYPE_CTL:
1806 		case IEEE80211_FC0_TYPE_MGT:
1807 			xfer = sc->sc_xfer[URTW_8187B_BULK_TX_EP12];
1808 			break;
1809 		default:
1810 			KASSERT(M_WME_GETAC(m0) < URTW_8187B_TXPIPE_MAX,
1811 			    ("unsupported WME pipe %d", M_WME_GETAC(m0)));
1812 			xfer = rtl8187b_pipes[M_WME_GETAC(m0)];
1813 			break;
1814 		}
1815 	} else
1816 		xfer = (prior == URTW_PRIORITY_LOW) ?
1817 		    sc->sc_xfer[URTW_8187L_BULK_TX_LOW] :
1818 		    sc->sc_xfer[URTW_8187L_BULK_TX_NORMAL];
1819 
1820 	STAILQ_INSERT_TAIL(&sc->sc_tx_pending, data, next);
1821 	usbd_transfer_start(xfer);
1822 
1823 	error = urtw_led_ctl(sc, URTW_LED_CTL_TX);
1824 	if (error != 0)
1825 		device_printf(sc->sc_dev, "could not control LED (%d)\n",
1826 		    error);
1827 	return (0);
1828 }
1829 
1830 static int
1831 urtw_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
1832 {
1833 	struct ieee80211com *ic = vap->iv_ic;
1834 	struct urtw_softc *sc = ic->ic_ifp->if_softc;
1835 	struct urtw_vap *uvp = URTW_VAP(vap);
1836 	struct ieee80211_node *ni;
1837 	usb_error_t error = 0;
1838 
1839 	DPRINTF(sc, URTW_DEBUG_STATE, "%s: %s -> %s\n", __func__,
1840 	    ieee80211_state_name[vap->iv_state],
1841 	    ieee80211_state_name[nstate]);
1842 
1843 	sc->sc_state = nstate;
1844 
1845 	IEEE80211_UNLOCK(ic);
1846 	URTW_LOCK(sc);
1847 	usb_callout_stop(&sc->sc_led_ch);
1848 	callout_stop(&sc->sc_watchdog_ch);
1849 
1850 	switch (nstate) {
1851 	case IEEE80211_S_INIT:
1852 	case IEEE80211_S_SCAN:
1853 	case IEEE80211_S_AUTH:
1854 	case IEEE80211_S_ASSOC:
1855 		break;
1856 	case IEEE80211_S_RUN:
1857 		ni = ieee80211_ref_node(vap->iv_bss);
1858 		/* setting bssid.  */
1859 		urtw_write32_m(sc, URTW_BSSID, ((uint32_t *)ni->ni_bssid)[0]);
1860 		urtw_write16_m(sc, URTW_BSSID + 4,
1861 		    ((uint16_t *)ni->ni_bssid)[2]);
1862 		urtw_update_msr(sc);
1863 		/* XXX maybe the below would be incorrect.  */
1864 		urtw_write16_m(sc, URTW_ATIM_WND, 2);
1865 		urtw_write16_m(sc, URTW_ATIM_TR_ITV, 100);
1866 		urtw_write16_m(sc, URTW_BEACON_INTERVAL, 0x64);
1867 		urtw_write16_m(sc, URTW_BEACON_INTERVAL_TIME, 100);
1868 		error = urtw_led_ctl(sc, URTW_LED_CTL_LINK);
1869 		if (error != 0)
1870 			device_printf(sc->sc_dev,
1871 			    "could not control LED (%d)\n", error);
1872 		ieee80211_free_node(ni);
1873 		break;
1874 	default:
1875 		break;
1876 	}
1877 fail:
1878 	URTW_UNLOCK(sc);
1879 	IEEE80211_LOCK(ic);
1880 	return (uvp->newstate(vap, nstate, arg));
1881 }
1882 
1883 static void
1884 urtw_watchdog(void *arg)
1885 {
1886 	struct urtw_softc *sc = arg;
1887 	struct ifnet *ifp = sc->sc_ifp;
1888 
1889 	if (sc->sc_txtimer > 0) {
1890 		if (--sc->sc_txtimer == 0) {
1891 			device_printf(sc->sc_dev, "device timeout\n");
1892 			ifp->if_oerrors++;
1893 			return;
1894 		}
1895 		callout_reset(&sc->sc_watchdog_ch, hz, urtw_watchdog, sc);
1896 	}
1897 }
1898 
1899 static void
1900 urtw_set_multi(void *arg)
1901 {
1902 	struct urtw_softc *sc = arg;
1903 	struct ifnet *ifp = sc->sc_ifp;
1904 
1905 	if (!(ifp->if_flags & IFF_UP))
1906 		return;
1907 
1908 	/*
1909 	 * XXX don't know how to set a device.  Lack of docs.  Just try to set
1910 	 * IFF_ALLMULTI flag here.
1911 	 */
1912 	ifp->if_flags |= IFF_ALLMULTI;
1913 }
1914 
1915 static usb_error_t
1916 urtw_set_rate(struct urtw_softc *sc)
1917 {
1918 	int i, basic_rate, min_rr_rate, max_rr_rate;
1919 	uint16_t data;
1920 	usb_error_t error;
1921 
1922 	basic_rate = urtw_rate2rtl(48);
1923 	min_rr_rate = urtw_rate2rtl(12);
1924 	max_rr_rate = urtw_rate2rtl(48);
1925 
1926 	urtw_write8_m(sc, URTW_RESP_RATE,
1927 	    max_rr_rate << URTW_RESP_MAX_RATE_SHIFT |
1928 	    min_rr_rate << URTW_RESP_MIN_RATE_SHIFT);
1929 
1930 	urtw_read16_m(sc, URTW_BRSR, &data);
1931 	data &= ~URTW_BRSR_MBR_8185;
1932 
1933 	for (i = 0; i <= basic_rate; i++)
1934 		data |= (1 << i);
1935 
1936 	urtw_write16_m(sc, URTW_BRSR, data);
1937 fail:
1938 	return (error);
1939 }
1940 
1941 static uint16_t
1942 urtw_rate2rtl(uint32_t rate)
1943 {
1944 #define N(a)	((int)(sizeof(a) / sizeof((a)[0])))
1945 	int i;
1946 
1947 	for (i = 0; i < N(urtw_ratetable); i++) {
1948 		if (rate == urtw_ratetable[i].reg)
1949 			return urtw_ratetable[i].val;
1950 	}
1951 
1952 	return (3);
1953 #undef N
1954 }
1955 
1956 static uint16_t
1957 urtw_rtl2rate(uint32_t rate)
1958 {
1959 #define N(a)	((int)(sizeof(a) / sizeof((a)[0])))
1960 	int i;
1961 
1962 	for (i = 0; i < N(urtw_ratetable); i++) {
1963 		if (rate == urtw_ratetable[i].val)
1964 			return urtw_ratetable[i].reg;
1965 	}
1966 
1967 	return (0);
1968 #undef N
1969 }
1970 
1971 static usb_error_t
1972 urtw_update_msr(struct urtw_softc *sc)
1973 {
1974 	struct ifnet *ifp = sc->sc_ifp;
1975 	struct ieee80211com *ic = ifp->if_l2com;
1976 	uint8_t data;
1977 	usb_error_t error;
1978 
1979 	urtw_read8_m(sc, URTW_MSR, &data);
1980 	data &= ~URTW_MSR_LINK_MASK;
1981 
1982 	if (sc->sc_state == IEEE80211_S_RUN) {
1983 		switch (ic->ic_opmode) {
1984 		case IEEE80211_M_STA:
1985 		case IEEE80211_M_MONITOR:
1986 			data |= URTW_MSR_LINK_STA;
1987 			if (sc->sc_flags & URTW_RTL8187B)
1988 				data |= URTW_MSR_LINK_ENEDCA;
1989 			break;
1990 		case IEEE80211_M_IBSS:
1991 			data |= URTW_MSR_LINK_ADHOC;
1992 			break;
1993 		case IEEE80211_M_HOSTAP:
1994 			data |= URTW_MSR_LINK_HOSTAP;
1995 			break;
1996 		default:
1997 			panic("unsupported operation mode 0x%x\n",
1998 			    ic->ic_opmode);
1999 			/* never reach  */
2000 		}
2001 	} else
2002 		data |= URTW_MSR_LINK_NONE;
2003 
2004 	urtw_write8_m(sc, URTW_MSR, data);
2005 fail:
2006 	return (error);
2007 }
2008 
2009 static usb_error_t
2010 urtw_read8_c(struct urtw_softc *sc, int val, uint8_t *data)
2011 {
2012 	struct usb_device_request req;
2013 	usb_error_t error;
2014 
2015 	URTW_ASSERT_LOCKED(sc);
2016 
2017 	req.bmRequestType = UT_READ_VENDOR_DEVICE;
2018 	req.bRequest = URTW_8187_GETREGS_REQ;
2019 	USETW(req.wValue, (val & 0xff) | 0xff00);
2020 	USETW(req.wIndex, (val >> 8) & 0x3);
2021 	USETW(req.wLength, sizeof(uint8_t));
2022 
2023 	error = urtw_do_request(sc, &req, data);
2024 	return (error);
2025 }
2026 
2027 static usb_error_t
2028 urtw_read16_c(struct urtw_softc *sc, int val, uint16_t *data)
2029 {
2030 	struct usb_device_request req;
2031 	usb_error_t error;
2032 
2033 	URTW_ASSERT_LOCKED(sc);
2034 
2035 	req.bmRequestType = UT_READ_VENDOR_DEVICE;
2036 	req.bRequest = URTW_8187_GETREGS_REQ;
2037 	USETW(req.wValue, (val & 0xff) | 0xff00);
2038 	USETW(req.wIndex, (val >> 8) & 0x3);
2039 	USETW(req.wLength, sizeof(uint16_t));
2040 
2041 	error = urtw_do_request(sc, &req, data);
2042 	return (error);
2043 }
2044 
2045 static usb_error_t
2046 urtw_read32_c(struct urtw_softc *sc, int val, uint32_t *data)
2047 {
2048 	struct usb_device_request req;
2049 	usb_error_t error;
2050 
2051 	URTW_ASSERT_LOCKED(sc);
2052 
2053 	req.bmRequestType = UT_READ_VENDOR_DEVICE;
2054 	req.bRequest = URTW_8187_GETREGS_REQ;
2055 	USETW(req.wValue, (val & 0xff) | 0xff00);
2056 	USETW(req.wIndex, (val >> 8) & 0x3);
2057 	USETW(req.wLength, sizeof(uint32_t));
2058 
2059 	error = urtw_do_request(sc, &req, data);
2060 	return (error);
2061 }
2062 
2063 static usb_error_t
2064 urtw_write8_c(struct urtw_softc *sc, int val, uint8_t data)
2065 {
2066 	struct usb_device_request req;
2067 
2068 	URTW_ASSERT_LOCKED(sc);
2069 
2070 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
2071 	req.bRequest = URTW_8187_SETREGS_REQ;
2072 	USETW(req.wValue, (val & 0xff) | 0xff00);
2073 	USETW(req.wIndex, (val >> 8) & 0x3);
2074 	USETW(req.wLength, sizeof(uint8_t));
2075 
2076 	return (urtw_do_request(sc, &req, &data));
2077 }
2078 
2079 static usb_error_t
2080 urtw_write16_c(struct urtw_softc *sc, int val, uint16_t data)
2081 {
2082 	struct usb_device_request req;
2083 
2084 	URTW_ASSERT_LOCKED(sc);
2085 
2086 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
2087 	req.bRequest = URTW_8187_SETREGS_REQ;
2088 	USETW(req.wValue, (val & 0xff) | 0xff00);
2089 	USETW(req.wIndex, (val >> 8) & 0x3);
2090 	USETW(req.wLength, sizeof(uint16_t));
2091 
2092 	return (urtw_do_request(sc, &req, &data));
2093 }
2094 
2095 static usb_error_t
2096 urtw_write32_c(struct urtw_softc *sc, int val, uint32_t data)
2097 {
2098 	struct usb_device_request req;
2099 
2100 	URTW_ASSERT_LOCKED(sc);
2101 
2102 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
2103 	req.bRequest = URTW_8187_SETREGS_REQ;
2104 	USETW(req.wValue, (val & 0xff) | 0xff00);
2105 	USETW(req.wIndex, (val >> 8) & 0x3);
2106 	USETW(req.wLength, sizeof(uint32_t));
2107 
2108 	return (urtw_do_request(sc, &req, &data));
2109 }
2110 
2111 static usb_error_t
2112 urtw_get_macaddr(struct urtw_softc *sc)
2113 {
2114 	uint32_t data;
2115 	usb_error_t error;
2116 
2117 	error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR, &data);
2118 	if (error != 0)
2119 		goto fail;
2120 	sc->sc_bssid[0] = data & 0xff;
2121 	sc->sc_bssid[1] = (data & 0xff00) >> 8;
2122 	error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR + 1, &data);
2123 	if (error != 0)
2124 		goto fail;
2125 	sc->sc_bssid[2] = data & 0xff;
2126 	sc->sc_bssid[3] = (data & 0xff00) >> 8;
2127 	error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR + 2, &data);
2128 	if (error != 0)
2129 		goto fail;
2130 	sc->sc_bssid[4] = data & 0xff;
2131 	sc->sc_bssid[5] = (data & 0xff00) >> 8;
2132 fail:
2133 	return (error);
2134 }
2135 
2136 static usb_error_t
2137 urtw_eprom_read32(struct urtw_softc *sc, uint32_t addr, uint32_t *data)
2138 {
2139 #define URTW_READCMD_LEN		3
2140 	int addrlen, i;
2141 	int16_t addrstr[8], data16, readcmd[] = { 1, 1, 0 };
2142 	usb_error_t error;
2143 
2144 	/* NB: make sure the buffer is initialized  */
2145 	*data = 0;
2146 
2147 	/* enable EPROM programming */
2148 	urtw_write8_m(sc, URTW_EPROM_CMD, URTW_EPROM_CMD_PROGRAM_MODE);
2149 	DELAY(URTW_EPROM_DELAY);
2150 
2151 	error = urtw_eprom_cs(sc, URTW_EPROM_ENABLE);
2152 	if (error != 0)
2153 		goto fail;
2154 	error = urtw_eprom_ck(sc);
2155 	if (error != 0)
2156 		goto fail;
2157 	error = urtw_eprom_sendbits(sc, readcmd, URTW_READCMD_LEN);
2158 	if (error != 0)
2159 		goto fail;
2160 	if (sc->sc_epromtype == URTW_EEPROM_93C56) {
2161 		addrlen = 8;
2162 		addrstr[0] = addr & (1 << 7);
2163 		addrstr[1] = addr & (1 << 6);
2164 		addrstr[2] = addr & (1 << 5);
2165 		addrstr[3] = addr & (1 << 4);
2166 		addrstr[4] = addr & (1 << 3);
2167 		addrstr[5] = addr & (1 << 2);
2168 		addrstr[6] = addr & (1 << 1);
2169 		addrstr[7] = addr & (1 << 0);
2170 	} else {
2171 		addrlen=6;
2172 		addrstr[0] = addr & (1 << 5);
2173 		addrstr[1] = addr & (1 << 4);
2174 		addrstr[2] = addr & (1 << 3);
2175 		addrstr[3] = addr & (1 << 2);
2176 		addrstr[4] = addr & (1 << 1);
2177 		addrstr[5] = addr & (1 << 0);
2178 	}
2179 	error = urtw_eprom_sendbits(sc, addrstr, addrlen);
2180 	if (error != 0)
2181 		goto fail;
2182 
2183 	error = urtw_eprom_writebit(sc, 0);
2184 	if (error != 0)
2185 		goto fail;
2186 
2187 	for (i = 0; i < 16; i++) {
2188 		error = urtw_eprom_ck(sc);
2189 		if (error != 0)
2190 			goto fail;
2191 		error = urtw_eprom_readbit(sc, &data16);
2192 		if (error != 0)
2193 			goto fail;
2194 
2195 		(*data) |= (data16 << (15 - i));
2196 	}
2197 
2198 	error = urtw_eprom_cs(sc, URTW_EPROM_DISABLE);
2199 	if (error != 0)
2200 		goto fail;
2201 	error = urtw_eprom_ck(sc);
2202 	if (error != 0)
2203 		goto fail;
2204 
2205 	/* now disable EPROM programming */
2206 	urtw_write8_m(sc, URTW_EPROM_CMD, URTW_EPROM_CMD_NORMAL_MODE);
2207 fail:
2208 	return (error);
2209 #undef URTW_READCMD_LEN
2210 }
2211 
2212 static usb_error_t
2213 urtw_eprom_cs(struct urtw_softc *sc, int able)
2214 {
2215 	uint8_t data;
2216 	usb_error_t error;
2217 
2218 	urtw_read8_m(sc, URTW_EPROM_CMD, &data);
2219 	if (able == URTW_EPROM_ENABLE)
2220 		urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_CS);
2221 	else
2222 		urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_CS);
2223 	DELAY(URTW_EPROM_DELAY);
2224 fail:
2225 	return (error);
2226 }
2227 
2228 static usb_error_t
2229 urtw_eprom_ck(struct urtw_softc *sc)
2230 {
2231 	uint8_t data;
2232 	usb_error_t error;
2233 
2234 	/* masking  */
2235 	urtw_read8_m(sc, URTW_EPROM_CMD, &data);
2236 	urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_CK);
2237 	DELAY(URTW_EPROM_DELAY);
2238 	/* unmasking  */
2239 	urtw_read8_m(sc, URTW_EPROM_CMD, &data);
2240 	urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_CK);
2241 	DELAY(URTW_EPROM_DELAY);
2242 fail:
2243 	return (error);
2244 }
2245 
2246 static usb_error_t
2247 urtw_eprom_readbit(struct urtw_softc *sc, int16_t *data)
2248 {
2249 	uint8_t data8;
2250 	usb_error_t error;
2251 
2252 	urtw_read8_m(sc, URTW_EPROM_CMD, &data8);
2253 	*data = (data8 & URTW_EPROM_READBIT) ? 1 : 0;
2254 	DELAY(URTW_EPROM_DELAY);
2255 
2256 fail:
2257 	return (error);
2258 }
2259 
2260 static usb_error_t
2261 urtw_eprom_writebit(struct urtw_softc *sc, int16_t bit)
2262 {
2263 	uint8_t data;
2264 	usb_error_t error;
2265 
2266 	urtw_read8_m(sc, URTW_EPROM_CMD, &data);
2267 	if (bit != 0)
2268 		urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_WRITEBIT);
2269 	else
2270 		urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_WRITEBIT);
2271 	DELAY(URTW_EPROM_DELAY);
2272 fail:
2273 	return (error);
2274 }
2275 
2276 static usb_error_t
2277 urtw_eprom_sendbits(struct urtw_softc *sc, int16_t *buf, int buflen)
2278 {
2279 	int i = 0;
2280 	usb_error_t error = 0;
2281 
2282 	for (i = 0; i < buflen; i++) {
2283 		error = urtw_eprom_writebit(sc, buf[i]);
2284 		if (error != 0)
2285 			goto fail;
2286 		error = urtw_eprom_ck(sc);
2287 		if (error != 0)
2288 			goto fail;
2289 	}
2290 fail:
2291 	return (error);
2292 }
2293 
2294 
2295 static usb_error_t
2296 urtw_get_txpwr(struct urtw_softc *sc)
2297 {
2298 	int i, j;
2299 	uint32_t data;
2300 	usb_error_t error;
2301 
2302 	error = urtw_eprom_read32(sc, URTW_EPROM_TXPW_BASE, &data);
2303 	if (error != 0)
2304 		goto fail;
2305 	sc->sc_txpwr_cck_base = data & 0xf;
2306 	sc->sc_txpwr_ofdm_base = (data >> 4) & 0xf;
2307 
2308 	for (i = 1, j = 0; i < 6; i += 2, j++) {
2309 		error = urtw_eprom_read32(sc, URTW_EPROM_TXPW0 + j, &data);
2310 		if (error != 0)
2311 			goto fail;
2312 		sc->sc_txpwr_cck[i] = data & 0xf;
2313 		sc->sc_txpwr_cck[i + 1] = (data & 0xf00) >> 8;
2314 		sc->sc_txpwr_ofdm[i] = (data & 0xf0) >> 4;
2315 		sc->sc_txpwr_ofdm[i + 1] = (data & 0xf000) >> 12;
2316 	}
2317 	for (i = 1, j = 0; i < 4; i += 2, j++) {
2318 		error = urtw_eprom_read32(sc, URTW_EPROM_TXPW1 + j, &data);
2319 		if (error != 0)
2320 			goto fail;
2321 		sc->sc_txpwr_cck[i + 6] = data & 0xf;
2322 		sc->sc_txpwr_cck[i + 6 + 1] = (data & 0xf00) >> 8;
2323 		sc->sc_txpwr_ofdm[i + 6] = (data & 0xf0) >> 4;
2324 		sc->sc_txpwr_ofdm[i + 6 + 1] = (data & 0xf000) >> 12;
2325 	}
2326 	if (sc->sc_flags & URTW_RTL8187B) {
2327 		error = urtw_eprom_read32(sc, URTW_EPROM_TXPW2, &data);
2328 		if (error != 0)
2329 			goto fail;
2330 		sc->sc_txpwr_cck[1 + 6 + 4] = data & 0xf;
2331 		sc->sc_txpwr_ofdm[1 + 6 + 4] = (data & 0xf0) >> 4;
2332 		error = urtw_eprom_read32(sc, 0x0a, &data);
2333 		if (error != 0)
2334 			goto fail;
2335 		sc->sc_txpwr_cck[2 + 6 + 4] = data & 0xf;
2336 		sc->sc_txpwr_ofdm[2 + 6 + 4] = (data & 0xf0) >> 4;
2337 		error = urtw_eprom_read32(sc, 0x1c, &data);
2338 		if (error != 0)
2339 			goto fail;
2340 		sc->sc_txpwr_cck[3 + 6 + 4] = data & 0xf;
2341 		sc->sc_txpwr_cck[3 + 6 + 4 + 1] = (data & 0xf00) >> 8;
2342 		sc->sc_txpwr_ofdm[3 + 6 + 4] = (data & 0xf0) >> 4;
2343 		sc->sc_txpwr_ofdm[3 + 6 + 4 + 1] = (data & 0xf000) >> 12;
2344 	} else {
2345 		for (i = 1, j = 0; i < 4; i += 2, j++) {
2346 			error = urtw_eprom_read32(sc, URTW_EPROM_TXPW2 + j,
2347 			    &data);
2348 			if (error != 0)
2349 				goto fail;
2350 			sc->sc_txpwr_cck[i + 6 + 4] = data & 0xf;
2351 			sc->sc_txpwr_cck[i + 6 + 4 + 1] = (data & 0xf00) >> 8;
2352 			sc->sc_txpwr_ofdm[i + 6 + 4] = (data & 0xf0) >> 4;
2353 			sc->sc_txpwr_ofdm[i + 6 + 4 + 1] = (data & 0xf000) >> 12;
2354 		}
2355 	}
2356 fail:
2357 	return (error);
2358 }
2359 
2360 
2361 static usb_error_t
2362 urtw_get_rfchip(struct urtw_softc *sc)
2363 {
2364 	int ret;
2365 	uint8_t data8;
2366 	uint32_t data;
2367 	usb_error_t error;
2368 
2369 	if (sc->sc_flags & URTW_RTL8187B) {
2370 		urtw_read8_m(sc, 0xe1, &data8);
2371 		switch (data8) {
2372 		case 0:
2373 			sc->sc_flags |= URTW_RTL8187B_REV_B;
2374 			break;
2375 		case 1:
2376 			sc->sc_flags |= URTW_RTL8187B_REV_D;
2377 			break;
2378 		case 2:
2379 			sc->sc_flags |= URTW_RTL8187B_REV_E;
2380 			break;
2381 		default:
2382 			device_printf(sc->sc_dev, "unknown type: %#x\n", data8);
2383 			sc->sc_flags |= URTW_RTL8187B_REV_B;
2384 			break;
2385 		}
2386 	} else {
2387 		urtw_read32_m(sc, URTW_TX_CONF, &data);
2388 		switch (data & URTW_TX_HWMASK) {
2389 		case URTW_TX_R8187vD_B:
2390 			sc->sc_flags |= URTW_RTL8187B;
2391 			break;
2392 		case URTW_TX_R8187vD:
2393 			break;
2394 		default:
2395 			device_printf(sc->sc_dev, "unknown RTL8187L type: %#x\n",
2396 			    data & URTW_TX_HWMASK);
2397 			break;
2398 		}
2399 	}
2400 
2401 	error = urtw_eprom_read32(sc, URTW_EPROM_RFCHIPID, &data);
2402 	if (error != 0)
2403 		goto fail;
2404 	switch (data & 0xff) {
2405 	case URTW_EPROM_RFCHIPID_RTL8225U:
2406 		error = urtw_8225_isv2(sc, &ret);
2407 		if (error != 0)
2408 			goto fail;
2409 		if (ret == 0) {
2410 			sc->sc_rf_init = urtw_8225_rf_init;
2411 			sc->sc_rf_set_sens = urtw_8225_rf_set_sens;
2412 			sc->sc_rf_set_chan = urtw_8225_rf_set_chan;
2413 			sc->sc_rf_stop = urtw_8225_rf_stop;
2414 		} else {
2415 			sc->sc_rf_init = urtw_8225v2_rf_init;
2416 			sc->sc_rf_set_chan = urtw_8225v2_rf_set_chan;
2417 			sc->sc_rf_stop = urtw_8225_rf_stop;
2418 		}
2419 		sc->sc_max_sens = URTW_8225_RF_MAX_SENS;
2420 		sc->sc_sens = URTW_8225_RF_DEF_SENS;
2421 		break;
2422 	case URTW_EPROM_RFCHIPID_RTL8225Z2:
2423 		sc->sc_rf_init = urtw_8225v2b_rf_init;
2424 		sc->sc_rf_set_chan = urtw_8225v2b_rf_set_chan;
2425 		sc->sc_max_sens = URTW_8225_RF_MAX_SENS;
2426 		sc->sc_sens = URTW_8225_RF_DEF_SENS;
2427 		sc->sc_rf_stop = urtw_8225_rf_stop;
2428 		break;
2429 	default:
2430 		panic("unsupported RF chip %d\n", data & 0xff);
2431 		/* never reach  */
2432 	}
2433 
2434 	device_printf(sc->sc_dev, "%s rf %s hwrev %s\n",
2435 	    (sc->sc_flags & URTW_RTL8187B) ? "rtl8187b" : "rtl8187l",
2436 	    ((data & 0xff) == URTW_EPROM_RFCHIPID_RTL8225U) ? "rtl8225u" :
2437 	    "rtl8225z2",
2438 	    (sc->sc_flags & URTW_RTL8187B) ? ((data8 == 0) ? "b" :
2439 		(data8 == 1) ? "d" : "e") : "none");
2440 
2441 fail:
2442 	return (error);
2443 }
2444 
2445 
2446 static usb_error_t
2447 urtw_led_init(struct urtw_softc *sc)
2448 {
2449 	uint32_t rev;
2450 	usb_error_t error;
2451 
2452 	urtw_read8_m(sc, URTW_PSR, &sc->sc_psr);
2453 	error = urtw_eprom_read32(sc, URTW_EPROM_SWREV, &rev);
2454 	if (error != 0)
2455 		goto fail;
2456 
2457 	switch (rev & URTW_EPROM_CID_MASK) {
2458 	case URTW_EPROM_CID_ALPHA0:
2459 		sc->sc_strategy = URTW_SW_LED_MODE1;
2460 		break;
2461 	case URTW_EPROM_CID_SERCOMM_PS:
2462 		sc->sc_strategy = URTW_SW_LED_MODE3;
2463 		break;
2464 	case URTW_EPROM_CID_HW_LED:
2465 		sc->sc_strategy = URTW_HW_LED;
2466 		break;
2467 	case URTW_EPROM_CID_RSVD0:
2468 	case URTW_EPROM_CID_RSVD1:
2469 	default:
2470 		sc->sc_strategy = URTW_SW_LED_MODE0;
2471 		break;
2472 	}
2473 
2474 	sc->sc_gpio_ledpin = URTW_LED_PIN_GPIO0;
2475 
2476 fail:
2477 	return (error);
2478 }
2479 
2480 
2481 static usb_error_t
2482 urtw_8225_rf_init(struct urtw_softc *sc)
2483 {
2484 #define N(a)	((int)(sizeof(a) / sizeof((a)[0])))
2485 	int i;
2486 	uint16_t data;
2487 	usb_error_t error;
2488 
2489 	error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON);
2490 	if (error)
2491 		goto fail;
2492 
2493 	error = urtw_8225_usb_init(sc);
2494 	if (error)
2495 		goto fail;
2496 
2497 	urtw_write32_m(sc, URTW_RF_TIMING, 0x000a8008);
2498 	urtw_read16_m(sc, URTW_BRSR, &data);		/* XXX ??? */
2499 	urtw_write16_m(sc, URTW_BRSR, 0xffff);
2500 	urtw_write32_m(sc, URTW_RF_PARA, 0x100044);
2501 
2502 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
2503 	if (error)
2504 		goto fail;
2505 	urtw_write8_m(sc, URTW_CONFIG3, 0x44);
2506 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
2507 	if (error)
2508 		goto fail;
2509 
2510 	error = urtw_8185_rf_pins_enable(sc);
2511 	if (error)
2512 		goto fail;
2513 	usb_pause_mtx(&sc->sc_mtx, 1000);
2514 
2515 	for (i = 0; i < N(urtw_8225_rf_part1); i++) {
2516 		urtw_8225_write(sc, urtw_8225_rf_part1[i].reg,
2517 		    urtw_8225_rf_part1[i].val);
2518 		usb_pause_mtx(&sc->sc_mtx, 1);
2519 	}
2520 	usb_pause_mtx(&sc->sc_mtx, 100);
2521 	urtw_8225_write(sc,
2522 	    URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC1);
2523 	usb_pause_mtx(&sc->sc_mtx, 200);
2524 	urtw_8225_write(sc,
2525 	    URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC2);
2526 	usb_pause_mtx(&sc->sc_mtx, 200);
2527 	urtw_8225_write(sc,
2528 	    URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC3);
2529 
2530 	for (i = 0; i < 95; i++) {
2531 		urtw_8225_write(sc, URTW_8225_ADDR_1_MAGIC, (uint8_t)(i + 1));
2532 		urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, urtw_8225_rxgain[i]);
2533 	}
2534 
2535 	urtw_8225_write(sc,
2536 	    URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC4);
2537 	urtw_8225_write(sc,
2538 	    URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC5);
2539 
2540 	for (i = 0; i < 128; i++) {
2541 		urtw_8187_write_phy_ofdm(sc, 0xb, urtw_8225_agc[i]);
2542 		usb_pause_mtx(&sc->sc_mtx, 1);
2543 		urtw_8187_write_phy_ofdm(sc, 0xa, (uint8_t)i + 0x80);
2544 		usb_pause_mtx(&sc->sc_mtx, 1);
2545 	}
2546 
2547 	for (i = 0; i < N(urtw_8225_rf_part2); i++) {
2548 		urtw_8187_write_phy_ofdm(sc, urtw_8225_rf_part2[i].reg,
2549 		    urtw_8225_rf_part2[i].val);
2550 		usb_pause_mtx(&sc->sc_mtx, 1);
2551 	}
2552 
2553 	error = urtw_8225_setgain(sc, 4);
2554 	if (error)
2555 		goto fail;
2556 
2557 	for (i = 0; i < N(urtw_8225_rf_part3); i++) {
2558 		urtw_8187_write_phy_cck(sc, urtw_8225_rf_part3[i].reg,
2559 		    urtw_8225_rf_part3[i].val);
2560 		usb_pause_mtx(&sc->sc_mtx, 1);
2561 	}
2562 
2563 	urtw_write8_m(sc, URTW_TESTR, 0x0d);
2564 
2565 	error = urtw_8225_set_txpwrlvl(sc, 1);
2566 	if (error)
2567 		goto fail;
2568 
2569 	urtw_8187_write_phy_cck(sc, 0x10, 0x9b);
2570 	usb_pause_mtx(&sc->sc_mtx, 1);
2571 	urtw_8187_write_phy_ofdm(sc, 0x26, 0x90);
2572 	usb_pause_mtx(&sc->sc_mtx, 1);
2573 
2574 	/* TX ant A, 0x0 for B */
2575 	error = urtw_8185_tx_antenna(sc, 0x3);
2576 	if (error)
2577 		goto fail;
2578 	urtw_write32_m(sc, URTW_HSSI_PARA, 0x3dc00002);
2579 
2580 	error = urtw_8225_rf_set_chan(sc, 1);
2581 fail:
2582 	return (error);
2583 #undef N
2584 }
2585 
2586 static usb_error_t
2587 urtw_8185_rf_pins_enable(struct urtw_softc *sc)
2588 {
2589 	usb_error_t error = 0;
2590 
2591 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x1ff7);
2592 fail:
2593 	return (error);
2594 }
2595 
2596 static usb_error_t
2597 urtw_8185_tx_antenna(struct urtw_softc *sc, uint8_t ant)
2598 {
2599 	usb_error_t error;
2600 
2601 	urtw_write8_m(sc, URTW_TX_ANTENNA, ant);
2602 	usb_pause_mtx(&sc->sc_mtx, 1);
2603 fail:
2604 	return (error);
2605 }
2606 
2607 static usb_error_t
2608 urtw_8187_write_phy_ofdm_c(struct urtw_softc *sc, uint8_t addr, uint32_t data)
2609 {
2610 
2611 	data = data & 0xff;
2612 	return urtw_8187_write_phy(sc, addr, data);
2613 }
2614 
2615 static usb_error_t
2616 urtw_8187_write_phy_cck_c(struct urtw_softc *sc, uint8_t addr, uint32_t data)
2617 {
2618 
2619 	data = data & 0xff;
2620 	return urtw_8187_write_phy(sc, addr, data | 0x10000);
2621 }
2622 
2623 static usb_error_t
2624 urtw_8187_write_phy(struct urtw_softc *sc, uint8_t addr, uint32_t data)
2625 {
2626 	uint32_t phyw;
2627 	usb_error_t error;
2628 
2629 	phyw = ((data << 8) | (addr | 0x80));
2630 	urtw_write8_m(sc, URTW_PHY_MAGIC4, ((phyw & 0xff000000) >> 24));
2631 	urtw_write8_m(sc, URTW_PHY_MAGIC3, ((phyw & 0x00ff0000) >> 16));
2632 	urtw_write8_m(sc, URTW_PHY_MAGIC2, ((phyw & 0x0000ff00) >> 8));
2633 	urtw_write8_m(sc, URTW_PHY_MAGIC1, ((phyw & 0x000000ff)));
2634 	usb_pause_mtx(&sc->sc_mtx, 1);
2635 fail:
2636 	return (error);
2637 }
2638 
2639 static usb_error_t
2640 urtw_8225_setgain(struct urtw_softc *sc, int16_t gain)
2641 {
2642 	usb_error_t error;
2643 
2644 	urtw_8187_write_phy_ofdm(sc, 0x0d, urtw_8225_gain[gain * 4]);
2645 	urtw_8187_write_phy_ofdm(sc, 0x1b, urtw_8225_gain[gain * 4 + 2]);
2646 	urtw_8187_write_phy_ofdm(sc, 0x1d, urtw_8225_gain[gain * 4 + 3]);
2647 	urtw_8187_write_phy_ofdm(sc, 0x23, urtw_8225_gain[gain * 4 + 1]);
2648 fail:
2649 	return (error);
2650 }
2651 
2652 static usb_error_t
2653 urtw_8225_usb_init(struct urtw_softc *sc)
2654 {
2655 	uint8_t data;
2656 	usb_error_t error;
2657 
2658 	urtw_write8_m(sc, URTW_RF_PINS_SELECT + 1, 0);
2659 	urtw_write8_m(sc, URTW_GPIO, 0);
2660 	error = urtw_read8e(sc, 0x53, &data);
2661 	if (error)
2662 		goto fail;
2663 	error = urtw_write8e(sc, 0x53, data | (1 << 7));
2664 	if (error)
2665 		goto fail;
2666 	urtw_write8_m(sc, URTW_RF_PINS_SELECT + 1, 4);
2667 	urtw_write8_m(sc, URTW_GPIO, 0x20);
2668 	urtw_write8_m(sc, URTW_GP_ENABLE, 0);
2669 
2670 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x80);
2671 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x80);
2672 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x80);
2673 
2674 	usb_pause_mtx(&sc->sc_mtx, 500);
2675 fail:
2676 	return (error);
2677 }
2678 
2679 static usb_error_t
2680 urtw_8225_write_c(struct urtw_softc *sc, uint8_t addr, uint16_t data)
2681 {
2682 	uint16_t d80, d82, d84;
2683 	usb_error_t error;
2684 
2685 	urtw_read16_m(sc, URTW_RF_PINS_OUTPUT, &d80);
2686 	d80 &= URTW_RF_PINS_MAGIC1;
2687 	urtw_read16_m(sc, URTW_RF_PINS_ENABLE, &d82);
2688 	urtw_read16_m(sc, URTW_RF_PINS_SELECT, &d84);
2689 	d84 &= URTW_RF_PINS_MAGIC2;
2690 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, d82 | URTW_RF_PINS_MAGIC3);
2691 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, d84 | URTW_RF_PINS_MAGIC3);
2692 	DELAY(10);
2693 
2694 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN);
2695 	DELAY(2);
2696 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80);
2697 	DELAY(10);
2698 
2699 	error = urtw_8225_write_s16(sc, addr, 0x8225, &data);
2700 	if (error != 0)
2701 		goto fail;
2702 
2703 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN);
2704 	DELAY(10);
2705 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN);
2706 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, d84);
2707 	usb_pause_mtx(&sc->sc_mtx, 2);
2708 fail:
2709 	return (error);
2710 }
2711 
2712 /* XXX why we should allocalte memory buffer instead of using memory stack?  */
2713 static usb_error_t
2714 urtw_8225_write_s16(struct urtw_softc *sc, uint8_t addr, int index,
2715     uint16_t *data)
2716 {
2717 	uint8_t *buf;
2718 	uint16_t data16;
2719 	struct usb_device_request *req;
2720 	usb_error_t error = 0;
2721 
2722 	data16 = *data;
2723 	req = (usb_device_request_t *)malloc(sizeof(usb_device_request_t),
2724 	    M_80211_VAP, M_NOWAIT | M_ZERO);
2725 	if (req == NULL) {
2726 		device_printf(sc->sc_dev, "could not allocate a memory\n");
2727 		goto fail0;
2728 	}
2729 	buf = (uint8_t *)malloc(2, M_80211_VAP, M_NOWAIT | M_ZERO);
2730 	if (req == NULL) {
2731 		device_printf(sc->sc_dev, "could not allocate a memory\n");
2732 		goto fail1;
2733 	}
2734 
2735 	req->bmRequestType = UT_WRITE_VENDOR_DEVICE;
2736 	req->bRequest = URTW_8187_SETREGS_REQ;
2737 	USETW(req->wValue, addr);
2738 	USETW(req->wIndex, index);
2739 	USETW(req->wLength, sizeof(uint16_t));
2740 	buf[0] = (data16 & 0x00ff);
2741 	buf[1] = (data16 & 0xff00) >> 8;
2742 
2743 	error = urtw_do_request(sc, req, buf);
2744 
2745 	free(buf, M_80211_VAP);
2746 fail1:	free(req, M_80211_VAP);
2747 fail0:	return (error);
2748 }
2749 
2750 static usb_error_t
2751 urtw_8225_rf_set_chan(struct urtw_softc *sc, int chan)
2752 {
2753 	usb_error_t error;
2754 
2755 	error = urtw_8225_set_txpwrlvl(sc, chan);
2756 	if (error)
2757 		goto fail;
2758 	urtw_8225_write(sc, URTW_8225_ADDR_7_MAGIC, urtw_8225_channel[chan]);
2759 	usb_pause_mtx(&sc->sc_mtx, 10);
2760 fail:
2761 	return (error);
2762 }
2763 
2764 static usb_error_t
2765 urtw_8225_rf_set_sens(struct urtw_softc *sc, int sens)
2766 {
2767 	usb_error_t error;
2768 
2769 	if (sens < 0 || sens > 6)
2770 		return -1;
2771 
2772 	if (sens > 4)
2773 		urtw_8225_write(sc,
2774 		    URTW_8225_ADDR_C_MAGIC, URTW_8225_ADDR_C_DATA_MAGIC1);
2775 	else
2776 		urtw_8225_write(sc,
2777 		    URTW_8225_ADDR_C_MAGIC, URTW_8225_ADDR_C_DATA_MAGIC2);
2778 
2779 	sens = 6 - sens;
2780 	error = urtw_8225_setgain(sc, sens);
2781 	if (error)
2782 		goto fail;
2783 
2784 	urtw_8187_write_phy_cck(sc, 0x41, urtw_8225_threshold[sens]);
2785 
2786 fail:
2787 	return (error);
2788 }
2789 
2790 static usb_error_t
2791 urtw_8225_set_txpwrlvl(struct urtw_softc *sc, int chan)
2792 {
2793 	int i, idx, set;
2794 	uint8_t *cck_pwltable;
2795 	uint8_t cck_pwrlvl_max, ofdm_pwrlvl_min, ofdm_pwrlvl_max;
2796 	uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff;
2797 	uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff;
2798 	usb_error_t error;
2799 
2800 	cck_pwrlvl_max = 11;
2801 	ofdm_pwrlvl_max = 25;	/* 12 -> 25  */
2802 	ofdm_pwrlvl_min = 10;
2803 
2804 	/* CCK power setting */
2805 	cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ? cck_pwrlvl_max : cck_pwrlvl;
2806 	idx = cck_pwrlvl % 6;
2807 	set = cck_pwrlvl / 6;
2808 	cck_pwltable = (chan == 14) ? urtw_8225_txpwr_cck_ch14 :
2809 	    urtw_8225_txpwr_cck;
2810 
2811 	urtw_write8_m(sc, URTW_TX_GAIN_CCK,
2812 	    urtw_8225_tx_gain_cck_ofdm[set] >> 1);
2813 	for (i = 0; i < 8; i++) {
2814 		urtw_8187_write_phy_cck(sc, 0x44 + i,
2815 		    cck_pwltable[idx * 8 + i]);
2816 	}
2817 	usb_pause_mtx(&sc->sc_mtx, 1);
2818 
2819 	/* OFDM power setting */
2820 	ofdm_pwrlvl = (ofdm_pwrlvl > (ofdm_pwrlvl_max - ofdm_pwrlvl_min)) ?
2821 	    ofdm_pwrlvl_max : ofdm_pwrlvl + ofdm_pwrlvl_min;
2822 	ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl;
2823 
2824 	idx = ofdm_pwrlvl % 6;
2825 	set = ofdm_pwrlvl / 6;
2826 
2827 	error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON);
2828 	if (error)
2829 		goto fail;
2830 	urtw_8187_write_phy_ofdm(sc, 2, 0x42);
2831 	urtw_8187_write_phy_ofdm(sc, 6, 0);
2832 	urtw_8187_write_phy_ofdm(sc, 8, 0);
2833 
2834 	urtw_write8_m(sc, URTW_TX_GAIN_OFDM,
2835 	    urtw_8225_tx_gain_cck_ofdm[set] >> 1);
2836 	urtw_8187_write_phy_ofdm(sc, 0x5, urtw_8225_txpwr_ofdm[idx]);
2837 	urtw_8187_write_phy_ofdm(sc, 0x7, urtw_8225_txpwr_ofdm[idx]);
2838 	usb_pause_mtx(&sc->sc_mtx, 1);
2839 fail:
2840 	return (error);
2841 }
2842 
2843 
2844 static usb_error_t
2845 urtw_8225_rf_stop(struct urtw_softc *sc)
2846 {
2847 	uint8_t data;
2848 	usb_error_t error;
2849 
2850 	urtw_8225_write(sc, 0x4, 0x1f);
2851 
2852 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
2853 	if (error)
2854 		goto fail;
2855 
2856 	urtw_read8_m(sc, URTW_CONFIG3, &data);
2857 	urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE);
2858 	if (sc->sc_flags & URTW_RTL8187B) {
2859 		urtw_write32_m(sc, URTW_ANAPARAM2,
2860 		    URTW_8187B_8225_ANAPARAM2_OFF);
2861 		urtw_write32_m(sc, URTW_ANAPARAM, URTW_8187B_8225_ANAPARAM_OFF);
2862 		urtw_write32_m(sc, URTW_ANAPARAM3,
2863 		    URTW_8187B_8225_ANAPARAM3_OFF);
2864 	} else {
2865 		urtw_write32_m(sc, URTW_ANAPARAM2, URTW_8225_ANAPARAM2_OFF);
2866 		urtw_write32_m(sc, URTW_ANAPARAM, URTW_8225_ANAPARAM_OFF);
2867 	}
2868 
2869 	urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE);
2870 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
2871 	if (error)
2872 		goto fail;
2873 
2874 fail:
2875 	return (error);
2876 }
2877 
2878 static usb_error_t
2879 urtw_8225v2_rf_init(struct urtw_softc *sc)
2880 {
2881 #define N(a)	((int)(sizeof(a) / sizeof((a)[0])))
2882 	int i;
2883 	uint16_t data;
2884 	uint32_t data32;
2885 	usb_error_t error;
2886 
2887 	error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON);
2888 	if (error)
2889 		goto fail;
2890 
2891 	error = urtw_8225_usb_init(sc);
2892 	if (error)
2893 		goto fail;
2894 
2895 	urtw_write32_m(sc, URTW_RF_TIMING, 0x000a8008);
2896 	urtw_read16_m(sc, URTW_BRSR, &data);		/* XXX ??? */
2897 	urtw_write16_m(sc, URTW_BRSR, 0xffff);
2898 	urtw_write32_m(sc, URTW_RF_PARA, 0x100044);
2899 
2900 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
2901 	if (error)
2902 		goto fail;
2903 	urtw_write8_m(sc, URTW_CONFIG3, 0x44);
2904 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
2905 	if (error)
2906 		goto fail;
2907 
2908 	error = urtw_8185_rf_pins_enable(sc);
2909 	if (error)
2910 		goto fail;
2911 
2912 	usb_pause_mtx(&sc->sc_mtx, 500);
2913 
2914 	for (i = 0; i < N(urtw_8225v2_rf_part1); i++) {
2915 		urtw_8225_write(sc, urtw_8225v2_rf_part1[i].reg,
2916 		    urtw_8225v2_rf_part1[i].val);
2917 	}
2918 	usb_pause_mtx(&sc->sc_mtx, 50);
2919 
2920 	urtw_8225_write(sc,
2921 	    URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC1);
2922 
2923 	for (i = 0; i < 95; i++) {
2924 		urtw_8225_write(sc, URTW_8225_ADDR_1_MAGIC, (uint8_t)(i + 1));
2925 		urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC,
2926 		    urtw_8225v2_rxgain[i]);
2927 	}
2928 
2929 	urtw_8225_write(sc,
2930 	    URTW_8225_ADDR_3_MAGIC, URTW_8225_ADDR_3_DATA_MAGIC1);
2931 	urtw_8225_write(sc,
2932 	    URTW_8225_ADDR_5_MAGIC, URTW_8225_ADDR_5_DATA_MAGIC1);
2933 	urtw_8225_write(sc,
2934 	    URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC2);
2935 	urtw_8225_write(sc,
2936 	    URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC1);
2937 	usb_pause_mtx(&sc->sc_mtx, 100);
2938 	urtw_8225_write(sc,
2939 	    URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC2);
2940 	usb_pause_mtx(&sc->sc_mtx, 100);
2941 
2942 	error = urtw_8225_read(sc, URTW_8225_ADDR_6_MAGIC, &data32);
2943 	if (error != 0)
2944 		goto fail;
2945 	if (data32 != URTW_8225_ADDR_6_DATA_MAGIC1)
2946 		device_printf(sc->sc_dev, "expect 0xe6!! (0x%x)\n", data32);
2947 	if (!(data32 & URTW_8225_ADDR_6_DATA_MAGIC2)) {
2948 		urtw_8225_write(sc,
2949 		    URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC1);
2950 		usb_pause_mtx(&sc->sc_mtx, 100);
2951 		urtw_8225_write(sc,
2952 		    URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC2);
2953 		usb_pause_mtx(&sc->sc_mtx, 50);
2954 		error = urtw_8225_read(sc, URTW_8225_ADDR_6_MAGIC, &data32);
2955 		if (error != 0)
2956 			goto fail;
2957 		if (!(data32 & URTW_8225_ADDR_6_DATA_MAGIC2))
2958 			device_printf(sc->sc_dev, "RF calibration failed\n");
2959 	}
2960 	usb_pause_mtx(&sc->sc_mtx, 100);
2961 
2962 	urtw_8225_write(sc,
2963 	    URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC6);
2964 	for (i = 0; i < 128; i++) {
2965 		urtw_8187_write_phy_ofdm(sc, 0xb, urtw_8225_agc[i]);
2966 		urtw_8187_write_phy_ofdm(sc, 0xa, (uint8_t)i + 0x80);
2967 	}
2968 
2969 	for (i = 0; i < N(urtw_8225v2_rf_part2); i++) {
2970 		urtw_8187_write_phy_ofdm(sc, urtw_8225v2_rf_part2[i].reg,
2971 		    urtw_8225v2_rf_part2[i].val);
2972 	}
2973 
2974 	error = urtw_8225v2_setgain(sc, 4);
2975 	if (error)
2976 		goto fail;
2977 
2978 	for (i = 0; i < N(urtw_8225v2_rf_part3); i++) {
2979 		urtw_8187_write_phy_cck(sc, urtw_8225v2_rf_part3[i].reg,
2980 		    urtw_8225v2_rf_part3[i].val);
2981 	}
2982 
2983 	urtw_write8_m(sc, URTW_TESTR, 0x0d);
2984 
2985 	error = urtw_8225v2_set_txpwrlvl(sc, 1);
2986 	if (error)
2987 		goto fail;
2988 
2989 	urtw_8187_write_phy_cck(sc, 0x10, 0x9b);
2990 	urtw_8187_write_phy_ofdm(sc, 0x26, 0x90);
2991 
2992 	/* TX ant A, 0x0 for B */
2993 	error = urtw_8185_tx_antenna(sc, 0x3);
2994 	if (error)
2995 		goto fail;
2996 	urtw_write32_m(sc, URTW_HSSI_PARA, 0x3dc00002);
2997 
2998 	error = urtw_8225_rf_set_chan(sc, 1);
2999 fail:
3000 	return (error);
3001 #undef N
3002 }
3003 
3004 static usb_error_t
3005 urtw_8225v2_rf_set_chan(struct urtw_softc *sc, int chan)
3006 {
3007 	usb_error_t error;
3008 
3009 	error = urtw_8225v2_set_txpwrlvl(sc, chan);
3010 	if (error)
3011 		goto fail;
3012 
3013 	urtw_8225_write(sc, URTW_8225_ADDR_7_MAGIC, urtw_8225_channel[chan]);
3014 	usb_pause_mtx(&sc->sc_mtx, 10);
3015 fail:
3016 	return (error);
3017 }
3018 
3019 static usb_error_t
3020 urtw_8225_read(struct urtw_softc *sc, uint8_t addr, uint32_t *data)
3021 {
3022 	int i;
3023 	int16_t bit;
3024 	uint8_t rlen = 12, wlen = 6;
3025 	uint16_t o1, o2, o3, tmp;
3026 	uint32_t d2w = ((uint32_t)(addr & 0x1f)) << 27;
3027 	uint32_t mask = 0x80000000, value = 0;
3028 	usb_error_t error;
3029 
3030 	urtw_read16_m(sc, URTW_RF_PINS_OUTPUT, &o1);
3031 	urtw_read16_m(sc, URTW_RF_PINS_ENABLE, &o2);
3032 	urtw_read16_m(sc, URTW_RF_PINS_SELECT, &o3);
3033 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, o2 | URTW_RF_PINS_MAGIC4);
3034 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, o3 | URTW_RF_PINS_MAGIC4);
3035 	o1 &= ~URTW_RF_PINS_MAGIC4;
3036 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_EN);
3037 	DELAY(5);
3038 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1);
3039 	DELAY(5);
3040 
3041 	for (i = 0; i < (wlen / 2); i++, mask = mask >> 1) {
3042 		bit = ((d2w & mask) != 0) ? 1 : 0;
3043 
3044 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1);
3045 		DELAY(2);
3046 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 |
3047 		    URTW_BB_HOST_BANG_CLK);
3048 		DELAY(2);
3049 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 |
3050 		    URTW_BB_HOST_BANG_CLK);
3051 		DELAY(2);
3052 		mask = mask >> 1;
3053 		if (i == 2)
3054 			break;
3055 		bit = ((d2w & mask) != 0) ? 1 : 0;
3056 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 |
3057 		    URTW_BB_HOST_BANG_CLK);
3058 		DELAY(2);
3059 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 |
3060 		    URTW_BB_HOST_BANG_CLK);
3061 		DELAY(2);
3062 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1);
3063 		DELAY(1);
3064 	}
3065 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | URTW_BB_HOST_BANG_RW |
3066 	    URTW_BB_HOST_BANG_CLK);
3067 	DELAY(2);
3068 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | URTW_BB_HOST_BANG_RW);
3069 	DELAY(2);
3070 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_RW);
3071 	DELAY(2);
3072 
3073 	mask = 0x800;
3074 	for (i = 0; i < rlen; i++, mask = mask >> 1) {
3075 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
3076 		    o1 | URTW_BB_HOST_BANG_RW);
3077 		DELAY(2);
3078 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
3079 		    o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK);
3080 		DELAY(2);
3081 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
3082 		    o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK);
3083 		DELAY(2);
3084 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
3085 		    o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK);
3086 		DELAY(2);
3087 
3088 		urtw_read16_m(sc, URTW_RF_PINS_INPUT, &tmp);
3089 		value |= ((tmp & URTW_BB_HOST_BANG_CLK) ? mask : 0);
3090 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
3091 		    o1 | URTW_BB_HOST_BANG_RW);
3092 		DELAY(2);
3093 	}
3094 
3095 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_EN |
3096 	    URTW_BB_HOST_BANG_RW);
3097 	DELAY(2);
3098 
3099 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, o2);
3100 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, o3);
3101 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, URTW_RF_PINS_OUTPUT_MAGIC1);
3102 
3103 	if (data != NULL)
3104 		*data = value;
3105 fail:
3106 	return (error);
3107 }
3108 
3109 
3110 static usb_error_t
3111 urtw_8225v2_set_txpwrlvl(struct urtw_softc *sc, int chan)
3112 {
3113 	int i;
3114 	uint8_t *cck_pwrtable;
3115 	uint8_t cck_pwrlvl_max = 15, ofdm_pwrlvl_max = 25, ofdm_pwrlvl_min = 10;
3116 	uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff;
3117 	uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff;
3118 	usb_error_t error;
3119 
3120 	/* CCK power setting */
3121 	cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ? cck_pwrlvl_max : cck_pwrlvl;
3122 	cck_pwrlvl += sc->sc_txpwr_cck_base;
3123 	cck_pwrlvl = (cck_pwrlvl > 35) ? 35 : cck_pwrlvl;
3124 	cck_pwrtable = (chan == 14) ? urtw_8225v2_txpwr_cck_ch14 :
3125 	    urtw_8225v2_txpwr_cck;
3126 
3127 	for (i = 0; i < 8; i++)
3128 		urtw_8187_write_phy_cck(sc, 0x44 + i, cck_pwrtable[i]);
3129 
3130 	urtw_write8_m(sc, URTW_TX_GAIN_CCK,
3131 	    urtw_8225v2_tx_gain_cck_ofdm[cck_pwrlvl]);
3132 	usb_pause_mtx(&sc->sc_mtx, 1);
3133 
3134 	/* OFDM power setting */
3135 	ofdm_pwrlvl = (ofdm_pwrlvl > (ofdm_pwrlvl_max - ofdm_pwrlvl_min)) ?
3136 		ofdm_pwrlvl_max : ofdm_pwrlvl + ofdm_pwrlvl_min;
3137 	ofdm_pwrlvl += sc->sc_txpwr_ofdm_base;
3138 	ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl;
3139 
3140 	error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON);
3141 	if (error)
3142 		goto fail;
3143 
3144 	urtw_8187_write_phy_ofdm(sc, 2, 0x42);
3145 	urtw_8187_write_phy_ofdm(sc, 5, 0x0);
3146 	urtw_8187_write_phy_ofdm(sc, 6, 0x40);
3147 	urtw_8187_write_phy_ofdm(sc, 7, 0x0);
3148 	urtw_8187_write_phy_ofdm(sc, 8, 0x40);
3149 
3150 	urtw_write8_m(sc, URTW_TX_GAIN_OFDM,
3151 	    urtw_8225v2_tx_gain_cck_ofdm[ofdm_pwrlvl]);
3152 	usb_pause_mtx(&sc->sc_mtx, 1);
3153 fail:
3154 	return (error);
3155 }
3156 
3157 static usb_error_t
3158 urtw_8225v2_setgain(struct urtw_softc *sc, int16_t gain)
3159 {
3160 	uint8_t *gainp;
3161 	usb_error_t error;
3162 
3163 	/* XXX for A?  */
3164 	gainp = urtw_8225v2_gain_bg;
3165 	urtw_8187_write_phy_ofdm(sc, 0x0d, gainp[gain * 3]);
3166 	usb_pause_mtx(&sc->sc_mtx, 1);
3167 	urtw_8187_write_phy_ofdm(sc, 0x1b, gainp[gain * 3 + 1]);
3168 	usb_pause_mtx(&sc->sc_mtx, 1);
3169 	urtw_8187_write_phy_ofdm(sc, 0x1d, gainp[gain * 3 + 2]);
3170 	usb_pause_mtx(&sc->sc_mtx, 1);
3171 	urtw_8187_write_phy_ofdm(sc, 0x21, 0x17);
3172 	usb_pause_mtx(&sc->sc_mtx, 1);
3173 fail:
3174 	return (error);
3175 }
3176 
3177 static usb_error_t
3178 urtw_8225_isv2(struct urtw_softc *sc, int *ret)
3179 {
3180 	uint32_t data;
3181 	usb_error_t error;
3182 
3183 	*ret = 1;
3184 
3185 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, URTW_RF_PINS_MAGIC5);
3186 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, URTW_RF_PINS_MAGIC5);
3187 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, URTW_RF_PINS_MAGIC5);
3188 	usb_pause_mtx(&sc->sc_mtx, 500);
3189 
3190 	urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC,
3191 	    URTW_8225_ADDR_0_DATA_MAGIC1);
3192 
3193 	error = urtw_8225_read(sc, URTW_8225_ADDR_8_MAGIC, &data);
3194 	if (error != 0)
3195 		goto fail;
3196 	if (data != URTW_8225_ADDR_8_DATA_MAGIC1)
3197 		*ret = 0;
3198 	else {
3199 		error = urtw_8225_read(sc, URTW_8225_ADDR_9_MAGIC, &data);
3200 		if (error != 0)
3201 			goto fail;
3202 		if (data != URTW_8225_ADDR_9_DATA_MAGIC1)
3203 			*ret = 0;
3204 	}
3205 
3206 	urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC,
3207 	    URTW_8225_ADDR_0_DATA_MAGIC2);
3208 fail:
3209 	return (error);
3210 }
3211 
3212 static usb_error_t
3213 urtw_8225v2b_rf_init(struct urtw_softc *sc)
3214 {
3215 #define N(a)	((int)(sizeof(a) / sizeof((a)[0])))
3216 	int i;
3217 	uint8_t data8;
3218 	usb_error_t error;
3219 
3220 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
3221 	if (error)
3222 		goto fail;
3223 
3224 	/*
3225 	 * initialize extra registers on 8187
3226 	 */
3227 	urtw_write16_m(sc, URTW_BRSR_8187B, 0xfff);
3228 
3229 	/* retry limit */
3230 	urtw_read8_m(sc, URTW_CW_CONF, &data8);
3231 	data8 |= URTW_CW_CONF_PERPACKET_RETRY;
3232 	urtw_write8_m(sc, URTW_CW_CONF, data8);
3233 
3234 	/* TX AGC */
3235 	urtw_read8_m(sc, URTW_TX_AGC_CTL, &data8);
3236 	data8 |= URTW_TX_AGC_CTL_PERPACKET_GAIN;
3237 	urtw_write8_m(sc, URTW_TX_AGC_CTL, data8);
3238 
3239 	/* Auto Rate Fallback Control */
3240 #define	URTW_ARFR	0x1e0
3241 	urtw_write16_m(sc, URTW_ARFR, 0xfff);
3242 	urtw_read8_m(sc, URTW_RATE_FALLBACK, &data8);
3243 	urtw_write8_m(sc, URTW_RATE_FALLBACK,
3244 	    data8 | URTW_RATE_FALLBACK_ENABLE);
3245 
3246 	urtw_read8_m(sc, URTW_MSR, &data8);
3247 	urtw_write8_m(sc, URTW_MSR, data8 & 0xf3);
3248 	urtw_read8_m(sc, URTW_MSR, &data8);
3249 	urtw_write8_m(sc, URTW_MSR, data8 | URTW_MSR_LINK_ENEDCA);
3250 	urtw_write8_m(sc, URTW_ACM_CONTROL, sc->sc_acmctl);
3251 
3252 	urtw_write16_m(sc, URTW_ATIM_WND, 2);
3253 	urtw_write16_m(sc, URTW_BEACON_INTERVAL, 100);
3254 #define	URTW_FEMR_FOR_8187B	0x1d4
3255 	urtw_write16_m(sc, URTW_FEMR_FOR_8187B, 0xffff);
3256 
3257 	/* led type */
3258 	urtw_read8_m(sc, URTW_CONFIG1, &data8);
3259 	data8 = (data8 & 0x3f) | 0x80;
3260 	urtw_write8_m(sc, URTW_CONFIG1, data8);
3261 
3262 	/* applying MAC address again.  */
3263 	urtw_write32_m(sc, URTW_MAC0, ((uint32_t *)sc->sc_bssid)[0]);
3264 	urtw_write16_m(sc, URTW_MAC4, ((uint32_t *)sc->sc_bssid)[1] & 0xffff);
3265 
3266 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
3267 	if (error)
3268 		goto fail;
3269 
3270 	urtw_write8_m(sc, URTW_WPA_CONFIG, 0);
3271 
3272 	/*
3273 	 * MAC configuration
3274 	 */
3275 	for (i = 0; i < N(urtw_8225v2b_rf_part1); i++)
3276 		urtw_write8_m(sc, urtw_8225v2b_rf_part1[i].reg,
3277 		    urtw_8225v2b_rf_part1[i].val);
3278 	urtw_write16_m(sc, URTW_TID_AC_MAP, 0xfa50);
3279 	urtw_write16_m(sc, URTW_INT_MIG, 0x0000);
3280 	urtw_write32_m(sc, 0x1f0, 0);
3281 	urtw_write32_m(sc, 0x1f4, 0);
3282 	urtw_write8_m(sc, 0x1f8, 0);
3283 	urtw_write32_m(sc, URTW_RF_TIMING, 0x4001);
3284 
3285 #define	URTW_RFSW_CTRL	0x272
3286 	urtw_write16_m(sc, URTW_RFSW_CTRL, 0x569a);
3287 
3288 	/*
3289 	 * initialize PHY
3290 	 */
3291 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
3292 	if (error)
3293 		goto fail;
3294 	urtw_read8_m(sc, URTW_CONFIG3, &data8);
3295 	urtw_write8_m(sc, URTW_CONFIG3,
3296 	    data8 | URTW_CONFIG3_ANAPARAM_WRITE);
3297 
3298 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
3299 	if (error)
3300 		goto fail;
3301 
3302 	/* setup RFE initial timing */
3303 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x0480);
3304 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x2488);
3305 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x1fff);
3306 	usb_pause_mtx(&sc->sc_mtx, 1100);
3307 
3308 	for (i = 0; i < N(urtw_8225v2b_rf_part0); i++) {
3309 		urtw_8225_write(sc, urtw_8225v2b_rf_part0[i].reg,
3310 		    urtw_8225v2b_rf_part0[i].val);
3311 		usb_pause_mtx(&sc->sc_mtx, 1);
3312 	}
3313 	urtw_8225_write(sc, 0x00, 0x01b7);
3314 
3315 	for (i = 0; i < 95; i++) {
3316 		urtw_8225_write(sc, URTW_8225_ADDR_1_MAGIC, (uint8_t)(i + 1));
3317 		usb_pause_mtx(&sc->sc_mtx, 1);
3318 		urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC,
3319 		    urtw_8225v2b_rxgain[i]);
3320 		usb_pause_mtx(&sc->sc_mtx, 1);
3321 	}
3322 
3323 	urtw_8225_write(sc, URTW_8225_ADDR_3_MAGIC, 0x080);
3324 	usb_pause_mtx(&sc->sc_mtx, 1);
3325 	urtw_8225_write(sc, URTW_8225_ADDR_5_MAGIC, 0x004);
3326 	usb_pause_mtx(&sc->sc_mtx, 1);
3327 	urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC, 0x0b7);
3328 	usb_pause_mtx(&sc->sc_mtx, 1);
3329 	usb_pause_mtx(&sc->sc_mtx, 3000);
3330 	urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, 0xc4d);
3331 	usb_pause_mtx(&sc->sc_mtx, 2000);
3332 	urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, 0x44d);
3333 	usb_pause_mtx(&sc->sc_mtx, 1);
3334 	urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC, 0x2bf);
3335 	usb_pause_mtx(&sc->sc_mtx, 1);
3336 
3337 	urtw_write8_m(sc, URTW_TX_GAIN_CCK, 0x03);
3338 	urtw_write8_m(sc, URTW_TX_GAIN_OFDM, 0x07);
3339 	urtw_write8_m(sc, URTW_TX_ANTENNA, 0x03);
3340 
3341 	urtw_8187_write_phy_ofdm(sc, 0x80, 0x12);
3342 	for (i = 0; i < 128; i++) {
3343 		uint32_t addr, data;
3344 
3345 		data = (urtw_8225z2_agc[i] << 8) | 0x0000008f;
3346 		addr = ((i + 0x80) << 8) | 0x0000008e;
3347 
3348 		urtw_8187_write_phy_ofdm(sc, data & 0x7f, (data >> 8) & 0xff);
3349 		urtw_8187_write_phy_ofdm(sc, addr & 0x7f, (addr >> 8) & 0xff);
3350 		urtw_8187_write_phy_ofdm(sc, 0x0e, 0x00);
3351 	}
3352 	urtw_8187_write_phy_ofdm(sc, 0x80, 0x10);
3353 
3354 	for (i = 0; i < N(urtw_8225v2b_rf_part2); i++)
3355 		urtw_8187_write_phy_ofdm(sc, i, urtw_8225v2b_rf_part2[i].val);
3356 
3357 	urtw_write32_m(sc, URTW_8187B_AC_VO, (7 << 12) | (3 << 8) | 0x1c);
3358 	urtw_write32_m(sc, URTW_8187B_AC_VI, (7 << 12) | (3 << 8) | 0x1c);
3359 	urtw_write32_m(sc, URTW_8187B_AC_BE, (7 << 12) | (3 << 8) | 0x1c);
3360 	urtw_write32_m(sc, URTW_8187B_AC_BK, (7 << 12) | (3 << 8) | 0x1c);
3361 
3362 	urtw_8187_write_phy_ofdm(sc, 0x97, 0x46);
3363 	urtw_8187_write_phy_ofdm(sc, 0xa4, 0xb6);
3364 	urtw_8187_write_phy_ofdm(sc, 0x85, 0xfc);
3365 	urtw_8187_write_phy_cck(sc, 0xc1, 0x88);
3366 
3367 fail:
3368 	return (error);
3369 #undef N
3370 }
3371 
3372 static usb_error_t
3373 urtw_8225v2b_rf_set_chan(struct urtw_softc *sc, int chan)
3374 {
3375 	usb_error_t error;
3376 
3377 	error = urtw_8225v2b_set_txpwrlvl(sc, chan);
3378 	if (error)
3379 		goto fail;
3380 
3381 	urtw_8225_write(sc, URTW_8225_ADDR_7_MAGIC, urtw_8225_channel[chan]);
3382 	usb_pause_mtx(&sc->sc_mtx, 10);
3383 fail:
3384 	return (error);
3385 }
3386 
3387 static usb_error_t
3388 urtw_8225v2b_set_txpwrlvl(struct urtw_softc *sc, int chan)
3389 {
3390 	int i;
3391 	uint8_t *cck_pwrtable;
3392 	uint8_t cck_pwrlvl_max = 15;
3393 	uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff;
3394 	uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff;
3395 	usb_error_t error;
3396 
3397 	/* CCK power setting */
3398 	cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ?
3399 	    ((sc->sc_flags & URTW_RTL8187B_REV_B) ? cck_pwrlvl_max : 22) :
3400 	    (cck_pwrlvl + ((sc->sc_flags & URTW_RTL8187B_REV_B) ? 0 : 7));
3401 	cck_pwrlvl += sc->sc_txpwr_cck_base;
3402 	cck_pwrlvl = (cck_pwrlvl > 35) ? 35 : cck_pwrlvl;
3403 	cck_pwrtable = (chan == 14) ? urtw_8225v2b_txpwr_cck_ch14 :
3404 	    urtw_8225v2b_txpwr_cck;
3405 
3406 	if (sc->sc_flags & URTW_RTL8187B_REV_B)
3407 		cck_pwrtable += (cck_pwrlvl <= 6) ? 0 :
3408 		    ((cck_pwrlvl <= 11) ? 8 : 16);
3409 	else
3410 		cck_pwrtable += (cck_pwrlvl <= 5) ? 0 :
3411 		    ((cck_pwrlvl <= 11) ? 8 : ((cck_pwrlvl <= 17) ? 16 : 24));
3412 
3413 	for (i = 0; i < 8; i++)
3414 		urtw_8187_write_phy_cck(sc, 0x44 + i, cck_pwrtable[i]);
3415 
3416 	urtw_write8_m(sc, URTW_TX_GAIN_CCK,
3417 	    urtw_8225v2_tx_gain_cck_ofdm[cck_pwrlvl] << 1);
3418 	usb_pause_mtx(&sc->sc_mtx, 1);
3419 
3420 	/* OFDM power setting */
3421 	ofdm_pwrlvl = (ofdm_pwrlvl > 15) ?
3422 	    ((sc->sc_flags & URTW_RTL8187B_REV_B) ? 17 : 25) :
3423 	    (ofdm_pwrlvl + ((sc->sc_flags & URTW_RTL8187B_REV_B) ? 2 : 10));
3424 	ofdm_pwrlvl += sc->sc_txpwr_ofdm_base;
3425 	ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl;
3426 
3427 	urtw_write8_m(sc, URTW_TX_GAIN_OFDM,
3428 	    urtw_8225v2_tx_gain_cck_ofdm[ofdm_pwrlvl] << 1);
3429 
3430 	if (sc->sc_flags & URTW_RTL8187B_REV_B) {
3431 		if (ofdm_pwrlvl <= 11) {
3432 			urtw_8187_write_phy_ofdm(sc, 0x87, 0x60);
3433 			urtw_8187_write_phy_ofdm(sc, 0x89, 0x60);
3434 		} else {
3435 			urtw_8187_write_phy_ofdm(sc, 0x87, 0x5c);
3436 			urtw_8187_write_phy_ofdm(sc, 0x89, 0x5c);
3437 		}
3438 	} else {
3439 		if (ofdm_pwrlvl <= 11) {
3440 			urtw_8187_write_phy_ofdm(sc, 0x87, 0x5c);
3441 			urtw_8187_write_phy_ofdm(sc, 0x89, 0x5c);
3442 		} else if (ofdm_pwrlvl <= 17) {
3443 			urtw_8187_write_phy_ofdm(sc, 0x87, 0x54);
3444 			urtw_8187_write_phy_ofdm(sc, 0x89, 0x54);
3445 		} else {
3446 			urtw_8187_write_phy_ofdm(sc, 0x87, 0x50);
3447 			urtw_8187_write_phy_ofdm(sc, 0x89, 0x50);
3448 		}
3449 	}
3450 	usb_pause_mtx(&sc->sc_mtx, 1);
3451 fail:
3452 	return (error);
3453 }
3454 
3455 static usb_error_t
3456 urtw_read8e(struct urtw_softc *sc, int val, uint8_t *data)
3457 {
3458 	struct usb_device_request req;
3459 	usb_error_t error;
3460 
3461 	req.bmRequestType = UT_READ_VENDOR_DEVICE;
3462 	req.bRequest = URTW_8187_GETREGS_REQ;
3463 	USETW(req.wValue, val | 0xfe00);
3464 	USETW(req.wIndex, 0);
3465 	USETW(req.wLength, sizeof(uint8_t));
3466 
3467 	error = urtw_do_request(sc, &req, data);
3468 	return (error);
3469 }
3470 
3471 static usb_error_t
3472 urtw_write8e(struct urtw_softc *sc, int val, uint8_t data)
3473 {
3474 	struct usb_device_request req;
3475 
3476 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
3477 	req.bRequest = URTW_8187_SETREGS_REQ;
3478 	USETW(req.wValue, val | 0xfe00);
3479 	USETW(req.wIndex, 0);
3480 	USETW(req.wLength, sizeof(uint8_t));
3481 
3482 	return (urtw_do_request(sc, &req, &data));
3483 }
3484 
3485 static usb_error_t
3486 urtw_8180_set_anaparam(struct urtw_softc *sc, uint32_t val)
3487 {
3488 	uint8_t data;
3489 	usb_error_t error;
3490 
3491 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
3492 	if (error)
3493 		goto fail;
3494 
3495 	urtw_read8_m(sc, URTW_CONFIG3, &data);
3496 	urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE);
3497 	urtw_write32_m(sc, URTW_ANAPARAM, val);
3498 	urtw_read8_m(sc, URTW_CONFIG3, &data);
3499 	urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE);
3500 
3501 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
3502 	if (error)
3503 		goto fail;
3504 fail:
3505 	return (error);
3506 }
3507 
3508 static usb_error_t
3509 urtw_8185_set_anaparam2(struct urtw_softc *sc, uint32_t val)
3510 {
3511 	uint8_t data;
3512 	usb_error_t error;
3513 
3514 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
3515 	if (error)
3516 		goto fail;
3517 
3518 	urtw_read8_m(sc, URTW_CONFIG3, &data);
3519 	urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE);
3520 	urtw_write32_m(sc, URTW_ANAPARAM2, val);
3521 	urtw_read8_m(sc, URTW_CONFIG3, &data);
3522 	urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE);
3523 
3524 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
3525 	if (error)
3526 		goto fail;
3527 fail:
3528 	return (error);
3529 }
3530 
3531 static usb_error_t
3532 urtw_intr_enable(struct urtw_softc *sc)
3533 {
3534 	usb_error_t error;
3535 
3536 	urtw_write16_m(sc, URTW_INTR_MASK, 0xffff);
3537 fail:
3538 	return (error);
3539 }
3540 
3541 static usb_error_t
3542 urtw_intr_disable(struct urtw_softc *sc)
3543 {
3544 	usb_error_t error;
3545 
3546 	urtw_write16_m(sc, URTW_INTR_MASK, 0);
3547 fail:
3548 	return (error);
3549 }
3550 
3551 static usb_error_t
3552 urtw_reset(struct urtw_softc *sc)
3553 {
3554 	uint8_t data;
3555 	usb_error_t error;
3556 
3557 	error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON);
3558 	if (error)
3559 		goto fail;
3560 	error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON);
3561 	if (error)
3562 		goto fail;
3563 
3564 	error = urtw_intr_disable(sc);
3565 	if (error)
3566 		goto fail;
3567 	usb_pause_mtx(&sc->sc_mtx, 100);
3568 
3569 	error = urtw_write8e(sc, 0x18, 0x10);
3570 	if (error != 0)
3571 		goto fail;
3572 	error = urtw_write8e(sc, 0x18, 0x11);
3573 	if (error != 0)
3574 		goto fail;
3575 	error = urtw_write8e(sc, 0x18, 0x00);
3576 	if (error != 0)
3577 		goto fail;
3578 	usb_pause_mtx(&sc->sc_mtx, 100);
3579 
3580 	urtw_read8_m(sc, URTW_CMD, &data);
3581 	data = (data & 0x2) | URTW_CMD_RST;
3582 	urtw_write8_m(sc, URTW_CMD, data);
3583 	usb_pause_mtx(&sc->sc_mtx, 100);
3584 
3585 	urtw_read8_m(sc, URTW_CMD, &data);
3586 	if (data & URTW_CMD_RST) {
3587 		device_printf(sc->sc_dev, "reset timeout\n");
3588 		goto fail;
3589 	}
3590 
3591 	error = urtw_set_mode(sc, URTW_EPROM_CMD_LOAD);
3592 	if (error)
3593 		goto fail;
3594 	usb_pause_mtx(&sc->sc_mtx, 100);
3595 
3596 	error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON);
3597 	if (error)
3598 		goto fail;
3599 	error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON);
3600 	if (error)
3601 		goto fail;
3602 fail:
3603 	return (error);
3604 }
3605 
3606 static usb_error_t
3607 urtw_led_ctl(struct urtw_softc *sc, int mode)
3608 {
3609 	usb_error_t error = 0;
3610 
3611 	switch (sc->sc_strategy) {
3612 	case URTW_SW_LED_MODE0:
3613 		error = urtw_led_mode0(sc, mode);
3614 		break;
3615 	case URTW_SW_LED_MODE1:
3616 		error = urtw_led_mode1(sc, mode);
3617 		break;
3618 	case URTW_SW_LED_MODE2:
3619 		error = urtw_led_mode2(sc, mode);
3620 		break;
3621 	case URTW_SW_LED_MODE3:
3622 		error = urtw_led_mode3(sc, mode);
3623 		break;
3624 	default:
3625 		panic("unsupported LED mode %d\n", sc->sc_strategy);
3626 		/* never reach  */
3627 	}
3628 
3629 	return (error);
3630 }
3631 
3632 static usb_error_t
3633 urtw_led_mode0(struct urtw_softc *sc, int mode)
3634 {
3635 
3636 	switch (mode) {
3637 	case URTW_LED_CTL_POWER_ON:
3638 		sc->sc_gpio_ledstate = URTW_LED_POWER_ON_BLINK;
3639 		break;
3640 	case URTW_LED_CTL_TX:
3641 		if (sc->sc_gpio_ledinprogress == 1)
3642 			return (0);
3643 
3644 		sc->sc_gpio_ledstate = URTW_LED_BLINK_NORMAL;
3645 		sc->sc_gpio_blinktime = 2;
3646 		break;
3647 	case URTW_LED_CTL_LINK:
3648 		sc->sc_gpio_ledstate = URTW_LED_ON;
3649 		break;
3650 	default:
3651 		panic("unsupported LED mode 0x%x", mode);
3652 		/* never reach  */
3653 	}
3654 
3655 	switch (sc->sc_gpio_ledstate) {
3656 	case URTW_LED_ON:
3657 		if (sc->sc_gpio_ledinprogress != 0)
3658 			break;
3659 		urtw_led_on(sc, URTW_LED_GPIO);
3660 		break;
3661 	case URTW_LED_BLINK_NORMAL:
3662 		if (sc->sc_gpio_ledinprogress != 0)
3663 			break;
3664 		sc->sc_gpio_ledinprogress = 1;
3665 		sc->sc_gpio_blinkstate = (sc->sc_gpio_ledon != 0) ?
3666 			URTW_LED_OFF : URTW_LED_ON;
3667 		usb_callout_reset(&sc->sc_led_ch, hz, urtw_led_ch, sc);
3668 		break;
3669 	case URTW_LED_POWER_ON_BLINK:
3670 		urtw_led_on(sc, URTW_LED_GPIO);
3671 		usb_pause_mtx(&sc->sc_mtx, 100);
3672 		urtw_led_off(sc, URTW_LED_GPIO);
3673 		break;
3674 	default:
3675 		panic("unknown LED status 0x%x", sc->sc_gpio_ledstate);
3676 		/* never reach  */
3677 	}
3678 	return (0);
3679 }
3680 
3681 static usb_error_t
3682 urtw_led_mode1(struct urtw_softc *sc, int mode)
3683 {
3684 
3685 	return (USB_ERR_INVAL);
3686 }
3687 
3688 static usb_error_t
3689 urtw_led_mode2(struct urtw_softc *sc, int mode)
3690 {
3691 
3692 	return (USB_ERR_INVAL);
3693 }
3694 
3695 static usb_error_t
3696 urtw_led_mode3(struct urtw_softc *sc, int mode)
3697 {
3698 
3699 	return (USB_ERR_INVAL);
3700 }
3701 
3702 static usb_error_t
3703 urtw_led_on(struct urtw_softc *sc, int type)
3704 {
3705 	usb_error_t error;
3706 
3707 	if (type == URTW_LED_GPIO) {
3708 		switch (sc->sc_gpio_ledpin) {
3709 		case URTW_LED_PIN_GPIO0:
3710 			urtw_write8_m(sc, URTW_GPIO, 0x01);
3711 			urtw_write8_m(sc, URTW_GP_ENABLE, 0x00);
3712 			break;
3713 		default:
3714 			panic("unsupported LED PIN type 0x%x",
3715 			    sc->sc_gpio_ledpin);
3716 			/* never reach  */
3717 		}
3718 	} else {
3719 		panic("unsupported LED type 0x%x", type);
3720 		/* never reach  */
3721 	}
3722 
3723 	sc->sc_gpio_ledon = 1;
3724 fail:
3725 	return (error);
3726 }
3727 
3728 static usb_error_t
3729 urtw_led_off(struct urtw_softc *sc, int type)
3730 {
3731 	usb_error_t error;
3732 
3733 	if (type == URTW_LED_GPIO) {
3734 		switch (sc->sc_gpio_ledpin) {
3735 		case URTW_LED_PIN_GPIO0:
3736 			urtw_write8_m(sc, URTW_GPIO, URTW_GPIO_DATA_MAGIC1);
3737 			urtw_write8_m(sc,
3738 			    URTW_GP_ENABLE, URTW_GP_ENABLE_DATA_MAGIC1);
3739 			break;
3740 		default:
3741 			panic("unsupported LED PIN type 0x%x",
3742 			    sc->sc_gpio_ledpin);
3743 			/* never reach  */
3744 		}
3745 	} else {
3746 		panic("unsupported LED type 0x%x", type);
3747 		/* never reach  */
3748 	}
3749 
3750 	sc->sc_gpio_ledon = 0;
3751 
3752 fail:
3753 	return (error);
3754 }
3755 
3756 static void
3757 urtw_led_ch(void *arg)
3758 {
3759 	struct urtw_softc *sc = arg;
3760 	struct ifnet *ifp = sc->sc_ifp;
3761 	struct ieee80211com *ic = ifp->if_l2com;
3762 
3763 	ieee80211_runtask(ic, &sc->sc_led_task);
3764 }
3765 
3766 static void
3767 urtw_ledtask(void *arg, int pending)
3768 {
3769 	struct urtw_softc *sc = arg;
3770 
3771 	if (sc->sc_strategy != URTW_SW_LED_MODE0)
3772 		panic("could not process a LED strategy 0x%x", sc->sc_strategy);
3773 
3774 	URTW_LOCK(sc);
3775 	urtw_led_blink(sc);
3776 	URTW_UNLOCK(sc);
3777 }
3778 
3779 static usb_error_t
3780 urtw_led_blink(struct urtw_softc *sc)
3781 {
3782 	uint8_t ing = 0;
3783 	usb_error_t error;
3784 
3785 	if (sc->sc_gpio_blinkstate == URTW_LED_ON)
3786 		error = urtw_led_on(sc, URTW_LED_GPIO);
3787 	else
3788 		error = urtw_led_off(sc, URTW_LED_GPIO);
3789 	sc->sc_gpio_blinktime--;
3790 	if (sc->sc_gpio_blinktime == 0)
3791 		ing = 1;
3792 	else {
3793 		if (sc->sc_gpio_ledstate != URTW_LED_BLINK_NORMAL &&
3794 		    sc->sc_gpio_ledstate != URTW_LED_BLINK_SLOWLY &&
3795 		    sc->sc_gpio_ledstate != URTW_LED_BLINK_CM3)
3796 			ing = 1;
3797 	}
3798 	if (ing == 1) {
3799 		if (sc->sc_gpio_ledstate == URTW_LED_ON &&
3800 		    sc->sc_gpio_ledon == 0)
3801 			error = urtw_led_on(sc, URTW_LED_GPIO);
3802 		else if (sc->sc_gpio_ledstate == URTW_LED_OFF &&
3803 		    sc->sc_gpio_ledon == 1)
3804 			error = urtw_led_off(sc, URTW_LED_GPIO);
3805 
3806 		sc->sc_gpio_blinktime = 0;
3807 		sc->sc_gpio_ledinprogress = 0;
3808 		return (0);
3809 	}
3810 
3811 	sc->sc_gpio_blinkstate = (sc->sc_gpio_blinkstate != URTW_LED_ON) ?
3812 	    URTW_LED_ON : URTW_LED_OFF;
3813 
3814 	switch (sc->sc_gpio_ledstate) {
3815 	case URTW_LED_BLINK_NORMAL:
3816 		usb_callout_reset(&sc->sc_led_ch, hz, urtw_led_ch, sc);
3817 		break;
3818 	default:
3819 		panic("unknown LED status 0x%x", sc->sc_gpio_ledstate);
3820 		/* never reach  */
3821 	}
3822 	return (0);
3823 }
3824 
3825 static usb_error_t
3826 urtw_rx_enable(struct urtw_softc *sc)
3827 {
3828 	uint8_t data;
3829 	usb_error_t error;
3830 
3831 	usbd_transfer_start((sc->sc_flags & URTW_RTL8187B) ?
3832 	    sc->sc_xfer[URTW_8187B_BULK_RX] : sc->sc_xfer[URTW_8187L_BULK_RX]);
3833 
3834 	error = urtw_rx_setconf(sc);
3835 	if (error != 0)
3836 		goto fail;
3837 
3838 	if ((sc->sc_flags & URTW_RTL8187B) == 0) {
3839 		urtw_read8_m(sc, URTW_CMD, &data);
3840 		urtw_write8_m(sc, URTW_CMD, data | URTW_CMD_RX_ENABLE);
3841 	}
3842 fail:
3843 	return (error);
3844 }
3845 
3846 static usb_error_t
3847 urtw_tx_enable(struct urtw_softc *sc)
3848 {
3849 	uint8_t data8;
3850 	uint32_t data;
3851 	usb_error_t error;
3852 
3853 	if (sc->sc_flags & URTW_RTL8187B) {
3854 		urtw_read32_m(sc, URTW_TX_CONF, &data);
3855 		data &= ~URTW_TX_LOOPBACK_MASK;
3856 		data &= ~(URTW_TX_DPRETRY_MASK | URTW_TX_RTSRETRY_MASK);
3857 		data &= ~(URTW_TX_NOCRC | URTW_TX_MXDMA_MASK);
3858 		data &= ~URTW_TX_SWPLCPLEN;
3859 		data |= URTW_TX_HW_SEQNUM | URTW_TX_DISREQQSIZE |
3860 		    (7 << 8) |	/* short retry limit */
3861 		    (7 << 0) |	/* long retry limit */
3862 		    (7 << 21);	/* MAX TX DMA */
3863 		urtw_write32_m(sc, URTW_TX_CONF, data);
3864 
3865 		urtw_read8_m(sc, URTW_MSR, &data8);
3866 		data8 |= URTW_MSR_LINK_ENEDCA;
3867 		urtw_write8_m(sc, URTW_MSR, data8);
3868 		return (error);
3869 	}
3870 
3871 	urtw_read8_m(sc, URTW_CW_CONF, &data8);
3872 	data8 &= ~(URTW_CW_CONF_PERPACKET_CW | URTW_CW_CONF_PERPACKET_RETRY);
3873 	urtw_write8_m(sc, URTW_CW_CONF, data8);
3874 
3875 	urtw_read8_m(sc, URTW_TX_AGC_CTL, &data8);
3876 	data8 &= ~URTW_TX_AGC_CTL_PERPACKET_GAIN;
3877 	data8 &= ~URTW_TX_AGC_CTL_PERPACKET_ANTSEL;
3878 	data8 &= ~URTW_TX_AGC_CTL_FEEDBACK_ANT;
3879 	urtw_write8_m(sc, URTW_TX_AGC_CTL, data8);
3880 
3881 	urtw_read32_m(sc, URTW_TX_CONF, &data);
3882 	data &= ~URTW_TX_LOOPBACK_MASK;
3883 	data |= URTW_TX_LOOPBACK_NONE;
3884 	data &= ~(URTW_TX_DPRETRY_MASK | URTW_TX_RTSRETRY_MASK);
3885 	data |= sc->sc_tx_retry << URTW_TX_DPRETRY_SHIFT;
3886 	data |= sc->sc_rts_retry << URTW_TX_RTSRETRY_SHIFT;
3887 	data &= ~(URTW_TX_NOCRC | URTW_TX_MXDMA_MASK);
3888 	data |= URTW_TX_MXDMA_2048 | URTW_TX_CWMIN | URTW_TX_DISCW;
3889 	data &= ~URTW_TX_SWPLCPLEN;
3890 	data |= URTW_TX_NOICV;
3891 	urtw_write32_m(sc, URTW_TX_CONF, data);
3892 
3893 	urtw_read8_m(sc, URTW_CMD, &data8);
3894 	urtw_write8_m(sc, URTW_CMD, data8 | URTW_CMD_TX_ENABLE);
3895 fail:
3896 	return (error);
3897 }
3898 
3899 static usb_error_t
3900 urtw_rx_setconf(struct urtw_softc *sc)
3901 {
3902 	struct ifnet *ifp = sc->sc_ifp;
3903 	struct ieee80211com *ic = ifp->if_l2com;
3904 	uint32_t data;
3905 	usb_error_t error;
3906 
3907 	urtw_read32_m(sc, URTW_RX, &data);
3908 	data = data &~ URTW_RX_FILTER_MASK;
3909 	if (sc->sc_flags & URTW_RTL8187B) {
3910 		data = data | URTW_RX_FILTER_MNG | URTW_RX_FILTER_DATA |
3911 		    URTW_RX_FILTER_MCAST | URTW_RX_FILTER_BCAST |
3912 		    URTW_RX_FILTER_NICMAC | URTW_RX_CHECK_BSSID |
3913 		    URTW_RX_FIFO_THRESHOLD_NONE |
3914 		    URTW_MAX_RX_DMA_2048 |
3915 		    URTW_RX_AUTORESETPHY | URTW_RCR_ONLYERLPKT;
3916 	} else {
3917 		data = data | URTW_RX_FILTER_MNG | URTW_RX_FILTER_DATA;
3918 		data = data | URTW_RX_FILTER_BCAST | URTW_RX_FILTER_MCAST;
3919 
3920 		if (ic->ic_opmode == IEEE80211_M_MONITOR) {
3921 			data = data | URTW_RX_FILTER_ICVERR;
3922 			data = data | URTW_RX_FILTER_PWR;
3923 		}
3924 		if (sc->sc_crcmon == 1 && ic->ic_opmode == IEEE80211_M_MONITOR)
3925 			data = data | URTW_RX_FILTER_CRCERR;
3926 
3927 		if (ic->ic_opmode == IEEE80211_M_MONITOR ||
3928 		    (ifp->if_flags & (IFF_ALLMULTI | IFF_PROMISC))) {
3929 			data = data | URTW_RX_FILTER_ALLMAC;
3930 		} else {
3931 			data = data | URTW_RX_FILTER_NICMAC;
3932 			data = data | URTW_RX_CHECK_BSSID;
3933 		}
3934 
3935 		data = data &~ URTW_RX_FIFO_THRESHOLD_MASK;
3936 		data = data | URTW_RX_FIFO_THRESHOLD_NONE |
3937 		    URTW_RX_AUTORESETPHY;
3938 		data = data &~ URTW_MAX_RX_DMA_MASK;
3939 		data = data | URTW_MAX_RX_DMA_2048 | URTW_RCR_ONLYERLPKT;
3940 	}
3941 
3942 	urtw_write32_m(sc, URTW_RX, data);
3943 fail:
3944 	return (error);
3945 }
3946 
3947 static struct mbuf *
3948 urtw_rxeof(struct usb_xfer *xfer, struct urtw_data *data, int *rssi_p,
3949     int8_t *nf_p)
3950 {
3951 	int actlen, flen, rssi;
3952 	struct ieee80211_frame *wh;
3953 	struct mbuf *m, *mnew;
3954 	struct urtw_softc *sc = data->sc;
3955 	struct ifnet *ifp = sc->sc_ifp;
3956 	struct ieee80211com *ic = ifp->if_l2com;
3957 	uint8_t noise = 0, rate;
3958 
3959 	usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
3960 
3961 	if (actlen < (int)URTW_MIN_RXBUFSZ) {
3962 		ifp->if_ierrors++;
3963 		return (NULL);
3964 	}
3965 
3966 	if (sc->sc_flags & URTW_RTL8187B) {
3967 		struct urtw_8187b_rxhdr *rx;
3968 
3969 		rx = (struct urtw_8187b_rxhdr *)(data->buf +
3970 		    (actlen - (sizeof(struct urtw_8187b_rxhdr))));
3971 		flen = le32toh(rx->flag) & 0xfff;
3972 		if (flen > actlen) {
3973 			ifp->if_ierrors++;
3974 			return (NULL);
3975 		}
3976 		rate = (le32toh(rx->flag) >> URTW_RX_FLAG_RXRATE_SHIFT) & 0xf;
3977 		/* XXX correct? */
3978 		rssi = rx->rssi & URTW_RX_RSSI_MASK;
3979 		noise = rx->noise;
3980 	} else {
3981 		struct urtw_8187l_rxhdr *rx;
3982 
3983 		rx = (struct urtw_8187l_rxhdr *)(data->buf +
3984 		    (actlen - (sizeof(struct urtw_8187l_rxhdr))));
3985 		flen = le32toh(rx->flag) & 0xfff;
3986 		if (flen > actlen) {
3987 			ifp->if_ierrors++;
3988 			return (NULL);
3989 		}
3990 
3991 		rate = (le32toh(rx->flag) >> URTW_RX_FLAG_RXRATE_SHIFT) & 0xf;
3992 		/* XXX correct? */
3993 		rssi = rx->rssi & URTW_RX_8187L_RSSI_MASK;
3994 		noise = rx->noise;
3995 	}
3996 
3997 	mnew = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
3998 	if (mnew == NULL) {
3999 		ifp->if_ierrors++;
4000 		return (NULL);
4001 	}
4002 
4003 	m = data->m;
4004 	data->m = mnew;
4005 	data->buf = mtod(mnew, uint8_t *);
4006 
4007 	/* finalize mbuf */
4008 	m->m_pkthdr.rcvif = ifp;
4009 	m->m_pkthdr.len = m->m_len = flen - IEEE80211_CRC_LEN;
4010 
4011 	if (ieee80211_radiotap_active(ic)) {
4012 		struct urtw_rx_radiotap_header *tap = &sc->sc_rxtap;
4013 
4014 		/* XXX Are variables correct?  */
4015 		tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq);
4016 		tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags);
4017 		tap->wr_dbm_antsignal = (int8_t)rssi;
4018 	}
4019 
4020 	wh = mtod(m, struct ieee80211_frame *);
4021 	if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_DATA)
4022 		sc->sc_currate = (rate > 0) ? rate : sc->sc_currate;
4023 
4024 	*rssi_p = rssi;
4025 	*nf_p = noise;		/* XXX correct? */
4026 
4027 	return (m);
4028 }
4029 
4030 static void
4031 urtw_bulk_rx_callback(struct usb_xfer *xfer, usb_error_t error)
4032 {
4033 	struct urtw_softc *sc = usbd_xfer_softc(xfer);
4034 	struct ifnet *ifp = sc->sc_ifp;
4035 	struct ieee80211com *ic = ifp->if_l2com;
4036 	struct ieee80211_frame *wh;
4037 	struct ieee80211_node *ni;
4038 	struct mbuf *m = NULL;
4039 	struct urtw_data *data;
4040 	int8_t nf = -95;
4041 	int rssi = 1;
4042 
4043 	URTW_ASSERT_LOCKED(sc);
4044 
4045 	switch (USB_GET_STATE(xfer)) {
4046 	case USB_ST_TRANSFERRED:
4047 		data = STAILQ_FIRST(&sc->sc_rx_active);
4048 		if (data == NULL)
4049 			goto setup;
4050 		STAILQ_REMOVE_HEAD(&sc->sc_rx_active, next);
4051 		m = urtw_rxeof(xfer, data, &rssi, &nf);
4052 		STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next);
4053 		/* FALLTHROUGH */
4054 	case USB_ST_SETUP:
4055 setup:
4056 		data = STAILQ_FIRST(&sc->sc_rx_inactive);
4057 		if (data == NULL) {
4058 			KASSERT(m == NULL, ("mbuf isn't NULL"));
4059 			return;
4060 		}
4061 		STAILQ_REMOVE_HEAD(&sc->sc_rx_inactive, next);
4062 		STAILQ_INSERT_TAIL(&sc->sc_rx_active, data, next);
4063 		usbd_xfer_set_frame_data(xfer, 0, data->buf,
4064 		    usbd_xfer_max_len(xfer));
4065 		usbd_transfer_submit(xfer);
4066 
4067 		/*
4068 		 * To avoid LOR we should unlock our private mutex here to call
4069 		 * ieee80211_input() because here is at the end of a USB
4070 		 * callback and safe to unlock.
4071 		 */
4072 		URTW_UNLOCK(sc);
4073 		if (m != NULL) {
4074 			wh = mtod(m, struct ieee80211_frame *);
4075 			ni = ieee80211_find_rxnode(ic,
4076 			    (struct ieee80211_frame_min *)wh);
4077 			if (ni != NULL) {
4078 				(void) ieee80211_input(ni, m, rssi, nf);
4079 				/* node is no longer needed */
4080 				ieee80211_free_node(ni);
4081 			} else
4082 				(void) ieee80211_input_all(ic, m, rssi, nf);
4083 			m = NULL;
4084 		}
4085 		URTW_LOCK(sc);
4086 		break;
4087 	default:
4088 		/* needs it to the inactive queue due to a error.  */
4089 		data = STAILQ_FIRST(&sc->sc_rx_active);
4090 		if (data != NULL) {
4091 			STAILQ_REMOVE_HEAD(&sc->sc_rx_active, next);
4092 			STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next);
4093 		}
4094 		if (error != USB_ERR_CANCELLED) {
4095 			usbd_xfer_set_stall(xfer);
4096 			ifp->if_ierrors++;
4097 			goto setup;
4098 		}
4099 		break;
4100 	}
4101 }
4102 
4103 #define	URTW_STATUS_TYPE_TXCLOSE	1
4104 #define	URTW_STATUS_TYPE_BEACON_INTR	0
4105 
4106 static void
4107 urtw_txstatus_eof(struct usb_xfer *xfer)
4108 {
4109 	struct urtw_softc *sc = usbd_xfer_softc(xfer);
4110 	struct ifnet *ifp = sc->sc_ifp;
4111 	int actlen, type, pktretry, seq;
4112 	uint64_t val;
4113 
4114 	usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
4115 
4116 	if (actlen != sizeof(uint64_t))
4117 		return;
4118 
4119 	val = le64toh(sc->sc_txstatus);
4120 	type = (val >> 30) & 0x3;
4121 	if (type == URTW_STATUS_TYPE_TXCLOSE) {
4122 		pktretry = val & 0xff;
4123 		seq = (val >> 16) & 0xff;
4124 		if (pktretry == URTW_TX_MAXRETRY)
4125 			ifp->if_oerrors++;
4126 		DPRINTF(sc, URTW_DEBUG_TXSTATUS, "pktretry %d seq %#x\n",
4127 		    pktretry, seq);
4128 	}
4129 }
4130 
4131 static void
4132 urtw_bulk_tx_status_callback(struct usb_xfer *xfer, usb_error_t error)
4133 {
4134 	struct urtw_softc *sc = usbd_xfer_softc(xfer);
4135 	struct ifnet *ifp = sc->sc_ifp;
4136 
4137 	URTW_ASSERT_LOCKED(sc);
4138 
4139 	switch (USB_GET_STATE(xfer)) {
4140 	case USB_ST_TRANSFERRED:
4141 		urtw_txstatus_eof(xfer);
4142 		/* FALLTHROUGH */
4143 	case USB_ST_SETUP:
4144 setup:
4145 		usbd_xfer_set_frame_data(xfer, 0, &sc->sc_txstatus,
4146 		    sizeof(int64_t));
4147 		usbd_transfer_submit(xfer);
4148 		break;
4149 	default:
4150 		if (error != USB_ERR_CANCELLED) {
4151 			usbd_xfer_set_stall(xfer);
4152 			ifp->if_ierrors++;
4153 			goto setup;
4154 		}
4155 		break;
4156 	}
4157 }
4158 
4159 static void
4160 urtw_txeof(struct usb_xfer *xfer, struct urtw_data *data)
4161 {
4162 	struct urtw_softc *sc = usbd_xfer_softc(xfer);
4163 	struct ifnet *ifp = sc->sc_ifp;
4164 	struct mbuf *m;
4165 
4166 	URTW_ASSERT_LOCKED(sc);
4167 
4168 	/*
4169 	 * Do any tx complete callback.  Note this must be done before releasing
4170 	 * the node reference.
4171 	 */
4172 	if (data->m) {
4173 		m = data->m;
4174 		if (m->m_flags & M_TXCB) {
4175 			/* XXX status? */
4176 			ieee80211_process_callback(data->ni, m, 0);
4177 		}
4178 		m_freem(m);
4179 		data->m = NULL;
4180 	}
4181 	if (data->ni) {
4182 		ieee80211_free_node(data->ni);
4183 		data->ni = NULL;
4184 	}
4185 	sc->sc_txtimer = 0;
4186 	ifp->if_opackets++;
4187 	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
4188 }
4189 
4190 static void
4191 urtw_bulk_tx_callback(struct usb_xfer *xfer, usb_error_t error)
4192 {
4193 	struct urtw_softc *sc = usbd_xfer_softc(xfer);
4194 	struct ifnet *ifp = sc->sc_ifp;
4195 	struct urtw_data *data;
4196 
4197 	URTW_ASSERT_LOCKED(sc);
4198 
4199 	switch (USB_GET_STATE(xfer)) {
4200 	case USB_ST_TRANSFERRED:
4201 		data = STAILQ_FIRST(&sc->sc_tx_active);
4202 		if (data == NULL)
4203 			goto setup;
4204 		STAILQ_REMOVE_HEAD(&sc->sc_tx_active, next);
4205 		urtw_txeof(xfer, data);
4206 		STAILQ_INSERT_TAIL(&sc->sc_tx_inactive, data, next);
4207 		/* FALLTHROUGH */
4208 	case USB_ST_SETUP:
4209 setup:
4210 		data = STAILQ_FIRST(&sc->sc_tx_pending);
4211 		if (data == NULL) {
4212 			DPRINTF(sc, URTW_DEBUG_XMIT,
4213 			    "%s: empty pending queue\n", __func__);
4214 			return;
4215 		}
4216 		STAILQ_REMOVE_HEAD(&sc->sc_tx_pending, next);
4217 		STAILQ_INSERT_TAIL(&sc->sc_tx_active, data, next);
4218 
4219 		usbd_xfer_set_frame_data(xfer, 0, data->buf, data->buflen);
4220 		usbd_transfer_submit(xfer);
4221 
4222 		URTW_UNLOCK(sc);
4223 		urtw_start(ifp);
4224 		URTW_LOCK(sc);
4225 		break;
4226 	default:
4227 		data = STAILQ_FIRST(&sc->sc_tx_active);
4228 		if (data == NULL)
4229 			goto setup;
4230 		if (data->ni != NULL) {
4231 			ieee80211_free_node(data->ni);
4232 			data->ni = NULL;
4233 			ifp->if_oerrors++;
4234 		}
4235 		if (error != USB_ERR_CANCELLED) {
4236 			usbd_xfer_set_stall(xfer);
4237 			goto setup;
4238 		}
4239 		break;
4240 	}
4241 }
4242 
4243 static struct urtw_data *
4244 _urtw_getbuf(struct urtw_softc *sc)
4245 {
4246 	struct urtw_data *bf;
4247 
4248 	bf = STAILQ_FIRST(&sc->sc_tx_inactive);
4249 	if (bf != NULL)
4250 		STAILQ_REMOVE_HEAD(&sc->sc_tx_inactive, next);
4251 	else
4252 		bf = NULL;
4253 	if (bf == NULL)
4254 		DPRINTF(sc, URTW_DEBUG_XMIT, "%s: %s\n", __func__,
4255 		    "out of xmit buffers");
4256 	return (bf);
4257 }
4258 
4259 static struct urtw_data *
4260 urtw_getbuf(struct urtw_softc *sc)
4261 {
4262 	struct urtw_data *bf;
4263 
4264 	URTW_ASSERT_LOCKED(sc);
4265 
4266 	bf = _urtw_getbuf(sc);
4267 	if (bf == NULL) {
4268 		struct ifnet *ifp = sc->sc_ifp;
4269 
4270 		DPRINTF(sc, URTW_DEBUG_XMIT, "%s: stop queue\n", __func__);
4271 		ifp->if_drv_flags |= IFF_DRV_OACTIVE;
4272 	}
4273 	return (bf);
4274 }
4275 
4276 static int
4277 urtw_isbmode(uint16_t rate)
4278 {
4279 
4280 	return ((rate <= 22 && rate != 12 && rate != 18) ||
4281 	    rate == 44) ? (1) : (0);
4282 }
4283 
4284 static uint16_t
4285 urtw_rate2dbps(uint16_t rate)
4286 {
4287 
4288 	switch(rate) {
4289 	case 12:
4290 	case 18:
4291 	case 24:
4292 	case 36:
4293 	case 48:
4294 	case 72:
4295 	case 96:
4296 	case 108:
4297 		return (rate * 2);
4298 	default:
4299 		break;
4300 	}
4301 	return (24);
4302 }
4303 
4304 static int
4305 urtw_compute_txtime(uint16_t framelen, uint16_t rate,
4306     uint8_t ismgt, uint8_t isshort)
4307 {
4308 	uint16_t     ceiling, frametime, n_dbps;
4309 
4310 	if (urtw_isbmode(rate)) {
4311 		if (ismgt || !isshort || rate == 2)
4312 			frametime = (uint16_t)(144 + 48 +
4313 			    (framelen * 8 / (rate / 2)));
4314 		else
4315 			frametime = (uint16_t)(72 + 24 +
4316 			    (framelen * 8 / (rate / 2)));
4317 		if ((framelen * 8 % (rate / 2)) != 0)
4318 			frametime++;
4319 	} else {
4320 		n_dbps = urtw_rate2dbps(rate);
4321 		ceiling = (16 + 8 * framelen + 6) / n_dbps
4322 		    + (((16 + 8 * framelen + 6) % n_dbps) ? 1 : 0);
4323 		frametime = (uint16_t)(16 + 4 + 4 * ceiling + 6);
4324 	}
4325 	return (frametime);
4326 }
4327 
4328 /*
4329  * Callback from the 802.11 layer to update the
4330  * slot time based on the current setting.
4331  */
4332 static void
4333 urtw_updateslot(struct ifnet *ifp)
4334 {
4335 	struct urtw_softc *sc = ifp->if_softc;
4336 	struct ieee80211com *ic = ifp->if_l2com;
4337 
4338 	ieee80211_runtask(ic, &sc->sc_updateslot_task);
4339 }
4340 
4341 static void
4342 urtw_updateslottask(void *arg, int pending)
4343 {
4344 	struct urtw_softc *sc = arg;
4345 	struct ifnet *ifp = sc->sc_ifp;
4346 	struct ieee80211com *ic = ifp->if_l2com;
4347 	int error;
4348 
4349 	if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
4350 		return;
4351 
4352 	URTW_LOCK(sc);
4353 	if (sc->sc_flags & URTW_RTL8187B) {
4354 		urtw_write8_m(sc, URTW_SIFS, 0x22);
4355 		if (IEEE80211_IS_CHAN_ANYG(ic->ic_curchan))
4356 			urtw_write8_m(sc, URTW_SLOT, 0x9);
4357 		else
4358 			urtw_write8_m(sc, URTW_SLOT, 0x14);
4359 		urtw_write8_m(sc, URTW_8187B_EIFS, 0x5b);
4360 		urtw_write8_m(sc, URTW_CARRIER_SCOUNT, 0x5b);
4361 	} else {
4362 		urtw_write8_m(sc, URTW_SIFS, 0x22);
4363 		if (sc->sc_state == IEEE80211_S_ASSOC &&
4364 		    ic->ic_flags & IEEE80211_F_SHSLOT)
4365 			urtw_write8_m(sc, URTW_SLOT, 0x9);
4366 		else
4367 			urtw_write8_m(sc, URTW_SLOT, 0x14);
4368 		if (IEEE80211_IS_CHAN_ANYG(ic->ic_curchan)) {
4369 			urtw_write8_m(sc, URTW_DIFS, 0x14);
4370 			urtw_write8_m(sc, URTW_EIFS, 0x5b - 0x14);
4371 			urtw_write8_m(sc, URTW_CW_VAL, 0x73);
4372 		} else {
4373 			urtw_write8_m(sc, URTW_DIFS, 0x24);
4374 			urtw_write8_m(sc, URTW_EIFS, 0x5b - 0x24);
4375 			urtw_write8_m(sc, URTW_CW_VAL, 0xa5);
4376 		}
4377 	}
4378 fail:
4379 	URTW_UNLOCK(sc);
4380 }
4381 
4382 static void
4383 urtw_sysctl_node(struct urtw_softc *sc)
4384 {
4385 #define	URTW_SYSCTL_STAT_ADD32(c, h, n, p, d)	\
4386 	SYSCTL_ADD_UINT(c, h, OID_AUTO, n, CTLFLAG_RD, p, 0, d)
4387 	struct sysctl_ctx_list *ctx;
4388 	struct sysctl_oid_list *child, *parent;
4389 	struct sysctl_oid *tree;
4390 	struct urtw_stats *stats = &sc->sc_stats;
4391 
4392 	ctx = device_get_sysctl_ctx(sc->sc_dev);
4393 	child = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->sc_dev));
4394 
4395 	tree = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats", CTLFLAG_RD,
4396 	    NULL, "URTW statistics");
4397 	parent = SYSCTL_CHILDREN(tree);
4398 
4399 	/* Tx statistics. */
4400 	tree = SYSCTL_ADD_NODE(ctx, parent, OID_AUTO, "tx", CTLFLAG_RD,
4401 	    NULL, "Tx MAC statistics");
4402 	child = SYSCTL_CHILDREN(tree);
4403 	URTW_SYSCTL_STAT_ADD32(ctx, child, "1m", &stats->txrates[0],
4404 	    "1 Mbit/s");
4405 	URTW_SYSCTL_STAT_ADD32(ctx, child, "2m", &stats->txrates[1],
4406 	    "2 Mbit/s");
4407 	URTW_SYSCTL_STAT_ADD32(ctx, child, "5.5m", &stats->txrates[2],
4408 	    "5.5 Mbit/s");
4409 	URTW_SYSCTL_STAT_ADD32(ctx, child, "6m", &stats->txrates[4],
4410 	    "6 Mbit/s");
4411 	URTW_SYSCTL_STAT_ADD32(ctx, child, "9m", &stats->txrates[5],
4412 	    "9 Mbit/s");
4413 	URTW_SYSCTL_STAT_ADD32(ctx, child, "11m", &stats->txrates[3],
4414 	    "11 Mbit/s");
4415 	URTW_SYSCTL_STAT_ADD32(ctx, child, "12m", &stats->txrates[6],
4416 	    "12 Mbit/s");
4417 	URTW_SYSCTL_STAT_ADD32(ctx, child, "18m", &stats->txrates[7],
4418 	    "18 Mbit/s");
4419 	URTW_SYSCTL_STAT_ADD32(ctx, child, "24m", &stats->txrates[8],
4420 	    "24 Mbit/s");
4421 	URTW_SYSCTL_STAT_ADD32(ctx, child, "36m", &stats->txrates[9],
4422 	    "36 Mbit/s");
4423 	URTW_SYSCTL_STAT_ADD32(ctx, child, "48m", &stats->txrates[10],
4424 	    "48 Mbit/s");
4425 	URTW_SYSCTL_STAT_ADD32(ctx, child, "54m", &stats->txrates[11],
4426 	    "54 Mbit/s");
4427 #undef URTW_SYSCTL_STAT_ADD32
4428 }
4429 
4430 static device_method_t urtw_methods[] = {
4431 	DEVMETHOD(device_probe, urtw_match),
4432 	DEVMETHOD(device_attach, urtw_attach),
4433 	DEVMETHOD(device_detach, urtw_detach),
4434 	{ 0, 0 }
4435 };
4436 static driver_t urtw_driver = {
4437 	.name = "urtw",
4438 	.methods = urtw_methods,
4439 	.size = sizeof(struct urtw_softc)
4440 };
4441 static devclass_t urtw_devclass;
4442 
4443 DRIVER_MODULE(urtw, uhub, urtw_driver, urtw_devclass, NULL, 0);
4444 MODULE_DEPEND(urtw, wlan, 1, 1, 1);
4445 MODULE_DEPEND(urtw, usb, 1, 1, 1);
4446 MODULE_VERSION(urtw, 1);
4447