diff options
author | briggs <briggs@cvs.openbsd.org> | 1997-04-10 02:35:04 +0000 |
---|---|---|
committer | briggs <briggs@cvs.openbsd.org> | 1997-04-10 02:35:04 +0000 |
commit | 7d82dc13a8e5b31891456d17a9afe9aa493b6b87 (patch) | |
tree | 0034d5dfa85c1a0e2abfcf41316ccde2e80cd952 /sys | |
parent | 30a4da21125579377641e28e2fb958d2becf75a3 (diff) |
Changes from Denny Gentry <denny1@home.com>:
Change in the way receive buffer areas are handled. Before we gave
the chip 16 buffers, each 1536 bytes (big enough for one packet).
Now we're handing the chip 8 buffers, each 4 Kbytes, and letting
the chip fit as many packets as it can in each one. This should
help keep it from running out of buffer space. Also make some of
the performance-crucial routines inline. It made no measurable
difference except to make me feel better
Diffstat (limited to 'sys')
-rw-r--r-- | sys/arch/mac68k/dev/if_sn.c | 85 | ||||
-rw-r--r-- | sys/arch/mac68k/dev/if_snvar.h | 14 |
2 files changed, 51 insertions, 48 deletions
diff --git a/sys/arch/mac68k/dev/if_sn.c b/sys/arch/mac68k/dev/if_sn.c index e54842cdde5..4dd01df444e 100644 --- a/sys/arch/mac68k/dev/if_sn.c +++ b/sys/arch/mac68k/dev/if_sn.c @@ -1,5 +1,5 @@ /* $NetBSD: if_sn.c,v 1.7 1997/03/20 17:47:51 scottr Exp $ */ -/* $OpenBSD: if_sn.c,v 1.17 1997/03/29 23:26:48 briggs Exp $ */ +/* $OpenBSD: if_sn.c,v 1.18 1997/04/10 02:35:02 briggs Exp $ */ /* * National Semiconductor SONIC Driver @@ -61,7 +61,7 @@ typedef unsigned char uchar; static void snwatchdog __P((struct ifnet *)); static int sninit __P((struct sn_softc *sc)); static int snstop __P((struct sn_softc *sc)); -static int sonicput __P((struct sn_softc *sc, struct mbuf *m0)); +static inline int sonicput __P((struct sn_softc *sc, struct mbuf *m0)); static int snioctl __P((struct ifnet *ifp, u_long cmd, caddr_t data)); static void snstart __P((struct ifnet *ifp)); static void snreset __P((struct sn_softc *sc)); @@ -207,9 +207,8 @@ snsetup(sc) p = pp + NBPG; - for (i = 0; i < NRBA; i+=2) { + for (i = 0; i < NRBA; i++) { sc->rbuf[i] = (caddr_t) p; - sc->rbuf[i+1] = (caddr_t)(p + (NBPG/2)); p += NBPG; } @@ -543,7 +542,7 @@ snwatchdog(ifp) /* * stuff packet into sonic (at splnet) */ -static int +static inline int sonicput(sc, m0) struct sn_softc *sc; struct mbuf *m0; @@ -633,8 +632,8 @@ sonicput(sc, m0) static void sonictxint __P((struct sn_softc *)); static void sonicrxint __P((struct sn_softc *)); -static int sonic_read __P((struct sn_softc *, caddr_t, int)); -static struct mbuf *sonic_get __P((struct sn_softc *, struct ether_header *, int)); +static inline int sonic_read __P((struct sn_softc *, caddr_t, int)); +static inline struct mbuf *sonic_get __P((struct sn_softc *, struct ether_header *, int)); /* * CAM support @@ -831,10 +830,11 @@ initialise_rra(sc) unsigned int v; int bitmode = sc->bitmode; - if (bitmode) /* eobc must be >= MAXETHERPKT */ + if (bitmode) NIC_PUT(sc, SNR_EOBC, RBASIZE(sc) / 2 - 2); else NIC_PUT(sc, SNR_EOBC, RBASIZE(sc) / 2 - 1); + NIC_PUT(sc, SNR_URRA, UPPER(sc->v_rra[0])); NIC_PUT(sc, SNR_RSA, LOWER(sc->v_rra[0])); /* rea must point just past the end of the rra space */ @@ -846,8 +846,8 @@ initialise_rra(sc) v = kvtop(sc->rbuf[i]); SWO(bitmode, sc->p_rra[i], RXRSRC_PTRHI, UPPER(v)); SWO(bitmode, sc->p_rra[i], RXRSRC_PTRLO, LOWER(v)); - SWO(bitmode, sc->p_rra[i], RXRSRC_WCHI, UPPER(RBASIZE(sc) / 2)); - SWO(bitmode, sc->p_rra[i], RXRSRC_WCLO, LOWER(RBASIZE(sc) / 2)); + SWO(bitmode, sc->p_rra[i], RXRSRC_WCHI, UPPER(NBPG/2)); + SWO(bitmode, sc->p_rra[i], RXRSRC_WCLO, LOWER(NBPG/2)); } sc->sc_rramark = NRBA; NIC_PUT(sc, SNR_RWP, LOWER(sc->v_rra[sc->sc_rramark])); @@ -876,11 +876,11 @@ snintr(arg, slot) NIC_PUT(sc, SNR_ISR, isr); wbflush(); - if (isr & (ISR_BR | ISR_LCD | ISR_PINT | ISR_TC)) + if (isr & (ISR_BR | ISR_LCD | ISR_TC)) printf("%s: unexpected interrupt status 0x%x\n", sc->sc_dev.dv_xname, isr); - if (isr & (ISR_TXDN | ISR_TXER)) + if (isr & (ISR_TXDN | ISR_TXER | ISR_PINT)) sonictxint(sc); if (isr & ISR_PKTRX) @@ -997,22 +997,20 @@ sonicrxint(sc) int rramark; int rdamark; int bitmode = sc->bitmode; - void *tmp1; - void *tmp2; + u_int16_t rxpkt_ptr; rda = sc->p_rda[sc->sc_rxmark]; while (SRO(bitmode, rda, RXPKT_INUSE) == 0) { unsigned status = SRO(bitmode, rda, RXPKT_STATUS); - if ((status & RCR_LPKT) == 0) - printf("%s: more than one packet in RBA!\n", - sc->sc_dev.dv_xname); orra = RBASEQ(SRO(bitmode, rda, RXPKT_SEQNO)) & RRAMASK; + rxpkt_ptr = SRO(bitmode, rda, RXPKT_PTRLO); len = SRO(bitmode, rda, RXPKT_BYTEC) - sizeof(struct ether_header) - FCSSIZE; if (status & RCR_PRX) { - if (sonic_read(sc, sc->rbuf[orra & RBAMASK], len)) { + caddr_t pkt = sc->rbuf[orra & RBAMASK] + (rxpkt_ptr & PGOFSET); + if (sonic_read(sc, pkt, len)) { sc->sc_if.if_ipackets++; sc->sc_sum.ls_ipacks++; sc->sc_missed = 0; @@ -1023,8 +1021,9 @@ sonicrxint(sc) /* * give receive buffer area back to chip. * - * orra is now empty of packets and can be freed if - * sonic read didnt copy it out then we would have to + * If this was the last packet in the RRA, give the RRA to + * the chip again. + * If sonic read didnt copy it out then we would have to * wait !! * (dont bother add it back in again straight away) * @@ -1032,25 +1031,29 @@ sonicrxint(sc) * we have to use the macros because SONIC might be in * 16 or 32 bit mode. */ - rramark = sc->sc_rramark; - tmp1 = sc->p_rra[rramark]; - tmp2 = sc->p_rra[orra]; - SWO(bitmode, tmp1, RXRSRC_PTRLO, - SRO(bitmode, tmp2, RXRSRC_PTRLO)); - SWO(bitmode, tmp1, RXRSRC_PTRHI, - SRO(bitmode, tmp2, RXRSRC_PTRHI)); - SWO(bitmode, tmp1, RXRSRC_WCLO, - SRO(bitmode, tmp2, RXRSRC_WCLO)); - SWO(bitmode, tmp1, RXRSRC_WCHI, - SRO(bitmode, tmp2, RXRSRC_WCHI)); - - /* zap old rra for fun */ - SWO(bitmode, tmp2, RXRSRC_WCHI, 0); - SWO(bitmode, tmp2, RXRSRC_WCLO, 0); - - sc->sc_rramark = (++rramark) & RRAMASK; - NIC_PUT(sc, SNR_RWP, LOWER(sc->v_rra[rramark])); - wbflush(); + if (status & RCR_LPKT) { + void *tmp1, *tmp2; + + rramark = sc->sc_rramark; + tmp1 = sc->p_rra[rramark]; + tmp2 = sc->p_rra[orra]; + SWO(bitmode, tmp1, RXRSRC_PTRLO, + SRO(bitmode, tmp2, RXRSRC_PTRLO)); + SWO(bitmode, tmp1, RXRSRC_PTRHI, + SRO(bitmode, tmp2, RXRSRC_PTRHI)); + SWO(bitmode, tmp1, RXRSRC_WCLO, + SRO(bitmode, tmp2, RXRSRC_WCLO)); + SWO(bitmode, tmp1, RXRSRC_WCHI, + SRO(bitmode, tmp2, RXRSRC_WCHI)); + + /* zap old rra for fun */ + SWO(bitmode, tmp2, RXRSRC_WCHI, 0); + SWO(bitmode, tmp2, RXRSRC_WCLO, 0); + + sc->sc_rramark = (++rramark) & RRAMASK; + NIC_PUT(sc, SNR_RWP, LOWER(sc->v_rra[rramark])); + wbflush(); + } /* * give receive descriptor back to chip simple @@ -1074,7 +1077,7 @@ sonicrxint(sc) * sonic_read -- pull packet off interface and forward to * appropriate protocol handler */ -static int +static inline int sonic_read(sc, pkt, len) struct sn_softc *sc; caddr_t pkt; @@ -1131,7 +1134,7 @@ sonic_read(sc, pkt, len) * because we are using stupid buffer management this * is slow. */ -static struct mbuf * +static inline struct mbuf * sonic_get(sc, eh, datalen) struct sn_softc *sc; struct ether_header *eh; diff --git a/sys/arch/mac68k/dev/if_snvar.h b/sys/arch/mac68k/dev/if_snvar.h index fa6c3aecc1d..d5db4b9987a 100644 --- a/sys/arch/mac68k/dev/if_snvar.h +++ b/sys/arch/mac68k/dev/if_snvar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: if_snvar.h,v 1.3 1997/03/29 23:26:50 briggs Exp $ */ +/* $OpenBSD: if_snvar.h,v 1.4 1997/04/10 02:35:03 briggs Exp $ */ /* * Copyright (c) 1991 Algorithmics Ltd (http://www.algor.co.uk) @@ -47,12 +47,12 @@ * 1 Rda is 4 words == 16 bytes */ -#define NRBA 16 /* # receive buffers < NRRA */ -#define RBAMASK 0x0f -#define NRDA NRBA +#define NRBA 8 /* # receive buffers < NRRA */ +#define RBAMASK (NRBA-1) +#define NRDA NRBA*4 #define NTDA 4 /* # transmit descriptors */ #define NRRA 32 /* # receive resource descriptors */ -#define RRAMASK 0x1f /* the reason why it must be power of two */ +#define RRAMASK (NRRA-1) /* the reason why it must be power of two */ #define FCSSIZE 4 /* size of FCS appended to packets */ @@ -204,7 +204,7 @@ typedef struct sn_softc { * Transmit Descriptor * This structure holds information about packets to be transmitted. */ -#define FRAGMAX 16 /* maximum number of fragments in a packet */ +#define FRAGMAX 8 /* maximum number of fragments in a packet */ #define TXP_STATUS 0 /* + transmitted packet status */ #define TXP_CONFIG 1 /* transmission configuration */ @@ -217,7 +217,7 @@ typedef struct sn_softc { #define TXP_FPTRHI 1 /* ptr to packet fragment HI */ #define TXP_FSIZE 2 /* fragment size */ -#define TXP_WORDS TXP_FRAGOFF + FRAGMAX*TXP_FSIZE + 1 /* 1 for tlink */ +#define TXP_WORDS TXP_FRAGOFF + (FRAGMAX*TXP_FRAGSIZE) + 1 /* 1 for tlink */ #define TXP_SIZE(sc) ((sc->bitmode) ? (TXP_WORDS*4) : (TXP_WORDS*2)) #define EOL 0x0001 /* end of list marker for link fields */ |