xref: /openbsd-src/sys/dev/ic/rt2661var.h (revision 37ecb59650d3f381e0120446318f17da385095e3)
1*37ecb596Sderaadt /*	$OpenBSD: rt2661var.h,v 1.18 2013/12/06 21:03:03 deraadt Exp $	*/
2189ff541Sdamien 
3189ff541Sdamien /*-
4189ff541Sdamien  * Copyright (c) 2006
5189ff541Sdamien  *	Damien Bergamini <damien.bergamini@free.fr>
6189ff541Sdamien  *
7189ff541Sdamien  * Permission to use, copy, modify, and distribute this software for any
8189ff541Sdamien  * purpose with or without fee is hereby granted, provided that the above
9189ff541Sdamien  * copyright notice and this permission notice appear in all copies.
10189ff541Sdamien  *
11189ff541Sdamien  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12189ff541Sdamien  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13189ff541Sdamien  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14189ff541Sdamien  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15189ff541Sdamien  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16189ff541Sdamien  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17189ff541Sdamien  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18189ff541Sdamien  */
19189ff541Sdamien 
20e48892ffSdamien struct rt2661_rx_radiotap_header {
21e48892ffSdamien 	struct ieee80211_radiotap_header wr_ihdr;
22e48892ffSdamien 	uint64_t	wr_tsf;
23e48892ffSdamien 	uint8_t		wr_flags;
242a5f0c51Sdamien 	uint8_t		wr_rate;
25e48892ffSdamien 	uint16_t	wr_chan_freq;
26e48892ffSdamien 	uint16_t	wr_chan_flags;
27e48892ffSdamien 	uint8_t		wr_antsignal;
28e48892ffSdamien } __packed;
29e48892ffSdamien 
30e48892ffSdamien #define RT2661_RX_RADIOTAP_PRESENT					\
31e48892ffSdamien 	((1 << IEEE80211_RADIOTAP_TSFT) |				\
32e48892ffSdamien 	 (1 << IEEE80211_RADIOTAP_FLAGS) |				\
332a5f0c51Sdamien 	 (1 << IEEE80211_RADIOTAP_RATE) |				\
34e48892ffSdamien 	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
35e48892ffSdamien 	 (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL))
36e48892ffSdamien 
37e48892ffSdamien struct rt2661_tx_radiotap_header {
38e48892ffSdamien 	struct ieee80211_radiotap_header wt_ihdr;
39e48892ffSdamien 	uint8_t		wt_flags;
40e48892ffSdamien 	uint8_t		wt_rate;
41e48892ffSdamien 	uint16_t	wt_chan_freq;
42e48892ffSdamien 	uint16_t	wt_chan_flags;
43e48892ffSdamien } __packed;
44e48892ffSdamien 
45e48892ffSdamien #define RT2661_TX_RADIOTAP_PRESENT					\
46e48892ffSdamien 	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
47e48892ffSdamien 	 (1 << IEEE80211_RADIOTAP_RATE) |				\
48e48892ffSdamien 	 (1 << IEEE80211_RADIOTAP_CHANNEL))
49e48892ffSdamien 
50189ff541Sdamien struct rt2661_tx_data {
51189ff541Sdamien 	bus_dmamap_t			map;
52189ff541Sdamien 	struct mbuf			*m;
53189ff541Sdamien 	struct ieee80211_node		*ni;
54189ff541Sdamien };
55189ff541Sdamien 
56189ff541Sdamien struct rt2661_tx_ring {
57189ff541Sdamien 	bus_dmamap_t		map;
58189ff541Sdamien 	bus_dma_segment_t	seg;
59189ff541Sdamien 	bus_addr_t		physaddr;
60189ff541Sdamien 	struct rt2661_tx_desc	*desc;
61189ff541Sdamien 	struct rt2661_tx_data	*data;
62189ff541Sdamien 	int			count;
63189ff541Sdamien 	int			queued;
64189ff541Sdamien 	int			cur;
65189ff541Sdamien 	int			next;
66189ff541Sdamien 	int			stat;
67189ff541Sdamien };
68189ff541Sdamien 
69189ff541Sdamien struct rt2661_rx_data {
70189ff541Sdamien 	bus_dmamap_t	map;
71189ff541Sdamien 	struct mbuf	*m;
72189ff541Sdamien };
73189ff541Sdamien 
74189ff541Sdamien struct rt2661_rx_ring {
75189ff541Sdamien 	bus_dmamap_t		map;
76189ff541Sdamien 	bus_dma_segment_t	seg;
77189ff541Sdamien 	bus_addr_t		physaddr;
78189ff541Sdamien 	struct rt2661_rx_desc	*desc;
79189ff541Sdamien 	struct rt2661_rx_data	*data;
80189ff541Sdamien 	int			count;
81189ff541Sdamien 	int			cur;
82189ff541Sdamien 	int			next;
83189ff541Sdamien };
84189ff541Sdamien 
851af6d579Sstsp #define RT2661_AMRR_NODES_MAX 	100 /* based on IEEE80211_CACHE_SIZE */
861af6d579Sstsp #define RT2661_AMRR_INVALID_ID	(RT2661_AMRR_NODES_MAX + 1)
871af6d579Sstsp 
881af6d579Sstsp struct rt2661_amrr_node {
891af6d579Sstsp 	struct ieee80211_amrr_node	amn;
901af6d579Sstsp 	struct rt2661_node		*rn;
911af6d579Sstsp 	u_int8_t			id;
921af6d579Sstsp 	TAILQ_ENTRY(rt2661_amrr_node)	entry;
931af6d579Sstsp };
941af6d579Sstsp 
95e48892ffSdamien struct rt2661_node {
96e48892ffSdamien 	struct ieee80211_node		ni;
971af6d579Sstsp 	struct rt2661_amrr_node		*amn;
98e48892ffSdamien };
99e48892ffSdamien 
100189ff541Sdamien struct rt2661_softc {
101189ff541Sdamien 	struct device			sc_dev;
102189ff541Sdamien 
103189ff541Sdamien 	struct ieee80211com		sc_ic;
104189ff541Sdamien 	int				(*sc_newstate)(struct ieee80211com *,
105189ff541Sdamien 					    enum ieee80211_state, int);
1068c71b0d2Sdamien 	struct ieee80211_amrr		amrr;
107189ff541Sdamien 
108189ff541Sdamien 	int				(*sc_enable)(struct rt2661_softc *);
109189ff541Sdamien 	void				(*sc_disable)(struct rt2661_softc *);
110189ff541Sdamien 
111189ff541Sdamien 	bus_dma_tag_t			sc_dmat;
112189ff541Sdamien 	bus_space_tag_t			sc_st;
113189ff541Sdamien 	bus_space_handle_t		sc_sh;
114189ff541Sdamien 
1158c71b0d2Sdamien 	struct timeout			scan_to;
1168c71b0d2Sdamien 	struct timeout			amrr_to;
117189ff541Sdamien 
118189ff541Sdamien 	int				sc_id;
119189ff541Sdamien 	int				sc_flags;
120189ff541Sdamien #define RT2661_ENABLED		(1 << 0)
1210727ce2fSdamien #define RT2661_UPDATE_SLOT	(1 << 1)
1220727ce2fSdamien #define RT2661_SET_SLOTTIME	(1 << 2)
123361a5bb3Sderaadt #define RT2661_FWLOADED		(1 << 3)
1241af6d579Sstsp #define RT2661_MGT_OACTIVE	(1 << 4)
1251af6d579Sstsp #define RT2661_DATA_OACTIVE	(1 << 5)
126189ff541Sdamien 
127189ff541Sdamien 	int				sc_tx_timer;
128189ff541Sdamien 
129189ff541Sdamien 	struct ieee80211_channel	*sc_curchan;
130189ff541Sdamien 
1310727ce2fSdamien 	u_char				*ucode;
1320727ce2fSdamien 	size_t				ucsize;
1330727ce2fSdamien 
134189ff541Sdamien 	uint8_t				rf_rev;
135189ff541Sdamien 
136189ff541Sdamien 	uint8_t				rfprog;
137189ff541Sdamien 	uint8_t				rffreq;
138189ff541Sdamien 
139189ff541Sdamien 	struct rt2661_tx_ring		txq[5];
140189ff541Sdamien 	struct rt2661_tx_ring		mgtq;
141189ff541Sdamien 	struct rt2661_rx_ring		rxq;
142189ff541Sdamien 
143189ff541Sdamien 	uint32_t			rf_regs[4];
144e48892ffSdamien 	int8_t				txpow[38];
145189ff541Sdamien 
146189ff541Sdamien 	struct {
147189ff541Sdamien 		uint8_t	reg;
148189ff541Sdamien 		uint8_t	val;
149189ff541Sdamien 	}				bbp_prom[16];
150189ff541Sdamien 
151189ff541Sdamien 	int				hw_radio;
152189ff541Sdamien 	int				rx_ant;
153189ff541Sdamien 	int				tx_ant;
154189ff541Sdamien 	int				nb_ant;
155189ff541Sdamien 	int				ext_2ghz_lna;
156189ff541Sdamien 	int				ext_5ghz_lna;
157189ff541Sdamien 	int				rssi_2ghz_corr;
158189ff541Sdamien 	int				rssi_5ghz_corr;
159189ff541Sdamien 
160541fa21bSdamien 	int				ncalls;
161541fa21bSdamien 	int				avg_rssi;
162c3b095b8Sdamien 	int				sifs;
163541fa21bSdamien 
1641aa65ad1Sdamien 	uint32_t			erp_csr;
1651aa65ad1Sdamien 
166189ff541Sdamien 	uint8_t				bbp18;
167189ff541Sdamien 	uint8_t				bbp21;
168189ff541Sdamien 	uint8_t				bbp22;
169189ff541Sdamien 	uint8_t				bbp16;
170189ff541Sdamien 	uint8_t				bbp17;
171189ff541Sdamien 	uint8_t				bbp64;
172e48892ffSdamien 
173e48892ffSdamien #if NBPFILTER > 0
174e48892ffSdamien 	caddr_t				sc_drvbpf;
175e48892ffSdamien 
176e48892ffSdamien 	union {
177e48892ffSdamien 		struct rt2661_rx_radiotap_header th;
178e48892ffSdamien 		uint8_t	pad[64];
179e48892ffSdamien 	}				sc_rxtapu;
180e48892ffSdamien #define sc_rxtap			sc_rxtapu.th
181e48892ffSdamien 	int				sc_rxtap_len;
182e48892ffSdamien 
183e48892ffSdamien 	union {
184e48892ffSdamien 		struct rt2661_tx_radiotap_header th;
185e48892ffSdamien 		uint8_t	pad[64];
186e48892ffSdamien 	}				sc_txtapu;
187e48892ffSdamien #define sc_txtap			sc_txtapu.th
188e48892ffSdamien 	int				sc_txtap_len;
189e48892ffSdamien #endif
1901af6d579Sstsp 	void				(*sc_node_free)(struct ieee80211com *,
1911af6d579Sstsp 					    struct ieee80211_node *);
1921af6d579Sstsp 	TAILQ_HEAD(, rt2661_amrr_node)	amn;
1931af6d579Sstsp 	u_int8_t			amn_count;
194189ff541Sdamien };
195189ff541Sdamien 
196189ff541Sdamien int	rt2661_attach(void *, int);
197189ff541Sdamien int	rt2661_detach(void *);
1980727ce2fSdamien void	rt2661_suspend(void *);
199*37ecb596Sderaadt void	rt2661_wakeup(void *);
200189ff541Sdamien int	rt2661_intr(void *);
201