1235233Sbschmidt/*-
2235233Sbschmidt * Copyright (c) 2007 Damien Bergamini <damien.bergamini@free.fr>
3235233Sbschmidt * Copyright (c) 2012 Bernhard Schmidt <bschmidt@FreeBSD.org>
4235233Sbschmidt *
5235233Sbschmidt * Permission to use, copy, modify, and distribute this software for any
6235233Sbschmidt * purpose with or without fee is hereby granted, provided that the above
7235233Sbschmidt * copyright notice and this permission notice appear in all copies.
8235233Sbschmidt *
9235233Sbschmidt * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10235233Sbschmidt * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11235233Sbschmidt * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12235233Sbschmidt * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13235233Sbschmidt * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14235233Sbschmidt * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15235233Sbschmidt * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16235233Sbschmidt *
17235233Sbschmidt * $OpenBSD: rt2860var.h,v 1.20 2010/09/07 16:21:42 deraadt Exp $
18235233Sbschmidt * $FreeBSD: stable/11/sys/dev/ral/rt2860var.h 351143 2019-08-16 21:03:55Z kevans $
19235233Sbschmidt */
20235233Sbschmidt
21235233Sbschmidt#define RT2860_TX_RING_COUNT	64
22235233Sbschmidt#define RT2860_RX_RING_COUNT	128
23235233Sbschmidt#define RT2860_TX_POOL_COUNT	(RT2860_TX_RING_COUNT * 2)
24235233Sbschmidt
25235233Sbschmidt#define RT2860_MAX_SCATTER	((RT2860_TX_RING_COUNT * 2) - 1)
26235233Sbschmidt
27235233Sbschmidt/* HW supports up to 255 STAs */
28235233Sbschmidt#define RT2860_WCID_MAX		254
29235233Sbschmidt#define RT2860_AID2WCID(aid)	((aid) & 0xff)
30235233Sbschmidt
31235233Sbschmidtstruct rt2860_rx_radiotap_header {
32235233Sbschmidt	struct ieee80211_radiotap_header wr_ihdr;
33235233Sbschmidt	uint64_t	wr_tsf;
34235233Sbschmidt	uint8_t		wr_flags;
35235233Sbschmidt	uint8_t		wr_rate;
36235233Sbschmidt	uint16_t	wr_chan_freq;
37235233Sbschmidt	uint16_t	wr_chan_flags;
38235233Sbschmidt	uint8_t		wr_antenna;
39235233Sbschmidt	int8_t		wr_antsignal;
40235233Sbschmidt	int8_t		wr_antnoise;
41300657Ssgalabov} __packed __aligned(8);
42235233Sbschmidt
43235233Sbschmidt#define RT2860_RX_RADIOTAP_PRESENT					\
44235233Sbschmidt	((1 << IEEE80211_RADIOTAP_TSFT) |				\
45235233Sbschmidt	 (1 << IEEE80211_RADIOTAP_FLAGS) |				\
46235233Sbschmidt	 (1 << IEEE80211_RADIOTAP_RATE) |				\
47235233Sbschmidt	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
48235233Sbschmidt	 (1 << IEEE80211_RADIOTAP_ANTENNA) |				\
49235233Sbschmidt	 (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) |			\
50235233Sbschmidt	 (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE))
51235233Sbschmidt
52235233Sbschmidtstruct rt2860_tx_radiotap_header {
53235233Sbschmidt	struct ieee80211_radiotap_header wt_ihdr;
54235233Sbschmidt	uint8_t		wt_flags;
55235233Sbschmidt	uint8_t		wt_rate;
56235233Sbschmidt	uint16_t	wt_chan_freq;
57235233Sbschmidt	uint16_t	wt_chan_flags;
58345636Savos} __packed;
59235233Sbschmidt
60235233Sbschmidt#define RT2860_TX_RADIOTAP_PRESENT					\
61235233Sbschmidt	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
62235233Sbschmidt	 (1 << IEEE80211_RADIOTAP_RATE) |				\
63235233Sbschmidt	 (1 << IEEE80211_RADIOTAP_CHANNEL))
64235233Sbschmidt
65235233Sbschmidtstruct rt2860_tx_data {
66235233Sbschmidt	struct rt2860_txwi		*txwi;
67235233Sbschmidt	struct mbuf			*m;
68235233Sbschmidt	struct ieee80211_node		*ni;
69235233Sbschmidt	bus_dmamap_t			map;
70235233Sbschmidt	bus_addr_t			paddr;
71235233Sbschmidt	SLIST_ENTRY(rt2860_tx_data)	next;
72235233Sbschmidt};
73235233Sbschmidt
74235233Sbschmidtstruct rt2860_tx_ring {
75235233Sbschmidt	struct rt2860_txd	*txd;
76235233Sbschmidt	bus_addr_t		paddr;
77235233Sbschmidt	bus_dma_tag_t		desc_dmat;
78235233Sbschmidt	bus_dmamap_t		desc_map;
79235233Sbschmidt	bus_dma_segment_t	seg;
80235233Sbschmidt	struct rt2860_tx_data	*data[RT2860_TX_RING_COUNT];
81235233Sbschmidt	int			cur;
82235233Sbschmidt	int			next;
83235233Sbschmidt	int			queued;
84235233Sbschmidt};
85235233Sbschmidt
86235233Sbschmidtstruct rt2860_rx_data {
87235233Sbschmidt	struct mbuf	*m;
88235233Sbschmidt	bus_dmamap_t	map;
89235233Sbschmidt};
90235233Sbschmidt
91235233Sbschmidtstruct rt2860_rx_ring {
92235233Sbschmidt	struct rt2860_rxd	*rxd;
93235233Sbschmidt	bus_addr_t		paddr;
94235233Sbschmidt	bus_dma_tag_t		desc_dmat;
95235233Sbschmidt	bus_dmamap_t		desc_map;
96235233Sbschmidt	bus_dma_tag_t		data_dmat;
97235233Sbschmidt	bus_dma_segment_t	seg;
98235233Sbschmidt	unsigned int		cur;	/* must be unsigned */
99235233Sbschmidt	struct rt2860_rx_data	data[RT2860_RX_RING_COUNT];
100235233Sbschmidt};
101235233Sbschmidt
102235233Sbschmidtstruct rt2860_node {
103235233Sbschmidt	struct ieee80211_node	ni;
104235233Sbschmidt	uint8_t			wcid;
105235233Sbschmidt	uint8_t			ridx[IEEE80211_RATE_MAXSIZE];
106235233Sbschmidt	uint8_t			ctl_ridx[IEEE80211_RATE_MAXSIZE];
107235233Sbschmidt};
108235233Sbschmidt
109235233Sbschmidtstruct rt2860_vap {
110235233Sbschmidt	struct ieee80211vap	ral_vap;
111235233Sbschmidt
112235233Sbschmidt	int			(*ral_newstate)(struct ieee80211vap *,
113235233Sbschmidt				    enum ieee80211_state, int);
114235233Sbschmidt};
115235233Sbschmidt#define	RT2860_VAP(vap)		((struct rt2860_vap *)(vap))
116235233Sbschmidt
117235233Sbschmidtstruct rt2860_softc {
118287197Sglebius	struct ieee80211com		sc_ic;
119287197Sglebius	struct mbufq			sc_snd;
120287197Sglebius	struct mtx			sc_mtx;
121235233Sbschmidt	device_t			sc_dev;
122235233Sbschmidt	bus_space_tag_t			sc_st;
123235233Sbschmidt	bus_space_handle_t		sc_sh;
124235233Sbschmidt
125235233Sbschmidt	struct callout			watchdog_ch;
126235233Sbschmidt
127235233Sbschmidt	int				sc_invalid;
128235233Sbschmidt	int				sc_debug;
129235233Sbschmidt/*
130235233Sbschmidt * The same in both up to here
131235233Sbschmidt * ------------------------------------------------
132235233Sbschmidt */
133235233Sbschmidt
134235233Sbschmidt	uint16_t			(*sc_srom_read)(struct rt2860_softc *,
135235233Sbschmidt					    uint16_t);
136235233Sbschmidt	void				(*sc_node_free)(struct ieee80211_node *);
137235233Sbschmidt
138235233Sbschmidt	int				sc_flags;
139235233Sbschmidt#define RT2860_ENABLED		(1 << 0)
140235233Sbschmidt#define RT2860_ADVANCED_PS	(1 << 1)
141235233Sbschmidt#define RT2860_PCIE		(1 << 2)
142290133Skevlo#define	RT2860_RUNNING		(1 << 3)
143235233Sbschmidt
144351143Skevans	struct ieee80211_node		*wcid2ni[RT2860_WCID_MAX + 1];
145235233Sbschmidt
146235233Sbschmidt	struct rt2860_tx_ring		txq[6];
147235233Sbschmidt	struct rt2860_rx_ring		rxq;
148235233Sbschmidt
149235233Sbschmidt	SLIST_HEAD(, rt2860_tx_data)	data_pool;
150235233Sbschmidt	struct rt2860_tx_data		data[RT2860_TX_POOL_COUNT];
151235233Sbschmidt	bus_dma_tag_t			txwi_dmat;
152235233Sbschmidt	bus_dmamap_t			txwi_map;
153235233Sbschmidt	bus_dma_segment_t		txwi_seg;
154235233Sbschmidt	caddr_t				txwi_vaddr;
155235233Sbschmidt
156235233Sbschmidt	int				sc_tx_timer;
157235233Sbschmidt	int				mgtqid;
158235233Sbschmidt	uint8_t				qfullmsk;
159235233Sbschmidt
160235233Sbschmidt	uint16_t			mac_ver;
161235233Sbschmidt	uint16_t			mac_rev;
162300006Skevlo	uint16_t			rf_rev;
163235233Sbschmidt	uint8_t				freq;
164235233Sbschmidt	uint8_t				ntxchains;
165235233Sbschmidt	uint8_t				nrxchains;
166235233Sbschmidt	uint8_t				pslevel;
167235233Sbschmidt	int8_t				txpow1[54];
168235233Sbschmidt	int8_t				txpow2[54];
169235233Sbschmidt	int8_t				rssi_2ghz[3];
170235233Sbschmidt	int8_t				rssi_5ghz[3];
171235233Sbschmidt	uint8_t				lna[4];
172235233Sbschmidt	uint8_t				rf24_20mhz;
173235233Sbschmidt	uint8_t				rf24_40mhz;
174235233Sbschmidt	uint8_t				patch_dac;
175235233Sbschmidt	uint8_t				rfswitch;
176235233Sbschmidt	uint8_t				ext_2ghz_lna;
177235233Sbschmidt	uint8_t				ext_5ghz_lna;
178235233Sbschmidt	uint8_t				calib_2ghz;
179235233Sbschmidt	uint8_t				calib_5ghz;
180235233Sbschmidt	uint8_t				txmixgain_2ghz;
181235233Sbschmidt	uint8_t				txmixgain_5ghz;
182235233Sbschmidt	uint8_t				tssi_2ghz[9];
183235233Sbschmidt	uint8_t				tssi_5ghz[9];
184235233Sbschmidt	uint8_t				step_2ghz;
185235233Sbschmidt	uint8_t				step_5ghz;
186235233Sbschmidt	struct {
187235233Sbschmidt		uint8_t	reg;
188235233Sbschmidt		uint8_t	val;
189235233Sbschmidt	}				bbp[8], rf[10];
190235233Sbschmidt	uint8_t				leds;
191235233Sbschmidt	uint16_t			led[3];
192235233Sbschmidt	uint32_t			txpow20mhz[5];
193235233Sbschmidt	uint32_t			txpow40mhz_2ghz[5];
194235233Sbschmidt	uint32_t			txpow40mhz_5ghz[5];
195235233Sbschmidt
196235233Sbschmidt	struct rt2860_rx_radiotap_header sc_rxtap;
197235233Sbschmidt	struct rt2860_tx_radiotap_header sc_txtap;
198235233Sbschmidt};
199235233Sbschmidt
200235233Sbschmidtint	rt2860_attach(device_t, int);
201235233Sbschmidtint	rt2860_detach(void *);
202235233Sbschmidtvoid	rt2860_shutdown(void *);
203235233Sbschmidtvoid	rt2860_suspend(void *);
204235233Sbschmidtvoid	rt2860_resume(void *);
205235233Sbschmidtvoid	rt2860_intr(void *);
206235233Sbschmidt
207235233Sbschmidt#define RAL_LOCK(sc)		mtx_lock(&(sc)->sc_mtx)
208235233Sbschmidt#define RAL_LOCK_ASSERT(sc)	mtx_assert(&(sc)->sc_mtx, MA_OWNED)
209235233Sbschmidt#define RAL_UNLOCK(sc)		mtx_unlock(&(sc)->sc_mtx)
210