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 */ 19struct wpi_rx_radiotap_header { 20 struct ieee80211_radiotap_header wr_ihdr; 21 uint64_t wr_tsft; 22 uint8_t wr_flags; 23 uint8_t wr_rate; 24 uint16_t wr_chan_freq; 25 uint16_t wr_chan_flags; 26 int8_t wr_dbm_antsignal; 27 int8_t wr_dbm_antnoise; 28 uint8_t wr_antenna; 29} __packed; 30 31#define WPI_RX_RADIOTAP_PRESENT \ 32 ((1 << IEEE80211_RADIOTAP_TSFT) | \ 33 (1 << IEEE80211_RADIOTAP_FLAGS) | \ 34 (1 << IEEE80211_RADIOTAP_RATE) | \ 35 (1 << IEEE80211_RADIOTAP_CHANNEL) | \ 36 (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \ 37 (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) | \ 38 (1 << IEEE80211_RADIOTAP_ANTENNA)) 39 40struct wpi_tx_radiotap_header { 41 struct ieee80211_radiotap_header wt_ihdr; 42 uint8_t wt_flags; 43 uint8_t wt_rate; 44 uint16_t wt_chan_freq; 45 uint16_t wt_chan_flags; 46} __packed; 47 48#define WPI_TX_RADIOTAP_PRESENT \ 49 ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 50 (1 << IEEE80211_RADIOTAP_RATE) | \ 51 (1 << IEEE80211_RADIOTAP_CHANNEL)) 52 53struct wpi_dma_info { 54 bus_dma_tag_t tag; 55 bus_dmamap_t map; 56 bus_addr_t paddr; 57 caddr_t vaddr; 58 bus_size_t size; 59}; 60 61struct wpi_tx_data { 62 bus_dmamap_t map; 63 bus_addr_t cmd_paddr; 64 struct mbuf *m; 65 struct ieee80211_node *ni; 66}; 67 68struct wpi_tx_ring { 69 struct wpi_dma_info desc_dma; 70 struct wpi_dma_info cmd_dma; 71 struct wpi_tx_desc *desc; 72 struct wpi_tx_cmd *cmd; 73 struct wpi_tx_data data[WPI_TX_RING_COUNT]; 74 bus_dma_tag_t data_dmat; 75 int qid; 76 int queued; 77 int cur; 78 int update; 79}; 80 81struct wpi_rx_data { 82 struct mbuf *m; 83 bus_dmamap_t map; 84}; 85 86struct wpi_rx_ring { 87 struct wpi_dma_info desc_dma; 88 uint32_t *desc; 89 struct wpi_rx_data data[WPI_RX_RING_COUNT]; 90 bus_dma_tag_t data_dmat; 91 int cur; 92 int update; 93}; 94 95struct wpi_node { 96 struct ieee80211_node ni; /* must be the first */ 97 uint8_t id; 98};
| 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 */ 19struct wpi_rx_radiotap_header { 20 struct ieee80211_radiotap_header wr_ihdr; 21 uint64_t wr_tsft; 22 uint8_t wr_flags; 23 uint8_t wr_rate; 24 uint16_t wr_chan_freq; 25 uint16_t wr_chan_flags; 26 int8_t wr_dbm_antsignal; 27 int8_t wr_dbm_antnoise; 28 uint8_t wr_antenna; 29} __packed; 30 31#define WPI_RX_RADIOTAP_PRESENT \ 32 ((1 << IEEE80211_RADIOTAP_TSFT) | \ 33 (1 << IEEE80211_RADIOTAP_FLAGS) | \ 34 (1 << IEEE80211_RADIOTAP_RATE) | \ 35 (1 << IEEE80211_RADIOTAP_CHANNEL) | \ 36 (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \ 37 (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE) | \ 38 (1 << IEEE80211_RADIOTAP_ANTENNA)) 39 40struct wpi_tx_radiotap_header { 41 struct ieee80211_radiotap_header wt_ihdr; 42 uint8_t wt_flags; 43 uint8_t wt_rate; 44 uint16_t wt_chan_freq; 45 uint16_t wt_chan_flags; 46} __packed; 47 48#define WPI_TX_RADIOTAP_PRESENT \ 49 ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 50 (1 << IEEE80211_RADIOTAP_RATE) | \ 51 (1 << IEEE80211_RADIOTAP_CHANNEL)) 52 53struct wpi_dma_info { 54 bus_dma_tag_t tag; 55 bus_dmamap_t map; 56 bus_addr_t paddr; 57 caddr_t vaddr; 58 bus_size_t size; 59}; 60 61struct wpi_tx_data { 62 bus_dmamap_t map; 63 bus_addr_t cmd_paddr; 64 struct mbuf *m; 65 struct ieee80211_node *ni; 66}; 67 68struct wpi_tx_ring { 69 struct wpi_dma_info desc_dma; 70 struct wpi_dma_info cmd_dma; 71 struct wpi_tx_desc *desc; 72 struct wpi_tx_cmd *cmd; 73 struct wpi_tx_data data[WPI_TX_RING_COUNT]; 74 bus_dma_tag_t data_dmat; 75 int qid; 76 int queued; 77 int cur; 78 int update; 79}; 80 81struct wpi_rx_data { 82 struct mbuf *m; 83 bus_dmamap_t map; 84}; 85 86struct wpi_rx_ring { 87 struct wpi_dma_info desc_dma; 88 uint32_t *desc; 89 struct wpi_rx_data data[WPI_RX_RING_COUNT]; 90 bus_dma_tag_t data_dmat; 91 int cur; 92 int update; 93}; 94 95struct wpi_node { 96 struct ieee80211_node ni; /* must be the first */ 97 uint8_t id; 98};
|
99 100struct wpi_power_sample { 101 uint8_t index; 102 int8_t power; 103}; 104 105struct wpi_power_group { 106#define WPI_SAMPLES_COUNT 5 107 struct wpi_power_sample samples[WPI_SAMPLES_COUNT]; 108 uint8_t chan; 109 int8_t maxpwr; 110 int16_t temp; 111}; 112 113struct wpi_buf { 114 void *data; 115 struct ieee80211_node *ni; 116 struct mbuf *m; 117 size_t size; 118 int code; 119 int ac; 120}; 121 122struct wpi_vap { 123 struct ieee80211vap vap; 124 struct wpi_buf wv_bcbuf; 125 126 int (*newstate)(struct ieee80211vap *, 127 enum ieee80211_state, int); 128}; 129#define WPI_VAP(vap) ((struct wpi_vap *)(vap)) 130 131struct wpi_fw_part { 132 const uint8_t *text; 133 uint32_t textsz; 134 const uint8_t *data; 135 uint32_t datasz; 136}; 137 138struct wpi_fw_info { 139 const uint8_t *data; 140 size_t size; 141 struct wpi_fw_part init; 142 struct wpi_fw_part main; 143 struct wpi_fw_part boot; 144}; 145 146struct wpi_softc { 147 device_t sc_dev; 148 149 struct ifnet *sc_ifp; 150 int sc_debug; 151 152 struct mtx sc_mtx; 153 struct unrhdr *sc_unr; 154 155 /* Flags indicating the current state the driver 156 * expects the hardware to be in 157 */ 158 uint32_t flags; 159#define WPI_FLAG_BUSY (1 << 0) 160 161 /* Shared area. */ 162 struct wpi_dma_info shared_dma; 163 struct wpi_shared *shared; 164 165 struct wpi_tx_ring txq[WPI_NTXQUEUES]; 166 struct wpi_rx_ring rxq; 167 168 /* TX Thermal Callibration. */ 169 struct callout calib_to; 170 int calib_cnt; 171 172 /* Watch dog timers. */ 173 struct callout watchdog_to; 174 struct callout watchdog_rfkill; 175 176 /* Firmware image. */ 177 struct wpi_fw_info fw; 178 uint32_t errptr; 179 180 struct resource *irq; 181 struct resource *mem; 182 bus_space_tag_t sc_st; 183 bus_space_handle_t sc_sh; 184 void *sc_ih; 185 bus_size_t sc_sz; 186 int sc_cap_off; /* PCIe Capabilities. */ 187 188 struct wpi_rxon rxon; 189 int temp; 190 uint32_t qfullmsk; 191 192 int sc_tx_timer; 193 int sc_scan_timer; 194 195 void (*sc_node_free)(struct ieee80211_node *); 196 void (*sc_scan_curchan)(struct ieee80211_scan_state *, 197 unsigned long); 198 199 struct wpi_rx_radiotap_header sc_rxtap; 200 struct wpi_tx_radiotap_header sc_txtap; 201 202 /* Firmware image. */ 203 const struct firmware *fw_fp; 204 205 /* Firmware DMA transfer. */ 206 struct wpi_dma_info fw_dma; 207 208 /* Tasks used by the driver. */ 209 struct task sc_reinittask; 210 struct task sc_radiooff_task; 211 struct task sc_radioon_task; 212 213 /* Eeprom info. */ 214 uint8_t cap; 215 uint16_t rev; 216 uint8_t type; 217 struct wpi_eeprom_chan 218 eeprom_channels[WPI_CHAN_BANDS_COUNT][WPI_MAX_CHAN_PER_BAND]; 219 struct wpi_power_group groups[WPI_POWER_GROUPS_COUNT]; 220 int8_t maxpwr[IEEE80211_CHAN_MAX]; 221 char domain[4]; /* Regulatory domain. */ 222}; 223 224#define WPI_LOCK_INIT(_sc) \ 225 mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \ 226 MTX_NETWORK_LOCK, MTX_DEF) 227#define WPI_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx) 228#define WPI_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx) 229#define WPI_LOCK_ASSERT(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED) 230#define WPI_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->sc_mtx)
| 100 101struct wpi_power_sample { 102 uint8_t index; 103 int8_t power; 104}; 105 106struct wpi_power_group { 107#define WPI_SAMPLES_COUNT 5 108 struct wpi_power_sample samples[WPI_SAMPLES_COUNT]; 109 uint8_t chan; 110 int8_t maxpwr; 111 int16_t temp; 112}; 113 114struct wpi_buf { 115 void *data; 116 struct ieee80211_node *ni; 117 struct mbuf *m; 118 size_t size; 119 int code; 120 int ac; 121}; 122 123struct wpi_vap { 124 struct ieee80211vap vap; 125 struct wpi_buf wv_bcbuf; 126 127 int (*newstate)(struct ieee80211vap *, 128 enum ieee80211_state, int); 129}; 130#define WPI_VAP(vap) ((struct wpi_vap *)(vap)) 131 132struct wpi_fw_part { 133 const uint8_t *text; 134 uint32_t textsz; 135 const uint8_t *data; 136 uint32_t datasz; 137}; 138 139struct wpi_fw_info { 140 const uint8_t *data; 141 size_t size; 142 struct wpi_fw_part init; 143 struct wpi_fw_part main; 144 struct wpi_fw_part boot; 145}; 146 147struct wpi_softc { 148 device_t sc_dev; 149 150 struct ifnet *sc_ifp; 151 int sc_debug; 152 153 struct mtx sc_mtx; 154 struct unrhdr *sc_unr; 155 156 /* Flags indicating the current state the driver 157 * expects the hardware to be in 158 */ 159 uint32_t flags; 160#define WPI_FLAG_BUSY (1 << 0) 161 162 /* Shared area. */ 163 struct wpi_dma_info shared_dma; 164 struct wpi_shared *shared; 165 166 struct wpi_tx_ring txq[WPI_NTXQUEUES]; 167 struct wpi_rx_ring rxq; 168 169 /* TX Thermal Callibration. */ 170 struct callout calib_to; 171 int calib_cnt; 172 173 /* Watch dog timers. */ 174 struct callout watchdog_to; 175 struct callout watchdog_rfkill; 176 177 /* Firmware image. */ 178 struct wpi_fw_info fw; 179 uint32_t errptr; 180 181 struct resource *irq; 182 struct resource *mem; 183 bus_space_tag_t sc_st; 184 bus_space_handle_t sc_sh; 185 void *sc_ih; 186 bus_size_t sc_sz; 187 int sc_cap_off; /* PCIe Capabilities. */ 188 189 struct wpi_rxon rxon; 190 int temp; 191 uint32_t qfullmsk; 192 193 int sc_tx_timer; 194 int sc_scan_timer; 195 196 void (*sc_node_free)(struct ieee80211_node *); 197 void (*sc_scan_curchan)(struct ieee80211_scan_state *, 198 unsigned long); 199 200 struct wpi_rx_radiotap_header sc_rxtap; 201 struct wpi_tx_radiotap_header sc_txtap; 202 203 /* Firmware image. */ 204 const struct firmware *fw_fp; 205 206 /* Firmware DMA transfer. */ 207 struct wpi_dma_info fw_dma; 208 209 /* Tasks used by the driver. */ 210 struct task sc_reinittask; 211 struct task sc_radiooff_task; 212 struct task sc_radioon_task; 213 214 /* Eeprom info. */ 215 uint8_t cap; 216 uint16_t rev; 217 uint8_t type; 218 struct wpi_eeprom_chan 219 eeprom_channels[WPI_CHAN_BANDS_COUNT][WPI_MAX_CHAN_PER_BAND]; 220 struct wpi_power_group groups[WPI_POWER_GROUPS_COUNT]; 221 int8_t maxpwr[IEEE80211_CHAN_MAX]; 222 char domain[4]; /* Regulatory domain. */ 223}; 224 225#define WPI_LOCK_INIT(_sc) \ 226 mtx_init(&(_sc)->sc_mtx, device_get_nameunit((_sc)->sc_dev), \ 227 MTX_NETWORK_LOCK, MTX_DEF) 228#define WPI_LOCK(_sc) mtx_lock(&(_sc)->sc_mtx) 229#define WPI_UNLOCK(_sc) mtx_unlock(&(_sc)->sc_mtx) 230#define WPI_LOCK_ASSERT(sc) mtx_assert(&(sc)->sc_mtx, MA_OWNED) 231#define WPI_LOCK_DESTROY(_sc) mtx_destroy(&(_sc)->sc_mtx)
|