1 /* $NetBSD: wivar.h,v 1.67 2019/10/05 23:27:20 mrg Exp $ */ 2 3 /* 4 * Copyright (c) 1997, 1998, 1999 5 * Bill Paul <wpaul@ctr.columbia.edu>. 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, this list of conditions and the following disclaimer. 12 * 2. Redistributions in binary form must reproduce the above copyright 13 * notice, this list of conditions and the following disclaimer in the 14 * documentation and/or other materials provided with the distribution. 15 * 3. All advertising materials mentioning features or use of this software 16 * must display the following acknowledgement: 17 * This product includes software developed by Bill Paul. 18 * 4. Neither the name of the author nor the names of any co-contributors 19 * may be used to endorse or promote products derived from this software 20 * without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY Bill Paul AND CONTRIBUTORS ``AS IS'' AND 23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25 * ARE DISCLAIMED. IN NO EVENT SHALL Bill Paul OR THE VOICES IN HIS HEAD 26 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 27 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 28 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 29 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 30 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 31 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 32 * THE POSSIBILITY OF SUCH DAMAGE. 33 */ 34 35 #include <sys/mutex.h> 36 #include <sys/condvar.h> 37 #include <sys/lwp.h> 38 39 /* Radio capture format for Prism. */ 40 41 #define WI_RX_RADIOTAP_PRESENT ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 42 (1 << IEEE80211_RADIOTAP_RATE) | \ 43 (1 << IEEE80211_RADIOTAP_CHANNEL) | \ 44 (1 << IEEE80211_RADIOTAP_DB_ANTSIGNAL) | \ 45 (1 << IEEE80211_RADIOTAP_DB_ANTNOISE)) 46 47 struct wi_rx_radiotap_header { 48 struct ieee80211_radiotap_header wr_ihdr; 49 u_int8_t wr_flags; 50 u_int8_t wr_rate; 51 u_int16_t wr_chan_freq; 52 u_int16_t wr_chan_flags; 53 int8_t wr_antsignal; 54 int8_t wr_antnoise; 55 }; 56 57 #define WI_TX_RADIOTAP_PRESENT ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 58 (1 << IEEE80211_RADIOTAP_RATE) | \ 59 (1 << IEEE80211_RADIOTAP_CHANNEL)) 60 61 struct wi_tx_radiotap_header { 62 struct ieee80211_radiotap_header wt_ihdr; 63 u_int8_t wt_flags; 64 u_int8_t wt_rate; 65 u_int16_t wt_chan_freq; 66 u_int16_t wt_chan_flags; 67 }; 68 69 struct wi_rssdesc { 70 struct ieee80211_rssdesc rd_desc; 71 SLIST_ENTRY(wi_rssdesc) rd_next; 72 }; 73 74 typedef SLIST_HEAD(,wi_rssdesc) wi_rssdescq_t; 75 76 /* 77 * FreeBSD driver ported to NetBSD by Bill Sommerfeld in the back of the 78 * Oslo IETF plenary meeting. 79 */ 80 struct wi_softc { 81 device_t sc_dev; 82 struct ethercom sc_ec; 83 struct ieee80211com sc_ic; 84 u_int32_t sc_ic_flags; /* backup of ic->ic_flags */ 85 void *sc_ih; /* interrupt handler */ 86 void *sc_soft_ih; 87 int (*sc_enable)(device_t, int); 88 void (*sc_reset)(struct wi_softc *); 89 90 int (*sc_newstate)(struct ieee80211com *, 91 enum ieee80211_state, int); 92 void (*sc_set_tim)(struct ieee80211_node *, int); 93 94 int sc_attached; 95 int sc_enabled; 96 int sc_invalid; 97 int sc_firmware_type; 98 #define WI_NOTYPE 0 99 #define WI_LUCENT 1 100 #define WI_INTERSIL 2 101 #define WI_SYMBOL 3 102 int sc_pri_firmware_ver; /* Primary firm vers */ 103 int sc_sta_firmware_ver; /* Station firm vers */ 104 int sc_pci; /* attach to PCI-Bus */ 105 106 bus_space_tag_t sc_iot; /* bus cookie */ 107 bus_space_handle_t sc_ioh; /* bus i/o handle */ 108 109 struct bpf_if * sc_drvbpf; 110 int sc_flags; 111 int sc_bap_id; 112 int sc_bap_off; 113 114 u_int16_t sc_portnum; 115 116 /* RSSI interpretation */ 117 u_int16_t sc_dbm_offset; /* dBm ~ RSSI - sc_dbm_offset */ 118 u_int16_t sc_max_datalen; 119 u_int16_t sc_frag_thresh; 120 u_int16_t sc_rts_thresh; 121 u_int16_t sc_system_scale; 122 u_int16_t sc_tx_rate; 123 u_int16_t sc_cnfauthmode; 124 u_int16_t sc_roaming_mode; 125 u_int16_t sc_microwave_oven; 126 127 int sc_nodelen; 128 char sc_nodename[IEEE80211_NWID_LEN]; 129 130 int sc_buflen; 131 #define WI_NTXBUF 3 132 #define WI_NTXRSS 10 133 struct { 134 int d_fid; 135 } sc_txd[WI_NTXBUF]; 136 int sc_txalloc; /* next FID to allocate */ 137 int sc_txalloced; /* FIDs currently allocated */ 138 int sc_txqueue; /* next FID to queue */ 139 int sc_txqueued; /* FIDs currently queued */ 140 int sc_txstart; /* next FID to start */ 141 int sc_txstarted; /* FIDs currently started */ 142 int sc_txcmds; 143 144 int sc_status; 145 146 struct wi_rssdesc sc_rssd[WI_NTXRSS]; 147 wi_rssdescq_t sc_rssdfree; 148 int sc_tx_timer; 149 int sc_scan_timer; 150 int sc_syn_timer; 151 152 struct wi_counters sc_stats; 153 u_int16_t sc_ibss_port; 154 155 struct wi_apinfo sc_aps[MAXAPINFO]; 156 int sc_naps; 157 158 struct timeval sc_last_syn; 159 int sc_false_syns; 160 int sc_alt_retry; 161 162 union { 163 struct wi_rx_radiotap_header tap; 164 u_int8_t pad[64]; 165 } sc_rxtapu; 166 union { 167 struct wi_tx_radiotap_header tap; 168 u_int8_t pad[64]; 169 } sc_txtapu; 170 u_int16_t sc_txbuf[IEEE80211_MAX_LEN/2]; 171 /* number of transmissions pending at each data rate */ 172 u_int8_t sc_txpending[IEEE80211_RATE_MAXSIZE]; 173 struct callout sc_rssadapt_ch; 174 kmutex_t sc_ioctl_mtx; 175 kcondvar_t sc_ioctl_cv; 176 bool sc_ioctl_gone; 177 unsigned int sc_ioctl_nwait; 178 unsigned int sc_ioctl_depth; 179 lwp_t *sc_ioctl_lwp; 180 }; 181 182 #define sc_if sc_ec.ec_if 183 #define sc_rxtap sc_rxtapu.tap 184 #define sc_txtap sc_txtapu.tap 185 186 struct wi_node { 187 struct ieee80211_node wn_node; 188 struct ieee80211_rssadapt wn_rssadapt; 189 }; 190 191 /* maximum false change-of-BSSID indications per second */ 192 #define WI_MAX_FALSE_SYNS 10 193 194 #define WI_PRISM_DBM_OFFSET 100 /* XXX */ 195 196 #define WI_LUCENT_DBM_OFFSET 149 197 198 #define WI_SCAN_INQWAIT 3 /* wait sec before inquire */ 199 #define WI_SCAN_WAIT 5 /* maximum scan wait */ 200 201 /* Values for wi_flags. */ 202 #define WI_FLAGS_ATTACHED 0x0001 203 #define WI_FLAGS_INITIALIZED 0x0002 204 #define WI_FLAGS_OUTRANGE 0x0004 205 #define WI_FLAGS_RSSADAPTSTA 0x0008 206 #define WI_FLAGS_HAS_MOR 0x0010 207 #define WI_FLAGS_HAS_ROAMING 0x0020 208 #define WI_FLAGS_HAS_DIVERSITY 0x0040 209 #define WI_FLAGS_HAS_SYSSCALE 0x0080 210 #define WI_FLAGS_BUG_AUTOINC 0x0100 211 #define WI_FLAGS_HAS_FRAGTHR 0x0200 212 #define WI_FLAGS_HAS_DBMADJUST 0x0400 213 #define WI_FLAGS_WEP_VALID 0x0800 214 215 struct wi_card_ident { 216 u_int16_t card_id; 217 const char *card_name; 218 u_int8_t firm_type; 219 }; 220 221 /* 222 * register space access macros 223 */ 224 #ifdef WI_AT_BIGENDIAN_BUS_HACK 225 /* 226 * XXX - ugly hack for sparc bus_space_* macro deficiencies: 227 * assume the bus we are accessing is big endian. 228 */ 229 230 #define CSR_WRITE_4(sc, reg, val) \ 231 bus_space_write_4(sc->sc_iot, sc->sc_ioh, \ 232 (sc->sc_pci? reg * 2: reg) , htole32(val)) 233 #define CSR_WRITE_2(sc, reg, val) \ 234 bus_space_write_2(sc->sc_iot, sc->sc_ioh, \ 235 (sc->sc_pci? reg * 2: reg), htole16(val)) 236 #define CSR_WRITE_1(sc, reg, val) \ 237 bus_space_write_1(sc->sc_iot, sc->sc_ioh, \ 238 (sc->sc_pci? reg * 2: reg), val) 239 240 #define CSR_READ_4(sc, reg) \ 241 le32toh(bus_space_read_4(sc->sc_iot, sc->sc_ioh, \ 242 (sc->sc_pci? reg * 2: reg))) 243 #define CSR_READ_2(sc, reg) \ 244 le16toh(bus_space_read_2(sc->sc_iot, sc->sc_ioh, \ 245 (sc->sc_pci? reg * 2: reg))) 246 #define CSR_READ_1(sc, reg) \ 247 bus_space_read_1(sc->sc_iot, sc->sc_ioh, \ 248 (sc->sc_pci? reg * 2: reg)) 249 250 #else 251 252 #define CSR_WRITE_4(sc, reg, val) \ 253 bus_space_write_4(sc->sc_iot, sc->sc_ioh, \ 254 (sc->sc_pci? reg * 2: reg) , val) 255 #define CSR_WRITE_2(sc, reg, val) \ 256 bus_space_write_2(sc->sc_iot, sc->sc_ioh, \ 257 (sc->sc_pci? reg * 2: reg), val) 258 #define CSR_WRITE_1(sc, reg, val) \ 259 bus_space_write_1(sc->sc_iot, sc->sc_ioh, \ 260 (sc->sc_pci? reg * 2: reg), val) 261 262 #define CSR_READ_4(sc, reg) \ 263 bus_space_read_4(sc->sc_iot, sc->sc_ioh, \ 264 (sc->sc_pci? reg * 2: reg)) 265 #define CSR_READ_2(sc, reg) \ 266 bus_space_read_2(sc->sc_iot, sc->sc_ioh, \ 267 (sc->sc_pci? reg * 2: reg)) 268 #define CSR_READ_1(sc, reg) \ 269 bus_space_read_1(sc->sc_iot, sc->sc_ioh, \ 270 (sc->sc_pci? reg * 2: reg)) 271 #endif 272 273 #ifndef __BUS_SPACE_HAS_STREAM_METHODS 274 #define bus_space_write_stream_2 bus_space_write_2 275 #define bus_space_write_multi_stream_2 bus_space_write_multi_2 276 #define bus_space_read_stream_2 bus_space_read_2 277 #define bus_space_read_multi_stream_2 bus_space_read_multi_2 278 #endif 279 280 #define CSR_WRITE_STREAM_2(sc, reg, val) \ 281 bus_space_write_stream_2(sc->sc_iot, sc->sc_ioh, \ 282 (sc->sc_pci? reg * 2: reg), val) 283 #define CSR_WRITE_MULTI_STREAM_2(sc, reg, val, count) \ 284 bus_space_write_multi_stream_2(sc->sc_iot, sc->sc_ioh, \ 285 (sc->sc_pci? reg * 2: reg), val, count) 286 #define CSR_READ_STREAM_2(sc, reg) \ 287 bus_space_read_stream_2(sc->sc_iot, sc->sc_ioh, \ 288 (sc->sc_pci? reg * 2: reg)) 289 #define CSR_READ_MULTI_STREAM_2(sc, reg, buf, count) \ 290 bus_space_read_multi_stream_2(sc->sc_iot, sc->sc_ioh, \ 291 (sc->sc_pci? reg * 2: reg), buf, count) 292 293 294 int wi_attach(struct wi_softc *, const u_int8_t *); 295 int wi_detach(struct wi_softc *); 296 int wi_activate(device_t, enum devact); 297 int wi_intr(void *arg); 298