if_urtwnvar.h revision 292175
1289167Sadrian/*-
2289167Sadrian * Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr>
3289167Sadrian *
4289167Sadrian * Permission to use, copy, modify, and distribute this software for any
5289167Sadrian * purpose with or without fee is hereby granted, provided that the above
6289167Sadrian * copyright notice and this permission notice appear in all copies.
7289167Sadrian *
8289167Sadrian * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
9289167Sadrian * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
10289167Sadrian * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
11289167Sadrian * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
12289167Sadrian * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
13289167Sadrian * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
14289167Sadrian * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
15289167Sadrian *
16289167Sadrian * $OpenBSD: if_urtwnreg.h,v 1.3 2010/11/16 18:02:59 damien Exp $
17289167Sadrian * $FreeBSD: head/sys/dev/usb/wlan/if_urtwnvar.h 292175 2015-12-13 22:00:19Z avos $
18289167Sadrian */
19289167Sadrian
20289167Sadrian#define URTWN_RX_LIST_COUNT		1
21289167Sadrian#define URTWN_TX_LIST_COUNT		8
22289167Sadrian#define URTWN_HOST_CMD_RING_COUNT	32
23289167Sadrian
24289167Sadrian#define URTWN_RXBUFSZ	(16 * 1024)
25289167Sadrian#define URTWN_TXBUFSZ	(sizeof(struct r92c_tx_desc) + IEEE80211_MAX_LEN)
26289167Sadrian#define	URTWN_RX_DESC_SIZE	(sizeof(struct r92c_rx_stat))
27289167Sadrian#define	URTWN_TX_DESC_SIZE	(sizeof(struct r92c_tx_desc))
28289167Sadrian
29289167Sadrian#define URTWN_TX_TIMEOUT	5000	/* ms */
30289167Sadrian
31289167Sadrian#define URTWN_LED_LINK	0
32289167Sadrian#define URTWN_LED_DATA	1
33289167Sadrian
34289167Sadrianstruct urtwn_rx_radiotap_header {
35289167Sadrian	struct ieee80211_radiotap_header wr_ihdr;
36289167Sadrian	uint8_t		wr_flags;
37289167Sadrian	uint8_t		wr_rate;
38289167Sadrian	uint16_t	wr_chan_freq;
39289167Sadrian	uint16_t	wr_chan_flags;
40289816Savos	int8_t		wr_dbm_antsignal;
41289816Savos	int8_t		wr_dbm_antnoise;
42289167Sadrian} __packed __aligned(8);
43289167Sadrian
44289167Sadrian#define URTWN_RX_RADIOTAP_PRESENT			\
45289167Sadrian	(1 << IEEE80211_RADIOTAP_FLAGS |		\
46289167Sadrian	 1 << IEEE80211_RADIOTAP_RATE |			\
47289167Sadrian	 1 << IEEE80211_RADIOTAP_CHANNEL |		\
48289816Savos	 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL |	\
49289816Savos	 1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)
50289167Sadrian
51289167Sadrianstruct urtwn_tx_radiotap_header {
52289167Sadrian	struct ieee80211_radiotap_header wt_ihdr;
53289167Sadrian	uint8_t		wt_flags;
54289167Sadrian	uint16_t	wt_chan_freq;
55289167Sadrian	uint16_t	wt_chan_flags;
56289167Sadrian} __packed __aligned(8);
57289167Sadrian
58289167Sadrian#define URTWN_TX_RADIOTAP_PRESENT			\
59289167Sadrian	(1 << IEEE80211_RADIOTAP_FLAGS |		\
60289167Sadrian	 1 << IEEE80211_RADIOTAP_CHANNEL)
61289167Sadrian
62289167Sadrianstruct urtwn_softc;
63289167Sadrian
64289167Sadrianstruct urtwn_data {
65289167Sadrian	struct urtwn_softc		*sc;
66289167Sadrian	uint8_t				*buf;
67289167Sadrian	uint16_t			buflen;
68289167Sadrian	struct mbuf			*m;
69289167Sadrian	struct ieee80211_node		*ni;
70289167Sadrian	STAILQ_ENTRY(urtwn_data)	next;
71289167Sadrian};
72289167Sadriantypedef STAILQ_HEAD(, urtwn_data) urtwn_datahead;
73289167Sadrian
74292174Savosunion sec_param {
75292174Savos	struct ieee80211_key		key;
76292174Savos};
77292174Savos
78292174Savos#define CMD_FUNC_PROTO			void (*func)(struct urtwn_softc *, \
79292174Savos					    union sec_param *)
80292174Savos
81289167Sadrianstruct urtwn_cmdq {
82292174Savos	union sec_param			data;
83292174Savos	CMD_FUNC_PROTO;
84289167Sadrian};
85292174Savos#define URTWN_CMDQ_SIZE			16
86289167Sadrian
87289167Sadrianstruct urtwn_fw_info {
88289167Sadrian	const uint8_t		*data;
89289167Sadrian	size_t			size;
90289167Sadrian};
91289167Sadrian
92292167Savosstruct urtwn_node {
93292167Savos	struct ieee80211_node	ni;	/* must be the first */
94292167Savos	uint8_t			id;
95292167Savos};
96292167Savos#define URTWN_NODE(ni)	((struct urtwn_node *)(ni))
97292167Savos
98289167Sadrianstruct urtwn_vap {
99290651Savos	struct ieee80211vap	vap;
100289167Sadrian
101290651Savos	struct r92c_tx_desc	bcn_desc;
102290651Savos	struct mbuf		*bcn_mbuf;
103290651Savos	struct task		tsf_task_adhoc;
104290631Savos
105290651Savos	int			(*newstate)(struct ieee80211vap *,
106290651Savos				    enum ieee80211_state, int);
107290651Savos	void			(*recv_mgmt)(struct ieee80211_node *,
108290651Savos				    struct mbuf *, int,
109290651Savos				    const struct ieee80211_rx_stats *,
110290651Savos				    int, int);
111289167Sadrian};
112289167Sadrian#define	URTWN_VAP(vap)	((struct urtwn_vap *)(vap))
113289167Sadrian
114289167Sadrianstruct urtwn_host_cmd {
115289167Sadrian	void	(*cb)(struct urtwn_softc *, void *);
116289167Sadrian	uint8_t	data[256];
117289167Sadrian};
118289167Sadrian
119289167Sadrianstruct urtwn_cmd_newstate {
120289167Sadrian	enum ieee80211_state	state;
121289167Sadrian	int			arg;
122289167Sadrian};
123289167Sadrian
124289167Sadrianstruct urtwn_cmd_key {
125289167Sadrian	struct ieee80211_key	key;
126289167Sadrian	uint16_t		associd;
127289167Sadrian};
128289167Sadrian
129289167Sadrianenum {
130289167Sadrian	URTWN_BULK_RX,
131289167Sadrian	URTWN_BULK_TX_BE,	/* = WME_AC_BE */
132289167Sadrian	URTWN_BULK_TX_BK,	/* = WME_AC_BK */
133289167Sadrian	URTWN_BULK_TX_VI,	/* = WME_AC_VI */
134289167Sadrian	URTWN_BULK_TX_VO,	/* = WME_AC_VI */
135289167Sadrian	URTWN_N_TRANSFER = 5,
136289167Sadrian};
137289167Sadrian
138289167Sadrian#define	URTWN_EP_QUEUES	URTWN_BULK_RX
139289167Sadrian
140291264Savosunion urtwn_rom {
141291264Savos	struct r92c_rom			r92c_rom;
142291264Savos	uint8_t				r88e_rom[URTWN_EFUSE_MAX_LEN];
143291264Savos};
144291264Savos
145289167Sadrianstruct urtwn_softc {
146289167Sadrian	struct ieee80211com		sc_ic;
147289167Sadrian	struct mbufq			sc_snd;
148289167Sadrian	device_t			sc_dev;
149289167Sadrian	struct usb_device		*sc_udev;
150289167Sadrian
151291902Skevlo	uint8_t				sc_iface_index;
152289167Sadrian	u_int				sc_flags;
153289167Sadrian#define URTWN_FLAG_CCK_HIPWR	0x01
154289167Sadrian#define URTWN_DETACHED		0x02
155289167Sadrian#define	URTWN_RUNNING		0x04
156289167Sadrian
157289167Sadrian	u_int				chip;
158289167Sadrian#define	URTWN_CHIP_92C		0x01
159289167Sadrian#define	URTWN_CHIP_92C_1T2R	0x02
160289167Sadrian#define	URTWN_CHIP_UMC		0x04
161289167Sadrian#define	URTWN_CHIP_UMC_A_CUT	0x08
162289167Sadrian#define	URTWN_CHIP_88E		0x10
163289167Sadrian
164292167Savos#define URTWN_CHIP_HAS_RATECTL(_sc)	(!!((_sc)->chip & URTWN_CHIP_88E))
165292167Savos
166292167Savos	void				(*sc_node_free)(struct ieee80211_node *);
167289167Sadrian	void				(*sc_rf_write)(struct urtwn_softc *,
168289167Sadrian					    int, uint8_t, uint32_t);
169289167Sadrian	int				(*sc_power_on)(struct urtwn_softc *);
170289167Sadrian
171292167Savos	struct ieee80211_node		*node_list[R88E_MACID_MAX];
172292167Savos	struct mtx			nt_mtx;
173292167Savos
174289167Sadrian	uint8_t				board_type;
175289167Sadrian	uint8_t				regulatory;
176289167Sadrian	uint8_t				pa_setting;
177289167Sadrian	int				avg_pwdb;
178289167Sadrian	int				thcal_state;
179289167Sadrian	int				thcal_lctemp;
180289167Sadrian	int				ntxchains;
181289167Sadrian	int				nrxchains;
182289167Sadrian	int				ledlink;
183289167Sadrian	int				sc_txtimer;
184289167Sadrian
185289167Sadrian	int				fwcur;
186289167Sadrian	struct urtwn_data		sc_rx[URTWN_RX_LIST_COUNT];
187289167Sadrian	urtwn_datahead			sc_rx_active;
188289167Sadrian	urtwn_datahead			sc_rx_inactive;
189289167Sadrian	struct urtwn_data		sc_tx[URTWN_TX_LIST_COUNT];
190289167Sadrian	urtwn_datahead			sc_tx_active;
191289167Sadrian	urtwn_datahead			sc_tx_inactive;
192289167Sadrian	urtwn_datahead			sc_tx_pending;
193289167Sadrian
194289167Sadrian	const char			*fwname;
195289167Sadrian	const struct firmware		*fw_fp;
196289167Sadrian	struct urtwn_fw_info		fw;
197289167Sadrian	void				*fw_virtaddr;
198289167Sadrian
199291264Savos	union urtwn_rom			rom;
200289167Sadrian	uint8_t				cck_tx_pwr[6];
201289167Sadrian	uint8_t				ht40_tx_pwr[5];
202289167Sadrian	int8_t				bw20_tx_pwr_diff;
203289167Sadrian	int8_t				ofdm_tx_pwr_diff;
204291264Savos	uint16_t			last_rom_addr;
205289167Sadrian
206289167Sadrian	struct callout			sc_watchdog_ch;
207289167Sadrian	struct mtx			sc_mtx;
208292175Savos	uint32_t			keys_bmap;
209289167Sadrian
210292174Savos	struct urtwn_cmdq		cmdq[URTWN_CMDQ_SIZE];
211292174Savos	struct mtx			cmdq_mtx;
212289167Sadrian	struct task			cmdq_task;
213292174Savos	uint8_t				cmdq_first;
214292174Savos	uint8_t				cmdq_last;
215289167Sadrian
216289167Sadrian	uint32_t			rf_chnlbw[R92C_MAX_CHAINS];
217289167Sadrian	struct usb_xfer			*sc_xfer[URTWN_N_TRANSFER];
218289167Sadrian
219289167Sadrian	struct urtwn_rx_radiotap_header	sc_rxtap;
220289167Sadrian	struct urtwn_tx_radiotap_header	sc_txtap;
221289167Sadrian};
222289167Sadrian
223289167Sadrian#define	URTWN_LOCK(sc)			mtx_lock(&(sc)->sc_mtx)
224289167Sadrian#define	URTWN_UNLOCK(sc)		mtx_unlock(&(sc)->sc_mtx)
225289168Sadrian#define	URTWN_ASSERT_LOCKED(sc)		mtx_assert(&(sc)->sc_mtx, MA_OWNED)
226292167Savos
227292174Savos#define URTWN_CMDQ_LOCK_INIT(sc) \
228292174Savos	mtx_init(&(sc)->cmdq_mtx, "cmdq lock", NULL, MTX_DEF)
229292174Savos#define URTWN_CMDQ_LOCK(sc)		mtx_lock(&(sc)->cmdq_mtx)
230292174Savos#define URTWN_CMDQ_UNLOCK(sc)		mtx_unlock(&(sc)->cmdq_mtx)
231292174Savos#define URTWN_CMDQ_LOCK_DESTROY(sc)	mtx_destroy(&(sc)->cmdq_mtx)
232292174Savos
233292167Savos#define URTWN_NT_LOCK_INIT(sc) \
234292167Savos	mtx_init(&(sc)->nt_mtx, "node table lock", NULL, MTX_DEF)
235292167Savos#define URTWN_NT_LOCK(sc)		mtx_lock(&(sc)->nt_mtx)
236292167Savos#define URTWN_NT_UNLOCK(sc)		mtx_unlock(&(sc)->nt_mtx)
237292167Savos#define URTWN_NT_LOCK_DESTROY(sc)	mtx_destroy(&(sc)->nt_mtx)
238