if_run.c revision 1.10.6.13 1 1.10.6.13 skrll /* $NetBSD: if_run.c,v 1.10.6.13 2017/01/29 15:58:14 skrll Exp $ */
2 1.1 nonaka /* $OpenBSD: if_run.c,v 1.90 2012/03/24 15:11:04 jsg Exp $ */
3 1.1 nonaka
4 1.1 nonaka /*-
5 1.1 nonaka * Copyright (c) 2008-2010 Damien Bergamini <damien.bergamini (at) free.fr>
6 1.1 nonaka *
7 1.1 nonaka * Permission to use, copy, modify, and distribute this software for any
8 1.1 nonaka * purpose with or without fee is hereby granted, provided that the above
9 1.1 nonaka * copyright notice and this permission notice appear in all copies.
10 1.1 nonaka *
11 1.1 nonaka * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 1.1 nonaka * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 1.1 nonaka * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 1.1 nonaka * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 1.1 nonaka * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 1.1 nonaka * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 1.1 nonaka * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 1.1 nonaka */
19 1.1 nonaka
20 1.1 nonaka /*-
21 1.1 nonaka * Ralink Technology RT2700U/RT2800U/RT3000U chipset driver.
22 1.1 nonaka * http://www.ralinktech.com/
23 1.1 nonaka */
24 1.1 nonaka
25 1.1 nonaka #include <sys/cdefs.h>
26 1.10.6.13 skrll __KERNEL_RCSID(0, "$NetBSD: if_run.c,v 1.10.6.13 2017/01/29 15:58:14 skrll Exp $");
27 1.10.6.12 skrll
28 1.10.6.12 skrll #ifdef _KERNEL_OPT
29 1.10.6.12 skrll #include "opt_usb.h"
30 1.10.6.12 skrll #endif
31 1.1 nonaka
32 1.1 nonaka #include <sys/param.h>
33 1.1 nonaka #include <sys/sockio.h>
34 1.1 nonaka #include <sys/sysctl.h>
35 1.1 nonaka #include <sys/mbuf.h>
36 1.1 nonaka #include <sys/kernel.h>
37 1.1 nonaka #include <sys/socket.h>
38 1.1 nonaka #include <sys/systm.h>
39 1.1 nonaka #include <sys/malloc.h>
40 1.1 nonaka #include <sys/callout.h>
41 1.1 nonaka #include <sys/module.h>
42 1.1 nonaka #include <sys/conf.h>
43 1.1 nonaka #include <sys/device.h>
44 1.1 nonaka
45 1.1 nonaka #include <sys/bus.h>
46 1.1 nonaka #include <machine/endian.h>
47 1.1 nonaka #include <sys/intr.h>
48 1.1 nonaka
49 1.1 nonaka #include <net/bpf.h>
50 1.1 nonaka #include <net/if.h>
51 1.1 nonaka #include <net/if_arp.h>
52 1.1 nonaka #include <net/if_dl.h>
53 1.1 nonaka #include <net/if_ether.h>
54 1.1 nonaka #include <net/if_media.h>
55 1.1 nonaka #include <net/if_types.h>
56 1.1 nonaka
57 1.1 nonaka #include <net80211/ieee80211_var.h>
58 1.1 nonaka #include <net80211/ieee80211_amrr.h>
59 1.1 nonaka #include <net80211/ieee80211_radiotap.h>
60 1.1 nonaka
61 1.1 nonaka #include <dev/firmload.h>
62 1.1 nonaka
63 1.1 nonaka #include <dev/usb/usb.h>
64 1.1 nonaka #include <dev/usb/usbdi.h>
65 1.1 nonaka #include <dev/usb/usbdivar.h>
66 1.1 nonaka #include <dev/usb/usbdi_util.h>
67 1.1 nonaka #include <dev/usb/usbdevs.h>
68 1.1 nonaka
69 1.1 nonaka #include <dev/ic/rt2860reg.h> /* shared with ral(4) */
70 1.1 nonaka #include <dev/usb/if_runvar.h>
71 1.1 nonaka
72 1.1 nonaka #ifdef RUN_DEBUG
73 1.1 nonaka #define DPRINTF(x) do { if (run_debug) printf x; } while (0)
74 1.1 nonaka #define DPRINTFN(n, x) do { if (run_debug >= (n)) printf x; } while (0)
75 1.1 nonaka int run_debug = 0;
76 1.1 nonaka #else
77 1.1 nonaka #define DPRINTF(x)
78 1.1 nonaka #define DPRINTFN(n, x)
79 1.1 nonaka #endif
80 1.1 nonaka
81 1.10.6.11 skrll #define IEEE80211_HAS_ADDR4(wh) IEEE80211_IS_DSTODS(wh)
82 1.10.6.11 skrll
83 1.1 nonaka #define USB_ID(v, p) { USB_VENDOR_##v, USB_PRODUCT_##v##_##p }
84 1.1 nonaka static const struct usb_devno run_devs[] = {
85 1.1 nonaka USB_ID(ABOCOM, RT2770),
86 1.1 nonaka USB_ID(ABOCOM, RT2870),
87 1.1 nonaka USB_ID(ABOCOM, RT3070),
88 1.1 nonaka USB_ID(ABOCOM, RT3071),
89 1.1 nonaka USB_ID(ABOCOM, RT3072),
90 1.1 nonaka USB_ID(ABOCOM2, RT2870_1),
91 1.1 nonaka USB_ID(ACCTON, RT2770),
92 1.1 nonaka USB_ID(ACCTON, RT2870_1),
93 1.1 nonaka USB_ID(ACCTON, RT2870_2),
94 1.1 nonaka USB_ID(ACCTON, RT2870_3),
95 1.1 nonaka USB_ID(ACCTON, RT2870_4),
96 1.1 nonaka USB_ID(ACCTON, RT2870_5),
97 1.1 nonaka USB_ID(ACCTON, RT3070),
98 1.1 nonaka USB_ID(ACCTON, RT3070_1),
99 1.1 nonaka USB_ID(ACCTON, RT3070_2),
100 1.1 nonaka USB_ID(ACCTON, RT3070_3),
101 1.1 nonaka USB_ID(ACCTON, RT3070_4),
102 1.1 nonaka USB_ID(ACCTON, RT3070_5),
103 1.1 nonaka USB_ID(ACCTON, RT3070_6),
104 1.1 nonaka USB_ID(AIRTIES, RT3070),
105 1.1 nonaka USB_ID(AIRTIES, RT3070_2),
106 1.1 nonaka USB_ID(ALLWIN, RT2070),
107 1.1 nonaka USB_ID(ALLWIN, RT2770),
108 1.1 nonaka USB_ID(ALLWIN, RT2870),
109 1.1 nonaka USB_ID(ALLWIN, RT3070),
110 1.1 nonaka USB_ID(ALLWIN, RT3071),
111 1.1 nonaka USB_ID(ALLWIN, RT3072),
112 1.1 nonaka USB_ID(ALLWIN, RT3572),
113 1.1 nonaka USB_ID(AMIGO, RT2870_1),
114 1.1 nonaka USB_ID(AMIGO, RT2870_2),
115 1.1 nonaka USB_ID(AMIT, CGWLUSB2GNR),
116 1.1 nonaka USB_ID(AMIT, RT2870_1),
117 1.1 nonaka USB_ID(AMIT2, RT2870),
118 1.1 nonaka USB_ID(ASUSTEK, RT2870_1),
119 1.1 nonaka USB_ID(ASUSTEK, RT2870_2),
120 1.1 nonaka USB_ID(ASUSTEK, RT2870_3),
121 1.1 nonaka USB_ID(ASUSTEK, RT2870_4),
122 1.1 nonaka USB_ID(ASUSTEK, RT2870_5),
123 1.1 nonaka USB_ID(ASUSTEK, RT3070),
124 1.1 nonaka USB_ID(ASUSTEK, RT3070_1),
125 1.1 nonaka USB_ID(ASUSTEK2, USBN11),
126 1.1 nonaka USB_ID(AZUREWAVE, RT2870_1),
127 1.1 nonaka USB_ID(AZUREWAVE, RT2870_2),
128 1.1 nonaka USB_ID(AZUREWAVE, RT3070),
129 1.1 nonaka USB_ID(AZUREWAVE, RT3070_2),
130 1.1 nonaka USB_ID(AZUREWAVE, RT3070_3),
131 1.1 nonaka USB_ID(AZUREWAVE, RT3070_4),
132 1.1 nonaka USB_ID(AZUREWAVE, RT3070_5),
133 1.1 nonaka USB_ID(BELKIN, F5D8053V3),
134 1.1 nonaka USB_ID(BELKIN, F5D8055),
135 1.1 nonaka USB_ID(BELKIN, F5D8055V2),
136 1.1 nonaka USB_ID(BELKIN, F6D4050V1),
137 1.1 nonaka USB_ID(BELKIN, F6D4050V2),
138 1.1 nonaka USB_ID(BELKIN, F7D1101V2),
139 1.1 nonaka USB_ID(BELKIN, RT2870_1),
140 1.1 nonaka USB_ID(BELKIN, RT2870_2),
141 1.1 nonaka USB_ID(BEWAN, RT3070),
142 1.1 nonaka USB_ID(CISCOLINKSYS, AE1000),
143 1.1 nonaka USB_ID(CISCOLINKSYS, AM10),
144 1.1 nonaka USB_ID(CISCOLINKSYS2, RT3070),
145 1.1 nonaka USB_ID(CISCOLINKSYS3, RT3070),
146 1.1 nonaka USB_ID(CONCEPTRONIC, RT2870_1),
147 1.1 nonaka USB_ID(CONCEPTRONIC, RT2870_2),
148 1.1 nonaka USB_ID(CONCEPTRONIC, RT2870_3),
149 1.1 nonaka USB_ID(CONCEPTRONIC, RT2870_4),
150 1.1 nonaka USB_ID(CONCEPTRONIC, RT2870_5),
151 1.1 nonaka USB_ID(CONCEPTRONIC, RT2870_6),
152 1.1 nonaka USB_ID(CONCEPTRONIC, RT2870_7),
153 1.1 nonaka USB_ID(CONCEPTRONIC, RT2870_8),
154 1.1 nonaka USB_ID(CONCEPTRONIC, RT3070_1),
155 1.1 nonaka USB_ID(CONCEPTRONIC, RT3070_2),
156 1.1 nonaka USB_ID(CONCEPTRONIC, RT3070_3),
157 1.1 nonaka USB_ID(COREGA, CGWLUSB300GNM),
158 1.1 nonaka USB_ID(COREGA, RT2870_1),
159 1.1 nonaka USB_ID(COREGA, RT2870_2),
160 1.1 nonaka USB_ID(COREGA, RT2870_3),
161 1.1 nonaka USB_ID(COREGA, RT3070),
162 1.1 nonaka USB_ID(CYBERTAN, RT2870),
163 1.1 nonaka USB_ID(DLINK, RT2870),
164 1.1 nonaka USB_ID(DLINK, RT3072),
165 1.1 nonaka USB_ID(DLINK2, DWA130),
166 1.1 nonaka USB_ID(DLINK2, RT2870_1),
167 1.1 nonaka USB_ID(DLINK2, RT2870_2),
168 1.1 nonaka USB_ID(DLINK2, RT3070_1),
169 1.1 nonaka USB_ID(DLINK2, RT3070_2),
170 1.1 nonaka USB_ID(DLINK2, RT3070_3),
171 1.1 nonaka USB_ID(DLINK2, RT3070_4),
172 1.1 nonaka USB_ID(DLINK2, RT3070_5),
173 1.1 nonaka USB_ID(DLINK2, RT3072),
174 1.1 nonaka USB_ID(DLINK2, RT3072_1),
175 1.1 nonaka USB_ID(DVICO, RT3070),
176 1.1 nonaka USB_ID(EDIMAX, EW7717),
177 1.1 nonaka USB_ID(EDIMAX, EW7718),
178 1.1 nonaka USB_ID(EDIMAX, EW7722UTN),
179 1.1 nonaka USB_ID(EDIMAX, RT2870_1),
180 1.1 nonaka USB_ID(ENCORE, RT3070),
181 1.1 nonaka USB_ID(ENCORE, RT3070_2),
182 1.1 nonaka USB_ID(ENCORE, RT3070_3),
183 1.1 nonaka USB_ID(GIGABYTE, GNWB31N),
184 1.1 nonaka USB_ID(GIGABYTE, GNWB32L),
185 1.1 nonaka USB_ID(GIGABYTE, RT2870_1),
186 1.1 nonaka USB_ID(GIGASET, RT3070_1),
187 1.1 nonaka USB_ID(GIGASET, RT3070_2),
188 1.1 nonaka USB_ID(GUILLEMOT, HWNU300),
189 1.1 nonaka USB_ID(HAWKING, HWUN2),
190 1.1 nonaka USB_ID(HAWKING, RT2870_1),
191 1.1 nonaka USB_ID(HAWKING, RT2870_2),
192 1.1 nonaka USB_ID(HAWKING, RT2870_3),
193 1.1 nonaka USB_ID(HAWKING, RT2870_4),
194 1.1 nonaka USB_ID(HAWKING, RT2870_5),
195 1.1 nonaka USB_ID(HAWKING, RT3070),
196 1.1 nonaka USB_ID(IODATA, RT3072_1),
197 1.1 nonaka USB_ID(IODATA, RT3072_2),
198 1.1 nonaka USB_ID(IODATA, RT3072_3),
199 1.1 nonaka USB_ID(IODATA, RT3072_4),
200 1.1 nonaka USB_ID(LINKSYS4, RT3070),
201 1.1 nonaka USB_ID(LINKSYS4, WUSB100),
202 1.1 nonaka USB_ID(LINKSYS4, WUSB54GC_3),
203 1.1 nonaka USB_ID(LINKSYS4, WUSB600N),
204 1.1 nonaka USB_ID(LINKSYS4, WUSB600NV2),
205 1.1 nonaka USB_ID(LOGITEC, LANW300NU2),
206 1.1 nonaka USB_ID(LOGITEC, RT2870_1),
207 1.1 nonaka USB_ID(LOGITEC, RT2870_2),
208 1.1 nonaka USB_ID(LOGITEC, RT2870_3),
209 1.1 nonaka USB_ID(LOGITEC, RT3020),
210 1.1 nonaka USB_ID(MELCO, RT2870_1),
211 1.1 nonaka USB_ID(MELCO, RT2870_2),
212 1.1 nonaka USB_ID(MELCO, WLIUCAG300N),
213 1.1 nonaka USB_ID(MELCO, WLIUCG300N),
214 1.1 nonaka USB_ID(MELCO, WLIUCG301N),
215 1.1 nonaka USB_ID(MELCO, WLIUCGN),
216 1.1 nonaka USB_ID(MELCO, WLIUCGNHP),
217 1.1 nonaka USB_ID(MELCO, WLIUCGNM),
218 1.1 nonaka USB_ID(MELCO, WLIUCGNM2T),
219 1.1 nonaka USB_ID(MOTOROLA4, RT2770),
220 1.1 nonaka USB_ID(MOTOROLA4, RT3070),
221 1.1 nonaka USB_ID(MSI, RT3070),
222 1.1 nonaka USB_ID(MSI, RT3070_2),
223 1.1 nonaka USB_ID(MSI, RT3070_3),
224 1.1 nonaka USB_ID(MSI, RT3070_4),
225 1.1 nonaka USB_ID(MSI, RT3070_5),
226 1.1 nonaka USB_ID(MSI, RT3070_6),
227 1.1 nonaka USB_ID(MSI, RT3070_7),
228 1.1 nonaka USB_ID(MSI, RT3070_8),
229 1.1 nonaka USB_ID(MSI, RT3070_9),
230 1.1 nonaka USB_ID(MSI, RT3070_10),
231 1.1 nonaka USB_ID(MSI, RT3070_11),
232 1.1 nonaka USB_ID(MSI, RT3070_12),
233 1.1 nonaka USB_ID(MSI, RT3070_13),
234 1.1 nonaka USB_ID(MSI, RT3070_14),
235 1.1 nonaka USB_ID(MSI, RT3070_15),
236 1.1 nonaka USB_ID(OVISLINK, RT3071),
237 1.1 nonaka USB_ID(OVISLINK, RT3072),
238 1.1 nonaka USB_ID(PARA, RT3070),
239 1.1 nonaka USB_ID(PEGATRON, RT2870),
240 1.1 nonaka USB_ID(PEGATRON, RT3070),
241 1.1 nonaka USB_ID(PEGATRON, RT3070_2),
242 1.1 nonaka USB_ID(PEGATRON, RT3070_3),
243 1.1 nonaka USB_ID(PEGATRON, RT3072),
244 1.1 nonaka USB_ID(PHILIPS, RT2870),
245 1.1 nonaka USB_ID(PLANEX2, GWUS300MINIS),
246 1.1 nonaka USB_ID(PLANEX2, GWUSMICRO300),
247 1.1 nonaka USB_ID(PLANEX2, GWUSMICRON),
248 1.1 nonaka USB_ID(PLANEX2, GWUS300MINIX),
249 1.1 nonaka USB_ID(PLANEX2, RT3070),
250 1.1 nonaka USB_ID(QCOM, RT2870),
251 1.1 nonaka USB_ID(QUANTA, RT3070),
252 1.1 nonaka USB_ID(RALINK, RT2070),
253 1.1 nonaka USB_ID(RALINK, RT2770),
254 1.1 nonaka USB_ID(RALINK, RT2870),
255 1.1 nonaka USB_ID(RALINK, RT3070),
256 1.1 nonaka USB_ID(RALINK, RT3071),
257 1.1 nonaka USB_ID(RALINK, RT3072),
258 1.1 nonaka USB_ID(RALINK, RT3370),
259 1.1 nonaka USB_ID(RALINK, RT3572),
260 1.10.6.11 skrll USB_ID(RALINK, RT5572),
261 1.1 nonaka USB_ID(RALINK, RT8070),
262 1.1 nonaka USB_ID(SAMSUNG, RT2870_1),
263 1.1 nonaka USB_ID(SENAO, RT2870_1),
264 1.1 nonaka USB_ID(SENAO, RT2870_2),
265 1.1 nonaka USB_ID(SENAO, RT2870_3),
266 1.1 nonaka USB_ID(SENAO, RT2870_4),
267 1.1 nonaka USB_ID(SENAO, RT3070),
268 1.1 nonaka USB_ID(SENAO, RT3071),
269 1.1 nonaka USB_ID(SENAO, RT3072),
270 1.1 nonaka USB_ID(SENAO, RT3072_2),
271 1.1 nonaka USB_ID(SENAO, RT3072_3),
272 1.1 nonaka USB_ID(SENAO, RT3072_4),
273 1.1 nonaka USB_ID(SENAO, RT3072_5),
274 1.1 nonaka USB_ID(SITECOMEU, RT2870_1),
275 1.1 nonaka USB_ID(SITECOMEU, RT2870_2),
276 1.1 nonaka USB_ID(SITECOMEU, RT2870_3),
277 1.1 nonaka USB_ID(SITECOMEU, RT3070_1),
278 1.1 nonaka USB_ID(SITECOMEU, RT3072_3),
279 1.1 nonaka USB_ID(SITECOMEU, RT3072_4),
280 1.1 nonaka USB_ID(SITECOMEU, RT3072_5),
281 1.1 nonaka USB_ID(SITECOMEU, WL302),
282 1.1 nonaka USB_ID(SITECOMEU, WL315),
283 1.1 nonaka USB_ID(SITECOMEU, WL321),
284 1.1 nonaka USB_ID(SITECOMEU, WL324),
285 1.1 nonaka USB_ID(SITECOMEU, WL329),
286 1.1 nonaka USB_ID(SITECOMEU, WL343),
287 1.1 nonaka USB_ID(SITECOMEU, WL344),
288 1.1 nonaka USB_ID(SITECOMEU, WL345),
289 1.1 nonaka USB_ID(SITECOMEU, WL349V4),
290 1.1 nonaka USB_ID(SITECOMEU, WL608),
291 1.1 nonaka USB_ID(SITECOMEU, WLA4000),
292 1.1 nonaka USB_ID(SITECOMEU, WLA5000),
293 1.1 nonaka USB_ID(SPARKLAN, RT2870_1),
294 1.1 nonaka USB_ID(SPARKLAN, RT2870_2),
295 1.1 nonaka USB_ID(SPARKLAN, RT3070),
296 1.1 nonaka USB_ID(SWEEX2, LW153),
297 1.1 nonaka USB_ID(SWEEX2, LW303),
298 1.1 nonaka USB_ID(SWEEX2, LW313),
299 1.1 nonaka USB_ID(TOSHIBA, RT3070),
300 1.1 nonaka USB_ID(UMEDIA, RT2870_1),
301 1.1 nonaka USB_ID(UMEDIA, TEW645UB),
302 1.1 nonaka USB_ID(ZCOM, RT2870_1),
303 1.1 nonaka USB_ID(ZCOM, RT2870_2),
304 1.1 nonaka USB_ID(ZINWELL, RT2870_1),
305 1.1 nonaka USB_ID(ZINWELL, RT2870_2),
306 1.1 nonaka USB_ID(ZINWELL, RT3070),
307 1.1 nonaka USB_ID(ZINWELL, RT3072),
308 1.1 nonaka USB_ID(ZINWELL, RT3072_2),
309 1.1 nonaka USB_ID(ZYXEL, NWD2105),
310 1.1 nonaka USB_ID(ZYXEL, NWD211AN),
311 1.1 nonaka USB_ID(ZYXEL, RT2870_1),
312 1.1 nonaka USB_ID(ZYXEL, RT2870_2),
313 1.1 nonaka USB_ID(ZYXEL, RT3070),
314 1.1 nonaka };
315 1.1 nonaka
316 1.1 nonaka static int run_match(device_t, cfdata_t, void *);
317 1.1 nonaka static void run_attach(device_t, device_t, void *);
318 1.1 nonaka static int run_detach(device_t, int);
319 1.1 nonaka static int run_activate(device_t, enum devact);
320 1.1 nonaka
321 1.1 nonaka CFATTACH_DECL_NEW(run, sizeof(struct run_softc),
322 1.1 nonaka run_match, run_attach, run_detach, run_activate);
323 1.1 nonaka
324 1.1 nonaka static int run_alloc_rx_ring(struct run_softc *);
325 1.1 nonaka static void run_free_rx_ring(struct run_softc *);
326 1.1 nonaka static int run_alloc_tx_ring(struct run_softc *, int);
327 1.1 nonaka static void run_free_tx_ring(struct run_softc *, int);
328 1.1 nonaka static int run_load_microcode(struct run_softc *);
329 1.1 nonaka static int run_reset(struct run_softc *);
330 1.1 nonaka static int run_read(struct run_softc *, uint16_t, uint32_t *);
331 1.1 nonaka static int run_read_region_1(struct run_softc *, uint16_t,
332 1.1 nonaka uint8_t *, int);
333 1.1 nonaka static int run_write_2(struct run_softc *, uint16_t, uint16_t);
334 1.1 nonaka static int run_write(struct run_softc *, uint16_t, uint32_t);
335 1.1 nonaka static int run_write_region_1(struct run_softc *, uint16_t,
336 1.1 nonaka const uint8_t *, int);
337 1.1 nonaka static int run_set_region_4(struct run_softc *, uint16_t,
338 1.1 nonaka uint32_t, int);
339 1.10.6.11 skrll static int run_efuse_read(struct run_softc *, uint16_t,
340 1.10.6.11 skrll uint16_t *, int);
341 1.1 nonaka static int run_efuse_read_2(struct run_softc *, uint16_t,
342 1.1 nonaka uint16_t *);
343 1.1 nonaka static int run_eeprom_read_2(struct run_softc *, uint16_t,
344 1.1 nonaka uint16_t *);
345 1.1 nonaka static int run_rt2870_rf_write(struct run_softc *, uint8_t,
346 1.1 nonaka uint32_t);
347 1.1 nonaka static int run_rt3070_rf_read(struct run_softc *, uint8_t,
348 1.1 nonaka uint8_t *);
349 1.1 nonaka static int run_rt3070_rf_write(struct run_softc *, uint8_t,
350 1.1 nonaka uint8_t);
351 1.1 nonaka static int run_bbp_read(struct run_softc *, uint8_t, uint8_t *);
352 1.1 nonaka static int run_bbp_write(struct run_softc *, uint8_t, uint8_t);
353 1.1 nonaka static int run_mcu_cmd(struct run_softc *, uint8_t, uint16_t);
354 1.1 nonaka static const char * run_get_rf(int);
355 1.10.6.11 skrll static void run_rt3593_get_txpower(struct run_softc *);
356 1.10.6.11 skrll static void run_get_txpower(struct run_softc *);
357 1.1 nonaka static int run_read_eeprom(struct run_softc *);
358 1.1 nonaka static struct ieee80211_node *
359 1.1 nonaka run_node_alloc(struct ieee80211_node_table *);
360 1.1 nonaka static int run_media_change(struct ifnet *);
361 1.1 nonaka static void run_next_scan(void *);
362 1.1 nonaka static void run_task(void *);
363 1.1 nonaka static void run_do_async(struct run_softc *,
364 1.1 nonaka void (*)(struct run_softc *, void *), void *, int);
365 1.1 nonaka static int run_newstate(struct ieee80211com *,
366 1.1 nonaka enum ieee80211_state, int);
367 1.1 nonaka static void run_newstate_cb(struct run_softc *, void *);
368 1.1 nonaka static int run_updateedca(struct ieee80211com *);
369 1.1 nonaka static void run_updateedca_cb(struct run_softc *, void *);
370 1.1 nonaka #ifdef RUN_HWCRYPTO
371 1.1 nonaka static int run_set_key(struct ieee80211com *,
372 1.1 nonaka const struct ieee80211_key *, const uint8_t *);
373 1.1 nonaka static void run_set_key_cb(struct run_softc *, void *);
374 1.1 nonaka static int run_delete_key(struct ieee80211com *,
375 1.1 nonaka const struct ieee80211_key *);
376 1.1 nonaka static void run_delete_key_cb(struct run_softc *, void *);
377 1.1 nonaka #endif
378 1.1 nonaka static void run_calibrate_to(void *);
379 1.1 nonaka static void run_calibrate_cb(struct run_softc *, void *);
380 1.1 nonaka static void run_newassoc(struct ieee80211_node *, int);
381 1.1 nonaka static void run_rx_frame(struct run_softc *, uint8_t *, int);
382 1.10.6.3 skrll static void run_rxeof(struct usbd_xfer *, void *,
383 1.1 nonaka usbd_status);
384 1.10.6.3 skrll static void run_txeof(struct usbd_xfer *, void *,
385 1.1 nonaka usbd_status);
386 1.1 nonaka static int run_tx(struct run_softc *, struct mbuf *,
387 1.1 nonaka struct ieee80211_node *);
388 1.1 nonaka static void run_start(struct ifnet *);
389 1.1 nonaka static void run_watchdog(struct ifnet *);
390 1.1 nonaka static int run_ioctl(struct ifnet *, u_long, void *);
391 1.1 nonaka static void run_select_chan_group(struct run_softc *, int);
392 1.10.6.11 skrll static void run_iq_calib(struct run_softc *, u_int);
393 1.1 nonaka static void run_set_agc(struct run_softc *, uint8_t);
394 1.1 nonaka static void run_set_rx_antenna(struct run_softc *, int);
395 1.1 nonaka static void run_rt2870_set_chan(struct run_softc *, u_int);
396 1.1 nonaka static void run_rt3070_set_chan(struct run_softc *, u_int);
397 1.1 nonaka static void run_rt3572_set_chan(struct run_softc *, u_int);
398 1.10.6.11 skrll static void run_rt3593_set_chan(struct run_softc *, u_int);
399 1.10.6.11 skrll static void run_rt5390_set_chan(struct run_softc *, u_int);
400 1.10.6.11 skrll static void run_rt5592_set_chan(struct run_softc *, u_int);
401 1.1 nonaka static int run_set_chan(struct run_softc *,
402 1.1 nonaka struct ieee80211_channel *);
403 1.10.6.11 skrll static void run_updateprot(struct run_softc *);
404 1.1 nonaka static void run_enable_tsf_sync(struct run_softc *);
405 1.1 nonaka static void run_enable_mrr(struct run_softc *);
406 1.1 nonaka static void run_set_txpreamble(struct run_softc *);
407 1.1 nonaka static void run_set_basicrates(struct run_softc *);
408 1.1 nonaka static void run_set_leds(struct run_softc *, uint16_t);
409 1.1 nonaka static void run_set_bssid(struct run_softc *, const uint8_t *);
410 1.1 nonaka static void run_set_macaddr(struct run_softc *, const uint8_t *);
411 1.1 nonaka static void run_updateslot(struct ifnet *);
412 1.1 nonaka static void run_updateslot_cb(struct run_softc *, void *);
413 1.1 nonaka static int8_t run_rssi2dbm(struct run_softc *, uint8_t, uint8_t);
414 1.10.6.11 skrll static void run_rt5390_bbp_init(struct run_softc *);
415 1.1 nonaka static int run_bbp_init(struct run_softc *);
416 1.1 nonaka static int run_rt3070_rf_init(struct run_softc *);
417 1.10.6.11 skrll static int run_rt3593_rf_init(struct run_softc *);
418 1.10.6.11 skrll static int run_rt5390_rf_init(struct run_softc *);
419 1.1 nonaka static int run_rt3070_filter_calib(struct run_softc *, uint8_t,
420 1.1 nonaka uint8_t, uint8_t *);
421 1.1 nonaka static void run_rt3070_rf_setup(struct run_softc *);
422 1.10.6.11 skrll static void run_rt3593_rf_setup(struct run_softc *);
423 1.10.6.11 skrll static void run_rt5390_rf_setup(struct run_softc *);
424 1.1 nonaka static int run_txrx_enable(struct run_softc *);
425 1.10.6.11 skrll static int run_adjust_freq_offset(struct run_softc *);
426 1.1 nonaka static int run_init(struct ifnet *);
427 1.1 nonaka static void run_stop(struct ifnet *, int);
428 1.1 nonaka #ifndef IEEE80211_STA_ONLY
429 1.1 nonaka static int run_setup_beacon(struct run_softc *);
430 1.1 nonaka #endif
431 1.1 nonaka
432 1.1 nonaka static const struct {
433 1.1 nonaka uint32_t reg;
434 1.1 nonaka uint32_t val;
435 1.1 nonaka } rt2870_def_mac[] = {
436 1.1 nonaka RT2870_DEF_MAC
437 1.1 nonaka };
438 1.1 nonaka
439 1.1 nonaka static const struct {
440 1.1 nonaka uint8_t reg;
441 1.1 nonaka uint8_t val;
442 1.1 nonaka } rt2860_def_bbp[] = {
443 1.1 nonaka RT2860_DEF_BBP
444 1.10.6.11 skrll }, rt5390_def_bbp[] = {
445 1.10.6.11 skrll RT5390_DEF_BBP
446 1.10.6.11 skrll }, rt5592_def_bbp[] = {
447 1.10.6.11 skrll RT5592_DEF_BBP
448 1.10.6.11 skrll };
449 1.10.6.11 skrll
450 1.10.6.11 skrll /*
451 1.10.6.11 skrll * Default values for BBP register R196 for RT5592.
452 1.10.6.11 skrll */
453 1.10.6.11 skrll static const uint8_t rt5592_bbp_r196[] = {
454 1.10.6.11 skrll 0xe0, 0x1f, 0x38, 0x32, 0x08, 0x28, 0x19, 0x0a, 0xff, 0x00,
455 1.10.6.11 skrll 0x16, 0x10, 0x10, 0x0b, 0x36, 0x2c, 0x26, 0x24, 0x42, 0x36,
456 1.10.6.11 skrll 0x30, 0x2d, 0x4c, 0x46, 0x3d, 0x40, 0x3e, 0x42, 0x3d, 0x40,
457 1.10.6.11 skrll 0x3c, 0x34, 0x2c, 0x2f, 0x3c, 0x35, 0x2e, 0x2a, 0x49, 0x41,
458 1.10.6.11 skrll 0x36, 0x31, 0x30, 0x30, 0x0e, 0x0d, 0x28, 0x21, 0x1c, 0x16,
459 1.10.6.11 skrll 0x50, 0x4a, 0x43, 0x40, 0x10, 0x10, 0x10, 0x10, 0x00, 0x00,
460 1.10.6.11 skrll 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
461 1.10.6.11 skrll 0x00, 0x00, 0x7d, 0x14, 0x32, 0x2c, 0x36, 0x4c, 0x43, 0x2c,
462 1.10.6.11 skrll 0x2e, 0x36, 0x30, 0x6e
463 1.1 nonaka };
464 1.1 nonaka
465 1.1 nonaka static const struct rfprog {
466 1.1 nonaka uint8_t chan;
467 1.1 nonaka uint32_t r1, r2, r3, r4;
468 1.1 nonaka } rt2860_rf2850[] = {
469 1.1 nonaka RT2860_RF2850
470 1.1 nonaka };
471 1.1 nonaka
472 1.1 nonaka static const struct {
473 1.1 nonaka uint8_t n, r, k;
474 1.1 nonaka } rt3070_freqs[] = {
475 1.1 nonaka RT3070_RF3052
476 1.1 nonaka };
477 1.1 nonaka
478 1.10.6.11 skrll static const struct rt5592_freqs {
479 1.10.6.11 skrll uint16_t n;
480 1.10.6.11 skrll uint8_t k, m, r;
481 1.10.6.11 skrll } rt5592_freqs_20mhz[] = {
482 1.10.6.11 skrll RT5592_RF5592_20MHZ
483 1.10.6.11 skrll },rt5592_freqs_40mhz[] = {
484 1.10.6.11 skrll RT5592_RF5592_40MHZ
485 1.10.6.11 skrll };
486 1.10.6.11 skrll
487 1.1 nonaka static const struct {
488 1.1 nonaka uint8_t reg;
489 1.1 nonaka uint8_t val;
490 1.1 nonaka } rt3070_def_rf[] = {
491 1.1 nonaka RT3070_DEF_RF
492 1.1 nonaka }, rt3572_def_rf[] = {
493 1.1 nonaka RT3572_DEF_RF
494 1.10.6.11 skrll },rt3593_def_rf[] = {
495 1.10.6.11 skrll RT3593_DEF_RF
496 1.10.6.11 skrll },rt5390_def_rf[] = {
497 1.10.6.11 skrll RT5390_DEF_RF
498 1.10.6.11 skrll },rt5392_def_rf[] = {
499 1.10.6.11 skrll RT5392_DEF_RF
500 1.10.6.11 skrll },rt5592_def_rf[] = {
501 1.10.6.11 skrll RT5592_DEF_RF
502 1.10.6.11 skrll },rt5592_2ghz_def_rf[] = {
503 1.10.6.11 skrll RT5592_2GHZ_DEF_RF
504 1.10.6.11 skrll },rt5592_5ghz_def_rf[] = {
505 1.10.6.11 skrll RT5592_5GHZ_DEF_RF
506 1.10.6.11 skrll };
507 1.10.6.11 skrll
508 1.10.6.11 skrll static const struct {
509 1.10.6.11 skrll u_int firstchan;
510 1.10.6.11 skrll u_int lastchan;
511 1.10.6.11 skrll uint8_t reg;
512 1.10.6.11 skrll uint8_t val;
513 1.10.6.11 skrll } rt5592_chan_5ghz[] = {
514 1.10.6.11 skrll RT5592_CHAN_5GHZ
515 1.1 nonaka };
516 1.1 nonaka
517 1.1 nonaka static int
518 1.1 nonaka firmware_load(const char *dname, const char *iname, uint8_t **ucodep,
519 1.1 nonaka size_t *sizep)
520 1.1 nonaka {
521 1.1 nonaka firmware_handle_t fh;
522 1.1 nonaka int error;
523 1.1 nonaka
524 1.1 nonaka if ((error = firmware_open(dname, iname, &fh)) != 0)
525 1.10.6.2 skrll return error;
526 1.1 nonaka *sizep = firmware_get_size(fh);
527 1.1 nonaka if ((*ucodep = firmware_malloc(*sizep)) == NULL) {
528 1.1 nonaka firmware_close(fh);
529 1.10.6.2 skrll return ENOMEM;
530 1.1 nonaka }
531 1.1 nonaka if ((error = firmware_read(fh, 0, *ucodep, *sizep)) != 0)
532 1.1 nonaka firmware_free(*ucodep, *sizep);
533 1.1 nonaka firmware_close(fh);
534 1.1 nonaka
535 1.10.6.2 skrll return error;
536 1.1 nonaka }
537 1.1 nonaka
538 1.1 nonaka static int
539 1.1 nonaka run_match(device_t parent, cfdata_t match, void *aux)
540 1.1 nonaka {
541 1.1 nonaka struct usb_attach_arg *uaa = aux;
542 1.1 nonaka
543 1.10.6.4 skrll return (usb_lookup(run_devs, uaa->uaa_vendor, uaa->uaa_product) != NULL) ?
544 1.1 nonaka UMATCH_VENDOR_PRODUCT : UMATCH_NONE;
545 1.1 nonaka }
546 1.1 nonaka
547 1.1 nonaka static void
548 1.1 nonaka run_attach(device_t parent, device_t self, void *aux)
549 1.1 nonaka {
550 1.1 nonaka struct run_softc *sc = device_private(self);
551 1.1 nonaka struct usb_attach_arg *uaa = aux;
552 1.1 nonaka struct ieee80211com *ic = &sc->sc_ic;
553 1.1 nonaka struct ifnet *ifp = &sc->sc_if;
554 1.1 nonaka usb_interface_descriptor_t *id;
555 1.1 nonaka usb_endpoint_descriptor_t *ed;
556 1.1 nonaka char *devinfop;
557 1.1 nonaka int i, nrx, ntx, ntries, error;
558 1.1 nonaka uint32_t ver;
559 1.1 nonaka
560 1.1 nonaka aprint_naive("\n");
561 1.1 nonaka aprint_normal("\n");
562 1.1 nonaka
563 1.1 nonaka sc->sc_dev = self;
564 1.10.6.4 skrll sc->sc_udev = uaa->uaa_device;
565 1.1 nonaka
566 1.1 nonaka devinfop = usbd_devinfo_alloc(sc->sc_udev, 0);
567 1.1 nonaka aprint_normal_dev(sc->sc_dev, "%s\n", devinfop);
568 1.1 nonaka usbd_devinfo_free(devinfop);
569 1.1 nonaka
570 1.5 skrll error = usbd_set_config_no(sc->sc_udev, 1, 0);
571 1.5 skrll if (error != 0) {
572 1.5 skrll aprint_error_dev(sc->sc_dev, "failed to set configuration"
573 1.5 skrll ", err=%s\n", usbd_errstr(error));
574 1.1 nonaka return;
575 1.1 nonaka }
576 1.1 nonaka
577 1.1 nonaka /* get the first interface handle */
578 1.1 nonaka error = usbd_device2interface_handle(sc->sc_udev, 0, &sc->sc_iface);
579 1.1 nonaka if (error != 0) {
580 1.1 nonaka aprint_error_dev(sc->sc_dev,
581 1.1 nonaka "could not get interface handle\n");
582 1.1 nonaka return;
583 1.1 nonaka }
584 1.1 nonaka
585 1.1 nonaka /*
586 1.1 nonaka * Find all bulk endpoints. There are 7 bulk endpoints: 1 for RX
587 1.1 nonaka * and 6 for TX (4 EDCAs + HCCA + Prio).
588 1.1 nonaka * Update 03-14-2009: some devices like the Planex GW-US300MiniS
589 1.1 nonaka * seem to have only 4 TX bulk endpoints (Fukaumi Naoki).
590 1.1 nonaka */
591 1.1 nonaka nrx = ntx = 0;
592 1.1 nonaka id = usbd_get_interface_descriptor(sc->sc_iface);
593 1.1 nonaka for (i = 0; i < id->bNumEndpoints; i++) {
594 1.1 nonaka ed = usbd_interface2endpoint_descriptor(sc->sc_iface, i);
595 1.1 nonaka if (ed == NULL || UE_GET_XFERTYPE(ed->bmAttributes) != UE_BULK)
596 1.1 nonaka continue;
597 1.1 nonaka
598 1.1 nonaka if (UE_GET_DIR(ed->bEndpointAddress) == UE_DIR_IN) {
599 1.1 nonaka sc->rxq.pipe_no = ed->bEndpointAddress;
600 1.1 nonaka nrx++;
601 1.1 nonaka } else if (ntx < 4) {
602 1.1 nonaka sc->txq[ntx].pipe_no = ed->bEndpointAddress;
603 1.1 nonaka ntx++;
604 1.1 nonaka }
605 1.1 nonaka }
606 1.1 nonaka /* make sure we've got them all */
607 1.1 nonaka if (nrx < 1 || ntx < 4) {
608 1.1 nonaka aprint_error_dev(sc->sc_dev, "missing endpoint\n");
609 1.1 nonaka return;
610 1.1 nonaka }
611 1.1 nonaka
612 1.8 jmcneill usb_init_task(&sc->sc_task, run_task, sc, 0);
613 1.1 nonaka callout_init(&sc->scan_to, 0);
614 1.1 nonaka callout_setfunc(&sc->scan_to, run_next_scan, sc);
615 1.1 nonaka callout_init(&sc->calib_to, 0);
616 1.1 nonaka callout_setfunc(&sc->calib_to, run_calibrate_to, sc);
617 1.1 nonaka
618 1.1 nonaka sc->amrr.amrr_min_success_threshold = 1;
619 1.1 nonaka sc->amrr.amrr_max_success_threshold = 10;
620 1.1 nonaka
621 1.1 nonaka /* wait for the chip to settle */
622 1.1 nonaka for (ntries = 0; ntries < 100; ntries++) {
623 1.1 nonaka if (run_read(sc, RT2860_ASIC_VER_ID, &ver) != 0)
624 1.1 nonaka return;
625 1.1 nonaka if (ver != 0 && ver != 0xffffffff)
626 1.1 nonaka break;
627 1.1 nonaka DELAY(10);
628 1.1 nonaka }
629 1.1 nonaka if (ntries == 100) {
630 1.1 nonaka aprint_error_dev(sc->sc_dev,
631 1.1 nonaka "timeout waiting for NIC to initialize\n");
632 1.1 nonaka return;
633 1.1 nonaka }
634 1.1 nonaka sc->mac_ver = ver >> 16;
635 1.1 nonaka sc->mac_rev = ver & 0xffff;
636 1.1 nonaka
637 1.1 nonaka /* retrieve RF rev. no and various other things from EEPROM */
638 1.1 nonaka run_read_eeprom(sc);
639 1.1 nonaka
640 1.1 nonaka aprint_error_dev(sc->sc_dev,
641 1.1 nonaka "MAC/BBP RT%04X (rev 0x%04X), RF %s (MIMO %dT%dR), address %s\n",
642 1.1 nonaka sc->mac_ver, sc->mac_rev, run_get_rf(sc->rf_rev), sc->ntxchains,
643 1.1 nonaka sc->nrxchains, ether_sprintf(ic->ic_myaddr));
644 1.1 nonaka
645 1.1 nonaka ic->ic_ifp = ifp;
646 1.1 nonaka ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */
647 1.1 nonaka ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */
648 1.1 nonaka ic->ic_state = IEEE80211_S_INIT;
649 1.1 nonaka
650 1.1 nonaka /* set device capabilities */
651 1.1 nonaka ic->ic_caps =
652 1.1 nonaka IEEE80211_C_MONITOR | /* monitor mode supported */
653 1.1 nonaka #ifndef IEEE80211_STA_ONLY
654 1.1 nonaka IEEE80211_C_IBSS | /* IBSS mode supported */
655 1.1 nonaka IEEE80211_C_HOSTAP | /* HostAP mode supported */
656 1.1 nonaka #endif
657 1.1 nonaka IEEE80211_C_SHPREAMBLE | /* short preamble supported */
658 1.1 nonaka IEEE80211_C_SHSLOT | /* short slot time supported */
659 1.1 nonaka #ifdef RUN_HWCRYPTO
660 1.1 nonaka IEEE80211_C_WEP | /* WEP */
661 1.1 nonaka IEEE80211_C_TKIP | /* TKIP */
662 1.1 nonaka IEEE80211_C_AES_CCM | /* AES CCMP */
663 1.1 nonaka IEEE80211_C_TKIPMIC | /* TKIPMIC */
664 1.1 nonaka #endif
665 1.1 nonaka IEEE80211_C_WME | /* WME */
666 1.1 nonaka IEEE80211_C_WPA; /* WPA/RSN */
667 1.1 nonaka
668 1.1 nonaka if (sc->rf_rev == RT2860_RF_2750 ||
669 1.1 nonaka sc->rf_rev == RT2860_RF_2850 ||
670 1.10.6.11 skrll sc->rf_rev == RT3070_RF_3052 ||
671 1.10.6.11 skrll sc->rf_rev == RT3070_RF_3053 ||
672 1.10.6.11 skrll sc->rf_rev == RT5592_RF_5592) {
673 1.1 nonaka /* set supported .11a rates */
674 1.1 nonaka ic->ic_sup_rates[IEEE80211_MODE_11A] =
675 1.1 nonaka ieee80211_std_rateset_11a;
676 1.1 nonaka
677 1.1 nonaka /* set supported .11a channels */
678 1.1 nonaka for (i = 14; i < (int)__arraycount(rt2860_rf2850); i++) {
679 1.1 nonaka uint8_t chan = rt2860_rf2850[i].chan;
680 1.1 nonaka ic->ic_channels[chan].ic_freq =
681 1.1 nonaka ieee80211_ieee2mhz(chan, IEEE80211_CHAN_5GHZ);
682 1.1 nonaka ic->ic_channels[chan].ic_flags = IEEE80211_CHAN_A;
683 1.1 nonaka }
684 1.1 nonaka }
685 1.1 nonaka
686 1.1 nonaka /* set supported .11b and .11g rates */
687 1.1 nonaka ic->ic_sup_rates[IEEE80211_MODE_11B] = ieee80211_std_rateset_11b;
688 1.1 nonaka ic->ic_sup_rates[IEEE80211_MODE_11G] = ieee80211_std_rateset_11g;
689 1.1 nonaka
690 1.1 nonaka /* set supported .11b and .11g channels (1 through 14) */
691 1.1 nonaka for (i = 1; i <= 14; i++) {
692 1.1 nonaka ic->ic_channels[i].ic_freq =
693 1.1 nonaka ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ);
694 1.1 nonaka ic->ic_channels[i].ic_flags =
695 1.1 nonaka IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM |
696 1.1 nonaka IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ;
697 1.1 nonaka }
698 1.1 nonaka
699 1.1 nonaka ifp->if_softc = sc;
700 1.1 nonaka ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
701 1.1 nonaka ifp->if_init = run_init;
702 1.1 nonaka ifp->if_ioctl = run_ioctl;
703 1.1 nonaka ifp->if_start = run_start;
704 1.1 nonaka ifp->if_watchdog = run_watchdog;
705 1.1 nonaka IFQ_SET_READY(&ifp->if_snd);
706 1.1 nonaka memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
707 1.1 nonaka
708 1.1 nonaka if_attach(ifp);
709 1.1 nonaka ieee80211_ifattach(ic);
710 1.1 nonaka ic->ic_node_alloc = run_node_alloc;
711 1.1 nonaka ic->ic_newassoc = run_newassoc;
712 1.1 nonaka ic->ic_updateslot = run_updateslot;
713 1.1 nonaka ic->ic_wme.wme_update = run_updateedca;
714 1.1 nonaka #ifdef RUN_HWCRYPTO
715 1.1 nonaka ic->ic_crypto.cs_key_set = run_set_key;
716 1.1 nonaka ic->ic_crypto.cs_key_delete = run_delete_key;
717 1.1 nonaka #endif
718 1.1 nonaka /* override state transition machine */
719 1.1 nonaka sc->sc_newstate = ic->ic_newstate;
720 1.1 nonaka ic->ic_newstate = run_newstate;
721 1.1 nonaka ieee80211_media_init(ic, run_media_change, ieee80211_media_status);
722 1.1 nonaka
723 1.1 nonaka bpf_attach2(ifp, DLT_IEEE802_11_RADIO,
724 1.1 nonaka sizeof(struct ieee80211_frame) + IEEE80211_RADIOTAP_HDRLEN,
725 1.1 nonaka &sc->sc_drvbpf);
726 1.1 nonaka
727 1.1 nonaka sc->sc_rxtap_len = sizeof(sc->sc_rxtapu);
728 1.1 nonaka sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len);
729 1.1 nonaka sc->sc_rxtap.wr_ihdr.it_present = htole32(RUN_RX_RADIOTAP_PRESENT);
730 1.1 nonaka
731 1.1 nonaka sc->sc_txtap_len = sizeof(sc->sc_txtapu);
732 1.1 nonaka sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len);
733 1.1 nonaka sc->sc_txtap.wt_ihdr.it_present = htole32(RUN_TX_RADIOTAP_PRESENT);
734 1.1 nonaka
735 1.1 nonaka ieee80211_announce(ic);
736 1.1 nonaka
737 1.1 nonaka usbd_add_drv_event(USB_EVENT_DRIVER_ATTACH, sc->sc_udev, sc->sc_dev);
738 1.10.6.5 skrll
739 1.10.6.5 skrll if (!pmf_device_register(self, NULL, NULL))
740 1.10.6.5 skrll aprint_error_dev(self, "couldn't establish power handler\n");
741 1.1 nonaka }
742 1.1 nonaka
743 1.1 nonaka static int
744 1.1 nonaka run_detach(device_t self, int flags)
745 1.1 nonaka {
746 1.1 nonaka struct run_softc *sc = device_private(self);
747 1.1 nonaka struct ifnet *ifp = &sc->sc_if;
748 1.1 nonaka struct ieee80211com *ic = &sc->sc_ic;
749 1.1 nonaka int s;
750 1.1 nonaka
751 1.1 nonaka if (ifp->if_softc == NULL)
752 1.10.6.2 skrll return 0;
753 1.1 nonaka
754 1.10.6.5 skrll pmf_device_deregister(self);
755 1.10.6.5 skrll
756 1.10.6.11 skrll s = splusb();
757 1.1 nonaka
758 1.1 nonaka sc->sc_flags |= RUN_DETACHING;
759 1.1 nonaka
760 1.1 nonaka if (ifp->if_flags & IFF_RUNNING) {
761 1.1 nonaka usb_rem_task(sc->sc_udev, &sc->sc_task);
762 1.1 nonaka run_stop(ifp, 0);
763 1.1 nonaka }
764 1.1 nonaka
765 1.1 nonaka ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
766 1.1 nonaka bpf_detach(ifp);
767 1.1 nonaka ieee80211_ifdetach(ic);
768 1.1 nonaka if_detach(ifp);
769 1.1 nonaka
770 1.1 nonaka splx(s);
771 1.1 nonaka
772 1.1 nonaka usbd_add_drv_event(USB_EVENT_DRIVER_DETACH, sc->sc_udev, sc->sc_dev);
773 1.1 nonaka
774 1.10.6.11 skrll callout_stop(&sc->scan_to);
775 1.10.6.11 skrll callout_stop(&sc->calib_to);
776 1.10.6.11 skrll
777 1.1 nonaka callout_destroy(&sc->scan_to);
778 1.1 nonaka callout_destroy(&sc->calib_to);
779 1.1 nonaka
780 1.10.6.2 skrll return 0;
781 1.1 nonaka }
782 1.1 nonaka
783 1.1 nonaka static int
784 1.1 nonaka run_activate(device_t self, enum devact act)
785 1.1 nonaka {
786 1.1 nonaka struct run_softc *sc = device_private(self);
787 1.1 nonaka
788 1.1 nonaka switch (act) {
789 1.1 nonaka case DVACT_DEACTIVATE:
790 1.1 nonaka if_deactivate(sc->sc_ic.ic_ifp);
791 1.10.6.2 skrll return 0;
792 1.1 nonaka default:
793 1.10.6.2 skrll return EOPNOTSUPP;
794 1.1 nonaka }
795 1.1 nonaka }
796 1.1 nonaka
797 1.1 nonaka static int
798 1.1 nonaka run_alloc_rx_ring(struct run_softc *sc)
799 1.1 nonaka {
800 1.1 nonaka struct run_rx_ring *rxq = &sc->rxq;
801 1.1 nonaka int i, error;
802 1.1 nonaka
803 1.1 nonaka error = usbd_open_pipe(sc->sc_iface, rxq->pipe_no, 0, &rxq->pipeh);
804 1.1 nonaka if (error != 0)
805 1.1 nonaka goto fail;
806 1.1 nonaka
807 1.1 nonaka for (i = 0; i < RUN_RX_RING_COUNT; i++) {
808 1.1 nonaka struct run_rx_data *data = &rxq->data[i];
809 1.1 nonaka
810 1.1 nonaka data->sc = sc; /* backpointer for callbacks */
811 1.1 nonaka
812 1.10.6.7 skrll error = usbd_create_xfer(sc->rxq.pipeh, RUN_MAX_RXSZ,
813 1.10.6.7 skrll USBD_SHORT_XFER_OK, 0, &data->xfer);
814 1.10.6.7 skrll if (error)
815 1.1 nonaka goto fail;
816 1.10.6.7 skrll
817 1.10.6.7 skrll data->buf = usbd_get_buffer(data->xfer);
818 1.1 nonaka }
819 1.1 nonaka if (error != 0)
820 1.1 nonaka fail: run_free_rx_ring(sc);
821 1.10.6.2 skrll return error;
822 1.1 nonaka }
823 1.1 nonaka
824 1.1 nonaka static void
825 1.1 nonaka run_free_rx_ring(struct run_softc *sc)
826 1.1 nonaka {
827 1.1 nonaka struct run_rx_ring *rxq = &sc->rxq;
828 1.1 nonaka int i;
829 1.1 nonaka
830 1.1 nonaka if (rxq->pipeh != NULL) {
831 1.1 nonaka usbd_abort_pipe(rxq->pipeh);
832 1.1 nonaka }
833 1.1 nonaka for (i = 0; i < RUN_RX_RING_COUNT; i++) {
834 1.1 nonaka if (rxq->data[i].xfer != NULL)
835 1.10.6.7 skrll usbd_destroy_xfer(rxq->data[i].xfer);
836 1.1 nonaka rxq->data[i].xfer = NULL;
837 1.1 nonaka }
838 1.10.6.8 skrll if (rxq->pipeh != NULL) {
839 1.10.6.8 skrll usbd_close_pipe(rxq->pipeh);
840 1.10.6.8 skrll rxq->pipeh = NULL;
841 1.10.6.8 skrll }
842 1.1 nonaka }
843 1.1 nonaka
844 1.1 nonaka static int
845 1.1 nonaka run_alloc_tx_ring(struct run_softc *sc, int qid)
846 1.1 nonaka {
847 1.1 nonaka struct run_tx_ring *txq = &sc->txq[qid];
848 1.1 nonaka int i, error;
849 1.1 nonaka
850 1.1 nonaka txq->cur = txq->queued = 0;
851 1.1 nonaka
852 1.1 nonaka error = usbd_open_pipe(sc->sc_iface, txq->pipe_no, 0, &txq->pipeh);
853 1.1 nonaka if (error != 0)
854 1.1 nonaka goto fail;
855 1.1 nonaka
856 1.1 nonaka for (i = 0; i < RUN_TX_RING_COUNT; i++) {
857 1.1 nonaka struct run_tx_data *data = &txq->data[i];
858 1.1 nonaka
859 1.1 nonaka data->sc = sc; /* backpointer for callbacks */
860 1.1 nonaka data->qid = qid;
861 1.1 nonaka
862 1.10.6.7 skrll error = usbd_create_xfer(txq->pipeh, RUN_MAX_TXSZ,
863 1.10.6.7 skrll USBD_FORCE_SHORT_XFER, 0, &data->xfer);
864 1.10.6.7 skrll if (error)
865 1.1 nonaka goto fail;
866 1.10.6.7 skrll
867 1.10.6.7 skrll data->buf = usbd_get_buffer(data->xfer);
868 1.1 nonaka /* zeroize the TXD + TXWI part */
869 1.10.6.6 skrll memset(data->buf, 0, sizeof(struct rt2870_txd) +
870 1.10.6.6 skrll sizeof(struct rt2860_txwi));
871 1.1 nonaka }
872 1.1 nonaka if (error != 0)
873 1.1 nonaka fail: run_free_tx_ring(sc, qid);
874 1.10.6.2 skrll return error;
875 1.1 nonaka }
876 1.1 nonaka
877 1.1 nonaka static void
878 1.1 nonaka run_free_tx_ring(struct run_softc *sc, int qid)
879 1.1 nonaka {
880 1.1 nonaka struct run_tx_ring *txq = &sc->txq[qid];
881 1.1 nonaka int i;
882 1.1 nonaka
883 1.1 nonaka if (txq->pipeh != NULL) {
884 1.1 nonaka usbd_abort_pipe(txq->pipeh);
885 1.1 nonaka usbd_close_pipe(txq->pipeh);
886 1.1 nonaka txq->pipeh = NULL;
887 1.1 nonaka }
888 1.1 nonaka for (i = 0; i < RUN_TX_RING_COUNT; i++) {
889 1.1 nonaka if (txq->data[i].xfer != NULL)
890 1.10.6.7 skrll usbd_destroy_xfer(txq->data[i].xfer);
891 1.1 nonaka txq->data[i].xfer = NULL;
892 1.1 nonaka }
893 1.1 nonaka }
894 1.1 nonaka
895 1.1 nonaka static int
896 1.1 nonaka run_load_microcode(struct run_softc *sc)
897 1.1 nonaka {
898 1.1 nonaka usb_device_request_t req;
899 1.1 nonaka const char *fwname;
900 1.10 martin u_char *ucode = NULL; /* XXX gcc 4.8.3: maybe-uninitialized */
901 1.10 martin size_t size = 0; /* XXX gcc 4.8.3: maybe-uninitialized */
902 1.1 nonaka uint32_t tmp;
903 1.1 nonaka int ntries, error;
904 1.1 nonaka
905 1.1 nonaka /* RT3071/RT3072 use a different firmware */
906 1.1 nonaka if (sc->mac_ver != 0x2860 &&
907 1.1 nonaka sc->mac_ver != 0x2872 &&
908 1.1 nonaka sc->mac_ver != 0x3070)
909 1.1 nonaka fwname = "run-rt3071";
910 1.1 nonaka else
911 1.1 nonaka fwname = "run-rt2870";
912 1.1 nonaka
913 1.3 nonaka if ((error = firmware_load("run", fwname, &ucode, &size)) != 0) {
914 1.1 nonaka aprint_error_dev(sc->sc_dev,
915 1.1 nonaka "error %d, could not read firmware %s\n", error, fwname);
916 1.10.6.2 skrll return error;
917 1.1 nonaka }
918 1.1 nonaka if (size != 4096) {
919 1.1 nonaka aprint_error_dev(sc->sc_dev,
920 1.1 nonaka "invalid firmware size (should be 4KB)\n");
921 1.1 nonaka firmware_free(ucode, size);
922 1.10.6.2 skrll return EINVAL;
923 1.1 nonaka }
924 1.1 nonaka
925 1.1 nonaka run_read(sc, RT2860_ASIC_VER_ID, &tmp);
926 1.1 nonaka /* write microcode image */
927 1.1 nonaka run_write_region_1(sc, RT2870_FW_BASE, ucode, size);
928 1.1 nonaka firmware_free(ucode, size);
929 1.1 nonaka run_write(sc, RT2860_H2M_MAILBOX_CID, 0xffffffff);
930 1.1 nonaka run_write(sc, RT2860_H2M_MAILBOX_STATUS, 0xffffffff);
931 1.1 nonaka
932 1.1 nonaka req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
933 1.1 nonaka req.bRequest = RT2870_RESET;
934 1.1 nonaka USETW(req.wValue, 8);
935 1.1 nonaka USETW(req.wIndex, 0);
936 1.1 nonaka USETW(req.wLength, 0);
937 1.1 nonaka if ((error = usbd_do_request(sc->sc_udev, &req, NULL)) != 0)
938 1.10.6.2 skrll return error;
939 1.1 nonaka
940 1.1 nonaka usbd_delay_ms(sc->sc_udev, 10);
941 1.1 nonaka run_write(sc, RT2860_H2M_MAILBOX, 0);
942 1.1 nonaka if ((error = run_mcu_cmd(sc, RT2860_MCU_CMD_RFRESET, 0)) != 0)
943 1.10.6.2 skrll return error;
944 1.1 nonaka
945 1.1 nonaka /* wait until microcontroller is ready */
946 1.1 nonaka for (ntries = 0; ntries < 1000; ntries++) {
947 1.1 nonaka if ((error = run_read(sc, RT2860_SYS_CTRL, &tmp)) != 0)
948 1.10.6.2 skrll return error;
949 1.1 nonaka if (tmp & RT2860_MCU_READY)
950 1.1 nonaka break;
951 1.10.6.11 skrll usbd_delay_ms(sc->sc_udev, 10);
952 1.1 nonaka }
953 1.1 nonaka if (ntries == 1000) {
954 1.1 nonaka aprint_error_dev(sc->sc_dev,
955 1.1 nonaka "timeout waiting for MCU to initialize\n");
956 1.10.6.2 skrll return ETIMEDOUT;
957 1.1 nonaka }
958 1.1 nonaka
959 1.1 nonaka sc->sc_flags |= RUN_FWLOADED;
960 1.1 nonaka
961 1.1 nonaka DPRINTF(("microcode successfully loaded after %d tries\n", ntries));
962 1.10.6.2 skrll return 0;
963 1.1 nonaka }
964 1.1 nonaka
965 1.1 nonaka static int
966 1.1 nonaka run_reset(struct run_softc *sc)
967 1.1 nonaka {
968 1.1 nonaka usb_device_request_t req;
969 1.1 nonaka
970 1.1 nonaka req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
971 1.1 nonaka req.bRequest = RT2870_RESET;
972 1.1 nonaka USETW(req.wValue, 1);
973 1.1 nonaka USETW(req.wIndex, 0);
974 1.1 nonaka USETW(req.wLength, 0);
975 1.1 nonaka return usbd_do_request(sc->sc_udev, &req, NULL);
976 1.1 nonaka }
977 1.1 nonaka
978 1.1 nonaka static int
979 1.1 nonaka run_read(struct run_softc *sc, uint16_t reg, uint32_t *val)
980 1.1 nonaka {
981 1.1 nonaka uint32_t tmp;
982 1.1 nonaka int error;
983 1.1 nonaka
984 1.10.6.6 skrll error = run_read_region_1(sc, reg, (uint8_t *)&tmp, sizeof(tmp));
985 1.1 nonaka if (error == 0)
986 1.1 nonaka *val = le32toh(tmp);
987 1.1 nonaka else
988 1.1 nonaka *val = 0xffffffff;
989 1.10.6.2 skrll return error;
990 1.1 nonaka }
991 1.1 nonaka
992 1.1 nonaka static int
993 1.1 nonaka run_read_region_1(struct run_softc *sc, uint16_t reg, uint8_t *buf, int len)
994 1.1 nonaka {
995 1.1 nonaka usb_device_request_t req;
996 1.1 nonaka
997 1.1 nonaka req.bmRequestType = UT_READ_VENDOR_DEVICE;
998 1.1 nonaka req.bRequest = RT2870_READ_REGION_1;
999 1.1 nonaka USETW(req.wValue, 0);
1000 1.1 nonaka USETW(req.wIndex, reg);
1001 1.1 nonaka USETW(req.wLength, len);
1002 1.1 nonaka return usbd_do_request(sc->sc_udev, &req, buf);
1003 1.1 nonaka }
1004 1.1 nonaka
1005 1.1 nonaka static int
1006 1.1 nonaka run_write_2(struct run_softc *sc, uint16_t reg, uint16_t val)
1007 1.1 nonaka {
1008 1.1 nonaka usb_device_request_t req;
1009 1.1 nonaka
1010 1.1 nonaka req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1011 1.1 nonaka req.bRequest = RT2870_WRITE_2;
1012 1.1 nonaka USETW(req.wValue, val);
1013 1.1 nonaka USETW(req.wIndex, reg);
1014 1.1 nonaka USETW(req.wLength, 0);
1015 1.1 nonaka return usbd_do_request(sc->sc_udev, &req, NULL);
1016 1.1 nonaka }
1017 1.1 nonaka
1018 1.1 nonaka static int
1019 1.1 nonaka run_write(struct run_softc *sc, uint16_t reg, uint32_t val)
1020 1.1 nonaka {
1021 1.1 nonaka int error;
1022 1.1 nonaka
1023 1.1 nonaka if ((error = run_write_2(sc, reg, val & 0xffff)) == 0)
1024 1.1 nonaka error = run_write_2(sc, reg + 2, val >> 16);
1025 1.10.6.2 skrll return error;
1026 1.1 nonaka }
1027 1.1 nonaka
1028 1.1 nonaka static int
1029 1.1 nonaka run_write_region_1(struct run_softc *sc, uint16_t reg, const uint8_t *buf,
1030 1.1 nonaka int len)
1031 1.1 nonaka {
1032 1.1 nonaka #if 1
1033 1.1 nonaka int i, error = 0;
1034 1.1 nonaka /*
1035 1.1 nonaka * NB: the WRITE_REGION_1 command is not stable on RT2860.
1036 1.1 nonaka * We thus issue multiple WRITE_2 commands instead.
1037 1.1 nonaka */
1038 1.1 nonaka KASSERT((len & 1) == 0);
1039 1.1 nonaka for (i = 0; i < len && error == 0; i += 2)
1040 1.1 nonaka error = run_write_2(sc, reg + i, buf[i] | buf[i + 1] << 8);
1041 1.10.6.2 skrll return error;
1042 1.1 nonaka #else
1043 1.1 nonaka usb_device_request_t req;
1044 1.1 nonaka
1045 1.1 nonaka req.bmRequestType = UT_WRITE_VENDOR_DEVICE;
1046 1.1 nonaka req.bRequest = RT2870_WRITE_REGION_1;
1047 1.1 nonaka USETW(req.wValue, 0);
1048 1.1 nonaka USETW(req.wIndex, reg);
1049 1.1 nonaka USETW(req.wLength, len);
1050 1.1 nonaka return usbd_do_request(sc->sc_udev, &req, buf);
1051 1.1 nonaka #endif
1052 1.1 nonaka }
1053 1.1 nonaka
1054 1.1 nonaka static int
1055 1.1 nonaka run_set_region_4(struct run_softc *sc, uint16_t reg, uint32_t val, int count)
1056 1.1 nonaka {
1057 1.1 nonaka int error = 0;
1058 1.1 nonaka
1059 1.1 nonaka for (; count > 0 && error == 0; count--, reg += 4)
1060 1.1 nonaka error = run_write(sc, reg, val);
1061 1.10.6.2 skrll return error;
1062 1.1 nonaka }
1063 1.1 nonaka
1064 1.1 nonaka static int
1065 1.10.6.11 skrll run_efuse_read(struct run_softc *sc, uint16_t addr, uint16_t *val, int count)
1066 1.1 nonaka {
1067 1.1 nonaka uint32_t tmp;
1068 1.1 nonaka uint16_t reg;
1069 1.1 nonaka int error, ntries;
1070 1.1 nonaka
1071 1.1 nonaka if ((error = run_read(sc, RT3070_EFUSE_CTRL, &tmp)) != 0)
1072 1.10.6.2 skrll return error;
1073 1.1 nonaka
1074 1.10.6.11 skrll if (count == 2)
1075 1.10.6.11 skrll addr *= 2;
1076 1.1 nonaka /*-
1077 1.1 nonaka * Read one 16-byte block into registers EFUSE_DATA[0-3]:
1078 1.1 nonaka * DATA0: F E D C
1079 1.1 nonaka * DATA1: B A 9 8
1080 1.1 nonaka * DATA2: 7 6 5 4
1081 1.1 nonaka * DATA3: 3 2 1 0
1082 1.1 nonaka */
1083 1.1 nonaka tmp &= ~(RT3070_EFSROM_MODE_MASK | RT3070_EFSROM_AIN_MASK);
1084 1.1 nonaka tmp |= (addr & ~0xf) << RT3070_EFSROM_AIN_SHIFT | RT3070_EFSROM_KICK;
1085 1.1 nonaka run_write(sc, RT3070_EFUSE_CTRL, tmp);
1086 1.1 nonaka for (ntries = 0; ntries < 100; ntries++) {
1087 1.1 nonaka if ((error = run_read(sc, RT3070_EFUSE_CTRL, &tmp)) != 0)
1088 1.10.6.2 skrll return error;
1089 1.1 nonaka if (!(tmp & RT3070_EFSROM_KICK))
1090 1.1 nonaka break;
1091 1.10.6.11 skrll usbd_delay_ms(sc->sc_udev, 2);
1092 1.1 nonaka }
1093 1.1 nonaka if (ntries == 100)
1094 1.10.6.2 skrll return ETIMEDOUT;
1095 1.1 nonaka
1096 1.1 nonaka if ((tmp & RT3070_EFUSE_AOUT_MASK) == RT3070_EFUSE_AOUT_MASK) {
1097 1.1 nonaka *val = 0xffff; /* address not found */
1098 1.10.6.2 skrll return 0;
1099 1.1 nonaka }
1100 1.1 nonaka /* determine to which 32-bit register our 16-bit word belongs */
1101 1.1 nonaka reg = RT3070_EFUSE_DATA3 - (addr & 0xc);
1102 1.1 nonaka if ((error = run_read(sc, reg, &tmp)) != 0)
1103 1.10.6.2 skrll return error;
1104 1.1 nonaka
1105 1.10.6.11 skrll *val = (addr & 1) ? tmp >> 16 : tmp & 0xffff;
1106 1.10.6.2 skrll return 0;
1107 1.1 nonaka }
1108 1.1 nonaka
1109 1.10.6.11 skrll /* Read 16-bit from eFUSE ROM for RT3xxxx. */
1110 1.10.6.11 skrll static int
1111 1.10.6.11 skrll run_efuse_read_2(struct run_softc *sc, uint16_t addr, uint16_t *val)
1112 1.10.6.11 skrll {
1113 1.10.6.13 skrll return run_efuse_read(sc, addr, val, 2);
1114 1.10.6.11 skrll }
1115 1.10.6.11 skrll
1116 1.1 nonaka static int
1117 1.1 nonaka run_eeprom_read_2(struct run_softc *sc, uint16_t addr, uint16_t *val)
1118 1.1 nonaka {
1119 1.1 nonaka usb_device_request_t req;
1120 1.1 nonaka uint16_t tmp;
1121 1.1 nonaka int error;
1122 1.1 nonaka
1123 1.1 nonaka addr *= 2;
1124 1.1 nonaka req.bmRequestType = UT_READ_VENDOR_DEVICE;
1125 1.1 nonaka req.bRequest = RT2870_EEPROM_READ;
1126 1.1 nonaka USETW(req.wValue, 0);
1127 1.1 nonaka USETW(req.wIndex, addr);
1128 1.10.6.6 skrll USETW(req.wLength, sizeof(tmp));
1129 1.1 nonaka error = usbd_do_request(sc->sc_udev, &req, &tmp);
1130 1.1 nonaka if (error == 0)
1131 1.1 nonaka *val = le16toh(tmp);
1132 1.1 nonaka else
1133 1.1 nonaka *val = 0xffff;
1134 1.10.6.2 skrll return error;
1135 1.1 nonaka }
1136 1.1 nonaka
1137 1.1 nonaka static __inline int
1138 1.1 nonaka run_srom_read(struct run_softc *sc, uint16_t addr, uint16_t *val)
1139 1.1 nonaka {
1140 1.1 nonaka
1141 1.1 nonaka /* either eFUSE ROM or EEPROM */
1142 1.1 nonaka return sc->sc_srom_read(sc, addr, val);
1143 1.1 nonaka }
1144 1.1 nonaka
1145 1.1 nonaka static int
1146 1.1 nonaka run_rt2870_rf_write(struct run_softc *sc, uint8_t reg, uint32_t val)
1147 1.1 nonaka {
1148 1.1 nonaka uint32_t tmp;
1149 1.1 nonaka int error, ntries;
1150 1.1 nonaka
1151 1.1 nonaka for (ntries = 0; ntries < 10; ntries++) {
1152 1.1 nonaka if ((error = run_read(sc, RT2860_RF_CSR_CFG0, &tmp)) != 0)
1153 1.10.6.2 skrll return error;
1154 1.1 nonaka if (!(tmp & RT2860_RF_REG_CTRL))
1155 1.1 nonaka break;
1156 1.1 nonaka }
1157 1.1 nonaka if (ntries == 10)
1158 1.10.6.2 skrll return ETIMEDOUT;
1159 1.1 nonaka
1160 1.1 nonaka /* RF registers are 24-bit on the RT2860 */
1161 1.1 nonaka tmp = RT2860_RF_REG_CTRL | 24 << RT2860_RF_REG_WIDTH_SHIFT |
1162 1.1 nonaka (val & 0x3fffff) << 2 | (reg & 3);
1163 1.1 nonaka return run_write(sc, RT2860_RF_CSR_CFG0, tmp);
1164 1.1 nonaka }
1165 1.1 nonaka
1166 1.1 nonaka static int
1167 1.1 nonaka run_rt3070_rf_read(struct run_softc *sc, uint8_t reg, uint8_t *val)
1168 1.1 nonaka {
1169 1.1 nonaka uint32_t tmp;
1170 1.1 nonaka int error, ntries;
1171 1.1 nonaka
1172 1.1 nonaka for (ntries = 0; ntries < 100; ntries++) {
1173 1.1 nonaka if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0)
1174 1.10.6.2 skrll return error;
1175 1.1 nonaka if (!(tmp & RT3070_RF_KICK))
1176 1.1 nonaka break;
1177 1.1 nonaka }
1178 1.1 nonaka if (ntries == 100)
1179 1.10.6.2 skrll return ETIMEDOUT;
1180 1.1 nonaka
1181 1.1 nonaka tmp = RT3070_RF_KICK | reg << 8;
1182 1.1 nonaka if ((error = run_write(sc, RT3070_RF_CSR_CFG, tmp)) != 0)
1183 1.10.6.2 skrll return error;
1184 1.1 nonaka
1185 1.1 nonaka for (ntries = 0; ntries < 100; ntries++) {
1186 1.1 nonaka if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0)
1187 1.10.6.2 skrll return error;
1188 1.1 nonaka if (!(tmp & RT3070_RF_KICK))
1189 1.1 nonaka break;
1190 1.1 nonaka }
1191 1.1 nonaka if (ntries == 100)
1192 1.10.6.2 skrll return ETIMEDOUT;
1193 1.1 nonaka
1194 1.1 nonaka *val = tmp & 0xff;
1195 1.10.6.2 skrll return 0;
1196 1.1 nonaka }
1197 1.1 nonaka
1198 1.1 nonaka static int
1199 1.1 nonaka run_rt3070_rf_write(struct run_softc *sc, uint8_t reg, uint8_t val)
1200 1.1 nonaka {
1201 1.1 nonaka uint32_t tmp;
1202 1.1 nonaka int error, ntries;
1203 1.1 nonaka
1204 1.1 nonaka for (ntries = 0; ntries < 10; ntries++) {
1205 1.1 nonaka if ((error = run_read(sc, RT3070_RF_CSR_CFG, &tmp)) != 0)
1206 1.10.6.2 skrll return error;
1207 1.1 nonaka if (!(tmp & RT3070_RF_KICK))
1208 1.1 nonaka break;
1209 1.1 nonaka }
1210 1.1 nonaka if (ntries == 10)
1211 1.10.6.2 skrll return ETIMEDOUT;
1212 1.1 nonaka
1213 1.1 nonaka tmp = RT3070_RF_WRITE | RT3070_RF_KICK | reg << 8 | val;
1214 1.1 nonaka return run_write(sc, RT3070_RF_CSR_CFG, tmp);
1215 1.1 nonaka }
1216 1.1 nonaka
1217 1.1 nonaka static int
1218 1.1 nonaka run_bbp_read(struct run_softc *sc, uint8_t reg, uint8_t *val)
1219 1.1 nonaka {
1220 1.1 nonaka uint32_t tmp;
1221 1.1 nonaka int ntries, error;
1222 1.1 nonaka
1223 1.1 nonaka for (ntries = 0; ntries < 10; ntries++) {
1224 1.1 nonaka if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0)
1225 1.10.6.2 skrll return error;
1226 1.1 nonaka if (!(tmp & RT2860_BBP_CSR_KICK))
1227 1.1 nonaka break;
1228 1.1 nonaka }
1229 1.1 nonaka if (ntries == 10)
1230 1.10.6.2 skrll return ETIMEDOUT;
1231 1.1 nonaka
1232 1.1 nonaka tmp = RT2860_BBP_CSR_READ | RT2860_BBP_CSR_KICK | reg << 8;
1233 1.1 nonaka if ((error = run_write(sc, RT2860_BBP_CSR_CFG, tmp)) != 0)
1234 1.10.6.2 skrll return error;
1235 1.1 nonaka
1236 1.1 nonaka for (ntries = 0; ntries < 10; ntries++) {
1237 1.1 nonaka if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0)
1238 1.10.6.2 skrll return error;
1239 1.1 nonaka if (!(tmp & RT2860_BBP_CSR_KICK))
1240 1.1 nonaka break;
1241 1.1 nonaka }
1242 1.1 nonaka if (ntries == 10)
1243 1.10.6.2 skrll return ETIMEDOUT;
1244 1.1 nonaka
1245 1.1 nonaka *val = tmp & 0xff;
1246 1.10.6.2 skrll return 0;
1247 1.1 nonaka }
1248 1.1 nonaka
1249 1.1 nonaka static int
1250 1.1 nonaka run_bbp_write(struct run_softc *sc, uint8_t reg, uint8_t val)
1251 1.1 nonaka {
1252 1.1 nonaka uint32_t tmp;
1253 1.1 nonaka int ntries, error;
1254 1.1 nonaka
1255 1.1 nonaka for (ntries = 0; ntries < 10; ntries++) {
1256 1.1 nonaka if ((error = run_read(sc, RT2860_BBP_CSR_CFG, &tmp)) != 0)
1257 1.10.6.2 skrll return error;
1258 1.1 nonaka if (!(tmp & RT2860_BBP_CSR_KICK))
1259 1.1 nonaka break;
1260 1.1 nonaka }
1261 1.1 nonaka if (ntries == 10)
1262 1.10.6.2 skrll return ETIMEDOUT;
1263 1.1 nonaka
1264 1.1 nonaka tmp = RT2860_BBP_CSR_KICK | reg << 8 | val;
1265 1.1 nonaka return run_write(sc, RT2860_BBP_CSR_CFG, tmp);
1266 1.1 nonaka }
1267 1.1 nonaka
1268 1.1 nonaka /*
1269 1.1 nonaka * Send a command to the 8051 microcontroller unit.
1270 1.1 nonaka */
1271 1.1 nonaka static int
1272 1.1 nonaka run_mcu_cmd(struct run_softc *sc, uint8_t cmd, uint16_t arg)
1273 1.1 nonaka {
1274 1.1 nonaka uint32_t tmp;
1275 1.1 nonaka int error, ntries;
1276 1.1 nonaka
1277 1.1 nonaka for (ntries = 0; ntries < 100; ntries++) {
1278 1.1 nonaka if ((error = run_read(sc, RT2860_H2M_MAILBOX, &tmp)) != 0)
1279 1.10.6.2 skrll return error;
1280 1.1 nonaka if (!(tmp & RT2860_H2M_BUSY))
1281 1.1 nonaka break;
1282 1.1 nonaka }
1283 1.1 nonaka if (ntries == 100)
1284 1.10.6.2 skrll return ETIMEDOUT;
1285 1.1 nonaka
1286 1.1 nonaka tmp = RT2860_H2M_BUSY | RT2860_TOKEN_NO_INTR << 16 | arg;
1287 1.1 nonaka if ((error = run_write(sc, RT2860_H2M_MAILBOX, tmp)) == 0)
1288 1.1 nonaka error = run_write(sc, RT2860_HOST_CMD, cmd);
1289 1.10.6.2 skrll return error;
1290 1.1 nonaka }
1291 1.1 nonaka
1292 1.1 nonaka /*
1293 1.1 nonaka * Add `delta' (signed) to each 4-bit sub-word of a 32-bit word.
1294 1.1 nonaka * Used to adjust per-rate Tx power registers.
1295 1.1 nonaka */
1296 1.1 nonaka static __inline uint32_t
1297 1.1 nonaka b4inc(uint32_t b32, int8_t delta)
1298 1.1 nonaka {
1299 1.1 nonaka int8_t i, b4;
1300 1.1 nonaka
1301 1.1 nonaka for (i = 0; i < 8; i++) {
1302 1.1 nonaka b4 = b32 & 0xf;
1303 1.1 nonaka b4 += delta;
1304 1.1 nonaka if (b4 < 0)
1305 1.1 nonaka b4 = 0;
1306 1.1 nonaka else if (b4 > 0xf)
1307 1.1 nonaka b4 = 0xf;
1308 1.1 nonaka b32 = b32 >> 4 | b4 << 28;
1309 1.1 nonaka }
1310 1.10.6.2 skrll return b32;
1311 1.1 nonaka }
1312 1.1 nonaka
1313 1.1 nonaka static const char *
1314 1.1 nonaka run_get_rf(int rev)
1315 1.1 nonaka {
1316 1.1 nonaka switch (rev) {
1317 1.1 nonaka case RT2860_RF_2820: return "RT2820";
1318 1.1 nonaka case RT2860_RF_2850: return "RT2850";
1319 1.1 nonaka case RT2860_RF_2720: return "RT2720";
1320 1.1 nonaka case RT2860_RF_2750: return "RT2750";
1321 1.1 nonaka case RT3070_RF_3020: return "RT3020";
1322 1.1 nonaka case RT3070_RF_2020: return "RT2020";
1323 1.1 nonaka case RT3070_RF_3021: return "RT3021";
1324 1.1 nonaka case RT3070_RF_3022: return "RT3022";
1325 1.1 nonaka case RT3070_RF_3052: return "RT3052";
1326 1.10.6.11 skrll case RT3070_RF_3053: return "RT3053";
1327 1.10.6.11 skrll case RT5592_RF_5592: return "RT5592";
1328 1.10.6.11 skrll case RT5390_RF_5370: return "RT5370";
1329 1.10.6.11 skrll case RT5390_RF_5372: return "RT5372";
1330 1.1 nonaka }
1331 1.1 nonaka return "unknown";
1332 1.1 nonaka }
1333 1.1 nonaka
1334 1.10.6.11 skrll static void
1335 1.10.6.11 skrll run_rt3593_get_txpower(struct run_softc *sc)
1336 1.10.6.11 skrll {
1337 1.10.6.11 skrll uint16_t addr, val;
1338 1.10.6.11 skrll int i;
1339 1.10.6.11 skrll
1340 1.10.6.11 skrll /* Read power settings for 2GHz channels. */
1341 1.10.6.11 skrll for (i = 0; i < 14; i += 2) {
1342 1.10.6.11 skrll addr = (sc->ntxchains == 3) ? RT3593_EEPROM_PWR2GHZ_BASE1 :
1343 1.10.6.11 skrll RT2860_EEPROM_PWR2GHZ_BASE1;
1344 1.10.6.11 skrll run_srom_read(sc, addr + i / 2, &val);
1345 1.10.6.11 skrll sc->txpow1[i + 0] = (int8_t)(val & 0xff);
1346 1.10.6.11 skrll sc->txpow1[i + 1] = (int8_t)(val >> 8);
1347 1.10.6.11 skrll
1348 1.10.6.11 skrll addr = (sc->ntxchains == 3) ? RT3593_EEPROM_PWR2GHZ_BASE2 :
1349 1.10.6.11 skrll RT2860_EEPROM_PWR2GHZ_BASE2;
1350 1.10.6.11 skrll run_srom_read(sc, addr + i / 2, &val);
1351 1.10.6.11 skrll sc->txpow2[i + 0] = (int8_t)(val & 0xff);
1352 1.10.6.11 skrll sc->txpow2[i + 1] = (int8_t)(val >> 8);
1353 1.10.6.11 skrll
1354 1.10.6.11 skrll if (sc->ntxchains == 3) {
1355 1.10.6.11 skrll run_srom_read(sc, RT3593_EEPROM_PWR2GHZ_BASE3 + i / 2,
1356 1.10.6.11 skrll &val);
1357 1.10.6.11 skrll sc->txpow3[i + 0] = (int8_t)(val & 0xff);
1358 1.10.6.11 skrll sc->txpow3[i + 1] = (int8_t)(val >> 8);
1359 1.10.6.11 skrll }
1360 1.10.6.11 skrll }
1361 1.10.6.11 skrll /* Fix broken Tx power entries. */
1362 1.10.6.11 skrll for (i = 0; i < 14; i++) {
1363 1.10.6.11 skrll if (sc->txpow1[i] > 31)
1364 1.10.6.11 skrll sc->txpow1[i] = 5;
1365 1.10.6.11 skrll if (sc->txpow2[i] > 31)
1366 1.10.6.11 skrll sc->txpow2[i] = 5;
1367 1.10.6.11 skrll if (sc->ntxchains == 3) {
1368 1.10.6.11 skrll if (sc->txpow3[i] > 31)
1369 1.10.6.11 skrll sc->txpow3[i] = 5;
1370 1.10.6.11 skrll }
1371 1.10.6.11 skrll }
1372 1.10.6.11 skrll /* Read power settings for 5GHz channels. */
1373 1.10.6.11 skrll for (i = 0; i < 40; i += 2) {
1374 1.10.6.11 skrll run_srom_read(sc, RT3593_EEPROM_PWR5GHZ_BASE1 + i / 2, &val);
1375 1.10.6.11 skrll sc->txpow1[i + 14] = (int8_t)(val & 0xff);
1376 1.10.6.11 skrll sc->txpow1[i + 15] = (int8_t)(val >> 8);
1377 1.10.6.11 skrll
1378 1.10.6.11 skrll run_srom_read(sc, RT3593_EEPROM_PWR5GHZ_BASE2 + i / 2, &val);
1379 1.10.6.11 skrll sc->txpow2[i + 14] = (int8_t)(val & 0xff);
1380 1.10.6.11 skrll sc->txpow2[i + 15] = (int8_t)(val >> 8);
1381 1.10.6.11 skrll
1382 1.10.6.11 skrll if (sc->ntxchains == 3) {
1383 1.10.6.11 skrll run_srom_read(sc, RT3593_EEPROM_PWR5GHZ_BASE3 + i / 2,
1384 1.10.6.11 skrll &val);
1385 1.10.6.11 skrll sc->txpow3[i + 14] = (int8_t)(val & 0xff);
1386 1.10.6.11 skrll sc->txpow3[i + 15] = (int8_t)(val >> 8);
1387 1.10.6.11 skrll }
1388 1.10.6.11 skrll }
1389 1.10.6.11 skrll }
1390 1.10.6.11 skrll
1391 1.10.6.11 skrll static void
1392 1.10.6.11 skrll run_get_txpower(struct run_softc *sc)
1393 1.10.6.11 skrll {
1394 1.10.6.11 skrll uint16_t val;
1395 1.10.6.11 skrll int i;
1396 1.10.6.11 skrll
1397 1.10.6.11 skrll /* Read power settings for 2GHz channels. */
1398 1.10.6.11 skrll for (i = 0; i < 14; i += 2) {
1399 1.10.6.11 skrll run_srom_read(sc, RT2860_EEPROM_PWR2GHZ_BASE1 + i / 2, &val);
1400 1.10.6.11 skrll sc->txpow1[i + 0] = (int8_t)(val & 0xff);
1401 1.10.6.11 skrll sc->txpow1[i + 1] = (int8_t)(val >> 8);
1402 1.10.6.11 skrll
1403 1.10.6.11 skrll if (sc->mac_ver != 0x5390) {
1404 1.10.6.11 skrll run_srom_read(sc,
1405 1.10.6.11 skrll RT2860_EEPROM_PWR2GHZ_BASE2 + i / 2, &val);
1406 1.10.6.11 skrll sc->txpow2[i + 0] = (int8_t)(val & 0xff);
1407 1.10.6.11 skrll sc->txpow2[i + 1] = (int8_t)(val >> 8);
1408 1.10.6.11 skrll }
1409 1.10.6.11 skrll }
1410 1.10.6.11 skrll /* Fix broken Tx power entries. */
1411 1.10.6.11 skrll for (i = 0; i < 14; i++) {
1412 1.10.6.11 skrll if (sc->mac_ver >= 0x5390) {
1413 1.10.6.11 skrll if (sc->txpow1[i] < 0 || sc->txpow1[i] > 39)
1414 1.10.6.11 skrll sc->txpow1[i] = 5;
1415 1.10.6.11 skrll } else {
1416 1.10.6.11 skrll if (sc->txpow1[i] < 0 || sc->txpow1[i] > 31)
1417 1.10.6.11 skrll sc->txpow1[i] = 5;
1418 1.10.6.11 skrll }
1419 1.10.6.11 skrll if (sc->mac_ver > 0x5390) {
1420 1.10.6.11 skrll if (sc->txpow2[i] < 0 || sc->txpow2[i] > 39)
1421 1.10.6.11 skrll sc->txpow2[i] = 5;
1422 1.10.6.11 skrll } else if (sc->mac_ver < 0x5390) {
1423 1.10.6.11 skrll if (sc->txpow2[i] < 0 || sc->txpow2[i] > 31)
1424 1.10.6.11 skrll sc->txpow2[i] = 5;
1425 1.10.6.11 skrll }
1426 1.10.6.11 skrll DPRINTF(("chan %d: power1=%d, power2=%d\n",
1427 1.10.6.11 skrll rt2860_rf2850[i].chan, sc->txpow1[i], sc->txpow2[i]));
1428 1.10.6.11 skrll }
1429 1.10.6.11 skrll /* Read power settings for 5GHz channels. */
1430 1.10.6.11 skrll for (i = 0; i < 40; i += 2) {
1431 1.10.6.11 skrll run_srom_read(sc, RT2860_EEPROM_PWR5GHZ_BASE1 + i / 2, &val);
1432 1.10.6.11 skrll sc->txpow1[i + 14] = (int8_t)(val & 0xff);
1433 1.10.6.11 skrll sc->txpow1[i + 15] = (int8_t)(val >> 8);
1434 1.10.6.11 skrll
1435 1.10.6.11 skrll run_srom_read(sc, RT2860_EEPROM_PWR5GHZ_BASE2 + i / 2, &val);
1436 1.10.6.11 skrll sc->txpow2[i + 14] = (int8_t)(val & 0xff);
1437 1.10.6.11 skrll sc->txpow2[i + 15] = (int8_t)(val >> 8);
1438 1.10.6.11 skrll }
1439 1.10.6.11 skrll /* Fix broken Tx power entries. */
1440 1.10.6.11 skrll for (i = 0; i < 40; i++ ) {
1441 1.10.6.11 skrll if (sc->mac_ver != 0x5592) {
1442 1.10.6.11 skrll if (sc->txpow1[14 + i] < -7 || sc->txpow1[14 + i] > 15)
1443 1.10.6.11 skrll sc->txpow1[14 + i] = 5;
1444 1.10.6.11 skrll if (sc->txpow2[14 + i] < -7 || sc->txpow2[14 + i] > 15)
1445 1.10.6.11 skrll sc->txpow2[14 + i] = 5;
1446 1.10.6.11 skrll }
1447 1.10.6.11 skrll DPRINTF(("chan %d: power1=%d, power2=%d\n",
1448 1.10.6.11 skrll rt2860_rf2850[14 + i].chan, sc->txpow1[14 + i],
1449 1.10.6.11 skrll sc->txpow2[14 + i]));
1450 1.10.6.11 skrll }
1451 1.10.6.11 skrll }
1452 1.10.6.11 skrll
1453 1.1 nonaka static int
1454 1.1 nonaka run_read_eeprom(struct run_softc *sc)
1455 1.1 nonaka {
1456 1.1 nonaka struct ieee80211com *ic = &sc->sc_ic;
1457 1.1 nonaka int8_t delta_2ghz, delta_5ghz;
1458 1.1 nonaka uint32_t tmp;
1459 1.1 nonaka uint16_t val;
1460 1.1 nonaka int ridx, ant, i;
1461 1.1 nonaka
1462 1.1 nonaka /* check whether the ROM is eFUSE ROM or EEPROM */
1463 1.1 nonaka sc->sc_srom_read = run_eeprom_read_2;
1464 1.1 nonaka if (sc->mac_ver >= 0x3070) {
1465 1.1 nonaka run_read(sc, RT3070_EFUSE_CTRL, &tmp);
1466 1.1 nonaka DPRINTF(("EFUSE_CTRL=0x%08x\n", tmp));
1467 1.1 nonaka if (tmp & RT3070_SEL_EFUSE)
1468 1.1 nonaka sc->sc_srom_read = run_efuse_read_2;
1469 1.1 nonaka }
1470 1.1 nonaka
1471 1.1 nonaka /* read ROM version */
1472 1.1 nonaka run_srom_read(sc, RT2860_EEPROM_VERSION, &val);
1473 1.1 nonaka DPRINTF(("EEPROM rev=%d, FAE=%d\n", val & 0xff, val >> 8));
1474 1.1 nonaka
1475 1.1 nonaka /* read MAC address */
1476 1.1 nonaka run_srom_read(sc, RT2860_EEPROM_MAC01, &val);
1477 1.1 nonaka ic->ic_myaddr[0] = val & 0xff;
1478 1.1 nonaka ic->ic_myaddr[1] = val >> 8;
1479 1.1 nonaka run_srom_read(sc, RT2860_EEPROM_MAC23, &val);
1480 1.1 nonaka ic->ic_myaddr[2] = val & 0xff;
1481 1.1 nonaka ic->ic_myaddr[3] = val >> 8;
1482 1.1 nonaka run_srom_read(sc, RT2860_EEPROM_MAC45, &val);
1483 1.1 nonaka ic->ic_myaddr[4] = val & 0xff;
1484 1.1 nonaka ic->ic_myaddr[5] = val >> 8;
1485 1.1 nonaka
1486 1.1 nonaka /* read vendor BBP settings */
1487 1.1 nonaka for (i = 0; i < 10; i++) {
1488 1.1 nonaka run_srom_read(sc, RT2860_EEPROM_BBP_BASE + i, &val);
1489 1.1 nonaka sc->bbp[i].val = val & 0xff;
1490 1.1 nonaka sc->bbp[i].reg = val >> 8;
1491 1.1 nonaka DPRINTF(("BBP%d=0x%02x\n", sc->bbp[i].reg, sc->bbp[i].val));
1492 1.1 nonaka }
1493 1.10.6.11 skrll
1494 1.10.6.11 skrll /* read vendor RF settings */
1495 1.10.6.11 skrll for (i = 0; i < 8; i++) {
1496 1.10.6.11 skrll run_srom_read(sc, RT3071_EEPROM_RF_BASE + i, &val);
1497 1.10.6.11 skrll sc->rf[i].val = val & 0xff;
1498 1.10.6.11 skrll sc->rf[i].reg = val >> 8;
1499 1.10.6.11 skrll DPRINTF(("RF%d=0x%02x\n", sc->rf[i].reg,
1500 1.10.6.11 skrll sc->rf[i].val));
1501 1.1 nonaka }
1502 1.1 nonaka
1503 1.1 nonaka /* read RF frequency offset from EEPROM */
1504 1.1 nonaka run_srom_read(sc, RT2860_EEPROM_FREQ_LEDS, &val);
1505 1.1 nonaka sc->freq = ((val & 0xff) != 0xff) ? val & 0xff : 0;
1506 1.1 nonaka DPRINTF(("EEPROM freq offset %d\n", sc->freq & 0xff));
1507 1.1 nonaka
1508 1.1 nonaka if ((val >> 8) != 0xff) {
1509 1.1 nonaka /* read LEDs operating mode */
1510 1.1 nonaka sc->leds = val >> 8;
1511 1.1 nonaka run_srom_read(sc, RT2860_EEPROM_LED1, &sc->led[0]);
1512 1.1 nonaka run_srom_read(sc, RT2860_EEPROM_LED2, &sc->led[1]);
1513 1.1 nonaka run_srom_read(sc, RT2860_EEPROM_LED3, &sc->led[2]);
1514 1.1 nonaka } else {
1515 1.1 nonaka /* broken EEPROM, use default settings */
1516 1.1 nonaka sc->leds = 0x01;
1517 1.1 nonaka sc->led[0] = 0x5555;
1518 1.1 nonaka sc->led[1] = 0x2221;
1519 1.1 nonaka sc->led[2] = 0x5627; /* differs from RT2860 */
1520 1.1 nonaka }
1521 1.1 nonaka DPRINTF(("EEPROM LED mode=0x%02x, LEDs=0x%04x/0x%04x/0x%04x\n",
1522 1.1 nonaka sc->leds, sc->led[0], sc->led[1], sc->led[2]));
1523 1.1 nonaka
1524 1.1 nonaka /* read RF information */
1525 1.1 nonaka run_srom_read(sc, RT2860_EEPROM_ANTENNA, &val);
1526 1.1 nonaka if (val == 0xffff) {
1527 1.1 nonaka DPRINTF(("invalid EEPROM antenna info, using default\n"));
1528 1.1 nonaka if (sc->mac_ver == 0x3572) {
1529 1.1 nonaka /* default to RF3052 2T2R */
1530 1.1 nonaka sc->rf_rev = RT3070_RF_3052;
1531 1.1 nonaka sc->ntxchains = 2;
1532 1.1 nonaka sc->nrxchains = 2;
1533 1.1 nonaka } else if (sc->mac_ver >= 0x3070) {
1534 1.1 nonaka /* default to RF3020 1T1R */
1535 1.1 nonaka sc->rf_rev = RT3070_RF_3020;
1536 1.1 nonaka sc->ntxchains = 1;
1537 1.1 nonaka sc->nrxchains = 1;
1538 1.1 nonaka } else {
1539 1.1 nonaka /* default to RF2820 1T2R */
1540 1.1 nonaka sc->rf_rev = RT2860_RF_2820;
1541 1.1 nonaka sc->ntxchains = 1;
1542 1.1 nonaka sc->nrxchains = 2;
1543 1.1 nonaka }
1544 1.1 nonaka } else {
1545 1.1 nonaka sc->rf_rev = (val >> 8) & 0xf;
1546 1.1 nonaka sc->ntxchains = (val >> 4) & 0xf;
1547 1.1 nonaka sc->nrxchains = val & 0xf;
1548 1.1 nonaka }
1549 1.1 nonaka DPRINTF(("EEPROM RF rev=0x%02x chains=%dT%dR\n",
1550 1.1 nonaka sc->rf_rev, sc->ntxchains, sc->nrxchains));
1551 1.1 nonaka
1552 1.1 nonaka run_srom_read(sc, RT2860_EEPROM_CONFIG, &val);
1553 1.1 nonaka DPRINTF(("EEPROM CFG 0x%04x\n", val));
1554 1.1 nonaka /* check if driver should patch the DAC issue */
1555 1.1 nonaka if ((val >> 8) != 0xff)
1556 1.1 nonaka sc->patch_dac = (val >> 15) & 1;
1557 1.1 nonaka if ((val & 0xff) != 0xff) {
1558 1.1 nonaka sc->ext_5ghz_lna = (val >> 3) & 1;
1559 1.1 nonaka sc->ext_2ghz_lna = (val >> 2) & 1;
1560 1.1 nonaka /* check if RF supports automatic Tx access gain control */
1561 1.1 nonaka sc->calib_2ghz = sc->calib_5ghz = (val >> 1) & 1;
1562 1.1 nonaka /* check if we have a hardware radio switch */
1563 1.1 nonaka sc->rfswitch = val & 1;
1564 1.1 nonaka }
1565 1.1 nonaka
1566 1.10.6.11 skrll /* Read Tx power settings. */
1567 1.10.6.11 skrll if (sc->mac_ver == 0x3593)
1568 1.10.6.11 skrll run_rt3593_get_txpower(sc);
1569 1.10.6.11 skrll else
1570 1.10.6.11 skrll run_get_txpower(sc);
1571 1.1 nonaka
1572 1.1 nonaka /* read Tx power compensation for each Tx rate */
1573 1.1 nonaka run_srom_read(sc, RT2860_EEPROM_DELTAPWR, &val);
1574 1.1 nonaka delta_2ghz = delta_5ghz = 0;
1575 1.1 nonaka if ((val & 0xff) != 0xff && (val & 0x80)) {
1576 1.1 nonaka delta_2ghz = val & 0xf;
1577 1.1 nonaka if (!(val & 0x40)) /* negative number */
1578 1.1 nonaka delta_2ghz = -delta_2ghz;
1579 1.1 nonaka }
1580 1.1 nonaka val >>= 8;
1581 1.1 nonaka if ((val & 0xff) != 0xff && (val & 0x80)) {
1582 1.1 nonaka delta_5ghz = val & 0xf;
1583 1.1 nonaka if (!(val & 0x40)) /* negative number */
1584 1.1 nonaka delta_5ghz = -delta_5ghz;
1585 1.1 nonaka }
1586 1.1 nonaka DPRINTF(("power compensation=%d (2GHz), %d (5GHz)\n",
1587 1.1 nonaka delta_2ghz, delta_5ghz));
1588 1.1 nonaka
1589 1.1 nonaka for (ridx = 0; ridx < 5; ridx++) {
1590 1.1 nonaka uint32_t reg;
1591 1.1 nonaka
1592 1.1 nonaka run_srom_read(sc, RT2860_EEPROM_RPWR + ridx * 2, &val);
1593 1.1 nonaka reg = val;
1594 1.1 nonaka run_srom_read(sc, RT2860_EEPROM_RPWR + ridx * 2 + 1, &val);
1595 1.1 nonaka reg |= (uint32_t)val << 16;
1596 1.1 nonaka
1597 1.1 nonaka sc->txpow20mhz[ridx] = reg;
1598 1.1 nonaka sc->txpow40mhz_2ghz[ridx] = b4inc(reg, delta_2ghz);
1599 1.1 nonaka sc->txpow40mhz_5ghz[ridx] = b4inc(reg, delta_5ghz);
1600 1.1 nonaka
1601 1.1 nonaka DPRINTF(("ridx %d: power 20MHz=0x%08x, 40MHz/2GHz=0x%08x, "
1602 1.1 nonaka "40MHz/5GHz=0x%08x\n", ridx, sc->txpow20mhz[ridx],
1603 1.1 nonaka sc->txpow40mhz_2ghz[ridx], sc->txpow40mhz_5ghz[ridx]));
1604 1.1 nonaka }
1605 1.1 nonaka
1606 1.1 nonaka /* read RSSI offsets and LNA gains from EEPROM */
1607 1.1 nonaka run_srom_read(sc, RT2860_EEPROM_RSSI1_2GHZ, &val);
1608 1.1 nonaka sc->rssi_2ghz[0] = val & 0xff; /* Ant A */
1609 1.1 nonaka sc->rssi_2ghz[1] = val >> 8; /* Ant B */
1610 1.1 nonaka run_srom_read(sc, RT2860_EEPROM_RSSI2_2GHZ, &val);
1611 1.1 nonaka if (sc->mac_ver >= 0x3070) {
1612 1.10.6.11 skrll if (sc->mac_ver == 0x3593) {
1613 1.10.6.11 skrll sc->txmixgain_2ghz = 0;
1614 1.10.6.11 skrll sc->rssi_2ghz[2] = val & 0xff; /* Ant C */
1615 1.10.6.11 skrll } else {
1616 1.10.6.11 skrll /*
1617 1.10.6.11 skrll * On RT3070 chips (limited to 2 Rx chains), this ROM
1618 1.10.6.11 skrll * field contains the Tx mixer gain for the 2GHz band.
1619 1.10.6.11 skrll */
1620 1.10.6.11 skrll if ((val & 0xff) != 0xff)
1621 1.10.6.11 skrll sc->txmixgain_2ghz = val & 0x7;
1622 1.10.6.11 skrll }
1623 1.1 nonaka DPRINTF(("tx mixer gain=%u (2GHz)\n", sc->txmixgain_2ghz));
1624 1.1 nonaka } else {
1625 1.1 nonaka sc->rssi_2ghz[2] = val & 0xff; /* Ant C */
1626 1.1 nonaka }
1627 1.10.6.11 skrll if (sc->mac_ver == 0x3593)
1628 1.10.6.11 skrll run_srom_read(sc, RT3593_EEPROM_LNA_5GHZ, &val);
1629 1.1 nonaka sc->lna[2] = val >> 8; /* channel group 2 */
1630 1.1 nonaka
1631 1.10.6.11 skrll run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_RSSI1_5GHZ :
1632 1.10.6.11 skrll RT3593_EEPROM_RSSI2_5GHZ, &val);
1633 1.1 nonaka sc->rssi_5ghz[0] = val & 0xff; /* Ant A */
1634 1.1 nonaka sc->rssi_5ghz[1] = val >> 8; /* Ant B */
1635 1.10.6.11 skrll run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_RSSI2_5GHZ :
1636 1.10.6.11 skrll RT3593_EEPROM_RSSI2_5GHZ, &val);
1637 1.1 nonaka if (sc->mac_ver == 0x3572) {
1638 1.1 nonaka /*
1639 1.1 nonaka * On RT3572 chips (limited to 2 Rx chains), this ROM
1640 1.1 nonaka * field contains the Tx mixer gain for the 5GHz band.
1641 1.1 nonaka */
1642 1.1 nonaka if ((val & 0xff) != 0xff)
1643 1.1 nonaka sc->txmixgain_5ghz = val & 0x7;
1644 1.1 nonaka DPRINTF(("tx mixer gain=%u (5GHz)\n", sc->txmixgain_5ghz));
1645 1.1 nonaka } else {
1646 1.1 nonaka sc->rssi_5ghz[2] = val & 0xff; /* Ant C */
1647 1.1 nonaka }
1648 1.10.6.11 skrll if (sc->mac_ver == 0x3593) {
1649 1.10.6.11 skrll sc->txmixgain_5ghz = 0;
1650 1.10.6.11 skrll run_srom_read(sc, RT3593_EEPROM_LNA_5GHZ, &val);
1651 1.10.6.11 skrll }
1652 1.1 nonaka sc->lna[3] = val >> 8; /* channel group 3 */
1653 1.1 nonaka
1654 1.10.6.11 skrll run_srom_read(sc, (sc->mac_ver != 0x3593) ? RT2860_EEPROM_LNA :
1655 1.10.6.11 skrll RT3593_EEPROM_LNA, &val);
1656 1.1 nonaka sc->lna[0] = val & 0xff; /* channel group 0 */
1657 1.1 nonaka sc->lna[1] = val >> 8; /* channel group 1 */
1658 1.1 nonaka
1659 1.1 nonaka /* fix broken 5GHz LNA entries */
1660 1.1 nonaka if (sc->lna[2] == 0 || sc->lna[2] == 0xff) {
1661 1.1 nonaka DPRINTF(("invalid LNA for channel group %d\n", 2));
1662 1.1 nonaka sc->lna[2] = sc->lna[1];
1663 1.1 nonaka }
1664 1.1 nonaka if (sc->lna[3] == 0 || sc->lna[3] == 0xff) {
1665 1.1 nonaka DPRINTF(("invalid LNA for channel group %d\n", 3));
1666 1.1 nonaka sc->lna[3] = sc->lna[1];
1667 1.1 nonaka }
1668 1.1 nonaka
1669 1.1 nonaka /* fix broken RSSI offset entries */
1670 1.1 nonaka for (ant = 0; ant < 3; ant++) {
1671 1.1 nonaka if (sc->rssi_2ghz[ant] < -10 || sc->rssi_2ghz[ant] > 10) {
1672 1.1 nonaka DPRINTF(("invalid RSSI%d offset: %d (2GHz)\n",
1673 1.1 nonaka ant + 1, sc->rssi_2ghz[ant]));
1674 1.1 nonaka sc->rssi_2ghz[ant] = 0;
1675 1.1 nonaka }
1676 1.1 nonaka if (sc->rssi_5ghz[ant] < -10 || sc->rssi_5ghz[ant] > 10) {
1677 1.1 nonaka DPRINTF(("invalid RSSI%d offset: %d (5GHz)\n",
1678 1.1 nonaka ant + 1, sc->rssi_5ghz[ant]));
1679 1.1 nonaka sc->rssi_5ghz[ant] = 0;
1680 1.1 nonaka }
1681 1.1 nonaka }
1682 1.10.6.2 skrll return 0;
1683 1.1 nonaka }
1684 1.1 nonaka
1685 1.1 nonaka static struct ieee80211_node *
1686 1.1 nonaka run_node_alloc(struct ieee80211_node_table *nt)
1687 1.1 nonaka {
1688 1.1 nonaka struct run_node *rn =
1689 1.10.6.6 skrll malloc(sizeof(struct run_node), M_DEVBUF, M_NOWAIT | M_ZERO);
1690 1.10.6.2 skrll return rn ? &rn->ni : NULL;
1691 1.1 nonaka }
1692 1.1 nonaka
1693 1.1 nonaka static int
1694 1.1 nonaka run_media_change(struct ifnet *ifp)
1695 1.1 nonaka {
1696 1.1 nonaka struct run_softc *sc = ifp->if_softc;
1697 1.1 nonaka struct ieee80211com *ic = &sc->sc_ic;
1698 1.1 nonaka uint8_t rate, ridx;
1699 1.1 nonaka int error;
1700 1.1 nonaka
1701 1.1 nonaka error = ieee80211_media_change(ifp);
1702 1.1 nonaka if (error != ENETRESET)
1703 1.10.6.2 skrll return error;
1704 1.1 nonaka
1705 1.1 nonaka if (ic->ic_fixed_rate != IEEE80211_FIXED_RATE_NONE) {
1706 1.1 nonaka rate = ic->ic_sup_rates[ic->ic_curmode].
1707 1.1 nonaka rs_rates[ic->ic_fixed_rate] & IEEE80211_RATE_VAL;
1708 1.1 nonaka for (ridx = 0; ridx <= RT2860_RIDX_MAX; ridx++)
1709 1.1 nonaka if (rt2860_rates[ridx].rate == rate)
1710 1.1 nonaka break;
1711 1.1 nonaka sc->fixed_ridx = ridx;
1712 1.1 nonaka }
1713 1.1 nonaka
1714 1.1 nonaka if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == (IFF_UP | IFF_RUNNING))
1715 1.1 nonaka run_init(ifp);
1716 1.1 nonaka
1717 1.10.6.2 skrll return 0;
1718 1.1 nonaka }
1719 1.1 nonaka
1720 1.1 nonaka static void
1721 1.1 nonaka run_next_scan(void *arg)
1722 1.1 nonaka {
1723 1.1 nonaka struct run_softc *sc = arg;
1724 1.1 nonaka
1725 1.1 nonaka if (sc->sc_ic.ic_state == IEEE80211_S_SCAN)
1726 1.1 nonaka ieee80211_next_scan(&sc->sc_ic);
1727 1.1 nonaka }
1728 1.1 nonaka
1729 1.1 nonaka static void
1730 1.1 nonaka run_task(void *arg)
1731 1.1 nonaka {
1732 1.1 nonaka struct run_softc *sc = arg;
1733 1.1 nonaka struct run_host_cmd_ring *ring = &sc->cmdq;
1734 1.1 nonaka struct run_host_cmd *cmd;
1735 1.1 nonaka int s;
1736 1.1 nonaka
1737 1.1 nonaka /* process host commands */
1738 1.1 nonaka s = splusb();
1739 1.1 nonaka while (ring->next != ring->cur) {
1740 1.1 nonaka cmd = &ring->cmd[ring->next];
1741 1.1 nonaka splx(s);
1742 1.1 nonaka /* callback */
1743 1.1 nonaka cmd->cb(sc, cmd->data);
1744 1.1 nonaka s = splusb();
1745 1.1 nonaka ring->queued--;
1746 1.1 nonaka ring->next = (ring->next + 1) % RUN_HOST_CMD_RING_COUNT;
1747 1.1 nonaka }
1748 1.1 nonaka wakeup(ring);
1749 1.1 nonaka splx(s);
1750 1.1 nonaka }
1751 1.1 nonaka
1752 1.1 nonaka static void
1753 1.1 nonaka run_do_async(struct run_softc *sc, void (*cb)(struct run_softc *, void *),
1754 1.1 nonaka void *arg, int len)
1755 1.1 nonaka {
1756 1.1 nonaka struct run_host_cmd_ring *ring = &sc->cmdq;
1757 1.1 nonaka struct run_host_cmd *cmd;
1758 1.1 nonaka int s;
1759 1.1 nonaka
1760 1.1 nonaka if (sc->sc_flags & RUN_DETACHING)
1761 1.1 nonaka return;
1762 1.1 nonaka
1763 1.1 nonaka s = splusb();
1764 1.1 nonaka cmd = &ring->cmd[ring->cur];
1765 1.1 nonaka cmd->cb = cb;
1766 1.10.6.6 skrll KASSERT(len <= sizeof(cmd->data));
1767 1.1 nonaka memcpy(cmd->data, arg, len);
1768 1.1 nonaka ring->cur = (ring->cur + 1) % RUN_HOST_CMD_RING_COUNT;
1769 1.1 nonaka
1770 1.1 nonaka /* if there is no pending command already, schedule a task */
1771 1.1 nonaka if (++ring->queued == 1)
1772 1.1 nonaka usb_add_task(sc->sc_udev, &sc->sc_task, USB_TASKQ_DRIVER);
1773 1.1 nonaka splx(s);
1774 1.1 nonaka }
1775 1.1 nonaka
1776 1.1 nonaka static int
1777 1.1 nonaka run_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
1778 1.1 nonaka {
1779 1.1 nonaka struct run_softc *sc = ic->ic_ifp->if_softc;
1780 1.1 nonaka struct run_cmd_newstate cmd;
1781 1.1 nonaka
1782 1.1 nonaka callout_stop(&sc->scan_to);
1783 1.1 nonaka callout_stop(&sc->calib_to);
1784 1.1 nonaka
1785 1.1 nonaka /* do it in a process context */
1786 1.1 nonaka cmd.state = nstate;
1787 1.1 nonaka cmd.arg = arg;
1788 1.10.6.6 skrll run_do_async(sc, run_newstate_cb, &cmd, sizeof(cmd));
1789 1.10.6.2 skrll return 0;
1790 1.1 nonaka }
1791 1.1 nonaka
1792 1.1 nonaka static void
1793 1.1 nonaka run_newstate_cb(struct run_softc *sc, void *arg)
1794 1.1 nonaka {
1795 1.1 nonaka struct run_cmd_newstate *cmd = arg;
1796 1.1 nonaka struct ifnet *ifp = &sc->sc_if;
1797 1.1 nonaka struct ieee80211com *ic = &sc->sc_ic;
1798 1.1 nonaka enum ieee80211_state ostate;
1799 1.1 nonaka struct ieee80211_node *ni;
1800 1.1 nonaka uint32_t tmp, sta[3];
1801 1.1 nonaka uint8_t wcid;
1802 1.1 nonaka int s;
1803 1.1 nonaka
1804 1.1 nonaka s = splnet();
1805 1.1 nonaka ostate = ic->ic_state;
1806 1.1 nonaka
1807 1.1 nonaka if (ostate == IEEE80211_S_RUN) {
1808 1.1 nonaka /* turn link LED off */
1809 1.1 nonaka run_set_leds(sc, RT2860_LED_RADIO);
1810 1.1 nonaka }
1811 1.1 nonaka
1812 1.1 nonaka switch (cmd->state) {
1813 1.1 nonaka case IEEE80211_S_INIT:
1814 1.1 nonaka if (ostate == IEEE80211_S_RUN) {
1815 1.1 nonaka /* abort TSF synchronization */
1816 1.1 nonaka run_read(sc, RT2860_BCN_TIME_CFG, &tmp);
1817 1.1 nonaka run_write(sc, RT2860_BCN_TIME_CFG,
1818 1.1 nonaka tmp & ~(RT2860_BCN_TX_EN | RT2860_TSF_TIMER_EN |
1819 1.1 nonaka RT2860_TBTT_TIMER_EN));
1820 1.1 nonaka }
1821 1.1 nonaka break;
1822 1.1 nonaka
1823 1.1 nonaka case IEEE80211_S_SCAN:
1824 1.1 nonaka run_set_chan(sc, ic->ic_curchan);
1825 1.1 nonaka callout_schedule(&sc->scan_to, hz / 5);
1826 1.1 nonaka break;
1827 1.1 nonaka
1828 1.1 nonaka case IEEE80211_S_AUTH:
1829 1.1 nonaka case IEEE80211_S_ASSOC:
1830 1.1 nonaka run_set_chan(sc, ic->ic_curchan);
1831 1.1 nonaka break;
1832 1.1 nonaka
1833 1.1 nonaka case IEEE80211_S_RUN:
1834 1.1 nonaka run_set_chan(sc, ic->ic_curchan);
1835 1.1 nonaka
1836 1.1 nonaka ni = ic->ic_bss;
1837 1.1 nonaka
1838 1.1 nonaka if (ic->ic_opmode != IEEE80211_M_MONITOR) {
1839 1.1 nonaka run_updateslot(ifp);
1840 1.1 nonaka run_enable_mrr(sc);
1841 1.1 nonaka run_set_txpreamble(sc);
1842 1.1 nonaka run_set_basicrates(sc);
1843 1.1 nonaka run_set_bssid(sc, ni->ni_bssid);
1844 1.1 nonaka }
1845 1.1 nonaka #ifndef IEEE80211_STA_ONLY
1846 1.1 nonaka if (ic->ic_opmode == IEEE80211_M_HOSTAP ||
1847 1.1 nonaka ic->ic_opmode == IEEE80211_M_IBSS)
1848 1.1 nonaka (void)run_setup_beacon(sc);
1849 1.1 nonaka #endif
1850 1.1 nonaka if (ic->ic_opmode == IEEE80211_M_STA) {
1851 1.1 nonaka /* add BSS entry to the WCID table */
1852 1.1 nonaka wcid = RUN_AID2WCID(ni->ni_associd);
1853 1.1 nonaka run_write_region_1(sc, RT2860_WCID_ENTRY(wcid),
1854 1.1 nonaka ni->ni_macaddr, IEEE80211_ADDR_LEN);
1855 1.1 nonaka
1856 1.1 nonaka /* fake a join to init the tx rate */
1857 1.1 nonaka run_newassoc(ni, 1);
1858 1.1 nonaka }
1859 1.1 nonaka if (ic->ic_opmode != IEEE80211_M_MONITOR) {
1860 1.1 nonaka run_enable_tsf_sync(sc);
1861 1.1 nonaka
1862 1.1 nonaka /* clear statistic registers used by AMRR */
1863 1.1 nonaka run_read_region_1(sc, RT2860_TX_STA_CNT0,
1864 1.10.6.6 skrll (uint8_t *)sta, sizeof(sta));
1865 1.1 nonaka /* start calibration timer */
1866 1.1 nonaka callout_schedule(&sc->calib_to, hz);
1867 1.1 nonaka }
1868 1.1 nonaka
1869 1.1 nonaka /* turn link LED on */
1870 1.1 nonaka run_set_leds(sc, RT2860_LED_RADIO |
1871 1.1 nonaka (IEEE80211_IS_CHAN_2GHZ(ic->ic_curchan) ?
1872 1.1 nonaka RT2860_LED_LINK_2GHZ : RT2860_LED_LINK_5GHZ));
1873 1.1 nonaka break;
1874 1.1 nonaka }
1875 1.1 nonaka (void)sc->sc_newstate(ic, cmd->state, cmd->arg);
1876 1.1 nonaka splx(s);
1877 1.1 nonaka }
1878 1.1 nonaka
1879 1.1 nonaka static int
1880 1.1 nonaka run_updateedca(struct ieee80211com *ic)
1881 1.1 nonaka {
1882 1.1 nonaka
1883 1.1 nonaka /* do it in a process context */
1884 1.1 nonaka run_do_async(ic->ic_ifp->if_softc, run_updateedca_cb, NULL, 0);
1885 1.10.6.2 skrll return 0;
1886 1.1 nonaka }
1887 1.1 nonaka
1888 1.1 nonaka /* ARGSUSED */
1889 1.1 nonaka static void
1890 1.1 nonaka run_updateedca_cb(struct run_softc *sc, void *arg)
1891 1.1 nonaka {
1892 1.1 nonaka struct ieee80211com *ic = &sc->sc_ic;
1893 1.1 nonaka int s, aci;
1894 1.1 nonaka
1895 1.1 nonaka s = splnet();
1896 1.1 nonaka /* update MAC TX configuration registers */
1897 1.1 nonaka for (aci = 0; aci < WME_NUM_AC; aci++) {
1898 1.1 nonaka run_write(sc, RT2860_EDCA_AC_CFG(aci),
1899 1.1 nonaka ic->ic_wme.wme_params[aci].wmep_logcwmax << 16 |
1900 1.1 nonaka ic->ic_wme.wme_params[aci].wmep_logcwmin << 12 |
1901 1.1 nonaka ic->ic_wme.wme_params[aci].wmep_aifsn << 8 |
1902 1.1 nonaka ic->ic_wme.wme_params[aci].wmep_txopLimit);
1903 1.1 nonaka }
1904 1.1 nonaka
1905 1.1 nonaka /* update SCH/DMA registers too */
1906 1.1 nonaka run_write(sc, RT2860_WMM_AIFSN_CFG,
1907 1.1 nonaka ic->ic_wme.wme_params[WME_AC_VO].wmep_aifsn << 12 |
1908 1.1 nonaka ic->ic_wme.wme_params[WME_AC_VI].wmep_aifsn << 8 |
1909 1.1 nonaka ic->ic_wme.wme_params[WME_AC_BK].wmep_aifsn << 4 |
1910 1.1 nonaka ic->ic_wme.wme_params[WME_AC_BE].wmep_aifsn);
1911 1.1 nonaka run_write(sc, RT2860_WMM_CWMIN_CFG,
1912 1.1 nonaka ic->ic_wme.wme_params[WME_AC_VO].wmep_logcwmin << 12 |
1913 1.1 nonaka ic->ic_wme.wme_params[WME_AC_VI].wmep_logcwmin << 8 |
1914 1.1 nonaka ic->ic_wme.wme_params[WME_AC_BK].wmep_logcwmin << 4 |
1915 1.1 nonaka ic->ic_wme.wme_params[WME_AC_BE].wmep_logcwmin);
1916 1.1 nonaka run_write(sc, RT2860_WMM_CWMAX_CFG,
1917 1.1 nonaka ic->ic_wme.wme_params[WME_AC_VO].wmep_logcwmax << 12 |
1918 1.1 nonaka ic->ic_wme.wme_params[WME_AC_VI].wmep_logcwmax << 8 |
1919 1.1 nonaka ic->ic_wme.wme_params[WME_AC_BK].wmep_logcwmax << 4 |
1920 1.1 nonaka ic->ic_wme.wme_params[WME_AC_BE].wmep_logcwmax);
1921 1.1 nonaka run_write(sc, RT2860_WMM_TXOP0_CFG,
1922 1.1 nonaka ic->ic_wme.wme_params[WME_AC_BK].wmep_txopLimit << 16 |
1923 1.1 nonaka ic->ic_wme.wme_params[WME_AC_BE].wmep_txopLimit);
1924 1.1 nonaka run_write(sc, RT2860_WMM_TXOP1_CFG,
1925 1.1 nonaka ic->ic_wme.wme_params[WME_AC_VO].wmep_txopLimit << 16 |
1926 1.1 nonaka ic->ic_wme.wme_params[WME_AC_VI].wmep_txopLimit);
1927 1.1 nonaka splx(s);
1928 1.1 nonaka }
1929 1.1 nonaka
1930 1.1 nonaka #ifdef RUN_HWCRYPTO
1931 1.1 nonaka static int
1932 1.1 nonaka run_set_key(struct ieee80211com *ic, const struct ieee80211_key *k,
1933 1.1 nonaka const uint8_t *mac)
1934 1.1 nonaka {
1935 1.1 nonaka struct run_softc *sc = ic->ic_ifp->if_softc;
1936 1.1 nonaka struct ieee80211_node *ni = ic->ic_bss;
1937 1.1 nonaka struct run_cmd_key cmd;
1938 1.1 nonaka
1939 1.1 nonaka /* do it in a process context */
1940 1.1 nonaka cmd.key = *k;
1941 1.1 nonaka cmd.associd = (ni != NULL) ? ni->ni_associd : 0;
1942 1.10.6.6 skrll run_do_async(sc, run_set_key_cb, &cmd, sizeof(cmd));
1943 1.1 nonaka return 1;
1944 1.1 nonaka }
1945 1.1 nonaka
1946 1.1 nonaka static void
1947 1.1 nonaka run_set_key_cb(struct run_softc *sc, void *arg)
1948 1.1 nonaka {
1949 1.1 nonaka #ifndef IEEE80211_STA_ONLY
1950 1.1 nonaka struct ieee80211com *ic = &sc->sc_ic;
1951 1.1 nonaka #endif
1952 1.1 nonaka struct run_cmd_key *cmd = arg;
1953 1.1 nonaka struct ieee80211_key *k = &cmd->key;
1954 1.1 nonaka uint32_t attr;
1955 1.1 nonaka uint16_t base;
1956 1.1 nonaka uint8_t mode, wcid, iv[8];
1957 1.1 nonaka
1958 1.1 nonaka /* map net80211 cipher to RT2860 security mode */
1959 1.1 nonaka switch (k->wk_cipher->ic_cipher) {
1960 1.1 nonaka case IEEE80211_CIPHER_WEP:
1961 1.1 nonaka k->wk_flags |= IEEE80211_KEY_GROUP; /* XXX */
1962 1.1 nonaka if (k->wk_keylen == 5)
1963 1.1 nonaka mode = RT2860_MODE_WEP40;
1964 1.1 nonaka else
1965 1.1 nonaka mode = RT2860_MODE_WEP104;
1966 1.1 nonaka break;
1967 1.1 nonaka case IEEE80211_CIPHER_TKIP:
1968 1.1 nonaka mode = RT2860_MODE_TKIP;
1969 1.1 nonaka break;
1970 1.1 nonaka case IEEE80211_CIPHER_AES_CCM:
1971 1.1 nonaka mode = RT2860_MODE_AES_CCMP;
1972 1.1 nonaka break;
1973 1.1 nonaka default:
1974 1.1 nonaka return;
1975 1.1 nonaka }
1976 1.1 nonaka
1977 1.1 nonaka if (k->wk_flags & IEEE80211_KEY_GROUP) {
1978 1.1 nonaka wcid = 0; /* NB: update WCID0 for group keys */
1979 1.1 nonaka base = RT2860_SKEY(0, k->wk_keyix);
1980 1.1 nonaka } else {
1981 1.1 nonaka wcid = RUN_AID2WCID(cmd->associd);
1982 1.1 nonaka base = RT2860_PKEY(wcid);
1983 1.1 nonaka }
1984 1.1 nonaka
1985 1.1 nonaka if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_TKIP) {
1986 1.1 nonaka run_write_region_1(sc, base, k->wk_key, 16);
1987 1.1 nonaka #ifndef IEEE80211_STA_ONLY
1988 1.1 nonaka if (ic->ic_opmode == IEEE80211_M_HOSTAP) {
1989 1.1 nonaka run_write_region_1(sc, base + 16, &k->wk_key[16], 8);
1990 1.1 nonaka run_write_region_1(sc, base + 24, &k->wk_key[24], 8);
1991 1.1 nonaka } else
1992 1.1 nonaka #endif
1993 1.1 nonaka {
1994 1.1 nonaka run_write_region_1(sc, base + 16, &k->wk_key[24], 8);
1995 1.1 nonaka run_write_region_1(sc, base + 24, &k->wk_key[16], 8);
1996 1.1 nonaka }
1997 1.1 nonaka } else {
1998 1.1 nonaka /* roundup len to 16-bit: XXX fix write_region_1() instead */
1999 1.1 nonaka run_write_region_1(sc, base, k->wk_key,
2000 1.1 nonaka (k->wk_keylen + 1) & ~1);
2001 1.1 nonaka }
2002 1.1 nonaka
2003 1.1 nonaka if (!(k->wk_flags & IEEE80211_KEY_GROUP) ||
2004 1.1 nonaka (k->wk_flags & IEEE80211_KEY_XMIT)) {
2005 1.1 nonaka /* set initial packet number in IV+EIV */
2006 1.1 nonaka if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_WEP) {
2007 1.10.6.6 skrll memset(iv, 0, sizeof(iv));
2008 1.1 nonaka iv[3] = sc->sc_ic.ic_crypto.cs_def_txkey << 6;
2009 1.1 nonaka } else {
2010 1.1 nonaka if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_TKIP) {
2011 1.1 nonaka iv[0] = k->wk_keytsc >> 8;
2012 1.1 nonaka iv[1] = (iv[0] | 0x20) & 0x7f;
2013 1.1 nonaka iv[2] = k->wk_keytsc;
2014 1.1 nonaka } else /* CCMP */ {
2015 1.1 nonaka iv[0] = k->wk_keytsc;
2016 1.1 nonaka iv[1] = k->wk_keytsc >> 8;
2017 1.1 nonaka iv[2] = 0;
2018 1.1 nonaka }
2019 1.1 nonaka iv[3] = k->wk_keyix << 6 | IEEE80211_WEP_EXTIV;
2020 1.1 nonaka iv[4] = k->wk_keytsc >> 16;
2021 1.1 nonaka iv[5] = k->wk_keytsc >> 24;
2022 1.1 nonaka iv[6] = k->wk_keytsc >> 32;
2023 1.1 nonaka iv[7] = k->wk_keytsc >> 40;
2024 1.1 nonaka }
2025 1.1 nonaka run_write_region_1(sc, RT2860_IVEIV(wcid), iv, 8);
2026 1.1 nonaka }
2027 1.1 nonaka
2028 1.1 nonaka if (k->wk_flags & IEEE80211_KEY_GROUP) {
2029 1.1 nonaka /* install group key */
2030 1.1 nonaka run_read(sc, RT2860_SKEY_MODE_0_7, &attr);
2031 1.1 nonaka attr &= ~(0xf << (k->wk_keyix * 4));
2032 1.1 nonaka attr |= mode << (k->wk_keyix * 4);
2033 1.1 nonaka run_write(sc, RT2860_SKEY_MODE_0_7, attr);
2034 1.1 nonaka } else {
2035 1.1 nonaka /* install pairwise key */
2036 1.1 nonaka run_read(sc, RT2860_WCID_ATTR(wcid), &attr);
2037 1.1 nonaka attr = (attr & ~0xf) | (mode << 1) | RT2860_RX_PKEY_EN;
2038 1.1 nonaka run_write(sc, RT2860_WCID_ATTR(wcid), attr);
2039 1.1 nonaka }
2040 1.1 nonaka }
2041 1.1 nonaka
2042 1.1 nonaka static int
2043 1.1 nonaka run_delete_key(struct ieee80211com *ic, const struct ieee80211_key *k)
2044 1.1 nonaka {
2045 1.1 nonaka struct run_softc *sc = ic->ic_ifp->if_softc;
2046 1.1 nonaka struct ieee80211_node *ni = ic->ic_bss;
2047 1.1 nonaka struct run_cmd_key cmd;
2048 1.1 nonaka
2049 1.1 nonaka /* do it in a process context */
2050 1.1 nonaka cmd.key = *k;
2051 1.1 nonaka cmd.associd = (ni != NULL) ? ni->ni_associd : 0;
2052 1.10.6.6 skrll run_do_async(sc, run_delete_key_cb, &cmd, sizeof(cmd));
2053 1.1 nonaka return 1;
2054 1.1 nonaka }
2055 1.1 nonaka
2056 1.1 nonaka static void
2057 1.1 nonaka run_delete_key_cb(struct run_softc *sc, void *arg)
2058 1.1 nonaka {
2059 1.1 nonaka struct run_cmd_key *cmd = arg;
2060 1.1 nonaka struct ieee80211_key *k = &cmd->key;
2061 1.1 nonaka uint32_t attr;
2062 1.1 nonaka uint8_t wcid;
2063 1.1 nonaka
2064 1.1 nonaka if (k->wk_cipher->ic_cipher == IEEE80211_CIPHER_WEP)
2065 1.1 nonaka k->wk_flags |= IEEE80211_KEY_GROUP; /* XXX */
2066 1.1 nonaka
2067 1.1 nonaka if (k->wk_flags & IEEE80211_KEY_GROUP) {
2068 1.1 nonaka /* remove group key */
2069 1.1 nonaka run_read(sc, RT2860_SKEY_MODE_0_7, &attr);
2070 1.1 nonaka attr &= ~(0xf << (k->wk_keyix * 4));
2071 1.1 nonaka run_write(sc, RT2860_SKEY_MODE_0_7, attr);
2072 1.1 nonaka
2073 1.1 nonaka } else {
2074 1.1 nonaka /* remove pairwise key */
2075 1.1 nonaka wcid = RUN_AID2WCID(cmd->associd);
2076 1.1 nonaka run_read(sc, RT2860_WCID_ATTR(wcid), &attr);
2077 1.1 nonaka attr &= ~0xf;
2078 1.1 nonaka run_write(sc, RT2860_WCID_ATTR(wcid), attr);
2079 1.1 nonaka }
2080 1.1 nonaka }
2081 1.1 nonaka #endif
2082 1.1 nonaka
2083 1.1 nonaka static void
2084 1.1 nonaka run_calibrate_to(void *arg)
2085 1.1 nonaka {
2086 1.1 nonaka
2087 1.1 nonaka /* do it in a process context */
2088 1.1 nonaka run_do_async(arg, run_calibrate_cb, NULL, 0);
2089 1.1 nonaka /* next timeout will be rescheduled in the calibration task */
2090 1.1 nonaka }
2091 1.1 nonaka
2092 1.1 nonaka /* ARGSUSED */
2093 1.1 nonaka static void
2094 1.1 nonaka run_calibrate_cb(struct run_softc *sc, void *arg)
2095 1.1 nonaka {
2096 1.1 nonaka struct ifnet *ifp = &sc->sc_if;
2097 1.1 nonaka uint32_t sta[3];
2098 1.1 nonaka int s, error;
2099 1.1 nonaka
2100 1.1 nonaka /* read statistic counters (clear on read) and update AMRR state */
2101 1.1 nonaka error = run_read_region_1(sc, RT2860_TX_STA_CNT0, (uint8_t *)sta,
2102 1.10.6.6 skrll sizeof(sta));
2103 1.1 nonaka if (error != 0)
2104 1.1 nonaka goto skip;
2105 1.1 nonaka
2106 1.1 nonaka DPRINTF(("retrycnt=%d txcnt=%d failcnt=%d\n",
2107 1.1 nonaka le32toh(sta[1]) >> 16, le32toh(sta[1]) & 0xffff,
2108 1.1 nonaka le32toh(sta[0]) & 0xffff));
2109 1.1 nonaka
2110 1.1 nonaka s = splnet();
2111 1.1 nonaka /* count failed TX as errors */
2112 1.1 nonaka ifp->if_oerrors += le32toh(sta[0]) & 0xffff;
2113 1.1 nonaka
2114 1.1 nonaka sc->amn.amn_retrycnt =
2115 1.1 nonaka (le32toh(sta[0]) & 0xffff) + /* failed TX count */
2116 1.1 nonaka (le32toh(sta[1]) >> 16); /* TX retransmission count */
2117 1.1 nonaka
2118 1.1 nonaka sc->amn.amn_txcnt =
2119 1.1 nonaka sc->amn.amn_retrycnt +
2120 1.1 nonaka (le32toh(sta[1]) & 0xffff); /* successful TX count */
2121 1.1 nonaka
2122 1.1 nonaka ieee80211_amrr_choose(&sc->amrr, sc->sc_ic.ic_bss, &sc->amn);
2123 1.1 nonaka splx(s);
2124 1.1 nonaka
2125 1.1 nonaka skip: callout_schedule(&sc->calib_to, hz);
2126 1.1 nonaka }
2127 1.1 nonaka
2128 1.1 nonaka static void
2129 1.1 nonaka run_newassoc(struct ieee80211_node *ni, int isnew)
2130 1.1 nonaka {
2131 1.1 nonaka struct run_softc *sc = ni->ni_ic->ic_ifp->if_softc;
2132 1.1 nonaka struct run_node *rn = (void *)ni;
2133 1.1 nonaka struct ieee80211_rateset *rs = &ni->ni_rates;
2134 1.1 nonaka uint8_t rate;
2135 1.1 nonaka int ridx, i, j;
2136 1.1 nonaka
2137 1.1 nonaka DPRINTF(("new assoc isnew=%d addr=%s\n",
2138 1.1 nonaka isnew, ether_sprintf(ni->ni_macaddr)));
2139 1.1 nonaka
2140 1.1 nonaka ieee80211_amrr_node_init(&sc->amrr, &sc->amn);
2141 1.1 nonaka /* start at lowest available bit-rate, AMRR will raise */
2142 1.1 nonaka ni->ni_txrate = 0;
2143 1.1 nonaka
2144 1.1 nonaka for (i = 0; i < rs->rs_nrates; i++) {
2145 1.1 nonaka rate = rs->rs_rates[i] & IEEE80211_RATE_VAL;
2146 1.1 nonaka /* convert 802.11 rate to hardware rate index */
2147 1.1 nonaka for (ridx = 0; ridx < RT2860_RIDX_MAX; ridx++)
2148 1.1 nonaka if (rt2860_rates[ridx].rate == rate)
2149 1.1 nonaka break;
2150 1.1 nonaka rn->ridx[i] = ridx;
2151 1.1 nonaka /* determine rate of control response frames */
2152 1.1 nonaka for (j = i; j >= 0; j--) {
2153 1.1 nonaka if ((rs->rs_rates[j] & IEEE80211_RATE_BASIC) &&
2154 1.1 nonaka rt2860_rates[rn->ridx[i]].phy ==
2155 1.1 nonaka rt2860_rates[rn->ridx[j]].phy)
2156 1.1 nonaka break;
2157 1.1 nonaka }
2158 1.1 nonaka if (j >= 0) {
2159 1.1 nonaka rn->ctl_ridx[i] = rn->ridx[j];
2160 1.1 nonaka } else {
2161 1.1 nonaka /* no basic rate found, use mandatory one */
2162 1.1 nonaka rn->ctl_ridx[i] = rt2860_rates[ridx].ctl_ridx;
2163 1.1 nonaka }
2164 1.1 nonaka DPRINTF(("rate=0x%02x ridx=%d ctl_ridx=%d\n",
2165 1.1 nonaka rs->rs_rates[i], rn->ridx[i], rn->ctl_ridx[i]));
2166 1.1 nonaka }
2167 1.1 nonaka }
2168 1.1 nonaka
2169 1.1 nonaka /*
2170 1.1 nonaka * Return the Rx chain with the highest RSSI for a given frame.
2171 1.1 nonaka */
2172 1.1 nonaka static __inline uint8_t
2173 1.1 nonaka run_maxrssi_chain(struct run_softc *sc, const struct rt2860_rxwi *rxwi)
2174 1.1 nonaka {
2175 1.1 nonaka uint8_t rxchain = 0;
2176 1.1 nonaka
2177 1.1 nonaka if (sc->nrxchains > 1) {
2178 1.1 nonaka if (rxwi->rssi[1] > rxwi->rssi[rxchain])
2179 1.1 nonaka rxchain = 1;
2180 1.1 nonaka if (sc->nrxchains > 2)
2181 1.1 nonaka if (rxwi->rssi[2] > rxwi->rssi[rxchain])
2182 1.1 nonaka rxchain = 2;
2183 1.1 nonaka }
2184 1.10.6.2 skrll return rxchain;
2185 1.1 nonaka }
2186 1.1 nonaka
2187 1.1 nonaka static void
2188 1.1 nonaka run_rx_frame(struct run_softc *sc, uint8_t *buf, int dmalen)
2189 1.1 nonaka {
2190 1.1 nonaka struct ieee80211com *ic = &sc->sc_ic;
2191 1.1 nonaka struct ifnet *ifp = &sc->sc_if;
2192 1.1 nonaka struct ieee80211_frame *wh;
2193 1.1 nonaka struct ieee80211_node *ni;
2194 1.1 nonaka struct rt2870_rxd *rxd;
2195 1.1 nonaka struct rt2860_rxwi *rxwi;
2196 1.1 nonaka struct mbuf *m;
2197 1.1 nonaka uint32_t flags;
2198 1.10.6.11 skrll uint16_t len, rxwisize, phy;
2199 1.1 nonaka uint8_t ant, rssi;
2200 1.1 nonaka int s;
2201 1.1 nonaka #ifdef RUN_HWCRYPTO
2202 1.1 nonaka int decrypted = 0;
2203 1.1 nonaka #endif
2204 1.1 nonaka
2205 1.1 nonaka rxwi = (struct rt2860_rxwi *)buf;
2206 1.1 nonaka len = le16toh(rxwi->len) & 0xfff;
2207 1.1 nonaka if (__predict_false(len > dmalen)) {
2208 1.1 nonaka DPRINTF(("bad RXWI length %u > %u\n", len, dmalen));
2209 1.1 nonaka return;
2210 1.1 nonaka }
2211 1.1 nonaka /* Rx descriptor is located at the end */
2212 1.1 nonaka rxd = (struct rt2870_rxd *)(buf + dmalen);
2213 1.1 nonaka flags = le32toh(rxd->flags);
2214 1.1 nonaka
2215 1.1 nonaka if (__predict_false(flags & (RT2860_RX_CRCERR | RT2860_RX_ICVERR))) {
2216 1.1 nonaka ifp->if_ierrors++;
2217 1.1 nonaka return;
2218 1.1 nonaka }
2219 1.1 nonaka
2220 1.10.6.11 skrll rxwisize = sizeof(struct rt2860_rxwi);
2221 1.10.6.11 skrll if (sc->mac_ver == 0x5592)
2222 1.10.6.11 skrll rxwisize += sizeof(uint64_t);
2223 1.10.6.11 skrll else if (sc->mac_ver == 0x3593)
2224 1.10.6.11 skrll rxwisize += sizeof(uint32_t);
2225 1.10.6.11 skrll
2226 1.10.6.11 skrll wh = (struct ieee80211_frame *)(((uint8_t *)rxwi) + rxwisize);
2227 1.1 nonaka #ifdef RUN_HWCRYPTO
2228 1.1 nonaka if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
2229 1.1 nonaka wh->i_fc[1] &= ~IEEE80211_FC1_WEP;
2230 1.1 nonaka decrypted = 1;
2231 1.1 nonaka }
2232 1.1 nonaka #endif
2233 1.1 nonaka
2234 1.1 nonaka if (__predict_false((flags & RT2860_RX_MICERR))) {
2235 1.1 nonaka /* report MIC failures to net80211 for TKIP */
2236 1.1 nonaka ieee80211_notify_michael_failure(ic, wh, 0/* XXX */);
2237 1.1 nonaka ifp->if_ierrors++;
2238 1.1 nonaka return;
2239 1.1 nonaka }
2240 1.1 nonaka
2241 1.1 nonaka if (flags & RT2860_RX_L2PAD) {
2242 1.1 nonaka u_int hdrlen = ieee80211_hdrspace(ic, wh);
2243 1.1 nonaka ovbcopy(wh, (uint8_t *)wh + 2, hdrlen);
2244 1.1 nonaka wh = (struct ieee80211_frame *)((uint8_t *)wh + 2);
2245 1.1 nonaka }
2246 1.1 nonaka
2247 1.1 nonaka /* could use m_devget but net80211 wants contig mgmt frames */
2248 1.1 nonaka MGETHDR(m, M_DONTWAIT, MT_DATA);
2249 1.1 nonaka if (__predict_false(m == NULL)) {
2250 1.1 nonaka ifp->if_ierrors++;
2251 1.1 nonaka return;
2252 1.1 nonaka }
2253 1.1 nonaka if (len > MHLEN) {
2254 1.1 nonaka MCLGET(m, M_DONTWAIT);
2255 1.1 nonaka if (__predict_false(!(m->m_flags & M_EXT))) {
2256 1.1 nonaka ifp->if_ierrors++;
2257 1.1 nonaka m_freem(m);
2258 1.1 nonaka return;
2259 1.1 nonaka }
2260 1.1 nonaka }
2261 1.1 nonaka /* finalize mbuf */
2262 1.10.6.10 skrll m_set_rcvif(m, ifp);
2263 1.1 nonaka memcpy(mtod(m, void *), wh, len);
2264 1.1 nonaka m->m_pkthdr.len = m->m_len = len;
2265 1.1 nonaka
2266 1.1 nonaka ant = run_maxrssi_chain(sc, rxwi);
2267 1.1 nonaka rssi = rxwi->rssi[ant];
2268 1.1 nonaka
2269 1.1 nonaka if (__predict_false(sc->sc_drvbpf != NULL)) {
2270 1.1 nonaka struct run_rx_radiotap_header *tap = &sc->sc_rxtap;
2271 1.1 nonaka
2272 1.1 nonaka tap->wr_flags = 0;
2273 1.1 nonaka tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq);
2274 1.1 nonaka tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags);
2275 1.1 nonaka tap->wr_antsignal = rssi;
2276 1.1 nonaka tap->wr_antenna = ant;
2277 1.1 nonaka tap->wr_dbm_antsignal = run_rssi2dbm(sc, rssi, ant);
2278 1.1 nonaka tap->wr_rate = 2; /* in case it can't be found below */
2279 1.1 nonaka phy = le16toh(rxwi->phy);
2280 1.1 nonaka switch (phy & RT2860_PHY_MODE) {
2281 1.1 nonaka case RT2860_PHY_CCK:
2282 1.1 nonaka switch ((phy & RT2860_PHY_MCS) & ~RT2860_PHY_SHPRE) {
2283 1.1 nonaka case 0: tap->wr_rate = 2; break;
2284 1.1 nonaka case 1: tap->wr_rate = 4; break;
2285 1.1 nonaka case 2: tap->wr_rate = 11; break;
2286 1.1 nonaka case 3: tap->wr_rate = 22; break;
2287 1.1 nonaka }
2288 1.1 nonaka if (phy & RT2860_PHY_SHPRE)
2289 1.1 nonaka tap->wr_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
2290 1.1 nonaka break;
2291 1.1 nonaka case RT2860_PHY_OFDM:
2292 1.1 nonaka switch (phy & RT2860_PHY_MCS) {
2293 1.1 nonaka case 0: tap->wr_rate = 12; break;
2294 1.1 nonaka case 1: tap->wr_rate = 18; break;
2295 1.1 nonaka case 2: tap->wr_rate = 24; break;
2296 1.1 nonaka case 3: tap->wr_rate = 36; break;
2297 1.1 nonaka case 4: tap->wr_rate = 48; break;
2298 1.1 nonaka case 5: tap->wr_rate = 72; break;
2299 1.1 nonaka case 6: tap->wr_rate = 96; break;
2300 1.1 nonaka case 7: tap->wr_rate = 108; break;
2301 1.1 nonaka }
2302 1.1 nonaka break;
2303 1.1 nonaka }
2304 1.1 nonaka bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m);
2305 1.1 nonaka }
2306 1.1 nonaka
2307 1.1 nonaka s = splnet();
2308 1.1 nonaka ni = ieee80211_find_rxnode(ic, (struct ieee80211_frame_min *)wh);
2309 1.1 nonaka #ifdef RUN_HWCRYPTO
2310 1.1 nonaka if (decrypted) {
2311 1.1 nonaka uint32_t icflags = ic->ic_flags;
2312 1.1 nonaka
2313 1.1 nonaka ic->ic_flags &= ~IEEE80211_F_DROPUNENC; /* XXX */
2314 1.1 nonaka ieee80211_input(ic, m, ni, rssi, 0);
2315 1.1 nonaka ic->ic_flags = icflags;
2316 1.1 nonaka } else
2317 1.1 nonaka #endif
2318 1.1 nonaka ieee80211_input(ic, m, ni, rssi, 0);
2319 1.1 nonaka
2320 1.1 nonaka /* node is no longer needed */
2321 1.1 nonaka ieee80211_free_node(ni);
2322 1.1 nonaka
2323 1.1 nonaka /*
2324 1.1 nonaka * In HostAP mode, ieee80211_input() will enqueue packets in if_snd
2325 1.1 nonaka * without calling if_start().
2326 1.1 nonaka */
2327 1.1 nonaka if (!IFQ_IS_EMPTY(&ifp->if_snd) && !(ifp->if_flags & IFF_OACTIVE))
2328 1.1 nonaka run_start(ifp);
2329 1.1 nonaka
2330 1.1 nonaka splx(s);
2331 1.1 nonaka }
2332 1.1 nonaka
2333 1.1 nonaka static void
2334 1.10.6.3 skrll run_rxeof(struct usbd_xfer *xfer, void *priv, usbd_status status)
2335 1.1 nonaka {
2336 1.1 nonaka struct run_rx_data *data = priv;
2337 1.1 nonaka struct run_softc *sc = data->sc;
2338 1.1 nonaka uint8_t *buf;
2339 1.1 nonaka uint32_t dmalen;
2340 1.1 nonaka int xferlen;
2341 1.1 nonaka
2342 1.10.6.11 skrll if (__predict_false(sc->sc_flags & RUN_DETACHING))
2343 1.10.6.11 skrll return;
2344 1.10.6.11 skrll
2345 1.1 nonaka if (__predict_false(status != USBD_NORMAL_COMPLETION)) {
2346 1.1 nonaka DPRINTF(("RX status=%d\n", status));
2347 1.1 nonaka if (status == USBD_STALLED)
2348 1.1 nonaka usbd_clear_endpoint_stall_async(sc->rxq.pipeh);
2349 1.1 nonaka if (status != USBD_CANCELLED)
2350 1.1 nonaka goto skip;
2351 1.1 nonaka return;
2352 1.1 nonaka }
2353 1.1 nonaka usbd_get_xfer_status(xfer, NULL, NULL, &xferlen, NULL);
2354 1.1 nonaka
2355 1.1 nonaka if (__predict_false(xferlen < (int)(sizeof(uint32_t) +
2356 1.1 nonaka sizeof(struct rt2860_rxwi) + sizeof(struct rt2870_rxd)))) {
2357 1.1 nonaka DPRINTF(("xfer too short %d\n", xferlen));
2358 1.1 nonaka goto skip;
2359 1.1 nonaka }
2360 1.1 nonaka
2361 1.1 nonaka /* HW can aggregate multiple 802.11 frames in a single USB xfer */
2362 1.1 nonaka buf = data->buf;
2363 1.1 nonaka while (xferlen > 8) {
2364 1.1 nonaka dmalen = le32toh(*(uint32_t *)buf) & 0xffff;
2365 1.1 nonaka
2366 1.10.6.11 skrll if (__predict_false((dmalen >= (uint32_t)-8) || dmalen == 0 ||
2367 1.10.6.11 skrll (dmalen & 3) != 0)) {
2368 1.1 nonaka DPRINTF(("bad DMA length %u (%x)\n", dmalen, dmalen));
2369 1.1 nonaka break;
2370 1.1 nonaka }
2371 1.1 nonaka if (__predict_false(dmalen + 8 > (uint32_t)xferlen)) {
2372 1.1 nonaka DPRINTF(("bad DMA length %u > %d\n",
2373 1.1 nonaka dmalen + 8, xferlen));
2374 1.1 nonaka break;
2375 1.1 nonaka }
2376 1.10.6.6 skrll run_rx_frame(sc, buf + sizeof(uint32_t), dmalen);
2377 1.1 nonaka buf += dmalen + 8;
2378 1.1 nonaka xferlen -= dmalen + 8;
2379 1.1 nonaka }
2380 1.1 nonaka
2381 1.1 nonaka skip: /* setup a new transfer */
2382 1.10.6.7 skrll usbd_setup_xfer(xfer, data, data->buf, RUN_MAX_RXSZ,
2383 1.10.6.1 skrll USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, run_rxeof);
2384 1.10.6.11 skrll (void)usbd_transfer(xfer);
2385 1.1 nonaka }
2386 1.1 nonaka
2387 1.1 nonaka static void
2388 1.10.6.3 skrll run_txeof(struct usbd_xfer *xfer, void *priv, usbd_status status)
2389 1.1 nonaka {
2390 1.1 nonaka struct run_tx_data *data = priv;
2391 1.1 nonaka struct run_softc *sc = data->sc;
2392 1.1 nonaka struct run_tx_ring *txq = &sc->txq[data->qid];
2393 1.1 nonaka struct ifnet *ifp = &sc->sc_if;
2394 1.1 nonaka int s;
2395 1.1 nonaka
2396 1.1 nonaka if (__predict_false(status != USBD_NORMAL_COMPLETION)) {
2397 1.1 nonaka DPRINTF(("TX status=%d\n", status));
2398 1.1 nonaka if (status == USBD_STALLED)
2399 1.1 nonaka usbd_clear_endpoint_stall_async(txq->pipeh);
2400 1.1 nonaka ifp->if_oerrors++;
2401 1.1 nonaka return;
2402 1.1 nonaka }
2403 1.1 nonaka
2404 1.1 nonaka s = splnet();
2405 1.1 nonaka sc->sc_tx_timer = 0;
2406 1.1 nonaka ifp->if_opackets++;
2407 1.1 nonaka if (--txq->queued < RUN_TX_RING_COUNT) {
2408 1.1 nonaka sc->qfullmsk &= ~(1 << data->qid);
2409 1.1 nonaka ifp->if_flags &= ~IFF_OACTIVE;
2410 1.1 nonaka run_start(ifp);
2411 1.1 nonaka }
2412 1.1 nonaka splx(s);
2413 1.1 nonaka }
2414 1.1 nonaka
2415 1.1 nonaka static int
2416 1.1 nonaka run_tx(struct run_softc *sc, struct mbuf *m, struct ieee80211_node *ni)
2417 1.1 nonaka {
2418 1.1 nonaka struct ieee80211com *ic = &sc->sc_ic;
2419 1.1 nonaka struct run_node *rn = (void *)ni;
2420 1.1 nonaka struct ieee80211_frame *wh;
2421 1.1 nonaka #ifndef RUN_HWCRYPTO
2422 1.1 nonaka struct ieee80211_key *k;
2423 1.1 nonaka #endif
2424 1.1 nonaka struct run_tx_ring *ring;
2425 1.1 nonaka struct run_tx_data *data;
2426 1.1 nonaka struct rt2870_txd *txd;
2427 1.1 nonaka struct rt2860_txwi *txwi;
2428 1.10.6.11 skrll uint16_t dur, mcs;
2429 1.10.6.11 skrll uint8_t type, tid, qid, qos = 0;
2430 1.10.6.11 skrll int error, hasqos, ridx, ctl_ridx, xferlen, txwisize;
2431 1.10.6.11 skrll uint8_t pad;
2432 1.1 nonaka
2433 1.1 nonaka wh = mtod(m, struct ieee80211_frame *);
2434 1.1 nonaka
2435 1.1 nonaka #ifndef RUN_HWCRYPTO
2436 1.1 nonaka if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
2437 1.1 nonaka k = ieee80211_crypto_encap(ic, ni, m);
2438 1.1 nonaka if (k == NULL) {
2439 1.1 nonaka m_freem(m);
2440 1.10.6.2 skrll return ENOBUFS;
2441 1.1 nonaka }
2442 1.1 nonaka
2443 1.1 nonaka /* packet header may have moved, reset our local pointer */
2444 1.1 nonaka wh = mtod(m, struct ieee80211_frame *);
2445 1.1 nonaka }
2446 1.1 nonaka #endif
2447 1.1 nonaka type = wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK;
2448 1.1 nonaka
2449 1.9 christos if ((hasqos = ieee80211_has_qos(wh))) {
2450 1.1 nonaka qos = ((struct ieee80211_qosframe *)wh)->i_qos[0];
2451 1.1 nonaka tid = qos & IEEE80211_QOS_TID;
2452 1.1 nonaka qid = TID_TO_WME_AC(tid);
2453 1.1 nonaka } else {
2454 1.1 nonaka tid = 0;
2455 1.1 nonaka qid = WME_AC_BE;
2456 1.1 nonaka }
2457 1.1 nonaka ring = &sc->txq[qid];
2458 1.1 nonaka data = &ring->data[ring->cur];
2459 1.1 nonaka
2460 1.1 nonaka /* pickup a rate index */
2461 1.1 nonaka if (IEEE80211_IS_MULTICAST(wh->i_addr1) ||
2462 1.1 nonaka type != IEEE80211_FC0_TYPE_DATA) {
2463 1.1 nonaka ridx = (ic->ic_curmode == IEEE80211_MODE_11A) ?
2464 1.1 nonaka RT2860_RIDX_OFDM6 : RT2860_RIDX_CCK1;
2465 1.1 nonaka ctl_ridx = rt2860_rates[ridx].ctl_ridx;
2466 1.1 nonaka } else if (ic->ic_fixed_rate != IEEE80211_FIXED_RATE_NONE) {
2467 1.1 nonaka ridx = sc->fixed_ridx;
2468 1.1 nonaka ctl_ridx = rt2860_rates[ridx].ctl_ridx;
2469 1.1 nonaka } else {
2470 1.1 nonaka ridx = rn->ridx[ni->ni_txrate];
2471 1.1 nonaka ctl_ridx = rn->ctl_ridx[ni->ni_txrate];
2472 1.1 nonaka }
2473 1.1 nonaka
2474 1.1 nonaka /* get MCS code from rate index */
2475 1.1 nonaka mcs = rt2860_rates[ridx].mcs;
2476 1.1 nonaka
2477 1.10.6.11 skrll txwisize = (sc->mac_ver == 0x5592) ?
2478 1.10.6.11 skrll sizeof(*txwi) + sizeof(uint32_t) : sizeof(*txwi);
2479 1.10.6.11 skrll xferlen = txwisize + m->m_pkthdr.len;
2480 1.1 nonaka /* roundup to 32-bit alignment */
2481 1.1 nonaka xferlen = (xferlen + 3) & ~3;
2482 1.1 nonaka
2483 1.1 nonaka txd = (struct rt2870_txd *)data->buf;
2484 1.1 nonaka txd->flags = RT2860_TX_QSEL_EDCA;
2485 1.1 nonaka txd->len = htole16(xferlen);
2486 1.1 nonaka
2487 1.10.6.11 skrll /*
2488 1.10.6.11 skrll * Ether both are true or both are false, the header
2489 1.10.6.11 skrll * are nicely aligned to 32-bit. So, no L2 padding.
2490 1.10.6.11 skrll */
2491 1.10.6.11 skrll if (IEEE80211_HAS_ADDR4(wh) == IEEE80211_QOS_HAS_SEQ(wh))
2492 1.10.6.11 skrll pad = 0;
2493 1.10.6.11 skrll else
2494 1.10.6.11 skrll pad = 2;
2495 1.10.6.11 skrll
2496 1.1 nonaka /* setup TX Wireless Information */
2497 1.1 nonaka txwi = (struct rt2860_txwi *)(txd + 1);
2498 1.1 nonaka txwi->flags = 0;
2499 1.1 nonaka txwi->xflags = hasqos ? 0 : RT2860_TX_NSEQ;
2500 1.1 nonaka txwi->wcid = (type == IEEE80211_FC0_TYPE_DATA) ?
2501 1.1 nonaka RUN_AID2WCID(ni->ni_associd) : 0xff;
2502 1.10.6.11 skrll txwi->len = htole16(m->m_pkthdr.len - pad);
2503 1.1 nonaka if (rt2860_rates[ridx].phy == IEEE80211_T_DS) {
2504 1.1 nonaka txwi->phy = htole16(RT2860_PHY_CCK);
2505 1.1 nonaka if (ridx != RT2860_RIDX_CCK1 &&
2506 1.1 nonaka (ic->ic_flags & IEEE80211_F_SHPREAMBLE))
2507 1.1 nonaka mcs |= RT2860_PHY_SHPRE;
2508 1.1 nonaka } else
2509 1.10.6.11 skrll mcs |= RT2860_PHY_OFDM;
2510 1.1 nonaka txwi->phy |= htole16(mcs);
2511 1.1 nonaka
2512 1.1 nonaka txwi->txop = RT2860_TX_TXOP_BACKOFF;
2513 1.1 nonaka
2514 1.1 nonaka if (!IEEE80211_IS_MULTICAST(wh->i_addr1) &&
2515 1.1 nonaka (!hasqos || (qos & IEEE80211_QOS_ACKPOLICY) !=
2516 1.1 nonaka IEEE80211_QOS_ACKPOLICY_NOACK)) {
2517 1.1 nonaka txwi->xflags |= RT2860_TX_ACK;
2518 1.1 nonaka if (ic->ic_flags & IEEE80211_F_SHPREAMBLE)
2519 1.1 nonaka dur = rt2860_rates[ctl_ridx].sp_ack_dur;
2520 1.1 nonaka else
2521 1.1 nonaka dur = rt2860_rates[ctl_ridx].lp_ack_dur;
2522 1.1 nonaka *(uint16_t *)wh->i_dur = htole16(dur);
2523 1.1 nonaka }
2524 1.1 nonaka
2525 1.1 nonaka #ifndef IEEE80211_STA_ONLY
2526 1.1 nonaka /* ask MAC to insert timestamp into probe responses */
2527 1.1 nonaka if ((wh->i_fc[0] &
2528 1.1 nonaka (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_MASK)) ==
2529 1.1 nonaka (IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_PROBE_RESP))
2530 1.1 nonaka /* NOTE: beacons do not pass through tx_data() */
2531 1.1 nonaka txwi->flags |= RT2860_TX_TS;
2532 1.1 nonaka #endif
2533 1.1 nonaka
2534 1.1 nonaka if (__predict_false(sc->sc_drvbpf != NULL)) {
2535 1.1 nonaka struct run_tx_radiotap_header *tap = &sc->sc_txtap;
2536 1.1 nonaka
2537 1.1 nonaka tap->wt_flags = 0;
2538 1.1 nonaka tap->wt_rate = rt2860_rates[ridx].rate;
2539 1.1 nonaka tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq);
2540 1.1 nonaka tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags);
2541 1.1 nonaka tap->wt_hwqueue = qid;
2542 1.1 nonaka if (mcs & RT2860_PHY_SHPRE)
2543 1.1 nonaka tap->wt_flags |= IEEE80211_RADIOTAP_F_SHORTPRE;
2544 1.1 nonaka
2545 1.1 nonaka bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m);
2546 1.1 nonaka }
2547 1.1 nonaka
2548 1.10.6.11 skrll m_copydata(m, 0, m->m_pkthdr.len, ((uint8_t *)txwi) + txwisize);
2549 1.1 nonaka m_freem(m);
2550 1.1 nonaka
2551 1.10.6.6 skrll xferlen += sizeof(*txd) + 4;
2552 1.1 nonaka
2553 1.10.6.7 skrll usbd_setup_xfer(data->xfer, data, data->buf, xferlen,
2554 1.10.6.1 skrll USBD_FORCE_SHORT_XFER, RUN_TX_TIMEOUT, run_txeof);
2555 1.1 nonaka error = usbd_transfer(data->xfer);
2556 1.1 nonaka if (__predict_false(error != USBD_IN_PROGRESS &&
2557 1.1 nonaka error != USBD_NORMAL_COMPLETION))
2558 1.10.6.2 skrll return error;
2559 1.1 nonaka
2560 1.1 nonaka ieee80211_free_node(ni);
2561 1.1 nonaka
2562 1.1 nonaka ring->cur = (ring->cur + 1) % RUN_TX_RING_COUNT;
2563 1.1 nonaka if (++ring->queued >= RUN_TX_RING_COUNT)
2564 1.1 nonaka sc->qfullmsk |= 1 << qid;
2565 1.1 nonaka
2566 1.10.6.2 skrll return 0;
2567 1.1 nonaka }
2568 1.1 nonaka
2569 1.1 nonaka static void
2570 1.1 nonaka run_start(struct ifnet *ifp)
2571 1.1 nonaka {
2572 1.1 nonaka struct run_softc *sc = ifp->if_softc;
2573 1.1 nonaka struct ieee80211com *ic = &sc->sc_ic;
2574 1.1 nonaka struct ether_header *eh;
2575 1.1 nonaka struct ieee80211_node *ni;
2576 1.1 nonaka struct mbuf *m;
2577 1.1 nonaka
2578 1.1 nonaka if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
2579 1.1 nonaka return;
2580 1.1 nonaka
2581 1.1 nonaka for (;;) {
2582 1.1 nonaka if (sc->qfullmsk != 0) {
2583 1.1 nonaka ifp->if_flags |= IFF_OACTIVE;
2584 1.1 nonaka break;
2585 1.1 nonaka }
2586 1.1 nonaka /* send pending management frames first */
2587 1.1 nonaka IF_DEQUEUE(&ic->ic_mgtq, m);
2588 1.1 nonaka if (m != NULL) {
2589 1.10.6.9 skrll ni = M_GETCTX(m, struct ieee80211_node *);
2590 1.10.6.9 skrll M_CLEARCTX(m);
2591 1.1 nonaka goto sendit;
2592 1.1 nonaka }
2593 1.1 nonaka if (ic->ic_state != IEEE80211_S_RUN)
2594 1.1 nonaka break;
2595 1.1 nonaka
2596 1.1 nonaka /* encapsulate and send data frames */
2597 1.1 nonaka IFQ_DEQUEUE(&ifp->if_snd, m);
2598 1.1 nonaka if (m == NULL)
2599 1.1 nonaka break;
2600 1.1 nonaka if (m->m_len < (int)sizeof(*eh) &&
2601 1.1 nonaka (m = m_pullup(m, sizeof(*eh))) == NULL) {
2602 1.1 nonaka ifp->if_oerrors++;
2603 1.1 nonaka continue;
2604 1.1 nonaka }
2605 1.1 nonaka
2606 1.1 nonaka eh = mtod(m, struct ether_header *);
2607 1.1 nonaka ni = ieee80211_find_txnode(ic, eh->ether_dhost);
2608 1.1 nonaka if (ni == NULL) {
2609 1.1 nonaka m_freem(m);
2610 1.1 nonaka ifp->if_oerrors++;
2611 1.1 nonaka continue;
2612 1.1 nonaka }
2613 1.1 nonaka
2614 1.1 nonaka bpf_mtap(ifp, m);
2615 1.1 nonaka
2616 1.1 nonaka if ((m = ieee80211_encap(ic, m, ni)) == NULL) {
2617 1.1 nonaka ieee80211_free_node(ni);
2618 1.1 nonaka ifp->if_oerrors++;
2619 1.1 nonaka continue;
2620 1.1 nonaka }
2621 1.1 nonaka sendit:
2622 1.1 nonaka bpf_mtap3(ic->ic_rawbpf, m);
2623 1.1 nonaka
2624 1.1 nonaka if (run_tx(sc, m, ni) != 0) {
2625 1.1 nonaka ieee80211_free_node(ni);
2626 1.1 nonaka ifp->if_oerrors++;
2627 1.1 nonaka continue;
2628 1.1 nonaka }
2629 1.1 nonaka
2630 1.1 nonaka sc->sc_tx_timer = 5;
2631 1.1 nonaka ifp->if_timer = 1;
2632 1.1 nonaka }
2633 1.1 nonaka }
2634 1.1 nonaka
2635 1.1 nonaka static void
2636 1.1 nonaka run_watchdog(struct ifnet *ifp)
2637 1.1 nonaka {
2638 1.1 nonaka struct run_softc *sc = ifp->if_softc;
2639 1.1 nonaka struct ieee80211com *ic = &sc->sc_ic;
2640 1.1 nonaka
2641 1.1 nonaka ifp->if_timer = 0;
2642 1.1 nonaka
2643 1.1 nonaka if (sc->sc_tx_timer > 0) {
2644 1.1 nonaka if (--sc->sc_tx_timer == 0) {
2645 1.1 nonaka aprint_error_dev(sc->sc_dev, "device timeout\n");
2646 1.1 nonaka /* run_init(ifp); XXX needs a process context! */
2647 1.1 nonaka ifp->if_oerrors++;
2648 1.1 nonaka return;
2649 1.1 nonaka }
2650 1.1 nonaka ifp->if_timer = 1;
2651 1.1 nonaka }
2652 1.1 nonaka
2653 1.1 nonaka ieee80211_watchdog(ic);
2654 1.1 nonaka }
2655 1.1 nonaka
2656 1.1 nonaka static int
2657 1.1 nonaka run_ioctl(struct ifnet *ifp, u_long cmd, void *data)
2658 1.1 nonaka {
2659 1.1 nonaka struct run_softc *sc = ifp->if_softc;
2660 1.1 nonaka struct ieee80211com *ic = &sc->sc_ic;
2661 1.1 nonaka int s, error = 0;
2662 1.1 nonaka
2663 1.1 nonaka s = splnet();
2664 1.1 nonaka
2665 1.1 nonaka switch (cmd) {
2666 1.1 nonaka case SIOCSIFFLAGS:
2667 1.1 nonaka if ((error = ifioctl_common(ifp, cmd, data)) != 0)
2668 1.1 nonaka break;
2669 1.1 nonaka switch (ifp->if_flags & (IFF_UP|IFF_RUNNING)) {
2670 1.1 nonaka case IFF_UP|IFF_RUNNING:
2671 1.1 nonaka break;
2672 1.1 nonaka case IFF_UP:
2673 1.1 nonaka run_init(ifp);
2674 1.1 nonaka break;
2675 1.1 nonaka case IFF_RUNNING:
2676 1.1 nonaka run_stop(ifp, 1);
2677 1.1 nonaka break;
2678 1.1 nonaka case 0:
2679 1.1 nonaka break;
2680 1.1 nonaka }
2681 1.1 nonaka break;
2682 1.1 nonaka
2683 1.1 nonaka case SIOCADDMULTI:
2684 1.1 nonaka case SIOCDELMULTI:
2685 1.1 nonaka if ((error = ether_ioctl(ifp, cmd, data)) == ENETRESET) {
2686 1.1 nonaka /* setup multicast filter, etc */
2687 1.1 nonaka error = 0;
2688 1.1 nonaka }
2689 1.1 nonaka break;
2690 1.1 nonaka
2691 1.1 nonaka default:
2692 1.1 nonaka error = ieee80211_ioctl(ic, cmd, data);
2693 1.1 nonaka break;
2694 1.1 nonaka }
2695 1.1 nonaka
2696 1.1 nonaka if (error == ENETRESET) {
2697 1.1 nonaka if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) ==
2698 1.1 nonaka (IFF_UP | IFF_RUNNING)) {
2699 1.1 nonaka run_init(ifp);
2700 1.1 nonaka }
2701 1.1 nonaka error = 0;
2702 1.1 nonaka }
2703 1.1 nonaka
2704 1.1 nonaka splx(s);
2705 1.1 nonaka
2706 1.10.6.2 skrll return error;
2707 1.1 nonaka }
2708 1.1 nonaka
2709 1.1 nonaka static void
2710 1.1 nonaka run_select_chan_group(struct run_softc *sc, int group)
2711 1.1 nonaka {
2712 1.1 nonaka uint32_t tmp;
2713 1.1 nonaka uint8_t agc;
2714 1.1 nonaka
2715 1.1 nonaka run_bbp_write(sc, 62, 0x37 - sc->lna[group]);
2716 1.1 nonaka run_bbp_write(sc, 63, 0x37 - sc->lna[group]);
2717 1.1 nonaka run_bbp_write(sc, 64, 0x37 - sc->lna[group]);
2718 1.1 nonaka run_bbp_write(sc, 86, 0x00);
2719 1.1 nonaka
2720 1.1 nonaka if (group == 0) {
2721 1.1 nonaka if (sc->ext_2ghz_lna) {
2722 1.1 nonaka run_bbp_write(sc, 82, 0x62);
2723 1.1 nonaka run_bbp_write(sc, 75, 0x46);
2724 1.1 nonaka } else {
2725 1.1 nonaka run_bbp_write(sc, 82, 0x84);
2726 1.1 nonaka run_bbp_write(sc, 75, 0x50);
2727 1.1 nonaka }
2728 1.1 nonaka } else {
2729 1.1 nonaka if (sc->mac_ver == 0x3572)
2730 1.1 nonaka run_bbp_write(sc, 82, 0x94);
2731 1.1 nonaka else
2732 1.1 nonaka run_bbp_write(sc, 82, 0xf2);
2733 1.1 nonaka if (sc->ext_5ghz_lna)
2734 1.1 nonaka run_bbp_write(sc, 75, 0x46);
2735 1.1 nonaka else
2736 1.1 nonaka run_bbp_write(sc, 75, 0x50);
2737 1.1 nonaka }
2738 1.1 nonaka
2739 1.1 nonaka run_read(sc, RT2860_TX_BAND_CFG, &tmp);
2740 1.1 nonaka tmp &= ~(RT2860_5G_BAND_SEL_N | RT2860_5G_BAND_SEL_P);
2741 1.1 nonaka tmp |= (group == 0) ? RT2860_5G_BAND_SEL_N : RT2860_5G_BAND_SEL_P;
2742 1.1 nonaka run_write(sc, RT2860_TX_BAND_CFG, tmp);
2743 1.1 nonaka
2744 1.1 nonaka /* enable appropriate Power Amplifiers and Low Noise Amplifiers */
2745 1.1 nonaka tmp = RT2860_RFTR_EN | RT2860_TRSW_EN | RT2860_LNA_PE0_EN;
2746 1.1 nonaka if (sc->nrxchains > 1)
2747 1.1 nonaka tmp |= RT2860_LNA_PE1_EN;
2748 1.1 nonaka if (group == 0) { /* 2GHz */
2749 1.1 nonaka tmp |= RT2860_PA_PE_G0_EN;
2750 1.1 nonaka if (sc->ntxchains > 1)
2751 1.1 nonaka tmp |= RT2860_PA_PE_G1_EN;
2752 1.1 nonaka } else { /* 5GHz */
2753 1.1 nonaka tmp |= RT2860_PA_PE_A0_EN;
2754 1.1 nonaka if (sc->ntxchains > 1)
2755 1.1 nonaka tmp |= RT2860_PA_PE_A1_EN;
2756 1.1 nonaka }
2757 1.1 nonaka if (sc->mac_ver == 0x3572) {
2758 1.1 nonaka run_rt3070_rf_write(sc, 8, 0x00);
2759 1.1 nonaka run_write(sc, RT2860_TX_PIN_CFG, tmp);
2760 1.1 nonaka run_rt3070_rf_write(sc, 8, 0x80);
2761 1.1 nonaka } else
2762 1.1 nonaka run_write(sc, RT2860_TX_PIN_CFG, tmp);
2763 1.1 nonaka
2764 1.1 nonaka /* set initial AGC value */
2765 1.1 nonaka if (group == 0) { /* 2GHz band */
2766 1.1 nonaka if (sc->mac_ver >= 0x3070)
2767 1.1 nonaka agc = 0x1c + sc->lna[0] * 2;
2768 1.1 nonaka else
2769 1.1 nonaka agc = 0x2e + sc->lna[0];
2770 1.1 nonaka } else { /* 5GHz band */
2771 1.1 nonaka if (sc->mac_ver == 0x3572)
2772 1.1 nonaka agc = 0x22 + (sc->lna[group] * 5) / 3;
2773 1.1 nonaka else
2774 1.1 nonaka agc = 0x32 + (sc->lna[group] * 5) / 3;
2775 1.1 nonaka }
2776 1.1 nonaka run_set_agc(sc, agc);
2777 1.1 nonaka }
2778 1.1 nonaka
2779 1.1 nonaka static void
2780 1.1 nonaka run_rt2870_set_chan(struct run_softc *sc, u_int chan)
2781 1.1 nonaka {
2782 1.1 nonaka const struct rfprog *rfprog = rt2860_rf2850;
2783 1.1 nonaka uint32_t r2, r3, r4;
2784 1.1 nonaka int8_t txpow1, txpow2;
2785 1.1 nonaka int i;
2786 1.1 nonaka
2787 1.1 nonaka /* find the settings for this channel (we know it exists) */
2788 1.1 nonaka for (i = 0; rfprog[i].chan != chan; i++);
2789 1.1 nonaka
2790 1.1 nonaka r2 = rfprog[i].r2;
2791 1.1 nonaka if (sc->ntxchains == 1)
2792 1.1 nonaka r2 |= 1 << 12; /* 1T: disable Tx chain 2 */
2793 1.1 nonaka if (sc->nrxchains == 1)
2794 1.1 nonaka r2 |= 1 << 15 | 1 << 4; /* 1R: disable Rx chains 2 & 3 */
2795 1.1 nonaka else if (sc->nrxchains == 2)
2796 1.1 nonaka r2 |= 1 << 4; /* 2R: disable Rx chain 3 */
2797 1.1 nonaka
2798 1.1 nonaka /* use Tx power values from EEPROM */
2799 1.1 nonaka txpow1 = sc->txpow1[i];
2800 1.1 nonaka txpow2 = sc->txpow2[i];
2801 1.1 nonaka if (chan > 14) {
2802 1.1 nonaka if (txpow1 >= 0)
2803 1.1 nonaka txpow1 = txpow1 << 1 | 1;
2804 1.1 nonaka else
2805 1.1 nonaka txpow1 = (7 + txpow1) << 1;
2806 1.1 nonaka if (txpow2 >= 0)
2807 1.1 nonaka txpow2 = txpow2 << 1 | 1;
2808 1.1 nonaka else
2809 1.1 nonaka txpow2 = (7 + txpow2) << 1;
2810 1.1 nonaka }
2811 1.1 nonaka r3 = rfprog[i].r3 | txpow1 << 7;
2812 1.1 nonaka r4 = rfprog[i].r4 | sc->freq << 13 | txpow2 << 4;
2813 1.1 nonaka
2814 1.1 nonaka run_rt2870_rf_write(sc, RT2860_RF1, rfprog[i].r1);
2815 1.1 nonaka run_rt2870_rf_write(sc, RT2860_RF2, r2);
2816 1.1 nonaka run_rt2870_rf_write(sc, RT2860_RF3, r3);
2817 1.1 nonaka run_rt2870_rf_write(sc, RT2860_RF4, r4);
2818 1.1 nonaka
2819 1.10.6.11 skrll usbd_delay_ms(sc->sc_udev, 10);
2820 1.1 nonaka
2821 1.1 nonaka run_rt2870_rf_write(sc, RT2860_RF1, rfprog[i].r1);
2822 1.1 nonaka run_rt2870_rf_write(sc, RT2860_RF2, r2);
2823 1.1 nonaka run_rt2870_rf_write(sc, RT2860_RF3, r3 | 1);
2824 1.1 nonaka run_rt2870_rf_write(sc, RT2860_RF4, r4);
2825 1.1 nonaka
2826 1.10.6.11 skrll usbd_delay_ms(sc->sc_udev, 10);
2827 1.1 nonaka
2828 1.1 nonaka run_rt2870_rf_write(sc, RT2860_RF1, rfprog[i].r1);
2829 1.1 nonaka run_rt2870_rf_write(sc, RT2860_RF2, r2);
2830 1.1 nonaka run_rt2870_rf_write(sc, RT2860_RF3, r3);
2831 1.1 nonaka run_rt2870_rf_write(sc, RT2860_RF4, r4);
2832 1.1 nonaka }
2833 1.1 nonaka
2834 1.1 nonaka static void
2835 1.1 nonaka run_rt3070_set_chan(struct run_softc *sc, u_int chan)
2836 1.1 nonaka {
2837 1.1 nonaka int8_t txpow1, txpow2;
2838 1.1 nonaka uint8_t rf;
2839 1.1 nonaka int i;
2840 1.1 nonaka
2841 1.1 nonaka KASSERT(chan >= 1 && chan <= 14); /* RT3070 is 2GHz only */
2842 1.1 nonaka
2843 1.1 nonaka /* find the settings for this channel (we know it exists) */
2844 1.1 nonaka for (i = 0; rt2860_rf2850[i].chan != chan; i++)
2845 1.1 nonaka continue;
2846 1.1 nonaka
2847 1.1 nonaka /* use Tx power values from EEPROM */
2848 1.1 nonaka txpow1 = sc->txpow1[i];
2849 1.1 nonaka txpow2 = sc->txpow2[i];
2850 1.1 nonaka
2851 1.1 nonaka run_rt3070_rf_write(sc, 2, rt3070_freqs[i].n);
2852 1.1 nonaka run_rt3070_rf_write(sc, 3, rt3070_freqs[i].k);
2853 1.1 nonaka run_rt3070_rf_read(sc, 6, &rf);
2854 1.1 nonaka rf = (rf & ~0x03) | rt3070_freqs[i].r;
2855 1.1 nonaka run_rt3070_rf_write(sc, 6, rf);
2856 1.1 nonaka
2857 1.1 nonaka /* set Tx0 power */
2858 1.1 nonaka run_rt3070_rf_read(sc, 12, &rf);
2859 1.1 nonaka rf = (rf & ~0x1f) | txpow1;
2860 1.1 nonaka run_rt3070_rf_write(sc, 12, rf);
2861 1.1 nonaka
2862 1.1 nonaka /* set Tx1 power */
2863 1.1 nonaka run_rt3070_rf_read(sc, 13, &rf);
2864 1.1 nonaka rf = (rf & ~0x1f) | txpow2;
2865 1.1 nonaka run_rt3070_rf_write(sc, 13, rf);
2866 1.1 nonaka
2867 1.1 nonaka run_rt3070_rf_read(sc, 1, &rf);
2868 1.1 nonaka rf &= ~0xfc;
2869 1.1 nonaka if (sc->ntxchains == 1)
2870 1.1 nonaka rf |= 1 << 7 | 1 << 5; /* 1T: disable Tx chains 2 & 3 */
2871 1.1 nonaka else if (sc->ntxchains == 2)
2872 1.1 nonaka rf |= 1 << 7; /* 2T: disable Tx chain 3 */
2873 1.1 nonaka if (sc->nrxchains == 1)
2874 1.1 nonaka rf |= 1 << 6 | 1 << 4; /* 1R: disable Rx chains 2 & 3 */
2875 1.1 nonaka else if (sc->nrxchains == 2)
2876 1.1 nonaka rf |= 1 << 6; /* 2R: disable Rx chain 3 */
2877 1.1 nonaka run_rt3070_rf_write(sc, 1, rf);
2878 1.1 nonaka
2879 1.1 nonaka /* set RF offset */
2880 1.1 nonaka run_rt3070_rf_read(sc, 23, &rf);
2881 1.1 nonaka rf = (rf & ~0x7f) | sc->freq;
2882 1.1 nonaka run_rt3070_rf_write(sc, 23, rf);
2883 1.1 nonaka
2884 1.1 nonaka /* program RF filter */
2885 1.1 nonaka run_rt3070_rf_read(sc, 24, &rf); /* Tx */
2886 1.1 nonaka rf = (rf & ~0x3f) | sc->rf24_20mhz;
2887 1.1 nonaka run_rt3070_rf_write(sc, 24, rf);
2888 1.1 nonaka run_rt3070_rf_read(sc, 31, &rf); /* Rx */
2889 1.1 nonaka rf = (rf & ~0x3f) | sc->rf24_20mhz;
2890 1.1 nonaka run_rt3070_rf_write(sc, 31, rf);
2891 1.1 nonaka
2892 1.1 nonaka /* enable RF tuning */
2893 1.1 nonaka run_rt3070_rf_read(sc, 7, &rf);
2894 1.1 nonaka run_rt3070_rf_write(sc, 7, rf | 0x01);
2895 1.1 nonaka }
2896 1.1 nonaka
2897 1.1 nonaka static void
2898 1.1 nonaka run_rt3572_set_chan(struct run_softc *sc, u_int chan)
2899 1.1 nonaka {
2900 1.1 nonaka int8_t txpow1, txpow2;
2901 1.1 nonaka uint32_t tmp;
2902 1.1 nonaka uint8_t rf;
2903 1.1 nonaka int i;
2904 1.1 nonaka
2905 1.1 nonaka /* find the settings for this channel (we know it exists) */
2906 1.1 nonaka for (i = 0; rt2860_rf2850[i].chan != chan; i++);
2907 1.1 nonaka
2908 1.1 nonaka /* use Tx power values from EEPROM */
2909 1.1 nonaka txpow1 = sc->txpow1[i];
2910 1.1 nonaka txpow2 = sc->txpow2[i];
2911 1.1 nonaka
2912 1.1 nonaka if (chan <= 14) {
2913 1.1 nonaka run_bbp_write(sc, 25, sc->bbp25);
2914 1.1 nonaka run_bbp_write(sc, 26, sc->bbp26);
2915 1.1 nonaka } else {
2916 1.1 nonaka /* enable IQ phase correction */
2917 1.1 nonaka run_bbp_write(sc, 25, 0x09);
2918 1.1 nonaka run_bbp_write(sc, 26, 0xff);
2919 1.1 nonaka }
2920 1.1 nonaka
2921 1.1 nonaka run_rt3070_rf_write(sc, 2, rt3070_freqs[i].n);
2922 1.1 nonaka run_rt3070_rf_write(sc, 3, rt3070_freqs[i].k);
2923 1.1 nonaka run_rt3070_rf_read(sc, 6, &rf);
2924 1.1 nonaka rf = (rf & ~0x0f) | rt3070_freqs[i].r;
2925 1.1 nonaka rf |= (chan <= 14) ? 0x08 : 0x04;
2926 1.1 nonaka run_rt3070_rf_write(sc, 6, rf);
2927 1.1 nonaka
2928 1.1 nonaka /* set PLL mode */
2929 1.1 nonaka run_rt3070_rf_read(sc, 5, &rf);
2930 1.1 nonaka rf &= ~(0x08 | 0x04);
2931 1.1 nonaka rf |= (chan <= 14) ? 0x04 : 0x08;
2932 1.1 nonaka run_rt3070_rf_write(sc, 5, rf);
2933 1.1 nonaka
2934 1.1 nonaka /* set Tx power for chain 0 */
2935 1.1 nonaka if (chan <= 14)
2936 1.1 nonaka rf = 0x60 | txpow1;
2937 1.1 nonaka else
2938 1.1 nonaka rf = 0xe0 | (txpow1 & 0xc) << 1 | (txpow1 & 0x3);
2939 1.1 nonaka run_rt3070_rf_write(sc, 12, rf);
2940 1.1 nonaka
2941 1.1 nonaka /* set Tx power for chain 1 */
2942 1.1 nonaka if (chan <= 14)
2943 1.1 nonaka rf = 0x60 | txpow2;
2944 1.1 nonaka else
2945 1.1 nonaka rf = 0xe0 | (txpow2 & 0xc) << 1 | (txpow2 & 0x3);
2946 1.1 nonaka run_rt3070_rf_write(sc, 13, rf);
2947 1.1 nonaka
2948 1.1 nonaka /* set Tx/Rx streams */
2949 1.1 nonaka run_rt3070_rf_read(sc, 1, &rf);
2950 1.1 nonaka rf &= ~0xfc;
2951 1.1 nonaka if (sc->ntxchains == 1)
2952 1.1 nonaka rf |= 1 << 7 | 1 << 5; /* 1T: disable Tx chains 2 & 3 */
2953 1.1 nonaka else if (sc->ntxchains == 2)
2954 1.1 nonaka rf |= 1 << 7; /* 2T: disable Tx chain 3 */
2955 1.1 nonaka if (sc->nrxchains == 1)
2956 1.1 nonaka rf |= 1 << 6 | 1 << 4; /* 1R: disable Rx chains 2 & 3 */
2957 1.1 nonaka else if (sc->nrxchains == 2)
2958 1.1 nonaka rf |= 1 << 6; /* 2R: disable Rx chain 3 */
2959 1.1 nonaka run_rt3070_rf_write(sc, 1, rf);
2960 1.1 nonaka
2961 1.1 nonaka /* set RF offset */
2962 1.1 nonaka run_rt3070_rf_read(sc, 23, &rf);
2963 1.1 nonaka rf = (rf & ~0x7f) | sc->freq;
2964 1.1 nonaka run_rt3070_rf_write(sc, 23, rf);
2965 1.1 nonaka
2966 1.1 nonaka /* program RF filter */
2967 1.1 nonaka rf = sc->rf24_20mhz;
2968 1.1 nonaka run_rt3070_rf_write(sc, 24, rf); /* Tx */
2969 1.1 nonaka run_rt3070_rf_write(sc, 31, rf); /* Rx */
2970 1.1 nonaka
2971 1.1 nonaka /* enable RF tuning */
2972 1.1 nonaka run_rt3070_rf_read(sc, 7, &rf);
2973 1.1 nonaka rf = (chan <= 14) ? 0xd8 : ((rf & ~0xc8) | 0x14);
2974 1.1 nonaka run_rt3070_rf_write(sc, 7, rf);
2975 1.1 nonaka
2976 1.1 nonaka /* TSSI */
2977 1.1 nonaka rf = (chan <= 14) ? 0xc3 : 0xc0;
2978 1.1 nonaka run_rt3070_rf_write(sc, 9, rf);
2979 1.1 nonaka
2980 1.1 nonaka /* set loop filter 1 */
2981 1.1 nonaka run_rt3070_rf_write(sc, 10, 0xf1);
2982 1.1 nonaka /* set loop filter 2 */
2983 1.1 nonaka run_rt3070_rf_write(sc, 11, (chan <= 14) ? 0xb9 : 0x00);
2984 1.1 nonaka
2985 1.1 nonaka /* set tx_mx2_ic */
2986 1.1 nonaka run_rt3070_rf_write(sc, 15, (chan <= 14) ? 0x53 : 0x43);
2987 1.1 nonaka /* set tx_mx1_ic */
2988 1.1 nonaka if (chan <= 14)
2989 1.1 nonaka rf = 0x48 | sc->txmixgain_2ghz;
2990 1.1 nonaka else
2991 1.1 nonaka rf = 0x78 | sc->txmixgain_5ghz;
2992 1.1 nonaka run_rt3070_rf_write(sc, 16, rf);
2993 1.1 nonaka
2994 1.1 nonaka /* set tx_lo1 */
2995 1.1 nonaka run_rt3070_rf_write(sc, 17, 0x23);
2996 1.1 nonaka /* set tx_lo2 */
2997 1.1 nonaka if (chan <= 14)
2998 1.1 nonaka rf = 0x93;
2999 1.1 nonaka else if (chan <= 64)
3000 1.1 nonaka rf = 0xb7;
3001 1.1 nonaka else if (chan <= 128)
3002 1.1 nonaka rf = 0x74;
3003 1.1 nonaka else
3004 1.1 nonaka rf = 0x72;
3005 1.1 nonaka run_rt3070_rf_write(sc, 19, rf);
3006 1.1 nonaka
3007 1.1 nonaka /* set rx_lo1 */
3008 1.1 nonaka if (chan <= 14)
3009 1.1 nonaka rf = 0xb3;
3010 1.1 nonaka else if (chan <= 64)
3011 1.1 nonaka rf = 0xf6;
3012 1.1 nonaka else if (chan <= 128)
3013 1.1 nonaka rf = 0xf4;
3014 1.1 nonaka else
3015 1.1 nonaka rf = 0xf3;
3016 1.1 nonaka run_rt3070_rf_write(sc, 20, rf);
3017 1.1 nonaka
3018 1.1 nonaka /* set pfd_delay */
3019 1.1 nonaka if (chan <= 14)
3020 1.1 nonaka rf = 0x15;
3021 1.1 nonaka else if (chan <= 64)
3022 1.1 nonaka rf = 0x3d;
3023 1.1 nonaka else
3024 1.1 nonaka rf = 0x01;
3025 1.1 nonaka run_rt3070_rf_write(sc, 25, rf);
3026 1.1 nonaka
3027 1.1 nonaka /* set rx_lo2 */
3028 1.1 nonaka run_rt3070_rf_write(sc, 26, (chan <= 14) ? 0x85 : 0x87);
3029 1.1 nonaka /* set ldo_rf_vc */
3030 1.1 nonaka run_rt3070_rf_write(sc, 27, (chan <= 14) ? 0x00 : 0x01);
3031 1.1 nonaka /* set drv_cc */
3032 1.1 nonaka run_rt3070_rf_write(sc, 29, (chan <= 14) ? 0x9b : 0x9f);
3033 1.1 nonaka
3034 1.1 nonaka run_read(sc, RT2860_GPIO_CTRL, &tmp);
3035 1.1 nonaka tmp &= ~0x8080;
3036 1.1 nonaka if (chan <= 14)
3037 1.1 nonaka tmp |= 0x80;
3038 1.1 nonaka run_write(sc, RT2860_GPIO_CTRL, tmp);
3039 1.1 nonaka
3040 1.1 nonaka /* enable RF tuning */
3041 1.1 nonaka run_rt3070_rf_read(sc, 7, &rf);
3042 1.1 nonaka run_rt3070_rf_write(sc, 7, rf | 0x01);
3043 1.1 nonaka
3044 1.10.6.11 skrll usbd_delay_ms(sc->sc_udev, 2);
3045 1.10.6.11 skrll }
3046 1.10.6.11 skrll
3047 1.10.6.11 skrll static void
3048 1.10.6.11 skrll run_rt3593_set_chan(struct run_softc *sc, u_int chan)
3049 1.10.6.11 skrll {
3050 1.10.6.11 skrll int8_t txpow1, txpow2, txpow3;
3051 1.10.6.11 skrll uint8_t h20mhz, rf;
3052 1.10.6.11 skrll int i;
3053 1.10.6.11 skrll
3054 1.10.6.11 skrll /* find the settings for this channel (we know it exists) */
3055 1.10.6.11 skrll for (i = 0; rt2860_rf2850[i].chan != chan; i++);
3056 1.10.6.11 skrll
3057 1.10.6.11 skrll /* use Tx power values from EEPROM */
3058 1.10.6.11 skrll txpow1 = sc->txpow1[i];
3059 1.10.6.11 skrll txpow2 = sc->txpow2[i];
3060 1.10.6.11 skrll txpow3 = (sc->ntxchains == 3) ? sc->txpow3[i] : 0;
3061 1.10.6.11 skrll
3062 1.10.6.11 skrll if (chan <= 14) {
3063 1.10.6.11 skrll run_bbp_write(sc, 25, sc->bbp25);
3064 1.10.6.11 skrll run_bbp_write(sc, 26, sc->bbp26);
3065 1.10.6.11 skrll } else {
3066 1.10.6.11 skrll /* Enable IQ phase correction. */
3067 1.10.6.11 skrll run_bbp_write(sc, 25, 0x09);
3068 1.10.6.11 skrll run_bbp_write(sc, 26, 0xff);
3069 1.10.6.11 skrll }
3070 1.10.6.11 skrll
3071 1.10.6.11 skrll run_rt3070_rf_write(sc, 8, rt3070_freqs[i].n);
3072 1.10.6.11 skrll run_rt3070_rf_write(sc, 9, rt3070_freqs[i].k & 0x0f);
3073 1.10.6.11 skrll run_rt3070_rf_read(sc, 11, &rf);
3074 1.10.6.11 skrll rf = (rf & ~0x03) | (rt3070_freqs[i].r & 0x03);
3075 1.10.6.11 skrll run_rt3070_rf_write(sc, 11, rf);
3076 1.10.6.11 skrll
3077 1.10.6.11 skrll /* Set pll_idoh. */
3078 1.10.6.11 skrll run_rt3070_rf_read(sc, 11, &rf);
3079 1.10.6.11 skrll rf &= ~0x4c;
3080 1.10.6.11 skrll rf |= (chan <= 14) ? 0x44 : 0x48;
3081 1.10.6.11 skrll run_rt3070_rf_write(sc, 11, rf);
3082 1.10.6.11 skrll
3083 1.10.6.11 skrll if (chan <= 14)
3084 1.10.6.11 skrll rf = txpow1 & 0x1f;
3085 1.10.6.11 skrll else
3086 1.10.6.11 skrll rf = 0x40 | ((txpow1 & 0x18) << 1) | (txpow1 & 0x07);
3087 1.10.6.11 skrll run_rt3070_rf_write(sc, 53, rf);
3088 1.10.6.11 skrll
3089 1.10.6.11 skrll if (chan <= 14)
3090 1.10.6.11 skrll rf = txpow2 & 0x1f;
3091 1.10.6.11 skrll else
3092 1.10.6.11 skrll rf = 0x40 | ((txpow2 & 0x18) << 1) | (txpow2 & 0x07);
3093 1.10.6.11 skrll run_rt3070_rf_write(sc, 55, rf);
3094 1.10.6.11 skrll
3095 1.10.6.11 skrll if (chan <= 14)
3096 1.10.6.11 skrll rf = txpow3 & 0x1f;
3097 1.10.6.11 skrll else
3098 1.10.6.11 skrll rf = 0x40 | ((txpow3 & 0x18) << 1) | (txpow3 & 0x07);
3099 1.10.6.11 skrll run_rt3070_rf_write(sc, 54, rf);
3100 1.10.6.11 skrll
3101 1.10.6.11 skrll rf = RT3070_RF_BLOCK | RT3070_PLL_PD;
3102 1.10.6.11 skrll if (sc->ntxchains == 3)
3103 1.10.6.11 skrll rf |= RT3070_TX0_PD | RT3070_TX1_PD | RT3070_TX2_PD;
3104 1.10.6.11 skrll else
3105 1.10.6.11 skrll rf |= RT3070_TX0_PD | RT3070_TX1_PD;
3106 1.10.6.11 skrll rf |= RT3070_RX0_PD | RT3070_RX1_PD | RT3070_RX2_PD;
3107 1.10.6.11 skrll run_rt3070_rf_write(sc, 1, rf);
3108 1.10.6.11 skrll
3109 1.10.6.11 skrll run_adjust_freq_offset(sc);
3110 1.10.6.11 skrll
3111 1.10.6.11 skrll run_rt3070_rf_write(sc, 31, (chan <= 14) ? 0xa0 : 0x80);
3112 1.10.6.11 skrll
3113 1.10.6.11 skrll h20mhz = (sc->rf24_20mhz & 0x20) >> 5;
3114 1.10.6.11 skrll run_rt3070_rf_read(sc, 30, &rf);
3115 1.10.6.11 skrll rf = (rf & ~0x06) | (h20mhz << 1) | (h20mhz << 2);
3116 1.10.6.11 skrll run_rt3070_rf_write(sc, 30, rf);
3117 1.10.6.11 skrll
3118 1.10.6.11 skrll run_rt3070_rf_read(sc, 36, &rf);
3119 1.10.6.11 skrll if (chan <= 14)
3120 1.10.6.11 skrll rf |= 0x80;
3121 1.10.6.11 skrll else
3122 1.10.6.11 skrll rf &= ~0x80;
3123 1.10.6.11 skrll run_rt3070_rf_write(sc, 36, rf);
3124 1.10.6.11 skrll
3125 1.10.6.11 skrll /* Set vcolo_bs. */
3126 1.10.6.11 skrll run_rt3070_rf_write(sc, 34, (chan <= 14) ? 0x3c : 0x20);
3127 1.10.6.11 skrll /* Set pfd_delay. */
3128 1.10.6.11 skrll run_rt3070_rf_write(sc, 12, (chan <= 14) ? 0x1a : 0x12);
3129 1.10.6.11 skrll
3130 1.10.6.11 skrll /* Set vco bias current control. */
3131 1.10.6.11 skrll run_rt3070_rf_read(sc, 6, &rf);
3132 1.10.6.11 skrll rf &= ~0xc0;
3133 1.10.6.11 skrll if (chan <= 14)
3134 1.10.6.11 skrll rf |= 0x40;
3135 1.10.6.11 skrll else if (chan <= 128)
3136 1.10.6.11 skrll rf |= 0x80;
3137 1.10.6.11 skrll else
3138 1.10.6.11 skrll rf |= 0x40;
3139 1.10.6.11 skrll run_rt3070_rf_write(sc, 6, rf);
3140 1.10.6.11 skrll
3141 1.10.6.11 skrll run_rt3070_rf_read(sc, 30, &rf);
3142 1.10.6.11 skrll rf = (rf & ~0x18) | 0x10;
3143 1.10.6.11 skrll run_rt3070_rf_write(sc, 30, rf);
3144 1.10.6.11 skrll
3145 1.10.6.11 skrll run_rt3070_rf_write(sc, 10, (chan <= 14) ? 0xd3 : 0xd8);
3146 1.10.6.11 skrll run_rt3070_rf_write(sc, 13, (chan <= 14) ? 0x12 : 0x23);
3147 1.10.6.11 skrll
3148 1.10.6.11 skrll run_rt3070_rf_read(sc, 51, &rf);
3149 1.10.6.11 skrll rf = (rf & ~0x03) | 0x01;
3150 1.10.6.11 skrll run_rt3070_rf_write(sc, 51, rf);
3151 1.10.6.11 skrll /* Set tx_mx1_cc. */
3152 1.10.6.11 skrll run_rt3070_rf_read(sc, 51, &rf);
3153 1.10.6.11 skrll rf &= ~0x1c;
3154 1.10.6.11 skrll rf |= (chan <= 14) ? 0x14 : 0x10;
3155 1.10.6.11 skrll run_rt3070_rf_write(sc, 51, rf);
3156 1.10.6.11 skrll /* Set tx_mx1_ic. */
3157 1.10.6.11 skrll run_rt3070_rf_read(sc, 51, &rf);
3158 1.10.6.11 skrll rf &= ~0xe0;
3159 1.10.6.11 skrll rf |= (chan <= 14) ? 0x60 : 0x40;
3160 1.10.6.11 skrll run_rt3070_rf_write(sc, 51, rf);
3161 1.10.6.11 skrll /* Set tx_lo1_ic. */
3162 1.10.6.11 skrll run_rt3070_rf_read(sc, 49, &rf);
3163 1.10.6.11 skrll rf &= ~0x1c;
3164 1.10.6.11 skrll rf |= (chan <= 14) ? 0x0c : 0x08;
3165 1.10.6.11 skrll run_rt3070_rf_write(sc, 49, rf);
3166 1.10.6.11 skrll /* Set tx_lo1_en. */
3167 1.10.6.11 skrll run_rt3070_rf_read(sc, 50, &rf);
3168 1.10.6.11 skrll run_rt3070_rf_write(sc, 50, rf & ~0x20);
3169 1.10.6.11 skrll /* Set drv_cc. */
3170 1.10.6.11 skrll run_rt3070_rf_read(sc, 57, &rf);
3171 1.10.6.11 skrll rf &= ~0xfc;
3172 1.10.6.11 skrll rf |= (chan <= 14) ? 0x6c : 0x3c;
3173 1.10.6.11 skrll run_rt3070_rf_write(sc, 57, rf);
3174 1.10.6.11 skrll /* Set rx_mix1_ic, rxa_lnactr, lna_vc, lna_inbias_en and lna_en. */
3175 1.10.6.11 skrll run_rt3070_rf_write(sc, 44, (chan <= 14) ? 0x93 : 0x9b);
3176 1.10.6.11 skrll /* Set drv_gnd_a, tx_vga_cc_a and tx_mx2_gain. */
3177 1.10.6.11 skrll run_rt3070_rf_write(sc, 52, (chan <= 14) ? 0x45 : 0x05);
3178 1.10.6.11 skrll /* Enable VCO calibration. */
3179 1.10.6.11 skrll run_rt3070_rf_read(sc, 3, &rf);
3180 1.10.6.11 skrll rf &= ~RT5390_VCOCAL;
3181 1.10.6.11 skrll rf |= (chan <= 14) ? RT5390_VCOCAL : 0xbe;
3182 1.10.6.11 skrll run_rt3070_rf_write(sc, 3, rf);
3183 1.10.6.11 skrll
3184 1.10.6.11 skrll if (chan <= 14)
3185 1.10.6.11 skrll rf = 0x23;
3186 1.10.6.11 skrll else if (chan <= 64)
3187 1.10.6.11 skrll rf = 0x36;
3188 1.10.6.11 skrll else if (chan <= 128)
3189 1.10.6.11 skrll rf = 0x32;
3190 1.10.6.11 skrll else
3191 1.10.6.11 skrll rf = 0x30;
3192 1.10.6.11 skrll run_rt3070_rf_write(sc, 39, rf);
3193 1.10.6.11 skrll if (chan <= 14)
3194 1.10.6.11 skrll rf = 0xbb;
3195 1.10.6.11 skrll else if (chan <= 64)
3196 1.10.6.11 skrll rf = 0xeb;
3197 1.10.6.11 skrll else if (chan <= 128)
3198 1.10.6.11 skrll rf = 0xb3;
3199 1.10.6.11 skrll else
3200 1.10.6.11 skrll rf = 0x9b;
3201 1.10.6.11 skrll run_rt3070_rf_write(sc, 45, rf);
3202 1.10.6.11 skrll
3203 1.10.6.11 skrll /* Set FEQ/AEQ control. */
3204 1.10.6.11 skrll run_bbp_write(sc, 105, 0x34);
3205 1.10.6.11 skrll }
3206 1.10.6.11 skrll
3207 1.10.6.11 skrll static void
3208 1.10.6.11 skrll run_rt5390_set_chan(struct run_softc *sc, u_int chan)
3209 1.10.6.11 skrll {
3210 1.10.6.11 skrll int8_t txpow1, txpow2;
3211 1.10.6.11 skrll uint8_t rf;
3212 1.10.6.11 skrll int i;
3213 1.10.6.11 skrll
3214 1.10.6.11 skrll /* find the settings for this channel (we know it exists) */
3215 1.10.6.11 skrll for (i = 0; rt2860_rf2850[i].chan != chan; i++);
3216 1.10.6.11 skrll
3217 1.10.6.11 skrll /* use Tx power values from EEPROM */
3218 1.10.6.11 skrll txpow1 = sc->txpow1[i];
3219 1.10.6.11 skrll txpow2 = sc->txpow2[i];
3220 1.10.6.11 skrll
3221 1.10.6.11 skrll run_rt3070_rf_write(sc, 8, rt3070_freqs[i].n);
3222 1.10.6.11 skrll run_rt3070_rf_write(sc, 9, rt3070_freqs[i].k & 0x0f);
3223 1.10.6.11 skrll run_rt3070_rf_read(sc, 11, &rf);
3224 1.10.6.11 skrll rf = (rf & ~0x03) | (rt3070_freqs[i].r & 0x03);
3225 1.10.6.11 skrll run_rt3070_rf_write(sc, 11, rf);
3226 1.10.6.11 skrll
3227 1.10.6.11 skrll run_rt3070_rf_read(sc, 49, &rf);
3228 1.10.6.11 skrll rf = (rf & ~0x3f) | (txpow1 & 0x3f);
3229 1.10.6.11 skrll /* The valid range of the RF R49 is 0x00 to 0x27. */
3230 1.10.6.11 skrll if ((rf & 0x3f) > 0x27)
3231 1.10.6.11 skrll rf = (rf & ~0x3f) | 0x27;
3232 1.10.6.11 skrll run_rt3070_rf_write(sc, 49, rf);
3233 1.10.6.11 skrll
3234 1.10.6.11 skrll if (sc->mac_ver == 0x5392) {
3235 1.10.6.11 skrll run_rt3070_rf_read(sc, 50, &rf);
3236 1.10.6.11 skrll rf = (rf & ~0x3f) | (txpow2 & 0x3f);
3237 1.10.6.11 skrll /* The valid range of the RF R50 is 0x00 to 0x27. */
3238 1.10.6.11 skrll if ((rf & 0x3f) > 0x27)
3239 1.10.6.11 skrll rf = (rf & ~0x3f) | 0x27;
3240 1.10.6.11 skrll run_rt3070_rf_write(sc, 50, rf);
3241 1.10.6.11 skrll }
3242 1.10.6.11 skrll
3243 1.10.6.11 skrll run_rt3070_rf_read(sc, 1, &rf);
3244 1.10.6.11 skrll rf |= RT3070_RF_BLOCK | RT3070_PLL_PD | RT3070_RX0_PD | RT3070_TX0_PD;
3245 1.10.6.11 skrll if (sc->mac_ver == 0x5392)
3246 1.10.6.11 skrll rf |= RT3070_RX1_PD | RT3070_TX1_PD;
3247 1.10.6.11 skrll run_rt3070_rf_write(sc, 1, rf);
3248 1.10.6.11 skrll
3249 1.10.6.11 skrll if (sc->mac_ver != 0x5392) {
3250 1.10.6.11 skrll run_rt3070_rf_read(sc, 2, &rf);
3251 1.10.6.11 skrll rf |= 0x80;
3252 1.10.6.11 skrll run_rt3070_rf_write(sc, 2, rf);
3253 1.10.6.11 skrll usbd_delay_ms(sc->sc_udev, 10);
3254 1.10.6.11 skrll rf &= 0x7f;
3255 1.10.6.11 skrll run_rt3070_rf_write(sc, 2, rf);
3256 1.10.6.11 skrll }
3257 1.10.6.11 skrll
3258 1.10.6.11 skrll run_adjust_freq_offset(sc);
3259 1.10.6.11 skrll
3260 1.10.6.11 skrll if (sc->mac_ver == 0x5392) {
3261 1.10.6.11 skrll /* Fix for RT5392C. */
3262 1.10.6.11 skrll if (sc->mac_rev >= 0x0223) {
3263 1.10.6.11 skrll if (chan <= 4)
3264 1.10.6.11 skrll rf = 0x0f;
3265 1.10.6.11 skrll else if (chan >= 5 && chan <= 7)
3266 1.10.6.11 skrll rf = 0x0e;
3267 1.10.6.11 skrll else
3268 1.10.6.11 skrll rf = 0x0d;
3269 1.10.6.11 skrll run_rt3070_rf_write(sc, 23, rf);
3270 1.10.6.11 skrll
3271 1.10.6.11 skrll if (chan <= 4)
3272 1.10.6.11 skrll rf = 0x0c;
3273 1.10.6.11 skrll else if (chan == 5)
3274 1.10.6.11 skrll rf = 0x0b;
3275 1.10.6.11 skrll else if (chan >= 6 && chan <= 7)
3276 1.10.6.11 skrll rf = 0x0a;
3277 1.10.6.11 skrll else if (chan >= 8 && chan <= 10)
3278 1.10.6.11 skrll rf = 0x09;
3279 1.10.6.11 skrll else
3280 1.10.6.11 skrll rf = 0x08;
3281 1.10.6.11 skrll run_rt3070_rf_write(sc, 59, rf);
3282 1.10.6.11 skrll } else {
3283 1.10.6.11 skrll if (chan <= 11)
3284 1.10.6.11 skrll rf = 0x0f;
3285 1.10.6.11 skrll else
3286 1.10.6.11 skrll rf = 0x0b;
3287 1.10.6.11 skrll run_rt3070_rf_write(sc, 59, rf);
3288 1.10.6.11 skrll }
3289 1.10.6.11 skrll } else {
3290 1.10.6.11 skrll /* Fix for RT5390F. */
3291 1.10.6.11 skrll if (sc->mac_rev >= 0x0502) {
3292 1.10.6.11 skrll if (chan <= 11)
3293 1.10.6.11 skrll rf = 0x43;
3294 1.10.6.11 skrll else
3295 1.10.6.11 skrll rf = 0x23;
3296 1.10.6.11 skrll run_rt3070_rf_write(sc, 55, rf);
3297 1.10.6.11 skrll
3298 1.10.6.11 skrll if (chan <= 11)
3299 1.10.6.11 skrll rf = 0x0f;
3300 1.10.6.11 skrll else if (chan == 12)
3301 1.10.6.11 skrll rf = 0x0d;
3302 1.10.6.11 skrll else
3303 1.10.6.11 skrll rf = 0x0b;
3304 1.10.6.11 skrll run_rt3070_rf_write(sc, 59, rf);
3305 1.10.6.11 skrll } else {
3306 1.10.6.11 skrll run_rt3070_rf_write(sc, 55, 0x44);
3307 1.10.6.11 skrll run_rt3070_rf_write(sc, 59, 0x8f);
3308 1.10.6.11 skrll }
3309 1.10.6.11 skrll }
3310 1.10.6.11 skrll
3311 1.10.6.11 skrll /* Enable VCO calibration. */
3312 1.10.6.11 skrll run_rt3070_rf_read(sc, 3, &rf);
3313 1.10.6.11 skrll rf |= RT5390_VCOCAL;
3314 1.10.6.11 skrll run_rt3070_rf_write(sc, 3, rf);
3315 1.10.6.11 skrll }
3316 1.10.6.11 skrll
3317 1.10.6.11 skrll static void
3318 1.10.6.11 skrll run_rt5592_set_chan(struct run_softc *sc, u_int chan)
3319 1.10.6.11 skrll {
3320 1.10.6.11 skrll const struct rt5592_freqs *freqs;
3321 1.10.6.11 skrll uint32_t tmp;
3322 1.10.6.11 skrll uint8_t reg, rf, txpow_bound;
3323 1.10.6.11 skrll int8_t txpow1, txpow2;
3324 1.10.6.11 skrll int i;
3325 1.10.6.11 skrll
3326 1.10.6.11 skrll run_read(sc, RT5592_DEBUG_INDEX, &tmp);
3327 1.10.6.11 skrll freqs = (tmp & RT5592_SEL_XTAL) ?
3328 1.10.6.11 skrll rt5592_freqs_40mhz : rt5592_freqs_20mhz;
3329 1.10.6.11 skrll
3330 1.10.6.11 skrll /* find the settings for this channel (we know it exists) */
3331 1.10.6.11 skrll for (i = 0; rt2860_rf2850[i].chan != chan; i++, freqs++);
3332 1.10.6.11 skrll
3333 1.10.6.11 skrll /* use Tx power values from EEPROM */
3334 1.10.6.11 skrll txpow1 = sc->txpow1[i];
3335 1.10.6.11 skrll txpow2 = sc->txpow2[i];
3336 1.10.6.11 skrll
3337 1.10.6.11 skrll run_read(sc, RT3070_LDO_CFG0, &tmp);
3338 1.10.6.11 skrll tmp &= ~0x1c000000;
3339 1.10.6.11 skrll if (chan > 14)
3340 1.10.6.11 skrll tmp |= 0x14000000;
3341 1.10.6.11 skrll run_write(sc, RT3070_LDO_CFG0, tmp);
3342 1.10.6.11 skrll
3343 1.10.6.11 skrll /* N setting. */
3344 1.10.6.11 skrll run_rt3070_rf_write(sc, 8, freqs->n & 0xff);
3345 1.10.6.11 skrll run_rt3070_rf_read(sc, 9, &rf);
3346 1.10.6.11 skrll rf &= ~(1 << 4);
3347 1.10.6.11 skrll rf |= ((freqs->n & 0x0100) >> 8) << 4;
3348 1.10.6.11 skrll run_rt3070_rf_write(sc, 9, rf);
3349 1.10.6.11 skrll
3350 1.10.6.11 skrll /* K setting. */
3351 1.10.6.11 skrll run_rt3070_rf_read(sc, 9, &rf);
3352 1.10.6.11 skrll rf &= ~0x0f;
3353 1.10.6.11 skrll rf |= (freqs->k & 0x0f);
3354 1.10.6.11 skrll run_rt3070_rf_write(sc, 9, rf);
3355 1.10.6.11 skrll
3356 1.10.6.11 skrll /* Mode setting. */
3357 1.10.6.11 skrll run_rt3070_rf_read(sc, 11, &rf);
3358 1.10.6.11 skrll rf &= ~0x0c;
3359 1.10.6.11 skrll rf |= ((freqs->m - 0x8) & 0x3) << 2;
3360 1.10.6.11 skrll run_rt3070_rf_write(sc, 11, rf);
3361 1.10.6.11 skrll run_rt3070_rf_read(sc, 9, &rf);
3362 1.10.6.11 skrll rf &= ~(1 << 7);
3363 1.10.6.11 skrll rf |= (((freqs->m - 0x8) & 0x4) >> 2) << 7;
3364 1.10.6.11 skrll run_rt3070_rf_write(sc, 9, rf);
3365 1.10.6.11 skrll
3366 1.10.6.11 skrll /* R setting. */
3367 1.10.6.11 skrll run_rt3070_rf_read(sc, 11, &rf);
3368 1.10.6.11 skrll rf &= ~0x03;
3369 1.10.6.11 skrll rf |= (freqs->r - 0x1);
3370 1.10.6.11 skrll run_rt3070_rf_write(sc, 11, rf);
3371 1.10.6.11 skrll
3372 1.10.6.11 skrll if (chan <= 14) {
3373 1.10.6.11 skrll /* Initialize RF registers for 2GHZ. */
3374 1.10.6.11 skrll for (i = 0; i < (int)__arraycount(rt5592_2ghz_def_rf); i++) {
3375 1.10.6.11 skrll run_rt3070_rf_write(sc, rt5592_2ghz_def_rf[i].reg,
3376 1.10.6.11 skrll rt5592_2ghz_def_rf[i].val);
3377 1.10.6.11 skrll }
3378 1.10.6.11 skrll
3379 1.10.6.11 skrll rf = (chan <= 10) ? 0x07 : 0x06;
3380 1.10.6.11 skrll run_rt3070_rf_write(sc, 23, rf);
3381 1.10.6.11 skrll run_rt3070_rf_write(sc, 59, rf);
3382 1.10.6.11 skrll
3383 1.10.6.11 skrll run_rt3070_rf_write(sc, 55, 0x43);
3384 1.10.6.11 skrll
3385 1.10.6.11 skrll /*
3386 1.10.6.11 skrll * RF R49/R50 Tx power ALC code.
3387 1.10.6.11 skrll * G-band bit<7:6>=1:0, bit<5:0> range from 0x0 ~ 0x27.
3388 1.10.6.11 skrll */
3389 1.10.6.11 skrll reg = 2;
3390 1.10.6.11 skrll txpow_bound = 0x27;
3391 1.10.6.11 skrll } else {
3392 1.10.6.11 skrll /* Initialize RF registers for 5GHZ. */
3393 1.10.6.11 skrll for (i = 0; i < (int)__arraycount(rt5592_5ghz_def_rf); i++) {
3394 1.10.6.11 skrll run_rt3070_rf_write(sc, rt5592_5ghz_def_rf[i].reg,
3395 1.10.6.11 skrll rt5592_5ghz_def_rf[i].val);
3396 1.10.6.11 skrll }
3397 1.10.6.11 skrll for (i = 0; i < (int)__arraycount(rt5592_chan_5ghz); i++) {
3398 1.10.6.11 skrll if (chan >= rt5592_chan_5ghz[i].firstchan &&
3399 1.10.6.11 skrll chan <= rt5592_chan_5ghz[i].lastchan) {
3400 1.10.6.11 skrll run_rt3070_rf_write(sc, rt5592_chan_5ghz[i].reg,
3401 1.10.6.11 skrll rt5592_chan_5ghz[i].val);
3402 1.10.6.11 skrll }
3403 1.10.6.11 skrll }
3404 1.10.6.11 skrll
3405 1.10.6.11 skrll /*
3406 1.10.6.11 skrll * RF R49/R50 Tx power ALC code.
3407 1.10.6.11 skrll * A-band bit<7:6>=1:1, bit<5:0> range from 0x0 ~ 0x2b.
3408 1.10.6.11 skrll */
3409 1.10.6.11 skrll reg = 3;
3410 1.10.6.11 skrll txpow_bound = 0x2b;
3411 1.10.6.11 skrll }
3412 1.10.6.11 skrll
3413 1.10.6.11 skrll /* RF R49 ch0 Tx power ALC code. */
3414 1.10.6.11 skrll run_rt3070_rf_read(sc, 49, &rf);
3415 1.10.6.11 skrll rf &= ~0xc0;
3416 1.10.6.11 skrll rf |= (reg << 6);
3417 1.10.6.11 skrll rf = (rf & ~0x3f) | (txpow1 & 0x3f);
3418 1.10.6.11 skrll if ((rf & 0x3f) > txpow_bound)
3419 1.10.6.11 skrll rf = (rf & ~0x3f) | txpow_bound;
3420 1.10.6.11 skrll run_rt3070_rf_write(sc, 49, rf);
3421 1.10.6.11 skrll
3422 1.10.6.11 skrll /* RF R50 ch1 Tx power ALC code. */
3423 1.10.6.11 skrll run_rt3070_rf_read(sc, 50, &rf);
3424 1.10.6.11 skrll rf &= ~(1 << 7 | 1 << 6);
3425 1.10.6.11 skrll rf |= (reg << 6);
3426 1.10.6.11 skrll rf = (rf & ~0x3f) | (txpow2 & 0x3f);
3427 1.10.6.11 skrll if ((rf & 0x3f) > txpow_bound)
3428 1.10.6.11 skrll rf = (rf & ~0x3f) | txpow_bound;
3429 1.10.6.11 skrll run_rt3070_rf_write(sc, 50, rf);
3430 1.10.6.11 skrll
3431 1.10.6.11 skrll /* Enable RF_BLOCK, PLL_PD, RX0_PD, and TX0_PD. */
3432 1.10.6.11 skrll run_rt3070_rf_read(sc, 1, &rf);
3433 1.10.6.11 skrll rf |= (RT3070_RF_BLOCK | RT3070_PLL_PD | RT3070_RX0_PD | RT3070_TX0_PD);
3434 1.10.6.11 skrll if (sc->ntxchains > 1)
3435 1.10.6.11 skrll rf |= RT3070_TX1_PD;
3436 1.10.6.11 skrll if (sc->nrxchains > 1)
3437 1.10.6.11 skrll rf |= RT3070_RX1_PD;
3438 1.10.6.11 skrll run_rt3070_rf_write(sc, 1, rf);
3439 1.10.6.11 skrll
3440 1.10.6.11 skrll run_rt3070_rf_write(sc, 6, 0xe4);
3441 1.10.6.11 skrll
3442 1.10.6.11 skrll run_rt3070_rf_write(sc, 30, 0x10);
3443 1.10.6.11 skrll run_rt3070_rf_write(sc, 31, 0x80);
3444 1.10.6.11 skrll run_rt3070_rf_write(sc, 32, 0x80);
3445 1.10.6.11 skrll
3446 1.10.6.11 skrll run_adjust_freq_offset(sc);
3447 1.10.6.11 skrll
3448 1.10.6.11 skrll /* Enable VCO calibration. */
3449 1.10.6.11 skrll run_rt3070_rf_read(sc, 3, &rf);
3450 1.10.6.11 skrll rf |= RT5390_VCOCAL;
3451 1.10.6.11 skrll run_rt3070_rf_write(sc, 3, rf);
3452 1.10.6.11 skrll }
3453 1.10.6.11 skrll
3454 1.10.6.11 skrll static void
3455 1.10.6.11 skrll run_iq_calib(struct run_softc *sc, u_int chan)
3456 1.10.6.11 skrll {
3457 1.10.6.11 skrll uint16_t val;
3458 1.10.6.11 skrll
3459 1.10.6.11 skrll /* Tx0 IQ gain. */
3460 1.10.6.11 skrll run_bbp_write(sc, 158, 0x2c);
3461 1.10.6.11 skrll if (chan <= 14)
3462 1.10.6.11 skrll run_efuse_read(sc, RT5390_EEPROM_IQ_GAIN_CAL_TX0_2GHZ, &val, 1);
3463 1.10.6.11 skrll else if (chan <= 64) {
3464 1.10.6.11 skrll run_efuse_read(sc,
3465 1.10.6.11 skrll RT5390_EEPROM_IQ_GAIN_CAL_TX0_CH36_TO_CH64_5GHZ,
3466 1.10.6.11 skrll &val, 1);
3467 1.10.6.11 skrll } else if (chan <= 138) {
3468 1.10.6.11 skrll run_efuse_read(sc,
3469 1.10.6.11 skrll RT5390_EEPROM_IQ_GAIN_CAL_TX0_CH100_TO_CH138_5GHZ,
3470 1.10.6.11 skrll &val, 1);
3471 1.10.6.11 skrll } else if (chan <= 165) {
3472 1.10.6.11 skrll run_efuse_read(sc,
3473 1.10.6.11 skrll RT5390_EEPROM_IQ_GAIN_CAL_TX0_CH140_TO_CH165_5GHZ,
3474 1.10.6.11 skrll &val, 1);
3475 1.10.6.11 skrll } else
3476 1.10.6.11 skrll val = 0;
3477 1.10.6.11 skrll run_bbp_write(sc, 159, val);
3478 1.10.6.11 skrll
3479 1.10.6.11 skrll /* Tx0 IQ phase. */
3480 1.10.6.11 skrll run_bbp_write(sc, 158, 0x2d);
3481 1.10.6.11 skrll if (chan <= 14) {
3482 1.10.6.11 skrll run_efuse_read(sc, RT5390_EEPROM_IQ_PHASE_CAL_TX0_2GHZ,
3483 1.10.6.11 skrll &val, 1);
3484 1.10.6.11 skrll } else if (chan <= 64) {
3485 1.10.6.11 skrll run_efuse_read(sc,
3486 1.10.6.11 skrll RT5390_EEPROM_IQ_PHASE_CAL_TX0_CH36_TO_CH64_5GHZ,
3487 1.10.6.11 skrll &val, 1);
3488 1.10.6.11 skrll } else if (chan <= 138) {
3489 1.10.6.11 skrll run_efuse_read(sc,
3490 1.10.6.11 skrll RT5390_EEPROM_IQ_PHASE_CAL_TX0_CH100_TO_CH138_5GHZ,
3491 1.10.6.11 skrll &val, 1);
3492 1.10.6.11 skrll } else if (chan <= 165) {
3493 1.10.6.11 skrll run_efuse_read(sc,
3494 1.10.6.11 skrll RT5390_EEPROM_IQ_PHASE_CAL_TX0_CH140_TO_CH165_5GHZ,
3495 1.10.6.11 skrll &val, 1);
3496 1.10.6.11 skrll } else
3497 1.10.6.11 skrll val = 0;
3498 1.10.6.11 skrll run_bbp_write(sc, 159, val);
3499 1.10.6.11 skrll
3500 1.10.6.11 skrll /* Tx1 IQ gain. */
3501 1.10.6.11 skrll run_bbp_write(sc, 158, 0x4a);
3502 1.10.6.11 skrll if (chan <= 14) {
3503 1.10.6.11 skrll run_efuse_read(sc, RT5390_EEPROM_IQ_GAIN_CAL_TX1_2GHZ,
3504 1.10.6.11 skrll &val, 1);
3505 1.10.6.11 skrll } else if (chan <= 64) {
3506 1.10.6.11 skrll run_efuse_read(sc,
3507 1.10.6.11 skrll RT5390_EEPROM_IQ_GAIN_CAL_TX1_CH36_TO_CH64_5GHZ,
3508 1.10.6.11 skrll &val, 1);
3509 1.10.6.11 skrll } else if (chan <= 138) {
3510 1.10.6.11 skrll run_efuse_read(sc,
3511 1.10.6.11 skrll RT5390_EEPROM_IQ_GAIN_CAL_TX1_CH100_TO_CH138_5GHZ,
3512 1.10.6.11 skrll &val, 1);
3513 1.10.6.11 skrll } else if (chan <= 165) {
3514 1.10.6.11 skrll run_efuse_read(sc,
3515 1.10.6.11 skrll RT5390_EEPROM_IQ_GAIN_CAL_TX1_CH140_TO_CH165_5GHZ,
3516 1.10.6.11 skrll &val, 1);
3517 1.10.6.11 skrll } else
3518 1.10.6.11 skrll val = 0;
3519 1.10.6.11 skrll run_bbp_write(sc, 159, val);
3520 1.10.6.11 skrll
3521 1.10.6.11 skrll /* Tx1 IQ phase. */
3522 1.10.6.11 skrll run_bbp_write(sc, 158, 0x4b);
3523 1.10.6.11 skrll if (chan <= 14) {
3524 1.10.6.11 skrll run_efuse_read(sc, RT5390_EEPROM_IQ_PHASE_CAL_TX1_2GHZ,
3525 1.10.6.11 skrll &val, 1);
3526 1.10.6.11 skrll } else if (chan <= 64) {
3527 1.10.6.11 skrll run_efuse_read(sc,
3528 1.10.6.11 skrll RT5390_EEPROM_IQ_PHASE_CAL_TX1_CH36_TO_CH64_5GHZ,
3529 1.10.6.11 skrll &val, 1);
3530 1.10.6.11 skrll } else if (chan <= 138) {
3531 1.10.6.11 skrll run_efuse_read(sc,
3532 1.10.6.11 skrll RT5390_EEPROM_IQ_PHASE_CAL_TX1_CH100_TO_CH138_5GHZ,
3533 1.10.6.11 skrll &val, 1);
3534 1.10.6.11 skrll } else if (chan <= 165) {
3535 1.10.6.11 skrll run_efuse_read(sc,
3536 1.10.6.11 skrll RT5390_EEPROM_IQ_PHASE_CAL_TX1_CH140_TO_CH165_5GHZ,
3537 1.10.6.11 skrll &val, 1);
3538 1.10.6.11 skrll } else
3539 1.10.6.11 skrll val = 0;
3540 1.10.6.11 skrll run_bbp_write(sc, 159, val);
3541 1.10.6.11 skrll
3542 1.10.6.11 skrll /* RF IQ compensation control. */
3543 1.10.6.11 skrll run_bbp_write(sc, 158, 0x04);
3544 1.10.6.11 skrll run_efuse_read(sc, RT5390_EEPROM_RF_IQ_COMPENSATION_CTL,
3545 1.10.6.11 skrll &val, 1);
3546 1.10.6.11 skrll run_bbp_write(sc, 159, val);
3547 1.10.6.11 skrll
3548 1.10.6.11 skrll /* RF IQ imbalance compensation control. */
3549 1.10.6.11 skrll run_bbp_write(sc, 158, 0x03);
3550 1.10.6.11 skrll run_efuse_read(sc,
3551 1.10.6.11 skrll RT5390_EEPROM_RF_IQ_IMBALANCE_COMPENSATION_CTL, &val, 1);
3552 1.10.6.11 skrll run_bbp_write(sc, 159, val);
3553 1.1 nonaka }
3554 1.1 nonaka
3555 1.1 nonaka static void
3556 1.1 nonaka run_set_agc(struct run_softc *sc, uint8_t agc)
3557 1.1 nonaka {
3558 1.1 nonaka uint8_t bbp;
3559 1.1 nonaka
3560 1.1 nonaka if (sc->mac_ver == 0x3572) {
3561 1.1 nonaka run_bbp_read(sc, 27, &bbp);
3562 1.1 nonaka bbp &= ~(0x3 << 5);
3563 1.1 nonaka run_bbp_write(sc, 27, bbp | 0 << 5); /* select Rx0 */
3564 1.1 nonaka run_bbp_write(sc, 66, agc);
3565 1.1 nonaka run_bbp_write(sc, 27, bbp | 1 << 5); /* select Rx1 */
3566 1.1 nonaka run_bbp_write(sc, 66, agc);
3567 1.1 nonaka } else
3568 1.1 nonaka run_bbp_write(sc, 66, agc);
3569 1.1 nonaka }
3570 1.1 nonaka
3571 1.1 nonaka static void
3572 1.1 nonaka run_set_rx_antenna(struct run_softc *sc, int aux)
3573 1.1 nonaka {
3574 1.1 nonaka uint32_t tmp;
3575 1.10.6.11 skrll uint8_t bbp152;
3576 1.1 nonaka
3577 1.10.6.11 skrll if (sc->rf_rev == RT5390_RF_5370) {
3578 1.10.6.11 skrll run_bbp_read(sc, 152, &bbp152);
3579 1.10.6.11 skrll bbp152 &= ~0x80;
3580 1.10.6.11 skrll if (aux)
3581 1.10.6.11 skrll bbp152 |= 0x80;
3582 1.10.6.11 skrll run_bbp_write(sc, 152, bbp152);
3583 1.10.6.11 skrll } else {
3584 1.10.6.11 skrll run_mcu_cmd(sc, RT2860_MCU_CMD_ANTSEL, !aux);
3585 1.10.6.11 skrll run_read(sc, RT2860_GPIO_CTRL, &tmp);
3586 1.10.6.11 skrll tmp &= ~0x0808;
3587 1.10.6.11 skrll if (aux)
3588 1.10.6.11 skrll tmp |= 0x08;
3589 1.10.6.11 skrll run_write(sc, RT2860_GPIO_CTRL, tmp);
3590 1.10.6.11 skrll }
3591 1.1 nonaka }
3592 1.1 nonaka
3593 1.1 nonaka static int
3594 1.1 nonaka run_set_chan(struct run_softc *sc, struct ieee80211_channel *c)
3595 1.1 nonaka {
3596 1.1 nonaka struct ieee80211com *ic = &sc->sc_ic;
3597 1.1 nonaka u_int chan, group;
3598 1.1 nonaka
3599 1.1 nonaka chan = ieee80211_chan2ieee(ic, c);
3600 1.1 nonaka if (chan == 0 || chan == IEEE80211_CHAN_ANY)
3601 1.10.6.2 skrll return EINVAL;
3602 1.1 nonaka
3603 1.10.6.11 skrll if (sc->mac_ver == 0x5592)
3604 1.10.6.11 skrll run_rt5592_set_chan(sc, chan);
3605 1.10.6.11 skrll else if (sc->mac_ver >= 0x5390)
3606 1.10.6.11 skrll run_rt5390_set_chan(sc, chan);
3607 1.10.6.11 skrll else if (sc->mac_ver == 0x3593)
3608 1.10.6.11 skrll run_rt3593_set_chan(sc, chan);
3609 1.10.6.11 skrll else if (sc->mac_ver == 0x3572)
3610 1.1 nonaka run_rt3572_set_chan(sc, chan);
3611 1.1 nonaka else if (sc->mac_ver >= 0x3070)
3612 1.1 nonaka run_rt3070_set_chan(sc, chan);
3613 1.1 nonaka else
3614 1.1 nonaka run_rt2870_set_chan(sc, chan);
3615 1.1 nonaka
3616 1.1 nonaka /* determine channel group */
3617 1.1 nonaka if (chan <= 14)
3618 1.1 nonaka group = 0;
3619 1.1 nonaka else if (chan <= 64)
3620 1.1 nonaka group = 1;
3621 1.1 nonaka else if (chan <= 128)
3622 1.1 nonaka group = 2;
3623 1.1 nonaka else
3624 1.1 nonaka group = 3;
3625 1.1 nonaka
3626 1.1 nonaka /* XXX necessary only when group has changed! */
3627 1.1 nonaka run_select_chan_group(sc, group);
3628 1.1 nonaka
3629 1.10.6.11 skrll usbd_delay_ms(sc->sc_udev, 10);
3630 1.10.6.11 skrll
3631 1.10.6.11 skrll /* Perform IQ calibration. */
3632 1.10.6.11 skrll if (sc->mac_ver >= 0x5392)
3633 1.10.6.11 skrll run_iq_calib(sc, chan);
3634 1.10.6.11 skrll
3635 1.10.6.2 skrll return 0;
3636 1.1 nonaka }
3637 1.1 nonaka
3638 1.1 nonaka static void
3639 1.10.6.11 skrll run_updateprot(struct run_softc *sc)
3640 1.10.6.11 skrll {
3641 1.10.6.11 skrll struct ieee80211com *ic = &sc->sc_ic;
3642 1.10.6.11 skrll uint32_t tmp;
3643 1.10.6.11 skrll
3644 1.10.6.11 skrll tmp = RT2860_RTSTH_EN | RT2860_PROT_NAV_SHORT | RT2860_TXOP_ALLOW_ALL;
3645 1.10.6.11 skrll /* setup protection frame rate (MCS code) */
3646 1.10.6.11 skrll tmp |= (ic->ic_curmode == IEEE80211_MODE_11A) ?
3647 1.10.6.11 skrll rt2860_rates[RT2860_RIDX_OFDM6].mcs | RT2860_PHY_OFDM :
3648 1.10.6.11 skrll rt2860_rates[RT2860_RIDX_CCK11].mcs;
3649 1.10.6.11 skrll
3650 1.10.6.11 skrll /* CCK frames don't require protection */
3651 1.10.6.11 skrll run_write(sc, RT2860_CCK_PROT_CFG, tmp);
3652 1.10.6.11 skrll if (ic->ic_flags & IEEE80211_F_USEPROT) {
3653 1.10.6.11 skrll if (ic->ic_protmode == IEEE80211_PROT_RTSCTS)
3654 1.10.6.11 skrll tmp |= RT2860_PROT_CTRL_RTS_CTS;
3655 1.10.6.11 skrll else if (ic->ic_protmode == IEEE80211_PROT_CTSONLY)
3656 1.10.6.11 skrll tmp |= RT2860_PROT_CTRL_CTS;
3657 1.10.6.11 skrll }
3658 1.10.6.11 skrll run_write(sc, RT2860_OFDM_PROT_CFG, tmp);
3659 1.10.6.11 skrll }
3660 1.10.6.11 skrll
3661 1.10.6.11 skrll static void
3662 1.1 nonaka run_enable_tsf_sync(struct run_softc *sc)
3663 1.1 nonaka {
3664 1.1 nonaka struct ieee80211com *ic = &sc->sc_ic;
3665 1.1 nonaka uint32_t tmp;
3666 1.1 nonaka
3667 1.1 nonaka run_read(sc, RT2860_BCN_TIME_CFG, &tmp);
3668 1.1 nonaka tmp &= ~0x1fffff;
3669 1.1 nonaka tmp |= ic->ic_bss->ni_intval * 16;
3670 1.1 nonaka tmp |= RT2860_TSF_TIMER_EN | RT2860_TBTT_TIMER_EN;
3671 1.1 nonaka if (ic->ic_opmode == IEEE80211_M_STA) {
3672 1.1 nonaka /*
3673 1.1 nonaka * Local TSF is always updated with remote TSF on beacon
3674 1.1 nonaka * reception.
3675 1.1 nonaka */
3676 1.1 nonaka tmp |= 1 << RT2860_TSF_SYNC_MODE_SHIFT;
3677 1.1 nonaka }
3678 1.1 nonaka #ifndef IEEE80211_STA_ONLY
3679 1.1 nonaka else if (ic->ic_opmode == IEEE80211_M_IBSS) {
3680 1.1 nonaka tmp |= RT2860_BCN_TX_EN;
3681 1.1 nonaka /*
3682 1.1 nonaka * Local TSF is updated with remote TSF on beacon reception
3683 1.1 nonaka * only if the remote TSF is greater than local TSF.
3684 1.1 nonaka */
3685 1.1 nonaka tmp |= 2 << RT2860_TSF_SYNC_MODE_SHIFT;
3686 1.1 nonaka } else if (ic->ic_opmode == IEEE80211_M_HOSTAP) {
3687 1.1 nonaka tmp |= RT2860_BCN_TX_EN;
3688 1.1 nonaka /* SYNC with nobody */
3689 1.1 nonaka tmp |= 3 << RT2860_TSF_SYNC_MODE_SHIFT;
3690 1.1 nonaka }
3691 1.1 nonaka #endif
3692 1.1 nonaka run_write(sc, RT2860_BCN_TIME_CFG, tmp);
3693 1.1 nonaka }
3694 1.1 nonaka
3695 1.1 nonaka static void
3696 1.1 nonaka run_enable_mrr(struct run_softc *sc)
3697 1.1 nonaka {
3698 1.1 nonaka #define CCK(mcs) (mcs)
3699 1.1 nonaka #define OFDM(mcs) (1 << 3 | (mcs))
3700 1.1 nonaka run_write(sc, RT2860_LG_FBK_CFG0,
3701 1.1 nonaka OFDM(6) << 28 | /* 54->48 */
3702 1.1 nonaka OFDM(5) << 24 | /* 48->36 */
3703 1.1 nonaka OFDM(4) << 20 | /* 36->24 */
3704 1.1 nonaka OFDM(3) << 16 | /* 24->18 */
3705 1.1 nonaka OFDM(2) << 12 | /* 18->12 */
3706 1.1 nonaka OFDM(1) << 8 | /* 12-> 9 */
3707 1.1 nonaka OFDM(0) << 4 | /* 9-> 6 */
3708 1.1 nonaka OFDM(0)); /* 6-> 6 */
3709 1.1 nonaka
3710 1.1 nonaka run_write(sc, RT2860_LG_FBK_CFG1,
3711 1.1 nonaka CCK(2) << 12 | /* 11->5.5 */
3712 1.1 nonaka CCK(1) << 8 | /* 5.5-> 2 */
3713 1.1 nonaka CCK(0) << 4 | /* 2-> 1 */
3714 1.1 nonaka CCK(0)); /* 1-> 1 */
3715 1.1 nonaka #undef OFDM
3716 1.1 nonaka #undef CCK
3717 1.1 nonaka }
3718 1.1 nonaka
3719 1.1 nonaka static void
3720 1.1 nonaka run_set_txpreamble(struct run_softc *sc)
3721 1.1 nonaka {
3722 1.1 nonaka uint32_t tmp;
3723 1.1 nonaka
3724 1.1 nonaka run_read(sc, RT2860_AUTO_RSP_CFG, &tmp);
3725 1.1 nonaka if (sc->sc_ic.ic_flags & IEEE80211_F_SHPREAMBLE)
3726 1.1 nonaka tmp |= RT2860_CCK_SHORT_EN;
3727 1.1 nonaka else
3728 1.1 nonaka tmp &= ~RT2860_CCK_SHORT_EN;
3729 1.1 nonaka run_write(sc, RT2860_AUTO_RSP_CFG, tmp);
3730 1.1 nonaka }
3731 1.1 nonaka
3732 1.1 nonaka static void
3733 1.1 nonaka run_set_basicrates(struct run_softc *sc)
3734 1.1 nonaka {
3735 1.1 nonaka struct ieee80211com *ic = &sc->sc_ic;
3736 1.1 nonaka
3737 1.1 nonaka /* set basic rates mask */
3738 1.1 nonaka if (ic->ic_curmode == IEEE80211_MODE_11B)
3739 1.1 nonaka run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x003);
3740 1.1 nonaka else if (ic->ic_curmode == IEEE80211_MODE_11A)
3741 1.1 nonaka run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x150);
3742 1.1 nonaka else /* 11g */
3743 1.1 nonaka run_write(sc, RT2860_LEGACY_BASIC_RATE, 0x15f);
3744 1.1 nonaka }
3745 1.1 nonaka
3746 1.1 nonaka static void
3747 1.1 nonaka run_set_leds(struct run_softc *sc, uint16_t which)
3748 1.1 nonaka {
3749 1.1 nonaka
3750 1.1 nonaka (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LEDS,
3751 1.1 nonaka which | (sc->leds & 0x7f));
3752 1.1 nonaka }
3753 1.1 nonaka
3754 1.1 nonaka static void
3755 1.1 nonaka run_set_bssid(struct run_softc *sc, const uint8_t *bssid)
3756 1.1 nonaka {
3757 1.1 nonaka
3758 1.1 nonaka run_write(sc, RT2860_MAC_BSSID_DW0,
3759 1.1 nonaka bssid[0] | bssid[1] << 8 | bssid[2] << 16 | bssid[3] << 24);
3760 1.1 nonaka run_write(sc, RT2860_MAC_BSSID_DW1,
3761 1.1 nonaka bssid[4] | bssid[5] << 8);
3762 1.1 nonaka }
3763 1.1 nonaka
3764 1.1 nonaka static void
3765 1.1 nonaka run_set_macaddr(struct run_softc *sc, const uint8_t *addr)
3766 1.1 nonaka {
3767 1.1 nonaka
3768 1.1 nonaka run_write(sc, RT2860_MAC_ADDR_DW0,
3769 1.1 nonaka addr[0] | addr[1] << 8 | addr[2] << 16 | addr[3] << 24);
3770 1.1 nonaka run_write(sc, RT2860_MAC_ADDR_DW1,
3771 1.1 nonaka addr[4] | addr[5] << 8 | 0xff << 16);
3772 1.1 nonaka }
3773 1.1 nonaka
3774 1.1 nonaka static void
3775 1.1 nonaka run_updateslot(struct ifnet *ifp)
3776 1.1 nonaka {
3777 1.1 nonaka
3778 1.1 nonaka /* do it in a process context */
3779 1.1 nonaka run_do_async(ifp->if_softc, run_updateslot_cb, NULL, 0);
3780 1.1 nonaka }
3781 1.1 nonaka
3782 1.1 nonaka /* ARGSUSED */
3783 1.1 nonaka static void
3784 1.1 nonaka run_updateslot_cb(struct run_softc *sc, void *arg)
3785 1.1 nonaka {
3786 1.1 nonaka uint32_t tmp;
3787 1.1 nonaka
3788 1.1 nonaka run_read(sc, RT2860_BKOFF_SLOT_CFG, &tmp);
3789 1.1 nonaka tmp &= ~0xff;
3790 1.1 nonaka tmp |= (sc->sc_ic.ic_flags & IEEE80211_F_SHSLOT) ? 9 : 20;
3791 1.1 nonaka run_write(sc, RT2860_BKOFF_SLOT_CFG, tmp);
3792 1.1 nonaka }
3793 1.1 nonaka
3794 1.1 nonaka static int8_t
3795 1.1 nonaka run_rssi2dbm(struct run_softc *sc, uint8_t rssi, uint8_t rxchain)
3796 1.1 nonaka {
3797 1.1 nonaka struct ieee80211com *ic = &sc->sc_ic;
3798 1.1 nonaka struct ieee80211_channel *c = ic->ic_curchan;
3799 1.1 nonaka int delta;
3800 1.1 nonaka
3801 1.1 nonaka if (IEEE80211_IS_CHAN_5GHZ(c)) {
3802 1.1 nonaka u_int chan = ieee80211_chan2ieee(ic, c);
3803 1.1 nonaka delta = sc->rssi_5ghz[rxchain];
3804 1.1 nonaka
3805 1.1 nonaka /* determine channel group */
3806 1.1 nonaka if (chan <= 64)
3807 1.1 nonaka delta -= sc->lna[1];
3808 1.1 nonaka else if (chan <= 128)
3809 1.1 nonaka delta -= sc->lna[2];
3810 1.1 nonaka else
3811 1.1 nonaka delta -= sc->lna[3];
3812 1.1 nonaka } else
3813 1.1 nonaka delta = sc->rssi_2ghz[rxchain] - sc->lna[0];
3814 1.1 nonaka
3815 1.10.6.2 skrll return -12 - delta - rssi;
3816 1.1 nonaka }
3817 1.1 nonaka
3818 1.10.6.11 skrll static void
3819 1.10.6.11 skrll run_rt5390_bbp_init(struct run_softc *sc)
3820 1.10.6.11 skrll {
3821 1.10.6.11 skrll u_int i;
3822 1.10.6.11 skrll uint8_t bbp;
3823 1.10.6.11 skrll
3824 1.10.6.11 skrll /* Apply maximum likelihood detection for 2 stream case. */
3825 1.10.6.11 skrll run_bbp_read(sc, 105, &bbp);
3826 1.10.6.11 skrll if (sc->nrxchains > 1)
3827 1.10.6.11 skrll run_bbp_write(sc, 105, bbp | RT5390_MLD);
3828 1.10.6.11 skrll
3829 1.10.6.11 skrll /* Avoid data lost and CRC error. */
3830 1.10.6.11 skrll run_bbp_read(sc, 4, &bbp);
3831 1.10.6.11 skrll run_bbp_write(sc, 4, bbp | RT5390_MAC_IF_CTRL);
3832 1.10.6.11 skrll
3833 1.10.6.11 skrll if (sc->mac_ver == 0x5592) {
3834 1.10.6.11 skrll for (i = 0; i < (int)__arraycount(rt5592_def_bbp); i++) {
3835 1.10.6.11 skrll run_bbp_write(sc, rt5592_def_bbp[i].reg,
3836 1.10.6.11 skrll rt5592_def_bbp[i].val);
3837 1.10.6.11 skrll }
3838 1.10.6.11 skrll for (i = 0; i < (int)__arraycount(rt5592_bbp_r196); i++) {
3839 1.10.6.11 skrll run_bbp_write(sc, 195, i + 0x80);
3840 1.10.6.11 skrll run_bbp_write(sc, 196, rt5592_bbp_r196[i]);
3841 1.10.6.11 skrll }
3842 1.10.6.11 skrll } else {
3843 1.10.6.11 skrll for (i = 0; i < (int)__arraycount(rt5390_def_bbp); i++) {
3844 1.10.6.11 skrll run_bbp_write(sc, rt5390_def_bbp[i].reg,
3845 1.10.6.11 skrll rt5390_def_bbp[i].val);
3846 1.10.6.11 skrll }
3847 1.10.6.11 skrll }
3848 1.10.6.11 skrll if (sc->mac_ver == 0x5392) {
3849 1.10.6.11 skrll run_bbp_write(sc, 88, 0x90);
3850 1.10.6.11 skrll run_bbp_write(sc, 95, 0x9a);
3851 1.10.6.11 skrll run_bbp_write(sc, 98, 0x12);
3852 1.10.6.11 skrll run_bbp_write(sc, 106, 0x12);
3853 1.10.6.11 skrll run_bbp_write(sc, 134, 0xd0);
3854 1.10.6.11 skrll run_bbp_write(sc, 135, 0xf6);
3855 1.10.6.11 skrll run_bbp_write(sc, 148, 0x84);
3856 1.10.6.11 skrll }
3857 1.10.6.11 skrll
3858 1.10.6.11 skrll run_bbp_read(sc, 152, &bbp);
3859 1.10.6.11 skrll run_bbp_write(sc, 152, bbp | 0x80);
3860 1.10.6.11 skrll
3861 1.10.6.11 skrll /* Fix BBP254 for RT5592C. */
3862 1.10.6.11 skrll if (sc->mac_ver == 0x5592 && sc->mac_rev >= 0x0221) {
3863 1.10.6.11 skrll run_bbp_read(sc, 254, &bbp);
3864 1.10.6.11 skrll run_bbp_write(sc, 254, bbp | 0x80);
3865 1.10.6.11 skrll }
3866 1.10.6.11 skrll
3867 1.10.6.11 skrll /* Disable hardware antenna diversity. */
3868 1.10.6.11 skrll if (sc->mac_ver == 0x5390)
3869 1.10.6.11 skrll run_bbp_write(sc, 154, 0);
3870 1.10.6.11 skrll
3871 1.10.6.11 skrll /* Initialize Rx CCK/OFDM frequency offset report. */
3872 1.10.6.11 skrll run_bbp_write(sc, 142, 1);
3873 1.10.6.11 skrll run_bbp_write(sc, 143, 57);
3874 1.10.6.11 skrll }
3875 1.10.6.11 skrll
3876 1.1 nonaka static int
3877 1.1 nonaka run_bbp_init(struct run_softc *sc)
3878 1.1 nonaka {
3879 1.1 nonaka int i, error, ntries;
3880 1.1 nonaka uint8_t bbp0;
3881 1.1 nonaka
3882 1.1 nonaka /* wait for BBP to wake up */
3883 1.1 nonaka for (ntries = 0; ntries < 20; ntries++) {
3884 1.1 nonaka if ((error = run_bbp_read(sc, 0, &bbp0)) != 0)
3885 1.10.6.2 skrll return error;
3886 1.1 nonaka if (bbp0 != 0 && bbp0 != 0xff)
3887 1.1 nonaka break;
3888 1.1 nonaka }
3889 1.1 nonaka if (ntries == 20)
3890 1.10.6.2 skrll return ETIMEDOUT;
3891 1.1 nonaka
3892 1.1 nonaka /* initialize BBP registers to default values */
3893 1.10.6.11 skrll if (sc->mac_ver >= 0x5390)
3894 1.10.6.11 skrll run_rt5390_bbp_init(sc);
3895 1.10.6.11 skrll else {
3896 1.10.6.11 skrll for (i = 0; i < (int)__arraycount(rt2860_def_bbp); i++) {
3897 1.10.6.11 skrll run_bbp_write(sc, rt2860_def_bbp[i].reg,
3898 1.10.6.11 skrll rt2860_def_bbp[i].val);
3899 1.10.6.11 skrll }
3900 1.10.6.11 skrll }
3901 1.10.6.11 skrll
3902 1.10.6.11 skrll if (sc->mac_ver == 0x3593) {
3903 1.10.6.11 skrll run_bbp_write(sc, 79, 0x13);
3904 1.10.6.11 skrll run_bbp_write(sc, 80, 0x05);
3905 1.10.6.11 skrll run_bbp_write(sc, 81, 0x33);
3906 1.10.6.11 skrll run_bbp_write(sc, 86, 0x46);
3907 1.10.6.11 skrll run_bbp_write(sc, 137, 0x0f);
3908 1.1 nonaka }
3909 1.1 nonaka
3910 1.1 nonaka /* fix BBP84 for RT2860E */
3911 1.1 nonaka if (sc->mac_ver == 0x2860 && sc->mac_rev != 0x0101)
3912 1.1 nonaka run_bbp_write(sc, 84, 0x19);
3913 1.1 nonaka
3914 1.1 nonaka if (sc->mac_ver >= 0x3070) {
3915 1.1 nonaka run_bbp_write(sc, 79, 0x13);
3916 1.1 nonaka run_bbp_write(sc, 80, 0x05);
3917 1.1 nonaka run_bbp_write(sc, 81, 0x33);
3918 1.1 nonaka } else if (sc->mac_ver == 0x2860 && sc->mac_rev == 0x0100) {
3919 1.1 nonaka run_bbp_write(sc, 69, 0x16);
3920 1.1 nonaka run_bbp_write(sc, 73, 0x12);
3921 1.1 nonaka }
3922 1.10.6.2 skrll return 0;
3923 1.1 nonaka }
3924 1.1 nonaka
3925 1.1 nonaka static int
3926 1.1 nonaka run_rt3070_rf_init(struct run_softc *sc)
3927 1.1 nonaka {
3928 1.1 nonaka uint32_t tmp;
3929 1.1 nonaka uint8_t rf, target, bbp4;
3930 1.1 nonaka int i;
3931 1.1 nonaka
3932 1.1 nonaka run_rt3070_rf_read(sc, 30, &rf);
3933 1.1 nonaka /* toggle RF R30 bit 7 */
3934 1.1 nonaka run_rt3070_rf_write(sc, 30, rf | 0x80);
3935 1.10.6.11 skrll usbd_delay_ms(sc->sc_udev, 10);
3936 1.1 nonaka run_rt3070_rf_write(sc, 30, rf & ~0x80);
3937 1.1 nonaka
3938 1.1 nonaka /* initialize RF registers to default value */
3939 1.1 nonaka if (sc->mac_ver == 0x3572) {
3940 1.1 nonaka for (i = 0; i < (int)__arraycount(rt3572_def_rf); i++) {
3941 1.1 nonaka run_rt3070_rf_write(sc, rt3572_def_rf[i].reg,
3942 1.1 nonaka rt3572_def_rf[i].val);
3943 1.1 nonaka }
3944 1.1 nonaka } else {
3945 1.1 nonaka for (i = 0; i < (int)__arraycount(rt3070_def_rf); i++) {
3946 1.1 nonaka run_rt3070_rf_write(sc, rt3070_def_rf[i].reg,
3947 1.1 nonaka rt3070_def_rf[i].val);
3948 1.1 nonaka }
3949 1.1 nonaka }
3950 1.1 nonaka if (sc->mac_ver == 0x3572) {
3951 1.1 nonaka run_rt3070_rf_read(sc, 6, &rf);
3952 1.1 nonaka run_rt3070_rf_write(sc, 6, rf | 0x40);
3953 1.10.6.11 skrll run_rt3070_rf_write(sc, 31, 0x14);
3954 1.1 nonaka
3955 1.1 nonaka run_read(sc, RT3070_LDO_CFG0, &tmp);
3956 1.10.6.11 skrll tmp &= ~0x1f000000;
3957 1.10.6.11 skrll if (sc->mac_rev < 0x0211 && sc->patch_dac)
3958 1.10.6.11 skrll tmp |= 0x0d000000; /* 1.3V */
3959 1.10.6.11 skrll else
3960 1.10.6.11 skrll tmp |= 0x01000000; /* 1.2V */
3961 1.1 nonaka run_write(sc, RT3070_LDO_CFG0, tmp);
3962 1.1 nonaka } else if (sc->mac_ver == 0x3071) {
3963 1.1 nonaka run_rt3070_rf_read(sc, 6, &rf);
3964 1.1 nonaka run_rt3070_rf_write(sc, 6, rf | 0x40);
3965 1.1 nonaka run_rt3070_rf_write(sc, 31, 0x14);
3966 1.1 nonaka
3967 1.1 nonaka run_read(sc, RT3070_LDO_CFG0, &tmp);
3968 1.1 nonaka tmp &= ~0x1f000000;
3969 1.1 nonaka if (sc->mac_rev < 0x0211)
3970 1.1 nonaka tmp |= 0x0d000000; /* 1.35V */
3971 1.1 nonaka else
3972 1.1 nonaka tmp |= 0x01000000; /* 1.2V */
3973 1.1 nonaka run_write(sc, RT3070_LDO_CFG0, tmp);
3974 1.1 nonaka
3975 1.1 nonaka /* patch LNA_PE_G1 */
3976 1.1 nonaka run_read(sc, RT3070_GPIO_SWITCH, &tmp);
3977 1.1 nonaka run_write(sc, RT3070_GPIO_SWITCH, tmp & ~0x20);
3978 1.1 nonaka } else if (sc->mac_ver == 0x3070) {
3979 1.1 nonaka /* increase voltage from 1.2V to 1.35V */
3980 1.1 nonaka run_read(sc, RT3070_LDO_CFG0, &tmp);
3981 1.1 nonaka tmp = (tmp & ~0x0f000000) | 0x0d000000;
3982 1.1 nonaka run_write(sc, RT3070_LDO_CFG0, tmp);
3983 1.1 nonaka }
3984 1.1 nonaka
3985 1.1 nonaka /* select 20MHz bandwidth */
3986 1.1 nonaka run_rt3070_rf_read(sc, 31, &rf);
3987 1.1 nonaka run_rt3070_rf_write(sc, 31, rf & ~0x20);
3988 1.1 nonaka
3989 1.1 nonaka /* calibrate filter for 20MHz bandwidth */
3990 1.1 nonaka sc->rf24_20mhz = 0x1f; /* default value */
3991 1.1 nonaka target = (sc->mac_ver < 0x3071) ? 0x16 : 0x13;
3992 1.1 nonaka run_rt3070_filter_calib(sc, 0x07, target, &sc->rf24_20mhz);
3993 1.1 nonaka
3994 1.1 nonaka /* select 40MHz bandwidth */
3995 1.1 nonaka run_bbp_read(sc, 4, &bbp4);
3996 1.1 nonaka run_bbp_write(sc, 4, (bbp4 & ~0x08) | 0x10);
3997 1.1 nonaka run_rt3070_rf_read(sc, 31, &rf);
3998 1.1 nonaka run_rt3070_rf_write(sc, 31, rf | 0x20);
3999 1.1 nonaka
4000 1.1 nonaka /* calibrate filter for 40MHz bandwidth */
4001 1.1 nonaka sc->rf24_40mhz = 0x2f; /* default value */
4002 1.1 nonaka target = (sc->mac_ver < 0x3071) ? 0x19 : 0x15;
4003 1.1 nonaka run_rt3070_filter_calib(sc, 0x27, target, &sc->rf24_40mhz);
4004 1.1 nonaka
4005 1.1 nonaka /* go back to 20MHz bandwidth */
4006 1.1 nonaka run_bbp_read(sc, 4, &bbp4);
4007 1.1 nonaka run_bbp_write(sc, 4, bbp4 & ~0x18);
4008 1.1 nonaka
4009 1.1 nonaka if (sc->mac_ver == 0x3572) {
4010 1.1 nonaka /* save default BBP registers 25 and 26 values */
4011 1.1 nonaka run_bbp_read(sc, 25, &sc->bbp25);
4012 1.1 nonaka run_bbp_read(sc, 26, &sc->bbp26);
4013 1.1 nonaka } else if (sc->mac_rev < 0x0211)
4014 1.1 nonaka run_rt3070_rf_write(sc, 27, 0x03);
4015 1.1 nonaka
4016 1.1 nonaka run_read(sc, RT3070_OPT_14, &tmp);
4017 1.1 nonaka run_write(sc, RT3070_OPT_14, tmp | 1);
4018 1.1 nonaka
4019 1.1 nonaka if (sc->mac_ver == 0x3070 || sc->mac_ver == 0x3071) {
4020 1.1 nonaka run_rt3070_rf_read(sc, 17, &rf);
4021 1.1 nonaka rf &= ~RT3070_TX_LO1;
4022 1.1 nonaka if ((sc->mac_ver == 0x3070 ||
4023 1.1 nonaka (sc->mac_ver == 0x3071 && sc->mac_rev >= 0x0211)) &&
4024 1.1 nonaka !sc->ext_2ghz_lna)
4025 1.1 nonaka rf |= 0x20; /* fix for long range Rx issue */
4026 1.1 nonaka if (sc->txmixgain_2ghz >= 1)
4027 1.1 nonaka rf = (rf & ~0x7) | sc->txmixgain_2ghz;
4028 1.1 nonaka run_rt3070_rf_write(sc, 17, rf);
4029 1.1 nonaka }
4030 1.1 nonaka if (sc->mac_ver == 0x3071) {
4031 1.1 nonaka run_rt3070_rf_read(sc, 1, &rf);
4032 1.1 nonaka rf &= ~(RT3070_RX0_PD | RT3070_TX0_PD);
4033 1.1 nonaka rf |= RT3070_RF_BLOCK | RT3070_RX1_PD | RT3070_TX1_PD;
4034 1.1 nonaka run_rt3070_rf_write(sc, 1, rf);
4035 1.1 nonaka
4036 1.1 nonaka run_rt3070_rf_read(sc, 15, &rf);
4037 1.1 nonaka run_rt3070_rf_write(sc, 15, rf & ~RT3070_TX_LO2);
4038 1.1 nonaka
4039 1.1 nonaka run_rt3070_rf_read(sc, 20, &rf);
4040 1.1 nonaka run_rt3070_rf_write(sc, 20, rf & ~RT3070_RX_LO1);
4041 1.1 nonaka
4042 1.1 nonaka run_rt3070_rf_read(sc, 21, &rf);
4043 1.1 nonaka run_rt3070_rf_write(sc, 21, rf & ~RT3070_RX_LO2);
4044 1.1 nonaka }
4045 1.1 nonaka if (sc->mac_ver == 0x3070 || sc->mac_ver == 0x3071) {
4046 1.1 nonaka /* fix Tx to Rx IQ glitch by raising RF voltage */
4047 1.1 nonaka run_rt3070_rf_read(sc, 27, &rf);
4048 1.1 nonaka rf &= ~0x77;
4049 1.1 nonaka if (sc->mac_rev < 0x0211)
4050 1.1 nonaka rf |= 0x03;
4051 1.1 nonaka run_rt3070_rf_write(sc, 27, rf);
4052 1.1 nonaka }
4053 1.10.6.2 skrll return 0;
4054 1.1 nonaka }
4055 1.1 nonaka
4056 1.1 nonaka static int
4057 1.10.6.11 skrll run_rt3593_rf_init(struct run_softc *sc)
4058 1.10.6.11 skrll {
4059 1.10.6.11 skrll uint32_t tmp;
4060 1.10.6.11 skrll uint8_t rf;
4061 1.10.6.11 skrll int i;
4062 1.10.6.11 skrll
4063 1.10.6.11 skrll /* Disable the GPIO bits 4 and 7 for LNA PE control. */
4064 1.10.6.11 skrll run_read(sc, RT3070_GPIO_SWITCH, &tmp);
4065 1.10.6.11 skrll tmp &= ~(1 << 4 | 1 << 7);
4066 1.10.6.11 skrll run_write(sc, RT3070_GPIO_SWITCH, tmp);
4067 1.10.6.11 skrll
4068 1.10.6.11 skrll /* Initialize RF registers to default value. */
4069 1.10.6.11 skrll for (i = 0; i < __arraycount(rt3593_def_rf); i++) {
4070 1.10.6.11 skrll run_rt3070_rf_write(sc, rt3593_def_rf[i].reg,
4071 1.10.6.11 skrll rt3593_def_rf[i].val);
4072 1.10.6.11 skrll }
4073 1.10.6.11 skrll
4074 1.10.6.11 skrll /* Toggle RF R2 to initiate calibration. */
4075 1.10.6.11 skrll run_rt3070_rf_write(sc, 2, RT5390_RESCAL);
4076 1.10.6.11 skrll
4077 1.10.6.11 skrll /* Initialize RF frequency offset. */
4078 1.10.6.11 skrll run_adjust_freq_offset(sc);
4079 1.10.6.11 skrll
4080 1.10.6.11 skrll run_rt3070_rf_read(sc, 18, &rf);
4081 1.10.6.11 skrll run_rt3070_rf_write(sc, 18, rf | RT3593_AUTOTUNE_BYPASS);
4082 1.10.6.11 skrll
4083 1.10.6.11 skrll /*
4084 1.10.6.11 skrll * Increase voltage from 1.2V to 1.35V, wait for 1 msec to
4085 1.10.6.11 skrll * decrease voltage back to 1.2V.
4086 1.10.6.11 skrll */
4087 1.10.6.11 skrll run_read(sc, RT3070_LDO_CFG0, &tmp);
4088 1.10.6.11 skrll tmp = (tmp & ~0x1f000000) | 0x0d000000;
4089 1.10.6.11 skrll run_write(sc, RT3070_LDO_CFG0, tmp);
4090 1.10.6.11 skrll usbd_delay_ms(sc->sc_udev, 1);
4091 1.10.6.11 skrll tmp = (tmp & ~0x1f000000) | 0x01000000;
4092 1.10.6.11 skrll run_write(sc, RT3070_LDO_CFG0, tmp);
4093 1.10.6.11 skrll
4094 1.10.6.11 skrll sc->rf24_20mhz = 0x1f;
4095 1.10.6.11 skrll sc->rf24_40mhz = 0x2f;
4096 1.10.6.11 skrll
4097 1.10.6.11 skrll /* Save default BBP registers 25 and 26 values. */
4098 1.10.6.11 skrll run_bbp_read(sc, 25, &sc->bbp25);
4099 1.10.6.11 skrll run_bbp_read(sc, 26, &sc->bbp26);
4100 1.10.6.11 skrll
4101 1.10.6.11 skrll run_read(sc, RT3070_OPT_14, &tmp);
4102 1.10.6.11 skrll run_write(sc, RT3070_OPT_14, tmp | 1);
4103 1.10.6.13 skrll return 0;
4104 1.10.6.11 skrll }
4105 1.10.6.11 skrll
4106 1.10.6.11 skrll static int
4107 1.10.6.11 skrll run_rt5390_rf_init(struct run_softc *sc)
4108 1.10.6.11 skrll {
4109 1.10.6.11 skrll uint32_t tmp;
4110 1.10.6.11 skrll uint8_t rf;
4111 1.10.6.11 skrll int i;
4112 1.10.6.11 skrll
4113 1.10.6.11 skrll /* Toggle RF R2 to initiate calibration. */
4114 1.10.6.11 skrll if (sc->mac_ver == 0x5390) {
4115 1.10.6.11 skrll run_rt3070_rf_read(sc, 2, &rf);
4116 1.10.6.11 skrll run_rt3070_rf_write(sc, 2, rf | RT5390_RESCAL);
4117 1.10.6.11 skrll usbd_delay_ms(sc->sc_udev, 10);
4118 1.10.6.11 skrll run_rt3070_rf_write(sc, 2, rf & ~RT5390_RESCAL);
4119 1.10.6.11 skrll } else {
4120 1.10.6.11 skrll run_rt3070_rf_write(sc, 2, RT5390_RESCAL);
4121 1.10.6.11 skrll usbd_delay_ms(sc->sc_udev, 10);
4122 1.10.6.11 skrll }
4123 1.10.6.11 skrll
4124 1.10.6.11 skrll /* Initialize RF registers to default value. */
4125 1.10.6.11 skrll if (sc->mac_ver == 0x5592) {
4126 1.10.6.11 skrll for (i = 0; i < __arraycount(rt5592_def_rf); i++) {
4127 1.10.6.11 skrll run_rt3070_rf_write(sc, rt5592_def_rf[i].reg,
4128 1.10.6.11 skrll rt5592_def_rf[i].val);
4129 1.10.6.11 skrll }
4130 1.10.6.11 skrll /* Initialize RF frequency offset. */
4131 1.10.6.11 skrll run_adjust_freq_offset(sc);
4132 1.10.6.11 skrll } else if (sc->mac_ver == 0x5392) {
4133 1.10.6.11 skrll for (i = 0; i < __arraycount(rt5392_def_rf); i++) {
4134 1.10.6.11 skrll run_rt3070_rf_write(sc, rt5392_def_rf[i].reg,
4135 1.10.6.11 skrll rt5392_def_rf[i].val);
4136 1.10.6.11 skrll }
4137 1.10.6.11 skrll if (sc->mac_rev >= 0x0223) {
4138 1.10.6.11 skrll run_rt3070_rf_write(sc, 23, 0x0f);
4139 1.10.6.11 skrll run_rt3070_rf_write(sc, 24, 0x3e);
4140 1.10.6.11 skrll run_rt3070_rf_write(sc, 51, 0x32);
4141 1.10.6.11 skrll run_rt3070_rf_write(sc, 53, 0x22);
4142 1.10.6.11 skrll run_rt3070_rf_write(sc, 56, 0xc1);
4143 1.10.6.11 skrll run_rt3070_rf_write(sc, 59, 0x0f);
4144 1.10.6.11 skrll }
4145 1.10.6.11 skrll } else {
4146 1.10.6.11 skrll for (i = 0; i < __arraycount(rt5390_def_rf); i++) {
4147 1.10.6.11 skrll run_rt3070_rf_write(sc, rt5390_def_rf[i].reg,
4148 1.10.6.11 skrll rt5390_def_rf[i].val);
4149 1.10.6.11 skrll }
4150 1.10.6.11 skrll if (sc->mac_rev >= 0x0502) {
4151 1.10.6.11 skrll run_rt3070_rf_write(sc, 6, 0xe0);
4152 1.10.6.11 skrll run_rt3070_rf_write(sc, 25, 0x80);
4153 1.10.6.11 skrll run_rt3070_rf_write(sc, 46, 0x73);
4154 1.10.6.11 skrll run_rt3070_rf_write(sc, 53, 0x00);
4155 1.10.6.11 skrll run_rt3070_rf_write(sc, 56, 0x42);
4156 1.10.6.11 skrll run_rt3070_rf_write(sc, 61, 0xd1);
4157 1.10.6.11 skrll }
4158 1.10.6.11 skrll }
4159 1.10.6.11 skrll
4160 1.10.6.11 skrll sc->rf24_20mhz = 0x1f; /* default value */
4161 1.10.6.11 skrll sc->rf24_40mhz = (sc->mac_ver == 0x5592) ? 0 : 0x2f;
4162 1.10.6.11 skrll
4163 1.10.6.11 skrll if (sc->mac_rev < 0x0211)
4164 1.10.6.11 skrll run_rt3070_rf_write(sc, 27, 0x3);
4165 1.10.6.11 skrll
4166 1.10.6.11 skrll run_read(sc, RT3070_OPT_14, &tmp);
4167 1.10.6.11 skrll run_write(sc, RT3070_OPT_14, tmp | 1);
4168 1.10.6.13 skrll return 0;
4169 1.10.6.11 skrll }
4170 1.10.6.11 skrll
4171 1.10.6.11 skrll static int
4172 1.1 nonaka run_rt3070_filter_calib(struct run_softc *sc, uint8_t init, uint8_t target,
4173 1.1 nonaka uint8_t *val)
4174 1.1 nonaka {
4175 1.1 nonaka uint8_t rf22, rf24;
4176 1.1 nonaka uint8_t bbp55_pb, bbp55_sb, delta;
4177 1.1 nonaka int ntries;
4178 1.1 nonaka
4179 1.1 nonaka /* program filter */
4180 1.1 nonaka run_rt3070_rf_read(sc, 24, &rf24);
4181 1.1 nonaka rf24 = (rf24 & 0xc0) | init; /* initial filter value */
4182 1.1 nonaka run_rt3070_rf_write(sc, 24, rf24);
4183 1.1 nonaka
4184 1.1 nonaka /* enable baseband loopback mode */
4185 1.1 nonaka run_rt3070_rf_read(sc, 22, &rf22);
4186 1.1 nonaka run_rt3070_rf_write(sc, 22, rf22 | 0x01);
4187 1.1 nonaka
4188 1.1 nonaka /* set power and frequency of passband test tone */
4189 1.1 nonaka run_bbp_write(sc, 24, 0x00);
4190 1.1 nonaka for (ntries = 0; ntries < 100; ntries++) {
4191 1.1 nonaka /* transmit test tone */
4192 1.1 nonaka run_bbp_write(sc, 25, 0x90);
4193 1.10.6.11 skrll usbd_delay_ms(sc->sc_udev, 10);
4194 1.1 nonaka /* read received power */
4195 1.1 nonaka run_bbp_read(sc, 55, &bbp55_pb);
4196 1.1 nonaka if (bbp55_pb != 0)
4197 1.1 nonaka break;
4198 1.1 nonaka }
4199 1.1 nonaka if (ntries == 100)
4200 1.10.6.2 skrll return ETIMEDOUT;
4201 1.1 nonaka
4202 1.1 nonaka /* set power and frequency of stopband test tone */
4203 1.1 nonaka run_bbp_write(sc, 24, 0x06);
4204 1.1 nonaka for (ntries = 0; ntries < 100; ntries++) {
4205 1.1 nonaka /* transmit test tone */
4206 1.1 nonaka run_bbp_write(sc, 25, 0x90);
4207 1.10.6.11 skrll usbd_delay_ms(sc->sc_udev, 10);
4208 1.1 nonaka /* read received power */
4209 1.1 nonaka run_bbp_read(sc, 55, &bbp55_sb);
4210 1.1 nonaka
4211 1.1 nonaka delta = bbp55_pb - bbp55_sb;
4212 1.1 nonaka if (delta > target)
4213 1.1 nonaka break;
4214 1.1 nonaka
4215 1.1 nonaka /* reprogram filter */
4216 1.1 nonaka rf24++;
4217 1.1 nonaka run_rt3070_rf_write(sc, 24, rf24);
4218 1.1 nonaka }
4219 1.1 nonaka if (ntries < 100) {
4220 1.1 nonaka if (rf24 != init)
4221 1.1 nonaka rf24--; /* backtrack */
4222 1.1 nonaka *val = rf24;
4223 1.1 nonaka run_rt3070_rf_write(sc, 24, rf24);
4224 1.1 nonaka }
4225 1.1 nonaka
4226 1.1 nonaka /* restore initial state */
4227 1.1 nonaka run_bbp_write(sc, 24, 0x00);
4228 1.1 nonaka
4229 1.1 nonaka /* disable baseband loopback mode */
4230 1.1 nonaka run_rt3070_rf_read(sc, 22, &rf22);
4231 1.1 nonaka run_rt3070_rf_write(sc, 22, rf22 & ~0x01);
4232 1.1 nonaka
4233 1.10.6.2 skrll return 0;
4234 1.1 nonaka }
4235 1.1 nonaka
4236 1.1 nonaka static void
4237 1.1 nonaka run_rt3070_rf_setup(struct run_softc *sc)
4238 1.1 nonaka {
4239 1.1 nonaka uint8_t bbp, rf;
4240 1.1 nonaka int i;
4241 1.1 nonaka
4242 1.1 nonaka if (sc->mac_ver == 0x3572) {
4243 1.1 nonaka /* enable DC filter */
4244 1.1 nonaka if (sc->mac_rev >= 0x0201)
4245 1.1 nonaka run_bbp_write(sc, 103, 0xc0);
4246 1.1 nonaka
4247 1.1 nonaka run_bbp_read(sc, 138, &bbp);
4248 1.1 nonaka if (sc->ntxchains == 1)
4249 1.1 nonaka bbp |= 0x20; /* turn off DAC1 */
4250 1.1 nonaka if (sc->nrxchains == 1)
4251 1.1 nonaka bbp &= ~0x02; /* turn off ADC1 */
4252 1.1 nonaka run_bbp_write(sc, 138, bbp);
4253 1.1 nonaka
4254 1.1 nonaka if (sc->mac_rev >= 0x0211) {
4255 1.1 nonaka /* improve power consumption */
4256 1.1 nonaka run_bbp_read(sc, 31, &bbp);
4257 1.1 nonaka run_bbp_write(sc, 31, bbp & ~0x03);
4258 1.1 nonaka }
4259 1.1 nonaka
4260 1.1 nonaka run_rt3070_rf_read(sc, 16, &rf);
4261 1.1 nonaka rf = (rf & ~0x07) | sc->txmixgain_2ghz;
4262 1.1 nonaka run_rt3070_rf_write(sc, 16, rf);
4263 1.1 nonaka } else if (sc->mac_ver == 0x3071) {
4264 1.1 nonaka /* enable DC filter */
4265 1.1 nonaka if (sc->mac_rev >= 0x0201)
4266 1.1 nonaka run_bbp_write(sc, 103, 0xc0);
4267 1.1 nonaka
4268 1.1 nonaka run_bbp_read(sc, 138, &bbp);
4269 1.1 nonaka if (sc->ntxchains == 1)
4270 1.1 nonaka bbp |= 0x20; /* turn off DAC1 */
4271 1.1 nonaka if (sc->nrxchains == 1)
4272 1.1 nonaka bbp &= ~0x02; /* turn off ADC1 */
4273 1.1 nonaka run_bbp_write(sc, 138, bbp);
4274 1.1 nonaka
4275 1.1 nonaka if (sc->mac_rev >= 0x0211) {
4276 1.1 nonaka /* improve power consumption */
4277 1.1 nonaka run_bbp_read(sc, 31, &bbp);
4278 1.1 nonaka run_bbp_write(sc, 31, bbp & ~0x03);
4279 1.1 nonaka }
4280 1.1 nonaka
4281 1.1 nonaka run_write(sc, RT2860_TX_SW_CFG1, 0);
4282 1.1 nonaka if (sc->mac_rev < 0x0211) {
4283 1.1 nonaka run_write(sc, RT2860_TX_SW_CFG2,
4284 1.1 nonaka sc->patch_dac ? 0x2c : 0x0f);
4285 1.1 nonaka } else
4286 1.1 nonaka run_write(sc, RT2860_TX_SW_CFG2, 0);
4287 1.1 nonaka } else if (sc->mac_ver == 0x3070) {
4288 1.1 nonaka if (sc->mac_rev >= 0x0201) {
4289 1.1 nonaka /* enable DC filter */
4290 1.1 nonaka run_bbp_write(sc, 103, 0xc0);
4291 1.1 nonaka
4292 1.1 nonaka /* improve power consumption */
4293 1.1 nonaka run_bbp_read(sc, 31, &bbp);
4294 1.1 nonaka run_bbp_write(sc, 31, bbp & ~0x03);
4295 1.1 nonaka }
4296 1.1 nonaka
4297 1.1 nonaka if (sc->mac_rev < 0x0211) {
4298 1.1 nonaka run_write(sc, RT2860_TX_SW_CFG1, 0);
4299 1.1 nonaka run_write(sc, RT2860_TX_SW_CFG2, 0x2c);
4300 1.1 nonaka } else
4301 1.1 nonaka run_write(sc, RT2860_TX_SW_CFG2, 0);
4302 1.1 nonaka }
4303 1.1 nonaka
4304 1.1 nonaka /* initialize RF registers from ROM for >=RT3071*/
4305 1.1 nonaka if (sc->mac_ver >= 0x3071) {
4306 1.1 nonaka for (i = 0; i < 10; i++) {
4307 1.1 nonaka if (sc->rf[i].reg == 0 || sc->rf[i].reg == 0xff)
4308 1.1 nonaka continue;
4309 1.1 nonaka run_rt3070_rf_write(sc, sc->rf[i].reg, sc->rf[i].val);
4310 1.1 nonaka }
4311 1.1 nonaka }
4312 1.1 nonaka }
4313 1.1 nonaka
4314 1.10.6.11 skrll static void
4315 1.10.6.11 skrll run_rt3593_rf_setup(struct run_softc *sc)
4316 1.10.6.11 skrll {
4317 1.10.6.11 skrll uint8_t bbp, rf;
4318 1.10.6.11 skrll
4319 1.10.6.11 skrll if (sc->mac_rev >= 0x0211) {
4320 1.10.6.11 skrll /* Enable DC filter. */
4321 1.10.6.11 skrll run_bbp_write(sc, 103, 0xc0);
4322 1.10.6.11 skrll }
4323 1.10.6.11 skrll run_write(sc, RT2860_TX_SW_CFG1, 0);
4324 1.10.6.11 skrll if (sc->mac_rev < 0x0211) {
4325 1.10.6.11 skrll run_write(sc, RT2860_TX_SW_CFG2,
4326 1.10.6.11 skrll sc->patch_dac ? 0x2c : 0x0f);
4327 1.10.6.11 skrll } else
4328 1.10.6.11 skrll run_write(sc, RT2860_TX_SW_CFG2, 0);
4329 1.10.6.11 skrll
4330 1.10.6.11 skrll run_rt3070_rf_read(sc, 50, &rf);
4331 1.10.6.11 skrll run_rt3070_rf_write(sc, 50, rf & ~RT3593_TX_LO2);
4332 1.10.6.11 skrll
4333 1.10.6.11 skrll run_rt3070_rf_read(sc, 51, &rf);
4334 1.10.6.11 skrll rf = (rf & ~(RT3593_TX_LO1 | 0x0c)) |
4335 1.10.6.11 skrll ((sc->txmixgain_2ghz & 0x07) << 2);
4336 1.10.6.11 skrll run_rt3070_rf_write(sc, 51, rf);
4337 1.10.6.11 skrll
4338 1.10.6.11 skrll run_rt3070_rf_read(sc, 38, &rf);
4339 1.10.6.11 skrll run_rt3070_rf_write(sc, 38, rf & ~RT5390_RX_LO1);
4340 1.10.6.11 skrll
4341 1.10.6.11 skrll run_rt3070_rf_read(sc, 39, &rf);
4342 1.10.6.11 skrll run_rt3070_rf_write(sc, 39, rf & ~RT5390_RX_LO2);
4343 1.10.6.11 skrll
4344 1.10.6.11 skrll run_rt3070_rf_read(sc, 1, &rf);
4345 1.10.6.11 skrll run_rt3070_rf_write(sc, 1, rf & ~(RT3070_RF_BLOCK | RT3070_PLL_PD));
4346 1.10.6.11 skrll
4347 1.10.6.11 skrll run_rt3070_rf_read(sc, 30, &rf);
4348 1.10.6.11 skrll rf = (rf & ~0x18) | 0x10;
4349 1.10.6.11 skrll run_rt3070_rf_write(sc, 30, rf);
4350 1.10.6.11 skrll
4351 1.10.6.11 skrll /* Apply maximum likelihood detection for 2 stream case. */
4352 1.10.6.11 skrll run_bbp_read(sc, 105, &bbp);
4353 1.10.6.11 skrll if (sc->nrxchains > 1)
4354 1.10.6.11 skrll run_bbp_write(sc, 105, bbp | RT5390_MLD);
4355 1.10.6.11 skrll
4356 1.10.6.11 skrll /* Avoid data lost and CRC error. */
4357 1.10.6.11 skrll run_bbp_read(sc, 4, &bbp);
4358 1.10.6.11 skrll run_bbp_write(sc, 4, bbp | RT5390_MAC_IF_CTRL);
4359 1.10.6.11 skrll
4360 1.10.6.11 skrll run_bbp_write(sc, 92, 0x02);
4361 1.10.6.11 skrll run_bbp_write(sc, 82, 0x82);
4362 1.10.6.11 skrll run_bbp_write(sc, 106, 0x05);
4363 1.10.6.11 skrll run_bbp_write(sc, 104, 0x92);
4364 1.10.6.11 skrll run_bbp_write(sc, 88, 0x90);
4365 1.10.6.11 skrll run_bbp_write(sc, 148, 0xc8);
4366 1.10.6.11 skrll run_bbp_write(sc, 47, 0x48);
4367 1.10.6.11 skrll run_bbp_write(sc, 120, 0x50);
4368 1.10.6.11 skrll
4369 1.10.6.11 skrll run_bbp_write(sc, 163, 0x9d);
4370 1.10.6.11 skrll
4371 1.10.6.11 skrll /* SNR mapping. */
4372 1.10.6.11 skrll run_bbp_write(sc, 142, 0x06);
4373 1.10.6.11 skrll run_bbp_write(sc, 143, 0xa0);
4374 1.10.6.11 skrll run_bbp_write(sc, 142, 0x07);
4375 1.10.6.11 skrll run_bbp_write(sc, 143, 0xa1);
4376 1.10.6.11 skrll run_bbp_write(sc, 142, 0x08);
4377 1.10.6.11 skrll run_bbp_write(sc, 143, 0xa2);
4378 1.10.6.11 skrll
4379 1.10.6.11 skrll run_bbp_write(sc, 31, 0x08);
4380 1.10.6.11 skrll run_bbp_write(sc, 68, 0x0b);
4381 1.10.6.11 skrll run_bbp_write(sc, 105, 0x04);
4382 1.10.6.11 skrll }
4383 1.10.6.11 skrll
4384 1.10.6.11 skrll static void
4385 1.10.6.11 skrll run_rt5390_rf_setup(struct run_softc *sc)
4386 1.10.6.11 skrll {
4387 1.10.6.11 skrll uint8_t bbp, rf;
4388 1.10.6.11 skrll
4389 1.10.6.11 skrll if (sc->mac_rev >= 0x0211) {
4390 1.10.6.11 skrll /* Enable DC filter. */
4391 1.10.6.11 skrll run_bbp_write(sc, 103, 0xc0);
4392 1.10.6.11 skrll
4393 1.10.6.11 skrll if (sc->mac_ver != 0x5592) {
4394 1.10.6.11 skrll /* Improve power consumption. */
4395 1.10.6.11 skrll run_bbp_read(sc, 31, &bbp);
4396 1.10.6.11 skrll run_bbp_write(sc, 31, bbp & ~0x03);
4397 1.10.6.11 skrll }
4398 1.10.6.11 skrll }
4399 1.10.6.11 skrll
4400 1.10.6.11 skrll run_bbp_read(sc, 138, &bbp);
4401 1.10.6.11 skrll if (sc->ntxchains == 1)
4402 1.10.6.11 skrll bbp |= 0x20; /* turn off DAC1 */
4403 1.10.6.11 skrll if (sc->nrxchains == 1)
4404 1.10.6.11 skrll bbp &= ~0x02; /* turn off ADC1 */
4405 1.10.6.11 skrll run_bbp_write(sc, 138, bbp);
4406 1.10.6.11 skrll
4407 1.10.6.11 skrll run_rt3070_rf_read(sc, 38, &rf);
4408 1.10.6.11 skrll run_rt3070_rf_write(sc, 38, rf & ~RT5390_RX_LO1);
4409 1.10.6.11 skrll
4410 1.10.6.11 skrll run_rt3070_rf_read(sc, 39, &rf);
4411 1.10.6.11 skrll run_rt3070_rf_write(sc, 39, rf & ~RT5390_RX_LO2);
4412 1.10.6.11 skrll
4413 1.10.6.11 skrll /* Avoid data lost and CRC error. */
4414 1.10.6.11 skrll run_bbp_read(sc, 4, &bbp);
4415 1.10.6.11 skrll run_bbp_write(sc, 4, bbp | RT5390_MAC_IF_CTRL);
4416 1.10.6.11 skrll
4417 1.10.6.11 skrll run_rt3070_rf_read(sc, 30, &rf);
4418 1.10.6.11 skrll rf = (rf & ~0x18) | 0x10;
4419 1.10.6.11 skrll run_rt3070_rf_write(sc, 30, rf);
4420 1.10.6.11 skrll
4421 1.10.6.11 skrll if (sc->mac_ver != 0x5592) {
4422 1.10.6.11 skrll run_write(sc, RT2860_TX_SW_CFG1, 0);
4423 1.10.6.11 skrll if (sc->mac_rev < 0x0211) {
4424 1.10.6.11 skrll run_write(sc, RT2860_TX_SW_CFG2,
4425 1.10.6.11 skrll sc->patch_dac ? 0x2c : 0x0f);
4426 1.10.6.11 skrll } else
4427 1.10.6.11 skrll run_write(sc, RT2860_TX_SW_CFG2, 0);
4428 1.10.6.11 skrll }
4429 1.10.6.11 skrll }
4430 1.10.6.11 skrll
4431 1.1 nonaka static int
4432 1.1 nonaka run_txrx_enable(struct run_softc *sc)
4433 1.1 nonaka {
4434 1.1 nonaka uint32_t tmp;
4435 1.1 nonaka int error, ntries;
4436 1.1 nonaka
4437 1.1 nonaka run_write(sc, RT2860_MAC_SYS_CTRL, RT2860_MAC_TX_EN);
4438 1.1 nonaka for (ntries = 0; ntries < 200; ntries++) {
4439 1.1 nonaka if ((error = run_read(sc, RT2860_WPDMA_GLO_CFG, &tmp)) != 0)
4440 1.10.6.2 skrll return error;
4441 1.1 nonaka if ((tmp & (RT2860_TX_DMA_BUSY | RT2860_RX_DMA_BUSY)) == 0)
4442 1.1 nonaka break;
4443 1.10.6.11 skrll usbd_delay_ms(sc->sc_udev, 50);
4444 1.1 nonaka }
4445 1.1 nonaka if (ntries == 200)
4446 1.10.6.2 skrll return ETIMEDOUT;
4447 1.1 nonaka
4448 1.10.6.11 skrll usbd_delay_ms(sc->sc_udev, 50);
4449 1.1 nonaka
4450 1.1 nonaka tmp |= RT2860_RX_DMA_EN | RT2860_TX_DMA_EN | RT2860_TX_WB_DDONE;
4451 1.1 nonaka run_write(sc, RT2860_WPDMA_GLO_CFG, tmp);
4452 1.1 nonaka
4453 1.1 nonaka /* enable Rx bulk aggregation (set timeout and limit) */
4454 1.1 nonaka tmp = RT2860_USB_TX_EN | RT2860_USB_RX_EN | RT2860_USB_RX_AGG_EN |
4455 1.1 nonaka RT2860_USB_RX_AGG_TO(128) | RT2860_USB_RX_AGG_LMT(2);
4456 1.1 nonaka run_write(sc, RT2860_USB_DMA_CFG, tmp);
4457 1.1 nonaka
4458 1.1 nonaka /* set Rx filter */
4459 1.1 nonaka tmp = RT2860_DROP_CRC_ERR | RT2860_DROP_PHY_ERR;
4460 1.1 nonaka if (sc->sc_ic.ic_opmode != IEEE80211_M_MONITOR) {
4461 1.1 nonaka tmp |= RT2860_DROP_UC_NOME | RT2860_DROP_DUPL |
4462 1.1 nonaka RT2860_DROP_CTS | RT2860_DROP_BA | RT2860_DROP_ACK |
4463 1.1 nonaka RT2860_DROP_VER_ERR | RT2860_DROP_CTRL_RSV |
4464 1.1 nonaka RT2860_DROP_CFACK | RT2860_DROP_CFEND;
4465 1.1 nonaka if (sc->sc_ic.ic_opmode == IEEE80211_M_STA)
4466 1.1 nonaka tmp |= RT2860_DROP_RTS | RT2860_DROP_PSPOLL;
4467 1.1 nonaka }
4468 1.1 nonaka run_write(sc, RT2860_RX_FILTR_CFG, tmp);
4469 1.1 nonaka
4470 1.1 nonaka run_write(sc, RT2860_MAC_SYS_CTRL,
4471 1.1 nonaka RT2860_MAC_RX_EN | RT2860_MAC_TX_EN);
4472 1.1 nonaka
4473 1.10.6.2 skrll return 0;
4474 1.1 nonaka }
4475 1.1 nonaka
4476 1.1 nonaka static int
4477 1.10.6.11 skrll run_adjust_freq_offset(struct run_softc *sc)
4478 1.10.6.11 skrll {
4479 1.10.6.11 skrll uint8_t rf, tmp;
4480 1.10.6.11 skrll
4481 1.10.6.11 skrll run_rt3070_rf_read(sc, 17, &rf);
4482 1.10.6.11 skrll tmp = rf;
4483 1.10.6.11 skrll rf = (rf & ~0x7f) | (sc->freq & 0x7f);
4484 1.10.6.11 skrll rf = MIN(rf, 0x5f);
4485 1.10.6.11 skrll
4486 1.10.6.11 skrll if (tmp != rf)
4487 1.10.6.11 skrll run_mcu_cmd(sc, 0x74, (tmp << 8 ) | rf);
4488 1.10.6.11 skrll
4489 1.10.6.13 skrll return 0;
4490 1.10.6.11 skrll }
4491 1.10.6.11 skrll
4492 1.10.6.11 skrll static int
4493 1.1 nonaka run_init(struct ifnet *ifp)
4494 1.1 nonaka {
4495 1.1 nonaka struct run_softc *sc = ifp->if_softc;
4496 1.1 nonaka struct ieee80211com *ic = &sc->sc_ic;
4497 1.1 nonaka uint32_t tmp;
4498 1.1 nonaka uint8_t bbp1, bbp3;
4499 1.1 nonaka int i, error, qid, ridx, ntries;
4500 1.1 nonaka
4501 1.1 nonaka for (ntries = 0; ntries < 100; ntries++) {
4502 1.1 nonaka if ((error = run_read(sc, RT2860_ASIC_VER_ID, &tmp)) != 0)
4503 1.1 nonaka goto fail;
4504 1.1 nonaka if (tmp != 0 && tmp != 0xffffffff)
4505 1.1 nonaka break;
4506 1.10.6.11 skrll usbd_delay_ms(sc->sc_udev, 10);
4507 1.1 nonaka }
4508 1.1 nonaka if (ntries == 100) {
4509 1.1 nonaka error = ETIMEDOUT;
4510 1.1 nonaka goto fail;
4511 1.1 nonaka }
4512 1.1 nonaka
4513 1.1 nonaka if ((sc->sc_flags & RUN_FWLOADED) == 0 &&
4514 1.1 nonaka (error = run_load_microcode(sc)) != 0) {
4515 1.1 nonaka aprint_error_dev(sc->sc_dev,
4516 1.1 nonaka "could not load 8051 microcode\n");
4517 1.1 nonaka goto fail;
4518 1.1 nonaka }
4519 1.1 nonaka
4520 1.1 nonaka if (ifp->if_flags & IFF_RUNNING)
4521 1.1 nonaka run_stop(ifp, 0);
4522 1.1 nonaka
4523 1.1 nonaka /* init host command ring */
4524 1.1 nonaka sc->cmdq.cur = sc->cmdq.next = sc->cmdq.queued = 0;
4525 1.1 nonaka
4526 1.1 nonaka /* init Tx rings (4 EDCAs) */
4527 1.1 nonaka for (qid = 0; qid < 4; qid++) {
4528 1.1 nonaka if ((error = run_alloc_tx_ring(sc, qid)) != 0)
4529 1.1 nonaka goto fail;
4530 1.1 nonaka }
4531 1.1 nonaka /* init Rx ring */
4532 1.1 nonaka if ((error = run_alloc_rx_ring(sc)) != 0)
4533 1.1 nonaka goto fail;
4534 1.1 nonaka
4535 1.1 nonaka IEEE80211_ADDR_COPY(ic->ic_myaddr, CLLADDR(ifp->if_sadl));
4536 1.1 nonaka run_set_macaddr(sc, ic->ic_myaddr);
4537 1.1 nonaka
4538 1.1 nonaka for (ntries = 0; ntries < 100; ntries++) {
4539 1.1 nonaka if ((error = run_read(sc, RT2860_WPDMA_GLO_CFG, &tmp)) != 0)
4540 1.1 nonaka goto fail;
4541 1.1 nonaka if ((tmp & (RT2860_TX_DMA_BUSY | RT2860_RX_DMA_BUSY)) == 0)
4542 1.1 nonaka break;
4543 1.10.6.11 skrll usbd_delay_ms(sc->sc_udev, 10);
4544 1.1 nonaka }
4545 1.1 nonaka if (ntries == 100) {
4546 1.1 nonaka aprint_error_dev(sc->sc_dev,
4547 1.1 nonaka "timeout waiting for DMA engine\n");
4548 1.1 nonaka error = ETIMEDOUT;
4549 1.1 nonaka goto fail;
4550 1.1 nonaka }
4551 1.1 nonaka tmp &= 0xff0;
4552 1.1 nonaka tmp |= RT2860_TX_WB_DDONE;
4553 1.1 nonaka run_write(sc, RT2860_WPDMA_GLO_CFG, tmp);
4554 1.1 nonaka
4555 1.1 nonaka /* turn off PME_OEN to solve high-current issue */
4556 1.1 nonaka run_read(sc, RT2860_SYS_CTRL, &tmp);
4557 1.1 nonaka run_write(sc, RT2860_SYS_CTRL, tmp & ~RT2860_PME_OEN);
4558 1.1 nonaka
4559 1.1 nonaka run_write(sc, RT2860_MAC_SYS_CTRL,
4560 1.1 nonaka RT2860_BBP_HRST | RT2860_MAC_SRST);
4561 1.1 nonaka run_write(sc, RT2860_USB_DMA_CFG, 0);
4562 1.1 nonaka
4563 1.1 nonaka if ((error = run_reset(sc)) != 0) {
4564 1.1 nonaka aprint_error_dev(sc->sc_dev, "could not reset chipset\n");
4565 1.1 nonaka goto fail;
4566 1.1 nonaka }
4567 1.1 nonaka
4568 1.1 nonaka run_write(sc, RT2860_MAC_SYS_CTRL, 0);
4569 1.1 nonaka
4570 1.1 nonaka /* init Tx power for all Tx rates (from EEPROM) */
4571 1.1 nonaka for (ridx = 0; ridx < 5; ridx++) {
4572 1.1 nonaka if (sc->txpow20mhz[ridx] == 0xffffffff)
4573 1.1 nonaka continue;
4574 1.1 nonaka run_write(sc, RT2860_TX_PWR_CFG(ridx), sc->txpow20mhz[ridx]);
4575 1.1 nonaka }
4576 1.1 nonaka
4577 1.1 nonaka for (i = 0; i < (int)__arraycount(rt2870_def_mac); i++)
4578 1.1 nonaka run_write(sc, rt2870_def_mac[i].reg, rt2870_def_mac[i].val);
4579 1.1 nonaka run_write(sc, RT2860_WMM_AIFSN_CFG, 0x00002273);
4580 1.1 nonaka run_write(sc, RT2860_WMM_CWMIN_CFG, 0x00002344);
4581 1.1 nonaka run_write(sc, RT2860_WMM_CWMAX_CFG, 0x000034aa);
4582 1.1 nonaka
4583 1.10.6.11 skrll if (sc->mac_ver >= 0x5390) {
4584 1.10.6.11 skrll run_write(sc, RT2860_TX_SW_CFG0,
4585 1.10.6.11 skrll 4 << RT2860_DLY_PAPE_EN_SHIFT | 4);
4586 1.10.6.11 skrll if (sc->mac_ver >= 0x5392) {
4587 1.10.6.11 skrll run_write(sc, RT2860_MAX_LEN_CFG, 0x00002fff);
4588 1.10.6.11 skrll if (sc->mac_ver == 0x5592) {
4589 1.10.6.11 skrll run_write(sc, RT2860_HT_FBK_CFG1, 0xedcba980);
4590 1.10.6.11 skrll run_write(sc, RT2860_TXOP_HLDR_ET, 0x00000082);
4591 1.10.6.11 skrll } else {
4592 1.10.6.11 skrll run_write(sc, RT2860_HT_FBK_CFG1, 0xedcb4980);
4593 1.10.6.11 skrll run_write(sc, RT2860_LG_FBK_CFG0, 0xedcba322);
4594 1.10.6.11 skrll }
4595 1.10.6.11 skrll }
4596 1.10.6.11 skrll } else if (sc->mac_ver >= 0x3593) {
4597 1.10.6.11 skrll run_write(sc, RT2860_TX_SW_CFG0,
4598 1.10.6.11 skrll 4 << RT2860_DLY_PAPE_EN_SHIFT | 2);
4599 1.10.6.11 skrll } else if (sc->mac_ver >= 0x3070) {
4600 1.1 nonaka /* set delay of PA_PE assertion to 1us (unit of 0.25us) */
4601 1.1 nonaka run_write(sc, RT2860_TX_SW_CFG0,
4602 1.1 nonaka 4 << RT2860_DLY_PAPE_EN_SHIFT);
4603 1.1 nonaka }
4604 1.1 nonaka
4605 1.1 nonaka /* wait while MAC is busy */
4606 1.1 nonaka for (ntries = 0; ntries < 100; ntries++) {
4607 1.1 nonaka if ((error = run_read(sc, RT2860_MAC_STATUS_REG, &tmp)) != 0)
4608 1.1 nonaka goto fail;
4609 1.1 nonaka if (!(tmp & (RT2860_RX_STATUS_BUSY | RT2860_TX_STATUS_BUSY)))
4610 1.1 nonaka break;
4611 1.1 nonaka DELAY(1000);
4612 1.1 nonaka }
4613 1.1 nonaka if (ntries == 100) {
4614 1.1 nonaka error = ETIMEDOUT;
4615 1.1 nonaka goto fail;
4616 1.1 nonaka }
4617 1.1 nonaka
4618 1.1 nonaka /* clear Host to MCU mailbox */
4619 1.1 nonaka run_write(sc, RT2860_H2M_BBPAGENT, 0);
4620 1.1 nonaka run_write(sc, RT2860_H2M_MAILBOX, 0);
4621 1.10.6.11 skrll usbd_delay_ms(sc->sc_udev, 10);
4622 1.1 nonaka
4623 1.1 nonaka if ((error = run_bbp_init(sc)) != 0) {
4624 1.1 nonaka aprint_error_dev(sc->sc_dev, "could not initialize BBP\n");
4625 1.1 nonaka goto fail;
4626 1.1 nonaka }
4627 1.1 nonaka
4628 1.10.6.11 skrll /* abort TSF synchronization */
4629 1.1 nonaka run_read(sc, RT2860_BCN_TIME_CFG, &tmp);
4630 1.1 nonaka tmp &= ~(RT2860_BCN_TX_EN | RT2860_TSF_TIMER_EN |
4631 1.1 nonaka RT2860_TBTT_TIMER_EN);
4632 1.1 nonaka run_write(sc, RT2860_BCN_TIME_CFG, tmp);
4633 1.1 nonaka
4634 1.1 nonaka /* clear RX WCID search table */
4635 1.1 nonaka run_set_region_4(sc, RT2860_WCID_ENTRY(0), 0, 512);
4636 1.1 nonaka /* clear Pair-wise key table */
4637 1.1 nonaka run_set_region_4(sc, RT2860_PKEY(0), 0, 2048);
4638 1.1 nonaka /* clear IV/EIV table */
4639 1.1 nonaka run_set_region_4(sc, RT2860_IVEIV(0), 0, 512);
4640 1.1 nonaka /* clear WCID attribute table */
4641 1.1 nonaka run_set_region_4(sc, RT2860_WCID_ATTR(0), 0, 8 * 32);
4642 1.1 nonaka /* clear shared key table */
4643 1.1 nonaka run_set_region_4(sc, RT2860_SKEY(0, 0), 0, 8 * 32);
4644 1.1 nonaka /* clear shared key mode */
4645 1.1 nonaka run_set_region_4(sc, RT2860_SKEY_MODE_0_7, 0, 4);
4646 1.1 nonaka
4647 1.10.6.11 skrll /* clear RX WCID search table */
4648 1.10.6.11 skrll run_set_region_4(sc, RT2860_WCID_ENTRY(0), 0, 512);
4649 1.10.6.11 skrll /* clear WCID attribute table */
4650 1.10.6.11 skrll run_set_region_4(sc, RT2860_WCID_ATTR(0), 0, 8 * 32);
4651 1.10.6.11 skrll
4652 1.1 nonaka run_read(sc, RT2860_US_CYC_CNT, &tmp);
4653 1.1 nonaka tmp = (tmp & ~0xff) | 0x1e;
4654 1.1 nonaka run_write(sc, RT2860_US_CYC_CNT, tmp);
4655 1.1 nonaka
4656 1.1 nonaka if (sc->mac_rev != 0x0101)
4657 1.1 nonaka run_write(sc, RT2860_TXOP_CTRL_CFG, 0x0000583f);
4658 1.1 nonaka
4659 1.1 nonaka run_write(sc, RT2860_WMM_TXOP0_CFG, 0);
4660 1.1 nonaka run_write(sc, RT2860_WMM_TXOP1_CFG, 48 << 16 | 96);
4661 1.1 nonaka
4662 1.1 nonaka /* write vendor-specific BBP values (from EEPROM) */
4663 1.10.6.11 skrll if (sc->mac_ver < 0x3593) {
4664 1.10.6.11 skrll for (i = 0; i < 10; i++) {
4665 1.10.6.11 skrll if (sc->bbp[i].reg == 0 || sc->bbp[i].reg == 0xff)
4666 1.10.6.11 skrll continue;
4667 1.10.6.11 skrll run_bbp_write(sc, sc->bbp[i].reg, sc->bbp[i].val);
4668 1.10.6.11 skrll }
4669 1.1 nonaka }
4670 1.1 nonaka
4671 1.1 nonaka /* select Main antenna for 1T1R devices */
4672 1.10.6.11 skrll if (sc->rf_rev == RT3070_RF_3020 || sc->rf_rev == RT5390_RF_5370)
4673 1.1 nonaka run_set_rx_antenna(sc, 0);
4674 1.1 nonaka
4675 1.1 nonaka /* send LEDs operating mode to microcontroller */
4676 1.1 nonaka (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED1, sc->led[0]);
4677 1.1 nonaka (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED2, sc->led[1]);
4678 1.1 nonaka (void)run_mcu_cmd(sc, RT2860_MCU_CMD_LED3, sc->led[2]);
4679 1.1 nonaka
4680 1.10.6.11 skrll if (sc->mac_ver >= 0x5390)
4681 1.10.6.11 skrll run_rt5390_rf_init(sc);
4682 1.10.6.11 skrll else if (sc->mac_ver == 0x3593)
4683 1.10.6.11 skrll run_rt3593_rf_init(sc);
4684 1.10.6.11 skrll else if (sc->mac_ver >= 0x3070)
4685 1.1 nonaka run_rt3070_rf_init(sc);
4686 1.1 nonaka
4687 1.1 nonaka /* disable non-existing Rx chains */
4688 1.1 nonaka run_bbp_read(sc, 3, &bbp3);
4689 1.1 nonaka bbp3 &= ~(1 << 3 | 1 << 4);
4690 1.1 nonaka if (sc->nrxchains == 2)
4691 1.1 nonaka bbp3 |= 1 << 3;
4692 1.1 nonaka else if (sc->nrxchains == 3)
4693 1.1 nonaka bbp3 |= 1 << 4;
4694 1.1 nonaka run_bbp_write(sc, 3, bbp3);
4695 1.1 nonaka
4696 1.1 nonaka /* disable non-existing Tx chains */
4697 1.1 nonaka run_bbp_read(sc, 1, &bbp1);
4698 1.1 nonaka if (sc->ntxchains == 1)
4699 1.1 nonaka bbp1 &= ~(1 << 3 | 1 << 4);
4700 1.1 nonaka run_bbp_write(sc, 1, bbp1);
4701 1.1 nonaka
4702 1.10.6.11 skrll if (sc->mac_ver >= 0x5390)
4703 1.10.6.11 skrll run_rt5390_rf_setup(sc);
4704 1.10.6.11 skrll else if (sc->mac_ver == 0x3593)
4705 1.10.6.11 skrll run_rt3593_rf_setup(sc);
4706 1.10.6.11 skrll else if (sc->mac_ver >= 0x3070)
4707 1.1 nonaka run_rt3070_rf_setup(sc);
4708 1.1 nonaka
4709 1.1 nonaka /* select default channel */
4710 1.1 nonaka run_set_chan(sc, ic->ic_curchan);
4711 1.1 nonaka
4712 1.10.6.11 skrll /* setup initial protection mode */
4713 1.10.6.11 skrll run_updateprot(sc);
4714 1.10.6.11 skrll
4715 1.1 nonaka /* turn radio LED on */
4716 1.1 nonaka run_set_leds(sc, RT2860_LED_RADIO);
4717 1.1 nonaka
4718 1.1 nonaka #ifdef RUN_HWCRYPTO
4719 1.1 nonaka if (ic->ic_flags & IEEE80211_F_PRIVACY) {
4720 1.1 nonaka /* install WEP keys */
4721 1.1 nonaka for (i = 0; i < IEEE80211_WEP_NKID; i++)
4722 1.1 nonaka (void)run_set_key(ic, &ic->ic_crypto.cs_nw_keys[i],
4723 1.1 nonaka NULL);
4724 1.1 nonaka }
4725 1.1 nonaka #endif
4726 1.1 nonaka
4727 1.1 nonaka for (i = 0; i < RUN_RX_RING_COUNT; i++) {
4728 1.1 nonaka struct run_rx_data *data = &sc->rxq.data[i];
4729 1.1 nonaka
4730 1.10.6.7 skrll usbd_setup_xfer(data->xfer, data, data->buf, RUN_MAX_RXSZ,
4731 1.10.6.7 skrll USBD_SHORT_XFER_OK, USBD_NO_TIMEOUT, run_rxeof);
4732 1.1 nonaka error = usbd_transfer(data->xfer);
4733 1.1 nonaka if (error != USBD_NORMAL_COMPLETION &&
4734 1.1 nonaka error != USBD_IN_PROGRESS)
4735 1.1 nonaka goto fail;
4736 1.1 nonaka }
4737 1.1 nonaka
4738 1.1 nonaka if ((error = run_txrx_enable(sc)) != 0)
4739 1.1 nonaka goto fail;
4740 1.1 nonaka
4741 1.1 nonaka ifp->if_flags &= ~IFF_OACTIVE;
4742 1.1 nonaka ifp->if_flags |= IFF_RUNNING;
4743 1.1 nonaka
4744 1.1 nonaka if (ic->ic_opmode == IEEE80211_M_MONITOR)
4745 1.1 nonaka ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
4746 1.1 nonaka else
4747 1.1 nonaka ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
4748 1.1 nonaka
4749 1.1 nonaka if (error != 0)
4750 1.1 nonaka fail: run_stop(ifp, 1);
4751 1.10.6.2 skrll return error;
4752 1.1 nonaka }
4753 1.1 nonaka
4754 1.1 nonaka static void
4755 1.1 nonaka run_stop(struct ifnet *ifp, int disable)
4756 1.1 nonaka {
4757 1.1 nonaka struct run_softc *sc = ifp->if_softc;
4758 1.1 nonaka struct ieee80211com *ic = &sc->sc_ic;
4759 1.1 nonaka uint32_t tmp;
4760 1.1 nonaka int ntries, qid;
4761 1.1 nonaka
4762 1.1 nonaka if (ifp->if_flags & IFF_RUNNING)
4763 1.1 nonaka run_set_leds(sc, 0); /* turn all LEDs off */
4764 1.1 nonaka
4765 1.1 nonaka sc->sc_tx_timer = 0;
4766 1.1 nonaka ifp->if_timer = 0;
4767 1.1 nonaka ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
4768 1.1 nonaka
4769 1.1 nonaka callout_stop(&sc->scan_to);
4770 1.1 nonaka callout_stop(&sc->calib_to);
4771 1.1 nonaka
4772 1.1 nonaka ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
4773 1.1 nonaka /* wait for all queued asynchronous commands to complete */
4774 1.1 nonaka while (sc->cmdq.queued > 0)
4775 1.1 nonaka tsleep(&sc->cmdq, 0, "cmdq", 0);
4776 1.1 nonaka
4777 1.1 nonaka /* disable Tx/Rx */
4778 1.1 nonaka run_read(sc, RT2860_MAC_SYS_CTRL, &tmp);
4779 1.1 nonaka tmp &= ~(RT2860_MAC_RX_EN | RT2860_MAC_TX_EN);
4780 1.1 nonaka run_write(sc, RT2860_MAC_SYS_CTRL, tmp);
4781 1.1 nonaka
4782 1.1 nonaka /* wait for pending Tx to complete */
4783 1.1 nonaka for (ntries = 0; ntries < 100; ntries++) {
4784 1.1 nonaka if (run_read(sc, RT2860_TXRXQ_PCNT, &tmp) != 0)
4785 1.1 nonaka break;
4786 1.1 nonaka if ((tmp & RT2860_TX2Q_PCNT_MASK) == 0)
4787 1.1 nonaka break;
4788 1.1 nonaka }
4789 1.1 nonaka DELAY(1000);
4790 1.1 nonaka run_write(sc, RT2860_USB_DMA_CFG, 0);
4791 1.1 nonaka
4792 1.1 nonaka /* reset adapter */
4793 1.1 nonaka run_write(sc, RT2860_MAC_SYS_CTRL, RT2860_BBP_HRST | RT2860_MAC_SRST);
4794 1.1 nonaka run_write(sc, RT2860_MAC_SYS_CTRL, 0);
4795 1.1 nonaka
4796 1.1 nonaka /* reset Tx and Rx rings */
4797 1.1 nonaka sc->qfullmsk = 0;
4798 1.1 nonaka for (qid = 0; qid < 4; qid++)
4799 1.1 nonaka run_free_tx_ring(sc, qid);
4800 1.1 nonaka run_free_rx_ring(sc);
4801 1.1 nonaka }
4802 1.1 nonaka
4803 1.1 nonaka #ifndef IEEE80211_STA_ONLY
4804 1.1 nonaka static int
4805 1.1 nonaka run_setup_beacon(struct run_softc *sc)
4806 1.1 nonaka {
4807 1.1 nonaka struct ieee80211com *ic = &sc->sc_ic;
4808 1.1 nonaka struct rt2860_txwi txwi;
4809 1.1 nonaka struct mbuf *m;
4810 1.10.6.11 skrll uint16_t txwisize;
4811 1.1 nonaka int ridx;
4812 1.1 nonaka
4813 1.1 nonaka if ((m = ieee80211_beacon_alloc(ic, ic->ic_bss, &sc->sc_bo)) == NULL)
4814 1.10.6.2 skrll return ENOBUFS;
4815 1.1 nonaka
4816 1.10.6.6 skrll memset(&txwi, 0, sizeof(txwi));
4817 1.1 nonaka txwi.wcid = 0xff;
4818 1.1 nonaka txwi.len = htole16(m->m_pkthdr.len);
4819 1.1 nonaka /* send beacons at the lowest available rate */
4820 1.1 nonaka ridx = (ic->ic_curmode == IEEE80211_MODE_11A) ?
4821 1.1 nonaka RT2860_RIDX_OFDM6 : RT2860_RIDX_CCK1;
4822 1.1 nonaka txwi.phy = htole16(rt2860_rates[ridx].mcs);
4823 1.1 nonaka if (rt2860_rates[ridx].phy == IEEE80211_T_OFDM)
4824 1.1 nonaka txwi.phy |= htole16(RT2860_PHY_OFDM);
4825 1.1 nonaka txwi.txop = RT2860_TX_TXOP_HT;
4826 1.1 nonaka txwi.flags = RT2860_TX_TS;
4827 1.1 nonaka
4828 1.10.6.11 skrll txwisize = (sc->mac_ver == 0x5592) ?
4829 1.10.6.11 skrll sizeof(txwi) + sizeof(uint32_t) : sizeof(txwi);
4830 1.1 nonaka run_write_region_1(sc, RT2860_BCN_BASE(0),
4831 1.10.6.11 skrll (uint8_t *)&txwi, txwisize);
4832 1.10.6.11 skrll run_write_region_1(sc, RT2860_BCN_BASE(0) + txwisize,
4833 1.10.6.11 skrll mtod(m, uint8_t *), (m->m_pkthdr.len + 1) & ~1);
4834 1.1 nonaka
4835 1.1 nonaka m_freem(m);
4836 1.1 nonaka
4837 1.10.6.2 skrll return 0;
4838 1.1 nonaka }
4839 1.1 nonaka #endif
4840 1.1 nonaka
4841 1.2 nonaka MODULE(MODULE_CLASS_DRIVER, if_run, "bpf");
4842 1.1 nonaka
4843 1.1 nonaka #ifdef _MODULE
4844 1.1 nonaka #include "ioconf.c"
4845 1.1 nonaka #endif
4846 1.1 nonaka
4847 1.1 nonaka static int
4848 1.1 nonaka if_run_modcmd(modcmd_t cmd, void *arg)
4849 1.1 nonaka {
4850 1.1 nonaka int error = 0;
4851 1.1 nonaka
4852 1.1 nonaka switch (cmd) {
4853 1.1 nonaka case MODULE_CMD_INIT:
4854 1.1 nonaka #ifdef _MODULE
4855 1.1 nonaka error = config_init_component(cfdriver_ioconf_run,
4856 1.1 nonaka cfattach_ioconf_run, cfdata_ioconf_run);
4857 1.1 nonaka #endif
4858 1.10.6.2 skrll return error;
4859 1.1 nonaka case MODULE_CMD_FINI:
4860 1.1 nonaka #ifdef _MODULE
4861 1.1 nonaka error = config_fini_component(cfdriver_ioconf_run,
4862 1.1 nonaka cfattach_ioconf_run, cfdata_ioconf_run);
4863 1.1 nonaka #endif
4864 1.10.6.2 skrll return error;
4865 1.1 nonaka default:
4866 1.10.6.2 skrll return ENOTTY;
4867 1.1 nonaka }
4868 1.1 nonaka }
4869