NetBSD/sys/dev/ic/awivar.h
sommerfeld dea88f1c20 Completely rewrite receive processing to avoid sleep-deprivation-induced
brain damage and infinite loops, and lousy RTTs

Also, flush tx queues when reassociating with AP and when taking the
interface down.
1999-11-09 14:58:07 +00:00

181 lines
5.8 KiB
C

/* $NetBSD: awivar.h,v 1.4 1999/11/09 14:58:07 sommerfeld Exp $ */
/*-
* Copyright (c) 1999 The NetBSD Foundation, Inc.
* All rights reserved.
*
* This code is derived from software contributed to The NetBSD Foundation
* by Bill Sommerfeld
*
* Redistribution and use in source and binary forms, with or without
* modification, are permitted provided that the following conditions
* are met:
* 1. Redistributions of source code must retain the above copyright
* notice, this list of conditions and the following disclaimer.
* 2. Redistributions in binary form must reproduce the above copyright
* notice, this list of conditions and the following disclaimer in the
* documentation and/or other materials provided with the distribution.
* 3. All advertising materials mentioning features or use of this software
* must display the following acknowledgement:
* This product includes software developed by the NetBSD
* Foundation, Inc. and its contributors.
* 4. Neither the name of The NetBSD Foundation nor the names of its
* contributors may be used to endorse or promote products derived
* from this software without specific prior written permission.
*
* THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
* ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
* TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
* PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
* BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
* SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
* INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
* CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
* ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
* POSSIBILITY OF SUCH DAMAGE.
*/
enum awi_state {
AWI_ST_OFF, /* powered off */
AWI_ST_SELFTEST, /* waiting for selftest to complete*/
AWI_ST_IFTEST, /* waiting for interface to respond */
AWI_ST_MIB_GET, /* fetching MIB variables */
AWI_ST_MIB_SET, /* stuffing MIB variables */
AWI_ST_TXINIT, /* initializing TX side */
AWI_ST_RXINIT, /* initializing RX side */
AWI_ST_SCAN, /* hunting for a BSS */
AWI_ST_SYNCED, /* synced? trying to auth.. */
/* there are probably some missing 802.11 states here.. */
AWI_ST_AUTHED, /* authenticated */
AWI_ST_RUNNING, /* ready to send user data.. */
AWI_ST_INSANE, /* failed to respond.. */
};
#define AWI_FL_CMD_INPROG 0x0001
#define AWI_SSID_LEN 33
struct awi_bss_binding
{
u_int8_t chanset; /* channel set to use */
u_int8_t pattern; /* hop pattern to use */
u_int8_t index; /* index to use */
u_int8_t rssi; /* strenght of this beacon */
u_int16_t dwell_time; /* dwell time */
u_int8_t bss_timestamp[8]; /* timestamp of this bss */
u_int8_t bss_id[6];
u_int32_t rxtime; /* unit's local time */
u_int8_t sslen;
u_int8_t ssid[AWI_SSID_LEN];
};
#define NBND 4
#define NTXD 4
struct awi_txbd
{
u_int32_t descr; /* offset to descriptor */
u_int32_t frame; /* offset to frame */
u_int32_t len; /* frame length */
};
struct awi_softc
{
struct device sc_dev;
struct am79c930_softc sc_chip;
struct ethercom sc_ec;
int sc_enabled;
enum awi_state sc_state;
int sc_flags;
void *sc_ih; /* interrupt handler */
struct ifnet *sc_ifp; /* XXX */
int (*sc_enable) __P((struct awi_softc *));
void (*sc_disable) __P((struct awi_softc *));
void (*sc_completion) __P((struct awi_softc *,
u_int8_t));
struct ifqueue sc_mgtq;
u_int32_t sc_txbase;
u_int32_t sc_txlen;
u_int32_t sc_rxbase;
u_int32_t sc_rxlen;
u_int32_t sc_rx_data_desc;
u_int32_t sc_rx_mgt_desc;
u_int16_t sc_scan_duration;
u_int8_t sc_scan_chanset;
u_int8_t sc_scan_pattern;
int sc_nbindings;
u_int8_t sc_my_addr[6];
int sc_new_bss;
struct awi_bss_binding sc_active_bss;
/*
* BSS's found during a scan.. XXX doesn't need to be in-line
*/
struct awi_bss_binding sc_bindings[NBND];
int sc_txpending;
int sc_ntxd;
int sc_txnext; /* next txd to be given to driver */
int sc_txfirst; /* first unsent txd dev has */
struct awi_txbd sc_txd[NTXD];
u_int8_t sc_curmib;
int sc_scan_timer;
int sc_tx_timer;
int sc_mgt_timer;
int sc_cmd_timer;
int sc_selftest_tries;
/*
* packet parsing state.
*/
struct mbuf *sc_nextpkt;
struct mbuf *sc_m;
u_int8_t *sc_mptr;
u_int32_t sc_mleft;
int sc_flushpkt;
};
extern int awi_activate __P((struct device *, enum devact));
extern int awi_attach __P((struct awi_softc *, u_int8_t *macaddr));
#define awi_read_1(sc, off) ((sc)->sc_chip.sc_ops->read_1)(&sc->sc_chip, off)
#define awi_read_2(sc, off) ((sc)->sc_chip.sc_ops->read_2)(&sc->sc_chip, off)
#define awi_read_4(sc, off) ((sc)->sc_chip.sc_ops->read_4)(&sc->sc_chip, off)
#define awi_read_bytes(sc, off, ptr, len) ((sc)->sc_chip.sc_ops->read_bytes)(&sc->sc_chip, off, ptr, len)
#define awi_write_1(sc, off, val) \
((sc)->sc_chip.sc_ops->write_1)(&sc->sc_chip, off, val)
#define awi_write_2(sc, off, val) \
((sc)->sc_chip.sc_ops->write_2)(&sc->sc_chip, off, val)
#define awi_write_4(sc, off, val) \
((sc)->sc_chip.sc_ops->write_4)(&sc->sc_chip, off, val)
#define awi_write_bytes(sc, off, ptr, len) \
((sc)->sc_chip.sc_ops->write_bytes)(&sc->sc_chip, off, ptr, len)
#define awi_drvstate(sc, state) \
awi_write_1(sc, AWI_DRIVERSTATE, \
((state) | AWI_DRV_AUTORXLED|AWI_DRV_AUTOTXLED));
/* Number of trips around the loop waiting for the device.. */
#define AWI_LOCKOUT_SPIN 10000 /* 10ms */
/* 24-byte mac header + 8 byte SNAP header + 1500-byte ether MTU */
#define AWI_FRAME_SIZE 1532
/* refresh associations every 300s */
#define AWI_ASSOC_REFRESH 300
extern int awi_intr __P((void *));