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