1/*	$NetBSD: rt2661var.h,v 1.13 2019/10/05 23:27:20 mrg Exp $	*/
2/*	$OpenBSD: rt2661var.h,v 1.4 2006/02/25 12:56:47 damien Exp $	*/
3
4/*-
5 * Copyright (c) 2006
6 *	Damien Bergamini <damien.bergamini@free.fr>
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
21struct rt2661_rx_radiotap_header {
22	struct ieee80211_radiotap_header wr_ihdr;
23	uint64_t	wr_tsf;
24	uint8_t		wr_flags;
25	uint8_t		wr_rate;
26	uint16_t	wr_chan_freq;
27	uint16_t	wr_chan_flags;
28	uint8_t		wr_antsignal;
29};
30
31#define RT2661_RX_RADIOTAP_PRESENT					\
32	((1 << IEEE80211_RADIOTAP_TSFT) |				\
33	 (1 << IEEE80211_RADIOTAP_FLAGS) |				\
34	 (1 << IEEE80211_RADIOTAP_RATE) |				\
35	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
36	 (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL))
37
38struct rt2661_tx_radiotap_header {
39	struct ieee80211_radiotap_header wt_ihdr;
40	uint8_t		wt_flags;
41	uint8_t		wt_rate;
42	uint16_t	wt_chan_freq;
43	uint16_t	wt_chan_flags;
44};
45
46#define RT2661_TX_RADIOTAP_PRESENT					\
47	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
48	 (1 << IEEE80211_RADIOTAP_RATE) |				\
49	 (1 << IEEE80211_RADIOTAP_CHANNEL))
50
51struct rt2661_tx_data {
52	bus_dmamap_t			map;
53	struct mbuf			*m;
54	struct ieee80211_node		*ni;
55};
56
57struct rt2661_tx_ring {
58	bus_dmamap_t		map;
59	bus_dma_segment_t	seg;
60	bus_addr_t		physaddr;
61	struct rt2661_tx_desc	*desc;
62	struct rt2661_tx_data	*data;
63	int			count;
64	int			queued;
65	int			cur;
66	int			next;
67	int			stat;
68};
69
70struct rt2661_rx_data {
71	bus_dmamap_t	map;
72	struct mbuf	*m;
73};
74
75struct rt2661_rx_ring {
76	bus_dmamap_t		map;
77	bus_dma_segment_t	seg;
78	bus_addr_t		physaddr;
79	struct rt2661_rx_desc	*desc;
80	struct rt2661_rx_data	*data;
81	int			count;
82	int			cur;
83	int			next;
84};
85
86struct rt2661_node {
87	struct ieee80211_node		ni;
88	struct ieee80211_amrr_node	amn;
89};
90
91struct rt2661_softc {
92	device_t			sc_dev;
93
94	struct ieee80211com		sc_ic;
95	int				(*sc_newstate)(struct ieee80211com *,
96					    enum ieee80211_state, int);
97
98	int				(*sc_enable)(struct rt2661_softc *);
99	void				(*sc_disable)(struct rt2661_softc *);
100
101	bus_dma_tag_t			sc_dmat;
102	bus_space_tag_t			sc_st;
103	bus_space_handle_t		sc_sh;
104	void				*sc_soft_ih;
105
106	struct ethercom			sc_ec;
107
108	struct callout			scan_ch;
109	struct callout			amrr_ch;
110
111	int				sc_id;
112	int				sc_flags;
113#define RT2661_ENABLED		(1 << 0)
114#define RT2661_FWLOADED		(1 << 1)
115#define RT2661_UPDATE_SLOT	(1 << 2)
116#define RT2661_SET_SLOTTIME	(1 << 3)
117
118	int				sc_tx_timer;
119
120	struct ieee80211_channel	*sc_curchan;
121	struct ieee80211_amrr		amrr;
122
123	uint8_t				rf_rev;
124
125	uint8_t				rfprog;
126	uint8_t				rffreq;
127
128	struct rt2661_tx_ring		txq[5];
129	struct rt2661_tx_ring		mgtq;
130	struct rt2661_rx_ring		rxq;
131
132	uint32_t			rf_regs[4];
133	int8_t				txpow[38];
134
135	struct {
136		uint8_t	reg;
137		uint8_t	val;
138	}				bbp_prom[16];
139
140	int				hw_radio;
141	int				rx_ant;
142	int				tx_ant;
143	int				nb_ant;
144	int				ext_2ghz_lna;
145	int				ext_5ghz_lna;
146	int				rssi_2ghz_corr;
147	int				rssi_5ghz_corr;
148
149	int				ncalls;
150	int				avg_rssi;
151	int				sifs;
152
153	uint32_t			erp_csr;
154
155	uint8_t				bbp18;
156	uint8_t				bbp21;
157	uint8_t				bbp22;
158	uint8_t				bbp16;
159	uint8_t				bbp17;
160	uint8_t				bbp64;
161
162	struct bpf_if *			sc_drvbpf;
163
164	union {
165		struct rt2661_rx_radiotap_header th;
166		uint8_t	pad[64];
167	}			sc_rxtapu;
168#define sc_rxtap		sc_rxtapu.th
169	int			sc_rxtap_len;
170
171	union {
172		struct rt2661_tx_radiotap_header th;
173		uint8_t	pad[64];
174	}			sc_txtapu;
175#define sc_txtap		sc_txtapu.th
176	int			sc_txtap_len;
177};
178
179#define	sc_if		sc_ec.ec_if
180
181int	rt2661_attach(void *, int);
182int	rt2661_detach(void *);
183int	rt2661_intr(void *);
184