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]; 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 */ 422