1188417Sthompsa/*	$FreeBSD: stable/11/sys/dev/usb/wlan/if_rumvar.h 345636 2019-03-28 09:50:25Z avos $	*/
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;
47188417Sthompsa	uint8_t		wt_flags;
48188417Sthompsa	uint8_t		wt_rate;
49188417Sthompsa	uint16_t	wt_chan_freq;
50188417Sthompsa	uint16_t	wt_chan_flags;
51188417Sthompsa	uint8_t		wt_antenna;
52345636Savos} __packed;
53184610Salfred
54188417Sthompsa#define RT2573_TX_RADIOTAP_PRESENT					\
55345635Savos	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
56184610Salfred	 (1 << IEEE80211_RADIOTAP_RATE) |				\
57184610Salfred	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
58184610Salfred	 (1 << IEEE80211_RADIOTAP_ANTENNA))
59184610Salfred
60188417Sthompsastruct rum_softc;
61184610Salfred
62188417Sthompsastruct rum_tx_data {
63188417Sthompsa	STAILQ_ENTRY(rum_tx_data)	next;
64188417Sthompsa	struct rum_softc		*sc;
65188417Sthompsa	struct rum_tx_desc		desc;
66188417Sthompsa	struct mbuf			*m;
67188417Sthompsa	struct ieee80211_node		*ni;
68188417Sthompsa	int				rate;
69188417Sthompsa};
70188417Sthompsatypedef STAILQ_HEAD(, rum_tx_data) rum_txdhead;
71188417Sthompsa
72288532Sadrianunion sec_param {
73288532Sadrian	struct ieee80211_key		key;
74288532Sadrian	uint8_t				macaddr[IEEE80211_ADDR_LEN];
75288532Sadrian	struct ieee80211vap		*vap;
76288532Sadrian};
77288532Sadrian#define CMD_FUNC_PROTO			void (*func)(struct rum_softc *, \
78288634Sadrian					    union sec_param *, uint8_t)
79288532Sadrian
80288532Sadrianstruct rum_cmdq {
81288532Sadrian	union sec_param			data;
82288532Sadrian	uint8_t				rvp_id;
83288532Sadrian
84288532Sadrian	CMD_FUNC_PROTO;
85288532Sadrian};
86288532Sadrian#define RUM_CMDQ_SIZE			16
87288532Sadrian
88188417Sthompsastruct rum_vap {
89188417Sthompsa	struct ieee80211vap		vap;
90288623Sadrian	struct mbuf			*bcn_mbuf;
91206358Srpaulo	struct usb_callout		ratectl_ch;
92206358Srpaulo	struct task			ratectl_task;
93288638Sadrian	uint8_t				maxretry;
94188417Sthompsa
95188417Sthompsa	int				(*newstate)(struct ieee80211vap *,
96188417Sthompsa					    enum ieee80211_state, int);
97297171Savos	void				(*bmiss)(struct ieee80211vap *);
98297171Savos	void				(*recv_mgmt)(struct ieee80211_node *,
99297171Savos					    struct mbuf *, int,
100297171Savos					    const struct ieee80211_rx_stats *,
101297171Savos					    int, int);
102188417Sthompsa};
103188417Sthompsa#define	RUM_VAP(vap)	((struct rum_vap *)(vap))
104188417Sthompsa
105187259Sthompsaenum {
106188417Sthompsa	RUM_BULK_WR,
107188417Sthompsa	RUM_BULK_RD,
108188417Sthompsa	RUM_N_TRANSFER = 2,
109187259Sthompsa};
110187259Sthompsa
111184610Salfredstruct rum_softc {
112287197Sglebius	struct ieee80211com		sc_ic;
113287197Sglebius	struct mbufq			sc_snd;
114188417Sthompsa	device_t			sc_dev;
115192984Sthompsa	struct usb_device		*sc_udev;
116184610Salfred
117288531Sadrian	struct usb_xfer			*sc_xfer[RUM_N_TRANSFER];
118184610Salfred
119188417Sthompsa	uint8_t				rf_rev;
120188417Sthompsa	uint8_t				rffreq;
121184610Salfred
122188419Sthompsa	struct rum_tx_data		tx_data[RUM_TX_LIST_COUNT];
123188417Sthompsa	rum_txdhead			tx_q;
124188417Sthompsa	rum_txdhead			tx_free;
125188417Sthompsa	int				tx_nfree;
126188417Sthompsa	struct rum_rx_desc		sc_rx_desc;
127184610Salfred
128188417Sthompsa	struct mtx			sc_mtx;
129184610Salfred
130297171Savos	int				sc_sleep_end;
131297171Savos	int				sc_sleep_time;
132297171Savos	uint8_t				last_rx_flags;
133297171Savos
134288532Sadrian	struct rum_cmdq			cmdq[RUM_CMDQ_SIZE];
135288532Sadrian	struct mtx			cmdq_mtx;
136288532Sadrian	struct task			cmdq_task;
137288532Sadrian	uint8_t				cmdq_first;
138288532Sadrian	uint8_t				cmdq_last;
139288532Sadrian
140188417Sthompsa	uint32_t			sta[6];
141188417Sthompsa	uint32_t			rf_regs[4];
142188417Sthompsa	uint8_t				txpow[44];
143287197Sglebius	u_int				sc_detached:1,
144288633Sadrian					sc_running:1,
145297171Savos					sc_sleeping:1,
146288633Sadrian					sc_clr_shkeys:1;
147184610Salfred
148288619Sadrian	uint8_t				sc_bssid[IEEE80211_ADDR_LEN];
149288642Sadrian	struct wmeParams		wme_params[WME_NUM_AC];
150288619Sadrian
151288633Sadrian	uint8_t				vap_key_count[1];
152288633Sadrian	uint64_t			keys_bmap;
153288633Sadrian
154188417Sthompsa	struct {
155188417Sthompsa		uint8_t	val;
156188417Sthompsa		uint8_t	reg;
157188417Sthompsa	} __packed			bbp_prom[16];
158188417Sthompsa
159188417Sthompsa	int				hw_radio;
160188417Sthompsa	int				rx_ant;
161188417Sthompsa	int				tx_ant;
162188417Sthompsa	int				nb_ant;
163188417Sthompsa	int				ext_2ghz_lna;
164188417Sthompsa	int				ext_5ghz_lna;
165188417Sthompsa	int				rssi_2ghz_corr;
166188417Sthompsa	int				rssi_5ghz_corr;
167188417Sthompsa	uint8_t				bbp17;
168188417Sthompsa
169188417Sthompsa	struct rum_rx_radiotap_header	sc_rxtap;
170188417Sthompsa	struct rum_tx_radiotap_header	sc_txtap;
171184610Salfred};
172188417Sthompsa
173288532Sadrian#define RUM_LOCK_INIT(sc) \
174288532Sadrian	mtx_init(&(sc)->sc_mtx, device_get_nameunit((sc)->sc_dev), \
175288532Sadrian	    MTX_NETWORK_LOCK, MTX_DEF);
176288532Sadrian#define RUM_LOCK(sc)			mtx_lock(&(sc)->sc_mtx)
177288532Sadrian#define RUM_UNLOCK(sc)			mtx_unlock(&(sc)->sc_mtx)
178288532Sadrian#define RUM_LOCK_ASSERT(sc)		mtx_assert(&(sc)->sc_mtx, MA_OWNED)
179288532Sadrian#define RUM_LOCK_DESTROY(sc)		mtx_destroy(&(sc)->sc_mtx)
180288532Sadrian
181288532Sadrian#define RUM_CMDQ_LOCK_INIT(sc) \
182288532Sadrian	mtx_init(&(sc)->cmdq_mtx, "cmdq lock", NULL, MTX_DEF)
183288532Sadrian#define RUM_CMDQ_LOCK(sc)		mtx_lock(&(sc)->cmdq_mtx)
184288532Sadrian#define RUM_CMDQ_UNLOCK(sc)		mtx_unlock(&(sc)->cmdq_mtx)
185288532Sadrian#define RUM_CMDQ_LOCK_DESTROY(sc)	mtx_destroy(&(sc)->cmdq_mtx)
186