xref: /freebsd/sys/dev/usb/wlan/if_urtw.c (revision aa64588d28258aef88cc33b8043112e8856948d0)
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 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_device_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(0x1b75, 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 name[IFNAMSIZ], int unit, int opmode,
653 			    int flags, const uint8_t bssid[IEEE80211_ADDR_LEN],
654 			    const uint8_t mac[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(int);
680 static uint16_t		urtw_rtl2rate(int);
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,
997 	const char name[IFNAMSIZ], int unit, int 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 (error != 0)
1057 			goto fail;
1058 		ret = urtw_alloc_tx_data_list(sc);
1059 		if (error != 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)	(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 	bzero(data->buf, 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 ieee80211_node *ni = vap->iv_bss;
1834 	struct ieee80211com *ic = vap->iv_ic;
1835 	struct urtw_softc *sc = ic->ic_ifp->if_softc;
1836 	struct urtw_vap *uvp = URTW_VAP(vap);
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 		/* setting bssid.  */
1858 		urtw_write32_m(sc, URTW_BSSID, ((uint32_t *)ni->ni_bssid)[0]);
1859 		urtw_write16_m(sc, URTW_BSSID + 4,
1860 		    ((uint16_t *)ni->ni_bssid)[2]);
1861 		urtw_update_msr(sc);
1862 		/* XXX maybe the below would be incorrect.  */
1863 		urtw_write16_m(sc, URTW_ATIM_WND, 2);
1864 		urtw_write16_m(sc, URTW_ATIM_TR_ITV, 100);
1865 		urtw_write16_m(sc, URTW_BEACON_INTERVAL, 0x64);
1866 		urtw_write16_m(sc, URTW_BEACON_INTERVAL_TIME, 100);
1867 		error = urtw_led_ctl(sc, URTW_LED_CTL_LINK);
1868 		if (error != 0)
1869 			device_printf(sc->sc_dev,
1870 			    "could not control LED (%d)\n", error);
1871 		break;
1872 	default:
1873 		break;
1874 	}
1875 fail:
1876 	URTW_UNLOCK(sc);
1877 	IEEE80211_LOCK(ic);
1878 	return (uvp->newstate(vap, nstate, arg));
1879 }
1880 
1881 static void
1882 urtw_watchdog(void *arg)
1883 {
1884 	struct urtw_softc *sc = arg;
1885 	struct ifnet *ifp = sc->sc_ifp;
1886 
1887 	if (sc->sc_txtimer > 0) {
1888 		if (--sc->sc_txtimer == 0) {
1889 			device_printf(sc->sc_dev, "device timeout\n");
1890 			ifp->if_oerrors++;
1891 			return;
1892 		}
1893 		callout_reset(&sc->sc_watchdog_ch, hz, urtw_watchdog, sc);
1894 	}
1895 }
1896 
1897 static void
1898 urtw_set_multi(void *arg)
1899 {
1900 	struct urtw_softc *sc = arg;
1901 	struct ifnet *ifp = sc->sc_ifp;
1902 
1903 	if (!(ifp->if_flags & IFF_UP))
1904 		return;
1905 
1906 	/*
1907 	 * XXX don't know how to set a device.  Lack of docs.  Just try to set
1908 	 * IFF_ALLMULTI flag here.
1909 	 */
1910 	ifp->if_flags |= IFF_ALLMULTI;
1911 }
1912 
1913 static usb_error_t
1914 urtw_set_rate(struct urtw_softc *sc)
1915 {
1916 	int i, basic_rate, min_rr_rate, max_rr_rate;
1917 	uint16_t data;
1918 	usb_error_t error;
1919 
1920 	basic_rate = urtw_rate2rtl(48);
1921 	min_rr_rate = urtw_rate2rtl(12);
1922 	max_rr_rate = urtw_rate2rtl(48);
1923 
1924 	urtw_write8_m(sc, URTW_RESP_RATE,
1925 	    max_rr_rate << URTW_RESP_MAX_RATE_SHIFT |
1926 	    min_rr_rate << URTW_RESP_MIN_RATE_SHIFT);
1927 
1928 	urtw_read16_m(sc, URTW_BRSR, &data);
1929 	data &= ~URTW_BRSR_MBR_8185;
1930 
1931 	for (i = 0; i <= basic_rate; i++)
1932 		data |= (1 << i);
1933 
1934 	urtw_write16_m(sc, URTW_BRSR, data);
1935 fail:
1936 	return (error);
1937 }
1938 
1939 static uint16_t
1940 urtw_rate2rtl(int rate)
1941 {
1942 #define N(a)	(sizeof(a) / sizeof((a)[0]))
1943 	int i;
1944 
1945 	for (i = 0; i < N(urtw_ratetable); i++) {
1946 		if (rate == urtw_ratetable[i].reg)
1947 			return urtw_ratetable[i].val;
1948 	}
1949 
1950 	return (3);
1951 #undef N
1952 }
1953 
1954 static uint16_t
1955 urtw_rtl2rate(int rate)
1956 {
1957 #define N(a)	(sizeof(a) / sizeof((a)[0]))
1958 	int i;
1959 
1960 	for (i = 0; i < N(urtw_ratetable); i++) {
1961 		if (rate == urtw_ratetable[i].val)
1962 			return urtw_ratetable[i].reg;
1963 	}
1964 
1965 	return (0);
1966 #undef N
1967 }
1968 
1969 static usb_error_t
1970 urtw_update_msr(struct urtw_softc *sc)
1971 {
1972 	struct ifnet *ifp = sc->sc_ifp;
1973 	struct ieee80211com *ic = ifp->if_l2com;
1974 	uint8_t data;
1975 	usb_error_t error;
1976 
1977 	urtw_read8_m(sc, URTW_MSR, &data);
1978 	data &= ~URTW_MSR_LINK_MASK;
1979 
1980 	if (sc->sc_state == IEEE80211_S_RUN) {
1981 		switch (ic->ic_opmode) {
1982 		case IEEE80211_M_STA:
1983 		case IEEE80211_M_MONITOR:
1984 			data |= URTW_MSR_LINK_STA;
1985 			if (sc->sc_flags & URTW_RTL8187B)
1986 				data |= URTW_MSR_LINK_ENEDCA;
1987 			break;
1988 		case IEEE80211_M_IBSS:
1989 			data |= URTW_MSR_LINK_ADHOC;
1990 			break;
1991 		case IEEE80211_M_HOSTAP:
1992 			data |= URTW_MSR_LINK_HOSTAP;
1993 			break;
1994 		default:
1995 			panic("unsupported operation mode 0x%x\n",
1996 			    ic->ic_opmode);
1997 			/* never reach  */
1998 		}
1999 	} else
2000 		data |= URTW_MSR_LINK_NONE;
2001 
2002 	urtw_write8_m(sc, URTW_MSR, data);
2003 fail:
2004 	return (error);
2005 }
2006 
2007 static usb_error_t
2008 urtw_read8_c(struct urtw_softc *sc, int val, uint8_t *data)
2009 {
2010 	struct usb_device_request req;
2011 	usb_error_t error;
2012 
2013 	URTW_ASSERT_LOCKED(sc);
2014 
2015 	req.bmRequestType = UT_READ_VENDOR_DEVICE;
2016 	req.bRequest = URTW_8187_GETREGS_REQ;
2017 	USETW(req.wValue, (val & 0xff) | 0xff00);
2018 	USETW(req.wIndex, (val >> 8) & 0x3);
2019 	USETW(req.wLength, sizeof(uint8_t));
2020 
2021 	error = urtw_do_request(sc, &req, data);
2022 	return (error);
2023 }
2024 
2025 static usb_error_t
2026 urtw_read16_c(struct urtw_softc *sc, int val, uint16_t *data)
2027 {
2028 	struct usb_device_request req;
2029 	usb_error_t error;
2030 
2031 	URTW_ASSERT_LOCKED(sc);
2032 
2033 	req.bmRequestType = UT_READ_VENDOR_DEVICE;
2034 	req.bRequest = URTW_8187_GETREGS_REQ;
2035 	USETW(req.wValue, (val & 0xff) | 0xff00);
2036 	USETW(req.wIndex, (val >> 8) & 0x3);
2037 	USETW(req.wLength, sizeof(uint16_t));
2038 
2039 	error = urtw_do_request(sc, &req, data);
2040 	return (error);
2041 }
2042 
2043 static usb_error_t
2044 urtw_read32_c(struct urtw_softc *sc, int val, uint32_t *data)
2045 {
2046 	struct usb_device_request req;
2047 	usb_error_t error;
2048 
2049 	URTW_ASSERT_LOCKED(sc);
2050 
2051 	req.bmRequestType = UT_READ_VENDOR_DEVICE;
2052 	req.bRequest = URTW_8187_GETREGS_REQ;
2053 	USETW(req.wValue, (val & 0xff) | 0xff00);
2054 	USETW(req.wIndex, (val >> 8) & 0x3);
2055 	USETW(req.wLength, sizeof(uint32_t));
2056 
2057 	error = urtw_do_request(sc, &req, data);
2058 	return (error);
2059 }
2060 
2061 static usb_error_t
2062 urtw_write8_c(struct urtw_softc *sc, int val, uint8_t data)
2063 {
2064 	struct usb_device_request req;
2065 
2066 	URTW_ASSERT_LOCKED(sc);
2067 
2068 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
2069 	req.bRequest = URTW_8187_SETREGS_REQ;
2070 	USETW(req.wValue, (val & 0xff) | 0xff00);
2071 	USETW(req.wIndex, (val >> 8) & 0x3);
2072 	USETW(req.wLength, sizeof(uint8_t));
2073 
2074 	return (urtw_do_request(sc, &req, &data));
2075 }
2076 
2077 static usb_error_t
2078 urtw_write16_c(struct urtw_softc *sc, int val, uint16_t data)
2079 {
2080 	struct usb_device_request req;
2081 
2082 	URTW_ASSERT_LOCKED(sc);
2083 
2084 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
2085 	req.bRequest = URTW_8187_SETREGS_REQ;
2086 	USETW(req.wValue, (val & 0xff) | 0xff00);
2087 	USETW(req.wIndex, (val >> 8) & 0x3);
2088 	USETW(req.wLength, sizeof(uint16_t));
2089 
2090 	return (urtw_do_request(sc, &req, &data));
2091 }
2092 
2093 static usb_error_t
2094 urtw_write32_c(struct urtw_softc *sc, int val, uint32_t data)
2095 {
2096 	struct usb_device_request req;
2097 
2098 	URTW_ASSERT_LOCKED(sc);
2099 
2100 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
2101 	req.bRequest = URTW_8187_SETREGS_REQ;
2102 	USETW(req.wValue, (val & 0xff) | 0xff00);
2103 	USETW(req.wIndex, (val >> 8) & 0x3);
2104 	USETW(req.wLength, sizeof(uint32_t));
2105 
2106 	return (urtw_do_request(sc, &req, &data));
2107 }
2108 
2109 static usb_error_t
2110 urtw_get_macaddr(struct urtw_softc *sc)
2111 {
2112 	uint32_t data;
2113 	usb_error_t error;
2114 
2115 	error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR, &data);
2116 	if (error != 0)
2117 		goto fail;
2118 	sc->sc_bssid[0] = data & 0xff;
2119 	sc->sc_bssid[1] = (data & 0xff00) >> 8;
2120 	error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR + 1, &data);
2121 	if (error != 0)
2122 		goto fail;
2123 	sc->sc_bssid[2] = data & 0xff;
2124 	sc->sc_bssid[3] = (data & 0xff00) >> 8;
2125 	error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR + 2, &data);
2126 	if (error != 0)
2127 		goto fail;
2128 	sc->sc_bssid[4] = data & 0xff;
2129 	sc->sc_bssid[5] = (data & 0xff00) >> 8;
2130 fail:
2131 	return (error);
2132 }
2133 
2134 static usb_error_t
2135 urtw_eprom_read32(struct urtw_softc *sc, uint32_t addr, uint32_t *data)
2136 {
2137 #define URTW_READCMD_LEN		3
2138 	int addrlen, i;
2139 	int16_t addrstr[8], data16, readcmd[] = { 1, 1, 0 };
2140 	usb_error_t error;
2141 
2142 	/* NB: make sure the buffer is initialized  */
2143 	*data = 0;
2144 
2145 	/* enable EPROM programming */
2146 	urtw_write8_m(sc, URTW_EPROM_CMD, URTW_EPROM_CMD_PROGRAM_MODE);
2147 	DELAY(URTW_EPROM_DELAY);
2148 
2149 	error = urtw_eprom_cs(sc, URTW_EPROM_ENABLE);
2150 	if (error != 0)
2151 		goto fail;
2152 	error = urtw_eprom_ck(sc);
2153 	if (error != 0)
2154 		goto fail;
2155 	error = urtw_eprom_sendbits(sc, readcmd, URTW_READCMD_LEN);
2156 	if (error != 0)
2157 		goto fail;
2158 	if (sc->sc_epromtype == URTW_EEPROM_93C56) {
2159 		addrlen = 8;
2160 		addrstr[0] = addr & (1 << 7);
2161 		addrstr[1] = addr & (1 << 6);
2162 		addrstr[2] = addr & (1 << 5);
2163 		addrstr[3] = addr & (1 << 4);
2164 		addrstr[4] = addr & (1 << 3);
2165 		addrstr[5] = addr & (1 << 2);
2166 		addrstr[6] = addr & (1 << 1);
2167 		addrstr[7] = addr & (1 << 0);
2168 	} else {
2169 		addrlen=6;
2170 		addrstr[0] = addr & (1 << 5);
2171 		addrstr[1] = addr & (1 << 4);
2172 		addrstr[2] = addr & (1 << 3);
2173 		addrstr[3] = addr & (1 << 2);
2174 		addrstr[4] = addr & (1 << 1);
2175 		addrstr[5] = addr & (1 << 0);
2176 	}
2177 	error = urtw_eprom_sendbits(sc, addrstr, addrlen);
2178 	if (error != 0)
2179 		goto fail;
2180 
2181 	error = urtw_eprom_writebit(sc, 0);
2182 	if (error != 0)
2183 		goto fail;
2184 
2185 	for (i = 0; i < 16; i++) {
2186 		error = urtw_eprom_ck(sc);
2187 		if (error != 0)
2188 			goto fail;
2189 		error = urtw_eprom_readbit(sc, &data16);
2190 		if (error != 0)
2191 			goto fail;
2192 
2193 		(*data) |= (data16 << (15 - i));
2194 	}
2195 
2196 	error = urtw_eprom_cs(sc, URTW_EPROM_DISABLE);
2197 	if (error != 0)
2198 		goto fail;
2199 	error = urtw_eprom_ck(sc);
2200 	if (error != 0)
2201 		goto fail;
2202 
2203 	/* now disable EPROM programming */
2204 	urtw_write8_m(sc, URTW_EPROM_CMD, URTW_EPROM_CMD_NORMAL_MODE);
2205 fail:
2206 	return (error);
2207 #undef URTW_READCMD_LEN
2208 }
2209 
2210 static usb_error_t
2211 urtw_eprom_cs(struct urtw_softc *sc, int able)
2212 {
2213 	uint8_t data;
2214 	usb_error_t error;
2215 
2216 	urtw_read8_m(sc, URTW_EPROM_CMD, &data);
2217 	if (able == URTW_EPROM_ENABLE)
2218 		urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_CS);
2219 	else
2220 		urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_CS);
2221 	DELAY(URTW_EPROM_DELAY);
2222 fail:
2223 	return (error);
2224 }
2225 
2226 static usb_error_t
2227 urtw_eprom_ck(struct urtw_softc *sc)
2228 {
2229 	uint8_t data;
2230 	usb_error_t error;
2231 
2232 	/* masking  */
2233 	urtw_read8_m(sc, URTW_EPROM_CMD, &data);
2234 	urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_CK);
2235 	DELAY(URTW_EPROM_DELAY);
2236 	/* unmasking  */
2237 	urtw_read8_m(sc, URTW_EPROM_CMD, &data);
2238 	urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_CK);
2239 	DELAY(URTW_EPROM_DELAY);
2240 fail:
2241 	return (error);
2242 }
2243 
2244 static usb_error_t
2245 urtw_eprom_readbit(struct urtw_softc *sc, int16_t *data)
2246 {
2247 	uint8_t data8;
2248 	usb_error_t error;
2249 
2250 	urtw_read8_m(sc, URTW_EPROM_CMD, &data8);
2251 	*data = (data8 & URTW_EPROM_READBIT) ? 1 : 0;
2252 	DELAY(URTW_EPROM_DELAY);
2253 
2254 fail:
2255 	return (error);
2256 }
2257 
2258 static usb_error_t
2259 urtw_eprom_writebit(struct urtw_softc *sc, int16_t bit)
2260 {
2261 	uint8_t data;
2262 	usb_error_t error;
2263 
2264 	urtw_read8_m(sc, URTW_EPROM_CMD, &data);
2265 	if (bit != 0)
2266 		urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_WRITEBIT);
2267 	else
2268 		urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_WRITEBIT);
2269 	DELAY(URTW_EPROM_DELAY);
2270 fail:
2271 	return (error);
2272 }
2273 
2274 static usb_error_t
2275 urtw_eprom_sendbits(struct urtw_softc *sc, int16_t *buf, int buflen)
2276 {
2277 	int i = 0;
2278 	usb_error_t error = 0;
2279 
2280 	for (i = 0; i < buflen; i++) {
2281 		error = urtw_eprom_writebit(sc, buf[i]);
2282 		if (error != 0)
2283 			goto fail;
2284 		error = urtw_eprom_ck(sc);
2285 		if (error != 0)
2286 			goto fail;
2287 	}
2288 fail:
2289 	return (error);
2290 }
2291 
2292 
2293 static usb_error_t
2294 urtw_get_txpwr(struct urtw_softc *sc)
2295 {
2296 	int i, j;
2297 	uint32_t data;
2298 	usb_error_t error;
2299 
2300 	error = urtw_eprom_read32(sc, URTW_EPROM_TXPW_BASE, &data);
2301 	if (error != 0)
2302 		goto fail;
2303 	sc->sc_txpwr_cck_base = data & 0xf;
2304 	sc->sc_txpwr_ofdm_base = (data >> 4) & 0xf;
2305 
2306 	for (i = 1, j = 0; i < 6; i += 2, j++) {
2307 		error = urtw_eprom_read32(sc, URTW_EPROM_TXPW0 + j, &data);
2308 		if (error != 0)
2309 			goto fail;
2310 		sc->sc_txpwr_cck[i] = data & 0xf;
2311 		sc->sc_txpwr_cck[i + 1] = (data & 0xf00) >> 8;
2312 		sc->sc_txpwr_ofdm[i] = (data & 0xf0) >> 4;
2313 		sc->sc_txpwr_ofdm[i + 1] = (data & 0xf000) >> 12;
2314 	}
2315 	for (i = 1, j = 0; i < 4; i += 2, j++) {
2316 		error = urtw_eprom_read32(sc, URTW_EPROM_TXPW1 + j, &data);
2317 		if (error != 0)
2318 			goto fail;
2319 		sc->sc_txpwr_cck[i + 6] = data & 0xf;
2320 		sc->sc_txpwr_cck[i + 6 + 1] = (data & 0xf00) >> 8;
2321 		sc->sc_txpwr_ofdm[i + 6] = (data & 0xf0) >> 4;
2322 		sc->sc_txpwr_ofdm[i + 6 + 1] = (data & 0xf000) >> 12;
2323 	}
2324 	if (sc->sc_flags & URTW_RTL8187B) {
2325 		error = urtw_eprom_read32(sc, URTW_EPROM_TXPW2, &data);
2326 		if (error != 0)
2327 			goto fail;
2328 		sc->sc_txpwr_cck[1 + 6 + 4] = data & 0xf;
2329 		sc->sc_txpwr_ofdm[1 + 6 + 4] = (data & 0xf0) >> 4;
2330 		error = urtw_eprom_read32(sc, 0x0a, &data);
2331 		if (error != 0)
2332 			goto fail;
2333 		sc->sc_txpwr_cck[2 + 6 + 4] = data & 0xf;
2334 		sc->sc_txpwr_ofdm[2 + 6 + 4] = (data & 0xf0) >> 4;
2335 		error = urtw_eprom_read32(sc, 0x1c, &data);
2336 		if (error != 0)
2337 			goto fail;
2338 		sc->sc_txpwr_cck[3 + 6 + 4] = data & 0xf;
2339 		sc->sc_txpwr_cck[3 + 6 + 4 + 1] = (data & 0xf00) >> 8;
2340 		sc->sc_txpwr_ofdm[3 + 6 + 4] = (data & 0xf0) >> 4;
2341 		sc->sc_txpwr_ofdm[3 + 6 + 4 + 1] = (data & 0xf000) >> 12;
2342 	} else {
2343 		for (i = 1, j = 0; i < 4; i += 2, j++) {
2344 			error = urtw_eprom_read32(sc, URTW_EPROM_TXPW2 + j,
2345 			    &data);
2346 			if (error != 0)
2347 				goto fail;
2348 			sc->sc_txpwr_cck[i + 6 + 4] = data & 0xf;
2349 			sc->sc_txpwr_cck[i + 6 + 4 + 1] = (data & 0xf00) >> 8;
2350 			sc->sc_txpwr_ofdm[i + 6 + 4] = (data & 0xf0) >> 4;
2351 			sc->sc_txpwr_ofdm[i + 6 + 4 + 1] = (data & 0xf000) >> 12;
2352 		}
2353 	}
2354 fail:
2355 	return (error);
2356 }
2357 
2358 
2359 static usb_error_t
2360 urtw_get_rfchip(struct urtw_softc *sc)
2361 {
2362 	int ret;
2363 	uint8_t data8;
2364 	uint32_t data;
2365 	usb_error_t error;
2366 
2367 	if (sc->sc_flags & URTW_RTL8187B) {
2368 		urtw_read8_m(sc, 0xe1, &data8);
2369 		switch (data8) {
2370 		case 0:
2371 			sc->sc_flags |= URTW_RTL8187B_REV_B;
2372 			break;
2373 		case 1:
2374 			sc->sc_flags |= URTW_RTL8187B_REV_D;
2375 			break;
2376 		case 2:
2377 			sc->sc_flags |= URTW_RTL8187B_REV_E;
2378 			break;
2379 		default:
2380 			device_printf(sc->sc_dev, "unknown type: %#x\n", data8);
2381 			sc->sc_flags |= URTW_RTL8187B_REV_B;
2382 			break;
2383 		}
2384 	} else {
2385 		urtw_read32_m(sc, URTW_TX_CONF, &data);
2386 		switch (data & URTW_TX_HWMASK) {
2387 		case URTW_TX_R8187vD_B:
2388 			sc->sc_flags |= URTW_RTL8187B;
2389 			break;
2390 		case URTW_TX_R8187vD:
2391 			break;
2392 		default:
2393 			device_printf(sc->sc_dev, "unknown RTL8187L type: %#x\n",
2394 			    data & URTW_TX_HWMASK);
2395 			break;
2396 		}
2397 	}
2398 
2399 	error = urtw_eprom_read32(sc, URTW_EPROM_RFCHIPID, &data);
2400 	if (error != 0)
2401 		goto fail;
2402 	switch (data & 0xff) {
2403 	case URTW_EPROM_RFCHIPID_RTL8225U:
2404 		error = urtw_8225_isv2(sc, &ret);
2405 		if (error != 0)
2406 			goto fail;
2407 		if (ret == 0) {
2408 			sc->sc_rf_init = urtw_8225_rf_init;
2409 			sc->sc_rf_set_sens = urtw_8225_rf_set_sens;
2410 			sc->sc_rf_set_chan = urtw_8225_rf_set_chan;
2411 			sc->sc_rf_stop = urtw_8225_rf_stop;
2412 		} else {
2413 			sc->sc_rf_init = urtw_8225v2_rf_init;
2414 			sc->sc_rf_set_chan = urtw_8225v2_rf_set_chan;
2415 			sc->sc_rf_stop = urtw_8225_rf_stop;
2416 		}
2417 		sc->sc_max_sens = URTW_8225_RF_MAX_SENS;
2418 		sc->sc_sens = URTW_8225_RF_DEF_SENS;
2419 		break;
2420 	case URTW_EPROM_RFCHIPID_RTL8225Z2:
2421 		sc->sc_rf_init = urtw_8225v2b_rf_init;
2422 		sc->sc_rf_set_chan = urtw_8225v2b_rf_set_chan;
2423 		sc->sc_max_sens = URTW_8225_RF_MAX_SENS;
2424 		sc->sc_sens = URTW_8225_RF_DEF_SENS;
2425 		sc->sc_rf_stop = urtw_8225_rf_stop;
2426 		break;
2427 	default:
2428 		panic("unsupported RF chip %d\n", data & 0xff);
2429 		/* never reach  */
2430 	}
2431 
2432 	device_printf(sc->sc_dev, "%s rf %s hwrev %s\n",
2433 	    (sc->sc_flags & URTW_RTL8187B) ? "rtl8187b" : "rtl8187l",
2434 	    ((data & 0xff) == URTW_EPROM_RFCHIPID_RTL8225U) ? "rtl8225u" :
2435 	    "rtl8225z2",
2436 	    (sc->sc_flags & URTW_RTL8187B) ? ((data8 == 0) ? "b" :
2437 		(data8 == 1) ? "d" : "e") : "none");
2438 
2439 fail:
2440 	return (error);
2441 }
2442 
2443 
2444 static usb_error_t
2445 urtw_led_init(struct urtw_softc *sc)
2446 {
2447 	uint32_t rev;
2448 	usb_error_t error;
2449 
2450 	urtw_read8_m(sc, URTW_PSR, &sc->sc_psr);
2451 	error = urtw_eprom_read32(sc, URTW_EPROM_SWREV, &rev);
2452 	if (error != 0)
2453 		goto fail;
2454 
2455 	switch (rev & URTW_EPROM_CID_MASK) {
2456 	case URTW_EPROM_CID_ALPHA0:
2457 		sc->sc_strategy = URTW_SW_LED_MODE1;
2458 		break;
2459 	case URTW_EPROM_CID_SERCOMM_PS:
2460 		sc->sc_strategy = URTW_SW_LED_MODE3;
2461 		break;
2462 	case URTW_EPROM_CID_HW_LED:
2463 		sc->sc_strategy = URTW_HW_LED;
2464 		break;
2465 	case URTW_EPROM_CID_RSVD0:
2466 	case URTW_EPROM_CID_RSVD1:
2467 	default:
2468 		sc->sc_strategy = URTW_SW_LED_MODE0;
2469 		break;
2470 	}
2471 
2472 	sc->sc_gpio_ledpin = URTW_LED_PIN_GPIO0;
2473 
2474 fail:
2475 	return (error);
2476 }
2477 
2478 
2479 static usb_error_t
2480 urtw_8225_rf_init(struct urtw_softc *sc)
2481 {
2482 #define N(a)	(sizeof(a) / sizeof((a)[0]))
2483 	int i;
2484 	uint16_t data;
2485 	usb_error_t error;
2486 
2487 	error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON);
2488 	if (error)
2489 		goto fail;
2490 
2491 	error = urtw_8225_usb_init(sc);
2492 	if (error)
2493 		goto fail;
2494 
2495 	urtw_write32_m(sc, URTW_RF_TIMING, 0x000a8008);
2496 	urtw_read16_m(sc, URTW_BRSR, &data);		/* XXX ??? */
2497 	urtw_write16_m(sc, URTW_BRSR, 0xffff);
2498 	urtw_write32_m(sc, URTW_RF_PARA, 0x100044);
2499 
2500 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
2501 	if (error)
2502 		goto fail;
2503 	urtw_write8_m(sc, URTW_CONFIG3, 0x44);
2504 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
2505 	if (error)
2506 		goto fail;
2507 
2508 	error = urtw_8185_rf_pins_enable(sc);
2509 	if (error)
2510 		goto fail;
2511 	usb_pause_mtx(&sc->sc_mtx, 1000);
2512 
2513 	for (i = 0; i < N(urtw_8225_rf_part1); i++) {
2514 		urtw_8225_write(sc, urtw_8225_rf_part1[i].reg,
2515 		    urtw_8225_rf_part1[i].val);
2516 		usb_pause_mtx(&sc->sc_mtx, 1);
2517 	}
2518 	usb_pause_mtx(&sc->sc_mtx, 100);
2519 	urtw_8225_write(sc,
2520 	    URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC1);
2521 	usb_pause_mtx(&sc->sc_mtx, 200);
2522 	urtw_8225_write(sc,
2523 	    URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC2);
2524 	usb_pause_mtx(&sc->sc_mtx, 200);
2525 	urtw_8225_write(sc,
2526 	    URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC3);
2527 
2528 	for (i = 0; i < 95; i++) {
2529 		urtw_8225_write(sc, URTW_8225_ADDR_1_MAGIC, (uint8_t)(i + 1));
2530 		urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, urtw_8225_rxgain[i]);
2531 	}
2532 
2533 	urtw_8225_write(sc,
2534 	    URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC4);
2535 	urtw_8225_write(sc,
2536 	    URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC5);
2537 
2538 	for (i = 0; i < 128; i++) {
2539 		urtw_8187_write_phy_ofdm(sc, 0xb, urtw_8225_agc[i]);
2540 		usb_pause_mtx(&sc->sc_mtx, 1);
2541 		urtw_8187_write_phy_ofdm(sc, 0xa, (uint8_t)i + 0x80);
2542 		usb_pause_mtx(&sc->sc_mtx, 1);
2543 	}
2544 
2545 	for (i = 0; i < N(urtw_8225_rf_part2); i++) {
2546 		urtw_8187_write_phy_ofdm(sc, urtw_8225_rf_part2[i].reg,
2547 		    urtw_8225_rf_part2[i].val);
2548 		usb_pause_mtx(&sc->sc_mtx, 1);
2549 	}
2550 
2551 	error = urtw_8225_setgain(sc, 4);
2552 	if (error)
2553 		goto fail;
2554 
2555 	for (i = 0; i < N(urtw_8225_rf_part3); i++) {
2556 		urtw_8187_write_phy_cck(sc, urtw_8225_rf_part3[i].reg,
2557 		    urtw_8225_rf_part3[i].val);
2558 		usb_pause_mtx(&sc->sc_mtx, 1);
2559 	}
2560 
2561 	urtw_write8_m(sc, URTW_TESTR, 0x0d);
2562 
2563 	error = urtw_8225_set_txpwrlvl(sc, 1);
2564 	if (error)
2565 		goto fail;
2566 
2567 	urtw_8187_write_phy_cck(sc, 0x10, 0x9b);
2568 	usb_pause_mtx(&sc->sc_mtx, 1);
2569 	urtw_8187_write_phy_ofdm(sc, 0x26, 0x90);
2570 	usb_pause_mtx(&sc->sc_mtx, 1);
2571 
2572 	/* TX ant A, 0x0 for B */
2573 	error = urtw_8185_tx_antenna(sc, 0x3);
2574 	if (error)
2575 		goto fail;
2576 	urtw_write32_m(sc, URTW_HSSI_PARA, 0x3dc00002);
2577 
2578 	error = urtw_8225_rf_set_chan(sc, 1);
2579 fail:
2580 	return (error);
2581 #undef N
2582 }
2583 
2584 static usb_error_t
2585 urtw_8185_rf_pins_enable(struct urtw_softc *sc)
2586 {
2587 	usb_error_t error = 0;
2588 
2589 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x1ff7);
2590 fail:
2591 	return (error);
2592 }
2593 
2594 static usb_error_t
2595 urtw_8185_tx_antenna(struct urtw_softc *sc, uint8_t ant)
2596 {
2597 	usb_error_t error;
2598 
2599 	urtw_write8_m(sc, URTW_TX_ANTENNA, ant);
2600 	usb_pause_mtx(&sc->sc_mtx, 1);
2601 fail:
2602 	return (error);
2603 }
2604 
2605 static usb_error_t
2606 urtw_8187_write_phy_ofdm_c(struct urtw_softc *sc, uint8_t addr, uint32_t data)
2607 {
2608 
2609 	data = data & 0xff;
2610 	return urtw_8187_write_phy(sc, addr, data);
2611 }
2612 
2613 static usb_error_t
2614 urtw_8187_write_phy_cck_c(struct urtw_softc *sc, uint8_t addr, uint32_t data)
2615 {
2616 
2617 	data = data & 0xff;
2618 	return urtw_8187_write_phy(sc, addr, data | 0x10000);
2619 }
2620 
2621 static usb_error_t
2622 urtw_8187_write_phy(struct urtw_softc *sc, uint8_t addr, uint32_t data)
2623 {
2624 	uint32_t phyw;
2625 	usb_error_t error;
2626 
2627 	phyw = ((data << 8) | (addr | 0x80));
2628 	urtw_write8_m(sc, URTW_PHY_MAGIC4, ((phyw & 0xff000000) >> 24));
2629 	urtw_write8_m(sc, URTW_PHY_MAGIC3, ((phyw & 0x00ff0000) >> 16));
2630 	urtw_write8_m(sc, URTW_PHY_MAGIC2, ((phyw & 0x0000ff00) >> 8));
2631 	urtw_write8_m(sc, URTW_PHY_MAGIC1, ((phyw & 0x000000ff)));
2632 	usb_pause_mtx(&sc->sc_mtx, 1);
2633 fail:
2634 	return (error);
2635 }
2636 
2637 static usb_error_t
2638 urtw_8225_setgain(struct urtw_softc *sc, int16_t gain)
2639 {
2640 	usb_error_t error;
2641 
2642 	urtw_8187_write_phy_ofdm(sc, 0x0d, urtw_8225_gain[gain * 4]);
2643 	urtw_8187_write_phy_ofdm(sc, 0x1b, urtw_8225_gain[gain * 4 + 2]);
2644 	urtw_8187_write_phy_ofdm(sc, 0x1d, urtw_8225_gain[gain * 4 + 3]);
2645 	urtw_8187_write_phy_ofdm(sc, 0x23, urtw_8225_gain[gain * 4 + 1]);
2646 fail:
2647 	return (error);
2648 }
2649 
2650 static usb_error_t
2651 urtw_8225_usb_init(struct urtw_softc *sc)
2652 {
2653 	uint8_t data;
2654 	usb_error_t error;
2655 
2656 	urtw_write8_m(sc, URTW_RF_PINS_SELECT + 1, 0);
2657 	urtw_write8_m(sc, URTW_GPIO, 0);
2658 	error = urtw_read8e(sc, 0x53, &data);
2659 	if (error)
2660 		goto fail;
2661 	error = urtw_write8e(sc, 0x53, data | (1 << 7));
2662 	if (error)
2663 		goto fail;
2664 	urtw_write8_m(sc, URTW_RF_PINS_SELECT + 1, 4);
2665 	urtw_write8_m(sc, URTW_GPIO, 0x20);
2666 	urtw_write8_m(sc, URTW_GP_ENABLE, 0);
2667 
2668 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x80);
2669 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x80);
2670 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x80);
2671 
2672 	usb_pause_mtx(&sc->sc_mtx, 500);
2673 fail:
2674 	return (error);
2675 }
2676 
2677 static usb_error_t
2678 urtw_8225_write_c(struct urtw_softc *sc, uint8_t addr, uint16_t data)
2679 {
2680 	uint16_t d80, d82, d84;
2681 	usb_error_t error;
2682 
2683 	urtw_read16_m(sc, URTW_RF_PINS_OUTPUT, &d80);
2684 	d80 &= URTW_RF_PINS_MAGIC1;
2685 	urtw_read16_m(sc, URTW_RF_PINS_ENABLE, &d82);
2686 	urtw_read16_m(sc, URTW_RF_PINS_SELECT, &d84);
2687 	d84 &= URTW_RF_PINS_MAGIC2;
2688 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, d82 | URTW_RF_PINS_MAGIC3);
2689 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, d84 | URTW_RF_PINS_MAGIC3);
2690 	DELAY(10);
2691 
2692 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN);
2693 	DELAY(2);
2694 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80);
2695 	DELAY(10);
2696 
2697 	error = urtw_8225_write_s16(sc, addr, 0x8225, &data);
2698 	if (error != 0)
2699 		goto fail;
2700 
2701 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN);
2702 	DELAY(10);
2703 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN);
2704 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, d84);
2705 	usb_pause_mtx(&sc->sc_mtx, 2);
2706 fail:
2707 	return (error);
2708 }
2709 
2710 /* XXX why we should allocalte memory buffer instead of using memory stack?  */
2711 static usb_error_t
2712 urtw_8225_write_s16(struct urtw_softc *sc, uint8_t addr, int index,
2713     uint16_t *data)
2714 {
2715 	uint8_t *buf;
2716 	uint16_t data16;
2717 	struct usb_device_request *req;
2718 	usb_error_t error = 0;
2719 
2720 	data16 = *data;
2721 	req = (usb_device_request_t *)malloc(sizeof(usb_device_request_t),
2722 	    M_80211_VAP, M_NOWAIT | M_ZERO);
2723 	if (req == NULL) {
2724 		device_printf(sc->sc_dev, "could not allocate a memory\n");
2725 		goto fail0;
2726 	}
2727 	buf = (uint8_t *)malloc(2, M_80211_VAP, M_NOWAIT | M_ZERO);
2728 	if (req == NULL) {
2729 		device_printf(sc->sc_dev, "could not allocate a memory\n");
2730 		goto fail1;
2731 	}
2732 
2733 	req->bmRequestType = UT_WRITE_VENDOR_DEVICE;
2734 	req->bRequest = URTW_8187_SETREGS_REQ;
2735 	USETW(req->wValue, addr);
2736 	USETW(req->wIndex, index);
2737 	USETW(req->wLength, sizeof(uint16_t));
2738 	buf[0] = (data16 & 0x00ff);
2739 	buf[1] = (data16 & 0xff00) >> 8;
2740 
2741 	error = urtw_do_request(sc, req, buf);
2742 
2743 	free(buf, M_80211_VAP);
2744 fail1:	free(req, M_80211_VAP);
2745 fail0:	return (error);
2746 }
2747 
2748 static usb_error_t
2749 urtw_8225_rf_set_chan(struct urtw_softc *sc, int chan)
2750 {
2751 	usb_error_t error;
2752 
2753 	error = urtw_8225_set_txpwrlvl(sc, chan);
2754 	if (error)
2755 		goto fail;
2756 	urtw_8225_write(sc, URTW_8225_ADDR_7_MAGIC, urtw_8225_channel[chan]);
2757 	usb_pause_mtx(&sc->sc_mtx, 10);
2758 fail:
2759 	return (error);
2760 }
2761 
2762 static usb_error_t
2763 urtw_8225_rf_set_sens(struct urtw_softc *sc, int sens)
2764 {
2765 	usb_error_t error;
2766 
2767 	if (sens < 0 || sens > 6)
2768 		return -1;
2769 
2770 	if (sens > 4)
2771 		urtw_8225_write(sc,
2772 		    URTW_8225_ADDR_C_MAGIC, URTW_8225_ADDR_C_DATA_MAGIC1);
2773 	else
2774 		urtw_8225_write(sc,
2775 		    URTW_8225_ADDR_C_MAGIC, URTW_8225_ADDR_C_DATA_MAGIC2);
2776 
2777 	sens = 6 - sens;
2778 	error = urtw_8225_setgain(sc, sens);
2779 	if (error)
2780 		goto fail;
2781 
2782 	urtw_8187_write_phy_cck(sc, 0x41, urtw_8225_threshold[sens]);
2783 
2784 fail:
2785 	return (error);
2786 }
2787 
2788 static usb_error_t
2789 urtw_8225_set_txpwrlvl(struct urtw_softc *sc, int chan)
2790 {
2791 	int i, idx, set;
2792 	uint8_t *cck_pwltable;
2793 	uint8_t cck_pwrlvl_max, ofdm_pwrlvl_min, ofdm_pwrlvl_max;
2794 	uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff;
2795 	uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff;
2796 	usb_error_t error;
2797 
2798 	cck_pwrlvl_max = 11;
2799 	ofdm_pwrlvl_max = 25;	/* 12 -> 25  */
2800 	ofdm_pwrlvl_min = 10;
2801 
2802 	/* CCK power setting */
2803 	cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ? cck_pwrlvl_max : cck_pwrlvl;
2804 	idx = cck_pwrlvl % 6;
2805 	set = cck_pwrlvl / 6;
2806 	cck_pwltable = (chan == 14) ? urtw_8225_txpwr_cck_ch14 :
2807 	    urtw_8225_txpwr_cck;
2808 
2809 	urtw_write8_m(sc, URTW_TX_GAIN_CCK,
2810 	    urtw_8225_tx_gain_cck_ofdm[set] >> 1);
2811 	for (i = 0; i < 8; i++) {
2812 		urtw_8187_write_phy_cck(sc, 0x44 + i,
2813 		    cck_pwltable[idx * 8 + i]);
2814 	}
2815 	usb_pause_mtx(&sc->sc_mtx, 1);
2816 
2817 	/* OFDM power setting */
2818 	ofdm_pwrlvl = (ofdm_pwrlvl > (ofdm_pwrlvl_max - ofdm_pwrlvl_min)) ?
2819 	    ofdm_pwrlvl_max : ofdm_pwrlvl + ofdm_pwrlvl_min;
2820 	ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl;
2821 
2822 	idx = ofdm_pwrlvl % 6;
2823 	set = ofdm_pwrlvl / 6;
2824 
2825 	error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON);
2826 	if (error)
2827 		goto fail;
2828 	urtw_8187_write_phy_ofdm(sc, 2, 0x42);
2829 	urtw_8187_write_phy_ofdm(sc, 6, 0);
2830 	urtw_8187_write_phy_ofdm(sc, 8, 0);
2831 
2832 	urtw_write8_m(sc, URTW_TX_GAIN_OFDM,
2833 	    urtw_8225_tx_gain_cck_ofdm[set] >> 1);
2834 	urtw_8187_write_phy_ofdm(sc, 0x5, urtw_8225_txpwr_ofdm[idx]);
2835 	urtw_8187_write_phy_ofdm(sc, 0x7, urtw_8225_txpwr_ofdm[idx]);
2836 	usb_pause_mtx(&sc->sc_mtx, 1);
2837 fail:
2838 	return (error);
2839 }
2840 
2841 
2842 static usb_error_t
2843 urtw_8225_rf_stop(struct urtw_softc *sc)
2844 {
2845 	uint8_t data;
2846 	usb_error_t error;
2847 
2848 	urtw_8225_write(sc, 0x4, 0x1f);
2849 
2850 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
2851 	if (error)
2852 		goto fail;
2853 
2854 	urtw_read8_m(sc, URTW_CONFIG3, &data);
2855 	urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE);
2856 	if (sc->sc_flags & URTW_RTL8187B) {
2857 		urtw_write32_m(sc, URTW_ANAPARAM2,
2858 		    URTW_8187B_8225_ANAPARAM2_OFF);
2859 		urtw_write32_m(sc, URTW_ANAPARAM, URTW_8187B_8225_ANAPARAM_OFF);
2860 		urtw_write32_m(sc, URTW_ANAPARAM3,
2861 		    URTW_8187B_8225_ANAPARAM3_OFF);
2862 	} else {
2863 		urtw_write32_m(sc, URTW_ANAPARAM2, URTW_8225_ANAPARAM2_OFF);
2864 		urtw_write32_m(sc, URTW_ANAPARAM, URTW_8225_ANAPARAM_OFF);
2865 	}
2866 
2867 	urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE);
2868 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
2869 	if (error)
2870 		goto fail;
2871 
2872 fail:
2873 	return (error);
2874 }
2875 
2876 static usb_error_t
2877 urtw_8225v2_rf_init(struct urtw_softc *sc)
2878 {
2879 #define N(a)	(sizeof(a) / sizeof((a)[0]))
2880 	int i;
2881 	uint16_t data;
2882 	uint32_t data32;
2883 	usb_error_t error;
2884 
2885 	error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON);
2886 	if (error)
2887 		goto fail;
2888 
2889 	error = urtw_8225_usb_init(sc);
2890 	if (error)
2891 		goto fail;
2892 
2893 	urtw_write32_m(sc, URTW_RF_TIMING, 0x000a8008);
2894 	urtw_read16_m(sc, URTW_BRSR, &data);		/* XXX ??? */
2895 	urtw_write16_m(sc, URTW_BRSR, 0xffff);
2896 	urtw_write32_m(sc, URTW_RF_PARA, 0x100044);
2897 
2898 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
2899 	if (error)
2900 		goto fail;
2901 	urtw_write8_m(sc, URTW_CONFIG3, 0x44);
2902 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
2903 	if (error)
2904 		goto fail;
2905 
2906 	error = urtw_8185_rf_pins_enable(sc);
2907 	if (error)
2908 		goto fail;
2909 
2910 	usb_pause_mtx(&sc->sc_mtx, 500);
2911 
2912 	for (i = 0; i < N(urtw_8225v2_rf_part1); i++) {
2913 		urtw_8225_write(sc, urtw_8225v2_rf_part1[i].reg,
2914 		    urtw_8225v2_rf_part1[i].val);
2915 	}
2916 	usb_pause_mtx(&sc->sc_mtx, 50);
2917 
2918 	urtw_8225_write(sc,
2919 	    URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC1);
2920 
2921 	for (i = 0; i < 95; i++) {
2922 		urtw_8225_write(sc, URTW_8225_ADDR_1_MAGIC, (uint8_t)(i + 1));
2923 		urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC,
2924 		    urtw_8225v2_rxgain[i]);
2925 	}
2926 
2927 	urtw_8225_write(sc,
2928 	    URTW_8225_ADDR_3_MAGIC, URTW_8225_ADDR_3_DATA_MAGIC1);
2929 	urtw_8225_write(sc,
2930 	    URTW_8225_ADDR_5_MAGIC, URTW_8225_ADDR_5_DATA_MAGIC1);
2931 	urtw_8225_write(sc,
2932 	    URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC2);
2933 	urtw_8225_write(sc,
2934 	    URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC1);
2935 	usb_pause_mtx(&sc->sc_mtx, 100);
2936 	urtw_8225_write(sc,
2937 	    URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC2);
2938 	usb_pause_mtx(&sc->sc_mtx, 100);
2939 
2940 	error = urtw_8225_read(sc, URTW_8225_ADDR_6_MAGIC, &data32);
2941 	if (error != 0)
2942 		goto fail;
2943 	if (data32 != URTW_8225_ADDR_6_DATA_MAGIC1)
2944 		device_printf(sc->sc_dev, "expect 0xe6!! (0x%x)\n", data32);
2945 	if (!(data32 & URTW_8225_ADDR_6_DATA_MAGIC2)) {
2946 		urtw_8225_write(sc,
2947 		    URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC1);
2948 		usb_pause_mtx(&sc->sc_mtx, 100);
2949 		urtw_8225_write(sc,
2950 		    URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC2);
2951 		usb_pause_mtx(&sc->sc_mtx, 50);
2952 		error = urtw_8225_read(sc, URTW_8225_ADDR_6_MAGIC, &data32);
2953 		if (error != 0)
2954 			goto fail;
2955 		if (!(data32 & URTW_8225_ADDR_6_DATA_MAGIC2))
2956 			device_printf(sc->sc_dev, "RF calibration failed\n");
2957 	}
2958 	usb_pause_mtx(&sc->sc_mtx, 100);
2959 
2960 	urtw_8225_write(sc,
2961 	    URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC6);
2962 	for (i = 0; i < 128; i++) {
2963 		urtw_8187_write_phy_ofdm(sc, 0xb, urtw_8225_agc[i]);
2964 		urtw_8187_write_phy_ofdm(sc, 0xa, (uint8_t)i + 0x80);
2965 	}
2966 
2967 	for (i = 0; i < N(urtw_8225v2_rf_part2); i++) {
2968 		urtw_8187_write_phy_ofdm(sc, urtw_8225v2_rf_part2[i].reg,
2969 		    urtw_8225v2_rf_part2[i].val);
2970 	}
2971 
2972 	error = urtw_8225v2_setgain(sc, 4);
2973 	if (error)
2974 		goto fail;
2975 
2976 	for (i = 0; i < N(urtw_8225v2_rf_part3); i++) {
2977 		urtw_8187_write_phy_cck(sc, urtw_8225v2_rf_part3[i].reg,
2978 		    urtw_8225v2_rf_part3[i].val);
2979 	}
2980 
2981 	urtw_write8_m(sc, URTW_TESTR, 0x0d);
2982 
2983 	error = urtw_8225v2_set_txpwrlvl(sc, 1);
2984 	if (error)
2985 		goto fail;
2986 
2987 	urtw_8187_write_phy_cck(sc, 0x10, 0x9b);
2988 	urtw_8187_write_phy_ofdm(sc, 0x26, 0x90);
2989 
2990 	/* TX ant A, 0x0 for B */
2991 	error = urtw_8185_tx_antenna(sc, 0x3);
2992 	if (error)
2993 		goto fail;
2994 	urtw_write32_m(sc, URTW_HSSI_PARA, 0x3dc00002);
2995 
2996 	error = urtw_8225_rf_set_chan(sc, 1);
2997 fail:
2998 	return (error);
2999 #undef N
3000 }
3001 
3002 static usb_error_t
3003 urtw_8225v2_rf_set_chan(struct urtw_softc *sc, int chan)
3004 {
3005 	usb_error_t error;
3006 
3007 	error = urtw_8225v2_set_txpwrlvl(sc, chan);
3008 	if (error)
3009 		goto fail;
3010 
3011 	urtw_8225_write(sc, URTW_8225_ADDR_7_MAGIC, urtw_8225_channel[chan]);
3012 	usb_pause_mtx(&sc->sc_mtx, 10);
3013 fail:
3014 	return (error);
3015 }
3016 
3017 static usb_error_t
3018 urtw_8225_read(struct urtw_softc *sc, uint8_t addr, uint32_t *data)
3019 {
3020 	int i;
3021 	int16_t bit;
3022 	uint8_t rlen = 12, wlen = 6;
3023 	uint16_t o1, o2, o3, tmp;
3024 	uint32_t d2w = ((uint32_t)(addr & 0x1f)) << 27;
3025 	uint32_t mask = 0x80000000, value = 0;
3026 	usb_error_t error;
3027 
3028 	urtw_read16_m(sc, URTW_RF_PINS_OUTPUT, &o1);
3029 	urtw_read16_m(sc, URTW_RF_PINS_ENABLE, &o2);
3030 	urtw_read16_m(sc, URTW_RF_PINS_SELECT, &o3);
3031 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, o2 | URTW_RF_PINS_MAGIC4);
3032 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, o3 | URTW_RF_PINS_MAGIC4);
3033 	o1 &= ~URTW_RF_PINS_MAGIC4;
3034 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_EN);
3035 	DELAY(5);
3036 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1);
3037 	DELAY(5);
3038 
3039 	for (i = 0; i < (wlen / 2); i++, mask = mask >> 1) {
3040 		bit = ((d2w & mask) != 0) ? 1 : 0;
3041 
3042 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1);
3043 		DELAY(2);
3044 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 |
3045 		    URTW_BB_HOST_BANG_CLK);
3046 		DELAY(2);
3047 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 |
3048 		    URTW_BB_HOST_BANG_CLK);
3049 		DELAY(2);
3050 		mask = mask >> 1;
3051 		if (i == 2)
3052 			break;
3053 		bit = ((d2w & mask) != 0) ? 1 : 0;
3054 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 |
3055 		    URTW_BB_HOST_BANG_CLK);
3056 		DELAY(2);
3057 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 |
3058 		    URTW_BB_HOST_BANG_CLK);
3059 		DELAY(2);
3060 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1);
3061 		DELAY(1);
3062 	}
3063 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | URTW_BB_HOST_BANG_RW |
3064 	    URTW_BB_HOST_BANG_CLK);
3065 	DELAY(2);
3066 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | URTW_BB_HOST_BANG_RW);
3067 	DELAY(2);
3068 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_RW);
3069 	DELAY(2);
3070 
3071 	mask = 0x800;
3072 	for (i = 0; i < rlen; i++, mask = mask >> 1) {
3073 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
3074 		    o1 | URTW_BB_HOST_BANG_RW);
3075 		DELAY(2);
3076 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
3077 		    o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK);
3078 		DELAY(2);
3079 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
3080 		    o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK);
3081 		DELAY(2);
3082 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
3083 		    o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK);
3084 		DELAY(2);
3085 
3086 		urtw_read16_m(sc, URTW_RF_PINS_INPUT, &tmp);
3087 		value |= ((tmp & URTW_BB_HOST_BANG_CLK) ? mask : 0);
3088 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
3089 		    o1 | URTW_BB_HOST_BANG_RW);
3090 		DELAY(2);
3091 	}
3092 
3093 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_EN |
3094 	    URTW_BB_HOST_BANG_RW);
3095 	DELAY(2);
3096 
3097 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, o2);
3098 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, o3);
3099 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, URTW_RF_PINS_OUTPUT_MAGIC1);
3100 
3101 	if (data != NULL)
3102 		*data = value;
3103 fail:
3104 	return (error);
3105 }
3106 
3107 
3108 static usb_error_t
3109 urtw_8225v2_set_txpwrlvl(struct urtw_softc *sc, int chan)
3110 {
3111 	int i;
3112 	uint8_t *cck_pwrtable;
3113 	uint8_t cck_pwrlvl_max = 15, ofdm_pwrlvl_max = 25, ofdm_pwrlvl_min = 10;
3114 	uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff;
3115 	uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff;
3116 	usb_error_t error;
3117 
3118 	/* CCK power setting */
3119 	cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ? cck_pwrlvl_max : cck_pwrlvl;
3120 	cck_pwrlvl += sc->sc_txpwr_cck_base;
3121 	cck_pwrlvl = (cck_pwrlvl > 35) ? 35 : cck_pwrlvl;
3122 	cck_pwrtable = (chan == 14) ? urtw_8225v2_txpwr_cck_ch14 :
3123 	    urtw_8225v2_txpwr_cck;
3124 
3125 	for (i = 0; i < 8; i++)
3126 		urtw_8187_write_phy_cck(sc, 0x44 + i, cck_pwrtable[i]);
3127 
3128 	urtw_write8_m(sc, URTW_TX_GAIN_CCK,
3129 	    urtw_8225v2_tx_gain_cck_ofdm[cck_pwrlvl]);
3130 	usb_pause_mtx(&sc->sc_mtx, 1);
3131 
3132 	/* OFDM power setting */
3133 	ofdm_pwrlvl = (ofdm_pwrlvl > (ofdm_pwrlvl_max - ofdm_pwrlvl_min)) ?
3134 		ofdm_pwrlvl_max : ofdm_pwrlvl + ofdm_pwrlvl_min;
3135 	ofdm_pwrlvl += sc->sc_txpwr_ofdm_base;
3136 	ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl;
3137 
3138 	error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON);
3139 	if (error)
3140 		goto fail;
3141 
3142 	urtw_8187_write_phy_ofdm(sc, 2, 0x42);
3143 	urtw_8187_write_phy_ofdm(sc, 5, 0x0);
3144 	urtw_8187_write_phy_ofdm(sc, 6, 0x40);
3145 	urtw_8187_write_phy_ofdm(sc, 7, 0x0);
3146 	urtw_8187_write_phy_ofdm(sc, 8, 0x40);
3147 
3148 	urtw_write8_m(sc, URTW_TX_GAIN_OFDM,
3149 	    urtw_8225v2_tx_gain_cck_ofdm[ofdm_pwrlvl]);
3150 	usb_pause_mtx(&sc->sc_mtx, 1);
3151 fail:
3152 	return (error);
3153 }
3154 
3155 static usb_error_t
3156 urtw_8225v2_setgain(struct urtw_softc *sc, int16_t gain)
3157 {
3158 	uint8_t *gainp;
3159 	usb_error_t error;
3160 
3161 	/* XXX for A?  */
3162 	gainp = urtw_8225v2_gain_bg;
3163 	urtw_8187_write_phy_ofdm(sc, 0x0d, gainp[gain * 3]);
3164 	usb_pause_mtx(&sc->sc_mtx, 1);
3165 	urtw_8187_write_phy_ofdm(sc, 0x1b, gainp[gain * 3 + 1]);
3166 	usb_pause_mtx(&sc->sc_mtx, 1);
3167 	urtw_8187_write_phy_ofdm(sc, 0x1d, gainp[gain * 3 + 2]);
3168 	usb_pause_mtx(&sc->sc_mtx, 1);
3169 	urtw_8187_write_phy_ofdm(sc, 0x21, 0x17);
3170 	usb_pause_mtx(&sc->sc_mtx, 1);
3171 fail:
3172 	return (error);
3173 }
3174 
3175 static usb_error_t
3176 urtw_8225_isv2(struct urtw_softc *sc, int *ret)
3177 {
3178 	uint32_t data;
3179 	usb_error_t error;
3180 
3181 	*ret = 1;
3182 
3183 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, URTW_RF_PINS_MAGIC5);
3184 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, URTW_RF_PINS_MAGIC5);
3185 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, URTW_RF_PINS_MAGIC5);
3186 	usb_pause_mtx(&sc->sc_mtx, 500);
3187 
3188 	urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC,
3189 	    URTW_8225_ADDR_0_DATA_MAGIC1);
3190 
3191 	error = urtw_8225_read(sc, URTW_8225_ADDR_8_MAGIC, &data);
3192 	if (error != 0)
3193 		goto fail;
3194 	if (data != URTW_8225_ADDR_8_DATA_MAGIC1)
3195 		*ret = 0;
3196 	else {
3197 		error = urtw_8225_read(sc, URTW_8225_ADDR_9_MAGIC, &data);
3198 		if (error != 0)
3199 			goto fail;
3200 		if (data != URTW_8225_ADDR_9_DATA_MAGIC1)
3201 			*ret = 0;
3202 	}
3203 
3204 	urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC,
3205 	    URTW_8225_ADDR_0_DATA_MAGIC2);
3206 fail:
3207 	return (error);
3208 }
3209 
3210 static usb_error_t
3211 urtw_8225v2b_rf_init(struct urtw_softc *sc)
3212 {
3213 #define N(a)	(sizeof(a) / sizeof((a)[0]))
3214 	int i;
3215 	uint8_t data8;
3216 	usb_error_t error;
3217 
3218 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
3219 	if (error)
3220 		goto fail;
3221 
3222 	/*
3223 	 * initialize extra registers on 8187
3224 	 */
3225 	urtw_write16_m(sc, URTW_BRSR_8187B, 0xfff);
3226 
3227 	/* retry limit */
3228 	urtw_read8_m(sc, URTW_CW_CONF, &data8);
3229 	data8 |= URTW_CW_CONF_PERPACKET_RETRY;
3230 	urtw_write8_m(sc, URTW_CW_CONF, data8);
3231 
3232 	/* TX AGC */
3233 	urtw_read8_m(sc, URTW_TX_AGC_CTL, &data8);
3234 	data8 |= URTW_TX_AGC_CTL_PERPACKET_GAIN;
3235 	urtw_write8_m(sc, URTW_TX_AGC_CTL, data8);
3236 
3237 	/* Auto Rate Fallback Control */
3238 #define	URTW_ARFR	0x1e0
3239 	urtw_write16_m(sc, URTW_ARFR, 0xfff);
3240 	urtw_read8_m(sc, URTW_RATE_FALLBACK, &data8);
3241 	urtw_write8_m(sc, URTW_RATE_FALLBACK,
3242 	    data8 | URTW_RATE_FALLBACK_ENABLE);
3243 
3244 	urtw_read8_m(sc, URTW_MSR, &data8);
3245 	urtw_write8_m(sc, URTW_MSR, data8 & 0xf3);
3246 	urtw_read8_m(sc, URTW_MSR, &data8);
3247 	urtw_write8_m(sc, URTW_MSR, data8 | URTW_MSR_LINK_ENEDCA);
3248 	urtw_write8_m(sc, URTW_ACM_CONTROL, sc->sc_acmctl);
3249 
3250 	urtw_write16_m(sc, URTW_ATIM_WND, 2);
3251 	urtw_write16_m(sc, URTW_BEACON_INTERVAL, 100);
3252 #define	URTW_FEMR_FOR_8187B	0x1d4
3253 	urtw_write16_m(sc, URTW_FEMR_FOR_8187B, 0xffff);
3254 
3255 	/* led type */
3256 	urtw_read8_m(sc, URTW_CONFIG1, &data8);
3257 	data8 = (data8 & 0x3f) | 0x80;
3258 	urtw_write8_m(sc, URTW_CONFIG1, data8);
3259 
3260 	/* applying MAC address again.  */
3261 	urtw_write32_m(sc, URTW_MAC0, ((uint32_t *)sc->sc_bssid)[0]);
3262 	urtw_write16_m(sc, URTW_MAC4, ((uint32_t *)sc->sc_bssid)[1] & 0xffff);
3263 
3264 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
3265 	if (error)
3266 		goto fail;
3267 
3268 	urtw_write8_m(sc, URTW_WPA_CONFIG, 0);
3269 
3270 	/*
3271 	 * MAC configuration
3272 	 */
3273 	for (i = 0; i < N(urtw_8225v2b_rf_part1); i++)
3274 		urtw_write8_m(sc, urtw_8225v2b_rf_part1[i].reg,
3275 		    urtw_8225v2b_rf_part1[i].val);
3276 	urtw_write16_m(sc, URTW_TID_AC_MAP, 0xfa50);
3277 	urtw_write16_m(sc, URTW_INT_MIG, 0x0000);
3278 	urtw_write32_m(sc, 0x1f0, 0);
3279 	urtw_write32_m(sc, 0x1f4, 0);
3280 	urtw_write8_m(sc, 0x1f8, 0);
3281 	urtw_write32_m(sc, URTW_RF_TIMING, 0x4001);
3282 
3283 #define	URTW_RFSW_CTRL	0x272
3284 	urtw_write16_m(sc, URTW_RFSW_CTRL, 0x569a);
3285 
3286 	/*
3287 	 * initialize PHY
3288 	 */
3289 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
3290 	if (error)
3291 		goto fail;
3292 	urtw_read8_m(sc, URTW_CONFIG3, &data8);
3293 	urtw_write8_m(sc, URTW_CONFIG3,
3294 	    data8 | URTW_CONFIG3_ANAPARAM_WRITE);
3295 
3296 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
3297 	if (error)
3298 		goto fail;
3299 
3300 	/* setup RFE initial timing */
3301 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x0480);
3302 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x2488);
3303 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x1fff);
3304 	usb_pause_mtx(&sc->sc_mtx, 1100);
3305 
3306 	for (i = 0; i < N(urtw_8225v2b_rf_part0); i++) {
3307 		urtw_8225_write(sc, urtw_8225v2b_rf_part0[i].reg,
3308 		    urtw_8225v2b_rf_part0[i].val);
3309 		usb_pause_mtx(&sc->sc_mtx, 1);
3310 	}
3311 	urtw_8225_write(sc, 0x00, 0x01b7);
3312 
3313 	for (i = 0; i < 95; i++) {
3314 		urtw_8225_write(sc, URTW_8225_ADDR_1_MAGIC, (uint8_t)(i + 1));
3315 		usb_pause_mtx(&sc->sc_mtx, 1);
3316 		urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC,
3317 		    urtw_8225v2b_rxgain[i]);
3318 		usb_pause_mtx(&sc->sc_mtx, 1);
3319 	}
3320 
3321 	urtw_8225_write(sc, URTW_8225_ADDR_3_MAGIC, 0x080);
3322 	usb_pause_mtx(&sc->sc_mtx, 1);
3323 	urtw_8225_write(sc, URTW_8225_ADDR_5_MAGIC, 0x004);
3324 	usb_pause_mtx(&sc->sc_mtx, 1);
3325 	urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC, 0x0b7);
3326 	usb_pause_mtx(&sc->sc_mtx, 1);
3327 	usb_pause_mtx(&sc->sc_mtx, 3000);
3328 	urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, 0xc4d);
3329 	usb_pause_mtx(&sc->sc_mtx, 2000);
3330 	urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, 0x44d);
3331 	usb_pause_mtx(&sc->sc_mtx, 1);
3332 	urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC, 0x2bf);
3333 	usb_pause_mtx(&sc->sc_mtx, 1);
3334 
3335 	urtw_write8_m(sc, URTW_TX_GAIN_CCK, 0x03);
3336 	urtw_write8_m(sc, URTW_TX_GAIN_OFDM, 0x07);
3337 	urtw_write8_m(sc, URTW_TX_ANTENNA, 0x03);
3338 
3339 	urtw_8187_write_phy_ofdm(sc, 0x80, 0x12);
3340 	for (i = 0; i < 128; i++) {
3341 		uint32_t addr, data;
3342 
3343 		data = (urtw_8225z2_agc[i] << 8) | 0x0000008f;
3344 		addr = ((i + 0x80) << 8) | 0x0000008e;
3345 
3346 		urtw_8187_write_phy_ofdm(sc, data & 0x7f, (data >> 8) & 0xff);
3347 		urtw_8187_write_phy_ofdm(sc, addr & 0x7f, (addr >> 8) & 0xff);
3348 		urtw_8187_write_phy_ofdm(sc, 0x0e, 0x00);
3349 	}
3350 	urtw_8187_write_phy_ofdm(sc, 0x80, 0x10);
3351 
3352 	for (i = 0; i < N(urtw_8225v2b_rf_part2); i++)
3353 		urtw_8187_write_phy_ofdm(sc, i, urtw_8225v2b_rf_part2[i].val);
3354 
3355 	urtw_write32_m(sc, URTW_8187B_AC_VO, (7 << 12) | (3 << 8) | 0x1c);
3356 	urtw_write32_m(sc, URTW_8187B_AC_VI, (7 << 12) | (3 << 8) | 0x1c);
3357 	urtw_write32_m(sc, URTW_8187B_AC_BE, (7 << 12) | (3 << 8) | 0x1c);
3358 	urtw_write32_m(sc, URTW_8187B_AC_BK, (7 << 12) | (3 << 8) | 0x1c);
3359 
3360 	urtw_8187_write_phy_ofdm(sc, 0x97, 0x46);
3361 	urtw_8187_write_phy_ofdm(sc, 0xa4, 0xb6);
3362 	urtw_8187_write_phy_ofdm(sc, 0x85, 0xfc);
3363 	urtw_8187_write_phy_cck(sc, 0xc1, 0x88);
3364 
3365 fail:
3366 	return (error);
3367 #undef N
3368 }
3369 
3370 static usb_error_t
3371 urtw_8225v2b_rf_set_chan(struct urtw_softc *sc, int chan)
3372 {
3373 	usb_error_t error;
3374 
3375 	error = urtw_8225v2b_set_txpwrlvl(sc, chan);
3376 	if (error)
3377 		goto fail;
3378 
3379 	urtw_8225_write(sc, URTW_8225_ADDR_7_MAGIC, urtw_8225_channel[chan]);
3380 	usb_pause_mtx(&sc->sc_mtx, 10);
3381 fail:
3382 	return (error);
3383 }
3384 
3385 static usb_error_t
3386 urtw_8225v2b_set_txpwrlvl(struct urtw_softc *sc, int chan)
3387 {
3388 	int i;
3389 	uint8_t *cck_pwrtable;
3390 	uint8_t cck_pwrlvl_max = 15;
3391 	uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff;
3392 	uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff;
3393 	usb_error_t error;
3394 
3395 	/* CCK power setting */
3396 	cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ?
3397 	    ((sc->sc_flags & URTW_RTL8187B_REV_B) ? cck_pwrlvl_max : 22) :
3398 	    (cck_pwrlvl + ((sc->sc_flags & URTW_RTL8187B_REV_B) ? 0 : 7));
3399 	cck_pwrlvl += sc->sc_txpwr_cck_base;
3400 	cck_pwrlvl = (cck_pwrlvl > 35) ? 35 : cck_pwrlvl;
3401 	cck_pwrtable = (chan == 14) ? urtw_8225v2b_txpwr_cck_ch14 :
3402 	    urtw_8225v2b_txpwr_cck;
3403 
3404 	if (sc->sc_flags & URTW_RTL8187B_REV_B)
3405 		cck_pwrtable += (cck_pwrlvl <= 6) ? 0 :
3406 		    ((cck_pwrlvl <= 11) ? 8 : 16);
3407 	else
3408 		cck_pwrtable += (cck_pwrlvl <= 5) ? 0 :
3409 		    ((cck_pwrlvl <= 11) ? 8 : ((cck_pwrlvl <= 17) ? 16 : 24));
3410 
3411 	for (i = 0; i < 8; i++)
3412 		urtw_8187_write_phy_cck(sc, 0x44 + i, cck_pwrtable[i]);
3413 
3414 	urtw_write8_m(sc, URTW_TX_GAIN_CCK,
3415 	    urtw_8225v2_tx_gain_cck_ofdm[cck_pwrlvl] << 1);
3416 	usb_pause_mtx(&sc->sc_mtx, 1);
3417 
3418 	/* OFDM power setting */
3419 	ofdm_pwrlvl = (ofdm_pwrlvl > 15) ?
3420 	    ((sc->sc_flags & URTW_RTL8187B_REV_B) ? 17 : 25) :
3421 	    (ofdm_pwrlvl + ((sc->sc_flags & URTW_RTL8187B_REV_B) ? 2 : 10));
3422 	ofdm_pwrlvl += sc->sc_txpwr_ofdm_base;
3423 	ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl;
3424 
3425 	urtw_write8_m(sc, URTW_TX_GAIN_OFDM,
3426 	    urtw_8225v2_tx_gain_cck_ofdm[ofdm_pwrlvl] << 1);
3427 
3428 	if (sc->sc_flags & URTW_RTL8187B_REV_B) {
3429 		if (ofdm_pwrlvl <= 11) {
3430 			urtw_8187_write_phy_ofdm(sc, 0x87, 0x60);
3431 			urtw_8187_write_phy_ofdm(sc, 0x89, 0x60);
3432 		} else {
3433 			urtw_8187_write_phy_ofdm(sc, 0x87, 0x5c);
3434 			urtw_8187_write_phy_ofdm(sc, 0x89, 0x5c);
3435 		}
3436 	} else {
3437 		if (ofdm_pwrlvl <= 11) {
3438 			urtw_8187_write_phy_ofdm(sc, 0x87, 0x5c);
3439 			urtw_8187_write_phy_ofdm(sc, 0x89, 0x5c);
3440 		} else if (ofdm_pwrlvl <= 17) {
3441 			urtw_8187_write_phy_ofdm(sc, 0x87, 0x54);
3442 			urtw_8187_write_phy_ofdm(sc, 0x89, 0x54);
3443 		} else {
3444 			urtw_8187_write_phy_ofdm(sc, 0x87, 0x50);
3445 			urtw_8187_write_phy_ofdm(sc, 0x89, 0x50);
3446 		}
3447 	}
3448 	usb_pause_mtx(&sc->sc_mtx, 1);
3449 fail:
3450 	return (error);
3451 }
3452 
3453 static usb_error_t
3454 urtw_read8e(struct urtw_softc *sc, int val, uint8_t *data)
3455 {
3456 	struct usb_device_request req;
3457 	usb_error_t error;
3458 
3459 	req.bmRequestType = UT_READ_VENDOR_DEVICE;
3460 	req.bRequest = URTW_8187_GETREGS_REQ;
3461 	USETW(req.wValue, val | 0xfe00);
3462 	USETW(req.wIndex, 0);
3463 	USETW(req.wLength, sizeof(uint8_t));
3464 
3465 	error = urtw_do_request(sc, &req, data);
3466 	return (error);
3467 }
3468 
3469 static usb_error_t
3470 urtw_write8e(struct urtw_softc *sc, int val, uint8_t data)
3471 {
3472 	struct usb_device_request req;
3473 
3474 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
3475 	req.bRequest = URTW_8187_SETREGS_REQ;
3476 	USETW(req.wValue, val | 0xfe00);
3477 	USETW(req.wIndex, 0);
3478 	USETW(req.wLength, sizeof(uint8_t));
3479 
3480 	return (urtw_do_request(sc, &req, &data));
3481 }
3482 
3483 static usb_error_t
3484 urtw_8180_set_anaparam(struct urtw_softc *sc, uint32_t val)
3485 {
3486 	uint8_t data;
3487 	usb_error_t error;
3488 
3489 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
3490 	if (error)
3491 		goto fail;
3492 
3493 	urtw_read8_m(sc, URTW_CONFIG3, &data);
3494 	urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE);
3495 	urtw_write32_m(sc, URTW_ANAPARAM, val);
3496 	urtw_read8_m(sc, URTW_CONFIG3, &data);
3497 	urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE);
3498 
3499 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
3500 	if (error)
3501 		goto fail;
3502 fail:
3503 	return (error);
3504 }
3505 
3506 static usb_error_t
3507 urtw_8185_set_anaparam2(struct urtw_softc *sc, uint32_t val)
3508 {
3509 	uint8_t data;
3510 	usb_error_t error;
3511 
3512 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
3513 	if (error)
3514 		goto fail;
3515 
3516 	urtw_read8_m(sc, URTW_CONFIG3, &data);
3517 	urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE);
3518 	urtw_write32_m(sc, URTW_ANAPARAM2, val);
3519 	urtw_read8_m(sc, URTW_CONFIG3, &data);
3520 	urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE);
3521 
3522 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
3523 	if (error)
3524 		goto fail;
3525 fail:
3526 	return (error);
3527 }
3528 
3529 static usb_error_t
3530 urtw_intr_enable(struct urtw_softc *sc)
3531 {
3532 	usb_error_t error;
3533 
3534 	urtw_write16_m(sc, URTW_INTR_MASK, 0xffff);
3535 fail:
3536 	return (error);
3537 }
3538 
3539 static usb_error_t
3540 urtw_intr_disable(struct urtw_softc *sc)
3541 {
3542 	usb_error_t error;
3543 
3544 	urtw_write16_m(sc, URTW_INTR_MASK, 0);
3545 fail:
3546 	return (error);
3547 }
3548 
3549 static usb_error_t
3550 urtw_reset(struct urtw_softc *sc)
3551 {
3552 	uint8_t data;
3553 	usb_error_t error;
3554 
3555 	error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON);
3556 	if (error)
3557 		goto fail;
3558 	error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON);
3559 	if (error)
3560 		goto fail;
3561 
3562 	error = urtw_intr_disable(sc);
3563 	if (error)
3564 		goto fail;
3565 	usb_pause_mtx(&sc->sc_mtx, 100);
3566 
3567 	error = urtw_write8e(sc, 0x18, 0x10);
3568 	if (error != 0)
3569 		goto fail;
3570 	error = urtw_write8e(sc, 0x18, 0x11);
3571 	if (error != 0)
3572 		goto fail;
3573 	error = urtw_write8e(sc, 0x18, 0x00);
3574 	if (error != 0)
3575 		goto fail;
3576 	usb_pause_mtx(&sc->sc_mtx, 100);
3577 
3578 	urtw_read8_m(sc, URTW_CMD, &data);
3579 	data = (data & 0x2) | URTW_CMD_RST;
3580 	urtw_write8_m(sc, URTW_CMD, data);
3581 	usb_pause_mtx(&sc->sc_mtx, 100);
3582 
3583 	urtw_read8_m(sc, URTW_CMD, &data);
3584 	if (data & URTW_CMD_RST) {
3585 		device_printf(sc->sc_dev, "reset timeout\n");
3586 		goto fail;
3587 	}
3588 
3589 	error = urtw_set_mode(sc, URTW_EPROM_CMD_LOAD);
3590 	if (error)
3591 		goto fail;
3592 	usb_pause_mtx(&sc->sc_mtx, 100);
3593 
3594 	error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON);
3595 	if (error)
3596 		goto fail;
3597 	error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON);
3598 	if (error)
3599 		goto fail;
3600 fail:
3601 	return (error);
3602 }
3603 
3604 static usb_error_t
3605 urtw_led_ctl(struct urtw_softc *sc, int mode)
3606 {
3607 	usb_error_t error = 0;
3608 
3609 	switch (sc->sc_strategy) {
3610 	case URTW_SW_LED_MODE0:
3611 		error = urtw_led_mode0(sc, mode);
3612 		break;
3613 	case URTW_SW_LED_MODE1:
3614 		error = urtw_led_mode1(sc, mode);
3615 		break;
3616 	case URTW_SW_LED_MODE2:
3617 		error = urtw_led_mode2(sc, mode);
3618 		break;
3619 	case URTW_SW_LED_MODE3:
3620 		error = urtw_led_mode3(sc, mode);
3621 		break;
3622 	default:
3623 		panic("unsupported LED mode %d\n", sc->sc_strategy);
3624 		/* never reach  */
3625 	}
3626 
3627 	return (error);
3628 }
3629 
3630 static usb_error_t
3631 urtw_led_mode0(struct urtw_softc *sc, int mode)
3632 {
3633 
3634 	switch (mode) {
3635 	case URTW_LED_CTL_POWER_ON:
3636 		sc->sc_gpio_ledstate = URTW_LED_POWER_ON_BLINK;
3637 		break;
3638 	case URTW_LED_CTL_TX:
3639 		if (sc->sc_gpio_ledinprogress == 1)
3640 			return (0);
3641 
3642 		sc->sc_gpio_ledstate = URTW_LED_BLINK_NORMAL;
3643 		sc->sc_gpio_blinktime = 2;
3644 		break;
3645 	case URTW_LED_CTL_LINK:
3646 		sc->sc_gpio_ledstate = URTW_LED_ON;
3647 		break;
3648 	default:
3649 		panic("unsupported LED mode 0x%x", mode);
3650 		/* never reach  */
3651 	}
3652 
3653 	switch (sc->sc_gpio_ledstate) {
3654 	case URTW_LED_ON:
3655 		if (sc->sc_gpio_ledinprogress != 0)
3656 			break;
3657 		urtw_led_on(sc, URTW_LED_GPIO);
3658 		break;
3659 	case URTW_LED_BLINK_NORMAL:
3660 		if (sc->sc_gpio_ledinprogress != 0)
3661 			break;
3662 		sc->sc_gpio_ledinprogress = 1;
3663 		sc->sc_gpio_blinkstate = (sc->sc_gpio_ledon != 0) ?
3664 			URTW_LED_OFF : URTW_LED_ON;
3665 		usb_callout_reset(&sc->sc_led_ch, hz, urtw_led_ch, sc);
3666 		break;
3667 	case URTW_LED_POWER_ON_BLINK:
3668 		urtw_led_on(sc, URTW_LED_GPIO);
3669 		usb_pause_mtx(&sc->sc_mtx, 100);
3670 		urtw_led_off(sc, URTW_LED_GPIO);
3671 		break;
3672 	default:
3673 		panic("unknown LED status 0x%x", sc->sc_gpio_ledstate);
3674 		/* never reach  */
3675 	}
3676 	return (0);
3677 }
3678 
3679 static usb_error_t
3680 urtw_led_mode1(struct urtw_softc *sc, int mode)
3681 {
3682 
3683 	return (USB_ERR_INVAL);
3684 }
3685 
3686 static usb_error_t
3687 urtw_led_mode2(struct urtw_softc *sc, int mode)
3688 {
3689 
3690 	return (USB_ERR_INVAL);
3691 }
3692 
3693 static usb_error_t
3694 urtw_led_mode3(struct urtw_softc *sc, int mode)
3695 {
3696 
3697 	return (USB_ERR_INVAL);
3698 }
3699 
3700 static usb_error_t
3701 urtw_led_on(struct urtw_softc *sc, int type)
3702 {
3703 	usb_error_t error;
3704 
3705 	if (type == URTW_LED_GPIO) {
3706 		switch (sc->sc_gpio_ledpin) {
3707 		case URTW_LED_PIN_GPIO0:
3708 			urtw_write8_m(sc, URTW_GPIO, 0x01);
3709 			urtw_write8_m(sc, URTW_GP_ENABLE, 0x00);
3710 			break;
3711 		default:
3712 			panic("unsupported LED PIN type 0x%x",
3713 			    sc->sc_gpio_ledpin);
3714 			/* never reach  */
3715 		}
3716 	} else {
3717 		panic("unsupported LED type 0x%x", type);
3718 		/* never reach  */
3719 	}
3720 
3721 	sc->sc_gpio_ledon = 1;
3722 fail:
3723 	return (error);
3724 }
3725 
3726 static usb_error_t
3727 urtw_led_off(struct urtw_softc *sc, int type)
3728 {
3729 	usb_error_t error;
3730 
3731 	if (type == URTW_LED_GPIO) {
3732 		switch (sc->sc_gpio_ledpin) {
3733 		case URTW_LED_PIN_GPIO0:
3734 			urtw_write8_m(sc, URTW_GPIO, URTW_GPIO_DATA_MAGIC1);
3735 			urtw_write8_m(sc,
3736 			    URTW_GP_ENABLE, URTW_GP_ENABLE_DATA_MAGIC1);
3737 			break;
3738 		default:
3739 			panic("unsupported LED PIN type 0x%x",
3740 			    sc->sc_gpio_ledpin);
3741 			/* never reach  */
3742 		}
3743 	} else {
3744 		panic("unsupported LED type 0x%x", type);
3745 		/* never reach  */
3746 	}
3747 
3748 	sc->sc_gpio_ledon = 0;
3749 
3750 fail:
3751 	return (error);
3752 }
3753 
3754 static void
3755 urtw_led_ch(void *arg)
3756 {
3757 	struct urtw_softc *sc = arg;
3758 	struct ifnet *ifp = sc->sc_ifp;
3759 	struct ieee80211com *ic = ifp->if_l2com;
3760 
3761 	ieee80211_runtask(ic, &sc->sc_led_task);
3762 }
3763 
3764 static void
3765 urtw_ledtask(void *arg, int pending)
3766 {
3767 	struct urtw_softc *sc = arg;
3768 
3769 	if (sc->sc_strategy != URTW_SW_LED_MODE0)
3770 		panic("could not process a LED strategy 0x%x", sc->sc_strategy);
3771 
3772 	URTW_LOCK(sc);
3773 	urtw_led_blink(sc);
3774 	URTW_UNLOCK(sc);
3775 }
3776 
3777 static usb_error_t
3778 urtw_led_blink(struct urtw_softc *sc)
3779 {
3780 	uint8_t ing = 0;
3781 	usb_error_t error;
3782 
3783 	if (sc->sc_gpio_blinkstate == URTW_LED_ON)
3784 		error = urtw_led_on(sc, URTW_LED_GPIO);
3785 	else
3786 		error = urtw_led_off(sc, URTW_LED_GPIO);
3787 	sc->sc_gpio_blinktime--;
3788 	if (sc->sc_gpio_blinktime == 0)
3789 		ing = 1;
3790 	else {
3791 		if (sc->sc_gpio_ledstate != URTW_LED_BLINK_NORMAL &&
3792 		    sc->sc_gpio_ledstate != URTW_LED_BLINK_SLOWLY &&
3793 		    sc->sc_gpio_ledstate != URTW_LED_BLINK_CM3)
3794 			ing = 1;
3795 	}
3796 	if (ing == 1) {
3797 		if (sc->sc_gpio_ledstate == URTW_LED_ON &&
3798 		    sc->sc_gpio_ledon == 0)
3799 			error = urtw_led_on(sc, URTW_LED_GPIO);
3800 		else if (sc->sc_gpio_ledstate == URTW_LED_OFF &&
3801 		    sc->sc_gpio_ledon == 1)
3802 			error = urtw_led_off(sc, URTW_LED_GPIO);
3803 
3804 		sc->sc_gpio_blinktime = 0;
3805 		sc->sc_gpio_ledinprogress = 0;
3806 		return (0);
3807 	}
3808 
3809 	sc->sc_gpio_blinkstate = (sc->sc_gpio_blinkstate != URTW_LED_ON) ?
3810 	    URTW_LED_ON : URTW_LED_OFF;
3811 
3812 	switch (sc->sc_gpio_ledstate) {
3813 	case URTW_LED_BLINK_NORMAL:
3814 		usb_callout_reset(&sc->sc_led_ch, hz, urtw_led_ch, sc);
3815 		break;
3816 	default:
3817 		panic("unknown LED status 0x%x", sc->sc_gpio_ledstate);
3818 		/* never reach  */
3819 	}
3820 	return (0);
3821 }
3822 
3823 static usb_error_t
3824 urtw_rx_enable(struct urtw_softc *sc)
3825 {
3826 	uint8_t data;
3827 	usb_error_t error;
3828 
3829 	usbd_transfer_start((sc->sc_flags & URTW_RTL8187B) ?
3830 	    sc->sc_xfer[URTW_8187B_BULK_RX] : sc->sc_xfer[URTW_8187L_BULK_RX]);
3831 
3832 	error = urtw_rx_setconf(sc);
3833 	if (error != 0)
3834 		goto fail;
3835 
3836 	if ((sc->sc_flags & URTW_RTL8187B) == 0) {
3837 		urtw_read8_m(sc, URTW_CMD, &data);
3838 		urtw_write8_m(sc, URTW_CMD, data | URTW_CMD_RX_ENABLE);
3839 	}
3840 fail:
3841 	return (error);
3842 }
3843 
3844 static usb_error_t
3845 urtw_tx_enable(struct urtw_softc *sc)
3846 {
3847 	uint8_t data8;
3848 	uint32_t data;
3849 	usb_error_t error;
3850 
3851 	if (sc->sc_flags & URTW_RTL8187B) {
3852 		urtw_read32_m(sc, URTW_TX_CONF, &data);
3853 		data &= ~URTW_TX_LOOPBACK_MASK;
3854 		data &= ~(URTW_TX_DPRETRY_MASK | URTW_TX_RTSRETRY_MASK);
3855 		data &= ~(URTW_TX_NOCRC | URTW_TX_MXDMA_MASK);
3856 		data &= ~URTW_TX_SWPLCPLEN;
3857 		data |= URTW_TX_HW_SEQNUM | URTW_TX_DISREQQSIZE |
3858 		    (7 << 8) |	/* short retry limit */
3859 		    (7 << 0) |	/* long retry limit */
3860 		    (7 << 21);	/* MAX TX DMA */
3861 		urtw_write32_m(sc, URTW_TX_CONF, data);
3862 
3863 		urtw_read8_m(sc, URTW_MSR, &data8);
3864 		data8 |= URTW_MSR_LINK_ENEDCA;
3865 		urtw_write8_m(sc, URTW_MSR, data8);
3866 		return (error);
3867 	}
3868 
3869 	urtw_read8_m(sc, URTW_CW_CONF, &data8);
3870 	data8 &= ~(URTW_CW_CONF_PERPACKET_CW | URTW_CW_CONF_PERPACKET_RETRY);
3871 	urtw_write8_m(sc, URTW_CW_CONF, data8);
3872 
3873 	urtw_read8_m(sc, URTW_TX_AGC_CTL, &data8);
3874 	data8 &= ~URTW_TX_AGC_CTL_PERPACKET_GAIN;
3875 	data8 &= ~URTW_TX_AGC_CTL_PERPACKET_ANTSEL;
3876 	data8 &= ~URTW_TX_AGC_CTL_FEEDBACK_ANT;
3877 	urtw_write8_m(sc, URTW_TX_AGC_CTL, data8);
3878 
3879 	urtw_read32_m(sc, URTW_TX_CONF, &data);
3880 	data &= ~URTW_TX_LOOPBACK_MASK;
3881 	data |= URTW_TX_LOOPBACK_NONE;
3882 	data &= ~(URTW_TX_DPRETRY_MASK | URTW_TX_RTSRETRY_MASK);
3883 	data |= sc->sc_tx_retry << URTW_TX_DPRETRY_SHIFT;
3884 	data |= sc->sc_rts_retry << URTW_TX_RTSRETRY_SHIFT;
3885 	data &= ~(URTW_TX_NOCRC | URTW_TX_MXDMA_MASK);
3886 	data |= URTW_TX_MXDMA_2048 | URTW_TX_CWMIN | URTW_TX_DISCW;
3887 	data &= ~URTW_TX_SWPLCPLEN;
3888 	data |= URTW_TX_NOICV;
3889 	urtw_write32_m(sc, URTW_TX_CONF, data);
3890 
3891 	urtw_read8_m(sc, URTW_CMD, &data8);
3892 	urtw_write8_m(sc, URTW_CMD, data8 | URTW_CMD_TX_ENABLE);
3893 fail:
3894 	return (error);
3895 }
3896 
3897 static usb_error_t
3898 urtw_rx_setconf(struct urtw_softc *sc)
3899 {
3900 	struct ifnet *ifp = sc->sc_ifp;
3901 	struct ieee80211com *ic = ifp->if_l2com;
3902 	uint32_t data;
3903 	usb_error_t error;
3904 
3905 	urtw_read32_m(sc, URTW_RX, &data);
3906 	data = data &~ URTW_RX_FILTER_MASK;
3907 	if (sc->sc_flags & URTW_RTL8187B) {
3908 		data = data | URTW_RX_FILTER_MNG | URTW_RX_FILTER_DATA |
3909 		    URTW_RX_FILTER_MCAST | URTW_RX_FILTER_BCAST |
3910 		    URTW_RX_FILTER_NICMAC | URTW_RX_CHECK_BSSID |
3911 		    URTW_RX_FIFO_THRESHOLD_NONE |
3912 		    URTW_MAX_RX_DMA_2048 |
3913 		    URTW_RX_AUTORESETPHY | URTW_RCR_ONLYERLPKT;
3914 	} else {
3915 		data = data | URTW_RX_FILTER_MNG | URTW_RX_FILTER_DATA;
3916 		data = data | URTW_RX_FILTER_BCAST | URTW_RX_FILTER_MCAST;
3917 
3918 		if (ic->ic_opmode == IEEE80211_M_MONITOR) {
3919 			data = data | URTW_RX_FILTER_ICVERR;
3920 			data = data | URTW_RX_FILTER_PWR;
3921 		}
3922 		if (sc->sc_crcmon == 1 && ic->ic_opmode == IEEE80211_M_MONITOR)
3923 			data = data | URTW_RX_FILTER_CRCERR;
3924 
3925 		if (ic->ic_opmode == IEEE80211_M_MONITOR ||
3926 		    (ifp->if_flags & (IFF_ALLMULTI | IFF_PROMISC))) {
3927 			data = data | URTW_RX_FILTER_ALLMAC;
3928 		} else {
3929 			data = data | URTW_RX_FILTER_NICMAC;
3930 			data = data | URTW_RX_CHECK_BSSID;
3931 		}
3932 
3933 		data = data &~ URTW_RX_FIFO_THRESHOLD_MASK;
3934 		data = data | URTW_RX_FIFO_THRESHOLD_NONE |
3935 		    URTW_RX_AUTORESETPHY;
3936 		data = data &~ URTW_MAX_RX_DMA_MASK;
3937 		data = data | URTW_MAX_RX_DMA_2048 | URTW_RCR_ONLYERLPKT;
3938 	}
3939 
3940 	urtw_write32_m(sc, URTW_RX, data);
3941 fail:
3942 	return (error);
3943 }
3944 
3945 static struct mbuf *
3946 urtw_rxeof(struct usb_xfer *xfer, struct urtw_data *data, int *rssi_p,
3947     int8_t *nf_p)
3948 {
3949 	int actlen, flen, rssi;
3950 	struct ieee80211_frame *wh;
3951 	struct mbuf *m, *mnew;
3952 	struct urtw_softc *sc = data->sc;
3953 	struct ifnet *ifp = sc->sc_ifp;
3954 	struct ieee80211com *ic = ifp->if_l2com;
3955 	uint8_t noise = 0, rate;
3956 
3957 	usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
3958 
3959 	if (actlen < URTW_MIN_RXBUFSZ) {
3960 		ifp->if_ierrors++;
3961 		return (NULL);
3962 	}
3963 
3964 	if (sc->sc_flags & URTW_RTL8187B) {
3965 		struct urtw_8187b_rxhdr *rx;
3966 
3967 		rx = (struct urtw_8187b_rxhdr *)(data->buf +
3968 		    (actlen - (sizeof(struct urtw_8187b_rxhdr))));
3969 		flen = le32toh(rx->flag) & 0xfff;
3970 		if (flen > actlen) {
3971 			ifp->if_ierrors++;
3972 			return (NULL);
3973 		}
3974 		rate = (le32toh(rx->flag) >> URTW_RX_FLAG_RXRATE_SHIFT) & 0xf;
3975 		/* XXX correct? */
3976 		rssi = rx->rssi & URTW_RX_RSSI_MASK;
3977 		noise = rx->noise;
3978 	} else {
3979 		struct urtw_8187l_rxhdr *rx;
3980 
3981 		rx = (struct urtw_8187l_rxhdr *)(data->buf +
3982 		    (actlen - (sizeof(struct urtw_8187l_rxhdr))));
3983 		flen = le32toh(rx->flag) & 0xfff;
3984 		if (flen > actlen) {
3985 			ifp->if_ierrors++;
3986 			return (NULL);
3987 		}
3988 
3989 		rate = (le32toh(rx->flag) >> URTW_RX_FLAG_RXRATE_SHIFT) & 0xf;
3990 		/* XXX correct? */
3991 		rssi = rx->rssi & URTW_RX_8187L_RSSI_MASK;
3992 		noise = rx->noise;
3993 	}
3994 
3995 	mnew = m_getcl(M_DONTWAIT, MT_DATA, M_PKTHDR);
3996 	if (mnew == NULL) {
3997 		ifp->if_ierrors++;
3998 		return (NULL);
3999 	}
4000 
4001 	m = data->m;
4002 	data->m = mnew;
4003 	data->buf = mtod(mnew, uint8_t *);
4004 
4005 	/* finalize mbuf */
4006 	m->m_pkthdr.rcvif = ifp;
4007 	m->m_pkthdr.len = m->m_len = flen - IEEE80211_CRC_LEN;
4008 
4009 	if (ieee80211_radiotap_active(ic)) {
4010 		struct urtw_rx_radiotap_header *tap = &sc->sc_rxtap;
4011 
4012 		/* XXX Are variables correct?  */
4013 		tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq);
4014 		tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags);
4015 		tap->wr_dbm_antsignal = (int8_t)rssi;
4016 	}
4017 
4018 	wh = mtod(m, struct ieee80211_frame *);
4019 	if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_DATA)
4020 		sc->sc_currate = (rate > 0) ? rate : sc->sc_currate;
4021 
4022 	*rssi_p = rssi;
4023 	*nf_p = noise;		/* XXX correct? */
4024 
4025 	return (m);
4026 }
4027 
4028 static void
4029 urtw_bulk_rx_callback(struct usb_xfer *xfer, usb_error_t error)
4030 {
4031 	struct urtw_softc *sc = usbd_xfer_softc(xfer);
4032 	struct ifnet *ifp = sc->sc_ifp;
4033 	struct ieee80211com *ic = ifp->if_l2com;
4034 	struct ieee80211_frame *wh;
4035 	struct ieee80211_node *ni;
4036 	struct mbuf *m = NULL;
4037 	struct urtw_data *data;
4038 	int8_t nf = -95;
4039 	int rssi = 1;
4040 
4041 	URTW_ASSERT_LOCKED(sc);
4042 
4043 	switch (USB_GET_STATE(xfer)) {
4044 	case USB_ST_TRANSFERRED:
4045 		data = STAILQ_FIRST(&sc->sc_rx_active);
4046 		if (data == NULL)
4047 			goto setup;
4048 		STAILQ_REMOVE_HEAD(&sc->sc_rx_active, next);
4049 		m = urtw_rxeof(xfer, data, &rssi, &nf);
4050 		STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next);
4051 		/* FALLTHROUGH */
4052 	case USB_ST_SETUP:
4053 setup:
4054 		data = STAILQ_FIRST(&sc->sc_rx_inactive);
4055 		if (data == NULL) {
4056 			KASSERT(m == NULL, ("mbuf isn't NULL"));
4057 			return;
4058 		}
4059 		STAILQ_REMOVE_HEAD(&sc->sc_rx_inactive, next);
4060 		STAILQ_INSERT_TAIL(&sc->sc_rx_active, data, next);
4061 		usbd_xfer_set_frame_data(xfer, 0, data->buf,
4062 		    usbd_xfer_max_len(xfer));
4063 		usbd_transfer_submit(xfer);
4064 
4065 		/*
4066 		 * To avoid LOR we should unlock our private mutex here to call
4067 		 * ieee80211_input() because here is at the end of a USB
4068 		 * callback and safe to unlock.
4069 		 */
4070 		URTW_UNLOCK(sc);
4071 		if (m != NULL) {
4072 			wh = mtod(m, struct ieee80211_frame *);
4073 			ni = ieee80211_find_rxnode(ic,
4074 			    (struct ieee80211_frame_min *)wh);
4075 			if (ni != NULL) {
4076 				(void) ieee80211_input(ni, m, rssi, nf);
4077 				/* node is no longer needed */
4078 				ieee80211_free_node(ni);
4079 			} else
4080 				(void) ieee80211_input_all(ic, m, rssi, nf);
4081 			m = NULL;
4082 		}
4083 		URTW_LOCK(sc);
4084 		break;
4085 	default:
4086 		/* needs it to the inactive queue due to a error.  */
4087 		data = STAILQ_FIRST(&sc->sc_rx_active);
4088 		if (data != NULL) {
4089 			STAILQ_REMOVE_HEAD(&sc->sc_rx_active, next);
4090 			STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next);
4091 		}
4092 		if (error != USB_ERR_CANCELLED) {
4093 			usbd_xfer_set_stall(xfer);
4094 			ifp->if_ierrors++;
4095 			goto setup;
4096 		}
4097 		break;
4098 	}
4099 }
4100 
4101 #define	URTW_STATUS_TYPE_TXCLOSE	1
4102 #define	URTW_STATUS_TYPE_BEACON_INTR	0
4103 
4104 static void
4105 urtw_txstatus_eof(struct usb_xfer *xfer)
4106 {
4107 	struct urtw_softc *sc = usbd_xfer_softc(xfer);
4108 	struct ifnet *ifp = sc->sc_ifp;
4109 	int actlen, type, pktretry, seq;
4110 	uint64_t val;
4111 
4112 	usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
4113 
4114 	if (actlen != sizeof(uint64_t))
4115 		return;
4116 
4117 	val = le64toh(sc->sc_txstatus);
4118 	type = (val >> 30) & 0x3;
4119 	if (type == URTW_STATUS_TYPE_TXCLOSE) {
4120 		pktretry = val & 0xff;
4121 		seq = (val >> 16) & 0xff;
4122 		if (pktretry == URTW_TX_MAXRETRY)
4123 			ifp->if_oerrors++;
4124 		DPRINTF(sc, URTW_DEBUG_TXSTATUS, "pktretry %d seq %#x\n",
4125 		    pktretry, seq);
4126 	}
4127 }
4128 
4129 static void
4130 urtw_bulk_tx_status_callback(struct usb_xfer *xfer, usb_error_t error)
4131 {
4132 	struct urtw_softc *sc = usbd_xfer_softc(xfer);
4133 	struct ifnet *ifp = sc->sc_ifp;
4134 
4135 	URTW_ASSERT_LOCKED(sc);
4136 
4137 	switch (USB_GET_STATE(xfer)) {
4138 	case USB_ST_TRANSFERRED:
4139 		urtw_txstatus_eof(xfer);
4140 		/* FALLTHROUGH */
4141 	case USB_ST_SETUP:
4142 setup:
4143 		usbd_xfer_set_frame_data(xfer, 0, &sc->sc_txstatus,
4144 		    sizeof(int64_t));
4145 		usbd_transfer_submit(xfer);
4146 		break;
4147 	default:
4148 		if (error != USB_ERR_CANCELLED) {
4149 			usbd_xfer_set_stall(xfer);
4150 			ifp->if_ierrors++;
4151 			goto setup;
4152 		}
4153 		break;
4154 	}
4155 }
4156 
4157 static void
4158 urtw_txeof(struct usb_xfer *xfer, struct urtw_data *data)
4159 {
4160 	struct urtw_softc *sc = usbd_xfer_softc(xfer);
4161 	struct ifnet *ifp = sc->sc_ifp;
4162 	struct mbuf *m;
4163 
4164 	URTW_ASSERT_LOCKED(sc);
4165 
4166 	/*
4167 	 * Do any tx complete callback.  Note this must be done before releasing
4168 	 * the node reference.
4169 	 */
4170 	if (data->m) {
4171 		m = data->m;
4172 		if (m->m_flags & M_TXCB) {
4173 			/* XXX status? */
4174 			ieee80211_process_callback(data->ni, m, 0);
4175 		}
4176 		m_freem(m);
4177 		data->m = NULL;
4178 	}
4179 	if (data->ni) {
4180 		ieee80211_free_node(data->ni);
4181 		data->ni = NULL;
4182 	}
4183 	sc->sc_txtimer = 0;
4184 	ifp->if_opackets++;
4185 	ifp->if_drv_flags &= ~IFF_DRV_OACTIVE;
4186 }
4187 
4188 static void
4189 urtw_bulk_tx_callback(struct usb_xfer *xfer, usb_error_t error)
4190 {
4191 	struct urtw_softc *sc = usbd_xfer_softc(xfer);
4192 	struct ifnet *ifp = sc->sc_ifp;
4193 	struct urtw_data *data;
4194 
4195 	URTW_ASSERT_LOCKED(sc);
4196 
4197 	switch (USB_GET_STATE(xfer)) {
4198 	case USB_ST_TRANSFERRED:
4199 		data = STAILQ_FIRST(&sc->sc_tx_active);
4200 		if (data == NULL)
4201 			goto setup;
4202 		STAILQ_REMOVE_HEAD(&sc->sc_tx_active, next);
4203 		urtw_txeof(xfer, data);
4204 		STAILQ_INSERT_TAIL(&sc->sc_tx_inactive, data, next);
4205 		/* FALLTHROUGH */
4206 	case USB_ST_SETUP:
4207 setup:
4208 		data = STAILQ_FIRST(&sc->sc_tx_pending);
4209 		if (data == NULL) {
4210 			DPRINTF(sc, URTW_DEBUG_XMIT,
4211 			    "%s: empty pending queue\n", __func__);
4212 			return;
4213 		}
4214 		STAILQ_REMOVE_HEAD(&sc->sc_tx_pending, next);
4215 		STAILQ_INSERT_TAIL(&sc->sc_tx_active, data, next);
4216 
4217 		usbd_xfer_set_frame_data(xfer, 0, data->buf, data->buflen);
4218 		usbd_transfer_submit(xfer);
4219 
4220 		URTW_UNLOCK(sc);
4221 		urtw_start(ifp);
4222 		URTW_LOCK(sc);
4223 		break;
4224 	default:
4225 		data = STAILQ_FIRST(&sc->sc_tx_active);
4226 		if (data == NULL)
4227 			goto setup;
4228 		if (data->ni != NULL) {
4229 			ieee80211_free_node(data->ni);
4230 			data->ni = NULL;
4231 			ifp->if_oerrors++;
4232 		}
4233 		if (error != USB_ERR_CANCELLED) {
4234 			usbd_xfer_set_stall(xfer);
4235 			goto setup;
4236 		}
4237 		break;
4238 	}
4239 }
4240 
4241 static struct urtw_data *
4242 _urtw_getbuf(struct urtw_softc *sc)
4243 {
4244 	struct urtw_data *bf;
4245 
4246 	bf = STAILQ_FIRST(&sc->sc_tx_inactive);
4247 	if (bf != NULL)
4248 		STAILQ_REMOVE_HEAD(&sc->sc_tx_inactive, next);
4249 	else
4250 		bf = NULL;
4251 	if (bf == NULL)
4252 		DPRINTF(sc, URTW_DEBUG_XMIT, "%s: %s\n", __func__,
4253 		    "out of xmit buffers");
4254 	return (bf);
4255 }
4256 
4257 static struct urtw_data *
4258 urtw_getbuf(struct urtw_softc *sc)
4259 {
4260 	struct urtw_data *bf;
4261 
4262 	URTW_ASSERT_LOCKED(sc);
4263 
4264 	bf = _urtw_getbuf(sc);
4265 	if (bf == NULL) {
4266 		struct ifnet *ifp = sc->sc_ifp;
4267 
4268 		DPRINTF(sc, URTW_DEBUG_XMIT, "%s: stop queue\n", __func__);
4269 		ifp->if_drv_flags |= IFF_DRV_OACTIVE;
4270 	}
4271 	return (bf);
4272 }
4273 
4274 static int
4275 urtw_isbmode(uint16_t rate)
4276 {
4277 
4278 	return ((rate <= 22 && rate != 12 && rate != 18) ||
4279 	    rate == 44) ? (1) : (0);
4280 }
4281 
4282 static uint16_t
4283 urtw_rate2dbps(uint16_t rate)
4284 {
4285 
4286 	switch(rate) {
4287 	case 12:
4288 	case 18:
4289 	case 24:
4290 	case 36:
4291 	case 48:
4292 	case 72:
4293 	case 96:
4294 	case 108:
4295 		return (rate * 2);
4296 	default:
4297 		break;
4298 	}
4299 	return (24);
4300 }
4301 
4302 static int
4303 urtw_compute_txtime(uint16_t framelen, uint16_t rate,
4304     uint8_t ismgt, uint8_t isshort)
4305 {
4306 	uint16_t     ceiling, frametime, n_dbps;
4307 
4308 	if (urtw_isbmode(rate)) {
4309 		if (ismgt || !isshort || rate == 2)
4310 			frametime = (uint16_t)(144 + 48 +
4311 			    (framelen * 8 / (rate / 2)));
4312 		else
4313 			frametime = (uint16_t)(72 + 24 +
4314 			    (framelen * 8 / (rate / 2)));
4315 		if ((framelen * 8 % (rate / 2)) != 0)
4316 			frametime++;
4317 	} else {
4318 		n_dbps = urtw_rate2dbps(rate);
4319 		ceiling = (16 + 8 * framelen + 6) / n_dbps
4320 		    + (((16 + 8 * framelen + 6) % n_dbps) ? 1 : 0);
4321 		frametime = (uint16_t)(16 + 4 + 4 * ceiling + 6);
4322 	}
4323 	return (frametime);
4324 }
4325 
4326 /*
4327  * Callback from the 802.11 layer to update the
4328  * slot time based on the current setting.
4329  */
4330 static void
4331 urtw_updateslot(struct ifnet *ifp)
4332 {
4333 	struct urtw_softc *sc = ifp->if_softc;
4334 	struct ieee80211com *ic = ifp->if_l2com;
4335 
4336 	ieee80211_runtask(ic, &sc->sc_updateslot_task);
4337 }
4338 
4339 static void
4340 urtw_updateslottask(void *arg, int pending)
4341 {
4342 	struct urtw_softc *sc = arg;
4343 	struct ifnet *ifp = sc->sc_ifp;
4344 	struct ieee80211com *ic = ifp->if_l2com;
4345 	int error;
4346 
4347 	if ((ifp->if_drv_flags & IFF_DRV_RUNNING) == 0)
4348 		return;
4349 
4350 	URTW_LOCK(sc);
4351 	if (sc->sc_flags & URTW_RTL8187B) {
4352 		urtw_write8_m(sc, URTW_SIFS, 0x22);
4353 		if (IEEE80211_IS_CHAN_ANYG(ic->ic_curchan))
4354 			urtw_write8_m(sc, URTW_SLOT, 0x9);
4355 		else
4356 			urtw_write8_m(sc, URTW_SLOT, 0x14);
4357 		urtw_write8_m(sc, URTW_8187B_EIFS, 0x5b);
4358 		urtw_write8_m(sc, URTW_CARRIER_SCOUNT, 0x5b);
4359 	} else {
4360 		urtw_write8_m(sc, URTW_SIFS, 0x22);
4361 		if (sc->sc_state == IEEE80211_S_ASSOC &&
4362 		    ic->ic_flags & IEEE80211_F_SHSLOT)
4363 			urtw_write8_m(sc, URTW_SLOT, 0x9);
4364 		else
4365 			urtw_write8_m(sc, URTW_SLOT, 0x14);
4366 		if (IEEE80211_IS_CHAN_ANYG(ic->ic_curchan)) {
4367 			urtw_write8_m(sc, URTW_DIFS, 0x14);
4368 			urtw_write8_m(sc, URTW_EIFS, 0x5b - 0x14);
4369 			urtw_write8_m(sc, URTW_CW_VAL, 0x73);
4370 		} else {
4371 			urtw_write8_m(sc, URTW_DIFS, 0x24);
4372 			urtw_write8_m(sc, URTW_EIFS, 0x5b - 0x24);
4373 			urtw_write8_m(sc, URTW_CW_VAL, 0xa5);
4374 		}
4375 	}
4376 fail:
4377 	URTW_UNLOCK(sc);
4378 }
4379 
4380 static void
4381 urtw_sysctl_node(struct urtw_softc *sc)
4382 {
4383 #define	URTW_SYSCTL_STAT_ADD32(c, h, n, p, d)	\
4384 	SYSCTL_ADD_UINT(c, h, OID_AUTO, n, CTLFLAG_RD, p, 0, d)
4385 	struct sysctl_ctx_list *ctx;
4386 	struct sysctl_oid_list *child, *parent;
4387 	struct sysctl_oid *tree;
4388 	struct urtw_stats *stats = &sc->sc_stats;
4389 
4390 	ctx = device_get_sysctl_ctx(sc->sc_dev);
4391 	child = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->sc_dev));
4392 
4393 	tree = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats", CTLFLAG_RD,
4394 	    NULL, "URTW statistics");
4395 	parent = SYSCTL_CHILDREN(tree);
4396 
4397 	/* Tx statistics. */
4398 	tree = SYSCTL_ADD_NODE(ctx, parent, OID_AUTO, "tx", CTLFLAG_RD,
4399 	    NULL, "Tx MAC statistics");
4400 	child = SYSCTL_CHILDREN(tree);
4401 	URTW_SYSCTL_STAT_ADD32(ctx, child, "1m", &stats->txrates[0],
4402 	    "1 Mbit/s");
4403 	URTW_SYSCTL_STAT_ADD32(ctx, child, "2m", &stats->txrates[1],
4404 	    "2 Mbit/s");
4405 	URTW_SYSCTL_STAT_ADD32(ctx, child, "5.5m", &stats->txrates[2],
4406 	    "5.5 Mbit/s");
4407 	URTW_SYSCTL_STAT_ADD32(ctx, child, "6m", &stats->txrates[4],
4408 	    "6 Mbit/s");
4409 	URTW_SYSCTL_STAT_ADD32(ctx, child, "9m", &stats->txrates[5],
4410 	    "9 Mbit/s");
4411 	URTW_SYSCTL_STAT_ADD32(ctx, child, "11m", &stats->txrates[3],
4412 	    "11 Mbit/s");
4413 	URTW_SYSCTL_STAT_ADD32(ctx, child, "12m", &stats->txrates[6],
4414 	    "12 Mbit/s");
4415 	URTW_SYSCTL_STAT_ADD32(ctx, child, "18m", &stats->txrates[7],
4416 	    "18 Mbit/s");
4417 	URTW_SYSCTL_STAT_ADD32(ctx, child, "24m", &stats->txrates[8],
4418 	    "24 Mbit/s");
4419 	URTW_SYSCTL_STAT_ADD32(ctx, child, "36m", &stats->txrates[9],
4420 	    "36 Mbit/s");
4421 	URTW_SYSCTL_STAT_ADD32(ctx, child, "48m", &stats->txrates[10],
4422 	    "48 Mbit/s");
4423 	URTW_SYSCTL_STAT_ADD32(ctx, child, "54m", &stats->txrates[11],
4424 	    "54 Mbit/s");
4425 #undef URTW_SYSCTL_STAT_ADD32
4426 }
4427 
4428 static device_method_t urtw_methods[] = {
4429 	DEVMETHOD(device_probe, urtw_match),
4430 	DEVMETHOD(device_attach, urtw_attach),
4431 	DEVMETHOD(device_detach, urtw_detach),
4432 	{ 0, 0 }
4433 };
4434 static driver_t urtw_driver = {
4435 	"urtw",
4436 	urtw_methods,
4437 	sizeof(struct urtw_softc)
4438 };
4439 static devclass_t urtw_devclass;
4440 
4441 DRIVER_MODULE(urtw, uhub, urtw_driver, urtw_devclass, NULL, 0);
4442 MODULE_DEPEND(urtw, wlan, 1, 1, 1);
4443 MODULE_DEPEND(urtw, usb, 1, 1, 1);
4444