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