xref: /freebsd/sys/dev/rtwn/pci/rtwn_pci_var.h (revision 5dae51da3da0cc94d17bd67b308fad304ebec7e0)
1 /*	$OpenBSD: if_rtwnreg.h,v 1.3 2015/06/14 08:02:47 stsp Exp $	*/
2 
3 /*-
4  * Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr>
5  * Copyright (c) 2015 Stefan Sperling <stsp@openbsd.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  * $FreeBSD$
21  */
22 
23 #ifndef RTWN_PCI_VAR_H
24 #define RTWN_PCI_VAR_H
25 
26 #include <dev/rtwn/rtl8192c/pci/r92ce_rx_desc.h>
27 
28 
29 #define RTWN_PCI_RX_LIST_COUNT		256
30 #define RTWN_PCI_TX_LIST_COUNT		256
31 
32 struct rtwn_rx_data {
33 	bus_dmamap_t		map;
34 	struct mbuf		*m;
35 	bus_addr_t		paddr;
36 };
37 
38 struct rtwn_rx_ring {
39 	struct r92ce_rx_stat	*desc;
40 	bus_addr_t		paddr;
41 	bus_dma_tag_t		desc_dmat;
42 	bus_dmamap_t		desc_map;
43 	bus_dma_tag_t		data_dmat;
44 	bus_dma_segment_t	seg;
45 	struct rtwn_rx_data	rx_data[RTWN_PCI_RX_LIST_COUNT];
46 	int			cur;
47 };
48 
49 struct rtwn_tx_data {
50 	bus_dmamap_t		map;
51 	struct mbuf		*m;
52 	struct ieee80211_node	*ni;
53 	uint8_t			id;
54 };
55 
56 struct rtwn_tx_ring {
57 	bus_addr_t		paddr;
58 	bus_dma_tag_t		desc_dmat;
59 	bus_dmamap_t		desc_map;
60 	bus_dma_tag_t		data_dmat;
61 	bus_dma_segment_t	seg;
62 	void			*desc;
63 	struct rtwn_tx_data	tx_data[RTWN_PCI_TX_LIST_COUNT];
64 	int			queued;
65 	int			cur;
66 	int			last;
67 };
68 
69 /*
70  * TX queue indices.
71  */
72 enum {
73 	RTWN_PCI_BK_QUEUE,
74 	RTWN_PCI_BE_QUEUE,
75 	RTWN_PCI_VI_QUEUE,
76 	RTWN_PCI_VO_QUEUE,
77 	RTWN_PCI_BEACON_QUEUE,
78 	RTWN_PCI_TXCMD_QUEUE,
79 	RTWN_PCI_MGNT_QUEUE,
80 	RTWN_PCI_HIGH_QUEUE,
81 	RTWN_PCI_HCCA_QUEUE,
82 	RTWN_PCI_NTXQUEUES
83 };
84 
85 /*
86  * Interrupt events.
87  */
88 enum {
89 	RTWN_PCI_INTR_RX_ERROR		= 0x00000001,
90 	RTWN_PCI_INTR_RX_OVERFLOW	= 0x00000002,
91 	RTWN_PCI_INTR_RX_DESC_UNAVAIL	= 0x00000004,
92 	RTWN_PCI_INTR_RX_DONE		= 0x00000008,
93 	RTWN_PCI_INTR_TX_ERROR		= 0x00000010,
94 	RTWN_PCI_INTR_TX_OVERFLOW	= 0x00000020,
95 	RTWN_PCI_INTR_TX_REPORT		= 0x00000040,
96 	RTWN_PCI_INTR_PS_TIMEOUT	= 0x00000080
97 };
98 
99 /* Shortcuts */
100 /* Vendor driver treats RX errors like ROK... */
101 #define RTWN_PCI_INTR_RX \
102 	(RTWN_PCI_INTR_RX_OVERFLOW | RTWN_PCI_INTR_RX_DESC_UNAVAIL | \
103 	 RTWN_PCI_INTR_RX_DONE)
104 
105 
106 struct rtwn_pci_softc {
107 	struct rtwn_softc	pc_sc;		/* must be the first */
108 
109 	struct resource		*irq;
110 	struct resource		*mem;
111 	bus_space_tag_t		pc_st;
112 	bus_space_handle_t	pc_sh;
113 	void			*pc_ih;
114 	bus_size_t		pc_mapsize;
115 
116 	struct rtwn_rx_ring	rx_ring;
117 	struct rtwn_tx_ring	tx_ring[RTWN_PCI_NTXQUEUES];
118 
119 	/* must be set by the driver. */
120 	uint16_t		pc_qmap;
121 	uint32_t		tcr;
122 
123 	void			(*pc_setup_tx_desc)(struct rtwn_pci_softc *,
124 				    void *, uint32_t);
125 	void			(*pc_tx_postsetup)(struct rtwn_pci_softc *,
126 				    void *, bus_dma_segment_t *);
127 	void			(*pc_copy_tx_desc)(void *, const void *);
128 	void			(*pc_enable_intr)(struct rtwn_pci_softc *);
129 };
130 #define RTWN_PCI_SOFTC(sc)	((struct rtwn_pci_softc *)(sc))
131 
132 #define rtwn_pci_setup_tx_desc(_pc, _desc, _addr) \
133 	(((_pc)->pc_setup_tx_desc)((_pc), (_desc), (_addr)))
134 #define rtwn_pci_tx_postsetup(_pc, _txd, _segs) \
135 	(((_pc)->pc_tx_postsetup)((_pc), (_txd), (_segs)))
136 #define rtwn_pci_copy_tx_desc(_pc, _dest, _src) \
137 	(((_pc)->pc_copy_tx_desc)((_dest), (_src)))
138 #define rtwn_pci_enable_intr(_pc) \
139 	(((_pc)->pc_enable_intr)((_pc)))
140 
141 #endif	/* RTWN_PCI_VAR_H */
142