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