xref: /openbsd-src/sys/dev/usb/if_runvar.h (revision cf67a9a2052af337e712b844236d1029e1ef3a3c)
1*cf67a9a2Skrw /*	$OpenBSD: if_runvar.h,v 1.13 2020/11/27 14:45:03 krw Exp $	*/
230aa40ebSdamien 
330aa40ebSdamien /*-
430aa40ebSdamien  * Copyright (c) 2008,2009 Damien Bergamini <damien.bergamini@free.fr>
530aa40ebSdamien  *
630aa40ebSdamien  * Permission to use, copy, modify, and distribute this software for any
730aa40ebSdamien  * purpose with or without fee is hereby granted, provided that the above
830aa40ebSdamien  * copyright notice and this permission notice appear in all copies.
930aa40ebSdamien  *
1030aa40ebSdamien  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1130aa40ebSdamien  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1230aa40ebSdamien  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1330aa40ebSdamien  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1430aa40ebSdamien  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1530aa40ebSdamien  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1630aa40ebSdamien  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1730aa40ebSdamien  */
1830aa40ebSdamien 
1930aa40ebSdamien #define RUN_MAX_RXSZ			\
2030aa40ebSdamien 	4096
2130aa40ebSdamien #if 0
2230aa40ebSdamien 	(sizeof (uint32_t) +		\
2330aa40ebSdamien 	 sizeof (struct rt2860_rxwi) +	\
2430aa40ebSdamien 	 sizeof (uint16_t) +		\
2530aa40ebSdamien 	 MCLBYTES +			\
2630aa40ebSdamien 	 sizeof (struct rt2870_rxd))
2730aa40ebSdamien #endif
2830aa40ebSdamien /* NB: "11" is the maximum number of padding bytes needed for Tx */
2930aa40ebSdamien #define RUN_MAX_TXSZ			\
3030aa40ebSdamien 	(sizeof (struct rt2870_txd) +	\
31d80de052Sstsp 	 sizeof (struct rt2860_txwi) +	\
3230aa40ebSdamien 	 MCLBYTES + 11)
3330aa40ebSdamien 
3430aa40ebSdamien #define RUN_TX_TIMEOUT	5000	/* ms */
3530aa40ebSdamien 
3630aa40ebSdamien #define RUN_RX_RING_COUNT	1
3730aa40ebSdamien #define RUN_TX_RING_COUNT	8
3830aa40ebSdamien 
39d80de052Sstsp #define RT2870_WCID_MAX		64
4030aa40ebSdamien #define RUN_AID2WCID(aid)	((aid) & 0xff)
4130aa40ebSdamien 
4230aa40ebSdamien struct run_rx_radiotap_header {
4330aa40ebSdamien 	struct ieee80211_radiotap_header wr_ihdr;
4430aa40ebSdamien 	uint8_t		wr_flags;
4530aa40ebSdamien 	uint8_t		wr_rate;
4630aa40ebSdamien 	uint16_t	wr_chan_freq;
4730aa40ebSdamien 	uint16_t	wr_chan_flags;
4830aa40ebSdamien 	uint8_t		wr_dbm_antsignal;
4930aa40ebSdamien 	uint8_t		wr_antenna;
5030aa40ebSdamien 	uint8_t		wr_antsignal;
5130aa40ebSdamien } __packed;
5230aa40ebSdamien 
5330aa40ebSdamien #define RUN_RX_RADIOTAP_PRESENT				\
5430aa40ebSdamien 	(1 << IEEE80211_RADIOTAP_FLAGS |		\
5530aa40ebSdamien 	 1 << IEEE80211_RADIOTAP_RATE |			\
5630aa40ebSdamien 	 1 << IEEE80211_RADIOTAP_CHANNEL |		\
5730aa40ebSdamien 	 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL |	\
5830aa40ebSdamien 	 1 << IEEE80211_RADIOTAP_ANTENNA |		\
5930aa40ebSdamien 	 1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL)
6030aa40ebSdamien 
6130aa40ebSdamien struct run_tx_radiotap_header {
6230aa40ebSdamien 	struct ieee80211_radiotap_header wt_ihdr;
6330aa40ebSdamien 	uint8_t		wt_flags;
6430aa40ebSdamien 	uint8_t		wt_rate;
6530aa40ebSdamien 	uint16_t	wt_chan_freq;
6630aa40ebSdamien 	uint16_t	wt_chan_flags;
6730aa40ebSdamien } __packed;
6830aa40ebSdamien 
6930aa40ebSdamien #define RUN_TX_RADIOTAP_PRESENT				\
7030aa40ebSdamien 	(1 << IEEE80211_RADIOTAP_FLAGS |		\
7130aa40ebSdamien 	 1 << IEEE80211_RADIOTAP_RATE |			\
72eb1adcecSmpi 	 1 << IEEE80211_RADIOTAP_CHANNEL)
7330aa40ebSdamien 
7430aa40ebSdamien struct run_softc;
7530aa40ebSdamien 
7630aa40ebSdamien struct run_tx_data {
7730aa40ebSdamien 	struct run_softc	*sc;
78ab0b1be7Smglocker 	struct usbd_xfer	*xfer;
7930aa40ebSdamien 	uint8_t			*buf;
8030aa40ebSdamien 	uint8_t			qid;
8130aa40ebSdamien };
8230aa40ebSdamien 
8330aa40ebSdamien struct run_rx_data {
8430aa40ebSdamien 	struct run_softc	*sc;
85ab0b1be7Smglocker 	struct usbd_xfer	*xfer;
8630aa40ebSdamien 	uint8_t			*buf;
8730aa40ebSdamien };
8830aa40ebSdamien 
8930aa40ebSdamien struct run_tx_ring {
9030aa40ebSdamien 	struct run_tx_data	data[RUN_TX_RING_COUNT];
91ab0b1be7Smglocker 	struct usbd_pipe	*pipeh;
9230aa40ebSdamien 	int			cur;
9330aa40ebSdamien 	int			queued;
9430aa40ebSdamien 	uint8_t			pipe_no;
9530aa40ebSdamien };
9630aa40ebSdamien 
9730aa40ebSdamien struct run_rx_ring {
9830aa40ebSdamien 	struct run_rx_data	data[RUN_RX_RING_COUNT];
99ab0b1be7Smglocker 	struct usbd_pipe	*pipeh;
10030aa40ebSdamien 	uint8_t			pipe_no;
10130aa40ebSdamien };
10230aa40ebSdamien 
10330aa40ebSdamien struct run_host_cmd {
10430aa40ebSdamien 	void	(*cb)(struct run_softc *, void *);
10530aa40ebSdamien 	uint8_t	data[256];
10630aa40ebSdamien };
10730aa40ebSdamien 
10830aa40ebSdamien struct run_cmd_newstate {
10930aa40ebSdamien 	enum ieee80211_state	state;
11030aa40ebSdamien 	int			arg;
11130aa40ebSdamien };
11230aa40ebSdamien 
11330aa40ebSdamien struct run_cmd_key {
11430aa40ebSdamien 	struct ieee80211_key	key;
115*cf67a9a2Skrw 	struct ieee80211_node	*ni;
11630aa40ebSdamien };
11730aa40ebSdamien 
11830aa40ebSdamien #define RUN_HOST_CMD_RING_COUNT	32
11930aa40ebSdamien struct run_host_cmd_ring {
12030aa40ebSdamien 	struct run_host_cmd	cmd[RUN_HOST_CMD_RING_COUNT];
12130aa40ebSdamien 	int			cur;
12230aa40ebSdamien 	int			next;
12330aa40ebSdamien 	int			queued;
12430aa40ebSdamien };
12530aa40ebSdamien 
12630aa40ebSdamien struct run_node {
12730aa40ebSdamien 	struct ieee80211_node	ni;
12830aa40ebSdamien 	uint8_t			ridx[IEEE80211_RATE_MAXSIZE];
12930aa40ebSdamien 	uint8_t			ctl_ridx[IEEE80211_RATE_MAXSIZE];
13030aa40ebSdamien };
13130aa40ebSdamien 
13230aa40ebSdamien struct run_softc {
13330aa40ebSdamien 	struct device			sc_dev;
13430aa40ebSdamien 	struct ieee80211com		sc_ic;
13530aa40ebSdamien 	int				(*sc_newstate)(struct ieee80211com *,
13630aa40ebSdamien 					    enum ieee80211_state, int);
13730aa40ebSdamien 	int				(*sc_srom_read)(struct run_softc *,
13830aa40ebSdamien 					    uint16_t, uint16_t *);
13930aa40ebSdamien 
140ab0b1be7Smglocker 	struct usbd_device		*sc_udev;
141ab0b1be7Smglocker 	struct usbd_interface		*sc_iface;
14230aa40ebSdamien 
1436755f0faSdamien 	uint16_t			mac_ver;
1446755f0faSdamien 	uint16_t			mac_rev;
145d80de052Sstsp 	uint16_t			rf_rev;
14630aa40ebSdamien 	uint8_t				freq;
14730aa40ebSdamien 	uint8_t				ntxchains;
14830aa40ebSdamien 	uint8_t				nrxchains;
14930aa40ebSdamien 	int				fixed_ridx;
15030aa40ebSdamien 
15118327d80Sdamien 	uint8_t				bbp25;
15218327d80Sdamien 	uint8_t				bbp26;
15330aa40ebSdamien 	uint8_t				rf24_20mhz;
15430aa40ebSdamien 	uint8_t				rf24_40mhz;
155f19591d0Sdamien 	uint8_t				patch_dac;
156f19591d0Sdamien 	uint8_t				rfswitch;
15730aa40ebSdamien 	uint8_t				ext_2ghz_lna;
15830aa40ebSdamien 	uint8_t				ext_5ghz_lna;
15930aa40ebSdamien 	uint8_t				calib_2ghz;
16030aa40ebSdamien 	uint8_t				calib_5ghz;
161f19591d0Sdamien 	uint8_t				txmixgain_2ghz;
162f19591d0Sdamien 	uint8_t				txmixgain_5ghz;
1638e0b65aaSdamien 	int8_t				txpow1[54];
1648e0b65aaSdamien 	int8_t				txpow2[54];
165d80de052Sstsp 	int8_t				txpow3[54];
16630aa40ebSdamien 	int8_t				rssi_2ghz[3];
16730aa40ebSdamien 	int8_t				rssi_5ghz[3];
16830aa40ebSdamien 	uint8_t				lna[4];
16930aa40ebSdamien 
17030aa40ebSdamien 	struct {
17130aa40ebSdamien 		uint8_t	reg;
17230aa40ebSdamien 		uint8_t	val;
173f19591d0Sdamien 	}				bbp[10], rf[10];
17430aa40ebSdamien 	uint8_t				leds;
17530aa40ebSdamien 	uint16_t			led[3];
17630aa40ebSdamien 	uint32_t			txpow20mhz[5];
17730aa40ebSdamien 	uint32_t			txpow40mhz_2ghz[5];
17830aa40ebSdamien 	uint32_t			txpow40mhz_5ghz[5];
17930aa40ebSdamien 
18030aa40ebSdamien 	struct usb_task			sc_task;
18130aa40ebSdamien 
18230aa40ebSdamien 	struct ieee80211_amrr		amrr;
18330aa40ebSdamien 	struct ieee80211_amrr_node	amn;
18430aa40ebSdamien 
18530aa40ebSdamien 	struct timeout			scan_to;
18630aa40ebSdamien 	struct timeout			calib_to;
18730aa40ebSdamien 
18830aa40ebSdamien 	struct run_rx_ring		rxq;
1895892192bSdamien 	struct run_tx_ring		txq[4];
19030aa40ebSdamien 	struct run_host_cmd_ring	cmdq;
19130aa40ebSdamien 	uint8_t				qfullmsk;
19230aa40ebSdamien 	int				sc_tx_timer;
19330aa40ebSdamien 
19430aa40ebSdamien #if NBPFILTER > 0
19530aa40ebSdamien 	caddr_t				sc_drvbpf;
19630aa40ebSdamien 
19730aa40ebSdamien 	union {
19830aa40ebSdamien 		struct run_rx_radiotap_header th;
19930aa40ebSdamien 		uint8_t	pad[64];
20030aa40ebSdamien 	}				sc_rxtapu;
20130aa40ebSdamien #define sc_rxtap	sc_rxtapu.th
20230aa40ebSdamien 	int				sc_rxtap_len;
20330aa40ebSdamien 
20430aa40ebSdamien 	union {
20530aa40ebSdamien 		struct run_tx_radiotap_header th;
20630aa40ebSdamien 		uint8_t	pad[64];
20730aa40ebSdamien 	}				sc_txtapu;
20830aa40ebSdamien #define sc_txtap	sc_txtapu.th
20930aa40ebSdamien 	int				sc_txtap_len;
21030aa40ebSdamien #endif
211*cf67a9a2Skrw 	int				sc_key_tasks;
21230aa40ebSdamien };
213