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