wivar.h revision 1.45
1/* $NetBSD: wivar.h,v 1.45 2004/07/22 20:23:31 mycroft 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 } sc_txd[WI_NTXBUF]; 129 int sc_txalloced; 130 int sc_txnext; 131 int sc_txcur; 132 struct wi_rssdesc sc_rssd[WI_NTXRSS]; 133 wi_rssdescq_t sc_rssdfree; 134 int sc_tx_timer; 135 int sc_scan_timer; 136 int sc_syn_timer; 137 138 struct wi_counters sc_stats; 139 u_int16_t sc_ibss_port; 140 141 struct wi_apinfo sc_aps[MAXAPINFO]; 142 int sc_naps; 143 144 int sc_false_syns; 145 int sc_alt_retry; 146 147 union { 148 struct wi_rx_radiotap_header tap; 149 u_int8_t pad[64]; 150 } sc_rxtapu; 151 union { 152 struct wi_tx_radiotap_header tap; 153 u_int8_t pad[64]; 154 } sc_txtapu; 155 u_int16_t sc_txbuf[IEEE80211_MAX_LEN/2]; 156 /* number of transmissions pending at each data rate */ 157 u_int8_t sc_txpending[IEEE80211_RATE_MAXSIZE]; 158 struct callout sc_rssadapt_ch; 159}; 160 161#define sc_rxtap sc_rxtapu.tap 162#define sc_txtap sc_txtapu.tap 163 164#define sc_if sc_ic.ic_if 165 166struct wi_node { 167 struct ieee80211_node wn_node; 168 struct ieee80211_rssadapt wn_rssadapt; 169}; 170 171/* maximum consecutive false change-of-BSSID indications */ 172#define WI_MAX_FALSE_SYNS 10 173 174#define WI_PRISM_DBM_OFFSET 100 /* XXX */ 175 176#define WI_LUCENT_DBM_OFFSET 149 177 178#define WI_RSSI_TO_DBM(sc, rssi) ((rssi) - (sc)->sc_dbm_offset) 179 180#define WI_SCAN_INQWAIT 3 /* wait sec before inquire */ 181#define WI_SCAN_WAIT 5 /* maximum scan wait */ 182 183/* Values for wi_flags. */ 184#define WI_FLAGS_ATTACHED 0x0001 185#define WI_FLAGS_INITIALIZED 0x0002 186#define WI_FLAGS_OUTRANGE 0x0004 187#define WI_FLAGS_RSSADAPTSTA 0x0008 188#define WI_FLAGS_HAS_MOR 0x0010 189#define WI_FLAGS_HAS_ROAMING 0x0020 190#define WI_FLAGS_HAS_DIVERSITY 0x0040 191#define WI_FLAGS_HAS_SYSSCALE 0x0080 192#define WI_FLAGS_BUG_AUTOINC 0x0100 193#define WI_FLAGS_HAS_FRAGTHR 0x0200 194#define WI_FLAGS_HAS_DBMADJUST 0x0400 195 196struct wi_card_ident { 197 u_int16_t card_id; 198 char *card_name; 199 u_int8_t firm_type; 200}; 201 202/* 203 * register space access macros 204 */ 205#ifdef WI_AT_BIGENDIAN_BUS_HACK 206 /* 207 * XXX - ugly hack for sparc bus_space_* macro deficiencies: 208 * assume the bus we are accessing is big endian. 209 */ 210 211#define CSR_WRITE_4(sc, reg, val) \ 212 bus_space_write_4(sc->sc_iot, sc->sc_ioh, \ 213 (sc->sc_pci? reg * 2: reg) , htole32(val)) 214#define CSR_WRITE_2(sc, reg, val) \ 215 bus_space_write_2(sc->sc_iot, sc->sc_ioh, \ 216 (sc->sc_pci? reg * 2: reg), htole16(val)) 217#define CSR_WRITE_1(sc, reg, val) \ 218 bus_space_write_1(sc->sc_iot, sc->sc_ioh, \ 219 (sc->sc_pci? reg * 2: reg), val) 220 221#define CSR_READ_4(sc, reg) \ 222 le32toh(bus_space_read_4(sc->sc_iot, sc->sc_ioh, \ 223 (sc->sc_pci? reg * 2: reg))) 224#define CSR_READ_2(sc, reg) \ 225 le16toh(bus_space_read_2(sc->sc_iot, sc->sc_ioh, \ 226 (sc->sc_pci? reg * 2: reg))) 227#define CSR_READ_1(sc, reg) \ 228 bus_space_read_1(sc->sc_iot, sc->sc_ioh, \ 229 (sc->sc_pci? reg * 2: reg)) 230 231#else 232 233#define CSR_WRITE_4(sc, reg, val) \ 234 bus_space_write_4(sc->sc_iot, sc->sc_ioh, \ 235 (sc->sc_pci? reg * 2: reg) , val) 236#define CSR_WRITE_2(sc, reg, val) \ 237 bus_space_write_2(sc->sc_iot, sc->sc_ioh, \ 238 (sc->sc_pci? reg * 2: reg), val) 239#define CSR_WRITE_1(sc, reg, val) \ 240 bus_space_write_1(sc->sc_iot, sc->sc_ioh, \ 241 (sc->sc_pci? reg * 2: reg), val) 242 243#define CSR_READ_4(sc, reg) \ 244 bus_space_read_4(sc->sc_iot, sc->sc_ioh, \ 245 (sc->sc_pci? reg * 2: reg)) 246#define CSR_READ_2(sc, reg) \ 247 bus_space_read_2(sc->sc_iot, sc->sc_ioh, \ 248 (sc->sc_pci? reg * 2: reg)) 249#define CSR_READ_1(sc, reg) \ 250 bus_space_read_1(sc->sc_iot, sc->sc_ioh, \ 251 (sc->sc_pci? reg * 2: reg)) 252#endif 253 254#ifndef __BUS_SPACE_HAS_STREAM_METHODS 255#define bus_space_write_stream_2 bus_space_write_2 256#define bus_space_write_multi_stream_2 bus_space_write_multi_2 257#define bus_space_read_stream_2 bus_space_read_2 258#define bus_space_read_multi_stream_2 bus_space_read_multi_2 259#endif 260 261#define CSR_WRITE_STREAM_2(sc, reg, val) \ 262 bus_space_write_stream_2(sc->sc_iot, sc->sc_ioh, \ 263 (sc->sc_pci? reg * 2: reg), val) 264#define CSR_WRITE_MULTI_STREAM_2(sc, reg, val, count) \ 265 bus_space_write_multi_stream_2(sc->sc_iot, sc->sc_ioh, \ 266 (sc->sc_pci? reg * 2: reg), val, count) 267#define CSR_READ_STREAM_2(sc, reg) \ 268 bus_space_read_stream_2(sc->sc_iot, sc->sc_ioh, \ 269 (sc->sc_pci? reg * 2: reg)) 270#define CSR_READ_MULTI_STREAM_2(sc, reg, buf, count) \ 271 bus_space_read_multi_stream_2(sc->sc_iot, sc->sc_ioh, \ 272 (sc->sc_pci? reg * 2: reg), buf, count) 273 274 275int wi_attach(struct wi_softc *); 276int wi_detach(struct wi_softc *); 277int wi_activate(struct device *, enum devact); 278int wi_intr(void *arg); 279void wi_power(struct wi_softc *, int); 280void wi_shutdown(struct wi_softc *); 281