xref: /netbsd-src/sys/dev/pci/if_rtwnreg.h (revision 49e1839354a8fe5634f9e3b59075cd262607a1ef)
1 /*	$NetBSD: if_rtwnreg.h,v 1.6 2019/10/05 23:27:20 mrg Exp $	*/
2 /*	$OpenBSD: if_rtwnreg.h,v 1.3 2015/06/14 08:02:47 stsp Exp $	*/
3 
4 /*-
5  * Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr>
6  * Copyright (c) 2015 Stefan Sperling <stsp@openbsd.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 #ifndef _DEV_PCI_RTWNREG_H_
22 #define	_DEV_PCI_RTWNREG_H_
23 
24 /* Maximum number of output pipes is 3. */
25 #define R92C_MAX_EPOUT	3
26 
27 #define R92C_PUBQ_NPAGES	176
28 #define R92C_HPQ_NPAGES		41
29 #define R92C_LPQ_NPAGES		28
30 #define R92C_TXPKTBUF_COUNT	256
31 #define R92C_TX_PAGE_COUNT	\
32 	(R92C_PUBQ_NPAGES + R92C_HPQ_NPAGES + R92C_LPQ_NPAGES)
33 #define R92C_TX_PAGE_BOUNDARY	(R92C_TX_PAGE_COUNT + 1)
34 
35 /* USB Requests. */
36 #define R92C_REQ_REGS	0x05
37 
38 /*
39  * Driver definitions.
40  */
41 #define RTWN_NTXQUEUES			9
42 #define RTWN_RX_LIST_COUNT		256
43 #define RTWN_TX_LIST_COUNT		256
44 #define RTWN_TX_LIST_LOMARK		192
45 #define RTWN_TX_LIST_HIMARK		255
46 #define RTWN_HOST_CMD_RING_COUNT	32
47 
48 /* TX queue indices. */
49 #define RTWN_BK_QUEUE			0
50 #define RTWN_BE_QUEUE			1
51 #define RTWN_VI_QUEUE			2
52 #define RTWN_VO_QUEUE			3
53 #define RTWN_BEACON_QUEUE		4
54 #define RTWN_TXCMD_QUEUE		5
55 #define RTWN_MGNT_QUEUE			6
56 #define RTWN_HIGH_QUEUE			7
57 #define RTWN_HCCA_QUEUE			8
58 
59 /* RX queue indices. */
60 #define RTWN_RX_QUEUE			0
61 
62 #define RTWN_RXBUFSZ	(16 * 1024)
63 #define RTWN_TXBUFSZ	(sizeof(struct r92c_tx_desc) + IEEE80211_MAX_LEN)
64 
65 #define RTWN_RIDX_COUNT	28
66 
67 #define RTWN_TX_TIMEOUT	5000	/* ms */
68 
69 #define RTWN_LED_LINK	0
70 #define RTWN_LED_DATA	1
71 
72 struct rtwn_rx_radiotap_header {
73 	struct ieee80211_radiotap_header wr_ihdr;
74 	uint8_t		wr_flags;
75 	uint8_t		wr_rate;
76 	uint16_t	wr_chan_freq;
77 	uint16_t	wr_chan_flags;
78 	uint8_t		wr_dbm_antsignal;
79 };
80 
81 #define RTWN_RX_RADIOTAP_PRESENT			\
82 	(1 << IEEE80211_RADIOTAP_FLAGS |		\
83 	 1 << IEEE80211_RADIOTAP_RATE |			\
84 	 1 << IEEE80211_RADIOTAP_CHANNEL |		\
85 	 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL)
86 
87 struct rtwn_tx_radiotap_header {
88 	struct ieee80211_radiotap_header wt_ihdr;
89 	uint8_t		wt_flags;
90 	uint16_t	wt_chan_freq;
91 	uint16_t	wt_chan_flags;
92 };
93 
94 #define RTWN_TX_RADIOTAP_PRESENT			\
95 	(1 << IEEE80211_RADIOTAP_FLAGS |		\
96 	 1 << IEEE80211_RADIOTAP_CHANNEL)
97 
98 struct rtwn_softc;
99 
100 struct rtwn_rx_data {
101 	bus_dmamap_t		map;
102 	struct mbuf		*m;
103 };
104 
105 struct rtwn_rx_ring {
106 	struct r92c_rx_desc_pci	*desc;
107 	bus_dmamap_t		map;
108 	bus_dma_segment_t	seg;
109 	int			nsegs;
110 	struct rtwn_rx_data	rx_data[RTWN_RX_LIST_COUNT];
111 
112 };
113 struct rtwn_tx_data {
114 	bus_dmamap_t			map;
115 	struct mbuf			*m;
116 	struct ieee80211_node		*ni;
117 };
118 
119 struct rtwn_tx_ring {
120 	bus_dmamap_t		map;
121 	bus_dma_segment_t	seg;
122 	int			nsegs;
123 	struct r92c_tx_desc_pci	*desc;
124 	struct rtwn_tx_data	tx_data[RTWN_TX_LIST_COUNT];
125 	int			queued;
126 	int			cur;
127 };
128 
129 struct rtwn_host_cmd {
130 	void	(*cb)(struct rtwn_softc *, void *);
131 	uint8_t	data[256];
132 };
133 
134 struct rtwn_cmd_key {
135 	struct ieee80211_key	key;
136 	uint16_t		associd;
137 };
138 
139 struct rtwn_host_cmd_ring {
140 	struct rtwn_host_cmd	cmd[RTWN_HOST_CMD_RING_COUNT];
141 	int			cur;
142 	int			next;
143 	int			queued;
144 };
145 
146 struct rtwn_softc {
147 	device_t			sc_dev;
148 	struct ethercom			sc_ec;
149 	struct ieee80211com		sc_ic;
150 	int				(*sc_newstate)(struct ieee80211com *,
151 					    enum ieee80211_state, int);
152 
153 	/* PCI specific goo. */
154 	bus_dma_tag_t 			sc_dmat;
155 	pci_chipset_tag_t		sc_pc;
156 	pcitag_t			sc_tag;
157 	void				*sc_ih;
158 	pci_intr_handle_t		*sc_pihp;
159 	bus_space_tag_t			sc_st;
160 	bus_space_handle_t		sc_sh;
161 	bus_size_t			sc_mapsize;
162 	int				sc_cap_off;
163 	void				*sc_soft_ih;
164 
165 	struct callout			scan_to;
166 	struct callout			calib_to;
167 	void				*init_task;
168 	int				ac2idx[WME_NUM_AC];
169 	uint32_t			sc_flags;
170 #define RTWN_FLAG_FW_LOADED	__BIT(0)
171 #define RTWN_FLAG_CCK_HIPWR	__BIT(1)
172 
173 	uint32_t			chip;
174 #define RTWN_CHIP_88C		__BIT(0)
175 #define RTWN_CHIP_92C		__BIT(1)
176 #define RTWN_CHIP_92C_1T2R	__BIT(2)
177 #define RTWN_CHIP_UMC		__BIT(3)
178 #define RTWN_CHIP_UMC_A_CUT	__BIT(4)
179 #define RTWN_CHIP_UMC_B_CUT	__BIT(5)
180 
181 	uint8_t				board_type;
182 	uint8_t				regulatory;
183 	uint8_t				pa_setting;
184 	int				avg_pwdb;
185 	int				thcal_state;
186 	int				thcal_lctemp;
187 	int				ntxchains;
188 	int				nrxchains;
189 	int				ledlink;
190 
191 	int				sc_tx_timer;
192 	int				fwcur;
193 	struct rtwn_rx_ring		rx_ring;
194 	struct rtwn_tx_ring		tx_ring[RTWN_NTXQUEUES];
195 	uint32_t			qfullmsk;
196 	struct r92c_rom			rom;
197 
198 	uint32_t			rf_chnlbw[R92C_MAX_CHAINS];
199 	struct bpf_if			*sc_drvbpf;
200 
201 	union {
202 		struct rtwn_rx_radiotap_header th;
203 		uint8_t	pad[64];
204 	}				sc_rxtapu;
205 #define sc_rxtap	sc_rxtapu.th
206 	int				sc_rxtap_len;
207 
208 	union {
209 		struct rtwn_tx_radiotap_header th;
210 		uint8_t	pad[64];
211 	}				sc_txtapu;
212 #define sc_txtap	sc_txtapu.th
213 	int				sc_txtap_len;
214 };
215 
216 #define	sc_if		sc_ec.ec_if
217 #define	GET_IFP(sc)	(&(sc)->sc_if)
218 #define	IC2IFP(ic)	((ic)->ic_ifp)
219 
220 #endif /* _DEV_PCI_RTWNREG_H_ */
221