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: stable/11/sys/dev/urtwn/if_urtwnvar.h 345636 2019-03-28 09:50:25Z avos $
18289167Sadrian */
19289167Sadrian
20297596Sadrian#define URTWN_RX_LIST_COUNT		64
21289167Sadrian#define URTWN_TX_LIST_COUNT		8
22289167Sadrian#define URTWN_HOST_CMD_RING_COUNT	32
23289167Sadrian
24297596Sadrian#define URTWN_RXBUFSZ	(8 * 1024)
25297596Sadrian//#define URTWN_TXBUFSZ	(sizeof(struct r92c_tx_desc) + IEEE80211_MAX_LEN)
26297596Sadrian/* Leave enough space for an A-MSDU frame */
27297596Sadrian#define URTWN_TXBUFSZ	(16 * 1024)
28289167Sadrian#define	URTWN_RX_DESC_SIZE	(sizeof(struct r92c_rx_stat))
29289167Sadrian#define	URTWN_TX_DESC_SIZE	(sizeof(struct r92c_tx_desc))
30289167Sadrian
31289167Sadrian#define URTWN_TX_TIMEOUT	5000	/* ms */
32289167Sadrian
33289167Sadrian#define URTWN_LED_LINK	0
34289167Sadrian#define URTWN_LED_DATA	1
35289167Sadrian
36289167Sadrianstruct urtwn_rx_radiotap_header {
37289167Sadrian	struct ieee80211_radiotap_header wr_ihdr;
38292203Savos	uint64_t	wr_tsft;
39289167Sadrian	uint8_t		wr_flags;
40289167Sadrian	uint8_t		wr_rate;
41289167Sadrian	uint16_t	wr_chan_freq;
42289167Sadrian	uint16_t	wr_chan_flags;
43289816Savos	int8_t		wr_dbm_antsignal;
44289816Savos	int8_t		wr_dbm_antnoise;
45289167Sadrian} __packed __aligned(8);
46289167Sadrian
47289167Sadrian#define URTWN_RX_RADIOTAP_PRESENT			\
48292203Savos	(1 << IEEE80211_RADIOTAP_TSFT |			\
49292203Savos	 1 << IEEE80211_RADIOTAP_FLAGS |		\
50289167Sadrian	 1 << IEEE80211_RADIOTAP_RATE |			\
51289167Sadrian	 1 << IEEE80211_RADIOTAP_CHANNEL |		\
52289816Savos	 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL |	\
53289816Savos	 1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)
54289167Sadrian
55289167Sadrianstruct urtwn_tx_radiotap_header {
56289167Sadrian	struct ieee80211_radiotap_header wt_ihdr;
57289167Sadrian	uint8_t		wt_flags;
58345636Savos	uint8_t		wt_pad;
59289167Sadrian	uint16_t	wt_chan_freq;
60289167Sadrian	uint16_t	wt_chan_flags;
61345636Savos} __packed;
62289167Sadrian
63289167Sadrian#define URTWN_TX_RADIOTAP_PRESENT			\
64289167Sadrian	(1 << IEEE80211_RADIOTAP_FLAGS |		\
65289167Sadrian	 1 << IEEE80211_RADIOTAP_CHANNEL)
66289167Sadrian
67289167Sadrianstruct urtwn_softc;
68289167Sadrian
69289167Sadrianstruct urtwn_data {
70289167Sadrian	struct urtwn_softc		*sc;
71289167Sadrian	uint8_t				*buf;
72289167Sadrian	uint16_t			buflen;
73289167Sadrian	struct mbuf			*m;
74289167Sadrian	struct ieee80211_node		*ni;
75289167Sadrian	STAILQ_ENTRY(urtwn_data)	next;
76289167Sadrian};
77289167Sadriantypedef STAILQ_HEAD(, urtwn_data) urtwn_datahead;
78289167Sadrian
79292174Savosunion sec_param {
80292174Savos	struct ieee80211_key		key;
81292174Savos};
82292174Savos
83292174Savos#define CMD_FUNC_PROTO			void (*func)(struct urtwn_softc *, \
84292174Savos					    union sec_param *)
85292174Savos
86289167Sadrianstruct urtwn_cmdq {
87292174Savos	union sec_param			data;
88292174Savos	CMD_FUNC_PROTO;
89289167Sadrian};
90292174Savos#define URTWN_CMDQ_SIZE			16
91289167Sadrian
92289167Sadrianstruct urtwn_fw_info {
93289167Sadrian	const uint8_t		*data;
94289167Sadrian	size_t			size;
95289167Sadrian};
96289167Sadrian
97292167Savosstruct urtwn_node {
98292167Savos	struct ieee80211_node	ni;	/* must be the first */
99292167Savos	uint8_t			id;
100297910Sadrian	int			last_rssi;
101292167Savos};
102292167Savos#define URTWN_NODE(ni)	((struct urtwn_node *)(ni))
103292167Savos
104289167Sadrianstruct urtwn_vap {
105290651Savos	struct ieee80211vap	vap;
106289167Sadrian
107290651Savos	struct r92c_tx_desc	bcn_desc;
108290651Savos	struct mbuf		*bcn_mbuf;
109290651Savos	struct task		tsf_task_adhoc;
110290631Savos
111301762Savos	const struct ieee80211_key	*keys[IEEE80211_WEP_NKID];
112301762Savos
113290651Savos	int			(*newstate)(struct ieee80211vap *,
114290651Savos				    enum ieee80211_state, int);
115290651Savos	void			(*recv_mgmt)(struct ieee80211_node *,
116290651Savos				    struct mbuf *, int,
117290651Savos				    const struct ieee80211_rx_stats *,
118290651Savos				    int, int);
119289167Sadrian};
120289167Sadrian#define	URTWN_VAP(vap)	((struct urtwn_vap *)(vap))
121289167Sadrian
122289167Sadrianenum {
123289167Sadrian	URTWN_BULK_RX,
124289167Sadrian	URTWN_BULK_TX_BE,	/* = WME_AC_BE */
125289167Sadrian	URTWN_BULK_TX_BK,	/* = WME_AC_BK */
126289167Sadrian	URTWN_BULK_TX_VI,	/* = WME_AC_VI */
127289167Sadrian	URTWN_BULK_TX_VO,	/* = WME_AC_VI */
128289167Sadrian	URTWN_N_TRANSFER = 5,
129289167Sadrian};
130289167Sadrian
131289167Sadrian#define	URTWN_EP_QUEUES	URTWN_BULK_RX
132289167Sadrian
133291264Savosunion urtwn_rom {
134291264Savos	struct r92c_rom			r92c_rom;
135294198Savos	struct r88e_rom			r88e_rom;
136291264Savos};
137291264Savos
138289167Sadrianstruct urtwn_softc {
139289167Sadrian	struct ieee80211com		sc_ic;
140289167Sadrian	struct mbufq			sc_snd;
141289167Sadrian	device_t			sc_dev;
142289167Sadrian	struct usb_device		*sc_udev;
143289167Sadrian
144294471Savos	uint32_t			sc_debug;
145291902Skevlo	uint8_t				sc_iface_index;
146294471Savos	uint8_t				sc_flags;
147289167Sadrian#define URTWN_FLAG_CCK_HIPWR	0x01
148289167Sadrian#define URTWN_DETACHED		0x02
149295871Savos#define URTWN_RUNNING		0x04
150295871Savos#define URTWN_FW_LOADED		0x08
151294473Savos#define URTWN_TEMP_MEASURED	0x10
152289167Sadrian
153289167Sadrian	u_int				chip;
154289167Sadrian#define	URTWN_CHIP_92C		0x01
155289167Sadrian#define	URTWN_CHIP_92C_1T2R	0x02
156289167Sadrian#define	URTWN_CHIP_UMC		0x04
157289167Sadrian#define	URTWN_CHIP_UMC_A_CUT	0x08
158289167Sadrian#define	URTWN_CHIP_88E		0x10
159289167Sadrian
160292167Savos#define URTWN_CHIP_HAS_RATECTL(_sc)	(!!((_sc)->chip & URTWN_CHIP_88E))
161292167Savos
162292167Savos	void				(*sc_node_free)(struct ieee80211_node *);
163289167Sadrian	void				(*sc_rf_write)(struct urtwn_softc *,
164289167Sadrian					    int, uint8_t, uint32_t);
165289167Sadrian	int				(*sc_power_on)(struct urtwn_softc *);
166295874Savos	void				(*sc_power_off)(struct urtwn_softc *);
167289167Sadrian
168292279Savos	struct ieee80211_node		*node_list[R88E_MACID_MAX + 1];
169292167Savos	struct mtx			nt_mtx;
170292167Savos
171289167Sadrian	uint8_t				board_type;
172289167Sadrian	uint8_t				regulatory;
173289167Sadrian	uint8_t				pa_setting;
174294198Savos	int8_t				ofdm_tx_pwr_diff;
175294198Savos	int8_t				bw20_tx_pwr_diff;
176289167Sadrian	int				avg_pwdb;
177294473Savos	uint8_t				thcal_lctemp;
178289167Sadrian	int				ntxchains;
179289167Sadrian	int				nrxchains;
180289167Sadrian	int				ledlink;
181289167Sadrian	int				sc_txtimer;
182289167Sadrian
183297910Sadrian	int				last_rssi;
184297910Sadrian
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;
191297596Sadrian	int				sc_tx_n_active;
192289167Sadrian	urtwn_datahead			sc_tx_inactive;
193289167Sadrian	urtwn_datahead			sc_tx_pending;
194289167Sadrian
195291264Savos	union urtwn_rom			rom;
196291264Savos	uint16_t			last_rom_addr;
197294473Savos
198294473Savos	struct callout			sc_calib_to;
199289167Sadrian	struct callout			sc_watchdog_ch;
200289167Sadrian	struct mtx			sc_mtx;
201292175Savos	uint32_t			keys_bmap;
202289167Sadrian
203292174Savos	struct urtwn_cmdq		cmdq[URTWN_CMDQ_SIZE];
204292174Savos	struct mtx			cmdq_mtx;
205289167Sadrian	struct task			cmdq_task;
206292174Savos	uint8_t				cmdq_first;
207292174Savos	uint8_t				cmdq_last;
208289167Sadrian
209289167Sadrian	uint32_t			rf_chnlbw[R92C_MAX_CHAINS];
210289167Sadrian	struct usb_xfer			*sc_xfer[URTWN_N_TRANSFER];
211289167Sadrian
212289167Sadrian	struct urtwn_rx_radiotap_header	sc_rxtap;
213289167Sadrian	struct urtwn_tx_radiotap_header	sc_txtap;
214289167Sadrian};
215289167Sadrian
216289167Sadrian#define	URTWN_LOCK(sc)			mtx_lock(&(sc)->sc_mtx)
217289167Sadrian#define	URTWN_UNLOCK(sc)		mtx_unlock(&(sc)->sc_mtx)
218289168Sadrian#define	URTWN_ASSERT_LOCKED(sc)		mtx_assert(&(sc)->sc_mtx, MA_OWNED)
219292167Savos
220292174Savos#define URTWN_CMDQ_LOCK_INIT(sc) \
221292174Savos	mtx_init(&(sc)->cmdq_mtx, "cmdq lock", NULL, MTX_DEF)
222292174Savos#define URTWN_CMDQ_LOCK(sc)		mtx_lock(&(sc)->cmdq_mtx)
223292174Savos#define URTWN_CMDQ_UNLOCK(sc)		mtx_unlock(&(sc)->cmdq_mtx)
224292174Savos#define URTWN_CMDQ_LOCK_DESTROY(sc)	mtx_destroy(&(sc)->cmdq_mtx)
225292174Savos
226292167Savos#define URTWN_NT_LOCK_INIT(sc) \
227292167Savos	mtx_init(&(sc)->nt_mtx, "node table lock", NULL, MTX_DEF)
228292167Savos#define URTWN_NT_LOCK(sc)		mtx_lock(&(sc)->nt_mtx)
229292167Savos#define URTWN_NT_UNLOCK(sc)		mtx_unlock(&(sc)->nt_mtx)
230292167Savos#define URTWN_NT_LOCK_DESTROY(sc)	mtx_destroy(&(sc)->nt_mtx)
231