Rename flags; clean up a bit.

This commit is contained in:
mycroft 1994-07-05 21:20:20 +00:00
parent c5bedb0aa6
commit 668c4747b3
4 changed files with 394 additions and 398 deletions

View File

@ -10,7 +10,7 @@
* of this software, nor does the author assume any responsibility
* for damages incurred with its use.
*
* $Id: if_le.c,v 1.6 1994/07/02 04:13:16 mycroft Exp $
* $Id: if_le.c,v 1.7 1994/07/05 21:20:20 mycroft Exp $
*/
#include "bpfilter.h"
@ -93,24 +93,24 @@ struct le_softc {
};
int leintr __P((struct le_softc *));
int le_ioctl __P((struct ifnet *, int, caddr_t));
int le_start __P((struct ifnet *));
int le_watchdog __P((/* short */));
int leioctl __P((struct ifnet *, int, caddr_t));
int lestart __P((struct ifnet *));
int lewatchdog __P((/* short */));
static inline void lewrcsr __P((/* struct le_softc *, u_short, u_short */));
static inline u_short lerdcsr __P((/* struct le_softc *, u_short */));
void le_init __P((struct le_softc *));
void init_mem __P((struct le_softc *));
void le_reset __P((struct le_softc *));
void le_stop __P((struct le_softc *));
void le_tint __P((struct le_softc *));
void le_rint __P((struct le_softc *));
void le_read __P((struct le_softc *, u_char *, int));
struct mbuf *le_get __P((u_char *, int, struct ifnet *));
void leinit __P((struct le_softc *));
void lememinit __P((struct le_softc *));
void lereset __P((struct le_softc *));
void lestop __P((struct le_softc *));
void letint __P((struct le_softc *));
void lerint __P((struct le_softc *));
void leread __P((struct le_softc *, u_char *, int));
struct mbuf *leget __P((u_char *, int, struct ifnet *));
#ifdef LEDEBUG
void recv_print __P((struct le_softc *, int));
void xmit_print __P((struct le_softc *, int));
#endif
void le_setladrf __P((struct arpcom *, u_long *));
void lesetladrf __P((struct arpcom *, u_long *));
int leprobe();
int depca_probe __P((struct le_softc *, struct isa_attach_args *));
@ -349,10 +349,10 @@ lance_probe(sc)
int type;
/* Stop the LANCE chip and put it in a known state. */
lewrcsr(sc, 0, STOP);
lewrcsr(sc, 0, LE_STOP);
delay(100);
if (lerdcsr(sc, 0) != STOP)
if (lerdcsr(sc, 0) != LE_STOP)
return 0;
/*
@ -372,7 +372,7 @@ lance_probe(sc)
break;
}
lewrcsr(sc, 3, sc->sc_card == DEPCA ? ACON : 0);
lewrcsr(sc, 3, sc->sc_card == DEPCA ? LE_ACON : 0);
return type;
}
@ -393,9 +393,9 @@ leattach(parent, self, aux)
ifp->if_unit = sc->sc_dev.dv_unit;
ifp->if_name = lecd.cd_name;
ifp->if_output = ether_output;
ifp->if_start = le_start;
ifp->if_ioctl = le_ioctl;
ifp->if_watchdog = le_watchdog;
ifp->if_start = lestart;
ifp->if_ioctl = leioctl;
ifp->if_watchdog = lewatchdog;
ifp->if_flags =
IFF_BROADCAST | IFF_SIMPLEX | IFF_NOTRAILERS | IFF_MULTICAST;
@ -421,32 +421,31 @@ leattach(parent, self, aux)
}
void
le_reset(sc)
lereset(sc)
struct le_softc *sc;
{
log(LOG_NOTICE, "%s: reset\n", sc->sc_dev.dv_xname);
le_init(sc);
leinit(sc);
}
int
le_watchdog(unit)
lewatchdog(unit)
short unit;
{
struct le_softc *sc = lecd.cd_devs[unit];
log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
++sc->sc_arpcom.ac_if.if_oerrors;
le_reset(sc);
lereset(sc);
}
#define LANCE_ADDR(sc, a) \
(sc->sc_card == DEPCA ? ((u_long)(a) - (u_long)sc->sc_mem) : kvtop(a))
/* Lance initialisation block set up. */
/* LANCE initialization block set up. */
void
init_mem(sc)
struct le_softc *sc;
lememinit(sc)
register struct le_softc *sc;
{
struct ifnet *ifp = &sc->sc_arpcom.ac_if;
int i;
@ -458,22 +457,18 @@ init_mem(sc)
* quadword aligned. If it isn't then the initialisation is going
* fail later on.
*/
/*
* Set up lance initialisation block.
*/
mem = sc->sc_mem;
sc->sc_init = mem;
#if NBPFILTER > 0
if (ifp->if_flags & IFF_PROMISC)
sc->sc_init->mode = PROM;
sc->sc_init->mode = LE_NORMAL | LE_PROM;
else
#endif
sc->sc_init->mode = 0;
for (i = 0; i < ETHER_ADDR_LEN; i++)
sc->sc_init->mode = LE_NORMAL;
for (i = 0; i < ETHER_ADDR_LEN; i++)
sc->sc_init->padr[i] = sc->sc_arpcom.ac_enaddr[i];
le_setladrf(&sc->sc_arpcom, sc->sc_init->ladrf);
lesetladrf(&sc->sc_arpcom, sc->sc_init->ladrf);
mem += sizeof(struct init_block);
sc->sc_rd = mem;
@ -495,7 +490,7 @@ init_mem(sc)
for (i = 0; i < NRBUF; i++) {
a = LANCE_ADDR(sc, mem);
sc->sc_rd[i].addr = a;
sc->sc_rd[i].flags = ((a >> 16) & 0xff) | OWN;
sc->sc_rd[i].flags = ((a >> 16) & 0xff) | LE_OWN;
sc->sc_rd[i].bcnt = -BUFSIZE;
sc->sc_rd[i].mcnt = 0;
mem += BUFSIZE;
@ -516,11 +511,11 @@ init_mem(sc)
}
void
le_stop(sc)
lestop(sc)
struct le_softc *sc;
{
lewrcsr(sc, 0, STOP);
lewrcsr(sc, 0, LE_STOP);
}
/*
@ -528,54 +523,52 @@ le_stop(sc)
* and transmit/receive descriptor rings.
*/
void
le_init(sc)
struct le_softc *sc;
leinit(sc)
register struct le_softc *sc;
{
struct ifnet *ifp = &sc->sc_arpcom.ac_if;
int s;
register i;
register int timo;
u_long a;
/* Address not known. */
if (!ifp->if_addrlist)
if (!ifp->if_addrlist)
return;
s = splimp();
/*
* Lance must be stopped to access registers.
*/
le_stop(sc);
/* Don't want to get in a weird state. */
lestop(sc);
sc->sc_last_rd = sc->sc_last_td = sc->sc_no_td = 0;
/* Set up lance's memory area. */
init_mem(sc);
/* Set up LANCE init block. */
lememinit(sc);
/* No byte swapping etc. */
lewrcsr(sc, 3, sc->sc_card == DEPCA ? ACON : 0);
lewrcsr(sc, 3, sc->sc_card == DEPCA ? LE_ACON : 0);
/* Give lance the physical address of its init block. */
/* Give LANCE the physical address of its init block. */
a = LANCE_ADDR(sc, sc->sc_init);
lewrcsr(sc, 1, a);
lewrcsr(sc, 2, (a >> 16) & 0xff);
/* OK, let's try and initialise the Lance. */
lewrcsr(sc, 0, INIT);
/* Try to initialize the LANCE. */
lewrcsr(sc, 0, LE_INIT);
/* Wait for initialisation to finish. */
for (i = 0; i < 1000; i++)
if (lerdcsr(sc, 0) & IDON)
/* Wait for initialization to finish. */
for (timo = 1000; timo; timo--)
if (lerdcsr(sc, 0) & LE_IDON)
break;
if (lerdcsr(sc, 0) & IDON) {
/* Start the lance. */
lewrcsr(sc, 0, INEA | STRT | IDON);
if (lerdcsr(sc, 0) & LE_IDON) {
/* Start the LANCE. */
lewrcsr(sc, 0, LE_INEA | LE_STRT | LE_IDON);
ifp->if_flags |= IFF_RUNNING;
ifp->if_flags &= ~IFF_OACTIVE;
le_start(ifp);
} else
printf("%s: card failed to initialise\n", sc->sc_dev.dv_xname);
lestart(ifp);
} else
printf("%s: card failed to initialize\n", sc->sc_dev.dv_xname);
(void) splx(s);
}
@ -587,7 +580,7 @@ le_init(sc)
* Called only at splimp or interrupt level.
*/
int
le_start(ifp)
lestart(ifp)
struct ifnet *ifp;
{
register struct le_softc *sc = lecd.cd_devs[ifp->if_unit];
@ -614,7 +607,7 @@ outloop:
cdm = &sc->sc_td[sc->sc_last_td];
#if 0 /* XXX redundant */
if (cdm->flags & OWN)
if (cdm->flags & LE_OWN)
return;
#endif
@ -648,14 +641,14 @@ outloop:
*/
cdm->bcnt = -len;
cdm->mcnt = 0;
cdm->flags |= OWN | STP | ENP;
cdm->flags |= LE_OWN | LE_STP | LE_ENP;
#ifdef LEDEBUG
if (sc->sc_debug)
xmit_print(sc, sc->sc_last_td);
#endif
lewrcsr(sc, 0, INEA | TDMD);
lewrcsr(sc, 0, LE_INEA | LE_TDMD);
/* possible more packets */
if (++sc->sc_last_td >= NTBUF)
@ -663,7 +656,6 @@ outloop:
goto outloop;
}
/*
* Controller interrupt.
*/
@ -671,7 +663,7 @@ int
leintr(sc)
register struct le_softc *sc;
{
u_short isr;
register u_short isr;
isr = lerdcsr(sc, 0);
#ifdef LEDEBUG
@ -679,7 +671,7 @@ leintr(sc)
printf("%s: leintr entering with isr=%04x\n",
sc->sc_dev.dv_xname, isr);
#endif
if ((isr & INTR) == 0)
if ((isr & LE_INTR) == 0)
return 0;
if (sc->sc_card == DEPCA)
@ -687,55 +679,56 @@ leintr(sc)
do {
lewrcsr(sc, 0,
isr & (INEA | BABL | MISS | MERR | RINT | TINT | IDON));
if (isr & (BABL | CERR | MISS | MERR)) {
if (isr & BABL){
isr & (LE_INEA | LE_BABL | LE_MISS | LE_MERR |
LE_RINT | LE_TINT | LE_IDON));
if (isr & (LE_BABL | LE_CERR | LE_MISS | LE_MERR)) {
if (isr & LE_BABL) {
printf("%s: BABL\n", sc->sc_dev.dv_xname);
sc->sc_arpcom.ac_if.if_oerrors++;
}
#if 0
if (isr & CERR) {
if (isr & LE_CERR) {
printf("%s: CERR\n", sc->sc_dev.dv_xname);
sc->sc_arpcom.ac_if.if_collisions++;
}
#endif
if (isr & MISS) {
if (isr & LE_MISS) {
printf("%s: MISS\n", sc->sc_dev.dv_xname);
sc->sc_arpcom.ac_if.if_ierrors++;
}
if (isr & MERR) {
if (isr & LE_MERR) {
printf("%s: MERR\n", sc->sc_dev.dv_xname);
le_reset(sc);
lereset(sc);
goto out;
}
}
if ((isr & RXON) == 0) {
if ((isr & LE_RXON) == 0) {
printf("%s: receiver disabled\n", sc->sc_dev.dv_xname);
sc->sc_arpcom.ac_if.if_ierrors++;
le_reset(sc);
lereset(sc);
goto out;
}
if ((isr & TXON) == 0) {
if ((isr & LE_TXON) == 0) {
printf("%s: transmitter disabled\n", sc->sc_dev.dv_xname);
sc->sc_arpcom.ac_if.if_oerrors++;
le_reset(sc);
lereset(sc);
goto out;
}
if (isr & RINT) {
if (isr & LE_RINT) {
/* Reset watchdog timer. */
sc->sc_arpcom.ac_if.if_timer = 0;
le_rint(sc);
lerint(sc);
}
if (isr & TINT) {
if (isr & LE_TINT) {
/* Reset watchdog timer. */
sc->sc_arpcom.ac_if.if_timer = 0;
le_tint(sc);
letint(sc);
}
isr = lerdcsr(sc, 0);
} while ((isr & INTR) != 0);
} while ((isr & LE_INTR) != 0);
#ifdef LEDEBUG
if (sc->sc_debug)
@ -753,13 +746,13 @@ out:
if (++tmd == NTBUF) tmd=0, cdm=sc->sc_td; else ++cdm
void
le_tint(sc)
letint(sc)
struct le_softc *sc;
{
register int tmd = (sc->sc_last_td - sc->sc_no_td + NTBUF) % NTBUF;
struct mds *cdm = &sc->sc_td[tmd];
if (cdm->flags & OWN) {
if (cdm->flags & LE_OWN) {
/* Race condition with loop below. */
#ifdef LEDEBUG
if (sc->sc_debug)
@ -779,23 +772,23 @@ le_tint(sc)
#endif
sc->sc_arpcom.ac_if.if_opackets++;
--sc->sc_no_td;
if (cdm->flags & (TBUFF | UFLO | LCOL | LCAR | RTRY)) {
if (cdm->flags & TBUFF)
if (cdm->flags & (LE_TBUFF | LE_UFLO | LE_LCOL | LE_LCAR | LE_RTRY)) {
if (cdm->flags & LE_TBUFF)
printf("%s: TBUFF\n", sc->sc_dev.dv_xname);
if ((cdm->flags & (TBUFF | UFLO)) == UFLO)
if ((cdm->flags & (LE_TBUFF | LE_UFLO)) == LE_UFLO)
printf("%s: UFLO\n", sc->sc_dev.dv_xname);
if (cdm->flags & UFLO) {
le_reset(sc);
if (cdm->flags & LE_UFLO) {
lereset(sc);
return;
}
#if 0
if (cdm->flags & LCOL) {
if (cdm->flags & LE_LCOL) {
printf("%s: late collision\n", sc->sc_dev.dv_xname);
sc->sc_arpcom.ac_if.if_collisions++;
}
if (cdm->flags & LCAR)
if (cdm->flags & LE_LCAR)
printf("%s: lost carrier\n", sc->sc_dev.dv_xname);
if (cdm->flags & RTRY) {
if (cdm->flags & LE_RTRY) {
printf("%s: excessive collisions, tdr %d\n",
sc->sc_dev.dv_xname, cdm->flags & 0x1ff);
sc->sc_arpcom.ac_if.if_collisions++;
@ -803,9 +796,9 @@ le_tint(sc)
#endif
}
NEXTTDS;
} while ((cdm->flags & OWN) == 0);
} while ((cdm->flags & LE_OWN) == 0);
le_start(&sc->sc_arpcom.ac_if);
lestart(&sc->sc_arpcom.ac_if);
}
#define NEXTRDS \
@ -813,13 +806,13 @@ le_tint(sc)
/* only called from one place, so may as well integrate */
void
le_rint(sc)
lerint(sc)
struct le_softc *sc;
{
register int rmd = sc->sc_last_rd;
struct mds *cdm = &sc->sc_rd[rmd];
if (cdm->flags & OWN) {
if (cdm->flags & LE_OWN) {
/* Race condition with loop below. */
#ifdef LEDEBUG
if (sc->sc_debug)
@ -830,25 +823,25 @@ le_rint(sc)
/* Process all buffers with valid data. */
do {
if (cdm->flags & (FRAM | OFLO | CRC | RBUFF)) {
if ((cdm->flags & (FRAM | OFLO | ENP)) == (FRAM | ENP))
if (cdm->flags & (LE_FRAM | LE_OFLO | LE_CRC | LE_RBUFF)) {
if ((cdm->flags & (LE_FRAM | LE_OFLO | LE_ENP)) == (LE_FRAM | LE_ENP))
printf("%s: FRAM\n", sc->sc_dev.dv_xname);
if ((cdm->flags & (OFLO | ENP)) == OFLO)
if ((cdm->flags & (LE_OFLO | LE_ENP)) == LE_OFLO)
printf("%s: OFLO\n", sc->sc_dev.dv_xname);
if ((cdm->flags & (CRC | OFLO | ENP)) == (CRC | ENP))
if ((cdm->flags & (LE_CRC | LE_OFLO | LE_ENP)) == (LE_CRC | LE_ENP))
printf("%s: CRC\n", sc->sc_dev.dv_xname);
if (cdm->flags & RBUFF)
if (cdm->flags & LE_RBUFF)
printf("%s: RBUFF\n", sc->sc_dev.dv_xname);
} else if (cdm->flags & (STP | ENP) != (STP | ENP)) {
} else if (cdm->flags & (LE_STP | LE_ENP) != (LE_STP | LE_ENP)) {
do {
cdm->mcnt = 0;
cdm->flags |= OWN;
cdm->flags |= LE_OWN;
NEXTRDS;
} while ((cdm->flags & (OWN | ERR | STP | ENP)) == 0);
} while ((cdm->flags & (LE_OWN | LE_ERR | LE_STP | LE_ENP)) == 0);
sc->sc_last_rd = rmd;
printf("%s: chained buffer\n", sc->sc_dev.dv_xname);
if ((cdm->flags & (OWN | ERR | STP | ENP)) != ENP) {
le_reset(sc);
if ((cdm->flags & (LE_OWN | LE_ERR | LE_STP | LE_ENP)) != LE_ENP) {
lereset(sc);
return;
}
} else {
@ -856,31 +849,30 @@ le_rint(sc)
if (sc->sc_debug)
recv_print(sc, sc->sc_last_rd);
#endif
le_read(sc, sc->sc_rbuf + (BUFSIZE * rmd),
leread(sc, sc->sc_rbuf + (BUFSIZE * rmd),
(int)cdm->mcnt);
sc->sc_arpcom.ac_if.if_ipackets++;
}
cdm->mcnt = 0;
cdm->flags |= OWN;
cdm->flags |= LE_OWN;
NEXTRDS;
#ifdef LEDEBUG
if (sc->sc_debug)
printf("sc->sc_last_rd = %x, cdm = %x\n",
sc->sc_last_rd, cdm);
#endif
} while ((cdm->flags & OWN) == 0);
} while ((cdm->flags & LE_OWN) == 0);
sc->sc_last_rd = rmd;
} /* le_rint */
}
/*
* Pass a packet to the higher levels.
*/
void
le_read(sc, buf, len)
struct le_softc *sc;
void
leread(sc, buf, len)
register struct le_softc *sc;
u_char *buf;
int len;
{
@ -893,14 +885,14 @@ le_read(sc, buf, len)
return;
/* Pull packet off interface. */
m = le_get(buf, len, &sc->sc_arpcom.ac_if);
m = leget(buf, len, &sc->sc_arpcom.ac_if);
if (m == 0)
return;
#if NBPFILTER > 0
/*
* Check if there's a BPF listener on this interface.
* If so, hand off the raw packet to bpf.
* If so, hand off the raw packet to BPF.
*/
if (sc->sc_arpcom.ac_if.if_bpf) {
bpf_mtap(sc->sc_arpcom.ac_if.if_bpf, m);
@ -934,7 +926,7 @@ le_read(sc, buf, len)
* we copy into clusters.
*/
struct mbuf *
le_get(buf, totlen, ifp)
leget(buf, totlen, ifp)
u_char *buf;
int totlen;
struct ifnet *ifp;
@ -1000,8 +992,8 @@ le_get(buf, totlen, ifp)
* Process an ioctl request.
*/
int
le_ioctl(ifp, cmd, data)
struct ifnet *ifp;
leioctl(ifp, cmd, data)
register struct ifnet *ifp;
int cmd;
caddr_t data;
{
@ -1020,7 +1012,7 @@ le_ioctl(ifp, cmd, data)
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
case AF_INET:
le_init(sc); /* before arpwhohas */
leinit(sc); /* before arpwhohas */
/*
* See if another station has *our* IP address.
* i.e.: There is an address conflict! If a
@ -1040,21 +1032,17 @@ le_ioctl(ifp, cmd, data)
if (ns_nullhost(*ina))
ina->x_host =
*(union ns_host *)(sc->sc_arpcom.ac_enaddr);
else {
/*
*
*/
else
bcopy(ina->x_host.c_host,
sc->sc_arpcom.ac_enaddr,
sizeof(sc->sc_arpcom.ac_enaddr));
}
/* Set new address. */
le_init(sc);
leinit(sc);
break;
}
#endif
default:
le_init(sc);
leinit(sc);
break;
}
break;
@ -1069,7 +1057,7 @@ le_ioctl(ifp, cmd, data)
* If interface is marked down and it is running, then
* stop it.
*/
le_stop(sc);
lestop(sc);
ifp->if_flags &= ~IFF_RUNNING;
} else if ((ifp->if_flags & IFF_UP) != 0 &&
(ifp->if_flags & IFF_RUNNING) == 0) {
@ -1077,14 +1065,14 @@ le_ioctl(ifp, cmd, data)
* If interface is marked up and it is stopped, then
* start it.
*/
le_init(sc);
leinit(sc);
} else {
/*
* Reset the interface to pick up changes in any other
* flags that affect hardware registers.
*/
/*le_stop(sc);*/
le_init(sc);
/*lestop(sc);*/
leinit(sc);
}
#ifdef LEDEBUG
if (ifp->if_flags & IFF_DEBUG)
@ -1105,7 +1093,7 @@ le_ioctl(ifp, cmd, data)
* Multicast list has changed; set the hardware filter
* accordingly.
*/
le_init(sc);
leinit(sc);
error = 0;
}
break;
@ -1175,7 +1163,7 @@ xmit_print(sc, no)
* Set up the logical address filter.
*/
void
le_setladrf(ac, af)
lesetladrf(ac, af)
struct arpcom *ac;
u_long *af;
{

View File

@ -10,15 +10,15 @@
* of this software, nor does the author assume any responsibility
* for damages incurred with its use.
*
* $Id: if_lereg.h,v 1.1 1994/07/01 20:25:27 mycroft Exp $
* $Id: if_lereg.h,v 1.2 1994/07/05 21:20:22 mycroft Exp $
*/
/* Declarations specific to this driver */
#define NTBUF 2
#define TLEN 1
#define NRBUF 8
#define RLEN 3
#define BUFSIZE 1518
#define NTBUF 2
#define TLEN 1
#define NRBUF 8
#define RLEN 3
#define BUFSIZE 1518
/* Board types */
#define BICC 1
@ -38,51 +38,59 @@
#define PCnet_ISA 2
#define PCnet_ISA_MASK 0x0000
/* Control and status register 0 flags */
#define ERR 0x8000
#define BABL 0x4000
#define CERR 0x2000
#define MISS 0x1000
#define MERR 0x0800
#define RINT 0x0400
#define TINT 0x0200
#define IDON 0x0100
#define INTR 0x0080
#define INEA 0x0040
#define RXON 0x0020
#define TXON 0x0010
#define TDMD 0x0008
#define STOP 0x0004
#define STRT 0x0002
#define INIT 0x0001
/*
* Control and status bits
*/
#define LE_SERR 0x8000
#define LE_BABL 0x4000
#define LE_CERR 0x2000
#define LE_MISS 0x1000
#define LE_MERR 0x0800
#define LE_RINT 0x0400
#define LE_TINT 0x0200
#define LE_IDON 0x0100
#define LE_INTR 0x0080
#define LE_INEA 0x0040
#define LE_RXON 0x0020
#define LE_TXON 0x0010
#define LE_TDMD 0x0008
#define LE_STOP 0x0004
#define LE_STRT 0x0002
#define LE_INIT 0x0001
/* Coontrol and status register 3 flags */
#define BSWP 0x0004
#define ACON 0x0002
#define BCON 0x0001
#define LE_BSWP 0x0004
#define LE_ACON 0x0002
#define LE_BCON 0x0001
/* Initialisation block (must be on word boundary) */
/*
* LANCE initialization block
*/
struct init_block {
u_short mode; /* Mode register */
u_char padr[6]; /* Ethernet address */
u_long ladrf[2]; /* Logical address filter (multicast) */
u_short rdra; /* Low order pointer to receive ring */
u_short rlen; /* High order pointer and no. rings */
u_short tdra; /* Low order pointer to transmit ring */
u_short tlen; /* High order pointer and no rings */
u_short mode; /* mode register */
u_char padr[6]; /* ethernet address */
u_long ladrf[2]; /* logical address filter (multicast) */
u_short rdra; /* low order pointer to receive ring */
u_short rlen; /* high order pointer and no. rings */
u_short tdra; /* low order pointer to transmit ring */
u_short tlen; /* high order pointer and no rings */
};
/* Mode settings */
#define PROM 0x8000 /* Promiscuous */
#define INTL 0x0040 /* Internal loopback */
#define DRTY 0x0020 /* Disable retry */
#define COLL 0x0010 /* Force collision */
#define DTCR 0x0008 /* Disable transmit crc */
#define LOOP 0x0004 /* Loop back */
#define DTX 0x0002 /* Disable transmitter */
#define DRX 0x0001 /* Disable receiver */
/*
* Mode bits -- init_block
*/
#define LE_PROM 0x8000 /* promiscuous */
#define LE_INTL 0x0040 /* internal loopback */
#define LE_DRTY 0x0020 /* disable retry */
#define LE_COLL 0x0010 /* force collision */
#define LE_DTCR 0x0008 /* disable transmit crc */
#define LE_LOOP 0x0004 /* loopback */
#define LE_DTX 0x0002 /* disable transmitter */
#define LE_DRX 0x0001 /* disable receiver */
#define LE_NORMAL 0x0000
/* Message descriptor structure */
/*
* Message descriptor
*/
struct mds {
u_short addr;
u_short flags;
@ -90,27 +98,29 @@ struct mds {
u_short mcnt;
};
/* Receive ring status flags */
#define OWN 0x8000 /* Owner bit, 0=host, 1=Lance */
#define MDERR 0x4000 /* Error */
#define FRAM 0x2000 /* Framing error error */
#define OFLO 0x1000 /* Silo overflow */
#define CRC 0x0800 /* CRC error */
#define RBUFF 0x0400 /* Buffer error */
#define STP 0x0200 /* Start of packet */
#define ENP 0x0100 /* End of packet */
/* Message descriptor flags */
#define LE_OWN 0x8000 /* owner bit, 0=host, 1=LANCE */
#define LE_ERR 0x4000 /* error */
#define LE_STP 0x0200 /* start of packet */
#define LE_ENP 0x0100 /* end of packet */
/* Transmit ring flags */
#define MORE 0x1000 /* More than 1 retry */
#define ONE 0x0800 /* One retry */
#define DEF 0x0400 /* Deferred transmit */
/* Receive ring status flags */
#define LE_FRAM 0x2000 /* framing error error */
#define LE_OFLO 0x1000 /* silo overflow */
#define LE_CRC 0x0800 /* CRC error */
#define LE_RBUFF 0x0400 /* buffer error */
/* Transmit ring status flags */
#define LE_MORE 0x1000 /* more than 1 retry */
#define LE_ONE 0x0800 /* one retry */
#define LE_DEF 0x0400 /* deferred transmit */
/* Transmit errors */
#define TBUFF 0x8000 /* Buffer error */
#define UFLO 0x4000 /* Silo underflow */
#define LCOL 0x1000 /* Late collision */
#define LCAR 0x0800 /* Loss of carrier */
#define RTRY 0x0400 /* Tried 16 times */
#define LE_TBUFF 0x8000 /* buffer error */
#define LE_UFLO 0x4000 /* silo underflow */
#define LE_LCOL 0x1000 /* late collision */
#define LE_LCAR 0x0800 /* loss of carrier */
#define LE_RTRY 0x0400 /* tried 16 times */
/* DEPCA-specific definitions */

View File

@ -10,7 +10,7 @@
* of this software, nor does the author assume any responsibility
* for damages incurred with its use.
*
* $Id: if_le.c,v 1.6 1994/07/02 04:13:16 mycroft Exp $
* $Id: if_le.c,v 1.7 1994/07/05 21:20:20 mycroft Exp $
*/
#include "bpfilter.h"
@ -93,24 +93,24 @@ struct le_softc {
};
int leintr __P((struct le_softc *));
int le_ioctl __P((struct ifnet *, int, caddr_t));
int le_start __P((struct ifnet *));
int le_watchdog __P((/* short */));
int leioctl __P((struct ifnet *, int, caddr_t));
int lestart __P((struct ifnet *));
int lewatchdog __P((/* short */));
static inline void lewrcsr __P((/* struct le_softc *, u_short, u_short */));
static inline u_short lerdcsr __P((/* struct le_softc *, u_short */));
void le_init __P((struct le_softc *));
void init_mem __P((struct le_softc *));
void le_reset __P((struct le_softc *));
void le_stop __P((struct le_softc *));
void le_tint __P((struct le_softc *));
void le_rint __P((struct le_softc *));
void le_read __P((struct le_softc *, u_char *, int));
struct mbuf *le_get __P((u_char *, int, struct ifnet *));
void leinit __P((struct le_softc *));
void lememinit __P((struct le_softc *));
void lereset __P((struct le_softc *));
void lestop __P((struct le_softc *));
void letint __P((struct le_softc *));
void lerint __P((struct le_softc *));
void leread __P((struct le_softc *, u_char *, int));
struct mbuf *leget __P((u_char *, int, struct ifnet *));
#ifdef LEDEBUG
void recv_print __P((struct le_softc *, int));
void xmit_print __P((struct le_softc *, int));
#endif
void le_setladrf __P((struct arpcom *, u_long *));
void lesetladrf __P((struct arpcom *, u_long *));
int leprobe();
int depca_probe __P((struct le_softc *, struct isa_attach_args *));
@ -349,10 +349,10 @@ lance_probe(sc)
int type;
/* Stop the LANCE chip and put it in a known state. */
lewrcsr(sc, 0, STOP);
lewrcsr(sc, 0, LE_STOP);
delay(100);
if (lerdcsr(sc, 0) != STOP)
if (lerdcsr(sc, 0) != LE_STOP)
return 0;
/*
@ -372,7 +372,7 @@ lance_probe(sc)
break;
}
lewrcsr(sc, 3, sc->sc_card == DEPCA ? ACON : 0);
lewrcsr(sc, 3, sc->sc_card == DEPCA ? LE_ACON : 0);
return type;
}
@ -393,9 +393,9 @@ leattach(parent, self, aux)
ifp->if_unit = sc->sc_dev.dv_unit;
ifp->if_name = lecd.cd_name;
ifp->if_output = ether_output;
ifp->if_start = le_start;
ifp->if_ioctl = le_ioctl;
ifp->if_watchdog = le_watchdog;
ifp->if_start = lestart;
ifp->if_ioctl = leioctl;
ifp->if_watchdog = lewatchdog;
ifp->if_flags =
IFF_BROADCAST | IFF_SIMPLEX | IFF_NOTRAILERS | IFF_MULTICAST;
@ -421,32 +421,31 @@ leattach(parent, self, aux)
}
void
le_reset(sc)
lereset(sc)
struct le_softc *sc;
{
log(LOG_NOTICE, "%s: reset\n", sc->sc_dev.dv_xname);
le_init(sc);
leinit(sc);
}
int
le_watchdog(unit)
lewatchdog(unit)
short unit;
{
struct le_softc *sc = lecd.cd_devs[unit];
log(LOG_ERR, "%s: device timeout\n", sc->sc_dev.dv_xname);
++sc->sc_arpcom.ac_if.if_oerrors;
le_reset(sc);
lereset(sc);
}
#define LANCE_ADDR(sc, a) \
(sc->sc_card == DEPCA ? ((u_long)(a) - (u_long)sc->sc_mem) : kvtop(a))
/* Lance initialisation block set up. */
/* LANCE initialization block set up. */
void
init_mem(sc)
struct le_softc *sc;
lememinit(sc)
register struct le_softc *sc;
{
struct ifnet *ifp = &sc->sc_arpcom.ac_if;
int i;
@ -458,22 +457,18 @@ init_mem(sc)
* quadword aligned. If it isn't then the initialisation is going
* fail later on.
*/
/*
* Set up lance initialisation block.
*/
mem = sc->sc_mem;
sc->sc_init = mem;
#if NBPFILTER > 0
if (ifp->if_flags & IFF_PROMISC)
sc->sc_init->mode = PROM;
sc->sc_init->mode = LE_NORMAL | LE_PROM;
else
#endif
sc->sc_init->mode = 0;
for (i = 0; i < ETHER_ADDR_LEN; i++)
sc->sc_init->mode = LE_NORMAL;
for (i = 0; i < ETHER_ADDR_LEN; i++)
sc->sc_init->padr[i] = sc->sc_arpcom.ac_enaddr[i];
le_setladrf(&sc->sc_arpcom, sc->sc_init->ladrf);
lesetladrf(&sc->sc_arpcom, sc->sc_init->ladrf);
mem += sizeof(struct init_block);
sc->sc_rd = mem;
@ -495,7 +490,7 @@ init_mem(sc)
for (i = 0; i < NRBUF; i++) {
a = LANCE_ADDR(sc, mem);
sc->sc_rd[i].addr = a;
sc->sc_rd[i].flags = ((a >> 16) & 0xff) | OWN;
sc->sc_rd[i].flags = ((a >> 16) & 0xff) | LE_OWN;
sc->sc_rd[i].bcnt = -BUFSIZE;
sc->sc_rd[i].mcnt = 0;
mem += BUFSIZE;
@ -516,11 +511,11 @@ init_mem(sc)
}
void
le_stop(sc)
lestop(sc)
struct le_softc *sc;
{
lewrcsr(sc, 0, STOP);
lewrcsr(sc, 0, LE_STOP);
}
/*
@ -528,54 +523,52 @@ le_stop(sc)
* and transmit/receive descriptor rings.
*/
void
le_init(sc)
struct le_softc *sc;
leinit(sc)
register struct le_softc *sc;
{
struct ifnet *ifp = &sc->sc_arpcom.ac_if;
int s;
register i;
register int timo;
u_long a;
/* Address not known. */
if (!ifp->if_addrlist)
if (!ifp->if_addrlist)
return;
s = splimp();
/*
* Lance must be stopped to access registers.
*/
le_stop(sc);
/* Don't want to get in a weird state. */
lestop(sc);
sc->sc_last_rd = sc->sc_last_td = sc->sc_no_td = 0;
/* Set up lance's memory area. */
init_mem(sc);
/* Set up LANCE init block. */
lememinit(sc);
/* No byte swapping etc. */
lewrcsr(sc, 3, sc->sc_card == DEPCA ? ACON : 0);
lewrcsr(sc, 3, sc->sc_card == DEPCA ? LE_ACON : 0);
/* Give lance the physical address of its init block. */
/* Give LANCE the physical address of its init block. */
a = LANCE_ADDR(sc, sc->sc_init);
lewrcsr(sc, 1, a);
lewrcsr(sc, 2, (a >> 16) & 0xff);
/* OK, let's try and initialise the Lance. */
lewrcsr(sc, 0, INIT);
/* Try to initialize the LANCE. */
lewrcsr(sc, 0, LE_INIT);
/* Wait for initialisation to finish. */
for (i = 0; i < 1000; i++)
if (lerdcsr(sc, 0) & IDON)
/* Wait for initialization to finish. */
for (timo = 1000; timo; timo--)
if (lerdcsr(sc, 0) & LE_IDON)
break;
if (lerdcsr(sc, 0) & IDON) {
/* Start the lance. */
lewrcsr(sc, 0, INEA | STRT | IDON);
if (lerdcsr(sc, 0) & LE_IDON) {
/* Start the LANCE. */
lewrcsr(sc, 0, LE_INEA | LE_STRT | LE_IDON);
ifp->if_flags |= IFF_RUNNING;
ifp->if_flags &= ~IFF_OACTIVE;
le_start(ifp);
} else
printf("%s: card failed to initialise\n", sc->sc_dev.dv_xname);
lestart(ifp);
} else
printf("%s: card failed to initialize\n", sc->sc_dev.dv_xname);
(void) splx(s);
}
@ -587,7 +580,7 @@ le_init(sc)
* Called only at splimp or interrupt level.
*/
int
le_start(ifp)
lestart(ifp)
struct ifnet *ifp;
{
register struct le_softc *sc = lecd.cd_devs[ifp->if_unit];
@ -614,7 +607,7 @@ outloop:
cdm = &sc->sc_td[sc->sc_last_td];
#if 0 /* XXX redundant */
if (cdm->flags & OWN)
if (cdm->flags & LE_OWN)
return;
#endif
@ -648,14 +641,14 @@ outloop:
*/
cdm->bcnt = -len;
cdm->mcnt = 0;
cdm->flags |= OWN | STP | ENP;
cdm->flags |= LE_OWN | LE_STP | LE_ENP;
#ifdef LEDEBUG
if (sc->sc_debug)
xmit_print(sc, sc->sc_last_td);
#endif
lewrcsr(sc, 0, INEA | TDMD);
lewrcsr(sc, 0, LE_INEA | LE_TDMD);
/* possible more packets */
if (++sc->sc_last_td >= NTBUF)
@ -663,7 +656,6 @@ outloop:
goto outloop;
}
/*
* Controller interrupt.
*/
@ -671,7 +663,7 @@ int
leintr(sc)
register struct le_softc *sc;
{
u_short isr;
register u_short isr;
isr = lerdcsr(sc, 0);
#ifdef LEDEBUG
@ -679,7 +671,7 @@ leintr(sc)
printf("%s: leintr entering with isr=%04x\n",
sc->sc_dev.dv_xname, isr);
#endif
if ((isr & INTR) == 0)
if ((isr & LE_INTR) == 0)
return 0;
if (sc->sc_card == DEPCA)
@ -687,55 +679,56 @@ leintr(sc)
do {
lewrcsr(sc, 0,
isr & (INEA | BABL | MISS | MERR | RINT | TINT | IDON));
if (isr & (BABL | CERR | MISS | MERR)) {
if (isr & BABL){
isr & (LE_INEA | LE_BABL | LE_MISS | LE_MERR |
LE_RINT | LE_TINT | LE_IDON));
if (isr & (LE_BABL | LE_CERR | LE_MISS | LE_MERR)) {
if (isr & LE_BABL) {
printf("%s: BABL\n", sc->sc_dev.dv_xname);
sc->sc_arpcom.ac_if.if_oerrors++;
}
#if 0
if (isr & CERR) {
if (isr & LE_CERR) {
printf("%s: CERR\n", sc->sc_dev.dv_xname);
sc->sc_arpcom.ac_if.if_collisions++;
}
#endif
if (isr & MISS) {
if (isr & LE_MISS) {
printf("%s: MISS\n", sc->sc_dev.dv_xname);
sc->sc_arpcom.ac_if.if_ierrors++;
}
if (isr & MERR) {
if (isr & LE_MERR) {
printf("%s: MERR\n", sc->sc_dev.dv_xname);
le_reset(sc);
lereset(sc);
goto out;
}
}
if ((isr & RXON) == 0) {
if ((isr & LE_RXON) == 0) {
printf("%s: receiver disabled\n", sc->sc_dev.dv_xname);
sc->sc_arpcom.ac_if.if_ierrors++;
le_reset(sc);
lereset(sc);
goto out;
}
if ((isr & TXON) == 0) {
if ((isr & LE_TXON) == 0) {
printf("%s: transmitter disabled\n", sc->sc_dev.dv_xname);
sc->sc_arpcom.ac_if.if_oerrors++;
le_reset(sc);
lereset(sc);
goto out;
}
if (isr & RINT) {
if (isr & LE_RINT) {
/* Reset watchdog timer. */
sc->sc_arpcom.ac_if.if_timer = 0;
le_rint(sc);
lerint(sc);
}
if (isr & TINT) {
if (isr & LE_TINT) {
/* Reset watchdog timer. */
sc->sc_arpcom.ac_if.if_timer = 0;
le_tint(sc);
letint(sc);
}
isr = lerdcsr(sc, 0);
} while ((isr & INTR) != 0);
} while ((isr & LE_INTR) != 0);
#ifdef LEDEBUG
if (sc->sc_debug)
@ -753,13 +746,13 @@ out:
if (++tmd == NTBUF) tmd=0, cdm=sc->sc_td; else ++cdm
void
le_tint(sc)
letint(sc)
struct le_softc *sc;
{
register int tmd = (sc->sc_last_td - sc->sc_no_td + NTBUF) % NTBUF;
struct mds *cdm = &sc->sc_td[tmd];
if (cdm->flags & OWN) {
if (cdm->flags & LE_OWN) {
/* Race condition with loop below. */
#ifdef LEDEBUG
if (sc->sc_debug)
@ -779,23 +772,23 @@ le_tint(sc)
#endif
sc->sc_arpcom.ac_if.if_opackets++;
--sc->sc_no_td;
if (cdm->flags & (TBUFF | UFLO | LCOL | LCAR | RTRY)) {
if (cdm->flags & TBUFF)
if (cdm->flags & (LE_TBUFF | LE_UFLO | LE_LCOL | LE_LCAR | LE_RTRY)) {
if (cdm->flags & LE_TBUFF)
printf("%s: TBUFF\n", sc->sc_dev.dv_xname);
if ((cdm->flags & (TBUFF | UFLO)) == UFLO)
if ((cdm->flags & (LE_TBUFF | LE_UFLO)) == LE_UFLO)
printf("%s: UFLO\n", sc->sc_dev.dv_xname);
if (cdm->flags & UFLO) {
le_reset(sc);
if (cdm->flags & LE_UFLO) {
lereset(sc);
return;
}
#if 0
if (cdm->flags & LCOL) {
if (cdm->flags & LE_LCOL) {
printf("%s: late collision\n", sc->sc_dev.dv_xname);
sc->sc_arpcom.ac_if.if_collisions++;
}
if (cdm->flags & LCAR)
if (cdm->flags & LE_LCAR)
printf("%s: lost carrier\n", sc->sc_dev.dv_xname);
if (cdm->flags & RTRY) {
if (cdm->flags & LE_RTRY) {
printf("%s: excessive collisions, tdr %d\n",
sc->sc_dev.dv_xname, cdm->flags & 0x1ff);
sc->sc_arpcom.ac_if.if_collisions++;
@ -803,9 +796,9 @@ le_tint(sc)
#endif
}
NEXTTDS;
} while ((cdm->flags & OWN) == 0);
} while ((cdm->flags & LE_OWN) == 0);
le_start(&sc->sc_arpcom.ac_if);
lestart(&sc->sc_arpcom.ac_if);
}
#define NEXTRDS \
@ -813,13 +806,13 @@ le_tint(sc)
/* only called from one place, so may as well integrate */
void
le_rint(sc)
lerint(sc)
struct le_softc *sc;
{
register int rmd = sc->sc_last_rd;
struct mds *cdm = &sc->sc_rd[rmd];
if (cdm->flags & OWN) {
if (cdm->flags & LE_OWN) {
/* Race condition with loop below. */
#ifdef LEDEBUG
if (sc->sc_debug)
@ -830,25 +823,25 @@ le_rint(sc)
/* Process all buffers with valid data. */
do {
if (cdm->flags & (FRAM | OFLO | CRC | RBUFF)) {
if ((cdm->flags & (FRAM | OFLO | ENP)) == (FRAM | ENP))
if (cdm->flags & (LE_FRAM | LE_OFLO | LE_CRC | LE_RBUFF)) {
if ((cdm->flags & (LE_FRAM | LE_OFLO | LE_ENP)) == (LE_FRAM | LE_ENP))
printf("%s: FRAM\n", sc->sc_dev.dv_xname);
if ((cdm->flags & (OFLO | ENP)) == OFLO)
if ((cdm->flags & (LE_OFLO | LE_ENP)) == LE_OFLO)
printf("%s: OFLO\n", sc->sc_dev.dv_xname);
if ((cdm->flags & (CRC | OFLO | ENP)) == (CRC | ENP))
if ((cdm->flags & (LE_CRC | LE_OFLO | LE_ENP)) == (LE_CRC | LE_ENP))
printf("%s: CRC\n", sc->sc_dev.dv_xname);
if (cdm->flags & RBUFF)
if (cdm->flags & LE_RBUFF)
printf("%s: RBUFF\n", sc->sc_dev.dv_xname);
} else if (cdm->flags & (STP | ENP) != (STP | ENP)) {
} else if (cdm->flags & (LE_STP | LE_ENP) != (LE_STP | LE_ENP)) {
do {
cdm->mcnt = 0;
cdm->flags |= OWN;
cdm->flags |= LE_OWN;
NEXTRDS;
} while ((cdm->flags & (OWN | ERR | STP | ENP)) == 0);
} while ((cdm->flags & (LE_OWN | LE_ERR | LE_STP | LE_ENP)) == 0);
sc->sc_last_rd = rmd;
printf("%s: chained buffer\n", sc->sc_dev.dv_xname);
if ((cdm->flags & (OWN | ERR | STP | ENP)) != ENP) {
le_reset(sc);
if ((cdm->flags & (LE_OWN | LE_ERR | LE_STP | LE_ENP)) != LE_ENP) {
lereset(sc);
return;
}
} else {
@ -856,31 +849,30 @@ le_rint(sc)
if (sc->sc_debug)
recv_print(sc, sc->sc_last_rd);
#endif
le_read(sc, sc->sc_rbuf + (BUFSIZE * rmd),
leread(sc, sc->sc_rbuf + (BUFSIZE * rmd),
(int)cdm->mcnt);
sc->sc_arpcom.ac_if.if_ipackets++;
}
cdm->mcnt = 0;
cdm->flags |= OWN;
cdm->flags |= LE_OWN;
NEXTRDS;
#ifdef LEDEBUG
if (sc->sc_debug)
printf("sc->sc_last_rd = %x, cdm = %x\n",
sc->sc_last_rd, cdm);
#endif
} while ((cdm->flags & OWN) == 0);
} while ((cdm->flags & LE_OWN) == 0);
sc->sc_last_rd = rmd;
} /* le_rint */
}
/*
* Pass a packet to the higher levels.
*/
void
le_read(sc, buf, len)
struct le_softc *sc;
void
leread(sc, buf, len)
register struct le_softc *sc;
u_char *buf;
int len;
{
@ -893,14 +885,14 @@ le_read(sc, buf, len)
return;
/* Pull packet off interface. */
m = le_get(buf, len, &sc->sc_arpcom.ac_if);
m = leget(buf, len, &sc->sc_arpcom.ac_if);
if (m == 0)
return;
#if NBPFILTER > 0
/*
* Check if there's a BPF listener on this interface.
* If so, hand off the raw packet to bpf.
* If so, hand off the raw packet to BPF.
*/
if (sc->sc_arpcom.ac_if.if_bpf) {
bpf_mtap(sc->sc_arpcom.ac_if.if_bpf, m);
@ -934,7 +926,7 @@ le_read(sc, buf, len)
* we copy into clusters.
*/
struct mbuf *
le_get(buf, totlen, ifp)
leget(buf, totlen, ifp)
u_char *buf;
int totlen;
struct ifnet *ifp;
@ -1000,8 +992,8 @@ le_get(buf, totlen, ifp)
* Process an ioctl request.
*/
int
le_ioctl(ifp, cmd, data)
struct ifnet *ifp;
leioctl(ifp, cmd, data)
register struct ifnet *ifp;
int cmd;
caddr_t data;
{
@ -1020,7 +1012,7 @@ le_ioctl(ifp, cmd, data)
switch (ifa->ifa_addr->sa_family) {
#ifdef INET
case AF_INET:
le_init(sc); /* before arpwhohas */
leinit(sc); /* before arpwhohas */
/*
* See if another station has *our* IP address.
* i.e.: There is an address conflict! If a
@ -1040,21 +1032,17 @@ le_ioctl(ifp, cmd, data)
if (ns_nullhost(*ina))
ina->x_host =
*(union ns_host *)(sc->sc_arpcom.ac_enaddr);
else {
/*
*
*/
else
bcopy(ina->x_host.c_host,
sc->sc_arpcom.ac_enaddr,
sizeof(sc->sc_arpcom.ac_enaddr));
}
/* Set new address. */
le_init(sc);
leinit(sc);
break;
}
#endif
default:
le_init(sc);
leinit(sc);
break;
}
break;
@ -1069,7 +1057,7 @@ le_ioctl(ifp, cmd, data)
* If interface is marked down and it is running, then
* stop it.
*/
le_stop(sc);
lestop(sc);
ifp->if_flags &= ~IFF_RUNNING;
} else if ((ifp->if_flags & IFF_UP) != 0 &&
(ifp->if_flags & IFF_RUNNING) == 0) {
@ -1077,14 +1065,14 @@ le_ioctl(ifp, cmd, data)
* If interface is marked up and it is stopped, then
* start it.
*/
le_init(sc);
leinit(sc);
} else {
/*
* Reset the interface to pick up changes in any other
* flags that affect hardware registers.
*/
/*le_stop(sc);*/
le_init(sc);
/*lestop(sc);*/
leinit(sc);
}
#ifdef LEDEBUG
if (ifp->if_flags & IFF_DEBUG)
@ -1105,7 +1093,7 @@ le_ioctl(ifp, cmd, data)
* Multicast list has changed; set the hardware filter
* accordingly.
*/
le_init(sc);
leinit(sc);
error = 0;
}
break;
@ -1175,7 +1163,7 @@ xmit_print(sc, no)
* Set up the logical address filter.
*/
void
le_setladrf(ac, af)
lesetladrf(ac, af)
struct arpcom *ac;
u_long *af;
{

View File

@ -10,15 +10,15 @@
* of this software, nor does the author assume any responsibility
* for damages incurred with its use.
*
* $Id: if_lereg.h,v 1.1 1994/07/01 20:25:27 mycroft Exp $
* $Id: if_lereg.h,v 1.2 1994/07/05 21:20:22 mycroft Exp $
*/
/* Declarations specific to this driver */
#define NTBUF 2
#define TLEN 1
#define NRBUF 8
#define RLEN 3
#define BUFSIZE 1518
#define NTBUF 2
#define TLEN 1
#define NRBUF 8
#define RLEN 3
#define BUFSIZE 1518
/* Board types */
#define BICC 1
@ -38,51 +38,59 @@
#define PCnet_ISA 2
#define PCnet_ISA_MASK 0x0000
/* Control and status register 0 flags */
#define ERR 0x8000
#define BABL 0x4000
#define CERR 0x2000
#define MISS 0x1000
#define MERR 0x0800
#define RINT 0x0400
#define TINT 0x0200
#define IDON 0x0100
#define INTR 0x0080
#define INEA 0x0040
#define RXON 0x0020
#define TXON 0x0010
#define TDMD 0x0008
#define STOP 0x0004
#define STRT 0x0002
#define INIT 0x0001
/*
* Control and status bits
*/
#define LE_SERR 0x8000
#define LE_BABL 0x4000
#define LE_CERR 0x2000
#define LE_MISS 0x1000
#define LE_MERR 0x0800
#define LE_RINT 0x0400
#define LE_TINT 0x0200
#define LE_IDON 0x0100
#define LE_INTR 0x0080
#define LE_INEA 0x0040
#define LE_RXON 0x0020
#define LE_TXON 0x0010
#define LE_TDMD 0x0008
#define LE_STOP 0x0004
#define LE_STRT 0x0002
#define LE_INIT 0x0001
/* Coontrol and status register 3 flags */
#define BSWP 0x0004
#define ACON 0x0002
#define BCON 0x0001
#define LE_BSWP 0x0004
#define LE_ACON 0x0002
#define LE_BCON 0x0001
/* Initialisation block (must be on word boundary) */
/*
* LANCE initialization block
*/
struct init_block {
u_short mode; /* Mode register */
u_char padr[6]; /* Ethernet address */
u_long ladrf[2]; /* Logical address filter (multicast) */
u_short rdra; /* Low order pointer to receive ring */
u_short rlen; /* High order pointer and no. rings */
u_short tdra; /* Low order pointer to transmit ring */
u_short tlen; /* High order pointer and no rings */
u_short mode; /* mode register */
u_char padr[6]; /* ethernet address */
u_long ladrf[2]; /* logical address filter (multicast) */
u_short rdra; /* low order pointer to receive ring */
u_short rlen; /* high order pointer and no. rings */
u_short tdra; /* low order pointer to transmit ring */
u_short tlen; /* high order pointer and no rings */
};
/* Mode settings */
#define PROM 0x8000 /* Promiscuous */
#define INTL 0x0040 /* Internal loopback */
#define DRTY 0x0020 /* Disable retry */
#define COLL 0x0010 /* Force collision */
#define DTCR 0x0008 /* Disable transmit crc */
#define LOOP 0x0004 /* Loop back */
#define DTX 0x0002 /* Disable transmitter */
#define DRX 0x0001 /* Disable receiver */
/*
* Mode bits -- init_block
*/
#define LE_PROM 0x8000 /* promiscuous */
#define LE_INTL 0x0040 /* internal loopback */
#define LE_DRTY 0x0020 /* disable retry */
#define LE_COLL 0x0010 /* force collision */
#define LE_DTCR 0x0008 /* disable transmit crc */
#define LE_LOOP 0x0004 /* loopback */
#define LE_DTX 0x0002 /* disable transmitter */
#define LE_DRX 0x0001 /* disable receiver */
#define LE_NORMAL 0x0000
/* Message descriptor structure */
/*
* Message descriptor
*/
struct mds {
u_short addr;
u_short flags;
@ -90,27 +98,29 @@ struct mds {
u_short mcnt;
};
/* Receive ring status flags */
#define OWN 0x8000 /* Owner bit, 0=host, 1=Lance */
#define MDERR 0x4000 /* Error */
#define FRAM 0x2000 /* Framing error error */
#define OFLO 0x1000 /* Silo overflow */
#define CRC 0x0800 /* CRC error */
#define RBUFF 0x0400 /* Buffer error */
#define STP 0x0200 /* Start of packet */
#define ENP 0x0100 /* End of packet */
/* Message descriptor flags */
#define LE_OWN 0x8000 /* owner bit, 0=host, 1=LANCE */
#define LE_ERR 0x4000 /* error */
#define LE_STP 0x0200 /* start of packet */
#define LE_ENP 0x0100 /* end of packet */
/* Transmit ring flags */
#define MORE 0x1000 /* More than 1 retry */
#define ONE 0x0800 /* One retry */
#define DEF 0x0400 /* Deferred transmit */
/* Receive ring status flags */
#define LE_FRAM 0x2000 /* framing error error */
#define LE_OFLO 0x1000 /* silo overflow */
#define LE_CRC 0x0800 /* CRC error */
#define LE_RBUFF 0x0400 /* buffer error */
/* Transmit ring status flags */
#define LE_MORE 0x1000 /* more than 1 retry */
#define LE_ONE 0x0800 /* one retry */
#define LE_DEF 0x0400 /* deferred transmit */
/* Transmit errors */
#define TBUFF 0x8000 /* Buffer error */
#define UFLO 0x4000 /* Silo underflow */
#define LCOL 0x1000 /* Late collision */
#define LCAR 0x0800 /* Loss of carrier */
#define RTRY 0x0400 /* Tried 16 times */
#define LE_TBUFF 0x8000 /* buffer error */
#define LE_UFLO 0x4000 /* silo underflow */
#define LE_LCOL 0x1000 /* late collision */
#define LE_LCAR 0x0800 /* loss of carrier */
#define LE_RTRY 0x0400 /* tried 16 times */
/* DEPCA-specific definitions */