xref: /illumos-gate/usr/src/uts/common/io/iwn/if_iwnvar.h (revision 843ead08)
1fd43cf6eSHans Rosenfeld /*	$NetBSD: if_iwnvar.h,v 1.17 2015/09/22 23:23:06 nonaka Exp $	*/
2fd43cf6eSHans Rosenfeld /*	$OpenBSD: if_iwnvar.h,v 1.28 2014/09/09 18:55:08 sthen Exp $	*/
3fd43cf6eSHans Rosenfeld 
4fd43cf6eSHans Rosenfeld /*-
5fd43cf6eSHans Rosenfeld  * Copyright (c) 2007, 2008
6fd43cf6eSHans Rosenfeld  *	Damien Bergamini <damien.bergamini@free.fr>
7fd43cf6eSHans Rosenfeld  *
8fd43cf6eSHans Rosenfeld  * Permission to use, copy, modify, and distribute this software for any
9fd43cf6eSHans Rosenfeld  * purpose with or without fee is hereby granted, provided that the above
10fd43cf6eSHans Rosenfeld  * copyright notice and this permission notice appear in all copies.
11fd43cf6eSHans Rosenfeld  *
12fd43cf6eSHans Rosenfeld  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
13fd43cf6eSHans Rosenfeld  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
14fd43cf6eSHans Rosenfeld  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
15fd43cf6eSHans Rosenfeld  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
16fd43cf6eSHans Rosenfeld  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
17fd43cf6eSHans Rosenfeld  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
18fd43cf6eSHans Rosenfeld  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
19fd43cf6eSHans Rosenfeld  */
20fd43cf6eSHans Rosenfeld 
21fd43cf6eSHans Rosenfeld /*
22fd43cf6eSHans Rosenfeld  * Copyright 2016 Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org>
23fd43cf6eSHans Rosenfeld  */
24fd43cf6eSHans Rosenfeld 
25fd43cf6eSHans Rosenfeld #ifndef _IF_IWNVAR_H
26fd43cf6eSHans Rosenfeld #define	_IF_IWNVAR_H
27fd43cf6eSHans Rosenfeld 
28fd43cf6eSHans Rosenfeld #include <sys/net80211.h>
29fd43cf6eSHans Rosenfeld #include <sys/queue.h>
30fd43cf6eSHans Rosenfeld 
31fd43cf6eSHans Rosenfeld struct iwn_dma_info {
32fd43cf6eSHans Rosenfeld 	ddi_dma_handle_t	dma_hdl;
33fd43cf6eSHans Rosenfeld 	ddi_acc_handle_t	acc_hdl;
34fd43cf6eSHans Rosenfeld 	ddi_dma_cookie_t	cookie;
35fd43cf6eSHans Rosenfeld 	uint_t			ncookies;
36fd43cf6eSHans Rosenfeld 	uintptr_t		paddr;
37fd43cf6eSHans Rosenfeld 	caddr_t			vaddr;
38fd43cf6eSHans Rosenfeld 	size_t			size;
39fd43cf6eSHans Rosenfeld 	size_t			length;
40fd43cf6eSHans Rosenfeld };
41fd43cf6eSHans Rosenfeld 
42fd43cf6eSHans Rosenfeld struct iwn_tx_data {
43fd43cf6eSHans Rosenfeld 	struct iwn_dma_info	dma_data;
44fd43cf6eSHans Rosenfeld 	uintptr_t		cmd_paddr;
45fd43cf6eSHans Rosenfeld 	uintptr_t		scratch_paddr;
46fd43cf6eSHans Rosenfeld 	struct iwn_dma_info	cmd_dma;
47fd43cf6eSHans Rosenfeld 	struct ieee80211_node	*ni;
48fd43cf6eSHans Rosenfeld };
49fd43cf6eSHans Rosenfeld 
50fd43cf6eSHans Rosenfeld struct iwn_tx_ring {
51fd43cf6eSHans Rosenfeld 	struct iwn_dma_info	desc_dma;
52fd43cf6eSHans Rosenfeld 	struct iwn_dma_info	cmd_dma;
53fd43cf6eSHans Rosenfeld 	struct iwn_tx_desc	*desc;
54fd43cf6eSHans Rosenfeld 	struct iwn_tx_cmd	*cmd;
55fd43cf6eSHans Rosenfeld 	struct iwn_tx_data	data[IWN_TX_RING_COUNT];
56fd43cf6eSHans Rosenfeld 	int			qid;
57fd43cf6eSHans Rosenfeld 	int			queued;
58fd43cf6eSHans Rosenfeld 	int			cur;
59fd43cf6eSHans Rosenfeld };
60fd43cf6eSHans Rosenfeld 
61fd43cf6eSHans Rosenfeld #define	IWN_RBUF_COUNT	(IWN_RX_RING_COUNT + 32)
62fd43cf6eSHans Rosenfeld 
63fd43cf6eSHans Rosenfeld struct iwn_softc;
64fd43cf6eSHans Rosenfeld 
65fd43cf6eSHans Rosenfeld struct iwn_rx_data {
66fd43cf6eSHans Rosenfeld 	struct iwn_dma_info	dma_data;
67fd43cf6eSHans Rosenfeld };
68fd43cf6eSHans Rosenfeld 
69fd43cf6eSHans Rosenfeld struct iwn_rx_ring {
70fd43cf6eSHans Rosenfeld 	struct iwn_dma_info	desc_dma;
71fd43cf6eSHans Rosenfeld 	struct iwn_dma_info	stat_dma;
72fd43cf6eSHans Rosenfeld 	uint32_t		*desc;
73fd43cf6eSHans Rosenfeld 	struct iwn_rx_status	*stat;
74fd43cf6eSHans Rosenfeld 	struct iwn_rx_data	data[IWN_RX_RING_COUNT];
75fd43cf6eSHans Rosenfeld 	int			cur;
76fd43cf6eSHans Rosenfeld };
77fd43cf6eSHans Rosenfeld 
78fd43cf6eSHans Rosenfeld struct iwn_node {
79fd43cf6eSHans Rosenfeld 	struct	ieee80211_node		ni;	/* must be the first */
80fd43cf6eSHans Rosenfeld 	struct	ieee80211_amrr_node	amn;
81fd43cf6eSHans Rosenfeld 	uint16_t			disable_tid;
82fd43cf6eSHans Rosenfeld 	uint8_t				id;
83fd43cf6eSHans Rosenfeld 	uint8_t				ridx[IEEE80211_RATE_MAXSIZE];
84fd43cf6eSHans Rosenfeld };
85fd43cf6eSHans Rosenfeld 
86fd43cf6eSHans Rosenfeld struct iwn_calib_state {
87fd43cf6eSHans Rosenfeld 	uint8_t		state;
88fd43cf6eSHans Rosenfeld #define IWN_CALIB_STATE_INIT	0
89fd43cf6eSHans Rosenfeld #define IWN_CALIB_STATE_ASSOC	1
90fd43cf6eSHans Rosenfeld #define IWN_CALIB_STATE_RUN	2
91fd43cf6eSHans Rosenfeld 
92fd43cf6eSHans Rosenfeld 	u_int		nbeacons;
93fd43cf6eSHans Rosenfeld 	int32_t		noise[3];
94fd43cf6eSHans Rosenfeld 	uint32_t	rssi[3];
95fd43cf6eSHans Rosenfeld 	uint32_t	ofdm_x1;
96fd43cf6eSHans Rosenfeld 	uint32_t	ofdm_mrc_x1;
97fd43cf6eSHans Rosenfeld 	uint32_t	ofdm_x4;
98fd43cf6eSHans Rosenfeld 	uint32_t	ofdm_mrc_x4;
99fd43cf6eSHans Rosenfeld 	uint32_t	cck_x4;
100fd43cf6eSHans Rosenfeld 	uint32_t	cck_mrc_x4;
101fd43cf6eSHans Rosenfeld 	uint32_t	bad_plcp_ofdm;
102fd43cf6eSHans Rosenfeld 	uint32_t	fa_ofdm;
103fd43cf6eSHans Rosenfeld 	uint32_t	bad_plcp_cck;
104fd43cf6eSHans Rosenfeld 	uint32_t	fa_cck;
105fd43cf6eSHans Rosenfeld 	uint32_t	low_fa;
106fd43cf6eSHans Rosenfeld 	uint8_t		cck_state;
107fd43cf6eSHans Rosenfeld #define IWN_CCK_STATE_INIT	0
108fd43cf6eSHans Rosenfeld #define IWN_CCK_STATE_LOFA	1
109fd43cf6eSHans Rosenfeld #define IWN_CCK_STATE_HIFA	2
110fd43cf6eSHans Rosenfeld 
111fd43cf6eSHans Rosenfeld 	uint8_t		noise_samples[20];
112fd43cf6eSHans Rosenfeld 	u_int		cur_noise_sample;
113fd43cf6eSHans Rosenfeld 	uint8_t		noise_ref;
114fd43cf6eSHans Rosenfeld 	uint32_t	energy_samples[10];
115fd43cf6eSHans Rosenfeld 	u_int		cur_energy_sample;
116fd43cf6eSHans Rosenfeld 	uint32_t	energy_cck;
117fd43cf6eSHans Rosenfeld };
118fd43cf6eSHans Rosenfeld 
119fd43cf6eSHans Rosenfeld struct iwn_calib_info {
120fd43cf6eSHans Rosenfeld 	uint8_t		*buf;
121fd43cf6eSHans Rosenfeld 	u_int		len;
122fd43cf6eSHans Rosenfeld };
123fd43cf6eSHans Rosenfeld 
124fd43cf6eSHans Rosenfeld struct iwn_fw_part {
125fd43cf6eSHans Rosenfeld 	const uint8_t	*text;
126fd43cf6eSHans Rosenfeld 	uint32_t	textsz;
127fd43cf6eSHans Rosenfeld 	const uint8_t	*data;
128fd43cf6eSHans Rosenfeld 	uint32_t	datasz;
129fd43cf6eSHans Rosenfeld };
130fd43cf6eSHans Rosenfeld 
131fd43cf6eSHans Rosenfeld struct iwn_fw_info {
132fd43cf6eSHans Rosenfeld 	u_char			*data;
133fd43cf6eSHans Rosenfeld 	size_t			size;
134fd43cf6eSHans Rosenfeld 	struct iwn_fw_part	init;
135fd43cf6eSHans Rosenfeld 	struct iwn_fw_part	main;
136fd43cf6eSHans Rosenfeld 	struct iwn_fw_part	boot;
137fd43cf6eSHans Rosenfeld };
138fd43cf6eSHans Rosenfeld 
139fd43cf6eSHans Rosenfeld struct iwn_ops {
140fd43cf6eSHans Rosenfeld 	int		(*load_firmware)(struct iwn_softc *);
141fd43cf6eSHans Rosenfeld 	void		(*read_eeprom)(struct iwn_softc *);
142fd43cf6eSHans Rosenfeld 	int		(*post_alive)(struct iwn_softc *);
143fd43cf6eSHans Rosenfeld 	int		(*nic_config)(struct iwn_softc *);
144fd43cf6eSHans Rosenfeld 	int		(*config_bt_coex)(struct iwn_softc *);
145fd43cf6eSHans Rosenfeld 	void		(*update_sched)(struct iwn_softc *, int, int, uint8_t,
146fd43cf6eSHans Rosenfeld 			    uint16_t);
147fd43cf6eSHans Rosenfeld 	int		(*get_temperature)(struct iwn_softc *);
148fd43cf6eSHans Rosenfeld 	int		(*get_rssi)(const struct iwn_rx_stat *);
149fd43cf6eSHans Rosenfeld 	int		(*set_txpower)(struct iwn_softc *, int);
150fd43cf6eSHans Rosenfeld 	int		(*init_gains)(struct iwn_softc *);
151fd43cf6eSHans Rosenfeld 	int		(*set_gains)(struct iwn_softc *);
152fd43cf6eSHans Rosenfeld 	int		(*add_node)(struct iwn_softc *, struct iwn_node_info *,
153fd43cf6eSHans Rosenfeld 			    int);
154fd43cf6eSHans Rosenfeld 	void		(*tx_done)(struct iwn_softc *, struct iwn_rx_desc *,
155fd43cf6eSHans Rosenfeld 			    struct iwn_rx_data *);
156fd43cf6eSHans Rosenfeld #ifndef IEEE80211_NO_HT
157fd43cf6eSHans Rosenfeld 	void		(*ampdu_tx_start)(struct iwn_softc *,
158fd43cf6eSHans Rosenfeld 			    struct ieee80211_node *, uint8_t, uint16_t);
159fd43cf6eSHans Rosenfeld 	void		(*ampdu_tx_stop)(struct iwn_softc *, uint8_t,
160fd43cf6eSHans Rosenfeld 			    uint16_t);
161fd43cf6eSHans Rosenfeld #endif
162fd43cf6eSHans Rosenfeld };
163fd43cf6eSHans Rosenfeld 
164fd43cf6eSHans Rosenfeld struct iwn_softc {
165fd43cf6eSHans Rosenfeld 	struct ieee80211com	sc_ic;
166fd43cf6eSHans Rosenfeld 	dev_info_t		*sc_dip;
167fd43cf6eSHans Rosenfeld 
168fd43cf6eSHans Rosenfeld 	int			(*sc_newstate)(struct ieee80211com *,
169fd43cf6eSHans Rosenfeld 				    enum ieee80211_state, int);
170fd43cf6eSHans Rosenfeld 
171fd43cf6eSHans Rosenfeld 	enum ieee80211_state	sc_ostate;
172fd43cf6eSHans Rosenfeld 
173fd43cf6eSHans Rosenfeld 	clock_t			sc_clk;
174fd43cf6eSHans Rosenfeld 	struct ieee80211_amrr	amrr;
175fd43cf6eSHans Rosenfeld 	uint8_t			fixed_ridx;
176fd43cf6eSHans Rosenfeld 
177fd43cf6eSHans Rosenfeld 	uint16_t		sc_devid;
178fd43cf6eSHans Rosenfeld 	caddr_t			sc_base;
179fd43cf6eSHans Rosenfeld 
180fd43cf6eSHans Rosenfeld 	u_int			sc_flags;
181fd43cf6eSHans Rosenfeld #define IWN_FLAG_HAS_5GHZ	(1 << 0)
182fd43cf6eSHans Rosenfeld #define IWN_FLAG_HAS_OTPROM	(1 << 1)
183fd43cf6eSHans Rosenfeld #define IWN_FLAG_CALIB_DONE	(1 << 2)
184fd43cf6eSHans Rosenfeld #define IWN_FLAG_USE_ICT	(1 << 3)
185fd43cf6eSHans Rosenfeld #define IWN_FLAG_INTERNAL_PA	(1 << 4)
186fd43cf6eSHans Rosenfeld #define	IWN_FLAG_FW_DMA		(1 << 5)
187fd43cf6eSHans Rosenfeld #define IWN_FLAG_HAS_11N	(1 << 6)
188fd43cf6eSHans Rosenfeld #define IWN_FLAG_ENH_SENS	(1 << 7)
189fd43cf6eSHans Rosenfeld /* Added for NetBSD */
190fd43cf6eSHans Rosenfeld #define IWN_FLAG_HW_INITED	(1 << 8)
191fd43cf6eSHans Rosenfeld #define IWN_FLAG_SCANNING_2GHZ	(1 << 9)
192fd43cf6eSHans Rosenfeld #define IWN_FLAG_SCANNING_5GHZ	(1 << 10)
193fd43cf6eSHans Rosenfeld #define IWN_FLAG_SCANNING	(IWN_FLAG_SCANNING_2GHZ|IWN_FLAG_SCANNING_5GHZ)
194fd43cf6eSHans Rosenfeld /* From iwp.c */
195fd43cf6eSHans Rosenfeld #define	IWN_FLAG_ATTACHED	(1 << 11)
196fd43cf6eSHans Rosenfeld #define	IWN_FLAG_CMD_DONE	(1 << 12)
197fd43cf6eSHans Rosenfeld #define	IWN_FLAG_FW_ALIVE	(1 << 13)
198fd43cf6eSHans Rosenfeld #define	IWN_FLAG_HW_ERR_RECOVER	(1 << 14)
199fd43cf6eSHans Rosenfeld #define	IWN_FLAG_RATE_AUTO_CTL	(1 << 15)
200fd43cf6eSHans Rosenfeld #define	IWN_FLAG_RUNNING	(1 << 16)
201fd43cf6eSHans Rosenfeld #define	IWN_FLAG_SUSPEND	(1 << 17)
202fd43cf6eSHans Rosenfeld #define	IWN_FLAG_RADIO_OFF	(1 << 18)
203fd43cf6eSHans Rosenfeld #define	IWN_FLAG_STATISTICS	(1 << 19)
204fd43cf6eSHans Rosenfeld #define	IWN_FLAG_READY		(1 << 20)
205fd43cf6eSHans Rosenfeld #define	IWN_FLAG_PUT_SEG	(1 << 21)
206fd43cf6eSHans Rosenfeld #define	IWN_FLAG_QUIESCED	(1 << 22)
207fd43cf6eSHans Rosenfeld #define	IWN_FLAG_LAZY_RESUME	(1 << 23)
208fd43cf6eSHans Rosenfeld #define	IWN_FLAG_STOP_CALIB_TO	(1 << 24)
209fd43cf6eSHans Rosenfeld 
210*843ead08SRichard Lowe 	uint8_t			hw_type;
211fd43cf6eSHans Rosenfeld 
212fd43cf6eSHans Rosenfeld 	struct iwn_ops		ops;
213fd43cf6eSHans Rosenfeld 	const char		*fwname;
214fd43cf6eSHans Rosenfeld 	const struct iwn_sensitivity_limits
215fd43cf6eSHans Rosenfeld 				*limits;
216fd43cf6eSHans Rosenfeld 	int			ntxqs;
217fd43cf6eSHans Rosenfeld 	int			ndmachnls;
218fd43cf6eSHans Rosenfeld 	uint8_t			broadcast_id;
219fd43cf6eSHans Rosenfeld 	int			rxonsz;
220fd43cf6eSHans Rosenfeld 	int			schedsz;
221fd43cf6eSHans Rosenfeld 	uint32_t		fw_text_maxsz;
222fd43cf6eSHans Rosenfeld 	uint32_t		fw_data_maxsz;
223fd43cf6eSHans Rosenfeld 	uint32_t		fwsz;
224fd43cf6eSHans Rosenfeld 	uint32_t			sched_txfact_addr;
225fd43cf6eSHans Rosenfeld 
226fd43cf6eSHans Rosenfeld 	/* TX scheduler rings. */
227fd43cf6eSHans Rosenfeld 	struct iwn_dma_info	sched_dma;
228fd43cf6eSHans Rosenfeld 	uint16_t		*sched;
229fd43cf6eSHans Rosenfeld 	uint32_t		sched_base;
230fd43cf6eSHans Rosenfeld 
231fd43cf6eSHans Rosenfeld 	/* "Keep Warm" page. */
232fd43cf6eSHans Rosenfeld 	struct iwn_dma_info	kw_dma;
233fd43cf6eSHans Rosenfeld 
234fd43cf6eSHans Rosenfeld 	/* Firmware DMA transfer. */
235fd43cf6eSHans Rosenfeld 	struct iwn_dma_info	fw_dma;
236fd43cf6eSHans Rosenfeld 
237fd43cf6eSHans Rosenfeld 	/* ICT table. */
238fd43cf6eSHans Rosenfeld 	struct iwn_dma_info	ict_dma;
239fd43cf6eSHans Rosenfeld 	uint32_t		*ict;
240fd43cf6eSHans Rosenfeld 	int			ict_cur;
241fd43cf6eSHans Rosenfeld 
242fd43cf6eSHans Rosenfeld 	/* TX/RX rings. */
243fd43cf6eSHans Rosenfeld 	struct iwn_tx_ring	txq[IWN5000_NTXQUEUES];
244fd43cf6eSHans Rosenfeld 	struct iwn_rx_ring	rxq;
245fd43cf6eSHans Rosenfeld 
246fd43cf6eSHans Rosenfeld 	ddi_acc_handle_t	sc_regh;
247*843ead08SRichard Lowe 	void			*sc_ih;
248fd43cf6eSHans Rosenfeld 	ddi_acc_handle_t	sc_pcih;
249fd43cf6eSHans Rosenfeld 	uint_t			sc_intr_pri;
250fd43cf6eSHans Rosenfeld 	int			sc_intr_cap;
251fd43cf6eSHans Rosenfeld 	int			sc_intr_count;
252fd43cf6eSHans Rosenfeld 	size_t			sc_intr_size;
253fd43cf6eSHans Rosenfeld 	ddi_intr_handle_t	*sc_intr_htable;
254fd43cf6eSHans Rosenfeld 	int			sc_cap_off;	/* PCIe Capabilities. */
255fd43cf6eSHans Rosenfeld 
256fd43cf6eSHans Rosenfeld 	ddi_periodic_t		sc_periodic;
257fd43cf6eSHans Rosenfeld 	timeout_id_t		scan_to;
258fd43cf6eSHans Rosenfeld 	timeout_id_t		calib_to;
259fd43cf6eSHans Rosenfeld 	int			calib_cnt;
260fd43cf6eSHans Rosenfeld 	struct iwn_calib_state	calib;
261fd43cf6eSHans Rosenfeld 
262fd43cf6eSHans Rosenfeld 
263fd43cf6eSHans Rosenfeld 	struct iwn_fw_info	fw;
264fd43cf6eSHans Rosenfeld 	struct iwn_calib_info	calibcmd[5];
265fd43cf6eSHans Rosenfeld 	uint32_t		errptr;
266fd43cf6eSHans Rosenfeld 
267fd43cf6eSHans Rosenfeld 	struct iwn_rx_stat	last_rx_stat;
268fd43cf6eSHans Rosenfeld 	int			last_rx_valid;
269fd43cf6eSHans Rosenfeld 	struct iwn_ucode_info	ucode_info;
270fd43cf6eSHans Rosenfeld 	struct iwn_rxon		rxon;
271fd43cf6eSHans Rosenfeld 	struct iwn_rxon		rxon_save;
272fd43cf6eSHans Rosenfeld 	uint32_t		rawtemp;
273fd43cf6eSHans Rosenfeld 	int			temp;
274fd43cf6eSHans Rosenfeld 	int			noise;
275fd43cf6eSHans Rosenfeld 	uint32_t		qfullmsk;
276fd43cf6eSHans Rosenfeld 
277fd43cf6eSHans Rosenfeld 	uint32_t		prom_base;
278fd43cf6eSHans Rosenfeld 	struct iwn4965_eeprom_band
279fd43cf6eSHans Rosenfeld 				bands[IWN_NBANDS];
280fd43cf6eSHans Rosenfeld 	uint16_t		rfcfg;
281fd43cf6eSHans Rosenfeld 	uint8_t			calib_ver;
282fd43cf6eSHans Rosenfeld 	char			eeprom_domain[4];
283fd43cf6eSHans Rosenfeld 	uint32_t		eeprom_crystal;
284fd43cf6eSHans Rosenfeld 	int16_t			eeprom_temp;
285fd43cf6eSHans Rosenfeld 	int16_t			eeprom_voltage;
286fd43cf6eSHans Rosenfeld 	int16_t			eeprom_rawtemp;
287fd43cf6eSHans Rosenfeld 	int8_t			maxpwr2GHz;
288fd43cf6eSHans Rosenfeld 	int8_t			maxpwr5GHz;
289fd43cf6eSHans Rosenfeld 	int8_t			maxpwr[IEEE80211_CHAN_MAX];
290fd43cf6eSHans Rosenfeld 	int8_t			enh_maxpwr[35];
291fd43cf6eSHans Rosenfeld 
292fd43cf6eSHans Rosenfeld 	uint8_t			reset_noise_gain;
293fd43cf6eSHans Rosenfeld 	uint8_t			noise_gain;
294fd43cf6eSHans Rosenfeld 
295fd43cf6eSHans Rosenfeld 	uint32_t		tlv_feature_flags;
296fd43cf6eSHans Rosenfeld 
297fd43cf6eSHans Rosenfeld 	int32_t			temp_off;
298fd43cf6eSHans Rosenfeld 	uint32_t		int_mask;
299fd43cf6eSHans Rosenfeld 	uint8_t			ntxchains;
300fd43cf6eSHans Rosenfeld 	uint8_t			nrxchains;
301fd43cf6eSHans Rosenfeld 	uint8_t			txchainmask;
302fd43cf6eSHans Rosenfeld 	uint8_t			rxchainmask;
303fd43cf6eSHans Rosenfeld 	uint8_t			chainmask;
304fd43cf6eSHans Rosenfeld 
305fd43cf6eSHans Rosenfeld 	int			sc_tx_timer;
306fd43cf6eSHans Rosenfeld 	void			*powerhook;
307fd43cf6eSHans Rosenfeld 
308fd43cf6eSHans Rosenfeld 	kmutex_t		sc_mtx;		/* mutex for init/stop */
309fd43cf6eSHans Rosenfeld 	kmutex_t		sc_tx_mtx;
310fd43cf6eSHans Rosenfeld 	kmutex_t		sc_mt_mtx;
311fd43cf6eSHans Rosenfeld 
312fd43cf6eSHans Rosenfeld 	kcondvar_t		sc_cmd_cv;
313fd43cf6eSHans Rosenfeld 	kcondvar_t		sc_scan_cv;
314fd43cf6eSHans Rosenfeld 	kcondvar_t		sc_fhdma_cv;
315fd43cf6eSHans Rosenfeld 	kcondvar_t		sc_alive_cv;
316fd43cf6eSHans Rosenfeld 	kcondvar_t		sc_calib_cv;
317fd43cf6eSHans Rosenfeld 	kcondvar_t		sc_mt_cv;
318fd43cf6eSHans Rosenfeld 
319fd43cf6eSHans Rosenfeld 	volatile uint32_t	sc_cmd_flag;
320fd43cf6eSHans Rosenfeld 	volatile uint32_t	sc_cmd_accum;
321fd43cf6eSHans Rosenfeld #define	SC_CMD_FLG_NONE		(0)
322fd43cf6eSHans Rosenfeld #define	SC_CMD_FLG_PENDING	(1)
323fd43cf6eSHans Rosenfeld #define	SC_CMD_FLG_DONE		(2)
324fd43cf6eSHans Rosenfeld 
325fd43cf6eSHans Rosenfeld 	/* kstats */
326fd43cf6eSHans Rosenfeld 	uint32_t		sc_tx_nobuf;
327fd43cf6eSHans Rosenfeld 	uint32_t		sc_rx_nobuf;
328fd43cf6eSHans Rosenfeld 	uint32_t		sc_tx_err;
329fd43cf6eSHans Rosenfeld 	uint32_t		sc_rx_err;
330fd43cf6eSHans Rosenfeld 	uint32_t		sc_tx_retries;
331fd43cf6eSHans Rosenfeld 
332fd43cf6eSHans Rosenfeld 	kstat_t			*sc_ks_misc;
333fd43cf6eSHans Rosenfeld 	struct iwn_ks_misc	*sc_misc;
334fd43cf6eSHans Rosenfeld 	kstat_t			*sc_ks_ant;
335fd43cf6eSHans Rosenfeld 	struct iwn_ks_ant	*sc_ant;
336fd43cf6eSHans Rosenfeld 	kstat_t			*sc_ks_sens;
337fd43cf6eSHans Rosenfeld 	struct iwn_ks_sens	*sc_sens;
338fd43cf6eSHans Rosenfeld 	kstat_t			*sc_ks_timing;
339fd43cf6eSHans Rosenfeld 	struct iwn_ks_timing	*sc_timing;
340fd43cf6eSHans Rosenfeld 	kstat_t			*sc_ks_edca;
341fd43cf6eSHans Rosenfeld 	struct iwn_ks_edca	*sc_edca;
342fd43cf6eSHans Rosenfeld 	kstat_t			*sc_ks_txpower;
343fd43cf6eSHans Rosenfeld 	struct iwn_ks_txpower	*sc_txpower;
344fd43cf6eSHans Rosenfeld 	kstat_t			*sc_ks_toff;
345fd43cf6eSHans Rosenfeld 	union {
346fd43cf6eSHans Rosenfeld 		struct iwn_ks_toff_2000 *t2000;
347fd43cf6eSHans Rosenfeld 		struct iwn_ks_toff_6000 *t6000;
348fd43cf6eSHans Rosenfeld 	}			sc_toff;
349fd43cf6eSHans Rosenfeld };
350fd43cf6eSHans Rosenfeld 
351fd43cf6eSHans Rosenfeld struct iwn_ks_misc {
352fd43cf6eSHans Rosenfeld 	kstat_named_t		temp;
353fd43cf6eSHans Rosenfeld 	kstat_named_t		crit_temp;
354fd43cf6eSHans Rosenfeld 	kstat_named_t		pslevel;
355fd43cf6eSHans Rosenfeld 	kstat_named_t		noise;
356fd43cf6eSHans Rosenfeld };
357fd43cf6eSHans Rosenfeld 
358fd43cf6eSHans Rosenfeld struct iwn_ks_ant {
359fd43cf6eSHans Rosenfeld 	kstat_named_t		tx_ant;
360fd43cf6eSHans Rosenfeld 	kstat_named_t		rx_ant;
361fd43cf6eSHans Rosenfeld 	kstat_named_t		conn_ant;
362fd43cf6eSHans Rosenfeld 	kstat_named_t		gain[3];
363fd43cf6eSHans Rosenfeld };
364fd43cf6eSHans Rosenfeld 
365fd43cf6eSHans Rosenfeld struct iwn_ks_sens {
366fd43cf6eSHans Rosenfeld 	kstat_named_t		ofdm_x1;
367fd43cf6eSHans Rosenfeld 	kstat_named_t		ofdm_mrc_x1;
368fd43cf6eSHans Rosenfeld 	kstat_named_t		ofdm_x4;
369fd43cf6eSHans Rosenfeld 	kstat_named_t		ofdm_mrc_x4;
370fd43cf6eSHans Rosenfeld 	kstat_named_t		cck_x4;
371fd43cf6eSHans Rosenfeld 	kstat_named_t		cck_mrc_x4;
372fd43cf6eSHans Rosenfeld 	kstat_named_t		energy_cck;
373fd43cf6eSHans Rosenfeld };
374fd43cf6eSHans Rosenfeld 
375fd43cf6eSHans Rosenfeld struct iwn_ks_timing {
376fd43cf6eSHans Rosenfeld 	kstat_named_t		bintval;
377fd43cf6eSHans Rosenfeld 	kstat_named_t		tstamp;
378fd43cf6eSHans Rosenfeld 	kstat_named_t		init;
379fd43cf6eSHans Rosenfeld };
380fd43cf6eSHans Rosenfeld 
381fd43cf6eSHans Rosenfeld struct iwn_ks_edca {
382fd43cf6eSHans Rosenfeld 	struct {
383fd43cf6eSHans Rosenfeld 		kstat_named_t		cwmin;
384fd43cf6eSHans Rosenfeld 		kstat_named_t		cwmax;
385fd43cf6eSHans Rosenfeld 		kstat_named_t		aifsn;
386fd43cf6eSHans Rosenfeld 		kstat_named_t		txop;
387fd43cf6eSHans Rosenfeld 	} ac[4];
388fd43cf6eSHans Rosenfeld };
389fd43cf6eSHans Rosenfeld 
390fd43cf6eSHans Rosenfeld struct iwn_ks_txpower {
391fd43cf6eSHans Rosenfeld 	kstat_named_t		vdiff;
392fd43cf6eSHans Rosenfeld 	kstat_named_t		chan;
393fd43cf6eSHans Rosenfeld 	kstat_named_t		group;
394fd43cf6eSHans Rosenfeld 	kstat_named_t		subband;
395fd43cf6eSHans Rosenfeld 	struct {
396fd43cf6eSHans Rosenfeld 		kstat_named_t	power;
397fd43cf6eSHans Rosenfeld 		kstat_named_t	gain;
398fd43cf6eSHans Rosenfeld 		kstat_named_t	temp;
399fd43cf6eSHans Rosenfeld 		kstat_named_t	tcomp;
400fd43cf6eSHans Rosenfeld 		struct {
401fd43cf6eSHans Rosenfeld 			kstat_named_t	rf_gain;
402fd43cf6eSHans Rosenfeld 			kstat_named_t	dsp_gain;
403*843ead08SRichard Lowe 		} rate[IWN_RIDX_MAX + 1];
404fd43cf6eSHans Rosenfeld 	} txchain[2];
405fd43cf6eSHans Rosenfeld };
406fd43cf6eSHans Rosenfeld 
407fd43cf6eSHans Rosenfeld struct iwn_ks_toff_2000 {
408fd43cf6eSHans Rosenfeld 	kstat_named_t		toff_lo;
409fd43cf6eSHans Rosenfeld 	kstat_named_t		toff_hi;
410fd43cf6eSHans Rosenfeld 	kstat_named_t		volt;
411fd43cf6eSHans Rosenfeld };
412fd43cf6eSHans Rosenfeld 
413fd43cf6eSHans Rosenfeld struct iwn_ks_toff_6000 {
414fd43cf6eSHans Rosenfeld 	kstat_named_t		toff;
415fd43cf6eSHans Rosenfeld };
416fd43cf6eSHans Rosenfeld 
417fd43cf6eSHans Rosenfeld #define	IWN_CHK_FAST_RECOVER(sc) \
418fd43cf6eSHans Rosenfeld 	(sc->sc_ic.ic_state == IEEE80211_S_RUN && \
419fd43cf6eSHans Rosenfeld 	sc->sc_ic.ic_opmode == IEEE80211_M_STA)
420fd43cf6eSHans Rosenfeld 
421fd43cf6eSHans Rosenfeld #endif	/* _IF_IWNVAR_H */
422