17832b1f6SBernhard Schmidt /* $OpenBSD: if_iwnvar.h,v 1.18 2010/04/30 16:06:46 damien Exp $ */ 28f302007SRui Paulo 33971d07bSSam Leffler /*- 4da8848ffSAdrian Chadd * Copyright (c) 2013 Cedric GROSS <cg@cgross.info> 5da8848ffSAdrian Chadd * Copyright (c) 2011 Intel Corporation 68f302007SRui Paulo * Copyright (c) 2007, 2008 73971d07bSSam Leffler * Damien Bergamini <damien.bergamini@free.fr> 83971d07bSSam Leffler * Copyright (c) 2008 Sam Leffler, Errno Consulting 93971d07bSSam Leffler * 103971d07bSSam Leffler * Permission to use, copy, modify, and distribute this software for any 113971d07bSSam Leffler * purpose with or without fee is hereby granted, provided that the above 123971d07bSSam Leffler * copyright notice and this permission notice appear in all copies. 133971d07bSSam Leffler * 143971d07bSSam Leffler * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 153971d07bSSam Leffler * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 163971d07bSSam Leffler * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 173971d07bSSam Leffler * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 183971d07bSSam Leffler * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 193971d07bSSam Leffler * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 203971d07bSSam Leffler * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 213971d07bSSam Leffler */ 22da8848ffSAdrian Chadd enum iwn_rxon_ctx_id { 23da8848ffSAdrian Chadd IWN_RXON_BSS_CTX, 24da8848ffSAdrian Chadd IWN_RXON_PAN_CTX, 25da8848ffSAdrian Chadd IWN_NUM_RXON_CTX 26da8848ffSAdrian Chadd }; 27da8848ffSAdrian Chadd 28da8848ffSAdrian Chadd struct iwn_pan_slot { 29da8848ffSAdrian Chadd uint16_t time; 30da8848ffSAdrian Chadd uint8_t type; 31da8848ffSAdrian Chadd uint8_t reserved; 32da8848ffSAdrian Chadd } __packed; 33da8848ffSAdrian Chadd 34da8848ffSAdrian Chadd struct iwn_pan_params_cmd { 35da8848ffSAdrian Chadd uint16_t flags; 36da8848ffSAdrian Chadd #define IWN_PAN_PARAMS_FLG_SLOTTED_MODE (1 << 3) 37da8848ffSAdrian Chadd 38da8848ffSAdrian Chadd uint8_t reserved; 39da8848ffSAdrian Chadd uint8_t num_slots; 40da8848ffSAdrian Chadd struct iwn_pan_slot slots[10]; 41da8848ffSAdrian Chadd } __packed; 42da8848ffSAdrian Chadd 43da8848ffSAdrian Chadd struct iwn_led_mode 44da8848ffSAdrian Chadd { 45da8848ffSAdrian Chadd uint8_t led_cur_mode; 46da8848ffSAdrian Chadd uint64_t led_cur_bt; 47da8848ffSAdrian Chadd uint64_t led_last_bt; 48da8848ffSAdrian Chadd uint64_t led_cur_tpt; 49da8848ffSAdrian Chadd uint64_t led_last_tpt; 50da8848ffSAdrian Chadd uint64_t led_bt_diff; 51da8848ffSAdrian Chadd int led_cur_time; 52da8848ffSAdrian Chadd int led_last_time; 53da8848ffSAdrian Chadd }; 543971d07bSSam Leffler 553971d07bSSam Leffler struct iwn_rx_radiotap_header { 563971d07bSSam Leffler struct ieee80211_radiotap_header wr_ihdr; 573971d07bSSam Leffler uint64_t wr_tsft; 583971d07bSSam Leffler uint8_t wr_flags; 593971d07bSSam Leffler uint8_t wr_rate; 603971d07bSSam Leffler uint16_t wr_chan_freq; 613971d07bSSam Leffler uint16_t wr_chan_flags; 623971d07bSSam Leffler int8_t wr_dbm_antsignal; 633971d07bSSam Leffler int8_t wr_dbm_antnoise; 64*786ac703SAndriy Voskoboinyk } __packed __aligned(8); 653971d07bSSam Leffler 663971d07bSSam Leffler #define IWN_RX_RADIOTAP_PRESENT \ 673971d07bSSam Leffler ((1 << IEEE80211_RADIOTAP_TSFT) | \ 683971d07bSSam Leffler (1 << IEEE80211_RADIOTAP_FLAGS) | \ 693971d07bSSam Leffler (1 << IEEE80211_RADIOTAP_RATE) | \ 703971d07bSSam Leffler (1 << IEEE80211_RADIOTAP_CHANNEL) | \ 713971d07bSSam Leffler (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \ 723971d07bSSam Leffler (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)) 733971d07bSSam Leffler 743971d07bSSam Leffler struct iwn_tx_radiotap_header { 753971d07bSSam Leffler struct ieee80211_radiotap_header wt_ihdr; 763971d07bSSam Leffler uint8_t wt_flags; 773971d07bSSam Leffler uint8_t wt_rate; 783971d07bSSam Leffler uint16_t wt_chan_freq; 793971d07bSSam Leffler uint16_t wt_chan_flags; 803971d07bSSam Leffler } __packed; 813971d07bSSam Leffler 823971d07bSSam Leffler #define IWN_TX_RADIOTAP_PRESENT \ 833971d07bSSam Leffler ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 843971d07bSSam Leffler (1 << IEEE80211_RADIOTAP_RATE) | \ 853971d07bSSam Leffler (1 << IEEE80211_RADIOTAP_CHANNEL)) 863971d07bSSam Leffler 873971d07bSSam Leffler struct iwn_dma_info { 883971d07bSSam Leffler bus_dma_tag_t tag; 893971d07bSSam Leffler bus_dmamap_t map; 903971d07bSSam Leffler bus_dma_segment_t seg; 913971d07bSSam Leffler bus_addr_t paddr; 923971d07bSSam Leffler caddr_t vaddr; 933971d07bSSam Leffler bus_size_t size; 943971d07bSSam Leffler }; 953971d07bSSam Leffler 963971d07bSSam Leffler struct iwn_tx_data { 973971d07bSSam Leffler bus_dmamap_t map; 988f302007SRui Paulo bus_addr_t cmd_paddr; 998f302007SRui Paulo bus_addr_t scratch_paddr; 1003971d07bSSam Leffler struct mbuf *m; 1013971d07bSSam Leffler struct ieee80211_node *ni; 1020613dc6fSAndriy Voskoboinyk unsigned int remapped:1; 1030613dc6fSAndriy Voskoboinyk unsigned int long_retries:7; 1040613dc6fSAndriy Voskoboinyk #define IWN_LONG_RETRY_FW_OVERFLOW 0x10 1050613dc6fSAndriy Voskoboinyk #define IWN_LONG_RETRY_LIMIT_LOG 7 1060613dc6fSAndriy Voskoboinyk #define IWN_LONG_RETRY_LIMIT ((1 << IWN_LONG_RETRY_LIMIT_LOG) - 3) 1073971d07bSSam Leffler }; 1083971d07bSSam Leffler 1093971d07bSSam Leffler struct iwn_tx_ring { 1103971d07bSSam Leffler struct iwn_dma_info desc_dma; 1113971d07bSSam Leffler struct iwn_dma_info cmd_dma; 1123971d07bSSam Leffler struct iwn_tx_desc *desc; 1133971d07bSSam Leffler struct iwn_tx_cmd *cmd; 1143971d07bSSam Leffler struct iwn_tx_data data[IWN_TX_RING_COUNT]; 1150f454b93SRui Paulo bus_dma_tag_t data_dmat; 1163971d07bSSam Leffler int qid; 1173971d07bSSam Leffler int queued; 1183971d07bSSam Leffler int cur; 11997fadf57SBernhard Schmidt int read; 1203971d07bSSam Leffler }; 1213971d07bSSam Leffler 1228f302007SRui Paulo struct iwn_softc; 1238f302007SRui Paulo 1243971d07bSSam Leffler struct iwn_rx_data { 1253971d07bSSam Leffler struct mbuf *m; 1268f302007SRui Paulo bus_dmamap_t map; 1273971d07bSSam Leffler }; 1283971d07bSSam Leffler 1293971d07bSSam Leffler struct iwn_rx_ring { 1303971d07bSSam Leffler struct iwn_dma_info desc_dma; 1318f302007SRui Paulo struct iwn_dma_info stat_dma; 1323971d07bSSam Leffler uint32_t *desc; 1338f302007SRui Paulo struct iwn_rx_status *stat; 1343971d07bSSam Leffler struct iwn_rx_data data[IWN_RX_RING_COUNT]; 1350f454b93SRui Paulo bus_dma_tag_t data_dmat; 1363971d07bSSam Leffler int cur; 1373971d07bSSam Leffler }; 1383971d07bSSam Leffler 1393971d07bSSam Leffler struct iwn_node { 1403971d07bSSam Leffler struct ieee80211_node ni; /* must be the first */ 1418f302007SRui Paulo uint16_t disable_tid; 1428f302007SRui Paulo uint8_t id; 14397fadf57SBernhard Schmidt struct { 14497fadf57SBernhard Schmidt uint64_t bitmap; 1450613dc6fSAndriy Voskoboinyk int short_retries; 14697fadf57SBernhard Schmidt int startidx; 14797fadf57SBernhard Schmidt } agg[IEEE80211_TID_SIZE]; 1488f302007SRui Paulo }; 1498f302007SRui Paulo 1503971d07bSSam Leffler struct iwn_calib_state { 1513971d07bSSam Leffler uint8_t state; 1523971d07bSSam Leffler #define IWN_CALIB_STATE_INIT 0 1533971d07bSSam Leffler #define IWN_CALIB_STATE_ASSOC 1 1543971d07bSSam Leffler #define IWN_CALIB_STATE_RUN 2 1558f302007SRui Paulo 1563971d07bSSam Leffler u_int nbeacons; 1573971d07bSSam Leffler uint32_t noise[3]; 1583971d07bSSam Leffler uint32_t rssi[3]; 1598f302007SRui Paulo uint32_t ofdm_x1; 1608f302007SRui Paulo uint32_t ofdm_mrc_x1; 1618f302007SRui Paulo uint32_t ofdm_x4; 1628f302007SRui Paulo uint32_t ofdm_mrc_x4; 1638f302007SRui Paulo uint32_t cck_x4; 1648f302007SRui Paulo uint32_t cck_mrc_x4; 1653971d07bSSam Leffler uint32_t bad_plcp_ofdm; 1663971d07bSSam Leffler uint32_t fa_ofdm; 1673971d07bSSam Leffler uint32_t bad_plcp_cck; 1683971d07bSSam Leffler uint32_t fa_cck; 1693971d07bSSam Leffler uint32_t low_fa; 17092d7ab95SAdrian Chadd uint32_t bad_plcp_ht; 1713971d07bSSam Leffler uint8_t cck_state; 1723971d07bSSam Leffler #define IWN_CCK_STATE_INIT 0 1733971d07bSSam Leffler #define IWN_CCK_STATE_LOFA 1 1743971d07bSSam Leffler #define IWN_CCK_STATE_HIFA 2 1758f302007SRui Paulo 1763971d07bSSam Leffler uint8_t noise_samples[20]; 1773971d07bSSam Leffler u_int cur_noise_sample; 1783971d07bSSam Leffler uint8_t noise_ref; 1793971d07bSSam Leffler uint32_t energy_samples[10]; 1803971d07bSSam Leffler u_int cur_energy_sample; 1813971d07bSSam Leffler uint32_t energy_cck; 1823971d07bSSam Leffler }; 1833971d07bSSam Leffler 1848f302007SRui Paulo struct iwn_calib_info { 1858f302007SRui Paulo uint8_t *buf; 1868f302007SRui Paulo u_int len; 1878f302007SRui Paulo }; 1888f302007SRui Paulo 1898f302007SRui Paulo struct iwn_fw_part { 1908f302007SRui Paulo const uint8_t *text; 1918f302007SRui Paulo uint32_t textsz; 1928f302007SRui Paulo const uint8_t *data; 1938f302007SRui Paulo uint32_t datasz; 1948f302007SRui Paulo }; 1958f302007SRui Paulo 1968f302007SRui Paulo struct iwn_fw_info { 1977832b1f6SBernhard Schmidt const uint8_t *data; 1987832b1f6SBernhard Schmidt size_t size; 1998f302007SRui Paulo struct iwn_fw_part init; 2008f302007SRui Paulo struct iwn_fw_part main; 2018f302007SRui Paulo struct iwn_fw_part boot; 2028f302007SRui Paulo }; 2038f302007SRui Paulo 204552e368dSBernhard Schmidt struct iwn_ops { 2058f302007SRui Paulo int (*load_firmware)(struct iwn_softc *); 2068f302007SRui Paulo void (*read_eeprom)(struct iwn_softc *); 2078f302007SRui Paulo int (*post_alive)(struct iwn_softc *); 2088f302007SRui Paulo int (*nic_config)(struct iwn_softc *); 2098f302007SRui Paulo void (*update_sched)(struct iwn_softc *, int, int, uint8_t, 2108f302007SRui Paulo uint16_t); 2118f302007SRui Paulo int (*get_temperature)(struct iwn_softc *); 2128f302007SRui Paulo int (*get_rssi)(struct iwn_softc *, struct iwn_rx_stat *); 2136977499cSAndriy Voskoboinyk int (*set_txpower)(struct iwn_softc *, int); 2148f302007SRui Paulo int (*init_gains)(struct iwn_softc *); 2158f302007SRui Paulo int (*set_gains)(struct iwn_softc *); 2169d5228cdSAndriy Voskoboinyk int (*rxon_assoc)(struct iwn_softc *, int); 2178f302007SRui Paulo int (*add_node)(struct iwn_softc *, struct iwn_node_info *, 2188f302007SRui Paulo int); 2198f302007SRui Paulo void (*tx_done)(struct iwn_softc *, struct iwn_rx_desc *, 2208f302007SRui Paulo struct iwn_rx_data *); 2210f454b93SRui Paulo void (*ampdu_tx_start)(struct iwn_softc *, 22297fadf57SBernhard Schmidt struct ieee80211_node *, int, uint8_t, uint16_t); 22397fadf57SBernhard Schmidt void (*ampdu_tx_stop)(struct iwn_softc *, int, uint8_t, 2240f454b93SRui Paulo uint16_t); 2258f302007SRui Paulo }; 2268f302007SRui Paulo 2273971d07bSSam Leffler struct iwn_vap { 2283971d07bSSam Leffler struct ieee80211vap iv_vap; 2298f302007SRui Paulo uint8_t iv_ridx; 2303971d07bSSam Leffler 2313971d07bSSam Leffler int (*iv_newstate)(struct ieee80211vap *, 2323971d07bSSam Leffler enum ieee80211_state, int); 233da8848ffSAdrian Chadd int ctx; 234da8848ffSAdrian Chadd int beacon_int; 235da8848ffSAdrian Chadd 2363971d07bSSam Leffler }; 2373971d07bSSam Leffler #define IWN_VAP(_vap) ((struct iwn_vap *)(_vap)) 2383971d07bSSam Leffler 2393971d07bSSam Leffler struct iwn_softc { 240786b72c5SBernhard Schmidt device_t sc_dev; 2413971d07bSSam Leffler int sc_debug; 2424823a750SAdrian Chadd struct cdev *sc_cdev; 2433971d07bSSam Leffler struct mtx sc_mtx; 2447a79cebfSGleb Smirnoff struct ieee80211com sc_ic; 245f6930becSAndriy Voskoboinyk struct ieee80211_ratectl_tx_status sc_txs; 2463971d07bSSam Leffler 2478f302007SRui Paulo u_int sc_flags; 2488f302007SRui Paulo #define IWN_FLAG_HAS_OTPROM (1 << 1) 2490f454b93SRui Paulo #define IWN_FLAG_CALIB_DONE (1 << 2) 2500f454b93SRui Paulo #define IWN_FLAG_USE_ICT (1 << 3) 2510f454b93SRui Paulo #define IWN_FLAG_INTERNAL_PA (1 << 4) 2529dd0e40bSBernhard Schmidt #define IWN_FLAG_HAS_11N (1 << 6) 2539dd0e40bSBernhard Schmidt #define IWN_FLAG_ENH_SENS (1 << 7) 2548bb237d9SBernhard Schmidt #define IWN_FLAG_ADV_BTCOEX (1 << 8) 255da8848ffSAdrian Chadd #define IWN_FLAG_PAN_SUPPORT (1 << 9) 2568cf53c12SAdrian Chadd #define IWN_FLAG_BTCOEX (1 << 10) 2577a79cebfSGleb Smirnoff #define IWN_FLAG_RUNNING (1 << 11) 2583971d07bSSam Leffler 2598f302007SRui Paulo uint8_t hw_type; 260da8848ffSAdrian Chadd /* subdevice_id used to adjust configuration */ 261da8848ffSAdrian Chadd uint16_t subdevice_id; 262552e368dSBernhard Schmidt 263552e368dSBernhard Schmidt struct iwn_ops ops; 2648f302007SRui Paulo const char *fwname; 2650f454b93SRui Paulo const struct iwn_sensitivity_limits 2660f454b93SRui Paulo *limits; 267552e368dSBernhard Schmidt int ntxqs; 26897fadf57SBernhard Schmidt int firstaggqueue; 269552e368dSBernhard Schmidt int ndmachnls; 270552e368dSBernhard Schmidt uint8_t broadcast_id; 271552e368dSBernhard Schmidt int rxonsz; 272552e368dSBernhard Schmidt int schedsz; 273552e368dSBernhard Schmidt uint32_t fw_text_maxsz; 274552e368dSBernhard Schmidt uint32_t fw_data_maxsz; 275552e368dSBernhard Schmidt uint32_t fwsz; 276552e368dSBernhard Schmidt bus_size_t sched_txfact_addr; 2779ff2129fSBernhard Schmidt uint32_t reset_noise_gain; 2789ff2129fSBernhard Schmidt uint32_t noise_gain; 2798f302007SRui Paulo 2808f302007SRui Paulo /* TX scheduler rings. */ 2818f302007SRui Paulo struct iwn_dma_info sched_dma; 2828f302007SRui Paulo uint16_t *sched; 2838f302007SRui Paulo uint32_t sched_base; 2848f302007SRui Paulo 2858f302007SRui Paulo /* "Keep Warm" page. */ 2863971d07bSSam Leffler struct iwn_dma_info kw_dma; 2873971d07bSSam Leffler 2888f302007SRui Paulo /* Firmware image. */ 2893971d07bSSam Leffler const struct firmware *fw_fp; 2903971d07bSSam Leffler 2918f302007SRui Paulo /* Firmware DMA transfer. */ 2923971d07bSSam Leffler struct iwn_dma_info fw_dma; 2933971d07bSSam Leffler 2940f454b93SRui Paulo /* ICT table. */ 2950f454b93SRui Paulo struct iwn_dma_info ict_dma; 2960f454b93SRui Paulo uint32_t *ict; 2970f454b93SRui Paulo int ict_cur; 2980f454b93SRui Paulo 2998f302007SRui Paulo /* TX/RX rings. */ 3008f302007SRui Paulo struct iwn_tx_ring txq[IWN5000_NTXQUEUES]; 3013971d07bSSam Leffler struct iwn_rx_ring rxq; 3023971d07bSSam Leffler 303786b72c5SBernhard Schmidt struct resource *mem; 3043971d07bSSam Leffler bus_space_tag_t sc_st; 3053971d07bSSam Leffler bus_space_handle_t sc_sh; 306786b72c5SBernhard Schmidt struct resource *irq; 3073971d07bSSam Leffler void *sc_ih; 3083971d07bSSam Leffler bus_size_t sc_sz; 3098f302007SRui Paulo int sc_cap_off; /* PCIe Capabilities. */ 3103971d07bSSam Leffler 3113971d07bSSam Leffler /* Tasks used by the driver */ 312d7de0a2cSAndriy Voskoboinyk struct task sc_rftoggle_task; 3138acd0be1SEdward Tomasz Napierala struct task sc_panic_task; 3143233d0c6SAdrian Chadd struct task sc_xmit_task; 3158acd0be1SEdward Tomasz Napierala 3168acd0be1SEdward Tomasz Napierala /* Taskqueue */ 3178acd0be1SEdward Tomasz Napierala struct taskqueue *sc_tq; 3183971d07bSSam Leffler 31992d7ab95SAdrian Chadd /* Calibration information */ 320af2e228dSBernhard Schmidt struct callout calib_to; 3213971d07bSSam Leffler int calib_cnt; 3223971d07bSSam Leffler struct iwn_calib_state calib; 32392d7ab95SAdrian Chadd int last_calib_ticks; 3241447d404SAndriy Voskoboinyk struct callout scan_timeout; 325af2e228dSBernhard Schmidt struct callout watchdog_to; 3268f302007SRui Paulo struct iwn_fw_info fw; 327a704cc7fSAdrian Chadd struct iwn_calib_info calibcmd[IWN5000_PHY_CALIB_MAX_RESULT]; 3288f302007SRui Paulo uint32_t errptr; 3298f302007SRui Paulo 3303971d07bSSam Leffler struct iwn_rx_stat last_rx_stat; 3313971d07bSSam Leffler int last_rx_valid; 3323971d07bSSam Leffler struct iwn_ucode_info ucode_info; 333da8848ffSAdrian Chadd struct iwn_rxon rx_on[IWN_NUM_RXON_CTX]; 334da8848ffSAdrian Chadd struct iwn_rxon *rxon; 335da8848ffSAdrian Chadd int ctx; 336da8848ffSAdrian Chadd struct ieee80211vap *ivap[IWN_NUM_RXON_CTX]; 337da8848ffSAdrian Chadd 33849f79cfdSAdrian Chadd /* General statistics */ 33949f79cfdSAdrian Chadd /* 34049f79cfdSAdrian Chadd * The statistics are reset after each channel 34149f79cfdSAdrian Chadd * change. So it may be zeroed after things like 34249f79cfdSAdrian Chadd * a background scan. 34349f79cfdSAdrian Chadd * 34449f79cfdSAdrian Chadd * So for now, this is just a cheap hack to 34549f79cfdSAdrian Chadd * expose the last received statistics dump 34649f79cfdSAdrian Chadd * via an ioctl(). Later versions of this 34749f79cfdSAdrian Chadd * could expose the last 'n' messages, or just 34849f79cfdSAdrian Chadd * provide a pipeline for the firmware responses 34949f79cfdSAdrian Chadd * via something like BPF. 35049f79cfdSAdrian Chadd */ 35149f79cfdSAdrian Chadd struct iwn_stats last_stat; 35249f79cfdSAdrian Chadd int last_stat_valid; 35349f79cfdSAdrian Chadd 354da8848ffSAdrian Chadd uint8_t uc_scan_progress; 3553971d07bSSam Leffler uint32_t rawtemp; 3563971d07bSSam Leffler int temp; 3573971d07bSSam Leffler int noise; 3588f302007SRui Paulo uint32_t qfullmsk; 3593971d07bSSam Leffler 3600f454b93SRui Paulo uint32_t prom_base; 3618f302007SRui Paulo struct iwn4965_eeprom_band 3628f302007SRui Paulo bands[IWN_NBANDS]; 3630f454b93SRui Paulo struct iwn_eeprom_chan eeprom_channels[IWN_NBANDS][IWN_MAX_CHAN_PER_BAND]; 3648f302007SRui Paulo uint16_t rfcfg; 3657373959eSBernhard Schmidt uint8_t calib_ver; 3668f302007SRui Paulo char eeprom_domain[4]; 367083e2167SBernhard Schmidt uint32_t eeprom_crystal; 368083e2167SBernhard Schmidt int16_t eeprom_temp; 369da8848ffSAdrian Chadd int16_t eeprom_temp_high; 3703971d07bSSam Leffler int16_t eeprom_voltage; 3713971d07bSSam Leffler int8_t maxpwr2GHz; 3723971d07bSSam Leffler int8_t maxpwr5GHz; 3738f302007SRui Paulo int8_t maxpwr[IEEE80211_CHAN_MAX]; 3748f302007SRui Paulo 375da8848ffSAdrian Chadd uint32_t tlv_feature_flags; 376da8848ffSAdrian Chadd 3770f454b93SRui Paulo int32_t temp_off; 3780f454b93SRui Paulo uint32_t int_mask; 3798f302007SRui Paulo uint8_t ntxchains; 3808f302007SRui Paulo uint8_t nrxchains; 3810f454b93SRui Paulo uint8_t txchainmask; 3820f454b93SRui Paulo uint8_t rxchainmask; 3830f454b93SRui Paulo uint8_t chainmask; 3848f302007SRui Paulo 3858f302007SRui Paulo int sc_tx_timer; 3868f302007SRui Paulo 387fee842aaSAdrian Chadd /* Are we doing a scan? */ 388fee842aaSAdrian Chadd int sc_is_scanning; 389fee842aaSAdrian Chadd 3903233d0c6SAdrian Chadd /* Are we waiting for a beacon before xmit? */ 3913233d0c6SAdrian Chadd int sc_beacon_wait; 3923233d0c6SAdrian Chadd 39397fadf57SBernhard Schmidt struct ieee80211_tx_ampdu *qid2tap[IWN5000_NTXQUEUES]; 39497fadf57SBernhard Schmidt 395b2ad04c7SBernhard Schmidt int (*sc_ampdu_rx_start)(struct ieee80211_node *, 396b2ad04c7SBernhard Schmidt struct ieee80211_rx_ampdu *, int, int, int); 397b2ad04c7SBernhard Schmidt void (*sc_ampdu_rx_stop)(struct ieee80211_node *, 398b2ad04c7SBernhard Schmidt struct ieee80211_rx_ampdu *); 39997fadf57SBernhard Schmidt int (*sc_addba_request)(struct ieee80211_node *, 40097fadf57SBernhard Schmidt struct ieee80211_tx_ampdu *, int, int, int); 40197fadf57SBernhard Schmidt int (*sc_addba_response)(struct ieee80211_node *, 40297fadf57SBernhard Schmidt struct ieee80211_tx_ampdu *, int, int, int); 40397fadf57SBernhard Schmidt void (*sc_addba_stop)(struct ieee80211_node *, 40497fadf57SBernhard Schmidt struct ieee80211_tx_ampdu *); 40597fadf57SBernhard Schmidt 406da8848ffSAdrian Chadd struct iwn_led_mode sc_led; 407b2ad04c7SBernhard Schmidt 4088f302007SRui Paulo struct iwn_rx_radiotap_header sc_rxtap; 4098f302007SRui Paulo struct iwn_tx_radiotap_header sc_txtap; 410da8848ffSAdrian Chadd 411da8848ffSAdrian Chadd /* The power save level originally configured by user */ 412da8848ffSAdrian Chadd int desired_pwrsave_level; 413da8848ffSAdrian Chadd 414da8848ffSAdrian Chadd /* 415da8848ffSAdrian Chadd * The current power save level, this may differ from the 416da8848ffSAdrian Chadd * configured value due to thermal throttling etc. 417da8848ffSAdrian Chadd */ 418da8848ffSAdrian Chadd int current_pwrsave_level; 419da8848ffSAdrian Chadd 420a704cc7fSAdrian Chadd /* For specific params */ 421a704cc7fSAdrian Chadd const struct iwn_base_params *base_params; 422bc0203e2SAdrian Chadd 423bc0203e2SAdrian Chadd #define IWN_UCODE_API(ver) (((ver) & 0x0000FF00) >> 8) 424bc0203e2SAdrian Chadd uint32_t ucode_rev; 4253233d0c6SAdrian Chadd 4263233d0c6SAdrian Chadd /* 4273233d0c6SAdrian Chadd * Global queue for queuing xmit frames 4283233d0c6SAdrian Chadd * when we can't yet transmit (eg raw 4293233d0c6SAdrian Chadd * frames whilst waiting for beacons.) 4303233d0c6SAdrian Chadd */ 4313233d0c6SAdrian Chadd struct mbufq sc_xmit_queue; 4323971d07bSSam Leffler }; 4333971d07bSSam Leffler 4343971d07bSSam Leffler #define IWN_LOCK_INIT(_sc) \ 4353971d07bSSam Leffler mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \ 4363971d07bSSam Leffler MTX_NETWORK_LOCK, MTX_DEF) 4373971d07bSSam Leffler #define IWN_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx) 4383971d07bSSam Leffler #define IWN_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->sc_mtx, MA_OWNED) 4393971d07bSSam Leffler #define IWN_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx) 4403971d07bSSam Leffler #define IWN_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->sc_mtx) 441