1/*-
2 * Copyright (c) 2010 Damien Bergamini <damien.bergamini@free.fr>
3 * Copyright (c) 2015-2016 Andriy Voskoboinyk <avos@FreeBSD.org>
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 *
17 * $OpenBSD: if_urtwnreg.h,v 1.3 2010/11/16 18:02:59 damien Exp $
18 * $FreeBSD$
19 */
20
21#ifndef IF_RTWNVAR_H
22#define IF_RTWNVAR_H
23
24#include "opt_rtwn.h"
25
26#define RTWN_TX_DESC_SIZE	64
27
28#define RTWN_BCN_MAX_SIZE	512
29#define RTWN_CAM_ENTRY_LIMIT	64
30
31#define RTWN_MACID_BC		1	/* Broadcast. */
32#define RTWN_MACID_UNDEFINED	0x7fff
33#define RTWN_MACID_VALID 	0x8000
34#define RTWN_MACID_LIMIT	128
35
36#define RTWN_TX_TIMEOUT		5000	/* ms */
37#define RTWN_MAX_EPOUT		4
38#define RTWN_PORT_COUNT		2
39
40#define RTWN_LED_LINK		0
41#define RTWN_LED_DATA		1
42
43struct rtwn_rx_radiotap_header {
44	struct ieee80211_radiotap_header wr_ihdr;
45	uint64_t	wr_tsft;
46	uint8_t		wr_flags;
47	uint8_t		wr_rate;
48	uint16_t	wr_chan_freq;
49	uint16_t	wr_chan_flags;
50	int8_t		wr_dbm_antsignal;
51	int8_t		wr_dbm_antnoise;
52} __packed __aligned(8);
53
54#define RTWN_RX_RADIOTAP_PRESENT			\
55	(1 << IEEE80211_RADIOTAP_TSFT |			\
56	 1 << IEEE80211_RADIOTAP_FLAGS |		\
57	 1 << IEEE80211_RADIOTAP_RATE |			\
58	 1 << IEEE80211_RADIOTAP_CHANNEL |		\
59	 1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL |	\
60	 1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)
61
62struct rtwn_tx_radiotap_header {
63	struct ieee80211_radiotap_header wt_ihdr;
64	uint8_t		wt_flags;
65	uint8_t		wt_pad;
66	uint16_t	wt_chan_freq;
67	uint16_t	wt_chan_flags;
68} __packed;
69
70#define RTWN_TX_RADIOTAP_PRESENT			\
71	(1 << IEEE80211_RADIOTAP_FLAGS |		\
72	 1 << IEEE80211_RADIOTAP_CHANNEL)
73
74struct rtwn_tx_buf {
75	uint8_t		txd[RTWN_TX_DESC_SIZE];
76} __attribute__((aligned(4)));
77
78#define RTWN_PHY_STATUS_SIZE	32
79struct rtwn_tx_phystat {
80	uint32_t	phydw[RTWN_PHY_STATUS_SIZE / sizeof(uint32_t)];
81};
82
83struct rtwn_softc;
84
85union sec_param {
86	struct ieee80211_key	key;
87	int			macid;
88};
89
90#define CMD_FUNC_PROTO		void (*func)(struct rtwn_softc *, \
91				    union sec_param *)
92
93struct rtwn_cmdq {
94	union sec_param		data;
95	CMD_FUNC_PROTO;
96};
97#define RTWN_CMDQ_SIZE		16
98
99struct rtwn_node {
100	struct ieee80211_node	ni;	/* must be the first */
101	int			id;
102
103	struct rtwn_tx_phystat	last_physt;
104	int			avg_pwdb;
105};
106#define RTWN_NODE(ni)		((struct rtwn_node *)(ni))
107
108struct rtwn_vap {
109	struct ieee80211vap	vap;
110	int			id;
111#define RTWN_VAP_ID_INVALID	-1
112	int			curr_mode;
113
114	struct rtwn_tx_buf	bcn_desc;
115	struct mbuf		*bcn_mbuf;
116	struct timeout_task	tx_beacon_csa;
117
118	struct callout		tsf_sync_adhoc;
119	struct task		tsf_sync_adhoc_task;
120
121	const struct ieee80211_key	*keys[IEEE80211_WEP_NKID];
122
123	int			(*newstate)(struct ieee80211vap *,
124				    enum ieee80211_state, int);
125	void			(*recv_mgmt)(struct ieee80211_node *,
126				    struct mbuf *, int,
127				    const struct ieee80211_rx_stats *,
128				    int, int);
129};
130#define	RTWN_VAP(vap)		((struct rtwn_vap *)(vap))
131
132/*
133 * Rx data types.
134 */
135enum {
136	RTWN_RX_DATA,
137	RTWN_RX_TX_REPORT,
138	RTWN_RX_OTHER
139};
140
141/*
142 * Firmware reset reasons.
143 */
144enum {
145	RTWN_FW_RESET_DOWNLOAD,
146	RTWN_FW_RESET_CHECKSUM,
147	RTWN_FW_RESET_SHUTDOWN
148};
149
150/*
151 * Rate control algorithm selection.
152 */
153enum {
154	RTWN_RATECTL_NONE,
155	RTWN_RATECTL_NET80211,
156	RTWN_RATECTL_FW,
157	RTWN_RATECTL_MAX
158};
159
160/*
161 * Control h/w crypto usage.
162 */
163enum {
164	RTWN_CRYPTO_SW,
165	RTWN_CRYPTO_PAIR,
166	RTWN_CRYPTO_FULL,
167	RTWN_CRYPTO_MAX,
168};
169
170struct rtwn_softc {
171	struct ieee80211com	sc_ic;
172	struct mbufq		sc_snd;
173	device_t		sc_dev;
174
175#if 1
176	int			sc_ht40;
177#endif
178	uint32_t		sc_debug;
179	int			sc_hwcrypto;
180	int			sc_ratectl_sysctl;
181	int			sc_ratectl;
182
183	uint8_t			sc_detached;
184	uint8_t			sc_flags;
185/* Device flags */
186#define RTWN_FLAG_CCK_HIPWR	0x01
187#define RTWN_FLAG_EXT_HDR	0x02
188#define RTWN_FLAG_CAM_FIXED	0x04
189/* Driver state */
190#define RTWN_STARTED		0x08
191#define RTWN_RUNNING		0x10
192#define RTWN_FW_LOADED		0x20
193#define RTWN_TEMP_MEASURED	0x40
194#define RTWN_RCR_LOCKED		0x80
195
196#define RTWN_CHIP_HAS_BCNQ1(_sc)	\
197	((_sc)->bcn_status_reg[0] != (_sc)->bcn_status_reg[1])
198
199	void			*sc_priv;
200	const char		*name;
201	int			sc_ant;
202
203	struct rtwn_tx_phystat	last_physt;
204	uint8_t			thcal_temp;
205	int			cur_bcnq_id;
206
207	int			nvaps;
208	int			ap_vaps;
209	int			bcn_vaps;
210	int			mon_vaps;
211
212	int			vaps_running;
213	int			monvaps_running;
214
215	uint16_t		next_rom_addr;
216	uint8_t			keys_bmap[howmany(RTWN_CAM_ENTRY_LIMIT, NBBY)];
217
218	struct rtwn_vap		*vaps[RTWN_PORT_COUNT];
219	struct ieee80211_node	*node_list[RTWN_MACID_LIMIT];
220	struct mtx		nt_mtx;
221
222	struct callout		sc_calib_to;
223	struct callout		sc_pwrmode_init;
224#ifndef D4054
225	struct callout		sc_watchdog_to;
226	int			sc_tx_timer;
227#endif
228
229	struct mtx		sc_mtx;
230
231	struct rtwn_cmdq	cmdq[RTWN_CMDQ_SIZE];
232	struct mtx		cmdq_mtx;
233	struct task		cmdq_task;
234	uint8_t			cmdq_first;
235	uint8_t			cmdq_last;
236
237	struct wmeParams	cap_wmeParams[WME_NUM_AC];
238
239	struct rtwn_rx_radiotap_header	sc_rxtap;
240	struct rtwn_tx_radiotap_header	sc_txtap;
241
242	int			ntxchains;
243	int			nrxchains;
244
245	int			ledlink;
246	uint8_t			thermal_meter;
247
248	int			sc_tx_n_active;
249	uint8_t			qfullmsk;
250
251	/* Firmware-specific */
252	const char		*fwname;
253	uint16_t		fwver;
254	uint16_t		fwsig;
255	int			fwcur;
256
257	void		(*sc_node_free)(struct ieee80211_node *);
258	void		(*sc_scan_curchan)(struct ieee80211_scan_state *,
259			    unsigned long);
260
261	/* Interface-specific. */
262	int		(*sc_write_1)(struct rtwn_softc *, uint16_t,
263			    uint8_t);
264	int		(*sc_write_2)(struct rtwn_softc *, uint16_t,
265			    uint16_t);
266	int		(*sc_write_4)(struct rtwn_softc *, uint16_t,
267			    uint32_t);
268	uint8_t		(*sc_read_1)(struct rtwn_softc *, uint16_t);
269	uint16_t	(*sc_read_2)(struct rtwn_softc *, uint16_t);
270	uint32_t	(*sc_read_4)(struct rtwn_softc *, uint16_t);
271	/* XXX eliminate */
272	void		(*sc_delay)(struct rtwn_softc *, int);
273	int		(*sc_tx_start)(struct rtwn_softc *,
274			    struct ieee80211_node *, struct mbuf *, uint8_t *,
275			    uint8_t, int);
276	void		(*sc_start_xfers)(struct rtwn_softc *);
277	void		(*sc_reset_lists)(struct rtwn_softc *,
278			    struct ieee80211vap *);
279	void		(*sc_abort_xfers)(struct rtwn_softc *);
280	int		(*sc_fw_write_block)(struct rtwn_softc *,
281			    const uint8_t *, uint16_t, int);
282	uint16_t	(*sc_get_qmap)(struct rtwn_softc *);
283	void		(*sc_set_desc_addr)(struct rtwn_softc *);
284	void		(*sc_drop_incorrect_tx)(struct rtwn_softc *);
285	void		(*sc_beacon_update_begin)(struct rtwn_softc *,
286			    struct ieee80211vap *);
287	void		(*sc_beacon_update_end)(struct rtwn_softc *,
288			    struct ieee80211vap *);
289	void		(*sc_beacon_unload)(struct rtwn_softc *, int);
290
291	/* XXX drop checks for PCIe? */
292	int		bcn_check_interval;
293
294	/* Device-specific. */
295	uint32_t	(*sc_rf_read)(struct rtwn_softc *, int, uint8_t);
296	void		(*sc_rf_write)(struct rtwn_softc *, int, uint8_t,
297			    uint32_t);
298	int		(*sc_check_condition)(struct rtwn_softc *,
299			    const uint8_t[]);
300	void		(*sc_efuse_postread)(struct rtwn_softc *);
301	void		(*sc_parse_rom)(struct rtwn_softc *, uint8_t *);
302	void		(*sc_set_led)(struct rtwn_softc *, int, int);
303	int		(*sc_power_on)(struct rtwn_softc *);
304	void		(*sc_power_off)(struct rtwn_softc *);
305#ifndef RTWN_WITHOUT_UCODE
306	void		(*sc_fw_reset)(struct rtwn_softc *, int);
307	void		(*sc_fw_download_enable)(struct rtwn_softc *, int);
308#endif
309	int		(*sc_llt_init)(struct rtwn_softc *);
310	int		(*sc_set_page_size)(struct rtwn_softc *);
311	void		(*sc_lc_calib)(struct rtwn_softc *);
312	void		(*sc_iq_calib)(struct rtwn_softc *);
313	void		(*sc_read_chipid_vendor)(struct rtwn_softc *,
314			    uint32_t);
315	void		(*sc_adj_devcaps)(struct rtwn_softc *);
316	void		(*sc_vap_preattach)(struct rtwn_softc *,
317			    struct ieee80211vap *);
318	void		(*sc_postattach)(struct rtwn_softc *);
319	void		(*sc_detach_private)(struct rtwn_softc *);
320	void		(*sc_fill_tx_desc)(struct rtwn_softc *,
321			    struct ieee80211_node *, struct mbuf *,
322			    void *, uint8_t, int);
323	void		(*sc_fill_tx_desc_raw)(struct rtwn_softc *,
324			    struct ieee80211_node *, struct mbuf *,
325			    void *, const struct ieee80211_bpf_params *);
326	void		(*sc_fill_tx_desc_null)(struct rtwn_softc *,
327			    void *, int, int, int);
328	void		(*sc_dump_tx_desc)(struct rtwn_softc *, const void *);
329	uint8_t		(*sc_tx_radiotap_flags)(const void *);
330	uint8_t		(*sc_rx_radiotap_flags)(const void *);
331	void		(*sc_beacon_init)(struct rtwn_softc *, void *, int);
332	void		(*sc_beacon_enable)(struct rtwn_softc *, int, int);
333	void		(*sc_beacon_set_rate)(void *, int);
334	void		(*sc_beacon_select)(struct rtwn_softc *, int);
335	void		(*sc_set_chan)(struct rtwn_softc *,
336			    struct ieee80211_channel *);
337	void		(*sc_set_media_status)(struct rtwn_softc *, int);
338#ifndef RTWN_WITHOUT_UCODE
339	int		(*sc_set_rsvd_page)(struct rtwn_softc *, int, int,
340			    int);
341	int		(*sc_set_pwrmode)(struct rtwn_softc *,
342			    struct ieee80211vap *, int);
343	void		(*sc_set_rssi)(struct rtwn_softc *);
344#endif
345	void		(*sc_get_rx_stats)(struct rtwn_softc *,
346			    struct ieee80211_rx_stats *, const void *,
347			    const void *);
348	int8_t		(*sc_get_rssi_cck)(struct rtwn_softc *, void *);
349	int8_t		(*sc_get_rssi_ofdm)(struct rtwn_softc *, void *);
350	int		(*sc_classify_intr)(struct rtwn_softc *, void *, int);
351	void		(*sc_handle_tx_report)(struct rtwn_softc *, uint8_t *,
352			    int);
353	void		(*sc_handle_c2h_report)(struct rtwn_softc *,
354			    uint8_t *, int);
355	int		(*sc_check_frame)(struct rtwn_softc *, struct mbuf *);
356	void		(*sc_temp_measure)(struct rtwn_softc *);
357	uint8_t		(*sc_temp_read)(struct rtwn_softc *);
358	void		(*sc_init_tx_agg)(struct rtwn_softc *);
359	void		(*sc_init_rx_agg)(struct rtwn_softc *);
360	void		(*sc_init_intr)(struct rtwn_softc *);
361	void		(*sc_init_ampdu)(struct rtwn_softc *);
362	void		(*sc_init_edca)(struct rtwn_softc *);
363	void		(*sc_init_bb)(struct rtwn_softc *);
364	void		(*sc_init_rf)(struct rtwn_softc *);
365	void		(*sc_init_antsel)(struct rtwn_softc *);
366	void		(*sc_post_init)(struct rtwn_softc *);
367	int		(*sc_init_bcnq1_boundary)(struct rtwn_softc *);
368
369	const uint8_t			*chan_list_5ghz[3];
370	int				chan_num_5ghz[3];
371
372	const struct rtwn_mac_prog	*mac_prog;
373	int				mac_size;
374	const struct rtwn_bb_prog	*bb_prog;
375	int				bb_size;
376	const struct rtwn_agc_prog	*agc_prog;
377	int				agc_size;
378	const struct rtwn_rf_prog	*rf_prog;
379
380	int				page_count;
381	int				pktbuf_count;
382
383	int				ackto;
384
385	int				npubqpages;
386	int				nhqpages;
387	int				nnqpages;
388	int				nlqpages;
389	int				page_size;
390
391	int				txdesc_len;
392	int				efuse_maxlen;
393	int				efuse_maplen;
394
395	uint16_t			rx_dma_size;
396
397	int				macid_limit;
398	int				cam_entry_limit;
399	int				fwsize_limit;
400	int				temp_delta;
401
402	uint16_t			bcn_status_reg[RTWN_PORT_COUNT];
403	uint32_t			rcr;	/* Rx filter */
404};
405MALLOC_DECLARE(M_RTWN_PRIV);
406
407#define	RTWN_LOCK(sc)			mtx_lock(&(sc)->sc_mtx)
408#define	RTWN_UNLOCK(sc)		mtx_unlock(&(sc)->sc_mtx)
409#define	RTWN_ASSERT_LOCKED(sc)		mtx_assert(&(sc)->sc_mtx, MA_OWNED)
410
411#define RTWN_CMDQ_LOCK_INIT(sc) \
412	mtx_init(&(sc)->cmdq_mtx, "cmdq lock", NULL, MTX_DEF)
413#define RTWN_CMDQ_LOCK(sc)		mtx_lock(&(sc)->cmdq_mtx)
414#define RTWN_CMDQ_UNLOCK(sc)		mtx_unlock(&(sc)->cmdq_mtx)
415#define RTWN_CMDQ_LOCK_INITIALIZED(sc)	mtx_initialized(&(sc)->cmdq_mtx)
416#define RTWN_CMDQ_LOCK_DESTROY(sc)	mtx_destroy(&(sc)->cmdq_mtx)
417
418#define RTWN_NT_LOCK_INIT(sc) \
419	mtx_init(&(sc)->nt_mtx, "node table lock", NULL, MTX_DEF)
420#define RTWN_NT_LOCK(sc)		mtx_lock(&(sc)->nt_mtx)
421#define RTWN_NT_UNLOCK(sc)		mtx_unlock(&(sc)->nt_mtx)
422#define RTWN_NT_LOCK_INITIALIZED(sc)	mtx_initialized(&(sc)->nt_mtx)
423#define RTWN_NT_LOCK_DESTROY(sc)	mtx_destroy(&(sc)->nt_mtx)
424
425void	rtwn_sysctlattach(struct rtwn_softc *);
426
427int	rtwn_attach(struct rtwn_softc *);
428void	rtwn_detach(struct rtwn_softc *);
429void	rtwn_resume(struct rtwn_softc *);
430void	rtwn_suspend(struct rtwn_softc *);
431
432/* Interface-specific. */
433#define rtwn_write_1(_sc, _addr, _val) \
434	(((_sc)->sc_write_1)((_sc), (_addr), (_val)))
435#define rtwn_write_2(_sc, _addr, _val) \
436	(((_sc)->sc_write_2)((_sc), (_addr), (_val)))
437#define rtwn_write_4(_sc, _addr, _val) \
438	(((_sc)->sc_write_4)((_sc), (_addr), (_val)))
439#define rtwn_read_1(_sc, _addr) \
440	(((_sc)->sc_read_1)((_sc), (_addr)))
441#define rtwn_read_2(_sc, _addr) \
442	(((_sc)->sc_read_2)((_sc), (_addr)))
443#define rtwn_read_4(_sc, _addr) \
444	(((_sc)->sc_read_4)((_sc), (_addr)))
445#define rtwn_delay(_sc, _usec) \
446	(((_sc)->sc_delay)((_sc), (_usec)))
447#define rtwn_tx_start(_sc, _ni, _m, _desc, _type, _id) \
448	(((_sc)->sc_tx_start)((_sc), (_ni), (_m), (_desc), (_type), (_id)))
449#define rtwn_start_xfers(_sc) \
450	(((_sc)->sc_start_xfers)((_sc)))
451#define rtwn_reset_lists(_sc, _vap) \
452	(((_sc)->sc_reset_lists)((_sc), (_vap)))
453#define rtwn_abort_xfers(_sc) \
454	(((_sc)->sc_abort_xfers)((_sc)))
455#define rtwn_fw_write_block(_sc, _buf, _reg, _len) \
456	(((_sc)->sc_fw_write_block)((_sc), (_buf), (_reg), (_len)))
457#define rtwn_get_qmap(_sc) \
458	(((_sc)->sc_get_qmap)((_sc)))
459#define rtwn_set_desc_addr(_sc) \
460	(((_sc)->sc_set_desc_addr)((_sc)))
461#define rtwn_drop_incorrect_tx(_sc) \
462	(((_sc)->sc_drop_incorrect_tx)((_sc)))
463#define rtwn_beacon_update_begin(_sc, _vap) \
464	(((_sc)->sc_beacon_update_begin)((_sc), (_vap)))
465#define rtwn_beacon_update_end(_sc, _vap) \
466	(((_sc)->sc_beacon_update_end)((_sc), (_vap)))
467#define rtwn_beacon_unload(_sc, _id) \
468	(((_sc)->sc_beacon_unload)((_sc), (_id)))
469
470/* Aliases. */
471#define	rtwn_bb_write		rtwn_write_4
472#define	rtwn_bb_read		rtwn_read_4
473#define	rtwn_bb_setbits		rtwn_setbits_4
474
475/* Device-specific. */
476#define rtwn_rf_read(_sc, _chain, _addr) \
477	(((_sc)->sc_rf_read)((_sc), (_chain), (_addr)))
478#define rtwn_rf_write(_sc, _chain, _addr, _val) \
479	(((_sc)->sc_rf_write)((_sc), (_chain), (_addr), (_val)))
480#define rtwn_check_condition(_sc, _cond) \
481	(((_sc)->sc_check_condition)((_sc), (_cond)))
482#define rtwn_efuse_postread(_sc) \
483	(((_sc)->sc_efuse_postread)((_sc)))
484#define rtwn_parse_rom(_sc, _rom) \
485	(((_sc)->sc_parse_rom)((_sc), (_rom)))
486#define rtwn_set_led(_sc, _led, _on) \
487	(((_sc)->sc_set_led)((_sc), (_led), (_on)))
488#define rtwn_get_rx_stats(_sc, _rxs, _desc, _physt) \
489	(((_sc)->sc_get_rx_stats((_sc), (_rxs), (_desc), (_physt))))
490#define rtwn_get_rssi_cck(_sc, _physt) \
491	(((_sc)->sc_get_rssi_cck)((_sc), (_physt)))
492#define rtwn_get_rssi_ofdm(_sc, _physt) \
493	(((_sc)->sc_get_rssi_ofdm)((_sc), (_physt)))
494#define rtwn_power_on(_sc) \
495	(((_sc)->sc_power_on)((_sc)))
496#define rtwn_power_off(_sc) \
497	(((_sc)->sc_power_off)((_sc)))
498#ifndef RTWN_WITHOUT_UCODE
499#define rtwn_fw_reset(_sc, _reason) \
500	(((_sc)->sc_fw_reset)((_sc), (_reason)))
501#define rtwn_fw_download_enable(_sc, _enable) \
502	(((_sc)->sc_fw_download_enable)((_sc), (_enable)))
503#endif
504#define rtwn_llt_init(_sc) \
505	(((_sc)->sc_llt_init)((_sc)))
506#define rtwn_set_page_size(_sc) \
507	(((_sc)->sc_set_page_size)((_sc)))
508#define rtwn_lc_calib(_sc) \
509	(((_sc)->sc_lc_calib)((_sc)))
510#define rtwn_iq_calib(_sc) \
511	(((_sc)->sc_iq_calib)((_sc)))
512#define rtwn_read_chipid_vendor(_sc, _reg) \
513	(((_sc)->sc_read_chipid_vendor)((_sc), (_reg)))
514#define rtwn_adj_devcaps(_sc) \
515	(((_sc)->sc_adj_devcaps)((_sc)))
516#define rtwn_vap_preattach(_sc, _vap) \
517	(((_sc)->sc_vap_preattach)((_sc), (_vap)))
518#define rtwn_postattach(_sc) \
519	(((_sc)->sc_postattach)((_sc)))
520#define rtwn_detach_private(_sc) \
521	(((_sc)->sc_detach_private)((_sc)))
522#define rtwn_fill_tx_desc(_sc, _ni, _m, \
523	    _buf, _ridx, _maxretry) \
524	(((_sc)->sc_fill_tx_desc)((_sc), (_ni), \
525	    (_m), (_buf), (_ridx), (_maxretry)))
526#define rtwn_fill_tx_desc_raw(_sc, _ni, _m, \
527	    _buf, _params) \
528	(((_sc)->sc_fill_tx_desc_raw)((_sc), (_ni), \
529	    (_m), (_buf), (_params)))
530#define rtwn_fill_tx_desc_null(_sc, _buf, _11b, _qos, _id) \
531	(((_sc)->sc_fill_tx_desc_null)((_sc), \
532	    (_buf), (_11b), (_qos), (_id)))
533#define rtwn_dump_tx_desc(_sc, _desc) \
534	(((_sc)->sc_dump_tx_desc)((_sc), (_desc)))
535#define rtwn_tx_radiotap_flags(_sc, _buf) \
536	(((_sc)->sc_tx_radiotap_flags)((_buf)))
537#define rtwn_rx_radiotap_flags(_sc, _buf) \
538	(((_sc)->sc_rx_radiotap_flags)((_buf)))
539#define rtwn_set_chan(_sc, _c) \
540	(((_sc)->sc_set_chan)((_sc), (_c)))
541#ifndef RTWN_WITHOUT_UCODE
542#define rtwn_set_rsvd_page(_sc, _resp, _null, _qos_null) \
543	(((_sc)->sc_set_rsvd_page)((_sc), \
544	    (_resp), (_null), (_qos_null)))
545#define rtwn_set_pwrmode(_sc, _vap, _off) \
546	(((_sc)->sc_set_pwrmode)((_sc), (_vap), (_off)))
547#define rtwn_set_rssi(_sc) \
548	(((_sc)->sc_set_rssi)((_sc)))
549#endif
550#define rtwn_classify_intr(_sc, _buf, _len) \
551	(((_sc)->sc_classify_intr)((_sc), (_buf), (_len)))
552#define rtwn_handle_tx_report(_sc, _buf, _len) \
553	(((_sc)->sc_handle_tx_report)((_sc), (_buf), (_len)))
554#define rtwn_handle_c2h_report(_sc, _buf, _len) \
555	(((_sc)->sc_handle_c2h_report)((_sc), (_buf), (_len)))
556#define rtwn_check_frame(_sc, _m) \
557	(((_sc)->sc_check_frame)((_sc), (_m)))
558#define rtwn_beacon_init(_sc, _buf, _id) \
559	(((_sc)->sc_beacon_init)((_sc), (_buf), (_id)))
560#define rtwn_beacon_enable(_sc, _id, _enable) \
561	(((_sc)->sc_beacon_enable)((_sc), (_id), (_enable)))
562#define rtwn_beacon_set_rate(_sc, _buf, _is5ghz) \
563	(((_sc)->sc_beacon_set_rate)((_buf), (_is5ghz)))
564#define rtwn_beacon_select(_sc, _id) \
565	(((_sc)->sc_beacon_select)((_sc), (_id)))
566#define rtwn_temp_measure(_sc) \
567	(((_sc)->sc_temp_measure)((_sc)))
568#define rtwn_temp_read(_sc) \
569	(((_sc)->sc_temp_read)((_sc)))
570#define rtwn_init_tx_agg(_sc) \
571	(((_sc)->sc_init_tx_agg)((_sc)))
572#define rtwn_init_rx_agg(_sc) \
573	(((_sc)->sc_init_rx_agg)((_sc)))
574#define rtwn_init_intr(_sc) \
575	(((_sc)->sc_init_intr)((_sc)))
576#define rtwn_init_ampdu(_sc) \
577	(((_sc)->sc_init_ampdu)((_sc)))
578#define rtwn_init_edca(_sc) \
579	(((_sc)->sc_init_edca)((_sc)))
580#define rtwn_init_bb(_sc) \
581	(((_sc)->sc_init_bb)((_sc)))
582#define rtwn_init_rf(_sc) \
583	(((_sc)->sc_init_rf)((_sc)))
584#define rtwn_init_antsel(_sc) \
585	(((_sc)->sc_init_antsel)((_sc)))
586#define rtwn_post_init(_sc) \
587	(((_sc)->sc_post_init)((_sc)))
588#define rtwn_init_bcnq1_boundary(_sc) \
589	(((_sc)->sc_init_bcnq1_boundary)((_sc)))
590
591/*
592 * Methods to access subfields in registers.
593 */
594static __inline int
595rtwn_setbits_1(struct rtwn_softc *sc, uint16_t addr, uint8_t clr,
596    uint8_t set)
597{
598	return (rtwn_write_1(sc, addr,
599	    (rtwn_read_1(sc, addr) & ~clr) | set));
600}
601
602static __inline int
603rtwn_setbits_1_shift(struct rtwn_softc *sc, uint16_t addr, uint32_t clr,
604    uint32_t set, int shift)
605{
606	return (rtwn_setbits_1(sc, addr + shift, clr >> shift * NBBY,
607	    set >> shift * NBBY));
608}
609
610static __inline int
611rtwn_setbits_2(struct rtwn_softc *sc, uint16_t addr, uint16_t clr,
612    uint16_t set)
613{
614	return (rtwn_write_2(sc, addr,
615	    (rtwn_read_2(sc, addr) & ~clr) | set));
616}
617
618static __inline int
619rtwn_setbits_4(struct rtwn_softc *sc, uint16_t addr, uint32_t clr,
620    uint32_t set)
621{
622	return (rtwn_write_4(sc, addr,
623	    (rtwn_read_4(sc, addr) & ~clr) | set));
624}
625
626static __inline void
627rtwn_rf_setbits(struct rtwn_softc *sc, int chain, uint8_t addr,
628    uint32_t clr, uint32_t set)
629{
630	rtwn_rf_write(sc, chain, addr,
631	    (rtwn_rf_read(sc, chain, addr) & ~clr) | set);
632}
633
634#endif	/* IF_RTWNVAR_H */
635