Simplify the copy loops a bit.

This commit is contained in:
mycroft 1998-12-12 16:58:10 +00:00
parent 90b7cbc727
commit 95aa0d0b7d
5 changed files with 136 additions and 135 deletions

View File

@ -1,4 +1,4 @@
/* $NetBSD: i82586.c,v 1.18 1998/08/15 04:42:42 mycroft Exp $ */
/* $NetBSD: i82586.c,v 1.19 1998/12/12 16:58:10 mycroft Exp $ */
/*-
* Copyright (c) 1998 The NetBSD Foundation, Inc.
@ -1081,14 +1081,14 @@ ieget(sc, ehp, to_bpf, head, totlen)
int head;
int totlen;
{
struct mbuf *top, **mp, *m;
struct mbuf *m, *m0, *newm;
int len, resid;
int thisrboff, thismboff;
/*
* Snarf the Ethernet header.
*/
(sc->memcopyin)(sc, ehp, IE_RBUF_ADDR(sc,head), sizeof *ehp);
(sc->memcopyin)(sc, ehp, IE_RBUF_ADDR(sc, head), sizeof *ehp);
/*
* As quickly as possible, check if this packet is for us.
@ -1105,43 +1105,39 @@ ieget(sc, ehp, to_bpf, head, totlen)
resid = totlen -= (thisrboff = sizeof *ehp);
MGETHDR(m, M_DONTWAIT, MT_DATA);
if (m == 0)
MGETHDR(m0, M_DONTWAIT, MT_DATA);
if (m0 == 0)
return (0);
m->m_pkthdr.rcvif = &sc->sc_ethercom.ec_if;
m->m_pkthdr.len = totlen;
m0->m_pkthdr.rcvif = &sc->sc_ethercom.ec_if;
m0->m_pkthdr.len = totlen;
len = MHLEN;
top = 0;
mp = ⊤
m = m0;
/*
* This loop goes through and allocates mbufs for all the data we will
* be copying in. It does not actually do the copying yet.
*/
while (totlen > 0) {
if (top) {
MGET(m, M_DONTWAIT, MT_DATA);
if (m == 0) {
m_freem(top);
return (0);
}
len = MLEN;
}
if (totlen >= MINCLSIZE) {
MCLGET(m, M_DONTWAIT);
if ((m->m_flags & M_EXT) == 0) {
m_freem(top);
return (0);
}
if ((m->m_flags & M_EXT) == 0)
goto bad;
len = MCLBYTES;
}
m->m_len = len = min(totlen, len);
totlen -= len;
*mp = m;
mp = &m->m_next;
if (totlen > 0) {
MGET(newm, M_DONTWAIT, MT_DATA);
if (newm == 0)
goto bad;
len = MLEN;
m = m->m_next = newm;
}
}
m = top;
m = m0;
thismboff = 0;
/*
@ -1178,7 +1174,11 @@ ieget(sc, ehp, to_bpf, head, totlen)
* we have now copied everything in from the shared memory.
* This means that we are done.
*/
return (top);
return (m0);
bad:
m_freem(m0);
return (0);
}
/*

View File

@ -1,4 +1,4 @@
/* $NetBSD: lance.c,v 1.4 1998/12/09 07:36:51 leo Exp $ */
/* $NetBSD: lance.c,v 1.5 1998/12/12 16:58:10 mycroft Exp $ */
/*-
* Copyright (c) 1997, 1998 The NetBSD Foundation, Inc.
@ -408,53 +408,52 @@ lance_get(sc, boff, totlen)
struct lance_softc *sc;
int boff, totlen;
{
register struct mbuf *m;
struct mbuf *top, **mp;
struct mbuf *m, *m0, *newm;
int len;
MGETHDR(m, M_DONTWAIT, MT_DATA);
if (m == 0)
MGETHDR(m0, M_DONTWAIT, MT_DATA);
if (m0 == 0)
return (0);
m->m_pkthdr.rcvif = ifp;
m->m_pkthdr.len = totlen;
m0->m_pkthdr.rcvif = ifp;
m0->m_pkthdr.len = totlen;
len = MHLEN;
top = 0;
mp = ⊤
m = m0;
while (totlen > 0) {
if (top) {
MGET(m, M_DONTWAIT, MT_DATA);
if (m == 0) {
m_freem(top);
return 0;
}
len = MLEN;
}
if (totlen >= MINCLSIZE) {
MCLGET(m, M_DONTWAIT);
if ((m->m_flags & M_EXT) == 0) {
m_free(m);
m_freem(top);
return 0;
}
if ((m->m_flags & M_EXT) == 0)
goto bad;
len = MCLBYTES;
}
if (!top) {
register int pad =
ALIGN(sizeof(struct ether_header)) -
sizeof(struct ether_header);
m->m_data += pad;
len -= pad;
if (m == m0) {
caddr_t newdata = (caddr_t)
ALIGN(m->m_data + sizeof(struct ether_header)) -
sizeof(struct ether_header);
len -= newdata - m->m_data;
m->m_data = newdata;
}
m->m_len = len = min(totlen, len);
(*sc->sc_copyfrombuf)(sc, mtod(m, caddr_t), boff, len);
boff += len;
totlen -= len;
*mp = m;
mp = &m->m_next;
if (totlen > 0) {
MGET(newm, M_DONTWAIT, MT_DATA);
if (newm == 0)
goto bad;
len = MLEN;
m = m->m_next = newm;
}
}
return (top);
return (m0);
bad:
m_freem(m0);
return (0);
}
/*

View File

@ -1,4 +1,4 @@
/* $NetBSD: if_eg.c,v 1.43 1998/07/05 06:49:13 jonathan Exp $ */
/* $NetBSD: if_eg.c,v 1.44 1998/12/12 16:58:11 mycroft Exp $ */
/*
* Copyright (c) 1993 Dean Huxley <dean@fsa.ca>
@ -816,45 +816,44 @@ egget(sc, buf, totlen)
int totlen;
{
struct ifnet *ifp = &sc->sc_ethercom.ec_if;
struct mbuf *top, **mp, *m;
struct mbuf *m, *m0, *newm;
int len;
MGETHDR(m, M_DONTWAIT, MT_DATA);
if (m == 0)
return 0;
m->m_pkthdr.rcvif = ifp;
m->m_pkthdr.len = totlen;
MGETHDR(m0, M_DONTWAIT, MT_DATA);
if (m0 == 0)
return (0);
m0->m_pkthdr.rcvif = ifp;
m0->m_pkthdr.len = totlen;
len = MHLEN;
top = 0;
mp = &top;
m = m0;
while (totlen > 0) {
if (top) {
MGET(m, M_DONTWAIT, MT_DATA);
if (m == 0) {
m_freem(top);
return 0;
}
len = MLEN;
}
if (totlen >= MINCLSIZE) {
MCLGET(m, M_DONTWAIT);
if ((m->m_flags & M_EXT) == 0) {
m_free(m);
m_freem(top);
return 0;
}
if ((m->m_flags & M_EXT) == 0)
goto bad;
len = MCLBYTES;
}
m->m_len = len = min(totlen, len);
bcopy((caddr_t)buf, mtod(m, caddr_t), len);
buf += len;
totlen -= len;
*mp = m;
mp = &m->m_next;
if (totlen > 0) {
MGET(newm, M_DONTWAIT, MT_DATA);
if (newm == 0)
goto bad;
len = MLEN;
m = m->m_next = newm;
}
}
return top;
return (m0);
bad:
m_freem(m0);
return (0);
}
int

View File

@ -1,4 +1,4 @@
/* $NetBSD: if_el.c,v 1.54 1998/07/05 06:49:13 jonathan Exp $ */
/* $NetBSD: if_el.c,v 1.55 1998/12/12 16:58:11 mycroft Exp $ */
/*
* Copyright (c) 1994, Matthew E. Kimmel. Permission is hereby granted
@ -643,50 +643,49 @@ elget(sc, totlen)
struct ifnet *ifp = &sc->sc_ethercom.ec_if;
bus_space_tag_t iot = sc->sc_iot;
bus_space_handle_t ioh = sc->sc_ioh;
struct mbuf *top, **mp, *m;
struct mbuf *m, *m0, *newm;
int len;
MGETHDR(m, M_DONTWAIT, MT_DATA);
if (m == 0)
return 0;
m->m_pkthdr.rcvif = ifp;
m->m_pkthdr.len = totlen;
MGETHDR(m0, M_DONTWAIT, MT_DATA);
if (m0 == 0)
return (0);
m0->m_pkthdr.rcvif = ifp;
m0->m_pkthdr.len = totlen;
len = MHLEN;
top = 0;
mp = &top;
m = m0;
bus_space_write_1(iot, ioh, EL_GPBL, 0);
bus_space_write_1(iot, ioh, EL_GPBH, 0);
while (totlen > 0) {
if (top) {
MGET(m, M_DONTWAIT, MT_DATA);
if (m == 0) {
m_freem(top);
return 0;
}
len = MLEN;
}
if (totlen >= MINCLSIZE) {
MCLGET(m, M_DONTWAIT);
if ((m->m_flags & M_EXT) == 0) {
m_free(m);
m_freem(top);
return 0;
}
if ((m->m_flags & M_EXT) == 0)
goto bad;
len = MCLBYTES;
}
m->m_len = len = min(totlen, len);
bus_space_read_multi_1(iot, ioh, EL_BUF, mtod(m, u_int8_t *), len);
totlen -= len;
*mp = m;
mp = &m->m_next;
if (totlen > 0) {
MGET(newm, M_DONTWAIT, MT_DATA);
if (newm == 0)
goto bad;
len = MLEN;
m = m->m_next = newm;
}
}
bus_space_write_1(iot, ioh, EL_RBC, 0);
bus_space_write_1(iot, ioh, EL_AC, EL_AC_RX);
return top;
return (m0);
bad:
m_freem(m0);
return (0);
}
/*

View File

@ -1,4 +1,4 @@
/* $NetBSD: if_se.c,v 1.22 1998/12/08 00:19:27 thorpej Exp $ */
/* $NetBSD: if_se.c,v 1.23 1998/12/12 17:08:14 mycroft Exp $ */
/*
* Copyright (c) 1997 Ian W. Dall <ian.dall@dsto.defence.gov.au>
@ -582,49 +582,53 @@ se_get(sc, data, totlen)
char *data;
int totlen;
{
struct mbuf *m;
struct mbuf *top, **mp;
struct ifnet *ifp = &sc->sc_ethercom.ec_if;
int len, pad;
struct mbuf *m, *m0, *newm;
int len;
MGETHDR(m, M_DONTWAIT, MT_DATA);
if (m == 0)
MGETHDR(m0, M_DONTWAIT, MT_DATA);
if (m0 == 0)
return (0);
m->m_pkthdr.rcvif = ifp;
m->m_pkthdr.len = totlen;
pad = ALIGN(sizeof(struct ether_header)) - sizeof(struct ether_header);
m->m_data += pad;
len = MHLEN - pad;
top = 0;
mp = &top;
m0->m_pkthdr.rcvif = ifp;
m0->m_pkthdr.len = totlen;
len = MHLEN;
m = m0;
while (totlen > 0) {
if (top) {
MGET(m, M_DONTWAIT, MT_DATA);
if (m == 0) {
m_freem(top);
return (0);
}
len = MLEN;
}
if (totlen >= MINCLSIZE) {
MCLGET(m, M_DONTWAIT);
if ((m->m_flags & M_EXT) == 0) {
m_free(m);
m_freem(top);
return (0);
}
if ((m->m_flags & M_EXT) == 0)
goto bad;
len = MCLBYTES;
}
if (m == m0) {
caddr_t newdata = (caddr_t)
ALIGN(m->m_data + sizeof(struct ether_header)) -
sizeof(struct ether_header);
len -= newdata - m->m_data;
m->m_data = newdata;
}
m->m_len = len = min(totlen, len);
bcopy(data, mtod(m, caddr_t), len);
data += len;
totlen -= len;
*mp = m;
mp = &m->m_next;
if (totlen > 0) {
MGET(newm, M_DONTWAIT, MT_DATA);
if (newm == 0)
goto bad;
len = MLEN;
m = m->m_next = newm;
}
}
return (top);
return (m0);
bad:
m_freem(m0);
return (0);
}
/*