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