xref: /freebsd/sys/dev/iwn/if_iwnvar.h (revision 5861f9665471e98e544f6fa3ce73c4912229ff82)
1 /*	$FreeBSD$	*/
2 /*-
3  * Copyright (c) 2007
4  *	Damien Bergamini <damien.bergamini@free.fr>
5  * Copyright (c) 2008 Sam Leffler, Errno Consulting
6  *
7  * Permission to use, copy, modify, and distribute this software for any
8  * purpose with or without fee is hereby granted, provided that the above
9  * copyright notice and this permission notice appear in all copies.
10  *
11  * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
12  * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
13  * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
14  * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
15  * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
16  * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
17  * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
18  */
19 
20 struct iwn_rx_radiotap_header {
21 	struct ieee80211_radiotap_header wr_ihdr;
22 	uint64_t	wr_tsft;
23 	uint8_t		wr_flags;
24 	uint8_t		wr_rate;
25 	uint16_t	wr_chan_freq;
26 	uint16_t	wr_chan_flags;
27 	int8_t		wr_dbm_antsignal;
28 	int8_t		wr_dbm_antnoise;
29 } __packed;
30 
31 #define IWN_RX_RADIOTAP_PRESENT						\
32 	((1 << IEEE80211_RADIOTAP_TSFT) |				\
33 	 (1 << IEEE80211_RADIOTAP_FLAGS) |				\
34 	 (1 << IEEE80211_RADIOTAP_RATE) |				\
35 	 (1 << IEEE80211_RADIOTAP_CHANNEL) |				\
36 	 (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) |			\
37 	 (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE))
38 
39 struct iwn_tx_radiotap_header {
40 	struct ieee80211_radiotap_header wt_ihdr;
41 	uint8_t		wt_flags;
42 	uint8_t		wt_rate;
43 	uint16_t	wt_chan_freq;
44 	uint16_t	wt_chan_flags;
45 } __packed;
46 
47 #define IWN_TX_RADIOTAP_PRESENT						\
48 	((1 << IEEE80211_RADIOTAP_FLAGS) |				\
49 	 (1 << IEEE80211_RADIOTAP_RATE) |				\
50 	 (1 << IEEE80211_RADIOTAP_CHANNEL))
51 
52 struct iwn_dma_info {
53 	bus_dma_tag_t		tag;
54 	bus_dmamap_t		map;
55 	bus_dma_segment_t	seg;
56 	bus_addr_t		paddr;
57 	caddr_t			vaddr;
58 	bus_size_t		size;
59 };
60 
61 struct iwn_tx_data {
62 	bus_dmamap_t		map;
63 	struct mbuf		*m;
64 	struct ieee80211_node	*ni;
65 };
66 
67 struct iwn_tx_ring {
68 	struct iwn_dma_info	desc_dma;
69 	struct iwn_dma_info	cmd_dma;
70 	struct iwn_tx_desc	*desc;
71 	struct iwn_tx_cmd	*cmd;
72 	struct iwn_tx_data	data[IWN_TX_RING_COUNT];
73 	bus_dma_tag_t		data_dmat;
74 	int			qid;
75 	int			queued;
76 	int			cur;
77 };
78 
79 struct iwn_rx_data {
80 	bus_dmamap_t		map;
81 	struct mbuf		*m;
82 };
83 
84 struct iwn_rx_ring {
85 	struct iwn_dma_info	desc_dma;
86 	uint32_t		*desc;
87 	struct iwn_rx_data	data[IWN_RX_RING_COUNT];
88 	bus_dma_tag_t		data_dmat;
89 	int			cur;
90 };
91 
92 struct iwn_node {
93 	struct	ieee80211_node		ni;	/* must be the first */
94 	struct	ieee80211_amrr_node	amn;
95 };
96 #define	IWN_NODE(_ni)	((struct iwn_node *)(_ni))
97 
98 struct iwn_calib_state {
99 	uint8_t		state;
100 #define IWN_CALIB_STATE_INIT	0
101 #define IWN_CALIB_STATE_ASSOC	1
102 #define IWN_CALIB_STATE_RUN	2
103 	u_int		nbeacons;
104 	uint32_t	noise[3];
105 	uint32_t	rssi[3];
106 	uint32_t	corr_ofdm_x1;
107 	uint32_t	corr_ofdm_mrc_x1;
108 	uint32_t	corr_ofdm_x4;
109 	uint32_t	corr_ofdm_mrc_x4;
110 	uint32_t	corr_cck_x4;
111 	uint32_t	corr_cck_mrc_x4;
112 	uint32_t	bad_plcp_ofdm;
113 	uint32_t	fa_ofdm;
114 	uint32_t	bad_plcp_cck;
115 	uint32_t	fa_cck;
116 	uint32_t	low_fa;
117 	uint8_t		cck_state;
118 #define IWN_CCK_STATE_INIT	0
119 #define IWN_CCK_STATE_LOFA	1
120 #define IWN_CCK_STATE_HIFA	2
121 	uint8_t		noise_samples[20];
122 	u_int		cur_noise_sample;
123 	uint8_t		noise_ref;
124 	uint32_t	energy_samples[10];
125 	u_int		cur_energy_sample;
126 	uint32_t	energy_cck;
127 };
128 
129 struct iwn_vap {
130 	struct ieee80211vap	iv_vap;
131 	struct ieee80211_amrr	iv_amrr;
132 	struct callout		iv_amrr_to;
133 
134 	int			(*iv_newstate)(struct ieee80211vap *,
135 				    enum ieee80211_state, int);
136 };
137 #define	IWN_VAP(_vap)	((struct iwn_vap *)(_vap))
138 
139 struct iwn_softc {
140 	struct ifnet		*sc_ifp;
141 	int			sc_debug;
142 	struct callout		sc_timer_to;	/* calib+watchdog timer */
143 	int			sc_tx_timer;	/* tx watchdog timer/counter */
144 	const struct ieee80211_channel *sc_curchan;
145 
146         struct iwn_rx_radiotap_header sc_rxtap;
147         struct iwn_tx_radiotap_header sc_txtap;
148 
149 	/* locks */
150 	struct mtx		sc_mtx;
151 
152 	/* bus */
153 	device_t 		sc_dev;
154 	int			mem_rid;
155 	int			irq_rid;
156 	struct resource 	*mem;
157 	struct resource		*irq;
158 
159 	/* shared area */
160 	struct iwn_dma_info	shared_dma;
161 	struct iwn_shared	*shared;
162 
163 	/* "keep warm" page */
164 	struct iwn_dma_info	kw_dma;
165 
166 	/* firmware image */
167 	const struct firmware	*fw_fp;
168 
169 	/* firmware DMA transfer */
170 	struct iwn_dma_info	fw_dma;
171 
172 	/* rings */
173 	struct iwn_tx_ring	txq[IWN_NTXQUEUES];
174 	struct iwn_rx_ring	rxq;
175 
176 	bus_space_tag_t		sc_st;
177 	bus_space_handle_t	sc_sh;
178 	void 			*sc_ih;
179 	bus_size_t		sc_sz;
180 
181 	/* Tasks used by the driver */
182 	struct task             sc_reinit_task;
183 	struct task		sc_radioon_task;
184 	struct task		sc_radiooff_task;
185 
186 	/* Thermal calibration */
187 	int			calib_cnt;
188 	struct iwn_calib_state	calib;
189 
190 	struct iwn_rx_stat	last_rx_stat;
191 	int			last_rx_valid;
192 	struct iwn_ucode_info	ucode_info;
193 	struct iwn_config	config;
194 	uint32_t		rawtemp;
195 	int			temp;
196 	int			noise;
197 	uint8_t			antmsk;
198 
199 	struct iwn_eeprom_band	bands[IWN_NBANDS];
200 	int16_t			eeprom_voltage;
201 	int8_t			maxpwr2GHz;
202 	int8_t			maxpwr5GHz;
203 };
204 
205 #define IWN_LOCK_INIT(_sc) \
206 	mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \
207 	     MTX_NETWORK_LOCK, MTX_DEF)
208 #define IWN_LOCK(_sc)			mtx_lock(&(_sc)->sc_mtx)
209 #define IWN_LOCK_ASSERT(_sc)		mtx_assert(&(_sc)->sc_mtx, MA_OWNED)
210 #define IWN_UNLOCK(_sc)			mtx_unlock(&(_sc)->sc_mtx)
211 #define IWN_LOCK_DESTROY(_sc)		mtx_destroy(&(_sc)->sc_mtx)
212