xref: /netbsd-src/sys/dev/usb/if_runvar.h (revision c2d905cb6062eb716465168769ac5685a051f269)
1*c2d905cbSgson /*	$NetBSD: if_runvar.h,v 1.9 2020/06/06 13:53:43 gson Exp $	*/
29cdb1c70Snonaka /*	$OpenBSD: if_runvar.h,v 1.8 2010/02/08 18:46:47 damien Exp $	*/
39cdb1c70Snonaka 
49cdb1c70Snonaka /*-
59cdb1c70Snonaka  * Copyright (c) 2008,2009 Damien Bergamini <damien.bergamini@free.fr>
69cdb1c70Snonaka  *
79cdb1c70Snonaka  * Permission to use, copy, modify, and distribute this software for any
89cdb1c70Snonaka  * purpose with or without fee is hereby granted, provided that the above
99cdb1c70Snonaka  * copyright notice and this permission notice appear in all copies.
109cdb1c70Snonaka  *
119cdb1c70Snonaka  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
129cdb1c70Snonaka  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
139cdb1c70Snonaka  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
149cdb1c70Snonaka  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
159cdb1c70Snonaka  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
169cdb1c70Snonaka  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
179cdb1c70Snonaka  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
189cdb1c70Snonaka  */
199cdb1c70Snonaka 
209cdb1c70Snonaka #define RUN_MAX_RXSZ			\
219cdb1c70Snonaka 	4096
229cdb1c70Snonaka #if 0
239cdb1c70Snonaka 	(sizeof(uint32_t) +		\
249cdb1c70Snonaka 	 sizeof(struct rt2860_rxwi) +	\
259cdb1c70Snonaka 	 sizeof(uint16_t) +		\
269cdb1c70Snonaka 	 MCLBYTES +			\
279cdb1c70Snonaka 	 sizeof(struct rt2870_rxd))
289cdb1c70Snonaka #endif
299cdb1c70Snonaka /* NB: "11" is the maximum number of padding bytes needed for Tx */
309cdb1c70Snonaka #define RUN_MAX_TXSZ			\
319cdb1c70Snonaka 	(sizeof(struct rt2870_txd) +	\
32d164e220Smlelstv 	 sizeof(struct rt2860_txwi) +	\
339cdb1c70Snonaka 	 MCLBYTES + 11)
349cdb1c70Snonaka 
359cdb1c70Snonaka #define RUN_TX_TIMEOUT	5000	/* ms */
369cdb1c70Snonaka 
379cdb1c70Snonaka #define RUN_RX_RING_COUNT	1
389cdb1c70Snonaka #define RUN_TX_RING_COUNT	8
399cdb1c70Snonaka 
40d164e220Smlelstv #define RT2870_WCID_MAX		64
419cdb1c70Snonaka #define RUN_AID2WCID(aid)	((aid) & 0xff)
429cdb1c70Snonaka 
439cdb1c70Snonaka struct run_rx_radiotap_header {
449cdb1c70Snonaka 	struct ieee80211_radiotap_header wr_ihdr;
459cdb1c70Snonaka 	uint8_t		wr_flags;
469cdb1c70Snonaka 	uint8_t		wr_rate;
479cdb1c70Snonaka 	uint16_t	wr_chan_freq;
489cdb1c70Snonaka 	uint16_t	wr_chan_flags;
499cdb1c70Snonaka 	uint8_t		wr_dbm_antsignal;
509cdb1c70Snonaka 	uint8_t		wr_antenna;
519cdb1c70Snonaka 	uint8_t		wr_antsignal;
5249e18393Smrg };
539cdb1c70Snonaka 
549cdb1c70Snonaka #define RUN_RX_RADIOTAP_PRESENT				\
559cdb1c70Snonaka 	(1 << IEEE80211_RADIOTAP_FLAGS |		\
569cdb1c70Snonaka 	 1 << IEEE80211_RADIOTAP_RATE |			\
579cdb1c70Snonaka 	 1 << IEEE80211_RADIOTAP_CHANNEL |		\
589cdb1c70Snonaka 	 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL |	\
599cdb1c70Snonaka 	 1 << IEEE80211_RADIOTAP_ANTENNA |		\
609cdb1c70Snonaka 	 1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL)
619cdb1c70Snonaka 
629cdb1c70Snonaka struct run_tx_radiotap_header {
639cdb1c70Snonaka 	struct ieee80211_radiotap_header wt_ihdr;
649cdb1c70Snonaka 	uint8_t		wt_flags;
659cdb1c70Snonaka 	uint8_t		wt_rate;
669cdb1c70Snonaka 	uint16_t	wt_chan_freq;
679cdb1c70Snonaka 	uint16_t	wt_chan_flags;
689cdb1c70Snonaka 	uint8_t		wt_hwqueue;
6949e18393Smrg };
709cdb1c70Snonaka 
719cdb1c70Snonaka #define RUN_TX_RADIOTAP_PRESENT				\
729cdb1c70Snonaka 	(1 << IEEE80211_RADIOTAP_FLAGS |		\
739cdb1c70Snonaka 	 1 << IEEE80211_RADIOTAP_RATE |			\
749cdb1c70Snonaka 	 1 << IEEE80211_RADIOTAP_CHANNEL/* |		\
759cdb1c70Snonaka 	 1 << IEEE80211_RADIOTAP_HWQUEUE*/)
769cdb1c70Snonaka 
779cdb1c70Snonaka struct run_softc;
789cdb1c70Snonaka 
799cdb1c70Snonaka struct run_tx_data {
809cdb1c70Snonaka 	struct run_softc	*sc;
814e8e6643Sskrll 	struct usbd_xfer	*xfer;
829cdb1c70Snonaka 	uint8_t			*buf;
839cdb1c70Snonaka 	uint8_t			qid;
849cdb1c70Snonaka };
859cdb1c70Snonaka 
869cdb1c70Snonaka struct run_rx_data {
879cdb1c70Snonaka 	struct run_softc	*sc;
884e8e6643Sskrll 	struct usbd_xfer	*xfer;
899cdb1c70Snonaka 	uint8_t			*buf;
909cdb1c70Snonaka };
919cdb1c70Snonaka 
929cdb1c70Snonaka struct run_tx_ring {
939cdb1c70Snonaka 	struct run_tx_data	data[RUN_TX_RING_COUNT];
944e8e6643Sskrll 	struct usbd_pipe *	pipeh;
959cdb1c70Snonaka 	int			cur;
9690e85cecSmlelstv 	volatile unsigned	queued;
979cdb1c70Snonaka 	uint8_t			pipe_no;
989cdb1c70Snonaka };
999cdb1c70Snonaka 
1009cdb1c70Snonaka struct run_rx_ring {
1019cdb1c70Snonaka 	struct run_rx_data	data[RUN_RX_RING_COUNT];
1024e8e6643Sskrll 	struct usbd_pipe *	pipeh;
1039cdb1c70Snonaka 	uint8_t			pipe_no;
1049cdb1c70Snonaka };
1059cdb1c70Snonaka 
1069cdb1c70Snonaka struct run_host_cmd {
1079cdb1c70Snonaka 	void	(*cb)(struct run_softc *, void *);
1089cdb1c70Snonaka 	uint8_t	data[256];
1099cdb1c70Snonaka };
1109cdb1c70Snonaka 
1119cdb1c70Snonaka struct run_cmd_newstate {
1129cdb1c70Snonaka 	enum ieee80211_state	state;
1139cdb1c70Snonaka 	int			arg;
1149cdb1c70Snonaka };
1159cdb1c70Snonaka 
1169cdb1c70Snonaka struct run_cmd_key {
1179cdb1c70Snonaka 	struct ieee80211_key	key;
1189cdb1c70Snonaka 	uint16_t		associd;
1199cdb1c70Snonaka };
1209cdb1c70Snonaka 
1219cdb1c70Snonaka #define RUN_HOST_CMD_RING_COUNT	32
1229cdb1c70Snonaka struct run_host_cmd_ring {
1239cdb1c70Snonaka 	struct run_host_cmd	cmd[RUN_HOST_CMD_RING_COUNT];
1249cdb1c70Snonaka 	int			cur;
1259cdb1c70Snonaka 	int			next;
1269cdb1c70Snonaka 	int			queued;
1279cdb1c70Snonaka };
1289cdb1c70Snonaka 
1299cdb1c70Snonaka struct run_node {
1309cdb1c70Snonaka 	struct ieee80211_node	ni;
1319cdb1c70Snonaka 	uint8_t			ridx[IEEE80211_RATE_MAXSIZE];
1329cdb1c70Snonaka 	uint8_t			ctl_ridx[IEEE80211_RATE_MAXSIZE];
1339cdb1c70Snonaka };
1349cdb1c70Snonaka 
135d42627d4Sskrll #define	RUN_MAXEPOUT	4
136d42627d4Sskrll 
1379cdb1c70Snonaka struct run_softc {
1389cdb1c70Snonaka 	device_t			sc_dev;
1399cdb1c70Snonaka 	struct ethercom			sc_ec;
1409cdb1c70Snonaka #define sc_if	sc_ec.ec_if
1419cdb1c70Snonaka 	struct ieee80211com		sc_ic;
1429cdb1c70Snonaka 	int				(*sc_newstate)(struct ieee80211com *,
1439cdb1c70Snonaka 					    enum ieee80211_state, int);
1449cdb1c70Snonaka 	int				(*sc_srom_read)(struct run_softc *,
1459cdb1c70Snonaka 					    uint16_t, uint16_t *);
1469cdb1c70Snonaka 
1477a9a30c5Sthorpej 	kmutex_t			sc_media_mtx;	/* XXX */
1487a9a30c5Sthorpej 
1494e8e6643Sskrll 	struct usbd_device *		sc_udev;
1504e8e6643Sskrll 	struct usbd_interface *		sc_iface;
1519cdb1c70Snonaka 
1529cdb1c70Snonaka 	uint16_t			mac_ver;
1539cdb1c70Snonaka 	uint16_t			mac_rev;
154faca41fbSmlelstv 	uint16_t			rf_rev;
1559cdb1c70Snonaka 	uint8_t				freq;
1569cdb1c70Snonaka 	uint8_t				ntxchains;
1579cdb1c70Snonaka 	uint8_t				nrxchains;
1589cdb1c70Snonaka 	int				fixed_ridx;
1599cdb1c70Snonaka 
1609cdb1c70Snonaka 	uint8_t				bbp25;
1619cdb1c70Snonaka 	uint8_t				bbp26;
1629cdb1c70Snonaka 	uint8_t				rf24_20mhz;
1639cdb1c70Snonaka 	uint8_t				rf24_40mhz;
1649cdb1c70Snonaka 	uint8_t				patch_dac;
1659cdb1c70Snonaka 	uint8_t				rfswitch;
1669cdb1c70Snonaka 	uint8_t				ext_2ghz_lna;
1679cdb1c70Snonaka 	uint8_t				ext_5ghz_lna;
1689cdb1c70Snonaka 	uint8_t				calib_2ghz;
1699cdb1c70Snonaka 	uint8_t				calib_5ghz;
1709cdb1c70Snonaka 	uint8_t				txmixgain_2ghz;
1719cdb1c70Snonaka 	uint8_t				txmixgain_5ghz;
1729cdb1c70Snonaka 	int8_t				txpow1[54];
1739cdb1c70Snonaka 	int8_t				txpow2[54];
174faca41fbSmlelstv 	int8_t				txpow3[54];
1759cdb1c70Snonaka 	int8_t				rssi_2ghz[3];
1769cdb1c70Snonaka 	int8_t				rssi_5ghz[3];
1779cdb1c70Snonaka 	uint8_t				lna[4];
1789cdb1c70Snonaka 
1799cdb1c70Snonaka 	struct {
1809cdb1c70Snonaka 		uint8_t	reg;
1819cdb1c70Snonaka 		uint8_t	val;
1829cdb1c70Snonaka 	}				bbp[10], rf[10];
1839cdb1c70Snonaka 	uint8_t				leds;
1849cdb1c70Snonaka 	uint16_t			led[3];
1859cdb1c70Snonaka 	uint32_t			txpow20mhz[5];
1869cdb1c70Snonaka 	uint32_t			txpow40mhz_2ghz[5];
1879cdb1c70Snonaka 	uint32_t			txpow40mhz_5ghz[5];
1889cdb1c70Snonaka 
1899cdb1c70Snonaka 	struct usb_task			sc_task;
1909cdb1c70Snonaka 
1919cdb1c70Snonaka 	struct ieee80211_amrr		amrr;
1929cdb1c70Snonaka 	struct ieee80211_amrr_node	amn;
1939cdb1c70Snonaka 
1949cdb1c70Snonaka 	callout_t			scan_to;
1959cdb1c70Snonaka 	callout_t			calib_to;
1969cdb1c70Snonaka 
1979cdb1c70Snonaka 	struct run_rx_ring		rxq;
198d42627d4Sskrll 	struct run_tx_ring		txq[RUN_MAXEPOUT];
1999cdb1c70Snonaka 	struct run_host_cmd_ring	cmdq;
2009cdb1c70Snonaka 	uint8_t				qfullmsk;
2019cdb1c70Snonaka 	int				sc_tx_timer;
2029cdb1c70Snonaka 	struct ieee80211_beacon_offsets	sc_bo;
2039cdb1c70Snonaka 	int				sc_flags;
2049cdb1c70Snonaka #define RUN_FWLOADED		(1 << 0)
2059cdb1c70Snonaka #define RUN_DETACHING		(1 << 1)
206*c2d905cbSgson #define RUN_USE_BLOCK_WRITE	(1 << 2)
2079cdb1c70Snonaka 
2089cdb1c70Snonaka 	struct bpf_if *			sc_drvbpf;
2099cdb1c70Snonaka 
2109cdb1c70Snonaka 	union {
2119cdb1c70Snonaka 		struct run_rx_radiotap_header th;
2129cdb1c70Snonaka 		uint8_t	pad[64];
2139cdb1c70Snonaka 	}				sc_rxtapu;
2149cdb1c70Snonaka #define sc_rxtap	sc_rxtapu.th
2159cdb1c70Snonaka 	int				sc_rxtap_len;
2169cdb1c70Snonaka 
2179cdb1c70Snonaka 	union {
2189cdb1c70Snonaka 		struct run_tx_radiotap_header th;
2199cdb1c70Snonaka 		uint8_t	pad[64];
2209cdb1c70Snonaka 	}				sc_txtapu;
2219cdb1c70Snonaka #define sc_txtap	sc_txtapu.th
2229cdb1c70Snonaka 	int				sc_txtap_len;
2239cdb1c70Snonaka };
224