xref: /freebsd/sys/dev/iwn/if_iwnvar.h (revision 71625ec9ad2a9bc8c09784fbd23b759830e0ee5f)
17832b1f6SBernhard Schmidt /*	$OpenBSD: if_iwnvar.h,v 1.18 2010/04/30 16:06:46 damien Exp $	*/
28f302007SRui Paulo 
33971d07bSSam Leffler /*-
4da8848ffSAdrian Chadd  * Copyright (c) 2013 Cedric GROSS <cg@cgross.info>
5da8848ffSAdrian Chadd  * Copyright (c) 2011 Intel Corporation
68f302007SRui Paulo  * Copyright (c) 2007, 2008
73971d07bSSam Leffler  *	Damien Bergamini <damien.bergamini@free.fr>
83971d07bSSam Leffler  * Copyright (c) 2008 Sam Leffler, Errno Consulting
93971d07bSSam Leffler  *
103971d07bSSam Leffler  * Permission to use, copy, modify, and distribute this software for any
113971d07bSSam Leffler  * purpose with or without fee is hereby granted, provided that the above
123971d07bSSam Leffler  * copyright notice and this permission notice appear in all copies.
133971d07bSSam Leffler  *
143971d07bSSam Leffler  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
153971d07bSSam Leffler  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
163971d07bSSam Leffler  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
173971d07bSSam Leffler  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
183971d07bSSam Leffler  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
193971d07bSSam Leffler  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
203971d07bSSam Leffler  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
213971d07bSSam Leffler  */
22da8848ffSAdrian Chadd enum iwn_rxon_ctx_id {
23da8848ffSAdrian Chadd 		IWN_RXON_BSS_CTX,
24da8848ffSAdrian Chadd 		IWN_RXON_PAN_CTX,
25da8848ffSAdrian Chadd 		IWN_NUM_RXON_CTX
26da8848ffSAdrian Chadd };
27da8848ffSAdrian Chadd 
28da8848ffSAdrian Chadd struct iwn_pan_slot {
29da8848ffSAdrian Chadd 	uint16_t	time;
30da8848ffSAdrian Chadd 	uint8_t		type;
31da8848ffSAdrian Chadd 	uint8_t		reserved;
32da8848ffSAdrian Chadd } __packed;
33da8848ffSAdrian Chadd 
34da8848ffSAdrian Chadd struct iwn_pan_params_cmd {
35da8848ffSAdrian Chadd 	uint16_t flags;
36da8848ffSAdrian Chadd #define	IWN_PAN_PARAMS_FLG_SLOTTED_MODE	(1 << 3)
37da8848ffSAdrian Chadd 
38da8848ffSAdrian Chadd 	uint8_t reserved;
39da8848ffSAdrian Chadd 	uint8_t num_slots;
40da8848ffSAdrian Chadd 	struct iwn_pan_slot slots[10];
41da8848ffSAdrian Chadd } __packed;
42da8848ffSAdrian Chadd 
43da8848ffSAdrian Chadd struct iwn_led_mode
44da8848ffSAdrian Chadd {
45da8848ffSAdrian Chadd 	uint8_t		led_cur_mode;
46da8848ffSAdrian Chadd 	uint64_t	led_cur_bt;
47da8848ffSAdrian Chadd 	uint64_t	led_last_bt;
48da8848ffSAdrian Chadd 	uint64_t	led_cur_tpt;
49da8848ffSAdrian Chadd 	uint64_t	led_last_tpt;
50da8848ffSAdrian Chadd 	uint64_t	led_bt_diff;
51da8848ffSAdrian Chadd 	int		led_cur_time;
52da8848ffSAdrian Chadd 	int		led_last_time;
53da8848ffSAdrian Chadd };
543971d07bSSam Leffler 
553971d07bSSam Leffler struct iwn_rx_radiotap_header {
563971d07bSSam Leffler 	struct ieee80211_radiotap_header wr_ihdr;
573971d07bSSam Leffler 	uint64_t	wr_tsft;
583971d07bSSam Leffler 	uint8_t		wr_flags;
593971d07bSSam Leffler 	uint8_t		wr_rate;
603971d07bSSam Leffler 	uint16_t	wr_chan_freq;
613971d07bSSam Leffler 	uint16_t	wr_chan_flags;
623971d07bSSam Leffler 	int8_t		wr_dbm_antsignal;
633971d07bSSam Leffler 	int8_t		wr_dbm_antnoise;
64*786ac703SAndriy Voskoboinyk } __packed __aligned(8);
653971d07bSSam Leffler 
663971d07bSSam Leffler #define IWN_RX_RADIOTAP_PRESENT						\
673971d07bSSam Leffler 	((1 << IEEE80211_RADIOTAP_TSFT) |				\
683971d07bSSam Leffler 	 (1 << IEEE80211_RADIOTAP_FLAGS) |				\
693971d07bSSam Leffler 	 (1 << IEEE80211_RADIOTAP_RATE) |				\
703971d07bSSam Leffler 	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
713971d07bSSam Leffler 	 (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) |			\
723971d07bSSam Leffler 	 (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE))
733971d07bSSam Leffler 
743971d07bSSam Leffler struct iwn_tx_radiotap_header {
753971d07bSSam Leffler 	struct ieee80211_radiotap_header wt_ihdr;
763971d07bSSam Leffler 	uint8_t		wt_flags;
773971d07bSSam Leffler 	uint8_t		wt_rate;
783971d07bSSam Leffler 	uint16_t	wt_chan_freq;
793971d07bSSam Leffler 	uint16_t	wt_chan_flags;
803971d07bSSam Leffler } __packed;
813971d07bSSam Leffler 
823971d07bSSam Leffler #define IWN_TX_RADIOTAP_PRESENT						\
833971d07bSSam Leffler 	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
843971d07bSSam Leffler 	 (1 << IEEE80211_RADIOTAP_RATE) |				\
853971d07bSSam Leffler 	 (1 << IEEE80211_RADIOTAP_CHANNEL))
863971d07bSSam Leffler 
873971d07bSSam Leffler struct iwn_dma_info {
883971d07bSSam Leffler 	bus_dma_tag_t		tag;
893971d07bSSam Leffler 	bus_dmamap_t		map;
903971d07bSSam Leffler 	bus_dma_segment_t	seg;
913971d07bSSam Leffler 	bus_addr_t		paddr;
923971d07bSSam Leffler 	caddr_t			vaddr;
933971d07bSSam Leffler 	bus_size_t		size;
943971d07bSSam Leffler };
953971d07bSSam Leffler 
963971d07bSSam Leffler struct iwn_tx_data {
973971d07bSSam Leffler 	bus_dmamap_t		map;
988f302007SRui Paulo 	bus_addr_t		cmd_paddr;
998f302007SRui Paulo 	bus_addr_t		scratch_paddr;
1003971d07bSSam Leffler 	struct mbuf		*m;
1013971d07bSSam Leffler 	struct ieee80211_node	*ni;
1020613dc6fSAndriy Voskoboinyk 	unsigned int		remapped:1;
1030613dc6fSAndriy Voskoboinyk 	unsigned int		long_retries:7;
1040613dc6fSAndriy Voskoboinyk #define IWN_LONG_RETRY_FW_OVERFLOW	0x10
1050613dc6fSAndriy Voskoboinyk #define IWN_LONG_RETRY_LIMIT_LOG	7
1060613dc6fSAndriy Voskoboinyk #define IWN_LONG_RETRY_LIMIT		((1 << IWN_LONG_RETRY_LIMIT_LOG) - 3)
1073971d07bSSam Leffler };
1083971d07bSSam Leffler 
1093971d07bSSam Leffler struct iwn_tx_ring {
1103971d07bSSam Leffler 	struct iwn_dma_info	desc_dma;
1113971d07bSSam Leffler 	struct iwn_dma_info	cmd_dma;
1123971d07bSSam Leffler 	struct iwn_tx_desc	*desc;
1133971d07bSSam Leffler 	struct iwn_tx_cmd	*cmd;
1143971d07bSSam Leffler 	struct iwn_tx_data	data[IWN_TX_RING_COUNT];
1150f454b93SRui Paulo 	bus_dma_tag_t		data_dmat;
1163971d07bSSam Leffler 	int			qid;
1173971d07bSSam Leffler 	int			queued;
1183971d07bSSam Leffler 	int			cur;
11997fadf57SBernhard Schmidt 	int			read;
1203971d07bSSam Leffler };
1213971d07bSSam Leffler 
1228f302007SRui Paulo struct iwn_softc;
1238f302007SRui Paulo 
1243971d07bSSam Leffler struct iwn_rx_data {
1253971d07bSSam Leffler 	struct mbuf	*m;
1268f302007SRui Paulo 	bus_dmamap_t	map;
1273971d07bSSam Leffler };
1283971d07bSSam Leffler 
1293971d07bSSam Leffler struct iwn_rx_ring {
1303971d07bSSam Leffler 	struct iwn_dma_info	desc_dma;
1318f302007SRui Paulo 	struct iwn_dma_info	stat_dma;
1323971d07bSSam Leffler 	uint32_t		*desc;
1338f302007SRui Paulo 	struct iwn_rx_status	*stat;
1343971d07bSSam Leffler 	struct iwn_rx_data	data[IWN_RX_RING_COUNT];
1350f454b93SRui Paulo 	bus_dma_tag_t		data_dmat;
1363971d07bSSam Leffler 	int			cur;
1373971d07bSSam Leffler };
1383971d07bSSam Leffler 
1393971d07bSSam Leffler struct iwn_node {
1403971d07bSSam Leffler 	struct	ieee80211_node		ni;	/* must be the first */
1418f302007SRui Paulo 	uint16_t			disable_tid;
1428f302007SRui Paulo 	uint8_t				id;
14397fadf57SBernhard Schmidt 	struct {
14497fadf57SBernhard Schmidt 		uint64_t		bitmap;
1450613dc6fSAndriy Voskoboinyk 		int			short_retries;
14697fadf57SBernhard Schmidt 		int			startidx;
14797fadf57SBernhard Schmidt 	} agg[IEEE80211_TID_SIZE];
1488f302007SRui Paulo };
1498f302007SRui Paulo 
1503971d07bSSam Leffler struct iwn_calib_state {
1513971d07bSSam Leffler 	uint8_t		state;
1523971d07bSSam Leffler #define IWN_CALIB_STATE_INIT	0
1533971d07bSSam Leffler #define IWN_CALIB_STATE_ASSOC	1
1543971d07bSSam Leffler #define IWN_CALIB_STATE_RUN	2
1558f302007SRui Paulo 
1563971d07bSSam Leffler 	u_int		nbeacons;
1573971d07bSSam Leffler 	uint32_t	noise[3];
1583971d07bSSam Leffler 	uint32_t	rssi[3];
1598f302007SRui Paulo 	uint32_t	ofdm_x1;
1608f302007SRui Paulo 	uint32_t	ofdm_mrc_x1;
1618f302007SRui Paulo 	uint32_t	ofdm_x4;
1628f302007SRui Paulo 	uint32_t	ofdm_mrc_x4;
1638f302007SRui Paulo 	uint32_t	cck_x4;
1648f302007SRui Paulo 	uint32_t	cck_mrc_x4;
1653971d07bSSam Leffler 	uint32_t	bad_plcp_ofdm;
1663971d07bSSam Leffler 	uint32_t	fa_ofdm;
1673971d07bSSam Leffler 	uint32_t	bad_plcp_cck;
1683971d07bSSam Leffler 	uint32_t	fa_cck;
1693971d07bSSam Leffler 	uint32_t	low_fa;
17092d7ab95SAdrian Chadd 	uint32_t	bad_plcp_ht;
1713971d07bSSam Leffler 	uint8_t		cck_state;
1723971d07bSSam Leffler #define IWN_CCK_STATE_INIT	0
1733971d07bSSam Leffler #define IWN_CCK_STATE_LOFA	1
1743971d07bSSam Leffler #define IWN_CCK_STATE_HIFA	2
1758f302007SRui Paulo 
1763971d07bSSam Leffler 	uint8_t		noise_samples[20];
1773971d07bSSam Leffler 	u_int		cur_noise_sample;
1783971d07bSSam Leffler 	uint8_t		noise_ref;
1793971d07bSSam Leffler 	uint32_t	energy_samples[10];
1803971d07bSSam Leffler 	u_int		cur_energy_sample;
1813971d07bSSam Leffler 	uint32_t	energy_cck;
1823971d07bSSam Leffler };
1833971d07bSSam Leffler 
1848f302007SRui Paulo struct iwn_calib_info {
1858f302007SRui Paulo 	uint8_t		*buf;
1868f302007SRui Paulo 	u_int		len;
1878f302007SRui Paulo };
1888f302007SRui Paulo 
1898f302007SRui Paulo struct iwn_fw_part {
1908f302007SRui Paulo 	const uint8_t	*text;
1918f302007SRui Paulo 	uint32_t	textsz;
1928f302007SRui Paulo 	const uint8_t	*data;
1938f302007SRui Paulo 	uint32_t	datasz;
1948f302007SRui Paulo };
1958f302007SRui Paulo 
1968f302007SRui Paulo struct iwn_fw_info {
1977832b1f6SBernhard Schmidt 	const uint8_t		*data;
1987832b1f6SBernhard Schmidt 	size_t			size;
1998f302007SRui Paulo 	struct iwn_fw_part	init;
2008f302007SRui Paulo 	struct iwn_fw_part	main;
2018f302007SRui Paulo 	struct iwn_fw_part	boot;
2028f302007SRui Paulo };
2038f302007SRui Paulo 
204552e368dSBernhard Schmidt struct iwn_ops {
2058f302007SRui Paulo 	int		(*load_firmware)(struct iwn_softc *);
2068f302007SRui Paulo 	void		(*read_eeprom)(struct iwn_softc *);
2078f302007SRui Paulo 	int		(*post_alive)(struct iwn_softc *);
2088f302007SRui Paulo 	int		(*nic_config)(struct iwn_softc *);
2098f302007SRui Paulo 	void		(*update_sched)(struct iwn_softc *, int, int, uint8_t,
2108f302007SRui Paulo 			    uint16_t);
2118f302007SRui Paulo 	int		(*get_temperature)(struct iwn_softc *);
2128f302007SRui Paulo 	int		(*get_rssi)(struct iwn_softc *, struct iwn_rx_stat *);
2136977499cSAndriy Voskoboinyk 	int		(*set_txpower)(struct iwn_softc *, int);
2148f302007SRui Paulo 	int		(*init_gains)(struct iwn_softc *);
2158f302007SRui Paulo 	int		(*set_gains)(struct iwn_softc *);
2169d5228cdSAndriy Voskoboinyk 	int		(*rxon_assoc)(struct iwn_softc *, int);
2178f302007SRui Paulo 	int		(*add_node)(struct iwn_softc *, struct iwn_node_info *,
2188f302007SRui Paulo 			    int);
2198f302007SRui Paulo 	void		(*tx_done)(struct iwn_softc *, struct iwn_rx_desc *,
2208f302007SRui Paulo 			    struct iwn_rx_data *);
2210f454b93SRui Paulo 	void		(*ampdu_tx_start)(struct iwn_softc *,
22297fadf57SBernhard Schmidt 			    struct ieee80211_node *, int, uint8_t, uint16_t);
22397fadf57SBernhard Schmidt 	void		(*ampdu_tx_stop)(struct iwn_softc *, int, uint8_t,
2240f454b93SRui Paulo 			    uint16_t);
2258f302007SRui Paulo };
2268f302007SRui Paulo 
2273971d07bSSam Leffler struct iwn_vap {
2283971d07bSSam Leffler 	struct ieee80211vap	iv_vap;
2298f302007SRui Paulo 	uint8_t			iv_ridx;
2303971d07bSSam Leffler 
2313971d07bSSam Leffler 	int			(*iv_newstate)(struct ieee80211vap *,
2323971d07bSSam Leffler 				    enum ieee80211_state, int);
233da8848ffSAdrian Chadd 	int			ctx;
234da8848ffSAdrian Chadd 	int			beacon_int;
235da8848ffSAdrian Chadd 
2363971d07bSSam Leffler };
2373971d07bSSam Leffler #define	IWN_VAP(_vap)	((struct iwn_vap *)(_vap))
2383971d07bSSam Leffler 
2393971d07bSSam Leffler struct iwn_softc {
240786b72c5SBernhard Schmidt 	device_t		sc_dev;
2413971d07bSSam Leffler 	int			sc_debug;
2424823a750SAdrian Chadd 	struct cdev		*sc_cdev;
2433971d07bSSam Leffler 	struct mtx		sc_mtx;
2447a79cebfSGleb Smirnoff 	struct ieee80211com	sc_ic;
245f6930becSAndriy Voskoboinyk 	struct ieee80211_ratectl_tx_status sc_txs;
2463971d07bSSam Leffler 
2478f302007SRui Paulo 	u_int			sc_flags;
2488f302007SRui Paulo #define IWN_FLAG_HAS_OTPROM	(1 << 1)
2490f454b93SRui Paulo #define IWN_FLAG_CALIB_DONE	(1 << 2)
2500f454b93SRui Paulo #define IWN_FLAG_USE_ICT	(1 << 3)
2510f454b93SRui Paulo #define IWN_FLAG_INTERNAL_PA	(1 << 4)
2529dd0e40bSBernhard Schmidt #define IWN_FLAG_HAS_11N	(1 << 6)
2539dd0e40bSBernhard Schmidt #define IWN_FLAG_ENH_SENS	(1 << 7)
2548bb237d9SBernhard Schmidt #define IWN_FLAG_ADV_BTCOEX	(1 << 8)
255da8848ffSAdrian Chadd #define IWN_FLAG_PAN_SUPPORT	(1 << 9)
2568cf53c12SAdrian Chadd #define IWN_FLAG_BTCOEX		(1 << 10)
2577a79cebfSGleb Smirnoff #define	IWN_FLAG_RUNNING	(1 << 11)
2583971d07bSSam Leffler 
2598f302007SRui Paulo 	uint8_t 		hw_type;
260da8848ffSAdrian Chadd 	/* subdevice_id used to adjust configuration */
261da8848ffSAdrian Chadd 	uint16_t		subdevice_id;
262552e368dSBernhard Schmidt 
263552e368dSBernhard Schmidt 	struct iwn_ops		ops;
2648f302007SRui Paulo 	const char		*fwname;
2650f454b93SRui Paulo 	const struct iwn_sensitivity_limits
2660f454b93SRui Paulo 				*limits;
267552e368dSBernhard Schmidt 	int			ntxqs;
26897fadf57SBernhard Schmidt 	int			firstaggqueue;
269552e368dSBernhard Schmidt 	int			ndmachnls;
270552e368dSBernhard Schmidt 	uint8_t			broadcast_id;
271552e368dSBernhard Schmidt 	int			rxonsz;
272552e368dSBernhard Schmidt 	int			schedsz;
273552e368dSBernhard Schmidt 	uint32_t		fw_text_maxsz;
274552e368dSBernhard Schmidt 	uint32_t		fw_data_maxsz;
275552e368dSBernhard Schmidt 	uint32_t		fwsz;
276552e368dSBernhard Schmidt 	bus_size_t		sched_txfact_addr;
2779ff2129fSBernhard Schmidt 	uint32_t		reset_noise_gain;
2789ff2129fSBernhard Schmidt 	uint32_t		noise_gain;
2798f302007SRui Paulo 
2808f302007SRui Paulo 	/* TX scheduler rings. */
2818f302007SRui Paulo 	struct iwn_dma_info	sched_dma;
2828f302007SRui Paulo 	uint16_t		*sched;
2838f302007SRui Paulo 	uint32_t		sched_base;
2848f302007SRui Paulo 
2858f302007SRui Paulo 	/* "Keep Warm" page. */
2863971d07bSSam Leffler 	struct iwn_dma_info	kw_dma;
2873971d07bSSam Leffler 
2888f302007SRui Paulo 	/* Firmware image. */
2893971d07bSSam Leffler 	const struct firmware	*fw_fp;
2903971d07bSSam Leffler 
2918f302007SRui Paulo 	/* Firmware DMA transfer. */
2923971d07bSSam Leffler 	struct iwn_dma_info	fw_dma;
2933971d07bSSam Leffler 
2940f454b93SRui Paulo 	/* ICT table. */
2950f454b93SRui Paulo 	struct iwn_dma_info	ict_dma;
2960f454b93SRui Paulo 	uint32_t		*ict;
2970f454b93SRui Paulo 	int			ict_cur;
2980f454b93SRui Paulo 
2998f302007SRui Paulo 	/* TX/RX rings. */
3008f302007SRui Paulo 	struct iwn_tx_ring	txq[IWN5000_NTXQUEUES];
3013971d07bSSam Leffler 	struct iwn_rx_ring	rxq;
3023971d07bSSam Leffler 
303786b72c5SBernhard Schmidt 	struct resource		*mem;
3043971d07bSSam Leffler 	bus_space_tag_t		sc_st;
3053971d07bSSam Leffler 	bus_space_handle_t	sc_sh;
306786b72c5SBernhard Schmidt 	struct resource		*irq;
3073971d07bSSam Leffler 	void 			*sc_ih;
3083971d07bSSam Leffler 	bus_size_t		sc_sz;
3098f302007SRui Paulo 	int			sc_cap_off;	/* PCIe Capabilities. */
3103971d07bSSam Leffler 
3113971d07bSSam Leffler 	/* Tasks used by the driver */
312d7de0a2cSAndriy Voskoboinyk 	struct task		sc_rftoggle_task;
3138acd0be1SEdward Tomasz Napierala 	struct task		sc_panic_task;
3143233d0c6SAdrian Chadd 	struct task		sc_xmit_task;
3158acd0be1SEdward Tomasz Napierala 
3168acd0be1SEdward Tomasz Napierala 	/* Taskqueue */
3178acd0be1SEdward Tomasz Napierala 	struct taskqueue	*sc_tq;
3183971d07bSSam Leffler 
31992d7ab95SAdrian Chadd 	/* Calibration information */
320af2e228dSBernhard Schmidt 	struct callout		calib_to;
3213971d07bSSam Leffler 	int			calib_cnt;
3223971d07bSSam Leffler 	struct iwn_calib_state	calib;
32392d7ab95SAdrian Chadd 	int			last_calib_ticks;
3241447d404SAndriy Voskoboinyk 	struct callout		scan_timeout;
325af2e228dSBernhard Schmidt 	struct callout		watchdog_to;
3268f302007SRui Paulo 	struct iwn_fw_info	fw;
327a704cc7fSAdrian Chadd 	struct iwn_calib_info	calibcmd[IWN5000_PHY_CALIB_MAX_RESULT];
3288f302007SRui Paulo 	uint32_t		errptr;
3298f302007SRui Paulo 
3303971d07bSSam Leffler 	struct iwn_rx_stat	last_rx_stat;
3313971d07bSSam Leffler 	int			last_rx_valid;
3323971d07bSSam Leffler 	struct iwn_ucode_info	ucode_info;
333da8848ffSAdrian Chadd 	struct iwn_rxon		rx_on[IWN_NUM_RXON_CTX];
334da8848ffSAdrian Chadd 	struct iwn_rxon		*rxon;
335da8848ffSAdrian Chadd 	int			ctx;
336da8848ffSAdrian Chadd 	struct ieee80211vap	*ivap[IWN_NUM_RXON_CTX];
337da8848ffSAdrian Chadd 
33849f79cfdSAdrian Chadd 	/* General statistics */
33949f79cfdSAdrian Chadd 	/*
34049f79cfdSAdrian Chadd 	 * The statistics are reset after each channel
34149f79cfdSAdrian Chadd 	 * change.  So it may be zeroed after things like
34249f79cfdSAdrian Chadd 	 * a background scan.
34349f79cfdSAdrian Chadd 	 *
34449f79cfdSAdrian Chadd 	 * So for now, this is just a cheap hack to
34549f79cfdSAdrian Chadd 	 * expose the last received statistics dump
34649f79cfdSAdrian Chadd 	 * via an ioctl().  Later versions of this
34749f79cfdSAdrian Chadd 	 * could expose the last 'n' messages, or just
34849f79cfdSAdrian Chadd 	 * provide a pipeline for the firmware responses
34949f79cfdSAdrian Chadd 	 * via something like BPF.
35049f79cfdSAdrian Chadd 	 */
35149f79cfdSAdrian Chadd 	struct iwn_stats	last_stat;
35249f79cfdSAdrian Chadd 	int			last_stat_valid;
35349f79cfdSAdrian Chadd 
354da8848ffSAdrian Chadd 	uint8_t			uc_scan_progress;
3553971d07bSSam Leffler 	uint32_t		rawtemp;
3563971d07bSSam Leffler 	int			temp;
3573971d07bSSam Leffler 	int			noise;
3588f302007SRui Paulo 	uint32_t		qfullmsk;
3593971d07bSSam Leffler 
3600f454b93SRui Paulo 	uint32_t		prom_base;
3618f302007SRui Paulo 	struct iwn4965_eeprom_band
3628f302007SRui Paulo 				bands[IWN_NBANDS];
3630f454b93SRui Paulo 	struct iwn_eeprom_chan	eeprom_channels[IWN_NBANDS][IWN_MAX_CHAN_PER_BAND];
3648f302007SRui Paulo 	uint16_t		rfcfg;
3657373959eSBernhard Schmidt 	uint8_t			calib_ver;
3668f302007SRui Paulo 	char			eeprom_domain[4];
367083e2167SBernhard Schmidt 	uint32_t		eeprom_crystal;
368083e2167SBernhard Schmidt 	int16_t			eeprom_temp;
369da8848ffSAdrian Chadd 	int16_t			eeprom_temp_high;
3703971d07bSSam Leffler 	int16_t			eeprom_voltage;
3713971d07bSSam Leffler 	int8_t			maxpwr2GHz;
3723971d07bSSam Leffler 	int8_t			maxpwr5GHz;
3738f302007SRui Paulo 	int8_t			maxpwr[IEEE80211_CHAN_MAX];
3748f302007SRui Paulo 
375da8848ffSAdrian Chadd 	uint32_t		tlv_feature_flags;
376da8848ffSAdrian Chadd 
3770f454b93SRui Paulo 	int32_t			temp_off;
3780f454b93SRui Paulo 	uint32_t		int_mask;
3798f302007SRui Paulo 	uint8_t			ntxchains;
3808f302007SRui Paulo 	uint8_t			nrxchains;
3810f454b93SRui Paulo 	uint8_t			txchainmask;
3820f454b93SRui Paulo 	uint8_t			rxchainmask;
3830f454b93SRui Paulo 	uint8_t			chainmask;
3848f302007SRui Paulo 
3858f302007SRui Paulo 	int			sc_tx_timer;
3868f302007SRui Paulo 
387fee842aaSAdrian Chadd 	/* Are we doing a scan? */
388fee842aaSAdrian Chadd 	int			sc_is_scanning;
389fee842aaSAdrian Chadd 
3903233d0c6SAdrian Chadd 	/* Are we waiting for a beacon before xmit? */
3913233d0c6SAdrian Chadd 	int			sc_beacon_wait;
3923233d0c6SAdrian Chadd 
39397fadf57SBernhard Schmidt 	struct ieee80211_tx_ampdu *qid2tap[IWN5000_NTXQUEUES];
39497fadf57SBernhard Schmidt 
395b2ad04c7SBernhard Schmidt 	int			(*sc_ampdu_rx_start)(struct ieee80211_node *,
396b2ad04c7SBernhard Schmidt 				    struct ieee80211_rx_ampdu *, int, int, int);
397b2ad04c7SBernhard Schmidt 	void			(*sc_ampdu_rx_stop)(struct ieee80211_node *,
398b2ad04c7SBernhard Schmidt 				    struct ieee80211_rx_ampdu *);
39997fadf57SBernhard Schmidt 	int			(*sc_addba_request)(struct ieee80211_node *,
40097fadf57SBernhard Schmidt 				    struct ieee80211_tx_ampdu *, int, int, int);
40197fadf57SBernhard Schmidt 	int			(*sc_addba_response)(struct ieee80211_node *,
40297fadf57SBernhard Schmidt 				    struct ieee80211_tx_ampdu *, int, int, int);
40397fadf57SBernhard Schmidt 	void			(*sc_addba_stop)(struct ieee80211_node *,
40497fadf57SBernhard Schmidt 				    struct ieee80211_tx_ampdu *);
40597fadf57SBernhard Schmidt 
406da8848ffSAdrian Chadd 	struct	iwn_led_mode sc_led;
407b2ad04c7SBernhard Schmidt 
4088f302007SRui Paulo 	struct iwn_rx_radiotap_header sc_rxtap;
4098f302007SRui Paulo 	struct iwn_tx_radiotap_header sc_txtap;
410da8848ffSAdrian Chadd 
411da8848ffSAdrian Chadd 	/* The power save level originally configured by user */
412da8848ffSAdrian Chadd 	int			desired_pwrsave_level;
413da8848ffSAdrian Chadd 
414da8848ffSAdrian Chadd 	/*
415da8848ffSAdrian Chadd 	 * The current power save level, this may differ from the
416da8848ffSAdrian Chadd 	 * configured value due to thermal throttling etc.
417da8848ffSAdrian Chadd 	 */
418da8848ffSAdrian Chadd 	int			current_pwrsave_level;
419da8848ffSAdrian Chadd 
420a704cc7fSAdrian Chadd 	/* For specific params */
421a704cc7fSAdrian Chadd 	const struct iwn_base_params *base_params;
422bc0203e2SAdrian Chadd 
423bc0203e2SAdrian Chadd #define	IWN_UCODE_API(ver)	(((ver) & 0x0000FF00) >> 8)
424bc0203e2SAdrian Chadd 	uint32_t		ucode_rev;
4253233d0c6SAdrian Chadd 
4263233d0c6SAdrian Chadd 	/*
4273233d0c6SAdrian Chadd 	 * Global queue for queuing xmit frames
4283233d0c6SAdrian Chadd 	 * when we can't yet transmit (eg raw
4293233d0c6SAdrian Chadd 	 * frames whilst waiting for beacons.)
4303233d0c6SAdrian Chadd 	 */
4313233d0c6SAdrian Chadd 	struct mbufq		sc_xmit_queue;
4323971d07bSSam Leffler };
4333971d07bSSam Leffler 
4343971d07bSSam Leffler #define IWN_LOCK_INIT(_sc) \
4353971d07bSSam Leffler 	mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \
4363971d07bSSam Leffler 	    MTX_NETWORK_LOCK, MTX_DEF)
4373971d07bSSam Leffler #define IWN_LOCK(_sc)			mtx_lock(&(_sc)->sc_mtx)
4383971d07bSSam Leffler #define IWN_LOCK_ASSERT(_sc)		mtx_assert(&(_sc)->sc_mtx, MA_OWNED)
4393971d07bSSam Leffler #define IWN_UNLOCK(_sc)			mtx_unlock(&(_sc)->sc_mtx)
4403971d07bSSam Leffler #define IWN_LOCK_DESTROY(_sc)		mtx_destroy(&(_sc)->sc_mtx)
441