xref: /dflybsd-src/sys/dev/netif/ral/rt2661var.h (revision 99fda2c4f7bbb9d9351fbc814aa0a0dde8ff7e73)
15fdff524SSepherosa Ziehau /*
25fdff524SSepherosa Ziehau  * Copyright (c) 2005
35fdff524SSepherosa Ziehau  *	Damien Bergamini <damien.bergamini@free.fr>
45fdff524SSepherosa Ziehau  *
55fdff524SSepherosa Ziehau  * Permission to use, copy, modify, and distribute this software for any
65fdff524SSepherosa Ziehau  * purpose with or without fee is hereby granted, provided that the above
75fdff524SSepherosa Ziehau  * copyright notice and this permission notice appear in all copies.
85fdff524SSepherosa Ziehau  *
95fdff524SSepherosa Ziehau  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
105fdff524SSepherosa Ziehau  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
115fdff524SSepherosa Ziehau  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
125fdff524SSepherosa Ziehau  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
135fdff524SSepherosa Ziehau  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
145fdff524SSepherosa Ziehau  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
155fdff524SSepherosa Ziehau  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
165fdff524SSepherosa Ziehau  *
175fdff524SSepherosa Ziehau  * $FreeBSD: src/sys/dev/ral/rt2661var.h,v 1.1 2006/03/05 20:36:56 damien Exp $
18*99fda2c4SSepherosa Ziehau  * $DragonFly: src/sys/dev/netif/ral/rt2661var.h,v 1.10 2008/01/17 07:35:38 sephe Exp $
195fdff524SSepherosa Ziehau  */
205fdff524SSepherosa Ziehau 
21ce42f143SSepherosa Ziehau #define RT2661_NCHAN_MAX	38
225717dc1aSSepherosa Ziehau #define RT2661_KEY_MAX		64
23ce42f143SSepherosa Ziehau 
245fdff524SSepherosa Ziehau struct rt2661_rx_radiotap_header {
255fdff524SSepherosa Ziehau 	struct ieee80211_radiotap_header wr_ihdr;
265fdff524SSepherosa Ziehau 	uint64_t	wr_tsf;
275fdff524SSepherosa Ziehau 	uint8_t		wr_flags;
285fdff524SSepherosa Ziehau 	uint8_t		wr_rate;
295fdff524SSepherosa Ziehau 	uint16_t	wr_chan_freq;
305fdff524SSepherosa Ziehau 	uint16_t	wr_chan_flags;
315fdff524SSepherosa Ziehau 	uint8_t		wr_antsignal;
325fdff524SSepherosa Ziehau } __packed;
335fdff524SSepherosa Ziehau 
345fdff524SSepherosa Ziehau #define RT2661_RX_RADIOTAP_PRESENT					\
355fdff524SSepherosa Ziehau 	((1 << IEEE80211_RADIOTAP_TSFT) |				\
365fdff524SSepherosa Ziehau 	 (1 << IEEE80211_RADIOTAP_FLAGS) |				\
375fdff524SSepherosa Ziehau 	 (1 << IEEE80211_RADIOTAP_RATE) |				\
385fdff524SSepherosa Ziehau 	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
395fdff524SSepherosa Ziehau 	 (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL))
405fdff524SSepherosa Ziehau 
415fdff524SSepherosa Ziehau struct rt2661_tx_radiotap_header {
425fdff524SSepherosa Ziehau 	struct ieee80211_radiotap_header wt_ihdr;
435fdff524SSepherosa Ziehau 	uint8_t		wt_flags;
445fdff524SSepherosa Ziehau 	uint8_t		wt_rate;
455fdff524SSepherosa Ziehau 	uint16_t	wt_chan_freq;
465fdff524SSepherosa Ziehau 	uint16_t	wt_chan_flags;
475fdff524SSepherosa Ziehau } __packed;
485fdff524SSepherosa Ziehau 
495fdff524SSepherosa Ziehau #define RT2661_TX_RADIOTAP_PRESENT					\
505fdff524SSepherosa Ziehau 	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
515fdff524SSepherosa Ziehau 	 (1 << IEEE80211_RADIOTAP_RATE) |				\
525fdff524SSepherosa Ziehau 	 (1 << IEEE80211_RADIOTAP_CHANNEL))
535fdff524SSepherosa Ziehau 
549dd87f8aSSepherosa Ziehau struct rt2661_tx_ratectl {
555fdff524SSepherosa Ziehau 	struct ieee80211_node	*ni;
56e3ab8063SSepherosa Ziehau 	int			len;
57e3ab8063SSepherosa Ziehau 	int			rateidx;
589dd87f8aSSepherosa Ziehau 	STAILQ_ENTRY(rt2661_tx_ratectl)	link;
599dd87f8aSSepherosa Ziehau };
609dd87f8aSSepherosa Ziehau 
619dd87f8aSSepherosa Ziehau struct rt2661_data {
629dd87f8aSSepherosa Ziehau 	bus_dmamap_t	map;
639dd87f8aSSepherosa Ziehau 	struct mbuf	*m;
645fdff524SSepherosa Ziehau };
655fdff524SSepherosa Ziehau 
665fdff524SSepherosa Ziehau struct rt2661_tx_ring {
675fdff524SSepherosa Ziehau 	bus_dma_tag_t		desc_dmat;
685fdff524SSepherosa Ziehau 	bus_dma_tag_t		data_dmat;
695fdff524SSepherosa Ziehau 	bus_dmamap_t		desc_map;
705fdff524SSepherosa Ziehau 	bus_addr_t		physaddr;
715fdff524SSepherosa Ziehau 	struct rt2661_tx_desc	*desc;
729dd87f8aSSepherosa Ziehau 	struct rt2661_data	*data;
735fdff524SSepherosa Ziehau 	int			count;
745fdff524SSepherosa Ziehau 	int			queued;
755fdff524SSepherosa Ziehau 	int			cur;
765fdff524SSepherosa Ziehau 	int			next;
775fdff524SSepherosa Ziehau };
785fdff524SSepherosa Ziehau 
795fdff524SSepherosa Ziehau struct rt2661_rx_ring {
805fdff524SSepherosa Ziehau 	bus_dma_tag_t		desc_dmat;
815fdff524SSepherosa Ziehau 	bus_dma_tag_t		data_dmat;
825fdff524SSepherosa Ziehau 	bus_dmamap_t		desc_map;
835fdff524SSepherosa Ziehau 	bus_addr_t		physaddr;
845fdff524SSepherosa Ziehau 	struct rt2661_rx_desc	*desc;
859dd87f8aSSepherosa Ziehau 	struct rt2661_data	*data;
865fdff524SSepherosa Ziehau 	int			count;
875fdff524SSepherosa Ziehau 	int			cur;
885fdff524SSepherosa Ziehau 	int			next;
895fdff524SSepherosa Ziehau };
905fdff524SSepherosa Ziehau 
91*99fda2c4SSepherosa Ziehau struct rt2661_rfprog {
92*99fda2c4SSepherosa Ziehau 	uint8_t		chan;
93*99fda2c4SSepherosa Ziehau 	uint32_t	r1, r2, r3, r4;
94*99fda2c4SSepherosa Ziehau };
95*99fda2c4SSepherosa Ziehau 
965fdff524SSepherosa Ziehau struct rt2661_softc {
975fdff524SSepherosa Ziehau 	struct ieee80211com		sc_ic;
985fdff524SSepherosa Ziehau 	bus_space_tag_t			sc_st;
995fdff524SSepherosa Ziehau 	bus_space_handle_t		sc_sh;
1005fdff524SSepherosa Ziehau 	device_t			sc_dev;
1015fdff524SSepherosa Ziehau 
1025fdff524SSepherosa Ziehau 	int				sc_irq_rid;
1035fdff524SSepherosa Ziehau 	struct resource			*sc_irq;
1045fdff524SSepherosa Ziehau 	void				*sc_ih;
1055fdff524SSepherosa Ziehau 
1065717dc1aSSepherosa Ziehau 	int				(*sc_newstate)
1075717dc1aSSepherosa Ziehau 					(struct ieee80211com *,
1085fdff524SSepherosa Ziehau 					 enum ieee80211_state, int);
1095fdff524SSepherosa Ziehau 
1105717dc1aSSepherosa Ziehau 	int				(*sc_key_alloc)
1115717dc1aSSepherosa Ziehau 					(struct ieee80211com *,
1125717dc1aSSepherosa Ziehau 					 const struct ieee80211_key *,
1135717dc1aSSepherosa Ziehau 					 ieee80211_keyix *, ieee80211_keyix *);
1145717dc1aSSepherosa Ziehau 
1155717dc1aSSepherosa Ziehau 	int				(*sc_key_delete)
1165717dc1aSSepherosa Ziehau 					(struct ieee80211com *,
1175717dc1aSSepherosa Ziehau 					 const struct ieee80211_key *);
1185717dc1aSSepherosa Ziehau 
1195717dc1aSSepherosa Ziehau 	int				(*sc_key_set)
1205717dc1aSSepherosa Ziehau 					(struct ieee80211com *,
1215717dc1aSSepherosa Ziehau 					 const struct ieee80211_key *,
1225717dc1aSSepherosa Ziehau 					 const uint8_t[IEEE80211_ADDR_LEN]);
1235717dc1aSSepherosa Ziehau 
1245fdff524SSepherosa Ziehau 	struct callout			scan_ch;
125*99fda2c4SSepherosa Ziehau 	struct callout			calib_ch;
1265fdff524SSepherosa Ziehau 
1275fdff524SSepherosa Ziehau 	int				sc_tx_timer;
128322b19a8SSepherosa Ziehau 	int				sc_sifs;
1295fdff524SSepherosa Ziehau 
1305fdff524SSepherosa Ziehau 	struct ieee80211_channel	*sc_curchan;
131*99fda2c4SSepherosa Ziehau 	int				sc_curchan_idx;
132*99fda2c4SSepherosa Ziehau 	int				sc_txpwr_cnt;
133*99fda2c4SSepherosa Ziehau 	int8_t				sc_txpwr;
1345fdff524SSepherosa Ziehau 
1355fdff524SSepherosa Ziehau 	uint8_t				rf_rev;
1365fdff524SSepherosa Ziehau 
137*99fda2c4SSepherosa Ziehau 	const struct rt2661_rfprog	*rfprog;
1385fdff524SSepherosa Ziehau 	uint8_t				rffreq;
1395fdff524SSepherosa Ziehau 
1405fdff524SSepherosa Ziehau 	struct rt2661_tx_ring		txq[4];
1415fdff524SSepherosa Ziehau 	struct rt2661_tx_ring		mgtq;
1425fdff524SSepherosa Ziehau 	struct rt2661_rx_ring		rxq;
1435fdff524SSepherosa Ziehau 
1445fdff524SSepherosa Ziehau 	uint32_t			rf_regs[4];
145ce42f143SSepherosa Ziehau 	int8_t				txpow[RT2661_NCHAN_MAX];
1465fdff524SSepherosa Ziehau 
1475fdff524SSepherosa Ziehau 	struct {
1485fdff524SSepherosa Ziehau 		uint8_t	reg;
1495fdff524SSepherosa Ziehau 		uint8_t	val;
1505fdff524SSepherosa Ziehau 	}				bbp_prom[16];
1515fdff524SSepherosa Ziehau 
1525fdff524SSepherosa Ziehau 	int				hw_radio;
1535fdff524SSepherosa Ziehau 	int				rx_ant;
1545fdff524SSepherosa Ziehau 	int				tx_ant;
1555fdff524SSepherosa Ziehau 	int				nb_ant;
156110dc487SSepherosa Ziehau 
1575fdff524SSepherosa Ziehau 	int				ext_2ghz_lna;
158110dc487SSepherosa Ziehau 	int				rssi_2ghz_corr[2];
159110dc487SSepherosa Ziehau 	int				avg_rssi[2];
160*99fda2c4SSepherosa Ziehau 	uint8_t				bbp17_2ghz_min;
161*99fda2c4SSepherosa Ziehau 	uint8_t				bbp17_2ghz_max;
162110dc487SSepherosa Ziehau 
1635fdff524SSepherosa Ziehau 	int				ext_5ghz_lna;
1645fdff524SSepherosa Ziehau 	int				rssi_5ghz_corr;
1655fdff524SSepherosa Ziehau 
1665fdff524SSepherosa Ziehau 	uint8_t				bbp18;
1675fdff524SSepherosa Ziehau 	uint8_t				bbp21;
1685fdff524SSepherosa Ziehau 	uint8_t				bbp22;
1695fdff524SSepherosa Ziehau 	uint8_t				bbp16;
1705fdff524SSepherosa Ziehau 	uint8_t				bbp17;
1715fdff524SSepherosa Ziehau 	uint8_t				bbp64;
1726c40999eSSepherosa Ziehau 	uint16_t			mcu_led;
1735fdff524SSepherosa Ziehau 
1749dd87f8aSSepherosa Ziehau 	STAILQ_HEAD(, rt2661_tx_ratectl) tx_ratectl;
1759dd87f8aSSepherosa Ziehau 
1765fdff524SSepherosa Ziehau 	struct bpf_if			*sc_drvbpf;
1775fdff524SSepherosa Ziehau 
1785fdff524SSepherosa Ziehau 	union {
1795fdff524SSepherosa Ziehau 		struct rt2661_rx_radiotap_header th;
1805fdff524SSepherosa Ziehau 		uint8_t	pad[64];
1815fdff524SSepherosa Ziehau 	}				sc_rxtapu;
1825fdff524SSepherosa Ziehau #define sc_rxtap	sc_rxtapu.th
1835fdff524SSepherosa Ziehau 	int				sc_rxtap_len;
1845fdff524SSepherosa Ziehau 
1855fdff524SSepherosa Ziehau 	union {
1865fdff524SSepherosa Ziehau 		struct rt2661_tx_radiotap_header th;
1875fdff524SSepherosa Ziehau 		uint8_t	pad[64];
1885fdff524SSepherosa Ziehau 	}				sc_txtapu;
1895fdff524SSepherosa Ziehau #define sc_txtap	sc_txtapu.th
1905fdff524SSepherosa Ziehau 	int				sc_txtap_len;
1915fdff524SSepherosa Ziehau 
1925fdff524SSepherosa Ziehau 	struct sysctl_ctx_list		sysctl_ctx;
1935fdff524SSepherosa Ziehau 	struct sysctl_oid		*sysctl_tree;
1945717dc1aSSepherosa Ziehau 
195*99fda2c4SSepherosa Ziehau 	int				sc_txpwr_corr;
196*99fda2c4SSepherosa Ziehau 	int				sc_calib_txpwr;
197*99fda2c4SSepherosa Ziehau 	int				sc_calib_rxsns;
198*99fda2c4SSepherosa Ziehau 	int				sc_dwelltime;
199*99fda2c4SSepherosa Ziehau 
20021028056SSepherosa Ziehau 	struct ieee80211_onoe_param	sc_onoe_param;
20121028056SSepherosa Ziehau 	struct ieee80211_sample_param	sc_sample_param;
20221028056SSepherosa Ziehau 
2035717dc1aSSepherosa Ziehau 	uint32_t			sc_keymap[2];
2045fdff524SSepherosa Ziehau };
2055fdff524SSepherosa Ziehau 
2065717dc1aSSepherosa Ziehau #define RT2661_KEY_ASSERT(keyix) \
2075717dc1aSSepherosa Ziehau 	KASSERT((keyix) < RT2661_KEY_MAX, ("invalid keyix %d\n", (keyix)))
2085717dc1aSSepherosa Ziehau 
2095717dc1aSSepherosa Ziehau #define RT2661_KEY_SET(sc, keyix) \
2105717dc1aSSepherosa Ziehau do { \
2115717dc1aSSepherosa Ziehau 	RT2661_KEY_ASSERT((keyix)); \
2125717dc1aSSepherosa Ziehau 	(sc)->sc_keymap[(keyix) / 32] |= (1 << ((keyix) % 32)); \
2135717dc1aSSepherosa Ziehau } while (0)
2145717dc1aSSepherosa Ziehau 
2155717dc1aSSepherosa Ziehau #define RT2661_KEY_CLR(sc, keyix) \
2165717dc1aSSepherosa Ziehau do { \
2175717dc1aSSepherosa Ziehau 	RT2661_KEY_ASSERT((keyix)); \
2185717dc1aSSepherosa Ziehau 	(sc)->sc_keymap[(keyix) / 32] &= ~(1 << ((keyix) % 32)); \
2195717dc1aSSepherosa Ziehau } while (0)
2205717dc1aSSepherosa Ziehau 
2215717dc1aSSepherosa Ziehau #define RT2661_KEY_ISSET(sc, keyix) \
2225717dc1aSSepherosa Ziehau 	((sc)->sc_keymap[(keyix) / 32] & (1 << ((keyix) % 32)))
2235717dc1aSSepherosa Ziehau 
224110dc487SSepherosa Ziehau #define RT2661_RESET_AVG_RSSI(sc) \
225110dc487SSepherosa Ziehau do { \
226110dc487SSepherosa Ziehau 	(sc)->avg_rssi[0] = -1; \
227110dc487SSepherosa Ziehau 	(sc)->avg_rssi[1] = -1; \
228110dc487SSepherosa Ziehau } while (0)
229110dc487SSepherosa Ziehau 
2305fdff524SSepherosa Ziehau int	rt2661_attach(device_t, int);
2315fdff524SSepherosa Ziehau int	rt2661_detach(void *);
2325fdff524SSepherosa Ziehau void	rt2661_shutdown(void *);
2335fdff524SSepherosa Ziehau void	rt2661_suspend(void *);
2345fdff524SSepherosa Ziehau void	rt2661_resume(void *);
235