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