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