xref: /freebsd-src/sys/dev/rtwn/if_rtwnvar.h (revision ec07af2a3d494de36a20a541efdd24874c841db5)
17453645fSAndriy Voskoboinyk /*-
27453645fSAndriy Voskoboinyk  * Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr>
37453645fSAndriy Voskoboinyk  * Copyright (c) 2015-2016 Andriy Voskoboinyk <avos@FreeBSD.org>
47453645fSAndriy Voskoboinyk  *
57453645fSAndriy Voskoboinyk  * Permission to use, copy, modify, and distribute this software for any
67453645fSAndriy Voskoboinyk  * purpose with or without fee is hereby granted, provided that the above
77453645fSAndriy Voskoboinyk  * copyright notice and this permission notice appear in all copies.
87453645fSAndriy Voskoboinyk  *
97453645fSAndriy Voskoboinyk  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
107453645fSAndriy Voskoboinyk  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
117453645fSAndriy Voskoboinyk  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
127453645fSAndriy Voskoboinyk  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
137453645fSAndriy Voskoboinyk  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
147453645fSAndriy Voskoboinyk  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
157453645fSAndriy Voskoboinyk  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
167453645fSAndriy Voskoboinyk  *
177453645fSAndriy Voskoboinyk  * $OpenBSD: if_urtwnreg.h,v 1.3 2010/11/16 18:02:59 damien Exp $
187453645fSAndriy Voskoboinyk  */
197453645fSAndriy Voskoboinyk 
207453645fSAndriy Voskoboinyk #ifndef IF_RTWNVAR_H
217453645fSAndriy Voskoboinyk #define IF_RTWNVAR_H
227453645fSAndriy Voskoboinyk 
237453645fSAndriy Voskoboinyk #include "opt_rtwn.h"
247453645fSAndriy Voskoboinyk 
257453645fSAndriy Voskoboinyk #define RTWN_TX_DESC_SIZE	64
267453645fSAndriy Voskoboinyk 
277453645fSAndriy Voskoboinyk #define RTWN_BCN_MAX_SIZE	512
287453645fSAndriy Voskoboinyk #define RTWN_CAM_ENTRY_LIMIT	64
297453645fSAndriy Voskoboinyk 
307453645fSAndriy Voskoboinyk #define RTWN_MACID_BC		1	/* Broadcast. */
317453645fSAndriy Voskoboinyk #define RTWN_MACID_UNDEFINED	0x7fff
327453645fSAndriy Voskoboinyk #define RTWN_MACID_VALID 	0x8000
337453645fSAndriy Voskoboinyk #define RTWN_MACID_LIMIT	128
347453645fSAndriy Voskoboinyk 
35d99eb823SAdrian Chadd #define RTWN_TX_TIMEOUT		1000	/* ms */
367453645fSAndriy Voskoboinyk #define RTWN_MAX_EPOUT		4
377453645fSAndriy Voskoboinyk #define RTWN_PORT_COUNT		2
387453645fSAndriy Voskoboinyk 
397453645fSAndriy Voskoboinyk #define RTWN_LED_LINK		0
407453645fSAndriy Voskoboinyk #define RTWN_LED_DATA		1
417453645fSAndriy Voskoboinyk 
427453645fSAndriy Voskoboinyk struct rtwn_rx_radiotap_header {
437453645fSAndriy Voskoboinyk 	struct ieee80211_radiotap_header wr_ihdr;
447453645fSAndriy Voskoboinyk 	uint64_t	wr_tsft;
457453645fSAndriy Voskoboinyk 	uint8_t		wr_flags;
467453645fSAndriy Voskoboinyk 	uint8_t		wr_rate;
477453645fSAndriy Voskoboinyk 	uint16_t	wr_chan_freq;
487453645fSAndriy Voskoboinyk 	uint16_t	wr_chan_flags;
497453645fSAndriy Voskoboinyk 	int8_t		wr_dbm_antsignal;
507453645fSAndriy Voskoboinyk 	int8_t		wr_dbm_antnoise;
517453645fSAndriy Voskoboinyk } __packed __aligned(8);
527453645fSAndriy Voskoboinyk 
537453645fSAndriy Voskoboinyk #define RTWN_RX_RADIOTAP_PRESENT			\
547453645fSAndriy Voskoboinyk 	(1 << IEEE80211_RADIOTAP_TSFT |			\
557453645fSAndriy Voskoboinyk 	 1 << IEEE80211_RADIOTAP_FLAGS |		\
567453645fSAndriy Voskoboinyk 	 1 << IEEE80211_RADIOTAP_RATE |			\
577453645fSAndriy Voskoboinyk 	 1 << IEEE80211_RADIOTAP_CHANNEL |		\
587453645fSAndriy Voskoboinyk 	 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL |	\
597453645fSAndriy Voskoboinyk 	 1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)
607453645fSAndriy Voskoboinyk 
617453645fSAndriy Voskoboinyk struct rtwn_tx_radiotap_header {
627453645fSAndriy Voskoboinyk 	struct ieee80211_radiotap_header wt_ihdr;
637453645fSAndriy Voskoboinyk 	uint8_t		wt_flags;
64786ac703SAndriy Voskoboinyk 	uint8_t		wt_pad;
657453645fSAndriy Voskoboinyk 	uint16_t	wt_chan_freq;
667453645fSAndriy Voskoboinyk 	uint16_t	wt_chan_flags;
67786ac703SAndriy Voskoboinyk } __packed;
687453645fSAndriy Voskoboinyk 
697453645fSAndriy Voskoboinyk #define RTWN_TX_RADIOTAP_PRESENT			\
707453645fSAndriy Voskoboinyk 	(1 << IEEE80211_RADIOTAP_FLAGS |		\
717453645fSAndriy Voskoboinyk 	 1 << IEEE80211_RADIOTAP_CHANNEL)
727453645fSAndriy Voskoboinyk 
737453645fSAndriy Voskoboinyk struct rtwn_tx_buf {
747453645fSAndriy Voskoboinyk 	uint8_t		txd[RTWN_TX_DESC_SIZE];
757453645fSAndriy Voskoboinyk } __attribute__((aligned(4)));
767453645fSAndriy Voskoboinyk 
7709606165SAndriy Voskoboinyk #define RTWN_PHY_STATUS_SIZE	32
7809606165SAndriy Voskoboinyk struct rtwn_tx_phystat {
7909606165SAndriy Voskoboinyk 	uint32_t	phydw[RTWN_PHY_STATUS_SIZE / sizeof(uint32_t)];
8009606165SAndriy Voskoboinyk };
8109606165SAndriy Voskoboinyk 
827453645fSAndriy Voskoboinyk struct rtwn_softc;
837453645fSAndriy Voskoboinyk 
847453645fSAndriy Voskoboinyk union sec_param {
857453645fSAndriy Voskoboinyk 	struct ieee80211_key	key;
867453645fSAndriy Voskoboinyk 	int			macid;
877453645fSAndriy Voskoboinyk };
887453645fSAndriy Voskoboinyk 
897453645fSAndriy Voskoboinyk #define CMD_FUNC_PROTO		void (*func)(struct rtwn_softc *, \
907453645fSAndriy Voskoboinyk 				    union sec_param *)
917453645fSAndriy Voskoboinyk 
927453645fSAndriy Voskoboinyk struct rtwn_cmdq {
937453645fSAndriy Voskoboinyk 	union sec_param		data;
947453645fSAndriy Voskoboinyk 	CMD_FUNC_PROTO;
957453645fSAndriy Voskoboinyk };
967453645fSAndriy Voskoboinyk #define RTWN_CMDQ_SIZE		16
977453645fSAndriy Voskoboinyk 
987453645fSAndriy Voskoboinyk struct rtwn_node {
997453645fSAndriy Voskoboinyk 	struct ieee80211_node	ni;	/* must be the first */
1007453645fSAndriy Voskoboinyk 	int			id;
10109606165SAndriy Voskoboinyk 
10209606165SAndriy Voskoboinyk 	struct rtwn_tx_phystat	last_physt;
1037453645fSAndriy Voskoboinyk 	int			avg_pwdb;
1047453645fSAndriy Voskoboinyk };
1057453645fSAndriy Voskoboinyk #define RTWN_NODE(ni)		((struct rtwn_node *)(ni))
1067453645fSAndriy Voskoboinyk 
1077453645fSAndriy Voskoboinyk struct rtwn_vap {
1087453645fSAndriy Voskoboinyk 	struct ieee80211vap	vap;
1097453645fSAndriy Voskoboinyk 	int			id;
1107453645fSAndriy Voskoboinyk #define RTWN_VAP_ID_INVALID	-1
1117453645fSAndriy Voskoboinyk 	int			curr_mode;
1127453645fSAndriy Voskoboinyk 
1137453645fSAndriy Voskoboinyk 	struct rtwn_tx_buf	bcn_desc;
1147453645fSAndriy Voskoboinyk 	struct mbuf		*bcn_mbuf;
115b8ad00b0SAndriy Voskoboinyk 	struct timeout_task	tx_beacon_csa;
1167453645fSAndriy Voskoboinyk 
1177453645fSAndriy Voskoboinyk 	struct callout		tsf_sync_adhoc;
1187453645fSAndriy Voskoboinyk 	struct task		tsf_sync_adhoc_task;
1197453645fSAndriy Voskoboinyk 
1207453645fSAndriy Voskoboinyk 	const struct ieee80211_key	*keys[IEEE80211_WEP_NKID];
1217453645fSAndriy Voskoboinyk 
1227453645fSAndriy Voskoboinyk 	int			(*newstate)(struct ieee80211vap *,
1237453645fSAndriy Voskoboinyk 				    enum ieee80211_state, int);
1247453645fSAndriy Voskoboinyk 	void			(*recv_mgmt)(struct ieee80211_node *,
1257453645fSAndriy Voskoboinyk 				    struct mbuf *, int,
1267453645fSAndriy Voskoboinyk 				    const struct ieee80211_rx_stats *,
1277453645fSAndriy Voskoboinyk 				    int, int);
1287453645fSAndriy Voskoboinyk };
1297453645fSAndriy Voskoboinyk #define	RTWN_VAP(vap)		((struct rtwn_vap *)(vap))
1307453645fSAndriy Voskoboinyk 
1317453645fSAndriy Voskoboinyk /*
1327453645fSAndriy Voskoboinyk  * Rx data types.
1337453645fSAndriy Voskoboinyk  */
1347453645fSAndriy Voskoboinyk enum {
1357453645fSAndriy Voskoboinyk 	RTWN_RX_DATA,
136b59017c5SAdrian Chadd 	RTWN_RX_TX_REPORT,	/* Per-packet */
137b59017c5SAdrian Chadd 	RTWN_RX_TX_REPORT2,	/* Per-MACID summary */
1387453645fSAndriy Voskoboinyk 	RTWN_RX_OTHER
1397453645fSAndriy Voskoboinyk };
1407453645fSAndriy Voskoboinyk 
1417453645fSAndriy Voskoboinyk /*
1427453645fSAndriy Voskoboinyk  * Firmware reset reasons.
1437453645fSAndriy Voskoboinyk  */
1447453645fSAndriy Voskoboinyk enum {
1457453645fSAndriy Voskoboinyk 	RTWN_FW_RESET_DOWNLOAD,
1467453645fSAndriy Voskoboinyk 	RTWN_FW_RESET_CHECKSUM,
1477453645fSAndriy Voskoboinyk 	RTWN_FW_RESET_SHUTDOWN
1487453645fSAndriy Voskoboinyk };
1497453645fSAndriy Voskoboinyk 
1507453645fSAndriy Voskoboinyk /*
1517453645fSAndriy Voskoboinyk  * Rate control algorithm selection.
1527453645fSAndriy Voskoboinyk  */
1537453645fSAndriy Voskoboinyk enum {
1547453645fSAndriy Voskoboinyk 	RTWN_RATECTL_NONE,
1557453645fSAndriy Voskoboinyk 	RTWN_RATECTL_NET80211,
1567453645fSAndriy Voskoboinyk 	RTWN_RATECTL_FW,
1577453645fSAndriy Voskoboinyk 	RTWN_RATECTL_MAX
1587453645fSAndriy Voskoboinyk };
1597453645fSAndriy Voskoboinyk 
1607453645fSAndriy Voskoboinyk /*
1617453645fSAndriy Voskoboinyk  * Control h/w crypto usage.
1627453645fSAndriy Voskoboinyk  */
1637453645fSAndriy Voskoboinyk enum {
1647453645fSAndriy Voskoboinyk 	RTWN_CRYPTO_SW,
1657453645fSAndriy Voskoboinyk 	RTWN_CRYPTO_PAIR,
1667453645fSAndriy Voskoboinyk 	RTWN_CRYPTO_FULL,
1677453645fSAndriy Voskoboinyk 	RTWN_CRYPTO_MAX,
1687453645fSAndriy Voskoboinyk };
1697453645fSAndriy Voskoboinyk 
1707453645fSAndriy Voskoboinyk struct rtwn_softc {
1717453645fSAndriy Voskoboinyk 	struct ieee80211com	sc_ic;
1727453645fSAndriy Voskoboinyk 	struct mbufq		sc_snd;
1737453645fSAndriy Voskoboinyk 	device_t		sc_dev;
1747453645fSAndriy Voskoboinyk 
1757453645fSAndriy Voskoboinyk 	int			sc_ht40;
176fcb5e8d0SAdrian Chadd 	int			sc_ena_tsf64;
1777453645fSAndriy Voskoboinyk 	uint32_t		sc_debug;
1787453645fSAndriy Voskoboinyk 	int			sc_hwcrypto;
1797453645fSAndriy Voskoboinyk 	int			sc_ratectl_sysctl;
1807453645fSAndriy Voskoboinyk 	int			sc_ratectl;
1817ddf1949SAdrian Chadd 	uint32_t		sc_reg_addr;
1827453645fSAndriy Voskoboinyk 
1837453645fSAndriy Voskoboinyk 	uint8_t			sc_detached;
1847453645fSAndriy Voskoboinyk 	uint8_t			sc_flags;
1857453645fSAndriy Voskoboinyk /* Device flags */
1867453645fSAndriy Voskoboinyk #define RTWN_FLAG_CCK_HIPWR	0x01
1877453645fSAndriy Voskoboinyk #define RTWN_FLAG_EXT_HDR	0x02
1887453645fSAndriy Voskoboinyk #define RTWN_FLAG_CAM_FIXED	0x04
1897453645fSAndriy Voskoboinyk /* Driver state */
1907453645fSAndriy Voskoboinyk #define RTWN_STARTED		0x08
1917453645fSAndriy Voskoboinyk #define RTWN_RUNNING		0x10
1927453645fSAndriy Voskoboinyk #define RTWN_FW_LOADED		0x20
1937453645fSAndriy Voskoboinyk #define RTWN_TEMP_MEASURED	0x40
194c15d8692SAndriy Voskoboinyk #define RTWN_RCR_LOCKED		0x80
1957453645fSAndriy Voskoboinyk 
1967453645fSAndriy Voskoboinyk #define RTWN_CHIP_HAS_BCNQ1(_sc)	\
1977453645fSAndriy Voskoboinyk 	((_sc)->bcn_status_reg[0] != (_sc)->bcn_status_reg[1])
1987453645fSAndriy Voskoboinyk 
1997453645fSAndriy Voskoboinyk 	void			*sc_priv;
2007453645fSAndriy Voskoboinyk 	const char		*name;
2017453645fSAndriy Voskoboinyk 	int			sc_ant;
2027453645fSAndriy Voskoboinyk 
20309606165SAndriy Voskoboinyk 	struct rtwn_tx_phystat	last_physt;
2047453645fSAndriy Voskoboinyk 	uint8_t			thcal_temp;
2057453645fSAndriy Voskoboinyk 	int			cur_bcnq_id;
2067453645fSAndriy Voskoboinyk 
2077453645fSAndriy Voskoboinyk 	int			nvaps;
2087453645fSAndriy Voskoboinyk 	int			ap_vaps;
2097453645fSAndriy Voskoboinyk 	int			bcn_vaps;
2107453645fSAndriy Voskoboinyk 	int			mon_vaps;
2117453645fSAndriy Voskoboinyk 
2127453645fSAndriy Voskoboinyk 	int			vaps_running;
2137453645fSAndriy Voskoboinyk 	int			monvaps_running;
2147453645fSAndriy Voskoboinyk 
2157453645fSAndriy Voskoboinyk 	uint16_t		next_rom_addr;
2164786190dSAndriy Voskoboinyk 	uint8_t			keys_bmap[howmany(RTWN_CAM_ENTRY_LIMIT, NBBY)];
2177453645fSAndriy Voskoboinyk 
2187453645fSAndriy Voskoboinyk 	struct rtwn_vap		*vaps[RTWN_PORT_COUNT];
2197453645fSAndriy Voskoboinyk 	struct ieee80211_node	*node_list[RTWN_MACID_LIMIT];
2207453645fSAndriy Voskoboinyk 	struct mtx		nt_mtx;
2217453645fSAndriy Voskoboinyk 
2227453645fSAndriy Voskoboinyk 	struct callout		sc_calib_to;
2237453645fSAndriy Voskoboinyk 	struct callout		sc_pwrmode_init;
2247453645fSAndriy Voskoboinyk #ifndef D4054
2257453645fSAndriy Voskoboinyk 	struct callout		sc_watchdog_to;
2267453645fSAndriy Voskoboinyk 	int			sc_tx_timer;
2277453645fSAndriy Voskoboinyk #endif
2287453645fSAndriy Voskoboinyk 
2297453645fSAndriy Voskoboinyk 	struct mtx		sc_mtx;
2307453645fSAndriy Voskoboinyk 
2317453645fSAndriy Voskoboinyk 	struct rtwn_cmdq	cmdq[RTWN_CMDQ_SIZE];
2327453645fSAndriy Voskoboinyk 	struct mtx		cmdq_mtx;
2337453645fSAndriy Voskoboinyk 	struct task		cmdq_task;
2347453645fSAndriy Voskoboinyk 	uint8_t			cmdq_first;
2357453645fSAndriy Voskoboinyk 	uint8_t			cmdq_last;
2367453645fSAndriy Voskoboinyk 
2377453645fSAndriy Voskoboinyk 	struct wmeParams	cap_wmeParams[WME_NUM_AC];
2387453645fSAndriy Voskoboinyk 
2397453645fSAndriy Voskoboinyk 	struct rtwn_rx_radiotap_header	sc_rxtap;
2407453645fSAndriy Voskoboinyk 	struct rtwn_tx_radiotap_header	sc_txtap;
2417453645fSAndriy Voskoboinyk 
2427453645fSAndriy Voskoboinyk 	int			ntxchains;
2437453645fSAndriy Voskoboinyk 	int			nrxchains;
2447453645fSAndriy Voskoboinyk 
2457453645fSAndriy Voskoboinyk 	int			ledlink;
2467453645fSAndriy Voskoboinyk 	uint8_t			thermal_meter;
2477453645fSAndriy Voskoboinyk 
2487453645fSAndriy Voskoboinyk 	int			sc_tx_n_active;
2497453645fSAndriy Voskoboinyk 	uint8_t			qfullmsk;
2507453645fSAndriy Voskoboinyk 
2517453645fSAndriy Voskoboinyk 	/* Firmware-specific */
2527453645fSAndriy Voskoboinyk 	const char		*fwname;
2537453645fSAndriy Voskoboinyk 	uint16_t		fwver;
2547453645fSAndriy Voskoboinyk 	uint16_t		fwsig;
2557453645fSAndriy Voskoboinyk 	int			fwcur;
2567453645fSAndriy Voskoboinyk 
2577453645fSAndriy Voskoboinyk 	void		(*sc_node_free)(struct ieee80211_node *);
2587453645fSAndriy Voskoboinyk 	void		(*sc_scan_curchan)(struct ieee80211_scan_state *,
2597453645fSAndriy Voskoboinyk 			    unsigned long);
2607453645fSAndriy Voskoboinyk 
2617453645fSAndriy Voskoboinyk 	/* Interface-specific. */
2627453645fSAndriy Voskoboinyk 	int		(*sc_write_1)(struct rtwn_softc *, uint16_t,
2637453645fSAndriy Voskoboinyk 			    uint8_t);
2647453645fSAndriy Voskoboinyk 	int		(*sc_write_2)(struct rtwn_softc *, uint16_t,
2657453645fSAndriy Voskoboinyk 			    uint16_t);
2667453645fSAndriy Voskoboinyk 	int		(*sc_write_4)(struct rtwn_softc *, uint16_t,
2677453645fSAndriy Voskoboinyk 			    uint32_t);
2687453645fSAndriy Voskoboinyk 	uint8_t		(*sc_read_1)(struct rtwn_softc *, uint16_t);
2697453645fSAndriy Voskoboinyk 	uint16_t	(*sc_read_2)(struct rtwn_softc *, uint16_t);
2707453645fSAndriy Voskoboinyk 	uint32_t	(*sc_read_4)(struct rtwn_softc *, uint16_t);
2717453645fSAndriy Voskoboinyk 	/* XXX eliminate */
2727453645fSAndriy Voskoboinyk 	void		(*sc_delay)(struct rtwn_softc *, int);
2737453645fSAndriy Voskoboinyk 	int		(*sc_tx_start)(struct rtwn_softc *,
2747453645fSAndriy Voskoboinyk 			    struct ieee80211_node *, struct mbuf *, uint8_t *,
2757453645fSAndriy Voskoboinyk 			    uint8_t, int);
2767453645fSAndriy Voskoboinyk 	void		(*sc_start_xfers)(struct rtwn_softc *);
2777453645fSAndriy Voskoboinyk 	void		(*sc_reset_lists)(struct rtwn_softc *,
2787453645fSAndriy Voskoboinyk 			    struct ieee80211vap *);
2797453645fSAndriy Voskoboinyk 	void		(*sc_abort_xfers)(struct rtwn_softc *);
2807453645fSAndriy Voskoboinyk 	int		(*sc_fw_write_block)(struct rtwn_softc *,
2817453645fSAndriy Voskoboinyk 			    const uint8_t *, uint16_t, int);
2827453645fSAndriy Voskoboinyk 	uint16_t	(*sc_get_qmap)(struct rtwn_softc *);
2837453645fSAndriy Voskoboinyk 	void		(*sc_set_desc_addr)(struct rtwn_softc *);
2847453645fSAndriy Voskoboinyk 	void		(*sc_drop_incorrect_tx)(struct rtwn_softc *);
285d067ef0fSAndriy Voskoboinyk 	void		(*sc_beacon_update_begin)(struct rtwn_softc *,
286d067ef0fSAndriy Voskoboinyk 			    struct ieee80211vap *);
287d067ef0fSAndriy Voskoboinyk 	void		(*sc_beacon_update_end)(struct rtwn_softc *,
288d067ef0fSAndriy Voskoboinyk 			    struct ieee80211vap *);
289d067ef0fSAndriy Voskoboinyk 	void		(*sc_beacon_unload)(struct rtwn_softc *, int);
290d067ef0fSAndriy Voskoboinyk 
291d067ef0fSAndriy Voskoboinyk 	/* XXX drop checks for PCIe? */
292d067ef0fSAndriy Voskoboinyk 	int		bcn_check_interval;
2937453645fSAndriy Voskoboinyk 
2947453645fSAndriy Voskoboinyk 	/* Device-specific. */
2957453645fSAndriy Voskoboinyk 	uint32_t	(*sc_rf_read)(struct rtwn_softc *, int, uint8_t);
2967453645fSAndriy Voskoboinyk 	void		(*sc_rf_write)(struct rtwn_softc *, int, uint8_t,
2977453645fSAndriy Voskoboinyk 			    uint32_t);
2987453645fSAndriy Voskoboinyk 	int		(*sc_check_condition)(struct rtwn_softc *,
2997453645fSAndriy Voskoboinyk 			    const uint8_t[]);
3007453645fSAndriy Voskoboinyk 	void		(*sc_efuse_postread)(struct rtwn_softc *);
3017453645fSAndriy Voskoboinyk 	void		(*sc_parse_rom)(struct rtwn_softc *, uint8_t *);
3027453645fSAndriy Voskoboinyk 	void		(*sc_set_led)(struct rtwn_softc *, int, int);
3037453645fSAndriy Voskoboinyk 	int		(*sc_power_on)(struct rtwn_softc *);
3047453645fSAndriy Voskoboinyk 	void		(*sc_power_off)(struct rtwn_softc *);
3057453645fSAndriy Voskoboinyk #ifndef RTWN_WITHOUT_UCODE
3067453645fSAndriy Voskoboinyk 	void		(*sc_fw_reset)(struct rtwn_softc *, int);
3077453645fSAndriy Voskoboinyk 	void		(*sc_fw_download_enable)(struct rtwn_softc *, int);
3087453645fSAndriy Voskoboinyk #endif
30960b9567dSKevin Lo 	int		(*sc_llt_init)(struct rtwn_softc *);
3107453645fSAndriy Voskoboinyk 	int		(*sc_set_page_size)(struct rtwn_softc *);
3117453645fSAndriy Voskoboinyk 	void		(*sc_lc_calib)(struct rtwn_softc *);
3127453645fSAndriy Voskoboinyk 	void		(*sc_iq_calib)(struct rtwn_softc *);
3137453645fSAndriy Voskoboinyk 	void		(*sc_read_chipid_vendor)(struct rtwn_softc *,
3147453645fSAndriy Voskoboinyk 			    uint32_t);
3157453645fSAndriy Voskoboinyk 	void		(*sc_adj_devcaps)(struct rtwn_softc *);
3167453645fSAndriy Voskoboinyk 	void		(*sc_vap_preattach)(struct rtwn_softc *,
3177453645fSAndriy Voskoboinyk 			    struct ieee80211vap *);
3187453645fSAndriy Voskoboinyk 	void		(*sc_postattach)(struct rtwn_softc *);
3197453645fSAndriy Voskoboinyk 	void		(*sc_detach_private)(struct rtwn_softc *);
3207453645fSAndriy Voskoboinyk 	void		(*sc_fill_tx_desc)(struct rtwn_softc *,
3217453645fSAndriy Voskoboinyk 			    struct ieee80211_node *, struct mbuf *,
32264ecfc27SAdrian Chadd 			    void *, uint8_t, bool, int);
3237453645fSAndriy Voskoboinyk 	void		(*sc_fill_tx_desc_raw)(struct rtwn_softc *,
3247453645fSAndriy Voskoboinyk 			    struct ieee80211_node *, struct mbuf *,
3257453645fSAndriy Voskoboinyk 			    void *, const struct ieee80211_bpf_params *);
3267453645fSAndriy Voskoboinyk 	void		(*sc_fill_tx_desc_null)(struct rtwn_softc *,
3277453645fSAndriy Voskoboinyk 			    void *, int, int, int);
3287453645fSAndriy Voskoboinyk 	void		(*sc_dump_tx_desc)(struct rtwn_softc *, const void *);
3297453645fSAndriy Voskoboinyk 	uint8_t		(*sc_tx_radiotap_flags)(const void *);
3307453645fSAndriy Voskoboinyk 	uint8_t		(*sc_rx_radiotap_flags)(const void *);
3317453645fSAndriy Voskoboinyk 	void		(*sc_beacon_init)(struct rtwn_softc *, void *, int);
3327453645fSAndriy Voskoboinyk 	void		(*sc_beacon_enable)(struct rtwn_softc *, int, int);
3339efd2154SAdrian Chadd 	void		(*sc_sta_beacon_enable)(struct rtwn_softc *, int,
3349efd2154SAdrian Chadd 			    bool);
3357453645fSAndriy Voskoboinyk 	void		(*sc_beacon_set_rate)(void *, int);
3367453645fSAndriy Voskoboinyk 	void		(*sc_beacon_select)(struct rtwn_softc *, int);
3377453645fSAndriy Voskoboinyk 	void		(*sc_set_chan)(struct rtwn_softc *,
3387453645fSAndriy Voskoboinyk 			    struct ieee80211_channel *);
3397453645fSAndriy Voskoboinyk 	void		(*sc_set_media_status)(struct rtwn_softc *, int);
3407453645fSAndriy Voskoboinyk #ifndef RTWN_WITHOUT_UCODE
3417453645fSAndriy Voskoboinyk 	int		(*sc_set_rsvd_page)(struct rtwn_softc *, int, int,
3427453645fSAndriy Voskoboinyk 			    int);
3437453645fSAndriy Voskoboinyk 	int		(*sc_set_pwrmode)(struct rtwn_softc *,
3447453645fSAndriy Voskoboinyk 			    struct ieee80211vap *, int);
3457453645fSAndriy Voskoboinyk 	void		(*sc_set_rssi)(struct rtwn_softc *);
3467453645fSAndriy Voskoboinyk #endif
34709606165SAndriy Voskoboinyk 	void		(*sc_get_rx_stats)(struct rtwn_softc *,
34809606165SAndriy Voskoboinyk 			    struct ieee80211_rx_stats *, const void *,
34909606165SAndriy Voskoboinyk 			    const void *);
3507453645fSAndriy Voskoboinyk 	int8_t		(*sc_get_rssi_cck)(struct rtwn_softc *, void *);
3517453645fSAndriy Voskoboinyk 	int8_t		(*sc_get_rssi_ofdm)(struct rtwn_softc *, void *);
3527453645fSAndriy Voskoboinyk 	int		(*sc_classify_intr)(struct rtwn_softc *, void *, int);
3537453645fSAndriy Voskoboinyk 	void		(*sc_handle_tx_report)(struct rtwn_softc *, uint8_t *,
3547453645fSAndriy Voskoboinyk 			    int);
355b59017c5SAdrian Chadd 	void		(*sc_handle_tx_report2)(struct rtwn_softc *, uint8_t *,
356b59017c5SAdrian Chadd 			    int);
3577453645fSAndriy Voskoboinyk 	void		(*sc_handle_c2h_report)(struct rtwn_softc *,
3587453645fSAndriy Voskoboinyk 			    uint8_t *, int);
3597453645fSAndriy Voskoboinyk 	int		(*sc_check_frame)(struct rtwn_softc *, struct mbuf *);
3607453645fSAndriy Voskoboinyk 	void		(*sc_temp_measure)(struct rtwn_softc *);
3617453645fSAndriy Voskoboinyk 	uint8_t		(*sc_temp_read)(struct rtwn_softc *);
3627453645fSAndriy Voskoboinyk 	void		(*sc_init_tx_agg)(struct rtwn_softc *);
3637453645fSAndriy Voskoboinyk 	void		(*sc_init_rx_agg)(struct rtwn_softc *);
3647453645fSAndriy Voskoboinyk 	void		(*sc_init_intr)(struct rtwn_softc *);
3657453645fSAndriy Voskoboinyk 	void		(*sc_init_ampdu)(struct rtwn_softc *);
3667453645fSAndriy Voskoboinyk 	void		(*sc_init_edca)(struct rtwn_softc *);
3677453645fSAndriy Voskoboinyk 	void		(*sc_init_bb)(struct rtwn_softc *);
3687453645fSAndriy Voskoboinyk 	void		(*sc_init_rf)(struct rtwn_softc *);
3697453645fSAndriy Voskoboinyk 	void		(*sc_init_antsel)(struct rtwn_softc *);
3707453645fSAndriy Voskoboinyk 	void		(*sc_post_init)(struct rtwn_softc *);
3717453645fSAndriy Voskoboinyk 	int		(*sc_init_bcnq1_boundary)(struct rtwn_softc *);
372b71805e9SAdrian Chadd 	int		(*sc_set_tx_power)(struct rtwn_softc *,
373b71805e9SAdrian Chadd 			    struct ieee80211vap *);
3747453645fSAndriy Voskoboinyk 
3757453645fSAndriy Voskoboinyk 	const uint8_t			*chan_list_5ghz[3];
3767453645fSAndriy Voskoboinyk 	int				chan_num_5ghz[3];
3777453645fSAndriy Voskoboinyk 
3787453645fSAndriy Voskoboinyk 	const struct rtwn_mac_prog	*mac_prog;
3797453645fSAndriy Voskoboinyk 	int				mac_size;
3807453645fSAndriy Voskoboinyk 	const struct rtwn_bb_prog	*bb_prog;
3817453645fSAndriy Voskoboinyk 	int				bb_size;
3827453645fSAndriy Voskoboinyk 	const struct rtwn_agc_prog	*agc_prog;
3837453645fSAndriy Voskoboinyk 	int				agc_size;
3847453645fSAndriy Voskoboinyk 	const struct rtwn_rf_prog	*rf_prog;
3857453645fSAndriy Voskoboinyk 
3867453645fSAndriy Voskoboinyk 	int				page_count;
3877453645fSAndriy Voskoboinyk 	int				pktbuf_count;
3887453645fSAndriy Voskoboinyk 
3897453645fSAndriy Voskoboinyk 	int				ackto;
3907453645fSAndriy Voskoboinyk 
3917453645fSAndriy Voskoboinyk 	int				npubqpages;
3927453645fSAndriy Voskoboinyk 	int				nhqpages;
3937453645fSAndriy Voskoboinyk 	int				nnqpages;
3947453645fSAndriy Voskoboinyk 	int				nlqpages;
3957453645fSAndriy Voskoboinyk 	int				page_size;
3967453645fSAndriy Voskoboinyk 
3977453645fSAndriy Voskoboinyk 	int				txdesc_len;
3987453645fSAndriy Voskoboinyk 	int				efuse_maxlen;
3997453645fSAndriy Voskoboinyk 	int				efuse_maplen;
4007453645fSAndriy Voskoboinyk 
4017453645fSAndriy Voskoboinyk 	uint16_t			rx_dma_size;
4027453645fSAndriy Voskoboinyk 
4037453645fSAndriy Voskoboinyk 	int				macid_limit;
404af2e102cSAdrian Chadd 	int				macid_rpt2_max_num;
4057453645fSAndriy Voskoboinyk 	int				cam_entry_limit;
4067453645fSAndriy Voskoboinyk 	int				fwsize_limit;
4077453645fSAndriy Voskoboinyk 	int				temp_delta;
4087453645fSAndriy Voskoboinyk 
4097453645fSAndriy Voskoboinyk 	uint16_t			bcn_status_reg[RTWN_PORT_COUNT];
4107453645fSAndriy Voskoboinyk 	uint32_t			rcr;	/* Rx filter */
4117453645fSAndriy Voskoboinyk };
4127453645fSAndriy Voskoboinyk MALLOC_DECLARE(M_RTWN_PRIV);
4137453645fSAndriy Voskoboinyk 
4147453645fSAndriy Voskoboinyk #define	RTWN_LOCK(sc)			mtx_lock(&(sc)->sc_mtx)
4157453645fSAndriy Voskoboinyk #define	RTWN_UNLOCK(sc)		mtx_unlock(&(sc)->sc_mtx)
4167453645fSAndriy Voskoboinyk #define	RTWN_ASSERT_LOCKED(sc)		mtx_assert(&(sc)->sc_mtx, MA_OWNED)
4177453645fSAndriy Voskoboinyk 
4187453645fSAndriy Voskoboinyk #define RTWN_CMDQ_LOCK_INIT(sc) \
4197453645fSAndriy Voskoboinyk 	mtx_init(&(sc)->cmdq_mtx, "cmdq lock", NULL, MTX_DEF)
4207453645fSAndriy Voskoboinyk #define RTWN_CMDQ_LOCK(sc)		mtx_lock(&(sc)->cmdq_mtx)
4217453645fSAndriy Voskoboinyk #define RTWN_CMDQ_UNLOCK(sc)		mtx_unlock(&(sc)->cmdq_mtx)
4227453645fSAndriy Voskoboinyk #define RTWN_CMDQ_LOCK_INITIALIZED(sc)	mtx_initialized(&(sc)->cmdq_mtx)
4237453645fSAndriy Voskoboinyk #define RTWN_CMDQ_LOCK_DESTROY(sc)	mtx_destroy(&(sc)->cmdq_mtx)
4247453645fSAndriy Voskoboinyk 
4257453645fSAndriy Voskoboinyk #define RTWN_NT_LOCK_INIT(sc) \
4267453645fSAndriy Voskoboinyk 	mtx_init(&(sc)->nt_mtx, "node table lock", NULL, MTX_DEF)
4277453645fSAndriy Voskoboinyk #define RTWN_NT_LOCK(sc)		mtx_lock(&(sc)->nt_mtx)
4287453645fSAndriy Voskoboinyk #define RTWN_NT_UNLOCK(sc)		mtx_unlock(&(sc)->nt_mtx)
4297453645fSAndriy Voskoboinyk #define RTWN_NT_LOCK_INITIALIZED(sc)	mtx_initialized(&(sc)->nt_mtx)
4307453645fSAndriy Voskoboinyk #define RTWN_NT_LOCK_DESTROY(sc)	mtx_destroy(&(sc)->nt_mtx)
4317453645fSAndriy Voskoboinyk 
4327453645fSAndriy Voskoboinyk void	rtwn_sysctlattach(struct rtwn_softc *);
4337453645fSAndriy Voskoboinyk 
4347453645fSAndriy Voskoboinyk int	rtwn_attach(struct rtwn_softc *);
4357453645fSAndriy Voskoboinyk void	rtwn_detach(struct rtwn_softc *);
4367453645fSAndriy Voskoboinyk void	rtwn_resume(struct rtwn_softc *);
4377453645fSAndriy Voskoboinyk void	rtwn_suspend(struct rtwn_softc *);
4387453645fSAndriy Voskoboinyk 
439*ec07af2aSAdrian Chadd void	rtwn_attach_vht_cap_info_mcs(struct rtwn_softc *);
440*ec07af2aSAdrian Chadd 
4417453645fSAndriy Voskoboinyk /* Interface-specific. */
4427453645fSAndriy Voskoboinyk #define rtwn_write_1(_sc, _addr, _val) \
4437453645fSAndriy Voskoboinyk 	(((_sc)->sc_write_1)((_sc), (_addr), (_val)))
4447453645fSAndriy Voskoboinyk #define rtwn_write_2(_sc, _addr, _val) \
4457453645fSAndriy Voskoboinyk 	(((_sc)->sc_write_2)((_sc), (_addr), (_val)))
4467453645fSAndriy Voskoboinyk #define rtwn_write_4(_sc, _addr, _val) \
4477453645fSAndriy Voskoboinyk 	(((_sc)->sc_write_4)((_sc), (_addr), (_val)))
4487453645fSAndriy Voskoboinyk #define rtwn_read_1(_sc, _addr) \
4497453645fSAndriy Voskoboinyk 	(((_sc)->sc_read_1)((_sc), (_addr)))
4507453645fSAndriy Voskoboinyk #define rtwn_read_2(_sc, _addr) \
4517453645fSAndriy Voskoboinyk 	(((_sc)->sc_read_2)((_sc), (_addr)))
4527453645fSAndriy Voskoboinyk #define rtwn_read_4(_sc, _addr) \
4537453645fSAndriy Voskoboinyk 	(((_sc)->sc_read_4)((_sc), (_addr)))
4547453645fSAndriy Voskoboinyk #define rtwn_delay(_sc, _usec) \
4557453645fSAndriy Voskoboinyk 	(((_sc)->sc_delay)((_sc), (_usec)))
4567453645fSAndriy Voskoboinyk #define rtwn_tx_start(_sc, _ni, _m, _desc, _type, _id) \
4577453645fSAndriy Voskoboinyk 	(((_sc)->sc_tx_start)((_sc), (_ni), (_m), (_desc), (_type), (_id)))
4587453645fSAndriy Voskoboinyk #define rtwn_start_xfers(_sc) \
4597453645fSAndriy Voskoboinyk 	(((_sc)->sc_start_xfers)((_sc)))
4607453645fSAndriy Voskoboinyk #define rtwn_reset_lists(_sc, _vap) \
4617453645fSAndriy Voskoboinyk 	(((_sc)->sc_reset_lists)((_sc), (_vap)))
4627453645fSAndriy Voskoboinyk #define rtwn_abort_xfers(_sc) \
4637453645fSAndriy Voskoboinyk 	(((_sc)->sc_abort_xfers)((_sc)))
4647453645fSAndriy Voskoboinyk #define rtwn_fw_write_block(_sc, _buf, _reg, _len) \
4657453645fSAndriy Voskoboinyk 	(((_sc)->sc_fw_write_block)((_sc), (_buf), (_reg), (_len)))
4667453645fSAndriy Voskoboinyk #define rtwn_get_qmap(_sc) \
4677453645fSAndriy Voskoboinyk 	(((_sc)->sc_get_qmap)((_sc)))
4687453645fSAndriy Voskoboinyk #define rtwn_set_desc_addr(_sc) \
4697453645fSAndriy Voskoboinyk 	(((_sc)->sc_set_desc_addr)((_sc)))
4707453645fSAndriy Voskoboinyk #define rtwn_drop_incorrect_tx(_sc) \
4717453645fSAndriy Voskoboinyk 	(((_sc)->sc_drop_incorrect_tx)((_sc)))
472d067ef0fSAndriy Voskoboinyk #define rtwn_beacon_update_begin(_sc, _vap) \
473d067ef0fSAndriy Voskoboinyk 	(((_sc)->sc_beacon_update_begin)((_sc), (_vap)))
474d067ef0fSAndriy Voskoboinyk #define rtwn_beacon_update_end(_sc, _vap) \
475d067ef0fSAndriy Voskoboinyk 	(((_sc)->sc_beacon_update_end)((_sc), (_vap)))
476d067ef0fSAndriy Voskoboinyk #define rtwn_beacon_unload(_sc, _id) \
477d067ef0fSAndriy Voskoboinyk 	(((_sc)->sc_beacon_unload)((_sc), (_id)))
4787453645fSAndriy Voskoboinyk 
4797453645fSAndriy Voskoboinyk /* Aliases. */
4807453645fSAndriy Voskoboinyk #define	rtwn_bb_write		rtwn_write_4
4817453645fSAndriy Voskoboinyk #define	rtwn_bb_read		rtwn_read_4
4827453645fSAndriy Voskoboinyk #define	rtwn_bb_setbits		rtwn_setbits_4
4837453645fSAndriy Voskoboinyk 
4847453645fSAndriy Voskoboinyk /* Device-specific. */
4857453645fSAndriy Voskoboinyk #define rtwn_rf_read(_sc, _chain, _addr) \
4867453645fSAndriy Voskoboinyk 	(((_sc)->sc_rf_read)((_sc), (_chain), (_addr)))
4877453645fSAndriy Voskoboinyk #define rtwn_rf_write(_sc, _chain, _addr, _val) \
4887453645fSAndriy Voskoboinyk 	(((_sc)->sc_rf_write)((_sc), (_chain), (_addr), (_val)))
4897453645fSAndriy Voskoboinyk #define rtwn_check_condition(_sc, _cond) \
4907453645fSAndriy Voskoboinyk 	(((_sc)->sc_check_condition)((_sc), (_cond)))
4917453645fSAndriy Voskoboinyk #define rtwn_efuse_postread(_sc) \
4927453645fSAndriy Voskoboinyk 	(((_sc)->sc_efuse_postread)((_sc)))
4937453645fSAndriy Voskoboinyk #define rtwn_parse_rom(_sc, _rom) \
4947453645fSAndriy Voskoboinyk 	(((_sc)->sc_parse_rom)((_sc), (_rom)))
4957453645fSAndriy Voskoboinyk #define rtwn_set_led(_sc, _led, _on) \
4967453645fSAndriy Voskoboinyk 	(((_sc)->sc_set_led)((_sc), (_led), (_on)))
49709606165SAndriy Voskoboinyk #define rtwn_get_rx_stats(_sc, _rxs, _desc, _physt) \
49809606165SAndriy Voskoboinyk 	(((_sc)->sc_get_rx_stats((_sc), (_rxs), (_desc), (_physt))))
4997453645fSAndriy Voskoboinyk #define rtwn_get_rssi_cck(_sc, _physt) \
5007453645fSAndriy Voskoboinyk 	(((_sc)->sc_get_rssi_cck)((_sc), (_physt)))
5017453645fSAndriy Voskoboinyk #define rtwn_get_rssi_ofdm(_sc, _physt) \
5027453645fSAndriy Voskoboinyk 	(((_sc)->sc_get_rssi_ofdm)((_sc), (_physt)))
5037453645fSAndriy Voskoboinyk #define rtwn_power_on(_sc) \
5047453645fSAndriy Voskoboinyk 	(((_sc)->sc_power_on)((_sc)))
5057453645fSAndriy Voskoboinyk #define rtwn_power_off(_sc) \
5067453645fSAndriy Voskoboinyk 	(((_sc)->sc_power_off)((_sc)))
5077453645fSAndriy Voskoboinyk #ifndef RTWN_WITHOUT_UCODE
5087453645fSAndriy Voskoboinyk #define rtwn_fw_reset(_sc, _reason) \
5097453645fSAndriy Voskoboinyk 	(((_sc)->sc_fw_reset)((_sc), (_reason)))
5107453645fSAndriy Voskoboinyk #define rtwn_fw_download_enable(_sc, _enable) \
5117453645fSAndriy Voskoboinyk 	(((_sc)->sc_fw_download_enable)((_sc), (_enable)))
5127453645fSAndriy Voskoboinyk #endif
51360b9567dSKevin Lo #define rtwn_llt_init(_sc) \
51460b9567dSKevin Lo 	(((_sc)->sc_llt_init)((_sc)))
5157453645fSAndriy Voskoboinyk #define rtwn_set_page_size(_sc) \
5167453645fSAndriy Voskoboinyk 	(((_sc)->sc_set_page_size)((_sc)))
5177453645fSAndriy Voskoboinyk #define rtwn_lc_calib(_sc) \
5187453645fSAndriy Voskoboinyk 	(((_sc)->sc_lc_calib)((_sc)))
5197453645fSAndriy Voskoboinyk #define rtwn_iq_calib(_sc) \
5207453645fSAndriy Voskoboinyk 	(((_sc)->sc_iq_calib)((_sc)))
5217453645fSAndriy Voskoboinyk #define rtwn_read_chipid_vendor(_sc, _reg) \
5227453645fSAndriy Voskoboinyk 	(((_sc)->sc_read_chipid_vendor)((_sc), (_reg)))
5237453645fSAndriy Voskoboinyk #define rtwn_adj_devcaps(_sc) \
5247453645fSAndriy Voskoboinyk 	(((_sc)->sc_adj_devcaps)((_sc)))
5257453645fSAndriy Voskoboinyk #define rtwn_vap_preattach(_sc, _vap) \
5267453645fSAndriy Voskoboinyk 	(((_sc)->sc_vap_preattach)((_sc), (_vap)))
5277453645fSAndriy Voskoboinyk #define rtwn_postattach(_sc) \
5287453645fSAndriy Voskoboinyk 	(((_sc)->sc_postattach)((_sc)))
5297453645fSAndriy Voskoboinyk #define rtwn_detach_private(_sc) \
5307453645fSAndriy Voskoboinyk 	(((_sc)->sc_detach_private)((_sc)))
5317453645fSAndriy Voskoboinyk #define rtwn_fill_tx_desc(_sc, _ni, _m, \
53264ecfc27SAdrian Chadd 	    _buf, _ridx, _force, _maxretry) \
5337453645fSAndriy Voskoboinyk 	(((_sc)->sc_fill_tx_desc)((_sc), (_ni), \
53464ecfc27SAdrian Chadd 	    (_m), (_buf), (_ridx), (_force), (_maxretry)))
5357453645fSAndriy Voskoboinyk #define rtwn_fill_tx_desc_raw(_sc, _ni, _m, \
5367453645fSAndriy Voskoboinyk 	    _buf, _params) \
5377453645fSAndriy Voskoboinyk 	(((_sc)->sc_fill_tx_desc_raw)((_sc), (_ni), \
5387453645fSAndriy Voskoboinyk 	    (_m), (_buf), (_params)))
5397453645fSAndriy Voskoboinyk #define rtwn_fill_tx_desc_null(_sc, _buf, _11b, _qos, _id) \
5407453645fSAndriy Voskoboinyk 	(((_sc)->sc_fill_tx_desc_null)((_sc), \
5417453645fSAndriy Voskoboinyk 	    (_buf), (_11b), (_qos), (_id)))
5427453645fSAndriy Voskoboinyk #define rtwn_dump_tx_desc(_sc, _desc) \
5437453645fSAndriy Voskoboinyk 	(((_sc)->sc_dump_tx_desc)((_sc), (_desc)))
5447453645fSAndriy Voskoboinyk #define rtwn_tx_radiotap_flags(_sc, _buf) \
5457453645fSAndriy Voskoboinyk 	(((_sc)->sc_tx_radiotap_flags)((_buf)))
5467453645fSAndriy Voskoboinyk #define rtwn_rx_radiotap_flags(_sc, _buf) \
5477453645fSAndriy Voskoboinyk 	(((_sc)->sc_rx_radiotap_flags)((_buf)))
5487453645fSAndriy Voskoboinyk #define rtwn_set_chan(_sc, _c) \
5497453645fSAndriy Voskoboinyk 	(((_sc)->sc_set_chan)((_sc), (_c)))
5507453645fSAndriy Voskoboinyk #ifndef RTWN_WITHOUT_UCODE
5517453645fSAndriy Voskoboinyk #define rtwn_set_rsvd_page(_sc, _resp, _null, _qos_null) \
5527453645fSAndriy Voskoboinyk 	(((_sc)->sc_set_rsvd_page)((_sc), \
5537453645fSAndriy Voskoboinyk 	    (_resp), (_null), (_qos_null)))
5547453645fSAndriy Voskoboinyk #define rtwn_set_pwrmode(_sc, _vap, _off) \
5557453645fSAndriy Voskoboinyk 	(((_sc)->sc_set_pwrmode)((_sc), (_vap), (_off)))
5567453645fSAndriy Voskoboinyk #define rtwn_set_rssi(_sc) \
5577453645fSAndriy Voskoboinyk 	(((_sc)->sc_set_rssi)((_sc)))
5587453645fSAndriy Voskoboinyk #endif
5597453645fSAndriy Voskoboinyk #define rtwn_classify_intr(_sc, _buf, _len) \
5607453645fSAndriy Voskoboinyk 	(((_sc)->sc_classify_intr)((_sc), (_buf), (_len)))
5617453645fSAndriy Voskoboinyk #define rtwn_handle_tx_report(_sc, _buf, _len) \
5627453645fSAndriy Voskoboinyk 	(((_sc)->sc_handle_tx_report)((_sc), (_buf), (_len)))
563b59017c5SAdrian Chadd #define rtwn_handle_tx_report2(_sc, _buf, _len) \
564b59017c5SAdrian Chadd 	(((_sc)->sc_handle_tx_report2)((_sc), (_buf), (_len)))
5657453645fSAndriy Voskoboinyk #define rtwn_handle_c2h_report(_sc, _buf, _len) \
5667453645fSAndriy Voskoboinyk 	(((_sc)->sc_handle_c2h_report)((_sc), (_buf), (_len)))
5677453645fSAndriy Voskoboinyk #define rtwn_check_frame(_sc, _m) \
5687453645fSAndriy Voskoboinyk 	(((_sc)->sc_check_frame)((_sc), (_m)))
5697453645fSAndriy Voskoboinyk #define rtwn_beacon_init(_sc, _buf, _id) \
5707453645fSAndriy Voskoboinyk 	(((_sc)->sc_beacon_init)((_sc), (_buf), (_id)))
5717453645fSAndriy Voskoboinyk #define rtwn_beacon_enable(_sc, _id, _enable) \
5727453645fSAndriy Voskoboinyk 	(((_sc)->sc_beacon_enable)((_sc), (_id), (_enable)))
5739efd2154SAdrian Chadd #define rtwn_sta_beacon_enable(_sc, _id, _enable) \
5749efd2154SAdrian Chadd 	(((_sc)->sc_sta_beacon_enable)((_sc), (_id), (_enable)))
5757453645fSAndriy Voskoboinyk #define rtwn_beacon_set_rate(_sc, _buf, _is5ghz) \
5767453645fSAndriy Voskoboinyk 	(((_sc)->sc_beacon_set_rate)((_buf), (_is5ghz)))
5777453645fSAndriy Voskoboinyk #define rtwn_beacon_select(_sc, _id) \
5787453645fSAndriy Voskoboinyk 	(((_sc)->sc_beacon_select)((_sc), (_id)))
5797453645fSAndriy Voskoboinyk #define rtwn_temp_measure(_sc) \
5807453645fSAndriy Voskoboinyk 	(((_sc)->sc_temp_measure)((_sc)))
5817453645fSAndriy Voskoboinyk #define rtwn_temp_read(_sc) \
5827453645fSAndriy Voskoboinyk 	(((_sc)->sc_temp_read)((_sc)))
5837453645fSAndriy Voskoboinyk #define rtwn_init_tx_agg(_sc) \
5847453645fSAndriy Voskoboinyk 	(((_sc)->sc_init_tx_agg)((_sc)))
5857453645fSAndriy Voskoboinyk #define rtwn_init_rx_agg(_sc) \
5867453645fSAndriy Voskoboinyk 	(((_sc)->sc_init_rx_agg)((_sc)))
5877453645fSAndriy Voskoboinyk #define rtwn_init_intr(_sc) \
5887453645fSAndriy Voskoboinyk 	(((_sc)->sc_init_intr)((_sc)))
5897453645fSAndriy Voskoboinyk #define rtwn_init_ampdu(_sc) \
5907453645fSAndriy Voskoboinyk 	(((_sc)->sc_init_ampdu)((_sc)))
5917453645fSAndriy Voskoboinyk #define rtwn_init_edca(_sc) \
5927453645fSAndriy Voskoboinyk 	(((_sc)->sc_init_edca)((_sc)))
5937453645fSAndriy Voskoboinyk #define rtwn_init_bb(_sc) \
5947453645fSAndriy Voskoboinyk 	(((_sc)->sc_init_bb)((_sc)))
5957453645fSAndriy Voskoboinyk #define rtwn_init_rf(_sc) \
5967453645fSAndriy Voskoboinyk 	(((_sc)->sc_init_rf)((_sc)))
5977453645fSAndriy Voskoboinyk #define rtwn_init_antsel(_sc) \
5987453645fSAndriy Voskoboinyk 	(((_sc)->sc_init_antsel)((_sc)))
5997453645fSAndriy Voskoboinyk #define rtwn_post_init(_sc) \
6007453645fSAndriy Voskoboinyk 	(((_sc)->sc_post_init)((_sc)))
6017453645fSAndriy Voskoboinyk #define rtwn_init_bcnq1_boundary(_sc) \
6027453645fSAndriy Voskoboinyk 	(((_sc)->sc_init_bcnq1_boundary)((_sc)))
603b71805e9SAdrian Chadd #define rtwn_set_tx_power(_sc, _vap) \
604b71805e9SAdrian Chadd 	(((_sc)->sc_set_tx_power)((_sc), (_vap)))
6057453645fSAndriy Voskoboinyk 
6067453645fSAndriy Voskoboinyk /*
6077453645fSAndriy Voskoboinyk  * Methods to access subfields in registers.
6087453645fSAndriy Voskoboinyk  */
6097453645fSAndriy Voskoboinyk static __inline int
6107453645fSAndriy Voskoboinyk rtwn_setbits_1(struct rtwn_softc *sc, uint16_t addr, uint8_t clr,
6117453645fSAndriy Voskoboinyk     uint8_t set)
6127453645fSAndriy Voskoboinyk {
6137453645fSAndriy Voskoboinyk 	return (rtwn_write_1(sc, addr,
6147453645fSAndriy Voskoboinyk 	    (rtwn_read_1(sc, addr) & ~clr) | set));
6157453645fSAndriy Voskoboinyk }
6167453645fSAndriy Voskoboinyk 
6177453645fSAndriy Voskoboinyk static __inline int
6187453645fSAndriy Voskoboinyk rtwn_setbits_1_shift(struct rtwn_softc *sc, uint16_t addr, uint32_t clr,
6197453645fSAndriy Voskoboinyk     uint32_t set, int shift)
6207453645fSAndriy Voskoboinyk {
6217453645fSAndriy Voskoboinyk 	return (rtwn_setbits_1(sc, addr + shift, clr >> shift * NBBY,
6227453645fSAndriy Voskoboinyk 	    set >> shift * NBBY));
6237453645fSAndriy Voskoboinyk }
6247453645fSAndriy Voskoboinyk 
6257453645fSAndriy Voskoboinyk static __inline int
6267453645fSAndriy Voskoboinyk rtwn_setbits_2(struct rtwn_softc *sc, uint16_t addr, uint16_t clr,
6277453645fSAndriy Voskoboinyk     uint16_t set)
6287453645fSAndriy Voskoboinyk {
6297453645fSAndriy Voskoboinyk 	return (rtwn_write_2(sc, addr,
6307453645fSAndriy Voskoboinyk 	    (rtwn_read_2(sc, addr) & ~clr) | set));
6317453645fSAndriy Voskoboinyk }
6327453645fSAndriy Voskoboinyk 
6337453645fSAndriy Voskoboinyk static __inline int
6347453645fSAndriy Voskoboinyk rtwn_setbits_4(struct rtwn_softc *sc, uint16_t addr, uint32_t clr,
6357453645fSAndriy Voskoboinyk     uint32_t set)
6367453645fSAndriy Voskoboinyk {
6377453645fSAndriy Voskoboinyk 	return (rtwn_write_4(sc, addr,
6387453645fSAndriy Voskoboinyk 	    (rtwn_read_4(sc, addr) & ~clr) | set));
6397453645fSAndriy Voskoboinyk }
6407453645fSAndriy Voskoboinyk 
6417453645fSAndriy Voskoboinyk static __inline void
6427453645fSAndriy Voskoboinyk rtwn_rf_setbits(struct rtwn_softc *sc, int chain, uint8_t addr,
6437453645fSAndriy Voskoboinyk     uint32_t clr, uint32_t set)
6447453645fSAndriy Voskoboinyk {
6457453645fSAndriy Voskoboinyk 	rtwn_rf_write(sc, chain, addr,
6467453645fSAndriy Voskoboinyk 	    (rtwn_rf_read(sc, chain, addr) & ~clr) | set);
6477453645fSAndriy Voskoboinyk }
6487453645fSAndriy Voskoboinyk 
6497453645fSAndriy Voskoboinyk #endif	/* IF_RTWNVAR_H */
650