1 /* $NetBSD: if_iwivar.h,v 1.16 2010/01/19 22:07:00 pooka Exp $ */ 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_dmamap_t desc_map; 69 bus_dma_segment_t desc_seg; 70 struct iwi_cmd_desc *desc; 71 int count; 72 int queued; 73 int cur; 74 int next; 75 }; 76 77 struct iwi_tx_data { 78 bus_dmamap_t map; 79 struct mbuf *m; 80 struct ieee80211_node *ni; 81 }; 82 83 struct iwi_tx_ring { 84 bus_dmamap_t desc_map; 85 bus_dma_segment_t desc_seg; 86 bus_size_t csr_ridx; 87 bus_size_t csr_widx; 88 struct iwi_tx_desc *desc; 89 struct iwi_tx_data *data; 90 int count; 91 int queued; 92 int cur; 93 int next; 94 }; 95 96 struct iwi_rx_data { 97 bus_dmamap_t map; 98 struct mbuf *m; 99 }; 100 101 struct iwi_rx_ring { 102 struct iwi_rx_data *data; 103 int count; 104 int cur; 105 }; 106 107 struct iwi_node { 108 struct ieee80211_node in_node; 109 int in_station; 110 #define IWI_MAX_IBSSNODE 32 111 }; 112 113 struct iwi_softc { 114 device_t sc_dev; 115 struct ethercom sc_ec; 116 struct ieee80211com sc_ic; 117 int (*sc_newstate)(struct ieee80211com *, 118 enum ieee80211_state, int); 119 void (*sc_node_free)(struct ieee80211_node *); 120 121 uint32_t sc_unr; 122 123 struct iwi_firmware fw; 124 const char *sc_fwname; 125 char *sc_blob; 126 127 uint32_t flags; 128 #define IWI_FLAG_FW_CACHED (1 << 0) 129 #define IWI_FLAG_FW_INITED (1 << 1) 130 #define IWI_FLAG_SCANNING (1 << 3) 131 132 bus_dma_tag_t sc_dmat; 133 134 struct iwi_cmd_ring cmdq; 135 struct iwi_tx_ring txq[WME_NUM_AC]; 136 struct iwi_rx_ring rxq; 137 138 struct resource *irq; 139 struct resource *mem; 140 bus_space_tag_t sc_st; 141 bus_space_handle_t sc_sh; 142 void *sc_ih; 143 pci_chipset_tag_t sc_pct; 144 pcitag_t sc_pcitag; 145 bus_size_t sc_sz; 146 147 struct sysctllog *sc_sysctllog; 148 149 int antenna; 150 int dwelltime; 151 int bluetooth; 152 int nictype; 153 154 int sc_tx_timer; 155 156 struct bpf_if *sc_drvbpf; 157 158 union { 159 struct iwi_rx_radiotap_header th; 160 uint8_t pad[64]; 161 } sc_rxtapu; 162 #define sc_rxtap sc_rxtapu.th 163 int sc_rxtap_len; 164 165 union { 166 struct iwi_tx_radiotap_header th; 167 uint8_t pad[64]; 168 } sc_txtapu; 169 #define sc_txtap sc_txtapu.th 170 int sc_txtap_len; 171 }; 172 173 #define sc_if sc_ec.ec_if 174 175 #define SIOCGRADIO _IOWR('i', 139, struct ifreq) 176 #define SIOCGTABLE0 _IOWR('i', 140, struct ifreq) 177