xref: /openbsd-src/sys/dev/ic/rt2560var.h (revision 37ecb59650d3f381e0120446318f17da385095e3)
1*37ecb596Sderaadt /*	$OpenBSD: rt2560var.h,v 1.11 2013/12/06 21:03:03 deraadt Exp $  */
2189ff541Sdamien 
3189ff541Sdamien /*-
4189ff541Sdamien  * Copyright (c) 2005, 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 
20189ff541Sdamien struct rt2560_rx_radiotap_header {
21189ff541Sdamien 	struct ieee80211_radiotap_header wr_ihdr;
22189ff541Sdamien 	uint64_t	wr_tsf;
23189ff541Sdamien 	uint8_t		wr_flags;
242a5f0c51Sdamien 	uint8_t		wr_rate;
25189ff541Sdamien 	uint16_t	wr_chan_freq;
26189ff541Sdamien 	uint16_t	wr_chan_flags;
27189ff541Sdamien 	uint8_t		wr_antenna;
28189ff541Sdamien 	uint8_t		wr_antsignal;
29189ff541Sdamien } __packed;
30189ff541Sdamien 
31189ff541Sdamien #define RT2560_RX_RADIOTAP_PRESENT					\
32189ff541Sdamien 	((1 << IEEE80211_RADIOTAP_TSFT) |				\
33189ff541Sdamien 	 (1 << IEEE80211_RADIOTAP_FLAGS) |				\
342a5f0c51Sdamien 	 (1 << IEEE80211_RADIOTAP_RATE) |				\
35189ff541Sdamien 	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
36189ff541Sdamien 	 (1 << IEEE80211_RADIOTAP_ANTENNA) |				\
37189ff541Sdamien 	 (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL))
38189ff541Sdamien 
39189ff541Sdamien struct rt2560_tx_radiotap_header {
40189ff541Sdamien 	struct ieee80211_radiotap_header wt_ihdr;
41189ff541Sdamien 	uint8_t		wt_flags;
42189ff541Sdamien 	uint8_t		wt_rate;
43189ff541Sdamien 	uint16_t	wt_chan_freq;
44189ff541Sdamien 	uint16_t	wt_chan_flags;
45189ff541Sdamien 	uint8_t		wt_antenna;
46189ff541Sdamien } __packed;
47189ff541Sdamien 
48189ff541Sdamien #define RT2560_TX_RADIOTAP_PRESENT					\
49189ff541Sdamien 	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
50189ff541Sdamien 	 (1 << IEEE80211_RADIOTAP_RATE) |				\
51189ff541Sdamien 	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
52189ff541Sdamien 	 (1 << IEEE80211_RADIOTAP_ANTENNA))
53189ff541Sdamien 
54189ff541Sdamien struct rt2560_tx_data {
55189ff541Sdamien 	bus_dmamap_t			map;
56189ff541Sdamien 	struct mbuf			*m;
57189ff541Sdamien 	struct ieee80211_node		*ni;
58189ff541Sdamien };
59189ff541Sdamien 
60189ff541Sdamien struct rt2560_tx_ring {
61189ff541Sdamien 	bus_dmamap_t		map;
62189ff541Sdamien 	bus_dma_segment_t	seg;
63189ff541Sdamien 	bus_addr_t		physaddr;
64189ff541Sdamien 	struct rt2560_tx_desc	*desc;
65189ff541Sdamien 	struct rt2560_tx_data	*data;
66189ff541Sdamien 	int			count;
67189ff541Sdamien 	int			queued;
68189ff541Sdamien 	int			cur;
69189ff541Sdamien 	int			next;
70189ff541Sdamien 	int			cur_encrypt;
71189ff541Sdamien 	int			next_encrypt;
72189ff541Sdamien };
73189ff541Sdamien 
74189ff541Sdamien struct rt2560_rx_data {
75189ff541Sdamien 	bus_dmamap_t	map;
76189ff541Sdamien 	struct mbuf	*m;
77189ff541Sdamien 	int		drop;
78189ff541Sdamien };
79189ff541Sdamien 
80189ff541Sdamien struct rt2560_rx_ring {
81189ff541Sdamien 	bus_dmamap_t		map;
82189ff541Sdamien 	bus_dma_segment_t	seg;
83189ff541Sdamien 	bus_addr_t		physaddr;
84189ff541Sdamien 	struct rt2560_rx_desc	*desc;
85189ff541Sdamien 	struct rt2560_rx_data	*data;
86189ff541Sdamien 	int			count;
87189ff541Sdamien 	int			cur;
88189ff541Sdamien 	int			next;
89189ff541Sdamien 	int			cur_decrypt;
90189ff541Sdamien };
91189ff541Sdamien 
92189ff541Sdamien struct rt2560_node {
93189ff541Sdamien 	struct ieee80211_node		ni;
948c71b0d2Sdamien 	struct ieee80211_amrr_node	amn;
95189ff541Sdamien };
96189ff541Sdamien 
97189ff541Sdamien struct rt2560_softc {
98189ff541Sdamien 	struct device		sc_dev;
99189ff541Sdamien 
100189ff541Sdamien 	struct ieee80211com	sc_ic;
101189ff541Sdamien 	int			(*sc_newstate)(struct ieee80211com *,
102189ff541Sdamien 				    enum ieee80211_state, int);
1038c71b0d2Sdamien 	struct ieee80211_amrr	amrr;
104189ff541Sdamien 
105189ff541Sdamien 	int			(*sc_enable)(struct rt2560_softc *);
106189ff541Sdamien 	void			(*sc_disable)(struct rt2560_softc *);
107189ff541Sdamien 
108189ff541Sdamien 	bus_dma_tag_t		sc_dmat;
109189ff541Sdamien 	bus_space_tag_t		sc_st;
110189ff541Sdamien 	bus_space_handle_t	sc_sh;
111189ff541Sdamien 
1128c71b0d2Sdamien 	struct timeout		scan_to;
1138c71b0d2Sdamien 	struct timeout		amrr_to;
114189ff541Sdamien 
115189ff541Sdamien 	int			sc_flags;
116189ff541Sdamien #define RT2560_ENABLED		(1 << 0)
1171aa65ad1Sdamien #define RT2560_UPDATE_SLOT	(1 << 1)
1181aa65ad1Sdamien #define RT2560_SET_SLOTTIME	(1 << 2)
119ef9ee4cbSstsp #define RT2560_PRIO_OACTIVE	(1 << 3)
120ef9ee4cbSstsp #define RT2560_DATA_OACTIVE	(1 << 4)
121189ff541Sdamien 
122189ff541Sdamien 	int			sc_tx_timer;
123189ff541Sdamien 
124189ff541Sdamien 	uint32_t		asic_rev;
125189ff541Sdamien 	uint8_t			rf_rev;
126189ff541Sdamien 
127189ff541Sdamien 	struct rt2560_tx_ring	txq;
128189ff541Sdamien 	struct rt2560_tx_ring	prioq;
129189ff541Sdamien 	struct rt2560_tx_ring	atimq;
130189ff541Sdamien 	struct rt2560_tx_ring	bcnq;
131189ff541Sdamien 	struct rt2560_rx_ring	rxq;
132189ff541Sdamien 
133189ff541Sdamien 	uint32_t		rf_regs[4];
134189ff541Sdamien 	uint8_t			txpow[14];
135189ff541Sdamien 
136189ff541Sdamien 	struct {
137189ff541Sdamien 		uint8_t	reg;
138189ff541Sdamien 		uint8_t	val;
139189ff541Sdamien 	}			bbp_prom[16];
140189ff541Sdamien 
141189ff541Sdamien 	int			led_mode;
142189ff541Sdamien 	int			hw_radio;
143189ff541Sdamien 	int			rx_ant;
144189ff541Sdamien 	int			tx_ant;
145189ff541Sdamien 	int			nb_ant;
146189ff541Sdamien 
1471aa65ad1Sdamien 	uint8_t			*erp;
1481aa65ad1Sdamien 
149189ff541Sdamien #if NBPFILTER > 0
150189ff541Sdamien 	caddr_t			sc_drvbpf;
151189ff541Sdamien 
152189ff541Sdamien 	union {
153189ff541Sdamien 		struct rt2560_rx_radiotap_header th;
154189ff541Sdamien 		uint8_t	pad[64];
155189ff541Sdamien 	}			sc_rxtapu;
156189ff541Sdamien #define sc_rxtap		sc_rxtapu.th
157189ff541Sdamien 	int			sc_rxtap_len;
158189ff541Sdamien 
159189ff541Sdamien 	union {
160189ff541Sdamien 		struct rt2560_tx_radiotap_header th;
161189ff541Sdamien 		uint8_t	pad[64];
162189ff541Sdamien 	}			sc_txtapu;
163189ff541Sdamien #define sc_txtap		sc_txtapu.th
164189ff541Sdamien 	int			sc_txtap_len;
165189ff541Sdamien #endif
166189ff541Sdamien };
167189ff541Sdamien 
168189ff541Sdamien int	rt2560_attach(void *, int);
169189ff541Sdamien int	rt2560_detach(void *);
1700727ce2fSdamien void	rt2560_suspend(void *);
171*37ecb596Sderaadt void	rt2560_wakeup(void *);
172189ff541Sdamien int	rt2560_intr(void *);
173