wivar.h revision 1.43
1/* $NetBSD: wivar.h,v 1.43 2004/02/10 00:59:38 dyoung 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/* Radio capture format for Prism. */ 36 37#define WI_RX_RADIOTAP_PRESENT ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 38 (1 << IEEE80211_RADIOTAP_RATE) | \ 39 (1 << IEEE80211_RADIOTAP_CHANNEL) | \ 40 (1 << IEEE80211_RADIOTAP_DBM_ANTSIGNAL) | \ 41 (1 << IEEE80211_RADIOTAP_DBM_ANTNOISE)) 42 43struct wi_rx_radiotap_header { 44 struct ieee80211_radiotap_header wr_ihdr; 45 u_int8_t wr_flags; 46 u_int8_t wr_rate; 47 u_int16_t wr_chan_freq; 48 u_int16_t wr_chan_flags; 49 int8_t wr_antsignal; 50 int8_t wr_antnoise; 51} __attribute__((__packed__)); 52 53#define WI_TX_RADIOTAP_PRESENT ((1 << IEEE80211_RADIOTAP_FLAGS) | \ 54 (1 << IEEE80211_RADIOTAP_RATE) | \ 55 (1 << IEEE80211_RADIOTAP_CHANNEL)) 56 57struct wi_tx_radiotap_header { 58 struct ieee80211_radiotap_header wt_ihdr; 59 u_int8_t wt_flags; 60 u_int8_t wt_rate; 61 u_int16_t wt_chan_freq; 62 u_int16_t wt_chan_flags; 63} __attribute__((__packed__)); 64 65struct wi_rssdesc { 66 struct ieee80211_rssdesc rd_desc; 67 SLIST_ENTRY(wi_rssdesc) rd_next; 68}; 69 70typedef SLIST_HEAD(,wi_rssdesc) wi_rssdescq_t; 71 72/* 73 * FreeBSD driver ported to NetBSD by Bill Sommerfeld in the back of the 74 * Oslo IETF plenary meeting. 75 */ 76struct wi_softc { 77 struct device sc_dev; 78 struct ieee80211com sc_ic; 79 void *sc_ih; /* interrupt handler */ 80 int (*sc_enable)(struct wi_softc *); 81 void (*sc_disable)(struct wi_softc *); 82 void (*sc_reset)(struct wi_softc *); 83 84 int (*sc_newstate)(struct ieee80211com *, 85 enum ieee80211_state, int); 86 87 int sc_attached; 88 int sc_enabled; 89 int sc_invalid; 90 int sc_firmware_type; 91#define WI_NOTYPE 0 92#define WI_LUCENT 1 93#define WI_INTERSIL 2 94#define WI_SYMBOL 3 95 int sc_pri_firmware_ver; /* Primary firm vers */ 96 int sc_sta_firmware_ver; /* Station firm vers */ 97 int sc_pci; /* attach to PCI-Bus */ 98 99 bus_space_tag_t sc_iot; /* bus cookie */ 100 bus_space_handle_t sc_ioh; /* bus i/o handle */ 101 102 caddr_t sc_drvbpf; 103 int sc_flags; 104 int sc_bap_id; 105 int sc_bap_off; 106 107 u_int16_t sc_portnum; 108 109 /* RSSI interpretation */ 110 u_int16_t sc_dbm_offset; /* dBm ~ RSSI - sc_dbm_offset */ 111 u_int16_t sc_max_datalen; 112 u_int16_t sc_frag_thresh; 113 u_int16_t sc_rts_thresh; 114 u_int16_t sc_system_scale; 115 u_int16_t sc_tx_rate; 116 u_int16_t sc_cnfauthmode; 117 u_int16_t sc_roaming_mode; 118 u_int16_t sc_microwave_oven; 119 120 int sc_nodelen; 121 char sc_nodename[IEEE80211_NWID_LEN]; 122 123 int sc_buflen; 124#define WI_NTXBUF 3 125#define WI_NTXRSS 10 126 struct sc_txdesc { 127 int d_fid; 128 int d_len; 129 int d_rate; 130 } sc_txd[WI_NTXBUF]; 131 int sc_txnext; 132 int sc_txcur; 133 struct wi_rssdesc sc_rssd[WI_NTXRSS]; 134 wi_rssdescq_t sc_rssdfree; 135 int sc_tx_timer; 136 int sc_scan_timer; 137 int sc_syn_timer; 138 139 struct wi_counters sc_stats; 140 u_int16_t sc_ibss_port; 141 142 struct wi_apinfo sc_aps[MAXAPINFO]; 143 int sc_naps; 144 145 int sc_false_syns; 146 int sc_alt_retry; 147 148 union { 149 struct wi_rx_radiotap_header tap; 150 u_int8_t pad[64]; 151 } sc_rxtapu; 152 union { 153 struct wi_tx_radiotap_header tap; 154 u_int8_t pad[64]; 155 } sc_txtapu; 156 u_int16_t sc_txbuf[IEEE80211_MAX_LEN/2]; 157 /* number of transmissions pending at each data rate */ 158 u_int8_t sc_txpending[IEEE80211_RATE_MAXSIZE]; 159 struct callout sc_rssadapt_ch; 160}; 161 162#define sc_rxtap sc_rxtapu.tap 163#define sc_txtap sc_txtapu.tap 164 165#define sc_if sc_ic.ic_if 166 167struct wi_node { 168 struct ieee80211_node wn_node; 169 struct ieee80211_rssadapt wn_rssadapt; 170}; 171 172/* maximum consecutive false change-of-BSSID indications */ 173#define WI_MAX_FALSE_SYNS 10 174 175#define WI_PRISM_DBM_OFFSET 100 /* XXX */ 176 177#define WI_LUCENT_DBM_OFFSET 149 178 179#define WI_RSSI_TO_DBM(sc, rssi) ((rssi) - (sc)->sc_dbm_offset) 180 181#define WI_SCAN_INQWAIT 3 /* wait sec before inquire */ 182#define WI_SCAN_WAIT 5 /* maximum scan wait */ 183 184/* Values for wi_flags. */ 185#define WI_FLAGS_ATTACHED 0x0001 186#define WI_FLAGS_INITIALIZED 0x0002 187#define WI_FLAGS_OUTRANGE 0x0004 188#define WI_FLAGS_RSSADAPTSTA 0x0008 189#define WI_FLAGS_HAS_MOR 0x0010 190#define WI_FLAGS_HAS_ROAMING 0x0020 191#define WI_FLAGS_HAS_DIVERSITY 0x0040 192#define WI_FLAGS_HAS_SYSSCALE 0x0080 193#define WI_FLAGS_BUG_AUTOINC 0x0100 194#define WI_FLAGS_HAS_FRAGTHR 0x0200 195#define WI_FLAGS_HAS_DBMADJUST 0x0400 196 197struct wi_card_ident { 198 u_int16_t card_id; 199 char *card_name; 200 u_int8_t firm_type; 201}; 202 203/* 204 * register space access macros 205 */ 206#ifdef WI_AT_BIGENDIAN_BUS_HACK 207 /* 208 * XXX - ugly hack for sparc bus_space_* macro deficiencies: 209 * assume the bus we are accessing is big endian. 210 */ 211 212#define CSR_WRITE_4(sc, reg, val) \ 213 bus_space_write_4(sc->sc_iot, sc->sc_ioh, \ 214 (sc->sc_pci? reg * 2: reg) , htole32(val)) 215#define CSR_WRITE_2(sc, reg, val) \ 216 bus_space_write_2(sc->sc_iot, sc->sc_ioh, \ 217 (sc->sc_pci? reg * 2: reg), htole16(val)) 218#define CSR_WRITE_1(sc, reg, val) \ 219 bus_space_write_1(sc->sc_iot, sc->sc_ioh, \ 220 (sc->sc_pci? reg * 2: reg), val) 221 222#define CSR_READ_4(sc, reg) \ 223 le32toh(bus_space_read_4(sc->sc_iot, sc->sc_ioh, \ 224 (sc->sc_pci? reg * 2: reg))) 225#define CSR_READ_2(sc, reg) \ 226 le16toh(bus_space_read_2(sc->sc_iot, sc->sc_ioh, \ 227 (sc->sc_pci? reg * 2: reg))) 228#define CSR_READ_1(sc, reg) \ 229 bus_space_read_1(sc->sc_iot, sc->sc_ioh, \ 230 (sc->sc_pci? reg * 2: reg)) 231 232#else 233 234#define CSR_WRITE_4(sc, reg, val) \ 235 bus_space_write_4(sc->sc_iot, sc->sc_ioh, \ 236 (sc->sc_pci? reg * 2: reg) , val) 237#define CSR_WRITE_2(sc, reg, val) \ 238 bus_space_write_2(sc->sc_iot, sc->sc_ioh, \ 239 (sc->sc_pci? reg * 2: reg), val) 240#define CSR_WRITE_1(sc, reg, val) \ 241 bus_space_write_1(sc->sc_iot, sc->sc_ioh, \ 242 (sc->sc_pci? reg * 2: reg), val) 243 244#define CSR_READ_4(sc, reg) \ 245 bus_space_read_4(sc->sc_iot, sc->sc_ioh, \ 246 (sc->sc_pci? reg * 2: reg)) 247#define CSR_READ_2(sc, reg) \ 248 bus_space_read_2(sc->sc_iot, sc->sc_ioh, \ 249 (sc->sc_pci? reg * 2: reg)) 250#define CSR_READ_1(sc, reg) \ 251 bus_space_read_1(sc->sc_iot, sc->sc_ioh, \ 252 (sc->sc_pci? reg * 2: reg)) 253#endif 254 255#ifndef __BUS_SPACE_HAS_STREAM_METHODS 256#define bus_space_write_stream_2 bus_space_write_2 257#define bus_space_write_multi_stream_2 bus_space_write_multi_2 258#define bus_space_read_stream_2 bus_space_read_2 259#define bus_space_read_multi_stream_2 bus_space_read_multi_2 260#endif 261 262#define CSR_WRITE_STREAM_2(sc, reg, val) \ 263 bus_space_write_stream_2(sc->sc_iot, sc->sc_ioh, \ 264 (sc->sc_pci? reg * 2: reg), val) 265#define CSR_WRITE_MULTI_STREAM_2(sc, reg, val, count) \ 266 bus_space_write_multi_stream_2(sc->sc_iot, sc->sc_ioh, \ 267 (sc->sc_pci? reg * 2: reg), val, count) 268#define CSR_READ_STREAM_2(sc, reg) \ 269 bus_space_read_stream_2(sc->sc_iot, sc->sc_ioh, \ 270 (sc->sc_pci? reg * 2: reg)) 271#define CSR_READ_MULTI_STREAM_2(sc, reg, buf, count) \ 272 bus_space_read_multi_stream_2(sc->sc_iot, sc->sc_ioh, \ 273 (sc->sc_pci? reg * 2: reg), buf, count) 274 275 276int wi_attach(struct wi_softc *); 277int wi_detach(struct wi_softc *); 278int wi_activate(struct device *, enum devact); 279int wi_intr(void *arg); 280void wi_power(struct wi_softc *, int); 281void wi_shutdown(struct wi_softc *); 282