if_uralvar.h revision 189123
1169695Skan/*	$FreeBSD: head/sys/dev/usb/wlan/if_uralvar.h 189123 2009-02-27 21:14:29Z thompsa $	*/
2169695Skan
3169695Skan/*-
4169695Skan * Copyright (c) 2005
5169695Skan *	Damien Bergamini <damien.bergamini@free.fr>
6169695Skan *
7169695Skan * Permission to use, copy, modify, and distribute this software for any
8169695Skan * purpose with or without fee is hereby granted, provided that the above
9169695Skan * copyright notice and this permission notice appear in all copies.
10169695Skan *
11169695Skan * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12169695Skan * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13169695Skan * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14169695Skan * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15169695Skan * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16169695Skan * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17169695Skan * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18169695Skan */
19169695Skan
20169695Skan#define RAL_TX_LIST_COUNT	8
21169695Skan#define RAL_TX_MINFREE		2
22169695Skan
23169695Skan#define URAL_SCAN_START         1
24169695Skan#define URAL_SCAN_END           2
25169695Skan#define URAL_SET_CHANNEL        3
26169695Skan
27169695Skan
28169695Skanstruct ural_rx_radiotap_header {
29169695Skan	struct ieee80211_radiotap_header wr_ihdr;
30169695Skan	uint8_t		wr_flags;
31169695Skan	uint8_t		wr_rate;
32169695Skan	uint16_t	wr_chan_freq;
33169695Skan	uint16_t	wr_chan_flags;
34169695Skan	uint8_t		wr_antenna;
35169695Skan	uint8_t		wr_antsignal;
36169695Skan};
37169695Skan
38169695Skan#define RAL_RX_RADIOTAP_PRESENT						\
39169695Skan	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
40169695Skan	 (1 << IEEE80211_RADIOTAP_RATE) |				\
41169695Skan	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
42169695Skan	 (1 << IEEE80211_RADIOTAP_ANTENNA) |				\
43169695Skan	 (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL))
44169695Skan
45169695Skanstruct ural_tx_radiotap_header {
46169695Skan	struct ieee80211_radiotap_header wt_ihdr;
47169695Skan	uint8_t		wt_flags;
48169695Skan	uint8_t		wt_rate;
49169695Skan	uint16_t	wt_chan_freq;
50169695Skan	uint16_t	wt_chan_flags;
51169695Skan	uint8_t		wt_antenna;
52169695Skan};
53169695Skan
54169695Skan#define RAL_TX_RADIOTAP_PRESENT						\
55169695Skan	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
56169695Skan	 (1 << IEEE80211_RADIOTAP_RATE) |				\
57169695Skan	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
58169695Skan	 (1 << IEEE80211_RADIOTAP_ANTENNA))
59169695Skan
60169695Skanstruct ural_softc;
61169695Skan
62169695Skanstruct ural_task {
63169695Skan	struct usb2_proc_msg	hdr;
64169695Skan	usb2_proc_callback_t	*func;
65169695Skan	struct ural_softc	*sc;
66169695Skan};
67169695Skan
68169695Skanstruct ural_tx_data {
69169695Skan	STAILQ_ENTRY(ural_tx_data)	next;
70169695Skan	struct ural_softc		*sc;
71169695Skan	struct ural_tx_desc		desc;
72169695Skan	struct mbuf			*m;
73169695Skan	struct ieee80211_node		*ni;
74169695Skan	int				rate;
75169695Skan};
76169695Skantypedef STAILQ_HEAD(, ural_tx_data) ural_txdhead;
77169695Skan
78169695Skanstruct ural_node {
79169695Skan	struct ieee80211_node		ni;
80169695Skan	struct ieee80211_amrr_node	amn;
81169695Skan};
82169695Skan#define	URAL_NODE(ni)	((struct ural_node *)(ni))
83169695Skan
84169695Skanstruct ural_vap {
85169695Skan	struct ieee80211vap		vap;
86169695Skan	struct ural_softc		*sc;
87169695Skan	struct ieee80211_beacon_offsets	bo;
88169695Skan	struct ieee80211_amrr		amrr;
89169695Skan	struct usb2_callout		amrr_ch;
90169695Skan	struct ural_task		amrr_task[2];
91169695Skan
92169695Skan	int				(*newstate)(struct ieee80211vap *,
93169695Skan					    enum ieee80211_state, int);
94169695Skan};
95169695Skan#define	URAL_VAP(vap)	((struct ural_vap *)(vap))
96169695Skan
97169695Skanenum {
98169695Skan	URAL_BULK_WR,
99169695Skan	URAL_BULK_RD,
100169695Skan	URAL_N_TRANSFER = 2,
101169695Skan};
102169695Skan
103169695Skanstruct ural_softc {
104169695Skan	struct ifnet			*sc_ifp;
105169695Skan	device_t			sc_dev;
106169695Skan	struct usb2_device		*sc_udev;
107169695Skan	struct usb2_process		sc_tq;
108169695Skan
109169695Skan	const struct ieee80211_rate_table *sc_rates;
110169695Skan
111169695Skan	uint32_t			asic_rev;
112169695Skan	uint8_t				rf_rev;
113169695Skan
114169695Skan	struct usb2_xfer		*sc_xfer[URAL_N_TRANSFER];
115169695Skan	struct ural_task		*sc_last_task;
116169695Skan
117169695Skan	enum ieee80211_state		sc_state;
118169695Skan	int				sc_arg;
119169695Skan	int                             sc_scan_action; /* should be an enum */
120169695Skan	struct ural_task		sc_synctask[2];
121169695Skan	struct ural_task		sc_task[2];
122169695Skan	struct ural_task		sc_promisctask[2];
123169695Skan	struct ural_task		sc_scantask[2];
124169695Skan
125169695Skan	struct ural_tx_data		tx_data[RAL_TX_LIST_COUNT];
126169695Skan	ural_txdhead			tx_q;
127169695Skan	ural_txdhead			tx_free;
128169695Skan	int				tx_nfree;
129169695Skan	struct ural_rx_desc		sc_rx_desc;
130169695Skan
131169695Skan	struct mtx			sc_mtx;
132169695Skan	struct cv			sc_cmd_cv;
133169695Skan
134169695Skan	uint16_t			sta[11];
135169695Skan	uint32_t			rf_regs[4];
136169695Skan	uint8_t				txpow[14];
137169695Skan	uint8_t				sc_bssid[6];
138169695Skan
139169695Skan	struct {
140169695Skan		uint8_t			val;
141169695Skan		uint8_t			reg;
142169695Skan	} __packed			bbp_prom[16];
143169695Skan
144169695Skan	int				led_mode;
145169695Skan	int				hw_radio;
146169695Skan	int				rx_ant;
147169695Skan	int				tx_ant;
148169695Skan	int				nb_ant;
149169695Skan
150169695Skan	struct ural_rx_radiotap_header	sc_rxtap;
151169695Skan	int				sc_rxtap_len;
152169695Skan
153169695Skan	struct ural_tx_radiotap_header	sc_txtap;
154169695Skan	int				sc_txtap_len;
155169695Skan};
156169695Skan
157169695Skan#define RAL_LOCK(sc)		mtx_lock(&(sc)->sc_mtx)
158169695Skan#define RAL_UNLOCK(sc)		mtx_unlock(&(sc)->sc_mtx)
159169695Skan#define RAL_LOCK_ASSERT(sc, t)	mtx_assert(&(sc)->sc_mtx, t)
160169695Skan