xref: /dflybsd-src/sys/bus/u4b/wlan/if_runvar.h (revision d52983bd375e758dd7e2652a3e19a2f2631688a6)
112bd3c8bSSascha Wildner /*	$OpenBSD: if_runvar.h,v 1.3 2009/03/26 20:17:27 damien Exp $	*/
212bd3c8bSSascha Wildner 
312bd3c8bSSascha Wildner /*-
412bd3c8bSSascha Wildner  * Copyright (c) 2008,2009 Damien Bergamini <damien.bergamini@free.fr>
512bd3c8bSSascha Wildner  * ported to FreeBSD by Akinori Furukoshi <moonlightakkiy@yahoo.ca>
612bd3c8bSSascha Wildner  * USB Consulting, Hans Petter Selasky <hselasky@freebsd.org>
712bd3c8bSSascha Wildner  *
812bd3c8bSSascha Wildner  * Permission to use, copy, modify, and distribute this software for any
912bd3c8bSSascha Wildner  * purpose with or without fee is hereby granted, provided that the above
1012bd3c8bSSascha Wildner  * copyright notice and this permission notice appear in all copies.
1112bd3c8bSSascha Wildner  *
1212bd3c8bSSascha Wildner  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1312bd3c8bSSascha Wildner  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1412bd3c8bSSascha Wildner  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1512bd3c8bSSascha Wildner  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1612bd3c8bSSascha Wildner  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1712bd3c8bSSascha Wildner  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1812bd3c8bSSascha Wildner  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1912bd3c8bSSascha Wildner  *
20*d52983bdSImre Vadász  * $FreeBSD: head/sys/dev/usb/wlan/if_runvar.h 296356 2016-03-03 20:06:16Z avos $
2112bd3c8bSSascha Wildner  */
2212bd3c8bSSascha Wildner 
2312bd3c8bSSascha Wildner #ifndef _IF_RUNVAR_H_
2412bd3c8bSSascha Wildner #define	_IF_RUNVAR_H_
2512bd3c8bSSascha Wildner 
2612bd3c8bSSascha Wildner #define	RUN_MAX_RXSZ			\
2712bd3c8bSSascha Wildner 	MIN(4096, MJUMPAGESIZE)
28cea9a87bSSascha Wildner 
2912bd3c8bSSascha Wildner /* NB: "11" is the maximum number of padding bytes needed for Tx */
3012bd3c8bSSascha Wildner #define	RUN_MAX_TXSZ			\
3112bd3c8bSSascha Wildner 	(sizeof (struct rt2870_txd) +	\
32cea9a87bSSascha Wildner 	 sizeof (struct rt2860_txwi) +	\
3312bd3c8bSSascha Wildner 	 MCLBYTES + 11)
3412bd3c8bSSascha Wildner 
3512bd3c8bSSascha Wildner #define	RUN_TX_TIMEOUT	5000	/* ms */
3612bd3c8bSSascha Wildner 
3712bd3c8bSSascha Wildner /* Tx ring count was 8/endpoint, now 32 for all 4 (or 6) endpoints. */
3812bd3c8bSSascha Wildner #define	RUN_TX_RING_COUNT	32
3912bd3c8bSSascha Wildner #define	RUN_RX_RING_COUNT	1
4012bd3c8bSSascha Wildner 
4112bd3c8bSSascha Wildner #define	RT2870_WCID_MAX		64
4212bd3c8bSSascha Wildner #define	RUN_AID2WCID(aid)	((aid) & 0xff)
4312bd3c8bSSascha Wildner 
4412bd3c8bSSascha Wildner #define	RUN_VAP_MAX		8
4512bd3c8bSSascha Wildner 
4612bd3c8bSSascha Wildner struct run_rx_radiotap_header {
4712bd3c8bSSascha Wildner 	struct ieee80211_radiotap_header wr_ihdr;
48*d52983bdSImre Vadász 	uint64_t	wr_tsf;
4912bd3c8bSSascha Wildner 	uint8_t		wr_flags;
5012bd3c8bSSascha Wildner 	uint8_t		wr_rate;
5112bd3c8bSSascha Wildner 	uint16_t	wr_chan_freq;
5212bd3c8bSSascha Wildner 	uint16_t	wr_chan_flags;
5312bd3c8bSSascha Wildner 	int8_t		wr_dbm_antsignal;
5412bd3c8bSSascha Wildner 	uint8_t		wr_antenna;
5512bd3c8bSSascha Wildner 	uint8_t		wr_antsignal;
56cea9a87bSSascha Wildner } __packed __aligned(8);
5712bd3c8bSSascha Wildner 
5812bd3c8bSSascha Wildner #define	RUN_RX_RADIOTAP_PRESENT				\
59*d52983bdSImre Vadász 	(1 << IEEE80211_RADIOTAP_TSFT |			\
60*d52983bdSImre Vadász 	 1 << IEEE80211_RADIOTAP_FLAGS |		\
6112bd3c8bSSascha Wildner 	 1 << IEEE80211_RADIOTAP_RATE |			\
6212bd3c8bSSascha Wildner 	 1 << IEEE80211_RADIOTAP_CHANNEL |		\
6312bd3c8bSSascha Wildner 	 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL |	\
6412bd3c8bSSascha Wildner 	 1 << IEEE80211_RADIOTAP_ANTENNA |		\
6512bd3c8bSSascha Wildner 	 1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL)
6612bd3c8bSSascha Wildner 
6712bd3c8bSSascha Wildner struct run_tx_radiotap_header {
6812bd3c8bSSascha Wildner 	struct ieee80211_radiotap_header wt_ihdr;
69*d52983bdSImre Vadász 	uint64_t	wt_tsf;
7012bd3c8bSSascha Wildner 	uint8_t		wt_flags;
7112bd3c8bSSascha Wildner 	uint8_t		wt_rate;
7212bd3c8bSSascha Wildner 	uint16_t	wt_chan_freq;
7312bd3c8bSSascha Wildner 	uint16_t	wt_chan_flags;
7412bd3c8bSSascha Wildner 	uint8_t		wt_hwqueue;
75cea9a87bSSascha Wildner } __packed __aligned(8);
7612bd3c8bSSascha Wildner 
7712bd3c8bSSascha Wildner #define IEEE80211_RADIOTAP_HWQUEUE 15
7812bd3c8bSSascha Wildner 
7912bd3c8bSSascha Wildner #define	RUN_TX_RADIOTAP_PRESENT				\
80*d52983bdSImre Vadász 	(1 << IEEE80211_RADIOTAP_TSFT |			\
81*d52983bdSImre Vadász 	 1 << IEEE80211_RADIOTAP_FLAGS |		\
8212bd3c8bSSascha Wildner 	 1 << IEEE80211_RADIOTAP_RATE |			\
8312bd3c8bSSascha Wildner 	 1 << IEEE80211_RADIOTAP_CHANNEL |		\
8412bd3c8bSSascha Wildner 	 1 << IEEE80211_RADIOTAP_HWQUEUE)
8512bd3c8bSSascha Wildner 
8612bd3c8bSSascha Wildner struct run_softc;
8712bd3c8bSSascha Wildner 
8812bd3c8bSSascha Wildner struct run_tx_data {
8912bd3c8bSSascha Wildner 	STAILQ_ENTRY(run_tx_data)	next;
9012bd3c8bSSascha Wildner 	struct run_softc	*sc;
9112bd3c8bSSascha Wildner 	struct mbuf		*m;
9212bd3c8bSSascha Wildner 	struct ieee80211_node	*ni;
9312bd3c8bSSascha Wildner 	uint32_t align[0];	/* dummy field */
9412bd3c8bSSascha Wildner 	uint8_t	desc[sizeof(struct rt2870_txd) +
9512bd3c8bSSascha Wildner 		     sizeof(struct rt2860_txwi)];
9612bd3c8bSSascha Wildner 	uint8_t			ridx;
9712bd3c8bSSascha Wildner };
9812bd3c8bSSascha Wildner STAILQ_HEAD(run_tx_data_head, run_tx_data);
9912bd3c8bSSascha Wildner 
10012bd3c8bSSascha Wildner struct run_node {
10112bd3c8bSSascha Wildner 	struct ieee80211_node	ni;
10212bd3c8bSSascha Wildner 	uint8_t			ridx[IEEE80211_RATE_MAXSIZE];
10312bd3c8bSSascha Wildner 	uint8_t			ctl_ridx[IEEE80211_RATE_MAXSIZE];
10412bd3c8bSSascha Wildner 	uint8_t			amrr_ridx;
10512bd3c8bSSascha Wildner 	uint8_t			mgt_ridx;
10612bd3c8bSSascha Wildner 	uint8_t			fix_ridx;
10712bd3c8bSSascha Wildner };
108*d52983bdSImre Vadász #define RUN_NODE(ni)		((struct run_node *)(ni))
10912bd3c8bSSascha Wildner 
11012bd3c8bSSascha Wildner struct run_cmdq {
11112bd3c8bSSascha Wildner 	void			*arg0;
11212bd3c8bSSascha Wildner 	void			*arg1;
11312bd3c8bSSascha Wildner 	void			(*func)(void *);
11412bd3c8bSSascha Wildner 	struct ieee80211_key	*k;
11512bd3c8bSSascha Wildner 	struct ieee80211_key	key;
11612bd3c8bSSascha Wildner 	uint8_t			mac[IEEE80211_ADDR_LEN];
11712bd3c8bSSascha Wildner 	uint8_t			wcid;
11812bd3c8bSSascha Wildner };
11912bd3c8bSSascha Wildner 
12012bd3c8bSSascha Wildner struct run_vap {
12112bd3c8bSSascha Wildner 	struct ieee80211vap             vap;
12212bd3c8bSSascha Wildner 	struct mbuf			*beacon_mbuf;
12312bd3c8bSSascha Wildner 
12412bd3c8bSSascha Wildner 	int                             (*newstate)(struct ieee80211vap *,
12512bd3c8bSSascha Wildner                                             enum ieee80211_state, int);
126*d52983bdSImre Vadász 	void				(*recv_mgmt)(struct ieee80211_node *,
127*d52983bdSImre Vadász 					    struct mbuf *, int,
128*d52983bdSImre Vadász 					    const struct ieee80211_rx_stats *,
129*d52983bdSImre Vadász 					    int, int);
13012bd3c8bSSascha Wildner 
13112bd3c8bSSascha Wildner 	uint8_t				rvp_id;
13212bd3c8bSSascha Wildner };
13312bd3c8bSSascha Wildner #define	RUN_VAP(vap)	((struct run_vap *)(vap))
13412bd3c8bSSascha Wildner 
13512bd3c8bSSascha Wildner /*
13612bd3c8bSSascha Wildner  * There are 7 bulk endpoints: 1 for RX
13712bd3c8bSSascha Wildner  * and 6 for TX (4 EDCAs + HCCA + Prio).
13812bd3c8bSSascha Wildner  * Update 03-14-2009:  some devices like the Planex GW-US300MiniS
13912bd3c8bSSascha Wildner  * seem to have only 4 TX bulk endpoints (Fukaumi Naoki).
14012bd3c8bSSascha Wildner  */
14112bd3c8bSSascha Wildner enum {
14212bd3c8bSSascha Wildner 	RUN_BULK_TX_BE,		/* = WME_AC_BE */
14312bd3c8bSSascha Wildner 	RUN_BULK_TX_BK,		/* = WME_AC_BK */
14412bd3c8bSSascha Wildner 	RUN_BULK_TX_VI,		/* = WME_AC_VI */
14512bd3c8bSSascha Wildner 	RUN_BULK_TX_VO,		/* = WME_AC_VO */
14612bd3c8bSSascha Wildner 	RUN_BULK_TX_HCCA,
14712bd3c8bSSascha Wildner 	RUN_BULK_TX_PRIO,
14812bd3c8bSSascha Wildner 	RUN_BULK_RX,
14912bd3c8bSSascha Wildner 	RUN_N_XFER,
15012bd3c8bSSascha Wildner };
15112bd3c8bSSascha Wildner 
15212bd3c8bSSascha Wildner #define	RUN_EP_QUEUES	RUN_BULK_RX
15312bd3c8bSSascha Wildner 
15412bd3c8bSSascha Wildner struct run_endpoint_queue {
15512bd3c8bSSascha Wildner 	struct run_tx_data		tx_data[RUN_TX_RING_COUNT];
15612bd3c8bSSascha Wildner 	struct run_tx_data_head		tx_qh;
15712bd3c8bSSascha Wildner 	struct run_tx_data_head		tx_fh;
15812bd3c8bSSascha Wildner 	uint32_t			tx_nfree;
15912bd3c8bSSascha Wildner };
16012bd3c8bSSascha Wildner 
16112bd3c8bSSascha Wildner struct run_softc {
162*d52983bdSImre Vadász 	struct lock			sc_lock;
163*d52983bdSImre Vadász 	struct ieee80211com		sc_ic;
164*d52983bdSImre Vadász 	struct mbufq			sc_snd;
16512bd3c8bSSascha Wildner 	device_t			sc_dev;
16612bd3c8bSSascha Wildner 	struct usb_device		*sc_udev;
167cea9a87bSSascha Wildner 	int				sc_need_fwload;
168cea9a87bSSascha Wildner 
169cea9a87bSSascha Wildner 	int				sc_flags;
170cea9a87bSSascha Wildner #define	RUN_FLAG_FWLOAD_NEEDED		0x01
171*d52983bdSImre Vadász #define	RUN_RUNNING			0x02
172cea9a87bSSascha Wildner 
17312bd3c8bSSascha Wildner 	uint16_t			wcid_stats[RT2870_WCID_MAX + 1][3];
17412bd3c8bSSascha Wildner #define	RUN_TXCNT	0
17512bd3c8bSSascha Wildner #define	RUN_SUCCESS	1
17612bd3c8bSSascha Wildner #define	RUN_RETRY	2
17712bd3c8bSSascha Wildner 
17812bd3c8bSSascha Wildner 	int				(*sc_srom_read)(struct run_softc *,
17912bd3c8bSSascha Wildner 					    uint16_t, uint16_t *);
18012bd3c8bSSascha Wildner 
18112bd3c8bSSascha Wildner 	uint16_t			mac_ver;
18212bd3c8bSSascha Wildner 	uint16_t			mac_rev;
183cea9a87bSSascha Wildner 	uint16_t			rf_rev;
18412bd3c8bSSascha Wildner 	uint8_t				freq;
18512bd3c8bSSascha Wildner 	uint8_t				ntxchains;
18612bd3c8bSSascha Wildner 	uint8_t				nrxchains;
18712bd3c8bSSascha Wildner 
18812bd3c8bSSascha Wildner 	uint8_t				bbp25;
18912bd3c8bSSascha Wildner 	uint8_t				bbp26;
19012bd3c8bSSascha Wildner 	uint8_t				rf24_20mhz;
19112bd3c8bSSascha Wildner 	uint8_t				rf24_40mhz;
19212bd3c8bSSascha Wildner 	uint8_t				patch_dac;
19312bd3c8bSSascha Wildner 	uint8_t				rfswitch;
19412bd3c8bSSascha Wildner 	uint8_t				ext_2ghz_lna;
19512bd3c8bSSascha Wildner 	uint8_t				ext_5ghz_lna;
19612bd3c8bSSascha Wildner 	uint8_t				calib_2ghz;
19712bd3c8bSSascha Wildner 	uint8_t				calib_5ghz;
19812bd3c8bSSascha Wildner 	uint8_t				txmixgain_2ghz;
19912bd3c8bSSascha Wildner 	uint8_t				txmixgain_5ghz;
20012bd3c8bSSascha Wildner 	int8_t				txpow1[54];
20112bd3c8bSSascha Wildner 	int8_t				txpow2[54];
202cea9a87bSSascha Wildner 	int8_t				txpow3[54];
20312bd3c8bSSascha Wildner 	int8_t				rssi_2ghz[3];
20412bd3c8bSSascha Wildner 	int8_t				rssi_5ghz[3];
20512bd3c8bSSascha Wildner 	uint8_t				lna[4];
20612bd3c8bSSascha Wildner 
20712bd3c8bSSascha Wildner 	struct {
20812bd3c8bSSascha Wildner 		uint8_t	reg;
20912bd3c8bSSascha Wildner 		uint8_t	val;
21012bd3c8bSSascha Wildner 	}				bbp[10], rf[10];
21112bd3c8bSSascha Wildner 	uint8_t				leds;
21212bd3c8bSSascha Wildner 	uint16_t			led[3];
21312bd3c8bSSascha Wildner 	uint32_t			txpow20mhz[5];
21412bd3c8bSSascha Wildner 	uint32_t			txpow40mhz_2ghz[5];
21512bd3c8bSSascha Wildner 	uint32_t			txpow40mhz_5ghz[5];
21612bd3c8bSSascha Wildner 
21712bd3c8bSSascha Wildner 	struct run_endpoint_queue	sc_epq[RUN_EP_QUEUES];
21812bd3c8bSSascha Wildner 
21912bd3c8bSSascha Wildner 	struct task                     ratectl_task;
22012bd3c8bSSascha Wildner 	struct usb_callout              ratectl_ch;
22112bd3c8bSSascha Wildner 	uint8_t				ratectl_run;
22212bd3c8bSSascha Wildner #define	RUN_RATECTL_OFF	0
22312bd3c8bSSascha Wildner 
22412bd3c8bSSascha Wildner /* need to be power of 2, otherwise RUN_CMDQ_GET fails */
22512bd3c8bSSascha Wildner #define	RUN_CMDQ_MAX	16
22612bd3c8bSSascha Wildner #define	RUN_CMDQ_MASQ	(RUN_CMDQ_MAX - 1)
22712bd3c8bSSascha Wildner 	struct run_cmdq			cmdq[RUN_CMDQ_MAX];
22812bd3c8bSSascha Wildner 	struct task			cmdq_task;
22912bd3c8bSSascha Wildner 	uint32_t			cmdq_store;
23012bd3c8bSSascha Wildner 	uint8_t				cmdq_exec;
23112bd3c8bSSascha Wildner 	uint8_t				cmdq_run;
23212bd3c8bSSascha Wildner 	uint8_t				cmdq_key_set;
23312bd3c8bSSascha Wildner #define	RUN_CMDQ_ABORT	0
23412bd3c8bSSascha Wildner #define	RUN_CMDQ_GO	1
23512bd3c8bSSascha Wildner 
23612bd3c8bSSascha Wildner 	struct usb_xfer			*sc_xfer[RUN_N_XFER];
23712bd3c8bSSascha Wildner 
23812bd3c8bSSascha Wildner 	struct mbuf			*rx_m;
23912bd3c8bSSascha Wildner 
24012bd3c8bSSascha Wildner 	uint8_t				fifo_cnt;
24112bd3c8bSSascha Wildner 
24212bd3c8bSSascha Wildner 	uint8_t				running;
24312bd3c8bSSascha Wildner 	uint8_t				runbmap;
24412bd3c8bSSascha Wildner 	uint8_t				ap_running;
24512bd3c8bSSascha Wildner 	uint8_t				adhoc_running;
24612bd3c8bSSascha Wildner 	uint8_t				sta_running;
24712bd3c8bSSascha Wildner 	uint8_t				rvp_cnt;
24812bd3c8bSSascha Wildner 	uint8_t				rvp_bmap;
24910f2cea7SSascha Wildner 	uint8_t				sc_detached;
25012bd3c8bSSascha Wildner 
251*d52983bdSImre Vadász 	uint8_t				sc_bssid[IEEE80211_ADDR_LEN];
252*d52983bdSImre Vadász 
25312bd3c8bSSascha Wildner 	union {
25412bd3c8bSSascha Wildner 		struct run_rx_radiotap_header th;
25512bd3c8bSSascha Wildner 		uint8_t	pad[64];
25612bd3c8bSSascha Wildner 	}				sc_rxtapu;
25712bd3c8bSSascha Wildner #define sc_rxtap	sc_rxtapu.th
25812bd3c8bSSascha Wildner 
25912bd3c8bSSascha Wildner 	union {
26012bd3c8bSSascha Wildner 		struct run_tx_radiotap_header th;
26112bd3c8bSSascha Wildner 		uint8_t	pad[64];
26212bd3c8bSSascha Wildner 	}				sc_txtapu;
26312bd3c8bSSascha Wildner #define sc_txtap	sc_txtapu.th
26412bd3c8bSSascha Wildner };
26512bd3c8bSSascha Wildner 
26610f2cea7SSascha Wildner #define	RUN_LOCK(sc)		lockmgr(&(sc)->sc_lock, LK_EXCLUSIVE)
26710f2cea7SSascha Wildner #define	RUN_UNLOCK(sc)		lockmgr(&(sc)->sc_lock, LK_RELEASE)
26810f2cea7SSascha Wildner #define	RUN_LOCK_ASSERT(sc, t)	KKASSERT(lockstatus(&(sc)->sc_lock, curthread) != 0)
26912bd3c8bSSascha Wildner 
27012bd3c8bSSascha Wildner #endif	/* _IF_RUNVAR_H_ */
271