1 | /* $NetBSD: if_iwnvar.h,v 1.17 2015/09/22 23:23:06 nonaka Exp $ */ |
2 | /* $OpenBSD: if_iwnvar.h,v 1.28 2014/09/09 18:55:08 sthen Exp $ */ |
3 | |
4 | /*- |
5 | * Copyright (c) 2007, 2008 |
6 | * Damien Bergamini <damien.bergamini@free.fr> |
7 | * |
8 | * Permission to use, copy, modify, and distribute this software for any |
9 | * purpose with or without fee is hereby granted, provided that the above |
10 | * copyright notice and this permission notice appear in all copies. |
11 | * |
12 | * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES |
13 | * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF |
14 | * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR |
15 | * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES |
16 | * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN |
17 | * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF |
18 | * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. |
19 | */ |
20 | |
21 | /* XXX Added for NetBSD */ |
22 | #define IEEE80211_NO_HT |
23 | |
24 | struct { |
25 | struct ieee80211_radiotap_header ; |
26 | uint64_t ; |
27 | uint8_t ; |
28 | uint8_t ; |
29 | uint16_t ; |
30 | uint16_t ; |
31 | int8_t ; |
32 | int8_t ; |
33 | } __packed; |
34 | |
35 | #define IWN_RX_RADIOTAP_PRESENT \ |
36 | ((1 << IEEE80211_RADIOTAP_TSFT) | \ |
37 | (1 << IEEE80211_RADIOTAP_FLAGS) | \ |
38 | (1 << IEEE80211_RADIOTAP_RATE) | \ |
39 | (1 << IEEE80211_RADIOTAP_CHANNEL) | \ |
40 | (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \ |
41 | (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)) |
42 | |
43 | struct { |
44 | struct ieee80211_radiotap_header ; |
45 | uint8_t ; |
46 | uint8_t ; |
47 | uint16_t ; |
48 | uint16_t ; |
49 | uint8_t ; |
50 | } __packed; |
51 | |
52 | #define IWN_TX_RADIOTAP_PRESENT \ |
53 | ((1 << IEEE80211_RADIOTAP_FLAGS) | \ |
54 | (1 << IEEE80211_RADIOTAP_RATE) | \ |
55 | (1 << IEEE80211_RADIOTAP_CHANNEL)) |
56 | /* XXX OpenBSD also includes IEEE80211_RADIOTAP_HWQUEUE */ |
57 | |
58 | struct iwn_dma_info { |
59 | bus_dma_tag_t tag; |
60 | bus_dmamap_t map; |
61 | bus_dma_segment_t seg; |
62 | bus_addr_t paddr; |
63 | void * vaddr; |
64 | bus_size_t size; |
65 | }; |
66 | |
67 | struct iwn_tx_data { |
68 | bus_dmamap_t map; |
69 | bus_addr_t cmd_paddr; |
70 | bus_addr_t scratch_paddr; |
71 | struct mbuf *m; |
72 | struct ieee80211_node *ni; |
73 | }; |
74 | |
75 | struct iwn_tx_ring { |
76 | struct iwn_dma_info desc_dma; |
77 | struct iwn_dma_info cmd_dma; |
78 | struct iwn_tx_desc *desc; |
79 | struct iwn_tx_cmd *cmd; |
80 | struct iwn_tx_data data[IWN_TX_RING_COUNT]; |
81 | int qid; |
82 | int queued; |
83 | int cur; |
84 | }; |
85 | |
86 | #define IWN_RBUF_COUNT (IWN_RX_RING_COUNT + 32) |
87 | |
88 | struct iwn_softc; |
89 | |
90 | struct iwn_rbuf { |
91 | struct iwn_softc *sc; |
92 | void * vaddr; |
93 | bus_addr_t paddr; |
94 | SLIST_ENTRY(iwn_rbuf) next; |
95 | }; |
96 | |
97 | struct iwn_rx_data { |
98 | struct mbuf *m; |
99 | bus_dmamap_t map; |
100 | }; |
101 | |
102 | struct iwn_rx_ring { |
103 | struct iwn_dma_info desc_dma; |
104 | struct iwn_dma_info stat_dma; |
105 | struct iwn_dma_info buf_dma; |
106 | uint32_t *desc; |
107 | struct iwn_rx_status *stat; |
108 | struct iwn_rx_data data[IWN_RX_RING_COUNT]; |
109 | struct iwn_rbuf rbuf[IWN_RBUF_COUNT]; |
110 | kmutex_t freelist_mtx; |
111 | SLIST_HEAD(, iwn_rbuf) freelist; |
112 | int nb_free_entries; |
113 | int cur; |
114 | }; |
115 | |
116 | struct iwn_node { |
117 | struct ieee80211_node ni; /* must be the first */ |
118 | struct ieee80211_amrr_node amn; |
119 | uint16_t disable_tid; |
120 | uint8_t id; |
121 | uint8_t ridx[IEEE80211_RATE_MAXSIZE]; |
122 | }; |
123 | |
124 | struct iwn_calib_state { |
125 | uint8_t state; |
126 | #define IWN_CALIB_STATE_INIT 0 |
127 | #define IWN_CALIB_STATE_ASSOC 1 |
128 | #define IWN_CALIB_STATE_RUN 2 |
129 | |
130 | u_int nbeacons; |
131 | uint32_t noise[3]; |
132 | uint32_t [3]; |
133 | uint32_t ofdm_x1; |
134 | uint32_t ofdm_mrc_x1; |
135 | uint32_t ofdm_x4; |
136 | uint32_t ofdm_mrc_x4; |
137 | uint32_t cck_x4; |
138 | uint32_t cck_mrc_x4; |
139 | uint32_t bad_plcp_ofdm; |
140 | uint32_t fa_ofdm; |
141 | uint32_t bad_plcp_cck; |
142 | uint32_t fa_cck; |
143 | uint32_t low_fa; |
144 | uint8_t cck_state; |
145 | #define IWN_CCK_STATE_INIT 0 |
146 | #define IWN_CCK_STATE_LOFA 1 |
147 | #define IWN_CCK_STATE_HIFA 2 |
148 | |
149 | uint8_t noise_samples[20]; |
150 | u_int cur_noise_sample; |
151 | uint8_t noise_ref; |
152 | uint32_t energy_samples[10]; |
153 | u_int cur_energy_sample; |
154 | uint32_t energy_cck; |
155 | }; |
156 | |
157 | struct iwn_calib_info { |
158 | uint8_t *buf; |
159 | u_int len; |
160 | }; |
161 | |
162 | struct iwn_fw_part { |
163 | const uint8_t *text; |
164 | uint32_t textsz; |
165 | const uint8_t *data; |
166 | uint32_t datasz; |
167 | }; |
168 | |
169 | struct iwn_fw_info { |
170 | u_char *data; |
171 | size_t size; |
172 | struct iwn_fw_part init; |
173 | struct iwn_fw_part main; |
174 | struct iwn_fw_part boot; |
175 | }; |
176 | |
177 | struct iwn_ops { |
178 | int (*load_firmware)(struct iwn_softc *); |
179 | void (*read_eeprom)(struct iwn_softc *); |
180 | int (*post_alive)(struct iwn_softc *); |
181 | int (*nic_config)(struct iwn_softc *); |
182 | int (*config_bt_coex)(struct iwn_softc *); |
183 | void (*update_sched)(struct iwn_softc *, int, int, uint8_t, |
184 | uint16_t); |
185 | int (*get_temperature)(struct iwn_softc *); |
186 | int (*)(const struct iwn_rx_stat *); |
187 | int (*set_txpower)(struct iwn_softc *, int); |
188 | int (*init_gains)(struct iwn_softc *); |
189 | int (*set_gains)(struct iwn_softc *); |
190 | int (*add_node)(struct iwn_softc *, struct iwn_node_info *, |
191 | int); |
192 | void (*tx_done)(struct iwn_softc *, struct iwn_rx_desc *, |
193 | struct iwn_rx_data *); |
194 | #ifndef IEEE80211_NO_HT |
195 | void (*ampdu_tx_start)(struct iwn_softc *, |
196 | struct ieee80211_node *, uint8_t, uint16_t); |
197 | void (*ampdu_tx_stop)(struct iwn_softc *, uint8_t, |
198 | uint16_t); |
199 | #endif |
200 | }; |
201 | |
202 | struct iwn_softc { |
203 | device_t sc_dev; |
204 | |
205 | struct ethercom sc_ec; |
206 | struct ieee80211com sc_ic; |
207 | int (*sc_newstate)(struct ieee80211com *, |
208 | enum ieee80211_state, int); |
209 | |
210 | struct ieee80211_amrr amrr; |
211 | uint8_t fixed_ridx; |
212 | |
213 | bus_dma_tag_t sc_dmat; |
214 | |
215 | u_int sc_flags; |
216 | #define IWN_FLAG_HAS_5GHZ (1 << 0) |
217 | #define IWN_FLAG_HAS_OTPROM (1 << 1) |
218 | #define IWN_FLAG_CALIB_DONE (1 << 2) |
219 | #define IWN_FLAG_USE_ICT (1 << 3) |
220 | #define IWN_FLAG_INTERNAL_PA (1 << 4) |
221 | #define IWN_FLAG_HAS_11N (1 << 6) |
222 | #define IWN_FLAG_ENH_SENS (1 << 7) |
223 | /* Added for NetBSD */ |
224 | #define IWN_FLAG_HW_INITED (1 << 8) |
225 | #define IWN_FLAG_SCANNING_2GHZ (1 << 9) |
226 | #define IWN_FLAG_SCANNING_5GHZ (1 << 10) |
227 | #define IWN_FLAG_SCANNING (IWN_FLAG_SCANNING_2GHZ|IWN_FLAG_SCANNING_5GHZ) |
228 | |
229 | uint8_t hw_type; |
230 | |
231 | struct iwn_ops ops; |
232 | const char *fwname; |
233 | const struct iwn_sensitivity_limits |
234 | *limits; |
235 | int ntxqs; |
236 | int ndmachnls; |
237 | uint8_t broadcast_id; |
238 | int rxonsz; |
239 | int schedsz; |
240 | uint32_t fw_text_maxsz; |
241 | uint32_t fw_data_maxsz; |
242 | uint32_t fwsz; |
243 | bus_size_t sched_txfact_addr; |
244 | |
245 | /* TX scheduler rings. */ |
246 | struct iwn_dma_info sched_dma; |
247 | uint16_t *sched; |
248 | uint32_t sched_base; |
249 | |
250 | /* "Keep Warm" page. */ |
251 | struct iwn_dma_info kw_dma; |
252 | |
253 | /* Firmware DMA transfer. */ |
254 | struct iwn_dma_info fw_dma; |
255 | |
256 | /* ICT table. */ |
257 | struct iwn_dma_info ict_dma; |
258 | uint32_t *ict; |
259 | int ict_cur; |
260 | |
261 | /* TX/RX rings. */ |
262 | struct iwn_tx_ring txq[IWN5000_NTXQUEUES]; |
263 | struct iwn_rx_ring rxq; |
264 | |
265 | bus_space_tag_t sc_st; |
266 | bus_space_handle_t sc_sh; |
267 | void *sc_ih; |
268 | pci_chipset_tag_t sc_pct; |
269 | pcitag_t sc_pcitag; |
270 | bus_size_t sc_sz; |
271 | int sc_cap_off; /* PCIe Capabilities. */ |
272 | struct sysmon_envsys *sc_sme; |
273 | envsys_data_t sc_sensor; |
274 | callout_t calib_to; |
275 | int calib_cnt; |
276 | struct iwn_calib_state calib; |
277 | |
278 | struct iwn_fw_info fw; |
279 | struct iwn_calib_info calibcmd[5]; |
280 | uint32_t errptr; |
281 | |
282 | struct iwn_rx_stat last_rx_stat; |
283 | int last_rx_valid; |
284 | struct iwn_ucode_info ucode_info; |
285 | struct iwn_rxon rxon; |
286 | uint32_t rawtemp; |
287 | int temp; |
288 | int noise; |
289 | uint32_t qfullmsk; |
290 | |
291 | uint32_t prom_base; |
292 | struct iwn4965_eeprom_band |
293 | bands[IWN_NBANDS]; |
294 | uint16_t rfcfg; |
295 | uint8_t calib_ver; |
296 | char eeprom_domain[4]; |
297 | uint32_t eeprom_crystal; |
298 | int16_t eeprom_temp; |
299 | int16_t eeprom_voltage; |
300 | int16_t eeprom_rawtemp; |
301 | int8_t maxpwr2GHz; |
302 | int8_t maxpwr5GHz; |
303 | int8_t maxpwr[IEEE80211_CHAN_MAX]; |
304 | int8_t enh_maxpwr[35]; |
305 | |
306 | uint8_t reset_noise_gain; |
307 | uint8_t noise_gain; |
308 | |
309 | uint32_t tlv_feature_flags; |
310 | |
311 | int32_t temp_off; |
312 | uint32_t int_mask; |
313 | uint8_t ntxchains; |
314 | uint8_t nrxchains; |
315 | uint8_t txchainmask; |
316 | uint8_t rxchainmask; |
317 | uint8_t chainmask; |
318 | |
319 | int sc_tx_timer; |
320 | void *powerhook; |
321 | |
322 | struct bpf_if * sc_drvbpf; |
323 | |
324 | union { |
325 | struct iwn_rx_radiotap_header th; |
326 | uint8_t pad[IEEE80211_RADIOTAP_HDRLEN]; |
327 | } sc_rxtapu; |
328 | #define sc_rxtap sc_rxtapu.th |
329 | int sc_rxtap_len; |
330 | |
331 | union { |
332 | struct iwn_tx_radiotap_header th; |
333 | uint8_t pad[IEEE80211_RADIOTAP_HDRLEN]; |
334 | } sc_txtapu; |
335 | #define sc_txtap sc_txtapu.th |
336 | int sc_txtap_len; |
337 | |
338 | kmutex_t sc_mtx; /* mutex for init/stop */ |
339 | |
340 | }; |
341 | |
342 | |