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
66static device_probe_t	rtwn_pci_probe;
67static device_attach_t	rtwn_pci_attach;
68static device_detach_t	rtwn_pci_detach;
69static device_shutdown_t rtwn_pci_shutdown;
70static device_suspend_t	rtwn_pci_suspend;
71static device_resume_t	rtwn_pci_resume;
72
73static int	rtwn_pci_alloc_rx_list(struct rtwn_softc *);
74static void	rtwn_pci_reset_rx_list(struct rtwn_softc *);
75static void	rtwn_pci_free_rx_list(struct rtwn_softc *);
76static int	rtwn_pci_alloc_tx_list(struct rtwn_softc *, int);
77static void	rtwn_pci_reset_tx_ring_stopped(struct rtwn_softc *, int);
78static void	rtwn_pci_reset_beacon_ring(struct rtwn_softc *, int);
79static void	rtwn_pci_reset_tx_list(struct rtwn_softc *,
80		    struct ieee80211vap *, int);
81static void	rtwn_pci_free_tx_list(struct rtwn_softc *, int);
82static void	rtwn_pci_reset_lists(struct rtwn_softc *,
83		    struct ieee80211vap *);
84static int	rtwn_pci_fw_write_block(struct rtwn_softc *,
85		    const uint8_t *, uint16_t, int);
86static uint16_t	rtwn_pci_get_qmap(struct rtwn_softc *);
87static void	rtwn_pci_set_desc_addr(struct rtwn_softc *);
88static void	rtwn_pci_beacon_update_begin(struct rtwn_softc *,
89		    struct ieee80211vap *);
90static void	rtwn_pci_beacon_update_end(struct rtwn_softc *,
91		    struct ieee80211vap *);
92static void	rtwn_pci_attach_methods(struct rtwn_softc *);
93
94static const struct rtwn_pci_ident *
95rtwn_pci_probe_sub(device_t dev)
96{
97	int i, vendor_id, device_id;
98
99	vendor_id = pci_get_vendor(dev);
100	device_id = pci_get_device(dev);
101
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]);
106	}
107
108	return (NULL);
109}
110
111static int
112rtwn_pci_probe(device_t dev)
113{
114	const struct rtwn_pci_ident *ident;
115
116	ident = rtwn_pci_probe_sub(dev);
117	if (ident != NULL) {
118		device_set_desc(dev, ident->name);
119		return (BUS_PROBE_DEFAULT);
120	}
121	return (ENXIO);
122}
123
124static int
125rtwn_pci_alloc_rx_list(struct rtwn_softc *sc)
126{
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;
130	bus_size_t size;
131	int i, error;
132
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);
138	if (error != 0) {
139		device_printf(sc->sc_dev, "could not create rx desc DMA tag\n");
140		goto fail;
141	}
142
143	error = bus_dmamem_alloc(rx_ring->desc_dmat, (void **)&rx_ring->desc,
144	    BUS_DMA_NOWAIT | BUS_DMA_ZERO | BUS_DMA_COHERENT,
145	    &rx_ring->desc_map);
146	if (error != 0) {
147		device_printf(sc->sc_dev, "could not allocate rx desc\n");
148		goto fail;
149	}
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);
152	if (error != 0) {
153		device_printf(sc->sc_dev, "could not load rx desc DMA map\n");
154		goto fail;
155	}
156	bus_dmamap_sync(rx_ring->desc_dmat, rx_ring->desc_map,
157	    BUS_DMASYNC_PREWRITE);
158
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);
163	if (error != 0) {
164		device_printf(sc->sc_dev, "could not create rx buf DMA tag\n");
165		goto fail;
166	}
167
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);
172		if (error != 0) {
173			device_printf(sc->sc_dev,
174			    "could not create rx buf DMA map\n");
175			goto fail;
176		}
177
178		rx_data->m = m_getjcl(M_NOWAIT, MT_DATA, M_PKTHDR,
179		    MJUMPAGESIZE);
180		if (rx_data->m == NULL) {
181			device_printf(sc->sc_dev,
182			    "could not allocate rx mbuf\n");
183			error = ENOMEM;
184			goto fail;
185		}
186
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);
190		if (error != 0) {
191			device_printf(sc->sc_dev,
192			    "could not load rx buf DMA map");
193			goto fail;
194		}
195
196		rtwn_pci_setup_rx_desc(pc, &rx_ring->desc[i], rx_data->paddr,
197		    MJUMPAGESIZE, i);
198	}
199	rx_ring->cur = 0;
200
201	return (0);
202
203fail:
204	rtwn_pci_free_rx_list(sc);
205	return (error);
206}
207
208static void
209rtwn_pci_reset_rx_list(struct rtwn_softc *sc)
210{
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;
214	int i;
215
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);
220	}
221	rx_ring->cur = 0;
222}
223
224static void
225rtwn_pci_free_rx_list(struct rtwn_softc *sc)
226{
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;
230	int i;
231
232	if (rx_ring->desc_dmat != NULL) {
233		if (rx_ring->desc != NULL) {
234			bus_dmamap_sync(rx_ring->desc_dmat,
235			    rx_ring->desc_map,
236			    BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE);
237			bus_dmamap_unload(rx_ring->desc_dmat,
238			    rx_ring->desc_map);
239			bus_dmamem_free(rx_ring->desc_dmat, rx_ring->desc,
240			    rx_ring->desc_map);
241			rx_ring->desc = NULL;
242		}
243		bus_dma_tag_destroy(rx_ring->desc_dmat);
244		rx_ring->desc_dmat = NULL;
245	}
246
247	for (i = 0; i < RTWN_PCI_RX_LIST_COUNT; i++) {
248		rx_data = &rx_ring->rx_data[i];
249
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);
254			m_freem(rx_data->m);
255			rx_data->m = NULL;
256		}
257		bus_dmamap_destroy(rx_ring->data_dmat, rx_data->map);
258		rx_data->map = NULL;
259	}
260	if (rx_ring->data_dmat != NULL) {
261		bus_dma_tag_destroy(rx_ring->data_dmat);
262		rx_ring->data_dmat = NULL;
263	}
264}
265
266static int
267rtwn_pci_alloc_tx_list(struct rtwn_softc *sc, int qid)
268{
269	struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc);
270	struct rtwn_tx_ring *tx_ring = &pc->tx_ring[qid];
271	bus_size_t size;
272	int i, error;
273
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);
278	if (error != 0) {
279		device_printf(sc->sc_dev, "could not create tx ring DMA tag\n");
280		goto fail;
281	}
282
283	error = bus_dmamem_alloc(tx_ring->desc_dmat, &tx_ring->desc,
284	    BUS_DMA_NOWAIT | BUS_DMA_ZERO, &tx_ring->desc_map);
285	if (error != 0) {
286		device_printf(sc->sc_dev, "can't map tx ring DMA memory\n");
287		goto fail;
288	}
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,
291	    BUS_DMA_NOWAIT);
292	if (error != 0) {
293		device_printf(sc->sc_dev, "could not load desc DMA map\n");
294		goto fail;
295	}
296	bus_dmamap_sync(tx_ring->desc_dmat, tx_ring->desc_map,
297	    BUS_DMASYNC_PREWRITE);
298
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);
302	if (error != 0) {
303		device_printf(sc->sc_dev, "could not create tx buf DMA tag\n");
304		goto fail;
305	}
306
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);
312
313		rtwn_pci_setup_tx_desc(pc, tx_desc, next_desc_addr);
314
315		error = bus_dmamap_create(tx_ring->data_dmat, 0, &tx_data->map);
316		if (error != 0) {
317			device_printf(sc->sc_dev,
318			    "could not create tx buf DMA map\n");
319			return (error);
320		}
321		tx_data->m = NULL;
322		tx_data->ni = NULL;
323	}
324	return (0);
325
326fail:
327	rtwn_pci_free_tx_list(sc, qid);
328	return (error);
329}
330
331static void
332rtwn_pci_reset_tx_ring_stopped(struct rtwn_softc *sc, int qid)
333{
334	struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc);
335	struct rtwn_tx_ring *ring = &pc->tx_ring[qid];
336	int i;
337
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;
341
342		rtwn_pci_copy_tx_desc(pc, desc, NULL);
343
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);
348			m_freem(data->m);
349			data->m = NULL;
350		}
351		if (data->ni != NULL) {
352			ieee80211_free_node(data->ni);
353			data->ni = NULL;
354		}
355	}
356
357	bus_dmamap_sync(ring->desc_dmat, ring->desc_map,
358	    BUS_DMASYNC_POSTWRITE);
359
360	sc->qfullmsk &= ~(1 << qid);
361	ring->queued = 0;
362	ring->last = ring->cur = 0;
363}
364
365/*
366 * Clear entry 0 (or 1) in the beacon queue (other are not used).
367 */
368static void
369rtwn_pci_reset_beacon_ring(struct rtwn_softc *sc, int id)
370{
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);
376
377	bus_dmamap_sync(ring->desc_dmat, ring->desc_map, BUS_DMASYNC_POSTREAD);
378	if (txd->flags0 & RTWN_FLAGS0_OWN) {
379		/* Clear OWN bit. */
380		txd->flags0 &= ~RTWN_FLAGS0_OWN;
381		bus_dmamap_sync(ring->desc_dmat, ring->desc_map,
382		    BUS_DMASYNC_PREWRITE);
383
384		/* Unload mbuf. */
385		bus_dmamap_sync(ring->data_dmat, data->map,
386		    BUS_DMASYNC_POSTWRITE);
387		bus_dmamap_unload(ring->data_dmat, data->map);
388	}
389}
390
391/*
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.
394 */
395static void
396rtwn_pci_reset_tx_list(struct rtwn_softc *sc, struct ieee80211vap *vap,
397    int qid)
398{
399	int i;
400
401	if (vap == NULL) {
402		if (qid != RTWN_PCI_BEACON_QUEUE) {
403			/*
404			 * Device was stopped; just clear all entries.
405			 */
406			rtwn_pci_reset_tx_ring_stopped(sc, qid);
407		} else {
408			for (i = 0; i < RTWN_PORT_COUNT; i++)
409				rtwn_pci_reset_beacon_ring(sc, i);
410		}
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);
415
416		rtwn_pci_reset_beacon_ring(sc, uvp->id);
417	} else {
418		struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc);
419		struct rtwn_tx_ring *ring = &pc->tx_ring[qid];
420
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) {
424				/*
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.
429				 */
430				ieee80211_free_node(data->ni);
431				data->ni = NULL;
432			}
433		}
434	}
435}
436
437static void
438rtwn_pci_free_tx_list(struct rtwn_softc *sc, int qid)
439{
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;
443	int i;
444
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,
450			    tx_ring->desc_map);
451			bus_dmamem_free(tx_ring->desc_dmat, tx_ring->desc,
452			    tx_ring->desc_map);
453		}
454		bus_dma_tag_destroy(tx_ring->desc_dmat);
455	}
456
457	for (i = 0; i < RTWN_PCI_TX_LIST_COUNT; i++) {
458		tx_data = &tx_ring->tx_data[i];
459
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);
464			m_freem(tx_data->m);
465			tx_data->m = NULL;
466		}
467	}
468	if (tx_ring->data_dmat != NULL) {
469		bus_dma_tag_destroy(tx_ring->data_dmat);
470		tx_ring->data_dmat = NULL;
471	}
472
473	sc->qfullmsk &= ~(1 << qid);
474	tx_ring->queued = 0;
475	tx_ring->last = tx_ring->cur = 0;
476}
477
478static void
479rtwn_pci_reset_lists(struct rtwn_softc *sc, struct ieee80211vap *vap)
480{
481	int i;
482
483	for (i = 0; i < RTWN_PCI_NTXQUEUES; i++)
484		rtwn_pci_reset_tx_list(sc, vap, i);
485
486	if (vap == NULL) {
487		sc->qfullmsk = 0;
488		rtwn_pci_reset_rx_list(sc);
489	}
490}
491
492static int
493rtwn_pci_fw_write_block(struct rtwn_softc *sc, const uint8_t *buf,
494    uint16_t reg, int mlen)
495{
496	int i;
497
498	for (i = 0; i < mlen; i++)
499		rtwn_pci_write_1(sc, reg++, buf[i]);
500
501	/* NB: cannot fail */
502	return (0);
503}
504
505static uint16_t
506rtwn_pci_get_qmap(struct rtwn_softc *sc)
507{
508	struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc);
509
510	KASSERT(pc->pc_qmap != 0, ("%s: qmap is not set!\n", __func__));
511
512	return (pc->pc_qmap);
513}
514
515static void
516rtwn_pci_set_desc_addr(struct rtwn_softc *sc)
517{
518	struct rtwn_pci_softc *pc = RTWN_PCI_SOFTC(sc);
519
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);
531
532	/* Set Tx Configuration Register. */
533	rtwn_pci_write_4(sc, R92C_TCR, pc->tcr);
534
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);
550
551	/* Configure Rx DMA. */
552	rtwn_pci_write_4(sc, R92C_RX_DESA, pc->rx_ring.paddr);
553}
554
555static void
556rtwn_pci_beacon_update_begin(struct rtwn_softc *sc, struct ieee80211vap *vap)
557{
558	struct rtwn_vap *rvp = RTWN_VAP(vap);
559
560	RTWN_ASSERT_LOCKED(sc);
561
562	rtwn_beacon_enable(sc, rvp->id, 0);
563}
564
565static void
566rtwn_pci_beacon_update_end(struct rtwn_softc *sc, struct ieee80211vap *vap)
567{
568	struct rtwn_vap *rvp = RTWN_VAP(vap);
569
570	RTWN_ASSERT_LOCKED(sc);
571
572	if (rvp->curr_mode != R92C_MSR_NOLINK)
573		rtwn_beacon_enable(sc, rvp->id, 1);
574}
575
576static void
577rtwn_pci_attach_methods(struct rtwn_softc *sc)
578{
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;
596
597	sc->bcn_check_interval	= 25000;
598}
599
600static int
601rtwn_pci_attach(device_t dev)
602{
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;
607	uint32_t lcsr;
608	int cap_off, i, error, rid;
609
610	ident = rtwn_pci_probe_sub(dev);
611	if (ident == NULL)
612		return (ENXIO);
613
614	/*
615	 * Get the offset of the PCI Express Capability Structure in PCI
616	 * Configuration Space.
617	 */
618	error = pci_find_cap(dev, PCIY_EXPRESS, &cap_off);
619	if (error != 0) {
620		device_printf(dev, "PCIe capability structure not found!\n");
621		return (error);
622	}
623
624	/* Enable bus-mastering. */
625	pci_enable_busmaster(dev);
626
627	rid = PCIR_BAR(2);
628	pc->mem = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &rid,
629	    RF_ACTIVE);
630	if (pc->mem == NULL) {
631		device_printf(dev, "can't map mem space\n");
632		return (ENOMEM);
633	}
634	pc->pc_st = rman_get_bustag(pc->mem);
635	pc->pc_sh = rman_get_bushandle(pc->mem);
636
637	/* Install interrupt handler. */
638	rid = 1;
639	if (pci_alloc_msi(dev, &rid) == 0)
640		rid = 1;
641	else
642		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");
647		goto detach;
648	}
649
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);
654
655	sc->sc_dev = dev;
656	ic->ic_name = device_get_nameunit(dev);
657
658	/* Need to be initialized early. */
659	rtwn_sysctlattach(sc);
660	mtx_init(&sc->sc_mtx, ic->ic_name, MTX_NETWORK_LOCK, MTX_DEF);
661
662	rtwn_pci_attach_methods(sc);
663	rtwn_pci_attach_private(pc, ident->chip);
664
665	/* Allocate Tx/Rx buffers. */
666	error = rtwn_pci_alloc_rx_list(sc);
667	if (error != 0) {
668		device_printf(dev,
669		    "could not allocate Rx buffers, error %d\n",
670		    error);
671		goto detach;
672	}
673	for (i = 0; i < RTWN_PCI_NTXQUEUES; i++) {
674		error = rtwn_pci_alloc_tx_list(sc, i);
675		if (error != 0) {
676			device_printf(dev,
677			    "could not allocate Tx buffers, error %d\n",
678			    error);
679			goto detach;
680		}
681	}
682
683	/* Generic attach. */
684	error = rtwn_attach(sc);
685	if (error != 0)
686		goto detach;
687
688	/*
689	 * Hook our interrupt after all initialization is complete.
690	 */
691	error = bus_setup_intr(dev, pc->irq, INTR_TYPE_NET | INTR_MPSAFE,
692	    NULL, rtwn_pci_intr, sc, &pc->pc_ih);
693	if (error != 0) {
694		device_printf(dev, "can't establish interrupt, error %d\n",
695		    error);
696		goto detach;
697	}
698
699	return (0);
700
701detach:
702	rtwn_pci_detach(dev);		/* failure */
703	return (ENXIO);
704}
705
706static int
707rtwn_pci_detach(device_t dev)
708{
709	struct rtwn_pci_softc *pc = device_get_softc(dev);
710	struct rtwn_softc *sc = &pc->pc_sc;
711	int i;
712
713	/* Generic detach. */
714	rtwn_detach(sc);
715
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),
720		    pc->irq);
721		pci_release_msi(dev);
722	}
723
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);
728
729	if (pc->mem != NULL)
730		bus_release_resource(dev, SYS_RES_MEMORY,
731		    rman_get_rid(pc->mem), pc->mem);
732
733	rtwn_detach_private(sc);
734	mtx_destroy(&sc->sc_mtx);
735
736	return (0);
737}
738
739static int
740rtwn_pci_shutdown(device_t self)
741{
742	struct rtwn_pci_softc *pc = device_get_softc(self);
743
744	ieee80211_stop_all(&pc->pc_sc.sc_ic);
745	return (0);
746}
747
748static int
749rtwn_pci_suspend(device_t self)
750{
751	struct rtwn_pci_softc *pc = device_get_softc(self);
752
753	rtwn_suspend(&pc->pc_sc);
754
755	return (0);
756}
757
758static int
759rtwn_pci_resume(device_t self)
760{
761	struct rtwn_pci_softc *pc = device_get_softc(self);
762
763	rtwn_resume(&pc->pc_sc);
764
765	return (0);
766}
767
768static 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),
776
777	DEVMETHOD_END
778};
779
780static driver_t rtwn_pci_driver = {
781	"rtwn",
782	rtwn_pci_methods,
783	sizeof(struct rtwn_pci_softc)
784};
785
786static devclass_t rtwn_pci_devclass;
787
788DRIVER_MODULE(rtwn_pci, pci, rtwn_pci_driver, rtwn_pci_devclass, NULL, NULL);
789MODULE_VERSION(rtwn_pci, 1);
790MODULE_PNP_INFO("U16:vendor;U16:device;D:#", pci, rtwn, rtwn_pci_ident_table,
791    nitems(rtwn_pci_ident_table));
792MODULE_DEPEND(rtwn_pci, pci, 1, 1, 1);
793MODULE_DEPEND(rtwn_pci, wlan, 1, 1, 1);
794MODULE_DEPEND(rtwn_pci, rtwn, 2, 2, 2);
795