56e38f55c8a997838e963eaac6e69b9a08b4b00c
[dragonfly.git] / sys / dev / netif / ral / rt2560.c
1 /*
2  * Copyright (c) 2005, 2006
3  *      Damien Bergamini <damien.bergamini@free.fr>
4  *
5  * Permission to use, copy, modify, and distribute this software for any
6  * purpose with or without fee is hereby granted, provided that the above
7  * copyright notice and this permission notice appear in all copies.
8  *
9  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16  *
17  * $FreeBSD: src/sys/dev/ral/rt2560.c,v 1.3 2006/03/21 21:15:43 damien Exp $
18  * $DragonFly: src/sys/dev/netif/ral/rt2560.c,v 1.5 2006/11/16 13:16:46 sephe Exp $
19  */
20
21 /*
22  * Ralink Technology RT2560 chipset driver
23  * http://www.ralinktech.com/
24  */
25
26 #include <sys/param.h>
27 #include <sys/bus.h>
28 #include <sys/endian.h>
29 #include <sys/kernel.h>
30 #include <sys/malloc.h>
31 #include <sys/mbuf.h>
32 #include <sys/module.h>
33 #include <sys/rman.h>
34 #include <sys/socket.h>
35 #include <sys/sockio.h>
36 #include <sys/sysctl.h>
37 #include <sys/serialize.h>
38
39 #include <net/bpf.h>
40 #include <net/if.h>
41 #include <net/if_arp.h>
42 #include <net/ethernet.h>
43 #include <net/if_dl.h>
44 #include <net/if_media.h>
45 #include <net/ifq_var.h>
46
47 #include <netproto/802_11/ieee80211_var.h>
48 #include <netproto/802_11/ieee80211_radiotap.h>
49
50 #include <dev/netif/ral/if_ralrate.h>
51 #include <dev/netif/ral/rt2560reg.h>
52 #include <dev/netif/ral/rt2560var.h>
53
54 #ifdef RAL_DEBUG
55 #define DPRINTF(x)      do { if (ral_debug > 0) printf x; } while (0)
56 #define DPRINTFN(n, x)  do { if (ral_debug >= (n)) printf x; } while (0)
57 extern int ral_debug;
58 #else
59 #define DPRINTF(x)
60 #define DPRINTFN(n, x)
61 #endif
62
63 static void             rt2560_dma_map_addr(void *, bus_dma_segment_t *, int,
64                             int);
65 static void             rt2560_dma_map_mbuf(void *, bus_dma_segment_t *, int,
66                                             bus_size_t, int);
67 static int              rt2560_alloc_tx_ring(struct rt2560_softc *,
68                             struct rt2560_tx_ring *, int);
69 static void             rt2560_reset_tx_ring(struct rt2560_softc *,
70                             struct rt2560_tx_ring *);
71 static void             rt2560_free_tx_ring(struct rt2560_softc *,
72                             struct rt2560_tx_ring *);
73 static int              rt2560_alloc_rx_ring(struct rt2560_softc *,
74                             struct rt2560_rx_ring *, int);
75 static void             rt2560_reset_rx_ring(struct rt2560_softc *,
76                             struct rt2560_rx_ring *);
77 static void             rt2560_free_rx_ring(struct rt2560_softc *,
78                             struct rt2560_rx_ring *);
79 static struct           ieee80211_node *rt2560_node_alloc(
80                             struct ieee80211_node_table *);
81 static int              rt2560_media_change(struct ifnet *);
82 static void             rt2560_next_scan(void *);
83 static void             rt2560_iter_func(void *, struct ieee80211_node *);
84 static void             rt2560_update_rssadapt(void *);
85 static int              rt2560_newstate(struct ieee80211com *,
86                             enum ieee80211_state, int);
87 static uint16_t         rt2560_eeprom_read(struct rt2560_softc *, uint8_t);
88 static void             rt2560_encryption_intr(struct rt2560_softc *);
89 static void             rt2560_tx_intr(struct rt2560_softc *);
90 static void             rt2560_prio_intr(struct rt2560_softc *);
91 static void             rt2560_decryption_intr(struct rt2560_softc *);
92 static void             rt2560_rx_intr(struct rt2560_softc *);
93 static void             rt2560_beacon_expire(struct rt2560_softc *);
94 static void             rt2560_wakeup_expire(struct rt2560_softc *);
95 static uint8_t          rt2560_rxrate(struct rt2560_rx_desc *);
96 static int              rt2560_ack_rate(struct ieee80211com *, int);
97 static uint16_t         rt2560_txtime(int, int, uint32_t);
98 static uint8_t          rt2560_plcp_signal(int);
99 static void             rt2560_setup_tx_desc(struct rt2560_softc *,
100                             struct rt2560_tx_desc *, uint32_t, int, int, int,
101                             bus_addr_t);
102 static int              rt2560_tx_bcn(struct rt2560_softc *, struct mbuf *,
103                             struct ieee80211_node *);
104 static int              rt2560_tx_mgt(struct rt2560_softc *, struct mbuf *,
105                             struct ieee80211_node *);
106 static struct           mbuf *rt2560_get_rts(struct rt2560_softc *,
107                             struct ieee80211_frame *, uint16_t);
108 static int              rt2560_tx_data(struct rt2560_softc *, struct mbuf *,
109                             struct ieee80211_node *);
110 static void             rt2560_start(struct ifnet *);
111 static void             rt2560_watchdog(struct ifnet *);
112 static int              rt2560_reset(struct ifnet *);
113 static int              rt2560_ioctl(struct ifnet *, u_long, caddr_t,
114                                      struct ucred *);
115 static void             rt2560_bbp_write(struct rt2560_softc *, uint8_t,
116                             uint8_t);
117 static uint8_t          rt2560_bbp_read(struct rt2560_softc *, uint8_t);
118 static void             rt2560_rf_write(struct rt2560_softc *, uint8_t,
119                             uint32_t);
120 static void             rt2560_set_chan(struct rt2560_softc *,
121                             struct ieee80211_channel *);
122 #if 0
123 static void             rt2560_disable_rf_tune(struct rt2560_softc *);
124 #endif
125 static void             rt2560_enable_tsf_sync(struct rt2560_softc *);
126 static void             rt2560_update_plcp(struct rt2560_softc *);
127 static void             rt2560_update_slot(struct ifnet *);
128 static void             rt2560_set_basicrates(struct rt2560_softc *);
129 static void             rt2560_update_led(struct rt2560_softc *, int, int);
130 static void             rt2560_set_bssid(struct rt2560_softc *, uint8_t *);
131 static void             rt2560_set_macaddr(struct rt2560_softc *, uint8_t *);
132 static void             rt2560_get_macaddr(struct rt2560_softc *, uint8_t *);
133 static void             rt2560_update_promisc(struct rt2560_softc *);
134 static const char       *rt2560_get_rf(int);
135 static void             rt2560_read_eeprom(struct rt2560_softc *);
136 static int              rt2560_bbp_init(struct rt2560_softc *);
137 static void             rt2560_set_txantenna(struct rt2560_softc *, int);
138 static void             rt2560_set_rxantenna(struct rt2560_softc *, int);
139 static void             rt2560_init(void *);
140 static void             rt2560_stop(void *);
141 static void             rt2560_intr(void *);
142
143 /*
144  * Supported rates for 802.11a/b/g modes (in 500Kbps unit).
145  */
146 static const struct ieee80211_rateset rt2560_rateset_11a =
147         { 8, { 12, 18, 24, 36, 48, 72, 96, 108 } };
148
149 static const struct ieee80211_rateset rt2560_rateset_11b =
150         { 4, { 2, 4, 11, 22 } };
151
152 static const struct ieee80211_rateset rt2560_rateset_11g =
153         { 12, { 2, 4, 11, 22, 12, 18, 24, 36, 48, 72, 96, 108 } };
154
155 static const struct {
156         uint32_t        reg;
157         uint32_t        val;
158 } rt2560_def_mac[] = {
159         RT2560_DEF_MAC
160 };
161
162 static const struct {
163         uint8_t reg;
164         uint8_t val;
165 } rt2560_def_bbp[] = {
166         RT2560_DEF_BBP
167 };
168
169 static const uint32_t rt2560_rf2522_r2[]    = RT2560_RF2522_R2;
170 static const uint32_t rt2560_rf2523_r2[]    = RT2560_RF2523_R2;
171 static const uint32_t rt2560_rf2524_r2[]    = RT2560_RF2524_R2;
172 static const uint32_t rt2560_rf2525_r2[]    = RT2560_RF2525_R2;
173 static const uint32_t rt2560_rf2525_hi_r2[] = RT2560_RF2525_HI_R2;
174 static const uint32_t rt2560_rf2525e_r2[]   = RT2560_RF2525E_R2;
175 static const uint32_t rt2560_rf2526_r2[]    = RT2560_RF2526_R2;
176 static const uint32_t rt2560_rf2526_hi_r2[] = RT2560_RF2526_HI_R2;
177
178 static const struct {
179         uint8_t         chan;
180         uint32_t        r1, r2, r4;
181 } rt2560_rf5222[] = {
182         RT2560_RF5222
183 };
184
185 int
186 rt2560_attach(device_t dev, int id)
187 {
188         struct rt2560_softc *sc = device_get_softc(dev);
189         struct ieee80211com *ic = &sc->sc_ic;
190         struct ifnet *ifp = &ic->ic_if;
191         int error, i;
192
193         callout_init(&sc->scan_ch);
194         callout_init(&sc->rssadapt_ch);
195
196         sc->sc_irq_rid = 0;
197         sc->sc_irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &sc->sc_irq_rid,
198                                             RF_ACTIVE | RF_SHAREABLE);
199         if (sc->sc_irq == NULL) {
200                 device_printf(dev, "could not allocate interrupt resource\n");
201                 return ENXIO;
202         }
203
204         /* retrieve RT2560 rev. no */
205         sc->asic_rev = RAL_READ(sc, RT2560_CSR0);
206
207         /* retrieve MAC address */
208         rt2560_get_macaddr(sc, ic->ic_myaddr);
209
210         /* retrieve RF rev. no and various other things from EEPROM */
211         rt2560_read_eeprom(sc);
212
213         device_printf(dev, "MAC/BBP RT2560 (rev 0x%02x), RF %s\n",
214             sc->asic_rev, rt2560_get_rf(sc->rf_rev));
215
216         /*
217          * Allocate Tx and Rx rings.
218          */
219         error = rt2560_alloc_tx_ring(sc, &sc->txq, RT2560_TX_RING_COUNT);
220         if (error != 0) {
221                 device_printf(sc->sc_dev, "could not allocate Tx ring\n");
222                 goto fail;
223         }
224
225         error = rt2560_alloc_tx_ring(sc, &sc->atimq, RT2560_ATIM_RING_COUNT);
226         if (error != 0) {
227                 device_printf(sc->sc_dev, "could not allocate ATIM ring\n");
228                 goto fail;
229         }
230
231         error = rt2560_alloc_tx_ring(sc, &sc->prioq, RT2560_PRIO_RING_COUNT);
232         if (error != 0) {
233                 device_printf(sc->sc_dev, "could not allocate Prio ring\n");
234                 goto fail;
235         }
236
237         error = rt2560_alloc_tx_ring(sc, &sc->bcnq, RT2560_BEACON_RING_COUNT);
238         if (error != 0) {
239                 device_printf(sc->sc_dev, "could not allocate Beacon ring\n");
240                 goto fail;
241         }
242
243         error = rt2560_alloc_rx_ring(sc, &sc->rxq, RT2560_RX_RING_COUNT);
244         if (error != 0) {
245                 device_printf(sc->sc_dev, "could not allocate Rx ring\n");
246                 goto fail;
247         }
248
249         sysctl_ctx_init(&sc->sysctl_ctx);
250         sc->sysctl_tree = SYSCTL_ADD_NODE(&sc->sysctl_ctx,
251                                           SYSCTL_STATIC_CHILDREN(_hw),
252                                           OID_AUTO,
253                                           device_get_nameunit(dev),
254                                           CTLFLAG_RD, 0, "");
255         if (sc->sysctl_tree == NULL) {
256                 device_printf(dev, "could not add sysctl node\n");
257                 error = ENXIO;
258                 goto fail;
259         }
260
261         ifp->if_softc = sc;
262         if_initname(ifp, device_get_name(dev), device_get_unit(dev));
263         ifp->if_flags = IFF_BROADCAST | IFF_SIMPLEX | IFF_MULTICAST;
264         ifp->if_init = rt2560_init;
265         ifp->if_ioctl = rt2560_ioctl;
266         ifp->if_start = rt2560_start;
267         ifp->if_watchdog = rt2560_watchdog;
268         ifq_set_maxlen(&ifp->if_snd, IFQ_MAXLEN);
269         ifq_set_ready(&ifp->if_snd);
270
271         ic->ic_phytype = IEEE80211_T_OFDM; /* not only, but not used */
272         ic->ic_opmode = IEEE80211_M_STA; /* default to BSS mode */
273         ic->ic_state = IEEE80211_S_INIT;
274
275         /* set device capabilities */
276         ic->ic_caps =
277             IEEE80211_C_IBSS |          /* IBSS mode supported */
278             IEEE80211_C_MONITOR |       /* monitor mode supported */
279             IEEE80211_C_HOSTAP |        /* HostAp mode supported */
280             IEEE80211_C_TXPMGT |        /* tx power management */
281             IEEE80211_C_SHPREAMBLE |    /* short preamble supported */
282             IEEE80211_C_SHSLOT |        /* short slot time supported */
283             IEEE80211_C_WEP |           /* WEP */
284             IEEE80211_C_WPA;            /* 802.11i */
285
286         if (sc->rf_rev == RT2560_RF_5222) {
287                 /* set supported .11a rates */
288                 ic->ic_sup_rates[IEEE80211_MODE_11A] = rt2560_rateset_11a;
289
290                 /* set supported .11a channels */
291                 for (i = 36; i <= 64; i += 4) {
292                         ic->ic_channels[i].ic_freq =
293                             ieee80211_ieee2mhz(i, IEEE80211_CHAN_5GHZ);
294                         ic->ic_channels[i].ic_flags = IEEE80211_CHAN_A;
295                 }
296                 for (i = 100; i <= 140; i += 4) {
297                         ic->ic_channels[i].ic_freq =
298                             ieee80211_ieee2mhz(i, IEEE80211_CHAN_5GHZ);
299                         ic->ic_channels[i].ic_flags = IEEE80211_CHAN_A;
300                 }
301                 for (i = 149; i <= 161; i += 4) {
302                         ic->ic_channels[i].ic_freq =
303                             ieee80211_ieee2mhz(i, IEEE80211_CHAN_5GHZ);
304                         ic->ic_channels[i].ic_flags = IEEE80211_CHAN_A;
305                 }
306         }
307
308         /* set supported .11b and .11g rates */
309         ic->ic_sup_rates[IEEE80211_MODE_11B] = rt2560_rateset_11b;
310         ic->ic_sup_rates[IEEE80211_MODE_11G] = rt2560_rateset_11g;
311
312         /* set supported .11b and .11g channels (1 through 14) */
313         for (i = 1; i <= 14; i++) {
314                 ic->ic_channels[i].ic_freq =
315                     ieee80211_ieee2mhz(i, IEEE80211_CHAN_2GHZ);
316                 ic->ic_channels[i].ic_flags =
317                     IEEE80211_CHAN_CCK | IEEE80211_CHAN_OFDM |
318                     IEEE80211_CHAN_DYN | IEEE80211_CHAN_2GHZ;
319         }
320
321         ieee80211_ifattach(ic);
322         ic->ic_node_alloc = rt2560_node_alloc;
323         ic->ic_updateslot = rt2560_update_slot;
324         ic->ic_reset = rt2560_reset;
325         /* enable s/w bmiss handling in sta mode */
326         ic->ic_flags_ext |= IEEE80211_FEXT_SWBMISS;
327
328         /* override state transition machine */
329         sc->sc_newstate = ic->ic_newstate;
330         ic->ic_newstate = rt2560_newstate;
331         ieee80211_media_init(ic, rt2560_media_change, ieee80211_media_status);
332
333         bpfattach_dlt(ifp, DLT_IEEE802_11_RADIO,
334             sizeof (struct ieee80211_frame) + 64, &sc->sc_drvbpf);
335
336         sc->sc_rxtap_len = sizeof sc->sc_rxtapu;
337         sc->sc_rxtap.wr_ihdr.it_len = htole16(sc->sc_rxtap_len);
338         sc->sc_rxtap.wr_ihdr.it_present = htole32(RT2560_RX_RADIOTAP_PRESENT);
339
340         sc->sc_txtap_len = sizeof sc->sc_txtapu;
341         sc->sc_txtap.wt_ihdr.it_len = htole16(sc->sc_txtap_len);
342         sc->sc_txtap.wt_ihdr.it_present = htole32(RT2560_TX_RADIOTAP_PRESENT);
343
344         /*
345          * Add a few sysctl knobs.
346          */
347         sc->dwelltime = 200;
348
349         SYSCTL_ADD_INT(&sc->sysctl_ctx,
350             SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO,
351             "txantenna", CTLFLAG_RW, &sc->tx_ant, 0, "tx antenna (0=auto)");
352
353         SYSCTL_ADD_INT(&sc->sysctl_ctx,
354             SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO,
355             "rxantenna", CTLFLAG_RW, &sc->rx_ant, 0, "rx antenna (0=auto)");
356
357         SYSCTL_ADD_INT(&sc->sysctl_ctx,
358             SYSCTL_CHILDREN(sc->sysctl_tree), OID_AUTO, "dwell",
359             CTLFLAG_RW, &sc->dwelltime, 0,
360             "channel dwell time (ms) for AP/station scanning");
361
362         error = bus_setup_intr(dev, sc->sc_irq, INTR_MPSAFE, rt2560_intr,
363                                sc, &sc->sc_ih, ifp->if_serializer);
364         if (error != 0) {
365                 device_printf(dev, "could not set up interrupt\n");
366                 bpfdetach(ifp);
367                 ieee80211_ifdetach(ic);
368                 goto fail;
369         }
370
371         if (bootverbose)
372                 ieee80211_announce(ic);
373         return 0;
374 fail:
375         rt2560_detach(sc);
376         return error;
377 }
378
379 int
380 rt2560_detach(void *xsc)
381 {
382         struct rt2560_softc *sc = xsc;
383         struct ieee80211com *ic = &sc->sc_ic;
384         struct ifnet *ifp = ic->ic_ifp;
385
386         if (device_is_attached(sc->sc_dev)) {
387                 lwkt_serialize_enter(ifp->if_serializer);
388
389                 callout_stop(&sc->scan_ch);
390                 callout_stop(&sc->rssadapt_ch);
391
392                 rt2560_stop(sc);
393                 bus_teardown_intr(sc->sc_dev, sc->sc_irq, sc->sc_ih);
394
395                 lwkt_serialize_exit(ifp->if_serializer);
396
397                 bpfdetach(ifp);
398                 ieee80211_ifdetach(ic);
399         }
400
401         rt2560_free_tx_ring(sc, &sc->txq);
402         rt2560_free_tx_ring(sc, &sc->atimq);
403         rt2560_free_tx_ring(sc, &sc->prioq);
404         rt2560_free_tx_ring(sc, &sc->bcnq);
405         rt2560_free_rx_ring(sc, &sc->rxq);
406
407         if (sc->sc_irq != NULL) {
408                 bus_release_resource(sc->sc_dev, SYS_RES_IRQ, sc->sc_irq_rid,
409                                      sc->sc_irq);
410         }
411
412         if (sc->sysctl_tree != NULL)
413                 sysctl_ctx_free(&sc->sysctl_ctx);
414
415         return 0;
416 }
417
418 void
419 rt2560_shutdown(void *xsc)
420 {
421         struct rt2560_softc *sc = xsc;
422         struct ifnet *ifp = &sc->sc_ic.ic_if;
423
424         lwkt_serialize_enter(ifp->if_serializer);
425         rt2560_stop(sc);
426         lwkt_serialize_exit(ifp->if_serializer);
427 }
428
429 void
430 rt2560_suspend(void *xsc)
431 {
432         struct rt2560_softc *sc = xsc;
433         struct ifnet *ifp = &sc->sc_ic.ic_if;
434
435         lwkt_serialize_enter(ifp->if_serializer);
436         rt2560_stop(sc);
437         lwkt_serialize_exit(ifp->if_serializer);
438 }
439
440 void
441 rt2560_resume(void *xsc)
442 {
443         struct rt2560_softc *sc = xsc;
444         struct ifnet *ifp = sc->sc_ic.ic_ifp;
445
446         lwkt_serialize_enter(ifp->if_serializer);
447         if (ifp->if_flags & IFF_UP) {
448                 ifp->if_init(ifp->if_softc);
449                 if (ifp->if_flags & IFF_RUNNING)
450                         ifp->if_start(ifp);
451         }
452         lwkt_serialize_exit(ifp->if_serializer);
453 }
454
455 static void
456 rt2560_dma_map_addr(void *arg, bus_dma_segment_t *segs, int nseg, int error)
457 {
458         if (error != 0)
459                 return;
460
461         KASSERT(nseg == 1, ("too many DMA segments, %d should be 1", nseg));
462
463         *(bus_addr_t *)arg = segs[0].ds_addr;
464 }
465
466 static int
467 rt2560_alloc_tx_ring(struct rt2560_softc *sc, struct rt2560_tx_ring *ring,
468     int count)
469 {
470         int i, error;
471
472         ring->count = count;
473         ring->queued = 0;
474         ring->cur = ring->next = 0;
475         ring->cur_encrypt = ring->next_encrypt = 0;
476
477         error = bus_dma_tag_create(NULL, 4, 0, BUS_SPACE_MAXADDR_32BIT,
478             BUS_SPACE_MAXADDR, NULL, NULL, count * RT2560_TX_DESC_SIZE, 1,
479             count * RT2560_TX_DESC_SIZE, 0, &ring->desc_dmat);
480         if (error != 0) {
481                 device_printf(sc->sc_dev, "could not create desc DMA tag\n");
482                 goto fail;
483         }
484
485         error = bus_dmamem_alloc(ring->desc_dmat, (void **)&ring->desc,
486             BUS_DMA_WAITOK | BUS_DMA_ZERO, &ring->desc_map);
487         if (error != 0) {
488                 device_printf(sc->sc_dev, "could not allocate DMA memory\n");
489                 goto fail;
490         }
491
492         error = bus_dmamap_load(ring->desc_dmat, ring->desc_map, ring->desc,
493                                 count * RT2560_TX_DESC_SIZE,
494                                 rt2560_dma_map_addr, &ring->physaddr, 0);
495         if (error != 0) {
496                 device_printf(sc->sc_dev, "could not load desc DMA map\n");
497
498                 bus_dmamem_free(ring->desc_dmat, ring->desc, ring->desc_map);
499                 ring->desc = NULL;
500                 goto fail;
501         }
502
503         ring->data = kmalloc(count * sizeof (struct rt2560_tx_data), M_DEVBUF,
504             M_WAITOK | M_ZERO);
505
506         error = bus_dma_tag_create(NULL, 1, 0, BUS_SPACE_MAXADDR_32BIT,
507             BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES, RT2560_MAX_SCATTER,
508             MCLBYTES, 0, &ring->data_dmat);
509         if (error != 0) {
510                 device_printf(sc->sc_dev, "could not create data DMA tag\n");
511                 goto fail;
512         }
513
514         for (i = 0; i < count; i++) {
515                 error = bus_dmamap_create(ring->data_dmat, 0,
516                     &ring->data[i].map);
517                 if (error != 0) {
518                         device_printf(sc->sc_dev, "could not create DMA map\n");
519                         goto fail;
520                 }
521         }
522         return 0;
523
524 fail:   rt2560_free_tx_ring(sc, ring);
525         return error;
526 }
527
528 static void
529 rt2560_reset_tx_ring(struct rt2560_softc *sc, struct rt2560_tx_ring *ring)
530 {
531         struct rt2560_tx_desc *desc;
532         struct rt2560_tx_data *data;
533         int i;
534
535         for (i = 0; i < ring->count; i++) {
536                 desc = &ring->desc[i];
537                 data = &ring->data[i];
538
539                 if (data->m != NULL) {
540                         bus_dmamap_sync(ring->data_dmat, data->map,
541                             BUS_DMASYNC_POSTWRITE);
542                         bus_dmamap_unload(ring->data_dmat, data->map);
543                         m_freem(data->m);
544                         data->m = NULL;
545                 }
546
547                 if (data->ni != NULL) {
548                         ieee80211_free_node(data->ni);
549                         data->ni = NULL;
550                 }
551
552                 desc->flags = 0;
553         }
554
555         bus_dmamap_sync(ring->desc_dmat, ring->desc_map, BUS_DMASYNC_PREWRITE);
556
557         ring->queued = 0;
558         ring->cur = ring->next = 0;
559         ring->cur_encrypt = ring->next_encrypt = 0;
560 }
561
562 static void
563 rt2560_free_tx_ring(struct rt2560_softc *sc, struct rt2560_tx_ring *ring)
564 {
565         struct rt2560_tx_data *data;
566         int i;
567
568         if (ring->desc != NULL) {
569                 bus_dmamap_sync(ring->desc_dmat, ring->desc_map,
570                     BUS_DMASYNC_POSTWRITE);
571                 bus_dmamap_unload(ring->desc_dmat, ring->desc_map);
572                 bus_dmamem_free(ring->desc_dmat, ring->desc, ring->desc_map);
573                 ring->desc = NULL;
574         }
575
576         if (ring->desc_dmat != NULL) {
577                 bus_dma_tag_destroy(ring->desc_dmat);
578                 ring->desc_dmat = NULL;
579         }
580
581         if (ring->data != NULL) {
582                 for (i = 0; i < ring->count; i++) {
583                         data = &ring->data[i];
584
585                         if (data->m != NULL) {
586                                 bus_dmamap_sync(ring->data_dmat, data->map,
587                                     BUS_DMASYNC_POSTWRITE);
588                                 bus_dmamap_unload(ring->data_dmat, data->map);
589                                 m_freem(data->m);
590                                 data->m = NULL;
591                         }
592
593                         if (data->ni != NULL) {
594                                 ieee80211_free_node(data->ni);
595                                 data->ni = NULL;
596                         }
597
598                         if (data->map != NULL) {
599                                 bus_dmamap_destroy(ring->data_dmat, data->map);
600                                 data->map = NULL;
601                         }
602                 }
603
604                 kfree(ring->data, M_DEVBUF);
605                 ring->data = NULL;
606         }
607
608         if (ring->data_dmat != NULL) {
609                 bus_dma_tag_destroy(ring->data_dmat);
610                 ring->data_dmat = NULL;
611         }
612 }
613
614 static int
615 rt2560_alloc_rx_ring(struct rt2560_softc *sc, struct rt2560_rx_ring *ring,
616     int count)
617 {
618         struct rt2560_rx_desc *desc;
619         struct rt2560_rx_data *data;
620         bus_addr_t physaddr;
621         int i, error;
622
623         ring->count = count;
624         ring->cur = ring->next = 0;
625         ring->cur_decrypt = 0;
626
627         error = bus_dma_tag_create(NULL, 4, 0, BUS_SPACE_MAXADDR_32BIT,
628             BUS_SPACE_MAXADDR, NULL, NULL, count * RT2560_RX_DESC_SIZE, 1,
629             count * RT2560_RX_DESC_SIZE, 0, &ring->desc_dmat);
630         if (error != 0) {
631                 device_printf(sc->sc_dev, "could not create desc DMA tag\n");
632                 goto fail;
633         }
634
635         error = bus_dmamem_alloc(ring->desc_dmat, (void **)&ring->desc,
636             BUS_DMA_WAITOK | BUS_DMA_ZERO, &ring->desc_map);
637         if (error != 0) {
638                 device_printf(sc->sc_dev, "could not allocate DMA memory\n");
639                 goto fail;
640         }
641
642         error = bus_dmamap_load(ring->desc_dmat, ring->desc_map, ring->desc,
643                                 count * RT2560_RX_DESC_SIZE,
644                                 rt2560_dma_map_addr, &ring->physaddr, 0);
645         if (error != 0) {
646                 device_printf(sc->sc_dev, "could not load desc DMA map\n");
647
648                 bus_dmamem_free(ring->desc_dmat, ring->desc, ring->desc_map);
649                 ring->desc = NULL;
650                 goto fail;
651         }
652
653         ring->data = kmalloc(count * sizeof (struct rt2560_rx_data), M_DEVBUF,
654             M_WAITOK | M_ZERO);
655
656         /*
657          * Pre-allocate Rx buffers and populate Rx ring.
658          */
659         error = bus_dma_tag_create(NULL, 1, 0, BUS_SPACE_MAXADDR_32BIT,
660             BUS_SPACE_MAXADDR, NULL, NULL, MCLBYTES, 1, MCLBYTES, 0,
661             &ring->data_dmat);
662         if (error != 0) {
663                 device_printf(sc->sc_dev, "could not create data DMA tag\n");
664                 goto fail;
665         }
666
667         for (i = 0; i < count; i++) {
668                 desc = &sc->rxq.desc[i];
669                 data = &sc->rxq.data[i];
670
671                 error = bus_dmamap_create(ring->data_dmat, 0, &data->map);
672                 if (error != 0) {
673                         device_printf(sc->sc_dev, "could not create DMA map\n");
674                         goto fail;
675                 }
676
677                 data->m = m_getcl(MB_WAIT, MT_DATA, M_PKTHDR);
678                 if (data->m == NULL) {
679                         device_printf(sc->sc_dev,
680                             "could not allocate rx mbuf\n");
681                         error = ENOMEM;
682                         goto fail;
683                 }
684
685                 error = bus_dmamap_load(ring->data_dmat, data->map,
686                     mtod(data->m, void *), MCLBYTES, rt2560_dma_map_addr,
687                     &physaddr, 0);
688                 if (error != 0) {
689                         device_printf(sc->sc_dev,
690                             "could not load rx buf DMA map");
691
692                         m_freem(data->m);
693                         data->m = NULL;
694                         goto fail;
695                 }
696
697                 desc->flags = htole32(RT2560_RX_BUSY);
698                 desc->physaddr = htole32(physaddr);
699         }
700
701         bus_dmamap_sync(ring->desc_dmat, ring->desc_map, BUS_DMASYNC_PREWRITE);
702
703         return 0;
704
705 fail:   rt2560_free_rx_ring(sc, ring);
706         return error;
707 }
708
709 static void
710 rt2560_reset_rx_ring(struct rt2560_softc *sc, struct rt2560_rx_ring *ring)
711 {
712         int i;
713
714         for (i = 0; i < ring->count; i++) {
715                 ring->desc[i].flags = htole32(RT2560_RX_BUSY);
716                 ring->data[i].drop = 0;
717         }
718
719         bus_dmamap_sync(ring->desc_dmat, ring->desc_map, BUS_DMASYNC_PREWRITE);
720
721         ring->cur = ring->next = 0;
722         ring->cur_decrypt = 0;
723 }
724
725 static void
726 rt2560_free_rx_ring(struct rt2560_softc *sc, struct rt2560_rx_ring *ring)
727 {
728         struct rt2560_rx_data *data;
729
730         if (ring->desc != NULL) {
731                 bus_dmamap_sync(ring->desc_dmat, ring->desc_map,
732                     BUS_DMASYNC_POSTWRITE);
733                 bus_dmamap_unload(ring->desc_dmat, ring->desc_map);
734                 bus_dmamem_free(ring->desc_dmat, ring->desc, ring->desc_map);
735                 ring->desc = NULL;
736         }
737
738         if (ring->desc_dmat != NULL) {
739                 bus_dma_tag_destroy(ring->desc_dmat);
740                 ring->desc_dmat = NULL;
741         }
742
743         if (ring->data != NULL) {
744                 int i;
745
746                 for (i = 0; i < ring->count; i++) {
747                         data = &ring->data[i];
748
749                         if (data->m != NULL) {
750                                 bus_dmamap_sync(ring->data_dmat, data->map,
751                                     BUS_DMASYNC_POSTREAD);
752                                 bus_dmamap_unload(ring->data_dmat, data->map);
753                                 m_freem(data->m);
754                                 data->m = NULL;
755                         }
756
757                         if (data->map != NULL) {
758                                 bus_dmamap_destroy(ring->data_dmat, data->map);
759                                 data->map = NULL;
760                         }
761                 }
762
763                 kfree(ring->data, M_DEVBUF);
764                 ring->data = NULL;
765         }
766
767         if (ring->data_dmat != NULL) {
768                 bus_dma_tag_destroy(ring->data_dmat);
769                 ring->data_dmat = NULL;
770         }
771 }
772
773 static struct ieee80211_node *
774 rt2560_node_alloc(struct ieee80211_node_table *nt)
775 {
776         struct rt2560_node *rn;
777
778         rn = kmalloc(sizeof(struct rt2560_node), M_80211_NODE,
779             M_NOWAIT | M_ZERO);
780
781         return (rn != NULL) ? &rn->ni : NULL;
782 }
783
784 static int
785 rt2560_media_change(struct ifnet *ifp)
786 {
787         struct rt2560_softc *sc = ifp->if_softc;
788         int error;
789
790         error = ieee80211_media_change(ifp);
791         if (error != ENETRESET)
792                 return error;
793
794         if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) == (IFF_UP | IFF_RUNNING))
795                 rt2560_init(sc);
796         return 0;
797 }
798
799 /*
800  * This function is called periodically (every 200ms) during scanning to
801  * switch from one channel to another.
802  */
803 static void
804 rt2560_next_scan(void *arg)
805 {
806         struct rt2560_softc *sc = arg;
807         struct ieee80211com *ic = &sc->sc_ic;
808         struct ifnet *ifp = ic->ic_ifp;
809
810         lwkt_serialize_enter(ifp->if_serializer);
811         if (ic->ic_state == IEEE80211_S_SCAN)
812                 ieee80211_next_scan(ic);
813         lwkt_serialize_exit(ifp->if_serializer);
814 }
815
816 /*
817  * This function is called for each node present in the node station table.
818  */
819 static void
820 rt2560_iter_func(void *arg, struct ieee80211_node *ni)
821 {
822         struct rt2560_node *rn = (struct rt2560_node *)ni;
823
824         ral_rssadapt_updatestats(&rn->rssadapt);
825 }
826
827 /*
828  * This function is called periodically (every 100ms) in RUN state to update
829  * the rate adaptation statistics.
830  */
831 static void
832 rt2560_update_rssadapt(void *arg)
833 {
834         struct rt2560_softc *sc = arg;
835         struct ieee80211com *ic = &sc->sc_ic;
836         struct ifnet *ifp = ic->ic_ifp;
837
838         lwkt_serialize_enter(ifp->if_serializer);
839
840         ieee80211_iterate_nodes(&ic->ic_sta, rt2560_iter_func, arg);
841         callout_reset(&sc->rssadapt_ch, hz / 10, rt2560_update_rssadapt, sc);
842
843         lwkt_serialize_exit(ifp->if_serializer);
844 }
845
846 static int
847 rt2560_newstate(struct ieee80211com *ic, enum ieee80211_state nstate, int arg)
848 {
849         struct rt2560_softc *sc = ic->ic_ifp->if_softc;
850         enum ieee80211_state ostate;
851         struct ieee80211_node *ni;
852         struct mbuf *m;
853         int error = 0;
854
855         ostate = ic->ic_state;
856         callout_stop(&sc->scan_ch);
857
858         switch (nstate) {
859         case IEEE80211_S_INIT:
860                 callout_stop(&sc->rssadapt_ch);
861
862                 if (ostate == IEEE80211_S_RUN) {
863                         /* abort TSF synchronization */
864                         RAL_WRITE(sc, RT2560_CSR14, 0);
865
866                         /* turn association led off */
867                         rt2560_update_led(sc, 0, 0);
868                 }
869                 break;
870
871         case IEEE80211_S_SCAN:
872                 rt2560_set_chan(sc, ic->ic_curchan);
873                 callout_reset(&sc->scan_ch, (sc->dwelltime * hz) / 1000,
874                     rt2560_next_scan, sc);
875                 break;
876
877         case IEEE80211_S_AUTH:
878                 rt2560_set_chan(sc, ic->ic_curchan);
879                 break;
880
881         case IEEE80211_S_ASSOC:
882                 rt2560_set_chan(sc, ic->ic_curchan);
883                 break;
884
885         case IEEE80211_S_RUN:
886                 rt2560_set_chan(sc, ic->ic_curchan);
887
888                 ni = ic->ic_bss;
889
890                 if (ic->ic_opmode != IEEE80211_M_MONITOR) {
891                         rt2560_update_plcp(sc);
892                         rt2560_set_basicrates(sc);
893                         rt2560_set_bssid(sc, ni->ni_bssid);
894                 }
895
896                 if (ic->ic_opmode == IEEE80211_M_HOSTAP ||
897                     ic->ic_opmode == IEEE80211_M_IBSS) {
898                         m = ieee80211_beacon_alloc(ic, ni, &sc->sc_bo);
899                         if (m == NULL) {
900                                 device_printf(sc->sc_dev,
901                                     "could not allocate beacon\n");
902                                 error = ENOBUFS;
903                                 break;
904                         }
905
906                         ieee80211_ref_node(ni);
907                         error = rt2560_tx_bcn(sc, m, ni);
908                         if (error != 0)
909                                 break;
910                 }
911
912                 /* turn assocation led on */
913                 rt2560_update_led(sc, 1, 0);
914
915                 if (ic->ic_opmode != IEEE80211_M_MONITOR) {
916                         callout_reset(&sc->rssadapt_ch, hz / 10,
917                             rt2560_update_rssadapt, sc);
918
919                         rt2560_enable_tsf_sync(sc);
920                 }
921                 break;
922         }
923
924         return (error != 0) ? error : sc->sc_newstate(ic, nstate, arg);
925 }
926
927 /*
928  * Read 16 bits at address 'addr' from the serial EEPROM (either 93C46 or
929  * 93C66).
930  */
931 static uint16_t
932 rt2560_eeprom_read(struct rt2560_softc *sc, uint8_t addr)
933 {
934         uint32_t tmp;
935         uint16_t val;
936         int n;
937
938         /* clock C once before the first command */
939         RT2560_EEPROM_CTL(sc, 0);
940
941         RT2560_EEPROM_CTL(sc, RT2560_S);
942         RT2560_EEPROM_CTL(sc, RT2560_S | RT2560_C);
943         RT2560_EEPROM_CTL(sc, RT2560_S);
944
945         /* write start bit (1) */
946         RT2560_EEPROM_CTL(sc, RT2560_S | RT2560_D);
947         RT2560_EEPROM_CTL(sc, RT2560_S | RT2560_D | RT2560_C);
948
949         /* write READ opcode (10) */
950         RT2560_EEPROM_CTL(sc, RT2560_S | RT2560_D);
951         RT2560_EEPROM_CTL(sc, RT2560_S | RT2560_D | RT2560_C);
952         RT2560_EEPROM_CTL(sc, RT2560_S);
953         RT2560_EEPROM_CTL(sc, RT2560_S | RT2560_C);
954
955         /* write address (A5-A0 or A7-A0) */
956         n = (RAL_READ(sc, RT2560_CSR21) & RT2560_93C46) ? 5 : 7;
957         for (; n >= 0; n--) {
958                 RT2560_EEPROM_CTL(sc, RT2560_S |
959                     (((addr >> n) & 1) << RT2560_SHIFT_D));
960                 RT2560_EEPROM_CTL(sc, RT2560_S |
961                     (((addr >> n) & 1) << RT2560_SHIFT_D) | RT2560_C);
962         }
963
964         RT2560_EEPROM_CTL(sc, RT2560_S);
965
966         /* read data Q15-Q0 */
967         val = 0;
968         for (n = 15; n >= 0; n--) {
969                 RT2560_EEPROM_CTL(sc, RT2560_S | RT2560_C);
970                 tmp = RAL_READ(sc, RT2560_CSR21);
971                 val |= ((tmp & RT2560_Q) >> RT2560_SHIFT_Q) << n;
972                 RT2560_EEPROM_CTL(sc, RT2560_S);
973         }
974
975         RT2560_EEPROM_CTL(sc, 0);
976
977         /* clear Chip Select and clock C */
978         RT2560_EEPROM_CTL(sc, RT2560_S);
979         RT2560_EEPROM_CTL(sc, 0);
980         RT2560_EEPROM_CTL(sc, RT2560_C);
981
982         return val;
983 }
984
985 /*
986  * Some frames were processed by the hardware cipher engine and are ready for
987  * transmission.
988  */
989 static void
990 rt2560_encryption_intr(struct rt2560_softc *sc)
991 {
992         struct rt2560_tx_desc *desc;
993         int hw;
994
995         /* retrieve last descriptor index processed by cipher engine */
996         hw = RAL_READ(sc, RT2560_SECCSR1) - sc->txq.physaddr;
997         hw /= RT2560_TX_DESC_SIZE;
998
999         bus_dmamap_sync(sc->txq.desc_dmat, sc->txq.desc_map,
1000             BUS_DMASYNC_POSTREAD);
1001
1002         for (; sc->txq.next_encrypt != hw;) {
1003                 desc = &sc->txq.desc[sc->txq.next_encrypt];
1004
1005                 if ((le32toh(desc->flags) & RT2560_TX_BUSY) ||
1006                     (le32toh(desc->flags) & RT2560_TX_CIPHER_BUSY))
1007                         break;
1008
1009                 /* for TKIP, swap eiv field to fix a bug in ASIC */
1010                 if ((le32toh(desc->flags) & RT2560_TX_CIPHER_MASK) ==
1011                     RT2560_TX_CIPHER_TKIP)
1012                         desc->eiv = bswap32(desc->eiv);
1013
1014                 /* mark the frame ready for transmission */
1015                 desc->flags |= htole32(RT2560_TX_BUSY | RT2560_TX_VALID);
1016
1017                 DPRINTFN(15, ("encryption done idx=%u\n",
1018                     sc->txq.next_encrypt));
1019
1020                 sc->txq.next_encrypt =
1021                     (sc->txq.next_encrypt + 1) % RT2560_TX_RING_COUNT;
1022         }
1023
1024         bus_dmamap_sync(sc->txq.desc_dmat, sc->txq.desc_map,
1025             BUS_DMASYNC_PREWRITE);
1026
1027         /* kick Tx */
1028         RAL_WRITE(sc, RT2560_TXCSR0, RT2560_KICK_TX);
1029 }
1030
1031 static void
1032 rt2560_tx_intr(struct rt2560_softc *sc)
1033 {
1034         struct ieee80211com *ic = &sc->sc_ic;
1035         struct ifnet *ifp = ic->ic_ifp;
1036         struct rt2560_tx_desc *desc;
1037         struct rt2560_tx_data *data;
1038         struct rt2560_node *rn;
1039
1040         bus_dmamap_sync(sc->txq.desc_dmat, sc->txq.desc_map,
1041             BUS_DMASYNC_POSTREAD);
1042
1043         for (;;) {
1044                 desc = &sc->txq.desc[sc->txq.next];
1045                 data = &sc->txq.data[sc->txq.next];
1046
1047                 if ((le32toh(desc->flags) & RT2560_TX_BUSY) ||
1048                     (le32toh(desc->flags) & RT2560_TX_CIPHER_BUSY) ||
1049                     !(le32toh(desc->flags) & RT2560_TX_VALID))
1050                         break;
1051
1052                 rn = (struct rt2560_node *)data->ni;
1053
1054                 switch (le32toh(desc->flags) & RT2560_TX_RESULT_MASK) {
1055                 case RT2560_TX_SUCCESS:
1056                         DPRINTFN(10, ("data frame sent successfully\n"));
1057                         if (data->id.id_node != NULL) {
1058                                 ral_rssadapt_raise_rate(ic, &rn->rssadapt,
1059                                     &data->id);
1060                         }
1061                         ifp->if_opackets++;
1062                         break;
1063
1064                 case RT2560_TX_SUCCESS_RETRY:
1065                         DPRINTFN(9, ("data frame sent after %u retries\n",
1066                             (le32toh(desc->flags) >> 5) & 0x7));
1067                         ifp->if_opackets++;
1068                         break;
1069
1070                 case RT2560_TX_FAIL_RETRY:
1071                         DPRINTFN(9, ("sending data frame failed (too much "
1072                             "retries)\n"));
1073                         if (data->id.id_node != NULL) {
1074                                 ral_rssadapt_lower_rate(ic, data->ni,
1075                                     &rn->rssadapt, &data->id);
1076                         }
1077                         ifp->if_oerrors++;
1078                         break;
1079
1080                 case RT2560_TX_FAIL_INVALID:
1081                 case RT2560_TX_FAIL_OTHER:
1082                 default:
1083                         device_printf(sc->sc_dev, "sending data frame failed "
1084                             "0x%08x\n", le32toh(desc->flags));
1085                         ifp->if_oerrors++;
1086                 }
1087
1088                 bus_dmamap_sync(sc->txq.data_dmat, data->map,
1089                     BUS_DMASYNC_POSTWRITE);
1090                 bus_dmamap_unload(sc->txq.data_dmat, data->map);
1091                 m_freem(data->m);
1092                 data->m = NULL;
1093                 ieee80211_free_node(data->ni);
1094                 data->ni = NULL;
1095
1096                 /* descriptor is no longer valid */
1097                 desc->flags &= ~htole32(RT2560_TX_VALID);
1098
1099                 DPRINTFN(15, ("tx done idx=%u\n", sc->txq.next));
1100
1101                 sc->txq.queued--;
1102                 sc->txq.next = (sc->txq.next + 1) % RT2560_TX_RING_COUNT;
1103         }
1104
1105         bus_dmamap_sync(sc->txq.desc_dmat, sc->txq.desc_map,
1106             BUS_DMASYNC_PREWRITE);
1107
1108         sc->sc_tx_timer = 0;
1109         ifp->if_flags &= ~IFF_OACTIVE;
1110         rt2560_start(ifp);
1111 }
1112
1113 static void
1114 rt2560_prio_intr(struct rt2560_softc *sc)
1115 {
1116         struct ieee80211com *ic = &sc->sc_ic;
1117         struct ifnet *ifp = ic->ic_ifp;
1118         struct rt2560_tx_desc *desc;
1119         struct rt2560_tx_data *data;
1120
1121         bus_dmamap_sync(sc->prioq.desc_dmat, sc->prioq.desc_map,
1122             BUS_DMASYNC_POSTREAD);
1123
1124         for (;;) {
1125                 desc = &sc->prioq.desc[sc->prioq.next];
1126                 data = &sc->prioq.data[sc->prioq.next];
1127
1128                 if ((le32toh(desc->flags) & RT2560_TX_BUSY) ||
1129                     !(le32toh(desc->flags) & RT2560_TX_VALID))
1130                         break;
1131
1132                 switch (le32toh(desc->flags) & RT2560_TX_RESULT_MASK) {
1133                 case RT2560_TX_SUCCESS:
1134                         DPRINTFN(10, ("mgt frame sent successfully\n"));
1135                         break;
1136
1137                 case RT2560_TX_SUCCESS_RETRY:
1138                         DPRINTFN(9, ("mgt frame sent after %u retries\n",
1139                             (le32toh(desc->flags) >> 5) & 0x7));
1140                         break;
1141
1142                 case RT2560_TX_FAIL_RETRY:
1143                         DPRINTFN(9, ("sending mgt frame failed (too much "
1144                             "retries)\n"));
1145                         break;
1146
1147                 case RT2560_TX_FAIL_INVALID:
1148                 case RT2560_TX_FAIL_OTHER:
1149                 default:
1150                         device_printf(sc->sc_dev, "sending mgt frame failed "
1151                             "0x%08x\n", le32toh(desc->flags));
1152                 }
1153
1154                 bus_dmamap_sync(sc->prioq.data_dmat, data->map,
1155                     BUS_DMASYNC_POSTWRITE);
1156                 bus_dmamap_unload(sc->prioq.data_dmat, data->map);
1157                 m_freem(data->m);
1158                 data->m = NULL;
1159                 ieee80211_free_node(data->ni);
1160                 data->ni = NULL;
1161
1162                 /* descriptor is no longer valid */
1163                 desc->flags &= ~htole32(RT2560_TX_VALID);
1164
1165                 DPRINTFN(15, ("prio done idx=%u\n", sc->prioq.next));
1166
1167                 sc->prioq.queued--;
1168                 sc->prioq.next = (sc->prioq.next + 1) % RT2560_PRIO_RING_COUNT;
1169         }
1170
1171         bus_dmamap_sync(sc->prioq.desc_dmat, sc->prioq.desc_map,
1172             BUS_DMASYNC_PREWRITE);
1173
1174         sc->sc_tx_timer = 0;
1175         ifp->if_flags &= ~IFF_OACTIVE;
1176         rt2560_start(ifp);
1177 }
1178
1179 /*
1180  * Some frames were processed by the hardware cipher engine and are ready for
1181  * transmission to the IEEE802.11 layer.
1182  */
1183 static void
1184 rt2560_decryption_intr(struct rt2560_softc *sc)
1185 {
1186         struct ieee80211com *ic = &sc->sc_ic;
1187         struct ifnet *ifp = ic->ic_ifp;
1188         struct rt2560_rx_desc *desc;
1189         struct rt2560_rx_data *data;
1190         bus_addr_t physaddr;
1191         struct ieee80211_frame *wh;
1192         struct ieee80211_node *ni;
1193         struct rt2560_node *rn;
1194         struct mbuf *mnew, *m;
1195         int hw, error;
1196
1197         /* retrieve last decriptor index processed by cipher engine */
1198         hw = RAL_READ(sc, RT2560_SECCSR0) - sc->rxq.physaddr;
1199         hw /= RT2560_RX_DESC_SIZE;
1200
1201         bus_dmamap_sync(sc->rxq.desc_dmat, sc->rxq.desc_map,
1202             BUS_DMASYNC_POSTREAD);
1203
1204         for (; sc->rxq.cur_decrypt != hw;) {
1205                 desc = &sc->rxq.desc[sc->rxq.cur_decrypt];
1206                 data = &sc->rxq.data[sc->rxq.cur_decrypt];
1207
1208                 if ((le32toh(desc->flags) & RT2560_RX_BUSY) ||
1209                     (le32toh(desc->flags) & RT2560_RX_CIPHER_BUSY))
1210                         break;
1211
1212                 if (data->drop) {
1213                         ifp->if_ierrors++;
1214                         goto skip;
1215                 }
1216
1217                 if ((le32toh(desc->flags) & RT2560_RX_CIPHER_MASK) != 0 &&
1218                     (le32toh(desc->flags) & RT2560_RX_ICV_ERROR)) {
1219                         ifp->if_ierrors++;
1220                         goto skip;
1221                 }
1222
1223                 /*
1224                  * Try to allocate a new mbuf for this ring element and load it
1225                  * before processing the current mbuf. If the ring element
1226                  * cannot be loaded, drop the received packet and reuse the old
1227                  * mbuf. In the unlikely case that the old mbuf can't be
1228                  * reloaded either, explicitly panic.
1229                  */
1230                 mnew = m_getcl(MB_DONTWAIT, MT_DATA, M_PKTHDR);
1231                 if (mnew == NULL) {
1232                         ifp->if_ierrors++;
1233                         goto skip;
1234                 }
1235
1236                 bus_dmamap_sync(sc->rxq.data_dmat, data->map,
1237                     BUS_DMASYNC_POSTREAD);
1238                 bus_dmamap_unload(sc->rxq.data_dmat, data->map);
1239
1240                 error = bus_dmamap_load(sc->rxq.data_dmat, data->map,
1241                     mtod(mnew, void *), MCLBYTES, rt2560_dma_map_addr,
1242                     &physaddr, 0);
1243                 if (error != 0) {
1244                         m_freem(mnew);
1245
1246                         /* try to reload the old mbuf */
1247                         error = bus_dmamap_load(sc->rxq.data_dmat, data->map,
1248                             mtod(data->m, void *), MCLBYTES,
1249                             rt2560_dma_map_addr, &physaddr, 0);
1250                         if (error != 0) {
1251                                 /* very unlikely that it will fail... */
1252                                 panic("%s: could not load old rx mbuf",
1253                                     device_get_name(sc->sc_dev));
1254                         }
1255                         ifp->if_ierrors++;
1256                         goto skip;
1257                 }
1258
1259                 /*
1260                  * New mbuf successfully loaded, update Rx ring and continue
1261                  * processing.
1262                  */
1263                 m = data->m;
1264                 data->m = mnew;
1265                 desc->physaddr = htole32(physaddr);
1266
1267                 /* finalize mbuf */
1268                 m->m_pkthdr.rcvif = ifp;
1269                 m->m_pkthdr.len = m->m_len =
1270                     (le32toh(desc->flags) >> 16) & 0xfff;
1271
1272                 if (sc->sc_drvbpf != NULL) {
1273                         struct rt2560_rx_radiotap_header *tap = &sc->sc_rxtap;
1274                         uint32_t tsf_lo, tsf_hi;
1275
1276                         /* get timestamp (low and high 32 bits) */
1277                         tsf_hi = RAL_READ(sc, RT2560_CSR17);
1278                         tsf_lo = RAL_READ(sc, RT2560_CSR16);
1279
1280                         tap->wr_tsf =
1281                             htole64(((uint64_t)tsf_hi << 32) | tsf_lo);
1282                         tap->wr_flags = 0;
1283                         tap->wr_rate = rt2560_rxrate(desc);
1284                         tap->wr_chan_freq = htole16(ic->ic_curchan->ic_freq);
1285                         tap->wr_chan_flags = htole16(ic->ic_curchan->ic_flags);
1286                         tap->wr_antenna = sc->rx_ant;
1287                         tap->wr_antsignal = desc->rssi;
1288
1289                         bpf_ptap(sc->sc_drvbpf, m, tap, sc->sc_rxtap_len);
1290                 }
1291
1292                 wh = mtod(m, struct ieee80211_frame *);
1293                 ni = ieee80211_find_rxnode(ic,
1294                     (struct ieee80211_frame_min *)wh);
1295
1296                 /* send the frame to the 802.11 layer */
1297                 ieee80211_input(ic, m, ni, desc->rssi, 0);
1298
1299                 /* give rssi to the rate adatation algorithm */
1300                 rn = (struct rt2560_node *)ni;
1301                 ral_rssadapt_input(ic, ni, &rn->rssadapt, desc->rssi);
1302
1303                 /* node is no longer needed */
1304                 ieee80211_free_node(ni);
1305
1306 skip:           desc->flags = htole32(RT2560_RX_BUSY);
1307
1308                 DPRINTFN(15, ("decryption done idx=%u\n", sc->rxq.cur_decrypt));
1309
1310                 sc->rxq.cur_decrypt =
1311                     (sc->rxq.cur_decrypt + 1) % RT2560_RX_RING_COUNT;
1312         }
1313
1314         bus_dmamap_sync(sc->rxq.desc_dmat, sc->rxq.desc_map,
1315             BUS_DMASYNC_PREWRITE);
1316 }
1317
1318 /*
1319  * Some frames were received. Pass them to the hardware cipher engine before
1320  * sending them to the 802.11 layer.
1321  */
1322 static void
1323 rt2560_rx_intr(struct rt2560_softc *sc)
1324 {
1325         struct rt2560_rx_desc *desc;
1326         struct rt2560_rx_data *data;
1327
1328         bus_dmamap_sync(sc->rxq.desc_dmat, sc->rxq.desc_map,
1329             BUS_DMASYNC_POSTREAD);
1330
1331         for (;;) {
1332                 desc = &sc->rxq.desc[sc->rxq.cur];
1333                 data = &sc->rxq.data[sc->rxq.cur];
1334
1335                 if ((le32toh(desc->flags) & RT2560_RX_BUSY) ||
1336                     (le32toh(desc->flags) & RT2560_RX_CIPHER_BUSY))
1337                         break;
1338
1339                 data->drop = 0;
1340
1341                 if ((le32toh(desc->flags) & RT2560_RX_PHY_ERROR) ||
1342                     (le32toh(desc->flags) & RT2560_RX_CRC_ERROR)) {
1343                         /*
1344                          * This should not happen since we did not request
1345                          * to receive those frames when we filled RXCSR0.
1346                          */
1347                         DPRINTFN(5, ("PHY or CRC error flags 0x%08x\n",
1348                             le32toh(desc->flags)));
1349                         data->drop = 1;
1350                 }
1351
1352                 if (((le32toh(desc->flags) >> 16) & 0xfff) > MCLBYTES) {
1353                         DPRINTFN(5, ("bad length\n"));
1354                         data->drop = 1;
1355                 }
1356
1357                 /* mark the frame for decryption */
1358                 desc->flags |= htole32(RT2560_RX_CIPHER_BUSY);
1359
1360                 DPRINTFN(15, ("rx done idx=%u\n", sc->rxq.cur));
1361
1362                 sc->rxq.cur = (sc->rxq.cur + 1) % RT2560_RX_RING_COUNT;
1363         }
1364
1365         bus_dmamap_sync(sc->rxq.desc_dmat, sc->rxq.desc_map,
1366             BUS_DMASYNC_PREWRITE);
1367
1368         /* kick decrypt */
1369         RAL_WRITE(sc, RT2560_SECCSR0, RT2560_KICK_DECRYPT);
1370 }
1371
1372 /*
1373  * This function is called periodically in IBSS mode when a new beacon must be
1374  * sent out.
1375  */
1376 static void
1377 rt2560_beacon_expire(struct rt2560_softc *sc)
1378 {
1379         struct ieee80211com *ic = &sc->sc_ic;
1380         struct rt2560_tx_data *data;
1381
1382         if (ic->ic_opmode != IEEE80211_M_IBSS &&
1383             ic->ic_opmode != IEEE80211_M_HOSTAP)
1384                 return;
1385
1386         data = &sc->bcnq.data[sc->bcnq.next];
1387
1388         bus_dmamap_sync(sc->bcnq.data_dmat, data->map, BUS_DMASYNC_POSTWRITE);
1389         bus_dmamap_unload(sc->bcnq.data_dmat, data->map);
1390
1391         ieee80211_beacon_update(ic, data->ni, &sc->sc_bo, data->m, 1);
1392
1393         if (ic->ic_rawbpf != NULL)
1394                 bpf_mtap(ic->ic_rawbpf, data->m);
1395
1396         rt2560_tx_bcn(sc, data->m, data->ni);
1397
1398         DPRINTFN(15, ("beacon expired\n"));
1399
1400         sc->bcnq.next = (sc->bcnq.next + 1) % RT2560_BEACON_RING_COUNT;
1401 }
1402
1403 /* ARGSUSED */
1404 static void
1405 rt2560_wakeup_expire(struct rt2560_softc *sc)
1406 {
1407         DPRINTFN(2, ("wakeup expired\n"));
1408 }
1409
1410 static void
1411 rt2560_intr(void *arg)
1412 {
1413         struct rt2560_softc *sc = arg;
1414         struct ifnet *ifp = &sc->sc_ic.ic_if;
1415         uint32_t r;
1416
1417         /* disable interrupts */
1418         RAL_WRITE(sc, RT2560_CSR8, 0xffffffff);
1419
1420         /* don't re-enable interrupts if we're shutting down */
1421         if (!(ifp->if_flags & IFF_RUNNING))
1422                 return;
1423
1424         r = RAL_READ(sc, RT2560_CSR7);
1425         RAL_WRITE(sc, RT2560_CSR7, r);
1426
1427         if (r & RT2560_BEACON_EXPIRE)
1428                 rt2560_beacon_expire(sc);
1429
1430         if (r & RT2560_WAKEUP_EXPIRE)
1431                 rt2560_wakeup_expire(sc);
1432
1433         if (r & RT2560_PRIO_DONE)
1434                 rt2560_prio_intr(sc);
1435
1436         if (r & (RT2560_TX_DONE | RT2560_ENCRYPTION_DONE)) {
1437                 int i;
1438
1439                 for (i = 0; i < 2; ++i) {
1440                         rt2560_tx_intr(sc);
1441                         rt2560_encryption_intr(sc);
1442                 }
1443         }
1444
1445         if (r & (RT2560_DECRYPTION_DONE | RT2560_RX_DONE)) {
1446                 int i;
1447
1448                 for (i = 0; i < 2; ++i) {
1449                         rt2560_decryption_intr(sc);
1450                         rt2560_rx_intr(sc);
1451                 }
1452         }
1453
1454         /* re-enable interrupts */
1455         RAL_WRITE(sc, RT2560_CSR8, RT2560_INTR_MASK);
1456 }
1457
1458 /* quickly determine if a given rate is CCK or OFDM */
1459 #define RAL_RATE_IS_OFDM(rate) ((rate) >= 12 && (rate) != 22)
1460
1461 #define RAL_ACK_SIZE    14      /* 10 + 4(FCS) */
1462 #define RAL_CTS_SIZE    14      /* 10 + 4(FCS) */
1463
1464 #define RAL_SIFS                10      /* us */
1465
1466 #define RT2560_TXRX_TURNAROUND  10      /* us */
1467
1468 /*
1469  * This function is only used by the Rx radiotap code.
1470  */
1471 static uint8_t
1472 rt2560_rxrate(struct rt2560_rx_desc *desc)
1473 {
1474         if (le32toh(desc->flags) & RT2560_RX_OFDM) {
1475                 /* reverse function of rt2560_plcp_signal */
1476                 switch (desc->rate) {
1477                 case 0xb:       return 12;
1478                 case 0xf:       return 18;
1479                 case 0xa:       return 24;
1480                 case 0xe:       return 36;
1481                 case 0x9:       return 48;
1482                 case 0xd:       return 72;
1483                 case 0x8:       return 96;
1484                 case 0xc:       return 108;
1485                 }
1486         } else {
1487                 if (desc->rate == 10)
1488                         return 2;
1489                 if (desc->rate == 20)
1490                         return 4;
1491                 if (desc->rate == 55)
1492                         return 11;
1493                 if (desc->rate == 110)
1494                         return 22;
1495         }
1496         return 2;       /* should not get there */
1497 }
1498
1499 /*
1500  * Return the expected ack rate for a frame transmitted at rate `rate'.
1501  * XXX: this should depend on the destination node basic rate set.
1502  */
1503 static int
1504 rt2560_ack_rate(struct ieee80211com *ic, int rate)
1505 {
1506         switch (rate) {
1507         /* CCK rates */
1508         case 2:
1509                 return 2;
1510         case 4:
1511         case 11:
1512         case 22:
1513                 return (ic->ic_curmode == IEEE80211_MODE_11B) ? 4 : rate;
1514
1515         /* OFDM rates */
1516         case 12:
1517         case 18:
1518                 return 12;
1519         case 24:
1520         case 36:
1521                 return 24;
1522         case 48:
1523         case 72:
1524         case 96:
1525         case 108:
1526                 return 48;
1527         }
1528
1529         /* default to 1Mbps */
1530         return 2;
1531 }
1532
1533 /*
1534  * Compute the duration (in us) needed to transmit `len' bytes at rate `rate'.
1535  * The function automatically determines the operating mode depending on the
1536  * given rate. `flags' indicates whether short preamble is in use or not.
1537  */
1538 static uint16_t
1539 rt2560_txtime(int len, int rate, uint32_t flags)
1540 {
1541         uint16_t txtime;
1542
1543         if (RAL_RATE_IS_OFDM(rate)) {
1544                 /* IEEE Std 802.11a-1999, pp. 37 */
1545                 txtime = (8 + 4 * len + 3 + rate - 1) / rate;
1546                 txtime = 16 + 4 + 4 * txtime + 6;
1547         } else {
1548                 /* IEEE Std 802.11b-1999, pp. 28 */
1549                 txtime = (16 * len + rate - 1) / rate;
1550                 if (rate != 2 && (flags & IEEE80211_F_SHPREAMBLE))
1551                         txtime +=  72 + 24;
1552                 else
1553                         txtime += 144 + 48;
1554         }
1555
1556         return txtime;
1557 }
1558
1559 static uint8_t
1560 rt2560_plcp_signal(int rate)
1561 {
1562         switch (rate) {
1563         /* CCK rates (returned values are device-dependent) */
1564         case 2:         return 0x0;
1565         case 4:         return 0x1;
1566         case 11:        return 0x2;
1567         case 22:        return 0x3;
1568
1569         /* OFDM rates (cf IEEE Std 802.11a-1999, pp. 14 Table 80) */
1570         case 12:        return 0xb;
1571         case 18:        return 0xf;
1572         case 24:        return 0xa;
1573         case 36:        return 0xe;
1574         case 48:        return 0x9;
1575         case 72:        return 0xd;
1576         case 96:        return 0x8;
1577         case 108:       return 0xc;
1578
1579         /* unsupported rates (should not get there) */
1580         default:        return 0xff;
1581         }
1582 }
1583
1584 static void
1585 rt2560_setup_tx_desc(struct rt2560_softc *sc, struct rt2560_tx_desc *desc,
1586     uint32_t flags, int len, int rate, int encrypt, bus_addr_t physaddr)
1587 {
1588         struct ieee80211com *ic = &sc->sc_ic;
1589         uint16_t plcp_length;
1590         int remainder;
1591
1592         desc->flags = htole32(flags);
1593         desc->flags |= htole32(len << 16);
1594         desc->flags |= encrypt ? htole32(RT2560_TX_CIPHER_BUSY) :
1595             htole32(RT2560_TX_BUSY | RT2560_TX_VALID);
1596
1597         desc->physaddr = htole32(physaddr);
1598         desc->wme = htole16(
1599             RT2560_AIFSN(2) |
1600             RT2560_LOGCWMIN(3) |
1601             RT2560_LOGCWMAX(8));
1602
1603         /* setup PLCP fields */
1604         desc->plcp_signal  = rt2560_plcp_signal(rate);
1605         desc->plcp_service = 4;
1606
1607         len += IEEE80211_CRC_LEN;
1608         if (RAL_RATE_IS_OFDM(rate)) {
1609                 desc->flags |= htole32(RT2560_TX_OFDM);
1610
1611                 plcp_length = len & 0xfff;
1612                 desc->plcp_length_hi = plcp_length >> 6;
1613                 desc->plcp_length_lo = plcp_length & 0x3f;
1614         } else {
1615                 plcp_length = (16 * len + rate - 1) / rate;
1616                 if (rate == 22) {
1617                         remainder = (16 * len) % 22;
1618                         if (remainder != 0 && remainder < 7)
1619                                 desc->plcp_service |= RT2560_PLCP_LENGEXT;
1620                 }
1621                 desc->plcp_length_hi = plcp_length >> 8;
1622                 desc->plcp_length_lo = plcp_length & 0xff;
1623
1624                 if (rate != 2 && (ic->ic_flags & IEEE80211_F_SHPREAMBLE))
1625                         desc->plcp_signal |= 0x08;
1626         }
1627 }
1628
1629 static int
1630 rt2560_tx_bcn(struct rt2560_softc *sc, struct mbuf *m0,
1631     struct ieee80211_node *ni)
1632 {
1633         struct ieee80211com *ic = &sc->sc_ic;
1634         struct rt2560_tx_desc *desc;
1635         struct rt2560_tx_data *data;
1636         bus_addr_t paddr;
1637         int rate, error;
1638
1639         desc = &sc->bcnq.desc[sc->bcnq.cur];
1640         data = &sc->bcnq.data[sc->bcnq.cur];
1641
1642         rate = IEEE80211_IS_CHAN_5GHZ(ni->ni_chan) ? 12 : 2;
1643
1644         error = bus_dmamap_load_mbuf(sc->bcnq.data_dmat, data->map, m0,
1645                                      rt2560_dma_map_mbuf, &paddr,
1646                                      BUS_DMA_NOWAIT);
1647         if (error != 0) {
1648                 device_printf(sc->sc_dev, "could not map mbuf (error %d)\n",
1649                     error);
1650                 m_freem(m0);
1651                 return error;
1652         }
1653
1654         if (sc->sc_drvbpf != NULL) {
1655                 struct rt2560_tx_radiotap_header *tap = &sc->sc_txtap;
1656
1657                 tap->wt_flags = 0;
1658                 tap->wt_rate = rate;
1659                 tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq);
1660                 tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags);
1661                 tap->wt_antenna = sc->tx_ant;
1662
1663                 bpf_ptap(sc->sc_drvbpf, m0, tap, sc->sc_txtap_len);
1664         }
1665
1666         data->m = m0;
1667         data->ni = ni;
1668
1669         rt2560_setup_tx_desc(sc, desc, RT2560_TX_IFS_NEWBACKOFF |
1670             RT2560_TX_TIMESTAMP, m0->m_pkthdr.len, rate, 0, paddr);
1671
1672         DPRINTFN(10, ("sending beacon frame len=%u idx=%u rate=%u\n",
1673             m0->m_pkthdr.len, sc->bcnq.cur, rate));
1674
1675         bus_dmamap_sync(sc->bcnq.data_dmat, data->map, BUS_DMASYNC_PREWRITE);
1676         bus_dmamap_sync(sc->bcnq.desc_dmat, sc->bcnq.desc_map,
1677             BUS_DMASYNC_PREWRITE);
1678
1679         sc->bcnq.cur = (sc->bcnq.cur + 1) % RT2560_BEACON_RING_COUNT;
1680
1681         return 0;
1682 }
1683
1684 static int
1685 rt2560_tx_mgt(struct rt2560_softc *sc, struct mbuf *m0,
1686     struct ieee80211_node *ni)
1687 {
1688         struct ieee80211com *ic = &sc->sc_ic;
1689         struct rt2560_tx_desc *desc;
1690         struct rt2560_tx_data *data;
1691         struct ieee80211_frame *wh;
1692         bus_addr_t paddr;
1693         uint16_t dur;
1694         uint32_t flags = 0;
1695         int rate, error;
1696
1697         desc = &sc->prioq.desc[sc->prioq.cur];
1698         data = &sc->prioq.data[sc->prioq.cur];
1699
1700         rate = IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan) ? 12 : 2;
1701
1702         error = bus_dmamap_load_mbuf(sc->prioq.data_dmat, data->map, m0,
1703                                      rt2560_dma_map_mbuf, &paddr, 0);
1704         if (error != 0) {
1705                 device_printf(sc->sc_dev, "could not map mbuf (error %d)\n",
1706                     error);
1707                 m_freem(m0);
1708                 return error;
1709         }
1710
1711         if (sc->sc_drvbpf != NULL) {
1712                 struct rt2560_tx_radiotap_header *tap = &sc->sc_txtap;
1713
1714                 tap->wt_flags = 0;
1715                 tap->wt_rate = rate;
1716                 tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq);
1717                 tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags);
1718                 tap->wt_antenna = sc->tx_ant;
1719
1720                 bpf_ptap(sc->sc_drvbpf, m0, tap, sc->sc_txtap_len);
1721         }
1722
1723         data->m = m0;
1724         data->ni = ni;
1725
1726         wh = mtod(m0, struct ieee80211_frame *);
1727
1728         if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
1729                 flags |= RT2560_TX_ACK;
1730
1731                 dur = rt2560_txtime(RAL_ACK_SIZE, rate, ic->ic_flags) +
1732                       RAL_SIFS;
1733                 *(uint16_t *)wh->i_dur = htole16(dur);
1734
1735                 /* tell hardware to add timestamp for probe responses */
1736                 if ((wh->i_fc[0] & IEEE80211_FC0_TYPE_MASK) ==
1737                     IEEE80211_FC0_TYPE_MGT &&
1738                     (wh->i_fc[0] & IEEE80211_FC0_SUBTYPE_MASK) ==
1739                     IEEE80211_FC0_SUBTYPE_PROBE_RESP)
1740                         flags |= RT2560_TX_TIMESTAMP;
1741         }
1742
1743         rt2560_setup_tx_desc(sc, desc, flags, m0->m_pkthdr.len, rate, 0, paddr);
1744
1745         bus_dmamap_sync(sc->prioq.data_dmat, data->map, BUS_DMASYNC_PREWRITE);
1746         bus_dmamap_sync(sc->prioq.desc_dmat, sc->prioq.desc_map,
1747             BUS_DMASYNC_PREWRITE);
1748
1749         DPRINTFN(10, ("sending mgt frame len=%u idx=%u rate=%u\n",
1750             m0->m_pkthdr.len, sc->prioq.cur, rate));
1751
1752         /* kick prio */
1753         sc->prioq.queued++;
1754         sc->prioq.cur = (sc->prioq.cur + 1) % RT2560_PRIO_RING_COUNT;
1755         RAL_WRITE(sc, RT2560_TXCSR0, RT2560_KICK_PRIO);
1756
1757         return 0;
1758 }
1759
1760 /*
1761  * Build a RTS control frame.
1762  */
1763 static struct mbuf *
1764 rt2560_get_rts(struct rt2560_softc *sc, struct ieee80211_frame *wh,
1765     uint16_t dur)
1766 {
1767         struct ieee80211_frame_rts *rts;
1768         struct mbuf *m;
1769
1770         MGETHDR(m, MB_DONTWAIT, MT_DATA);
1771         if (m == NULL) {
1772                 sc->sc_ic.ic_stats.is_tx_nobuf++;
1773                 device_printf(sc->sc_dev, "could not allocate RTS frame\n");
1774                 return NULL;
1775         }
1776
1777         rts = mtod(m, struct ieee80211_frame_rts *);
1778
1779         rts->i_fc[0] = IEEE80211_FC0_VERSION_0 | IEEE80211_FC0_TYPE_CTL |
1780             IEEE80211_FC0_SUBTYPE_RTS;
1781         rts->i_fc[1] = IEEE80211_FC1_DIR_NODS;
1782         *(uint16_t *)rts->i_dur = htole16(dur);
1783         IEEE80211_ADDR_COPY(rts->i_ra, wh->i_addr1);
1784         IEEE80211_ADDR_COPY(rts->i_ta, wh->i_addr2);
1785
1786         m->m_pkthdr.len = m->m_len = sizeof(struct ieee80211_frame_rts);
1787
1788         return m;
1789 }
1790
1791 static int
1792 rt2560_tx_data(struct rt2560_softc *sc, struct mbuf *m0,
1793     struct ieee80211_node *ni)
1794 {
1795         struct ieee80211com *ic = &sc->sc_ic;
1796         struct rt2560_tx_desc *desc;
1797         struct rt2560_tx_data *data;
1798         struct rt2560_node *rn;
1799         struct ieee80211_rateset *rs;
1800         struct ieee80211_frame *wh;
1801         struct ieee80211_key *k;
1802         struct mbuf *mnew;
1803         bus_addr_t paddr;
1804         uint16_t dur;
1805         uint32_t flags = 0;
1806         int rate, error;
1807
1808         wh = mtod(m0, struct ieee80211_frame *);
1809
1810         if (ic->ic_fixed_rate != IEEE80211_FIXED_RATE_NONE) {
1811                 rs = &ic->ic_sup_rates[ic->ic_curmode];
1812                 rate = rs->rs_rates[ic->ic_fixed_rate];
1813         } else {
1814                 rs = &ni->ni_rates;
1815                 rn = (struct rt2560_node *)ni;
1816                 ni->ni_txrate = ral_rssadapt_choose(&rn->rssadapt, rs, wh,
1817                     m0->m_pkthdr.len, NULL, 0);
1818                 rate = rs->rs_rates[ni->ni_txrate];
1819         }
1820         rate &= IEEE80211_RATE_VAL;
1821
1822         if (wh->i_fc[1] & IEEE80211_FC1_WEP) {
1823                 k = ieee80211_crypto_encap(ic, ni, m0);
1824                 if (k == NULL) {
1825                         m_freem(m0);
1826                         return ENOBUFS;
1827                 }
1828
1829                 /* packet header may have moved, reset our local pointer */
1830                 wh = mtod(m0, struct ieee80211_frame *);
1831         }
1832
1833         /*
1834          * IEEE Std 802.11-1999, pp 82: "A STA shall use an RTS/CTS exchange
1835          * for directed frames only when the length of the MPDU is greater
1836          * than the length threshold indicated by [...]" ic_rtsthreshold.
1837          */
1838         if (!IEEE80211_IS_MULTICAST(wh->i_addr1) &&
1839             m0->m_pkthdr.len > ic->ic_rtsthreshold) {
1840                 struct mbuf *m;
1841                 uint16_t dur;
1842                 int rtsrate, ackrate;
1843
1844                 rtsrate = IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan) ? 12 : 2;
1845                 ackrate = rt2560_ack_rate(ic, rate);
1846
1847                 dur = rt2560_txtime(m0->m_pkthdr.len + 4, rate, ic->ic_flags) +
1848                       rt2560_txtime(RAL_CTS_SIZE, rtsrate, ic->ic_flags) +
1849                       rt2560_txtime(RAL_ACK_SIZE, ackrate, ic->ic_flags) +
1850                       3 * RAL_SIFS;
1851
1852                 m = rt2560_get_rts(sc, wh, dur);
1853
1854                 desc = &sc->txq.desc[sc->txq.cur_encrypt];
1855                 data = &sc->txq.data[sc->txq.cur_encrypt];
1856
1857                 error = bus_dmamap_load_mbuf(sc->txq.data_dmat, data->map,
1858                                              m, rt2560_dma_map_mbuf, &paddr, 0);
1859                 if (error != 0) {
1860                         device_printf(sc->sc_dev,
1861                             "could not map mbuf (error %d)\n", error);
1862                         m_freem(m);
1863                         m_freem(m0);
1864                         return error;
1865                 }
1866
1867                 /* avoid multiple free() of the same node for each fragment */
1868                 ieee80211_ref_node(ni);
1869
1870                 data->m = m;
1871                 data->ni = ni;
1872
1873                 /* RTS frames are not taken into account for rssadapt */
1874                 data->id.id_node = NULL;
1875
1876                 rt2560_setup_tx_desc(sc, desc, RT2560_TX_ACK |
1877                     RT2560_TX_MORE_FRAG, m->m_pkthdr.len, rtsrate, 1, paddr);
1878
1879                 bus_dmamap_sync(sc->txq.data_dmat, data->map,
1880                     BUS_DMASYNC_PREWRITE);
1881
1882                 sc->txq.queued++;
1883                 sc->txq.cur_encrypt =
1884                     (sc->txq.cur_encrypt + 1) % RT2560_TX_RING_COUNT;
1885
1886                 /*
1887                  * IEEE Std 802.11-1999: when an RTS/CTS exchange is used, the
1888                  * asynchronous data frame shall be transmitted after the CTS
1889                  * frame and a SIFS period.
1890                  */
1891                 flags |= RT2560_TX_LONG_RETRY | RT2560_TX_IFS_SIFS;
1892         }
1893
1894         data = &sc->txq.data[sc->txq.cur_encrypt];
1895         desc = &sc->txq.desc[sc->txq.cur_encrypt];
1896
1897         error = bus_dmamap_load_mbuf(sc->txq.data_dmat, data->map, m0,
1898                                      rt2560_dma_map_mbuf, &paddr, 0);
1899         if (error != 0 && error != EFBIG) {
1900                 device_printf(sc->sc_dev, "could not map mbuf (error %d)\n",
1901                     error);
1902                 m_freem(m0);
1903                 return error;
1904         }
1905         if (error != 0) {
1906                 mnew = m_defrag(m0, MB_DONTWAIT);
1907                 if (mnew == NULL) {
1908                         device_printf(sc->sc_dev,
1909                             "could not defragment mbuf\n");
1910                         m_freem(m0);
1911                         return ENOBUFS;
1912                 }
1913                 m0 = mnew;
1914
1915                 error = bus_dmamap_load_mbuf(sc->txq.data_dmat, data->map,
1916                                              m0, rt2560_dma_map_mbuf, &paddr,
1917                                              0);
1918                 if (error != 0) {
1919                         device_printf(sc->sc_dev,
1920                             "could not map mbuf (error %d)\n", error);
1921                         m_freem(m0);
1922                         return error;
1923                 }
1924
1925                 /* packet header may have moved, reset our local pointer */
1926                 wh = mtod(m0, struct ieee80211_frame *);
1927         }
1928
1929         if (sc->sc_drvbpf != NULL) {
1930                 struct rt2560_tx_radiotap_header *tap = &sc->sc_txtap;
1931
1932                 tap->wt_flags = 0;
1933                 tap->wt_rate = rate;
1934                 tap->wt_chan_freq = htole16(ic->ic_curchan->ic_freq);
1935                 tap->wt_chan_flags = htole16(ic->ic_curchan->ic_flags);
1936                 tap->wt_antenna = sc->tx_ant;
1937
1938                 bpf_ptap(sc->sc_drvbpf, m0, tap, sc->sc_txtap_len);
1939         }
1940
1941         data->m = m0;
1942         data->ni = ni;
1943
1944         /* remember link conditions for rate adaptation algorithm */
1945         if (ic->ic_fixed_rate == IEEE80211_FIXED_RATE_NONE) {
1946                 data->id.id_len = m0->m_pkthdr.len;
1947                 data->id.id_rateidx = ni->ni_txrate;
1948                 data->id.id_node = ni;
1949                 data->id.id_rssi = ni->ni_rssi;
1950         } else
1951                 data->id.id_node = NULL;
1952
1953         if (!IEEE80211_IS_MULTICAST(wh->i_addr1)) {
1954                 flags |= RT2560_TX_ACK;
1955
1956                 dur = rt2560_txtime(RAL_ACK_SIZE, rt2560_ack_rate(ic, rate),
1957                     ic->ic_flags) + RAL_SIFS;
1958                 *(uint16_t *)wh->i_dur = htole16(dur);
1959         }
1960
1961         rt2560_setup_tx_desc(sc, desc, flags, m0->m_pkthdr.len, rate, 1, paddr);
1962
1963         bus_dmamap_sync(sc->txq.data_dmat, data->map, BUS_DMASYNC_PREWRITE);
1964         bus_dmamap_sync(sc->txq.desc_dmat, sc->txq.desc_map,
1965             BUS_DMASYNC_PREWRITE);
1966
1967         DPRINTFN(10, ("sending data frame len=%u idx=%u rate=%u\n",
1968             m0->m_pkthdr.len, sc->txq.cur_encrypt, rate));
1969
1970         /* kick encrypt */
1971         sc->txq.queued++;
1972         sc->txq.cur_encrypt = (sc->txq.cur_encrypt + 1) % RT2560_TX_RING_COUNT;
1973         RAL_WRITE(sc, RT2560_SECCSR1, RT2560_KICK_ENCRYPT);
1974
1975         return 0;
1976 }
1977
1978 static void
1979 rt2560_start(struct ifnet *ifp)
1980 {
1981         struct rt2560_softc *sc = ifp->if_softc;
1982         struct ieee80211com *ic = &sc->sc_ic;
1983         struct mbuf *m0;
1984         struct ether_header *eh;
1985         struct ieee80211_node *ni;
1986
1987         /* prevent management frames from being sent if we're not ready */
1988         if (!(ifp->if_flags & IFF_RUNNING))
1989                 return;
1990
1991         for (;;) {
1992                 IF_POLL(&ic->ic_mgtq, m0);
1993                 if (m0 != NULL) {
1994                         if (sc->prioq.queued >= RT2560_PRIO_RING_COUNT) {
1995                                 ifp->if_flags |= IFF_OACTIVE;
1996                                 break;
1997                         }
1998                         IF_DEQUEUE(&ic->ic_mgtq, m0);
1999
2000                         ni = (struct ieee80211_node *)m0->m_pkthdr.rcvif;
2001                         m0->m_pkthdr.rcvif = NULL;
2002
2003                         if (ic->ic_rawbpf != NULL)
2004                                 bpf_mtap(ic->ic_rawbpf, m0);
2005
2006                         if (rt2560_tx_mgt(sc, m0, ni) != 0)
2007                                 break;
2008
2009                 } else {
2010                         if (ic->ic_state != IEEE80211_S_RUN)
2011                                 break;
2012                         m0 = ifq_poll(&ifp->if_snd);
2013                         if (m0 == NULL)
2014                                 break;
2015                         if (sc->txq.queued >= RT2560_TX_RING_COUNT - 1) {
2016                                 ifp->if_flags |= IFF_OACTIVE;
2017                                 break;
2018                         }
2019                         m0 = ifq_dequeue(&ifp->if_snd, m0);
2020
2021                         if (m0->m_len < sizeof (struct ether_header) &&
2022                             !(m0 = m_pullup(m0, sizeof (struct ether_header))))
2023                                 continue;
2024
2025                         eh = mtod(m0, struct ether_header *);
2026                         ni = ieee80211_find_txnode(ic, eh->ether_dhost);
2027                         if (ni == NULL) {
2028                                 m_freem(m0);
2029                                 continue;
2030                         }
2031                         BPF_MTAP(ifp, m0);
2032
2033                         m0 = ieee80211_encap(ic, m0, ni);
2034                         if (m0 == NULL) {
2035                                 ieee80211_free_node(ni);
2036                                 continue;
2037                         }
2038
2039                         if (ic->ic_rawbpf != NULL)
2040                                 bpf_mtap(ic->ic_rawbpf, m0);
2041
2042                         if (rt2560_tx_data(sc, m0, ni) != 0) {
2043                                 ieee80211_free_node(ni);
2044                                 ifp->if_oerrors++;
2045                                 break;
2046                         }
2047                 }
2048
2049                 sc->sc_tx_timer = 5;
2050                 ifp->if_timer = 1;
2051         }
2052 }
2053
2054 static void
2055 rt2560_watchdog(struct ifnet *ifp)
2056 {
2057         struct rt2560_softc *sc = ifp->if_softc;
2058         struct ieee80211com *ic = &sc->sc_ic;
2059
2060         ifp->if_timer = 0;
2061
2062         if (sc->sc_tx_timer > 0) {
2063                 if (--sc->sc_tx_timer == 0) {
2064                         device_printf(sc->sc_dev, "device timeout\n");
2065                         rt2560_init(sc);
2066                         ifp->if_oerrors++;
2067                         return;
2068                 }
2069                 ifp->if_timer = 1;
2070         }
2071
2072         ieee80211_watchdog(ic);
2073 }
2074
2075 /*
2076  * This function allows for fast channel switching in monitor mode (used by
2077  * net-mgmt/kismet). In IBSS mode, we must explicitly reset the interface to
2078  * generate a new beacon frame.
2079  */
2080 static int
2081 rt2560_reset(struct ifnet *ifp)
2082 {
2083         struct rt2560_softc *sc = ifp->if_softc;
2084         struct ieee80211com *ic = &sc->sc_ic;
2085
2086         if (ic->ic_opmode != IEEE80211_M_MONITOR)
2087                 return ENETRESET;
2088
2089         rt2560_set_chan(sc, ic->ic_curchan);
2090
2091         return 0;
2092 }
2093
2094 static int
2095 rt2560_ioctl(struct ifnet *ifp, u_long cmd, caddr_t data, struct ucred *cr)
2096 {
2097         struct rt2560_softc *sc = ifp->if_softc;
2098         struct ieee80211com *ic = &sc->sc_ic;
2099         int error = 0;
2100
2101         switch (cmd) {
2102         case SIOCSIFFLAGS:
2103                 if (ifp->if_flags & IFF_UP) {
2104                         if (ifp->if_flags & IFF_RUNNING)
2105                                 rt2560_update_promisc(sc);
2106                         else
2107                                 rt2560_init(sc);
2108                 } else {
2109                         if (ifp->if_flags & IFF_RUNNING)
2110                                 rt2560_stop(sc);
2111                 }
2112                 break;
2113
2114         default:
2115                 error = ieee80211_ioctl(ic, cmd, data, cr);
2116         }
2117
2118         if (error == ENETRESET) {
2119                 if ((ifp->if_flags & (IFF_UP | IFF_RUNNING)) ==
2120                     (IFF_UP | IFF_RUNNING) &&
2121                     (ic->ic_roaming != IEEE80211_ROAMING_MANUAL))
2122                         rt2560_init(sc);
2123                 error = 0;
2124         }
2125
2126         return error;
2127 }
2128
2129 static void
2130 rt2560_bbp_write(struct rt2560_softc *sc, uint8_t reg, uint8_t val)
2131 {
2132         uint32_t tmp;
2133         int ntries;
2134
2135         for (ntries = 0; ntries < 100; ntries++) {
2136                 if (!(RAL_READ(sc, RT2560_BBPCSR) & RT2560_BBP_BUSY))
2137                         break;
2138                 DELAY(1);
2139         }
2140         if (ntries == 100) {
2141                 device_printf(sc->sc_dev, "could not write to BBP\n");
2142                 return;
2143         }
2144
2145         tmp = RT2560_BBP_WRITE | RT2560_BBP_BUSY | reg << 8 | val;
2146         RAL_WRITE(sc, RT2560_BBPCSR, tmp);
2147
2148         DPRINTFN(15, ("BBP R%u <- 0x%02x\n", reg, val));
2149 }
2150
2151 static uint8_t
2152 rt2560_bbp_read(struct rt2560_softc *sc, uint8_t reg)
2153 {
2154         uint32_t val;
2155         int ntries;
2156
2157         val = RT2560_BBP_BUSY | reg << 8;
2158         RAL_WRITE(sc, RT2560_BBPCSR, val);
2159
2160         for (ntries = 0; ntries < 100; ntries++) {
2161                 val = RAL_READ(sc, RT2560_BBPCSR);
2162                 if (!(val & RT2560_BBP_BUSY))
2163                         return val & 0xff;
2164                 DELAY(1);
2165         }
2166
2167         device_printf(sc->sc_dev, "could not read from BBP\n");
2168         return 0;
2169 }
2170
2171 static void
2172 rt2560_rf_write(struct rt2560_softc *sc, uint8_t reg, uint32_t val)
2173 {
2174         uint32_t tmp;
2175         int ntries;
2176
2177         for (ntries = 0; ntries < 100; ntries++) {
2178                 if (!(RAL_READ(sc, RT2560_RFCSR) & RT2560_RF_BUSY))
2179                         break;
2180                 DELAY(1);
2181         }
2182         if (ntries == 100) {
2183                 device_printf(sc->sc_dev, "could not write to RF\n");
2184                 return;
2185         }
2186
2187         tmp = RT2560_RF_BUSY | RT2560_RF_20BIT | (val & 0xfffff) << 2 |
2188             (reg & 0x3);
2189         RAL_WRITE(sc, RT2560_RFCSR, tmp);
2190
2191         /* remember last written value in sc */
2192         sc->rf_regs[reg] = val;
2193
2194         DPRINTFN(15, ("RF R[%u] <- 0x%05x\n", reg & 0x3, val & 0xfffff));
2195 }
2196
2197 static void
2198 rt2560_set_chan(struct rt2560_softc *sc, struct ieee80211_channel *c)
2199 {
2200         struct ieee80211com *ic = &sc->sc_ic;
2201         uint8_t power, tmp;
2202         u_int i, chan;
2203
2204         chan = ieee80211_chan2ieee(ic, c);
2205         if (chan == 0 || chan == IEEE80211_CHAN_ANY)
2206                 return;
2207
2208         if (IEEE80211_IS_CHAN_2GHZ(c))
2209                 power = min(sc->txpow[chan - 1], 31);
2210         else
2211                 power = 31;
2212
2213         /* adjust txpower using ifconfig settings */
2214         power -= (100 - ic->ic_txpowlimit) / 8;
2215
2216         DPRINTFN(2, ("setting channel to %u, txpower to %u\n", chan, power));
2217
2218         switch (sc->rf_rev) {
2219         case RT2560_RF_2522:
2220                 rt2560_rf_write(sc, RAL_RF1, 0x00814);
2221                 rt2560_rf_write(sc, RAL_RF2, rt2560_rf2522_r2[chan - 1]);
2222                 rt2560_rf_write(sc, RAL_RF3, power << 7 | 0x00040);
2223                 break;
2224
2225         case RT2560_RF_2523:
2226                 rt2560_rf_write(sc, RAL_RF1, 0x08804);
2227                 rt2560_rf_write(sc, RAL_RF2, rt2560_rf2523_r2[chan - 1]);
2228                 rt2560_rf_write(sc, RAL_RF3, power << 7 | 0x38044);
2229                 rt2560_rf_write(sc, RAL_RF4, (chan == 14) ? 0x00280 : 0x00286);
2230                 break;
2231
2232         case RT2560_RF_2524:
2233                 rt2560_rf_write(sc, RAL_RF1, 0x0c808);
2234                 rt2560_rf_write(sc, RAL_RF2, rt2560_rf2524_r2[chan - 1]);
2235                 rt2560_rf_write(sc, RAL_RF3, power << 7 | 0x00040);
2236                 rt2560_rf_write(sc, RAL_RF4, (chan == 14) ? 0x00280 : 0x00286);
2237                 break;
2238
2239         case RT2560_RF_2525:
2240                 rt2560_rf_write(sc, RAL_RF1, 0x08808);
2241                 rt2560_rf_write(sc, RAL_RF2, rt2560_rf2525_hi_r2[chan - 1]);
2242                 rt2560_rf_write(sc, RAL_RF3, power << 7 | 0x18044);
2243                 rt2560_rf_write(sc, RAL_RF4, (chan == 14) ? 0x00280 : 0x00286);
2244
2245                 rt2560_rf_write(sc, RAL_RF1, 0x08808);
2246                 rt2560_rf_write(sc, RAL_RF2, rt2560_rf2525_r2[chan - 1]);
2247                 rt2560_rf_write(sc, RAL_RF3, power << 7 | 0x18044);
2248                 rt2560_rf_write(sc, RAL_RF4, (chan == 14) ? 0x00280 : 0x00286);
2249                 break;
2250
2251         case RT2560_RF_2525E:
2252                 rt2560_rf_write(sc, RAL_RF1, 0x08808);
2253                 rt2560_rf_write(sc, RAL_RF2, rt2560_rf2525e_r2[chan - 1]);
2254                 rt2560_rf_write(sc, RAL_RF3, power << 7 | 0x18044);
2255                 rt2560_rf_write(sc, RAL_RF4, (chan == 14) ? 0x00286 : 0x00282);
2256                 break;
2257
2258         case RT2560_RF_2526:
2259                 rt2560_rf_write(sc, RAL_RF2, rt2560_rf2526_hi_r2[chan - 1]);
2260                 rt2560_rf_write(sc, RAL_RF4, (chan & 1) ? 0x00386 : 0x00381);
2261                 rt2560_rf_write(sc, RAL_RF1, 0x08804);
2262
2263                 rt2560_rf_write(sc, RAL_RF2, rt2560_rf2526_r2[chan - 1]);
2264                 rt2560_rf_write(sc, RAL_RF3, power << 7 | 0x18044);
2265                 rt2560_rf_write(sc, RAL_RF4, (chan & 1) ? 0x00386 : 0x00381);
2266                 break;
2267
2268         /* dual-band RF */
2269         case RT2560_RF_5222:
2270                 for (i = 0; rt2560_rf5222[i].chan != chan; i++);
2271
2272                 rt2560_rf_write(sc, RAL_RF1, rt2560_rf5222[i].r1);
2273                 rt2560_rf_write(sc, RAL_RF2, rt2560_rf5222[i].r2);
2274                 rt2560_rf_write(sc, RAL_RF3, power << 7 | 0x00040);
2275                 rt2560_rf_write(sc, RAL_RF4, rt2560_rf5222[i].r4);
2276                 break;
2277         }
2278
2279         if (ic->ic_state != IEEE80211_S_SCAN) {
2280                 /* set Japan filter bit for channel 14 */
2281                 tmp = rt2560_bbp_read(sc, 70);
2282
2283                 tmp &= ~RT2560_JAPAN_FILTER;
2284                 if (chan == 14)
2285                         tmp |= RT2560_JAPAN_FILTER;
2286
2287                 rt2560_bbp_write(sc, 70, tmp);
2288
2289                 /* clear CRC errors */
2290                 RAL_READ(sc, RT2560_CNT0);
2291         }
2292 }
2293
2294 #if 0
2295 /*
2296  * Disable RF auto-tuning.
2297  */
2298 static void
2299 rt2560_disable_rf_tune(struct rt2560_softc *sc)
2300 {
2301         uint32_t tmp;
2302
2303         if (sc->rf_rev != RT2560_RF_2523) {
2304                 tmp = sc->rf_regs[RAL_RF1] & ~RAL_RF1_AUTOTUNE;
2305                 rt2560_rf_write(sc, RAL_RF1, tmp);
2306         }
2307
2308         tmp = sc->rf_regs[RAL_RF3] & ~RAL_RF3_AUTOTUNE;
2309         rt2560_rf_write(sc, RAL_RF3, tmp);
2310
2311         DPRINTFN(2, ("disabling RF autotune\n"));
2312 }
2313 #endif
2314
2315 /*
2316  * Refer to IEEE Std 802.11-1999 pp. 123 for more information on TSF
2317  * synchronization.
2318  */
2319 static void
2320 rt2560_enable_tsf_sync(struct rt2560_softc *sc)
2321 {
2322         struct ieee80211com *ic = &sc->sc_ic;
2323         uint16_t logcwmin, preload;
2324         uint32_t tmp;
2325
2326         /* first, disable TSF synchronization */
2327         RAL_WRITE(sc, RT2560_CSR14, 0);
2328
2329         tmp = 16 * ic->ic_bss->ni_intval;
2330         RAL_WRITE(sc, RT2560_CSR12, tmp);
2331
2332         RAL_WRITE(sc, RT2560_CSR13, 0);
2333
2334         logcwmin = 5;
2335         preload = (ic->ic_opmode == IEEE80211_M_STA) ? 384 : 1024;
2336         tmp = logcwmin << 16 | preload;
2337         RAL_WRITE(sc, RT2560_BCNOCSR, tmp);
2338
2339         /* finally, enable TSF synchronization */
2340         tmp = RT2560_ENABLE_TSF | RT2560_ENABLE_TBCN;
2341         if (ic->ic_opmode == IEEE80211_M_STA)
2342                 tmp |= RT2560_ENABLE_TSF_SYNC(1);
2343         else
2344                 tmp |= RT2560_ENABLE_TSF_SYNC(2) |
2345                        RT2560_ENABLE_BEACON_GENERATOR;
2346         RAL_WRITE(sc, RT2560_CSR14, tmp);
2347
2348         DPRINTF(("enabling TSF synchronization\n"));
2349 }
2350
2351 static void
2352 rt2560_update_plcp(struct rt2560_softc *sc)
2353 {
2354         struct ieee80211com *ic = &sc->sc_ic;
2355
2356         /* no short preamble for 1Mbps */
2357         RAL_WRITE(sc, RT2560_PLCP1MCSR, 0x00700400);
2358
2359         if (!(ic->ic_flags & IEEE80211_F_SHPREAMBLE)) {
2360                 /* values taken from the reference driver */
2361                 RAL_WRITE(sc, RT2560_PLCP2MCSR,   0x00380401);
2362                 RAL_WRITE(sc, RT2560_PLCP5p5MCSR, 0x00150402);
2363                 RAL_WRITE(sc, RT2560_PLCP11MCSR,  0x000b8403);
2364         } else {
2365                 /* same values as above or'ed 0x8 */
2366                 RAL_WRITE(sc, RT2560_PLCP2MCSR,   0x00380409);
2367                 RAL_WRITE(sc, RT2560_PLCP5p5MCSR, 0x0015040a);
2368                 RAL_WRITE(sc, RT2560_PLCP11MCSR,  0x000b840b);
2369         }
2370
2371         DPRINTF(("updating PLCP for %s preamble\n",
2372             (ic->ic_flags & IEEE80211_F_SHPREAMBLE) ? "short" : "long"));
2373 }
2374
2375 /*
2376  * This function can be called by ieee80211_set_shortslottime(). Refer to
2377  * IEEE Std 802.11-1999 pp. 85 to know how these values are computed.
2378  */
2379 static void
2380 rt2560_update_slot(struct ifnet *ifp)
2381 {
2382         struct rt2560_softc *sc = ifp->if_softc;
2383         struct ieee80211com *ic = &sc->sc_ic;
2384         uint8_t slottime;
2385         uint16_t tx_sifs, tx_pifs, tx_difs, eifs;
2386         uint32_t tmp;
2387
2388         slottime = (ic->ic_flags & IEEE80211_F_SHSLOT) ? 9 : 20;
2389
2390         /* update the MAC slot boundaries */
2391         tx_sifs = RAL_SIFS - RT2560_TXRX_TURNAROUND;
2392         tx_pifs = tx_sifs + slottime;
2393         tx_difs = tx_sifs + 2 * slottime;
2394         eifs = (ic->ic_curmode == IEEE80211_MODE_11B) ? 364 : 60;
2395
2396         tmp = RAL_READ(sc, RT2560_CSR11);
2397         tmp = (tmp & ~0x1f00) | slottime << 8;
2398         RAL_WRITE(sc, RT2560_CSR11, tmp);
2399
2400         tmp = tx_pifs << 16 | tx_sifs;
2401         RAL_WRITE(sc, RT2560_CSR18, tmp);
2402
2403         tmp = eifs << 16 | tx_difs;
2404         RAL_WRITE(sc, RT2560_CSR19, tmp);
2405
2406         DPRINTF(("setting slottime to %uus\n", slottime));
2407 }
2408
2409 static void
2410 rt2560_set_basicrates(struct rt2560_softc *sc)
2411 {
2412         struct ieee80211com *ic = &sc->sc_ic;
2413
2414         /* update basic rate set */
2415         if (ic->ic_curmode == IEEE80211_MODE_11B) {
2416                 /* 11b basic rates: 1, 2Mbps */
2417                 RAL_WRITE(sc, RT2560_ARSP_PLCP_1, 0x3);
2418         } else if (IEEE80211_IS_CHAN_5GHZ(ic->ic_curchan)) {
2419                 /* 11a basic rates: 6, 12, 24Mbps */
2420                 RAL_WRITE(sc, RT2560_ARSP_PLCP_1, 0x150);
2421         } else {
2422                 /* 11g basic rates: 1, 2, 5.5, 11, 6, 12, 24Mbps */
2423                 RAL_WRITE(sc, RT2560_ARSP_PLCP_1, 0x15f);
2424         }
2425 }
2426
2427 static void
2428 rt2560_update_led(struct rt2560_softc *sc, int led1, int led2)
2429 {
2430         uint32_t tmp;
2431
2432         /* set ON period to 70ms and OFF period to 30ms */
2433         tmp = led1 << 16 | led2 << 17 | 70 << 8 | 30;
2434         RAL_WRITE(sc, RT2560_LEDCSR, tmp);
2435 }
2436
2437 static void
2438 rt2560_set_bssid(struct rt2560_softc *sc, uint8_t *bssid)
2439 {
2440         uint32_t tmp;
2441
2442         tmp = bssid[0] | bssid[1] << 8 | bssid[2] << 16 | bssid[3] << 24;
2443         RAL_WRITE(sc, RT2560_CSR5, tmp);
2444
2445         tmp = bssid[4] | bssid[5] << 8;
2446         RAL_WRITE(sc, RT2560_CSR6, tmp);
2447
2448         DPRINTF(("setting BSSID to %6D\n", bssid, ":"));
2449 }
2450
2451 static void
2452 rt2560_set_macaddr(struct rt2560_softc *sc, uint8_t *addr)
2453 {
2454         uint32_t tmp;
2455
2456         tmp = addr[0] | addr[1] << 8 | addr[2] << 16 | addr[3] << 24;
2457         RAL_WRITE(sc, RT2560_CSR3, tmp);
2458
2459         tmp = addr[4] | addr[5] << 8;
2460         RAL_WRITE(sc, RT2560_CSR4, tmp);
2461
2462         DPRINTF(("setting MAC address to %6D\n", addr, ":"));
2463 }
2464
2465 static void
2466 rt2560_get_macaddr(struct rt2560_softc *sc, uint8_t *addr)
2467 {
2468         uint32_t tmp;
2469
2470         tmp = RAL_READ(sc, RT2560_CSR3);
2471         addr[0] = tmp & 0xff;
2472         addr[1] = (tmp >>  8) & 0xff;
2473         addr[2] = (tmp >> 16) & 0xff;
2474         addr[3] = (tmp >> 24);
2475
2476         tmp = RAL_READ(sc, RT2560_CSR4);
2477         addr[4] = tmp & 0xff;
2478         addr[5] = (tmp >> 8) & 0xff;
2479 }
2480
2481 static void
2482 rt2560_update_promisc(struct rt2560_softc *sc)
2483 {
2484         struct ifnet *ifp = sc->sc_ic.ic_ifp;
2485         uint32_t tmp;
2486
2487         tmp = RAL_READ(sc, RT2560_RXCSR0);
2488
2489         tmp &= ~RT2560_DROP_NOT_TO_ME;
2490         if (!(ifp->if_flags & IFF_PROMISC))
2491                 tmp |= RT2560_DROP_NOT_TO_ME;
2492
2493         RAL_WRITE(sc, RT2560_RXCSR0, tmp);
2494
2495         DPRINTF(("%s promiscuous mode\n", (ifp->if_flags & IFF_PROMISC) ?
2496             "entering" : "leaving"));
2497 }
2498
2499 static const char *
2500 rt2560_get_rf(int rev)
2501 {
2502         switch (rev) {
2503         case RT2560_RF_2522:    return "RT2522";
2504         case RT2560_RF_2523:    return "RT2523";
2505         case RT2560_RF_2524:    return "RT2524";
2506         case RT2560_RF_2525:    return "RT2525";
2507         case RT2560_RF_2525E:   return "RT2525e";
2508         case RT2560_RF_2526:    return "RT2526";
2509         case RT2560_RF_5222:    return "RT5222";
2510         default:                return "unknown";
2511         }
2512 }
2513
2514 static void
2515 rt2560_read_eeprom(struct rt2560_softc *sc)
2516 {
2517         uint16_t val;
2518         int i;
2519
2520         val = rt2560_eeprom_read(sc, RT2560_EEPROM_CONFIG0);
2521         sc->rf_rev =   (val >> 11) & 0x7;
2522         sc->hw_radio = (val >> 10) & 0x1;
2523         sc->led_mode = (val >> 6)  & 0x7;
2524         sc->rx_ant =   (val >> 4)  & 0x3;
2525         sc->tx_ant =   (val >> 2)  & 0x3;
2526         sc->nb_ant =   val & 0x3;
2527
2528         /* read default values for BBP registers */
2529         for (i = 0; i < 16; i++) {
2530                 val = rt2560_eeprom_read(sc, RT2560_EEPROM_BBP_BASE + i);
2531                 sc->bbp_prom[i].reg = val >> 8;
2532                 sc->bbp_prom[i].val = val & 0xff;
2533         }
2534
2535         /* read Tx power for all b/g channels */
2536         for (i = 0; i < 14 / 2; i++) {
2537                 val = rt2560_eeprom_read(sc, RT2560_EEPROM_TXPOWER + i);
2538                 sc->txpow[i * 2] = val >> 8;
2539                 sc->txpow[i * 2 + 1] = val & 0xff;
2540         }
2541 }
2542
2543 static int
2544 rt2560_bbp_init(struct rt2560_softc *sc)
2545 {
2546 #define N(a)    (sizeof (a) / sizeof ((a)[0]))
2547         int i, ntries;
2548
2549         /* wait for BBP to be ready */
2550         for (ntries = 0; ntries < 100; ntries++) {
2551                 if (rt2560_bbp_read(sc, RT2560_BBP_VERSION) != 0)
2552                         break;
2553                 DELAY(1);
2554         }
2555         if (ntries == 100) {
2556                 device_printf(sc->sc_dev, "timeout waiting for BBP\n");
2557                 return EIO;
2558         }
2559
2560         rt2560_set_txantenna(sc, sc->tx_ant);
2561         rt2560_set_rxantenna(sc, sc->rx_ant);
2562
2563         /* initialize BBP registers to default values */
2564         for (i = 0; i < N(rt2560_def_bbp); i++) {
2565                 rt2560_bbp_write(sc, rt2560_def_bbp[i].reg,
2566                     rt2560_def_bbp[i].val);
2567         }
2568 #if 0
2569         /* initialize BBP registers to values stored in EEPROM */
2570         for (i = 0; i < 16; i++) {
2571                 if (sc->bbp_prom[i].reg == 0xff)
2572                         continue;
2573                 rt2560_bbp_write(sc, sc->bbp_prom[i].reg, sc->bbp_prom[i].val);
2574         }
2575 #endif
2576
2577         return 0;
2578 #undef N
2579 }
2580
2581 static void
2582 rt2560_set_txantenna(struct rt2560_softc *sc, int antenna)
2583 {
2584         uint32_t tmp;
2585         uint8_t tx;
2586
2587         tx = rt2560_bbp_read(sc, RT2560_BBP_TX) & ~RT2560_BBP_ANTMASK;
2588         if (antenna == 1)
2589                 tx |= RT2560_BBP_ANTA;
2590         else if (antenna == 2)
2591                 tx |= RT2560_BBP_ANTB;
2592         else
2593                 tx |= RT2560_BBP_DIVERSITY;
2594
2595         /* need to force I/Q flip for RF 2525e, 2526 and 5222 */
2596         if (sc->rf_rev == RT2560_RF_2525E || sc->rf_rev == RT2560_RF_2526 ||
2597             sc->rf_rev == RT2560_RF_5222)
2598                 tx |= RT2560_BBP_FLIPIQ;
2599
2600         rt2560_bbp_write(sc, RT2560_BBP_TX, tx);
2601
2602         /* update values for CCK and OFDM in BBPCSR1 */
2603         tmp = RAL_READ(sc, RT2560_BBPCSR1) & ~0x00070007;
2604         tmp |= (tx & 0x7) << 16 | (tx & 0x7);
2605         RAL_WRITE(sc, RT2560_BBPCSR1, tmp);
2606 }
2607
2608 static void
2609 rt2560_set_rxantenna(struct rt2560_softc *sc, int antenna)
2610 {
2611         uint8_t rx;
2612
2613         rx = rt2560_bbp_read(sc, RT2560_BBP_RX) & ~RT2560_BBP_ANTMASK;
2614         if (antenna == 1)
2615                 rx |= RT2560_BBP_ANTA;
2616         else if (antenna == 2)
2617                 rx |= RT2560_BBP_ANTB;
2618         else
2619                 rx |= RT2560_BBP_DIVERSITY;
2620
2621         /* need to force no I/Q flip for RF 2525e and 2526 */
2622         if (sc->rf_rev == RT2560_RF_2525E || sc->rf_rev == RT2560_RF_2526)
2623                 rx &= ~RT2560_BBP_FLIPIQ;
2624
2625         rt2560_bbp_write(sc, RT2560_BBP_RX, rx);
2626 }
2627
2628 static void
2629 rt2560_init(void *priv)
2630 {
2631 #define N(a)    (sizeof (a) / sizeof ((a)[0]))
2632         struct rt2560_softc *sc = priv;
2633         struct ieee80211com *ic = &sc->sc_ic;
2634         struct ifnet *ifp = ic->ic_ifp;
2635         uint32_t tmp;
2636         int i;
2637
2638         rt2560_stop(sc);
2639
2640         /* setup tx rings */
2641         tmp = RT2560_PRIO_RING_COUNT << 24 |
2642               RT2560_ATIM_RING_COUNT << 16 |
2643               RT2560_TX_RING_COUNT   <<  8 |
2644               RT2560_TX_DESC_SIZE;
2645
2646         /* rings must be initialized in this exact order */
2647         RAL_WRITE(sc, RT2560_TXCSR2, tmp);
2648         RAL_WRITE(sc, RT2560_TXCSR3, sc->txq.physaddr);
2649         RAL_WRITE(sc, RT2560_TXCSR5, sc->prioq.physaddr);
2650         RAL_WRITE(sc, RT2560_TXCSR4, sc->atimq.physaddr);
2651         RAL_WRITE(sc, RT2560_TXCSR6, sc->bcnq.physaddr);
2652
2653         /* setup rx ring */
2654         tmp = RT2560_RX_RING_COUNT << 8 | RT2560_RX_DESC_SIZE;
2655
2656         RAL_WRITE(sc, RT2560_RXCSR1, tmp);
2657         RAL_WRITE(sc, RT2560_RXCSR2, sc->rxq.physaddr);
2658
2659         /* initialize MAC registers to default values */
2660         for (i = 0; i < N(rt2560_def_mac); i++)
2661                 RAL_WRITE(sc, rt2560_def_mac[i].reg, rt2560_def_mac[i].val);
2662
2663         IEEE80211_ADDR_COPY(ic->ic_myaddr, IF_LLADDR(ifp));
2664         rt2560_set_macaddr(sc, ic->ic_myaddr);
2665
2666         /* set basic rate set (will be updated later) */
2667         RAL_WRITE(sc, RT2560_ARSP_PLCP_1, 0x153);
2668
2669         rt2560_update_slot(ifp);
2670         rt2560_update_plcp(sc);
2671         rt2560_update_led(sc, 0, 0);
2672
2673         RAL_WRITE(sc, RT2560_CSR1, RT2560_RESET_ASIC);
2674         RAL_WRITE(sc, RT2560_CSR1, RT2560_HOST_READY);
2675
2676         if (rt2560_bbp_init(sc) != 0) {
2677                 rt2560_stop(sc);
2678                 return;
2679         }
2680
2681         /* set default BSS channel */
2682         rt2560_set_chan(sc, ic->ic_curchan);
2683
2684         /* kick Rx */
2685         tmp = RT2560_DROP_PHY_ERROR | RT2560_DROP_CRC_ERROR;
2686         if (ic->ic_opmode != IEEE80211_M_MONITOR) {
2687                 tmp |= RT2560_DROP_CTL | RT2560_DROP_VERSION_ERROR;
2688                 if (ic->ic_opmode != IEEE80211_M_HOSTAP)
2689                         tmp |= RT2560_DROP_TODS;
2690                 if (!(ifp->if_flags & IFF_PROMISC))
2691                         tmp |= RT2560_DROP_NOT_TO_ME;
2692         }
2693         RAL_WRITE(sc, RT2560_RXCSR0, tmp);
2694
2695         /* clear old FCS and Rx FIFO errors */
2696         RAL_READ(sc, RT2560_CNT0);
2697         RAL_READ(sc, RT2560_CNT4);
2698
2699         /* clear any pending interrupts */
2700         RAL_WRITE(sc, RT2560_CSR7, 0xffffffff);
2701
2702         /* enable interrupts */
2703         RAL_WRITE(sc, RT2560_CSR8, RT2560_INTR_MASK);
2704
2705         ifp->if_flags &= ~IFF_OACTIVE;
2706         ifp->if_flags |= IFF_RUNNING;
2707
2708         /* XXX */
2709         if (ic->ic_flags & IEEE80211_F_PRIVACY) {
2710                 int i;
2711
2712                 ic->ic_flags &= ~IEEE80211_F_DROPUNENC;
2713                 for (i = 0; i < IEEE80211_WEP_NKID; ++i) {
2714                         struct ieee80211_key *wk = &ic->ic_nw_keys[i];
2715
2716                         if (wk->wk_keylen == 0)
2717                                 continue;
2718                         if (wk->wk_flags & IEEE80211_KEY_XMIT)
2719                                 wk->wk_flags |= IEEE80211_KEY_SWCRYPT;
2720                 }
2721         }
2722
2723         if (ic->ic_opmode != IEEE80211_M_MONITOR) {
2724                 if (ic->ic_roaming != IEEE80211_ROAMING_MANUAL)
2725                         ieee80211_new_state(ic, IEEE80211_S_SCAN, -1);
2726         } else
2727                 ieee80211_new_state(ic, IEEE80211_S_RUN, -1);
2728 #undef N
2729 }
2730
2731 void
2732 rt2560_stop(void *priv)
2733 {
2734         struct rt2560_softc *sc = priv;
2735         struct ieee80211com *ic = &sc->sc_ic;
2736         struct ifnet *ifp = ic->ic_ifp;
2737
2738         sc->sc_tx_timer = 0;
2739         ifp->if_timer = 0;
2740         ifp->if_flags &= ~(IFF_RUNNING | IFF_OACTIVE);
2741
2742         ieee80211_new_state(ic, IEEE80211_S_INIT, -1);
2743
2744         /* abort Tx */
2745         RAL_WRITE(sc, RT2560_TXCSR0, RT2560_ABORT_TX);
2746
2747         /* disable Rx */
2748         RAL_WRITE(sc, RT2560_RXCSR0, RT2560_DISABLE_RX);
2749
2750         /* reset ASIC (imply reset BBP) */
2751         RAL_WRITE(sc, RT2560_CSR1, RT2560_RESET_ASIC);
2752         RAL_WRITE(sc, RT2560_CSR1, 0);
2753
2754         /* disable interrupts */
2755         RAL_WRITE(sc, RT2560_CSR8, 0xffffffff);
2756
2757         /* reset Tx and Rx rings */
2758         rt2560_reset_tx_ring(sc, &sc->txq);
2759         rt2560_reset_tx_ring(sc, &sc->atimq);
2760         rt2560_reset_tx_ring(sc, &sc->prioq);
2761         rt2560_reset_tx_ring(sc, &sc->bcnq);
2762         rt2560_reset_rx_ring(sc, &sc->rxq);
2763 }
2764
2765 static void
2766 rt2560_dma_map_mbuf(void *arg, bus_dma_segment_t *seg, int nseg,
2767                     bus_size_t map_size __unused, int error)
2768 {
2769         if (error)
2770                 return;
2771
2772         KASSERT(nseg == 1, ("too many dma segments\n"));
2773         *((bus_addr_t *)arg) = seg->ds_addr;
2774 }