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