fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld/* $NetBSD: if_iwnvar.h,v 1.17 2015/09/22 23:23:06 nonaka Exp $ */
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld/* $OpenBSD: if_iwnvar.h,v 1.28 2014/09/09 18:55:08 sthen Exp $ */
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld/*-
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld * Copyright (c) 2007, 2008
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld * Damien Bergamini <damien.bergamini@free.fr>
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld *
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld * Permission to use, copy, modify, and distribute this software for any
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld * purpose with or without fee is hereby granted, provided that the above
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld * copyright notice and this permission notice appear in all copies.
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld *
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld */
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld/*
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld * Copyright 2016 Hans Rosenfeld <rosenfeld@grumpf.hope-2000.org>
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld */
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#ifndef _IF_IWNVAR_H
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define _IF_IWNVAR_H
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#include <sys/net80211.h>
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#include <sys/queue.h>
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeldstruct iwn_dma_info {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld ddi_dma_handle_t dma_hdl;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld ddi_acc_handle_t acc_hdl;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld ddi_dma_cookie_t cookie;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint_t ncookies;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uintptr_t paddr;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld caddr_t vaddr;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld size_t size;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld size_t length;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld};
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeldstruct iwn_tx_data {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_dma_info dma_data;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uintptr_t cmd_paddr;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uintptr_t scratch_paddr;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_dma_info cmd_dma;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct ieee80211_node *ni;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld};
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeldstruct iwn_tx_ring {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_dma_info desc_dma;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_dma_info cmd_dma;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_tx_desc *desc;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_tx_cmd *cmd;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_tx_data data[IWN_TX_RING_COUNT];
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int qid;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int queued;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int cur;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld};
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_RBUF_COUNT (IWN_RX_RING_COUNT + 32)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeldstruct iwn_softc;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeldstruct iwn_rx_data {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_dma_info dma_data;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld};
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeldstruct iwn_rx_ring {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_dma_info desc_dma;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_dma_info stat_dma;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t *desc;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_rx_status *stat;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_rx_data data[IWN_RX_RING_COUNT];
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int cur;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld};
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeldstruct iwn_node {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct ieee80211_node ni; /* must be the first */
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct ieee80211_amrr_node amn;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint16_t disable_tid;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint8_t id;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint8_t ridx[IEEE80211_RATE_MAXSIZE];
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld};
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeldstruct iwn_calib_state {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint8_t state;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_CALIB_STATE_INIT 0
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_CALIB_STATE_ASSOC 1
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_CALIB_STATE_RUN 2
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld u_int nbeacons;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int32_t noise[3];
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t rssi[3];
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t ofdm_x1;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t ofdm_mrc_x1;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t ofdm_x4;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t ofdm_mrc_x4;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t cck_x4;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t cck_mrc_x4;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t bad_plcp_ofdm;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t fa_ofdm;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t bad_plcp_cck;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t fa_cck;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t low_fa;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint8_t cck_state;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_CCK_STATE_INIT 0
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_CCK_STATE_LOFA 1
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_CCK_STATE_HIFA 2
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint8_t noise_samples[20];
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld u_int cur_noise_sample;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint8_t noise_ref;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t energy_samples[10];
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld u_int cur_energy_sample;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t energy_cck;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld};
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeldstruct iwn_calib_info {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint8_t *buf;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld u_int len;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld};
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeldstruct iwn_fw_part {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld const uint8_t *text;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t textsz;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld const uint8_t *data;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t datasz;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld};
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeldstruct iwn_fw_info {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld u_char *data;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld size_t size;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_fw_part init;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_fw_part main;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_fw_part boot;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld};
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeldstruct iwn_ops {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int (*load_firmware)(struct iwn_softc *);
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld void (*read_eeprom)(struct iwn_softc *);
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int (*post_alive)(struct iwn_softc *);
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int (*nic_config)(struct iwn_softc *);
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int (*config_bt_coex)(struct iwn_softc *);
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld void (*update_sched)(struct iwn_softc *, int, int, uint8_t,
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint16_t);
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int (*get_temperature)(struct iwn_softc *);
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int (*get_rssi)(const struct iwn_rx_stat *);
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int (*set_txpower)(struct iwn_softc *, int);
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int (*init_gains)(struct iwn_softc *);
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int (*set_gains)(struct iwn_softc *);
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int (*add_node)(struct iwn_softc *, struct iwn_node_info *,
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int);
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld void (*tx_done)(struct iwn_softc *, struct iwn_rx_desc *,
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_rx_data *);
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#ifndef IEEE80211_NO_HT
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld void (*ampdu_tx_start)(struct iwn_softc *,
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct ieee80211_node *, uint8_t, uint16_t);
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld void (*ampdu_tx_stop)(struct iwn_softc *, uint8_t,
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint16_t);
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#endif
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld};
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeldstruct iwn_softc {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct ieee80211com sc_ic;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld dev_info_t *sc_dip;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int (*sc_newstate)(struct ieee80211com *,
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld enum ieee80211_state, int);
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld enum ieee80211_state sc_ostate;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld clock_t sc_clk;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct ieee80211_amrr amrr;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint8_t fixed_ridx;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint16_t sc_devid;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld caddr_t sc_base;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld u_int sc_flags;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_HAS_5GHZ (1 << 0)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_HAS_OTPROM (1 << 1)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_CALIB_DONE (1 << 2)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_USE_ICT (1 << 3)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_INTERNAL_PA (1 << 4)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_FW_DMA (1 << 5)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_HAS_11N (1 << 6)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_ENH_SENS (1 << 7)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld/* Added for NetBSD */
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_HW_INITED (1 << 8)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_SCANNING_2GHZ (1 << 9)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_SCANNING_5GHZ (1 << 10)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_SCANNING (IWN_FLAG_SCANNING_2GHZ|IWN_FLAG_SCANNING_5GHZ)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld/* From iwp.c */
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_ATTACHED (1 << 11)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_CMD_DONE (1 << 12)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_FW_ALIVE (1 << 13)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_HW_ERR_RECOVER (1 << 14)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_RATE_AUTO_CTL (1 << 15)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_RUNNING (1 << 16)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_SUSPEND (1 << 17)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_RADIO_OFF (1 << 18)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_STATISTICS (1 << 19)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_READY (1 << 20)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_PUT_SEG (1 << 21)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_QUIESCED (1 << 22)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_LAZY_RESUME (1 << 23)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_FLAG_STOP_CALIB_TO (1 << 24)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint8_t hw_type;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_ops ops;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld const char *fwname;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld const struct iwn_sensitivity_limits
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld *limits;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int ntxqs;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int ndmachnls;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint8_t broadcast_id;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int rxonsz;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int schedsz;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t fw_text_maxsz;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t fw_data_maxsz;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t fwsz;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t sched_txfact_addr;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld /* TX scheduler rings. */
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_dma_info sched_dma;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint16_t *sched;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t sched_base;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld /* "Keep Warm" page. */
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_dma_info kw_dma;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld /* Firmware DMA transfer. */
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_dma_info fw_dma;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld /* ICT table. */
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_dma_info ict_dma;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t *ict;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int ict_cur;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld /* TX/RX rings. */
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_tx_ring txq[IWN5000_NTXQUEUES];
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_rx_ring rxq;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld ddi_acc_handle_t sc_regh;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld void *sc_ih;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld ddi_acc_handle_t sc_pcih;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint_t sc_intr_pri;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int sc_intr_cap;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int sc_intr_count;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld size_t sc_intr_size;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld ddi_intr_handle_t *sc_intr_htable;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int sc_cap_off; /* PCIe Capabilities. */
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld ddi_periodic_t sc_periodic;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld timeout_id_t scan_to;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld timeout_id_t calib_to;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int calib_cnt;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_calib_state calib;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_fw_info fw;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_calib_info calibcmd[5];
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t errptr;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_rx_stat last_rx_stat;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int last_rx_valid;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_ucode_info ucode_info;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_rxon rxon;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_rxon rxon_save;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t rawtemp;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int temp;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int noise;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t qfullmsk;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t prom_base;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn4965_eeprom_band
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld bands[IWN_NBANDS];
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint16_t rfcfg;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint8_t calib_ver;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld char eeprom_domain[4];
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t eeprom_crystal;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int16_t eeprom_temp;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int16_t eeprom_voltage;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int16_t eeprom_rawtemp;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int8_t maxpwr2GHz;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int8_t maxpwr5GHz;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int8_t maxpwr[IEEE80211_CHAN_MAX];
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int8_t enh_maxpwr[35];
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint8_t reset_noise_gain;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint8_t noise_gain;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t tlv_feature_flags;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int32_t temp_off;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t int_mask;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint8_t ntxchains;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint8_t nrxchains;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint8_t txchainmask;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint8_t rxchainmask;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint8_t chainmask;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld int sc_tx_timer;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld void *powerhook;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kmutex_t sc_mtx; /* mutex for init/stop */
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kmutex_t sc_tx_mtx;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kmutex_t sc_mt_mtx;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kcondvar_t sc_cmd_cv;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kcondvar_t sc_scan_cv;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kcondvar_t sc_fhdma_cv;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kcondvar_t sc_alive_cv;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kcondvar_t sc_calib_cv;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kcondvar_t sc_mt_cv;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld volatile uint32_t sc_cmd_flag;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld volatile uint32_t sc_cmd_accum;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define SC_CMD_FLG_NONE (0)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define SC_CMD_FLG_PENDING (1)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define SC_CMD_FLG_DONE (2)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld /* kstats */
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t sc_tx_nobuf;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t sc_rx_nobuf;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t sc_tx_err;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t sc_rx_err;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld uint32_t sc_tx_retries;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_t *sc_ks_misc;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_ks_misc *sc_misc;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_t *sc_ks_ant;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_ks_ant *sc_ant;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_t *sc_ks_sens;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_ks_sens *sc_sens;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_t *sc_ks_timing;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_ks_timing *sc_timing;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_t *sc_ks_edca;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_ks_edca *sc_edca;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_t *sc_ks_txpower;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_ks_txpower *sc_txpower;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_t *sc_ks_toff;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld union {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_ks_toff_2000 *t2000;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct iwn_ks_toff_6000 *t6000;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld } sc_toff;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld};
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeldstruct iwn_ks_misc {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t temp;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t crit_temp;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t pslevel;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t noise;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld};
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeldstruct iwn_ks_ant {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t tx_ant;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t rx_ant;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t conn_ant;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t gain[3];
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld};
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeldstruct iwn_ks_sens {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t ofdm_x1;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t ofdm_mrc_x1;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t ofdm_x4;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t ofdm_mrc_x4;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t cck_x4;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t cck_mrc_x4;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t energy_cck;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld};
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeldstruct iwn_ks_timing {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t bintval;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t tstamp;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t init;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld};
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeldstruct iwn_ks_edca {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t cwmin;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t cwmax;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t aifsn;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t txop;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld } ac[4];
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld};
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeldstruct iwn_ks_txpower {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t vdiff;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t chan;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t group;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t subband;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t power;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t gain;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t temp;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t tcomp;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld struct {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t rf_gain;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t dsp_gain;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld } rate[IWN_RIDX_MAX];
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld } txchain[2];
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld};
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeldstruct iwn_ks_toff_2000 {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t toff_lo;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t toff_hi;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t volt;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld};
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeldstruct iwn_ks_toff_6000 {
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld kstat_named_t toff;
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld};
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#define IWN_CHK_FAST_RECOVER(sc) \
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld (sc->sc_ic.ic_state == IEEE80211_S_RUN && \
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld sc->sc_ic.ic_opmode == IEEE80211_M_STA)
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld
fd43cf6ea90d0f421f98ca45675340de695681acHans Rosenfeld#endif /* _IF_IWNVAR_H */