1 /* $OpenBSD: if_urtwn.c,v 1.16 2011/02/10 17:26:40 jakemsr Exp $ */
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>
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.
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.
21 #include <sys/cdefs.h>
22 __FBSDID("$FreeBSD$");
24 #include <sys/param.h>
25 #include <sys/sysctl.h>
27 #include <sys/mutex.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>
35 #include <sys/endian.h>
36 #include <sys/linker.h>
39 #include <machine/bus.h>
40 #include <machine/resource.h>
43 #include <dev/pci/pcireg.h>
44 #include <dev/pci/pcivar.h>
47 #include <net/ethernet.h>
48 #include <net/if_media.h>
50 #include <net80211/ieee80211_var.h>
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>
57 #include <dev/rtwn/pci/rtwn_pci_var.h>
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>
64 #include <dev/rtwn/rtl8192c/pci/r92ce_reg.h>
66 static device_probe_t rtwn_pci_probe;
67 static device_attach_t rtwn_pci_attach;
68 static device_detach_t rtwn_pci_detach;
69 static device_shutdown_t rtwn_pci_shutdown;
70 static device_suspend_t rtwn_pci_suspend;
71 static device_resume_t rtwn_pci_resume;
73 static int rtwn_pci_alloc_rx_list(struct rtwn_softc *);
74 static void rtwn_pci_reset_rx_list(struct rtwn_softc *);
75 static void rtwn_pci_free_rx_list(struct rtwn_softc *);
76 static int rtwn_pci_alloc_tx_list(struct rtwn_softc *, int);
77 static void rtwn_pci_reset_tx_ring_stopped(struct rtwn_softc *, int);
78 static void rtwn_pci_reset_beacon_ring(struct rtwn_softc *, int);
79 static void rtwn_pci_reset_tx_list(struct rtwn_softc *,
80 struct ieee80211vap *, int);
81 static void rtwn_pci_free_tx_list(struct rtwn_softc *, int);
82 static void rtwn_pci_reset_lists(struct rtwn_softc *,
83 struct ieee80211vap *);
84 static int rtwn_pci_fw_write_block(struct rtwn_softc *,
85 const uint8_t *, uint16_t, int);
86 static uint16_t rtwn_pci_get_qmap(struct rtwn_softc *);
87 static void rtwn_pci_set_desc_addr(struct rtwn_softc *);
88 static void rtwn_pci_beacon_update_begin(struct rtwn_softc *,
89 struct ieee80211vap *);
90 static void rtwn_pci_beacon_update_end(struct rtwn_softc *,
91 struct ieee80211vap *);
92 static void rtwn_pci_attach_methods(struct rtwn_softc *);
94 static const struct rtwn_pci_ident *
95 rtwn_pci_probe_sub(device_t dev)
97 int i, vendor_id, device_id;
99 vendor_id = pci_get_vendor(dev);
100 device_id = pci_get_device(dev);
102 for (i = 0; i < nitems(rtwn_pci_ident_table); i++) {
103 if (vendor_id == rtwn_pci_ident_table[i].vendor &&
104 device_id == rtwn_pci_ident_table[i].device)
105 return (&rtwn_pci_ident_table[i]);
112 rtwn_pci_probe(device_t dev)
114 const struct rtwn_pci_ident *ident;
116 ident = rtwn_pci_probe_sub(dev);
118 device_set_desc(dev, ident->name);
119 return (BUS_PROBE_DEFAULT);
125 rtwn_pci_alloc_rx_list(struct rtwn_softc *sc)
127 struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc);
128 struct rtwn_rx_ring *rx_ring = &pc->rx_ring;
129 struct rtwn_rx_data *rx_data;
133 /* Allocate Rx descriptors. */
134 size = sizeof(struct rtwn_rx_stat_pci) * RTWN_PCI_RX_LIST_COUNT;
135 error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0,
136 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
137 size, 1, size, 0, NULL, NULL, &rx_ring->desc_dmat);
139 device_printf(sc->sc_dev, "could not create rx desc DMA tag\n");
143 error = bus_dmamem_alloc(rx_ring->desc_dmat, (void **)&rx_ring->desc,
144 BUS_DMA_NOWAIT | BUS_DMA_ZERO | BUS_DMA_COHERENT,
147 device_printf(sc->sc_dev, "could not allocate rx desc\n");
150 error = bus_dmamap_load(rx_ring->desc_dmat, rx_ring->desc_map,
151 rx_ring->desc, size, rtwn_pci_dma_map_addr, &rx_ring->paddr, 0);
153 device_printf(sc->sc_dev, "could not load rx desc DMA map\n");
156 bus_dmamap_sync(rx_ring->desc_dmat, rx_ring->desc_map,
157 BUS_DMASYNC_PREWRITE);
159 /* Create RX buffer DMA tag. */
160 error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0,
161 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
162 MJUMPAGESIZE, 1, MJUMPAGESIZE, 0, NULL, NULL, &rx_ring->data_dmat);
164 device_printf(sc->sc_dev, "could not create rx buf DMA tag\n");
168 /* Allocate Rx buffers. */
169 for (i = 0; i < RTWN_PCI_RX_LIST_COUNT; i++) {
170 rx_data = &rx_ring->rx_data[i];
171 error = bus_dmamap_create(rx_ring->data_dmat, 0, &rx_data->map);
173 device_printf(sc->sc_dev,
174 "could not create rx buf DMA map\n");
178 rx_data->m = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR,
180 if (rx_data->m == NULL) {
181 device_printf(sc->sc_dev,
182 "could not allocate rx mbuf\n");
187 error = bus_dmamap_load(rx_ring->data_dmat, rx_data->map,
188 mtod(rx_data->m, void *), MJUMPAGESIZE,
189 rtwn_pci_dma_map_addr, &rx_data->paddr, BUS_DMA_NOWAIT);
191 device_printf(sc->sc_dev,
192 "could not load rx buf DMA map");
196 rtwn_pci_setup_rx_desc(pc, &rx_ring->desc[i], rx_data->paddr,
204 rtwn_pci_free_rx_list(sc);
209 rtwn_pci_reset_rx_list(struct rtwn_softc *sc)
211 struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc);
212 struct rtwn_rx_ring *rx_ring = &pc->rx_ring;
213 struct rtwn_rx_data *rx_data;
216 for (i = 0; i < RTWN_PCI_RX_LIST_COUNT; i++) {
217 rx_data = &rx_ring->rx_data[i];
218 rtwn_pci_setup_rx_desc(pc, &rx_ring->desc[i],
219 rx_data->paddr, MJUMPAGESIZE, i);
225 rtwn_pci_free_rx_list(struct rtwn_softc *sc)
227 struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc);
228 struct rtwn_rx_ring *rx_ring = &pc->rx_ring;
229 struct rtwn_rx_data *rx_data;
232 if (rx_ring->desc_dmat != NULL) {
233 if (rx_ring->desc != NULL) {
234 bus_dmamap_sync(rx_ring->desc_dmat,
236 BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
237 bus_dmamap_unload(rx_ring->desc_dmat,
239 bus_dmamem_free(rx_ring->desc_dmat, rx_ring->desc,
241 rx_ring->desc = NULL;
243 bus_dma_tag_destroy(rx_ring->desc_dmat);
244 rx_ring->desc_dmat = NULL;
247 for (i = 0; i < RTWN_PCI_RX_LIST_COUNT; i++) {
248 rx_data = &rx_ring->rx_data[i];
250 if (rx_data->m != NULL) {
251 bus_dmamap_sync(rx_ring->data_dmat,
252 rx_data->map, BUS_DMASYNC_POSTREAD);
253 bus_dmamap_unload(rx_ring->data_dmat, rx_data->map);
257 bus_dmamap_destroy(rx_ring->data_dmat, rx_data->map);
260 if (rx_ring->data_dmat != NULL) {
261 bus_dma_tag_destroy(rx_ring->data_dmat);
262 rx_ring->data_dmat = NULL;
267 rtwn_pci_alloc_tx_list(struct rtwn_softc *sc, int qid)
269 struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc);
270 struct rtwn_tx_ring *tx_ring = &pc->tx_ring[qid];
274 size = sc->txdesc_len * RTWN_PCI_TX_LIST_COUNT;
275 error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), PAGE_SIZE, 0,
276 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
277 size, 1, size, 0, NULL, NULL, &tx_ring->desc_dmat);
279 device_printf(sc->sc_dev, "could not create tx ring DMA tag\n");
283 error = bus_dmamem_alloc(tx_ring->desc_dmat, &tx_ring->desc,
284 BUS_DMA_NOWAIT | BUS_DMA_ZERO, &tx_ring->desc_map);
286 device_printf(sc->sc_dev, "can't map tx ring DMA memory\n");
289 error = bus_dmamap_load(tx_ring->desc_dmat, tx_ring->desc_map,
290 tx_ring->desc, size, rtwn_pci_dma_map_addr, &tx_ring->paddr,
293 device_printf(sc->sc_dev, "could not load desc DMA map\n");
296 bus_dmamap_sync(tx_ring->desc_dmat, tx_ring->desc_map,
297 BUS_DMASYNC_PREWRITE);
299 error = bus_dma_tag_create(bus_get_dma_tag(sc->sc_dev), 1, 0,
300 BUS_SPACE_MAXADDR_32BIT, BUS_SPACE_MAXADDR, NULL, NULL,
301 MJUMPAGESIZE, 1, MJUMPAGESIZE, 0, NULL, NULL, &tx_ring->data_dmat);
303 device_printf(sc->sc_dev, "could not create tx buf DMA tag\n");
307 for (i = 0; i < RTWN_PCI_TX_LIST_COUNT; i++) {
308 struct rtwn_tx_data *tx_data = &tx_ring->tx_data[i];
309 void *tx_desc = (uint8_t *)tx_ring->desc + sc->txdesc_len * i;
310 uint32_t next_desc_addr = tx_ring->paddr +
311 sc->txdesc_len * ((i + 1) % RTWN_PCI_TX_LIST_COUNT);
313 rtwn_pci_setup_tx_desc(pc, tx_desc, next_desc_addr);
315 error = bus_dmamap_create(tx_ring->data_dmat, 0, &tx_data->map);
317 device_printf(sc->sc_dev,
318 "could not create tx buf DMA map\n");
327 rtwn_pci_free_tx_list(sc, qid);
332 rtwn_pci_reset_tx_ring_stopped(struct rtwn_softc *sc, int qid)
334 struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc);
335 struct rtwn_tx_ring *ring = &pc->tx_ring[qid];
338 for (i = 0; i < RTWN_PCI_TX_LIST_COUNT; i++) {
339 struct rtwn_tx_data *data = &ring->tx_data[i];
340 void *desc = (uint8_t *)ring->desc + sc->txdesc_len * i;
342 rtwn_pci_copy_tx_desc(pc, desc, NULL);
344 if (data->m != NULL) {
345 bus_dmamap_sync(ring->data_dmat, data->map,
346 BUS_DMASYNC_POSTWRITE);
347 bus_dmamap_unload(ring->data_dmat, data->map);
351 if (data->ni != NULL) {
352 ieee80211_free_node(data->ni);
357 bus_dmamap_sync(ring->desc_dmat, ring->desc_map,
358 BUS_DMASYNC_POSTWRITE);
360 sc->qfullmsk &= ~(1 << qid);
362 ring->last = ring->cur = 0;
366 * Clear entry 0 (or 1) in the beacon queue (other are not used).
369 rtwn_pci_reset_beacon_ring(struct rtwn_softc *sc, int id)
371 struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc);
372 struct rtwn_tx_ring *ring = &pc->tx_ring[RTWN_PCI_BEACON_QUEUE];
373 struct rtwn_tx_data *data = &ring->tx_data[id];
374 struct rtwn_tx_desc_common *txd = (struct rtwn_tx_desc_common *)
375 ((uint8_t *)ring->desc + id * sc->txdesc_len);
377 bus_dmamap_sync(ring->desc_dmat, ring->desc_map, BUS_DMASYNC_POSTREAD);
378 if (txd->flags0 & RTWN_FLAGS0_OWN) {
380 txd->flags0 &= ~RTWN_FLAGS0_OWN;
381 bus_dmamap_sync(ring->desc_dmat, ring->desc_map,
382 BUS_DMASYNC_PREWRITE);
385 bus_dmamap_sync(ring->data_dmat, data->map,
386 BUS_DMASYNC_POSTWRITE);
387 bus_dmamap_unload(ring->data_dmat, data->map);
392 * Drop stale entries from Tx ring before the vap will be deleted.
393 * In case if vap is NULL just free everything and reset cur / last pointers.
396 rtwn_pci_reset_tx_list(struct rtwn_softc *sc, struct ieee80211vap *vap,
402 if (qid != RTWN_PCI_BEACON_QUEUE) {
404 * Device was stopped; just clear all entries.
406 rtwn_pci_reset_tx_ring_stopped(sc, qid);
408 for (i = 0; i < RTWN_PORT_COUNT; i++)
409 rtwn_pci_reset_beacon_ring(sc, i);
411 } else if (qid == RTWN_PCI_BEACON_QUEUE &&
412 (vap->iv_opmode == IEEE80211_M_HOSTAP ||
413 vap->iv_opmode == IEEE80211_M_IBSS)) {
414 struct rtwn_vap *uvp = RTWN_VAP(vap);
416 rtwn_pci_reset_beacon_ring(sc, uvp->id);
418 struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc);
419 struct rtwn_tx_ring *ring = &pc->tx_ring[qid];
421 for (i = 0; i < RTWN_PCI_TX_LIST_COUNT; i++) {
422 struct rtwn_tx_data *data = &ring->tx_data[i];
423 if (data->ni != NULL && data->ni->ni_vap == vap) {
425 * NB: if some vap is still running
426 * rtwn_pci_tx_done() will free the mbuf;
427 * otherwise, rtwn_stop() will reset all rings
428 * after device shutdown.
430 ieee80211_free_node(data->ni);
438 rtwn_pci_free_tx_list(struct rtwn_softc *sc, int qid)
440 struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc);
441 struct rtwn_tx_ring *tx_ring = &pc->tx_ring[qid];
442 struct rtwn_tx_data *tx_data;
445 if (tx_ring->desc_dmat != NULL) {
446 if (tx_ring->desc != NULL) {
447 bus_dmamap_sync(tx_ring->desc_dmat,
448 tx_ring->desc_map, BUS_DMASYNC_POSTWRITE);
449 bus_dmamap_unload(tx_ring->desc_dmat,
451 bus_dmamem_free(tx_ring->desc_dmat, tx_ring->desc,
454 bus_dma_tag_destroy(tx_ring->desc_dmat);
457 for (i = 0; i < RTWN_PCI_TX_LIST_COUNT; i++) {
458 tx_data = &tx_ring->tx_data[i];
460 if (tx_data->m != NULL) {
461 bus_dmamap_sync(tx_ring->data_dmat, tx_data->map,
462 BUS_DMASYNC_POSTWRITE);
463 bus_dmamap_unload(tx_ring->data_dmat, tx_data->map);
468 if (tx_ring->data_dmat != NULL) {
469 bus_dma_tag_destroy(tx_ring->data_dmat);
470 tx_ring->data_dmat = NULL;
473 sc->qfullmsk &= ~(1 << qid);
475 tx_ring->last = tx_ring->cur = 0;
479 rtwn_pci_reset_lists(struct rtwn_softc *sc, struct ieee80211vap *vap)
483 for (i = 0; i < RTWN_PCI_NTXQUEUES; i++)
484 rtwn_pci_reset_tx_list(sc, vap, i);
488 rtwn_pci_reset_rx_list(sc);
493 rtwn_pci_fw_write_block(struct rtwn_softc *sc, const uint8_t *buf,
494 uint16_t reg, int mlen)
498 for (i = 0; i < mlen; i++)
499 rtwn_pci_write_1(sc, reg++, buf[i]);
501 /* NB: cannot fail */
506 rtwn_pci_get_qmap(struct rtwn_softc *sc)
508 struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc);
510 KASSERT(pc->pc_qmap != 0, ("%s: qmap is not set!\n", __func__));
512 return (pc->pc_qmap);
516 rtwn_pci_set_desc_addr(struct rtwn_softc *sc)
518 struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc);
520 RTWN_DPRINTF(sc, RTWN_DEBUG_RESET, "%s: addresses:\n"
521 "bk: %08jX, be: %08jX, vi: %08jX, vo: %08jX\n"
522 "bcn: %08jX, mgt: %08jX, high: %08jX, rx: %08jX\n",
523 __func__, (uintmax_t)pc->tx_ring[RTWN_PCI_BK_QUEUE].paddr,
524 (uintmax_t)pc->tx_ring[RTWN_PCI_BE_QUEUE].paddr,
525 (uintmax_t)pc->tx_ring[RTWN_PCI_VI_QUEUE].paddr,
526 (uintmax_t)pc->tx_ring[RTWN_PCI_VO_QUEUE].paddr,
527 (uintmax_t)pc->tx_ring[RTWN_PCI_BEACON_QUEUE].paddr,
528 (uintmax_t)pc->tx_ring[RTWN_PCI_MGNT_QUEUE].paddr,
529 (uintmax_t)pc->tx_ring[RTWN_PCI_HIGH_QUEUE].paddr,
530 (uintmax_t)pc->rx_ring.paddr);
532 /* Set Tx Configuration Register. */
533 rtwn_pci_write_4(sc, R92C_TCR, pc->tcr);
535 /* Configure Tx DMA. */
536 rtwn_pci_write_4(sc, R92C_BKQ_DESA,
537 pc->tx_ring[RTWN_PCI_BK_QUEUE].paddr);
538 rtwn_pci_write_4(sc, R92C_BEQ_DESA,
539 pc->tx_ring[RTWN_PCI_BE_QUEUE].paddr);
540 rtwn_pci_write_4(sc, R92C_VIQ_DESA,
541 pc->tx_ring[RTWN_PCI_VI_QUEUE].paddr);
542 rtwn_pci_write_4(sc, R92C_VOQ_DESA,
543 pc->tx_ring[RTWN_PCI_VO_QUEUE].paddr);
544 rtwn_pci_write_4(sc, R92C_BCNQ_DESA,
545 pc->tx_ring[RTWN_PCI_BEACON_QUEUE].paddr);
546 rtwn_pci_write_4(sc, R92C_MGQ_DESA,
547 pc->tx_ring[RTWN_PCI_MGNT_QUEUE].paddr);
548 rtwn_pci_write_4(sc, R92C_HQ_DESA,
549 pc->tx_ring[RTWN_PCI_HIGH_QUEUE].paddr);
551 /* Configure Rx DMA. */
552 rtwn_pci_write_4(sc, R92C_RX_DESA, pc->rx_ring.paddr);
556 rtwn_pci_beacon_update_begin(struct rtwn_softc *sc, struct ieee80211vap *vap)
558 struct rtwn_vap *rvp = RTWN_VAP(vap);
560 RTWN_ASSERT_LOCKED(sc);
562 rtwn_beacon_enable(sc, rvp->id, 0);
566 rtwn_pci_beacon_update_end(struct rtwn_softc *sc, struct ieee80211vap *vap)
568 struct rtwn_vap *rvp = RTWN_VAP(vap);
570 RTWN_ASSERT_LOCKED(sc);
572 if (rvp->curr_mode != R92C_MSR_NOLINK)
573 rtwn_beacon_enable(sc, rvp->id, 1);
577 rtwn_pci_attach_methods(struct rtwn_softc *sc)
579 sc->sc_write_1 = rtwn_pci_write_1;
580 sc->sc_write_2 = rtwn_pci_write_2;
581 sc->sc_write_4 = rtwn_pci_write_4;
582 sc->sc_read_1 = rtwn_pci_read_1;
583 sc->sc_read_2 = rtwn_pci_read_2;
584 sc->sc_read_4 = rtwn_pci_read_4;
585 sc->sc_delay = rtwn_pci_delay;
586 sc->sc_tx_start = rtwn_pci_tx_start;
587 sc->sc_reset_lists = rtwn_pci_reset_lists;
588 sc->sc_abort_xfers = rtwn_nop_softc;
589 sc->sc_fw_write_block = rtwn_pci_fw_write_block;
590 sc->sc_get_qmap = rtwn_pci_get_qmap;
591 sc->sc_set_desc_addr = rtwn_pci_set_desc_addr;
592 sc->sc_drop_incorrect_tx = rtwn_nop_softc;
593 sc->sc_beacon_update_begin = rtwn_pci_beacon_update_begin;
594 sc->sc_beacon_update_end = rtwn_pci_beacon_update_end;
595 sc->sc_beacon_unload = rtwn_pci_reset_beacon_ring;
597 sc->bcn_check_interval = 25000;
601 rtwn_pci_attach(device_t dev)
603 const struct rtwn_pci_ident *ident;
604 struct rtwn_pci_softc *pc = device_get_softc(dev);
605 struct rtwn_softc *sc = &pc->pc_sc;
606 struct ieee80211com *ic = &sc->sc_ic;
608 int cap_off, i, error, rid;
610 ident = rtwn_pci_probe_sub(dev);
615 * Get the offset of the PCI Express Capability Structure in PCI
616 * Configuration Space.
618 error = pci_find_cap(dev, PCIY_EXPRESS, &cap_off);
620 device_printf(dev, "PCIe capability structure not found!\n");
624 /* Enable bus-mastering. */
625 pci_enable_busmaster(dev);
628 pc->mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
630 if (pc->mem == NULL) {
631 device_printf(dev, "can't map mem space\n");
634 pc->pc_st = rman_get_bustag(pc->mem);
635 pc->pc_sh = rman_get_bushandle(pc->mem);
637 /* Install interrupt handler. */
639 if (pci_alloc_msi(dev, &rid) == 0)
643 pc->irq = bus_alloc_resource_any(dev, SYS_RES_IRQ, &rid, RF_ACTIVE |
644 (rid != 0 ? 0 : RF_SHAREABLE));
645 if (pc->irq == NULL) {
646 device_printf(dev, "can't map interrupt\n");
650 /* Disable PCIe Active State Power Management (ASPM). */
651 lcsr = pci_read_config(dev, cap_off + PCIER_LINK_CTL, 4);
652 lcsr &= ~PCIEM_LINK_CTL_ASPMC;
653 pci_write_config(dev, cap_off + PCIER_LINK_CTL, lcsr, 4);
656 ic->ic_name = device_get_nameunit(dev);
658 /* Need to be initialized early. */
659 rtwn_sysctlattach(sc);
660 mtx_init(&sc->sc_mtx, ic->ic_name, MTX_NETWORK_LOCK, MTX_DEF);
662 rtwn_pci_attach_methods(sc);
663 rtwn_pci_attach_private(pc, ident->chip);
665 /* Allocate Tx/Rx buffers. */
666 error = rtwn_pci_alloc_rx_list(sc);
669 "could not allocate Rx buffers, error %d\n",
673 for (i = 0; i < RTWN_PCI_NTXQUEUES; i++) {
674 error = rtwn_pci_alloc_tx_list(sc, i);
677 "could not allocate Tx buffers, error %d\n",
683 /* Generic attach. */
684 error = rtwn_attach(sc);
689 * Hook our interrupt after all initialization is complete.
691 error = bus_setup_intr(dev, pc->irq, INTR_TYPE_NET | INTR_MPSAFE,
692 NULL, rtwn_pci_intr, sc, &pc->pc_ih);
694 device_printf(dev, "can't establish interrupt, error %d\n",
702 rtwn_pci_detach(dev); /* failure */
707 rtwn_pci_detach(device_t dev)
709 struct rtwn_pci_softc *pc = device_get_softc(dev);
710 struct rtwn_softc *sc = &pc->pc_sc;
713 /* Generic detach. */
716 /* Uninstall interrupt handler. */
717 if (pc->irq != NULL) {
718 bus_teardown_intr(dev, pc->irq, pc->pc_ih);
719 bus_release_resource(dev, SYS_RES_IRQ, rman_get_rid(pc->irq),
721 pci_release_msi(dev);
724 /* Free Tx/Rx buffers. */
725 for (i = 0; i < RTWN_PCI_NTXQUEUES; i++)
726 rtwn_pci_free_tx_list(sc, i);
727 rtwn_pci_free_rx_list(sc);
730 bus_release_resource(dev, SYS_RES_MEMORY,
731 rman_get_rid(pc->mem), pc->mem);
733 rtwn_detach_private(sc);
734 mtx_destroy(&sc->sc_mtx);
740 rtwn_pci_shutdown(device_t self)
742 struct rtwn_pci_softc *pc = device_get_softc(self);
744 ieee80211_stop_all(&pc->pc_sc.sc_ic);
749 rtwn_pci_suspend(device_t self)
751 struct rtwn_pci_softc *pc = device_get_softc(self);
753 rtwn_suspend(&pc->pc_sc);
759 rtwn_pci_resume(device_t self)
761 struct rtwn_pci_softc *pc = device_get_softc(self);
763 rtwn_resume(&pc->pc_sc);
768 static device_method_t rtwn_pci_methods[] = {
769 /* Device interface */
770 DEVMETHOD(device_probe, rtwn_pci_probe),
771 DEVMETHOD(device_attach, rtwn_pci_attach),
772 DEVMETHOD(device_detach, rtwn_pci_detach),
773 DEVMETHOD(device_shutdown, rtwn_pci_shutdown),
774 DEVMETHOD(device_suspend, rtwn_pci_suspend),
775 DEVMETHOD(device_resume, rtwn_pci_resume),
780 static driver_t rtwn_pci_driver = {
783 sizeof(struct rtwn_pci_softc)
786 static devclass_t rtwn_pci_devclass;
788 DRIVER_MODULE(rtwn_pci, pci, rtwn_pci_driver, rtwn_pci_devclass, NULL, NULL);
789 MODULE_VERSION(rtwn_pci, 1);
790 MODULE_PNP_INFO("U16:vendor;U16:device;D:#", pci, rtwn, rtwn_pci_ident_table,
791 nitems(rtwn_pci_ident_table));
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);