xref: /netbsd-src/sys/dev/ic/rt2661.c (revision 796c32c94f6e154afc9de0f63da35c91bb739b45)
1 /*	$NetBSD: rt2661.c,v 1.36 2017/10/23 09:31:17 msaitoh Exp $	*/
2 /*	$OpenBSD: rt2661.c,v 1.17 2006/05/01 08:41:11 damien Exp $	*/
3 /*	$FreeBSD: rt2560.c,v 1.5 2006/06/02 19:59:31 csjp Exp $	*/
4 
5 /*-
6  * Copyright (c) 2006
7  *	Damien Bergamini <damien.bergamini@free.fr>
8  *
9  * Permission to use, copy, modify, and distribute this software for any
10  * purpose with or without fee is hereby granted, provided that the above
11  * copyright notice and this permission notice appear in all copies.
12  *
13  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
14  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
15  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
16  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
17  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
18  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
19  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
20  */
21 
22 /*-
23  * Ralink Technology RT2561, RT2561S and RT2661 chipset driver
24  * http://www.ralinktech.com/
25  */
26 
27 #include <sys/cdefs.h>
28 __KERNEL_RCSID(0, "$NetBSD: rt2661.c,v 1.36 2017/10/23 09:31:17 msaitoh Exp $");
29 
30 
31 #include <sys/param.h>
32 #include <sys/sockio.h>
33 #include <sys/sysctl.h>
34 #include <sys/mbuf.h>
35 #include <sys/kernel.h>
36 #include <sys/socket.h>
37 #include <sys/systm.h>
38 #include <sys/malloc.h>
39 #include <sys/callout.h>
40 #include <sys/conf.h>
41 #include <sys/device.h>
42 
43 #include <sys/bus.h>
44 #include <machine/endian.h>
45 #include <sys/intr.h>
46 
47 #include <net/bpf.h>
48 #include <net/if.h>
49 #include <net/if_arp.h>
50 #include <net/if_dl.h>
51 #include <net/if_media.h>
52 #include <net/if_types.h>
53 #include <net/if_ether.h>
54 
55 #include <netinet/in.h>
56 #include <netinet/in_systm.h>
57 #include <netinet/in_var.h>
58 #include <netinet/ip.h>
59 
60 #include <net80211/ieee80211_var.h>
61 #include <net80211/ieee80211_amrr.h>
62 #include <net80211/ieee80211_radiotap.h>
63 
64 #include <dev/ic/rt2661reg.h>
65 #include <dev/ic/rt2661var.h>
66 
67 #include <dev/pci/pcireg.h>
68 #include <dev/pci/pcivar.h>
69 #include <dev/pci/pcidevs.h>
70 
71 #include <dev/firmload.h>
72 
73 #ifdef RAL_DEBUG
74 #define DPRINTF(x)	do { if (rt2661_debug > 0) printf x; } while (0)
75 #define DPRINTFN(n, x)	do { if (rt2661_debug >= (n)) printf x; } while (0)
76 int rt2661_debug = 0;
77 #else
78 #define DPRINTF(x)
79 #define DPRINTFN(n, x)
80 #endif
81 
82 static int	rt2661_alloc_tx_ring(struct rt2661_softc *,
83 		    struct rt2661_tx_ring *, int);
84 static void	rt2661_reset_tx_ring(struct rt2661_softc *,
85 		    struct rt2661_tx_ring *);
86 static void	rt2661_free_tx_ring(struct rt2661_softc *,
87 		    struct rt2661_tx_ring *);
88 static int	rt2661_alloc_rx_ring(struct rt2661_softc *,
89 		    struct rt2661_rx_ring *, int);
90 static void	rt2661_reset_rx_ring(struct rt2661_softc *,
91 		    struct rt2661_rx_ring *);
92 static void	rt2661_free_rx_ring(struct rt2661_softc *,
93 		    struct rt2661_rx_ring *);
94 static struct ieee80211_node *
95 		rt2661_node_alloc(struct ieee80211_node_table *);
96 static int	rt2661_media_change(struct ifnet *);
97 static void	rt2661_next_scan(void *);
98 static void	rt2661_iter_func(void *, struct ieee80211_node *);
99 static void	rt2661_updatestats(void *);
100 static void	rt2661_newassoc(struct ieee80211_node *, int);
101 static int	rt2661_newstate(struct ieee80211com *, enum ieee80211_state,
102 		    int);
103 static uint16_t	rt2661_eeprom_read(struct rt2661_softc *, uint8_t);
104 static void	rt2661_tx_intr(struct rt2661_softc *);
105 static void	rt2661_tx_dma_intr(struct rt2661_softc *,
106 		    struct rt2661_tx_ring *);
107 static void	rt2661_rx_intr(struct rt2661_softc *);
108 static void	rt2661_mcu_beacon_expire(struct rt2661_softc *);
109 static void	rt2661_mcu_wakeup(struct rt2661_softc *);
110 static void	rt2661_mcu_cmd_intr(struct rt2661_softc *);
111 int		rt2661_intr(void *);
112 static uint8_t	rt2661_rxrate(struct rt2661_rx_desc *);
113 static int	rt2661_ack_rate(struct ieee80211com *, int);
114 static uint16_t	rt2661_txtime(int, int, uint32_t);
115 static uint8_t	rt2661_plcp_signal(int);
116 static void	rt2661_setup_tx_desc(struct rt2661_softc *,
117 		    struct rt2661_tx_desc *, uint32_t, uint16_t, int, int,
118 		    const bus_dma_segment_t *, int, int);
119 static int	rt2661_tx_mgt(struct rt2661_softc *, struct mbuf *,
120 		    struct ieee80211_node *);
121 static struct mbuf *
122 		rt2661_get_rts(struct rt2661_softc *,
123 		    struct ieee80211_frame *, uint16_t);
124 static int	rt2661_tx_data(struct rt2661_softc *, struct mbuf *,
125 		    struct ieee80211_node *, int);
126 static void	rt2661_start(struct ifnet *);
127 static void	rt2661_watchdog(struct ifnet *);
128 static int	rt2661_reset(struct ifnet *);
129 static int	rt2661_ioctl(struct ifnet *, u_long, void *);
130 static void	rt2661_bbp_write(struct rt2661_softc *, uint8_t, uint8_t);
131 static uint8_t	rt2661_bbp_read(struct rt2661_softc *, uint8_t);
132 static void	rt2661_rf_write(struct rt2661_softc *, uint8_t, uint32_t);
133 static int	rt2661_tx_cmd(struct rt2661_softc *, uint8_t, uint16_t);
134 static void	rt2661_select_antenna(struct rt2661_softc *);
135 static void	rt2661_enable_mrr(struct rt2661_softc *);
136 static void	rt2661_set_txpreamble(struct rt2661_softc *);
137 static void	rt2661_set_basicrates(struct rt2661_softc *,
138 			const struct ieee80211_rateset *);
139 static void	rt2661_select_band(struct rt2661_softc *,
140 		    struct ieee80211_channel *);
141 static void	rt2661_set_chan(struct rt2661_softc *,
142 		    struct ieee80211_channel *);
143 static void	rt2661_set_bssid(struct rt2661_softc *, const uint8_t *);
144 static void	rt2661_set_macaddr(struct rt2661_softc *, const uint8_t *);
145 static void	rt2661_update_promisc(struct rt2661_softc *);
146 #if 0
147 static int	rt2661_wme_update(struct ieee80211com *);
148 #endif
149 
150 static void	rt2661_updateslot(struct ifnet *);
151 static void	rt2661_set_slottime(struct rt2661_softc *);
152 static const char *
153 		rt2661_get_rf(int);
154 static void	rt2661_read_eeprom(struct rt2661_softc *);
155 static int	rt2661_bbp_init(struct rt2661_softc *);
156 static int     	rt2661_init(struct ifnet *);
157 static void	rt2661_stop(struct ifnet *, int);
158 static int	rt2661_load_microcode(struct rt2661_softc *, const uint8_t *,
159 		    int);
160 static void	rt2661_rx_tune(struct rt2661_softc *);
161 #ifdef notyet
162 static void	rt2661_radar_start(struct rt2661_softc *);
163 static int	rt2661_radar_stop(struct rt2661_softc *);
164 #endif
165 static int	rt2661_prepare_beacon(struct rt2661_softc *);
166 static void	rt2661_enable_tsf_sync(struct rt2661_softc *);
167 static int	rt2661_get_rssi(struct rt2661_softc *, uint8_t);
168 static void	rt2661_softintr(void *);
169 
170 /*
171  * Supported rates for 802.11a/b/g modes (in 500Kbps unit).
172  */
173 static const struct ieee80211_rateset rt2661_rateset_11a =
174 	{ 8, { 12, 18, 24, 36, 48, 72, 96, 108 } };
175 
176 static const struct ieee80211_rateset rt2661_rateset_11b =
177 	{ 4, { 2, 4, 11, 22 } };
178 
179 static const struct ieee80211_rateset rt2661_rateset_11g =
180 	{ 12, { 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108 } };
181 
182 static const struct {
183 	uint32_t	reg;
184 	uint32_t	val;
185 } rt2661_def_mac[] = {
186 	RT2661_DEF_MAC
187 };
188 
189 static const struct {
190 	uint8_t	reg;
191 	uint8_t	val;
192 } rt2661_def_bbp[] = {
193 	RT2661_DEF_BBP
194 };
195 
196 static const struct rfprog {
197 	uint8_t		chan;
198 	uint32_t	r1, r2, r3, r4;
199 } rt2661_rf5225_1[] = {
200 	RT2661_RF5225_1
201 }, rt2661_rf5225_2[] = {
202 	RT2661_RF5225_2
203 };
204 
205 int
206 rt2661_attach(void *xsc, int id)
207 {
208 	struct rt2661_softc *sc = xsc;
209 	struct ieee80211com *ic = &sc->sc_ic;
210 	struct ifnet *ifp = &sc->sc_if;
211 	uint32_t val;
212 	int error, i, ntries;
213 
214 	sc->sc_id = id;
215 
216 	sc->amrr.amrr_min_success_threshold =  1;
217 	sc->amrr.amrr_max_success_threshold = 15;
218 	callout_init(&sc->scan_ch, 0);
219 	callout_init(&sc->amrr_ch, 0);
220 
221 	/* wait for NIC to initialize */
222 	for (ntries = 0; ntries < 1000; ntries++) {
223 		if ((val = RAL_READ(sc, RT2661_MAC_CSR0)) != 0)
224 			break;
225 		DELAY(1000);
226 	}
227 	if (ntries == 1000) {
228 		aprint_error_dev(sc->sc_dev, "timeout waiting for NIC to initialize\n");
229 		return EIO;
230 	}
231 
232 	/* retrieve RF rev. no and various other things from EEPROM */
233 	rt2661_read_eeprom(sc);
234 	aprint_normal_dev(sc->sc_dev, "802.11 address %s\n",
235 	    ether_sprintf(ic->ic_myaddr));
236 
237 	aprint_normal_dev(sc->sc_dev, "MAC/BBP RT%X, RF %s\n", val,
238 	    rt2661_get_rf(sc->rf_rev));
239 
240 	sc->sc_soft_ih = softint_establish(SOFTINT_NET, rt2661_softintr, sc);
241 	if (sc->sc_soft_ih == NULL) {
242 		aprint_error_dev(sc->sc_dev, "could not establish softint\n");
243 		goto fail0;
244 	}
245 
246 	/*
247 	 * Allocate Tx and Rx rings.
248 	 */
249 	error = rt2661_alloc_tx_ring(sc, &sc->txq[0], RT2661_TX_RING_COUNT);
250 	if (error != 0) {
251 		aprint_error_dev(sc->sc_dev, "could not allocate Tx ring 0\n");
252 		goto fail1;
253 	}
254 
255 	error = rt2661_alloc_tx_ring(sc, &sc->txq[1], RT2661_TX_RING_COUNT);
256 	if (error != 0) {
257 		aprint_error_dev(sc->sc_dev, "could not allocate Tx ring 1\n");
258 		goto fail2;
259 	}
260 
261 	error = rt2661_alloc_tx_ring(sc, &sc->txq[2], RT2661_TX_RING_COUNT);
262 	if (error != 0) {
263 		aprint_error_dev(sc->sc_dev, "could not allocate Tx ring 2\n");
264 		goto fail3;
265 	}
266 
267 	error = rt2661_alloc_tx_ring(sc, &sc->txq[3], RT2661_TX_RING_COUNT);
268 	if (error != 0) {
269 		aprint_error_dev(sc->sc_dev, "could not allocate Tx ring 3\n");
270 		goto fail4;
271 	}
272 
273 	error = rt2661_alloc_tx_ring(sc, &sc->mgtq, RT2661_MGT_RING_COUNT);
274 	if (error != 0) {
275 		aprint_error_dev(sc->sc_dev, "could not allocate Mgt ring\n");
276 		goto fail5;
277 	}
278 
279 	error = rt2661_alloc_rx_ring(sc, &sc->rxq, RT2661_RX_RING_COUNT);
280 	if (error != 0) {
281 		aprint_error_dev(sc->sc_dev, "could not allocate Rx ring\n");
282 		goto fail6;
283 	}
284 
285 	ifp->if_softc = sc;
286 	ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
287 	ifp->if_init = rt2661_init;
288 	ifp->if_stop = rt2661_stop;
289 	ifp->if_ioctl = rt2661_ioctl;
290 	ifp->if_start = rt2661_start;
291 	ifp->if_watchdog = rt2661_watchdog;
292 	IFQ_SET_READY(&ifp->if_snd);
293 	memcpy(ifp->if_xname, device_xname(sc->sc_dev), IFNAMSIZ);
294 
295 	ic->ic_ifp = ifp;
296 	ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */
297 	ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */
298 	ic->ic_state = IEEE80211_S_INIT;
299 
300 	/* set device capabilities */
301 	ic->ic_caps =
302 	    IEEE80211_C_IBSS |		/* IBSS mode supported */
303 	    IEEE80211_C_MONITOR |	/* monitor mode supported */
304 	    IEEE80211_C_HOSTAP |	/* HostAP mode supported */
305 	    IEEE80211_C_TXPMGT |	/* tx power management */
306 	    IEEE80211_C_SHPREAMBLE |	/* short preamble supported */
307 	    IEEE80211_C_SHSLOT |	/* short slot time supported */
308 	    IEEE80211_C_WPA;		/* 802.11i */
309 
310 	if (sc->rf_rev == RT2661_RF_5225 || sc->rf_rev == RT2661_RF_5325) {
311 		/* set supported .11a rates */
312 		ic->ic_sup_rates[IEEE80211_MODE_11A] = rt2661_rateset_11a;
313 
314 		/* set supported .11a channels */
315 		for (i = 36; i <= 64; i += 4) {
316 			ic->ic_channels[i].ic_freq =
317 			    ieee80211_ieee2mhz(i, IEEE80211_CHAN_5GHZ);
318 			ic->ic_channels[i].ic_flags = IEEE80211_CHAN_A;
319 		}
320 		for (i = 100; i <= 140; i += 4) {
321 			ic->ic_channels[i].ic_freq =
322 			    ieee80211_ieee2mhz(i, IEEE80211_CHAN_5GHZ);
323 			ic->ic_channels[i].ic_flags = IEEE80211_CHAN_A;
324 		}
325 		for (i = 149; i <= 165; i += 4) {
326 			ic->ic_channels[i].ic_freq =
327 			    ieee80211_ieee2mhz(i, IEEE80211_CHAN_5GHZ);
328 			ic->ic_channels[i].ic_flags = IEEE80211_CHAN_A;
329 		}
330 	}
331 
332 	/* set supported .11b and .11g rates */
333 	ic->ic_sup_rates[IEEE80211_MODE_11B] = rt2661_rateset_11b;
334 	ic->ic_sup_rates[IEEE80211_MODE_11G] = rt2661_rateset_11g;
335 
336 	/* set supported .11b and .11g channels (1 through 14) */
337 	for (i = 1; i <= 14; i++) {
338 		ic->ic_channels[i].ic_freq =
339 		    ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ);
340 		ic->ic_channels[i].ic_flags =
341 		    IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM |
342 		    IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ;
343 	}
344 
345 	error = if_initialize(ifp);
346 	if (error != 0) {
347 		aprint_error_dev(sc->sc_dev, "if_initialize failed(%d)\n",
348 		    error);
349 		goto fail7;
350 	}
351 	ieee80211_ifattach(ic);
352 	/* Use common softint-based if_input */
353 	ifp->if_percpuq = if_percpuq_create(ifp);
354 	if_register(ifp);
355 
356 	ic->ic_node_alloc = rt2661_node_alloc;
357 	ic->ic_newassoc = rt2661_newassoc;
358 	ic->ic_updateslot = rt2661_updateslot;
359 	ic->ic_reset = rt2661_reset;
360 
361 	/* override state transition machine */
362 	sc->sc_newstate = ic->ic_newstate;
363 	ic->ic_newstate = rt2661_newstate;
364 	ieee80211_media_init(ic, rt2661_media_change, ieee80211_media_status);
365 
366 	bpf_attach2(ifp, DLT_IEEE802_11_RADIO,
367 	    sizeof(struct ieee80211_frame) + sizeof(sc->sc_txtap),
368 	    &sc->sc_drvbpf);
369 
370 	sc->sc_rxtap_len = roundup(sizeof(sc->sc_rxtap), sizeof(u_int32_t));
371 	sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len);
372 	sc->sc_rxtap.wr_ihdr.it_present = htole32(RT2661_RX_RADIOTAP_PRESENT);
373 
374 	sc->sc_txtap_len = roundup(sizeof(sc->sc_txtap), sizeof(u_int32_t));
375 	sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len);
376 	sc->sc_txtap.wt_ihdr.it_present = htole32(RT2661_TX_RADIOTAP_PRESENT);
377 
378 	ieee80211_announce(ic);
379 
380 	if (pmf_device_register(sc->sc_dev, NULL, NULL))
381 		pmf_class_network_register(sc->sc_dev, ifp);
382 	else
383 		aprint_error_dev(sc->sc_dev,
384 		    "couldn't establish power handler\n");
385 
386 	return 0;
387 
388 fail7:	rt2661_free_rx_ring(sc, &sc->rxq);
389 fail6:	rt2661_free_tx_ring(sc, &sc->mgtq);
390 fail5:	rt2661_free_tx_ring(sc, &sc->txq[3]);
391 fail4:	rt2661_free_tx_ring(sc, &sc->txq[2]);
392 fail3:	rt2661_free_tx_ring(sc, &sc->txq[1]);
393 fail2:	rt2661_free_tx_ring(sc, &sc->txq[0]);
394 fail1:	softint_disestablish(sc->sc_soft_ih);
395 	sc->sc_soft_ih = NULL;
396 fail0:	return ENXIO;
397 }
398 
399 int
400 rt2661_detach(void *xsc)
401 {
402 	struct rt2661_softc *sc = xsc;
403 	struct ifnet *ifp = &sc->sc_if;
404 
405 	callout_stop(&sc->scan_ch);
406 	callout_stop(&sc->amrr_ch);
407 
408 	pmf_device_deregister(sc->sc_dev);
409 
410 	ieee80211_ifdetach(&sc->sc_ic);
411 	if_detach(ifp);
412 
413 	rt2661_free_tx_ring(sc, &sc->txq[0]);
414 	rt2661_free_tx_ring(sc, &sc->txq[1]);
415 	rt2661_free_tx_ring(sc, &sc->txq[2]);
416 	rt2661_free_tx_ring(sc, &sc->txq[3]);
417 	rt2661_free_tx_ring(sc, &sc->mgtq);
418 	rt2661_free_rx_ring(sc, &sc->rxq);
419 
420 	if (sc->sc_soft_ih != NULL) {
421 		softint_disestablish(sc->sc_soft_ih);
422 		sc->sc_soft_ih = NULL;
423 	}
424 
425 	return 0;
426 }
427 
428 static int
429 rt2661_alloc_tx_ring(struct rt2661_softc *sc, struct rt2661_tx_ring *ring,
430     int count)
431 {
432 	int i, nsegs, error;
433 
434 	ring->count = count;
435 	ring->queued = 0;
436 	ring->cur = ring->next = ring->stat = 0;
437 
438 	error = bus_dmamap_create(sc->sc_dmat, count * RT2661_TX_DESC_SIZE, 1,
439 	    count * RT2661_TX_DESC_SIZE, 0, BUS_DMA_NOWAIT, &ring->map);
440 	if (error != 0) {
441 		aprint_error_dev(sc->sc_dev, "could not create desc DMA map\n");
442 		goto fail;
443 	}
444 
445 	error = bus_dmamem_alloc(sc->sc_dmat, count * RT2661_TX_DESC_SIZE,
446 	    PAGE_SIZE, 0, &ring->seg, 1, &nsegs, BUS_DMA_NOWAIT);
447 	if (error != 0) {
448 		aprint_error_dev(sc->sc_dev, "could not allocate DMA memory\n");
449 		goto fail;
450 	}
451 
452 	error = bus_dmamem_map(sc->sc_dmat, &ring->seg, nsegs,
453 	    count * RT2661_TX_DESC_SIZE, (void **)&ring->desc,
454 	    BUS_DMA_NOWAIT);
455 	if (error != 0) {
456 		aprint_error_dev(sc->sc_dev, "could not map desc DMA memory\n");
457 		goto fail;
458 	}
459 
460 	error = bus_dmamap_load(sc->sc_dmat, ring->map, ring->desc,
461 	    count * RT2661_TX_DESC_SIZE, NULL, BUS_DMA_NOWAIT);
462 	if (error != 0) {
463 		aprint_error_dev(sc->sc_dev, "could not load desc DMA map\n");
464 		goto fail;
465 	}
466 
467 	memset(ring->desc, 0, count * RT2661_TX_DESC_SIZE);
468 	ring->physaddr = ring->map->dm_segs->ds_addr;
469 
470 	ring->data = malloc(count * sizeof (struct rt2661_tx_data), M_DEVBUF,
471 	    M_NOWAIT);
472 	if (ring->data == NULL) {
473 		aprint_error_dev(sc->sc_dev, "could not allocate soft data\n");
474 		error = ENOMEM;
475 		goto fail;
476 	}
477 
478 	memset(ring->data, 0, count * sizeof (struct rt2661_tx_data));
479 	for (i = 0; i < count; i++) {
480 		error = bus_dmamap_create(sc->sc_dmat, MCLBYTES,
481 		    RT2661_MAX_SCATTER, MCLBYTES, 0, BUS_DMA_NOWAIT,
482 		    &ring->data[i].map);
483 		if (error != 0) {
484 			aprint_error_dev(sc->sc_dev, "could not create DMA map\n");
485 			goto fail;
486 		}
487 	}
488 
489 	return 0;
490 
491 fail:	rt2661_free_tx_ring(sc, ring);
492 	return error;
493 }
494 
495 static void
496 rt2661_reset_tx_ring(struct rt2661_softc *sc, struct rt2661_tx_ring *ring)
497 {
498 	struct rt2661_tx_desc *desc;
499 	struct rt2661_tx_data *data;
500 	int i;
501 
502 	for (i = 0; i < ring->count; i++) {
503 		desc = &ring->desc[i];
504 		data = &ring->data[i];
505 
506 		if (data->m != NULL) {
507 			bus_dmamap_sync(sc->sc_dmat, data->map, 0,
508 			    data->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
509 			bus_dmamap_unload(sc->sc_dmat, data->map);
510 			m_freem(data->m);
511 			data->m = NULL;
512 		}
513 
514 		if (data->ni != NULL) {
515 			ieee80211_free_node(data->ni);
516 			data->ni = NULL;
517 		}
518 
519 		desc->flags = 0;
520 	}
521 
522 	bus_dmamap_sync(sc->sc_dmat, ring->map, 0, ring->map->dm_mapsize,
523 	    BUS_DMASYNC_PREWRITE);
524 
525 	ring->queued = 0;
526 	ring->cur = ring->next = ring->stat = 0;
527 }
528 
529 
530 static void
531 rt2661_free_tx_ring(struct rt2661_softc *sc, struct rt2661_tx_ring *ring)
532 {
533 	struct rt2661_tx_data *data;
534 	int i;
535 
536 	if (ring->desc != NULL) {
537 		bus_dmamap_sync(sc->sc_dmat, ring->map, 0,
538 		    ring->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
539 		bus_dmamap_unload(sc->sc_dmat, ring->map);
540 		bus_dmamem_unmap(sc->sc_dmat, (void *)ring->desc,
541 		    ring->count * RT2661_TX_DESC_SIZE);
542 		bus_dmamem_free(sc->sc_dmat, &ring->seg, 1);
543 	}
544 
545 	if (ring->data != NULL) {
546 		for (i = 0; i < ring->count; i++) {
547 			data = &ring->data[i];
548 
549 			if (data->m != NULL) {
550 				bus_dmamap_sync(sc->sc_dmat, data->map, 0,
551 				    data->map->dm_mapsize,
552 				    BUS_DMASYNC_POSTWRITE);
553 				bus_dmamap_unload(sc->sc_dmat, data->map);
554 				m_freem(data->m);
555 			}
556 
557 			if (data->ni != NULL)
558 				ieee80211_free_node(data->ni);
559 
560 			if (data->map != NULL)
561 				bus_dmamap_destroy(sc->sc_dmat, data->map);
562 		}
563 		free(ring->data, M_DEVBUF);
564 	}
565 }
566 
567 static int
568 rt2661_alloc_rx_ring(struct rt2661_softc *sc, struct rt2661_rx_ring *ring,
569     int count)
570 {
571 	struct rt2661_rx_desc *desc;
572 	struct rt2661_rx_data *data;
573 	int i, nsegs, error;
574 
575 	ring->count = count;
576 	ring->cur = ring->next = 0;
577 
578 	error = bus_dmamap_create(sc->sc_dmat, count * RT2661_RX_DESC_SIZE, 1,
579 	    count * RT2661_RX_DESC_SIZE, 0, BUS_DMA_NOWAIT, &ring->map);
580 	if (error != 0) {
581 		aprint_error_dev(sc->sc_dev, "could not create desc DMA map\n");
582 		goto fail;
583 	}
584 
585 	error = bus_dmamem_alloc(sc->sc_dmat, count * RT2661_RX_DESC_SIZE,
586 	    PAGE_SIZE, 0, &ring->seg, 1, &nsegs, BUS_DMA_NOWAIT);
587 	if (error != 0) {
588 		aprint_error_dev(sc->sc_dev, "could not allocate DMA memory\n");
589 		goto fail;
590 	}
591 
592 	error = bus_dmamem_map(sc->sc_dmat, &ring->seg, nsegs,
593 	    count * RT2661_RX_DESC_SIZE, (void **)&ring->desc,
594 	    BUS_DMA_NOWAIT);
595 	if (error != 0) {
596 		aprint_error_dev(sc->sc_dev, "could not map desc DMA memory\n");
597 		goto fail;
598 	}
599 
600 	error = bus_dmamap_load(sc->sc_dmat, ring->map, ring->desc,
601 	    count * RT2661_RX_DESC_SIZE, NULL, BUS_DMA_NOWAIT);
602 	if (error != 0) {
603 		aprint_error_dev(sc->sc_dev, "could not load desc DMA map\n");
604 		goto fail;
605 	}
606 
607 	memset(ring->desc, 0, count * RT2661_RX_DESC_SIZE);
608 	ring->physaddr = ring->map->dm_segs->ds_addr;
609 
610 	ring->data = malloc(count * sizeof (struct rt2661_rx_data), M_DEVBUF,
611 	    M_NOWAIT);
612 	if (ring->data == NULL) {
613 		aprint_error_dev(sc->sc_dev, "could not allocate soft data\n");
614 		error = ENOMEM;
615 		goto fail;
616 	}
617 
618 	/*
619 	 * Pre-allocate Rx buffers and populate Rx ring.
620 	 */
621 	memset(ring->data, 0, count * sizeof (struct rt2661_rx_data));
622 	for (i = 0; i < count; i++) {
623 		desc = &sc->rxq.desc[i];
624 		data = &sc->rxq.data[i];
625 
626 		error = bus_dmamap_create(sc->sc_dmat, MCLBYTES, 1, MCLBYTES,
627 		    0, BUS_DMA_NOWAIT, &data->map);
628 		if (error != 0) {
629 			aprint_error_dev(sc->sc_dev, "could not create DMA map\n");
630 			goto fail;
631 		}
632 
633 		MGETHDR(data->m, M_DONTWAIT, MT_DATA);
634 		if (data->m == NULL) {
635 			aprint_error_dev(sc->sc_dev, "could not allocate rx mbuf\n");
636 			error = ENOMEM;
637 			goto fail;
638 		}
639 
640 		MCLGET(data->m, M_DONTWAIT);
641 		if (!(data->m->m_flags & M_EXT)) {
642 			aprint_error_dev(sc->sc_dev, "could not allocate rx mbuf cluster\n");
643 			error = ENOMEM;
644 			goto fail;
645 		}
646 
647 		error = bus_dmamap_load(sc->sc_dmat, data->map,
648 		    mtod(data->m, void *), MCLBYTES, NULL, BUS_DMA_NOWAIT);
649 		if (error != 0) {
650 			aprint_error_dev(sc->sc_dev, "could not load rx buf DMA map");
651 			goto fail;
652 		}
653 
654 		desc->physaddr = htole32(data->map->dm_segs->ds_addr);
655 		desc->flags = htole32(RT2661_RX_BUSY);
656 	}
657 
658 	bus_dmamap_sync(sc->sc_dmat, ring->map, 0, ring->map->dm_mapsize,
659 	    BUS_DMASYNC_PREWRITE);
660 
661 	return 0;
662 
663 fail:	rt2661_free_rx_ring(sc, ring);
664 	return error;
665 }
666 
667 static void
668 rt2661_reset_rx_ring(struct rt2661_softc *sc, struct rt2661_rx_ring *ring)
669 {
670 	int i;
671 
672 	for (i = 0; i < ring->count; i++)
673 		ring->desc[i].flags = htole32(RT2661_RX_BUSY);
674 
675 	bus_dmamap_sync(sc->sc_dmat, ring->map, 0, ring->map->dm_mapsize,
676 	    BUS_DMASYNC_PREWRITE);
677 
678 	ring->cur = ring->next = 0;
679 }
680 
681 static void
682 rt2661_free_rx_ring(struct rt2661_softc *sc, struct rt2661_rx_ring *ring)
683 {
684 	struct rt2661_rx_data *data;
685 	int i;
686 
687 	if (ring->desc != NULL) {
688 		bus_dmamap_sync(sc->sc_dmat, ring->map, 0,
689 		    ring->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
690 		bus_dmamap_unload(sc->sc_dmat, ring->map);
691 		bus_dmamem_unmap(sc->sc_dmat, (void *)ring->desc,
692 		    ring->count * RT2661_RX_DESC_SIZE);
693 		bus_dmamem_free(sc->sc_dmat, &ring->seg, 1);
694 	}
695 
696 	if (ring->data != NULL) {
697 		for (i = 0; i < ring->count; i++) {
698 			data = &ring->data[i];
699 
700 			if (data->m != NULL) {
701 				bus_dmamap_sync(sc->sc_dmat, data->map, 0,
702 				    data->map->dm_mapsize,
703 				    BUS_DMASYNC_POSTREAD);
704 				bus_dmamap_unload(sc->sc_dmat, data->map);
705 				m_freem(data->m);
706 			}
707 
708 			if (data->map != NULL)
709 				bus_dmamap_destroy(sc->sc_dmat, data->map);
710 		}
711 		free(ring->data, M_DEVBUF);
712 	}
713 }
714 
715 static struct ieee80211_node *
716 rt2661_node_alloc(struct ieee80211_node_table *nt)
717 {
718 	struct rt2661_node *rn;
719 
720 	rn = malloc(sizeof (struct rt2661_node), M_80211_NODE,
721 	    M_NOWAIT | M_ZERO);
722 
723 	return (rn != NULL) ? &rn->ni : NULL;
724 }
725 
726 static int
727 rt2661_media_change(struct ifnet *ifp)
728 {
729 	int error;
730 
731 	error = ieee80211_media_change(ifp);
732 	if (error != ENETRESET)
733 		return error;
734 
735 	if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == (IFF_UP | IFF_RUNNING))
736 		rt2661_init(ifp);
737 
738 	return 0;
739 }
740 
741 /*
742  * This function is called periodically (every 200ms) during scanning to
743  * switch from one channel to another.
744  */
745 static void
746 rt2661_next_scan(void *arg)
747 {
748 	struct rt2661_softc *sc = arg;
749 	struct ieee80211com *ic = &sc->sc_ic;
750 	int s;
751 
752 	s = splnet();
753 	if (ic->ic_state == IEEE80211_S_SCAN)
754 		ieee80211_next_scan(ic);
755 	splx(s);
756 }
757 
758 /*
759  * This function is called for each neighbor node.
760  */
761 static void
762 rt2661_iter_func(void *arg, struct ieee80211_node *ni)
763 {
764 	struct rt2661_softc *sc = arg;
765 	struct rt2661_node *rn = (struct rt2661_node *)ni;
766 
767 	ieee80211_amrr_choose(&sc->amrr, ni, &rn->amn);
768 }
769 
770 /*
771  * This function is called periodically (every 500ms) in RUN state to update
772  * various settings like rate control statistics or Rx sensitivity.
773  */
774 static void
775 rt2661_updatestats(void *arg)
776 {
777 	struct rt2661_softc *sc = arg;
778 	struct ieee80211com *ic = &sc->sc_ic;
779 	int s;
780 
781 	s = splnet();
782 	if (ic->ic_opmode == IEEE80211_M_STA)
783 		rt2661_iter_func(sc, ic->ic_bss);
784 	else
785 		ieee80211_iterate_nodes(&ic->ic_sta, rt2661_iter_func, arg);
786 
787 	/* update rx sensitivity every 1 sec */
788 	if (++sc->ncalls & 1)
789 		rt2661_rx_tune(sc);
790 	splx(s);
791 
792 	callout_reset(&sc->amrr_ch, hz / 2, rt2661_updatestats, sc);
793 }
794 
795 static void
796 rt2661_newassoc(struct ieee80211_node *ni, int isnew)
797 {
798 	struct rt2661_softc *sc = ni->ni_ic->ic_ifp->if_softc;
799 	int i;
800 
801 	ieee80211_amrr_node_init(&sc->amrr, &((struct rt2661_node *)ni)->amn);
802 
803 	/* set rate to some reasonable initial value */
804 	for (i = ni->ni_rates.rs_nrates - 1;
805 	     i > 0 && (ni->ni_rates.rs_rates[i] & IEEE80211_RATE_VAL) > 72;
806 	     i--);
807 	ni->ni_txrate = i;
808 }
809 
810 static int
811 rt2661_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
812 {
813 	struct rt2661_softc *sc = ic->ic_ifp->if_softc;
814 	enum ieee80211_state ostate;
815 	struct ieee80211_node *ni;
816 	uint32_t tmp;
817 
818 	ostate = ic->ic_state;
819 	callout_stop(&sc->scan_ch);
820 
821 	switch (nstate) {
822 	case IEEE80211_S_INIT:
823 		callout_stop(&sc->amrr_ch);
824 
825 		if (ostate == IEEE80211_S_RUN) {
826 			/* abort TSF synchronization */
827 			tmp = RAL_READ(sc, RT2661_TXRX_CSR9);
828 			RAL_WRITE(sc, RT2661_TXRX_CSR9, tmp & ~0x00ffffff);
829 		}
830 		break;
831 
832 	case IEEE80211_S_SCAN:
833 		rt2661_set_chan(sc, ic->ic_curchan);
834 		callout_reset(&sc->scan_ch, hz / 5, rt2661_next_scan, sc);
835 		break;
836 
837 	case IEEE80211_S_AUTH:
838 	case IEEE80211_S_ASSOC:
839 		rt2661_set_chan(sc, ic->ic_curchan);
840 		break;
841 
842 	case IEEE80211_S_RUN:
843 		rt2661_set_chan(sc, ic->ic_curchan);
844 
845 		ni = ic->ic_bss;
846 
847 		if (ic->ic_opmode != IEEE80211_M_MONITOR) {
848 			rt2661_set_slottime(sc);
849 			rt2661_enable_mrr(sc);
850 			rt2661_set_txpreamble(sc);
851 			rt2661_set_basicrates(sc, &ni->ni_rates);
852 			rt2661_set_bssid(sc, ni->ni_bssid);
853 		}
854 
855 		if (ic->ic_opmode == IEEE80211_M_HOSTAP ||
856 		    ic->ic_opmode == IEEE80211_M_IBSS)
857 			rt2661_prepare_beacon(sc);
858 
859 		if (ic->ic_opmode == IEEE80211_M_STA) {
860 			/* fake a join to init the tx rate */
861 			rt2661_newassoc(ni, 1);
862 		}
863 
864 		if (ic->ic_opmode != IEEE80211_M_MONITOR) {
865 			sc->ncalls = 0;
866 			sc->avg_rssi = -95;	/* reset EMA */
867 			callout_reset(&sc->amrr_ch, hz / 2,
868 			    rt2661_updatestats, sc);
869 			rt2661_enable_tsf_sync(sc);
870 		}
871 		break;
872 	}
873 
874 	return sc->sc_newstate(ic, nstate, arg);
875 }
876 
877 /*
878  * Read 16 bits at address 'addr' from the serial EEPROM (either 93C46 or
879  * 93C66).
880  */
881 static uint16_t
882 rt2661_eeprom_read(struct rt2661_softc *sc, uint8_t addr)
883 {
884 	uint32_t tmp;
885 	uint16_t val;
886 	int n;
887 
888 	/* clock C once before the first command */
889 	RT2661_EEPROM_CTL(sc, 0);
890 
891 	RT2661_EEPROM_CTL(sc, RT2661_S);
892 	RT2661_EEPROM_CTL(sc, RT2661_S | RT2661_C);
893 	RT2661_EEPROM_CTL(sc, RT2661_S);
894 
895 	/* write start bit (1) */
896 	RT2661_EEPROM_CTL(sc, RT2661_S | RT2661_D);
897 	RT2661_EEPROM_CTL(sc, RT2661_S | RT2661_D | RT2661_C);
898 
899 	/* write READ opcode (10) */
900 	RT2661_EEPROM_CTL(sc, RT2661_S | RT2661_D);
901 	RT2661_EEPROM_CTL(sc, RT2661_S | RT2661_D | RT2661_C);
902 	RT2661_EEPROM_CTL(sc, RT2661_S);
903 	RT2661_EEPROM_CTL(sc, RT2661_S | RT2661_C);
904 
905 	/* write address (A5-A0 or A7-A0) */
906 	n = (RAL_READ(sc, RT2661_E2PROM_CSR) & RT2661_93C46) ? 5 : 7;
907 	for (; n >= 0; n--) {
908 		RT2661_EEPROM_CTL(sc, RT2661_S |
909 		    (((addr >> n) & 1) << RT2661_SHIFT_D));
910 		RT2661_EEPROM_CTL(sc, RT2661_S |
911 		    (((addr >> n) & 1) << RT2661_SHIFT_D) | RT2661_C);
912 	}
913 
914 	RT2661_EEPROM_CTL(sc, RT2661_S);
915 
916 	/* read data Q15-Q0 */
917 	val = 0;
918 	for (n = 15; n >= 0; n--) {
919 		RT2661_EEPROM_CTL(sc, RT2661_S | RT2661_C);
920 		tmp = RAL_READ(sc, RT2661_E2PROM_CSR);
921 		val |= ((tmp & RT2661_Q) >> RT2661_SHIFT_Q) << n;
922 		RT2661_EEPROM_CTL(sc, RT2661_S);
923 	}
924 
925 	RT2661_EEPROM_CTL(sc, 0);
926 
927 	/* clear Chip Select and clock C */
928 	RT2661_EEPROM_CTL(sc, RT2661_S);
929 	RT2661_EEPROM_CTL(sc, 0);
930 	RT2661_EEPROM_CTL(sc, RT2661_C);
931 
932 	return val;
933 }
934 
935 static void
936 rt2661_tx_intr(struct rt2661_softc *sc)
937 {
938 	struct ifnet *ifp = &sc->sc_if;
939 	struct rt2661_tx_ring *txq;
940 	struct rt2661_tx_data *data;
941 	struct rt2661_node *rn;
942 	uint32_t val;
943 	int qid, retrycnt, s;
944 
945 	s = splnet();
946 
947 	for (;;) {
948 		val = RAL_READ(sc, RT2661_STA_CSR4);
949 		if (!(val & RT2661_TX_STAT_VALID))
950 			break;
951 
952 		/* retrieve the queue in which this frame was sent */
953 		qid = RT2661_TX_QID(val);
954 		txq = (qid <= 3) ? &sc->txq[qid] : &sc->mgtq;
955 
956 		/* retrieve rate control algorithm context */
957 		data = &txq->data[txq->stat];
958 		rn = (struct rt2661_node *)data->ni;
959 
960 		/* if no frame has been sent, ignore */
961 		if (rn == NULL)
962 			continue;
963 
964 		switch (RT2661_TX_RESULT(val)) {
965 		case RT2661_TX_SUCCESS:
966 			retrycnt = RT2661_TX_RETRYCNT(val);
967 
968 			DPRINTFN(10, ("data frame sent successfully after "
969 			    "%d retries\n", retrycnt));
970 			rn->amn.amn_txcnt++;
971 			if (retrycnt > 0)
972 				rn->amn.amn_retrycnt++;
973 			ifp->if_opackets++;
974 			break;
975 
976 		case RT2661_TX_RETRY_FAIL:
977 			DPRINTFN(9, ("sending data frame failed (too much "
978 			    "retries)\n"));
979 			rn->amn.amn_txcnt++;
980 			rn->amn.amn_retrycnt++;
981 			ifp->if_oerrors++;
982 			break;
983 
984 		default:
985 			/* other failure */
986 			aprint_error_dev(sc->sc_dev, "sending data frame failed 0x%08x\n", val);
987 			ifp->if_oerrors++;
988 		}
989 
990 		ieee80211_free_node(data->ni);
991 		data->ni = NULL;
992 
993 		DPRINTFN(15, ("tx done q=%d idx=%u\n", qid, txq->stat));
994 
995 		txq->queued--;
996 		if (++txq->stat >= txq->count)	/* faster than % count */
997 			txq->stat = 0;
998 	}
999 
1000 	sc->sc_tx_timer = 0;
1001 	ifp->if_flags &= ~IFF_OACTIVE;
1002 	rt2661_start(ifp); /* in softint */
1003 
1004 	splx(s);
1005 }
1006 
1007 static void
1008 rt2661_tx_dma_intr(struct rt2661_softc *sc, struct rt2661_tx_ring *txq)
1009 {
1010 	struct rt2661_tx_desc *desc;
1011 	struct rt2661_tx_data *data;
1012 
1013 	for (;;) {
1014 		desc = &txq->desc[txq->next];
1015 		data = &txq->data[txq->next];
1016 
1017 		bus_dmamap_sync(sc->sc_dmat, txq->map,
1018 		    txq->next * RT2661_TX_DESC_SIZE, RT2661_TX_DESC_SIZE,
1019 		    BUS_DMASYNC_POSTREAD);
1020 
1021 		if ((le32toh(desc->flags) & RT2661_TX_BUSY) ||
1022 		    !(le32toh(desc->flags) & RT2661_TX_VALID))
1023 			break;
1024 
1025 		bus_dmamap_sync(sc->sc_dmat, data->map, 0,
1026 		    data->map->dm_mapsize, BUS_DMASYNC_POSTWRITE);
1027 		bus_dmamap_unload(sc->sc_dmat, data->map);
1028 		m_freem(data->m);
1029 		data->m = NULL;
1030 		/* node reference is released in rt2661_tx_intr() */
1031 
1032 		/* descriptor is no longer valid */
1033 		desc->flags &= ~htole32(RT2661_TX_VALID);
1034 
1035 		bus_dmamap_sync(sc->sc_dmat, txq->map,
1036 		    txq->next * RT2661_TX_DESC_SIZE, RT2661_TX_DESC_SIZE,
1037 		    BUS_DMASYNC_PREWRITE);
1038 
1039 		DPRINTFN(15, ("tx dma done q=%p idx=%u\n", txq, txq->next));
1040 
1041 		if (++txq->next >= txq->count)	/* faster than % count */
1042 			txq->next = 0;
1043 	}
1044 }
1045 
1046 static void
1047 rt2661_rx_intr(struct rt2661_softc *sc)
1048 {
1049 	struct ieee80211com *ic = &sc->sc_ic;
1050 	struct ifnet *ifp = &sc->sc_if;
1051 	struct rt2661_rx_desc *desc;
1052 	struct rt2661_rx_data *data;
1053 	struct ieee80211_frame *wh;
1054 	struct ieee80211_node *ni;
1055 	struct mbuf *mnew, *m;
1056 	int error, rssi, s;
1057 
1058 	for (;;) {
1059 		desc = &sc->rxq.desc[sc->rxq.cur];
1060 		data = &sc->rxq.data[sc->rxq.cur];
1061 
1062 		bus_dmamap_sync(sc->sc_dmat, sc->rxq.map,
1063 		    sc->rxq.cur * RT2661_RX_DESC_SIZE, RT2661_RX_DESC_SIZE,
1064 		    BUS_DMASYNC_POSTREAD);
1065 
1066 		if (le32toh(desc->flags) & RT2661_RX_BUSY)
1067 			break;
1068 
1069 		if ((le32toh(desc->flags) & RT2661_RX_PHY_ERROR) ||
1070 		    (le32toh(desc->flags) & RT2661_RX_CRC_ERROR)) {
1071 			/*
1072 			 * This should not happen since we did not request
1073 			 * to receive those frames when we filled TXRX_CSR0.
1074 			 */
1075 			DPRINTFN(5, ("PHY or CRC error flags 0x%08x\n",
1076 			    le32toh(desc->flags)));
1077 			ifp->if_ierrors++;
1078 			goto skip;
1079 		}
1080 
1081 		if ((le32toh(desc->flags) & RT2661_RX_CIPHER_MASK) != 0) {
1082 			ifp->if_ierrors++;
1083 			goto skip;
1084 		}
1085 
1086 		/*
1087 		 * Try to allocate a new mbuf for this ring element and load it
1088 		 * before processing the current mbuf. If the ring element
1089 		 * cannot be loaded, drop the received packet and reuse the old
1090 		 * mbuf. In the unlikely case that the old mbuf can't be
1091 		 * reloaded either, explicitly panic.
1092 		 */
1093 		MGETHDR(mnew, M_DONTWAIT, MT_DATA);
1094 		if (mnew == NULL) {
1095 			ifp->if_ierrors++;
1096 			goto skip;
1097 		}
1098 
1099 		MCLGET(mnew, M_DONTWAIT);
1100 		if (!(mnew->m_flags & M_EXT)) {
1101 			m_freem(mnew);
1102 			ifp->if_ierrors++;
1103 			goto skip;
1104 		}
1105 
1106 		bus_dmamap_sync(sc->sc_dmat, data->map, 0,
1107 		    data->map->dm_mapsize, BUS_DMASYNC_POSTREAD);
1108 		bus_dmamap_unload(sc->sc_dmat, data->map);
1109 
1110 		error = bus_dmamap_load(sc->sc_dmat, data->map,
1111 		    mtod(mnew, void *), MCLBYTES, NULL, BUS_DMA_NOWAIT);
1112 		if (error != 0) {
1113 			m_freem(mnew);
1114 
1115 			/* try to reload the old mbuf */
1116 			error = bus_dmamap_load(sc->sc_dmat, data->map,
1117 			    mtod(data->m, void *), MCLBYTES, NULL,
1118 			    BUS_DMA_NOWAIT);
1119 			if (error != 0) {
1120 				/* very unlikely that it will fail... */
1121 				panic("%s: could not load old rx mbuf",
1122 				    device_xname(sc->sc_dev));
1123 			}
1124 			/* physical address may have changed */
1125 			desc->physaddr = htole32(data->map->dm_segs->ds_addr);
1126 			ifp->if_ierrors++;
1127 			goto skip;
1128 		}
1129 
1130 		/*
1131 	 	 * New mbuf successfully loaded, update Rx ring and continue
1132 		 * processing.
1133 		 */
1134 		m = data->m;
1135 		data->m = mnew;
1136 		desc->physaddr = htole32(data->map->dm_segs->ds_addr);
1137 
1138 		/* finalize mbuf */
1139 		m_set_rcvif(m, ifp);
1140 		m->m_pkthdr.len = m->m_len =
1141 		    (le32toh(desc->flags) >> 16) & 0xfff;
1142 
1143 		s = splnet();
1144 
1145 		if (sc->sc_drvbpf != NULL) {
1146 			struct rt2661_rx_radiotap_header *tap = &sc->sc_rxtap;
1147 			uint32_t tsf_lo, tsf_hi;
1148 
1149 			/* get timestamp (low and high 32 bits) */
1150 			tsf_hi = RAL_READ(sc, RT2661_TXRX_CSR13);
1151 			tsf_lo = RAL_READ(sc, RT2661_TXRX_CSR12);
1152 
1153 			tap->wr_tsf =
1154 			    htole64(((uint64_t)tsf_hi << 32) | tsf_lo);
1155 			tap->wr_flags = 0;
1156 			tap->wr_rate = rt2661_rxrate(desc);
1157 			tap->wr_chan_freq = htole16(sc->sc_curchan->ic_freq);
1158 			tap->wr_chan_flags = htole16(sc->sc_curchan->ic_flags);
1159 			tap->wr_antsignal = desc->rssi;
1160 
1161 			bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_rxtap_len, m);
1162 		}
1163 
1164 		wh = mtod(m, struct ieee80211_frame *);
1165 		ni = ieee80211_find_rxnode(ic,
1166 		    (struct ieee80211_frame_min *)wh);
1167 
1168 		/* send the frame to the 802.11 layer */
1169 		ieee80211_input(ic, m, ni, desc->rssi, 0);
1170 
1171 		/*-
1172 		 * Keep track of the average RSSI using an Exponential Moving
1173 		 * Average (EMA) of 8 Wilder's days:
1174 		 *     avg = (1 / N) x rssi + ((N - 1) / N) x avg
1175 		 */
1176 		rssi = rt2661_get_rssi(sc, desc->rssi);
1177 		sc->avg_rssi = (rssi + 7 * sc->avg_rssi) / 8;
1178 
1179 		/* node is no longer needed */
1180 		ieee80211_free_node(ni);
1181 
1182 		splx(s);
1183 
1184 skip:		desc->flags |= htole32(RT2661_RX_BUSY);
1185 
1186 		bus_dmamap_sync(sc->sc_dmat, sc->rxq.map,
1187 		    sc->rxq.cur * RT2661_RX_DESC_SIZE, RT2661_RX_DESC_SIZE,
1188 		    BUS_DMASYNC_PREWRITE);
1189 
1190 		DPRINTFN(16, ("rx intr idx=%u\n", sc->rxq.cur));
1191 
1192 		sc->rxq.cur = (sc->rxq.cur + 1) % RT2661_RX_RING_COUNT;
1193 	}
1194 
1195 	/*
1196 	 * In HostAP mode, ieee80211_input() will enqueue packets in if_snd
1197 	 * without calling if_start().
1198 	 */
1199 	s = splnet();
1200 	if (!IFQ_IS_EMPTY(&ifp->if_snd) && !(ifp->if_flags & IFF_OACTIVE))
1201 		rt2661_start(ifp);
1202 	splx(s);
1203 }
1204 
1205 /*
1206  * This function is called in HostAP or IBSS modes when it's time to send a
1207  * new beacon (every ni_intval milliseconds).
1208  */
1209 static void
1210 rt2661_mcu_beacon_expire(struct rt2661_softc *sc)
1211 {
1212 	struct ieee80211com *ic = &sc->sc_ic;
1213 
1214 	if (sc->sc_flags & RT2661_UPDATE_SLOT) {
1215 		sc->sc_flags &= ~RT2661_UPDATE_SLOT;
1216 		sc->sc_flags |= RT2661_SET_SLOTTIME;
1217 	} else if (sc->sc_flags & RT2661_SET_SLOTTIME) {
1218 		sc->sc_flags &= ~RT2661_SET_SLOTTIME;
1219 		rt2661_set_slottime(sc);
1220 	}
1221 
1222 	if (ic->ic_curmode == IEEE80211_MODE_11G) {
1223 		/* update ERP Information Element */
1224 		RAL_WRITE_1(sc, sc->erp_csr, ic->ic_bss->ni_erp);
1225 		RAL_RW_BARRIER_1(sc, sc->erp_csr);
1226 	}
1227 
1228 	DPRINTFN(15, ("beacon expired\n"));
1229 }
1230 
1231 static void
1232 rt2661_mcu_wakeup(struct rt2661_softc *sc)
1233 {
1234 	RAL_WRITE(sc, RT2661_MAC_CSR11, 5 << 16);
1235 
1236 	RAL_WRITE(sc, RT2661_SOFT_RESET_CSR, 0x7);
1237 	RAL_WRITE(sc, RT2661_IO_CNTL_CSR, 0x18);
1238 	RAL_WRITE(sc, RT2661_PCI_USEC_CSR, 0x20);
1239 
1240 	/* send wakeup command to MCU */
1241 	rt2661_tx_cmd(sc, RT2661_MCU_CMD_WAKEUP, 0);
1242 }
1243 
1244 static void
1245 rt2661_mcu_cmd_intr(struct rt2661_softc *sc)
1246 {
1247 	RAL_READ(sc, RT2661_M2H_CMD_DONE_CSR);
1248 	RAL_WRITE(sc, RT2661_M2H_CMD_DONE_CSR, 0xffffffff);
1249 }
1250 
1251 int
1252 rt2661_intr(void *arg)
1253 {
1254 	struct rt2661_softc *sc = arg;
1255 	struct ifnet *ifp = &sc->sc_if;
1256 	uint32_t r1, r2;
1257 
1258 	/* don't re-enable interrupts if we're shutting down */
1259 	if (!(ifp->if_flags & IFF_RUNNING)) {
1260 		/* disable MAC and MCU interrupts */
1261 		RAL_WRITE(sc, RT2661_INT_MASK_CSR, 0xffffff7f);
1262 		RAL_WRITE(sc, RT2661_MCU_INT_MASK_CSR, 0xffffffff);
1263 		return 0;
1264 	}
1265 
1266 	r1 = RAL_READ(sc, RT2661_INT_SOURCE_CSR);
1267 	r2 = RAL_READ(sc, RT2661_MCU_INT_SOURCE_CSR);
1268 
1269 	if ((r1 & RT2661_INT_CSR_ALL) == 0 && (r2 & RT2661_MCU_INT_ALL) == 0)
1270 		return 0;
1271 
1272 	/* disable interrupts */
1273 	RAL_WRITE(sc, RT2661_INT_MASK_CSR, 0xffffff7f);
1274 	RAL_WRITE(sc, RT2661_MCU_INT_MASK_CSR, 0xffffffff);
1275 
1276 	softint_schedule(sc->sc_soft_ih);
1277 	return 1;
1278 }
1279 
1280 static void
1281 rt2661_softintr(void *arg)
1282 {
1283 	struct rt2661_softc *sc = arg;
1284 	uint32_t r1, r2;
1285 
1286 	for (;;) {
1287 		r1 = RAL_READ(sc, RT2661_INT_SOURCE_CSR);
1288 		r2 = RAL_READ(sc, RT2661_MCU_INT_SOURCE_CSR);
1289 
1290 		if ((r1 & RT2661_INT_CSR_ALL) == 0 &&
1291 		    (r2 & RT2661_MCU_INT_ALL) == 0)
1292 			break;
1293 
1294 		RAL_WRITE(sc, RT2661_INT_SOURCE_CSR, r1);
1295 		RAL_WRITE(sc, RT2661_MCU_INT_SOURCE_CSR, r2);
1296 
1297 		if (r1 & RT2661_MGT_DONE)
1298 			rt2661_tx_dma_intr(sc, &sc->mgtq);
1299 
1300 		if (r1 & RT2661_RX_DONE)
1301 			rt2661_rx_intr(sc);
1302 
1303 		if (r1 & RT2661_TX0_DMA_DONE)
1304 			rt2661_tx_dma_intr(sc, &sc->txq[0]);
1305 
1306 		if (r1 & RT2661_TX1_DMA_DONE)
1307 			rt2661_tx_dma_intr(sc, &sc->txq[1]);
1308 
1309 		if (r1 & RT2661_TX2_DMA_DONE)
1310 			rt2661_tx_dma_intr(sc, &sc->txq[2]);
1311 
1312 		if (r1 & RT2661_TX3_DMA_DONE)
1313 			rt2661_tx_dma_intr(sc, &sc->txq[3]);
1314 
1315 		if (r1 & RT2661_TX_DONE)
1316 			rt2661_tx_intr(sc);
1317 
1318 		if (r2 & RT2661_MCU_CMD_DONE)
1319 			rt2661_mcu_cmd_intr(sc);
1320 
1321 		if (r2 & RT2661_MCU_BEACON_EXPIRE)
1322 			rt2661_mcu_beacon_expire(sc);
1323 
1324 		if (r2 & RT2661_MCU_WAKEUP)
1325 			rt2661_mcu_wakeup(sc);
1326 	}
1327 
1328 	/* enable interrupts */
1329 	RAL_WRITE(sc, RT2661_INT_MASK_CSR, 0x0000ff10);
1330 	RAL_WRITE(sc, RT2661_MCU_INT_MASK_CSR, 0);
1331 }
1332 
1333 /* quickly determine if a given rate is CCK or OFDM */
1334 #define RAL_RATE_IS_OFDM(rate) ((rate) >= 12 && (rate) != 22)
1335 
1336 #define RAL_ACK_SIZE	14	/* 10 + 4(FCS) */
1337 #define RAL_CTS_SIZE	14	/* 10 + 4(FCS) */
1338 
1339 /*
1340  * This function is only used by the Rx radiotap code. It returns the rate at
1341  * which a given frame was received.
1342  */
1343 static uint8_t
1344 rt2661_rxrate(struct rt2661_rx_desc *desc)
1345 {
1346 	if (le32toh(desc->flags) & RT2661_RX_OFDM) {
1347 		/* reverse function of rt2661_plcp_signal */
1348 		switch (desc->rate & 0xf) {
1349 		case 0xb:	return 12;
1350 		case 0xf:	return 18;
1351 		case 0xa:	return 24;
1352 		case 0xe:	return 36;
1353 		case 0x9:	return 48;
1354 		case 0xd:	return 72;
1355 		case 0x8:	return 96;
1356 		case 0xc:	return 108;
1357 		}
1358 	} else {
1359 		if (desc->rate == 10)
1360 			return 2;
1361 		if (desc->rate == 20)
1362 			return 4;
1363 		if (desc->rate == 55)
1364 			return 11;
1365 		if (desc->rate == 110)
1366 			return 22;
1367 	}
1368 	return 2;	/* should not get there */
1369 }
1370 
1371 /*
1372  * Return the expected ack rate for a frame transmitted at rate `rate'.
1373  * XXX: this should depend on the destination node basic rate set.
1374  */
1375 static int
1376 rt2661_ack_rate(struct ieee80211com *ic, int rate)
1377 {
1378 	switch (rate) {
1379 	/* CCK rates */
1380 	case 2:
1381 		return 2;
1382 	case 4:
1383 	case 11:
1384 	case 22:
1385 		return (ic->ic_curmode == IEEE80211_MODE_11B) ? 4 : rate;
1386 
1387 	/* OFDM rates */
1388 	case 12:
1389 	case 18:
1390 		return 12;
1391 	case 24:
1392 	case 36:
1393 		return 24;
1394 	case 48:
1395 	case 72:
1396 	case 96:
1397 	case 108:
1398 		return 48;
1399 	}
1400 
1401 	/* default to 1Mbps */
1402 	return 2;
1403 }
1404 
1405 /*
1406  * Compute the duration (in us) needed to transmit `len' bytes at rate `rate'.
1407  * The function automatically determines the operating mode depending on the
1408  * given rate. `flags' indicates whether short preamble is in use or not.
1409  */
1410 static uint16_t
1411 rt2661_txtime(int len, int rate, uint32_t flags)
1412 {
1413 	uint16_t txtime;
1414 
1415 	if (RAL_RATE_IS_OFDM(rate)) {
1416 		/* IEEE Std 802.11g-2003, pp. 44 */
1417 		txtime = (8 + 4 * len + 3 + rate - 1) / rate;
1418 		txtime = 16 + 4 + 4 * txtime + 6;
1419 	} else {
1420 		/* IEEE Std 802.11b-1999, pp. 28 */
1421 		txtime = (16 * len + rate - 1) / rate;
1422 		if (rate != 2 && (flags & IEEE80211_F_SHPREAMBLE))
1423 			txtime +=  72 + 24;
1424 		else
1425 			txtime += 144 + 48;
1426 	}
1427 	return txtime;
1428 }
1429 
1430 static uint8_t
1431 rt2661_plcp_signal(int rate)
1432 {
1433 	switch (rate) {
1434 	/* CCK rates (returned values are device-dependent) */
1435 	case 2:		return 0x0;
1436 	case 4:		return 0x1;
1437 	case 11:	return 0x2;
1438 	case 22:	return 0x3;
1439 
1440 	/* OFDM rates (cf IEEE Std 802.11a-1999, pp. 14 Table 80) */
1441 	case 12:	return 0xb;
1442 	case 18:	return 0xf;
1443 	case 24:	return 0xa;
1444 	case 36:	return 0xe;
1445 	case 48:	return 0x9;
1446 	case 72:	return 0xd;
1447 	case 96:	return 0x8;
1448 	case 108:	return 0xc;
1449 
1450 	/* unsupported rates (should not get there) */
1451 	default:	return 0xff;
1452 	}
1453 }
1454 
1455 static void
1456 rt2661_setup_tx_desc(struct rt2661_softc *sc, struct rt2661_tx_desc *desc,
1457     uint32_t flags, uint16_t xflags, int len, int rate,
1458     const bus_dma_segment_t *segs, int nsegs, int ac)
1459 {
1460 	struct ieee80211com *ic = &sc->sc_ic;
1461 	uint16_t plcp_length;
1462 	int i, remainder;
1463 
1464 	desc->flags = htole32(flags);
1465 	desc->flags |= htole32(len << 16);
1466 
1467 	desc->xflags = htole16(xflags);
1468 	desc->xflags |= htole16(nsegs << 13);
1469 
1470 	desc->wme = htole16(
1471 	    RT2661_QID(ac) |
1472 	    RT2661_AIFSN(2) |
1473 	    RT2661_LOGCWMIN(4) |
1474 	    RT2661_LOGCWMAX(10));
1475 
1476 	/*
1477 	 * Remember in which queue this frame was sent. This field is driver
1478 	 * private data only. It will be made available by the NIC in STA_CSR4
1479 	 * on Tx interrupts.
1480 	 */
1481 	desc->qid = ac;
1482 
1483 	/* setup PLCP fields */
1484 	desc->plcp_signal  = rt2661_plcp_signal(rate);
1485 	desc->plcp_service = 4;
1486 
1487 	len += IEEE80211_CRC_LEN;
1488 	if (RAL_RATE_IS_OFDM(rate)) {
1489 		desc->flags |= htole32(RT2661_TX_OFDM);
1490 
1491 		plcp_length = len & 0xfff;
1492 		desc->plcp_length_hi = plcp_length >> 6;
1493 		desc->plcp_length_lo = plcp_length & 0x3f;
1494 	} else {
1495 		plcp_length = (16 * len + rate - 1) / rate;
1496 		if (rate == 22) {
1497 			remainder = (16 * len) % 22;
1498 			if (remainder != 0 && remainder < 7)
1499 				desc->plcp_service |= RT2661_PLCP_LENGEXT;
1500 		}
1501 		desc->plcp_length_hi = plcp_length >> 8;
1502 		desc->plcp_length_lo = plcp_length & 0xff;
1503 
1504 		if (rate != 2 && (ic->ic_flags & IEEE80211_F_SHPREAMBLE))
1505 			desc->plcp_signal |= 0x08;
1506 	}
1507 
1508 	/* RT2x61 supports scatter with up to 5 segments */
1509 	for (i = 0; i < nsegs; i++) {
1510 		desc->addr[i] = htole32(segs[i].ds_addr);
1511 		desc->len [i] = htole16(segs[i].ds_len);
1512 	}
1513 
1514 	desc->flags |= htole32(RT2661_TX_BUSY | RT2661_TX_VALID);
1515 }
1516 
1517 static int
1518 rt2661_tx_mgt(struct rt2661_softc *sc, struct mbuf *m0,
1519     struct ieee80211_node *ni)
1520 {
1521 	struct ieee80211com *ic = &sc->sc_ic;
1522 	struct rt2661_tx_desc *desc;
1523 	struct rt2661_tx_data *data;
1524 	struct ieee80211_frame *wh;
1525 	uint16_t dur;
1526 	uint32_t flags = 0;
1527 	int rate, error;
1528 
1529 	desc = &sc->mgtq.desc[sc->mgtq.cur];
1530 	data = &sc->mgtq.data[sc->mgtq.cur];
1531 
1532 	/* send mgt frames at the lowest available rate */
1533 	rate = IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan) ? 12 : 2;
1534 
1535 	wh = mtod(m0, struct ieee80211_frame *);
1536 
1537 	if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
1538 		if (ieee80211_crypto_encap(ic, ni, m0) == NULL) {
1539 			m_freem(m0);
1540 			return ENOBUFS;
1541 		}
1542 
1543 		/* packet header may have moved, reset our local pointer */
1544 		wh = mtod(m0, struct ieee80211_frame *);
1545 	}
1546 
1547 	error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m0,
1548 	    BUS_DMA_NOWAIT);
1549 	if (error != 0) {
1550 		aprint_error_dev(sc->sc_dev, "could not map mbuf (error %d)\n",
1551 		    error);
1552 		m_freem(m0);
1553 		return error;
1554 	}
1555 
1556 	if (sc->sc_drvbpf != NULL) {
1557 		struct rt2661_tx_radiotap_header *tap = &sc->sc_txtap;
1558 
1559 		tap->wt_flags = 0;
1560 		tap->wt_rate = rate;
1561 		tap->wt_chan_freq = htole16(sc->sc_curchan->ic_freq);
1562 		tap->wt_chan_flags = htole16(sc->sc_curchan->ic_flags);
1563 
1564 		bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m0);
1565 	}
1566 
1567 	data->m = m0;
1568 	data->ni = ni;
1569 
1570 	if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
1571 		flags |= RT2661_TX_NEED_ACK;
1572 
1573 		dur = rt2661_txtime(RAL_ACK_SIZE, rate, ic->ic_flags) +
1574 		    sc->sifs;
1575 		*(uint16_t *)wh->i_dur = htole16(dur);
1576 
1577 		/* tell hardware to set timestamp in probe responses */
1578 		if ((wh->i_fc[0] &
1579 		    (IEEE80211_FC0_TYPE_MASK | IEEE80211_FC0_SUBTYPE_MASK)) ==
1580 		    (IEEE80211_FC0_TYPE_MGT | IEEE80211_FC0_SUBTYPE_PROBE_RESP))
1581 			flags |= RT2661_TX_TIMESTAMP;
1582 	}
1583 
1584 	rt2661_setup_tx_desc(sc, desc, flags, 0 /* XXX HWSEQ */,
1585 	    m0->m_pkthdr.len, rate, data->map->dm_segs, data->map->dm_nsegs,
1586 	    RT2661_QID_MGT);
1587 
1588 	bus_dmamap_sync(sc->sc_dmat, data->map, 0, data->map->dm_mapsize,
1589 	    BUS_DMASYNC_PREWRITE);
1590 	bus_dmamap_sync(sc->sc_dmat, sc->mgtq.map,
1591 	    sc->mgtq.cur * RT2661_TX_DESC_SIZE, RT2661_TX_DESC_SIZE,
1592 	    BUS_DMASYNC_PREWRITE);
1593 
1594 	DPRINTFN(10, ("sending mgt frame len=%u idx=%u rate=%u\n",
1595 	    m0->m_pkthdr.len, sc->mgtq.cur, rate));
1596 
1597 	/* kick mgt */
1598 	sc->mgtq.queued++;
1599 	sc->mgtq.cur = (sc->mgtq.cur + 1) % RT2661_MGT_RING_COUNT;
1600 	RAL_WRITE(sc, RT2661_TX_CNTL_CSR, RT2661_KICK_MGT);
1601 
1602 	return 0;
1603 }
1604 
1605 /*
1606  * Build a RTS control frame.
1607  */
1608 static struct mbuf *
1609 rt2661_get_rts(struct rt2661_softc *sc, struct ieee80211_frame *wh,
1610     uint16_t dur)
1611 {
1612 	struct ieee80211_frame_rts *rts;
1613 	struct mbuf *m;
1614 
1615 	MGETHDR(m, M_DONTWAIT, MT_DATA);
1616 	if (m == NULL) {
1617 		sc->sc_ic.ic_stats.is_tx_nobuf++;
1618 		aprint_error_dev(sc->sc_dev, "could not allocate RTS frame\n");
1619 		return NULL;
1620 	}
1621 
1622 	rts = mtod(m, struct ieee80211_frame_rts *);
1623 
1624 	rts->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_CTL |
1625 	    IEEE80211_FC0_SUBTYPE_RTS;
1626 	rts->i_fc[1] = IEEE80211_FC1_DIR_NODS;
1627 	*(uint16_t *)rts->i_dur = htole16(dur);
1628 	IEEE80211_ADDR_COPY(rts->i_ra, wh->i_addr1);
1629 	IEEE80211_ADDR_COPY(rts->i_ta, wh->i_addr2);
1630 
1631 	m->m_pkthdr.len = m->m_len = sizeof (struct ieee80211_frame_rts);
1632 
1633 	return m;
1634 }
1635 
1636 static int
1637 rt2661_tx_data(struct rt2661_softc *sc, struct mbuf *m0,
1638     struct ieee80211_node *ni, int ac)
1639 {
1640 	struct ieee80211com *ic = &sc->sc_ic;
1641 	struct rt2661_tx_ring *txq = &sc->txq[ac];
1642 	struct rt2661_tx_desc *desc;
1643 	struct rt2661_tx_data *data;
1644 	struct ieee80211_frame *wh;
1645 	struct ieee80211_key *k;
1646 	struct mbuf *mnew;
1647 	uint16_t dur;
1648 	uint32_t flags = 0;
1649 	int rate, useprot, error, tid;
1650 
1651 	wh = mtod(m0, struct ieee80211_frame *);
1652 
1653 	if (ic->ic_fixed_rate != IEEE80211_FIXED_RATE_NONE) {
1654 		rate = ic->ic_sup_rates[ic->ic_curmode].
1655 		    rs_rates[ic->ic_fixed_rate];
1656 	} else
1657 		rate = ni->ni_rates.rs_rates[ni->ni_txrate];
1658 	rate &= IEEE80211_RATE_VAL;
1659 	if (rate == 0)
1660 		rate = 2;	/* XXX should not happen */
1661 
1662 	if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
1663 		k = ieee80211_crypto_encap(ic, ni, m0);
1664 		if (k == NULL) {
1665 			m_freem(m0);
1666 			return ENOBUFS;
1667 		}
1668 
1669 		/* packet header may have moved, reset our local pointer */
1670 		wh = mtod(m0, struct ieee80211_frame *);
1671 	}
1672 
1673 	/*
1674 	 * Packet Bursting: backoff after ppb=8 frames to give other STAs a
1675 	 * chance to contend for the wireless medium.
1676 	 */
1677 	tid = WME_AC_TO_TID(M_WME_GETAC(m0));
1678 	if (ic->ic_opmode == IEEE80211_M_STA && (ni->ni_txseqs[tid] & 7))
1679 		flags |= RT2661_TX_IFS_SIFS;
1680 
1681 	/*
1682 	 * IEEE Std 802.11-1999, pp 82: "A STA shall use an RTS/CTS exchange
1683 	 * for directed frames only when the length of the MPDU is greater
1684 	 * than the length threshold indicated by" ic_rtsthreshold.
1685 	 *
1686 	 * IEEE Std 802.11-2003g, pp 13: "ERP STAs shall use protection
1687 	 * mechanism (such as RTS/CTS or CTS-to-self) for ERP-OFDM MPDUs of
1688 	 * type Data or an MMPDU".
1689 	 */
1690 	useprot = !IEEE80211_IS_MULTICAST(wh->i_addr1) &&
1691 	    (m0->m_pkthdr.len + IEEE80211_CRC_LEN > ic->ic_rtsthreshold ||
1692 	    ((ic->ic_flags & IEEE80211_F_USEPROT) && RAL_RATE_IS_OFDM(rate)));
1693 	if (useprot) {
1694 		struct mbuf *m;
1695 		int rtsrate, ackrate;
1696 
1697 		rtsrate = IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan) ? 12 : 2;
1698 		ackrate = rt2661_ack_rate(ic, rate);
1699 
1700 		dur = rt2661_txtime(m0->m_pkthdr.len + 4, rate, ic->ic_flags) +
1701 		      rt2661_txtime(RAL_CTS_SIZE, rtsrate, ic->ic_flags) +
1702 		      rt2661_txtime(RAL_ACK_SIZE, ackrate, ic->ic_flags) +
1703 		      3 * sc->sifs;
1704 
1705 		m = rt2661_get_rts(sc, wh, dur);
1706 		if (m == NULL) {
1707 			aprint_error_dev(sc->sc_dev, "could not allocate RTS "
1708 			    "frame\n");
1709 			m_freem(m0);
1710 			return ENOBUFS;
1711 		}
1712 
1713 		desc = &txq->desc[txq->cur];
1714 		data = &txq->data[txq->cur];
1715 
1716 		error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m,
1717 		    BUS_DMA_NOWAIT);
1718 		if (error != 0) {
1719 			aprint_error_dev(sc->sc_dev, "could not map mbuf (error %d)\n", error);
1720 			m_freem(m);
1721 			m_freem(m0);
1722 			return error;
1723 		}
1724 
1725 		/* avoid multiple free() of the same node for each fragment */
1726 		ieee80211_ref_node(ni);
1727 
1728 		data->m = m;
1729 		data->ni = ni;
1730 
1731 		rt2661_setup_tx_desc(sc, desc, RT2661_TX_NEED_ACK |
1732 		    RT2661_TX_MORE_FRAG, 0, m->m_pkthdr.len, rtsrate,
1733 		    data->map->dm_segs, data->map->dm_nsegs, ac);
1734 
1735 		bus_dmamap_sync(sc->sc_dmat, data->map, 0,
1736 		    data->map->dm_mapsize, BUS_DMASYNC_PREWRITE);
1737 		bus_dmamap_sync(sc->sc_dmat, txq->map,
1738 		    txq->cur * RT2661_TX_DESC_SIZE, RT2661_TX_DESC_SIZE,
1739 		    BUS_DMASYNC_PREWRITE);
1740 
1741 		txq->queued++;
1742 		txq->cur = (txq->cur + 1) % RT2661_TX_RING_COUNT;
1743 
1744 		flags |= RT2661_TX_LONG_RETRY | RT2661_TX_IFS_SIFS;
1745 	}
1746 
1747 	data = &txq->data[txq->cur];
1748 	desc = &txq->desc[txq->cur];
1749 
1750 	error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m0,
1751 	    BUS_DMA_NOWAIT);
1752 	if (error != 0 && error != EFBIG) {
1753 		aprint_error_dev(sc->sc_dev, "could not map mbuf (error %d)\n",
1754 		    error);
1755 		m_freem(m0);
1756 		return error;
1757 	}
1758 	if (error != 0) {
1759 		/* too many fragments, linearize */
1760 
1761 		MGETHDR(mnew, M_DONTWAIT, MT_DATA);
1762 		if (mnew == NULL) {
1763 			m_freem(m0);
1764 			return ENOMEM;
1765 		}
1766 
1767 		M_COPY_PKTHDR(mnew, m0);
1768 		if (m0->m_pkthdr.len > MHLEN) {
1769 			MCLGET(mnew, M_DONTWAIT);
1770 			if (!(mnew->m_flags & M_EXT)) {
1771 				m_freem(m0);
1772 				m_freem(mnew);
1773 				return ENOMEM;
1774 			}
1775 		}
1776 
1777 		m_copydata(m0, 0, m0->m_pkthdr.len, mtod(mnew, void *));
1778 		m_freem(m0);
1779 		mnew->m_len = mnew->m_pkthdr.len;
1780 		m0 = mnew;
1781 
1782 		error = bus_dmamap_load_mbuf(sc->sc_dmat, data->map, m0,
1783 		    BUS_DMA_NOWAIT);
1784 		if (error != 0) {
1785 			aprint_error_dev(sc->sc_dev, "could not map mbuf (error %d)\n", error);
1786 			m_freem(m0);
1787 			return error;
1788 		}
1789 
1790 		/* packet header have moved, reset our local pointer */
1791 		wh = mtod(m0, struct ieee80211_frame *);
1792 	}
1793 
1794 	if (sc->sc_drvbpf != NULL) {
1795 		struct rt2661_tx_radiotap_header *tap = &sc->sc_txtap;
1796 
1797 		tap->wt_flags = 0;
1798 		tap->wt_rate = rate;
1799 		tap->wt_chan_freq = htole16(sc->sc_curchan->ic_freq);
1800 		tap->wt_chan_flags = htole16(sc->sc_curchan->ic_flags);
1801 
1802 		bpf_mtap2(sc->sc_drvbpf, tap, sc->sc_txtap_len, m0);
1803 	}
1804 
1805 	data->m = m0;
1806 	data->ni = ni;
1807 
1808 	if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
1809 		flags |= RT2661_TX_NEED_ACK;
1810 
1811 		dur = rt2661_txtime(RAL_ACK_SIZE, rt2661_ack_rate(ic, rate),
1812 		    ic->ic_flags) + sc->sifs;
1813 		*(uint16_t *)wh->i_dur = htole16(dur);
1814 	}
1815 
1816 	rt2661_setup_tx_desc(sc, desc, flags, 0, m0->m_pkthdr.len, rate,
1817 	    data->map->dm_segs, data->map->dm_nsegs, ac);
1818 
1819 	bus_dmamap_sync(sc->sc_dmat, data->map, 0, data->map->dm_mapsize,
1820 	    BUS_DMASYNC_PREWRITE);
1821 	bus_dmamap_sync(sc->sc_dmat, txq->map, txq->cur * RT2661_TX_DESC_SIZE,
1822 	    RT2661_TX_DESC_SIZE, BUS_DMASYNC_PREWRITE);
1823 
1824 	DPRINTFN(10, ("sending data frame len=%u idx=%u rate=%u\n",
1825 	    m0->m_pkthdr.len, txq->cur, rate));
1826 
1827 	/* kick Tx */
1828 	txq->queued++;
1829 	txq->cur = (txq->cur + 1) % RT2661_TX_RING_COUNT;
1830 	RAL_WRITE(sc, RT2661_TX_CNTL_CSR, 1);
1831 
1832 	return 0;
1833 }
1834 
1835 static void
1836 rt2661_start(struct ifnet *ifp)
1837 {
1838 	struct rt2661_softc *sc = ifp->if_softc;
1839 	struct ieee80211com *ic = &sc->sc_ic;
1840 	struct mbuf *m0;
1841 	struct ether_header *eh;
1842 	struct ieee80211_node *ni = NULL;
1843 
1844 	/*
1845 	 * net80211 may still try to send management frames even if the
1846 	 * IFF_RUNNING flag is not set...
1847 	 */
1848 	if ((ifp->if_flags & (IFF_RUNNING | IFF_OACTIVE)) != IFF_RUNNING)
1849 		return;
1850 
1851 	for (;;) {
1852 		IF_POLL(&ic->ic_mgtq, m0);
1853 		if (m0 != NULL) {
1854 			if (sc->mgtq.queued >= RT2661_MGT_RING_COUNT) {
1855 				ifp->if_flags |= IFF_OACTIVE;
1856 				break;
1857 			}
1858 			IF_DEQUEUE(&ic->ic_mgtq, m0);
1859 			if (m0 == NULL)
1860 				break;
1861 
1862 			ni = M_GETCTX(m0, struct ieee80211_node *);
1863 			M_CLEARCTX(m0);
1864 			bpf_mtap3(ic->ic_rawbpf, m0);
1865 			if (rt2661_tx_mgt(sc, m0, ni) != 0)
1866 				break;
1867 
1868 		} else {
1869 			IF_POLL(&ifp->if_snd, m0);
1870 			if (m0 == NULL || ic->ic_state != IEEE80211_S_RUN)
1871 				break;
1872 
1873 			if (sc->txq[0].queued >= RT2661_TX_RING_COUNT - 1) {
1874 				/* there is no place left in this ring */
1875 				ifp->if_flags |= IFF_OACTIVE;
1876 				break;
1877 			}
1878 
1879 			IFQ_DEQUEUE(&ifp->if_snd, m0);
1880 
1881 			if (m0->m_len < sizeof (struct ether_header) &&
1882 			    !(m0 = m_pullup(m0, sizeof (struct ether_header))))
1883 				continue;
1884 
1885 			eh = mtod(m0, struct ether_header *);
1886 			ni = ieee80211_find_txnode(ic, eh->ether_dhost);
1887 			if (ni == NULL) {
1888 				m_freem(m0);
1889 				ifp->if_oerrors++;
1890 				continue;
1891 			}
1892 
1893 			bpf_mtap3(ifp->if_bpf, m0);
1894 			m0 = ieee80211_encap(ic, m0, ni);
1895 			if (m0 == NULL) {
1896 				ieee80211_free_node(ni);
1897 				ifp->if_oerrors++;
1898 				continue;
1899 			}
1900 			bpf_mtap3(ic->ic_rawbpf, m0);
1901 			if (rt2661_tx_data(sc, m0, ni, 0) != 0) {
1902 				if (ni != NULL)
1903 					ieee80211_free_node(ni);
1904 				ifp->if_oerrors++;
1905 				break;
1906 			}
1907 		}
1908 
1909 		sc->sc_tx_timer = 5;
1910 		ifp->if_timer = 1;
1911 	}
1912 }
1913 
1914 static void
1915 rt2661_watchdog(struct ifnet *ifp)
1916 {
1917 	struct rt2661_softc *sc = ifp->if_softc;
1918 
1919 	ifp->if_timer = 0;
1920 
1921 	if (sc->sc_tx_timer > 0) {
1922 		if (--sc->sc_tx_timer == 0) {
1923 			aprint_error_dev(sc->sc_dev, "device timeout\n");
1924 			rt2661_init(ifp);
1925 			ifp->if_oerrors++;
1926 			return;
1927 		}
1928 		ifp->if_timer = 1;
1929 	}
1930 
1931 	ieee80211_watchdog(&sc->sc_ic);
1932 }
1933 
1934 /*
1935  * This function allows for fast channel switching in monitor mode (used by
1936  * kismet). In IBSS mode, we must explicitly reset the interface to
1937  * generate a new beacon frame.
1938  */
1939 static int
1940 rt2661_reset(struct ifnet *ifp)
1941 {
1942 	struct rt2661_softc *sc = ifp->if_softc;
1943 	struct ieee80211com *ic = &sc->sc_ic;
1944 
1945 	if (ic->ic_opmode != IEEE80211_M_MONITOR)
1946 		return ENETRESET;
1947 
1948 	rt2661_set_chan(sc, ic->ic_curchan);
1949 
1950 	return 0;
1951 }
1952 
1953 static int
1954 rt2661_ioctl(struct ifnet *ifp, u_long cmd, void *data)
1955 {
1956 	struct rt2661_softc *sc = ifp->if_softc;
1957 	struct ieee80211com *ic = &sc->sc_ic;
1958 	int s, error = 0;
1959 
1960 	s = splnet();
1961 
1962 	switch (cmd) {
1963 	case SIOCSIFFLAGS:
1964 		if ((error = ifioctl_common(ifp, cmd, data)) != 0)
1965 			break;
1966 		if (ifp->if_flags & IFF_UP) {
1967 			if (ifp->if_flags & IFF_RUNNING)
1968 				rt2661_update_promisc(sc);
1969 			else
1970 				rt2661_init(ifp);
1971 		} else {
1972 			if (ifp->if_flags & IFF_RUNNING)
1973 				rt2661_stop(ifp, 1);
1974 		}
1975 		break;
1976 
1977 	case SIOCADDMULTI:
1978 	case SIOCDELMULTI:
1979 		/* XXX no h/w multicast filter? --dyoung */
1980 		if ((error = ether_ioctl(ifp, cmd, data)) == ENETRESET)
1981 			error = 0;
1982 		break;
1983 
1984 	case SIOCS80211CHANNEL:
1985 		/*
1986 		 * This allows for fast channel switching in monitor mode
1987 		 * (used by kismet). In IBSS mode, we must explicitly reset
1988 		 * the interface to generate a new beacon frame.
1989 		 */
1990 		error = ieee80211_ioctl(ic, cmd, data);
1991 		if (error == ENETRESET &&
1992 		    ic->ic_opmode == IEEE80211_M_MONITOR) {
1993 			if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) ==
1994 			     (IFF_UP | IFF_RUNNING))
1995 				rt2661_set_chan(sc, ic->ic_ibss_chan);
1996 			error = 0;
1997 		}
1998 		break;
1999 
2000 	default:
2001 		error = ieee80211_ioctl(ic, cmd, data);
2002 
2003 	}
2004 
2005 	if (error == ENETRESET) {
2006 		if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) ==
2007 		    (IFF_UP | IFF_RUNNING))
2008 			rt2661_init(ifp);
2009 		error = 0;
2010 	}
2011 
2012 	splx(s);
2013 
2014 	return error;
2015 }
2016 
2017 static void
2018 rt2661_bbp_write(struct rt2661_softc *sc, uint8_t reg, uint8_t val)
2019 {
2020 	uint32_t tmp;
2021 	int ntries;
2022 
2023 	for (ntries = 0; ntries < 100; ntries++) {
2024 		if (!(RAL_READ(sc, RT2661_PHY_CSR3) & RT2661_BBP_BUSY))
2025 			break;
2026 		DELAY(1);
2027 	}
2028 	if (ntries == 100) {
2029 		aprint_error_dev(sc->sc_dev, "could not write to BBP\n");
2030 		return;
2031 	}
2032 
2033 	tmp = RT2661_BBP_BUSY | (reg & 0x7f) << 8 | val;
2034 	RAL_WRITE(sc, RT2661_PHY_CSR3, tmp);
2035 
2036 	DPRINTFN(15, ("BBP R%u <- 0x%02x\n", reg, val));
2037 }
2038 
2039 static uint8_t
2040 rt2661_bbp_read(struct rt2661_softc *sc, uint8_t reg)
2041 {
2042 	uint32_t val;
2043 	int ntries;
2044 
2045 	for (ntries = 0; ntries < 100; ntries++) {
2046 		if (!(RAL_READ(sc, RT2661_PHY_CSR3) & RT2661_BBP_BUSY))
2047 			break;
2048 		DELAY(1);
2049 	}
2050 	if (ntries == 100) {
2051 		aprint_error_dev(sc->sc_dev, "could not read from BBP\n");
2052 		return 0;
2053 	}
2054 
2055 	val = RT2661_BBP_BUSY | RT2661_BBP_READ | reg << 8;
2056 	RAL_WRITE(sc, RT2661_PHY_CSR3, val);
2057 
2058 	for (ntries = 0; ntries < 100; ntries++) {
2059 		val = RAL_READ(sc, RT2661_PHY_CSR3);
2060 		if (!(val & RT2661_BBP_BUSY))
2061 			return val & 0xff;
2062 		DELAY(1);
2063 	}
2064 
2065 	aprint_error_dev(sc->sc_dev, "could not read from BBP\n");
2066 	return 0;
2067 }
2068 
2069 static void
2070 rt2661_rf_write(struct rt2661_softc *sc, uint8_t reg, uint32_t val)
2071 {
2072 	uint32_t tmp;
2073 	int ntries;
2074 
2075 	for (ntries = 0; ntries < 100; ntries++) {
2076 		if (!(RAL_READ(sc, RT2661_PHY_CSR4) & RT2661_RF_BUSY))
2077 			break;
2078 		DELAY(1);
2079 	}
2080 	if (ntries == 100) {
2081 		aprint_error_dev(sc->sc_dev, "could not write to RF\n");
2082 		return;
2083 	}
2084 	tmp = RT2661_RF_BUSY | RT2661_RF_21BIT | (val & 0x1fffff) << 2 |
2085 	    (reg & 3);
2086 	RAL_WRITE(sc, RT2661_PHY_CSR4, tmp);
2087 
2088 	/* remember last written value in sc */
2089 	sc->rf_regs[reg] = val;
2090 
2091 	DPRINTFN(15, ("RF R[%u] <- 0x%05x\n", reg & 3, val & 0x1fffff));
2092 }
2093 
2094 static int
2095 rt2661_tx_cmd(struct rt2661_softc *sc, uint8_t cmd, uint16_t arg)
2096 {
2097 	if (RAL_READ(sc, RT2661_H2M_MAILBOX_CSR) & RT2661_H2M_BUSY)
2098 		return EIO;	/* there is already a command pending */
2099 
2100 	RAL_WRITE(sc, RT2661_H2M_MAILBOX_CSR,
2101 	    RT2661_H2M_BUSY | RT2661_TOKEN_NO_INTR << 16 | arg);
2102 
2103 	RAL_WRITE(sc, RT2661_HOST_CMD_CSR, RT2661_KICK_CMD | cmd);
2104 
2105 	return 0;
2106 }
2107 
2108 static void
2109 rt2661_select_antenna(struct rt2661_softc *sc)
2110 {
2111 	uint8_t bbp4, bbp77;
2112 	uint32_t tmp;
2113 
2114 	bbp4  = rt2661_bbp_read(sc,  4);
2115 	bbp77 = rt2661_bbp_read(sc, 77);
2116 
2117 	/* TBD */
2118 
2119 	/* make sure Rx is disabled before switching antenna */
2120 	tmp = RAL_READ(sc, RT2661_TXRX_CSR0);
2121 	RAL_WRITE(sc, RT2661_TXRX_CSR0, tmp | RT2661_DISABLE_RX);
2122 
2123 	rt2661_bbp_write(sc,  4, bbp4);
2124 	rt2661_bbp_write(sc, 77, bbp77);
2125 
2126 	/* restore Rx filter */
2127 	RAL_WRITE(sc, RT2661_TXRX_CSR0, tmp);
2128 }
2129 
2130 /*
2131  * Enable multi-rate retries for frames sent at OFDM rates.
2132  * In 802.11b/g mode, allow fallback to CCK rates.
2133  */
2134 static void
2135 rt2661_enable_mrr(struct rt2661_softc *sc)
2136 {
2137 	struct ieee80211com *ic = &sc->sc_ic;
2138 	uint32_t tmp;
2139 
2140 	tmp = RAL_READ(sc, RT2661_TXRX_CSR4);
2141 
2142 	tmp &= ~RT2661_MRR_CCK_FALLBACK;
2143 	if (!IEEE80211_IS_CHAN_5GHZ(ic->ic_bss->ni_chan))
2144 		tmp |= RT2661_MRR_CCK_FALLBACK;
2145 	tmp |= RT2661_MRR_ENABLED;
2146 
2147 	RAL_WRITE(sc, RT2661_TXRX_CSR4, tmp);
2148 }
2149 
2150 static void
2151 rt2661_set_txpreamble(struct rt2661_softc *sc)
2152 {
2153 	uint32_t tmp;
2154 
2155 	tmp = RAL_READ(sc, RT2661_TXRX_CSR4);
2156 
2157 	tmp &= ~RT2661_SHORT_PREAMBLE;
2158 	if (sc->sc_ic.ic_flags & IEEE80211_F_SHPREAMBLE)
2159 		tmp |= RT2661_SHORT_PREAMBLE;
2160 
2161 	RAL_WRITE(sc, RT2661_TXRX_CSR4, tmp);
2162 }
2163 
2164 static void
2165 rt2661_set_basicrates(struct rt2661_softc *sc,
2166     const struct ieee80211_rateset *rs)
2167 {
2168 #define RV(r)	((r) & IEEE80211_RATE_VAL)
2169 	uint32_t mask = 0;
2170 	uint8_t rate;
2171 	int i, j;
2172 
2173 	for (i = 0; i < rs->rs_nrates; i++) {
2174 		rate = rs->rs_rates[i];
2175 
2176 		if (!(rate & IEEE80211_RATE_BASIC))
2177 			continue;
2178 
2179 		/*
2180 		 * Find h/w rate index.  We know it exists because the rate
2181 		 * set has already been negotiated.
2182 		 */
2183 		for (j = 0; rt2661_rateset_11g.rs_rates[j] != RV(rate); j++);
2184 
2185 		mask |= 1 << j;
2186 	}
2187 
2188 	RAL_WRITE(sc, RT2661_TXRX_CSR5, mask);
2189 
2190 	DPRINTF(("Setting basic rate mask to 0x%x\n", mask));
2191 #undef RV
2192 }
2193 
2194 /*
2195  * Reprogram MAC/BBP to switch to a new band.  Values taken from the reference
2196  * driver.
2197  */
2198 static void
2199 rt2661_select_band(struct rt2661_softc *sc, struct ieee80211_channel *c)
2200 {
2201 	uint8_t bbp17, bbp35, bbp96, bbp97, bbp98, bbp104;
2202 	uint32_t tmp;
2203 
2204 	/* update all BBP registers that depend on the band */
2205 	bbp17 = 0x20; bbp96 = 0x48; bbp104 = 0x2c;
2206 	bbp35 = 0x50; bbp97 = 0x48; bbp98  = 0x48;
2207 	if (IEEE80211_IS_CHAN_5GHZ(c)) {
2208 		bbp17 += 0x08; bbp96 += 0x10; bbp104 += 0x0c;
2209 		bbp35 += 0x10; bbp97 += 0x10; bbp98  += 0x10;
2210 	}
2211 	if ((IEEE80211_IS_CHAN_2GHZ(c) && sc->ext_2ghz_lna) ||
2212 	    (IEEE80211_IS_CHAN_5GHZ(c) && sc->ext_5ghz_lna)) {
2213 		bbp17 += 0x10; bbp96 += 0x10; bbp104 += 0x10;
2214 	}
2215 
2216 	sc->bbp17 = bbp17;
2217 	rt2661_bbp_write(sc,  17, bbp17);
2218 	rt2661_bbp_write(sc,  96, bbp96);
2219 	rt2661_bbp_write(sc, 104, bbp104);
2220 
2221 	if ((IEEE80211_IS_CHAN_2GHZ(c) && sc->ext_2ghz_lna) ||
2222 	    (IEEE80211_IS_CHAN_5GHZ(c) && sc->ext_5ghz_lna)) {
2223 		rt2661_bbp_write(sc, 75, 0x80);
2224 		rt2661_bbp_write(sc, 86, 0x80);
2225 		rt2661_bbp_write(sc, 88, 0x80);
2226 	}
2227 
2228 	rt2661_bbp_write(sc, 35, bbp35);
2229 	rt2661_bbp_write(sc, 97, bbp97);
2230 	rt2661_bbp_write(sc, 98, bbp98);
2231 
2232 	tmp = RAL_READ(sc, RT2661_PHY_CSR0);
2233 	tmp &= ~(RT2661_PA_PE_2GHZ | RT2661_PA_PE_5GHZ);
2234 	if (IEEE80211_IS_CHAN_2GHZ(c))
2235 		tmp |= RT2661_PA_PE_2GHZ;
2236 	else
2237 		tmp |= RT2661_PA_PE_5GHZ;
2238 	RAL_WRITE(sc, RT2661_PHY_CSR0, tmp);
2239 
2240 	/* 802.11a uses a 16 microseconds short interframe space */
2241 	sc->sifs = IEEE80211_IS_CHAN_5GHZ(c) ? 16 : 10;
2242 }
2243 
2244 static void
2245 rt2661_set_chan(struct rt2661_softc *sc, struct ieee80211_channel *c)
2246 {
2247 	struct ieee80211com *ic = &sc->sc_ic;
2248 	const struct rfprog *rfprog;
2249 	uint8_t bbp3, bbp94 = RT2661_BBPR94_DEFAULT;
2250 	int8_t power;
2251 	u_int i, chan;
2252 
2253 	chan = ieee80211_chan2ieee(ic, c);
2254 	if (chan == 0 || chan == IEEE80211_CHAN_ANY)
2255 		return;
2256 
2257 	/* select the appropriate RF settings based on what EEPROM says */
2258 	rfprog = (sc->rfprog == 0) ? rt2661_rf5225_1 : rt2661_rf5225_2;
2259 
2260 	/* find the settings for this channel (we know it exists) */
2261 	for (i = 0; rfprog[i].chan != chan; i++);
2262 
2263 	power = sc->txpow[i];
2264 	if (power < 0) {
2265 		bbp94 += power;
2266 		power = 0;
2267 	} else if (power > 31) {
2268 		bbp94 += power - 31;
2269 		power = 31;
2270 	}
2271 
2272 	/*
2273 	 * If we've yet to select a channel, or we are switching from the
2274 	 * 2GHz band to the 5GHz band or vice-versa, BBP registers need to
2275 	 * be reprogrammed.
2276 	 */
2277 	if (sc->sc_curchan == NULL || c->ic_flags != sc->sc_curchan->ic_flags) {
2278 		rt2661_select_band(sc, c);
2279 		rt2661_select_antenna(sc);
2280 	}
2281 	sc->sc_curchan = c;
2282 
2283 	rt2661_rf_write(sc, RAL_RF1, rfprog[i].r1);
2284 	rt2661_rf_write(sc, RAL_RF2, rfprog[i].r2);
2285 	rt2661_rf_write(sc, RAL_RF3, rfprog[i].r3 | power << 7);
2286 	rt2661_rf_write(sc, RAL_RF4, rfprog[i].r4 | sc->rffreq << 10);
2287 
2288 	DELAY(200);
2289 
2290 	rt2661_rf_write(sc, RAL_RF1, rfprog[i].r1);
2291 	rt2661_rf_write(sc, RAL_RF2, rfprog[i].r2);
2292 	rt2661_rf_write(sc, RAL_RF3, rfprog[i].r3 | power << 7 | 1);
2293 	rt2661_rf_write(sc, RAL_RF4, rfprog[i].r4 | sc->rffreq << 10);
2294 
2295 	DELAY(200);
2296 
2297 	rt2661_rf_write(sc, RAL_RF1, rfprog[i].r1);
2298 	rt2661_rf_write(sc, RAL_RF2, rfprog[i].r2);
2299 	rt2661_rf_write(sc, RAL_RF3, rfprog[i].r3 | power << 7);
2300 	rt2661_rf_write(sc, RAL_RF4, rfprog[i].r4 | sc->rffreq << 10);
2301 
2302 	/* enable smart mode for MIMO-capable RFs */
2303 	bbp3 = rt2661_bbp_read(sc, 3);
2304 
2305 	bbp3 &= ~RT2661_SMART_MODE;
2306 	if (sc->rf_rev == RT2661_RF_5325 || sc->rf_rev == RT2661_RF_2529)
2307 		bbp3 |= RT2661_SMART_MODE;
2308 
2309 	rt2661_bbp_write(sc, 3, bbp3);
2310 
2311 	if (bbp94 != RT2661_BBPR94_DEFAULT)
2312 		rt2661_bbp_write(sc, 94, bbp94);
2313 
2314 	/* 5GHz radio needs a 1ms delay here */
2315 	if (IEEE80211_IS_CHAN_5GHZ(c))
2316 		DELAY(1000);
2317 }
2318 
2319 static void
2320 rt2661_set_bssid(struct rt2661_softc *sc, const uint8_t *bssid)
2321 {
2322 	uint32_t tmp;
2323 
2324 	tmp = bssid[0] | bssid[1] << 8 | bssid[2] << 16 | bssid[3] << 24;
2325 	RAL_WRITE(sc, RT2661_MAC_CSR4, tmp);
2326 
2327 	tmp = bssid[4] | bssid[5] << 8 | RT2661_ONE_BSSID << 16;
2328 	RAL_WRITE(sc, RT2661_MAC_CSR5, tmp);
2329 }
2330 
2331 static void
2332 rt2661_set_macaddr(struct rt2661_softc *sc, const uint8_t *addr)
2333 {
2334 	uint32_t tmp;
2335 
2336 	tmp = addr[0] | addr[1] << 8 | addr[2] << 16 | addr[3] << 24;
2337 	RAL_WRITE(sc, RT2661_MAC_CSR2, tmp);
2338 
2339 	tmp = addr[4] | addr[5] << 8 | 0xff << 16;
2340 	RAL_WRITE(sc, RT2661_MAC_CSR3, tmp);
2341 }
2342 
2343 static void
2344 rt2661_update_promisc(struct rt2661_softc *sc)
2345 {
2346 	struct ifnet *ifp = sc->sc_ic.ic_ifp;
2347 	uint32_t tmp;
2348 
2349 	tmp = RAL_READ(sc, RT2661_TXRX_CSR0);
2350 
2351 	tmp &= ~RT2661_DROP_NOT_TO_ME;
2352 	if (!(ifp->if_flags & IFF_PROMISC))
2353 		tmp |= RT2661_DROP_NOT_TO_ME;
2354 
2355 	RAL_WRITE(sc, RT2661_TXRX_CSR0, tmp);
2356 
2357 	DPRINTF(("%s promiscuous mode\n", (ifp->if_flags & IFF_PROMISC) ?
2358 	    "entering" : "leaving"));
2359 }
2360 
2361 #if 0
2362 /*
2363  * Update QoS (802.11e) settings for each h/w Tx ring.
2364  */
2365 static int
2366 rt2661_wme_update(struct ieee80211com *ic)
2367 {
2368 	struct rt2661_softc *sc = ic->ic_ifp->if_softc;
2369 	const struct wmeParams *wmep;
2370 
2371 	wmep = ic->ic_wme.wme_chanParams.cap_wmeParams;
2372 
2373 	/* XXX: not sure about shifts. */
2374 	/* XXX: the reference driver plays with AC_VI settings too. */
2375 
2376 	/* update TxOp */
2377 	RAL_WRITE(sc, RT2661_AC_TXOP_CSR0,
2378 	    wmep[WME_AC_BE].wmep_txopLimit << 16 |
2379 	    wmep[WME_AC_BK].wmep_txopLimit);
2380 	RAL_WRITE(sc, RT2661_AC_TXOP_CSR1,
2381 	    wmep[WME_AC_VI].wmep_txopLimit << 16 |
2382 	    wmep[WME_AC_VO].wmep_txopLimit);
2383 
2384 	/* update CWmin */
2385 	RAL_WRITE(sc, RT2661_CWMIN_CSR,
2386 	    wmep[WME_AC_BE].wmep_logcwmin << 12 |
2387 	    wmep[WME_AC_BK].wmep_logcwmin <<  8 |
2388 	    wmep[WME_AC_VI].wmep_logcwmin <<  4 |
2389 	    wmep[WME_AC_VO].wmep_logcwmin);
2390 
2391 	/* update CWmax */
2392 	RAL_WRITE(sc, RT2661_CWMAX_CSR,
2393 	    wmep[WME_AC_BE].wmep_logcwmax << 12 |
2394 	    wmep[WME_AC_BK].wmep_logcwmax <<  8 |
2395 	    wmep[WME_AC_VI].wmep_logcwmax <<  4 |
2396 	    wmep[WME_AC_VO].wmep_logcwmax);
2397 
2398 	/* update Aifsn */
2399 	RAL_WRITE(sc, RT2661_AIFSN_CSR,
2400 	    wmep[WME_AC_BE].wmep_aifsn << 12 |
2401 	    wmep[WME_AC_BK].wmep_aifsn <<  8 |
2402 	    wmep[WME_AC_VI].wmep_aifsn <<  4 |
2403 	    wmep[WME_AC_VO].wmep_aifsn);
2404 
2405 	return 0;
2406 }
2407 #endif
2408 
2409 static void
2410 rt2661_updateslot(struct ifnet *ifp)
2411 {
2412 	struct rt2661_softc *sc = ifp->if_softc;
2413 	struct ieee80211com *ic = &sc->sc_ic;
2414 
2415 	if (ic->ic_opmode == IEEE80211_M_HOSTAP) {
2416 		/*
2417 		 * In HostAP mode, we defer setting of new slot time until
2418 		 * updated ERP Information Element has propagated to all
2419 		 * associated STAs.
2420 		 */
2421 		sc->sc_flags |= RT2661_UPDATE_SLOT;
2422 	} else
2423 		rt2661_set_slottime(sc);
2424 }
2425 
2426 static void
2427 rt2661_set_slottime(struct rt2661_softc *sc)
2428 {
2429 	struct ieee80211com *ic = &sc->sc_ic;
2430 	uint8_t slottime;
2431 	uint32_t tmp;
2432 
2433 	slottime = (ic->ic_flags & IEEE80211_F_SHSLOT) ? 9 : 20;
2434 
2435 	tmp = RAL_READ(sc, RT2661_MAC_CSR9);
2436 	tmp = (tmp & ~0xff) | slottime;
2437 	RAL_WRITE(sc, RT2661_MAC_CSR9, tmp);
2438 
2439 	DPRINTF(("setting slot time to %uus\n", slottime));
2440 }
2441 
2442 static const char *
2443 rt2661_get_rf(int rev)
2444 {
2445 	switch (rev) {
2446 	case RT2661_RF_5225:	return "RT5225";
2447 	case RT2661_RF_5325:	return "RT5325 (MIMO XR)";
2448 	case RT2661_RF_2527:	return "RT2527";
2449 	case RT2661_RF_2529:	return "RT2529 (MIMO XR)";
2450 	default:		return "unknown";
2451 	}
2452 }
2453 
2454 static void
2455 rt2661_read_eeprom(struct rt2661_softc *sc)
2456 {
2457 	struct ieee80211com *ic = &sc->sc_ic;
2458 	uint16_t val;
2459 	int i;
2460 
2461 	/* read MAC address */
2462 	val = rt2661_eeprom_read(sc, RT2661_EEPROM_MAC01);
2463 	ic->ic_myaddr[0] = val & 0xff;
2464 	ic->ic_myaddr[1] = val >> 8;
2465 
2466 	val = rt2661_eeprom_read(sc, RT2661_EEPROM_MAC23);
2467 	ic->ic_myaddr[2] = val & 0xff;
2468 	ic->ic_myaddr[3] = val >> 8;
2469 
2470 	val = rt2661_eeprom_read(sc, RT2661_EEPROM_MAC45);
2471 	ic->ic_myaddr[4] = val & 0xff;
2472 	ic->ic_myaddr[5] = val >> 8;
2473 
2474 	val = rt2661_eeprom_read(sc, RT2661_EEPROM_ANTENNA);
2475 	/* XXX: test if different from 0xffff? */
2476 	sc->rf_rev   = (val >> 11) & 0x1f;
2477 	sc->hw_radio = (val >> 10) & 0x1;
2478 	sc->rx_ant   = (val >> 4)  & 0x3;
2479 	sc->tx_ant   = (val >> 2)  & 0x3;
2480 	sc->nb_ant   = val & 0x3;
2481 
2482 	DPRINTF(("RF revision=%d\n", sc->rf_rev));
2483 
2484 	val = rt2661_eeprom_read(sc, RT2661_EEPROM_CONFIG2);
2485 	sc->ext_5ghz_lna = (val >> 6) & 0x1;
2486 	sc->ext_2ghz_lna = (val >> 4) & 0x1;
2487 
2488 	DPRINTF(("External 2GHz LNA=%d\nExternal 5GHz LNA=%d\n",
2489 	    sc->ext_2ghz_lna, sc->ext_5ghz_lna));
2490 
2491 	val = rt2661_eeprom_read(sc, RT2661_EEPROM_RSSI_2GHZ_OFFSET);
2492 	if ((val & 0xff) != 0xff)
2493 		sc->rssi_2ghz_corr = (int8_t)(val & 0xff);	/* signed */
2494 
2495 	val = rt2661_eeprom_read(sc, RT2661_EEPROM_RSSI_5GHZ_OFFSET);
2496 	if ((val & 0xff) != 0xff)
2497 		sc->rssi_5ghz_corr = (int8_t)(val & 0xff);	/* signed */
2498 
2499 	/* adjust RSSI correction for external low-noise amplifier */
2500 	if (sc->ext_2ghz_lna)
2501 		sc->rssi_2ghz_corr -= 14;
2502 	if (sc->ext_5ghz_lna)
2503 		sc->rssi_5ghz_corr -= 14;
2504 
2505 	DPRINTF(("RSSI 2GHz corr=%d\nRSSI 5GHz corr=%d\n",
2506 	    sc->rssi_2ghz_corr, sc->rssi_5ghz_corr));
2507 
2508 	val = rt2661_eeprom_read(sc, RT2661_EEPROM_FREQ_OFFSET);
2509 	if ((val >> 8) != 0xff)
2510 		sc->rfprog = (val >> 8) & 0x3;
2511 	if ((val & 0xff) != 0xff)
2512 		sc->rffreq = val & 0xff;
2513 
2514 	DPRINTF(("RF prog=%d\nRF freq=%d\n", sc->rfprog, sc->rffreq));
2515 
2516 	/* read Tx power for all a/b/g channels */
2517 	for (i = 0; i < 19; i++) {
2518 		val = rt2661_eeprom_read(sc, RT2661_EEPROM_TXPOWER + i);
2519 		sc->txpow[i * 2] = (int8_t)(val >> 8);		/* signed */
2520 		DPRINTF(("Channel=%d Tx power=%d\n",
2521 		    rt2661_rf5225_1[i * 2].chan, sc->txpow[i * 2]));
2522 		sc->txpow[i * 2 + 1] = (int8_t)(val & 0xff);	/* signed */
2523 		DPRINTF(("Channel=%d Tx power=%d\n",
2524 		    rt2661_rf5225_1[i * 2 + 1].chan, sc->txpow[i * 2 + 1]));
2525 	}
2526 
2527 	/* read vendor-specific BBP values */
2528 	for (i = 0; i < 16; i++) {
2529 		val = rt2661_eeprom_read(sc, RT2661_EEPROM_BBP_BASE + i);
2530 		if (val == 0 || val == 0xffff)
2531 			continue;	/* skip invalid entries */
2532 		sc->bbp_prom[i].reg = val >> 8;
2533 		sc->bbp_prom[i].val = val & 0xff;
2534 		DPRINTF(("BBP R%d=%02x\n", sc->bbp_prom[i].reg,
2535 		    sc->bbp_prom[i].val));
2536 	}
2537 }
2538 
2539 static int
2540 rt2661_bbp_init(struct rt2661_softc *sc)
2541 {
2542 #define N(a)	(sizeof (a) / sizeof ((a)[0]))
2543 	int i, ntries;
2544 	uint8_t val;
2545 
2546 	/* wait for BBP to be ready */
2547 	for (ntries = 0; ntries < 100; ntries++) {
2548 		val = rt2661_bbp_read(sc, 0);
2549 		if (val != 0 && val != 0xff)
2550 			break;
2551 		DELAY(100);
2552 	}
2553 	if (ntries == 100) {
2554 		aprint_error_dev(sc->sc_dev, "timeout waiting for BBP\n");
2555 		return EIO;
2556 	}
2557 
2558 	/* initialize BBP registers to default values */
2559 	for (i = 0; i < N(rt2661_def_bbp); i++) {
2560 		rt2661_bbp_write(sc, rt2661_def_bbp[i].reg,
2561 		    rt2661_def_bbp[i].val);
2562 	}
2563 
2564 	/* write vendor-specific BBP values (from EEPROM) */
2565 	for (i = 0; i < 16; i++) {
2566 		if (sc->bbp_prom[i].reg == 0)
2567 			continue;
2568 		rt2661_bbp_write(sc, sc->bbp_prom[i].reg, sc->bbp_prom[i].val);
2569 	}
2570 
2571 	return 0;
2572 #undef N
2573 }
2574 
2575 static int
2576 rt2661_init(struct ifnet *ifp)
2577 {
2578 #define N(a)	(sizeof (a) / sizeof ((a)[0]))
2579 	struct rt2661_softc *sc = ifp->if_softc;
2580 	struct ieee80211com *ic = &sc->sc_ic;
2581 	const char *name = NULL;	/* make lint happy */
2582 	uint8_t *ucode;
2583 	size_t size;
2584 	uint32_t tmp, star[3];
2585 	int i, ntries;
2586 	firmware_handle_t fh;
2587 
2588 	/* for CardBus, power on the socket */
2589 	if (!(sc->sc_flags & RT2661_ENABLED)) {
2590 		if (sc->sc_enable != NULL && (*sc->sc_enable)(sc) != 0) {
2591 			aprint_error_dev(sc->sc_dev, "could not enable device\n");
2592 			return EIO;
2593 		}
2594 		sc->sc_flags |= RT2661_ENABLED;
2595 	}
2596 
2597 	rt2661_stop(ifp, 0);
2598 
2599 	if (!(sc->sc_flags & RT2661_FWLOADED)) {
2600 		switch (sc->sc_id) {
2601 		case PCI_PRODUCT_RALINK_RT2561:
2602 			name = "ral-rt2561";
2603 			break;
2604 		case PCI_PRODUCT_RALINK_RT2561S:
2605 			name = "ral-rt2561s";
2606 			break;
2607 		case PCI_PRODUCT_RALINK_RT2661:
2608 			name = "ral-rt2661";
2609 			break;
2610 		}
2611 
2612 		if (firmware_open("ral", name, &fh) != 0) {
2613 			aprint_error_dev(sc->sc_dev, "could not open microcode %s\n", name);
2614 			rt2661_stop(ifp, 1);
2615 			return EIO;
2616 		}
2617 
2618 		size = firmware_get_size(fh);
2619 		if (!(ucode = firmware_malloc(size))) {
2620 			aprint_error_dev(sc->sc_dev, "could not alloc microcode memory\n");
2621 			firmware_close(fh);
2622 			rt2661_stop(ifp, 1);
2623 			return ENOMEM;
2624 		}
2625 
2626 		if (firmware_read(fh, 0, ucode, size) != 0) {
2627 			aprint_error_dev(sc->sc_dev, "could not read microcode %s\n", name);
2628 			firmware_free(ucode, size);
2629 			firmware_close(fh);
2630 			rt2661_stop(ifp, 1);
2631 			return EIO;
2632 		}
2633 
2634 		if (rt2661_load_microcode(sc, ucode, size) != 0) {
2635 			aprint_error_dev(sc->sc_dev, "could not load 8051 microcode\n");
2636 			firmware_free(ucode, size);
2637 			firmware_close(fh);
2638 			rt2661_stop(ifp, 1);
2639 			return EIO;
2640 		}
2641 
2642 		firmware_free(ucode, size);
2643 		firmware_close(fh);
2644 		sc->sc_flags |= RT2661_FWLOADED;
2645 	}
2646 
2647 	/* initialize Tx rings */
2648 	RAL_WRITE(sc, RT2661_AC1_BASE_CSR, sc->txq[1].physaddr);
2649 	RAL_WRITE(sc, RT2661_AC0_BASE_CSR, sc->txq[0].physaddr);
2650 	RAL_WRITE(sc, RT2661_AC2_BASE_CSR, sc->txq[2].physaddr);
2651 	RAL_WRITE(sc, RT2661_AC3_BASE_CSR, sc->txq[3].physaddr);
2652 
2653 	/* initialize Mgt ring */
2654 	RAL_WRITE(sc, RT2661_MGT_BASE_CSR, sc->mgtq.physaddr);
2655 
2656 	/* initialize Rx ring */
2657 	RAL_WRITE(sc, RT2661_RX_BASE_CSR, sc->rxq.physaddr);
2658 
2659 	/* initialize Tx rings sizes */
2660 	RAL_WRITE(sc, RT2661_TX_RING_CSR0,
2661 	    RT2661_TX_RING_COUNT << 24 |
2662 	    RT2661_TX_RING_COUNT << 16 |
2663 	    RT2661_TX_RING_COUNT <<  8 |
2664 	    RT2661_TX_RING_COUNT);
2665 
2666 	RAL_WRITE(sc, RT2661_TX_RING_CSR1,
2667 	    RT2661_TX_DESC_WSIZE << 16 |
2668 	    RT2661_TX_RING_COUNT <<  8 |	/* XXX: HCCA ring unused */
2669 	    RT2661_MGT_RING_COUNT);
2670 
2671 	/* initialize Rx rings */
2672 	RAL_WRITE(sc, RT2661_RX_RING_CSR,
2673 	    RT2661_RX_DESC_BACK  << 16 |
2674 	    RT2661_RX_DESC_WSIZE <<  8 |
2675 	    RT2661_RX_RING_COUNT);
2676 
2677 	/* XXX: some magic here */
2678 	RAL_WRITE(sc, RT2661_TX_DMA_DST_CSR, 0xaa);
2679 
2680 	/* load base addresses of all 5 Tx rings (4 data + 1 mgt) */
2681 	RAL_WRITE(sc, RT2661_LOAD_TX_RING_CSR, 0x1f);
2682 
2683 	/* load base address of Rx ring */
2684 	RAL_WRITE(sc, RT2661_RX_CNTL_CSR, 2);
2685 
2686 	/* initialize MAC registers to default values */
2687 	for (i = 0; i < N(rt2661_def_mac); i++)
2688 		RAL_WRITE(sc, rt2661_def_mac[i].reg, rt2661_def_mac[i].val);
2689 
2690 	IEEE80211_ADDR_COPY(ic->ic_myaddr, CLLADDR(ifp->if_sadl));
2691 	rt2661_set_macaddr(sc, ic->ic_myaddr);
2692 
2693 	/* set host ready */
2694 	RAL_WRITE(sc, RT2661_MAC_CSR1, 3);
2695 	RAL_WRITE(sc, RT2661_MAC_CSR1, 0);
2696 
2697 	/* wait for BBP/RF to wakeup */
2698 	for (ntries = 0; ntries < 1000; ntries++) {
2699 		if (RAL_READ(sc, RT2661_MAC_CSR12) & 8)
2700 			break;
2701 		DELAY(1000);
2702 	}
2703 	if (ntries == 1000) {
2704 		printf("timeout waiting for BBP/RF to wakeup\n");
2705 		rt2661_stop(ifp, 1);
2706 		return EIO;
2707 	}
2708 
2709 	if (rt2661_bbp_init(sc) != 0) {
2710 		rt2661_stop(ifp, 1);
2711 		return EIO;
2712 	}
2713 
2714 	/* select default channel */
2715 	sc->sc_curchan = ic->ic_curchan;
2716 	rt2661_select_band(sc, sc->sc_curchan);
2717 	rt2661_select_antenna(sc);
2718 	rt2661_set_chan(sc, sc->sc_curchan);
2719 
2720 	/* update Rx filter */
2721 	tmp = RAL_READ(sc, RT2661_TXRX_CSR0) & 0xffff;
2722 
2723 	tmp |= RT2661_DROP_PHY_ERROR | RT2661_DROP_CRC_ERROR;
2724 	if (ic->ic_opmode != IEEE80211_M_MONITOR) {
2725 		tmp |= RT2661_DROP_CTL | RT2661_DROP_VER_ERROR |
2726 		       RT2661_DROP_ACKCTS;
2727 		if (ic->ic_opmode != IEEE80211_M_HOSTAP)
2728 			tmp |= RT2661_DROP_TODS;
2729 		if (!(ifp->if_flags & IFF_PROMISC))
2730 			tmp |= RT2661_DROP_NOT_TO_ME;
2731 	}
2732 
2733 	RAL_WRITE(sc, RT2661_TXRX_CSR0, tmp);
2734 
2735 	/* clear STA registers */
2736 	RAL_READ_REGION_4(sc, RT2661_STA_CSR0, star, N(star));
2737 
2738 	/* initialize ASIC */
2739 	RAL_WRITE(sc, RT2661_MAC_CSR1, 4);
2740 
2741 	/* clear any pending interrupt */
2742 	RAL_WRITE(sc, RT2661_INT_SOURCE_CSR, 0xffffffff);
2743 
2744 	/* enable interrupts */
2745 	RAL_WRITE(sc, RT2661_INT_MASK_CSR, 0x0000ff10);
2746 	RAL_WRITE(sc, RT2661_MCU_INT_MASK_CSR, 0);
2747 
2748 	/* kick Rx */
2749 	RAL_WRITE(sc, RT2661_RX_CNTL_CSR, 1);
2750 
2751 	ifp->if_flags &= ~IFF_OACTIVE;
2752 	ifp->if_flags |= IFF_RUNNING;
2753 
2754 	if (ic->ic_opmode != IEEE80211_M_MONITOR) {
2755 		if (ic->ic_roaming != IEEE80211_ROAMING_MANUAL)
2756 			ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
2757 	} else
2758 		ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
2759 
2760 	return 0;
2761 #undef N
2762 }
2763 
2764 static void
2765 rt2661_stop(struct ifnet *ifp, int disable)
2766 {
2767 	struct rt2661_softc *sc = ifp->if_softc;
2768 	struct ieee80211com *ic = &sc->sc_ic;
2769 	uint32_t tmp;
2770 
2771 	sc->sc_tx_timer = 0;
2772 	ifp->if_timer = 0;
2773 	ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
2774 
2775 	ieee80211_new_state(ic, IEEE80211_S_INIT, -1);	/* free all nodes */
2776 
2777 	/* abort Tx (for all 5 Tx rings) */
2778 	RAL_WRITE(sc, RT2661_TX_CNTL_CSR, 0x1f << 16);
2779 
2780 	/* disable Rx (value remains after reset!) */
2781 	tmp = RAL_READ(sc, RT2661_TXRX_CSR0);
2782 	RAL_WRITE(sc, RT2661_TXRX_CSR0, tmp | RT2661_DISABLE_RX);
2783 
2784 	/* reset ASIC */
2785 	RAL_WRITE(sc, RT2661_MAC_CSR1, 3);
2786 	RAL_WRITE(sc, RT2661_MAC_CSR1, 0);
2787 
2788 	/* disable interrupts */
2789 	RAL_WRITE(sc, RT2661_INT_MASK_CSR, 0xffffff7f);
2790 	RAL_WRITE(sc, RT2661_MCU_INT_MASK_CSR, 0xffffffff);
2791 
2792 	/* clear any pending interrupt */
2793 	RAL_WRITE(sc, RT2661_INT_SOURCE_CSR, 0xffffffff);
2794 	RAL_WRITE(sc, RT2661_MCU_INT_SOURCE_CSR, 0xffffffff);
2795 
2796 	/* reset Tx and Rx rings */
2797 	rt2661_reset_tx_ring(sc, &sc->txq[0]);
2798 	rt2661_reset_tx_ring(sc, &sc->txq[1]);
2799 	rt2661_reset_tx_ring(sc, &sc->txq[2]);
2800 	rt2661_reset_tx_ring(sc, &sc->txq[3]);
2801 	rt2661_reset_tx_ring(sc, &sc->mgtq);
2802 	rt2661_reset_rx_ring(sc, &sc->rxq);
2803 
2804 	/* for CardBus, power down the socket */
2805 	if (disable && sc->sc_disable != NULL) {
2806 		if (sc->sc_flags & RT2661_ENABLED) {
2807 			(*sc->sc_disable)(sc);
2808 			sc->sc_flags &= ~(RT2661_ENABLED | RT2661_FWLOADED);
2809 		}
2810 	}
2811 }
2812 
2813 static int
2814 rt2661_load_microcode(struct rt2661_softc *sc, const uint8_t *ucode, int size)
2815 {
2816 	int ntries;
2817 
2818 	/* reset 8051 */
2819 	RAL_WRITE(sc, RT2661_MCU_CNTL_CSR, RT2661_MCU_RESET);
2820 
2821 	/* cancel any pending Host to MCU command */
2822 	RAL_WRITE(sc, RT2661_H2M_MAILBOX_CSR, 0);
2823 	RAL_WRITE(sc, RT2661_M2H_CMD_DONE_CSR, 0xffffffff);
2824 	RAL_WRITE(sc, RT2661_HOST_CMD_CSR, 0);
2825 
2826 	/* write 8051's microcode */
2827 	RAL_WRITE(sc, RT2661_MCU_CNTL_CSR, RT2661_MCU_RESET | RT2661_MCU_SEL);
2828 	RAL_WRITE_REGION_1(sc, RT2661_MCU_CODE_BASE, ucode, size);
2829 	RAL_WRITE(sc, RT2661_MCU_CNTL_CSR, RT2661_MCU_RESET);
2830 
2831 	/* kick 8051's ass */
2832 	RAL_WRITE(sc, RT2661_MCU_CNTL_CSR, 0);
2833 
2834 	/* wait for 8051 to initialize */
2835 	for (ntries = 0; ntries < 500; ntries++) {
2836 		if (RAL_READ(sc, RT2661_MCU_CNTL_CSR) & RT2661_MCU_READY)
2837 			break;
2838 		DELAY(100);
2839 	}
2840 	if (ntries == 500) {
2841 		printf("timeout waiting for MCU to initialize\n");
2842 		return EIO;
2843 	}
2844 	return 0;
2845 }
2846 
2847 /*
2848  * Dynamically tune Rx sensitivity (BBP register 17) based on average RSSI and
2849  * false CCA count.  This function is called periodically (every seconds) when
2850  * in the RUN state.  Values taken from the reference driver.
2851  */
2852 static void
2853 rt2661_rx_tune(struct rt2661_softc *sc)
2854 {
2855 	uint8_t bbp17;
2856 	uint16_t cca;
2857 	int lo, hi, dbm;
2858 
2859 	/*
2860 	 * Tuning range depends on operating band and on the presence of an
2861 	 * external low-noise amplifier.
2862 	 */
2863 	lo = 0x20;
2864 	if (IEEE80211_IS_CHAN_5GHZ(sc->sc_curchan))
2865 		lo += 0x08;
2866 	if ((IEEE80211_IS_CHAN_2GHZ(sc->sc_curchan) && sc->ext_2ghz_lna) ||
2867 	    (IEEE80211_IS_CHAN_5GHZ(sc->sc_curchan) && sc->ext_5ghz_lna))
2868 		lo += 0x10;
2869 	hi = lo + 0x20;
2870 
2871 	dbm = sc->avg_rssi;
2872 	/* retrieve false CCA count since last call (clear on read) */
2873 	cca = RAL_READ(sc, RT2661_STA_CSR1) & 0xffff;
2874 
2875 	DPRINTFN(2, ("RSSI=%ddBm false CCA=%d\n", dbm, cca));
2876 
2877 	if (dbm < -74) {
2878 		/* very bad RSSI, tune using false CCA count */
2879 		bbp17 = sc->bbp17; /* current value */
2880 
2881 		hi -= 2 * (-74 - dbm);
2882 		if (hi < lo)
2883 			hi = lo;
2884 
2885 		if (bbp17 > hi)
2886 			bbp17 = hi;
2887 		else if (cca > 512)
2888 			bbp17 = min(bbp17 + 1, hi);
2889 		else if (cca < 100)
2890 			bbp17 = max(bbp17 - 1, lo);
2891 
2892 	} else if (dbm < -66) {
2893 		bbp17 = lo + 0x08;
2894 	} else if (dbm < -58) {
2895 		bbp17 = lo + 0x10;
2896 	} else if (dbm < -35) {
2897 		bbp17 = hi;
2898 	} else {	/* very good RSSI >= -35dBm */
2899 		bbp17 = 0x60;	/* very low sensitivity */
2900 	}
2901 
2902 	if (bbp17 != sc->bbp17) {
2903 		DPRINTF(("BBP17 %x->%x\n", sc->bbp17, bbp17));
2904 		rt2661_bbp_write(sc, 17, bbp17);
2905 		sc->bbp17 = bbp17;
2906 	}
2907 }
2908 
2909 #ifdef notyet
2910 /*
2911  * Enter/Leave radar detection mode.
2912  * This is for 802.11h additional regulatory domains.
2913  */
2914 static void
2915 rt2661_radar_start(struct rt2661_softc *sc)
2916 {
2917 	uint32_t tmp;
2918 
2919 	/* disable Rx */
2920 	tmp = RAL_READ(sc, RT2661_TXRX_CSR0);
2921 	RAL_WRITE(sc, RT2661_TXRX_CSR0, tmp | RT2661_DISABLE_RX);
2922 
2923 	rt2661_bbp_write(sc, 82, 0x20);
2924 	rt2661_bbp_write(sc, 83, 0x00);
2925 	rt2661_bbp_write(sc, 84, 0x40);
2926 
2927 	/* save current BBP registers values */
2928 	sc->bbp18 = rt2661_bbp_read(sc, 18);
2929 	sc->bbp21 = rt2661_bbp_read(sc, 21);
2930 	sc->bbp22 = rt2661_bbp_read(sc, 22);
2931 	sc->bbp16 = rt2661_bbp_read(sc, 16);
2932 	sc->bbp17 = rt2661_bbp_read(sc, 17);
2933 	sc->bbp64 = rt2661_bbp_read(sc, 64);
2934 
2935 	rt2661_bbp_write(sc, 18, 0xff);
2936 	rt2661_bbp_write(sc, 21, 0x3f);
2937 	rt2661_bbp_write(sc, 22, 0x3f);
2938 	rt2661_bbp_write(sc, 16, 0xbd);
2939 	rt2661_bbp_write(sc, 17, sc->ext_5ghz_lna ? 0x44 : 0x34);
2940 	rt2661_bbp_write(sc, 64, 0x21);
2941 
2942 	/* restore Rx filter */
2943 	RAL_WRITE(sc, RT2661_TXRX_CSR0, tmp);
2944 }
2945 
2946 static int
2947 rt2661_radar_stop(struct rt2661_softc *sc)
2948 {
2949 	uint8_t bbp66;
2950 
2951 	/* read radar detection result */
2952 	bbp66 = rt2661_bbp_read(sc, 66);
2953 
2954 	/* restore BBP registers values */
2955 	rt2661_bbp_write(sc, 16, sc->bbp16);
2956 	rt2661_bbp_write(sc, 17, sc->bbp17);
2957 	rt2661_bbp_write(sc, 18, sc->bbp18);
2958 	rt2661_bbp_write(sc, 21, sc->bbp21);
2959 	rt2661_bbp_write(sc, 22, sc->bbp22);
2960 	rt2661_bbp_write(sc, 64, sc->bbp64);
2961 
2962 	return bbp66 == 1;
2963 }
2964 #endif
2965 
2966 static int
2967 rt2661_prepare_beacon(struct rt2661_softc *sc)
2968 {
2969 	struct ieee80211com *ic = &sc->sc_ic;
2970 	struct ieee80211_node *ni = ic->ic_bss;
2971 	struct rt2661_tx_desc desc;
2972 	struct mbuf *m0;
2973 	struct ieee80211_beacon_offsets bo;
2974 	int rate;
2975 
2976 	m0 = ieee80211_beacon_alloc(ic, ni, &bo);
2977 	if (m0 == NULL) {
2978 		aprint_error_dev(sc->sc_dev, "could not allocate beacon frame\n");
2979 		return ENOBUFS;
2980 	}
2981 
2982 	/* send beacons at the lowest available rate */
2983 	rate = IEEE80211_IS_CHAN_5GHZ(ni->ni_chan) ? 12 : 2;
2984 
2985 	rt2661_setup_tx_desc(sc, &desc, RT2661_TX_TIMESTAMP, RT2661_TX_HWSEQ,
2986 	    m0->m_pkthdr.len, rate, NULL, 0, RT2661_QID_MGT);
2987 
2988 	/* copy the first 24 bytes of Tx descriptor into NIC memory */
2989 	RAL_WRITE_REGION_1(sc, RT2661_HW_BEACON_BASE0, (uint8_t *)&desc, 24);
2990 
2991 	/* copy beacon header and payload into NIC memory */
2992 	RAL_WRITE_REGION_1(sc, RT2661_HW_BEACON_BASE0 + 24,
2993 	    mtod(m0, uint8_t *), m0->m_pkthdr.len);
2994 
2995 	m_freem(m0);
2996 
2997 	/*
2998 	 * Store offset of ERP Information Element so that we can update it
2999 	 * dynamically when the slot time changes.
3000 	 * XXX: this is ugly since it depends on how net80211 builds beacon
3001 	 * frames but ieee80211_beacon_alloc() doesn't store offsets for us.
3002 	 */
3003 	if (ic->ic_curmode == IEEE80211_MODE_11G) {
3004 		sc->erp_csr =
3005 		    RT2661_HW_BEACON_BASE0 + 24 +
3006 		    sizeof (struct ieee80211_frame) +
3007 		    8 + 2 + 2 + 2 + ni->ni_esslen +
3008 		    2 + min(ni->ni_rates.rs_nrates, IEEE80211_RATE_SIZE) +
3009 		    2 + 1 +
3010 		    ((ic->ic_opmode == IEEE80211_M_IBSS) ? 4 : 6) +
3011 		    2;
3012 	}
3013 
3014 	return 0;
3015 }
3016 
3017 /*
3018  * Enable TSF synchronization and tell h/w to start sending beacons for IBSS
3019  * and HostAP operating modes.
3020  */
3021 static void
3022 rt2661_enable_tsf_sync(struct rt2661_softc *sc)
3023 {
3024 	struct ieee80211com *ic = &sc->sc_ic;
3025 	uint32_t tmp;
3026 
3027 	if (ic->ic_opmode != IEEE80211_M_STA) {
3028 		/*
3029 		 * Change default 16ms TBTT adjustment to 8ms.
3030 		 * Must be done before enabling beacon generation.
3031 		 */
3032 		RAL_WRITE(sc, RT2661_TXRX_CSR10, 1 << 12 | 8);
3033 	}
3034 
3035 	tmp = RAL_READ(sc, RT2661_TXRX_CSR9) & 0xff000000;
3036 
3037 	/* set beacon interval (in 1/16ms unit) */
3038 	tmp |= ic->ic_bss->ni_intval * 16;
3039 
3040 	tmp |= RT2661_TSF_TICKING | RT2661_ENABLE_TBTT;
3041 	if (ic->ic_opmode == IEEE80211_M_STA)
3042 		tmp |= RT2661_TSF_MODE(1);
3043 	else
3044 		tmp |= RT2661_TSF_MODE(2) | RT2661_GENERATE_BEACON;
3045 
3046 	RAL_WRITE(sc, RT2661_TXRX_CSR9, tmp);
3047 }
3048 
3049 /*
3050  * Retrieve the "Received Signal Strength Indicator" from the raw values
3051  * contained in Rx descriptors.  The computation depends on which band the
3052  * frame was received.  Correction values taken from the reference driver.
3053  */
3054 static int
3055 rt2661_get_rssi(struct rt2661_softc *sc, uint8_t raw)
3056 {
3057 	int lna, agc, rssi;
3058 
3059 	lna = (raw >> 5) & 0x3;
3060 	agc = raw & 0x1f;
3061 
3062 	rssi = 2 * agc;
3063 
3064 	if (IEEE80211_IS_CHAN_2GHZ(sc->sc_curchan)) {
3065 		rssi += sc->rssi_2ghz_corr;
3066 
3067 		if (lna == 1)
3068 			rssi -= 64;
3069 		else if (lna == 2)
3070 			rssi -= 74;
3071 		else if (lna == 3)
3072 			rssi -= 90;
3073 	} else {
3074 		rssi += sc->rssi_5ghz_corr;
3075 
3076 		if (lna == 1)
3077 			rssi -= 64;
3078 		else if (lna == 2)
3079 			rssi -= 86;
3080 		else if (lna == 3)
3081 			rssi -= 100;
3082 	}
3083 	return rssi;
3084 }
3085