1/*	$FreeBSD$	*/
2
3/*-
4 * Copyright (c) 2005, 2006
5 *	Damien Bergamini <damien.bergamini@free.fr>
6 *
7 * Permission to use, copy, modify, and distribute this software for any
8 * purpose with or without fee is hereby granted, provided that the above
9 * copyright notice and this permission notice appear in all copies.
10 *
11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18 */
19
20struct rt2560_rx_radiotap_header {
21	struct ieee80211_radiotap_header wr_ihdr;
22	uint64_t	wr_tsf;
23	uint8_t		wr_flags;
24	uint8_t		wr_rate;
25	uint16_t	wr_chan_freq;
26	uint16_t	wr_chan_flags;
27	int8_t		wr_antsignal;
28	int8_t		wr_antnoise;
29	uint8_t		wr_antenna;
30} __packed __aligned(8);
31
32#define RT2560_RX_RADIOTAP_PRESENT					\
33	((1 << IEEE80211_RADIOTAP_TSFT) |				\
34	 (1 << IEEE80211_RADIOTAP_FLAGS) |				\
35	 (1 << IEEE80211_RADIOTAP_RATE) |				\
36	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
37	 (1 << IEEE80211_RADIOTAP_ANTENNA) |				\
38	 (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) |			\
39	 (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE))
40
41struct rt2560_tx_radiotap_header {
42	struct ieee80211_radiotap_header wt_ihdr;
43	uint8_t		wt_flags;
44	uint8_t		wt_rate;
45	uint16_t	wt_chan_freq;
46	uint16_t	wt_chan_flags;
47	uint8_t		wt_antenna;
48} __packed;
49
50#define RT2560_TX_RADIOTAP_PRESENT					\
51	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
52	 (1 << IEEE80211_RADIOTAP_RATE) |				\
53	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
54	 (1 << IEEE80211_RADIOTAP_ANTENNA))
55
56struct rt2560_tx_data {
57	bus_dmamap_t			map;
58	struct mbuf			*m;
59	struct ieee80211_node		*ni;
60	uint8_t				rix;
61	int8_t				rssi;
62};
63
64struct rt2560_tx_ring {
65	bus_dma_tag_t		desc_dmat;
66	bus_dma_tag_t		data_dmat;
67	bus_dmamap_t		desc_map;
68	bus_addr_t		physaddr;
69	struct rt2560_tx_desc	*desc;
70	struct rt2560_tx_data	*data;
71	int			count;
72	int			queued;
73	int			cur;
74	int			next;
75	int			cur_encrypt;
76	int			next_encrypt;
77};
78
79struct rt2560_rx_data {
80	bus_dmamap_t	map;
81	struct mbuf	*m;
82	int		drop;
83};
84
85struct rt2560_rx_ring {
86	bus_dma_tag_t		desc_dmat;
87	bus_dma_tag_t		data_dmat;
88	bus_dmamap_t		desc_map;
89	bus_addr_t		physaddr;
90	struct rt2560_rx_desc	*desc;
91	struct rt2560_rx_data	*data;
92	int			count;
93	int			cur;
94	int			next;
95	int			cur_decrypt;
96};
97
98struct rt2560_vap {
99	struct ieee80211vap	ral_vap;
100
101	int			(*ral_newstate)(struct ieee80211vap *,
102				    enum ieee80211_state, int);
103};
104#define	RT2560_VAP(vap)		((struct rt2560_vap *)(vap))
105
106struct rt2560_softc {
107	struct ieee80211com	sc_ic;
108	struct ieee80211_ratectl_tx_status sc_txs;
109	struct mtx		sc_mtx;
110	struct mbufq		sc_snd;
111	device_t		sc_dev;
112	bus_space_tag_t		sc_st;
113	bus_space_handle_t	sc_sh;
114
115	struct callout		watchdog_ch;
116
117	int			sc_tx_timer;
118	int                     sc_invalid;
119	int			sc_debug;
120/*
121 * The same in both up to here
122 * ------------------------------------------------
123 */
124	uint32_t		asic_rev;
125	uint32_t		eeprom_rev;
126	uint8_t			rf_rev;
127	uint8_t			rssi_corr;
128
129	struct rt2560_tx_ring	txq;
130	struct rt2560_tx_ring	prioq;
131	struct rt2560_tx_ring	atimq;
132	struct rt2560_tx_ring	bcnq;
133	struct rt2560_rx_ring	rxq;
134
135	uint32_t		rf_regs[4];
136	uint8_t			txpow[14];
137
138	struct {
139		uint8_t	reg;
140		uint8_t	val;
141	}			bbp_prom[16];
142
143	int			led_mode;
144	int			hw_radio;
145	int			rx_ant;
146	int			tx_ant;
147	int			nb_ant;
148
149	struct rt2560_rx_radiotap_header sc_rxtap;
150	struct rt2560_tx_radiotap_header sc_txtap;
151
152#define RT2560_F_INPUT_RUNNING	0x1
153#define RT2560_F_RUNNING	0x2
154	int			sc_flags;
155};
156
157int	rt2560_attach(device_t, int);
158int	rt2560_detach(void *);
159void	rt2560_stop(void *);
160void	rt2560_resume(void *);
161void	rt2560_intr(void *);
162
163#define RAL_LOCK(sc)		mtx_lock(&(sc)->sc_mtx)
164#define RAL_LOCK_ASSERT(sc)	mtx_assert(&(sc)->sc_mtx, MA_OWNED)
165#define RAL_UNLOCK(sc)		mtx_unlock(&(sc)->sc_mtx)
166