2 * Copyright (c) 2008 Weongyo Jeong <weongyo@FreeBSD.org>
4 * Permission to use, copy, modify, and distribute this software for any
5 * purpose with or without fee is hereby granted, provided that the above
6 * copyright notice and this permission notice appear in all copies.
8 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 #include <sys/cdefs.h>
18 __FBSDID("$FreeBSD$");
22 #include <sys/param.h>
23 #include <sys/sockio.h>
24 #include <sys/sysctl.h>
26 #include <sys/mutex.h>
28 #include <sys/kernel.h>
29 #include <sys/socket.h>
30 #include <sys/systm.h>
31 #include <sys/malloc.h>
32 #include <sys/module.h>
34 #include <sys/endian.h>
38 #include <net/if_var.h>
39 #include <net/if_arp.h>
40 #include <net/ethernet.h>
41 #include <net/if_dl.h>
42 #include <net/if_media.h>
43 #include <net/if_types.h>
46 #include <netinet/in.h>
47 #include <netinet/in_systm.h>
48 #include <netinet/in_var.h>
49 #include <netinet/if_ether.h>
50 #include <netinet/ip.h>
53 #include <net80211/ieee80211_var.h>
54 #include <net80211/ieee80211_regdomain.h>
55 #include <net80211/ieee80211_radiotap.h>
57 #include <dev/usb/usb.h>
58 #include <dev/usb/usbdi.h>
61 #include <dev/usb/wlan/if_urtwreg.h>
62 #include <dev/usb/wlan/if_urtwvar.h>
64 /* copy some rate indices from if_rtwn_ridx.h */
65 #define URTW_RIDX_CCK5 2
66 #define URTW_RIDX_CCK11 3
67 #define URTW_RIDX_OFDM6 4
68 #define URTW_RIDX_OFDM24 8
70 static SYSCTL_NODE(_hw_usb, OID_AUTO, urtw, CTLFLAG_RW | CTLFLAG_MPSAFE, 0,
74 SYSCTL_INT(_hw_usb_urtw, OID_AUTO, debug, CTLFLAG_RWTUN, &urtw_debug, 0,
75 "control debugging printfs");
77 URTW_DEBUG_XMIT = 0x00000001, /* basic xmit operation */
78 URTW_DEBUG_RECV = 0x00000002, /* basic recv operation */
79 URTW_DEBUG_RESET = 0x00000004, /* reset processing */
80 URTW_DEBUG_TX_PROC = 0x00000008, /* tx ISR proc */
81 URTW_DEBUG_RX_PROC = 0x00000010, /* rx ISR proc */
82 URTW_DEBUG_STATE = 0x00000020, /* 802.11 state transitions */
83 URTW_DEBUG_STAT = 0x00000040, /* statistic */
84 URTW_DEBUG_INIT = 0x00000080, /* initialization of dev */
85 URTW_DEBUG_TXSTATUS = 0x00000100, /* tx status */
86 URTW_DEBUG_ANY = 0xffffffff
88 #define DPRINTF(sc, m, fmt, ...) do { \
89 if (sc->sc_debug & (m)) \
90 printf(fmt, __VA_ARGS__); \
93 #define DPRINTF(sc, m, fmt, ...) do { \
97 static int urtw_preamble_mode = URTW_PREAMBLE_MODE_LONG;
98 SYSCTL_INT(_hw_usb_urtw, OID_AUTO, preamble_mode, CTLFLAG_RWTUN,
99 &urtw_preamble_mode, 0, "set the preable mode (long or short)");
101 /* recognized device vendors/products */
102 #define urtw_lookup(v, p) \
103 ((const struct urtw_type *)usb_lookup(urtw_devs, v, p))
104 #define URTW_DEV_B(v,p) \
105 { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, URTW_REV_RTL8187B) }
106 #define URTW_DEV_L(v,p) \
107 { USB_VPI(USB_VENDOR_##v, USB_PRODUCT_##v##_##p, URTW_REV_RTL8187L) }
108 #define URTW_REV_RTL8187B 0
109 #define URTW_REV_RTL8187L 1
110 static const STRUCT_USB_HOST_ID urtw_devs[] = {
111 URTW_DEV_B(NETGEAR, WG111V3),
112 URTW_DEV_B(REALTEK, RTL8187B_0),
113 URTW_DEV_B(REALTEK, RTL8187B_1),
114 URTW_DEV_B(REALTEK, RTL8187B_2),
115 URTW_DEV_B(SITECOMEU, WL168V4),
116 URTW_DEV_L(ASUS, P5B_WIFI),
117 URTW_DEV_L(BELKIN, F5D7050E),
118 URTW_DEV_L(LINKSYS4, WUSB54GCV2),
119 URTW_DEV_L(NETGEAR, WG111V2),
120 URTW_DEV_L(REALTEK, RTL8187),
121 URTW_DEV_L(SITECOMEU, WL168V1),
122 URTW_DEV_L(SURECOM, EP9001G2A),
123 { USB_VPI(USB_VENDOR_OVISLINK, 0x8187, URTW_REV_RTL8187L) },
124 { USB_VPI(USB_VENDOR_DICKSMITH, 0x9401, URTW_REV_RTL8187L) },
125 { USB_VPI(USB_VENDOR_HP, 0xca02, URTW_REV_RTL8187L) },
126 { USB_VPI(USB_VENDOR_LOGITEC, 0x010c, URTW_REV_RTL8187L) },
127 { USB_VPI(USB_VENDOR_NETGEAR, 0x6100, URTW_REV_RTL8187L) },
128 { USB_VPI(USB_VENDOR_SPHAIRON, 0x0150, URTW_REV_RTL8187L) },
129 { USB_VPI(USB_VENDOR_QCOM, 0x6232, URTW_REV_RTL8187L) },
134 #define urtw_read8_m(sc, val, data) do { \
135 error = urtw_read8_c(sc, val, data); \
139 #define urtw_write8_m(sc, val, data) do { \
140 error = urtw_write8_c(sc, val, data); \
144 #define urtw_read16_m(sc, val, data) do { \
145 error = urtw_read16_c(sc, val, data); \
149 #define urtw_write16_m(sc, val, data) do { \
150 error = urtw_write16_c(sc, val, data); \
154 #define urtw_read32_m(sc, val, data) do { \
155 error = urtw_read32_c(sc, val, data); \
159 #define urtw_write32_m(sc, val, data) do { \
160 error = urtw_write32_c(sc, val, data); \
164 #define urtw_8187_write_phy_ofdm(sc, val, data) do { \
165 error = urtw_8187_write_phy_ofdm_c(sc, val, data); \
169 #define urtw_8187_write_phy_cck(sc, val, data) do { \
170 error = urtw_8187_write_phy_cck_c(sc, val, data); \
174 #define urtw_8225_write(sc, val, data) do { \
175 error = urtw_8225_write_c(sc, val, data); \
185 static uint8_t urtw_8225_agc[] = {
186 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9e, 0x9d, 0x9c, 0x9b,
187 0x9a, 0x99, 0x98, 0x97, 0x96, 0x95, 0x94, 0x93, 0x92, 0x91, 0x90,
188 0x8f, 0x8e, 0x8d, 0x8c, 0x8b, 0x8a, 0x89, 0x88, 0x87, 0x86, 0x85,
189 0x84, 0x83, 0x82, 0x81, 0x80, 0x3f, 0x3e, 0x3d, 0x3c, 0x3b, 0x3a,
190 0x39, 0x38, 0x37, 0x36, 0x35, 0x34, 0x33, 0x32, 0x31, 0x30, 0x2f,
191 0x2e, 0x2d, 0x2c, 0x2b, 0x2a, 0x29, 0x28, 0x27, 0x26, 0x25, 0x24,
192 0x23, 0x22, 0x21, 0x20, 0x1f, 0x1e, 0x1d, 0x1c, 0x1b, 0x1a, 0x19,
193 0x18, 0x17, 0x16, 0x15, 0x14, 0x13, 0x12, 0x11, 0x10, 0x0f, 0x0e,
194 0x0d, 0x0c, 0x0b, 0x0a, 0x09, 0x08, 0x07, 0x06, 0x05, 0x04, 0x03,
195 0x02, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
196 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01,
197 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01
200 static uint8_t urtw_8225z2_agc[] = {
201 0x5e, 0x5e, 0x5e, 0x5e, 0x5d, 0x5b, 0x59, 0x57, 0x55, 0x53, 0x51,
202 0x4f, 0x4d, 0x4b, 0x49, 0x47, 0x45, 0x43, 0x41, 0x3f, 0x3d, 0x3b,
203 0x39, 0x37, 0x35, 0x33, 0x31, 0x2f, 0x2d, 0x2b, 0x29, 0x27, 0x25,
204 0x23, 0x21, 0x1f, 0x1d, 0x1b, 0x19, 0x17, 0x15, 0x13, 0x11, 0x0f,
205 0x0d, 0x0b, 0x09, 0x07, 0x05, 0x03, 0x01, 0x01, 0x01, 0x01, 0x01,
206 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x01, 0x19, 0x19,
207 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x19, 0x20, 0x21, 0x22, 0x23,
208 0x24, 0x25, 0x26, 0x26, 0x27, 0x27, 0x28, 0x28, 0x29, 0x2a, 0x2a,
209 0x2a, 0x2b, 0x2b, 0x2b, 0x2c, 0x2c, 0x2c, 0x2d, 0x2d, 0x2d, 0x2d,
210 0x2e, 0x2e, 0x2e, 0x2e, 0x2f, 0x2f, 0x2f, 0x30, 0x30, 0x31, 0x31,
211 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31,
212 0x31, 0x31, 0x31, 0x31, 0x31, 0x31, 0x31
215 static uint32_t urtw_8225_channel[] = {
216 0x0000, /* dummy channel 0 */
233 static uint8_t urtw_8225_gain[] = {
234 0x23, 0x88, 0x7c, 0xa5, /* -82dbm */
235 0x23, 0x88, 0x7c, 0xb5, /* -82dbm */
236 0x23, 0x88, 0x7c, 0xc5, /* -82dbm */
237 0x33, 0x80, 0x79, 0xc5, /* -78dbm */
238 0x43, 0x78, 0x76, 0xc5, /* -74dbm */
239 0x53, 0x60, 0x73, 0xc5, /* -70dbm */
240 0x63, 0x58, 0x70, 0xc5, /* -66dbm */
243 static struct urtw_pair urtw_8225_rf_part1[] = {
244 { 0x00, 0x0067 }, { 0x01, 0x0fe0 }, { 0x02, 0x044d }, { 0x03, 0x0441 },
245 { 0x04, 0x0486 }, { 0x05, 0x0bc0 }, { 0x06, 0x0ae6 }, { 0x07, 0x082a },
246 { 0x08, 0x001f }, { 0x09, 0x0334 }, { 0x0a, 0x0fd4 }, { 0x0b, 0x0391 },
247 { 0x0c, 0x0050 }, { 0x0d, 0x06db }, { 0x0e, 0x0029 }, { 0x0f, 0x0914 },
250 static struct urtw_pair urtw_8225_rf_part2[] = {
251 { 0x00, 0x01 }, { 0x01, 0x02 }, { 0x02, 0x42 }, { 0x03, 0x00 },
252 { 0x04, 0x00 }, { 0x05, 0x00 }, { 0x06, 0x40 }, { 0x07, 0x00 },
253 { 0x08, 0x40 }, { 0x09, 0xfe }, { 0x0a, 0x09 }, { 0x0b, 0x80 },
254 { 0x0c, 0x01 }, { 0x0e, 0xd3 }, { 0x0f, 0x38 }, { 0x10, 0x84 },
255 { 0x11, 0x06 }, { 0x12, 0x20 }, { 0x13, 0x20 }, { 0x14, 0x00 },
256 { 0x15, 0x40 }, { 0x16, 0x00 }, { 0x17, 0x40 }, { 0x18, 0xef },
257 { 0x19, 0x19 }, { 0x1a, 0x20 }, { 0x1b, 0x76 }, { 0x1c, 0x04 },
258 { 0x1e, 0x95 }, { 0x1f, 0x75 }, { 0x20, 0x1f }, { 0x21, 0x27 },
259 { 0x22, 0x16 }, { 0x24, 0x46 }, { 0x25, 0x20 }, { 0x26, 0x90 },
263 static struct urtw_pair urtw_8225_rf_part3[] = {
264 { 0x00, 0x98 }, { 0x03, 0x20 }, { 0x04, 0x7e }, { 0x05, 0x12 },
265 { 0x06, 0xfc }, { 0x07, 0x78 }, { 0x08, 0x2e }, { 0x10, 0x9b },
266 { 0x11, 0x88 }, { 0x12, 0x47 }, { 0x13, 0xd0 }, { 0x19, 0x00 },
267 { 0x1a, 0xa0 }, { 0x1b, 0x08 }, { 0x40, 0x86 }, { 0x41, 0x8d },
268 { 0x42, 0x15 }, { 0x43, 0x18 }, { 0x44, 0x1f }, { 0x45, 0x1e },
269 { 0x46, 0x1a }, { 0x47, 0x15 }, { 0x48, 0x10 }, { 0x49, 0x0a },
270 { 0x4a, 0x05 }, { 0x4b, 0x02 }, { 0x4c, 0x05 }
273 static uint16_t urtw_8225_rxgain[] = {
274 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409,
275 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541,
276 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583,
277 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644,
278 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688,
279 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745,
280 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789,
281 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793,
282 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d,
283 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9,
284 0x07aa, 0x07ab, 0x07ac, 0x07ad, 0x07b0, 0x07b1, 0x07b2, 0x07b3,
285 0x07b4, 0x07b5, 0x07b8, 0x07b9, 0x07ba, 0x07bb, 0x07bb
288 static uint8_t urtw_8225_threshold[] = {
289 0x8d, 0x8d, 0x8d, 0x8d, 0x9d, 0xad, 0xbd,
292 static uint8_t urtw_8225_tx_gain_cck_ofdm[] = {
293 0x02, 0x06, 0x0e, 0x1e, 0x3e, 0x7e
296 static uint8_t urtw_8225_txpwr_cck[] = {
297 0x18, 0x17, 0x15, 0x11, 0x0c, 0x08, 0x04, 0x02,
298 0x1b, 0x1a, 0x17, 0x13, 0x0e, 0x09, 0x04, 0x02,
299 0x1f, 0x1e, 0x1a, 0x15, 0x10, 0x0a, 0x05, 0x02,
300 0x22, 0x21, 0x1d, 0x18, 0x11, 0x0b, 0x06, 0x02,
301 0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03,
302 0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03
305 static uint8_t urtw_8225_txpwr_cck_ch14[] = {
306 0x18, 0x17, 0x15, 0x0c, 0x00, 0x00, 0x00, 0x00,
307 0x1b, 0x1a, 0x17, 0x0e, 0x00, 0x00, 0x00, 0x00,
308 0x1f, 0x1e, 0x1a, 0x0f, 0x00, 0x00, 0x00, 0x00,
309 0x22, 0x21, 0x1d, 0x11, 0x00, 0x00, 0x00, 0x00,
310 0x26, 0x25, 0x21, 0x13, 0x00, 0x00, 0x00, 0x00,
311 0x2b, 0x2a, 0x25, 0x15, 0x00, 0x00, 0x00, 0x00
314 static uint8_t urtw_8225_txpwr_ofdm[]={
315 0x80, 0x90, 0xa2, 0xb5, 0xcb, 0xe4
318 static uint8_t urtw_8225v2_gain_bg[]={
319 0x23, 0x15, 0xa5, /* -82-1dbm */
320 0x23, 0x15, 0xb5, /* -82-2dbm */
321 0x23, 0x15, 0xc5, /* -82-3dbm */
322 0x33, 0x15, 0xc5, /* -78dbm */
323 0x43, 0x15, 0xc5, /* -74dbm */
324 0x53, 0x15, 0xc5, /* -70dbm */
325 0x63, 0x15, 0xc5, /* -66dbm */
328 static struct urtw_pair urtw_8225v2_rf_part1[] = {
329 { 0x00, 0x02bf }, { 0x01, 0x0ee0 }, { 0x02, 0x044d }, { 0x03, 0x0441 },
330 { 0x04, 0x08c3 }, { 0x05, 0x0c72 }, { 0x06, 0x00e6 }, { 0x07, 0x082a },
331 { 0x08, 0x003f }, { 0x09, 0x0335 }, { 0x0a, 0x09d4 }, { 0x0b, 0x07bb },
332 { 0x0c, 0x0850 }, { 0x0d, 0x0cdf }, { 0x0e, 0x002b }, { 0x0f, 0x0114 }
335 static struct urtw_pair urtw_8225v2b_rf_part0[] = {
336 { 0x00, 0x00b7 }, { 0x01, 0x0ee0 }, { 0x02, 0x044d }, { 0x03, 0x0441 },
337 { 0x04, 0x08c3 }, { 0x05, 0x0c72 }, { 0x06, 0x00e6 }, { 0x07, 0x082a },
338 { 0x08, 0x003f }, { 0x09, 0x0335 }, { 0x0a, 0x09d4 }, { 0x0b, 0x07bb },
339 { 0x0c, 0x0850 }, { 0x0d, 0x0cdf }, { 0x0e, 0x002b }, { 0x0f, 0x0114 }
342 static struct urtw_pair urtw_8225v2b_rf_part1[] = {
343 {0x0f0, 0x32}, {0x0f1, 0x32}, {0x0f2, 0x00},
344 {0x0f3, 0x00}, {0x0f4, 0x32}, {0x0f5, 0x43},
345 {0x0f6, 0x00}, {0x0f7, 0x00}, {0x0f8, 0x46},
346 {0x0f9, 0xa4}, {0x0fa, 0x00}, {0x0fb, 0x00},
347 {0x0fc, 0x96}, {0x0fd, 0xa4}, {0x0fe, 0x00},
348 {0x0ff, 0x00}, {0x158, 0x4b}, {0x159, 0x00},
349 {0x15a, 0x4b}, {0x15b, 0x00}, {0x160, 0x4b},
350 {0x161, 0x09}, {0x162, 0x4b}, {0x163, 0x09},
351 {0x1ce, 0x0f}, {0x1cf, 0x00}, {0x1e0, 0xff},
352 {0x1e1, 0x0f}, {0x1e2, 0x00}, {0x1f0, 0x4e},
353 {0x1f1, 0x01}, {0x1f2, 0x02}, {0x1f3, 0x03},
354 {0x1f4, 0x04}, {0x1f5, 0x05}, {0x1f6, 0x06},
355 {0x1f7, 0x07}, {0x1f8, 0x08}, {0x24e, 0x00},
356 {0x20c, 0x04}, {0x221, 0x61}, {0x222, 0x68},
357 {0x223, 0x6f}, {0x224, 0x76}, {0x225, 0x7d},
358 {0x226, 0x84}, {0x227, 0x8d}, {0x24d, 0x08},
359 {0x250, 0x05}, {0x251, 0xf5}, {0x252, 0x04},
360 {0x253, 0xa0}, {0x254, 0x1f}, {0x255, 0x23},
361 {0x256, 0x45}, {0x257, 0x67}, {0x258, 0x08},
362 {0x259, 0x08}, {0x25a, 0x08}, {0x25b, 0x08},
363 {0x260, 0x08}, {0x261, 0x08}, {0x262, 0x08},
364 {0x263, 0x08}, {0x264, 0xcf}, {0x272, 0x56},
365 {0x273, 0x9a}, {0x034, 0xf0}, {0x035, 0x0f},
366 {0x05b, 0x40}, {0x084, 0x88}, {0x085, 0x24},
367 {0x088, 0x54}, {0x08b, 0xb8}, {0x08c, 0x07},
368 {0x08d, 0x00}, {0x094, 0x1b}, {0x095, 0x12},
369 {0x096, 0x00}, {0x097, 0x06}, {0x09d, 0x1a},
370 {0x09f, 0x10}, {0x0b4, 0x22}, {0x0be, 0x80},
371 {0x0db, 0x00}, {0x0ee, 0x00}, {0x091, 0x03},
372 {0x24c, 0x00}, {0x39f, 0x00}, {0x08c, 0x01},
373 {0x08d, 0x10}, {0x08e, 0x08}, {0x08f, 0x00}
376 static struct urtw_pair urtw_8225v2_rf_part2[] = {
377 { 0x00, 0x01 }, { 0x01, 0x02 }, { 0x02, 0x42 }, { 0x03, 0x00 },
378 { 0x04, 0x00 }, { 0x05, 0x00 }, { 0x06, 0x40 }, { 0x07, 0x00 },
379 { 0x08, 0x40 }, { 0x09, 0xfe }, { 0x0a, 0x08 }, { 0x0b, 0x80 },
380 { 0x0c, 0x01 }, { 0x0d, 0x43 }, { 0x0e, 0xd3 }, { 0x0f, 0x38 },
381 { 0x10, 0x84 }, { 0x11, 0x07 }, { 0x12, 0x20 }, { 0x13, 0x20 },
382 { 0x14, 0x00 }, { 0x15, 0x40 }, { 0x16, 0x00 }, { 0x17, 0x40 },
383 { 0x18, 0xef }, { 0x19, 0x19 }, { 0x1a, 0x20 }, { 0x1b, 0x15 },
384 { 0x1c, 0x04 }, { 0x1d, 0xc5 }, { 0x1e, 0x95 }, { 0x1f, 0x75 },
385 { 0x20, 0x1f }, { 0x21, 0x17 }, { 0x22, 0x16 }, { 0x23, 0x80 },
386 { 0x24, 0x46 }, { 0x25, 0x00 }, { 0x26, 0x90 }, { 0x27, 0x88 }
389 static struct urtw_pair urtw_8225v2b_rf_part2[] = {
390 { 0x00, 0x10 }, { 0x01, 0x0d }, { 0x02, 0x01 }, { 0x03, 0x00 },
391 { 0x04, 0x14 }, { 0x05, 0xfb }, { 0x06, 0xfb }, { 0x07, 0x60 },
392 { 0x08, 0x00 }, { 0x09, 0x60 }, { 0x0a, 0x00 }, { 0x0b, 0x00 },
393 { 0x0c, 0x00 }, { 0x0d, 0x5c }, { 0x0e, 0x00 }, { 0x0f, 0x00 },
394 { 0x10, 0x40 }, { 0x11, 0x00 }, { 0x12, 0x40 }, { 0x13, 0x00 },
395 { 0x14, 0x00 }, { 0x15, 0x00 }, { 0x16, 0xa8 }, { 0x17, 0x26 },
396 { 0x18, 0x32 }, { 0x19, 0x33 }, { 0x1a, 0x07 }, { 0x1b, 0xa5 },
397 { 0x1c, 0x6f }, { 0x1d, 0x55 }, { 0x1e, 0xc8 }, { 0x1f, 0xb3 },
398 { 0x20, 0x0a }, { 0x21, 0xe1 }, { 0x22, 0x2C }, { 0x23, 0x8a },
399 { 0x24, 0x86 }, { 0x25, 0x83 }, { 0x26, 0x34 }, { 0x27, 0x0f },
400 { 0x28, 0x4f }, { 0x29, 0x24 }, { 0x2a, 0x6f }, { 0x2b, 0xc2 },
401 { 0x2c, 0x6b }, { 0x2d, 0x40 }, { 0x2e, 0x80 }, { 0x2f, 0x00 },
402 { 0x30, 0xc0 }, { 0x31, 0xc1 }, { 0x32, 0x58 }, { 0x33, 0xf1 },
403 { 0x34, 0x00 }, { 0x35, 0xe4 }, { 0x36, 0x90 }, { 0x37, 0x3e },
404 { 0x38, 0x6d }, { 0x39, 0x3c }, { 0x3a, 0xfb }, { 0x3b, 0x07 }
407 static struct urtw_pair urtw_8225v2_rf_part3[] = {
408 { 0x00, 0x98 }, { 0x03, 0x20 }, { 0x04, 0x7e }, { 0x05, 0x12 },
409 { 0x06, 0xfc }, { 0x07, 0x78 }, { 0x08, 0x2e }, { 0x09, 0x11 },
410 { 0x0a, 0x17 }, { 0x0b, 0x11 }, { 0x10, 0x9b }, { 0x11, 0x88 },
411 { 0x12, 0x47 }, { 0x13, 0xd0 }, { 0x19, 0x00 }, { 0x1a, 0xa0 },
412 { 0x1b, 0x08 }, { 0x1d, 0x00 }, { 0x40, 0x86 }, { 0x41, 0x9d },
413 { 0x42, 0x15 }, { 0x43, 0x18 }, { 0x44, 0x36 }, { 0x45, 0x35 },
414 { 0x46, 0x2e }, { 0x47, 0x25 }, { 0x48, 0x1c }, { 0x49, 0x12 },
415 { 0x4a, 0x09 }, { 0x4b, 0x04 }, { 0x4c, 0x05 }
418 static uint16_t urtw_8225v2_rxgain[] = {
419 0x0000, 0x0001, 0x0002, 0x0003, 0x0004, 0x0005, 0x0008, 0x0009,
420 0x000a, 0x000b, 0x0102, 0x0103, 0x0104, 0x0105, 0x0140, 0x0141,
421 0x0142, 0x0143, 0x0144, 0x0145, 0x0180, 0x0181, 0x0182, 0x0183,
422 0x0184, 0x0185, 0x0188, 0x0189, 0x018a, 0x018b, 0x0243, 0x0244,
423 0x0245, 0x0280, 0x0281, 0x0282, 0x0283, 0x0284, 0x0285, 0x0288,
424 0x0289, 0x028a, 0x028b, 0x028c, 0x0342, 0x0343, 0x0344, 0x0345,
425 0x0380, 0x0381, 0x0382, 0x0383, 0x0384, 0x0385, 0x0388, 0x0389,
426 0x038a, 0x038b, 0x038c, 0x038d, 0x0390, 0x0391, 0x0392, 0x0393,
427 0x0394, 0x0395, 0x0398, 0x0399, 0x039a, 0x039b, 0x039c, 0x039d,
428 0x03a0, 0x03a1, 0x03a2, 0x03a3, 0x03a4, 0x03a5, 0x03a8, 0x03a9,
429 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3,
430 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb
433 static uint16_t urtw_8225v2b_rxgain[] = {
434 0x0400, 0x0401, 0x0402, 0x0403, 0x0404, 0x0405, 0x0408, 0x0409,
435 0x040a, 0x040b, 0x0502, 0x0503, 0x0504, 0x0505, 0x0540, 0x0541,
436 0x0542, 0x0543, 0x0544, 0x0545, 0x0580, 0x0581, 0x0582, 0x0583,
437 0x0584, 0x0585, 0x0588, 0x0589, 0x058a, 0x058b, 0x0643, 0x0644,
438 0x0645, 0x0680, 0x0681, 0x0682, 0x0683, 0x0684, 0x0685, 0x0688,
439 0x0689, 0x068a, 0x068b, 0x068c, 0x0742, 0x0743, 0x0744, 0x0745,
440 0x0780, 0x0781, 0x0782, 0x0783, 0x0784, 0x0785, 0x0788, 0x0789,
441 0x078a, 0x078b, 0x078c, 0x078d, 0x0790, 0x0791, 0x0792, 0x0793,
442 0x0794, 0x0795, 0x0798, 0x0799, 0x079a, 0x079b, 0x079c, 0x079d,
443 0x07a0, 0x07a1, 0x07a2, 0x07a3, 0x07a4, 0x07a5, 0x07a8, 0x07a9,
444 0x03aa, 0x03ab, 0x03ac, 0x03ad, 0x03b0, 0x03b1, 0x03b2, 0x03b3,
445 0x03b4, 0x03b5, 0x03b8, 0x03b9, 0x03ba, 0x03bb, 0x03bb
448 static uint8_t urtw_8225v2_tx_gain_cck_ofdm[] = {
449 0x00, 0x01, 0x02, 0x03, 0x04, 0x05,
450 0x06, 0x07, 0x08, 0x09, 0x0a, 0x0b,
451 0x0c, 0x0d, 0x0e, 0x0f, 0x10, 0x11,
452 0x12, 0x13, 0x14, 0x15, 0x16, 0x17,
453 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d,
454 0x1e, 0x1f, 0x20, 0x21, 0x22, 0x23,
457 static uint8_t urtw_8225v2_txpwr_cck[] = {
458 0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04
461 static uint8_t urtw_8225v2_txpwr_cck_ch14[] = {
462 0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00
465 static uint8_t urtw_8225v2b_txpwr_cck[] = {
466 0x36, 0x35, 0x2e, 0x25, 0x1c, 0x12, 0x09, 0x04,
467 0x30, 0x2f, 0x29, 0x21, 0x19, 0x10, 0x08, 0x03,
468 0x2b, 0x2a, 0x25, 0x1e, 0x16, 0x0e, 0x07, 0x03,
469 0x26, 0x25, 0x21, 0x1b, 0x14, 0x0d, 0x06, 0x03
472 static uint8_t urtw_8225v2b_txpwr_cck_ch14[] = {
473 0x36, 0x35, 0x2e, 0x1b, 0x00, 0x00, 0x00, 0x00,
474 0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00,
475 0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00,
476 0x30, 0x2f, 0x29, 0x15, 0x00, 0x00, 0x00, 0x00
479 static struct urtw_pair urtw_ratetable[] = {
480 { 2, 0 }, { 4, 1 }, { 11, 2 }, { 12, 4 }, { 18, 5 },
481 { 22, 3 }, { 24, 6 }, { 36, 7 }, { 48, 8 }, { 72, 9 },
482 { 96, 10 }, { 108, 11 }
486 static const uint8_t urtw_8187b_reg_table[][3] = {
487 { 0xf0, 0x32, 0 }, { 0xf1, 0x32, 0 }, { 0xf2, 0x00, 0 },
488 { 0xf3, 0x00, 0 }, { 0xf4, 0x32, 0 }, { 0xf5, 0x43, 0 },
489 { 0xf6, 0x00, 0 }, { 0xf7, 0x00, 0 }, { 0xf8, 0x46, 0 },
490 { 0xf9, 0xa4, 0 }, { 0xfa, 0x00, 0 }, { 0xfb, 0x00, 0 },
491 { 0xfc, 0x96, 0 }, { 0xfd, 0xa4, 0 }, { 0xfe, 0x00, 0 },
492 { 0xff, 0x00, 0 }, { 0x58, 0x4b, 1 }, { 0x59, 0x00, 1 },
493 { 0x5a, 0x4b, 1 }, { 0x5b, 0x00, 1 }, { 0x60, 0x4b, 1 },
494 { 0x61, 0x09, 1 }, { 0x62, 0x4b, 1 }, { 0x63, 0x09, 1 },
495 { 0xce, 0x0f, 1 }, { 0xcf, 0x00, 1 }, { 0xe0, 0xff, 1 },
496 { 0xe1, 0x0f, 1 }, { 0xe2, 0x00, 1 }, { 0xf0, 0x4e, 1 },
497 { 0xf1, 0x01, 1 }, { 0xf2, 0x02, 1 }, { 0xf3, 0x03, 1 },
498 { 0xf4, 0x04, 1 }, { 0xf5, 0x05, 1 }, { 0xf6, 0x06, 1 },
499 { 0xf7, 0x07, 1 }, { 0xf8, 0x08, 1 }, { 0x4e, 0x00, 2 },
500 { 0x0c, 0x04, 2 }, { 0x21, 0x61, 2 }, { 0x22, 0x68, 2 },
501 { 0x23, 0x6f, 2 }, { 0x24, 0x76, 2 }, { 0x25, 0x7d, 2 },
502 { 0x26, 0x84, 2 }, { 0x27, 0x8d, 2 }, { 0x4d, 0x08, 2 },
503 { 0x50, 0x05, 2 }, { 0x51, 0xf5, 2 }, { 0x52, 0x04, 2 },
504 { 0x53, 0xa0, 2 }, { 0x54, 0x1f, 2 }, { 0x55, 0x23, 2 },
505 { 0x56, 0x45, 2 }, { 0x57, 0x67, 2 }, { 0x58, 0x08, 2 },
506 { 0x59, 0x08, 2 }, { 0x5a, 0x08, 2 }, { 0x5b, 0x08, 2 },
507 { 0x60, 0x08, 2 }, { 0x61, 0x08, 2 }, { 0x62, 0x08, 2 },
508 { 0x63, 0x08, 2 }, { 0x64, 0xcf, 2 }, { 0x72, 0x56, 2 },
509 { 0x73, 0x9a, 2 }, { 0x34, 0xf0, 0 }, { 0x35, 0x0f, 0 },
510 { 0x5b, 0x40, 0 }, { 0x84, 0x88, 0 }, { 0x85, 0x24, 0 },
511 { 0x88, 0x54, 0 }, { 0x8b, 0xb8, 0 }, { 0x8c, 0x07, 0 },
512 { 0x8d, 0x00, 0 }, { 0x94, 0x1b, 0 }, { 0x95, 0x12, 0 },
513 { 0x96, 0x00, 0 }, { 0x97, 0x06, 0 }, { 0x9d, 0x1a, 0 },
514 { 0x9f, 0x10, 0 }, { 0xb4, 0x22, 0 }, { 0xbe, 0x80, 0 },
515 { 0xdb, 0x00, 0 }, { 0xee, 0x00, 0 }, { 0x91, 0x03, 0 },
516 { 0x4c, 0x00, 2 }, { 0x9f, 0x00, 3 }, { 0x8c, 0x01, 0 },
517 { 0x8d, 0x10, 0 }, { 0x8e, 0x08, 0 }, { 0x8f, 0x00, 0 }
521 static usb_callback_t urtw_bulk_rx_callback;
522 static usb_callback_t urtw_bulk_tx_callback;
523 static usb_callback_t urtw_bulk_tx_status_callback;
525 static const struct usb_config urtw_8187b_usbconfig[URTW_8187B_N_XFERS] = {
526 [URTW_8187B_BULK_RX] = {
529 .direction = UE_DIR_IN,
536 .callback = urtw_bulk_rx_callback
538 [URTW_8187B_BULK_TX_STATUS] = {
541 .direction = UE_DIR_IN,
542 .bufsize = sizeof(uint64_t),
547 .callback = urtw_bulk_tx_status_callback
549 [URTW_8187B_BULK_TX_BE] = {
551 .endpoint = URTW_8187B_TXPIPE_BE,
552 .direction = UE_DIR_OUT,
553 .bufsize = URTW_TX_MAXSIZE * URTW_TX_DATA_LIST_COUNT,
555 .force_short_xfer = 1,
558 .callback = urtw_bulk_tx_callback,
559 .timeout = URTW_DATA_TIMEOUT
561 [URTW_8187B_BULK_TX_BK] = {
563 .endpoint = URTW_8187B_TXPIPE_BK,
564 .direction = UE_DIR_OUT,
565 .bufsize = URTW_TX_MAXSIZE,
568 .force_short_xfer = 1,
571 .callback = urtw_bulk_tx_callback,
572 .timeout = URTW_DATA_TIMEOUT
574 [URTW_8187B_BULK_TX_VI] = {
576 .endpoint = URTW_8187B_TXPIPE_VI,
577 .direction = UE_DIR_OUT,
578 .bufsize = URTW_TX_MAXSIZE,
581 .force_short_xfer = 1,
584 .callback = urtw_bulk_tx_callback,
585 .timeout = URTW_DATA_TIMEOUT
587 [URTW_8187B_BULK_TX_VO] = {
589 .endpoint = URTW_8187B_TXPIPE_VO,
590 .direction = UE_DIR_OUT,
591 .bufsize = URTW_TX_MAXSIZE,
594 .force_short_xfer = 1,
597 .callback = urtw_bulk_tx_callback,
598 .timeout = URTW_DATA_TIMEOUT
600 [URTW_8187B_BULK_TX_EP12] = {
603 .direction = UE_DIR_OUT,
604 .bufsize = URTW_TX_MAXSIZE,
607 .force_short_xfer = 1,
610 .callback = urtw_bulk_tx_callback,
611 .timeout = URTW_DATA_TIMEOUT
615 static const struct usb_config urtw_8187l_usbconfig[URTW_8187L_N_XFERS] = {
616 [URTW_8187L_BULK_RX] = {
619 .direction = UE_DIR_IN,
626 .callback = urtw_bulk_rx_callback
628 [URTW_8187L_BULK_TX_LOW] = {
631 .direction = UE_DIR_OUT,
632 .bufsize = URTW_TX_MAXSIZE * URTW_TX_DATA_LIST_COUNT,
634 .force_short_xfer = 1,
637 .callback = urtw_bulk_tx_callback,
638 .timeout = URTW_DATA_TIMEOUT
640 [URTW_8187L_BULK_TX_NORMAL] = {
643 .direction = UE_DIR_OUT,
644 .bufsize = URTW_TX_MAXSIZE,
647 .force_short_xfer = 1,
650 .callback = urtw_bulk_tx_callback,
651 .timeout = URTW_DATA_TIMEOUT
655 static struct ieee80211vap *urtw_vap_create(struct ieee80211com *,
656 const char [IFNAMSIZ], int, enum ieee80211_opmode,
657 int, const uint8_t [IEEE80211_ADDR_LEN],
658 const uint8_t [IEEE80211_ADDR_LEN]);
659 static void urtw_vap_delete(struct ieee80211vap *);
660 static void urtw_init(struct urtw_softc *);
661 static void urtw_stop(struct urtw_softc *);
662 static void urtw_parent(struct ieee80211com *);
663 static int urtw_transmit(struct ieee80211com *, struct mbuf *);
664 static void urtw_start(struct urtw_softc *);
665 static int urtw_alloc_rx_data_list(struct urtw_softc *);
666 static int urtw_alloc_tx_data_list(struct urtw_softc *);
667 static int urtw_raw_xmit(struct ieee80211_node *, struct mbuf *,
668 const struct ieee80211_bpf_params *);
669 static void urtw_scan_start(struct ieee80211com *);
670 static void urtw_scan_end(struct ieee80211com *);
671 static void urtw_getradiocaps(struct ieee80211com *, int, int *,
672 struct ieee80211_channel[]);
673 static void urtw_set_channel(struct ieee80211com *);
674 static void urtw_update_promisc(struct ieee80211com *);
675 static void urtw_update_mcast(struct ieee80211com *);
676 static int urtw_tx_start(struct urtw_softc *,
677 struct ieee80211_node *, struct mbuf *,
678 struct urtw_data *, int);
679 static int urtw_newstate(struct ieee80211vap *,
680 enum ieee80211_state, int);
681 static void urtw_led_ch(void *);
682 static void urtw_ledtask(void *, int);
683 static void urtw_watchdog(void *);
684 static void urtw_set_multi(void *);
685 static int urtw_isbmode(uint16_t);
686 static uint16_t urtw_rtl2rate(uint32_t);
687 static usb_error_t urtw_set_rate(struct urtw_softc *);
688 static usb_error_t urtw_update_msr(struct urtw_softc *);
689 static usb_error_t urtw_read8_c(struct urtw_softc *, int, uint8_t *);
690 static usb_error_t urtw_read16_c(struct urtw_softc *, int, uint16_t *);
691 static usb_error_t urtw_read32_c(struct urtw_softc *, int, uint32_t *);
692 static usb_error_t urtw_write8_c(struct urtw_softc *, int, uint8_t);
693 static usb_error_t urtw_write16_c(struct urtw_softc *, int, uint16_t);
694 static usb_error_t urtw_write32_c(struct urtw_softc *, int, uint32_t);
695 static usb_error_t urtw_eprom_cs(struct urtw_softc *, int);
696 static usb_error_t urtw_eprom_ck(struct urtw_softc *);
697 static usb_error_t urtw_eprom_sendbits(struct urtw_softc *, int16_t *,
699 static usb_error_t urtw_eprom_read32(struct urtw_softc *, uint32_t,
701 static usb_error_t urtw_eprom_readbit(struct urtw_softc *, int16_t *);
702 static usb_error_t urtw_eprom_writebit(struct urtw_softc *, int16_t);
703 static usb_error_t urtw_get_macaddr(struct urtw_softc *);
704 static usb_error_t urtw_get_txpwr(struct urtw_softc *);
705 static usb_error_t urtw_get_rfchip(struct urtw_softc *);
706 static usb_error_t urtw_led_init(struct urtw_softc *);
707 static usb_error_t urtw_8185_rf_pins_enable(struct urtw_softc *);
708 static usb_error_t urtw_8185_tx_antenna(struct urtw_softc *, uint8_t);
709 static usb_error_t urtw_8187_write_phy(struct urtw_softc *, uint8_t,
711 static usb_error_t urtw_8187_write_phy_ofdm_c(struct urtw_softc *,
713 static usb_error_t urtw_8187_write_phy_cck_c(struct urtw_softc *, uint8_t,
715 static usb_error_t urtw_8225_setgain(struct urtw_softc *, int16_t);
716 static usb_error_t urtw_8225_usb_init(struct urtw_softc *);
717 static usb_error_t urtw_8225_write_c(struct urtw_softc *, uint8_t,
719 static usb_error_t urtw_8225_write_s16(struct urtw_softc *, uint8_t, int,
721 static usb_error_t urtw_8225_read(struct urtw_softc *, uint8_t,
723 static usb_error_t urtw_8225_rf_init(struct urtw_softc *);
724 static usb_error_t urtw_8225_rf_set_chan(struct urtw_softc *, int);
725 static usb_error_t urtw_8225_rf_set_sens(struct urtw_softc *, int);
726 static usb_error_t urtw_8225_set_txpwrlvl(struct urtw_softc *, int);
727 static usb_error_t urtw_8225_rf_stop(struct urtw_softc *);
728 static usb_error_t urtw_8225v2_rf_init(struct urtw_softc *);
729 static usb_error_t urtw_8225v2_rf_set_chan(struct urtw_softc *, int);
730 static usb_error_t urtw_8225v2_set_txpwrlvl(struct urtw_softc *, int);
731 static usb_error_t urtw_8225v2_setgain(struct urtw_softc *, int16_t);
732 static usb_error_t urtw_8225_isv2(struct urtw_softc *, int *);
733 static usb_error_t urtw_8225v2b_rf_init(struct urtw_softc *);
734 static usb_error_t urtw_8225v2b_rf_set_chan(struct urtw_softc *, int);
735 static usb_error_t urtw_read8e(struct urtw_softc *, int, uint8_t *);
736 static usb_error_t urtw_write8e(struct urtw_softc *, int, uint8_t);
737 static usb_error_t urtw_8180_set_anaparam(struct urtw_softc *, uint32_t);
738 static usb_error_t urtw_8185_set_anaparam2(struct urtw_softc *, uint32_t);
739 static usb_error_t urtw_intr_enable(struct urtw_softc *);
740 static usb_error_t urtw_intr_disable(struct urtw_softc *);
741 static usb_error_t urtw_reset(struct urtw_softc *);
742 static usb_error_t urtw_led_on(struct urtw_softc *, int);
743 static usb_error_t urtw_led_ctl(struct urtw_softc *, int);
744 static usb_error_t urtw_led_blink(struct urtw_softc *);
745 static usb_error_t urtw_led_mode0(struct urtw_softc *, int);
746 static usb_error_t urtw_led_mode1(struct urtw_softc *, int);
747 static usb_error_t urtw_led_mode2(struct urtw_softc *, int);
748 static usb_error_t urtw_led_mode3(struct urtw_softc *, int);
749 static usb_error_t urtw_rx_setconf(struct urtw_softc *);
750 static usb_error_t urtw_rx_enable(struct urtw_softc *);
751 static usb_error_t urtw_tx_enable(struct urtw_softc *sc);
752 static void urtw_free_tx_data_list(struct urtw_softc *);
753 static void urtw_free_rx_data_list(struct urtw_softc *);
754 static void urtw_free_data_list(struct urtw_softc *,
755 struct urtw_data data[], int, int);
756 static usb_error_t urtw_set_macaddr(struct urtw_softc *, const uint8_t *);
757 static usb_error_t urtw_adapter_start(struct urtw_softc *);
758 static usb_error_t urtw_adapter_start_b(struct urtw_softc *);
759 static usb_error_t urtw_set_mode(struct urtw_softc *, uint32_t);
760 static usb_error_t urtw_8187b_cmd_reset(struct urtw_softc *);
761 static usb_error_t urtw_do_request(struct urtw_softc *,
762 struct usb_device_request *, void *);
763 static usb_error_t urtw_8225v2b_set_txpwrlvl(struct urtw_softc *, int);
764 static usb_error_t urtw_led_off(struct urtw_softc *, int);
765 static void urtw_abort_xfers(struct urtw_softc *);
766 static struct urtw_data *
767 urtw_getbuf(struct urtw_softc *sc);
768 static int urtw_compute_txtime(uint16_t, uint16_t, uint8_t,
770 static void urtw_updateslot(struct ieee80211com *);
771 static void urtw_updateslottask(void *, int);
772 static void urtw_sysctl_node(struct urtw_softc *);
775 urtw_match(device_t dev)
777 struct usb_attach_arg *uaa = device_get_ivars(dev);
779 if (uaa->usb_mode != USB_MODE_HOST)
781 if (uaa->info.bConfigIndex != URTW_CONFIG_INDEX)
783 if (uaa->info.bIfaceIndex != URTW_IFACE_INDEX)
786 return (usbd_lookup_id_by_uaa(urtw_devs, sizeof(urtw_devs), uaa));
790 urtw_attach(device_t dev)
792 const struct usb_config *setup_start;
794 struct urtw_softc *sc = device_get_softc(dev);
795 struct usb_attach_arg *uaa = device_get_ivars(dev);
796 struct ieee80211com *ic = &sc->sc_ic;
797 uint8_t iface_index = URTW_IFACE_INDEX; /* XXX */
802 device_set_usb_desc(dev);
805 sc->sc_udev = uaa->device;
806 if (USB_GET_DRIVER_INFO(uaa) == URTW_REV_RTL8187B)
807 sc->sc_flags |= URTW_RTL8187B;
809 sc->sc_debug = urtw_debug;
812 mtx_init(&sc->sc_mtx, device_get_nameunit(sc->sc_dev), MTX_NETWORK_LOCK,
814 usb_callout_init_mtx(&sc->sc_led_ch, &sc->sc_mtx, 0);
815 TASK_INIT(&sc->sc_led_task, 0, urtw_ledtask, sc);
816 TASK_INIT(&sc->sc_updateslot_task, 0, urtw_updateslottask, sc);
817 callout_init(&sc->sc_watchdog_ch, 0);
818 mbufq_init(&sc->sc_snd, ifqmaxlen);
820 if (sc->sc_flags & URTW_RTL8187B) {
821 setup_start = urtw_8187b_usbconfig;
822 n_setup = URTW_8187B_N_XFERS;
824 setup_start = urtw_8187l_usbconfig;
825 n_setup = URTW_8187L_N_XFERS;
828 error = usbd_transfer_setup(uaa->device, &iface_index, sc->sc_xfer,
829 setup_start, n_setup, sc, &sc->sc_mtx);
831 device_printf(dev, "could not allocate USB transfers, "
832 "err=%s\n", usbd_errstr(error));
837 if (sc->sc_flags & URTW_RTL8187B) {
839 usbd_xfer_get_frame_buffer(sc->sc_xfer[
840 URTW_8187B_BULK_TX_BE], 0);
843 usbd_xfer_get_frame_buffer(sc->sc_xfer[
844 URTW_8187L_BULK_TX_LOW], 0);
849 urtw_read32_m(sc, URTW_RX, &data);
850 sc->sc_epromtype = (data & URTW_RX_9356SEL) ? URTW_EEPROM_93C56 :
853 error = urtw_get_rfchip(sc);
856 error = urtw_get_macaddr(sc);
859 error = urtw_get_txpwr(sc);
862 error = urtw_led_init(sc);
868 sc->sc_rts_retry = URTW_DEFAULT_RTS_RETRY;
869 sc->sc_tx_retry = URTW_DEFAULT_TX_RETRY;
870 sc->sc_currate = URTW_RIDX_CCK11;
871 sc->sc_preamble_mode = urtw_preamble_mode;
874 ic->ic_name = device_get_nameunit(dev);
875 ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */
876 ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */
878 /* set device capabilities */
880 IEEE80211_C_STA | /* station mode */
881 IEEE80211_C_MONITOR | /* monitor mode supported */
882 IEEE80211_C_TXPMGT | /* tx power management */
883 IEEE80211_C_SHPREAMBLE | /* short preamble supported */
884 IEEE80211_C_SHSLOT | /* short slot time supported */
885 IEEE80211_C_BGSCAN | /* capable of bg scanning */
886 IEEE80211_C_WPA; /* 802.11i */
888 /* XXX TODO: setup regdomain if URTW_EPROM_CHANPLAN_BY_HW bit is set.*/
890 urtw_getradiocaps(ic, IEEE80211_CHAN_MAX, &ic->ic_nchans,
893 ieee80211_ifattach(ic);
894 ic->ic_raw_xmit = urtw_raw_xmit;
895 ic->ic_scan_start = urtw_scan_start;
896 ic->ic_scan_end = urtw_scan_end;
897 ic->ic_getradiocaps = urtw_getradiocaps;
898 ic->ic_set_channel = urtw_set_channel;
899 ic->ic_updateslot = urtw_updateslot;
900 ic->ic_vap_create = urtw_vap_create;
901 ic->ic_vap_delete = urtw_vap_delete;
902 ic->ic_update_promisc = urtw_update_promisc;
903 ic->ic_update_mcast = urtw_update_mcast;
904 ic->ic_parent = urtw_parent;
905 ic->ic_transmit = urtw_transmit;
907 ieee80211_radiotap_attach(ic,
908 &sc->sc_txtap.wt_ihdr, sizeof(sc->sc_txtap),
909 URTW_TX_RADIOTAP_PRESENT,
910 &sc->sc_rxtap.wr_ihdr, sizeof(sc->sc_rxtap),
911 URTW_RX_RADIOTAP_PRESENT);
913 urtw_sysctl_node(sc);
916 ieee80211_announce(ic);
921 usbd_transfer_unsetup(sc->sc_xfer, (sc->sc_flags & URTW_RTL8187B) ?
922 URTW_8187B_N_XFERS : URTW_8187L_N_XFERS);
928 urtw_detach(device_t dev)
930 struct urtw_softc *sc = device_get_softc(dev);
931 struct ieee80211com *ic = &sc->sc_ic;
933 unsigned int n_xfers;
935 /* Prevent further ioctls */
937 sc->sc_flags |= URTW_DETACHED;
941 ieee80211_draintask(ic, &sc->sc_updateslot_task);
942 ieee80211_draintask(ic, &sc->sc_led_task);
944 usb_callout_drain(&sc->sc_led_ch);
945 callout_drain(&sc->sc_watchdog_ch);
947 n_xfers = (sc->sc_flags & URTW_RTL8187B) ?
948 URTW_8187B_N_XFERS : URTW_8187L_N_XFERS;
950 /* prevent further allocations from RX/TX data lists */
952 STAILQ_INIT(&sc->sc_tx_active);
953 STAILQ_INIT(&sc->sc_tx_inactive);
954 STAILQ_INIT(&sc->sc_tx_pending);
956 STAILQ_INIT(&sc->sc_rx_active);
957 STAILQ_INIT(&sc->sc_rx_inactive);
960 /* drain USB transfers */
961 for (x = 0; x != n_xfers; x++)
962 usbd_transfer_drain(sc->sc_xfer[x]);
964 /* free data buffers */
966 urtw_free_tx_data_list(sc);
967 urtw_free_rx_data_list(sc);
970 /* free USB transfers and some data buffers */
971 usbd_transfer_unsetup(sc->sc_xfer, n_xfers);
973 ieee80211_ifdetach(ic);
974 mbufq_drain(&sc->sc_snd);
975 mtx_destroy(&sc->sc_mtx);
980 urtw_free_tx_data_list(struct urtw_softc *sc)
982 urtw_free_data_list(sc, sc->sc_tx, URTW_TX_DATA_LIST_COUNT, 0);
986 urtw_free_rx_data_list(struct urtw_softc *sc)
988 urtw_free_data_list(sc, sc->sc_rx, URTW_RX_DATA_LIST_COUNT, 1);
992 urtw_free_data_list(struct urtw_softc *sc, struct urtw_data data[], int ndata,
997 for (i = 0; i < ndata; i++) {
998 struct urtw_data *dp = &data[i];
1000 if (fillmbuf == 1) {
1001 if (dp->m != NULL) {
1009 if (dp->ni != NULL) {
1010 ieee80211_free_node(dp->ni);
1016 static struct ieee80211vap *
1017 urtw_vap_create(struct ieee80211com *ic, const char name[IFNAMSIZ], int unit,
1018 enum ieee80211_opmode opmode, int flags,
1019 const uint8_t bssid[IEEE80211_ADDR_LEN],
1020 const uint8_t mac[IEEE80211_ADDR_LEN])
1022 struct urtw_vap *uvp;
1023 struct ieee80211vap *vap;
1025 if (!TAILQ_EMPTY(&ic->ic_vaps)) /* only one at a time */
1027 uvp = malloc(sizeof(struct urtw_vap), M_80211_VAP, M_WAITOK | M_ZERO);
1029 /* enable s/w bmiss handling for sta mode */
1031 if (ieee80211_vap_setup(ic, vap, name, unit, opmode,
1032 flags | IEEE80211_CLONE_NOBEACONS, bssid) != 0) {
1034 free(uvp, M_80211_VAP);
1038 /* override state transition machine */
1039 uvp->newstate = vap->iv_newstate;
1040 vap->iv_newstate = urtw_newstate;
1042 /* complete setup */
1043 ieee80211_vap_attach(vap, ieee80211_media_change,
1044 ieee80211_media_status, mac);
1045 ic->ic_opmode = opmode;
1050 urtw_vap_delete(struct ieee80211vap *vap)
1052 struct urtw_vap *uvp = URTW_VAP(vap);
1054 ieee80211_vap_detach(vap);
1055 free(uvp, M_80211_VAP);
1059 urtw_init(struct urtw_softc *sc)
1064 URTW_ASSERT_LOCKED(sc);
1066 if (sc->sc_flags & URTW_RUNNING)
1069 error = (sc->sc_flags & URTW_RTL8187B) ? urtw_adapter_start_b(sc) :
1070 urtw_adapter_start(sc);
1074 /* reset softc variables */
1077 if (!(sc->sc_flags & URTW_INIT_ONCE)) {
1078 ret = urtw_alloc_rx_data_list(sc);
1081 ret = urtw_alloc_tx_data_list(sc);
1084 sc->sc_flags |= URTW_INIT_ONCE;
1087 error = urtw_rx_enable(sc);
1090 error = urtw_tx_enable(sc);
1094 if (sc->sc_flags & URTW_RTL8187B)
1095 usbd_transfer_start(sc->sc_xfer[URTW_8187B_BULK_TX_STATUS]);
1097 sc->sc_flags |= URTW_RUNNING;
1099 callout_reset(&sc->sc_watchdog_ch, hz, urtw_watchdog, sc);
1105 urtw_adapter_start_b(struct urtw_softc *sc)
1110 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
1114 urtw_read8_m(sc, URTW_CONFIG3, &data8);
1115 urtw_write8_m(sc, URTW_CONFIG3,
1116 data8 | URTW_CONFIG3_ANAPARAM_WRITE | URTW_CONFIG3_GNT_SELECT);
1117 urtw_write32_m(sc, URTW_ANAPARAM2, URTW_8187B_8225_ANAPARAM2_ON);
1118 urtw_write32_m(sc, URTW_ANAPARAM, URTW_8187B_8225_ANAPARAM_ON);
1119 urtw_write8_m(sc, URTW_ANAPARAM3, URTW_8187B_8225_ANAPARAM3_ON);
1121 urtw_write8_m(sc, 0x61, 0x10);
1122 urtw_read8_m(sc, 0x62, &data8);
1123 urtw_write8_m(sc, 0x62, data8 & ~(1 << 5));
1124 urtw_write8_m(sc, 0x62, data8 | (1 << 5));
1126 urtw_read8_m(sc, URTW_CONFIG3, &data8);
1127 data8 &= ~URTW_CONFIG3_ANAPARAM_WRITE;
1128 urtw_write8_m(sc, URTW_CONFIG3, data8);
1130 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
1134 error = urtw_8187b_cmd_reset(sc);
1138 error = sc->sc_rf_init(sc);
1141 urtw_write8_m(sc, URTW_CMD, URTW_CMD_RX_ENABLE | URTW_CMD_TX_ENABLE);
1143 /* fix RTL8187B RX stall */
1144 error = urtw_intr_enable(sc);
1148 error = urtw_write8e(sc, 0x41, 0xf4);
1151 error = urtw_write8e(sc, 0x40, 0x00);
1154 error = urtw_write8e(sc, 0x42, 0x00);
1157 error = urtw_write8e(sc, 0x42, 0x01);
1160 error = urtw_write8e(sc, 0x40, 0x0f);
1163 error = urtw_write8e(sc, 0x42, 0x00);
1166 error = urtw_write8e(sc, 0x42, 0x01);
1170 urtw_read8_m(sc, 0xdb, &data8);
1171 urtw_write8_m(sc, 0xdb, data8 | (1 << 2));
1172 urtw_write16_m(sc, 0x372, 0x59fa);
1173 urtw_write16_m(sc, 0x374, 0x59d2);
1174 urtw_write16_m(sc, 0x376, 0x59d2);
1175 urtw_write16_m(sc, 0x378, 0x19fa);
1176 urtw_write16_m(sc, 0x37a, 0x19fa);
1177 urtw_write16_m(sc, 0x37c, 0x00d0);
1178 urtw_write8_m(sc, 0x61, 0);
1180 urtw_write8_m(sc, 0x180, 0x0f);
1181 urtw_write8_m(sc, 0x183, 0x03);
1182 urtw_write8_m(sc, 0xda, 0x10);
1183 urtw_write8_m(sc, 0x24d, 0x08);
1184 urtw_write32_m(sc, URTW_HSSI_PARA, 0x0600321b);
1186 urtw_write16_m(sc, 0x1ec, 0x800); /* RX MAX SIZE */
1192 urtw_set_macaddr(struct urtw_softc *sc, const uint8_t *macaddr)
1196 urtw_write32_m(sc, URTW_MAC0, ((const uint32_t *)macaddr)[0]);
1197 urtw_write16_m(sc, URTW_MAC4, ((const uint32_t *)macaddr)[1] & 0xffff);
1204 urtw_adapter_start(struct urtw_softc *sc)
1206 struct ieee80211com *ic = &sc->sc_ic;
1207 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
1208 const uint8_t *macaddr;
1211 error = urtw_reset(sc);
1215 urtw_write8_m(sc, URTW_ADDR_MAGIC1, 0);
1216 urtw_write8_m(sc, URTW_GPIO, 0);
1219 urtw_write8_m(sc, URTW_ADDR_MAGIC1, 4);
1220 error = urtw_led_ctl(sc, URTW_LED_CTL_POWER_ON);
1224 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
1227 /* applying MAC address again. */
1228 macaddr = vap ? vap->iv_myaddr : ic->ic_macaddr;
1229 urtw_set_macaddr(sc, macaddr);
1233 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
1237 error = urtw_update_msr(sc);
1241 urtw_write32_m(sc, URTW_INT_TIMEOUT, 0);
1242 urtw_write8_m(sc, URTW_WPA_CONFIG, 0);
1243 urtw_write8_m(sc, URTW_RATE_FALLBACK, URTW_RATE_FALLBACK_ENABLE | 0x1);
1244 error = urtw_set_rate(sc);
1248 error = sc->sc_rf_init(sc);
1251 if (sc->sc_rf_set_sens != NULL)
1252 sc->sc_rf_set_sens(sc, sc->sc_sens);
1254 /* XXX correct? to call write16 */
1255 urtw_write16_m(sc, URTW_PSR, 1);
1256 urtw_write16_m(sc, URTW_ADDR_MAGIC2, 0x10);
1257 urtw_write8_m(sc, URTW_TALLY_SEL, 0x80);
1258 urtw_write8_m(sc, URTW_ADDR_MAGIC3, 0x60);
1259 /* XXX correct? to call write16 */
1260 urtw_write16_m(sc, URTW_PSR, 0);
1261 urtw_write8_m(sc, URTW_ADDR_MAGIC1, 4);
1263 error = urtw_intr_enable(sc);
1272 urtw_set_mode(struct urtw_softc *sc, uint32_t mode)
1277 urtw_read8_m(sc, URTW_EPROM_CMD, &data);
1278 data = (data & ~URTW_EPROM_CMD_MASK) | (mode << URTW_EPROM_CMD_SHIFT);
1279 data = data & ~(URTW_EPROM_CS | URTW_EPROM_CK);
1280 urtw_write8_m(sc, URTW_EPROM_CMD, data);
1286 urtw_8187b_cmd_reset(struct urtw_softc *sc)
1292 /* XXX the code can be duplicate with urtw_reset(). */
1293 urtw_read8_m(sc, URTW_CMD, &data8);
1294 data8 = (data8 & 0x2) | URTW_CMD_RST;
1295 urtw_write8_m(sc, URTW_CMD, data8);
1297 for (i = 0; i < 20; i++) {
1298 usb_pause_mtx(&sc->sc_mtx, 2);
1299 urtw_read8_m(sc, URTW_CMD, &data8);
1300 if (!(data8 & URTW_CMD_RST))
1304 device_printf(sc->sc_dev, "reset timeout\n");
1312 urtw_do_request(struct urtw_softc *sc,
1313 struct usb_device_request *req, void *data)
1318 URTW_ASSERT_LOCKED(sc);
1321 err = usbd_do_request_flags(sc->sc_udev, &sc->sc_mtx,
1322 req, data, 0, NULL, 250 /* ms */);
1326 DPRINTF(sc, URTW_DEBUG_INIT,
1327 "Control request failed, %s (retrying)\n",
1329 usb_pause_mtx(&sc->sc_mtx, hz / 100);
1335 urtw_stop(struct urtw_softc *sc)
1340 URTW_ASSERT_LOCKED(sc);
1342 sc->sc_flags &= ~URTW_RUNNING;
1344 error = urtw_intr_disable(sc);
1347 urtw_read8_m(sc, URTW_CMD, &data8);
1348 data8 &= ~(URTW_CMD_RX_ENABLE | URTW_CMD_TX_ENABLE);
1349 urtw_write8_m(sc, URTW_CMD, data8);
1351 error = sc->sc_rf_stop(sc);
1355 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
1358 urtw_read8_m(sc, URTW_CONFIG4, &data8);
1359 urtw_write8_m(sc, URTW_CONFIG4, data8 | URTW_CONFIG4_VCOOFF);
1360 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
1365 device_printf(sc->sc_dev, "failed to stop (%s)\n",
1366 usbd_errstr(error));
1368 usb_callout_stop(&sc->sc_led_ch);
1369 callout_stop(&sc->sc_watchdog_ch);
1371 urtw_abort_xfers(sc);
1375 urtw_abort_xfers(struct urtw_softc *sc)
1379 URTW_ASSERT_LOCKED(sc);
1381 max = (sc->sc_flags & URTW_RTL8187B) ? URTW_8187B_N_XFERS :
1384 /* abort any pending transfers */
1385 for (i = 0; i < max; i++)
1386 usbd_transfer_stop(sc->sc_xfer[i]);
1390 urtw_parent(struct ieee80211com *ic)
1392 struct urtw_softc *sc = ic->ic_softc;
1396 if (sc->sc_flags & URTW_DETACHED) {
1401 if (ic->ic_nrunning > 0) {
1402 if (sc->sc_flags & URTW_RUNNING) {
1403 if (ic->ic_promisc > 0 || ic->ic_allmulti > 0)
1409 } else if (sc->sc_flags & URTW_RUNNING)
1413 ieee80211_start_all(ic);
1417 urtw_transmit(struct ieee80211com *ic, struct mbuf *m)
1419 struct urtw_softc *sc = ic->ic_softc;
1423 if ((sc->sc_flags & URTW_RUNNING) == 0) {
1427 error = mbufq_enqueue(&sc->sc_snd, m);
1439 urtw_start(struct urtw_softc *sc)
1441 struct urtw_data *bf;
1442 struct ieee80211_node *ni;
1445 URTW_ASSERT_LOCKED(sc);
1447 if ((sc->sc_flags & URTW_RUNNING) == 0)
1450 while ((m = mbufq_dequeue(&sc->sc_snd)) != NULL) {
1451 bf = urtw_getbuf(sc);
1453 mbufq_prepend(&sc->sc_snd, m);
1457 ni = (struct ieee80211_node *)m->m_pkthdr.rcvif;
1458 m->m_pkthdr.rcvif = NULL;
1460 if (urtw_tx_start(sc, ni, m, bf, URTW_PRIORITY_NORMAL) != 0) {
1461 if_inc_counter(ni->ni_vap->iv_ifp,
1462 IFCOUNTER_OERRORS, 1);
1463 STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next);
1464 ieee80211_free_node(ni);
1469 callout_reset(&sc->sc_watchdog_ch, hz, urtw_watchdog, sc);
1474 urtw_alloc_data_list(struct urtw_softc *sc, struct urtw_data data[],
1475 int ndata, int maxsz, void *dma_buf)
1479 for (i = 0; i < ndata; i++) {
1480 struct urtw_data *dp = &data[i];
1483 if (dma_buf == NULL) {
1484 dp->m = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
1485 if (dp->m == NULL) {
1486 device_printf(sc->sc_dev,
1487 "could not allocate rx mbuf\n");
1491 dp->buf = mtod(dp->m, uint8_t *);
1494 dp->buf = ((uint8_t *)dma_buf) +
1501 fail: urtw_free_data_list(sc, data, ndata, 1);
1506 urtw_alloc_rx_data_list(struct urtw_softc *sc)
1510 error = urtw_alloc_data_list(sc,
1511 sc->sc_rx, URTW_RX_DATA_LIST_COUNT,
1512 MCLBYTES, NULL /* mbufs */);
1516 STAILQ_INIT(&sc->sc_rx_active);
1517 STAILQ_INIT(&sc->sc_rx_inactive);
1519 for (i = 0; i < URTW_RX_DATA_LIST_COUNT; i++)
1520 STAILQ_INSERT_HEAD(&sc->sc_rx_inactive, &sc->sc_rx[i], next);
1526 urtw_alloc_tx_data_list(struct urtw_softc *sc)
1530 error = urtw_alloc_data_list(sc,
1531 sc->sc_tx, URTW_TX_DATA_LIST_COUNT, URTW_TX_MAXSIZE,
1532 sc->sc_tx_dma_buf /* no mbufs */);
1536 STAILQ_INIT(&sc->sc_tx_active);
1537 STAILQ_INIT(&sc->sc_tx_inactive);
1538 STAILQ_INIT(&sc->sc_tx_pending);
1540 for (i = 0; i < URTW_TX_DATA_LIST_COUNT; i++)
1541 STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, &sc->sc_tx[i],
1548 urtw_raw_xmit(struct ieee80211_node *ni, struct mbuf *m,
1549 const struct ieee80211_bpf_params *params)
1551 struct ieee80211com *ic = ni->ni_ic;
1552 struct urtw_softc *sc = ic->ic_softc;
1553 struct urtw_data *bf;
1555 /* prevent management frames from being sent if we're not ready */
1556 if (!(sc->sc_flags & URTW_RUNNING)) {
1561 bf = urtw_getbuf(sc);
1565 return (ENOBUFS); /* XXX */
1568 if (urtw_tx_start(sc, ni, m, bf, URTW_PRIORITY_LOW) != 0) {
1569 STAILQ_INSERT_HEAD(&sc->sc_tx_inactive, bf, next);
1580 urtw_scan_start(struct ieee80211com *ic)
1583 /* XXX do nothing? */
1587 urtw_scan_end(struct ieee80211com *ic)
1590 /* XXX do nothing? */
1594 urtw_getradiocaps(struct ieee80211com *ic,
1595 int maxchans, int *nchans, struct ieee80211_channel chans[])
1597 uint8_t bands[IEEE80211_MODE_BYTES];
1599 memset(bands, 0, sizeof(bands));
1600 setbit(bands, IEEE80211_MODE_11B);
1601 setbit(bands, IEEE80211_MODE_11G);
1602 ieee80211_add_channels_default_2ghz(chans, maxchans, nchans, bands, 0);
1606 urtw_set_channel(struct ieee80211com *ic)
1608 struct urtw_softc *sc = ic->ic_softc;
1609 uint32_t data, orig;
1613 * if the user set a channel explicitly using ifconfig(8) this function
1614 * can be called earlier than we're expected that in some cases the
1615 * initialization would be failed if setting a channel is called before
1616 * the init have done.
1618 if (!(sc->sc_flags & URTW_RUNNING))
1621 if (sc->sc_curchan != NULL && sc->sc_curchan == ic->ic_curchan)
1627 * during changing th channel we need to temporarily be disable
1630 urtw_read32_m(sc, URTW_TX_CONF, &orig);
1631 data = orig & ~URTW_TX_LOOPBACK_MASK;
1632 urtw_write32_m(sc, URTW_TX_CONF, data | URTW_TX_LOOPBACK_MAC);
1634 error = sc->sc_rf_set_chan(sc, ieee80211_chan2ieee(ic, ic->ic_curchan));
1637 usb_pause_mtx(&sc->sc_mtx, 10);
1638 urtw_write32_m(sc, URTW_TX_CONF, orig);
1640 urtw_write16_m(sc, URTW_ATIM_WND, 2);
1641 urtw_write16_m(sc, URTW_ATIM_TR_ITV, 100);
1642 urtw_write16_m(sc, URTW_BEACON_INTERVAL, 100);
1643 urtw_write16_m(sc, URTW_BEACON_INTERVAL_TIME, 100);
1648 sc->sc_curchan = ic->ic_curchan;
1651 device_printf(sc->sc_dev, "could not change the channel\n");
1655 urtw_update_promisc(struct ieee80211com *ic)
1657 struct urtw_softc *sc = ic->ic_softc;
1660 if (sc->sc_flags & URTW_RUNNING)
1661 urtw_rx_setconf(sc);
1666 urtw_update_mcast(struct ieee80211com *ic)
1669 /* XXX do nothing? */
1673 urtw_tx_start(struct urtw_softc *sc, struct ieee80211_node *ni, struct mbuf *m0,
1674 struct urtw_data *data, int prior)
1676 struct ieee80211_frame *wh = mtod(m0, struct ieee80211_frame *);
1677 struct ieee80211_key *k;
1678 const struct ieee80211_txparam *tp = ni->ni_txparms;
1679 struct ieee80211com *ic = &sc->sc_ic;
1680 struct ieee80211vap *vap = ni->ni_vap;
1681 struct usb_xfer *rtl8187b_pipes[URTW_8187B_TXPIPE_MAX] = {
1682 sc->sc_xfer[URTW_8187B_BULK_TX_BE],
1683 sc->sc_xfer[URTW_8187B_BULK_TX_BK],
1684 sc->sc_xfer[URTW_8187B_BULK_TX_VI],
1685 sc->sc_xfer[URTW_8187B_BULK_TX_VO]
1687 struct usb_xfer *xfer;
1688 int dur = 0, rtsdur = 0, rtsenable = 0, ctsenable = 0, rate, type,
1689 pkttime = 0, txdur = 0, isshort = 0, xferlen, ismcast;
1690 uint16_t acktime, rtstime, ctstime;
1694 URTW_ASSERT_LOCKED(sc);
1696 ismcast = IEEE80211_IS_MULTICAST(wh->i_addr1);
1697 type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
1702 if (wh->i_fc[1] & IEEE80211_FC1_PROTECTED) {
1703 k = ieee80211_crypto_encap(ni, m0);
1705 device_printf(sc->sc_dev,
1706 "ieee80211_crypto_encap returns NULL.\n");
1707 /* XXX we don't expect the fragmented frames */
1712 /* in case packet header moved, reset pointer */
1713 wh = mtod(m0, struct ieee80211_frame *);
1716 if (ieee80211_radiotap_active_vap(vap)) {
1717 struct urtw_tx_radiotap_header *tap = &sc->sc_txtap;
1720 ieee80211_radiotap_tx(vap, m0);
1723 if (type == IEEE80211_FC0_TYPE_MGT ||
1724 type == IEEE80211_FC0_TYPE_CTL ||
1725 (m0->m_flags & M_EAPOL) != 0) {
1726 rate = tp->mgmtrate;
1728 /* for data frames */
1730 rate = tp->mcastrate;
1731 else if (tp->ucastrate != IEEE80211_FIXED_RATE_NONE)
1732 rate = tp->ucastrate;
1734 rate = urtw_rtl2rate(sc->sc_currate);
1737 sc->sc_stats.txrates[sc->sc_currate]++;
1740 txdur = pkttime = urtw_compute_txtime(m0->m_pkthdr.len +
1741 IEEE80211_CRC_LEN, rate, 0, 0);
1743 acktime = urtw_compute_txtime(14, 2,0, 0);
1744 if ((m0->m_pkthdr.len + 4) > vap->iv_rtsthreshold) {
1747 rtstime = urtw_compute_txtime(URTW_ACKCTS_LEN, 2, 0, 0);
1748 ctstime = urtw_compute_txtime(14, 2, 0, 0);
1749 pkttime = urtw_compute_txtime(m0->m_pkthdr.len +
1750 IEEE80211_CRC_LEN, rate, 0, isshort);
1751 rtsdur = ctstime + pkttime + acktime +
1752 3 * URTW_ASIFS_TIME;
1753 txdur = rtstime + rtsdur;
1755 rtsenable = ctsenable = rtsdur = 0;
1756 pkttime = urtw_compute_txtime(m0->m_pkthdr.len +
1757 IEEE80211_CRC_LEN, rate, 0, isshort);
1758 txdur = pkttime + URTW_ASIFS_TIME + acktime;
1761 if (wh->i_fc[1] & IEEE80211_FC1_MORE_FRAG)
1762 dur = urtw_compute_txtime(m0->m_pkthdr.len +
1763 IEEE80211_CRC_LEN, rate, 0, isshort) +
1764 3 * URTW_ASIFS_TIME +
1767 dur = URTW_ASIFS_TIME + acktime;
1769 USETW(wh->i_dur, dur);
1771 xferlen = m0->m_pkthdr.len;
1772 xferlen += (sc->sc_flags & URTW_RTL8187B) ? (4 * 8) : (4 * 3);
1773 if ((0 == xferlen % 64) || (0 == xferlen % 512))
1776 memset(data->buf, 0, URTW_TX_MAXSIZE);
1777 flags = m0->m_pkthdr.len & 0xfff;
1778 flags |= URTW_TX_FLAG_NO_ENC;
1779 if ((ic->ic_flags & IEEE80211_F_SHPREAMBLE) &&
1780 (ni->ni_capinfo & IEEE80211_CAPINFO_SHORT_PREAMBLE) &&
1781 (sc->sc_preamble_mode == URTW_PREAMBLE_MODE_SHORT) &&
1782 (sc->sc_currate != 0))
1783 flags |= URTW_TX_FLAG_SPLCP;
1784 if (wh->i_fc[1] & IEEE80211_FC1_MORE_FRAG)
1785 flags |= URTW_TX_FLAG_MOREFRAG;
1787 flags |= (sc->sc_currate & 0xf) << URTW_TX_FLAG_TXRATE_SHIFT;
1789 if (sc->sc_flags & URTW_RTL8187B) {
1790 struct urtw_8187b_txhdr *tx;
1792 tx = (struct urtw_8187b_txhdr *)data->buf;
1794 flags |= URTW_TX_FLAG_CTS;
1796 flags |= URTW_TX_FLAG_RTS;
1797 flags |= URTW_RIDX_CCK5 << URTW_TX_FLAG_RTSRATE_SHIFT;
1798 tx->rtsdur = rtsdur;
1800 tx->flag = htole32(flags);
1802 if (type == IEEE80211_FC0_TYPE_MGT &&
1803 (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) ==
1804 IEEE80211_FC0_SUBTYPE_PROBE_RESP)
1807 tx->retry = URTW_TX_MAXRETRY;
1808 m_copydata(m0, 0, m0->m_pkthdr.len, (uint8_t *)(tx + 1));
1810 struct urtw_8187l_txhdr *tx;
1812 tx = (struct urtw_8187l_txhdr *)data->buf;
1814 flags |= URTW_TX_FLAG_RTS;
1815 tx->rtsdur = rtsdur;
1817 flags |= URTW_RIDX_CCK5 << URTW_TX_FLAG_RTSRATE_SHIFT;
1818 tx->flag = htole32(flags);
1819 tx->retry = 3; /* CW minimum */
1820 tx->retry |= 7 << 4; /* CW maximum */
1821 tx->retry |= URTW_TX_MAXRETRY << 8; /* retry limitation */
1822 m_copydata(m0, 0, m0->m_pkthdr.len, (uint8_t *)(tx + 1));
1825 data->buflen = xferlen;
1829 if (sc->sc_flags & URTW_RTL8187B) {
1831 case IEEE80211_FC0_TYPE_CTL:
1832 case IEEE80211_FC0_TYPE_MGT:
1833 xfer = sc->sc_xfer[URTW_8187B_BULK_TX_EP12];
1836 KASSERT(M_WME_GETAC(m0) < URTW_8187B_TXPIPE_MAX,
1837 ("unsupported WME pipe %d", M_WME_GETAC(m0)));
1838 xfer = rtl8187b_pipes[M_WME_GETAC(m0)];
1842 xfer = (prior == URTW_PRIORITY_LOW) ?
1843 sc->sc_xfer[URTW_8187L_BULK_TX_LOW] :
1844 sc->sc_xfer[URTW_8187L_BULK_TX_NORMAL];
1846 STAILQ_INSERT_TAIL(&sc->sc_tx_pending, data, next);
1847 usbd_transfer_start(xfer);
1849 error = urtw_led_ctl(sc, URTW_LED_CTL_TX);
1851 device_printf(sc->sc_dev, "could not control LED (%d)\n",
1857 urtw_newstate(struct ieee80211vap *vap, enum ieee80211_state nstate, int arg)
1859 struct ieee80211com *ic = vap->iv_ic;
1860 struct urtw_softc *sc = ic->ic_softc;
1861 struct urtw_vap *uvp = URTW_VAP(vap);
1862 struct ieee80211_node *ni;
1863 usb_error_t error = 0;
1865 DPRINTF(sc, URTW_DEBUG_STATE, "%s: %s -> %s\n", __func__,
1866 ieee80211_state_name[vap->iv_state],
1867 ieee80211_state_name[nstate]);
1869 sc->sc_state = nstate;
1871 IEEE80211_UNLOCK(ic);
1873 usb_callout_stop(&sc->sc_led_ch);
1874 callout_stop(&sc->sc_watchdog_ch);
1877 case IEEE80211_S_INIT:
1878 case IEEE80211_S_SCAN:
1879 case IEEE80211_S_AUTH:
1880 case IEEE80211_S_ASSOC:
1882 case IEEE80211_S_RUN:
1883 ni = ieee80211_ref_node(vap->iv_bss);
1884 /* setting bssid. */
1885 urtw_write32_m(sc, URTW_BSSID, ((uint32_t *)ni->ni_bssid)[0]);
1886 urtw_write16_m(sc, URTW_BSSID + 4,
1887 ((uint16_t *)ni->ni_bssid)[2]);
1888 urtw_update_msr(sc);
1889 /* XXX maybe the below would be incorrect. */
1890 urtw_write16_m(sc, URTW_ATIM_WND, 2);
1891 urtw_write16_m(sc, URTW_ATIM_TR_ITV, 100);
1892 urtw_write16_m(sc, URTW_BEACON_INTERVAL, 0x64);
1893 urtw_write16_m(sc, URTW_BEACON_INTERVAL_TIME, 100);
1894 error = urtw_led_ctl(sc, URTW_LED_CTL_LINK);
1896 device_printf(sc->sc_dev,
1897 "could not control LED (%d)\n", error);
1898 ieee80211_free_node(ni);
1906 return (uvp->newstate(vap, nstate, arg));
1910 urtw_watchdog(void *arg)
1912 struct urtw_softc *sc = arg;
1913 struct ieee80211com *ic = &sc->sc_ic;
1915 if (sc->sc_txtimer > 0) {
1916 if (--sc->sc_txtimer == 0) {
1917 device_printf(sc->sc_dev, "device timeout\n");
1918 counter_u64_add(ic->ic_oerrors, 1);
1919 ieee80211_restart_all(ic);
1922 callout_reset(&sc->sc_watchdog_ch, hz, urtw_watchdog, sc);
1927 urtw_set_multi(void *arg)
1929 /* XXX don't know how to set a device. Lack of docs. */
1933 urtw_set_rate(struct urtw_softc *sc)
1935 int i, basic_rate, min_rr_rate, max_rr_rate;
1939 basic_rate = URTW_RIDX_OFDM24;
1940 min_rr_rate = URTW_RIDX_OFDM6;
1941 max_rr_rate = URTW_RIDX_OFDM24;
1943 urtw_write8_m(sc, URTW_RESP_RATE,
1944 max_rr_rate << URTW_RESP_MAX_RATE_SHIFT |
1945 min_rr_rate << URTW_RESP_MIN_RATE_SHIFT);
1947 urtw_read16_m(sc, URTW_BRSR, &data);
1948 data &= ~URTW_BRSR_MBR_8185;
1950 for (i = 0; i <= basic_rate; i++)
1953 urtw_write16_m(sc, URTW_BRSR, data);
1959 urtw_rtl2rate(uint32_t rate)
1963 for (i = 0; i < nitems(urtw_ratetable); i++) {
1964 if (rate == urtw_ratetable[i].val)
1965 return urtw_ratetable[i].reg;
1972 urtw_update_msr(struct urtw_softc *sc)
1974 struct ieee80211com *ic = &sc->sc_ic;
1978 urtw_read8_m(sc, URTW_MSR, &data);
1979 data &= ~URTW_MSR_LINK_MASK;
1981 if (sc->sc_state == IEEE80211_S_RUN) {
1982 switch (ic->ic_opmode) {
1983 case IEEE80211_M_STA:
1984 case IEEE80211_M_MONITOR:
1985 data |= URTW_MSR_LINK_STA;
1986 if (sc->sc_flags & URTW_RTL8187B)
1987 data |= URTW_MSR_LINK_ENEDCA;
1989 case IEEE80211_M_IBSS:
1990 data |= URTW_MSR_LINK_ADHOC;
1992 case IEEE80211_M_HOSTAP:
1993 data |= URTW_MSR_LINK_HOSTAP;
1996 DPRINTF(sc, URTW_DEBUG_STATE,
1997 "unsupported operation mode 0x%x\n",
1999 error = USB_ERR_INVAL;
2003 data |= URTW_MSR_LINK_NONE;
2005 urtw_write8_m(sc, URTW_MSR, data);
2011 urtw_read8_c(struct urtw_softc *sc, int val, uint8_t *data)
2013 struct usb_device_request req;
2016 URTW_ASSERT_LOCKED(sc);
2018 req.bmRequestType = UT_READ_VENDOR_DEVICE;
2019 req.bRequest = URTW_8187_GETREGS_REQ;
2020 USETW(req.wValue, (val & 0xff) | 0xff00);
2021 USETW(req.wIndex, (val >> 8) & 0x3);
2022 USETW(req.wLength, sizeof(uint8_t));
2024 error = urtw_do_request(sc, &req, data);
2029 urtw_read16_c(struct urtw_softc *sc, int val, uint16_t *data)
2031 struct usb_device_request req;
2034 URTW_ASSERT_LOCKED(sc);
2036 req.bmRequestType = UT_READ_VENDOR_DEVICE;
2037 req.bRequest = URTW_8187_GETREGS_REQ;
2038 USETW(req.wValue, (val & 0xff) | 0xff00);
2039 USETW(req.wIndex, (val >> 8) & 0x3);
2040 USETW(req.wLength, sizeof(uint16_t));
2042 error = urtw_do_request(sc, &req, data);
2047 urtw_read32_c(struct urtw_softc *sc, int val, uint32_t *data)
2049 struct usb_device_request req;
2052 URTW_ASSERT_LOCKED(sc);
2054 req.bmRequestType = UT_READ_VENDOR_DEVICE;
2055 req.bRequest = URTW_8187_GETREGS_REQ;
2056 USETW(req.wValue, (val & 0xff) | 0xff00);
2057 USETW(req.wIndex, (val >> 8) & 0x3);
2058 USETW(req.wLength, sizeof(uint32_t));
2060 error = urtw_do_request(sc, &req, data);
2065 urtw_write8_c(struct urtw_softc *sc, int val, uint8_t data)
2067 struct usb_device_request req;
2069 URTW_ASSERT_LOCKED(sc);
2071 req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
2072 req.bRequest = URTW_8187_SETREGS_REQ;
2073 USETW(req.wValue, (val & 0xff) | 0xff00);
2074 USETW(req.wIndex, (val >> 8) & 0x3);
2075 USETW(req.wLength, sizeof(uint8_t));
2077 return (urtw_do_request(sc, &req, &data));
2081 urtw_write16_c(struct urtw_softc *sc, int val, uint16_t data)
2083 struct usb_device_request req;
2085 URTW_ASSERT_LOCKED(sc);
2087 req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
2088 req.bRequest = URTW_8187_SETREGS_REQ;
2089 USETW(req.wValue, (val & 0xff) | 0xff00);
2090 USETW(req.wIndex, (val >> 8) & 0x3);
2091 USETW(req.wLength, sizeof(uint16_t));
2093 return (urtw_do_request(sc, &req, &data));
2097 urtw_write32_c(struct urtw_softc *sc, int val, uint32_t data)
2099 struct usb_device_request req;
2101 URTW_ASSERT_LOCKED(sc);
2103 req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
2104 req.bRequest = URTW_8187_SETREGS_REQ;
2105 USETW(req.wValue, (val & 0xff) | 0xff00);
2106 USETW(req.wIndex, (val >> 8) & 0x3);
2107 USETW(req.wLength, sizeof(uint32_t));
2109 return (urtw_do_request(sc, &req, &data));
2113 urtw_get_macaddr(struct urtw_softc *sc)
2115 struct ieee80211com *ic = &sc->sc_ic;
2119 error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR, &data);
2122 ic->ic_macaddr[0] = data & 0xff;
2123 ic->ic_macaddr[1] = (data & 0xff00) >> 8;
2124 error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR + 1, &data);
2127 ic->ic_macaddr[2] = data & 0xff;
2128 ic->ic_macaddr[3] = (data & 0xff00) >> 8;
2129 error = urtw_eprom_read32(sc, URTW_EPROM_MACADDR + 2, &data);
2132 ic->ic_macaddr[4] = data & 0xff;
2133 ic->ic_macaddr[5] = (data & 0xff00) >> 8;
2139 urtw_eprom_read32(struct urtw_softc *sc, uint32_t addr, uint32_t *data)
2141 #define URTW_READCMD_LEN 3
2143 int16_t addrstr[8], data16, readcmd[] = { 1, 1, 0 };
2146 /* NB: make sure the buffer is initialized */
2149 /* enable EPROM programming */
2150 urtw_write8_m(sc, URTW_EPROM_CMD, URTW_EPROM_CMD_PROGRAM_MODE);
2151 DELAY(URTW_EPROM_DELAY);
2153 error = urtw_eprom_cs(sc, URTW_EPROM_ENABLE);
2156 error = urtw_eprom_ck(sc);
2159 error = urtw_eprom_sendbits(sc, readcmd, URTW_READCMD_LEN);
2162 if (sc->sc_epromtype == URTW_EEPROM_93C56) {
2164 addrstr[0] = addr & (1 << 7);
2165 addrstr[1] = addr & (1 << 6);
2166 addrstr[2] = addr & (1 << 5);
2167 addrstr[3] = addr & (1 << 4);
2168 addrstr[4] = addr & (1 << 3);
2169 addrstr[5] = addr & (1 << 2);
2170 addrstr[6] = addr & (1 << 1);
2171 addrstr[7] = addr & (1 << 0);
2174 addrstr[0] = addr & (1 << 5);
2175 addrstr[1] = addr & (1 << 4);
2176 addrstr[2] = addr & (1 << 3);
2177 addrstr[3] = addr & (1 << 2);
2178 addrstr[4] = addr & (1 << 1);
2179 addrstr[5] = addr & (1 << 0);
2181 error = urtw_eprom_sendbits(sc, addrstr, addrlen);
2185 error = urtw_eprom_writebit(sc, 0);
2189 for (i = 0; i < 16; i++) {
2190 error = urtw_eprom_ck(sc);
2193 error = urtw_eprom_readbit(sc, &data16);
2197 (*data) |= (data16 << (15 - i));
2200 error = urtw_eprom_cs(sc, URTW_EPROM_DISABLE);
2203 error = urtw_eprom_ck(sc);
2207 /* now disable EPROM programming */
2208 urtw_write8_m(sc, URTW_EPROM_CMD, URTW_EPROM_CMD_NORMAL_MODE);
2211 #undef URTW_READCMD_LEN
2215 urtw_eprom_cs(struct urtw_softc *sc, int able)
2220 urtw_read8_m(sc, URTW_EPROM_CMD, &data);
2221 if (able == URTW_EPROM_ENABLE)
2222 urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_CS);
2224 urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_CS);
2225 DELAY(URTW_EPROM_DELAY);
2231 urtw_eprom_ck(struct urtw_softc *sc)
2237 urtw_read8_m(sc, URTW_EPROM_CMD, &data);
2238 urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_CK);
2239 DELAY(URTW_EPROM_DELAY);
2241 urtw_read8_m(sc, URTW_EPROM_CMD, &data);
2242 urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_CK);
2243 DELAY(URTW_EPROM_DELAY);
2249 urtw_eprom_readbit(struct urtw_softc *sc, int16_t *data)
2254 urtw_read8_m(sc, URTW_EPROM_CMD, &data8);
2255 *data = (data8 & URTW_EPROM_READBIT) ? 1 : 0;
2256 DELAY(URTW_EPROM_DELAY);
2263 urtw_eprom_writebit(struct urtw_softc *sc, int16_t bit)
2268 urtw_read8_m(sc, URTW_EPROM_CMD, &data);
2270 urtw_write8_m(sc, URTW_EPROM_CMD, data | URTW_EPROM_WRITEBIT);
2272 urtw_write8_m(sc, URTW_EPROM_CMD, data & ~URTW_EPROM_WRITEBIT);
2273 DELAY(URTW_EPROM_DELAY);
2279 urtw_eprom_sendbits(struct urtw_softc *sc, int16_t *buf, int buflen)
2282 usb_error_t error = 0;
2284 for (i = 0; i < buflen; i++) {
2285 error = urtw_eprom_writebit(sc, buf[i]);
2288 error = urtw_eprom_ck(sc);
2297 urtw_get_txpwr(struct urtw_softc *sc)
2303 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW_BASE, &data);
2306 sc->sc_txpwr_cck_base = data & 0xf;
2307 sc->sc_txpwr_ofdm_base = (data >> 4) & 0xf;
2309 for (i = 1, j = 0; i < 6; i += 2, j++) {
2310 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW0 + j, &data);
2313 sc->sc_txpwr_cck[i] = data & 0xf;
2314 sc->sc_txpwr_cck[i + 1] = (data & 0xf00) >> 8;
2315 sc->sc_txpwr_ofdm[i] = (data & 0xf0) >> 4;
2316 sc->sc_txpwr_ofdm[i + 1] = (data & 0xf000) >> 12;
2318 for (i = 1, j = 0; i < 4; i += 2, j++) {
2319 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW1 + j, &data);
2322 sc->sc_txpwr_cck[i + 6] = data & 0xf;
2323 sc->sc_txpwr_cck[i + 6 + 1] = (data & 0xf00) >> 8;
2324 sc->sc_txpwr_ofdm[i + 6] = (data & 0xf0) >> 4;
2325 sc->sc_txpwr_ofdm[i + 6 + 1] = (data & 0xf000) >> 12;
2327 if (sc->sc_flags & URTW_RTL8187B) {
2328 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW2, &data);
2331 sc->sc_txpwr_cck[1 + 6 + 4] = data & 0xf;
2332 sc->sc_txpwr_ofdm[1 + 6 + 4] = (data & 0xf0) >> 4;
2333 error = urtw_eprom_read32(sc, 0x0a, &data);
2336 sc->sc_txpwr_cck[2 + 6 + 4] = data & 0xf;
2337 sc->sc_txpwr_ofdm[2 + 6 + 4] = (data & 0xf0) >> 4;
2338 error = urtw_eprom_read32(sc, 0x1c, &data);
2341 sc->sc_txpwr_cck[3 + 6 + 4] = data & 0xf;
2342 sc->sc_txpwr_cck[3 + 6 + 4 + 1] = (data & 0xf00) >> 8;
2343 sc->sc_txpwr_ofdm[3 + 6 + 4] = (data & 0xf0) >> 4;
2344 sc->sc_txpwr_ofdm[3 + 6 + 4 + 1] = (data & 0xf000) >> 12;
2346 for (i = 1, j = 0; i < 4; i += 2, j++) {
2347 error = urtw_eprom_read32(sc, URTW_EPROM_TXPW2 + j,
2351 sc->sc_txpwr_cck[i + 6 + 4] = data & 0xf;
2352 sc->sc_txpwr_cck[i + 6 + 4 + 1] = (data & 0xf00) >> 8;
2353 sc->sc_txpwr_ofdm[i + 6 + 4] = (data & 0xf0) >> 4;
2354 sc->sc_txpwr_ofdm[i + 6 + 4 + 1] = (data & 0xf000) >> 12;
2362 urtw_get_rfchip(struct urtw_softc *sc)
2369 if (sc->sc_flags & URTW_RTL8187B) {
2370 urtw_read8_m(sc, 0xe1, &data8);
2373 sc->sc_flags |= URTW_RTL8187B_REV_B;
2376 sc->sc_flags |= URTW_RTL8187B_REV_D;
2379 sc->sc_flags |= URTW_RTL8187B_REV_E;
2382 device_printf(sc->sc_dev, "unknown type: %#x\n", data8);
2383 sc->sc_flags |= URTW_RTL8187B_REV_B;
2387 urtw_read32_m(sc, URTW_TX_CONF, &data);
2388 switch (data & URTW_TX_HWMASK) {
2389 case URTW_TX_R8187vD_B:
2390 sc->sc_flags |= URTW_RTL8187B;
2392 case URTW_TX_R8187vD:
2395 device_printf(sc->sc_dev, "unknown RTL8187L type: %#x\n",
2396 data & URTW_TX_HWMASK);
2401 error = urtw_eprom_read32(sc, URTW_EPROM_RFCHIPID, &data);
2404 switch (data & 0xff) {
2405 case URTW_EPROM_RFCHIPID_RTL8225U:
2406 error = urtw_8225_isv2(sc, &ret);
2410 sc->sc_rf_init = urtw_8225_rf_init;
2411 sc->sc_rf_set_sens = urtw_8225_rf_set_sens;
2412 sc->sc_rf_set_chan = urtw_8225_rf_set_chan;
2413 sc->sc_rf_stop = urtw_8225_rf_stop;
2415 sc->sc_rf_init = urtw_8225v2_rf_init;
2416 sc->sc_rf_set_chan = urtw_8225v2_rf_set_chan;
2417 sc->sc_rf_stop = urtw_8225_rf_stop;
2419 sc->sc_max_sens = URTW_8225_RF_MAX_SENS;
2420 sc->sc_sens = URTW_8225_RF_DEF_SENS;
2422 case URTW_EPROM_RFCHIPID_RTL8225Z2:
2423 sc->sc_rf_init = urtw_8225v2b_rf_init;
2424 sc->sc_rf_set_chan = urtw_8225v2b_rf_set_chan;
2425 sc->sc_max_sens = URTW_8225_RF_MAX_SENS;
2426 sc->sc_sens = URTW_8225_RF_DEF_SENS;
2427 sc->sc_rf_stop = urtw_8225_rf_stop;
2430 DPRINTF(sc, URTW_DEBUG_STATE,
2431 "unsupported RF chip %d\n", data & 0xff);
2432 error = USB_ERR_INVAL;
2436 device_printf(sc->sc_dev, "%s rf %s hwrev %s\n",
2437 (sc->sc_flags & URTW_RTL8187B) ? "rtl8187b" : "rtl8187l",
2438 ((data & 0xff) == URTW_EPROM_RFCHIPID_RTL8225U) ? "rtl8225u" :
2440 (sc->sc_flags & URTW_RTL8187B) ? ((data8 == 0) ? "b" :
2441 (data8 == 1) ? "d" : "e") : "none");
2448 urtw_led_init(struct urtw_softc *sc)
2453 urtw_read8_m(sc, URTW_PSR, &sc->sc_psr);
2454 error = urtw_eprom_read32(sc, URTW_EPROM_SWREV, &rev);
2458 switch (rev & URTW_EPROM_CID_MASK) {
2459 case URTW_EPROM_CID_ALPHA0:
2460 sc->sc_strategy = URTW_SW_LED_MODE1;
2462 case URTW_EPROM_CID_SERCOMM_PS:
2463 sc->sc_strategy = URTW_SW_LED_MODE3;
2465 case URTW_EPROM_CID_HW_LED:
2466 sc->sc_strategy = URTW_HW_LED;
2468 case URTW_EPROM_CID_RSVD0:
2469 case URTW_EPROM_CID_RSVD1:
2471 sc->sc_strategy = URTW_SW_LED_MODE0;
2475 sc->sc_gpio_ledpin = URTW_LED_PIN_GPIO0;
2482 urtw_8225_rf_init(struct urtw_softc *sc)
2488 error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON);
2492 error = urtw_8225_usb_init(sc);
2496 urtw_write32_m(sc, URTW_RF_TIMING, 0x000a8008);
2497 urtw_read16_m(sc, URTW_BRSR, &data); /* XXX ??? */
2498 urtw_write16_m(sc, URTW_BRSR, 0xffff);
2499 urtw_write32_m(sc, URTW_RF_PARA, 0x100044);
2501 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
2504 urtw_write8_m(sc, URTW_CONFIG3, 0x44);
2505 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
2509 error = urtw_8185_rf_pins_enable(sc);
2512 usb_pause_mtx(&sc->sc_mtx, 1000);
2514 for (i = 0; i < nitems(urtw_8225_rf_part1); i++) {
2515 urtw_8225_write(sc, urtw_8225_rf_part1[i].reg,
2516 urtw_8225_rf_part1[i].val);
2517 usb_pause_mtx(&sc->sc_mtx, 1);
2519 usb_pause_mtx(&sc->sc_mtx, 100);
2521 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC1);
2522 usb_pause_mtx(&sc->sc_mtx, 200);
2524 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC2);
2525 usb_pause_mtx(&sc->sc_mtx, 200);
2527 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC3);
2529 for (i = 0; i < 95; i++) {
2530 urtw_8225_write(sc, URTW_8225_ADDR_1_MAGIC, (uint8_t)(i + 1));
2531 urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, urtw_8225_rxgain[i]);
2535 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC4);
2537 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC5);
2539 for (i = 0; i < 128; i++) {
2540 urtw_8187_write_phy_ofdm(sc, 0xb, urtw_8225_agc[i]);
2541 usb_pause_mtx(&sc->sc_mtx, 1);
2542 urtw_8187_write_phy_ofdm(sc, 0xa, (uint8_t)i + 0x80);
2543 usb_pause_mtx(&sc->sc_mtx, 1);
2546 for (i = 0; i < nitems(urtw_8225_rf_part2); i++) {
2547 urtw_8187_write_phy_ofdm(sc, urtw_8225_rf_part2[i].reg,
2548 urtw_8225_rf_part2[i].val);
2549 usb_pause_mtx(&sc->sc_mtx, 1);
2552 error = urtw_8225_setgain(sc, 4);
2556 for (i = 0; i < nitems(urtw_8225_rf_part3); i++) {
2557 urtw_8187_write_phy_cck(sc, urtw_8225_rf_part3[i].reg,
2558 urtw_8225_rf_part3[i].val);
2559 usb_pause_mtx(&sc->sc_mtx, 1);
2562 urtw_write8_m(sc, URTW_TESTR, 0x0d);
2564 error = urtw_8225_set_txpwrlvl(sc, 1);
2568 urtw_8187_write_phy_cck(sc, 0x10, 0x9b);
2569 usb_pause_mtx(&sc->sc_mtx, 1);
2570 urtw_8187_write_phy_ofdm(sc, 0x26, 0x90);
2571 usb_pause_mtx(&sc->sc_mtx, 1);
2573 /* TX ant A, 0x0 for B */
2574 error = urtw_8185_tx_antenna(sc, 0x3);
2577 urtw_write32_m(sc, URTW_HSSI_PARA, 0x3dc00002);
2579 error = urtw_8225_rf_set_chan(sc, 1);
2585 urtw_8185_rf_pins_enable(struct urtw_softc *sc)
2587 usb_error_t error = 0;
2589 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x1ff7);
2595 urtw_8185_tx_antenna(struct urtw_softc *sc, uint8_t ant)
2599 urtw_write8_m(sc, URTW_TX_ANTENNA, ant);
2600 usb_pause_mtx(&sc->sc_mtx, 1);
2606 urtw_8187_write_phy_ofdm_c(struct urtw_softc *sc, uint8_t addr, uint32_t data)
2610 return urtw_8187_write_phy(sc, addr, data);
2614 urtw_8187_write_phy_cck_c(struct urtw_softc *sc, uint8_t addr, uint32_t data)
2618 return urtw_8187_write_phy(sc, addr, data | 0x10000);
2622 urtw_8187_write_phy(struct urtw_softc *sc, uint8_t addr, uint32_t data)
2627 phyw = ((data << 8) | (addr | 0x80));
2628 urtw_write8_m(sc, URTW_PHY_MAGIC4, ((phyw & 0xff000000) >> 24));
2629 urtw_write8_m(sc, URTW_PHY_MAGIC3, ((phyw & 0x00ff0000) >> 16));
2630 urtw_write8_m(sc, URTW_PHY_MAGIC2, ((phyw & 0x0000ff00) >> 8));
2631 urtw_write8_m(sc, URTW_PHY_MAGIC1, ((phyw & 0x000000ff)));
2632 usb_pause_mtx(&sc->sc_mtx, 1);
2638 urtw_8225_setgain(struct urtw_softc *sc, int16_t gain)
2642 urtw_8187_write_phy_ofdm(sc, 0x0d, urtw_8225_gain[gain * 4]);
2643 urtw_8187_write_phy_ofdm(sc, 0x1b, urtw_8225_gain[gain * 4 + 2]);
2644 urtw_8187_write_phy_ofdm(sc, 0x1d, urtw_8225_gain[gain * 4 + 3]);
2645 urtw_8187_write_phy_ofdm(sc, 0x23, urtw_8225_gain[gain * 4 + 1]);
2651 urtw_8225_usb_init(struct urtw_softc *sc)
2656 urtw_write8_m(sc, URTW_RF_PINS_SELECT + 1, 0);
2657 urtw_write8_m(sc, URTW_GPIO, 0);
2658 error = urtw_read8e(sc, 0x53, &data);
2661 error = urtw_write8e(sc, 0x53, data | (1 << 7));
2664 urtw_write8_m(sc, URTW_RF_PINS_SELECT + 1, 4);
2665 urtw_write8_m(sc, URTW_GPIO, 0x20);
2666 urtw_write8_m(sc, URTW_GP_ENABLE, 0);
2668 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x80);
2669 urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x80);
2670 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x80);
2672 usb_pause_mtx(&sc->sc_mtx, 500);
2678 urtw_8225_write_c(struct urtw_softc *sc, uint8_t addr, uint16_t data)
2680 uint16_t d80, d82, d84;
2683 urtw_read16_m(sc, URTW_RF_PINS_OUTPUT, &d80);
2684 d80 &= URTW_RF_PINS_MAGIC1;
2685 urtw_read16_m(sc, URTW_RF_PINS_ENABLE, &d82);
2686 urtw_read16_m(sc, URTW_RF_PINS_SELECT, &d84);
2687 d84 &= URTW_RF_PINS_MAGIC2;
2688 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, d82 | URTW_RF_PINS_MAGIC3);
2689 urtw_write16_m(sc, URTW_RF_PINS_SELECT, d84 | URTW_RF_PINS_MAGIC3);
2692 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN);
2694 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80);
2697 error = urtw_8225_write_s16(sc, addr, 0x8225, &data);
2701 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN);
2703 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, d80 | URTW_BB_HOST_BANG_EN);
2704 urtw_write16_m(sc, URTW_RF_PINS_SELECT, d84);
2705 usb_pause_mtx(&sc->sc_mtx, 2);
2711 urtw_8225_write_s16(struct urtw_softc *sc, uint8_t addr, int index,
2716 struct usb_device_request req;
2717 usb_error_t error = 0;
2721 req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
2722 req.bRequest = URTW_8187_SETREGS_REQ;
2723 USETW(req.wValue, addr);
2724 USETW(req.wIndex, index);
2725 USETW(req.wLength, sizeof(uint16_t));
2726 buf[0] = (data16 & 0x00ff);
2727 buf[1] = (data16 & 0xff00) >> 8;
2729 error = urtw_do_request(sc, &req, buf);
2735 urtw_8225_rf_set_chan(struct urtw_softc *sc, int chan)
2739 error = urtw_8225_set_txpwrlvl(sc, chan);
2742 urtw_8225_write(sc, URTW_8225_ADDR_7_MAGIC, urtw_8225_channel[chan]);
2743 usb_pause_mtx(&sc->sc_mtx, 10);
2749 urtw_8225_rf_set_sens(struct urtw_softc *sc, int sens)
2753 if (sens < 0 || sens > 6)
2758 URTW_8225_ADDR_C_MAGIC, URTW_8225_ADDR_C_DATA_MAGIC1);
2761 URTW_8225_ADDR_C_MAGIC, URTW_8225_ADDR_C_DATA_MAGIC2);
2764 error = urtw_8225_setgain(sc, sens);
2768 urtw_8187_write_phy_cck(sc, 0x41, urtw_8225_threshold[sens]);
2775 urtw_8225_set_txpwrlvl(struct urtw_softc *sc, int chan)
2778 uint8_t *cck_pwltable;
2779 uint8_t cck_pwrlvl_max, ofdm_pwrlvl_min, ofdm_pwrlvl_max;
2780 uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff;
2781 uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff;
2784 cck_pwrlvl_max = 11;
2785 ofdm_pwrlvl_max = 25; /* 12 -> 25 */
2786 ofdm_pwrlvl_min = 10;
2788 /* CCK power setting */
2789 cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ? cck_pwrlvl_max : cck_pwrlvl;
2790 idx = cck_pwrlvl % 6;
2791 set = cck_pwrlvl / 6;
2792 cck_pwltable = (chan == 14) ? urtw_8225_txpwr_cck_ch14 :
2793 urtw_8225_txpwr_cck;
2795 urtw_write8_m(sc, URTW_TX_GAIN_CCK,
2796 urtw_8225_tx_gain_cck_ofdm[set] >> 1);
2797 for (i = 0; i < 8; i++) {
2798 urtw_8187_write_phy_cck(sc, 0x44 + i,
2799 cck_pwltable[idx * 8 + i]);
2801 usb_pause_mtx(&sc->sc_mtx, 1);
2803 /* OFDM power setting */
2804 ofdm_pwrlvl = (ofdm_pwrlvl > (ofdm_pwrlvl_max - ofdm_pwrlvl_min)) ?
2805 ofdm_pwrlvl_max : ofdm_pwrlvl + ofdm_pwrlvl_min;
2806 ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl;
2808 idx = ofdm_pwrlvl % 6;
2809 set = ofdm_pwrlvl / 6;
2811 error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON);
2814 urtw_8187_write_phy_ofdm(sc, 2, 0x42);
2815 urtw_8187_write_phy_ofdm(sc, 6, 0);
2816 urtw_8187_write_phy_ofdm(sc, 8, 0);
2818 urtw_write8_m(sc, URTW_TX_GAIN_OFDM,
2819 urtw_8225_tx_gain_cck_ofdm[set] >> 1);
2820 urtw_8187_write_phy_ofdm(sc, 0x5, urtw_8225_txpwr_ofdm[idx]);
2821 urtw_8187_write_phy_ofdm(sc, 0x7, urtw_8225_txpwr_ofdm[idx]);
2822 usb_pause_mtx(&sc->sc_mtx, 1);
2828 urtw_8225_rf_stop(struct urtw_softc *sc)
2833 urtw_8225_write(sc, 0x4, 0x1f);
2835 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
2839 urtw_read8_m(sc, URTW_CONFIG3, &data);
2840 urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE);
2841 if (sc->sc_flags & URTW_RTL8187B) {
2842 urtw_write32_m(sc, URTW_ANAPARAM2,
2843 URTW_8187B_8225_ANAPARAM2_OFF);
2844 urtw_write32_m(sc, URTW_ANAPARAM, URTW_8187B_8225_ANAPARAM_OFF);
2845 urtw_write32_m(sc, URTW_ANAPARAM3,
2846 URTW_8187B_8225_ANAPARAM3_OFF);
2848 urtw_write32_m(sc, URTW_ANAPARAM2, URTW_8225_ANAPARAM2_OFF);
2849 urtw_write32_m(sc, URTW_ANAPARAM, URTW_8225_ANAPARAM_OFF);
2852 urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE);
2853 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
2862 urtw_8225v2_rf_init(struct urtw_softc *sc)
2869 error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON);
2873 error = urtw_8225_usb_init(sc);
2877 urtw_write32_m(sc, URTW_RF_TIMING, 0x000a8008);
2878 urtw_read16_m(sc, URTW_BRSR, &data); /* XXX ??? */
2879 urtw_write16_m(sc, URTW_BRSR, 0xffff);
2880 urtw_write32_m(sc, URTW_RF_PARA, 0x100044);
2882 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
2885 urtw_write8_m(sc, URTW_CONFIG3, 0x44);
2886 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
2890 error = urtw_8185_rf_pins_enable(sc);
2894 usb_pause_mtx(&sc->sc_mtx, 500);
2896 for (i = 0; i < nitems(urtw_8225v2_rf_part1); i++) {
2897 urtw_8225_write(sc, urtw_8225v2_rf_part1[i].reg,
2898 urtw_8225v2_rf_part1[i].val);
2900 usb_pause_mtx(&sc->sc_mtx, 50);
2903 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC1);
2905 for (i = 0; i < 95; i++) {
2906 urtw_8225_write(sc, URTW_8225_ADDR_1_MAGIC, (uint8_t)(i + 1));
2907 urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC,
2908 urtw_8225v2_rxgain[i]);
2912 URTW_8225_ADDR_3_MAGIC, URTW_8225_ADDR_3_DATA_MAGIC1);
2914 URTW_8225_ADDR_5_MAGIC, URTW_8225_ADDR_5_DATA_MAGIC1);
2916 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC2);
2918 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC1);
2919 usb_pause_mtx(&sc->sc_mtx, 100);
2921 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC2);
2922 usb_pause_mtx(&sc->sc_mtx, 100);
2924 error = urtw_8225_read(sc, URTW_8225_ADDR_6_MAGIC, &data32);
2927 if (data32 != URTW_8225_ADDR_6_DATA_MAGIC1)
2928 device_printf(sc->sc_dev, "expect 0xe6!! (0x%x)\n", data32);
2929 if (!(data32 & URTW_8225_ADDR_6_DATA_MAGIC2)) {
2931 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC1);
2932 usb_pause_mtx(&sc->sc_mtx, 100);
2934 URTW_8225_ADDR_2_MAGIC, URTW_8225_ADDR_2_DATA_MAGIC2);
2935 usb_pause_mtx(&sc->sc_mtx, 50);
2936 error = urtw_8225_read(sc, URTW_8225_ADDR_6_MAGIC, &data32);
2939 if (!(data32 & URTW_8225_ADDR_6_DATA_MAGIC2))
2940 device_printf(sc->sc_dev, "RF calibration failed\n");
2942 usb_pause_mtx(&sc->sc_mtx, 100);
2945 URTW_8225_ADDR_0_MAGIC, URTW_8225_ADDR_0_DATA_MAGIC6);
2946 for (i = 0; i < 128; i++) {
2947 urtw_8187_write_phy_ofdm(sc, 0xb, urtw_8225_agc[i]);
2948 urtw_8187_write_phy_ofdm(sc, 0xa, (uint8_t)i + 0x80);
2951 for (i = 0; i < nitems(urtw_8225v2_rf_part2); i++) {
2952 urtw_8187_write_phy_ofdm(sc, urtw_8225v2_rf_part2[i].reg,
2953 urtw_8225v2_rf_part2[i].val);
2956 error = urtw_8225v2_setgain(sc, 4);
2960 for (i = 0; i < nitems(urtw_8225v2_rf_part3); i++) {
2961 urtw_8187_write_phy_cck(sc, urtw_8225v2_rf_part3[i].reg,
2962 urtw_8225v2_rf_part3[i].val);
2965 urtw_write8_m(sc, URTW_TESTR, 0x0d);
2967 error = urtw_8225v2_set_txpwrlvl(sc, 1);
2971 urtw_8187_write_phy_cck(sc, 0x10, 0x9b);
2972 urtw_8187_write_phy_ofdm(sc, 0x26, 0x90);
2974 /* TX ant A, 0x0 for B */
2975 error = urtw_8185_tx_antenna(sc, 0x3);
2978 urtw_write32_m(sc, URTW_HSSI_PARA, 0x3dc00002);
2980 error = urtw_8225_rf_set_chan(sc, 1);
2986 urtw_8225v2_rf_set_chan(struct urtw_softc *sc, int chan)
2990 error = urtw_8225v2_set_txpwrlvl(sc, chan);
2994 urtw_8225_write(sc, URTW_8225_ADDR_7_MAGIC, urtw_8225_channel[chan]);
2995 usb_pause_mtx(&sc->sc_mtx, 10);
3001 urtw_8225_read(struct urtw_softc *sc, uint8_t addr, uint32_t *data)
3005 uint8_t rlen = 12, wlen = 6;
3006 uint16_t o1, o2, o3, tmp;
3007 uint32_t d2w = ((uint32_t)(addr & 0x1f)) << 27;
3008 uint32_t mask = 0x80000000, value = 0;
3011 urtw_read16_m(sc, URTW_RF_PINS_OUTPUT, &o1);
3012 urtw_read16_m(sc, URTW_RF_PINS_ENABLE, &o2);
3013 urtw_read16_m(sc, URTW_RF_PINS_SELECT, &o3);
3014 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, o2 | URTW_RF_PINS_MAGIC4);
3015 urtw_write16_m(sc, URTW_RF_PINS_SELECT, o3 | URTW_RF_PINS_MAGIC4);
3016 o1 &= ~URTW_RF_PINS_MAGIC4;
3017 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_EN);
3019 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1);
3022 for (i = 0; i < (wlen / 2); i++, mask = mask >> 1) {
3023 bit = ((d2w & mask) != 0) ? 1 : 0;
3025 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1);
3027 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 |
3028 URTW_BB_HOST_BANG_CLK);
3030 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 |
3031 URTW_BB_HOST_BANG_CLK);
3036 bit = ((d2w & mask) != 0) ? 1 : 0;
3037 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 |
3038 URTW_BB_HOST_BANG_CLK);
3040 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 |
3041 URTW_BB_HOST_BANG_CLK);
3043 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1);
3046 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | URTW_BB_HOST_BANG_RW |
3047 URTW_BB_HOST_BANG_CLK);
3049 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, bit | o1 | URTW_BB_HOST_BANG_RW);
3051 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_RW);
3055 for (i = 0; i < rlen; i++, mask = mask >> 1) {
3056 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
3057 o1 | URTW_BB_HOST_BANG_RW);
3059 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
3060 o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK);
3062 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
3063 o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK);
3065 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
3066 o1 | URTW_BB_HOST_BANG_RW | URTW_BB_HOST_BANG_CLK);
3069 urtw_read16_m(sc, URTW_RF_PINS_INPUT, &tmp);
3070 value |= ((tmp & URTW_BB_HOST_BANG_CLK) ? mask : 0);
3071 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT,
3072 o1 | URTW_BB_HOST_BANG_RW);
3076 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, o1 | URTW_BB_HOST_BANG_EN |
3077 URTW_BB_HOST_BANG_RW);
3080 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, o2);
3081 urtw_write16_m(sc, URTW_RF_PINS_SELECT, o3);
3082 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, URTW_RF_PINS_OUTPUT_MAGIC1);
3091 urtw_8225v2_set_txpwrlvl(struct urtw_softc *sc, int chan)
3094 uint8_t *cck_pwrtable;
3095 uint8_t cck_pwrlvl_max = 15, ofdm_pwrlvl_max = 25, ofdm_pwrlvl_min = 10;
3096 uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff;
3097 uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff;
3100 /* CCK power setting */
3101 cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ? cck_pwrlvl_max : cck_pwrlvl;
3102 cck_pwrlvl += sc->sc_txpwr_cck_base;
3103 cck_pwrlvl = (cck_pwrlvl > 35) ? 35 : cck_pwrlvl;
3104 cck_pwrtable = (chan == 14) ? urtw_8225v2_txpwr_cck_ch14 :
3105 urtw_8225v2_txpwr_cck;
3107 for (i = 0; i < 8; i++)
3108 urtw_8187_write_phy_cck(sc, 0x44 + i, cck_pwrtable[i]);
3110 urtw_write8_m(sc, URTW_TX_GAIN_CCK,
3111 urtw_8225v2_tx_gain_cck_ofdm[cck_pwrlvl]);
3112 usb_pause_mtx(&sc->sc_mtx, 1);
3114 /* OFDM power setting */
3115 ofdm_pwrlvl = (ofdm_pwrlvl > (ofdm_pwrlvl_max - ofdm_pwrlvl_min)) ?
3116 ofdm_pwrlvl_max : ofdm_pwrlvl + ofdm_pwrlvl_min;
3117 ofdm_pwrlvl += sc->sc_txpwr_ofdm_base;
3118 ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl;
3120 error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON);
3124 urtw_8187_write_phy_ofdm(sc, 2, 0x42);
3125 urtw_8187_write_phy_ofdm(sc, 5, 0x0);
3126 urtw_8187_write_phy_ofdm(sc, 6, 0x40);
3127 urtw_8187_write_phy_ofdm(sc, 7, 0x0);
3128 urtw_8187_write_phy_ofdm(sc, 8, 0x40);
3130 urtw_write8_m(sc, URTW_TX_GAIN_OFDM,
3131 urtw_8225v2_tx_gain_cck_ofdm[ofdm_pwrlvl]);
3132 usb_pause_mtx(&sc->sc_mtx, 1);
3138 urtw_8225v2_setgain(struct urtw_softc *sc, int16_t gain)
3144 gainp = urtw_8225v2_gain_bg;
3145 urtw_8187_write_phy_ofdm(sc, 0x0d, gainp[gain * 3]);
3146 usb_pause_mtx(&sc->sc_mtx, 1);
3147 urtw_8187_write_phy_ofdm(sc, 0x1b, gainp[gain * 3 + 1]);
3148 usb_pause_mtx(&sc->sc_mtx, 1);
3149 urtw_8187_write_phy_ofdm(sc, 0x1d, gainp[gain * 3 + 2]);
3150 usb_pause_mtx(&sc->sc_mtx, 1);
3151 urtw_8187_write_phy_ofdm(sc, 0x21, 0x17);
3152 usb_pause_mtx(&sc->sc_mtx, 1);
3158 urtw_8225_isv2(struct urtw_softc *sc, int *ret)
3165 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, URTW_RF_PINS_MAGIC5);
3166 urtw_write16_m(sc, URTW_RF_PINS_SELECT, URTW_RF_PINS_MAGIC5);
3167 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, URTW_RF_PINS_MAGIC5);
3168 usb_pause_mtx(&sc->sc_mtx, 500);
3170 urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC,
3171 URTW_8225_ADDR_0_DATA_MAGIC1);
3173 error = urtw_8225_read(sc, URTW_8225_ADDR_8_MAGIC, &data);
3176 if (data != URTW_8225_ADDR_8_DATA_MAGIC1)
3179 error = urtw_8225_read(sc, URTW_8225_ADDR_9_MAGIC, &data);
3182 if (data != URTW_8225_ADDR_9_DATA_MAGIC1)
3186 urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC,
3187 URTW_8225_ADDR_0_DATA_MAGIC2);
3193 urtw_8225v2b_rf_init(struct urtw_softc *sc)
3195 struct ieee80211com *ic = &sc->sc_ic;
3196 struct ieee80211vap *vap = TAILQ_FIRST(&ic->ic_vaps);
3197 const uint8_t *macaddr;
3202 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
3207 * initialize extra registers on 8187
3209 urtw_write16_m(sc, URTW_BRSR_8187B, 0xfff);
3212 urtw_read8_m(sc, URTW_CW_CONF, &data8);
3213 data8 |= URTW_CW_CONF_PERPACKET_RETRY;
3214 urtw_write8_m(sc, URTW_CW_CONF, data8);
3217 urtw_read8_m(sc, URTW_TX_AGC_CTL, &data8);
3218 data8 |= URTW_TX_AGC_CTL_PERPACKET_GAIN;
3219 urtw_write8_m(sc, URTW_TX_AGC_CTL, data8);
3221 /* Auto Rate Fallback Control */
3222 #define URTW_ARFR 0x1e0
3223 urtw_write16_m(sc, URTW_ARFR, 0xfff);
3224 urtw_read8_m(sc, URTW_RATE_FALLBACK, &data8);
3225 urtw_write8_m(sc, URTW_RATE_FALLBACK,
3226 data8 | URTW_RATE_FALLBACK_ENABLE);
3228 urtw_read8_m(sc, URTW_MSR, &data8);
3229 urtw_write8_m(sc, URTW_MSR, data8 & 0xf3);
3230 urtw_read8_m(sc, URTW_MSR, &data8);
3231 urtw_write8_m(sc, URTW_MSR, data8 | URTW_MSR_LINK_ENEDCA);
3232 urtw_write8_m(sc, URTW_ACM_CONTROL, sc->sc_acmctl);
3234 urtw_write16_m(sc, URTW_ATIM_WND, 2);
3235 urtw_write16_m(sc, URTW_BEACON_INTERVAL, 100);
3236 #define URTW_FEMR_FOR_8187B 0x1d4
3237 urtw_write16_m(sc, URTW_FEMR_FOR_8187B, 0xffff);
3240 urtw_read8_m(sc, URTW_CONFIG1, &data8);
3241 data8 = (data8 & 0x3f) | 0x80;
3242 urtw_write8_m(sc, URTW_CONFIG1, data8);
3244 /* applying MAC address again. */
3245 macaddr = vap ? vap->iv_myaddr : ic->ic_macaddr;
3246 error = urtw_set_macaddr(sc, macaddr);
3250 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
3254 urtw_write8_m(sc, URTW_WPA_CONFIG, 0);
3259 for (i = 0; i < nitems(urtw_8225v2b_rf_part1); i++)
3260 urtw_write8_m(sc, urtw_8225v2b_rf_part1[i].reg,
3261 urtw_8225v2b_rf_part1[i].val);
3262 urtw_write16_m(sc, URTW_TID_AC_MAP, 0xfa50);
3263 urtw_write16_m(sc, URTW_INT_MIG, 0x0000);
3264 urtw_write32_m(sc, 0x1f0, 0);
3265 urtw_write32_m(sc, 0x1f4, 0);
3266 urtw_write8_m(sc, 0x1f8, 0);
3267 urtw_write32_m(sc, URTW_RF_TIMING, 0x4001);
3269 #define URTW_RFSW_CTRL 0x272
3270 urtw_write16_m(sc, URTW_RFSW_CTRL, 0x569a);
3275 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
3278 urtw_read8_m(sc, URTW_CONFIG3, &data8);
3279 urtw_write8_m(sc, URTW_CONFIG3,
3280 data8 | URTW_CONFIG3_ANAPARAM_WRITE);
3282 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
3286 /* setup RFE initial timing */
3287 urtw_write16_m(sc, URTW_RF_PINS_OUTPUT, 0x0480);
3288 urtw_write16_m(sc, URTW_RF_PINS_SELECT, 0x2488);
3289 urtw_write16_m(sc, URTW_RF_PINS_ENABLE, 0x1fff);
3290 usb_pause_mtx(&sc->sc_mtx, 1100);
3292 for (i = 0; i < nitems(urtw_8225v2b_rf_part0); i++) {
3293 urtw_8225_write(sc, urtw_8225v2b_rf_part0[i].reg,
3294 urtw_8225v2b_rf_part0[i].val);
3295 usb_pause_mtx(&sc->sc_mtx, 1);
3297 urtw_8225_write(sc, 0x00, 0x01b7);
3299 for (i = 0; i < 95; i++) {
3300 urtw_8225_write(sc, URTW_8225_ADDR_1_MAGIC, (uint8_t)(i + 1));
3301 usb_pause_mtx(&sc->sc_mtx, 1);
3302 urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC,
3303 urtw_8225v2b_rxgain[i]);
3304 usb_pause_mtx(&sc->sc_mtx, 1);
3307 urtw_8225_write(sc, URTW_8225_ADDR_3_MAGIC, 0x080);
3308 usb_pause_mtx(&sc->sc_mtx, 1);
3309 urtw_8225_write(sc, URTW_8225_ADDR_5_MAGIC, 0x004);
3310 usb_pause_mtx(&sc->sc_mtx, 1);
3311 urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC, 0x0b7);
3312 usb_pause_mtx(&sc->sc_mtx, 1);
3313 usb_pause_mtx(&sc->sc_mtx, 3000);
3314 urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, 0xc4d);
3315 usb_pause_mtx(&sc->sc_mtx, 2000);
3316 urtw_8225_write(sc, URTW_8225_ADDR_2_MAGIC, 0x44d);
3317 usb_pause_mtx(&sc->sc_mtx, 1);
3318 urtw_8225_write(sc, URTW_8225_ADDR_0_MAGIC, 0x2bf);
3319 usb_pause_mtx(&sc->sc_mtx, 1);
3321 urtw_write8_m(sc, URTW_TX_GAIN_CCK, 0x03);
3322 urtw_write8_m(sc, URTW_TX_GAIN_OFDM, 0x07);
3323 urtw_write8_m(sc, URTW_TX_ANTENNA, 0x03);
3325 urtw_8187_write_phy_ofdm(sc, 0x80, 0x12);
3326 for (i = 0; i < 128; i++) {
3327 uint32_t addr, data;
3329 data = (urtw_8225z2_agc[i] << 8) | 0x0000008f;
3330 addr = ((i + 0x80) << 8) | 0x0000008e;
3332 urtw_8187_write_phy_ofdm(sc, data & 0x7f, (data >> 8) & 0xff);
3333 urtw_8187_write_phy_ofdm(sc, addr & 0x7f, (addr >> 8) & 0xff);
3334 urtw_8187_write_phy_ofdm(sc, 0x0e, 0x00);
3336 urtw_8187_write_phy_ofdm(sc, 0x80, 0x10);
3338 for (i = 0; i < nitems(urtw_8225v2b_rf_part2); i++)
3339 urtw_8187_write_phy_ofdm(sc, i, urtw_8225v2b_rf_part2[i].val);
3341 urtw_write32_m(sc, URTW_8187B_AC_VO, (7 << 12) | (3 << 8) | 0x1c);
3342 urtw_write32_m(sc, URTW_8187B_AC_VI, (7 << 12) | (3 << 8) | 0x1c);
3343 urtw_write32_m(sc, URTW_8187B_AC_BE, (7 << 12) | (3 << 8) | 0x1c);
3344 urtw_write32_m(sc, URTW_8187B_AC_BK, (7 << 12) | (3 << 8) | 0x1c);
3346 urtw_8187_write_phy_ofdm(sc, 0x97, 0x46);
3347 urtw_8187_write_phy_ofdm(sc, 0xa4, 0xb6);
3348 urtw_8187_write_phy_ofdm(sc, 0x85, 0xfc);
3349 urtw_8187_write_phy_cck(sc, 0xc1, 0x88);
3356 urtw_8225v2b_rf_set_chan(struct urtw_softc *sc, int chan)
3360 error = urtw_8225v2b_set_txpwrlvl(sc, chan);
3364 urtw_8225_write(sc, URTW_8225_ADDR_7_MAGIC, urtw_8225_channel[chan]);
3365 usb_pause_mtx(&sc->sc_mtx, 10);
3371 urtw_8225v2b_set_txpwrlvl(struct urtw_softc *sc, int chan)
3374 uint8_t *cck_pwrtable;
3375 uint8_t cck_pwrlvl_max = 15;
3376 uint8_t cck_pwrlvl = sc->sc_txpwr_cck[chan] & 0xff;
3377 uint8_t ofdm_pwrlvl = sc->sc_txpwr_ofdm[chan] & 0xff;
3380 /* CCK power setting */
3381 cck_pwrlvl = (cck_pwrlvl > cck_pwrlvl_max) ?
3382 ((sc->sc_flags & URTW_RTL8187B_REV_B) ? cck_pwrlvl_max : 22) :
3383 (cck_pwrlvl + ((sc->sc_flags & URTW_RTL8187B_REV_B) ? 0 : 7));
3384 cck_pwrlvl += sc->sc_txpwr_cck_base;
3385 cck_pwrlvl = (cck_pwrlvl > 35) ? 35 : cck_pwrlvl;
3386 cck_pwrtable = (chan == 14) ? urtw_8225v2b_txpwr_cck_ch14 :
3387 urtw_8225v2b_txpwr_cck;
3389 if (sc->sc_flags & URTW_RTL8187B_REV_B)
3390 cck_pwrtable += (cck_pwrlvl <= 6) ? 0 :
3391 ((cck_pwrlvl <= 11) ? 8 : 16);
3393 cck_pwrtable += (cck_pwrlvl <= 5) ? 0 :
3394 ((cck_pwrlvl <= 11) ? 8 : ((cck_pwrlvl <= 17) ? 16 : 24));
3396 for (i = 0; i < 8; i++)
3397 urtw_8187_write_phy_cck(sc, 0x44 + i, cck_pwrtable[i]);
3399 urtw_write8_m(sc, URTW_TX_GAIN_CCK,
3400 urtw_8225v2_tx_gain_cck_ofdm[cck_pwrlvl] << 1);
3401 usb_pause_mtx(&sc->sc_mtx, 1);
3403 /* OFDM power setting */
3404 ofdm_pwrlvl = (ofdm_pwrlvl > 15) ?
3405 ((sc->sc_flags & URTW_RTL8187B_REV_B) ? 17 : 25) :
3406 (ofdm_pwrlvl + ((sc->sc_flags & URTW_RTL8187B_REV_B) ? 2 : 10));
3407 ofdm_pwrlvl += sc->sc_txpwr_ofdm_base;
3408 ofdm_pwrlvl = (ofdm_pwrlvl > 35) ? 35 : ofdm_pwrlvl;
3410 urtw_write8_m(sc, URTW_TX_GAIN_OFDM,
3411 urtw_8225v2_tx_gain_cck_ofdm[ofdm_pwrlvl] << 1);
3413 if (sc->sc_flags & URTW_RTL8187B_REV_B) {
3414 if (ofdm_pwrlvl <= 11) {
3415 urtw_8187_write_phy_ofdm(sc, 0x87, 0x60);
3416 urtw_8187_write_phy_ofdm(sc, 0x89, 0x60);
3418 urtw_8187_write_phy_ofdm(sc, 0x87, 0x5c);
3419 urtw_8187_write_phy_ofdm(sc, 0x89, 0x5c);
3422 if (ofdm_pwrlvl <= 11) {
3423 urtw_8187_write_phy_ofdm(sc, 0x87, 0x5c);
3424 urtw_8187_write_phy_ofdm(sc, 0x89, 0x5c);
3425 } else if (ofdm_pwrlvl <= 17) {
3426 urtw_8187_write_phy_ofdm(sc, 0x87, 0x54);
3427 urtw_8187_write_phy_ofdm(sc, 0x89, 0x54);
3429 urtw_8187_write_phy_ofdm(sc, 0x87, 0x50);
3430 urtw_8187_write_phy_ofdm(sc, 0x89, 0x50);
3433 usb_pause_mtx(&sc->sc_mtx, 1);
3439 urtw_read8e(struct urtw_softc *sc, int val, uint8_t *data)
3441 struct usb_device_request req;
3444 req.bmRequestType = UT_READ_VENDOR_DEVICE;
3445 req.bRequest = URTW_8187_GETREGS_REQ;
3446 USETW(req.wValue, val | 0xfe00);
3447 USETW(req.wIndex, 0);
3448 USETW(req.wLength, sizeof(uint8_t));
3450 error = urtw_do_request(sc, &req, data);
3455 urtw_write8e(struct urtw_softc *sc, int val, uint8_t data)
3457 struct usb_device_request req;
3459 req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
3460 req.bRequest = URTW_8187_SETREGS_REQ;
3461 USETW(req.wValue, val | 0xfe00);
3462 USETW(req.wIndex, 0);
3463 USETW(req.wLength, sizeof(uint8_t));
3465 return (urtw_do_request(sc, &req, &data));
3469 urtw_8180_set_anaparam(struct urtw_softc *sc, uint32_t val)
3474 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
3478 urtw_read8_m(sc, URTW_CONFIG3, &data);
3479 urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE);
3480 urtw_write32_m(sc, URTW_ANAPARAM, val);
3481 urtw_read8_m(sc, URTW_CONFIG3, &data);
3482 urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE);
3484 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
3492 urtw_8185_set_anaparam2(struct urtw_softc *sc, uint32_t val)
3497 error = urtw_set_mode(sc, URTW_EPROM_CMD_CONFIG);
3501 urtw_read8_m(sc, URTW_CONFIG3, &data);
3502 urtw_write8_m(sc, URTW_CONFIG3, data | URTW_CONFIG3_ANAPARAM_WRITE);
3503 urtw_write32_m(sc, URTW_ANAPARAM2, val);
3504 urtw_read8_m(sc, URTW_CONFIG3, &data);
3505 urtw_write8_m(sc, URTW_CONFIG3, data & ~URTW_CONFIG3_ANAPARAM_WRITE);
3507 error = urtw_set_mode(sc, URTW_EPROM_CMD_NORMAL);
3515 urtw_intr_enable(struct urtw_softc *sc)
3519 urtw_write16_m(sc, URTW_INTR_MASK, 0xffff);
3525 urtw_intr_disable(struct urtw_softc *sc)
3529 urtw_write16_m(sc, URTW_INTR_MASK, 0);
3535 urtw_reset(struct urtw_softc *sc)
3540 error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON);
3543 error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON);
3547 error = urtw_intr_disable(sc);
3550 usb_pause_mtx(&sc->sc_mtx, 100);
3552 error = urtw_write8e(sc, 0x18, 0x10);
3555 error = urtw_write8e(sc, 0x18, 0x11);
3558 error = urtw_write8e(sc, 0x18, 0x00);
3561 usb_pause_mtx(&sc->sc_mtx, 100);
3563 urtw_read8_m(sc, URTW_CMD, &data);
3564 data = (data & 0x2) | URTW_CMD_RST;
3565 urtw_write8_m(sc, URTW_CMD, data);
3566 usb_pause_mtx(&sc->sc_mtx, 100);
3568 urtw_read8_m(sc, URTW_CMD, &data);
3569 if (data & URTW_CMD_RST) {
3570 device_printf(sc->sc_dev, "reset timeout\n");
3574 error = urtw_set_mode(sc, URTW_EPROM_CMD_LOAD);
3577 usb_pause_mtx(&sc->sc_mtx, 100);
3579 error = urtw_8180_set_anaparam(sc, URTW_8225_ANAPARAM_ON);
3582 error = urtw_8185_set_anaparam2(sc, URTW_8225_ANAPARAM2_ON);
3590 urtw_led_ctl(struct urtw_softc *sc, int mode)
3592 usb_error_t error = 0;
3594 switch (sc->sc_strategy) {
3595 case URTW_SW_LED_MODE0:
3596 error = urtw_led_mode0(sc, mode);
3598 case URTW_SW_LED_MODE1:
3599 error = urtw_led_mode1(sc, mode);
3601 case URTW_SW_LED_MODE2:
3602 error = urtw_led_mode2(sc, mode);
3604 case URTW_SW_LED_MODE3:
3605 error = urtw_led_mode3(sc, mode);
3608 DPRINTF(sc, URTW_DEBUG_STATE,
3609 "unsupported LED mode %d\n", sc->sc_strategy);
3610 error = USB_ERR_INVAL;
3618 urtw_led_mode0(struct urtw_softc *sc, int mode)
3622 case URTW_LED_CTL_POWER_ON:
3623 sc->sc_gpio_ledstate = URTW_LED_POWER_ON_BLINK;
3625 case URTW_LED_CTL_TX:
3626 if (sc->sc_gpio_ledinprogress == 1)
3629 sc->sc_gpio_ledstate = URTW_LED_BLINK_NORMAL;
3630 sc->sc_gpio_blinktime = 2;
3632 case URTW_LED_CTL_LINK:
3633 sc->sc_gpio_ledstate = URTW_LED_ON;
3636 DPRINTF(sc, URTW_DEBUG_STATE,
3637 "unsupported LED mode 0x%x", mode);
3638 return (USB_ERR_INVAL);
3641 switch (sc->sc_gpio_ledstate) {
3643 if (sc->sc_gpio_ledinprogress != 0)
3645 urtw_led_on(sc, URTW_LED_GPIO);
3647 case URTW_LED_BLINK_NORMAL:
3648 if (sc->sc_gpio_ledinprogress != 0)
3650 sc->sc_gpio_ledinprogress = 1;
3651 sc->sc_gpio_blinkstate = (sc->sc_gpio_ledon != 0) ?
3652 URTW_LED_OFF : URTW_LED_ON;
3653 usb_callout_reset(&sc->sc_led_ch, hz, urtw_led_ch, sc);
3655 case URTW_LED_POWER_ON_BLINK:
3656 urtw_led_on(sc, URTW_LED_GPIO);
3657 usb_pause_mtx(&sc->sc_mtx, 100);
3658 urtw_led_off(sc, URTW_LED_GPIO);
3661 DPRINTF(sc, URTW_DEBUG_STATE,
3662 "unknown LED status 0x%x", sc->sc_gpio_ledstate);
3663 return (USB_ERR_INVAL);
3669 urtw_led_mode1(struct urtw_softc *sc, int mode)
3671 return (USB_ERR_INVAL);
3675 urtw_led_mode2(struct urtw_softc *sc, int mode)
3677 return (USB_ERR_INVAL);
3681 urtw_led_mode3(struct urtw_softc *sc, int mode)
3683 return (USB_ERR_INVAL);
3687 urtw_led_on(struct urtw_softc *sc, int type)
3691 if (type == URTW_LED_GPIO) {
3692 switch (sc->sc_gpio_ledpin) {
3693 case URTW_LED_PIN_GPIO0:
3694 urtw_write8_m(sc, URTW_GPIO, 0x01);
3695 urtw_write8_m(sc, URTW_GP_ENABLE, 0x00);
3698 DPRINTF(sc, URTW_DEBUG_STATE,
3699 "unsupported LED PIN type 0x%x",
3700 sc->sc_gpio_ledpin);
3701 error = USB_ERR_INVAL;
3705 DPRINTF(sc, URTW_DEBUG_STATE,
3706 "unsupported LED type 0x%x", type);
3707 error = USB_ERR_INVAL;
3711 sc->sc_gpio_ledon = 1;
3717 urtw_led_off(struct urtw_softc *sc, int type)
3721 if (type == URTW_LED_GPIO) {
3722 switch (sc->sc_gpio_ledpin) {
3723 case URTW_LED_PIN_GPIO0:
3724 urtw_write8_m(sc, URTW_GPIO, URTW_GPIO_DATA_MAGIC1);
3726 URTW_GP_ENABLE, URTW_GP_ENABLE_DATA_MAGIC1);
3729 DPRINTF(sc, URTW_DEBUG_STATE,
3730 "unsupported LED PIN type 0x%x",
3731 sc->sc_gpio_ledpin);
3732 error = USB_ERR_INVAL;
3736 DPRINTF(sc, URTW_DEBUG_STATE,
3737 "unsupported LED type 0x%x", type);
3738 error = USB_ERR_INVAL;
3742 sc->sc_gpio_ledon = 0;
3749 urtw_led_ch(void *arg)
3751 struct urtw_softc *sc = arg;
3752 struct ieee80211com *ic = &sc->sc_ic;
3754 ieee80211_runtask(ic, &sc->sc_led_task);
3758 urtw_ledtask(void *arg, int pending)
3760 struct urtw_softc *sc = arg;
3762 if (sc->sc_strategy != URTW_SW_LED_MODE0) {
3763 DPRINTF(sc, URTW_DEBUG_STATE,
3764 "could not process a LED strategy 0x%x",
3775 urtw_led_blink(struct urtw_softc *sc)
3780 if (sc->sc_gpio_blinkstate == URTW_LED_ON)
3781 error = urtw_led_on(sc, URTW_LED_GPIO);
3783 error = urtw_led_off(sc, URTW_LED_GPIO);
3784 sc->sc_gpio_blinktime--;
3785 if (sc->sc_gpio_blinktime == 0)
3788 if (sc->sc_gpio_ledstate != URTW_LED_BLINK_NORMAL &&
3789 sc->sc_gpio_ledstate != URTW_LED_BLINK_SLOWLY &&
3790 sc->sc_gpio_ledstate != URTW_LED_BLINK_CM3)
3794 if (sc->sc_gpio_ledstate == URTW_LED_ON &&
3795 sc->sc_gpio_ledon == 0)
3796 error = urtw_led_on(sc, URTW_LED_GPIO);
3797 else if (sc->sc_gpio_ledstate == URTW_LED_OFF &&
3798 sc->sc_gpio_ledon == 1)
3799 error = urtw_led_off(sc, URTW_LED_GPIO);
3801 sc->sc_gpio_blinktime = 0;
3802 sc->sc_gpio_ledinprogress = 0;
3806 sc->sc_gpio_blinkstate = (sc->sc_gpio_blinkstate != URTW_LED_ON) ?
3807 URTW_LED_ON : URTW_LED_OFF;
3809 switch (sc->sc_gpio_ledstate) {
3810 case URTW_LED_BLINK_NORMAL:
3811 usb_callout_reset(&sc->sc_led_ch, hz, urtw_led_ch, sc);
3814 DPRINTF(sc, URTW_DEBUG_STATE,
3815 "unknown LED status 0x%x",
3816 sc->sc_gpio_ledstate);
3817 return (USB_ERR_INVAL);
3823 urtw_rx_enable(struct urtw_softc *sc)
3828 usbd_transfer_start((sc->sc_flags & URTW_RTL8187B) ?
3829 sc->sc_xfer[URTW_8187B_BULK_RX] : sc->sc_xfer[URTW_8187L_BULK_RX]);
3831 error = urtw_rx_setconf(sc);
3835 if ((sc->sc_flags & URTW_RTL8187B) == 0) {
3836 urtw_read8_m(sc, URTW_CMD, &data);
3837 urtw_write8_m(sc, URTW_CMD, data | URTW_CMD_RX_ENABLE);
3844 urtw_tx_enable(struct urtw_softc *sc)
3850 if (sc->sc_flags & URTW_RTL8187B) {
3851 urtw_read32_m(sc, URTW_TX_CONF, &data);
3852 data &= ~URTW_TX_LOOPBACK_MASK;
3853 data &= ~(URTW_TX_DPRETRY_MASK | URTW_TX_RTSRETRY_MASK);
3854 data &= ~(URTW_TX_NOCRC | URTW_TX_MXDMA_MASK);
3855 data &= ~URTW_TX_SWPLCPLEN;
3856 data |= URTW_TX_HW_SEQNUM | URTW_TX_DISREQQSIZE |
3857 (7 << 8) | /* short retry limit */
3858 (7 << 0) | /* long retry limit */
3859 (7 << 21); /* MAX TX DMA */
3860 urtw_write32_m(sc, URTW_TX_CONF, data);
3862 urtw_read8_m(sc, URTW_MSR, &data8);
3863 data8 |= URTW_MSR_LINK_ENEDCA;
3864 urtw_write8_m(sc, URTW_MSR, data8);
3868 urtw_read8_m(sc, URTW_CW_CONF, &data8);
3869 data8 &= ~(URTW_CW_CONF_PERPACKET_CW | URTW_CW_CONF_PERPACKET_RETRY);
3870 urtw_write8_m(sc, URTW_CW_CONF, data8);
3872 urtw_read8_m(sc, URTW_TX_AGC_CTL, &data8);
3873 data8 &= ~URTW_TX_AGC_CTL_PERPACKET_GAIN;
3874 data8 &= ~URTW_TX_AGC_CTL_PERPACKET_ANTSEL;
3875 data8 &= ~URTW_TX_AGC_CTL_FEEDBACK_ANT;
3876 urtw_write8_m(sc, URTW_TX_AGC_CTL, data8);
3878 urtw_read32_m(sc, URTW_TX_CONF, &data);
3879 data &= ~URTW_TX_LOOPBACK_MASK;
3880 data |= URTW_TX_LOOPBACK_NONE;
3881 data &= ~(URTW_TX_DPRETRY_MASK | URTW_TX_RTSRETRY_MASK);
3882 data |= sc->sc_tx_retry << URTW_TX_DPRETRY_SHIFT;
3883 data |= sc->sc_rts_retry << URTW_TX_RTSRETRY_SHIFT;
3884 data &= ~(URTW_TX_NOCRC | URTW_TX_MXDMA_MASK);
3885 data |= URTW_TX_MXDMA_2048 | URTW_TX_CWMIN | URTW_TX_DISCW;
3886 data &= ~URTW_TX_SWPLCPLEN;
3887 data |= URTW_TX_NOICV;
3888 urtw_write32_m(sc, URTW_TX_CONF, data);
3890 urtw_read8_m(sc, URTW_CMD, &data8);
3891 urtw_write8_m(sc, URTW_CMD, data8 | URTW_CMD_TX_ENABLE);
3897 urtw_rx_setconf(struct urtw_softc *sc)
3899 struct ieee80211com *ic = &sc->sc_ic;
3903 urtw_read32_m(sc, URTW_RX, &data);
3904 data = data &~ URTW_RX_FILTER_MASK;
3905 if (sc->sc_flags & URTW_RTL8187B) {
3906 data = data | URTW_RX_FILTER_MNG | URTW_RX_FILTER_DATA |
3907 URTW_RX_FILTER_MCAST | URTW_RX_FILTER_BCAST |
3908 URTW_RX_FIFO_THRESHOLD_NONE |
3909 URTW_MAX_RX_DMA_2048 |
3910 URTW_RX_AUTORESETPHY | URTW_RCR_ONLYERLPKT;
3912 data = data | URTW_RX_FILTER_MNG | URTW_RX_FILTER_DATA;
3913 data = data | URTW_RX_FILTER_BCAST | URTW_RX_FILTER_MCAST;
3915 if (ic->ic_opmode == IEEE80211_M_MONITOR) {
3916 data = data | URTW_RX_FILTER_ICVERR;
3917 data = data | URTW_RX_FILTER_PWR;
3919 if (sc->sc_crcmon == 1 && ic->ic_opmode == IEEE80211_M_MONITOR)
3920 data = data | URTW_RX_FILTER_CRCERR;
3922 data = data &~ URTW_RX_FIFO_THRESHOLD_MASK;
3923 data = data | URTW_RX_FIFO_THRESHOLD_NONE |
3924 URTW_RX_AUTORESETPHY;
3925 data = data &~ URTW_MAX_RX_DMA_MASK;
3926 data = data | URTW_MAX_RX_DMA_2048 | URTW_RCR_ONLYERLPKT;
3929 /* XXX allmulti should not be checked here... */
3930 if (ic->ic_opmode == IEEE80211_M_MONITOR ||
3931 ic->ic_promisc > 0 || ic->ic_allmulti > 0) {
3932 data = data | URTW_RX_FILTER_CTL;
3933 data = data | URTW_RX_FILTER_ALLMAC;
3935 data = data | URTW_RX_FILTER_NICMAC;
3936 data = data | URTW_RX_CHECK_BSSID;
3939 urtw_write32_m(sc, URTW_RX, data);
3944 static struct mbuf *
3945 urtw_rxeof(struct usb_xfer *xfer, struct urtw_data *data, int *rssi_p,
3948 int actlen, flen, rssi;
3949 struct ieee80211_frame *wh;
3950 struct mbuf *m, *mnew;
3951 struct urtw_softc *sc = data->sc;
3952 struct ieee80211com *ic = &sc->sc_ic;
3953 uint8_t noise = 0, rate;
3956 usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
3958 if (sc->sc_flags & URTW_RTL8187B) {
3959 struct urtw_8187b_rxhdr *rx;
3961 if (actlen < sizeof(*rx) + IEEE80211_ACK_LEN)
3964 rx = (struct urtw_8187b_rxhdr *)(data->buf +
3965 (actlen - (sizeof(struct urtw_8187b_rxhdr))));
3966 flen = le32toh(rx->flag) & 0xfff;
3967 if (flen > actlen - sizeof(*rx))
3970 rate = (le32toh(rx->flag) >> URTW_RX_FLAG_RXRATE_SHIFT) & 0xf;
3972 rssi = rx->rssi & URTW_RX_RSSI_MASK;
3975 if (ieee80211_radiotap_active(ic))
3976 mactime = rx->mactime;
3978 struct urtw_8187l_rxhdr *rx;
3980 if (actlen < sizeof(*rx) + IEEE80211_ACK_LEN)
3983 rx = (struct urtw_8187l_rxhdr *)(data->buf +
3984 (actlen - (sizeof(struct urtw_8187l_rxhdr))));
3985 flen = le32toh(rx->flag) & 0xfff;
3986 if (flen > actlen - sizeof(*rx))
3989 rate = (le32toh(rx->flag) >> URTW_RX_FLAG_RXRATE_SHIFT) & 0xf;
3991 rssi = rx->rssi & URTW_RX_8187L_RSSI_MASK;
3994 if (ieee80211_radiotap_active(ic))
3995 mactime = rx->mactime;
3998 if (flen < IEEE80211_ACK_LEN)
4001 mnew = m_getcl(M_NOWAIT, MT_DATA, M_PKTHDR);
4007 data->buf = mtod(mnew, uint8_t *);
4010 m->m_pkthdr.len = m->m_len = flen - IEEE80211_CRC_LEN;
4012 if (ieee80211_radiotap_active(ic)) {
4013 struct urtw_rx_radiotap_header *tap = &sc->sc_rxtap;
4015 tap->wr_tsf = mactime;
4017 tap->wr_dbm_antsignal = (int8_t)rssi;
4020 wh = mtod(m, struct ieee80211_frame *);
4021 if (IEEE80211_IS_DATA(wh))
4022 sc->sc_currate = (rate > 0) ? rate : sc->sc_currate;
4025 *nf_p = noise; /* XXX correct? */
4030 counter_u64_add(ic->ic_ierrors, 1);
4035 urtw_bulk_rx_callback(struct usb_xfer *xfer, usb_error_t error)
4037 struct urtw_softc *sc = usbd_xfer_softc(xfer);
4038 struct ieee80211com *ic = &sc->sc_ic;
4039 struct ieee80211_node *ni;
4040 struct epoch_tracker et;
4041 struct mbuf *m = NULL;
4042 struct urtw_data *data;
4046 URTW_ASSERT_LOCKED(sc);
4048 switch (USB_GET_STATE(xfer)) {
4049 case USB_ST_TRANSFERRED:
4050 data = STAILQ_FIRST(&sc->sc_rx_active);
4053 STAILQ_REMOVE_HEAD(&sc->sc_rx_active, next);
4054 m = urtw_rxeof(xfer, data, &rssi, &nf);
4055 STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next);
4059 data = STAILQ_FIRST(&sc->sc_rx_inactive);
4061 KASSERT(m == NULL, ("mbuf isn't NULL"));
4064 STAILQ_REMOVE_HEAD(&sc->sc_rx_inactive, next);
4065 STAILQ_INSERT_TAIL(&sc->sc_rx_active, data, next);
4066 usbd_xfer_set_frame_data(xfer, 0, data->buf,
4067 usbd_xfer_max_len(xfer));
4068 usbd_transfer_submit(xfer);
4071 * To avoid LOR we should unlock our private mutex here to call
4072 * ieee80211_input() because here is at the end of a USB
4073 * callback and safe to unlock.
4077 if (m->m_pkthdr.len >=
4078 sizeof(struct ieee80211_frame_min)) {
4079 ni = ieee80211_find_rxnode(ic,
4080 mtod(m, struct ieee80211_frame_min *));
4084 NET_EPOCH_ENTER(et);
4086 (void) ieee80211_input(ni, m, rssi, nf);
4087 /* node is no longer needed */
4088 ieee80211_free_node(ni);
4090 (void) ieee80211_input_all(ic, m, rssi, nf);
4097 /* needs it to the inactive queue due to a error. */
4098 data = STAILQ_FIRST(&sc->sc_rx_active);
4100 STAILQ_REMOVE_HEAD(&sc->sc_rx_active, next);
4101 STAILQ_INSERT_TAIL(&sc->sc_rx_inactive, data, next);
4103 if (error != USB_ERR_CANCELLED) {
4104 usbd_xfer_set_stall(xfer);
4105 counter_u64_add(ic->ic_ierrors, 1);
4112 #define URTW_STATUS_TYPE_TXCLOSE 1
4113 #define URTW_STATUS_TYPE_BEACON_INTR 0
4116 urtw_txstatus_eof(struct usb_xfer *xfer)
4118 struct urtw_softc *sc = usbd_xfer_softc(xfer);
4119 struct ieee80211com *ic = &sc->sc_ic;
4120 int actlen, type, pktretry, seq;
4123 usbd_xfer_status(xfer, &actlen, NULL, NULL, NULL);
4125 if (actlen != sizeof(uint64_t))
4128 val = le64toh(sc->sc_txstatus);
4129 type = (val >> 30) & 0x3;
4130 if (type == URTW_STATUS_TYPE_TXCLOSE) {
4131 pktretry = val & 0xff;
4132 seq = (val >> 16) & 0xff;
4133 if (pktretry == URTW_TX_MAXRETRY)
4134 counter_u64_add(ic->ic_oerrors, 1);
4135 DPRINTF(sc, URTW_DEBUG_TXSTATUS, "pktretry %d seq %#x\n",
4141 urtw_bulk_tx_status_callback(struct usb_xfer *xfer, usb_error_t error)
4143 struct urtw_softc *sc = usbd_xfer_softc(xfer);
4144 struct ieee80211com *ic = &sc->sc_ic;
4145 void *dma_buf = usbd_xfer_get_frame_buffer(xfer, 0);
4147 URTW_ASSERT_LOCKED(sc);
4149 switch (USB_GET_STATE(xfer)) {
4150 case USB_ST_TRANSFERRED:
4151 urtw_txstatus_eof(xfer);
4155 memcpy(dma_buf, &sc->sc_txstatus, sizeof(uint64_t));
4156 usbd_xfer_set_frame_len(xfer, 0, sizeof(uint64_t));
4157 usbd_transfer_submit(xfer);
4160 if (error != USB_ERR_CANCELLED) {
4161 usbd_xfer_set_stall(xfer);
4162 counter_u64_add(ic->ic_ierrors, 1);
4170 urtw_txeof(struct usb_xfer *xfer, struct urtw_data *data)
4172 struct urtw_softc *sc = usbd_xfer_softc(xfer);
4174 URTW_ASSERT_LOCKED(sc);
4178 ieee80211_tx_complete(data->ni, data->m, 0);
4186 urtw_bulk_tx_callback(struct usb_xfer *xfer, usb_error_t error)
4188 struct urtw_softc *sc = usbd_xfer_softc(xfer);
4189 struct urtw_data *data;
4191 URTW_ASSERT_LOCKED(sc);
4193 switch (USB_GET_STATE(xfer)) {
4194 case USB_ST_TRANSFERRED:
4195 data = STAILQ_FIRST(&sc->sc_tx_active);
4198 STAILQ_REMOVE_HEAD(&sc->sc_tx_active, next);
4199 urtw_txeof(xfer, data);
4200 STAILQ_INSERT_TAIL(&sc->sc_tx_inactive, data, next);
4204 data = STAILQ_FIRST(&sc->sc_tx_pending);
4206 DPRINTF(sc, URTW_DEBUG_XMIT,
4207 "%s: empty pending queue\n", __func__);
4210 STAILQ_REMOVE_HEAD(&sc->sc_tx_pending, next);
4211 STAILQ_INSERT_TAIL(&sc->sc_tx_active, data, next);
4213 usbd_xfer_set_frame_data(xfer, 0, data->buf, data->buflen);
4214 usbd_transfer_submit(xfer);
4219 data = STAILQ_FIRST(&sc->sc_tx_active);
4222 if (data->ni != NULL) {
4223 if_inc_counter(data->ni->ni_vap->iv_ifp,
4224 IFCOUNTER_OERRORS, 1);
4225 ieee80211_free_node(data->ni);
4228 if (error != USB_ERR_CANCELLED) {
4229 usbd_xfer_set_stall(xfer);
4236 static struct urtw_data *
4237 _urtw_getbuf(struct urtw_softc *sc)
4239 struct urtw_data *bf;
4241 bf = STAILQ_FIRST(&sc->sc_tx_inactive);
4243 STAILQ_REMOVE_HEAD(&sc->sc_tx_inactive, next);
4247 DPRINTF(sc, URTW_DEBUG_XMIT, "%s: %s\n", __func__,
4248 "out of xmit buffers");
4252 static struct urtw_data *
4253 urtw_getbuf(struct urtw_softc *sc)
4255 struct urtw_data *bf;
4257 URTW_ASSERT_LOCKED(sc);
4259 bf = _urtw_getbuf(sc);
4261 DPRINTF(sc, URTW_DEBUG_XMIT, "%s: stop queue\n", __func__);
4266 urtw_isbmode(uint16_t rate)
4269 return ((rate <= 22 && rate != 12 && rate != 18) ||
4270 rate == 44) ? (1) : (0);
4274 urtw_rate2dbps(uint16_t rate)
4294 urtw_compute_txtime(uint16_t framelen, uint16_t rate,
4295 uint8_t ismgt, uint8_t isshort)
4297 uint16_t ceiling, frametime, n_dbps;
4299 if (urtw_isbmode(rate)) {
4300 if (ismgt || !isshort || rate == 2)
4301 frametime = (uint16_t)(144 + 48 +
4302 (framelen * 8 / (rate / 2)));
4304 frametime = (uint16_t)(72 + 24 +
4305 (framelen * 8 / (rate / 2)));
4306 if ((framelen * 8 % (rate / 2)) != 0)
4309 n_dbps = urtw_rate2dbps(rate);
4310 ceiling = (16 + 8 * framelen + 6) / n_dbps
4311 + (((16 + 8 * framelen + 6) % n_dbps) ? 1 : 0);
4312 frametime = (uint16_t)(16 + 4 + 4 * ceiling + 6);
4318 * Callback from the 802.11 layer to update the
4319 * slot time based on the current setting.
4322 urtw_updateslot(struct ieee80211com *ic)
4324 struct urtw_softc *sc = ic->ic_softc;
4326 ieee80211_runtask(ic, &sc->sc_updateslot_task);
4330 urtw_updateslottask(void *arg, int pending)
4332 struct urtw_softc *sc = arg;
4333 struct ieee80211com *ic = &sc->sc_ic;
4337 if ((sc->sc_flags & URTW_RUNNING) == 0) {
4341 if (sc->sc_flags & URTW_RTL8187B) {
4342 urtw_write8_m(sc, URTW_SIFS, 0x22);
4343 if (IEEE80211_IS_CHAN_ANYG(ic->ic_curchan))
4344 urtw_write8_m(sc, URTW_SLOT, IEEE80211_DUR_SHSLOT);
4346 urtw_write8_m(sc, URTW_SLOT, IEEE80211_DUR_SLOT);
4347 urtw_write8_m(sc, URTW_8187B_EIFS, 0x5b);
4348 urtw_write8_m(sc, URTW_CARRIER_SCOUNT, 0x5b);
4350 urtw_write8_m(sc, URTW_SIFS, 0x22);
4351 if (sc->sc_state == IEEE80211_S_ASSOC &&
4352 ic->ic_flags & IEEE80211_F_SHSLOT)
4353 urtw_write8_m(sc, URTW_SLOT, IEEE80211_DUR_SHSLOT);
4355 urtw_write8_m(sc, URTW_SLOT, IEEE80211_DUR_SLOT);
4356 if (IEEE80211_IS_CHAN_ANYG(ic->ic_curchan)) {
4357 urtw_write8_m(sc, URTW_DIFS, 0x14);
4358 urtw_write8_m(sc, URTW_EIFS, 0x5b - 0x14);
4359 urtw_write8_m(sc, URTW_CW_VAL, 0x73);
4361 urtw_write8_m(sc, URTW_DIFS, 0x24);
4362 urtw_write8_m(sc, URTW_EIFS, 0x5b - 0x24);
4363 urtw_write8_m(sc, URTW_CW_VAL, 0xa5);
4371 urtw_sysctl_node(struct urtw_softc *sc)
4373 #define URTW_SYSCTL_STAT_ADD32(c, h, n, p, d) \
4374 SYSCTL_ADD_UINT(c, h, OID_AUTO, n, CTLFLAG_RD, p, 0, d)
4375 struct sysctl_ctx_list *ctx;
4376 struct sysctl_oid_list *child, *parent;
4377 struct sysctl_oid *tree;
4378 struct urtw_stats *stats = &sc->sc_stats;
4380 ctx = device_get_sysctl_ctx(sc->sc_dev);
4381 child = SYSCTL_CHILDREN(device_get_sysctl_tree(sc->sc_dev));
4383 tree = SYSCTL_ADD_NODE(ctx, child, OID_AUTO, "stats",
4384 CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "URTW statistics");
4385 parent = SYSCTL_CHILDREN(tree);
4387 /* Tx statistics. */
4388 tree = SYSCTL_ADD_NODE(ctx, parent, OID_AUTO, "tx",
4389 CTLFLAG_RD | CTLFLAG_MPSAFE, NULL, "Tx MAC statistics");
4390 child = SYSCTL_CHILDREN(tree);
4391 URTW_SYSCTL_STAT_ADD32(ctx, child, "1m", &stats->txrates[0],
4393 URTW_SYSCTL_STAT_ADD32(ctx, child, "2m", &stats->txrates[1],
4395 URTW_SYSCTL_STAT_ADD32(ctx, child, "5.5m", &stats->txrates[2],
4397 URTW_SYSCTL_STAT_ADD32(ctx, child, "6m", &stats->txrates[4],
4399 URTW_SYSCTL_STAT_ADD32(ctx, child, "9m", &stats->txrates[5],
4401 URTW_SYSCTL_STAT_ADD32(ctx, child, "11m", &stats->txrates[3],
4403 URTW_SYSCTL_STAT_ADD32(ctx, child, "12m", &stats->txrates[6],
4405 URTW_SYSCTL_STAT_ADD32(ctx, child, "18m", &stats->txrates[7],
4407 URTW_SYSCTL_STAT_ADD32(ctx, child, "24m", &stats->txrates[8],
4409 URTW_SYSCTL_STAT_ADD32(ctx, child, "36m", &stats->txrates[9],
4411 URTW_SYSCTL_STAT_ADD32(ctx, child, "48m", &stats->txrates[10],
4413 URTW_SYSCTL_STAT_ADD32(ctx, child, "54m", &stats->txrates[11],
4415 #undef URTW_SYSCTL_STAT_ADD32
4418 static device_method_t urtw_methods[] = {
4419 DEVMETHOD(device_probe, urtw_match),
4420 DEVMETHOD(device_attach, urtw_attach),
4421 DEVMETHOD(device_detach, urtw_detach),
4424 static driver_t urtw_driver = {
4426 .methods = urtw_methods,
4427 .size = sizeof(struct urtw_softc)
4429 static devclass_t urtw_devclass;
4431 DRIVER_MODULE(urtw, uhub, urtw_driver, urtw_devclass, NULL, 0);
4432 MODULE_DEPEND(urtw, wlan, 1, 1, 1);
4433 MODULE_DEPEND(urtw, usb, 1, 1, 1);
4434 MODULE_VERSION(urtw, 1);
4435 USB_PNP_HOST_INFO(urtw_devs);