if_iwnvar.h revision 178676
1178676Ssam/*	$FreeBSD: head/sys/dev/iwn/if_iwnvar.h 178676 2008-04-29 21:36:17Z sam $	*/
2178676Ssam/*-
3178676Ssam * Copyright (c) 2007
4178676Ssam *	Damien Bergamini <damien.bergamini@free.fr>
5178676Ssam * Copyright (c) 2008 Sam Leffler, Errno Consulting
6178676Ssam *
7178676Ssam * Permission to use, copy, modify, and distribute this software for any
8178676Ssam * purpose with or without fee is hereby granted, provided that the above
9178676Ssam * copyright notice and this permission notice appear in all copies.
10178676Ssam *
11178676Ssam * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12178676Ssam * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13178676Ssam * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14178676Ssam * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15178676Ssam * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16178676Ssam * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17178676Ssam * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18178676Ssam */
19178676Ssam
20178676Ssamstruct iwn_rx_radiotap_header {
21178676Ssam	struct ieee80211_radiotap_header wr_ihdr;
22178676Ssam	uint64_t	wr_tsft;
23178676Ssam	uint8_t		wr_flags;
24178676Ssam	uint8_t		wr_rate;
25178676Ssam	uint16_t	wr_chan_freq;
26178676Ssam	uint16_t	wr_chan_flags;
27178676Ssam	int8_t		wr_dbm_antsignal;
28178676Ssam	int8_t		wr_dbm_antnoise;
29178676Ssam} __packed;
30178676Ssam
31178676Ssam#define IWN_RX_RADIOTAP_PRESENT						\
32178676Ssam	((1 << IEEE80211_RADIOTAP_TSFT) |				\
33178676Ssam	 (1 << IEEE80211_RADIOTAP_FLAGS) |				\
34178676Ssam	 (1 << IEEE80211_RADIOTAP_RATE) |				\
35178676Ssam	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
36178676Ssam	 (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) |			\
37178676Ssam	 (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE))
38178676Ssam
39178676Ssamstruct iwn_tx_radiotap_header {
40178676Ssam	struct ieee80211_radiotap_header wt_ihdr;
41178676Ssam	uint8_t		wt_flags;
42178676Ssam	uint8_t		wt_rate;
43178676Ssam	uint16_t	wt_chan_freq;
44178676Ssam	uint16_t	wt_chan_flags;
45178676Ssam} __packed;
46178676Ssam
47178676Ssam#define IWN_TX_RADIOTAP_PRESENT						\
48178676Ssam	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
49178676Ssam	 (1 << IEEE80211_RADIOTAP_RATE) |				\
50178676Ssam	 (1 << IEEE80211_RADIOTAP_CHANNEL))
51178676Ssam
52178676Ssamstruct iwn_dma_info {
53178676Ssam	bus_dma_tag_t		tag;
54178676Ssam	bus_dmamap_t		map;
55178676Ssam	bus_dma_segment_t	seg;
56178676Ssam	bus_addr_t		paddr;
57178676Ssam	caddr_t			vaddr;
58178676Ssam	bus_size_t		size;
59178676Ssam};
60178676Ssam
61178676Ssamstruct iwn_tx_data {
62178676Ssam	bus_dmamap_t		map;
63178676Ssam	struct mbuf		*m;
64178676Ssam	struct ieee80211_node	*ni;
65178676Ssam};
66178676Ssam
67178676Ssamstruct iwn_tx_ring {
68178676Ssam	struct iwn_dma_info	desc_dma;
69178676Ssam	struct iwn_dma_info	cmd_dma;
70178676Ssam	struct iwn_tx_desc	*desc;
71178676Ssam	struct iwn_tx_cmd	*cmd;
72178676Ssam	struct iwn_tx_data	data[IWN_TX_RING_COUNT];
73178676Ssam	bus_dma_tag_t		data_dmat;
74178676Ssam	int			qid;
75178676Ssam	int			queued;
76178676Ssam	int			cur;
77178676Ssam};
78178676Ssam
79178676Ssamstruct iwn_rx_data {
80178676Ssam	bus_dmamap_t		map;
81178676Ssam	struct mbuf		*m;
82178676Ssam};
83178676Ssam
84178676Ssamstruct iwn_rx_ring {
85178676Ssam	struct iwn_dma_info	desc_dma;
86178676Ssam	uint32_t		*desc;
87178676Ssam	struct iwn_rx_data	data[IWN_RX_RING_COUNT];
88178676Ssam	bus_dma_tag_t		data_dmat;
89178676Ssam	int			cur;
90178676Ssam};
91178676Ssam
92178676Ssamstruct iwn_node {
93178676Ssam	struct	ieee80211_node		ni;	/* must be the first */
94178676Ssam	struct	ieee80211_amrr_node	amn;
95178676Ssam};
96178676Ssam#define	IWN_NODE(_ni)	((struct iwn_node *)(_ni))
97178676Ssam
98178676Ssamstruct iwn_calib_state {
99178676Ssam	uint8_t		state;
100178676Ssam#define IWN_CALIB_STATE_INIT	0
101178676Ssam#define IWN_CALIB_STATE_ASSOC	1
102178676Ssam#define IWN_CALIB_STATE_RUN	2
103178676Ssam	u_int		nbeacons;
104178676Ssam	uint32_t	noise[3];
105178676Ssam	uint32_t	rssi[3];
106178676Ssam	uint32_t	corr_ofdm_x1;
107178676Ssam	uint32_t	corr_ofdm_mrc_x1;
108178676Ssam	uint32_t	corr_ofdm_x4;
109178676Ssam	uint32_t	corr_ofdm_mrc_x4;
110178676Ssam	uint32_t	corr_cck_x4;
111178676Ssam	uint32_t	corr_cck_mrc_x4;
112178676Ssam	uint32_t	bad_plcp_ofdm;
113178676Ssam	uint32_t	fa_ofdm;
114178676Ssam	uint32_t	bad_plcp_cck;
115178676Ssam	uint32_t	fa_cck;
116178676Ssam	uint32_t	low_fa;
117178676Ssam	uint8_t		cck_state;
118178676Ssam#define IWN_CCK_STATE_INIT	0
119178676Ssam#define IWN_CCK_STATE_LOFA	1
120178676Ssam#define IWN_CCK_STATE_HIFA	2
121178676Ssam	uint8_t		noise_samples[20];
122178676Ssam	u_int		cur_noise_sample;
123178676Ssam	uint8_t		noise_ref;
124178676Ssam	uint32_t	energy_samples[10];
125178676Ssam	u_int		cur_energy_sample;
126178676Ssam	uint32_t	energy_cck;
127178676Ssam};
128178676Ssam
129178676Ssamstruct iwn_vap {
130178676Ssam	struct ieee80211vap	iv_vap;
131178676Ssam	struct ieee80211_amrr	iv_amrr;
132178676Ssam	struct callout		iv_amrr_to;
133178676Ssam
134178676Ssam	int			(*iv_newstate)(struct ieee80211vap *,
135178676Ssam				    enum ieee80211_state, int);
136178676Ssam};
137178676Ssam#define	IWN_VAP(_vap)	((struct iwn_vap *)(_vap))
138178676Ssam
139178676Ssamstruct iwn_softc {
140178676Ssam	struct ifnet		*sc_ifp;
141178676Ssam	int			sc_debug;
142178676Ssam	struct callout		sc_timer_to;	/* calib+watchdog timer */
143178676Ssam	int			sc_tx_timer;	/* tx watchdog timer/counter */
144178676Ssam	const struct ieee80211_channel *sc_curchan;
145178676Ssam
146178676Ssam        struct iwn_rx_radiotap_header sc_rxtap;
147178676Ssam        int                     sc_rxtap_len;
148178676Ssam        struct iwn_tx_radiotap_header sc_txtap;
149178676Ssam        int                     sc_txtap_len;
150178676Ssam
151178676Ssam	/* locks */
152178676Ssam	struct mtx		sc_mtx;
153178676Ssam
154178676Ssam	/* bus */
155178676Ssam	device_t 		sc_dev;
156178676Ssam	int			mem_rid;
157178676Ssam	int			irq_rid;
158178676Ssam	struct resource 	*mem;
159178676Ssam	struct resource		*irq;
160178676Ssam
161178676Ssam	/* shared area */
162178676Ssam	struct iwn_dma_info	shared_dma;
163178676Ssam	struct iwn_shared	*shared;
164178676Ssam
165178676Ssam	/* "keep warm" page */
166178676Ssam	struct iwn_dma_info	kw_dma;
167178676Ssam
168178676Ssam	/* firmware image */
169178676Ssam	const struct firmware	*fw_fp;
170178676Ssam
171178676Ssam	/* firmware DMA transfer */
172178676Ssam	struct iwn_dma_info	fw_dma;
173178676Ssam
174178676Ssam	/* rings */
175178676Ssam	struct iwn_tx_ring	txq[IWN_NTXQUEUES];
176178676Ssam	struct iwn_rx_ring	rxq;
177178676Ssam
178178676Ssam	bus_space_tag_t		sc_st;
179178676Ssam	bus_space_handle_t	sc_sh;
180178676Ssam	void 			*sc_ih;
181178676Ssam	bus_size_t		sc_sz;
182178676Ssam
183178676Ssam        /* command queue related variables */
184178676Ssam#define IWN_SCAN_START		(1<<0)
185178676Ssam#define IWN_SCAN_CURCHAN	(1<<1)
186178676Ssam#define IWN_SCAN_STOP		(1<<2)
187178676Ssam#define IWN_SET_CHAN		(1<<3)
188178676Ssam#define IWN_AUTH		(1<<4)
189178676Ssam#define IWN_SCAN_NEXT		(1<<5)
190178676Ssam#define IWN_RUN			(1<<6)
191178676Ssam#define IWN_RADIO_ENABLE	(1<<7)
192178676Ssam#define IWN_RADIO_DISABLE	(1<<8)
193178676Ssam#define IWN_REINIT		(1<<9)
194178676Ssam#define IWN_CMD_MAXOPS		10
195178676Ssam	/* command queuing request type */
196178676Ssam#define IWN_QUEUE_NORMAL	0
197178676Ssam#define IWN_QUEUE_CLEAR		1
198178676Ssam        int                     sc_cmd[IWN_CMD_MAXOPS];
199178676Ssam        int                     sc_cmd_arg[IWN_CMD_MAXOPS];
200178676Ssam        int                     sc_cmd_cur;    /* current queued scan task */
201178676Ssam        int                     sc_cmd_next;   /* last queued scan task */
202178676Ssam        struct mtx              sc_cmdlock;
203178676Ssam
204178676Ssam	/* Task queues used to control the driver */
205178676Ssam	struct taskqueue         *sc_tq; /* Main command task queue */
206178676Ssam
207178676Ssam	/* Tasks used by the driver */
208178676Ssam	struct task             sc_ops_task;	/* deferred ops */
209178676Ssam	struct task		sc_bmiss_task;	/* beacon miss */
210178676Ssam
211178676Ssam	/* Thermal calibration */
212178676Ssam	int			calib_cnt;
213178676Ssam	struct iwn_calib_state	calib;
214178676Ssam
215178676Ssam	struct iwn_rx_stat	last_rx_stat;
216178676Ssam	int			last_rx_valid;
217178676Ssam	struct iwn_ucode_info	ucode_info;
218178676Ssam	struct iwn_config	config;
219178676Ssam	uint32_t		rawtemp;
220178676Ssam	int			temp;
221178676Ssam	int			noise;
222178676Ssam	uint8_t			antmsk;
223178676Ssam
224178676Ssam	struct iwn_eeprom_band	bands[IWN_NBANDS];
225178676Ssam	int16_t			eeprom_voltage;
226178676Ssam	int8_t			maxpwr2GHz;
227178676Ssam	int8_t			maxpwr5GHz;
228178676Ssam};
229178676Ssam
230178676Ssam#define IWN_LOCK_INIT(_sc) \
231178676Ssam	mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \
232178676Ssam	     MTX_NETWORK_LOCK, MTX_DEF)
233178676Ssam#define IWN_LOCK(_sc)			mtx_lock(&(_sc)->sc_mtx)
234178676Ssam#define IWN_LOCK_ASSERT(_sc)		mtx_assert(&(_sc)->sc_mtx, MA_OWNED)
235178676Ssam#define IWN_UNLOCK(_sc)			mtx_unlock(&(_sc)->sc_mtx)
236178676Ssam#define IWN_LOCK_DESTROY(_sc)		mtx_destroy(&(_sc)->sc_mtx)
237178676Ssam#define IWN_CMD_LOCK_INIT(_sc) \
238178676Ssam	mtx_init(&(_sc)->sc_cmdlock, device_get_nameunit((_sc)->sc_dev), \
239178676Ssam	     NULL, MTX_DEF);
240178676Ssam#define IWN_CMD_LOCK_DESTROY(_sc)	mtx_destroy(&(_sc)->sc_cmdlock)
241178676Ssam#define IWN_CMD_LOCK(_sc)		mtx_lock(&(_sc)->sc_cmdlock)
242178676Ssam#define IWN_CMD_UNLOCK(_sc)		mtx_unlock(&(_sc)->sc_cmdlock)
243