xref: /netbsd-src/sys/dev/usb/if_urtw.c (revision a4ddc2c8fb9af816efe3b1c375a5530aef0e89e9)
1 /*	$NetBSD: if_urtw.c,v 1.5 2013/01/22 12:40:43 jmcneill Exp $	*/
2 /*	$OpenBSD: if_urtw.c,v 1.39 2011/07/03 15:47:17 matthew Exp $	*/
3 
4 /*-
5  * Copyright (c) 2009 Martynas Venckus <martynas@openbsd.org>
6  * Copyright (c) 2008 Weongyo Jeong <weongyo@FreeBSD.org>
7  *
8  * Permission to use, copy, modify, and distribute this software for any
9  * purpose with or without fee is hereby granted, provided that the above
10  * copyright notice and this permission notice appear in all copies.
11  *
12  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19  */
20 
21 #include <sys/cdefs.h>
22 __KERNEL_RCSID(0, "$NetBSD: if_urtw.c,v 1.5 2013/01/22 12:40:43 jmcneill Exp $");
23 
24 #include <sys/param.h>
25 #include <sys/sockio.h>
26 #include <sys/proc.h>
27 #include <sys/mbuf.h>
28 #include <sys/kernel.h>
29 #include <sys/socket.h>
30 #include <sys/systm.h>
31 #include <sys/malloc.h>
32 #include <sys/callout.h>
33 #include <sys/conf.h>
34 #include <sys/device.h>
35 #include <sys/module.h>
36 #include <sys/bus.h>
37 
38 #include <machine/endian.h>
39 #include <net/bpf.h>
40 #include <net/if.h>
41 #include <net/if_arp.h>
42 #include <net/if_dl.h>
43 #include <net/if_ether.h>
44 #include <net/if_media.h>
45 #include <net/if_types.h>
46 
47 #include <netinet/in.h>
48 #include <netinet/in_systm.h>
49 #include <netinet/in_var.h>
50 #include <netinet/if_inarp.h>
51 #include <netinet/ip.h>
52 
53 #include <net80211/ieee80211_var.h>
54 #include <net80211/ieee80211_radiotap.h>
55 
56 #include <dev/usb/usb.h>
57 #include <dev/usb/usbdi.h>
58 #include <dev/usb/usbdi_util.h>
59 #include <dev/usb/usbdivar.h>
60 #include <dev/usb/usbdevs.h>
61 
62 #include "if_urtwreg.h"
63 
64 #ifdef URTW_DEBUG
65 #define	DPRINTF(x)	do { if (urtw_debug) printf x; } while (0)
66 #define	DPRINTFN(n, x)	do { if (urtw_debug >= (n)) printf x; } while (0)
67 int urtw_debug = 0;
68 #else
69 #define	DPRINTF(x)
70 #define	DPRINTFN(n, x)
71 #endif
72 
73 /*
74  * Recognized device vendors/products.
75  */
76 static const struct urtw_type {
77 	struct usb_devno	dev;
78 	uint8_t			rev;
79 } urtw_devs[] = {
80 #define	URTW_DEV_RTL8187(v, p)	\
81 	    { { USB_VENDOR_##v, USB_PRODUCT_##v##_##p }, URTW_HWREV_8187 }
82 #define	URTW_DEV_RTL8187B(v, p)	\
83 	    { { USB_VENDOR_##v, USB_PRODUCT_##v##_##p }, URTW_HWREV_8187B }
84 	/* Realtek RTL8187 devices. */
85 	URTW_DEV_RTL8187(ASUSTEK,	P5B_WIFI),
86 	URTW_DEV_RTL8187(DICKSMITH,	RTL8187),
87 	URTW_DEV_RTL8187(LINKSYS4,	WUSB54GC_2),
88 	URTW_DEV_RTL8187(LOGITEC,	RTL8187),
89 	URTW_DEV_RTL8187(NETGEAR,	WG111V2),
90 	URTW_DEV_RTL8187(REALTEK,	RTL8187),
91 	URTW_DEV_RTL8187(SITECOMEU,	WL168V1),
92 	URTW_DEV_RTL8187(SPHAIRON,	RTL8187),
93 	URTW_DEV_RTL8187(SURECOM,	EP9001G2A),
94 	/* Realtek RTL8187B devices. */
95 	URTW_DEV_RTL8187B(BELKIN,	F5D7050E),
96 	URTW_DEV_RTL8187B(NETGEAR,	WG111V3),
97 	URTW_DEV_RTL8187B(REALTEK,	RTL8187B_0),
98 	URTW_DEV_RTL8187B(REALTEK,	RTL8187B_1),
99 	URTW_DEV_RTL8187B(REALTEK,	RTL8187B_2),
100 	URTW_DEV_RTL8187B(SITECOMEU,	WL168V4)
101 #undef	URTW_DEV_RTL8187
102 #undef	URTW_DEV_RTL8187B
103 };
104 #define	urtw_lookup(v, p)	\
105 	    ((const struct urtw_type *)usb_lookup(urtw_devs, v, p))
106 
107 /*
108  * Helper read/write macros.
109  */
110 #define urtw_read8_m(sc, val, data)	do {			\
111 	error = urtw_read8_c(sc, val, data, 0);			\
112 	if (error != 0)						\
113 		goto fail;					\
114 } while (0)
115 #define urtw_read8_idx_m(sc, val, data, idx)	do {		\
116 	error = urtw_read8_c(sc, val, data, idx);		\
117 	if (error != 0)						\
118 		goto fail;					\
119 } while (0)
120 #define urtw_write8_m(sc, val, data)	do {			\
121 	error = urtw_write8_c(sc, val, data, 0);		\
122 	if (error != 0)						\
123 		goto fail;					\
124 } while (0)
125 #define urtw_write8_idx_m(sc, val, data, idx)	do {		\
126 	error = urtw_write8_c(sc, val, data, idx);		\
127 	if (error != 0)						\
128 		goto fail;					\
129 } while (0)
130 #define urtw_read16_m(sc, val, data)	do {			\
131 	error = urtw_read16_c(sc, val, data, 0);		\
132 	if (error != 0)						\
133 		goto fail;					\
134 } while (0)
135 #define urtw_read16_idx_m(sc, val, data, idx)	do {		\
136 	error = urtw_read16_c(sc, val, data, idx);		\
137 	if (error != 0)						\
138 		goto fail;					\
139 } while (0)
140 #define urtw_write16_m(sc, val, data)	do {			\
141 	error = urtw_write16_c(sc, val, data, 0);		\
142 	if (error != 0)						\
143 		goto fail;					\
144 } while (0)
145 #define urtw_write16_idx_m(sc, val, data, idx)	do {		\
146 	error = urtw_write16_c(sc, val, data, idx);		\
147 	if (error != 0)						\
148 		goto fail;					\
149 } while (0)
150 #define urtw_read32_m(sc, val, data)	do {			\
151 	error = urtw_read32_c(sc, val, data, 0);		\
152 	if (error != 0)						\
153 		goto fail;					\
154 } while (0)
155 #define urtw_read32_idx_m(sc, val, data, idx)	do {		\
156 	error = urtw_read32_c(sc, val, data, idx);		\
157 	if (error != 0)						\
158 		goto fail;					\
159 } while (0)
160 #define urtw_write32_m(sc, val, data)	do {			\
161 	error = urtw_write32_c(sc, val, data, 0);		\
162 	if (error != 0)						\
163 		goto fail;					\
164 } while (0)
165 #define urtw_write32_idx_m(sc, val, data, idx)	do {		\
166 	error = urtw_write32_c(sc, val, data, idx);		\
167 	if (error != 0)						\
168 		goto fail;					\
169 } while (0)
170 #define urtw_8187_write_phy_ofdm(sc, val, data)	do {		\
171 	error = urtw_8187_write_phy_ofdm_c(sc, val, data);	\
172 	if (error != 0)						\
173 		goto fail;					\
174 } while (0)
175 #define urtw_8187_write_phy_cck(sc, val, data)	do {		\
176 	error = urtw_8187_write_phy_cck_c(sc, val, data);	\
177 	if (error != 0)						\
178 		goto fail;					\
179 } while (0)
180 #define urtw_8225_write(sc, val, data)	do {			\
181 	error = urtw_8225_write_c(sc, val, data);		\
182 	if (error != 0)						\
183 		goto fail;					\
184 } while (0)
185 
186 struct urtw_pair {
187 	uint32_t	reg;
188 	uint32_t	val;
189 };
190 
191 struct urtw_pair_idx {
192 	uint8_t		reg;
193 	uint8_t		val;
194 	uint8_t		idx;
195 };
196 
197 static struct urtw_pair_idx urtw_8187b_regtbl[] = {
198 	{ 0xf0, 0x32, 0 }, { 0xf1, 0x32, 0 }, { 0xf2, 0x00, 0 },
199 	{ 0xf3, 0x00, 0 }, { 0xf4, 0x32, 0 }, { 0xf5, 0x43, 0 },
200 	{ 0xf6, 0x00, 0 }, { 0xf7, 0x00, 0 }, { 0xf8, 0x46, 0 },
201 	{ 0xf9, 0xa4, 0 }, { 0xfa, 0x00, 0 }, { 0xfb, 0x00, 0 },
202 	{ 0xfc, 0x96, 0 }, { 0xfd, 0xa4, 0 }, { 0xfe, 0x00, 0 },
203 	{ 0xff, 0x00, 0 },
204 
205 	{ 0x58, 0x4b, 1 }, { 0x59, 0x00, 1 }, { 0x5a, 0x4b, 1 },
206 	{ 0x5b, 0x00, 1 }, { 0x60, 0x4b, 1 }, { 0x61, 0x09, 1 },
207 	{ 0x62, 0x4b, 1 }, { 0x63, 0x09, 1 }, { 0xce, 0x0f, 1 },
208 	{ 0xcf, 0x00, 1 }, { 0xe0, 0xff, 1 }, { 0xe1, 0x0f, 1 },
209 	{ 0xe2, 0x00, 1 }, { 0xf0, 0x4e, 1 }, { 0xf1, 0x01, 1 },
210 	{ 0xf2, 0x02, 1 }, { 0xf3, 0x03, 1 }, { 0xf4, 0x04, 1 },
211 	{ 0xf5, 0x05, 1 }, { 0xf6, 0x06, 1 }, { 0xf7, 0x07, 1 },
212 	{ 0xf8, 0x08, 1 },
213 
214 	{ 0x4e, 0x00, 2 }, { 0x0c, 0x04, 2 }, { 0x21, 0x61, 2 },
215 	{ 0x22, 0x68, 2 }, { 0x23, 0x6f, 2 }, { 0x24, 0x76, 2 },
216 	{ 0x25, 0x7d, 2 }, { 0x26, 0x84, 2 }, { 0x27, 0x8d, 2 },
217 	{ 0x4d, 0x08, 2 }, { 0x50, 0x05, 2 }, { 0x51, 0xf5, 2 },
218 	{ 0x52, 0x04, 2 }, { 0x53, 0xa0, 2 }, { 0x54, 0x1f, 2 },
219 	{ 0x55, 0x23, 2 }, { 0x56, 0x45, 2 }, { 0x57, 0x67, 2 },
220 	{ 0x58, 0x08, 2 }, { 0x59, 0x08, 2 }, { 0x5a, 0x08, 2 },
221 	{ 0x5b, 0x08, 2 }, { 0x60, 0x08, 2 }, { 0x61, 0x08, 2 },
222 	{ 0x62, 0x08, 2 }, { 0x63, 0x08, 2 }, { 0x64, 0xcf, 2 },
223 	{ 0x72, 0x56, 2 }, { 0x73, 0x9a, 2 },
224 
225 	{ 0x34, 0xf0, 0 }, { 0x35, 0x0f, 0 }, { 0x5b, 0x40, 0 },
226 	{ 0x84, 0x88, 0 }, { 0x85, 0x24, 0 }, { 0x88, 0x54, 0 },
227 	{ 0x8b, 0xb8, 0 }, { 0x8c, 0x07, 0 }, { 0x8d, 0x00, 0 },
228 	{ 0x94, 0x1b, 0 }, { 0x95, 0x12, 0 }, { 0x96, 0x00, 0 },
229 	{ 0x97, 0x06, 0 }, { 0x9d, 0x1a, 0 }, { 0x9f, 0x10, 0 },
230 	{ 0xb4, 0x22, 0 }, { 0xbe, 0x80, 0 }, { 0xdb, 0x00, 0 },
231 	{ 0xee, 0x00, 0 }, { 0x91, 0x03, 0 },
232 
233 	{ 0x4c, 0x00, 2 }, { 0x9f, 0x00, 3 }, { 0x8c, 0x01, 0 },
234 	{ 0x8d, 0x10, 0 }, { 0x8e, 0x08, 0 }, { 0x8f, 0x00, 0 }
235 };
236 
237 static uint8_t urtw_8225_agc[] = {
238 	0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9d, 0x9c, 0x9b,
239 	0x9a, 0x99, 0x98, 0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90,
240 	0x8f, 0x8e, 0x8d, 0x8c, 0x8b, 0x8a, 0x89, 0x88, 0x87, 0x86, 0x85,
241 	0x84, 0x83, 0x82, 0x81, 0x80, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a,
242 	0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30, 0x2f,
243 	0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26, 0x25, 0x24,
244 	0x23, 0x22, 0x21, 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19,
245 	0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e,
246 	0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03,
247 	0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
248 	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
249 	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
250 };
251 
252 static uint32_t urtw_8225_channel[] = {
253 	0x0000,		/* dummy channel 0 */
254 	0x085c,		/* 1 */
255 	0x08dc,		/* 2 */
256 	0x095c,		/* 3 */
257 	0x09dc,		/* 4 */
258 	0x0a5c,		/* 5 */
259 	0x0adc,		/* 6 */
260 	0x0b5c,		/* 7 */
261 	0x0bdc,		/* 8 */
262 	0x0c5c,		/* 9 */
263 	0x0cdc,		/* 10 */
264 	0x0d5c,		/* 11 */
265 	0x0ddc,		/* 12 */
266 	0x0e5c,		/* 13 */
267 	0x0f72,		/* 14 */
268 };
269 
270 static uint8_t urtw_8225_gain[] = {
271 	0x23, 0x88, 0x7c, 0xa5,		/* -82dbm */
272 	0x23, 0x88, 0x7c, 0xb5,		/* -82dbm */
273 	0x23, 0x88, 0x7c, 0xc5,		/* -82dbm */
274 	0x33, 0x80, 0x79, 0xc5,		/* -78dbm */
275 	0x43, 0x78, 0x76, 0xc5,		/* -74dbm */
276 	0x53, 0x60, 0x73, 0xc5,		/* -70dbm */
277 	0x63, 0x58, 0x70, 0xc5,		/* -66dbm */
278 };
279 
280 static struct urtw_pair urtw_8225_rf_part1[] = {
281 	{ 0x00, 0x0067 }, { 0x01, 0x0fe0 }, { 0x02, 0x044d }, { 0x03, 0x0441 },
282 	{ 0x04, 0x0486 }, { 0x05, 0x0bc0 }, { 0x06, 0x0ae6 }, { 0x07, 0x082a },
283 	{ 0x08, 0x001f }, { 0x09, 0x0334 }, { 0x0a, 0x0fd4 }, { 0x0b, 0x0391 },
284 	{ 0x0c, 0x0050 }, { 0x0d, 0x06db }, { 0x0e, 0x0029 }, { 0x0f, 0x0914 }
285 };
286 
287 static struct urtw_pair urtw_8225_rf_part2[] = {
288 	{ 0x00, 0x01 }, { 0x01, 0x02 }, { 0x02, 0x42 }, { 0x03, 0x00 },
289 	{ 0x04, 0x00 }, { 0x05, 0x00 }, { 0x06, 0x40 }, { 0x07, 0x00 },
290 	{ 0x08, 0x40 }, { 0x09, 0xfe }, { 0x0a, 0x09 }, { 0x0b, 0x80 },
291 	{ 0x0c, 0x01 }, { 0x0e, 0xd3 }, { 0x0f, 0x38 }, { 0x10, 0x84 },
292 	{ 0x11, 0x06 }, { 0x12, 0x20 }, { 0x13, 0x20 }, { 0x14, 0x00 },
293 	{ 0x15, 0x40 }, { 0x16, 0x00 }, { 0x17, 0x40 }, { 0x18, 0xef },
294 	{ 0x19, 0x19 }, { 0x1a, 0x20 }, { 0x1b, 0x76 }, { 0x1c, 0x04 },
295 	{ 0x1e, 0x95 }, { 0x1f, 0x75 }, { 0x20, 0x1f }, { 0x21, 0x27 },
296 	{ 0x22, 0x16 }, { 0x24, 0x46 }, { 0x25, 0x20 }, { 0x26, 0x90 },
297 	{ 0x27, 0x88 }
298 };
299 
300 static struct urtw_pair urtw_8225_rf_part3[] = {
301 	{ 0x00, 0x98 }, { 0x03, 0x20 }, { 0x04, 0x7e }, { 0x05, 0x12 },
302 	{ 0x06, 0xfc }, { 0x07, 0x78 }, { 0x08, 0x2e }, { 0x10, 0x9b },
303 	{ 0x11, 0x88 }, { 0x12, 0x47 }, { 0x13, 0xd0 }, { 0x19, 0x00 },
304 	{ 0x1a, 0xa0 }, { 0x1b, 0x08 }, { 0x40, 0x86 }, { 0x41, 0x8d },
305 	{ 0x42, 0x15 }, { 0x43, 0x18 }, { 0x44, 0x1f }, { 0x45, 0x1e },
306 	{ 0x46, 0x1a }, { 0x47, 0x15 }, { 0x48, 0x10 }, { 0x49, 0x0a },
307 	{ 0x4a, 0x05 }, { 0x4b, 0x02 }, { 0x4c, 0x05 }
308 };
309 
310 static uint16_t urtw_8225_rxgain[] = {
311 	0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409,
312 	0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541,
313 	0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583,
314 	0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644,
315 	0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688,
316 	0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745,
317 	0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789,
318 	0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793,
319 	0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d,
320 	0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9,
321 	0x07aa, 0x07ab, 0x07ac, 0x07ad, 0x07b0, 0x07b1, 0x07b2, 0x07b3,
322 	0x07b4, 0x07b5, 0x07b8, 0x07b9, 0x07ba, 0x07bb, 0x07bb
323 };
324 
325 static uint8_t urtw_8225_threshold[] = {
326 	0x8d, 0x8d, 0x8d, 0x8d, 0x9d, 0xad, 0xbd
327 };
328 
329 static uint8_t urtw_8225_tx_gain_cck_ofdm[] = {
330 	0x02, 0x06, 0x0e, 0x1e, 0x3e, 0x7e
331 };
332 
333 static uint8_t urtw_8225_txpwr_cck[] = {
334 	0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02,
335 	0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02,
336 	0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02,
337 	0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02,
338 	0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03,
339 	0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03
340 };
341 
342 static uint8_t urtw_8225_txpwr_cck_ch14[] = {
343 	0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00,
344 	0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00,
345 	0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00,
346 	0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00,
347 	0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00,
348 	0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00
349 };
350 
351 static uint8_t urtw_8225_txpwr_ofdm[] = {
352 	0x80, 0x90, 0xa2, 0xb5, 0xcb, 0xe4
353 };
354 
355 static uint8_t urtw_8225v2_agc[] = {
356 	0x5e, 0x5e, 0x5e, 0x5e, 0x5d, 0x5b, 0x59, 0x57,
357 	0x55, 0x53, 0x51, 0x4f, 0x4d, 0x4b, 0x49, 0x47,
358 	0x45, 0x43, 0x41, 0x3f, 0x3d, 0x3b, 0x39, 0x37,
359 	0x35, 0x33, 0x31, 0x2f, 0x2d, 0x2b, 0x29, 0x27,
360 	0x25, 0x23, 0x21, 0x1f, 0x1d, 0x1b, 0x19, 0x17,
361 	0x15, 0x13, 0x11, 0x0f, 0x0d, 0x0b, 0x09, 0x07,
362 	0x05, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
363 	0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
364 	0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19,
365 	0x19, 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26,
366 	0x26, 0x27, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2a,
367 	0x2a, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2d,
368 	0x2d, 0x2d, 0x2d, 0x2e, 0x2e, 0x2e, 0x2e, 0x2f,
369 	0x2f, 0x2f, 0x30, 0x30, 0x31, 0x31, 0x31, 0x31,
370 	0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31,
371 	0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31
372 };
373 
374 static uint8_t urtw_8225v2_ofdm[] = {
375 	0x10, 0x0d, 0x01, 0x00, 0x14, 0xfb, 0xfb, 0x60,
376 	0x00, 0x60, 0x00, 0x00, 0x00, 0x5c, 0x00, 0x00,
377 	0x40, 0x00, 0x40, 0x00, 0x00, 0x00, 0xa8, 0x26,
378 	0x32, 0x33, 0x07, 0xa5, 0x6f, 0x55, 0xc8, 0xb3,
379 	0x0a, 0xe1, 0x2c, 0x8a, 0x86, 0x83, 0x34, 0x0f,
380 	0x4f, 0x24, 0x6f, 0xc2, 0x6b, 0x40, 0x80, 0x00,
381 	0xc0, 0xc1, 0x58, 0xf1, 0x00, 0xe4, 0x90, 0x3e,
382 	0x6d, 0x3c, 0xfb, 0x07
383 };
384 
385 static uint8_t urtw_8225v2_gain_bg[] = {
386 	0x23, 0x15, 0xa5,		/* -82-1dbm */
387 	0x23, 0x15, 0xb5,		/* -82-2dbm */
388 	0x23, 0x15, 0xc5,		/* -82-3dbm */
389 	0x33, 0x15, 0xc5,		/* -78dbm */
390 	0x43, 0x15, 0xc5,		/* -74dbm */
391 	0x53, 0x15, 0xc5,		/* -70dbm */
392 	0x63, 0x15, 0xc5,		/* -66dbm */
393 };
394 
395 static struct urtw_pair urtw_8225v2_rf_part1[] = {
396 	{ 0x00, 0x02bf }, { 0x01, 0x0ee0 }, { 0x02, 0x044d }, { 0x03, 0x0441 },
397 	{ 0x04, 0x08c3 }, { 0x05, 0x0c72 }, { 0x06, 0x00e6 }, { 0x07, 0x082a },
398 	{ 0x08, 0x003f }, { 0x09, 0x0335 }, { 0x0a, 0x09d4 }, { 0x0b, 0x07bb },
399 	{ 0x0c, 0x0850 }, { 0x0d, 0x0cdf }, { 0x0e, 0x002b }, { 0x0f, 0x0114 }
400 };
401 
402 static struct urtw_pair urtw_8225v2_rf_part2[] = {
403 	{ 0x00, 0x01 }, { 0x01, 0x02 }, { 0x02, 0x42 }, { 0x03, 0x00 },
404 	{ 0x04, 0x00 }, { 0x05, 0x00 }, { 0x06, 0x40 }, { 0x07, 0x00 },
405 	{ 0x08, 0x40 }, { 0x09, 0xfe }, { 0x0a, 0x08 }, { 0x0b, 0x80 },
406 	{ 0x0c, 0x01 }, { 0x0d, 0x43 }, { 0x0e, 0xd3 }, { 0x0f, 0x38 },
407 	{ 0x10, 0x84 }, { 0x11, 0x07 }, { 0x12, 0x20 }, { 0x13, 0x20 },
408 	{ 0x14, 0x00 }, { 0x15, 0x40 }, { 0x16, 0x00 }, { 0x17, 0x40 },
409 	{ 0x18, 0xef }, { 0x19, 0x19 }, { 0x1a, 0x20 }, { 0x1b, 0x15 },
410 	{ 0x1c, 0x04 }, { 0x1d, 0xc5 }, { 0x1e, 0x95 }, { 0x1f, 0x75 },
411 	{ 0x20, 0x1f }, { 0x21, 0x17 }, { 0x22, 0x16 }, { 0x23, 0x80 },
412 	{ 0x24, 0x46 }, { 0x25, 0x00 }, { 0x26, 0x90 }, { 0x27, 0x88 }
413 };
414 
415 static struct urtw_pair urtw_8225v2_rf_part3[] = {
416 	{ 0x00, 0x98 }, { 0x03, 0x20 }, { 0x04, 0x7e }, { 0x05, 0x12 },
417 	{ 0x06, 0xfc }, { 0x07, 0x78 }, { 0x08, 0x2e }, { 0x09, 0x11 },
418 	{ 0x0a, 0x17 }, { 0x0b, 0x11 }, { 0x10, 0x9b }, { 0x11, 0x88 },
419 	{ 0x12, 0x47 }, { 0x13, 0xd0 }, { 0x19, 0x00 }, { 0x1a, 0xa0 },
420 	{ 0x1b, 0x08 }, { 0x1d, 0x00 }, { 0x40, 0x86 }, { 0x41, 0x9d },
421 	{ 0x42, 0x15 }, { 0x43, 0x18 }, { 0x44, 0x36 }, { 0x45, 0x35 },
422 	{ 0x46, 0x2e }, { 0x47, 0x25 }, { 0x48, 0x1c }, { 0x49, 0x12 },
423 	{ 0x4a, 0x09 }, { 0x4b, 0x04 }, { 0x4c, 0x05 }
424 };
425 
426 static uint16_t urtw_8225v2_rxgain[] = {
427 	0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409,
428 	0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541,
429 	0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583,
430 	0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644,
431 	0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688,
432 	0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745,
433 	0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789,
434 	0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793,
435 	0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d,
436 	0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9,
437 	0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3,
438 	0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb
439 };
440 
441 static uint8_t urtw_8225v2_tx_gain_cck_ofdm[] = {
442 	0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
443 	0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
444 	0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
445 	0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
446 	0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
447 	0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23
448 };
449 
450 static uint8_t urtw_8225v2_txpwr_cck[] = {
451 	0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04,
452 	0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03,
453 	0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03,
454 	0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03
455 };
456 
457 static uint8_t urtw_8225v2_txpwr_cck_ch14[] = {
458 	0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00,
459 	0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00,
460 	0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00,
461 	0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00
462 };
463 
464 static struct urtw_pair urtw_8225v2_b_rf[] = {
465 	{ 0x00, 0x00b7 }, { 0x01, 0x0ee0 }, { 0x02, 0x044d }, { 0x03, 0x0441 },
466 	{ 0x04, 0x08c3 }, { 0x05, 0x0c72 }, { 0x06, 0x00e6 }, { 0x07, 0x082a },
467 	{ 0x08, 0x003f }, { 0x09, 0x0335 }, { 0x0a, 0x09d4 }, { 0x0b, 0x07bb },
468 	{ 0x0c, 0x0850 }, { 0x0d, 0x0cdf }, { 0x0e, 0x002b }, { 0x0f, 0x0114 },
469 	{ 0x00, 0x01b7 }
470 };
471 
472 static struct urtw_pair urtw_ratetable[] = {
473 	{  2,  0 }, {   4,  1 }, { 11, 2 }, { 12, 4 }, { 18, 5 },
474 	{ 22,  3 }, {  24,  6 }, { 36, 7 }, { 48, 8 }, { 72, 9 },
475 	{ 96, 10 }, { 108, 11 }
476 };
477 
478 int		urtw_init(struct ifnet *);
479 void		urtw_stop(struct ifnet *, int);
480 int		urtw_ioctl(struct ifnet *, u_long, void *);
481 void		urtw_start(struct ifnet *);
482 int		urtw_alloc_rx_data_list(struct urtw_softc *);
483 void		urtw_free_rx_data_list(struct urtw_softc *);
484 int		urtw_alloc_tx_data_list(struct urtw_softc *);
485 void		urtw_free_tx_data_list(struct urtw_softc *);
486 void		urtw_rxeof(usbd_xfer_handle, usbd_private_handle,
487 		    usbd_status);
488 int		urtw_tx_start(struct urtw_softc *,
489 		    struct ieee80211_node *, struct mbuf *, int);
490 void		urtw_txeof_low(usbd_xfer_handle, usbd_private_handle,
491 		    usbd_status);
492 void		urtw_txeof_normal(usbd_xfer_handle, usbd_private_handle,
493 		    usbd_status);
494 void		urtw_next_scan(void *);
495 void		urtw_task(void *);
496 void		urtw_ledusbtask(void *);
497 void		urtw_ledtask(void *);
498 int		urtw_media_change(struct ifnet *);
499 int		urtw_newstate(struct ieee80211com *, enum ieee80211_state, int);
500 void		urtw_watchdog(struct ifnet *);
501 void		urtw_set_chan(struct urtw_softc *, struct ieee80211_channel *);
502 int		urtw_isbmode(uint16_t);
503 uint16_t	urtw_rate2rtl(int rate);
504 uint16_t	urtw_rtl2rate(int);
505 usbd_status	urtw_set_rate(struct urtw_softc *);
506 usbd_status	urtw_update_msr(struct urtw_softc *);
507 usbd_status	urtw_read8_c(struct urtw_softc *, int, uint8_t *, uint8_t);
508 usbd_status	urtw_read16_c(struct urtw_softc *, int, uint16_t *, uint8_t);
509 usbd_status	urtw_read32_c(struct urtw_softc *, int, uint32_t *, uint8_t);
510 usbd_status	urtw_write8_c(struct urtw_softc *, int, uint8_t, uint8_t);
511 usbd_status	urtw_write16_c(struct urtw_softc *, int, uint16_t, uint8_t);
512 usbd_status	urtw_write32_c(struct urtw_softc *, int, uint32_t, uint8_t);
513 usbd_status	urtw_eprom_cs(struct urtw_softc *, int);
514 usbd_status	urtw_eprom_ck(struct urtw_softc *);
515 usbd_status	urtw_eprom_sendbits(struct urtw_softc *, int16_t *,
516 		    int);
517 usbd_status	urtw_eprom_read32(struct urtw_softc *, uint32_t,
518 		    uint32_t *);
519 usbd_status	urtw_eprom_readbit(struct urtw_softc *, int16_t *);
520 usbd_status	urtw_eprom_writebit(struct urtw_softc *, int16_t);
521 usbd_status	urtw_get_macaddr(struct urtw_softc *);
522 usbd_status	urtw_get_txpwr(struct urtw_softc *);
523 usbd_status	urtw_get_rfchip(struct urtw_softc *);
524 usbd_status	urtw_led_init(struct urtw_softc *);
525 usbd_status	urtw_8185_rf_pins_enable(struct urtw_softc *);
526 usbd_status	urtw_8185_tx_antenna(struct urtw_softc *, uint8_t);
527 usbd_status	urtw_8187_write_phy(struct urtw_softc *, uint8_t, uint32_t);
528 usbd_status	urtw_8187_write_phy_ofdm_c(struct urtw_softc *, uint8_t,
529 		    uint32_t);
530 usbd_status	urtw_8187_write_phy_cck_c(struct urtw_softc *, uint8_t,
531 		    uint32_t);
532 usbd_status	urtw_8225_setgain(struct urtw_softc *, int16_t);
533 usbd_status	urtw_8225_usb_init(struct urtw_softc *);
534 usbd_status	urtw_8225_write_c(struct urtw_softc *, uint8_t, uint16_t);
535 usbd_status	urtw_8225_write_s16(struct urtw_softc *, uint8_t, int,
536 		    uint16_t);
537 usbd_status	urtw_8225_read(struct urtw_softc *, uint8_t, uint32_t *);
538 usbd_status	urtw_8225_rf_init(struct urtw_rf *);
539 usbd_status	urtw_8225_rf_set_chan(struct urtw_rf *, int);
540 usbd_status	urtw_8225_rf_set_sens(struct urtw_rf *);
541 usbd_status	urtw_8225_set_txpwrlvl(struct urtw_softc *, int);
542 usbd_status	urtw_8225v2_rf_init(struct urtw_rf *);
543 usbd_status	urtw_8225v2_rf_set_chan(struct urtw_rf *, int);
544 usbd_status	urtw_8225v2_set_txpwrlvl(struct urtw_softc *, int);
545 usbd_status	urtw_8225v2_setgain(struct urtw_softc *, int16_t);
546 usbd_status	urtw_8225_isv2(struct urtw_softc *, int *);
547 usbd_status	urtw_read8e(struct urtw_softc *, int, uint8_t *);
548 usbd_status	urtw_write8e(struct urtw_softc *, int, uint8_t);
549 usbd_status	urtw_8180_set_anaparam(struct urtw_softc *, uint32_t);
550 usbd_status	urtw_8185_set_anaparam2(struct urtw_softc *, uint32_t);
551 usbd_status	urtw_open_pipes(struct urtw_softc *);
552 usbd_status	urtw_close_pipes(struct urtw_softc *);
553 usbd_status	urtw_intr_enable(struct urtw_softc *);
554 usbd_status	urtw_intr_disable(struct urtw_softc *);
555 usbd_status	urtw_reset(struct urtw_softc *);
556 usbd_status	urtw_led_on(struct urtw_softc *, int);
557 usbd_status	urtw_led_ctl(struct urtw_softc *, int);
558 usbd_status	urtw_led_blink(struct urtw_softc *);
559 usbd_status	urtw_led_mode0(struct urtw_softc *, int);
560 usbd_status	urtw_led_mode1(struct urtw_softc *, int);
561 usbd_status	urtw_led_mode2(struct urtw_softc *, int);
562 usbd_status	urtw_led_mode3(struct urtw_softc *, int);
563 usbd_status	urtw_rx_setconf(struct urtw_softc *);
564 usbd_status	urtw_rx_enable(struct urtw_softc *);
565 usbd_status	urtw_tx_enable(struct urtw_softc *);
566 usbd_status	urtw_8187b_update_wmm(struct urtw_softc *);
567 usbd_status	urtw_8187b_reset(struct urtw_softc *);
568 int		urtw_8187b_init(struct ifnet *);
569 usbd_status	urtw_8225v2_b_config_mac(struct urtw_softc *);
570 usbd_status	urtw_8225v2_b_init_rfe(struct urtw_softc *);
571 usbd_status	urtw_8225v2_b_update_chan(struct urtw_softc *);
572 usbd_status	urtw_8225v2_b_rf_init(struct urtw_rf *);
573 usbd_status	urtw_8225v2_b_rf_set_chan(struct urtw_rf *, int);
574 usbd_status	urtw_8225v2_b_set_txpwrlvl(struct urtw_softc *, int);
575 int		urtw_set_bssid(struct urtw_softc *, const uint8_t *);
576 int		urtw_set_macaddr(struct urtw_softc *, const uint8_t *);
577 
578 int urtw_match(device_t, cfdata_t, void *);
579 void urtw_attach(device_t, device_t, void *);
580 int urtw_detach(device_t, int);
581 int urtw_activate(device_t, enum devact);
582 
583 CFATTACH_DECL_NEW(urtw, sizeof(struct urtw_softc),
584 	urtw_match,
585 	urtw_attach,
586 	urtw_detach,
587 	urtw_activate
588 );
589 
590 int
591 urtw_match(device_t parent, cfdata_t match, void *aux)
592 {
593 	struct usb_attach_arg *uaa = aux;
594 
595 	return ((urtw_lookup(uaa->vendor, uaa->product) != NULL) ?
596 	    UMATCH_VENDOR_PRODUCT : UMATCH_NONE);
597 }
598 
599 void
600 urtw_attach(device_t parent, device_t self, void *aux)
601 {
602 	struct urtw_softc *sc = device_private(self);
603 	struct usb_attach_arg *uaa = aux;
604 	struct ieee80211com *ic = &sc->sc_ic;
605 	struct ifnet *ifp = &sc->sc_if;
606 	usbd_status error;
607 	uint8_t data8;
608 	uint32_t data;
609 	int i;
610 
611 	sc->sc_dev = self;
612 	sc->sc_udev = uaa->device;
613 	sc->sc_hwrev = urtw_lookup(uaa->vendor, uaa->product)->rev;
614 
615 	printf(": ");
616 
617 	if (sc->sc_hwrev & URTW_HWREV_8187) {
618 		urtw_read32_m(sc, URTW_TX_CONF, &data);
619 		data &= URTW_TX_HWREV_MASK;
620 		switch (data) {
621 		case URTW_TX_HWREV_8187_D:
622 			sc->sc_hwrev |= URTW_HWREV_8187_D;
623 			printf("RTL8187 rev D");
624 			break;
625 		case URTW_TX_HWREV_8187B_D:
626 			/*
627 			 * Detect Realtek RTL8187B devices that use
628 			 * USB IDs of RTL8187.
629 			 */
630 			sc->sc_hwrev = URTW_HWREV_8187B | URTW_HWREV_8187B_B;
631 			printf("RTL8187B rev B (early)");
632 			break;
633 		default:
634 			sc->sc_hwrev |= URTW_HWREV_8187_B;
635 			printf("RTL8187 rev 0x%02x", data >> 25);
636 			break;
637 		}
638 	} else {
639 		/* RTL8187B hwrev register. */
640 		urtw_read8_m(sc, URTW_8187B_HWREV, &data8);
641 		switch (data8) {
642 		case URTW_8187B_HWREV_8187B_B:
643 			sc->sc_hwrev |= URTW_HWREV_8187B_B;
644 			printf("RTL8187B rev B");
645 			break;
646 		case URTW_8187B_HWREV_8187B_D:
647 			sc->sc_hwrev |= URTW_HWREV_8187B_D;
648 			printf("RTL8187B rev D");
649 			break;
650 		case URTW_8187B_HWREV_8187B_E:
651 			sc->sc_hwrev |= URTW_HWREV_8187B_E;
652 			printf("RTL8187B rev E");
653 			break;
654 		default:
655 			sc->sc_hwrev |= URTW_HWREV_8187B_B;
656 			printf("RTL8187B rev 0x%02x", data8);
657 			break;
658 		}
659 	}
660 
661 	urtw_read32_m(sc, URTW_RX, &data);
662 	sc->sc_epromtype = (data & URTW_RX_9356SEL) ? URTW_EEPROM_93C56 :
663 	    URTW_EEPROM_93C46;
664 
665 	error = urtw_get_rfchip(sc);
666 	if (error != 0)
667 		goto fail;
668 	error = urtw_get_macaddr(sc);
669 	if (error != 0)
670 		goto fail;
671 	error = urtw_get_txpwr(sc);
672 	if (error != 0)
673 		goto fail;
674 	error = urtw_led_init(sc);		/* XXX incompleted */
675 	if (error != 0)
676 		goto fail;
677 
678 	sc->sc_rts_retry = URTW_DEFAULT_RTS_RETRY;
679 	sc->sc_tx_retry = URTW_DEFAULT_TX_RETRY;
680 	sc->sc_currate = 3;
681 	/* XXX for what? */
682 	sc->sc_preamble_mode = 2;
683 
684 	usb_init_task(&sc->sc_task, urtw_task, sc, 0);
685 	usb_init_task(&sc->sc_ledtask, urtw_ledusbtask, sc, 0);
686 	callout_init(&sc->scan_to, 0);
687 	callout_setfunc(&sc->scan_to, urtw_next_scan, sc);
688 	callout_init(&sc->sc_led_ch, 0);
689 	callout_setfunc(&sc->sc_led_ch, urtw_ledtask, sc);
690 
691 	ic->ic_ifp = ifp;
692 	ic->ic_phytype = IEEE80211_T_OFDM;	/* not only, but not used */
693 	ic->ic_opmode = IEEE80211_M_STA;	/* default to BSS mode */
694 	ic->ic_state = IEEE80211_S_INIT;
695 
696 	/* set device capabilities */
697 	ic->ic_caps =
698 	    IEEE80211_C_MONITOR |	/* monitor mode supported */
699 	    IEEE80211_C_TXPMGT |	/* tx power management */
700 	    IEEE80211_C_SHPREAMBLE |	/* short preamble supported */
701 	    IEEE80211_C_SHSLOT |	/* short slot time supported */
702 	    IEEE80211_C_WEP |		/* s/w WEP */
703 	    IEEE80211_C_WPA;		/* WPA/RSN */
704 
705 	/* set supported .11b and .11g rates */
706 	ic->ic_sup_rates[IEEE80211_MODE_11B] = ieee80211_std_rateset_11b;
707 	ic->ic_sup_rates[IEEE80211_MODE_11G] = ieee80211_std_rateset_11g;
708 
709 	/* set supported .11b and .11g channels (1 through 14) */
710 	for (i = 1; i <= 14; i++) {
711 		ic->ic_channels[i].ic_freq =
712 		    ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ);
713 		ic->ic_channels[i].ic_flags =
714 		    IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM |
715 		    IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ;
716 	}
717 
718 	ifp->if_softc = sc;
719 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
720 	if (sc->sc_hwrev & URTW_HWREV_8187) {
721 		ifp->if_init = urtw_init;
722 	} else {
723 		ifp->if_init = urtw_8187b_init;
724 	}
725 	ifp->if_ioctl = urtw_ioctl;
726 	ifp->if_start = urtw_start;
727 	ifp->if_watchdog = urtw_watchdog;
728 	IFQ_SET_MAXLEN(&ifp->if_snd, IFQ_MAXLEN);
729 	IFQ_SET_READY(&ifp->if_snd);
730 	memcpy(ifp->if_xname, device_xname(self), IFNAMSIZ);
731 
732 	if_attach(ifp);
733 	ieee80211_ifattach(ic);
734 
735 	/* override state transition machine */
736 	sc->sc_newstate = ic->ic_newstate;
737 	ic->ic_newstate = urtw_newstate;
738 	ieee80211_media_init(ic, urtw_media_change, ieee80211_media_status);
739 
740 	bpf_attach2(ifp, DLT_IEEE802_11_RADIO,
741 	    sizeof(struct ieee80211_frame) + IEEE80211_RADIOTAP_HDRLEN,
742 	    &sc->sc_drvbpf);
743 
744 	sc->sc_rxtap_len = sizeof sc->sc_rxtapu;
745 	sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len);
746 	sc->sc_rxtap.wr_ihdr.it_present = htole32(URTW_RX_RADIOTAP_PRESENT);
747 
748 	sc->sc_txtap_len = sizeof sc->sc_txtapu;
749 	sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len);
750 	sc->sc_txtap.wt_ihdr.it_present = htole32(URTW_TX_RADIOTAP_PRESENT);
751 
752 	printf(", address %s\n", ether_sprintf(ic->ic_myaddr));
753 
754 	ieee80211_announce(ic);
755 
756 	return;
757 fail:
758 	printf(": %s failed!\n", __func__);
759 	sc->sc_dying = true;
760 }
761 
762 int
763 urtw_detach(device_t self, int flags)
764 {
765 	struct urtw_softc *sc = device_private(self);
766 	struct ifnet *ifp = &sc->sc_if;
767 	int s;
768 
769 	s = splusb();
770 
771 	sc->sc_dying = true;
772 
773 	callout_destroy(&sc->scan_to);
774 	callout_destroy(&sc->sc_led_ch);
775 
776 	usb_rem_task(sc->sc_udev, &sc->sc_task);
777 	usb_rem_task(sc->sc_udev, &sc->sc_ledtask);
778 
779 	if (ifp->if_softc != NULL) {
780 		bpf_detach(ifp);
781 		ieee80211_ifdetach(&sc->sc_ic);	/* free all nodes */
782 		if_detach(ifp);
783 	}
784 
785 	/* abort and free xfers */
786 	urtw_free_tx_data_list(sc);
787 	urtw_free_rx_data_list(sc);
788 	urtw_close_pipes(sc);
789 
790 	splx(s);
791 
792 	return (0);
793 }
794 
795 int
796 urtw_activate(device_t self, enum devact act)
797 {
798 	struct urtw_softc *sc = device_private(self);
799 
800 	switch (act) {
801 	case DVACT_DEACTIVATE:
802 		sc->sc_dying = true;
803 		break;
804 	}
805 
806 	return (0);
807 }
808 
809 usbd_status
810 urtw_close_pipes(struct urtw_softc *sc)
811 {
812 	usbd_status error = 0;
813 
814 	if (sc->sc_rxpipe != NULL) {
815 		error = usbd_close_pipe(sc->sc_rxpipe);
816 		if (error != 0)
817 			goto fail;
818 		sc->sc_rxpipe = NULL;
819 	}
820 	if (sc->sc_txpipe_low != NULL) {
821 		error = usbd_close_pipe(sc->sc_txpipe_low);
822 		if (error != 0)
823 			goto fail;
824 		sc->sc_txpipe_low = NULL;
825 	}
826 	if (sc->sc_txpipe_normal != NULL) {
827 		error = usbd_close_pipe(sc->sc_txpipe_normal);
828 		if (error != 0)
829 			goto fail;
830 		sc->sc_txpipe_normal = NULL;
831 	}
832 fail:
833 	return (error);
834 }
835 
836 usbd_status
837 urtw_open_pipes(struct urtw_softc *sc)
838 {
839 	usbd_status error;
840 
841 	/*
842 	 * NB: there is no way to distinguish each pipes so we need to hardcode
843 	 * pipe numbers
844 	 */
845 
846 	/* tx pipe - low priority packets */
847 	if (sc->sc_hwrev & URTW_HWREV_8187)
848 		error = usbd_open_pipe(sc->sc_iface, 0x2,
849 		    USBD_EXCLUSIVE_USE, &sc->sc_txpipe_low);
850 	else
851 		error = usbd_open_pipe(sc->sc_iface, 0x6,
852 		    USBD_EXCLUSIVE_USE, &sc->sc_txpipe_low);
853 	if (error != 0) {
854 		printf("%s: could not open Tx low pipe: %s\n",
855 		    device_xname(sc->sc_dev), usbd_errstr(error));
856 		goto fail;
857 	}
858 	/* tx pipe - normal priority packets */
859 	if (sc->sc_hwrev & URTW_HWREV_8187)
860 		error = usbd_open_pipe(sc->sc_iface, 0x3,
861 		    USBD_EXCLUSIVE_USE, &sc->sc_txpipe_normal);
862 	else
863 		error = usbd_open_pipe(sc->sc_iface, 0x7,
864 		    USBD_EXCLUSIVE_USE, &sc->sc_txpipe_normal);
865 	if (error != 0) {
866 		printf("%s: could not open Tx normal pipe: %s\n",
867 		    device_xname(sc->sc_dev), usbd_errstr(error));
868 		goto fail;
869 	}
870 	/* rx pipe */
871 	if (sc->sc_hwrev & URTW_HWREV_8187)
872 		error = usbd_open_pipe(sc->sc_iface, 0x81,
873 		    USBD_EXCLUSIVE_USE, &sc->sc_rxpipe);
874 	else
875 		error = usbd_open_pipe(sc->sc_iface, 0x83,
876 		    USBD_EXCLUSIVE_USE, &sc->sc_rxpipe);
877 	if (error != 0) {
878 		printf("%s: could not open Rx pipe: %s\n",
879 		    device_xname(sc->sc_dev), usbd_errstr(error));
880 		goto fail;
881 	}
882 
883 	return (0);
884 fail:
885 	(void)urtw_close_pipes(sc);
886 	return (error);
887 }
888 
889 int
890 urtw_alloc_rx_data_list(struct urtw_softc *sc)
891 {
892 	int i, error;
893 
894 	for (i = 0; i < URTW_RX_DATA_LIST_COUNT; i++) {
895 		struct urtw_rx_data *data = &sc->sc_rx_data[i];
896 
897 		data->sc = sc;
898 
899 		data->xfer = usbd_alloc_xfer(sc->sc_udev);
900 		if (data->xfer == NULL) {
901 			printf("%s: could not allocate rx xfer\n",
902 			    device_xname(sc->sc_dev));
903 			error = ENOMEM;
904 			goto fail;
905 		}
906 
907 		if (usbd_alloc_buffer(data->xfer, URTW_RX_MAXSIZE) == NULL) {
908 			printf("%s: could not allocate rx buffer\n",
909 			    device_xname(sc->sc_dev));
910 			error = ENOMEM;
911 			goto fail;
912 		}
913 
914 		MGETHDR(data->m, M_DONTWAIT, MT_DATA);
915 		if (data->m == NULL) {
916 			printf("%s: could not allocate rx mbuf\n",
917 			    device_xname(sc->sc_dev));
918 			error = ENOMEM;
919 			goto fail;
920 		}
921 		MCLGET(data->m, M_DONTWAIT);
922 		if (!(data->m->m_flags & M_EXT)) {
923 			printf("%s: could not allocate rx mbuf cluster\n",
924 			    device_xname(sc->sc_dev));
925 			error = ENOMEM;
926 			goto fail;
927 		}
928 		data->buf = mtod(data->m, uint8_t *);
929 	}
930 
931 	return (0);
932 
933 fail:
934 	urtw_free_rx_data_list(sc);
935 	return (error);
936 }
937 
938 void
939 urtw_free_rx_data_list(struct urtw_softc *sc)
940 {
941 	int i;
942 
943 	/* Make sure no transfers are pending. */
944 	if (sc->sc_rxpipe != NULL)
945 		usbd_abort_pipe(sc->sc_rxpipe);
946 
947 	for (i = 0; i < URTW_RX_DATA_LIST_COUNT; i++) {
948 		struct urtw_rx_data *data = &sc->sc_rx_data[i];
949 
950 		if (data->xfer != NULL) {
951 			usbd_free_xfer(data->xfer);
952 			data->xfer = NULL;
953 		}
954 		if (data->m != NULL) {
955 			m_freem(data->m);
956 			data->m = NULL;
957 		}
958 	}
959 }
960 
961 int
962 urtw_alloc_tx_data_list(struct urtw_softc *sc)
963 {
964 	int i, error;
965 
966 	for (i = 0; i < URTW_TX_DATA_LIST_COUNT; i++) {
967 		struct urtw_tx_data *data = &sc->sc_tx_data[i];
968 
969 		data->sc = sc;
970 		data->ni = NULL;
971 
972 		data->xfer = usbd_alloc_xfer(sc->sc_udev);
973 		if (data->xfer == NULL) {
974 			printf("%s: could not allocate tx xfer\n",
975 			    device_xname(sc->sc_dev));
976 			error = ENOMEM;
977 			goto fail;
978 		}
979 
980 		data->buf = usbd_alloc_buffer(data->xfer, URTW_TX_MAXSIZE);
981 		if (data->buf == NULL) {
982 			printf("%s: could not allocate tx buffer\n",
983 			    device_xname(sc->sc_dev));
984 			error = ENOMEM;
985 			goto fail;
986 		}
987 
988 		if (((unsigned long)data->buf) % 4)
989 			printf("%s: warn: unaligned buffer %p\n",
990 			    device_xname(sc->sc_dev), data->buf);
991 	}
992 
993 	return (0);
994 
995 fail:
996 	urtw_free_tx_data_list(sc);
997 	return (error);
998 }
999 
1000 void
1001 urtw_free_tx_data_list(struct urtw_softc *sc)
1002 {
1003 	int i;
1004 
1005 	/* Make sure no transfers are pending. */
1006 	if (sc->sc_txpipe_low != NULL)
1007 		usbd_abort_pipe(sc->sc_txpipe_low);
1008 	if (sc->sc_txpipe_normal != NULL)
1009 		usbd_abort_pipe(sc->sc_txpipe_normal);
1010 
1011 	for (i = 0; i < URTW_TX_DATA_LIST_COUNT; i++) {
1012 		struct urtw_tx_data *data = &sc->sc_tx_data[i];
1013 
1014 		if (data->xfer != NULL) {
1015 			usbd_free_xfer(data->xfer);
1016 			data->xfer = NULL;
1017 		}
1018 		if (data->ni != NULL) {
1019 			ieee80211_free_node(data->ni);
1020 			data->ni = NULL;
1021 		}
1022 	}
1023 }
1024 
1025 int
1026 urtw_media_change(struct ifnet *ifp)
1027 {
1028 	int error;
1029 
1030 	error = ieee80211_media_change(ifp);
1031 	if (error != ENETRESET)
1032 		return (error);
1033 
1034 	if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) ==
1035 	    (IFF_UP | IFF_RUNNING))
1036 		ifp->if_init(ifp);
1037 
1038 	return (0);
1039 }
1040 
1041 int
1042 urtw_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
1043 {
1044 	struct urtw_softc *sc = ic->ic_ifp->if_softc;
1045 
1046 	usb_rem_task(sc->sc_udev, &sc->sc_task);
1047 	callout_stop(&sc->scan_to);
1048 
1049 	/* do it in a process context */
1050 	sc->sc_state = nstate;
1051 	sc->sc_arg = arg;
1052 	usb_add_task(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER);
1053 
1054 	return (0);
1055 }
1056 
1057 usbd_status
1058 urtw_led_init(struct urtw_softc *sc)
1059 {
1060 	uint32_t rev;
1061 	usbd_status error;
1062 
1063 	urtw_read8_m(sc, URTW_PSR, &sc->sc_psr);
1064 	error = urtw_eprom_read32(sc, URTW_EPROM_SWREV, &rev);
1065 	if (error != 0)
1066 		goto fail;
1067 
1068 	switch (rev & URTW_EPROM_CID_MASK) {
1069 	case URTW_EPROM_CID_ALPHA0:
1070 		sc->sc_strategy = URTW_SW_LED_MODE1;
1071 		break;
1072 	case URTW_EPROM_CID_SERCOMM_PS:
1073 		sc->sc_strategy = URTW_SW_LED_MODE3;
1074 		break;
1075 	case URTW_EPROM_CID_HW_LED:
1076 		sc->sc_strategy = URTW_HW_LED;
1077 		break;
1078 	case URTW_EPROM_CID_RSVD0:
1079 	case URTW_EPROM_CID_RSVD1:
1080 	default:
1081 		sc->sc_strategy = URTW_SW_LED_MODE0;
1082 		break;
1083 	}
1084 
1085 	sc->sc_gpio_ledpin = URTW_LED_PIN_GPIO0;
1086 
1087 fail:
1088 	return (error);
1089 }
1090 
1091 usbd_status
1092 urtw_8225_write_s16(struct urtw_softc *sc, uint8_t addr, int index,
1093     uint16_t data)
1094 {
1095 	usb_device_request_t req;
1096 
1097 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1098 	req.bRequest = URTW_8187_SETREGS_REQ;
1099 	USETW(req.wValue, addr);
1100 	USETW(req.wIndex, index);
1101 	USETW(req.wLength, sizeof(uint16_t));
1102 
1103 	return (usbd_do_request(sc->sc_udev, &req, &data));
1104 }
1105 
1106 usbd_status
1107 urtw_8225_read(struct urtw_softc *sc, uint8_t addr, uint32_t *data)
1108 {
1109 	int i;
1110 	int16_t bit;
1111 	uint8_t rlen = 12, wlen = 6;
1112 	uint16_t o1, o2, o3, tmp;
1113 	uint32_t d2w = ((uint32_t)(addr & 0x1f)) << 27;
1114 	uint32_t mask = 0x80000000, value = 0;
1115 	usbd_status error;
1116 
1117 	urtw_read16_m(sc, URTW_RF_PINS_OUTPUT, &o1);
1118 	urtw_read16_m(sc, URTW_RF_PINS_ENABLE, &o2);
1119 	urtw_read16_m(sc, URTW_RF_PINS_SELECT, &o3);
1120 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, o2 | 0xf);
1121 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, o3 | 0xf);
1122 	o1 &= ~0xf;
1123 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_EN);
1124 	DELAY(5);
1125 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1);
1126 	DELAY(5);
1127 
1128 	for (i = 0; i < (wlen / 2); i++, mask = mask >> 1) {
1129 		bit = ((d2w & mask) != 0) ? 1 : 0;
1130 
1131 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1);
1132 		DELAY(2);
1133 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 |
1134 		    URTW_BB_HOST_BANG_CLK);
1135 		DELAY(2);
1136 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 |
1137 		    URTW_BB_HOST_BANG_CLK);
1138 		DELAY(2);
1139 		mask = mask >> 1;
1140 		if (i == 2)
1141 			break;
1142 		bit = ((d2w & mask) != 0) ? 1 : 0;
1143 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 |
1144 		    URTW_BB_HOST_BANG_CLK);
1145 		DELAY(2);
1146 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 |
1147 		    URTW_BB_HOST_BANG_CLK);
1148 		DELAY(2);
1149 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1);
1150 		DELAY(1);
1151 	}
1152 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | URTW_BB_HOST_BANG_RW |
1153 	    URTW_BB_HOST_BANG_CLK);
1154 	DELAY(2);
1155 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | URTW_BB_HOST_BANG_RW);
1156 	DELAY(2);
1157 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_RW);
1158 	DELAY(2);
1159 
1160 	mask = 0x800;
1161 	for (i = 0; i < rlen; i++, mask = mask >> 1) {
1162 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
1163 		    o1 | URTW_BB_HOST_BANG_RW);
1164 		DELAY(2);
1165 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
1166 		    o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK);
1167 		DELAY(2);
1168 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
1169 		    o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK);
1170 		DELAY(2);
1171 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
1172 		    o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK);
1173 		DELAY(2);
1174 
1175 		urtw_read16_m(sc, URTW_RF_PINS_INPUT, &tmp);
1176 		value |= ((tmp & URTW_BB_HOST_BANG_CLK) ? mask : 0);
1177 		urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
1178 		    o1 | URTW_BB_HOST_BANG_RW);
1179 		DELAY(2);
1180 	}
1181 
1182 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_EN |
1183 	    URTW_BB_HOST_BANG_RW);
1184 	DELAY(2);
1185 
1186 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, o2);
1187 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, o3);
1188 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x3a0);
1189 
1190 	if (data != NULL)
1191 		*data = value;
1192 fail:
1193 	return (error);
1194 }
1195 
1196 usbd_status
1197 urtw_8225_write_c(struct urtw_softc *sc, uint8_t addr, uint16_t data)
1198 {
1199 	uint16_t d80, d82, d84;
1200 	usbd_status error;
1201 
1202 	urtw_read16_m(sc, URTW_RF_PINS_OUTPUT, &d80);
1203 	d80 &= 0xfff3;
1204 	urtw_read16_m(sc, URTW_RF_PINS_ENABLE, &d82);
1205 	urtw_read16_m(sc, URTW_RF_PINS_SELECT, &d84);
1206 	d84 &= 0xfff0;
1207 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, d82 | 0x0007);
1208 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, d84 | 0x0007);
1209 	DELAY(10);
1210 
1211 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN);
1212 	DELAY(2);
1213 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80);
1214 	DELAY(10);
1215 
1216 	error = urtw_8225_write_s16(sc, addr, 0x8225, data);
1217 	if (error != 0)
1218 		goto fail;
1219 
1220 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN);
1221 	DELAY(10);
1222 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN);
1223 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, d84);
1224 	usbd_delay_ms(sc->sc_udev, 2);
1225 fail:
1226 	return (error);
1227 }
1228 
1229 usbd_status
1230 urtw_8225_isv2(struct urtw_softc *sc, int *ret)
1231 {
1232 	uint32_t data;
1233 	usbd_status error;
1234 
1235 	*ret = 1;
1236 
1237 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x0080);
1238 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x0080);
1239 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x0080);
1240 	usbd_delay_ms(sc->sc_udev, 500);
1241 
1242 	urtw_8225_write(sc, 0x0, 0x1b7);
1243 
1244 	error = urtw_8225_read(sc, 0x8, &data);
1245 	if (error != 0)
1246 		goto fail;
1247 	if (data != 0x588)
1248 		*ret = 0;
1249 	else {
1250 		error = urtw_8225_read(sc, 0x9, &data);
1251 		if (error != 0)
1252 			goto fail;
1253 		if (data != 0x700)
1254 			*ret = 0;
1255 	}
1256 
1257 	urtw_8225_write(sc, 0x0, 0xb7);
1258 fail:
1259 	return (error);
1260 }
1261 
1262 usbd_status
1263 urtw_get_rfchip(struct urtw_softc *sc)
1264 {
1265 	struct urtw_rf *rf = &sc->sc_rf;
1266 	int ret;
1267 	uint32_t data;
1268 	usbd_status error;
1269 
1270 	rf->rf_sc = sc;
1271 
1272 	if (sc->sc_hwrev & URTW_HWREV_8187) {
1273 		error = urtw_eprom_read32(sc, URTW_EPROM_RFCHIPID, &data);
1274 		if (error != 0)
1275 			panic("unsupported RF chip");
1276 			/* NOTREACHED */
1277 		switch (data & 0xff) {
1278 		case URTW_EPROM_RFCHIPID_RTL8225U:
1279 			error = urtw_8225_isv2(sc, &ret);
1280 			if (error != 0)
1281 				goto fail;
1282 			if (ret == 0) {
1283 				rf->init = urtw_8225_rf_init;
1284 				rf->set_chan = urtw_8225_rf_set_chan;
1285 				rf->set_sens = urtw_8225_rf_set_sens;
1286 				printf(", RFv1");
1287 			} else {
1288 				rf->init = urtw_8225v2_rf_init;
1289 				rf->set_chan = urtw_8225v2_rf_set_chan;
1290 				rf->set_sens = NULL;
1291 				printf(", RFv2");
1292 			}
1293 			break;
1294 		default:
1295 			goto fail;
1296 		}
1297 	} else {
1298 		rf->init = urtw_8225v2_b_rf_init;
1299 		rf->set_chan = urtw_8225v2_b_rf_set_chan;
1300 		rf->set_sens = NULL;
1301 	}
1302 
1303 	rf->max_sens = URTW_8225_RF_MAX_SENS;
1304 	rf->sens = URTW_8225_RF_DEF_SENS;
1305 
1306 	return (0);
1307 
1308 fail:
1309 	panic("unsupported RF chip %d", data & 0xff);
1310 	/* NOTREACHED */
1311 }
1312 
1313 usbd_status
1314 urtw_get_txpwr(struct urtw_softc *sc)
1315 {
1316 	int i, j;
1317 	uint32_t data;
1318 	usbd_status error;
1319 
1320 	error = urtw_eprom_read32(sc, URTW_EPROM_TXPW_BASE, &data);
1321 	if (error != 0)
1322 		goto fail;
1323 	sc->sc_txpwr_cck_base = data & 0xf;
1324 	sc->sc_txpwr_ofdm_base = (data >> 4) & 0xf;
1325 
1326 	for (i = 1, j = 0; i < 6; i += 2, j++) {
1327 		error = urtw_eprom_read32(sc, URTW_EPROM_TXPW0 + j, &data);
1328 		if (error != 0)
1329 			goto fail;
1330 		sc->sc_txpwr_cck[i] = data & 0xf;
1331 		sc->sc_txpwr_cck[i + 1] = (data & 0xf00) >> 8;
1332 		sc->sc_txpwr_ofdm[i] = (data & 0xf0) >> 4;
1333 		sc->sc_txpwr_ofdm[i + 1] = (data & 0xf000) >> 12;
1334 	}
1335 	for (i = 1, j = 0; i < 4; i += 2, j++) {
1336 		error = urtw_eprom_read32(sc, URTW_EPROM_TXPW1 + j, &data);
1337 		if (error != 0)
1338 			goto fail;
1339 		sc->sc_txpwr_cck[i + 6] = data & 0xf;
1340 		sc->sc_txpwr_cck[i + 6 + 1] = (data & 0xf00) >> 8;
1341 		sc->sc_txpwr_ofdm[i + 6] = (data & 0xf0) >> 4;
1342 		sc->sc_txpwr_ofdm[i + 6 + 1] = (data & 0xf000) >> 12;
1343 	}
1344 	if (sc->sc_hwrev & URTW_HWREV_8187) {
1345 		for (i = 1, j = 0; i < 4; i += 2, j++) {
1346 			error = urtw_eprom_read32(sc, URTW_EPROM_TXPW2 + j,
1347 			    &data);
1348 			if (error != 0)
1349 				goto fail;
1350 			sc->sc_txpwr_cck[i + 6 + 4] = data & 0xf;
1351 			sc->sc_txpwr_cck[i + 6 + 4 + 1] = (data & 0xf00) >> 8;
1352 			sc->sc_txpwr_ofdm[i + 6 + 4] = (data & 0xf0) >> 4;
1353 			sc->sc_txpwr_ofdm[i + 6 + 4 + 1] =
1354 			    (data & 0xf000) >> 12;
1355 		}
1356 	} else {
1357 		/* Channel 11. */
1358 		error = urtw_eprom_read32(sc, 0x1b, &data);
1359 		if (error != 0)
1360 			goto fail;
1361 		sc->sc_txpwr_cck[11] = data & 0xf;
1362 		sc->sc_txpwr_ofdm[11] = (data & 0xf0) >> 4;
1363 
1364 		/* Channel 12. */
1365 		error = urtw_eprom_read32(sc, 0xa, &data);
1366 		if (error != 0)
1367 			goto fail;
1368 		sc->sc_txpwr_cck[12] = data & 0xf;
1369 		sc->sc_txpwr_ofdm[12] = (data & 0xf0) >> 4;
1370 
1371 		/* Channel 13, 14. */
1372 		error = urtw_eprom_read32(sc, 0x1c, &data);
1373 		if (error != 0)
1374 			goto fail;
1375 		sc->sc_txpwr_cck[13] = data & 0xf;
1376 		sc->sc_txpwr_ofdm[13] = (data & 0xf0) >> 4;
1377 		sc->sc_txpwr_cck[14] = (data & 0xf00) >> 8;
1378 		sc->sc_txpwr_ofdm[14] = (data & 0xf000) >> 12;
1379 	}
1380 fail:
1381 	return (error);
1382 }
1383 
1384 usbd_status
1385 urtw_get_macaddr(struct urtw_softc *sc)
1386 {
1387 	struct ieee80211com *ic = &sc->sc_ic;
1388 	usbd_status error;
1389 	uint32_t data;
1390 
1391 	error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR, &data);
1392 	if (error != 0)
1393 		goto fail;
1394 	ic->ic_myaddr[0] = data & 0xff;
1395 	ic->ic_myaddr[1] = (data & 0xff00) >> 8;
1396 	error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR + 1, &data);
1397 	if (error != 0)
1398 		goto fail;
1399 	ic->ic_myaddr[2] = data & 0xff;
1400 	ic->ic_myaddr[3] = (data & 0xff00) >> 8;
1401 	error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR + 2, &data);
1402 	if (error != 0)
1403 		goto fail;
1404 	ic->ic_myaddr[4] = data & 0xff;
1405 	ic->ic_myaddr[5] = (data & 0xff00) >> 8;
1406 fail:
1407 	return (error);
1408 }
1409 
1410 usbd_status
1411 urtw_eprom_read32(struct urtw_softc *sc, uint32_t addr, uint32_t *data)
1412 {
1413 #define URTW_READCMD_LEN		3
1414 	int addrlen, i;
1415 	int16_t addrstr[8], data16, readcmd[] = { 1, 1, 0 };
1416 	usbd_status error;
1417 
1418 	/* NB: make sure the buffer is initialized */
1419 	*data = 0;
1420 
1421 	/* enable EPROM programming */
1422 	urtw_write8_m(sc, URTW_EPROM_CMD, URTW_EPROM_CMD_PROGRAM_MODE);
1423 	DELAY(URTW_EPROM_DELAY);
1424 
1425 	error = urtw_eprom_cs(sc, URTW_EPROM_ENABLE);
1426 	if (error != 0)
1427 		goto fail;
1428 	error = urtw_eprom_ck(sc);
1429 	if (error != 0)
1430 		goto fail;
1431 	error = urtw_eprom_sendbits(sc, readcmd, URTW_READCMD_LEN);
1432 	if (error != 0)
1433 		goto fail;
1434 	if (sc->sc_epromtype == URTW_EEPROM_93C56) {
1435 		addrlen = 8;
1436 		addrstr[0] = addr & (1 << 7);
1437 		addrstr[1] = addr & (1 << 6);
1438 		addrstr[2] = addr & (1 << 5);
1439 		addrstr[3] = addr & (1 << 4);
1440 		addrstr[4] = addr & (1 << 3);
1441 		addrstr[5] = addr & (1 << 2);
1442 		addrstr[6] = addr & (1 << 1);
1443 		addrstr[7] = addr & (1 << 0);
1444 	} else {
1445 		addrlen=6;
1446 		addrstr[0] = addr & (1 << 5);
1447 		addrstr[1] = addr & (1 << 4);
1448 		addrstr[2] = addr & (1 << 3);
1449 		addrstr[3] = addr & (1 << 2);
1450 		addrstr[4] = addr & (1 << 1);
1451 		addrstr[5] = addr & (1 << 0);
1452 	}
1453 	error = urtw_eprom_sendbits(sc, addrstr, addrlen);
1454 	if (error != 0)
1455 		goto fail;
1456 
1457 	error = urtw_eprom_writebit(sc, 0);
1458 	if (error != 0)
1459 		goto fail;
1460 
1461 	for (i = 0; i < 16; i++) {
1462 		error = urtw_eprom_ck(sc);
1463 		if (error != 0)
1464 			goto fail;
1465 		error = urtw_eprom_readbit(sc, &data16);
1466 		if (error != 0)
1467 			goto fail;
1468 
1469 		(*data) |= (data16 << (15 - i));
1470 	}
1471 
1472 	error = urtw_eprom_cs(sc, URTW_EPROM_DISABLE);
1473 	if (error != 0)
1474 		goto fail;
1475 	error = urtw_eprom_ck(sc);
1476 	if (error != 0)
1477 		goto fail;
1478 
1479 	/* now disable EPROM programming */
1480 	urtw_write8_m(sc, URTW_EPROM_CMD, URTW_EPROM_CMD_NORMAL_MODE);
1481 fail:
1482 	return (error);
1483 #undef URTW_READCMD_LEN
1484 }
1485 
1486 usbd_status
1487 urtw_eprom_readbit(struct urtw_softc *sc, int16_t *data)
1488 {
1489 	uint8_t data8;
1490 	usbd_status error;
1491 
1492 	urtw_read8_m(sc, URTW_EPROM_CMD, &data8);
1493 	*data = (data8 & URTW_EPROM_READBIT) ? 1 : 0;
1494 	DELAY(URTW_EPROM_DELAY);
1495 
1496 fail:
1497 	return (error);
1498 }
1499 
1500 usbd_status
1501 urtw_eprom_sendbits(struct urtw_softc *sc, int16_t *buf, int buflen)
1502 {
1503 	int i = 0;
1504 	usbd_status error = 0;
1505 
1506 	for (i = 0; i < buflen; i++) {
1507 		error = urtw_eprom_writebit(sc, buf[i]);
1508 		if (error != 0)
1509 			goto fail;
1510 		error = urtw_eprom_ck(sc);
1511 		if (error != 0)
1512 			goto fail;
1513 	}
1514 fail:
1515 	return (error);
1516 }
1517 
1518 usbd_status
1519 urtw_eprom_writebit(struct urtw_softc *sc, int16_t bit)
1520 {
1521 	uint8_t data;
1522 	usbd_status error;
1523 
1524 	urtw_read8_m(sc, URTW_EPROM_CMD, &data);
1525 	if (bit != 0)
1526 		urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_WRITEBIT);
1527 	else
1528 		urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_WRITEBIT);
1529 	DELAY(URTW_EPROM_DELAY);
1530 fail:
1531 	return (error);
1532 }
1533 
1534 usbd_status
1535 urtw_eprom_ck(struct urtw_softc *sc)
1536 {
1537 	uint8_t data;
1538 	usbd_status error;
1539 
1540 	/* masking */
1541 	urtw_read8_m(sc, URTW_EPROM_CMD, &data);
1542 	urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_CK);
1543 	DELAY(URTW_EPROM_DELAY);
1544 	/* unmasking */
1545 	urtw_read8_m(sc, URTW_EPROM_CMD, &data);
1546 	urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_CK);
1547 	DELAY(URTW_EPROM_DELAY);
1548 fail:
1549 	return (error);
1550 }
1551 
1552 usbd_status
1553 urtw_eprom_cs(struct urtw_softc *sc, int able)
1554 {
1555 	uint8_t data;
1556 	usbd_status error;
1557 
1558 	urtw_read8_m(sc, URTW_EPROM_CMD, &data);
1559 	if (able == URTW_EPROM_ENABLE)
1560 		urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_CS);
1561 	else
1562 		urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_CS);
1563 	DELAY(URTW_EPROM_DELAY);
1564 fail:
1565 	return (error);
1566 }
1567 
1568 usbd_status
1569 urtw_read8_c(struct urtw_softc *sc, int val, uint8_t *data, uint8_t idx)
1570 {
1571 	usb_device_request_t req;
1572 	usbd_status error;
1573 
1574 	req.bmRequestType = UT_READ_VENDOR_DEVICE;
1575 	req.bRequest = URTW_8187_GETREGS_REQ;
1576 	USETW(req.wValue, val | 0xff00);
1577 	USETW(req.wIndex, idx & 0x03);
1578 	USETW(req.wLength, sizeof(uint8_t));
1579 
1580 	error = usbd_do_request(sc->sc_udev, &req, data);
1581 	return (error);
1582 }
1583 
1584 usbd_status
1585 urtw_read8e(struct urtw_softc *sc, int val, uint8_t *data)
1586 {
1587 	usb_device_request_t req;
1588 	usbd_status error;
1589 
1590 	req.bmRequestType = UT_READ_VENDOR_DEVICE;
1591 	req.bRequest = URTW_8187_GETREGS_REQ;
1592 	USETW(req.wValue, val | 0xfe00);
1593 	USETW(req.wIndex, 0);
1594 	USETW(req.wLength, sizeof(uint8_t));
1595 
1596 	error = usbd_do_request(sc->sc_udev, &req, data);
1597 	return (error);
1598 }
1599 
1600 usbd_status
1601 urtw_read16_c(struct urtw_softc *sc, int val, uint16_t *data, uint8_t idx)
1602 {
1603 	usb_device_request_t req;
1604 	usbd_status error;
1605 
1606 	req.bmRequestType = UT_READ_VENDOR_DEVICE;
1607 	req.bRequest = URTW_8187_GETREGS_REQ;
1608 	USETW(req.wValue, val | 0xff00);
1609 	USETW(req.wIndex, idx & 0x03);
1610 	USETW(req.wLength, sizeof(uint16_t));
1611 
1612 	error = usbd_do_request(sc->sc_udev, &req, data);
1613 	return (error);
1614 }
1615 
1616 usbd_status
1617 urtw_read32_c(struct urtw_softc *sc, int val, uint32_t *data, uint8_t idx)
1618 {
1619 	usb_device_request_t req;
1620 	usbd_status error;
1621 
1622 	req.bmRequestType = UT_READ_VENDOR_DEVICE;
1623 	req.bRequest = URTW_8187_GETREGS_REQ;
1624 	USETW(req.wValue, val | 0xff00);
1625 	USETW(req.wIndex, idx & 0x03);
1626 	USETW(req.wLength, sizeof(uint32_t));
1627 
1628 	error = usbd_do_request(sc->sc_udev, &req, data);
1629 	return (error);
1630 }
1631 
1632 usbd_status
1633 urtw_write8_c(struct urtw_softc *sc, int val, uint8_t data, uint8_t idx)
1634 {
1635 	usb_device_request_t req;
1636 
1637 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1638 	req.bRequest = URTW_8187_SETREGS_REQ;
1639 	USETW(req.wValue, val | 0xff00);
1640 	USETW(req.wIndex, idx & 0x03);
1641 	USETW(req.wLength, sizeof(uint8_t));
1642 
1643 	return (usbd_do_request(sc->sc_udev, &req, &data));
1644 }
1645 
1646 usbd_status
1647 urtw_write8e(struct urtw_softc *sc, int val, uint8_t data)
1648 {
1649 	usb_device_request_t req;
1650 
1651 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1652 	req.bRequest = URTW_8187_SETREGS_REQ;
1653 	USETW(req.wValue, val | 0xfe00);
1654 	USETW(req.wIndex, 0);
1655 	USETW(req.wLength, sizeof(uint8_t));
1656 
1657 	return (usbd_do_request(sc->sc_udev, &req, &data));
1658 }
1659 
1660 usbd_status
1661 urtw_write16_c(struct urtw_softc *sc, int val, uint16_t data, uint8_t idx)
1662 {
1663 	usb_device_request_t req;
1664 
1665 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1666 	req.bRequest = URTW_8187_SETREGS_REQ;
1667 	USETW(req.wValue, val | 0xff00);
1668 	USETW(req.wIndex, idx & 0x03);
1669 	USETW(req.wLength, sizeof(uint16_t));
1670 
1671 	return (usbd_do_request(sc->sc_udev, &req, &data));
1672 }
1673 
1674 usbd_status
1675 urtw_write32_c(struct urtw_softc *sc, int val, uint32_t data, uint8_t idx)
1676 {
1677 	usb_device_request_t req;
1678 
1679 	req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1680 	req.bRequest = URTW_8187_SETREGS_REQ;
1681 	USETW(req.wValue, val | 0xff00);
1682 	USETW(req.wIndex, idx & 0x03);
1683 	USETW(req.wLength, sizeof(uint32_t));
1684 
1685 	return (usbd_do_request(sc->sc_udev, &req, &data));
1686 }
1687 
1688 static usbd_status
1689 urtw_set_mode(struct urtw_softc *sc, uint32_t mode)
1690 {
1691 	uint8_t data;
1692 	usbd_status error;
1693 
1694 	urtw_read8_m(sc, URTW_EPROM_CMD, &data);
1695 	data = (data & ~URTW_EPROM_CMD_MASK) | (mode << URTW_EPROM_CMD_SHIFT);
1696 	data = data & ~(URTW_EPROM_CS | URTW_EPROM_CK);
1697 	urtw_write8_m(sc, URTW_EPROM_CMD, data);
1698 fail:
1699 	return (error);
1700 }
1701 
1702 usbd_status
1703 urtw_8180_set_anaparam(struct urtw_softc *sc, uint32_t val)
1704 {
1705 	uint8_t data;
1706 	usbd_status error;
1707 
1708 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
1709 	if (error)
1710 		goto fail;
1711 
1712 	urtw_read8_m(sc, URTW_CONFIG3, &data);
1713 	urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE);
1714 	urtw_write32_m(sc, URTW_ANAPARAM, val);
1715 	urtw_read8_m(sc, URTW_CONFIG3, &data);
1716 	urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE);
1717 
1718 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
1719 	if (error)
1720 		goto fail;
1721 fail:
1722 	return (error);
1723 }
1724 
1725 usbd_status
1726 urtw_8185_set_anaparam2(struct urtw_softc *sc, uint32_t val)
1727 {
1728 	uint8_t data;
1729 	usbd_status error;
1730 
1731 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
1732 	if (error)
1733 		goto fail;
1734 
1735 	urtw_read8_m(sc, URTW_CONFIG3, &data);
1736 	urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE);
1737 	urtw_write32_m(sc, URTW_ANAPARAM2, val);
1738 	urtw_read8_m(sc, URTW_CONFIG3, &data);
1739 	urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE);
1740 
1741 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
1742 	if (error)
1743 		goto fail;
1744 fail:
1745 	return (error);
1746 }
1747 
1748 usbd_status
1749 urtw_intr_disable(struct urtw_softc *sc)
1750 {
1751 	usbd_status error;
1752 
1753 	urtw_write16_m(sc, URTW_INTR_MASK, 0);
1754 
1755 fail:
1756 	return (error);
1757 }
1758 
1759 usbd_status
1760 urtw_reset(struct urtw_softc *sc)
1761 {
1762 	uint8_t data;
1763 	usbd_status error;
1764 
1765 	error = urtw_8180_set_anaparam(sc, URTW_8187_8225_ANAPARAM_ON);
1766 	if (error)
1767 		goto fail;
1768 	error = urtw_8185_set_anaparam2(sc, URTW_8187_8225_ANAPARAM2_ON);
1769 	if (error)
1770 		goto fail;
1771 
1772 	error = urtw_intr_disable(sc);
1773 	if (error)
1774 		goto fail;
1775 	usbd_delay_ms(sc->sc_udev, 100);
1776 
1777 	error = urtw_write8e(sc, 0x18, 0x10);
1778 	if (error != 0)
1779 		goto fail;
1780 	error = urtw_write8e(sc, 0x18, 0x11);
1781 	if (error != 0)
1782 		goto fail;
1783 	error = urtw_write8e(sc, 0x18, 0x00);
1784 	if (error != 0)
1785 		goto fail;
1786 	usbd_delay_ms(sc->sc_udev, 100);
1787 
1788 	urtw_read8_m(sc, URTW_CMD, &data);
1789 	data = (data & 2) | URTW_CMD_RST;
1790 	urtw_write8_m(sc, URTW_CMD, data);
1791 	usbd_delay_ms(sc->sc_udev, 100);
1792 
1793 	urtw_read8_m(sc, URTW_CMD, &data);
1794 	if (data & URTW_CMD_RST) {
1795 		printf("%s: reset timeout\n", device_xname(sc->sc_dev));
1796 		goto fail;
1797 	}
1798 
1799 	error = urtw_set_mode(sc, URTW_EPROM_CMD_LOAD);
1800 	if (error)
1801 		goto fail;
1802 	usbd_delay_ms(sc->sc_udev, 100);
1803 
1804 	error = urtw_8180_set_anaparam(sc, URTW_8187_8225_ANAPARAM_ON);
1805 	if (error)
1806 		goto fail;
1807 	error = urtw_8185_set_anaparam2(sc, URTW_8187_8225_ANAPARAM2_ON);
1808 	if (error)
1809 		goto fail;
1810 fail:
1811 	return (error);
1812 }
1813 
1814 usbd_status
1815 urtw_led_on(struct urtw_softc *sc, int type)
1816 {
1817 	usbd_status error;
1818 
1819 	if (type == URTW_LED_GPIO) {
1820 		switch (sc->sc_gpio_ledpin) {
1821 		case URTW_LED_PIN_GPIO0:
1822 			urtw_write8_m(sc, URTW_GPIO, 0x01);
1823 			urtw_write8_m(sc, URTW_GP_ENABLE, 0x00);
1824 			break;
1825 		default:
1826 			panic("unsupported LED PIN type 0x%x",
1827 			    sc->sc_gpio_ledpin);
1828 			/* NOTREACHED */
1829 		}
1830 	} else {
1831 		panic("unsupported LED type 0x%x", type);
1832 		/* NOTREACHED */
1833 	}
1834 
1835 	sc->sc_gpio_ledon = 1;
1836 fail:
1837 	return (error);
1838 }
1839 
1840 static usbd_status
1841 urtw_led_off(struct urtw_softc *sc, int type)
1842 {
1843 	usbd_status error;
1844 
1845 	if (type == URTW_LED_GPIO) {
1846 		switch (sc->sc_gpio_ledpin) {
1847 		case URTW_LED_PIN_GPIO0:
1848 			urtw_write8_m(sc, URTW_GPIO, 0x01);
1849 			urtw_write8_m(sc, URTW_GP_ENABLE, 0x01);
1850 			break;
1851 		default:
1852 			panic("unsupported LED PIN type 0x%x",
1853 			    sc->sc_gpio_ledpin);
1854 			/* NOTREACHED */
1855 		}
1856 	} else {
1857 		panic("unsupported LED type 0x%x", type);
1858 		/* NOTREACHED */
1859 	}
1860 
1861 	sc->sc_gpio_ledon = 0;
1862 
1863 fail:
1864 	return (error);
1865 }
1866 
1867 usbd_status
1868 urtw_led_mode0(struct urtw_softc *sc, int mode)
1869 {
1870 	switch (mode) {
1871 	case URTW_LED_CTL_POWER_ON:
1872 		sc->sc_gpio_ledstate = URTW_LED_POWER_ON_BLINK;
1873 		break;
1874 	case URTW_LED_CTL_TX:
1875 		if (sc->sc_gpio_ledinprogress == 1)
1876 			return (0);
1877 
1878 		sc->sc_gpio_ledstate = URTW_LED_BLINK_NORMAL;
1879 		sc->sc_gpio_blinktime = 2;
1880 		break;
1881 	case URTW_LED_CTL_LINK:
1882 		sc->sc_gpio_ledstate = URTW_LED_ON;
1883 		break;
1884 	default:
1885 		panic("unsupported LED mode 0x%x", mode);
1886 		/* NOTREACHED */
1887 	}
1888 
1889 	switch (sc->sc_gpio_ledstate) {
1890 	case URTW_LED_ON:
1891 		if (sc->sc_gpio_ledinprogress != 0)
1892 			break;
1893 		urtw_led_on(sc, URTW_LED_GPIO);
1894 		break;
1895 	case URTW_LED_BLINK_NORMAL:
1896 		if (sc->sc_gpio_ledinprogress != 0)
1897 			break;
1898 		sc->sc_gpio_ledinprogress = 1;
1899 		sc->sc_gpio_blinkstate = (sc->sc_gpio_ledon != 0) ?
1900 			URTW_LED_OFF : URTW_LED_ON;
1901 		if (!sc->sc_dying)
1902 			callout_schedule(&sc->sc_led_ch, mstohz(100));
1903 		break;
1904 	case URTW_LED_POWER_ON_BLINK:
1905 		urtw_led_on(sc, URTW_LED_GPIO);
1906 		usbd_delay_ms(sc->sc_udev, 100);
1907 		urtw_led_off(sc, URTW_LED_GPIO);
1908 		break;
1909 	default:
1910 		panic("unknown LED status 0x%x", sc->sc_gpio_ledstate);
1911 		/* NOTREACHED */
1912 	}
1913 	return (0);
1914 }
1915 
1916 usbd_status
1917 urtw_led_mode1(struct urtw_softc *sc, int mode)
1918 {
1919 	return (USBD_INVAL);
1920 }
1921 
1922 usbd_status
1923 urtw_led_mode2(struct urtw_softc *sc, int mode)
1924 {
1925 	return (USBD_INVAL);
1926 }
1927 
1928 usbd_status
1929 urtw_led_mode3(struct urtw_softc *sc, int mode)
1930 {
1931 	return (USBD_INVAL);
1932 }
1933 
1934 void
1935 urtw_ledusbtask(void *arg)
1936 {
1937 	struct urtw_softc *sc = arg;
1938 
1939 	if (sc->sc_strategy != URTW_SW_LED_MODE0)
1940 		panic("could not process a LED strategy 0x%x", sc->sc_strategy);
1941 
1942 	urtw_led_blink(sc);
1943 }
1944 
1945 void
1946 urtw_ledtask(void *arg)
1947 {
1948 	struct urtw_softc *sc = arg;
1949 
1950 	/*
1951 	 * NB: to change a status of the led we need at least a sleep so we
1952 	 * can't do it here
1953 	 */
1954 	usb_add_task(sc->sc_udev, &sc->sc_ledtask, USB_TASKQ_DRIVER);
1955 }
1956 
1957 usbd_status
1958 urtw_led_ctl(struct urtw_softc *sc, int mode)
1959 {
1960 	usbd_status error = 0;
1961 
1962 	switch (sc->sc_strategy) {
1963 	case URTW_SW_LED_MODE0:
1964 		error = urtw_led_mode0(sc, mode);
1965 		break;
1966 	case URTW_SW_LED_MODE1:
1967 		error = urtw_led_mode1(sc, mode);
1968 		break;
1969 	case URTW_SW_LED_MODE2:
1970 		error = urtw_led_mode2(sc, mode);
1971 		break;
1972 	case URTW_SW_LED_MODE3:
1973 		error = urtw_led_mode3(sc, mode);
1974 		break;
1975 	default:
1976 		panic("unsupported LED mode %d", sc->sc_strategy);
1977 		/* NOTREACHED */
1978 	}
1979 
1980 	return (error);
1981 }
1982 
1983 usbd_status
1984 urtw_led_blink(struct urtw_softc *sc)
1985 {
1986 	uint8_t ing = 0;
1987 	usbd_status error;
1988 
1989 	if (sc->sc_gpio_blinkstate == URTW_LED_ON)
1990 		error = urtw_led_on(sc, URTW_LED_GPIO);
1991 	else
1992 		error = urtw_led_off(sc, URTW_LED_GPIO);
1993 	sc->sc_gpio_blinktime--;
1994 	if (sc->sc_gpio_blinktime == 0)
1995 		ing = 1;
1996 	else {
1997 		if (sc->sc_gpio_ledstate != URTW_LED_BLINK_NORMAL &&
1998 		    sc->sc_gpio_ledstate != URTW_LED_BLINK_SLOWLY &&
1999 		    sc->sc_gpio_ledstate != URTW_LED_BLINK_CM3)
2000 			ing = 1;
2001 	}
2002 	if (ing == 1) {
2003 		if (sc->sc_gpio_ledstate == URTW_LED_ON &&
2004 		    sc->sc_gpio_ledon == 0)
2005 			error = urtw_led_on(sc, URTW_LED_GPIO);
2006 		else if (sc->sc_gpio_ledstate == URTW_LED_OFF &&
2007 		    sc->sc_gpio_ledon == 1)
2008 			error = urtw_led_off(sc, URTW_LED_GPIO);
2009 
2010 		sc->sc_gpio_blinktime = 0;
2011 		sc->sc_gpio_ledinprogress = 0;
2012 		return (0);
2013 	}
2014 
2015 	sc->sc_gpio_blinkstate = (sc->sc_gpio_blinkstate != URTW_LED_ON) ?
2016 	    URTW_LED_ON : URTW_LED_OFF;
2017 
2018 	switch (sc->sc_gpio_ledstate) {
2019 	case URTW_LED_BLINK_NORMAL:
2020 		if (!sc->sc_dying)
2021 			callout_schedule(&sc->sc_led_ch, mstohz(100));
2022 		break;
2023 	default:
2024 		panic("unknown LED status 0x%x", sc->sc_gpio_ledstate);
2025 		/* NOTREACHED */
2026 	}
2027 	return (0);
2028 }
2029 
2030 usbd_status
2031 urtw_update_msr(struct urtw_softc *sc)
2032 {
2033 	struct ieee80211com *ic = &sc->sc_ic;
2034 	uint8_t data;
2035 	usbd_status error;
2036 
2037 	urtw_read8_m(sc, URTW_MSR, &data);
2038 	data &= ~URTW_MSR_LINK_MASK;
2039 
2040 	/* Should always be set. */
2041 	if (sc->sc_hwrev & URTW_HWREV_8187B)
2042 		data |= URTW_MSR_LINK_ENEDCA;
2043 
2044 	if (sc->sc_state == IEEE80211_S_RUN) {
2045 		switch (ic->ic_opmode) {
2046 		case IEEE80211_M_STA:
2047 		case IEEE80211_M_MONITOR:
2048 			data |= URTW_MSR_LINK_STA;
2049 			break;
2050 		default:
2051 			panic("unsupported operation mode 0x%x",
2052 			    ic->ic_opmode);
2053 			/* NOTREACHED */
2054 		}
2055 	} else
2056 		data |= URTW_MSR_LINK_NONE;
2057 
2058 	urtw_write8_m(sc, URTW_MSR, data);
2059 fail:
2060 	return (error);
2061 }
2062 
2063 uint16_t
2064 urtw_rate2rtl(int rate)
2065 {
2066 	unsigned int i;
2067 
2068 	for (i = 0; i < __arraycount(urtw_ratetable); i++) {
2069 		if (rate == urtw_ratetable[i].reg)
2070 			return (urtw_ratetable[i].val);
2071 	}
2072 
2073 	return (3);
2074 }
2075 
2076 uint16_t
2077 urtw_rtl2rate(int rate)
2078 {
2079 	unsigned int i;
2080 
2081 	for (i = 0; i < __arraycount(urtw_ratetable); i++) {
2082 		if (rate == urtw_ratetable[i].val)
2083 			return (urtw_ratetable[i].reg);
2084 	}
2085 
2086 	return (0);
2087 }
2088 
2089 usbd_status
2090 urtw_set_rate(struct urtw_softc *sc)
2091 {
2092 	int i, basic_rate, min_rr_rate, max_rr_rate;
2093 	uint16_t data;
2094 	usbd_status error;
2095 
2096 	basic_rate = urtw_rate2rtl(48);
2097 	min_rr_rate = urtw_rate2rtl(12);
2098 	max_rr_rate = urtw_rate2rtl(48);
2099 
2100 	urtw_write8_m(sc, URTW_RESP_RATE,
2101 	    max_rr_rate << URTW_RESP_MAX_RATE_SHIFT |
2102 	    min_rr_rate << URTW_RESP_MIN_RATE_SHIFT);
2103 
2104 	urtw_read16_m(sc, URTW_8187_BRSR, &data);
2105 	data &= ~URTW_BRSR_MBR_8185;
2106 
2107 	for (i = 0; i <= basic_rate; i++)
2108 		data |= (1 << i);
2109 
2110 	urtw_write16_m(sc, URTW_8187_BRSR, data);
2111 fail:
2112 	return (error);
2113 }
2114 
2115 usbd_status
2116 urtw_intr_enable(struct urtw_softc *sc)
2117 {
2118 	usbd_status error;
2119 
2120 	urtw_write16_m(sc, URTW_INTR_MASK, 0xffff);
2121 fail:
2122 	return (error);
2123 }
2124 
2125 usbd_status
2126 urtw_rx_setconf(struct urtw_softc *sc)
2127 {
2128 	struct ifnet *ifp = sc->sc_ic.ic_ifp;
2129 	struct ieee80211com *ic = &sc->sc_ic;
2130 	uint32_t data;
2131 	usbd_status error;
2132 
2133 	urtw_read32_m(sc, URTW_RX, &data);
2134 	data = data &~ URTW_RX_FILTER_MASK;
2135 #if 0
2136 	data = data | URTW_RX_FILTER_CTL;
2137 #endif
2138 	data = data | URTW_RX_FILTER_MNG | URTW_RX_FILTER_DATA;
2139 	data = data | URTW_RX_FILTER_BCAST | URTW_RX_FILTER_MCAST;
2140 
2141 	if (ic->ic_opmode == IEEE80211_M_MONITOR) {
2142 		data = data | URTW_RX_FILTER_ICVERR;
2143 		data = data | URTW_RX_FILTER_PWR;
2144 	}
2145 	if (sc->sc_crcmon == 1 && ic->ic_opmode == IEEE80211_M_MONITOR)
2146 		data = data | URTW_RX_FILTER_CRCERR;
2147 
2148 	if (ic->ic_opmode == IEEE80211_M_MONITOR ||
2149 	    (ifp->if_flags & (IFF_ALLMULTI | IFF_PROMISC))) {
2150 		data = data | URTW_RX_FILTER_ALLMAC;
2151 	} else {
2152 		data = data | URTW_RX_FILTER_NICMAC;
2153 		data = data | URTW_RX_CHECK_BSSID;
2154 	}
2155 
2156 	data = data &~ URTW_RX_FIFO_THRESHOLD_MASK;
2157 	data = data | URTW_RX_FIFO_THRESHOLD_NONE | URTW_RX_AUTORESETPHY;
2158 	data = data &~ URTW_MAX_RX_DMA_MASK;
2159 	data = data | URTW_MAX_RX_DMA_2048 | URTW_RCR_ONLYERLPKT;
2160 
2161 	urtw_write32_m(sc, URTW_RX, data);
2162 fail:
2163 	return (error);
2164 }
2165 
2166 usbd_status
2167 urtw_rx_enable(struct urtw_softc *sc)
2168 {
2169 	int i;
2170 	struct urtw_rx_data *rx_data;
2171 	uint8_t data;
2172 	usbd_status error;
2173 
2174 	/*
2175 	 * Start up the receive pipe.
2176 	 */
2177 	for (i = 0; i < URTW_RX_DATA_LIST_COUNT; i++) {
2178 		rx_data = &sc->sc_rx_data[i];
2179 
2180 		usbd_setup_xfer(rx_data->xfer, sc->sc_rxpipe, rx_data,
2181 		    rx_data->buf, MCLBYTES, USBD_SHORT_XFER_OK,
2182 		    USBD_NO_TIMEOUT, urtw_rxeof);
2183 		error = usbd_transfer(rx_data->xfer);
2184 		if (error != USBD_IN_PROGRESS && error != 0) {
2185 			printf("%s: could not queue Rx transfer\n",
2186 			    device_xname(sc->sc_dev));
2187 			goto fail;
2188 		}
2189 	}
2190 
2191 	error = urtw_rx_setconf(sc);
2192 	if (error != 0)
2193 		goto fail;
2194 
2195 	urtw_read8_m(sc, URTW_CMD, &data);
2196 	urtw_write8_m(sc, URTW_CMD, data | URTW_CMD_RX_ENABLE);
2197 fail:
2198 	return (error);
2199 }
2200 
2201 usbd_status
2202 urtw_tx_enable(struct urtw_softc *sc)
2203 {
2204 	uint8_t data8;
2205 	uint32_t data;
2206 	usbd_status error;
2207 
2208 	if (sc->sc_hwrev & URTW_HWREV_8187) {
2209 		urtw_read8_m(sc, URTW_CW_CONF, &data8);
2210 		data8 &= ~(URTW_CW_CONF_PERPACKET_CW |
2211 		    URTW_CW_CONF_PERPACKET_RETRY);
2212 		urtw_write8_m(sc, URTW_CW_CONF, data8);
2213 
2214  		urtw_read8_m(sc, URTW_TX_AGC_CTL, &data8);
2215 		data8 &= ~URTW_TX_AGC_CTL_PERPACKET_GAIN;
2216 		data8 &= ~URTW_TX_AGC_CTL_PERPACKET_ANTSEL;
2217 		data8 &= ~URTW_TX_AGC_CTL_FEEDBACK_ANT;
2218 		urtw_write8_m(sc, URTW_TX_AGC_CTL, data8);
2219 
2220 		urtw_read32_m(sc, URTW_TX_CONF, &data);
2221 		data &= ~URTW_TX_LOOPBACK_MASK;
2222 		data |= URTW_TX_LOOPBACK_NONE;
2223 		data &= ~(URTW_TX_DPRETRY_MASK | URTW_TX_RTSRETRY_MASK);
2224 		data |= sc->sc_tx_retry << URTW_TX_DPRETRY_SHIFT;
2225 		data |= sc->sc_rts_retry << URTW_TX_RTSRETRY_SHIFT;
2226 		data &= ~(URTW_TX_NOCRC | URTW_TX_MXDMA_MASK);
2227 		data |= URTW_TX_MXDMA_2048 | URTW_TX_CWMIN | URTW_TX_DISCW;
2228 		data &= ~URTW_TX_SWPLCPLEN;
2229 		data |= URTW_TX_NOICV;
2230 		urtw_write32_m(sc, URTW_TX_CONF, data);
2231 	} else {
2232 		data = URTW_TX_DURPROCMODE | URTW_TX_DISREQQSIZE |
2233 		    URTW_TX_MXDMA_2048 | URTW_TX_SHORTRETRY |
2234 		    URTW_TX_LONGRETRY;
2235 		urtw_write32_m(sc, URTW_TX_CONF, data);
2236 	}
2237 
2238 	urtw_read8_m(sc, URTW_CMD, &data8);
2239 	urtw_write8_m(sc, URTW_CMD, data8 | URTW_CMD_TX_ENABLE);
2240 fail:
2241 	return (error);
2242 }
2243 
2244 int
2245 urtw_init(struct ifnet *ifp)
2246 {
2247 	struct urtw_softc *sc = ifp->if_softc;
2248 	struct urtw_rf *rf = &sc->sc_rf;
2249 	struct ieee80211com *ic = &sc->sc_ic;
2250 	usbd_status error;
2251 	int ret;
2252 
2253 	urtw_stop(ifp, 0);
2254 
2255 	error = urtw_reset(sc);
2256 	if (error)
2257 		goto fail;
2258 
2259 	urtw_write8_m(sc, 0x85, 0);
2260 	urtw_write8_m(sc, URTW_GPIO, 0);
2261 
2262 	/* for led */
2263 	urtw_write8_m(sc, 0x85, 4);
2264 	error = urtw_led_ctl(sc, URTW_LED_CTL_POWER_ON);
2265 	if (error != 0)
2266 		goto fail;
2267 
2268 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
2269 	if (error)
2270 		goto fail;
2271 
2272 	/* applying MAC address again. */
2273 	IEEE80211_ADDR_COPY(ic->ic_myaddr, CLLADDR(ifp->if_sadl));
2274 	error = urtw_set_macaddr(sc, ic->ic_myaddr);
2275 	if (error)
2276 		goto fail;
2277 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
2278 	if (error)
2279 		goto fail;
2280 
2281 	error = urtw_update_msr(sc);
2282 	if (error)
2283 		goto fail;
2284 
2285 	urtw_write32_m(sc, URTW_INT_TIMEOUT, 0);
2286 	urtw_write8_m(sc, URTW_WPA_CONFIG, 0);
2287 	urtw_write8_m(sc, URTW_RATE_FALLBACK, 0x81);
2288 	error = urtw_set_rate(sc);
2289 	if (error != 0)
2290 		goto fail;
2291 
2292 	error = rf->init(rf);
2293 	if (error != 0)
2294 		goto fail;
2295 	if (rf->set_sens != NULL)
2296 		rf->set_sens(rf);
2297 
2298 	urtw_write16_m(sc, 0x5e, 1);
2299 	urtw_write16_m(sc, 0xfe, 0x10);
2300 	urtw_write8_m(sc, URTW_TALLY_SEL, 0x80);
2301 	urtw_write8_m(sc, 0xff, 0x60);
2302 	urtw_write16_m(sc, 0x5e, 0);
2303 	urtw_write8_m(sc, 0x85, 4);
2304 
2305 	error = urtw_intr_enable(sc);
2306 	if (error != 0)
2307 		goto fail;
2308 
2309 	/* reset softc variables */
2310 	sc->sc_txidx = sc->sc_tx_low_queued = sc->sc_tx_normal_queued = 0;
2311 	sc->sc_txtimer = 0;
2312 
2313 	if (!(sc->sc_flags & URTW_INIT_ONCE)) {
2314 		error = usbd_set_config_no(sc->sc_udev, URTW_CONFIG_NO, 0);
2315 		if (error != 0) {
2316 			aprint_error_dev(sc->sc_dev, "failed to set configuration"
2317 			    ", err=%s\n", usbd_errstr(error));
2318 			goto fail;
2319 		}
2320 		/* get the first interface handle */
2321 		error = usbd_device2interface_handle(sc->sc_udev,
2322 		    URTW_IFACE_INDEX, &sc->sc_iface);
2323 		if (error != 0) {
2324 			printf("%s: could not get interface handle\n",
2325 			    device_xname(sc->sc_dev));
2326 			goto fail;
2327 		}
2328 		error = urtw_open_pipes(sc);
2329 		if (error != 0)
2330 			goto fail;
2331 		ret = urtw_alloc_rx_data_list(sc);
2332 		if (error != 0)
2333 			goto fail;
2334 		ret = urtw_alloc_tx_data_list(sc);
2335 		if (error != 0)
2336 			goto fail;
2337 		sc->sc_flags |= URTW_INIT_ONCE;
2338 	}
2339 
2340 	error = urtw_rx_enable(sc);
2341 	if (error != 0)
2342 		goto fail;
2343 	error = urtw_tx_enable(sc);
2344 	if (error != 0)
2345 		goto fail;
2346 
2347 	ifp->if_flags &= ~IFF_OACTIVE;
2348 	ifp->if_flags |= IFF_RUNNING;
2349 
2350 	if (ic->ic_opmode == IEEE80211_M_MONITOR)
2351 		ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
2352 	else
2353 		ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
2354 
2355 	return (0);
2356 fail:
2357 	return (error);
2358 }
2359 
2360 int
2361 urtw_ioctl(struct ifnet *ifp, u_long cmd, void *data)
2362 {
2363 #define IS_RUNNING(ifp) \
2364 	(((ifp)->if_flags & IFF_UP) && ((ifp)->if_flags & IFF_RUNNING))
2365 
2366 	struct urtw_softc *sc = ifp->if_softc;
2367 	struct ieee80211com *ic = &sc->sc_ic;
2368 	int s, error = 0;
2369 
2370 	if (sc->sc_dying)
2371 		return (ENXIO);
2372 
2373 	s = splnet();
2374 
2375 	switch (cmd) {
2376 	case SIOCSIFFLAGS:
2377 		if ((error = ifioctl_common(ifp, cmd, data)) != 0)
2378 			break;
2379 		switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
2380 		case IFF_UP|IFF_RUNNING:
2381 			break;
2382 		case IFF_UP:
2383 			ifp->if_init(ifp);
2384 			break;
2385 		case IFF_RUNNING:
2386 			urtw_stop(ifp, 1);
2387 			break;
2388 		case 0:
2389 			break;
2390 		}
2391 		break;
2392 
2393 	case SIOCADDMULTI:
2394 	case SIOCDELMULTI:
2395 		if ((error = ether_ioctl(ifp, cmd, data)) == ENETRESET)
2396 			error = 0;
2397 		break;
2398 
2399 	default:
2400 		error = ieee80211_ioctl(ic, cmd, data);
2401 		break;
2402 	}
2403 
2404 	if (error == ENETRESET) {
2405 		if (IS_RUNNING(ifp) &&
2406 		    (ic->ic_roaming != IEEE80211_ROAMING_MANUAL))
2407 			ifp->if_init(ifp);
2408 		error = 0;
2409 	}
2410 
2411 	splx(s);
2412 
2413 	return (error);
2414 #undef IS_RUNNING
2415 }
2416 
2417 void
2418 urtw_start(struct ifnet *ifp)
2419 {
2420 	struct urtw_softc *sc = ifp->if_softc;
2421 	struct ieee80211com *ic = &sc->sc_ic;
2422 	struct ieee80211_node *ni;
2423 	struct ether_header *eh;
2424 	struct mbuf *m0;
2425 
2426 	/*
2427 	 * net80211 may still try to send management frames even if the
2428 	 * IFF_RUNNING flag is not set...
2429 	 */
2430 	if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
2431 		return;
2432 
2433 	for (;;) {
2434 		IF_POLL(&ic->ic_mgtq, m0);
2435 		if (m0 != NULL) {
2436 			if (sc->sc_tx_low_queued >= URTW_TX_DATA_LIST_COUNT ||
2437 			    sc->sc_tx_normal_queued >=
2438 			    URTW_TX_DATA_LIST_COUNT) {
2439 				ifp->if_flags |= IFF_OACTIVE;
2440 				break;
2441 			}
2442 			IF_DEQUEUE(&ic->ic_mgtq, m0);
2443 			ni = (struct ieee80211_node *)m0->m_pkthdr.rcvif;
2444 			m0->m_pkthdr.rcvif = NULL;
2445 			bpf_mtap3(ic->ic_rawbpf, m0);
2446 			if (urtw_tx_start(sc, ni, m0, URTW_PRIORITY_NORMAL)
2447 			    != 0)
2448 				break;
2449 		} else {
2450 			if (ic->ic_state != IEEE80211_S_RUN)
2451 				break;
2452 			IFQ_POLL(&ifp->if_snd, m0);
2453 			if (m0 == NULL)
2454 				break;
2455 			if (sc->sc_tx_low_queued >= URTW_TX_DATA_LIST_COUNT ||
2456 			    sc->sc_tx_normal_queued >=
2457 			    URTW_TX_DATA_LIST_COUNT) {
2458 				ifp->if_flags |= IFF_OACTIVE;
2459 				break;
2460 			}
2461 			IFQ_DEQUEUE(&ifp->if_snd, m0);
2462 			if (m0->m_len < sizeof(struct ether_header) &&
2463 			    !(m0 = m_pullup(m0, sizeof(struct ether_header))))
2464 				continue;
2465 
2466 			eh = mtod(m0, struct ether_header *);
2467 			ni = ieee80211_find_txnode(ic, eh->ether_dhost);
2468 			if (ni == NULL) {
2469 				m_freem(m0);
2470 				continue;
2471 			}
2472 			bpf_mtap(ifp, m0);
2473 			m0 = ieee80211_encap(ic, m0, ni);
2474 			if (m0 == NULL) {
2475 				ieee80211_free_node(ni);
2476 				continue;
2477 			}
2478 			bpf_mtap3(ic->ic_rawbpf, m0);
2479 			if (urtw_tx_start(sc, ni, m0, URTW_PRIORITY_NORMAL)
2480 			    != 0) {
2481 				ieee80211_free_node(ni);
2482 				ifp->if_oerrors++;
2483 				break;
2484 			}
2485 		}
2486 		sc->sc_txtimer = 5;
2487 		ifp->if_timer = 1;
2488 	}
2489 }
2490 
2491 void
2492 urtw_watchdog(struct ifnet *ifp)
2493 {
2494 	struct urtw_softc *sc = ifp->if_softc;
2495 
2496 	ifp->if_timer = 0;
2497 
2498 	if (sc->sc_txtimer > 0) {
2499 		if (--sc->sc_txtimer == 0) {
2500 			printf("%s: device timeout\n", device_xname(sc->sc_dev));
2501 			ifp->if_oerrors++;
2502 			return;
2503 		}
2504 		ifp->if_timer = 1;
2505 	}
2506 
2507 	ieee80211_watchdog(&sc->sc_ic);
2508 }
2509 
2510 void
2511 urtw_txeof_low(usbd_xfer_handle xfer, usbd_private_handle priv,
2512     usbd_status status)
2513 {
2514 	struct urtw_tx_data *data = priv;
2515 	struct urtw_softc *sc = data->sc;
2516 	struct ieee80211com *ic = &sc->sc_ic;
2517 	struct ifnet *ifp = ic->ic_ifp;
2518 	int s;
2519 
2520 	if (status != USBD_NORMAL_COMPLETION) {
2521 		if (status == USBD_NOT_STARTED || status == USBD_CANCELLED)
2522 			return;
2523 
2524 		printf("%s: could not transmit buffer: %s\n",
2525 		    device_xname(sc->sc_dev), usbd_errstr(status));
2526 
2527 		if (status == USBD_STALLED)
2528 			usbd_clear_endpoint_stall_async(sc->sc_txpipe_low);
2529 
2530 		ifp->if_oerrors++;
2531 		return;
2532 	}
2533 
2534 	s = splnet();
2535 
2536 	ieee80211_free_node(data->ni);
2537 	data->ni = NULL;
2538 
2539 	sc->sc_txtimer = 0;
2540 	ifp->if_opackets++;
2541 
2542 	sc->sc_tx_low_queued--;
2543 	ifp->if_flags &= ~IFF_OACTIVE;
2544 	urtw_start(ifp);
2545 
2546 	splx(s);
2547 }
2548 
2549 void
2550 urtw_txeof_normal(usbd_xfer_handle xfer, usbd_private_handle priv,
2551     usbd_status status)
2552 {
2553 	struct urtw_tx_data *data = priv;
2554 	struct urtw_softc *sc = data->sc;
2555 	struct ieee80211com *ic = &sc->sc_ic;
2556 	struct ifnet *ifp = ic->ic_ifp;
2557 	int s;
2558 
2559 	if (status != USBD_NORMAL_COMPLETION) {
2560 		if (status == USBD_NOT_STARTED || status == USBD_CANCELLED)
2561 			return;
2562 
2563 		printf("%s: could not transmit buffer: %s\n",
2564 		    device_xname(sc->sc_dev), usbd_errstr(status));
2565 
2566 		if (status == USBD_STALLED)
2567 			usbd_clear_endpoint_stall_async(sc->sc_txpipe_normal);
2568 
2569 		ifp->if_oerrors++;
2570 		return;
2571 	}
2572 
2573 	s = splnet();
2574 
2575 	ieee80211_free_node(data->ni);
2576 	data->ni = NULL;
2577 
2578 	sc->sc_txtimer = 0;
2579 	ifp->if_opackets++;
2580 
2581 	sc->sc_tx_normal_queued--;
2582 	ifp->if_flags &= ~IFF_OACTIVE;
2583 	urtw_start(ifp);
2584 
2585 	splx(s);
2586 }
2587 
2588 int
2589 urtw_tx_start(struct urtw_softc *sc, struct ieee80211_node *ni, struct mbuf *m0,
2590     int prior)
2591 {
2592 	struct ieee80211com *ic = &sc->sc_ic;
2593 	struct urtw_tx_data *data;
2594 	struct ieee80211_frame *wh;
2595 	struct ieee80211_key *k;
2596 	usbd_status error;
2597 	int xferlen;
2598 
2599 	wh = mtod(m0, struct ieee80211_frame *);
2600 
2601 	if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
2602 		k = ieee80211_crypto_encap(ic, ni, m0);
2603 		if (k == NULL) {
2604 			m_freem(m0);
2605 			return (ENOBUFS);
2606 		}
2607 		/* packet header may have moved, reset our local pointer */
2608 		wh = mtod(m0, struct ieee80211_frame *);
2609 	}
2610 
2611 	if (sc->sc_drvbpf != NULL) {
2612 		struct urtw_tx_radiotap_header *tap = &sc->sc_txtap;
2613 
2614 		tap->wt_flags = 0;
2615 		tap->wt_rate = 0;
2616 		tap->wt_chan_freq = htole16(ic->ic_bss->ni_chan->ic_freq);
2617 		tap->wt_chan_flags = htole16(ic->ic_bss->ni_chan->ic_flags);
2618 
2619 		bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m0);
2620 	}
2621 
2622 	if (sc->sc_hwrev & URTW_HWREV_8187)
2623 		xferlen = m0->m_pkthdr.len + 4 * 3;
2624 	else
2625 		xferlen = m0->m_pkthdr.len + 4 * 8;
2626 
2627 	if ((0 == xferlen % 64) || (0 == xferlen % 512))
2628 		xferlen += 1;
2629 
2630 	data = &sc->sc_tx_data[sc->sc_txidx];
2631 	sc->sc_txidx = (sc->sc_txidx + 1) % URTW_TX_DATA_LIST_COUNT;
2632 
2633 	bzero(data->buf, URTW_TX_MAXSIZE);
2634 	data->buf[0] = m0->m_pkthdr.len & 0xff;
2635 	data->buf[1] = (m0->m_pkthdr.len & 0x0f00) >> 8;
2636 	data->buf[1] |= (1 << 7);
2637 
2638 	/* XXX sc_preamble_mode is always 2. */
2639 	if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) &&
2640 	    (ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_PREAMBLE) &&
2641 	    (sc->sc_preamble_mode == 1) && (sc->sc_currate != 0))
2642 		data->buf[2] |= 1;
2643 	if ((m0->m_pkthdr.len > ic->ic_rtsthreshold) &&
2644 	    prior == URTW_PRIORITY_LOW)
2645 		panic("TODO tx.");
2646 	if (wh->i_fc[1] & IEEE80211_FC1_MORE_FRAG)
2647 		data->buf[2] |= (1 << 1);
2648 	/* RTS rate - 10 means we use a basic rate. */
2649 	data->buf[2] |= (urtw_rate2rtl(2) << 3);
2650 	/*
2651 	 * XXX currently TX rate control depends on the rate value of
2652 	 * RX descriptor because I don't know how to we can control TX rate
2653 	 * in more smart way.  Please fix me you find a thing.
2654 	 */
2655 	data->buf[3] = sc->sc_currate;
2656 	if (prior == URTW_PRIORITY_NORMAL) {
2657 		if (IEEE80211_IS_MULTICAST(wh->i_addr1))
2658 			data->buf[3] = urtw_rate2rtl(ni->ni_rates.rs_rates[0]);
2659 		else if (ic->ic_fixed_rate != -1)
2660 			data->buf[3] = urtw_rate2rtl(ic->ic_fixed_rate);
2661 	}
2662 
2663 	if (sc->sc_hwrev & URTW_HWREV_8187) {
2664 		data->buf[8] = 3;		/* CW minimum */
2665 		data->buf[8] |= (7 << 4);	/* CW maximum */
2666 		data->buf[9] |= 11;		/* retry limitation */
2667 		m_copydata(m0, 0, m0->m_pkthdr.len, (uint8_t *)&data->buf[12]);
2668 	} else {
2669 		data->buf[21] |= 11;		/* retry limitation */
2670 		m_copydata(m0, 0, m0->m_pkthdr.len, (uint8_t *)&data->buf[32]);
2671 	}
2672 
2673 	data->ni = ni;
2674 
2675 	/* mbuf is no longer needed. */
2676 	m_freem(m0);
2677 
2678 	usbd_setup_xfer(data->xfer,
2679 	    (prior == URTW_PRIORITY_LOW) ? sc->sc_txpipe_low :
2680 	    sc->sc_txpipe_normal, data, data->buf, xferlen,
2681 	    USBD_FORCE_SHORT_XFER | USBD_NO_COPY, URTW_DATA_TIMEOUT,
2682 	    (prior == URTW_PRIORITY_LOW) ? urtw_txeof_low : urtw_txeof_normal);
2683 	error = usbd_transfer(data->xfer);
2684 	if (error != USBD_IN_PROGRESS && error != USBD_NORMAL_COMPLETION) {
2685 		printf("%s: could not send frame: %s\n",
2686 		    device_xname(sc->sc_dev), usbd_errstr(error));
2687 		return (EIO);
2688 	}
2689 
2690 	error = urtw_led_ctl(sc, URTW_LED_CTL_TX);
2691 	if (error != 0)
2692 		printf("%s: could not control LED (%d)\n",
2693 		    device_xname(sc->sc_dev), error);
2694 
2695 	if (prior == URTW_PRIORITY_LOW)
2696 		sc->sc_tx_low_queued++;
2697 	else
2698 		sc->sc_tx_normal_queued++;
2699 
2700 	return (0);
2701 }
2702 
2703 usbd_status
2704 urtw_8225_usb_init(struct urtw_softc *sc)
2705 {
2706 	uint8_t data;
2707 	usbd_status error;
2708 
2709 	urtw_write8_m(sc, URTW_RF_PINS_SELECT + 1, 0);
2710 	urtw_write8_m(sc, URTW_GPIO, 0);
2711 	error = urtw_read8e(sc, 0x53, &data);
2712 	if (error)
2713 		goto fail;
2714 	error = urtw_write8e(sc, 0x53, data | (1 << 7));
2715 	if (error)
2716 		goto fail;
2717 	urtw_write8_m(sc, URTW_RF_PINS_SELECT + 1, 4);
2718 	urtw_write8_m(sc, URTW_GPIO, 0x20);
2719 	urtw_write8_m(sc, URTW_GP_ENABLE, 0);
2720 
2721 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x80);
2722 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x80);
2723 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x80);
2724 
2725 	usbd_delay_ms(sc->sc_udev, 500);
2726 fail:
2727 	return (error);
2728 }
2729 
2730 usbd_status
2731 urtw_8185_rf_pins_enable(struct urtw_softc *sc)
2732 {
2733 	usbd_status error = 0;
2734 
2735 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x1ff7);
2736 fail:
2737 	return (error);
2738 }
2739 
2740 usbd_status
2741 urtw_8187_write_phy(struct urtw_softc *sc, uint8_t addr, uint32_t data)
2742 {
2743 	uint32_t phyw;
2744 	usbd_status error;
2745 
2746 	phyw = ((data << 8) | (addr | 0x80));
2747 	urtw_write8_m(sc, 0x7f, ((phyw & 0xff000000) >> 24));
2748 	urtw_write8_m(sc, 0x7e, ((phyw & 0x00ff0000) >> 16));
2749 	urtw_write8_m(sc, 0x7d, ((phyw & 0x0000ff00) >> 8));
2750 	urtw_write8_m(sc, 0x7c, ((phyw & 0x000000ff)));
2751 	/*
2752 	 * Delay removed from 8185 to 8187.
2753 	 * usbd_delay_ms(sc->sc_udev, 1);
2754 	 */
2755 fail:
2756 	return (error);
2757 }
2758 
2759 usbd_status
2760 urtw_8187_write_phy_ofdm_c(struct urtw_softc *sc, uint8_t addr, uint32_t data)
2761 {
2762 	data = data & 0xff;
2763 	return (urtw_8187_write_phy(sc, addr, data));
2764 }
2765 
2766 usbd_status
2767 urtw_8187_write_phy_cck_c(struct urtw_softc *sc, uint8_t addr, uint32_t data)
2768 {
2769 	data = data & 0xff;
2770 	return (urtw_8187_write_phy(sc, addr, data | 0x10000));
2771 }
2772 
2773 usbd_status
2774 urtw_8225_setgain(struct urtw_softc *sc, int16_t gain)
2775 {
2776 	usbd_status error;
2777 
2778 	urtw_8187_write_phy_ofdm(sc, 0x0d, urtw_8225_gain[gain * 4]);
2779 	urtw_8187_write_phy_ofdm(sc, 0x1b, urtw_8225_gain[gain * 4 + 2]);
2780 	urtw_8187_write_phy_ofdm(sc, 0x1d, urtw_8225_gain[gain * 4 + 3]);
2781 	urtw_8187_write_phy_ofdm(sc, 0x23, urtw_8225_gain[gain * 4 + 1]);
2782 fail:
2783 	return (error);
2784 }
2785 
2786 usbd_status
2787 urtw_8225_set_txpwrlvl(struct urtw_softc *sc, int chan)
2788 {
2789 	int i, idx, set;
2790 	uint8_t *cck_pwltable;
2791 	uint8_t cck_pwrlvl_max, ofdm_pwrlvl_min, ofdm_pwrlvl_max;
2792 	uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff;
2793 	uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff;
2794 	usbd_status error;
2795 
2796 	cck_pwrlvl_max = 11;
2797 	ofdm_pwrlvl_max = 25;	/* 12 -> 25 */
2798 	ofdm_pwrlvl_min = 10;
2799 
2800 	/* CCK power setting */
2801 	cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ? cck_pwrlvl_max : cck_pwrlvl;
2802 	idx = cck_pwrlvl % 6;
2803 	set = cck_pwrlvl / 6;
2804 	cck_pwltable = (chan == 14) ? urtw_8225_txpwr_cck_ch14 :
2805 	    urtw_8225_txpwr_cck;
2806 
2807 	urtw_write8_m(sc, URTW_TX_GAIN_CCK,
2808 	    urtw_8225_tx_gain_cck_ofdm[set] >> 1);
2809 	for (i = 0; i < 8; i++) {
2810 		urtw_8187_write_phy_cck(sc, 0x44 + i,
2811 		    cck_pwltable[idx * 8 + i]);
2812 	}
2813 	usbd_delay_ms(sc->sc_udev, 1);
2814 
2815 	/* OFDM power setting */
2816 	ofdm_pwrlvl = (ofdm_pwrlvl > (ofdm_pwrlvl_max - ofdm_pwrlvl_min)) ?
2817 	    ofdm_pwrlvl_max : ofdm_pwrlvl + ofdm_pwrlvl_min;
2818 	ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl;
2819 
2820 	idx = ofdm_pwrlvl % 6;
2821 	set = ofdm_pwrlvl / 6;
2822 
2823 	error = urtw_8185_set_anaparam2(sc, URTW_8187_8225_ANAPARAM2_ON);
2824 	if (error)
2825 		goto fail;
2826 	urtw_8187_write_phy_ofdm(sc, 2, 0x42);
2827 	urtw_8187_write_phy_ofdm(sc, 6, 0);
2828 	urtw_8187_write_phy_ofdm(sc, 8, 0);
2829 
2830 	urtw_write8_m(sc, URTW_TX_GAIN_OFDM,
2831 	    urtw_8225_tx_gain_cck_ofdm[set] >> 1);
2832 	urtw_8187_write_phy_ofdm(sc, 0x5, urtw_8225_txpwr_ofdm[idx]);
2833 	urtw_8187_write_phy_ofdm(sc, 0x7, urtw_8225_txpwr_ofdm[idx]);
2834 	usbd_delay_ms(sc->sc_udev, 1);
2835 fail:
2836 	return (error);
2837 }
2838 
2839 usbd_status
2840 urtw_8185_tx_antenna(struct urtw_softc *sc, uint8_t ant)
2841 {
2842 	usbd_status error;
2843 
2844 	urtw_write8_m(sc, URTW_TX_ANTENNA, ant);
2845 	usbd_delay_ms(sc->sc_udev, 1);
2846 fail:
2847 	return (error);
2848 }
2849 
2850 usbd_status
2851 urtw_8225_rf_init(struct urtw_rf *rf)
2852 {
2853 	struct urtw_softc *sc = rf->rf_sc;
2854 	unsigned int i;
2855 	uint16_t data;
2856 	usbd_status error;
2857 
2858 	error = urtw_8180_set_anaparam(sc, URTW_8187_8225_ANAPARAM_ON);
2859 	if (error)
2860 		goto fail;
2861 
2862 	error = urtw_8225_usb_init(sc);
2863 	if (error)
2864 		goto fail;
2865 
2866 	urtw_write32_m(sc, URTW_RF_TIMING, 0x000a8008);
2867 	urtw_read16_m(sc, URTW_8187_BRSR, &data);	/* XXX ??? */
2868 	urtw_write16_m(sc, URTW_8187_BRSR, 0xffff);
2869 	urtw_write32_m(sc, URTW_RF_PARA, 0x100044);
2870 
2871 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
2872 	if (error)
2873 		goto fail;
2874 	urtw_write8_m(sc, URTW_CONFIG3, 0x44);
2875 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
2876 	if (error)
2877 		goto fail;
2878 
2879 	error = urtw_8185_rf_pins_enable(sc);
2880 	if (error)
2881 		goto fail;
2882 
2883 	usbd_delay_ms(sc->sc_udev, 500);
2884 
2885 	for (i = 0; i < __arraycount(urtw_8225_rf_part1); i++) {
2886 		urtw_8225_write(sc, urtw_8225_rf_part1[i].reg,
2887 		    urtw_8225_rf_part1[i].val);
2888 	}
2889 	usbd_delay_ms(sc->sc_udev, 50);
2890 	urtw_8225_write(sc, 0x2, 0xc4d);
2891 	usbd_delay_ms(sc->sc_udev, 200);
2892 	urtw_8225_write(sc, 0x2, 0x44d);
2893 	usbd_delay_ms(sc->sc_udev, 200);
2894 	urtw_8225_write(sc, 0x0, 0x127);
2895 
2896 	for (i = 0; i < __arraycount(urtw_8225_rxgain); i++) {
2897 		urtw_8225_write(sc, 0x1, (uint8_t)(i + 1));
2898 		urtw_8225_write(sc, 0x2, urtw_8225_rxgain[i]);
2899 	}
2900 
2901 	urtw_8225_write(sc, 0x0, 0x27);
2902 	urtw_8225_write(sc, 0x0, 0x22f);
2903 
2904 	for (i = 0; i < __arraycount(urtw_8225_agc); i++) {
2905 		urtw_8187_write_phy_ofdm(sc, 0xb, urtw_8225_agc[i]);
2906 		urtw_8187_write_phy_ofdm(sc, 0xa, (uint8_t)i + 0x80);
2907 	}
2908 
2909 	for (i = 0; i < __arraycount(urtw_8225_rf_part2); i++) {
2910 		urtw_8187_write_phy_ofdm(sc, urtw_8225_rf_part2[i].reg,
2911 		    urtw_8225_rf_part2[i].val);
2912 		usbd_delay_ms(sc->sc_udev, 1);
2913 	}
2914 
2915 	error = urtw_8225_setgain(sc, 4);
2916 	if (error)
2917 		goto fail;
2918 
2919 	for (i = 0; i < __arraycount(urtw_8225_rf_part3); i++) {
2920 		urtw_8187_write_phy_cck(sc, urtw_8225_rf_part3[i].reg,
2921 		    urtw_8225_rf_part3[i].val);
2922 		usbd_delay_ms(sc->sc_udev, 1);
2923 	}
2924 
2925 	urtw_write8_m(sc, 0x5b, 0x0d);
2926 
2927 	error = urtw_8225_set_txpwrlvl(sc, 1);
2928 	if (error)
2929 		goto fail;
2930 
2931 	urtw_8187_write_phy_cck(sc, 0x10, 0x9b);
2932 	usbd_delay_ms(sc->sc_udev, 1);
2933 	urtw_8187_write_phy_ofdm(sc, 0x26, 0x90);
2934 	usbd_delay_ms(sc->sc_udev, 1);
2935 
2936 	/* TX ant A, 0x0 for B */
2937 	error = urtw_8185_tx_antenna(sc, 0x3);
2938 	if (error)
2939 		goto fail;
2940 	urtw_write32_m(sc, 0x94, 0x3dc00002);
2941 
2942 	error = urtw_8225_rf_set_chan(rf, 1);
2943 fail:
2944 	return (error);
2945 }
2946 
2947 usbd_status
2948 urtw_8225_rf_set_chan(struct urtw_rf *rf, int chan)
2949 {
2950 	struct urtw_softc *sc = rf->rf_sc;
2951 	struct ieee80211com *ic = &sc->sc_ic;
2952 	struct ieee80211_channel *c = ic->ic_ibss_chan;
2953 	usbd_status error;
2954 
2955 	error = urtw_8225_set_txpwrlvl(sc, chan);
2956 	if (error)
2957 		goto fail;
2958 	urtw_8225_write(sc, 0x7, urtw_8225_channel[chan]);
2959 	usbd_delay_ms(sc->sc_udev, 10);
2960 
2961 	urtw_write8_m(sc, URTW_SIFS, 0x22);
2962 
2963 	if (sc->sc_state == IEEE80211_S_ASSOC &&
2964 	    ic->ic_flags & IEEE80211_F_SHSLOT)
2965 		urtw_write8_m(sc, URTW_SLOT, 0x9);
2966 	else
2967 		urtw_write8_m(sc, URTW_SLOT, 0x14);
2968 
2969 	if (IEEE80211_IS_CHAN_G(c)) {
2970 		urtw_write8_m(sc, URTW_DIFS, 0x14);
2971 		urtw_write8_m(sc, URTW_8187_EIFS, 0x5b - 0x14);
2972 		urtw_write8_m(sc, URTW_CW_VAL, 0x73);
2973 	} else {
2974 		urtw_write8_m(sc, URTW_DIFS, 0x24);
2975 		urtw_write8_m(sc, URTW_8187_EIFS, 0x5b - 0x24);
2976 		urtw_write8_m(sc, URTW_CW_VAL, 0xa5);
2977 	}
2978 
2979 fail:
2980 	return (error);
2981 }
2982 
2983 usbd_status
2984 urtw_8225_rf_set_sens(struct urtw_rf *rf)
2985 {
2986 	struct urtw_softc *sc = rf->rf_sc;
2987 	usbd_status error;
2988 
2989 	if (rf->sens > 6)
2990 		return (-1);
2991 
2992 	if (rf->sens > 4)
2993 		urtw_8225_write(sc, 0x0c, 0x850);
2994 	else
2995 		urtw_8225_write(sc, 0x0c, 0x50);
2996 
2997 	rf->sens = 6 - rf->sens;
2998 	error = urtw_8225_setgain(sc, rf->sens);
2999 	if (error)
3000 		goto fail;
3001 
3002 	urtw_8187_write_phy_cck(sc, 0x41, urtw_8225_threshold[rf->sens]);
3003 
3004 fail:
3005 	return (error);
3006 }
3007 
3008 void
3009 urtw_stop(struct ifnet *ifp, int disable)
3010 {
3011 	struct urtw_softc *sc = ifp->if_softc;
3012 	struct ieee80211com *ic = &sc->sc_ic;
3013 	uint8_t data;
3014 	usbd_status error;
3015 
3016 	ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
3017 
3018 	sc->sc_txtimer = 0;
3019 	ifp->if_timer = 0;
3020 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
3021 
3022 	callout_stop(&sc->scan_to);
3023 	callout_stop(&sc->sc_led_ch);
3024 
3025 	urtw_intr_disable(sc);
3026 	urtw_read8_m(sc, URTW_CMD, &data);
3027 	data &= ~URTW_CMD_TX_ENABLE;
3028 	data &= ~URTW_CMD_RX_ENABLE;
3029 	urtw_write8_m(sc, URTW_CMD, data);
3030 
3031 	if (sc->sc_rxpipe != NULL)
3032 		usbd_abort_pipe(sc->sc_rxpipe);
3033 	if (sc->sc_txpipe_low != NULL)
3034 		usbd_abort_pipe(sc->sc_txpipe_low);
3035 	if (sc->sc_txpipe_normal != NULL)
3036 		usbd_abort_pipe(sc->sc_txpipe_normal);
3037 
3038 fail:
3039 	return;
3040 }
3041 
3042 int
3043 urtw_isbmode(uint16_t rate)
3044 {
3045 	rate = urtw_rtl2rate(rate);
3046 
3047 	return (((rate <= 22 && rate != 12 && rate != 18) ||
3048 	    rate == 44) ? (1) : (0));
3049 }
3050 
3051 void
3052 urtw_rxeof(usbd_xfer_handle xfer, usbd_private_handle priv, usbd_status status)
3053 {
3054 	struct urtw_rx_data *data = priv;
3055 	struct urtw_softc *sc = data->sc;
3056 	struct ieee80211com *ic = &sc->sc_ic;
3057 	struct ifnet *ifp = ic->ic_ifp;
3058 	struct ieee80211_frame *wh;
3059 	struct ieee80211_node *ni;
3060 	struct mbuf *m, *mnew;
3061 	uint8_t *desc, quality, rate;
3062 	int actlen, flen, len, nf, rssi, s;
3063 
3064 	if (status != USBD_NORMAL_COMPLETION) {
3065 		if (status == USBD_NOT_STARTED || status == USBD_CANCELLED)
3066 			return;
3067 
3068 		if (status == USBD_STALLED)
3069 			usbd_clear_endpoint_stall_async(sc->sc_rxpipe);
3070 		ifp->if_ierrors++;
3071 		goto skip;
3072 	}
3073 
3074 	usbd_get_xfer_status(xfer, NULL, NULL, &actlen, NULL);
3075 	if (actlen < URTW_MIN_RXBUFSZ) {
3076 		ifp->if_ierrors++;
3077 		goto skip;
3078 	}
3079 
3080 	if (sc->sc_hwrev & URTW_HWREV_8187)
3081 		/* 4 dword and 4 byte CRC */
3082 		len = actlen - (4 * 4);
3083 	else
3084 		/* 5 dword and 4 byte CRC */
3085 		len = actlen - (4 * 5);
3086 
3087 	desc = data->buf + len;
3088 	flen = ((desc[1] & 0x0f) << 8) + (desc[0] & 0xff);
3089 	if (flen > actlen) {
3090 		ifp->if_ierrors++;
3091 		goto skip;
3092 	}
3093 
3094 	rate = (desc[2] & 0xf0) >> 4;
3095 	if (sc->sc_hwrev & URTW_HWREV_8187) {
3096 		quality = desc[4] & 0xff;
3097 		rssi = (desc[6] & 0xfe) >> 1;
3098 
3099 		/* XXX correct? */
3100 		if (!urtw_isbmode(rate)) {
3101 			rssi = (rssi > 90) ? 90 : ((rssi < 25) ? 25 : rssi);
3102 			rssi = ((90 - rssi) * 100) / 65;
3103 		} else {
3104 			rssi = (rssi > 90) ? 95 : ((rssi < 30) ? 30 : rssi);
3105 			rssi = ((95 - rssi) * 100) / 65;
3106 		}
3107 	} else {
3108 		quality = desc[12];
3109 		rssi = 14 - desc[14] / 2;
3110 	}
3111 
3112 	MGETHDR(mnew, M_DONTWAIT, MT_DATA);
3113 	if (mnew == NULL) {
3114 		printf("%s: could not allocate rx mbuf\n",
3115 		    device_xname(sc->sc_dev));
3116 		ifp->if_ierrors++;
3117 		goto skip;
3118 	}
3119 	MCLGET(mnew, M_DONTWAIT);
3120 	if (!(mnew->m_flags & M_EXT)) {
3121 		printf("%s: could not allocate rx mbuf cluster\n",
3122 		    device_xname(sc->sc_dev));
3123 		m_freem(mnew);
3124 		ifp->if_ierrors++;
3125 		goto skip;
3126 	}
3127 
3128 	m = data->m;
3129 	data->m = mnew;
3130 	data->buf = mtod(mnew, uint8_t *);
3131 
3132 	/* finalize mbuf */
3133 	m->m_pkthdr.rcvif = ifp;
3134 	m->m_pkthdr.len = m->m_len = flen - 4;
3135 
3136 	s = splnet();
3137 
3138 	if (sc->sc_drvbpf != NULL) {
3139 		struct urtw_rx_radiotap_header *tap = &sc->sc_rxtap;
3140 
3141 		/* XXX Are variables correct? */
3142 		tap->wr_chan_freq = htole16(ic->ic_ibss_chan->ic_freq);
3143 		tap->wr_chan_flags = htole16(ic->ic_ibss_chan->ic_flags);
3144 		tap->wr_dbm_antsignal = (int8_t)rssi;
3145 
3146 		bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m);
3147 	}
3148 	wh = mtod(m, struct ieee80211_frame *);
3149 	if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) == IEEE80211_FC0_TYPE_DATA)
3150 		sc->sc_currate = (rate > 0) ? rate : sc->sc_currate;
3151 	ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh);
3152 
3153 	/* XXX correct? */
3154 	if (!urtw_isbmode(rate)) {
3155 		if (quality > 127)
3156 			quality = 0;
3157 		else if (quality < 27)
3158 			quality = 100;
3159 		else
3160 			quality = 127 - quality;
3161 	} else
3162 		quality = (quality > 64) ? 0 : ((64 - quality) * 100) / 64;
3163 
3164 	nf = quality;
3165 
3166 	/* send the frame to the 802.11 layer */
3167 	ieee80211_input(ic, m, ni, rssi, 0);
3168 
3169 	/* node is no longer needed */
3170 	ieee80211_free_node(ni);
3171 
3172 	splx(s);
3173 
3174 skip:	/* setup a new transfer */
3175 	usbd_setup_xfer(xfer, sc->sc_rxpipe, data, data->buf, MCLBYTES,
3176 	    USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, urtw_rxeof);
3177 	(void)usbd_transfer(xfer);
3178 }
3179 
3180 usbd_status
3181 urtw_8225v2_setgain(struct urtw_softc *sc, int16_t gain)
3182 {
3183 	uint8_t *gainp;
3184 	usbd_status error;
3185 
3186 	/* XXX for A? */
3187 	gainp = urtw_8225v2_gain_bg;
3188 	urtw_8187_write_phy_ofdm(sc, 0x0d, gainp[gain * 3]);
3189 	usbd_delay_ms(sc->sc_udev, 1);
3190 	urtw_8187_write_phy_ofdm(sc, 0x1b, gainp[gain * 3 + 1]);
3191 	usbd_delay_ms(sc->sc_udev, 1);
3192 	urtw_8187_write_phy_ofdm(sc, 0x1d, gainp[gain * 3 + 2]);
3193 	usbd_delay_ms(sc->sc_udev, 1);
3194 	urtw_8187_write_phy_ofdm(sc, 0x21, 0x17);
3195 	usbd_delay_ms(sc->sc_udev, 1);
3196 fail:
3197 	return (error);
3198 }
3199 
3200 usbd_status
3201 urtw_8225v2_set_txpwrlvl(struct urtw_softc *sc, int chan)
3202 {
3203 	int i;
3204 	uint8_t *cck_pwrtable;
3205 	uint8_t cck_pwrlvl_max = 15, ofdm_pwrlvl_max = 25, ofdm_pwrlvl_min = 10;
3206 	uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff;
3207 	uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff;
3208 	usbd_status error;
3209 
3210 	/* CCK power setting */
3211 	cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ? cck_pwrlvl_max : cck_pwrlvl;
3212 	cck_pwrlvl += sc->sc_txpwr_cck_base;
3213 	cck_pwrlvl = (cck_pwrlvl > 35) ? 35 : cck_pwrlvl;
3214 	cck_pwrtable = (chan == 14) ? urtw_8225v2_txpwr_cck_ch14 :
3215 	    urtw_8225v2_txpwr_cck;
3216 
3217 	for (i = 0; i < 8; i++) {
3218 		urtw_8187_write_phy_cck(sc, 0x44 + i, cck_pwrtable[i]);
3219 	}
3220 	urtw_write8_m(sc, URTW_TX_GAIN_CCK,
3221 	    urtw_8225v2_tx_gain_cck_ofdm[cck_pwrlvl]);
3222 	usbd_delay_ms(sc->sc_udev, 1);
3223 
3224 	/* OFDM power setting */
3225 	ofdm_pwrlvl = (ofdm_pwrlvl > (ofdm_pwrlvl_max - ofdm_pwrlvl_min)) ?
3226 		ofdm_pwrlvl_max : ofdm_pwrlvl + ofdm_pwrlvl_min;
3227 	ofdm_pwrlvl += sc->sc_txpwr_ofdm_base;
3228 	ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl;
3229 
3230 	error = urtw_8185_set_anaparam2(sc, URTW_8187_8225_ANAPARAM2_ON);
3231 	if (error)
3232 		goto fail;
3233 
3234 	urtw_8187_write_phy_ofdm(sc, 2, 0x42);
3235 	urtw_8187_write_phy_ofdm(sc, 5, 0x0);
3236 	urtw_8187_write_phy_ofdm(sc, 6, 0x40);
3237 	urtw_8187_write_phy_ofdm(sc, 7, 0x0);
3238 	urtw_8187_write_phy_ofdm(sc, 8, 0x40);
3239 
3240 	urtw_write8_m(sc, URTW_TX_GAIN_OFDM,
3241 	    urtw_8225v2_tx_gain_cck_ofdm[ofdm_pwrlvl]);
3242 	usbd_delay_ms(sc->sc_udev, 1);
3243 fail:
3244 	return (error);
3245 }
3246 
3247 usbd_status
3248 urtw_8225v2_rf_init(struct urtw_rf *rf)
3249 {
3250 	struct urtw_softc *sc = rf->rf_sc;
3251 	int i;
3252 	uint16_t data;
3253 	uint32_t data32;
3254 	usbd_status error;
3255 
3256 	error = urtw_8180_set_anaparam(sc, URTW_8187_8225_ANAPARAM_ON);
3257 	if (error)
3258 		goto fail;
3259 
3260 	error = urtw_8225_usb_init(sc);
3261 	if (error)
3262 		goto fail;
3263 
3264 	urtw_write32_m(sc, URTW_RF_TIMING, 0x000a8008);
3265 	urtw_read16_m(sc, URTW_8187_BRSR, &data);	/* XXX ??? */
3266 	urtw_write16_m(sc, URTW_8187_BRSR, 0xffff);
3267 	urtw_write32_m(sc, URTW_RF_PARA, 0x100044);
3268 
3269 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
3270 	if (error)
3271 		goto fail;
3272 	urtw_write8_m(sc, URTW_CONFIG3, 0x44);
3273 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
3274 	if (error)
3275 		goto fail;
3276 
3277 	error = urtw_8185_rf_pins_enable(sc);
3278 	if (error)
3279 		goto fail;
3280 
3281 	usbd_delay_ms(sc->sc_udev, 1000);
3282 
3283 	for (i = 0; i < __arraycount(urtw_8225v2_rf_part1); i++) {
3284 		urtw_8225_write(sc, urtw_8225v2_rf_part1[i].reg,
3285 		    urtw_8225v2_rf_part1[i].val);
3286 		usbd_delay_ms(sc->sc_udev, 1);
3287 	}
3288 	usbd_delay_ms(sc->sc_udev, 50);
3289 
3290 	urtw_8225_write(sc, 0x0, 0x1b7);
3291 
3292 	for (i = 0; i < __arraycount(urtw_8225v2_rxgain); i++) {
3293 		urtw_8225_write(sc, 0x1, (uint8_t)(i + 1));
3294 		urtw_8225_write(sc, 0x2, urtw_8225v2_rxgain[i]);
3295 	}
3296 
3297 	urtw_8225_write(sc, 0x3, 0x2);
3298 	urtw_8225_write(sc, 0x5, 0x4);
3299 	urtw_8225_write(sc, 0x0, 0xb7);
3300 	urtw_8225_write(sc, 0x2, 0xc4d);
3301 	usbd_delay_ms(sc->sc_udev, 100);
3302 	urtw_8225_write(sc, 0x2, 0x44d);
3303 	usbd_delay_ms(sc->sc_udev, 100);
3304 
3305 	error = urtw_8225_read(sc, 0x6, &data32);
3306 	if (error != 0)
3307 		goto fail;
3308 	if (data32 != 0xe6)
3309 		printf("%s: expect 0xe6!! (0x%x)\n", device_xname(sc->sc_dev),
3310 		    data32);
3311 	if (!(data32 & 0x80)) {
3312 		urtw_8225_write(sc, 0x02, 0x0c4d);
3313 		usbd_delay_ms(sc->sc_udev, 200);
3314 		urtw_8225_write(sc, 0x02, 0x044d);
3315 		usbd_delay_ms(sc->sc_udev, 100);
3316 		error = urtw_8225_read(sc, 0x6, &data32);
3317 		if (error != 0)
3318 			goto fail;
3319 		if (!(data32 & 0x80))
3320 			printf("%s: RF calibration failed\n",
3321 			    device_xname(sc->sc_dev));
3322 	}
3323 	usbd_delay_ms(sc->sc_udev, 100);
3324 
3325 	urtw_8225_write(sc, 0x0, 0x2bf);
3326 	for (i = 0; i < __arraycount(urtw_8225_agc); i++) {
3327 		urtw_8187_write_phy_ofdm(sc, 0xb, urtw_8225_agc[i]);
3328 		urtw_8187_write_phy_ofdm(sc, 0xa, (uint8_t)i + 0x80);
3329 	}
3330 
3331 	for (i = 0; i < __arraycount(urtw_8225v2_rf_part2); i++) {
3332 		urtw_8187_write_phy_ofdm(sc, urtw_8225v2_rf_part2[i].reg,
3333 		    urtw_8225v2_rf_part2[i].val);
3334 	}
3335 
3336 	error = urtw_8225v2_setgain(sc, 4);
3337 	if (error)
3338 		goto fail;
3339 
3340 	for (i = 0; i < __arraycount(urtw_8225v2_rf_part3); i++) {
3341 		urtw_8187_write_phy_cck(sc, urtw_8225v2_rf_part3[i].reg,
3342 		    urtw_8225v2_rf_part3[i].val);
3343 	}
3344 
3345 	urtw_write8_m(sc, 0x5b, 0x0d);
3346 
3347 	error = urtw_8225v2_set_txpwrlvl(sc, 1);
3348 	if (error)
3349 		goto fail;
3350 
3351 	urtw_8187_write_phy_cck(sc, 0x10, 0x9b);
3352 	urtw_8187_write_phy_ofdm(sc, 0x26, 0x90);
3353 
3354 	/* TX ant A, 0x0 for B */
3355 	error = urtw_8185_tx_antenna(sc, 0x3);
3356 	if (error)
3357 		goto fail;
3358 	urtw_write32_m(sc, 0x94, 0x3dc00002);
3359 
3360 	error = urtw_8225_rf_set_chan(rf, 1);
3361 fail:
3362 	return (error);
3363 }
3364 
3365 usbd_status
3366 urtw_8225v2_rf_set_chan(struct urtw_rf *rf, int chan)
3367 {
3368 	struct urtw_softc *sc = rf->rf_sc;
3369 	struct ieee80211com *ic = &sc->sc_ic;
3370 	struct ieee80211_channel *c = ic->ic_ibss_chan;
3371 	usbd_status error;
3372 
3373 	error = urtw_8225v2_set_txpwrlvl(sc, chan);
3374 	if (error)
3375 		goto fail;
3376 
3377 	urtw_8225_write(sc, 0x7, urtw_8225_channel[chan]);
3378 	usbd_delay_ms(sc->sc_udev, 10);
3379 
3380 	urtw_write8_m(sc, URTW_SIFS, 0x22);
3381 
3382 	if(sc->sc_state == IEEE80211_S_ASSOC &&
3383 	    ic->ic_flags & IEEE80211_F_SHSLOT)
3384 		urtw_write8_m(sc, URTW_SLOT, 0x9);
3385 	else
3386 		urtw_write8_m(sc, URTW_SLOT, 0x14);
3387 
3388 	if (IEEE80211_IS_CHAN_G(c)) {
3389 		urtw_write8_m(sc, URTW_DIFS, 0x14);
3390 		urtw_write8_m(sc, URTW_8187_EIFS, 0x5b - 0x14);
3391 		urtw_write8_m(sc, URTW_CW_VAL, 0x73);
3392 	} else {
3393 		urtw_write8_m(sc, URTW_DIFS, 0x24);
3394 		urtw_write8_m(sc, URTW_8187_EIFS, 0x5b - 0x24);
3395 		urtw_write8_m(sc, URTW_CW_VAL, 0xa5);
3396 	}
3397 
3398 fail:
3399 	return (error);
3400 }
3401 
3402 void
3403 urtw_set_chan(struct urtw_softc *sc, struct ieee80211_channel *c)
3404 {
3405 	struct urtw_rf *rf = &sc->sc_rf;
3406 	struct ieee80211com *ic = &sc->sc_ic;
3407 	usbd_status error = 0;
3408 	uint32_t data;
3409 	u_int chan;
3410 
3411 	chan = ieee80211_chan2ieee(ic, c);
3412 	if (chan == 0 || chan == IEEE80211_CHAN_ANY)
3413 		return;
3414 	/*
3415 	 * During changing the channel we need to temporary disable
3416 	 * TX.
3417 	 */
3418 	urtw_read32_m(sc, URTW_TX_CONF, &data);
3419 	data &= ~URTW_TX_LOOPBACK_MASK;
3420 	urtw_write32_m(sc, URTW_TX_CONF, data | URTW_TX_LOOPBACK_MAC);
3421 	error = rf->set_chan(rf, chan);
3422 	if (error != 0) {
3423 		printf("%s could not change the channel\n",
3424 		    device_xname(sc->sc_dev));
3425 		return;
3426 	}
3427 	usbd_delay_ms(sc->sc_udev, 10);
3428 	urtw_write32_m(sc, URTW_TX_CONF, data | URTW_TX_LOOPBACK_NONE);
3429 
3430 fail:	return;
3431 
3432 }
3433 
3434 void
3435 urtw_next_scan(void *arg)
3436 {
3437 	struct urtw_softc *sc = arg;
3438 	struct ieee80211com *ic = &sc->sc_ic;
3439 	int s;
3440 
3441 	if (sc->sc_dying)
3442 		return;
3443 
3444 	s = splnet();
3445 	if (ic->ic_state == IEEE80211_S_SCAN)
3446 		ieee80211_next_scan(ic);
3447 	splx(s);
3448 }
3449 
3450 void
3451 urtw_task(void *arg)
3452 {
3453 	struct urtw_softc *sc = arg;
3454 	struct ieee80211com *ic = &sc->sc_ic;
3455 	struct ieee80211_node *ni;
3456 	enum ieee80211_state ostate;
3457 	usbd_status error = 0;
3458 
3459 	if (sc->sc_dying)
3460 		return;
3461 
3462 	ostate = ic->ic_state;
3463 
3464 	switch (sc->sc_state) {
3465 	case IEEE80211_S_INIT:
3466 		if (ostate == IEEE80211_S_RUN) {
3467 			/* turn link LED off */
3468 			(void)urtw_led_off(sc, URTW_LED_GPIO);
3469 		}
3470 		break;
3471 
3472 	case IEEE80211_S_SCAN:
3473 		urtw_set_chan(sc, ic->ic_curchan);
3474 		if (!sc->sc_dying)
3475 			callout_schedule(&sc->scan_to, mstohz(200));
3476 		break;
3477 
3478 	case IEEE80211_S_AUTH:
3479 	case IEEE80211_S_ASSOC:
3480 		urtw_set_chan(sc, ic->ic_curchan);
3481 		break;
3482 
3483 	case IEEE80211_S_RUN:
3484 		ni = ic->ic_bss;
3485 
3486 		urtw_set_chan(sc, ic->ic_curchan);
3487 
3488 		/* setting bssid. */
3489 		error = urtw_set_bssid(sc, ni->ni_bssid);
3490 		if (error != 0)
3491 			goto fail;
3492 		urtw_update_msr(sc);
3493 		/* XXX maybe the below would be incorrect. */
3494 		urtw_write16_m(sc, URTW_ATIM_WND, 2);
3495 		urtw_write16_m(sc, URTW_ATIM_TR_ITV, 100);
3496 		urtw_write16_m(sc, URTW_BEACON_INTERVAL, 0x64);
3497 		urtw_write16_m(sc, URTW_BEACON_INTERVAL_TIME, 0x3ff);
3498 		error = urtw_led_ctl(sc, URTW_LED_CTL_LINK);
3499 		if (error != 0)
3500 			printf("%s: could not control LED (%d)\n",
3501 			    device_xname(sc->sc_dev), error);
3502 		break;
3503 	}
3504 
3505 	sc->sc_newstate(ic, sc->sc_state, sc->sc_arg);
3506 
3507 fail:
3508 	if (error != 0) {
3509 		DPRINTF(("%s: error duing processing RUN state.",
3510 		    device_xname(sc->sc_dev)));
3511 	}
3512 }
3513 
3514 usbd_status
3515 urtw_8187b_update_wmm(struct urtw_softc *sc)
3516 {
3517 	struct ieee80211com *ic = &sc->sc_ic;
3518 	struct ieee80211_channel *c = ic->ic_ibss_chan;
3519 	uint32_t data;
3520 	uint8_t aifs, sifs, slot, ecwmin, ecwmax;
3521 	usbd_status error;
3522 
3523 	sifs = 0xa;
3524 	if (IEEE80211_IS_CHAN_G(c))
3525 		slot = 0x9;
3526 	else
3527 		slot = 0x14;
3528 
3529 	aifs = (2 * slot) + sifs;
3530 	ecwmin = 3;
3531 	ecwmax = 7;
3532 
3533 	data = ((uint32_t)aifs << 0) |		/* AIFS, offset 0 */
3534 	    ((uint32_t)ecwmin << 8) |		/* ECW minimum, offset 8 */
3535 	    ((uint32_t)ecwmax << 12);		/* ECW maximum, offset 16 */
3536 
3537 	urtw_write32_m(sc, URTW_AC_VO, data);
3538 	urtw_write32_m(sc, URTW_AC_VI, data);
3539 	urtw_write32_m(sc, URTW_AC_BE, data);
3540 	urtw_write32_m(sc, URTW_AC_BK, data);
3541 
3542 fail:
3543 	return (error);
3544 }
3545 
3546 usbd_status
3547 urtw_8187b_reset(struct urtw_softc *sc)
3548 {
3549 	uint8_t data;
3550 	usbd_status error;
3551 
3552 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
3553 	if (error)
3554 		goto fail;
3555 
3556 	urtw_read8_m(sc, URTW_CONFIG3, &data);
3557 	urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE |
3558 		URTW_CONFIG3_GNT_SELECT);
3559 
3560 	urtw_write32_m(sc, URTW_ANAPARAM2, URTW_8187B_8225_ANAPARAM2_ON);
3561 	urtw_write32_m(sc, URTW_ANAPARAM, URTW_8187B_8225_ANAPARAM_ON);
3562 	urtw_write8_m(sc, URTW_ANAPARAM3, URTW_8187B_8225_ANAPARAM3_ON);
3563 
3564 	urtw_write8_m(sc, 0x61, 0x10);
3565 	urtw_read8_m(sc, 0x62, &data);
3566 	urtw_write8_m(sc, 0x62, data & ~(1 << 5));
3567 	urtw_write8_m(sc, 0x62, data | (1 << 5));
3568 
3569 	urtw_read8_m(sc, URTW_CONFIG3, &data);
3570 	urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE);
3571 
3572 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
3573 	if (error)
3574 		goto fail;
3575 
3576 	urtw_read8_m(sc, URTW_CMD, &data);
3577 	data = (data & 2) | URTW_CMD_RST;
3578 	urtw_write8_m(sc, URTW_CMD, data);
3579 	usbd_delay_ms(sc->sc_udev, 100);
3580 
3581 	urtw_read8_m(sc, URTW_CMD, &data);
3582 	if (data & URTW_CMD_RST) {
3583 		printf("%s: reset timeout\n", device_xname(sc->sc_dev));
3584 		goto fail;
3585 	}
3586 
3587 fail:
3588 	return (error);
3589 }
3590 
3591 int
3592 urtw_8187b_init(struct ifnet *ifp)
3593 {
3594 	struct urtw_softc *sc = ifp->if_softc;
3595 	struct urtw_rf *rf = &sc->sc_rf;
3596 	struct ieee80211com *ic = &sc->sc_ic;
3597 	int ret;
3598 	uint8_t data;
3599 	usbd_status error;
3600 
3601 	urtw_stop(ifp, 0);
3602 
3603 	error = urtw_8187b_update_wmm(sc);
3604 	if (error != 0)
3605 		goto fail;
3606 	error = urtw_8187b_reset(sc);
3607 	if (error)
3608 		goto fail;
3609 
3610 	/* Applying MAC address again. */
3611 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
3612 	if (error)
3613 		goto fail;
3614 	IEEE80211_ADDR_COPY(ic->ic_myaddr, CLLADDR(ifp->if_sadl));
3615 	error = urtw_set_macaddr(sc, ic->ic_myaddr);
3616 	if (error)
3617 		goto fail;
3618 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
3619 	if (error)
3620 		goto fail;
3621 
3622 	error = urtw_update_msr(sc);
3623 	if (error)
3624 		goto fail;
3625 
3626 	error = rf->init(rf);
3627 	if (error != 0)
3628 		goto fail;
3629 
3630 	urtw_write8_m(sc, URTW_CMD, URTW_CMD_TX_ENABLE |
3631 		URTW_CMD_RX_ENABLE);
3632 	error = urtw_intr_enable(sc);
3633 	if (error != 0)
3634 		goto fail;
3635 
3636 	error = urtw_write8e(sc, 0x41, 0xf4);
3637 	if (error != 0)
3638 		goto fail;
3639 	error = urtw_write8e(sc, 0x40, 0x00);
3640 	if (error != 0)
3641 		goto fail;
3642 	error = urtw_write8e(sc, 0x42, 0x00);
3643 	if (error != 0)
3644 		goto fail;
3645 	error = urtw_write8e(sc, 0x42, 0x01);
3646 	if (error != 0)
3647 		goto fail;
3648 	error = urtw_write8e(sc, 0x40, 0x0f);
3649 	if (error != 0)
3650 		goto fail;
3651 	error = urtw_write8e(sc, 0x42, 0x00);
3652 	if (error != 0)
3653 		goto fail;
3654 	error = urtw_write8e(sc, 0x42, 0x01);
3655 	if (error != 0)
3656 		goto fail;
3657 
3658 	urtw_read8_m(sc, 0xdb, &data);
3659 	urtw_write8_m(sc, 0xdb, data | (1 << 2));
3660 	urtw_write16_idx_m(sc, 0x72, 0x59fa, 3);
3661 	urtw_write16_idx_m(sc, 0x74, 0x59d2, 3);
3662 	urtw_write16_idx_m(sc, 0x76, 0x59d2, 3);
3663 	urtw_write16_idx_m(sc, 0x78, 0x19fa, 3);
3664 	urtw_write16_idx_m(sc, 0x7a, 0x19fa, 3);
3665 	urtw_write16_idx_m(sc, 0x7c, 0x00d0, 3);
3666 	urtw_write8_m(sc, 0x61, 0);
3667 	urtw_write8_idx_m(sc, 0x80, 0x0f, 1);
3668 	urtw_write8_idx_m(sc, 0x83, 0x03, 1);
3669 	urtw_write8_m(sc, 0xda, 0x10);
3670 	urtw_write8_idx_m(sc, 0x4d, 0x08, 2);
3671 
3672 	urtw_write32_m(sc, URTW_HSSI_PARA, 0x0600321b);
3673 
3674 	urtw_write16_idx_m(sc, 0xec, 0x0800, 1);
3675 
3676 	urtw_write8_m(sc, URTW_ACM_CONTROL, 0);
3677 
3678 	/* Reset softc variables. */
3679 	sc->sc_txidx = sc->sc_tx_low_queued = sc->sc_tx_normal_queued = 0;
3680 	sc->sc_txtimer = 0;
3681 
3682 	if (!(sc->sc_flags & URTW_INIT_ONCE)) {
3683 		error = usbd_set_config_no(sc->sc_udev, URTW_CONFIG_NO, 0);
3684 		if (error != 0) {
3685 			aprint_error_dev(sc->sc_dev, "failed to set configuration"
3686 			    ", err=%s\n", usbd_errstr(error));
3687 
3688 			goto fail;
3689 		}
3690 		/* Get the first interface handle. */
3691 		error = usbd_device2interface_handle(sc->sc_udev,
3692 		    URTW_IFACE_INDEX, &sc->sc_iface);
3693 		if (error != 0) {
3694 			printf("%s: could not get interface handle\n",
3695 			    device_xname(sc->sc_dev));
3696 			goto fail;
3697 		}
3698 		error = urtw_open_pipes(sc);
3699 		if (error != 0)
3700 			goto fail;
3701 		ret = urtw_alloc_rx_data_list(sc);
3702 		if (error != 0)
3703 			goto fail;
3704 		ret = urtw_alloc_tx_data_list(sc);
3705 		if (error != 0)
3706 			goto fail;
3707 		sc->sc_flags |= URTW_INIT_ONCE;
3708 	}
3709 
3710 	error = urtw_rx_enable(sc);
3711 	if (error != 0)
3712 		goto fail;
3713 	error = urtw_tx_enable(sc);
3714 	if (error != 0)
3715 		goto fail;
3716 
3717 	ifp->if_flags &= ~IFF_OACTIVE;
3718 	ifp->if_flags |= IFF_RUNNING;
3719 
3720 	if (ic->ic_opmode == IEEE80211_M_MONITOR)
3721 		ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
3722 	else
3723 		ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
3724 
3725 fail:
3726 	return (error);
3727 }
3728 
3729 usbd_status
3730 urtw_8225v2_b_config_mac(struct urtw_softc *sc)
3731 {
3732 	int i;
3733 	usbd_status error;
3734 
3735 	for (i = 0; i < __arraycount(urtw_8187b_regtbl); i++) {
3736 		urtw_write8_idx_m(sc, urtw_8187b_regtbl[i].reg,
3737 		    urtw_8187b_regtbl[i].val, urtw_8187b_regtbl[i].idx);
3738 	}
3739 
3740 	urtw_write16_m(sc, URTW_TID_AC_MAP, 0xfa50);
3741 	urtw_write16_m(sc, URTW_INT_MIG, 0);
3742 
3743 	urtw_write32_idx_m(sc, 0xf0, 0, 1);
3744 	urtw_write32_idx_m(sc, 0xf4, 0, 1);
3745 	urtw_write8_idx_m(sc, 0xf8, 0, 1);
3746 
3747 	urtw_write32_m(sc, URTW_RF_TIMING, 0x00004001);
3748 
3749 fail:
3750 	return (error);
3751 }
3752 
3753 usbd_status
3754 urtw_8225v2_b_init_rfe(struct urtw_softc *sc)
3755 {
3756 	usbd_status error;
3757 
3758 	urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x0480);
3759 	urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x2488);
3760 	urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x1fff);
3761 	usbd_delay_ms(sc->sc_udev, 100);
3762 
3763 fail:
3764 	return (error);
3765 }
3766 
3767 usbd_status
3768 urtw_8225v2_b_update_chan(struct urtw_softc *sc)
3769 {
3770 	struct ieee80211com *ic = &sc->sc_ic;
3771 	struct ieee80211_channel *c = ic->ic_ibss_chan;
3772 	uint8_t aifs, difs, eifs, sifs, slot;
3773 	usbd_status error;
3774 
3775 	urtw_write8_m(sc, URTW_SIFS, 0x22);
3776 
3777 	sifs = 0xa;
3778 	if (IEEE80211_IS_CHAN_G(c)) {
3779 		slot = 0x9;
3780 		difs = 0x1c;
3781 		eifs = 0x5b;
3782 	} else {
3783 		slot = 0x14;
3784 		difs = 0x32;
3785 		eifs = 0x5b;
3786 	}
3787 	aifs = (2 * slot) + sifs;
3788 
3789 	urtw_write8_m(sc, URTW_SLOT, slot);
3790 
3791 	urtw_write8_m(sc, URTW_AC_VO, aifs);
3792 	urtw_write8_m(sc, URTW_AC_VI, aifs);
3793 	urtw_write8_m(sc, URTW_AC_BE, aifs);
3794 	urtw_write8_m(sc, URTW_AC_BK, aifs);
3795 
3796 	urtw_write8_m(sc, URTW_DIFS, difs);
3797 	urtw_write8_m(sc, URTW_8187B_EIFS, eifs);
3798 
3799 fail:
3800 	return (error);
3801 }
3802 
3803 usbd_status
3804 urtw_8225v2_b_rf_init(struct urtw_rf *rf)
3805 {
3806 	struct urtw_softc *sc = rf->rf_sc;
3807 	unsigned int i;
3808 	uint8_t data;
3809 	usbd_status error;
3810 
3811 	/* Set up ACK rate, retry limit, TX AGC, TX antenna. */
3812 	urtw_write16_m(sc, URTW_8187B_BRSR, 0x0fff);
3813 	urtw_read8_m(sc, URTW_CW_CONF, &data);
3814 	urtw_write8_m(sc, URTW_CW_CONF, data |
3815 		URTW_CW_CONF_PERPACKET_RETRY);
3816 	urtw_read8_m(sc, URTW_TX_AGC_CTL, &data);
3817 	urtw_write8_m(sc, URTW_TX_AGC_CTL, data |
3818 		URTW_TX_AGC_CTL_PERPACKET_GAIN |
3819 		URTW_TX_AGC_CTL_PERPACKET_ANTSEL);
3820 
3821 	/* Auto rate fallback control. */
3822 	urtw_write16_idx_m(sc, URTW_ARFR, 0x0fff, 1);	/* 1M ~ 54M */
3823 	urtw_read8_m(sc, URTW_RATE_FALLBACK, &data);
3824 	urtw_write8_m(sc, URTW_RATE_FALLBACK, data |
3825 		URTW_RATE_FALLBACK_ENABLE);
3826 
3827 	urtw_write16_m(sc, URTW_BEACON_INTERVAL, 100);
3828 	urtw_write16_m(sc, URTW_ATIM_WND, 2);
3829 	urtw_write16_idx_m(sc, URTW_FEMR, 0xffff, 1);
3830 
3831 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
3832 	if (error)
3833 		goto fail;
3834 	urtw_read8_m(sc, URTW_CONFIG1, &data);
3835 	urtw_write8_m(sc, URTW_CONFIG1, (data & 0x3f) | 0x80);
3836 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
3837 	if (error)
3838 		goto fail;
3839 
3840 	urtw_write8_m(sc, URTW_WPA_CONFIG, 0);
3841 	urtw_8225v2_b_config_mac(sc);
3842 	urtw_write16_idx_m(sc, URTW_RFSW_CTRL, 0x569a, 2);
3843 
3844 	error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
3845 	if (error)
3846 		goto fail;
3847 	urtw_read8_m(sc, URTW_CONFIG3, &data);
3848 	urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE);
3849 	error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
3850 	if (error)
3851 		goto fail;
3852 
3853 	urtw_8225v2_b_init_rfe(sc);
3854 
3855 	for (i = 0; i < __arraycount(urtw_8225v2_b_rf); i++) {
3856 		urtw_8225_write(sc, urtw_8225v2_b_rf[i].reg,
3857 		    urtw_8225v2_b_rf[i].val);
3858 	}
3859 
3860 	for (i = 0; i < __arraycount(urtw_8225v2_rxgain); i++) {
3861 		urtw_8225_write(sc, 0x1, (uint8_t)(i + 1));
3862 		urtw_8225_write(sc, 0x2, urtw_8225v2_rxgain[i]);
3863 	}
3864 
3865 	urtw_8225_write(sc, 0x03, 0x080);
3866 	urtw_8225_write(sc, 0x05, 0x004);
3867 	urtw_8225_write(sc, 0x00, 0x0b7);
3868 	urtw_8225_write(sc, 0x02, 0xc4d);
3869 	urtw_8225_write(sc, 0x02, 0x44d);
3870 	urtw_8225_write(sc, 0x00, 0x2bf);
3871 
3872 	urtw_write8_m(sc, URTW_TX_GAIN_CCK, 0x03);
3873 	urtw_write8_m(sc, URTW_TX_GAIN_OFDM, 0x07);
3874 	urtw_write8_m(sc, URTW_TX_ANTENNA, 0x03);
3875 
3876 	urtw_8187_write_phy_ofdm(sc, 0x80, 0x12);
3877 	for (i = 0; i < __arraycount(urtw_8225v2_agc); i++) {
3878 		urtw_8187_write_phy_ofdm(sc, 0x0f, urtw_8225v2_agc[i]);
3879 		urtw_8187_write_phy_ofdm(sc, 0x0e, (uint8_t)i + 0x80);
3880 		urtw_8187_write_phy_ofdm(sc, 0x0e, 0);
3881 	}
3882 	urtw_8187_write_phy_ofdm(sc, 0x80, 0x10);
3883 
3884 	for (i = 0; i < __arraycount(urtw_8225v2_ofdm); i++)
3885 		urtw_8187_write_phy_ofdm(sc, i, urtw_8225v2_ofdm[i]);
3886 
3887 	urtw_8225v2_b_update_chan(sc);
3888 
3889 	urtw_8187_write_phy_ofdm(sc, 0x97, 0x46);
3890 	urtw_8187_write_phy_ofdm(sc, 0xa4, 0xb6);
3891 	urtw_8187_write_phy_ofdm(sc, 0x85, 0xfc);
3892 	urtw_8187_write_phy_cck(sc, 0xc1, 0x88);
3893 
3894 	error = urtw_8225v2_b_rf_set_chan(rf, 1);
3895 fail:
3896 	return (error);
3897 }
3898 
3899 usbd_status
3900 urtw_8225v2_b_rf_set_chan(struct urtw_rf *rf, int chan)
3901 {
3902 	struct urtw_softc *sc = rf->rf_sc;
3903 	usbd_status error;
3904 
3905 	error = urtw_8225v2_b_set_txpwrlvl(sc, chan);
3906 	if (error)
3907 		goto fail;
3908 
3909 	urtw_8225_write(sc, 0x7, urtw_8225_channel[chan]);
3910 	/*
3911 	 * Delay removed from 8185 to 8187.
3912 	 * usbd_delay_ms(sc->sc_udev, 10);
3913 	 */
3914 
3915 	urtw_write16_m(sc, URTW_AC_VO, 0x5114);
3916 	urtw_write16_m(sc, URTW_AC_VI, 0x5114);
3917 	urtw_write16_m(sc, URTW_AC_BE, 0x5114);
3918 	urtw_write16_m(sc, URTW_AC_BK, 0x5114);
3919 
3920 fail:
3921 	return (error);
3922 }
3923 
3924 usbd_status
3925 urtw_8225v2_b_set_txpwrlvl(struct urtw_softc *sc, int chan)
3926 {
3927 	int i;
3928 	uint8_t *cck_pwrtable;
3929 	uint8_t cck_pwrlvl_min, cck_pwrlvl_max, ofdm_pwrlvl_min,
3930 	    ofdm_pwrlvl_max;
3931 	int8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff;
3932 	int8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff;
3933 	usbd_status error;
3934 
3935 	if (sc->sc_hwrev & URTW_HWREV_8187B_B) {
3936 		cck_pwrlvl_min = 0;
3937 		cck_pwrlvl_max = 15;
3938 		ofdm_pwrlvl_min = 2;
3939 		ofdm_pwrlvl_max = 17;
3940 	} else {
3941 		cck_pwrlvl_min = 7;
3942 		cck_pwrlvl_max = 22;
3943 		ofdm_pwrlvl_min = 10;
3944 		ofdm_pwrlvl_max = 25;
3945 	}
3946 
3947 	/* CCK power setting */
3948 	cck_pwrlvl = (cck_pwrlvl > (cck_pwrlvl_max - cck_pwrlvl_min)) ?
3949 	    cck_pwrlvl_max : (cck_pwrlvl + cck_pwrlvl_min);
3950 
3951 	cck_pwrlvl += sc->sc_txpwr_cck_base;
3952 	cck_pwrlvl = (cck_pwrlvl > 35) ? 35 : cck_pwrlvl;
3953 	cck_pwrlvl = (cck_pwrlvl < 0) ? 0 : cck_pwrlvl;
3954 
3955 	cck_pwrtable = (chan == 14) ? urtw_8225v2_txpwr_cck_ch14 :
3956 	    urtw_8225v2_txpwr_cck;
3957 
3958 	if (sc->sc_hwrev & URTW_HWREV_8187B_B) {
3959 		if (cck_pwrlvl <= 6)
3960 			; /* do nothing */
3961 		else if (cck_pwrlvl <= 11)
3962 			cck_pwrtable += 8;
3963 		else
3964 			cck_pwrtable += 16;
3965 	} else {
3966 		if (cck_pwrlvl <= 5)
3967 			; /* do nothing */
3968 		else if (cck_pwrlvl <= 11)
3969 			cck_pwrtable += 8;
3970 		else if (cck_pwrlvl <= 17)
3971 			cck_pwrtable += 16;
3972 		else
3973 			cck_pwrtable += 24;
3974 	}
3975 
3976 	for (i = 0; i < 8; i++) {
3977 		urtw_8187_write_phy_cck(sc, 0x44 + i, cck_pwrtable[i]);
3978 	}
3979 
3980 	urtw_write8_m(sc, URTW_TX_GAIN_CCK,
3981 	    urtw_8225v2_tx_gain_cck_ofdm[cck_pwrlvl] << 1);
3982 	/*
3983 	 * Delay removed from 8185 to 8187.
3984 	 * usbd_delay_ms(sc->sc_udev, 1);
3985 	 */
3986 
3987 	/* OFDM power setting */
3988 	ofdm_pwrlvl = (ofdm_pwrlvl > (ofdm_pwrlvl_max - ofdm_pwrlvl_min)) ?
3989 	    ofdm_pwrlvl_max : ofdm_pwrlvl + ofdm_pwrlvl_min;
3990 
3991 	ofdm_pwrlvl += sc->sc_txpwr_ofdm_base;
3992 	ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl;
3993 	ofdm_pwrlvl = (ofdm_pwrlvl < 0) ? 0 : ofdm_pwrlvl;
3994 
3995 	urtw_write8_m(sc, URTW_TX_GAIN_OFDM,
3996 	    urtw_8225v2_tx_gain_cck_ofdm[ofdm_pwrlvl] << 1);
3997 
3998 	if (sc->sc_hwrev & URTW_HWREV_8187B_B) {
3999 		if (ofdm_pwrlvl <= 11) {
4000 			urtw_8187_write_phy_ofdm(sc, 0x87, 0x60);
4001 			urtw_8187_write_phy_ofdm(sc, 0x89, 0x60);
4002 		} else {
4003 			urtw_8187_write_phy_ofdm(sc, 0x87, 0x5c);
4004 			urtw_8187_write_phy_ofdm(sc, 0x89, 0x5c);
4005 		}
4006 	} else {
4007 		if (ofdm_pwrlvl <= 11) {
4008 			urtw_8187_write_phy_ofdm(sc, 0x87, 0x5c);
4009 			urtw_8187_write_phy_ofdm(sc, 0x89, 0x5c);
4010 		} else if (ofdm_pwrlvl <= 17) {
4011 			urtw_8187_write_phy_ofdm(sc, 0x87, 0x54);
4012 			urtw_8187_write_phy_ofdm(sc, 0x89, 0x54);
4013 		} else {
4014 			urtw_8187_write_phy_ofdm(sc, 0x87, 0x50);
4015 			urtw_8187_write_phy_ofdm(sc, 0x89, 0x50);
4016 		}
4017 	}
4018 
4019 	/*
4020 	 * Delay removed from 8185 to 8187.
4021 	 * usbd_delay_ms(sc->sc_udev, 1);
4022 	 */
4023 fail:
4024 	return (error);
4025 }
4026 
4027 int
4028 urtw_set_bssid(struct urtw_softc *sc, const uint8_t *bssid)
4029 {
4030 	int error;
4031 
4032 	urtw_write32_m(sc, URTW_BSSID,
4033 	    bssid[0] | bssid[1] << 8 | bssid[2] << 16 | bssid[3] << 24);
4034 	urtw_write16_m(sc, URTW_BSSID + 4,
4035 	    bssid[4] | bssid[5] << 8);
4036 
4037 	return 0;
4038 
4039 fail:
4040 	return error;
4041 }
4042 
4043 int
4044 urtw_set_macaddr(struct urtw_softc *sc, const uint8_t *addr)
4045 {
4046 	int error;
4047 
4048 	urtw_write32_m(sc, URTW_MAC0,
4049 	    addr[0] | addr[1] << 8 | addr[2] << 16 | addr[3] << 24);
4050 	urtw_write16_m(sc, URTW_MAC4,
4051 	    addr[4] | addr[5] << 8);
4052 
4053 	return 0;
4054 
4055 fail:
4056 	return error;
4057 }
4058 
4059 MODULE(MODULE_CLASS_DRIVER, if_urtw, "bpf");
4060 
4061 #ifdef _MODULE
4062 #include "ioconf.c"
4063 #endif
4064 
4065 static int
4066 if_urtw_modcmd(modcmd_t cmd, void *aux)
4067 {
4068 	int error = 0;
4069 
4070 	switch (cmd) {
4071 	case MODULE_CMD_INIT:
4072 #ifdef _MODULE
4073 		error = config_init_component(cfdriver_ioconf_urtw,
4074 		    cfattach_ioconf_urtw, cfdata_ioconf_urtw);
4075 #endif
4076 		return error;
4077 	case MODULE_CMD_FINI:
4078 #ifdef _MODULE
4079 		error = config_fini_component(cfdriver_ioconf_urtw,
4080 		    cfattach_ioconf_urtw, cfdata_ioconf_urtw);
4081 #endif
4082 		return error;
4083 	default:
4084 		return ENOTTY;
4085 	}
4086 }
4087