xref: /openbsd/sys/dev/ic/rt2860var.h (revision 51a6fb14)
1*51a6fb14Smpi /*	$OpenBSD: rt2860var.h,v 1.26 2020/10/11 07:05:28 mpi Exp $	*/
24180bdb0Sdamien 
34180bdb0Sdamien /*-
44180bdb0Sdamien  * Copyright (c) 2007
54180bdb0Sdamien  *	Damien Bergamini <damien.bergamini@free.fr>
64180bdb0Sdamien  *
74180bdb0Sdamien  * Permission to use, copy, modify, and distribute this software for any
84180bdb0Sdamien  * purpose with or without fee is hereby granted, provided that the above
94180bdb0Sdamien  * copyright notice and this permission notice appear in all copies.
104180bdb0Sdamien  *
114180bdb0Sdamien  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
124180bdb0Sdamien  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
134180bdb0Sdamien  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
144180bdb0Sdamien  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
154180bdb0Sdamien  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
164180bdb0Sdamien  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
174180bdb0Sdamien  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
184180bdb0Sdamien  */
194180bdb0Sdamien 
20ae48e37cSstsp #define RT2860_MAX_SCATTER	15
21ae48e37cSstsp #define RT2860_MAX_SCATTER_TXD	(1 + (RT2860_MAX_SCATTER / 2))
22ae48e37cSstsp 
234180bdb0Sdamien #define RT2860_RX_RING_COUNT	128
2427819d76Sstsp #define RT2860_TX_RING_COUNT	64
2527819d76Sstsp #define RT2860_TX_RING_MAX	(RT2860_TX_RING_COUNT - 1)
26ae48e37cSstsp #define RT2860_TX_RING_ONEMORE	(RT2860_TX_RING_MAX - RT2860_MAX_SCATTER_TXD)
274180bdb0Sdamien #define RT2860_TX_POOL_COUNT	(RT2860_TX_RING_COUNT * 2)
284180bdb0Sdamien 
294180bdb0Sdamien /* HW supports up to 255 STAs */
304180bdb0Sdamien #define RT2860_WCID_MAX		254
314180bdb0Sdamien #define RT2860_AID2WCID(aid)	((aid) & 0xff)
324180bdb0Sdamien 
339faabf1fSdamien struct rt2860_rx_radiotap_header {
349faabf1fSdamien 	struct ieee80211_radiotap_header wr_ihdr;
359faabf1fSdamien 	uint8_t		wr_flags;
369faabf1fSdamien 	uint8_t		wr_rate;
379faabf1fSdamien 	uint16_t	wr_chan_freq;
389faabf1fSdamien 	uint16_t	wr_chan_flags;
399faabf1fSdamien 	uint8_t		wr_dbm_antsignal;
409faabf1fSdamien 	uint8_t		wr_antenna;
419faabf1fSdamien 	uint8_t		wr_antsignal;
429faabf1fSdamien } __packed;
439faabf1fSdamien 
449faabf1fSdamien #define RT2860_RX_RADIOTAP_PRESENT			\
459faabf1fSdamien 	(1 << IEEE80211_RADIOTAP_FLAGS |		\
469faabf1fSdamien 	 1 << IEEE80211_RADIOTAP_RATE |			\
479faabf1fSdamien 	 1 << IEEE80211_RADIOTAP_CHANNEL |		\
489faabf1fSdamien 	 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL |	\
499faabf1fSdamien 	 1 << IEEE80211_RADIOTAP_ANTENNA |		\
509faabf1fSdamien 	 1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL)
519faabf1fSdamien 
529faabf1fSdamien struct rt2860_tx_radiotap_header {
539faabf1fSdamien 	struct ieee80211_radiotap_header wt_ihdr;
549faabf1fSdamien 	uint8_t		wt_flags;
559faabf1fSdamien 	uint8_t		wt_rate;
569faabf1fSdamien 	uint16_t	wt_chan_freq;
579faabf1fSdamien 	uint16_t	wt_chan_flags;
589faabf1fSdamien } __packed;
599faabf1fSdamien 
609faabf1fSdamien #define RT2860_TX_RADIOTAP_PRESENT			\
619faabf1fSdamien 	(1 << IEEE80211_RADIOTAP_FLAGS |		\
629faabf1fSdamien 	 1 << IEEE80211_RADIOTAP_RATE |			\
63eb1adcecSmpi 	 1 << IEEE80211_RADIOTAP_CHANNEL)
649faabf1fSdamien 
654180bdb0Sdamien struct rt2860_tx_data {
664180bdb0Sdamien 	struct rt2860_txwi		*txwi;
674180bdb0Sdamien 	struct mbuf			*m;
684180bdb0Sdamien 	struct ieee80211_node		*ni;
694180bdb0Sdamien 	bus_dmamap_t			map;
704180bdb0Sdamien 	bus_addr_t			paddr;
714180bdb0Sdamien 	SLIST_ENTRY(rt2860_tx_data)	next;
724180bdb0Sdamien };
734180bdb0Sdamien 
744180bdb0Sdamien struct rt2860_tx_ring {
754180bdb0Sdamien 	struct rt2860_txd	*txd;
764180bdb0Sdamien 	bus_addr_t		paddr;
774180bdb0Sdamien 	bus_dmamap_t		map;
784180bdb0Sdamien 	bus_dma_segment_t	seg;
794180bdb0Sdamien 	struct rt2860_tx_data	*data[RT2860_TX_RING_COUNT];
804180bdb0Sdamien 	int			cur;
814180bdb0Sdamien 	int			next;
824180bdb0Sdamien 	int			queued;
834180bdb0Sdamien };
844180bdb0Sdamien 
854180bdb0Sdamien struct rt2860_rx_data {
864180bdb0Sdamien 	struct mbuf	*m;
874180bdb0Sdamien 	bus_dmamap_t	map;
884180bdb0Sdamien };
894180bdb0Sdamien 
904180bdb0Sdamien struct rt2860_rx_ring {
914180bdb0Sdamien 	struct rt2860_rxd	*rxd;
924180bdb0Sdamien 	bus_addr_t		paddr;
934180bdb0Sdamien 	bus_dmamap_t		map;
944180bdb0Sdamien 	bus_dma_segment_t	seg;
954180bdb0Sdamien 	unsigned int		cur;	/* must be unsigned */
964180bdb0Sdamien 	struct rt2860_rx_data	data[RT2860_RX_RING_COUNT];
974180bdb0Sdamien };
984180bdb0Sdamien 
99608d72eaSdamien struct rt2860_node {
100608d72eaSdamien 	struct ieee80211_node	ni;
1015526d2d1Sdamien 	uint8_t			wcid;
102608d72eaSdamien 	uint8_t			ridx[IEEE80211_RATE_MAXSIZE];
103608d72eaSdamien 	uint8_t			ctl_ridx[IEEE80211_RATE_MAXSIZE];
104608d72eaSdamien };
105608d72eaSdamien 
1064180bdb0Sdamien struct rt2860_softc {
1074180bdb0Sdamien 	struct device			sc_dev;
1084180bdb0Sdamien 
1094180bdb0Sdamien 	struct ieee80211com		sc_ic;
1104180bdb0Sdamien 	int				(*sc_newstate)(struct ieee80211com *,
1114180bdb0Sdamien 					    enum ieee80211_state, int);
1124180bdb0Sdamien 	struct ieee80211_amrr		amrr;
1134180bdb0Sdamien 
1144180bdb0Sdamien 	int				(*sc_enable)(struct rt2860_softc *);
1154180bdb0Sdamien 	void				(*sc_disable)(struct rt2860_softc *);
1164180bdb0Sdamien 
1174180bdb0Sdamien 	bus_dma_tag_t			sc_dmat;
1184180bdb0Sdamien 	bus_space_tag_t			sc_st;
1194180bdb0Sdamien 	bus_space_handle_t		sc_sh;
1204180bdb0Sdamien 
12163f54454Sdamien 	uint16_t			(*sc_srom_read)(struct rt2860_softc *,
12263f54454Sdamien 					    uint16_t);
12363f54454Sdamien 
1244180bdb0Sdamien 	int				sc_flags;
1254180bdb0Sdamien #define RT2860_ENABLED		(1 << 0)
1260727ce2fSdamien #define RT2860_ADVANCED_PS	(1 << 1)
1270727ce2fSdamien #define RT2860_PCIE		(1 << 2)
1284180bdb0Sdamien 
129d7ae8de0Sdamien 	uint32_t			sc_ic_flags;
130608d72eaSdamien 	int				fixed_ridx;
131d7ae8de0Sdamien 
1320727ce2fSdamien 	u_char				*ucode;
1330727ce2fSdamien 	size_t				ucsize;
1340727ce2fSdamien 
1354180bdb0Sdamien 	struct rt2860_tx_ring		txq[6];
1364180bdb0Sdamien 	struct rt2860_rx_ring		rxq;
1374180bdb0Sdamien 
1384180bdb0Sdamien 	SLIST_HEAD(, rt2860_tx_data)	data_pool;
1394180bdb0Sdamien 	struct rt2860_tx_data		data[RT2860_TX_POOL_COUNT];
1404180bdb0Sdamien 	bus_dmamap_t			txwi_map;
1414180bdb0Sdamien 	bus_dma_segment_t		txwi_seg;
142b93534efSdamien 	caddr_t				txwi_vaddr;
1434180bdb0Sdamien 
1444180bdb0Sdamien 	int				sc_tx_timer;
1454180bdb0Sdamien 	int				mgtqid;
146608d72eaSdamien 	uint8_t				qfullmsk;
1474180bdb0Sdamien 
14863f54454Sdamien 	uint16_t			mac_ver;
14963f54454Sdamien 	uint16_t			mac_rev;
150067465feSstsp 	uint16_t			rf_rev;
1514180bdb0Sdamien 	uint8_t				freq;
1524180bdb0Sdamien 	uint8_t				ntxchains;
1534180bdb0Sdamien 	uint8_t				nrxchains;
154696f393cSdamien 	uint8_t				pslevel;
1558e0b65aaSdamien 	int8_t				txpow1[54];
1568e0b65aaSdamien 	int8_t				txpow2[54];
1574180bdb0Sdamien 	int8_t				rssi_2ghz[3];
1584180bdb0Sdamien 	int8_t				rssi_5ghz[3];
1594180bdb0Sdamien 	uint8_t				lna[4];
16063f54454Sdamien 	uint8_t				rf24_20mhz;
16163f54454Sdamien 	uint8_t				rf24_40mhz;
16263f54454Sdamien 	uint8_t				patch_dac;
16363f54454Sdamien 	uint8_t				rfswitch;
164b93534efSdamien 	uint8_t				ext_2ghz_lna;
165b93534efSdamien 	uint8_t				ext_5ghz_lna;
1664180bdb0Sdamien 	uint8_t				calib_2ghz;
1674180bdb0Sdamien 	uint8_t				calib_5ghz;
16863f54454Sdamien 	uint8_t				txmixgain_2ghz;
16963f54454Sdamien 	uint8_t				txmixgain_5ghz;
1704180bdb0Sdamien 	uint8_t				tssi_2ghz[9];
1714180bdb0Sdamien 	uint8_t				tssi_5ghz[9];
1724180bdb0Sdamien 	uint8_t				step_2ghz;
1734180bdb0Sdamien 	uint8_t				step_5ghz;
1744180bdb0Sdamien 	struct {
1754180bdb0Sdamien 		uint8_t	reg;
1764180bdb0Sdamien 		uint8_t	val;
177bbada1cfSdamien 	}				bbp[8], rf[10];
178a7baa4fdSdamien 	uint8_t				leds;
179a7baa4fdSdamien 	uint16_t			led[3];
1804180bdb0Sdamien 	uint32_t			txpow20mhz[5];
1814180bdb0Sdamien 	uint32_t			txpow40mhz_2ghz[5];
1824180bdb0Sdamien 	uint32_t			txpow40mhz_5ghz[5];
1834180bdb0Sdamien 
1844180bdb0Sdamien 	struct ieee80211_amrr_node	amn[RT2860_WCID_MAX + 1];
1859faabf1fSdamien 
1869faabf1fSdamien #if NBPFILTER > 0
1879faabf1fSdamien 	caddr_t				sc_drvbpf;
1889faabf1fSdamien 	union {
1899faabf1fSdamien 		struct rt2860_rx_radiotap_header th;
1909faabf1fSdamien 		uint8_t pad[64];
1919faabf1fSdamien 	}				sc_rxtapu;
1929faabf1fSdamien #define sc_rxtap			sc_rxtapu.th
1939faabf1fSdamien 	int				sc_rxtap_len;
1949faabf1fSdamien 
1959faabf1fSdamien 	union {
1969faabf1fSdamien 		struct rt2860_tx_radiotap_header th;
1979faabf1fSdamien 		uint8_t pad[64];
1989faabf1fSdamien 	}				sc_txtapu;
1999faabf1fSdamien #define sc_txtap			sc_txtapu.th
2009faabf1fSdamien 	int				sc_txtap_len;
2019faabf1fSdamien #endif
2024180bdb0Sdamien };
2034180bdb0Sdamien 
2044180bdb0Sdamien int	rt2860_attach(void *, int);
2054180bdb0Sdamien int	rt2860_detach(void *);
2060727ce2fSdamien void	rt2860_suspend(void *);
20737ecb596Sderaadt void	rt2860_wakeup(void *);
2084180bdb0Sdamien int	rt2860_intr(void *);
209