1 /* $FreeBSD$ */ 2 3 /*- 4 * Copyright (c) 2006,2007 5 * Damien Bergamini <damien.bergamini@free.fr> 6 * 7 * Permission to use, copy, modify, and distribute this software for any 8 * purpose with or without fee is hereby granted, provided that the above 9 * copyright notice and this permission notice appear in all copies. 10 * 11 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES 12 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF 13 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR 14 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES 15 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN 16 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF 17 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. 18 */ 19 #if ( __FreeBSD_version > 700000 ) 20 #include <net80211/ieee80211_amrr.h> 21 #else 22 #include <dev/wpi/ieee80211_amrr.h> 23 #endif 24 25 /* DMA mapping */ 26 struct wpi_mapping { 27 int nsegs; 28 bus_dma_segment_t segs[WPI_MAX_SCATTER]; 29 }; 30 31 struct wpi_rx_radiotap_header { 32 struct ieee80211_radiotap_header wr_ihdr; 33 uint64_t wr_tsft; 34 uint8_t wr_flags; 35 uint8_t wr_rate; 36 uint16_t wr_chan_freq; 37 uint16_t wr_chan_flags; 38 int8_t wr_dbm_antsignal; 39 int8_t wr_dbm_antnoise; 40 uint8_t wr_antenna; 41 }; 42 43 #define WPI_RX_RADIOTAP_PRESENT \ 44 ((1 << IEEE80211_RADIOTAP_TSFT) | \ 45 (1 << IEEE80211_RADIOTAP_FLAGS) | \ 46 (1 << IEEE80211_RADIOTAP_RATE) | \ 47 (1 << IEEE80211_RADIOTAP_CHANNEL) | \ 48 (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \ 49 (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) | \ 50 (1 << IEEE80211_RADIOTAP_ANTENNA)) 51 52 struct wpi_tx_radiotap_header { 53 struct ieee80211_radiotap_header wt_ihdr; 54 uint8_t wt_flags; 55 uint8_t wt_rate; 56 uint16_t wt_chan_freq; 57 uint16_t wt_chan_flags; 58 uint8_t wt_hwqueue; 59 }; 60 61 #define WPI_TX_RADIOTAP_PRESENT \ 62 ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 63 (1 << IEEE80211_RADIOTAP_RATE) | \ 64 (1 << IEEE80211_RADIOTAP_CHANNEL)) 65 66 struct wpi_dma_info { 67 bus_dma_tag_t tag; 68 bus_dmamap_t map; 69 bus_addr_t paddr; 70 caddr_t vaddr; 71 bus_size_t size; 72 }; 73 74 struct wpi_tx_data { 75 bus_dmamap_t map; 76 struct mbuf *m; 77 struct ieee80211_node *ni; 78 }; 79 80 struct wpi_tx_ring { 81 struct wpi_dma_info desc_dma; 82 struct wpi_dma_info cmd_dma; 83 struct wpi_tx_desc *desc; 84 struct wpi_tx_cmd *cmd; 85 struct wpi_tx_data *data; 86 bus_dma_tag_t data_dmat; 87 int qid; 88 int count; 89 int queued; 90 int cur; 91 }; 92 93 #define WPI_RBUF_COUNT ( WPI_RX_RING_COUNT + 16 ) 94 95 struct wpi_softc; 96 97 struct wpi_rbuf { 98 struct wpi_softc *sc; 99 bus_addr_t paddr; 100 caddr_t vaddr; 101 SLIST_ENTRY(wpi_rbuf) next; 102 }; 103 104 struct wpi_rx_data { 105 struct mbuf *m; 106 }; 107 108 struct wpi_rx_ring { 109 struct wpi_dma_info desc_dma; 110 struct wpi_dma_info buf_dma; 111 uint32_t *desc; 112 struct wpi_rx_data data[WPI_RX_RING_COUNT]; 113 struct wpi_rbuf rbuf[WPI_RBUF_COUNT]; 114 SLIST_HEAD(, wpi_rbuf) freelist; 115 int cur; 116 }; 117 118 struct wpi_amrr { 119 struct ieee80211_node ni; /* must be the first */ 120 int txcnt; 121 int retrycnt; 122 int success; 123 int success_threshold; 124 int recovery; 125 }; 126 127 struct wpi_node { 128 struct ieee80211_node ni; /* must be the first */ 129 struct ieee80211_amrr_node amn; 130 }; 131 132 struct wpi_power_sample { 133 uint8_t index; 134 int8_t power; 135 }; 136 137 struct wpi_power_group { 138 #define WPI_SAMPLES_COUNT 5 139 struct wpi_power_sample samples[WPI_SAMPLES_COUNT]; 140 uint8_t chan; 141 int8_t maxpwr; 142 int16_t temp; 143 }; 144 145 struct wpi_softc { 146 device_t sc_dev; 147 struct ifnet *sc_ifp; 148 149 /* net80211 driver specifics */ 150 struct ieee80211com sc_ic; 151 int (*sc_newstate)(struct ieee80211com *, 152 enum ieee80211_state, int); 153 unsigned long maxdwell; /* Max dwell time whilst scanning */ 154 155 struct mtx sc_mtx; 156 157 struct ieee80211_amrr amrr; 158 159 /* Flags indicating the current state the driver 160 * expects the hardware to be in 161 */ 162 uint32_t flags; 163 #define WPI_FLAG_HW_RADIO_OFF (1 << 0) 164 #define WPI_FLAG_SCANNING (1 << 1) 165 #define WPI_FLAG_BUSY (1 << 2) 166 #define WPI_FLAG_AUTH (1 << 3) 167 168 /* Flags indicating the state of the firmware */ 169 uint32_t fw_state; 170 #define WPI_FW_IDLE (1 << 0 ) 171 172 /* shared area */ 173 struct wpi_dma_info shared_dma; 174 struct wpi_shared *shared; 175 176 struct wpi_tx_ring txq[WME_NUM_AC]; 177 struct wpi_tx_ring cmdq; 178 struct wpi_rx_ring rxq; 179 180 /* TX Thermal Callibration */ 181 struct callout calib_to; 182 int calib_cnt; 183 184 /* Watch dog timer */ 185 struct callout watchdog_to; 186 int watchdog_cnt; 187 188 struct resource *irq; 189 struct resource *mem; 190 bus_space_tag_t sc_st; 191 bus_space_handle_t sc_sh; 192 void *sc_ih; 193 int mem_rid; 194 int irq_rid; 195 196 struct wpi_config config; 197 int temp; 198 199 200 int sc_tx_timer; 201 202 struct bpf_if *sc_drvbpf; 203 204 struct wpi_rx_radiotap_header sc_rxtap; 205 int sc_rxtap_len; 206 struct wpi_tx_radiotap_header sc_txtap; 207 int sc_txtap_len; 208 209 /* firmware image */ 210 const struct firmware *fw_fp; 211 212 /* firmware DMA transfer */ 213 struct wpi_dma_info fw_dma; 214 215 /* command queue related variables */ 216 #define WPI_CMD_MAXOPS 10 217 #define WPI_SCAN_START (1<<0) 218 #define WPI_SCAN_CURCHAN (1<<1) 219 #define WPI_SCAN_STOP (1<<2) 220 #define WPI_SET_CHAN (1<<3) 221 #define WPI_AUTH (1<<4) 222 #define WPI_SCAN_NEXT (1<<5) 223 int sc_cmd[WPI_CMD_MAXOPS]; 224 int sc_cmd_cur; /* current queued scan task */ 225 int sc_cmd_next; /* last queued scan task */ 226 struct mtx sc_cmdlock; 227 228 /* Task queues used to control the driver */ 229 struct taskqueue *sc_tq; /* Main command task queue */ 230 struct taskqueue *sc_tq2;/* firmware reset task queue */ 231 232 /* Tasks used by the driver */ 233 struct task sc_radioontask; /* enable rf transmitter task*/ 234 struct task sc_radioofftask;/* disable rf transmitter task*/ 235 struct task sc_opstask; /* operation handling task */ 236 struct task sc_restarttask; /* reset firmware task */ 237 238 /* Eeprom info */ 239 uint8_t cap; 240 uint16_t rev; 241 uint8_t type; 242 struct wpi_power_group groups[WPI_POWER_GROUPS_COUNT]; 243 int8_t maxpwr[IEEE80211_CHAN_MAX]; 244 char domain[4]; //reglatory domain //XXX 245 }; 246 #define WPI_LOCK_INIT(_sc) \ 247 mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \ 248 MTX_NETWORK_LOCK, MTX_DEF) 249 #define WPI_LOCK_DECL int __waslocked = 0 250 #define WPI_LOCK(_sc) do {\ 251 if (!(__waslocked = mtx_owned(&(_sc)->sc_mtx))) \ 252 mtx_lock(&(_sc)->sc_mtx); \ 253 } while(0) 254 #define WPI_UNLOCK(_sc) do { \ 255 if (!__waslocked) \ 256 mtx_unlock(&(_sc)->sc_mtx); \ 257 } while (0) 258 259 #define WPI_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->sc_mtx) 260 #define WPI_CMD_LOCK_INIT(_sc) \ 261 mtx_init(&(_sc)->sc_cmdlock, device_get_nameunit((_sc)->sc_dev), NULL, MTX_DEF); 262 #define WPI_CMD_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->sc_cmdlock) 263 #define WPI_CMD_LOCK(_sc) mtx_lock(&(_sc)->sc_cmdlock) 264 #define WPI_CMD_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_cmdlock) 265 #if defined(INVARIANTS) || defined(INVARIANT_SUPPORT) 266 #define WPI_LOCK_ASSERT(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED) 267 #else 268 #define WPI_LOCK_ASSERT(sc) 269 #endif 270