1 /* $OpenBSD: if_urtwn.c,v 1.16 2011/02/10 17:26:40 jakemsr Exp $ */ 2 3 /*- 4 * Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr> 5 * Copyright (c) 2014 Kevin Lo <kevlo@FreeBSD.org> 6 * Copyright (c) 2016 Andriy Voskoboinyk <avos@FreeBSD.org> 7 * 8 * Permission to use, copy, modify, and distribute this software for any 9 * purpose with or without fee is hereby granted, provided that the above 10 * copyright notice and this permission notice appear in all copies. 11 * 12 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 13 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 14 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 15 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 16 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 17 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 18 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 19 */ 20 21 #include <sys/cdefs.h> 22 __FBSDID("$FreeBSD$"); 23 24 #include <sys/param.h> 25 #include <sys/sysctl.h> 26 #include <sys/lock.h> 27 #include <sys/mutex.h> 28 #include <sys/mbuf.h> 29 #include <sys/kernel.h> 30 #include <sys/socket.h> 31 #include <sys/systm.h> 32 #include <sys/malloc.h> 33 #include <sys/module.h> 34 #include <sys/bus.h> 35 #include <sys/endian.h> 36 #include <sys/linker.h> 37 #include <sys/kdb.h> 38 39 #include <machine/bus.h> 40 #include <machine/resource.h> 41 #include <sys/rman.h> 42 43 #include <dev/pci/pcireg.h> 44 #include <dev/pci/pcivar.h> 45 46 #include <net/if.h> 47 #include <net/ethernet.h> 48 #include <net/if_media.h> 49 50 #include <net80211/ieee80211_var.h> 51 52 #include <dev/rtwn/if_rtwnreg.h> 53 #include <dev/rtwn/if_rtwnvar.h> 54 #include <dev/rtwn/if_rtwn_nop.h> 55 #include <dev/rtwn/if_rtwn_debug.h> 56 57 #include <dev/rtwn/pci/rtwn_pci_var.h> 58 59 #include <dev/rtwn/pci/rtwn_pci_attach.h> 60 #include <dev/rtwn/pci/rtwn_pci_reg.h> 61 #include <dev/rtwn/pci/rtwn_pci_rx.h> 62 #include <dev/rtwn/pci/rtwn_pci_tx.h> 63 64 #include <dev/rtwn/rtl8192c/pci/r92ce_reg.h> 65 #include <dev/rtwn/rtl8192c/pci/r92ce_rx_desc.h> 66 67 68 static device_probe_t rtwn_pci_probe; 69 static device_attach_t rtwn_pci_attach; 70 static device_detach_t rtwn_pci_detach; 71 static device_shutdown_t rtwn_pci_shutdown; 72 static device_suspend_t rtwn_pci_suspend; 73 static device_resume_t rtwn_pci_resume; 74 75 static int rtwn_pci_alloc_rx_list(struct rtwn_softc *); 76 static void rtwn_pci_reset_rx_list(struct rtwn_softc *); 77 static void rtwn_pci_free_rx_list(struct rtwn_softc *); 78 static int rtwn_pci_alloc_tx_list(struct rtwn_softc *, int); 79 static void rtwn_pci_reset_tx_ring_stopped(struct rtwn_softc *, int); 80 static void rtwn_pci_reset_beacon_ring(struct rtwn_softc *, int); 81 static void rtwn_pci_reset_tx_list(struct rtwn_softc *, 82 struct ieee80211vap *, int); 83 static void rtwn_pci_free_tx_list(struct rtwn_softc *, int); 84 static void rtwn_pci_reset_lists(struct rtwn_softc *, 85 struct ieee80211vap *); 86 static int rtwn_pci_fw_write_block(struct rtwn_softc *, 87 const uint8_t *, uint16_t, int); 88 static uint16_t rtwn_pci_get_qmap(struct rtwn_softc *); 89 static void rtwn_pci_set_desc_addr(struct rtwn_softc *); 90 static void rtwn_pci_beacon_update_begin(struct rtwn_softc *, 91 struct ieee80211vap *); 92 static void rtwn_pci_beacon_update_end(struct rtwn_softc *, 93 struct ieee80211vap *); 94 static void rtwn_pci_attach_methods(struct rtwn_softc *); 95 96 97 static const struct rtwn_pci_ident * 98 rtwn_pci_probe_sub(device_t dev) 99 { 100 const struct rtwn_pci_ident *ident; 101 int vendor_id, device_id; 102 103 vendor_id = pci_get_vendor(dev); 104 device_id = pci_get_device(dev); 105 106 for (ident = rtwn_pci_ident_table; ident->name != NULL; ident++) 107 if (vendor_id == ident->vendor && device_id == ident->device) 108 return (ident); 109 110 return (NULL); 111 } 112 113 static int 114 rtwn_pci_probe(device_t dev) 115 { 116 const struct rtwn_pci_ident *ident; 117 118 ident = rtwn_pci_probe_sub(dev); 119 if (ident != NULL) { 120 device_set_desc(dev, ident->name); 121 return (BUS_PROBE_DEFAULT); 122 } 123 return (ENXIO); 124 } 125 126 static int 127 rtwn_pci_alloc_rx_list(struct rtwn_softc *sc) 128 { 129 struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc); 130 struct rtwn_rx_ring *rx_ring = &pc->rx_ring; 131 struct rtwn_rx_data *rx_data; 132 bus_size_t size; 133 int i, error; 134 135 /* Allocate Rx descriptors. */ 136 size = sizeof(struct r92ce_rx_stat) * RTWN_PCI_RX_LIST_COUNT; 137 error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, 138 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, 139 size, 1, size, 0, NULL, NULL, &rx_ring->desc_dmat); 140 if (error != 0) { 141 device_printf(sc->sc_dev, "could not create rx desc DMA tag\n"); 142 goto fail; 143 } 144 145 error = bus_dmamem_alloc(rx_ring->desc_dmat, (void **)&rx_ring->desc, 146 BUS_DMA_NOWAIT | BUS_DMA_ZERO | BUS_DMA_COHERENT, 147 &rx_ring->desc_map); 148 if (error != 0) { 149 device_printf(sc->sc_dev, "could not allocate rx desc\n"); 150 goto fail; 151 } 152 error = bus_dmamap_load(rx_ring->desc_dmat, rx_ring->desc_map, 153 rx_ring->desc, size, rtwn_pci_dma_map_addr, &rx_ring->paddr, 0); 154 if (error != 0) { 155 device_printf(sc->sc_dev, "could not load rx desc DMA map\n"); 156 goto fail; 157 } 158 bus_dmamap_sync(rx_ring->desc_dmat, rx_ring->desc_map, 159 BUS_DMASYNC_PREWRITE); 160 161 /* Create RX buffer DMA tag. */ 162 error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, 163 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, 164 MJUMPAGESIZE, 1, MJUMPAGESIZE, 0, NULL, NULL, &rx_ring->data_dmat); 165 if (error != 0) { 166 device_printf(sc->sc_dev, "could not create rx buf DMA tag\n"); 167 goto fail; 168 } 169 170 /* Allocate Rx buffers. */ 171 for (i = 0; i < RTWN_PCI_RX_LIST_COUNT; i++) { 172 rx_data = &rx_ring->rx_data[i]; 173 error = bus_dmamap_create(rx_ring->data_dmat, 0, &rx_data->map); 174 if (error != 0) { 175 device_printf(sc->sc_dev, 176 "could not create rx buf DMA map\n"); 177 goto fail; 178 } 179 180 rx_data->m = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR, 181 MJUMPAGESIZE); 182 if (rx_data->m == NULL) { 183 device_printf(sc->sc_dev, 184 "could not allocate rx mbuf\n"); 185 error = ENOMEM; 186 goto fail; 187 } 188 189 error = bus_dmamap_load(rx_ring->data_dmat, rx_data->map, 190 mtod(rx_data->m, void *), MJUMPAGESIZE, 191 rtwn_pci_dma_map_addr, &rx_data->paddr, BUS_DMA_NOWAIT); 192 if (error != 0) { 193 device_printf(sc->sc_dev, 194 "could not load rx buf DMA map"); 195 goto fail; 196 } 197 198 rtwn_pci_setup_rx_desc(pc, &rx_ring->desc[i], rx_data->paddr, 199 MJUMPAGESIZE, i); 200 } 201 rx_ring->cur = 0; 202 203 return (0); 204 205 fail: 206 rtwn_pci_free_rx_list(sc); 207 return (error); 208 } 209 210 static void 211 rtwn_pci_reset_rx_list(struct rtwn_softc *sc) 212 { 213 struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc); 214 struct rtwn_rx_ring *rx_ring = &pc->rx_ring; 215 struct rtwn_rx_data *rx_data; 216 int i; 217 218 for (i = 0; i < RTWN_PCI_RX_LIST_COUNT; i++) { 219 rx_data = &rx_ring->rx_data[i]; 220 rtwn_pci_setup_rx_desc(pc, &rx_ring->desc[i], 221 rx_data->paddr, MJUMPAGESIZE, i); 222 } 223 rx_ring->cur = 0; 224 } 225 226 static void 227 rtwn_pci_free_rx_list(struct rtwn_softc *sc) 228 { 229 struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc); 230 struct rtwn_rx_ring *rx_ring = &pc->rx_ring; 231 struct rtwn_rx_data *rx_data; 232 int i; 233 234 if (rx_ring->desc_dmat != NULL) { 235 if (rx_ring->desc != NULL) { 236 bus_dmamap_sync(rx_ring->desc_dmat, 237 rx_ring->desc_map, 238 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); 239 bus_dmamap_unload(rx_ring->desc_dmat, 240 rx_ring->desc_map); 241 bus_dmamem_free(rx_ring->desc_dmat, rx_ring->desc, 242 rx_ring->desc_map); 243 rx_ring->desc = NULL; 244 } 245 bus_dma_tag_destroy(rx_ring->desc_dmat); 246 rx_ring->desc_dmat = NULL; 247 } 248 249 for (i = 0; i < RTWN_PCI_RX_LIST_COUNT; i++) { 250 rx_data = &rx_ring->rx_data[i]; 251 252 if (rx_data->m != NULL) { 253 bus_dmamap_sync(rx_ring->data_dmat, 254 rx_data->map, BUS_DMASYNC_POSTREAD); 255 bus_dmamap_unload(rx_ring->data_dmat, rx_data->map); 256 m_freem(rx_data->m); 257 rx_data->m = NULL; 258 } 259 bus_dmamap_destroy(rx_ring->data_dmat, rx_data->map); 260 rx_data->map = NULL; 261 } 262 if (rx_ring->data_dmat != NULL) { 263 bus_dma_tag_destroy(rx_ring->data_dmat); 264 rx_ring->data_dmat = NULL; 265 } 266 } 267 268 static int 269 rtwn_pci_alloc_tx_list(struct rtwn_softc *sc, int qid) 270 { 271 struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc); 272 struct rtwn_tx_ring *tx_ring = &pc->tx_ring[qid]; 273 bus_size_t size; 274 int i, error; 275 276 size = sc->txdesc_len * RTWN_PCI_TX_LIST_COUNT; 277 error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), PAGE_SIZE, 0, 278 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, 279 size, 1, size, 0, NULL, NULL, &tx_ring->desc_dmat); 280 if (error != 0) { 281 device_printf(sc->sc_dev, "could not create tx ring DMA tag\n"); 282 goto fail; 283 } 284 285 error = bus_dmamem_alloc(tx_ring->desc_dmat, &tx_ring->desc, 286 BUS_DMA_NOWAIT | BUS_DMA_ZERO, &tx_ring->desc_map); 287 if (error != 0) { 288 device_printf(sc->sc_dev, "can't map tx ring DMA memory\n"); 289 goto fail; 290 } 291 error = bus_dmamap_load(tx_ring->desc_dmat, tx_ring->desc_map, 292 tx_ring->desc, size, rtwn_pci_dma_map_addr, &tx_ring->paddr, 293 BUS_DMA_NOWAIT); 294 if (error != 0) { 295 device_printf(sc->sc_dev, "could not load desc DMA map\n"); 296 goto fail; 297 } 298 bus_dmamap_sync(tx_ring->desc_dmat, tx_ring->desc_map, 299 BUS_DMASYNC_PREWRITE); 300 301 error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0, 302 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL, 303 MJUMPAGESIZE, 1, MJUMPAGESIZE, 0, NULL, NULL, &tx_ring->data_dmat); 304 if (error != 0) { 305 device_printf(sc->sc_dev, "could not create tx buf DMA tag\n"); 306 goto fail; 307 } 308 309 for (i = 0; i < RTWN_PCI_TX_LIST_COUNT; i++) { 310 struct rtwn_tx_data *tx_data = &tx_ring->tx_data[i]; 311 void *tx_desc = (uint8_t *)tx_ring->desc + sc->txdesc_len * i; 312 uint32_t next_desc_addr = tx_ring->paddr + 313 sc->txdesc_len * ((i + 1) % RTWN_PCI_TX_LIST_COUNT); 314 315 rtwn_pci_setup_tx_desc(pc, tx_desc, next_desc_addr); 316 317 error = bus_dmamap_create(tx_ring->data_dmat, 0, &tx_data->map); 318 if (error != 0) { 319 device_printf(sc->sc_dev, 320 "could not create tx buf DMA map\n"); 321 return (error); 322 } 323 tx_data->m = NULL; 324 tx_data->ni = NULL; 325 } 326 return (0); 327 328 fail: 329 rtwn_pci_free_tx_list(sc, qid); 330 return (error); 331 } 332 333 static void 334 rtwn_pci_reset_tx_ring_stopped(struct rtwn_softc *sc, int qid) 335 { 336 struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc); 337 struct rtwn_tx_ring *ring = &pc->tx_ring[qid]; 338 int i; 339 340 for (i = 0; i < RTWN_PCI_TX_LIST_COUNT; i++) { 341 struct rtwn_tx_data *data = &ring->tx_data[i]; 342 void *desc = (uint8_t *)ring->desc + sc->txdesc_len * i; 343 344 rtwn_pci_copy_tx_desc(pc, desc, NULL); 345 346 if (data->m != NULL) { 347 bus_dmamap_sync(ring->data_dmat, data->map, 348 BUS_DMASYNC_POSTWRITE); 349 bus_dmamap_unload(ring->data_dmat, data->map); 350 m_freem(data->m); 351 data->m = NULL; 352 } 353 if (data->ni != NULL) { 354 ieee80211_free_node(data->ni); 355 data->ni = NULL; 356 } 357 } 358 359 bus_dmamap_sync(ring->desc_dmat, ring->desc_map, 360 BUS_DMASYNC_POSTWRITE); 361 362 sc->qfullmsk &= ~(1 << qid); 363 ring->queued = 0; 364 ring->last = ring->cur = 0; 365 } 366 367 /* 368 * Clear entry 0 (or 1) in the beacon queue (other are not used). 369 */ 370 static void 371 rtwn_pci_reset_beacon_ring(struct rtwn_softc *sc, int id) 372 { 373 struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc); 374 struct rtwn_tx_ring *ring = &pc->tx_ring[RTWN_PCI_BEACON_QUEUE]; 375 struct rtwn_tx_data *data = &ring->tx_data[id]; 376 struct rtwn_tx_desc_common *txd = (struct rtwn_tx_desc_common *) 377 ((uint8_t *)ring->desc + id * sc->txdesc_len); 378 379 bus_dmamap_sync(ring->desc_dmat, ring->desc_map, BUS_DMASYNC_POSTREAD); 380 if (txd->flags0 & RTWN_FLAGS0_OWN) { 381 /* Clear OWN bit. */ 382 txd->flags0 &= ~RTWN_FLAGS0_OWN; 383 bus_dmamap_sync(ring->desc_dmat, ring->desc_map, 384 BUS_DMASYNC_PREWRITE); 385 386 /* Unload mbuf. */ 387 bus_dmamap_sync(ring->data_dmat, data->map, 388 BUS_DMASYNC_POSTWRITE); 389 bus_dmamap_unload(ring->data_dmat, data->map); 390 } 391 } 392 393 /* 394 * Drop stale entries from Tx ring before the vap will be deleted. 395 * In case if vap is NULL just free everything and reset cur / last pointers. 396 */ 397 static void 398 rtwn_pci_reset_tx_list(struct rtwn_softc *sc, struct ieee80211vap *vap, 399 int qid) 400 { 401 int i; 402 403 if (vap == NULL) { 404 if (qid != RTWN_PCI_BEACON_QUEUE) { 405 /* 406 * Device was stopped; just clear all entries. 407 */ 408 rtwn_pci_reset_tx_ring_stopped(sc, qid); 409 } else { 410 for (i = 0; i < RTWN_PORT_COUNT; i++) 411 rtwn_pci_reset_beacon_ring(sc, i); 412 } 413 } else if (qid == RTWN_PCI_BEACON_QUEUE && 414 (vap->iv_opmode == IEEE80211_M_HOSTAP || 415 vap->iv_opmode == IEEE80211_M_IBSS)) { 416 struct rtwn_vap *uvp = RTWN_VAP(vap); 417 418 rtwn_pci_reset_beacon_ring(sc, uvp->id); 419 } else { 420 struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc); 421 struct rtwn_tx_ring *ring = &pc->tx_ring[qid]; 422 423 for (i = 0; i < RTWN_PCI_TX_LIST_COUNT; i++) { 424 struct rtwn_tx_data *data = &ring->tx_data[i]; 425 if (data->ni != NULL && data->ni->ni_vap == vap) { 426 /* 427 * NB: if some vap is still running 428 * rtwn_pci_tx_done() will free the mbuf; 429 * otherwise, rtwn_stop() will reset all rings 430 * after device shutdown. 431 */ 432 ieee80211_free_node(data->ni); 433 data->ni = NULL; 434 } 435 } 436 } 437 } 438 439 static void 440 rtwn_pci_free_tx_list(struct rtwn_softc *sc, int qid) 441 { 442 struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc); 443 struct rtwn_tx_ring *tx_ring = &pc->tx_ring[qid]; 444 struct rtwn_tx_data *tx_data; 445 int i; 446 447 if (tx_ring->desc_dmat != NULL) { 448 if (tx_ring->desc != NULL) { 449 bus_dmamap_sync(tx_ring->desc_dmat, 450 tx_ring->desc_map, BUS_DMASYNC_POSTWRITE); 451 bus_dmamap_unload(tx_ring->desc_dmat, 452 tx_ring->desc_map); 453 bus_dmamem_free(tx_ring->desc_dmat, tx_ring->desc, 454 tx_ring->desc_map); 455 } 456 bus_dma_tag_destroy(tx_ring->desc_dmat); 457 } 458 459 for (i = 0; i < RTWN_PCI_TX_LIST_COUNT; i++) { 460 tx_data = &tx_ring->tx_data[i]; 461 462 if (tx_data->m != NULL) { 463 bus_dmamap_sync(tx_ring->data_dmat, tx_data->map, 464 BUS_DMASYNC_POSTWRITE); 465 bus_dmamap_unload(tx_ring->data_dmat, tx_data->map); 466 m_freem(tx_data->m); 467 tx_data->m = NULL; 468 } 469 } 470 if (tx_ring->data_dmat != NULL) { 471 bus_dma_tag_destroy(tx_ring->data_dmat); 472 tx_ring->data_dmat = NULL; 473 } 474 475 sc->qfullmsk &= ~(1 << qid); 476 tx_ring->queued = 0; 477 tx_ring->last = tx_ring->cur = 0; 478 } 479 480 static void 481 rtwn_pci_reset_lists(struct rtwn_softc *sc, struct ieee80211vap *vap) 482 { 483 int i; 484 485 for (i = 0; i < RTWN_PCI_NTXQUEUES; i++) 486 rtwn_pci_reset_tx_list(sc, vap, i); 487 488 if (vap == NULL) { 489 sc->qfullmsk = 0; 490 rtwn_pci_reset_rx_list(sc); 491 } 492 } 493 494 static int 495 rtwn_pci_fw_write_block(struct rtwn_softc *sc, const uint8_t *buf, 496 uint16_t reg, int mlen) 497 { 498 int i; 499 500 for (i = 0; i < mlen; i++) 501 rtwn_pci_write_1(sc, reg++, buf[i]); 502 503 /* NB: cannot fail */ 504 return (0); 505 } 506 507 static uint16_t 508 rtwn_pci_get_qmap(struct rtwn_softc *sc) 509 { 510 struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc); 511 512 KASSERT(pc->pc_qmap != 0, ("%s: qmap is not set!\n", __func__)); 513 514 return (pc->pc_qmap); 515 } 516 517 static void 518 rtwn_pci_set_desc_addr(struct rtwn_softc *sc) 519 { 520 struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc); 521 522 RTWN_DPRINTF(sc, RTWN_DEBUG_RESET, "%s: addresses:\n" 523 "bk: %08jX, be: %08jX, vi: %08jX, vo: %08jX\n" 524 "bcn: %08jX, mgt: %08jX, high: %08jX, rx: %08jX\n", 525 __func__, (uintmax_t)pc->tx_ring[RTWN_PCI_BK_QUEUE].paddr, 526 (uintmax_t)pc->tx_ring[RTWN_PCI_BE_QUEUE].paddr, 527 (uintmax_t)pc->tx_ring[RTWN_PCI_VI_QUEUE].paddr, 528 (uintmax_t)pc->tx_ring[RTWN_PCI_VO_QUEUE].paddr, 529 (uintmax_t)pc->tx_ring[RTWN_PCI_BEACON_QUEUE].paddr, 530 (uintmax_t)pc->tx_ring[RTWN_PCI_MGNT_QUEUE].paddr, 531 (uintmax_t)pc->tx_ring[RTWN_PCI_HIGH_QUEUE].paddr, 532 (uintmax_t)pc->rx_ring.paddr); 533 534 /* Set Tx Configuration Register. */ 535 rtwn_pci_write_4(sc, R92C_TCR, pc->tcr); 536 537 /* Configure Tx DMA. */ 538 rtwn_pci_write_4(sc, R92C_BKQ_DESA, 539 pc->tx_ring[RTWN_PCI_BK_QUEUE].paddr); 540 rtwn_pci_write_4(sc, R92C_BEQ_DESA, 541 pc->tx_ring[RTWN_PCI_BE_QUEUE].paddr); 542 rtwn_pci_write_4(sc, R92C_VIQ_DESA, 543 pc->tx_ring[RTWN_PCI_VI_QUEUE].paddr); 544 rtwn_pci_write_4(sc, R92C_VOQ_DESA, 545 pc->tx_ring[RTWN_PCI_VO_QUEUE].paddr); 546 rtwn_pci_write_4(sc, R92C_BCNQ_DESA, 547 pc->tx_ring[RTWN_PCI_BEACON_QUEUE].paddr); 548 rtwn_pci_write_4(sc, R92C_MGQ_DESA, 549 pc->tx_ring[RTWN_PCI_MGNT_QUEUE].paddr); 550 rtwn_pci_write_4(sc, R92C_HQ_DESA, 551 pc->tx_ring[RTWN_PCI_HIGH_QUEUE].paddr); 552 553 /* Configure Rx DMA. */ 554 rtwn_pci_write_4(sc, R92C_RX_DESA, pc->rx_ring.paddr); 555 } 556 557 static void 558 rtwn_pci_beacon_update_begin(struct rtwn_softc *sc, struct ieee80211vap *vap) 559 { 560 struct rtwn_vap *rvp = RTWN_VAP(vap); 561 562 RTWN_ASSERT_LOCKED(sc); 563 564 rtwn_beacon_enable(sc, rvp->id, 0); 565 } 566 567 static void 568 rtwn_pci_beacon_update_end(struct rtwn_softc *sc, struct ieee80211vap *vap) 569 { 570 struct rtwn_vap *rvp = RTWN_VAP(vap); 571 572 RTWN_ASSERT_LOCKED(sc); 573 574 if (rvp->curr_mode != R92C_MSR_NOLINK) 575 rtwn_beacon_enable(sc, rvp->id, 1); 576 } 577 578 static void 579 rtwn_pci_attach_methods(struct rtwn_softc *sc) 580 { 581 sc->sc_write_1 = rtwn_pci_write_1; 582 sc->sc_write_2 = rtwn_pci_write_2; 583 sc->sc_write_4 = rtwn_pci_write_4; 584 sc->sc_read_1 = rtwn_pci_read_1; 585 sc->sc_read_2 = rtwn_pci_read_2; 586 sc->sc_read_4 = rtwn_pci_read_4; 587 sc->sc_delay = rtwn_pci_delay; 588 sc->sc_tx_start = rtwn_pci_tx_start; 589 sc->sc_reset_lists = rtwn_pci_reset_lists; 590 sc->sc_abort_xfers = rtwn_nop_softc; 591 sc->sc_fw_write_block = rtwn_pci_fw_write_block; 592 sc->sc_get_qmap = rtwn_pci_get_qmap; 593 sc->sc_set_desc_addr = rtwn_pci_set_desc_addr; 594 sc->sc_drop_incorrect_tx = rtwn_nop_softc; 595 sc->sc_beacon_update_begin = rtwn_pci_beacon_update_begin; 596 sc->sc_beacon_update_end = rtwn_pci_beacon_update_end; 597 sc->sc_beacon_unload = rtwn_pci_reset_beacon_ring; 598 599 sc->bcn_check_interval = 25000; 600 } 601 602 static int 603 rtwn_pci_attach(device_t dev) 604 { 605 const struct rtwn_pci_ident *ident; 606 struct rtwn_pci_softc *pc = device_get_softc(dev); 607 struct rtwn_softc *sc = &pc->pc_sc; 608 struct ieee80211com *ic = &sc->sc_ic; 609 uint32_t lcsr; 610 int cap_off, i, error, rid; 611 612 ident = rtwn_pci_probe_sub(dev); 613 if (ident == NULL) 614 return (ENXIO); 615 616 /* 617 * Get the offset of the PCI Express Capability Structure in PCI 618 * Configuration Space. 619 */ 620 error = pci_find_cap(dev, PCIY_EXPRESS, &cap_off); 621 if (error != 0) { 622 device_printf(dev, "PCIe capability structure not found!\n"); 623 return (error); 624 } 625 626 /* Enable bus-mastering. */ 627 pci_enable_busmaster(dev); 628 629 rid = PCIR_BAR(2); 630 pc->mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid, 631 RF_ACTIVE); 632 if (pc->mem == NULL) { 633 device_printf(dev, "can't map mem space\n"); 634 return (ENOMEM); 635 } 636 pc->pc_st = rman_get_bustag(pc->mem); 637 pc->pc_sh = rman_get_bushandle(pc->mem); 638 639 /* Install interrupt handler. */ 640 rid = 1; 641 if (pci_alloc_msi(dev, &rid) == 0) 642 rid = 1; 643 else 644 rid = 0; 645 pc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE | 646 (rid != 0 ? 0 : RF_SHAREABLE)); 647 if (pc->irq == NULL) { 648 device_printf(dev, "can't map interrupt\n"); 649 goto detach; 650 } 651 652 /* Disable PCIe Active State Power Management (ASPM). */ 653 lcsr = pci_read_config(dev, cap_off + PCIER_LINK_CTL, 4); 654 lcsr &= ~PCIEM_LINK_CTL_ASPMC; 655 pci_write_config(dev, cap_off + PCIER_LINK_CTL, lcsr, 4); 656 657 sc->sc_dev = dev; 658 ic->ic_name = device_get_nameunit(dev); 659 660 /* Need to be initialized early. */ 661 rtwn_sysctlattach(sc); 662 mtx_init(&sc->sc_mtx, ic->ic_name, MTX_NETWORK_LOCK, MTX_DEF); 663 664 rtwn_pci_attach_methods(sc); 665 rtwn_pci_attach_private(pc, ident->chip); 666 667 /* Allocate Tx/Rx buffers. */ 668 error = rtwn_pci_alloc_rx_list(sc); 669 if (error != 0) { 670 device_printf(dev, 671 "could not allocate Rx buffers, error %d\n", 672 error); 673 goto detach; 674 } 675 for (i = 0; i < RTWN_PCI_NTXQUEUES; i++) { 676 error = rtwn_pci_alloc_tx_list(sc, i); 677 if (error != 0) { 678 device_printf(dev, 679 "could not allocate Tx buffers, error %d\n", 680 error); 681 goto detach; 682 } 683 } 684 685 /* Generic attach. */ 686 error = rtwn_attach(sc); 687 if (error != 0) 688 goto detach; 689 690 /* 691 * Hook our interrupt after all initialization is complete. 692 */ 693 error = bus_setup_intr(dev, pc->irq, INTR_TYPE_NET | INTR_MPSAFE, 694 NULL, rtwn_pci_intr, sc, &pc->pc_ih); 695 if (error != 0) { 696 device_printf(dev, "can't establish interrupt, error %d\n", 697 error); 698 goto detach; 699 } 700 701 return (0); 702 703 detach: 704 rtwn_pci_detach(dev); /* failure */ 705 return (ENXIO); 706 } 707 708 static int 709 rtwn_pci_detach(device_t dev) 710 { 711 struct rtwn_pci_softc *pc = device_get_softc(dev); 712 struct rtwn_softc *sc = &pc->pc_sc; 713 int i; 714 715 /* Generic detach. */ 716 rtwn_detach(sc); 717 718 /* Uninstall interrupt handler. */ 719 if (pc->irq != NULL) { 720 bus_teardown_intr(dev, pc->irq, pc->pc_ih); 721 bus_release_resource(dev, SYS_RES_IRQ, rman_get_rid(pc->irq), 722 pc->irq); 723 pci_release_msi(dev); 724 } 725 726 /* Free Tx/Rx buffers. */ 727 for (i = 0; i < RTWN_PCI_NTXQUEUES; i++) 728 rtwn_pci_free_tx_list(sc, i); 729 rtwn_pci_free_rx_list(sc); 730 731 if (pc->mem != NULL) 732 bus_release_resource(dev, SYS_RES_MEMORY, 733 rman_get_rid(pc->mem), pc->mem); 734 735 rtwn_detach_private(sc); 736 mtx_destroy(&sc->sc_mtx); 737 738 return (0); 739 } 740 741 static int 742 rtwn_pci_shutdown(device_t self) 743 { 744 struct rtwn_pci_softc *pc = device_get_softc(self); 745 746 ieee80211_stop_all(&pc->pc_sc.sc_ic); 747 return (0); 748 } 749 750 static int 751 rtwn_pci_suspend(device_t self) 752 { 753 struct rtwn_pci_softc *pc = device_get_softc(self); 754 755 rtwn_suspend(&pc->pc_sc); 756 757 return (0); 758 } 759 760 static int 761 rtwn_pci_resume(device_t self) 762 { 763 struct rtwn_pci_softc *pc = device_get_softc(self); 764 765 rtwn_resume(&pc->pc_sc); 766 767 return (0); 768 } 769 770 static device_method_t rtwn_pci_methods[] = { 771 /* Device interface */ 772 DEVMETHOD(device_probe, rtwn_pci_probe), 773 DEVMETHOD(device_attach, rtwn_pci_attach), 774 DEVMETHOD(device_detach, rtwn_pci_detach), 775 DEVMETHOD(device_shutdown, rtwn_pci_shutdown), 776 DEVMETHOD(device_suspend, rtwn_pci_suspend), 777 DEVMETHOD(device_resume, rtwn_pci_resume), 778 779 DEVMETHOD_END 780 }; 781 782 static driver_t rtwn_pci_driver = { 783 "rtwn", 784 rtwn_pci_methods, 785 sizeof(struct rtwn_pci_softc) 786 }; 787 788 static devclass_t rtwn_pci_devclass; 789 790 DRIVER_MODULE(rtwn_pci, pci, rtwn_pci_driver, rtwn_pci_devclass, NULL, NULL); 791 MODULE_VERSION(rtwn_pci, 1); 792 MODULE_DEPEND(rtwn_pci, pci, 1, 1, 1); 793 MODULE_DEPEND(rtwn_pci, wlan, 1, 1, 1); 794 MODULE_DEPEND(rtwn_pci, rtwn, 2, 2, 2); 795