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