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