1*4db7dd1bSJoe Talbott /* $FreeBSD: src/sys/dev/wpi/if_wpivar.h,v 1.6.2.1 2009/08/03 08:13:06 kensmith Exp $ */ 2*4db7dd1bSJoe Talbott 3*4db7dd1bSJoe Talbott /*- 4*4db7dd1bSJoe Talbott * Copyright (c) 2006,2007 5*4db7dd1bSJoe Talbott * Damien Bergamini <damien.bergamini@free.fr> 6*4db7dd1bSJoe Talbott * 7*4db7dd1bSJoe Talbott * Permission to use, copy, modify, and distribute this software for any 8*4db7dd1bSJoe Talbott * purpose with or without fee is hereby granted, provided that the above 9*4db7dd1bSJoe Talbott * copyright notice and this permission notice appear in all copies. 10*4db7dd1bSJoe Talbott * 11*4db7dd1bSJoe Talbott * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12*4db7dd1bSJoe Talbott * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13*4db7dd1bSJoe Talbott * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14*4db7dd1bSJoe Talbott * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15*4db7dd1bSJoe Talbott * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16*4db7dd1bSJoe Talbott * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17*4db7dd1bSJoe Talbott * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18*4db7dd1bSJoe Talbott */ 19*4db7dd1bSJoe Talbott #include <netproto/802_11/ieee80211_amrr.h> 20*4db7dd1bSJoe Talbott 21*4db7dd1bSJoe Talbott struct wpi_rx_radiotap_header { 22*4db7dd1bSJoe Talbott struct ieee80211_radiotap_header wr_ihdr; 23*4db7dd1bSJoe Talbott uint64_t wr_tsft; 24*4db7dd1bSJoe Talbott uint8_t wr_flags; 25*4db7dd1bSJoe Talbott uint8_t wr_rate; 26*4db7dd1bSJoe Talbott uint16_t wr_chan_freq; 27*4db7dd1bSJoe Talbott uint16_t wr_chan_flags; 28*4db7dd1bSJoe Talbott int8_t wr_dbm_antsignal; 29*4db7dd1bSJoe Talbott int8_t wr_dbm_antnoise; 30*4db7dd1bSJoe Talbott uint8_t wr_antenna; 31*4db7dd1bSJoe Talbott }; 32*4db7dd1bSJoe Talbott 33*4db7dd1bSJoe Talbott #define WPI_RX_RADIOTAP_PRESENT \ 34*4db7dd1bSJoe Talbott ((1 << IEEE80211_RADIOTAP_TSFT) | \ 35*4db7dd1bSJoe Talbott (1 << IEEE80211_RADIOTAP_FLAGS) | \ 36*4db7dd1bSJoe Talbott (1 << IEEE80211_RADIOTAP_RATE) | \ 37*4db7dd1bSJoe Talbott (1 << IEEE80211_RADIOTAP_CHANNEL) | \ 38*4db7dd1bSJoe Talbott (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \ 39*4db7dd1bSJoe Talbott (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) | \ 40*4db7dd1bSJoe Talbott (1 << IEEE80211_RADIOTAP_ANTENNA)) 41*4db7dd1bSJoe Talbott 42*4db7dd1bSJoe Talbott struct wpi_tx_radiotap_header { 43*4db7dd1bSJoe Talbott struct ieee80211_radiotap_header wt_ihdr; 44*4db7dd1bSJoe Talbott uint8_t wt_flags; 45*4db7dd1bSJoe Talbott uint8_t wt_rate; 46*4db7dd1bSJoe Talbott uint16_t wt_chan_freq; 47*4db7dd1bSJoe Talbott uint16_t wt_chan_flags; 48*4db7dd1bSJoe Talbott uint8_t wt_hwqueue; 49*4db7dd1bSJoe Talbott }; 50*4db7dd1bSJoe Talbott 51*4db7dd1bSJoe Talbott #define WPI_TX_RADIOTAP_PRESENT \ 52*4db7dd1bSJoe Talbott ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 53*4db7dd1bSJoe Talbott (1 << IEEE80211_RADIOTAP_RATE) | \ 54*4db7dd1bSJoe Talbott (1 << IEEE80211_RADIOTAP_CHANNEL)) 55*4db7dd1bSJoe Talbott 56*4db7dd1bSJoe Talbott struct wpi_dma_info { 57*4db7dd1bSJoe Talbott bus_dma_tag_t tag; 58*4db7dd1bSJoe Talbott bus_dmamap_t map; 59*4db7dd1bSJoe Talbott bus_addr_t paddr; /* aligned p address */ 60*4db7dd1bSJoe Talbott bus_addr_t paddr_start; /* possibly unaligned p start*/ 61*4db7dd1bSJoe Talbott caddr_t vaddr; /* aligned v address */ 62*4db7dd1bSJoe Talbott caddr_t vaddr_start; /* possibly unaligned v start */ 63*4db7dd1bSJoe Talbott bus_size_t size; 64*4db7dd1bSJoe Talbott }; 65*4db7dd1bSJoe Talbott 66*4db7dd1bSJoe Talbott struct wpi_tx_data { 67*4db7dd1bSJoe Talbott bus_dmamap_t map; 68*4db7dd1bSJoe Talbott struct mbuf *m; 69*4db7dd1bSJoe Talbott struct ieee80211_node *ni; 70*4db7dd1bSJoe Talbott }; 71*4db7dd1bSJoe Talbott 72*4db7dd1bSJoe Talbott struct wpi_tx_ring { 73*4db7dd1bSJoe Talbott struct wpi_dma_info desc_dma; 74*4db7dd1bSJoe Talbott struct wpi_dma_info cmd_dma; 75*4db7dd1bSJoe Talbott struct wpi_tx_desc *desc; 76*4db7dd1bSJoe Talbott struct wpi_tx_cmd *cmd; 77*4db7dd1bSJoe Talbott struct wpi_tx_data *data; 78*4db7dd1bSJoe Talbott bus_dma_tag_t data_dmat; 79*4db7dd1bSJoe Talbott int qid; 80*4db7dd1bSJoe Talbott int count; 81*4db7dd1bSJoe Talbott int queued; 82*4db7dd1bSJoe Talbott int cur; 83*4db7dd1bSJoe Talbott }; 84*4db7dd1bSJoe Talbott 85*4db7dd1bSJoe Talbott #define WPI_RBUF_COUNT ( WPI_RX_RING_COUNT + 16 ) 86*4db7dd1bSJoe Talbott 87*4db7dd1bSJoe Talbott struct wpi_rx_data { 88*4db7dd1bSJoe Talbott bus_dmamap_t map; 89*4db7dd1bSJoe Talbott struct mbuf *m; 90*4db7dd1bSJoe Talbott }; 91*4db7dd1bSJoe Talbott 92*4db7dd1bSJoe Talbott struct wpi_rx_ring { 93*4db7dd1bSJoe Talbott struct wpi_dma_info desc_dma; 94*4db7dd1bSJoe Talbott uint32_t *desc; 95*4db7dd1bSJoe Talbott struct wpi_rx_data data[WPI_RX_RING_COUNT]; 96*4db7dd1bSJoe Talbott bus_dma_tag_t data_dmat; 97*4db7dd1bSJoe Talbott int cur; 98*4db7dd1bSJoe Talbott }; 99*4db7dd1bSJoe Talbott 100*4db7dd1bSJoe Talbott struct wpi_amrr { 101*4db7dd1bSJoe Talbott struct ieee80211_node ni; /* must be the first */ 102*4db7dd1bSJoe Talbott int txcnt; 103*4db7dd1bSJoe Talbott int retrycnt; 104*4db7dd1bSJoe Talbott int success; 105*4db7dd1bSJoe Talbott int success_threshold; 106*4db7dd1bSJoe Talbott int recovery; 107*4db7dd1bSJoe Talbott }; 108*4db7dd1bSJoe Talbott 109*4db7dd1bSJoe Talbott struct wpi_node { 110*4db7dd1bSJoe Talbott struct ieee80211_node ni; /* must be the first */ 111*4db7dd1bSJoe Talbott struct ieee80211_amrr_node amn; 112*4db7dd1bSJoe Talbott }; 113*4db7dd1bSJoe Talbott #define WPI_NODE(ni) ((struct wpi_node *)(ni)) 114*4db7dd1bSJoe Talbott 115*4db7dd1bSJoe Talbott struct wpi_power_sample { 116*4db7dd1bSJoe Talbott uint8_t index; 117*4db7dd1bSJoe Talbott int8_t power; 118*4db7dd1bSJoe Talbott }; 119*4db7dd1bSJoe Talbott 120*4db7dd1bSJoe Talbott struct wpi_power_group { 121*4db7dd1bSJoe Talbott #define WPI_SAMPLES_COUNT 5 122*4db7dd1bSJoe Talbott struct wpi_power_sample samples[WPI_SAMPLES_COUNT]; 123*4db7dd1bSJoe Talbott uint8_t chan; 124*4db7dd1bSJoe Talbott int8_t maxpwr; 125*4db7dd1bSJoe Talbott int16_t temp; 126*4db7dd1bSJoe Talbott }; 127*4db7dd1bSJoe Talbott 128*4db7dd1bSJoe Talbott struct wpi_vap { 129*4db7dd1bSJoe Talbott struct ieee80211vap vap; 130*4db7dd1bSJoe Talbott struct ieee80211_amrr amrr; 131*4db7dd1bSJoe Talbott 132*4db7dd1bSJoe Talbott int (*newstate)(struct ieee80211vap *, 133*4db7dd1bSJoe Talbott enum ieee80211_state, int); 134*4db7dd1bSJoe Talbott }; 135*4db7dd1bSJoe Talbott #define WPI_VAP(vap) ((struct wpi_vap *)(vap)) 136*4db7dd1bSJoe Talbott 137*4db7dd1bSJoe Talbott struct wpi_softc { 138*4db7dd1bSJoe Talbott device_t sc_dev; 139*4db7dd1bSJoe Talbott struct ifnet *sc_ifp; 140*4db7dd1bSJoe Talbott struct lock sc_lock; 141*4db7dd1bSJoe Talbott 142*4db7dd1bSJoe Talbott struct fw_image *sc_fw_image; 143*4db7dd1bSJoe Talbott 144*4db7dd1bSJoe Talbott /* Flags indicating the current state the driver 145*4db7dd1bSJoe Talbott * expects the hardware to be in 146*4db7dd1bSJoe Talbott */ 147*4db7dd1bSJoe Talbott uint32_t flags; 148*4db7dd1bSJoe Talbott #define WPI_FLAG_HW_RADIO_OFF (1 << 0) 149*4db7dd1bSJoe Talbott #define WPI_FLAG_BUSY (1 << 1) 150*4db7dd1bSJoe Talbott #define WPI_FLAG_AUTH (1 << 2) 151*4db7dd1bSJoe Talbott 152*4db7dd1bSJoe Talbott /* shared area */ 153*4db7dd1bSJoe Talbott struct wpi_dma_info shared_dma; 154*4db7dd1bSJoe Talbott struct wpi_shared *shared; 155*4db7dd1bSJoe Talbott 156*4db7dd1bSJoe Talbott struct wpi_tx_ring txq[WME_NUM_AC]; 157*4db7dd1bSJoe Talbott struct wpi_tx_ring cmdq; 158*4db7dd1bSJoe Talbott struct wpi_rx_ring rxq; 159*4db7dd1bSJoe Talbott 160*4db7dd1bSJoe Talbott /* TX Thermal Callibration */ 161*4db7dd1bSJoe Talbott struct callout calib_to; 162*4db7dd1bSJoe Talbott int calib_cnt; 163*4db7dd1bSJoe Talbott 164*4db7dd1bSJoe Talbott /* Watch dog timer */ 165*4db7dd1bSJoe Talbott struct callout watchdog_to; 166*4db7dd1bSJoe Talbott /* Hardware switch polling timer */ 167*4db7dd1bSJoe Talbott struct callout hwswitch_to; 168*4db7dd1bSJoe Talbott 169*4db7dd1bSJoe Talbott struct resource *irq; 170*4db7dd1bSJoe Talbott struct resource *mem; 171*4db7dd1bSJoe Talbott bus_space_tag_t sc_st; 172*4db7dd1bSJoe Talbott bus_space_handle_t sc_sh; 173*4db7dd1bSJoe Talbott void *sc_ih; 174*4db7dd1bSJoe Talbott int mem_rid; 175*4db7dd1bSJoe Talbott int irq_rid; 176*4db7dd1bSJoe Talbott 177*4db7dd1bSJoe Talbott struct wpi_config config; 178*4db7dd1bSJoe Talbott int temp; 179*4db7dd1bSJoe Talbott 180*4db7dd1bSJoe Talbott 181*4db7dd1bSJoe Talbott int sc_tx_timer; 182*4db7dd1bSJoe Talbott int sc_scan_timer; 183*4db7dd1bSJoe Talbott 184*4db7dd1bSJoe Talbott struct bpf_if *sc_drvbpf; 185*4db7dd1bSJoe Talbott 186*4db7dd1bSJoe Talbott struct wpi_rx_radiotap_header sc_rxtap; 187*4db7dd1bSJoe Talbott struct wpi_tx_radiotap_header sc_txtap; 188*4db7dd1bSJoe Talbott 189*4db7dd1bSJoe Talbott /* firmware image */ 190*4db7dd1bSJoe Talbott const struct firmware *fw_fp; 191*4db7dd1bSJoe Talbott 192*4db7dd1bSJoe Talbott /* firmware DMA transfer */ 193*4db7dd1bSJoe Talbott struct wpi_dma_info fw_dma; 194*4db7dd1bSJoe Talbott 195*4db7dd1bSJoe Talbott /* Tasks used by the driver */ 196*4db7dd1bSJoe Talbott struct task sc_restarttask; /* reset firmware task */ 197*4db7dd1bSJoe Talbott struct task sc_radiotask; /* reset rf task */ 198*4db7dd1bSJoe Talbott 199*4db7dd1bSJoe Talbott /* Eeprom info */ 200*4db7dd1bSJoe Talbott uint8_t cap; 201*4db7dd1bSJoe Talbott uint16_t rev; 202*4db7dd1bSJoe Talbott uint8_t type; 203*4db7dd1bSJoe Talbott struct wpi_power_group groups[WPI_POWER_GROUPS_COUNT]; 204*4db7dd1bSJoe Talbott int8_t maxpwr[IEEE80211_CHAN_MAX]; 205*4db7dd1bSJoe Talbott char domain[4]; /*reglatory domain XXX */ 206*4db7dd1bSJoe Talbott }; 207*4db7dd1bSJoe Talbott #define WPI_LOCK_INIT(_sc) \ 208*4db7dd1bSJoe Talbott lockinit(&(_sc)->sc_lock, device_get_nameunit((_sc)->sc_dev), \ 209*4db7dd1bSJoe Talbott 0, LK_CANRECURSE) 210*4db7dd1bSJoe Talbott #define WPI_LOCK(_sc) lockmgr(&(_sc)->sc_lock, LK_EXCLUSIVE) 211*4db7dd1bSJoe Talbott #define WPI_UNLOCK(_sc) lockmgr(&(_sc)->sc_lock, LK_RELEASE) 212*4db7dd1bSJoe Talbott #define WPI_LOCK_ASSERT(sc) KKASSERT(lockstatus(&(sc)->sc_lock, curthread) != 0) 213*4db7dd1bSJoe Talbott #define WPI_LOCK_DESTROY(_sc) lockuninit(&(_sc)->sc_lock) 214