xref: /netbsd/sys/dev/ic/rt2560var.h (revision 74020018)
1*74020018Smrg /*	$NetBSD: rt2560var.h,v 1.11 2019/10/05 23:27:20 mrg Exp $	*/
276c61618Srpaulo /*	$OpenBSD: rt2560var.h,v 1.2 2006/01/14 12:43:27 damien Exp $  */
376c61618Srpaulo 
476c61618Srpaulo /*-
576c61618Srpaulo  * Copyright (c) 2005, 2006
676c61618Srpaulo  *	Damien Bergamini <damien.bergamini@free.fr>
776c61618Srpaulo  *
876c61618Srpaulo  * Permission to use, copy, modify, and distribute this software for any
976c61618Srpaulo  * purpose with or without fee is hereby granted, provided that the above
1076c61618Srpaulo  * copyright notice and this permission notice appear in all copies.
1176c61618Srpaulo  *
1276c61618Srpaulo  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
1376c61618Srpaulo  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
1476c61618Srpaulo  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
1576c61618Srpaulo  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
1676c61618Srpaulo  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
1776c61618Srpaulo  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
1876c61618Srpaulo  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
1976c61618Srpaulo  */
2076c61618Srpaulo 
2176c61618Srpaulo struct rt2560_rx_radiotap_header {
2276c61618Srpaulo 	struct ieee80211_radiotap_header wr_ihdr;
2376c61618Srpaulo 	uint64_t	wr_tsf;
2476c61618Srpaulo 	uint8_t		wr_flags;
2576c61618Srpaulo 	uint8_t		wr_rate;
2676c61618Srpaulo 	uint16_t	wr_chan_freq;
2776c61618Srpaulo 	uint16_t	wr_chan_flags;
2876c61618Srpaulo 	uint8_t		wr_antenna;
2976c61618Srpaulo 	uint8_t		wr_antsignal;
30*74020018Smrg };
3176c61618Srpaulo 
3276c61618Srpaulo #define RT2560_RX_RADIOTAP_PRESENT					\
3376c61618Srpaulo 	((1 << IEEE80211_RADIOTAP_TSFT) |				\
3476c61618Srpaulo 	 (1 << IEEE80211_RADIOTAP_FLAGS) |				\
3576c61618Srpaulo 	 (1 << IEEE80211_RADIOTAP_RATE) |				\
3676c61618Srpaulo 	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
3776c61618Srpaulo 	 (1 << IEEE80211_RADIOTAP_ANTENNA) |				\
3876c61618Srpaulo 	 (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL))
3976c61618Srpaulo 
4076c61618Srpaulo struct rt2560_tx_radiotap_header {
4176c61618Srpaulo 	struct ieee80211_radiotap_header wt_ihdr;
4276c61618Srpaulo 	uint8_t		wt_flags;
4376c61618Srpaulo 	uint8_t		wt_rate;
4476c61618Srpaulo 	uint16_t	wt_chan_freq;
4576c61618Srpaulo 	uint16_t	wt_chan_flags;
4676c61618Srpaulo 	uint8_t		wt_antenna;
47*74020018Smrg };
4876c61618Srpaulo 
4976c61618Srpaulo #define RT2560_TX_RADIOTAP_PRESENT					\
5076c61618Srpaulo 	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
5176c61618Srpaulo 	 (1 << IEEE80211_RADIOTAP_RATE) |				\
5276c61618Srpaulo 	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
5376c61618Srpaulo 	 (1 << IEEE80211_RADIOTAP_ANTENNA))
5476c61618Srpaulo 
5576c61618Srpaulo struct rt2560_tx_data {
5676c61618Srpaulo 	bus_dmamap_t			map;
5776c61618Srpaulo 	struct mbuf			*m;
5876c61618Srpaulo 	struct ieee80211_node		*ni;
5976c61618Srpaulo 	struct ieee80211_rssdesc	id;
6076c61618Srpaulo };
6176c61618Srpaulo 
6276c61618Srpaulo struct rt2560_tx_ring {
6376c61618Srpaulo 	bus_dmamap_t		map;
6476c61618Srpaulo 	bus_dma_segment_t	seg;
6576c61618Srpaulo 	bus_addr_t		physaddr;
6676c61618Srpaulo 	struct rt2560_tx_desc	*desc;
6776c61618Srpaulo 	struct rt2560_tx_data	*data;
6876c61618Srpaulo 	int			count;
6976c61618Srpaulo 	int			queued;
7076c61618Srpaulo 	int			cur;
7176c61618Srpaulo 	int			next;
7276c61618Srpaulo 	int			cur_encrypt;
7376c61618Srpaulo 	int			next_encrypt;
7476c61618Srpaulo };
7576c61618Srpaulo 
7676c61618Srpaulo struct rt2560_rx_data {
7776c61618Srpaulo 	bus_dmamap_t	map;
7876c61618Srpaulo 	struct mbuf	*m;
7976c61618Srpaulo 	int		drop;
8076c61618Srpaulo };
8176c61618Srpaulo 
8276c61618Srpaulo struct rt2560_rx_ring {
8376c61618Srpaulo 	bus_dmamap_t		map;
8476c61618Srpaulo 	bus_dma_segment_t	seg;
8576c61618Srpaulo 	bus_addr_t		physaddr;
8676c61618Srpaulo 	struct rt2560_rx_desc	*desc;
8776c61618Srpaulo 	struct rt2560_rx_data	*data;
8876c61618Srpaulo 	int			count;
8976c61618Srpaulo 	int			cur;
9076c61618Srpaulo 	int			next;
9176c61618Srpaulo 	int			cur_decrypt;
9276c61618Srpaulo };
9376c61618Srpaulo 
9476c61618Srpaulo struct rt2560_node {
9576c61618Srpaulo 	struct ieee80211_node		ni;
9676c61618Srpaulo 	struct ieee80211_rssadapt	rssadapt;
9776c61618Srpaulo };
9876c61618Srpaulo 
9976c61618Srpaulo struct rt2560_softc {
10061416b25Sdrochner 	device_t		sc_dev;
10176c61618Srpaulo 
10276c61618Srpaulo 	struct ieee80211com	sc_ic;
10376c61618Srpaulo 	int			(*sc_newstate)(struct ieee80211com *,
10476c61618Srpaulo 				    enum ieee80211_state, int);
10576c61618Srpaulo 
10676c61618Srpaulo 	int			(*sc_enable)(struct rt2560_softc *);
10776c61618Srpaulo 	void			(*sc_disable)(struct rt2560_softc *);
10876c61618Srpaulo 
10976c61618Srpaulo 	bus_dma_tag_t		sc_dmat;
11076c61618Srpaulo 	bus_space_tag_t		sc_st;
11176c61618Srpaulo 	bus_space_handle_t	sc_sh;
1125cac8917Snonaka 	void			*sc_soft_ih;
11376c61618Srpaulo 
11476c61618Srpaulo 	struct sysctllog	*sc_sysctllog;
11576c61618Srpaulo 
11676c61618Srpaulo 	struct ethercom		sc_ec;
11776c61618Srpaulo 
11876c61618Srpaulo 	struct callout		scan_ch;
11976c61618Srpaulo 	struct callout		rssadapt_ch;
12076c61618Srpaulo 
12176c61618Srpaulo 	int			sc_flags;
12276c61618Srpaulo #define RT2560_ENABLED	(1 << 0)
12376c61618Srpaulo 
12476c61618Srpaulo 	int			sc_tx_timer;
12576c61618Srpaulo 
12676c61618Srpaulo 	uint32_t		asic_rev;
12776c61618Srpaulo 	uint8_t			rf_rev;
12876c61618Srpaulo 
12976c61618Srpaulo 	struct rt2560_tx_ring	txq;
13076c61618Srpaulo 	struct rt2560_tx_ring	prioq;
13176c61618Srpaulo 	struct rt2560_tx_ring	atimq;
13276c61618Srpaulo 	struct rt2560_tx_ring	bcnq;
13376c61618Srpaulo 	struct rt2560_rx_ring	rxq;
13476c61618Srpaulo 
13576c61618Srpaulo 	struct ieee80211_beacon_offsets	sc_bo;
13676c61618Srpaulo 
13776c61618Srpaulo 	uint32_t		rf_regs[4];
13876c61618Srpaulo 	uint8_t			txpow[14];
13976c61618Srpaulo 
14076c61618Srpaulo 	struct {
14176c61618Srpaulo 		uint8_t	reg;
14276c61618Srpaulo 		uint8_t	val;
14376c61618Srpaulo 	}			bbp_prom[16];
14476c61618Srpaulo 
14576c61618Srpaulo 	int			led_mode;
14676c61618Srpaulo 	int			hw_radio;
14776c61618Srpaulo 	int			rx_ant;
14876c61618Srpaulo 	int			tx_ant;
14976c61618Srpaulo 	int			nb_ant;
15076c61618Srpaulo 
15176c61618Srpaulo 	int			dwelltime;
15276c61618Srpaulo 
15364da563dSpooka 	struct bpf_if *		sc_drvbpf;
15476c61618Srpaulo 
15576c61618Srpaulo 	union {
15676c61618Srpaulo 		struct rt2560_rx_radiotap_header th;
15776c61618Srpaulo 		uint8_t	pad[64];
15876c61618Srpaulo 	}			sc_rxtapu;
15976c61618Srpaulo #define sc_rxtap		sc_rxtapu.th
16076c61618Srpaulo 	int			sc_rxtap_len;
16176c61618Srpaulo 
16276c61618Srpaulo 	union {
16376c61618Srpaulo 		struct rt2560_tx_radiotap_header th;
16476c61618Srpaulo 		uint8_t	pad[64];
16576c61618Srpaulo 	}			sc_txtapu;
16676c61618Srpaulo #define sc_txtap		sc_txtapu.th
16776c61618Srpaulo 	int			sc_txtap_len;
16876c61618Srpaulo };
16976c61618Srpaulo 
1709fc70013Srpaulo #define	sc_if		sc_ec.ec_if
1719fc70013Srpaulo 
17276c61618Srpaulo int	rt2560_attach(void *, int);
17376c61618Srpaulo int	rt2560_detach(void *);
17476c61618Srpaulo int	rt2560_intr(void *);
175