if_iwnvar.h revision 178676
1178676Ssam/* $FreeBSD: head/sys/dev/iwn/if_iwnvar.h 178676 2008-04-29 21:36:17Z sam $ */ 2178676Ssam/*- 3178676Ssam * Copyright (c) 2007 4178676Ssam * Damien Bergamini <damien.bergamini@free.fr> 5178676Ssam * Copyright (c) 2008 Sam Leffler, Errno Consulting 6178676Ssam * 7178676Ssam * Permission to use, copy, modify, and distribute this software for any 8178676Ssam * purpose with or without fee is hereby granted, provided that the above 9178676Ssam * copyright notice and this permission notice appear in all copies. 10178676Ssam * 11178676Ssam * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12178676Ssam * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13178676Ssam * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14178676Ssam * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15178676Ssam * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16178676Ssam * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17178676Ssam * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18178676Ssam */ 19178676Ssam 20178676Ssamstruct iwn_rx_radiotap_header { 21178676Ssam struct ieee80211_radiotap_header wr_ihdr; 22178676Ssam uint64_t wr_tsft; 23178676Ssam uint8_t wr_flags; 24178676Ssam uint8_t wr_rate; 25178676Ssam uint16_t wr_chan_freq; 26178676Ssam uint16_t wr_chan_flags; 27178676Ssam int8_t wr_dbm_antsignal; 28178676Ssam int8_t wr_dbm_antnoise; 29178676Ssam} __packed; 30178676Ssam 31178676Ssam#define IWN_RX_RADIOTAP_PRESENT \ 32178676Ssam ((1 << IEEE80211_RADIOTAP_TSFT) | \ 33178676Ssam (1 << IEEE80211_RADIOTAP_FLAGS) | \ 34178676Ssam (1 << IEEE80211_RADIOTAP_RATE) | \ 35178676Ssam (1 << IEEE80211_RADIOTAP_CHANNEL) | \ 36178676Ssam (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \ 37178676Ssam (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)) 38178676Ssam 39178676Ssamstruct iwn_tx_radiotap_header { 40178676Ssam struct ieee80211_radiotap_header wt_ihdr; 41178676Ssam uint8_t wt_flags; 42178676Ssam uint8_t wt_rate; 43178676Ssam uint16_t wt_chan_freq; 44178676Ssam uint16_t wt_chan_flags; 45178676Ssam} __packed; 46178676Ssam 47178676Ssam#define IWN_TX_RADIOTAP_PRESENT \ 48178676Ssam ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 49178676Ssam (1 << IEEE80211_RADIOTAP_RATE) | \ 50178676Ssam (1 << IEEE80211_RADIOTAP_CHANNEL)) 51178676Ssam 52178676Ssamstruct iwn_dma_info { 53178676Ssam bus_dma_tag_t tag; 54178676Ssam bus_dmamap_t map; 55178676Ssam bus_dma_segment_t seg; 56178676Ssam bus_addr_t paddr; 57178676Ssam caddr_t vaddr; 58178676Ssam bus_size_t size; 59178676Ssam}; 60178676Ssam 61178676Ssamstruct iwn_tx_data { 62178676Ssam bus_dmamap_t map; 63178676Ssam struct mbuf *m; 64178676Ssam struct ieee80211_node *ni; 65178676Ssam}; 66178676Ssam 67178676Ssamstruct iwn_tx_ring { 68178676Ssam struct iwn_dma_info desc_dma; 69178676Ssam struct iwn_dma_info cmd_dma; 70178676Ssam struct iwn_tx_desc *desc; 71178676Ssam struct iwn_tx_cmd *cmd; 72178676Ssam struct iwn_tx_data data[IWN_TX_RING_COUNT]; 73178676Ssam bus_dma_tag_t data_dmat; 74178676Ssam int qid; 75178676Ssam int queued; 76178676Ssam int cur; 77178676Ssam}; 78178676Ssam 79178676Ssamstruct iwn_rx_data { 80178676Ssam bus_dmamap_t map; 81178676Ssam struct mbuf *m; 82178676Ssam}; 83178676Ssam 84178676Ssamstruct iwn_rx_ring { 85178676Ssam struct iwn_dma_info desc_dma; 86178676Ssam uint32_t *desc; 87178676Ssam struct iwn_rx_data data[IWN_RX_RING_COUNT]; 88178676Ssam bus_dma_tag_t data_dmat; 89178676Ssam int cur; 90178676Ssam}; 91178676Ssam 92178676Ssamstruct iwn_node { 93178676Ssam struct ieee80211_node ni; /* must be the first */ 94178676Ssam struct ieee80211_amrr_node amn; 95178676Ssam}; 96178676Ssam#define IWN_NODE(_ni) ((struct iwn_node *)(_ni)) 97178676Ssam 98178676Ssamstruct iwn_calib_state { 99178676Ssam uint8_t state; 100178676Ssam#define IWN_CALIB_STATE_INIT 0 101178676Ssam#define IWN_CALIB_STATE_ASSOC 1 102178676Ssam#define IWN_CALIB_STATE_RUN 2 103178676Ssam u_int nbeacons; 104178676Ssam uint32_t noise[3]; 105178676Ssam uint32_t rssi[3]; 106178676Ssam uint32_t corr_ofdm_x1; 107178676Ssam uint32_t corr_ofdm_mrc_x1; 108178676Ssam uint32_t corr_ofdm_x4; 109178676Ssam uint32_t corr_ofdm_mrc_x4; 110178676Ssam uint32_t corr_cck_x4; 111178676Ssam uint32_t corr_cck_mrc_x4; 112178676Ssam uint32_t bad_plcp_ofdm; 113178676Ssam uint32_t fa_ofdm; 114178676Ssam uint32_t bad_plcp_cck; 115178676Ssam uint32_t fa_cck; 116178676Ssam uint32_t low_fa; 117178676Ssam uint8_t cck_state; 118178676Ssam#define IWN_CCK_STATE_INIT 0 119178676Ssam#define IWN_CCK_STATE_LOFA 1 120178676Ssam#define IWN_CCK_STATE_HIFA 2 121178676Ssam uint8_t noise_samples[20]; 122178676Ssam u_int cur_noise_sample; 123178676Ssam uint8_t noise_ref; 124178676Ssam uint32_t energy_samples[10]; 125178676Ssam u_int cur_energy_sample; 126178676Ssam uint32_t energy_cck; 127178676Ssam}; 128178676Ssam 129178676Ssamstruct iwn_vap { 130178676Ssam struct ieee80211vap iv_vap; 131178676Ssam struct ieee80211_amrr iv_amrr; 132178676Ssam struct callout iv_amrr_to; 133178676Ssam 134178676Ssam int (*iv_newstate)(struct ieee80211vap *, 135178676Ssam enum ieee80211_state, int); 136178676Ssam}; 137178676Ssam#define IWN_VAP(_vap) ((struct iwn_vap *)(_vap)) 138178676Ssam 139178676Ssamstruct iwn_softc { 140178676Ssam struct ifnet *sc_ifp; 141178676Ssam int sc_debug; 142178676Ssam struct callout sc_timer_to; /* calib+watchdog timer */ 143178676Ssam int sc_tx_timer; /* tx watchdog timer/counter */ 144178676Ssam const struct ieee80211_channel *sc_curchan; 145178676Ssam 146178676Ssam struct iwn_rx_radiotap_header sc_rxtap; 147178676Ssam int sc_rxtap_len; 148178676Ssam struct iwn_tx_radiotap_header sc_txtap; 149178676Ssam int sc_txtap_len; 150178676Ssam 151178676Ssam /* locks */ 152178676Ssam struct mtx sc_mtx; 153178676Ssam 154178676Ssam /* bus */ 155178676Ssam device_t sc_dev; 156178676Ssam int mem_rid; 157178676Ssam int irq_rid; 158178676Ssam struct resource *mem; 159178676Ssam struct resource *irq; 160178676Ssam 161178676Ssam /* shared area */ 162178676Ssam struct iwn_dma_info shared_dma; 163178676Ssam struct iwn_shared *shared; 164178676Ssam 165178676Ssam /* "keep warm" page */ 166178676Ssam struct iwn_dma_info kw_dma; 167178676Ssam 168178676Ssam /* firmware image */ 169178676Ssam const struct firmware *fw_fp; 170178676Ssam 171178676Ssam /* firmware DMA transfer */ 172178676Ssam struct iwn_dma_info fw_dma; 173178676Ssam 174178676Ssam /* rings */ 175178676Ssam struct iwn_tx_ring txq[IWN_NTXQUEUES]; 176178676Ssam struct iwn_rx_ring rxq; 177178676Ssam 178178676Ssam bus_space_tag_t sc_st; 179178676Ssam bus_space_handle_t sc_sh; 180178676Ssam void *sc_ih; 181178676Ssam bus_size_t sc_sz; 182178676Ssam 183178676Ssam /* command queue related variables */ 184178676Ssam#define IWN_SCAN_START (1<<0) 185178676Ssam#define IWN_SCAN_CURCHAN (1<<1) 186178676Ssam#define IWN_SCAN_STOP (1<<2) 187178676Ssam#define IWN_SET_CHAN (1<<3) 188178676Ssam#define IWN_AUTH (1<<4) 189178676Ssam#define IWN_SCAN_NEXT (1<<5) 190178676Ssam#define IWN_RUN (1<<6) 191178676Ssam#define IWN_RADIO_ENABLE (1<<7) 192178676Ssam#define IWN_RADIO_DISABLE (1<<8) 193178676Ssam#define IWN_REINIT (1<<9) 194178676Ssam#define IWN_CMD_MAXOPS 10 195178676Ssam /* command queuing request type */ 196178676Ssam#define IWN_QUEUE_NORMAL 0 197178676Ssam#define IWN_QUEUE_CLEAR 1 198178676Ssam int sc_cmd[IWN_CMD_MAXOPS]; 199178676Ssam int sc_cmd_arg[IWN_CMD_MAXOPS]; 200178676Ssam int sc_cmd_cur; /* current queued scan task */ 201178676Ssam int sc_cmd_next; /* last queued scan task */ 202178676Ssam struct mtx sc_cmdlock; 203178676Ssam 204178676Ssam /* Task queues used to control the driver */ 205178676Ssam struct taskqueue *sc_tq; /* Main command task queue */ 206178676Ssam 207178676Ssam /* Tasks used by the driver */ 208178676Ssam struct task sc_ops_task; /* deferred ops */ 209178676Ssam struct task sc_bmiss_task; /* beacon miss */ 210178676Ssam 211178676Ssam /* Thermal calibration */ 212178676Ssam int calib_cnt; 213178676Ssam struct iwn_calib_state calib; 214178676Ssam 215178676Ssam struct iwn_rx_stat last_rx_stat; 216178676Ssam int last_rx_valid; 217178676Ssam struct iwn_ucode_info ucode_info; 218178676Ssam struct iwn_config config; 219178676Ssam uint32_t rawtemp; 220178676Ssam int temp; 221178676Ssam int noise; 222178676Ssam uint8_t antmsk; 223178676Ssam 224178676Ssam struct iwn_eeprom_band bands[IWN_NBANDS]; 225178676Ssam int16_t eeprom_voltage; 226178676Ssam int8_t maxpwr2GHz; 227178676Ssam int8_t maxpwr5GHz; 228178676Ssam}; 229178676Ssam 230178676Ssam#define IWN_LOCK_INIT(_sc) \ 231178676Ssam mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \ 232178676Ssam MTX_NETWORK_LOCK, MTX_DEF) 233178676Ssam#define IWN_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx) 234178676Ssam#define IWN_LOCK_ASSERT(_sc) mtx_assert(&(_sc)->sc_mtx, MA_OWNED) 235178676Ssam#define IWN_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx) 236178676Ssam#define IWN_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->sc_mtx) 237178676Ssam#define IWN_CMD_LOCK_INIT(_sc) \ 238178676Ssam mtx_init(&(_sc)->sc_cmdlock, device_get_nameunit((_sc)->sc_dev), \ 239178676Ssam NULL, MTX_DEF); 240178676Ssam#define IWN_CMD_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->sc_cmdlock) 241178676Ssam#define IWN_CMD_LOCK(_sc) mtx_lock(&(_sc)->sc_cmdlock) 242178676Ssam#define IWN_CMD_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_cmdlock) 243