1 /* $FreeBSD$ */ 2 3 /*- 4 * Copyright (c) 2004, 2005 5 * Damien Bergamini <damien.bergamini@free.fr>. All rights reserved. 6 * 7 * Redistribution and use in source and binary forms, with or without 8 * modification, are permitted provided that the following conditions 9 * are met: 10 * 1. Redistributions of source code must retain the above copyright 11 * notice unmodified, this list of conditions, and the following 12 * disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 17 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 18 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 19 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 20 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 21 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 22 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 23 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 24 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 25 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 26 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 27 * SUCH DAMAGE. 28 */ 29 30 struct iwi_firmware { 31 void *boot; 32 int boot_size; 33 void *ucode; 34 int ucode_size; 35 void *main; 36 int main_size; 37 }; 38 39 struct iwi_rx_radiotap_header { 40 struct ieee80211_radiotap_header wr_ihdr; 41 uint8_t wr_flags; 42 uint8_t wr_rate; 43 uint16_t wr_chan_freq; 44 uint16_t wr_chan_flags; 45 uint8_t wr_antsignal; 46 uint8_t wr_antenna; 47 }; 48 49 #define IWI_RX_RADIOTAP_PRESENT \ 50 ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 51 (1 << IEEE80211_RADIOTAP_RATE) | \ 52 (1 << IEEE80211_RADIOTAP_CHANNEL) | \ 53 (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL) | \ 54 (1 << IEEE80211_RADIOTAP_ANTENNA)) 55 56 struct iwi_tx_radiotap_header { 57 struct ieee80211_radiotap_header wt_ihdr; 58 uint8_t wt_flags; 59 uint16_t wt_chan_freq; 60 uint16_t wt_chan_flags; 61 }; 62 63 #define IWI_TX_RADIOTAP_PRESENT \ 64 ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 65 (1 << IEEE80211_RADIOTAP_CHANNEL)) 66 67 struct iwi_cmd_ring { 68 bus_dma_tag_t desc_dmat; 69 bus_dmamap_t desc_map; 70 bus_addr_t physaddr; 71 struct iwi_cmd_desc *desc; 72 int count; 73 int queued; 74 int cur; 75 int next; 76 }; 77 78 struct iwi_tx_data { 79 bus_dmamap_t map; 80 struct mbuf *m; 81 struct ieee80211_node *ni; 82 }; 83 84 struct iwi_tx_ring { 85 bus_dma_tag_t desc_dmat; 86 bus_dma_tag_t data_dmat; 87 bus_dmamap_t desc_map; 88 bus_addr_t physaddr; 89 struct iwi_tx_desc *desc; 90 struct iwi_tx_data *data; 91 int count; 92 int queued; 93 int cur; 94 int next; 95 }; 96 97 struct iwi_rx_data { 98 bus_dmamap_t map; 99 bus_addr_t physaddr; 100 uint32_t reg; 101 struct mbuf *m; 102 }; 103 104 struct iwi_rx_ring { 105 bus_dma_tag_t data_dmat; 106 struct iwi_rx_data *data; 107 int count; 108 int cur; 109 }; 110 111 struct iwi_softc { 112 struct arpcom sc_arp; 113 struct ieee80211com sc_ic; 114 int (*sc_newstate)(struct ieee80211com *, 115 enum ieee80211_state, int); 116 device_t sc_dev; 117 118 struct mtx sc_mtx; 119 120 struct iwi_firmware fw; 121 uint32_t flags; 122 #define IWI_FLAG_FW_CACHED (1 << 0) 123 #define IWI_FLAG_FW_INITED (1 << 1) 124 #define IWI_FLAG_FW_WARNED (1 << 2) 125 #define IWI_FLAG_SCANNING (1 << 3) 126 127 struct iwi_cmd_ring cmdq; 128 struct iwi_tx_ring txq; 129 struct iwi_rx_ring rxq; 130 131 struct resource *irq; 132 struct resource *mem; 133 bus_space_tag_t sc_st; 134 bus_space_handle_t sc_sh; 135 void *sc_ih; 136 int mem_rid; 137 int irq_rid; 138 139 int antenna; 140 int dwelltime; 141 int bluetooth; 142 143 int sc_tx_timer; 144 145 struct bpf_if *sc_drvbpf; 146 147 union { 148 struct iwi_rx_radiotap_header th; 149 uint8_t pad[64]; 150 } sc_rxtapu; 151 #define sc_rxtap sc_rxtapu.th 152 int sc_rxtap_len; 153 154 union { 155 struct iwi_tx_radiotap_header th; 156 uint8_t pad[64]; 157 } sc_txtapu; 158 #define sc_txtap sc_txtapu.th 159 int sc_txtap_len; 160 }; 161 162 #define SIOCSLOADFW _IOW('i', 137, struct ifreq) 163 #define SIOCSKILLFW _IOW('i', 138, struct ifreq) 164 165 #define IWI_LOCK(sc) mtx_lock(&(sc)->sc_mtx) 166 #define IWI_UNLOCK(sc) mtx_unlock(&(sc)->sc_mtx) 167