Date: Fri, 8 Dec 2000 13:27:28 -0800 (PST) From: wpaul@FreeBSD.ORG (Bill Paul) To: jhb@FreeBSD.org (John Baldwin) Cc: wkb@freebie.demon.nl, alpha@FreeBSD.org Subject: Re: cvs commit: src/sys/alpha/conf GENERIC Message-ID: <20001208212728.9D8D737B400@hub.freebsd.org> In-Reply-To: <XFMail.001208131116.jhb@FreeBSD.org> from John Baldwin at "Dec 8, 2000 01:11:16 pm"
next in thread | previous in thread | raw e-mail | index | archive | help
Ok. There's something about the way the descriptor memory is being
allocated that I don't like. I can't quite put my finger on what it
is. I usually resort to contigmalloc() when I allocate descriptor
space; it's not always necessary but it helps me sleep at night. Plus
you know you're getting memory that's aligned on the right boundary.
Wilko: please try me the following patch to if_tx.c. In addition to
tweaking the descriptor allocation, I added some code to force the
proper payload alignment on received packets. I'm not positive, but
I think you need this for this chip too.
-Bill
*** if_tx.c.orig Thu Dec 7 15:56:26 2000
--- if_tx.c Fri Dec 8 13:23:47 2000
***************
*** 567,573 ****
{
struct ifnet *ifp;
epic_softc_t *sc;
! int s;
s = splimp();
--- 567,573 ----
{
struct ifnet *ifp;
epic_softc_t *sc;
! int s, i;
s = splimp();
***************
*** 585,591 ****
bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
bus_release_resource(dev, EPIC_RES, EPIC_RID, sc->res);
! free(sc->pool, M_DEVBUF);
splx(s);
--- 585,595 ----
bus_release_resource(dev, SYS_RES_IRQ, 0, sc->irq);
bus_release_resource(dev, EPIC_RES, EPIC_RID, sc->res);
! i = sizeof(struct epic_frag_list)*TX_RING_SIZE +
! sizeof(struct epic_rx_desc)*RX_RING_SIZE +
! sizeof(struct epic_tx_desc)*TX_RING_SIZE + PAGE_SIZE;
!
! contigfree(sc->pool, i, M_DEVBUF);
splx(s);
***************
*** 746,753 ****
i = sizeof(struct epic_frag_list)*TX_RING_SIZE +
sizeof(struct epic_rx_desc)*RX_RING_SIZE +
! sizeof(struct epic_tx_desc)*TX_RING_SIZE + PAGE_SIZE,
! sc->pool = (epic_softc_t *) malloc( i, M_DEVBUF, M_NOWAIT);
if (sc->pool == NULL) {
printf(": can't allocate memory for buffers\n");
--- 750,759 ----
i = sizeof(struct epic_frag_list)*TX_RING_SIZE +
sizeof(struct epic_rx_desc)*RX_RING_SIZE +
! sizeof(struct epic_tx_desc)*TX_RING_SIZE;
!
! sc->pool = (epic_softc_t *)contigmalloc(i, M_DEVBUF,
! M_NOWAIT, 0, 0xffffffff, PAGE_SIZE, 0);
if (sc->pool == NULL) {
printf(": can't allocate memory for buffers\n");
***************
*** 755,763 ****
}
bzero(sc->pool, i);
- /* Align pool on PAGE_SIZE */
pool = (caddr_t)sc->pool;
- pool = (caddr_t)((u_int32_t)(pool + PAGE_SIZE - 1) & ~(PAGE_SIZE - 1));
/* Distribute memory */
sc->tx_flist = (void *)pool;
--- 761,767 ----
***************
*** 879,884 ****
--- 883,891 ----
struct epic_rx_desc *desc;
struct mbuf *m;
struct ether_header *eh;
+ struct ifnet *ifp;
+
+ ifp = &sc->sc_if;
while( !(sc->rx_desc[sc->cur_rx].status & 0x8000) ) {
buf = sc->rx_buffer + sc->cur_rx;
***************
*** 914,924 ****
/* Point to new mbuf, and give descriptor to chip */
desc->bufaddr = vtophys( mtod( buf->mbuf, caddr_t ) );
desc->status = 0x8000;
!
! /* First mbuf in packet holds the ethernet and packet headers */
! eh = mtod( m, struct ether_header * );
! m->m_pkthdr.rcvif = &(sc->sc_if);
! m->m_pkthdr.len = m->m_len = len;
#if !defined(__FreeBSD__)
#if NBPFILTER > 0
--- 921,946 ----
/* Point to new mbuf, and give descriptor to chip */
desc->bufaddr = vtophys( mtod( buf->mbuf, caddr_t ) );
desc->status = 0x8000;
!
! /* Force payload to be longword aligned. */
! {
! struct mbuf *m0;
!
! m0 = m_devget(mtod(m, char *) - ETHER_ALIGN,
! len + ETHER_ALIGN, 0, ifp, NULL);
!
! if (m0 == NULL) {
! ifp->if_ierrors++;
! m_freem(m);
! continue;
! }
!
! m_adj(m0, ETHER_ALIGN);
! m_freem(m);
! m = m0;
! }
!
! eh = mtod(m, struct ether_header *);
#if !defined(__FreeBSD__)
#if NBPFILTER > 0
***************
*** 928,936 ****
#endif /* NBPFILTER > 0 */
#endif /* !__FreeBSD__ */
! /* Second mbuf holds packet ifself */
! m->m_pkthdr.len = m->m_len = len - sizeof(struct ether_header);
! m->m_data += sizeof( struct ether_header );
/* Give mbuf to OS */
ether_input(&sc->sc_if, eh, m);
--- 950,956 ----
#endif /* NBPFILTER > 0 */
#endif /* !__FreeBSD__ */
! m_adj(m, sizeof(struct ether_header));
/* Give mbuf to OS */
ether_input(&sc->sc_if, eh, m);
To Unsubscribe: send mail to majordomo@FreeBSD.org
with "unsubscribe freebsd-alpha" in the body of the message
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?20001208212728.9D8D737B400>
