if_rumvar.h revision 288619
1188417Sthompsa/*	$FreeBSD: head/sys/dev/usb/wlan/if_rumvar.h 288619 2015-10-03 17:18:35Z adrian $	*/
2184610Salfred
3184610Salfred/*-
4184610Salfred * Copyright (c) 2005, 2006 Damien Bergamini <damien.bergamini@free.fr>
5184610Salfred * Copyright (c) 2006 Niall O'Higgins <niallo@openbsd.org>
6184610Salfred *
7184610Salfred * Permission to use, copy, modify, and distribute this software for any
8184610Salfred * purpose with or without fee is hereby granted, provided that the above
9184610Salfred * copyright notice and this permission notice appear in all copies.
10184610Salfred *
11184610Salfred * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12184610Salfred * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13184610Salfred * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14184610Salfred * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15184610Salfred * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16184610Salfred * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17184610Salfred * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18184610Salfred */
19184610Salfred
20188417Sthompsa#define RUM_TX_LIST_COUNT	8
21188969Sthompsa#define RUM_TX_MINFREE		2
22184610Salfred
23184610Salfredstruct rum_rx_radiotap_header {
24184610Salfred	struct ieee80211_radiotap_header wr_ihdr;
25288604Sadrian	uint64_t	wr_tsf;
26188417Sthompsa	uint8_t		wr_flags;
27188417Sthompsa	uint8_t		wr_rate;
28188417Sthompsa	uint16_t	wr_chan_freq;
29188417Sthompsa	uint16_t	wr_chan_flags;
30192468Ssam	int8_t		wr_antsignal;
31192468Ssam	int8_t		wr_antnoise;
32188417Sthompsa	uint8_t		wr_antenna;
33253757Shselasky} __packed __aligned(8);
34184610Salfred
35188417Sthompsa#define RT2573_RX_RADIOTAP_PRESENT					\
36288604Sadrian	((1 << IEEE80211_RADIOTAP_TSFT) |				\
37288604Sadrian	 (1 << IEEE80211_RADIOTAP_FLAGS) |				\
38184610Salfred	 (1 << IEEE80211_RADIOTAP_RATE) |				\
39184610Salfred	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
40192468Ssam	 (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) |			\
41192468Ssam	 (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) |			\
42184610Salfred	 (1 << IEEE80211_RADIOTAP_ANTENNA) |				\
43192468Ssam	 0)
44184610Salfred
45184610Salfredstruct rum_tx_radiotap_header {
46184610Salfred	struct ieee80211_radiotap_header wt_ihdr;
47288604Sadrian	uint64_t	wt_tsf;
48188417Sthompsa	uint8_t		wt_flags;
49188417Sthompsa	uint8_t		wt_rate;
50188417Sthompsa	uint16_t	wt_chan_freq;
51188417Sthompsa	uint16_t	wt_chan_flags;
52188417Sthompsa	uint8_t		wt_antenna;
53253757Shselasky} __packed __aligned(8);
54184610Salfred
55188417Sthompsa#define RT2573_TX_RADIOTAP_PRESENT					\
56288604Sadrian	((1 << IEEE80211_RADIOTAP_TSFT) |				\
57288604Sadrian	 (1 << IEEE80211_RADIOTAP_FLAGS) |				\
58184610Salfred	 (1 << IEEE80211_RADIOTAP_RATE) |				\
59184610Salfred	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
60184610Salfred	 (1 << IEEE80211_RADIOTAP_ANTENNA))
61184610Salfred
62188417Sthompsastruct rum_softc;
63184610Salfred
64188417Sthompsastruct rum_tx_data {
65188417Sthompsa	STAILQ_ENTRY(rum_tx_data)	next;
66188417Sthompsa	struct rum_softc		*sc;
67188417Sthompsa	struct rum_tx_desc		desc;
68188417Sthompsa	struct mbuf			*m;
69188417Sthompsa	struct ieee80211_node		*ni;
70188417Sthompsa	int				rate;
71188417Sthompsa};
72188417Sthompsatypedef STAILQ_HEAD(, rum_tx_data) rum_txdhead;
73188417Sthompsa
74288532Sadrianunion sec_param {
75288532Sadrian	struct ieee80211_key		key;
76288532Sadrian	uint8_t				macaddr[IEEE80211_ADDR_LEN];
77288532Sadrian	struct ieee80211vap		*vap;
78288532Sadrian};
79288532Sadrian#define CMD_FUNC_PROTO			void (*func)(struct rum_softc *, \
80288532Sadrian					    union sec_param *, uint8_t, \
81288532Sadrian					    uint8_t)
82288532Sadrian
83288532Sadrianstruct rum_cmdq {
84288532Sadrian	union sec_param			data;
85288532Sadrian
86288532Sadrian	uint8_t				rn_id;
87288532Sadrian	uint8_t				rvp_id;
88288532Sadrian
89288532Sadrian	CMD_FUNC_PROTO;
90288532Sadrian};
91288532Sadrian#define RUM_CMDQ_SIZE			16
92288532Sadrian
93188417Sthompsastruct rum_vap {
94188417Sthompsa	struct ieee80211vap		vap;
95206358Srpaulo	struct usb_callout		ratectl_ch;
96206358Srpaulo	struct task			ratectl_task;
97188417Sthompsa
98188417Sthompsa	int				(*newstate)(struct ieee80211vap *,
99188417Sthompsa					    enum ieee80211_state, int);
100188417Sthompsa};
101188417Sthompsa#define	RUM_VAP(vap)	((struct rum_vap *)(vap))
102188417Sthompsa
103187259Sthompsaenum {
104188417Sthompsa	RUM_BULK_WR,
105188417Sthompsa	RUM_BULK_RD,
106188417Sthompsa	RUM_N_TRANSFER = 2,
107187259Sthompsa};
108187259Sthompsa
109184610Salfredstruct rum_softc {
110287197Sglebius	struct ieee80211com		sc_ic;
111287197Sglebius	struct mbufq			sc_snd;
112188417Sthompsa	device_t			sc_dev;
113192984Sthompsa	struct usb_device		*sc_udev;
114184610Salfred
115288531Sadrian	struct usb_xfer			*sc_xfer[RUM_N_TRANSFER];
116184610Salfred
117188417Sthompsa	uint8_t				rf_rev;
118188417Sthompsa	uint8_t				rffreq;
119184610Salfred
120188419Sthompsa	struct rum_tx_data		tx_data[RUM_TX_LIST_COUNT];
121188417Sthompsa	rum_txdhead			tx_q;
122188417Sthompsa	rum_txdhead			tx_free;
123188417Sthompsa	int				tx_nfree;
124188417Sthompsa	struct rum_rx_desc		sc_rx_desc;
125184610Salfred
126188417Sthompsa	struct mtx			sc_mtx;
127184610Salfred
128288532Sadrian	struct rum_cmdq			cmdq[RUM_CMDQ_SIZE];
129288532Sadrian	struct mtx			cmdq_mtx;
130288532Sadrian	struct task			cmdq_task;
131288532Sadrian	uint8_t				cmdq_first;
132288532Sadrian	uint8_t				cmdq_last;
133288532Sadrian
134188417Sthompsa	uint32_t			sta[6];
135188417Sthompsa	uint32_t			rf_regs[4];
136188417Sthompsa	uint8_t				txpow[44];
137287197Sglebius	u_int				sc_detached:1,
138287197Sglebius					sc_running:1;
139184610Salfred
140288619Sadrian	uint8_t				sc_bssid[IEEE80211_ADDR_LEN];
141288619Sadrian
142188417Sthompsa	struct {
143188417Sthompsa		uint8_t	val;
144188417Sthompsa		uint8_t	reg;
145188417Sthompsa	} __packed			bbp_prom[16];
146188417Sthompsa
147188417Sthompsa	int				hw_radio;
148188417Sthompsa	int				rx_ant;
149188417Sthompsa	int				tx_ant;
150188417Sthompsa	int				nb_ant;
151188417Sthompsa	int				ext_2ghz_lna;
152188417Sthompsa	int				ext_5ghz_lna;
153188417Sthompsa	int				rssi_2ghz_corr;
154188417Sthompsa	int				rssi_5ghz_corr;
155188417Sthompsa	uint8_t				bbp17;
156188417Sthompsa
157188417Sthompsa	struct rum_rx_radiotap_header	sc_rxtap;
158188417Sthompsa	struct rum_tx_radiotap_header	sc_txtap;
159184610Salfred};
160188417Sthompsa
161288532Sadrian#define RUM_LOCK_INIT(sc) \
162288532Sadrian	mtx_init(&(sc)->sc_mtx, device_get_nameunit((sc)->sc_dev), \
163288532Sadrian	    MTX_NETWORK_LOCK, MTX_DEF);
164288532Sadrian#define RUM_LOCK(sc)			mtx_lock(&(sc)->sc_mtx)
165288532Sadrian#define RUM_UNLOCK(sc)			mtx_unlock(&(sc)->sc_mtx)
166288532Sadrian#define RUM_LOCK_ASSERT(sc)		mtx_assert(&(sc)->sc_mtx, MA_OWNED)
167288532Sadrian#define RUM_LOCK_DESTROY(sc)		mtx_destroy(&(sc)->sc_mtx)
168288532Sadrian
169288532Sadrian#define RUM_CMDQ_LOCK_INIT(sc) \
170288532Sadrian	mtx_init(&(sc)->cmdq_mtx, "cmdq lock", NULL, MTX_DEF)
171288532Sadrian#define RUM_CMDQ_LOCK(sc)		mtx_lock(&(sc)->cmdq_mtx)
172288532Sadrian#define RUM_CMDQ_UNLOCK(sc)		mtx_unlock(&(sc)->cmdq_mtx)
173288532Sadrian#define RUM_CMDQ_LOCK_DESTROY(sc)	mtx_destroy(&(sc)->cmdq_mtx)
174