Spam
Sorry for that last msg. Chris. Sent from one of many buggy mobile devices. Please excuse everything about this message: formatting, spelling, content most especially, its author.
MCLGETI support for xl(4)
Greetings, I've cleaned the diff a bit based on feedback from sthen@ b...@. Here it is: ? xl.diff Index: xl.c === RCS file: /cvs/src/sys/dev/ic/xl.c,v retrieving revision 1.96 diff -u -p -r1.96 xl.c --- xl.c7 Sep 2010 16:21:43 - 1.96 +++ xl.c16 Sep 2010 09:59:41 - @@ -153,7 +153,6 @@ void xl_stats_update(void *); int xl_encap(struct xl_softc *, struct xl_chain *, struct mbuf * ); void xl_rxeof(struct xl_softc *); -int xl_rx_resync(struct xl_softc *); void xl_txeof(struct xl_softc *); void xl_txeof_90xB(struct xl_softc *); void xl_txeoc(struct xl_softc *); @@ -180,6 +179,7 @@ void xl_iff(struct xl_softc *); void xl_iff_90x(struct xl_softc *); void xl_iff_905b(struct xl_softc *); int xl_list_rx_init(struct xl_softc *); +void xl_fill_rx_ring(struct xl_softc *); int xl_list_tx_init(struct xl_softc *); int xl_list_tx_init_90xB(struct xl_softc *); void xl_wait(struct xl_softc *); @@ -1076,8 +1076,6 @@ xl_list_rx_init(struct xl_softc *sc) for (i = 0; i XL_RX_LIST_CNT; i++) { cd-xl_rx_chain[i].xl_ptr = (struct xl_list_onefrag *)ld-xl_rx_list[i]; - if (xl_newbuf(sc, cd-xl_rx_chain[i]) == ENOBUFS) - return(ENOBUFS); if (i == (XL_RX_LIST_CNT - 1)) n = 0; else @@ -1088,11 +1086,30 @@ xl_list_rx_init(struct xl_softc *sc) ld-xl_rx_list[i].xl_next = htole32(next); } - cd-xl_rx_head = cd-xl_rx_chain[0]; - + cd-xl_rx_prod = cd-xl_rx_cons = cd-xl_rx_chain[0]; + cd-xl_rx_cnt = 0; + xl_fill_rx_ring(sc); return (0); } +void +xl_fill_rx_ring(struct xl_softc *sc) +{ +struct xl_chain_data*cd; +struct xl_list_data *ld; + +cd = sc-xl_cdata; +ld = sc-xl_ldata; + +while (cd-xl_rx_cnt XL_RX_LIST_CNT) { +if (xl_newbuf(sc, cd-xl_rx_prod) == ENOBUFS) +break; + cd-xl_rx_prod = cd-xl_rx_prod-xl_next; +cd-xl_rx_cnt++; +} +} + + /* * Initialize an RX descriptor and attach an MBUF cluster. */ @@ -1102,13 +1119,9 @@ xl_newbuf(struct xl_softc *sc, struct xl struct mbuf *m_new = NULL; bus_dmamap_tmap; - MGETHDR(m_new, M_DONTWAIT, MT_DATA); - if (m_new == NULL) - return (ENOBUFS); - - MCLGET(m_new, M_DONTWAIT); - if (!(m_new-m_flags M_EXT)) { - m_freem(m_new); + m_new = MCLGETI(NULL, M_DONTWAIT, sc-sc_arpcom.ac_if, MCLBYTES); + + if (!m_new){ return (ENOBUFS); } @@ -1125,11 +1138,11 @@ xl_newbuf(struct xl_softc *sc, struct xl 0, c-map-dm_mapsize, BUS_DMASYNC_POSTREAD); bus_dmamap_unload(sc-sc_dmat, c-map); } - + map = c-map; c-map = sc-sc_rx_sparemap; sc-sc_rx_sparemap = map; - + /* Force longword alignment for packet payload. */ m_adj(m_new, ETHER_ALIGN); @@ -1150,32 +1163,6 @@ xl_newbuf(struct xl_softc *sc, struct xl return (0); } -int -xl_rx_resync(struct xl_softc *sc) -{ - struct xl_chain_onefrag *pos; - int i; - - pos = sc-xl_cdata.xl_rx_head; - - for (i = 0; i XL_RX_LIST_CNT; i++) { - bus_dmamap_sync(sc-sc_dmat, sc-sc_listmap, - ((caddr_t)pos-xl_ptr - sc-sc_listkva), - sizeof(struct xl_list), - BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); - - if (pos-xl_ptr-xl_status) - break; - pos = pos-xl_next; - } - - if (i == XL_RX_LIST_CNT) - return (0); - - sc-xl_cdata.xl_rx_head = pos; - - return (EAGAIN); -} /* * A frame has been uploaded: pass the resulting mbuf chain up to @@ -1195,12 +1182,14 @@ xl_rxeof(struct xl_softc *sc) again: - while ((rxstat = letoh32(sc-xl_cdata.xl_rx_head-xl_ptr-xl_status)) - != 0) { - cur_rx = sc-xl_cdata.xl_rx_head; - sc-xl_cdata.xl_rx_head = cur_rx-xl_next; + while ((rxstat = letoh32(sc-xl_cdata.xl_rx_cons-xl_ptr-xl_status)) + != 0 sc-xl_cdata.xl_rx_cnt 0) { + cur_rx = sc-xl_cdata.xl_rx_cons; +m = cur_rx-xl_mbuf; +cur_rx-xl_mbuf = NULL; + sc-xl_cdata.xl_rx_cons = cur_rx-xl_next; + sc-xl_cdata.xl_rx_cnt--; total_len = rxstat XL_RXSTAT_LENMASK; - bus_dmamap_sync(sc-sc_dmat, sc-sc_listmap, ((caddr_t)cur_rx-xl_ptr - sc-sc_listkva), sizeof(struct xl_list), @@ -1224,6 +1213,7 @@ again: if (rxstat XL_RXSTAT_UP_ERROR) { ifp-if_ierrors++; cur_rx-xl_ptr-xl_status = htole32(0); +
Re: pfctl(8) manpage minor addition
On Wed, Sep 08, 2010 at 11:55:08PM -0400, Anders Langworthy wrote: I couldn't find clarification on this in the manpages and it seems to be a common misconception. Perhaps a note like the following would be beneficial? (Apologies for gmail line mangling) hi. a tweaked version of your diff committed. thanks for the mail. jmc Index: pfctl.8 === RCS file: /cvs/src/sbin/pfctl/pfctl.8,v retrieving revision 1.146 diff -u -r1.146 pfctl.8 --- pfctl.8 12 Sep 2010 16:36:20 - 1.146 +++ pfctl.8 13 Sep 2010 20:07:25 - @@ -208,6 +208,9 @@ Flush the queue rules. .It Fl F Cm rules Flush the filter rules. +Note that this puts the packet filter in a +.Cm pass all +state. .It Fl F Cm states Flush the state table (NAT and filter). .It Fl F Cm Sources @@ -222,7 +225,8 @@ Flush all of the above. .El .It Fl f Ar file -Load the rules contained in +Replace the current ruleset with +the rules contained in .Ar file . This .Ar file
Crociere nel Mediterraneo
M [demime 1.01d removed an attachment of type image/jpeg which had a name of 1.jpg] [demime 1.01d removed an attachment of type image/jpeg which had a name of 2.jpg] [demime 1.01d removed an attachment of type image/jpeg which had a name of 3.jpg] [demime 1.01d removed an attachment of type image/jpeg which had a name of 4.jpg] [demime 1.01d removed an attachment of type image/jpeg which had a name of 5.jpg] [demime 1.01d removed an attachment of type image/jpeg which had a name of 6.jpg] [demime 1.01d removed an attachment of type image/jpeg which had a name of 7.jpg] [demime 1.01d removed an attachment of type image/jpeg which had a name of 8.jpg] [demime 1.01d removed an attachment of type image/jpeg which had a name of 9.jpg] [demime 1.01d removed an attachment of type image/jpeg which had a name of 10.jpg]
Re: MCLGETI support for xl(4)
This is nice, there are some minor issues with the diff. * The xl_fill_rx_ring function body uses spaces instead of tabs. * Around -1125,11 +1138,11, you insert a few tabs unnecessarily. * ..and around -1195,12 +1182,14, within the while loop, spaces. * For the header patch, more spaces. I am seeing some neat 'netstat -m' values when using this patch on an older P3 system, memory utilization goes down to 7/8%, reaching only 20% when transferring a file over SSH. :-) Without the patch it goes immediately to 25% after 'ifconfig xl0 address'. Actually seems to perform better even, although perhaps that's my mind playing tricks on me. Thanks, -Bryan.
MCLGETI support for xl(4)
Greetings, Thanks bryan for testing it ! I've applied the necessary changes. Here it is: Index: src/sys/dev/ic/xl.c === RCS file: /cvs/src/sys/dev/ic/xl.c,v retrieving revision 1.96 diff -u -p -r1.96 xl.c --- src/sys/dev/ic/xl.c 7 Sep 2010 16:21:43 - 1.96 +++ src/sys/dev/ic/xl.c 16 Sep 2010 18:09:28 - @@ -153,7 +153,6 @@ void xl_stats_update(void *); int xl_encap(struct xl_softc *, struct xl_chain *, struct mbuf * ); void xl_rxeof(struct xl_softc *); -int xl_rx_resync(struct xl_softc *); void xl_txeof(struct xl_softc *); void xl_txeof_90xB(struct xl_softc *); void xl_txeoc(struct xl_softc *); @@ -180,6 +179,7 @@ void xl_iff(struct xl_softc *); void xl_iff_90x(struct xl_softc *); void xl_iff_905b(struct xl_softc *); int xl_list_rx_init(struct xl_softc *); +void xl_fill_rx_ring(struct xl_softc *); int xl_list_tx_init(struct xl_softc *); int xl_list_tx_init_90xB(struct xl_softc *); void xl_wait(struct xl_softc *); @@ -1076,8 +1076,6 @@ xl_list_rx_init(struct xl_softc *sc) for (i = 0; i XL_RX_LIST_CNT; i++) { cd-xl_rx_chain[i].xl_ptr = (struct xl_list_onefrag *)ld-xl_rx_list[i]; - if (xl_newbuf(sc, cd-xl_rx_chain[i]) == ENOBUFS) - return(ENOBUFS); if (i == (XL_RX_LIST_CNT - 1)) n = 0; else @@ -1088,11 +1086,30 @@ xl_list_rx_init(struct xl_softc *sc) ld-xl_rx_list[i].xl_next = htole32(next); } - cd-xl_rx_head = cd-xl_rx_chain[0]; - + cd-xl_rx_prod = cd-xl_rx_cons = cd-xl_rx_chain[0]; + cd-xl_rx_cnt = 0; + xl_fill_rx_ring(sc); return (0); } +void +xl_fill_rx_ring(struct xl_softc *sc) +{ + struct xl_chain_data*cd; + struct xl_list_data *ld; + + cd = sc-xl_cdata; + ld = sc-xl_ldata; + + while (cd-xl_rx_cnt XL_RX_LIST_CNT) { + if (xl_newbuf(sc, cd-xl_rx_prod) == ENOBUFS) + break; + cd-xl_rx_prod = cd-xl_rx_prod-xl_next; + cd-xl_rx_cnt++; + } +} + + /* * Initialize an RX descriptor and attach an MBUF cluster. */ @@ -1102,13 +1119,9 @@ xl_newbuf(struct xl_softc *sc, struct xl struct mbuf *m_new = NULL; bus_dmamap_tmap; - MGETHDR(m_new, M_DONTWAIT, MT_DATA); - if (m_new == NULL) - return (ENOBUFS); - - MCLGET(m_new, M_DONTWAIT); - if (!(m_new-m_flags M_EXT)) { - m_freem(m_new); + m_new = MCLGETI(NULL, M_DONTWAIT, sc-sc_arpcom.ac_if, MCLBYTES); + + if (!m_new){ return (ENOBUFS); } @@ -1150,32 +1163,6 @@ xl_newbuf(struct xl_softc *sc, struct xl return (0); } -int -xl_rx_resync(struct xl_softc *sc) -{ - struct xl_chain_onefrag *pos; - int i; - - pos = sc-xl_cdata.xl_rx_head; - - for (i = 0; i XL_RX_LIST_CNT; i++) { - bus_dmamap_sync(sc-sc_dmat, sc-sc_listmap, - ((caddr_t)pos-xl_ptr - sc-sc_listkva), - sizeof(struct xl_list), - BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); - - if (pos-xl_ptr-xl_status) - break; - pos = pos-xl_next; - } - - if (i == XL_RX_LIST_CNT) - return (0); - - sc-xl_cdata.xl_rx_head = pos; - - return (EAGAIN); -} /* * A frame has been uploaded: pass the resulting mbuf chain up to @@ -1195,12 +1182,14 @@ xl_rxeof(struct xl_softc *sc) again: - while ((rxstat = letoh32(sc-xl_cdata.xl_rx_head-xl_ptr-xl_status)) - != 0) { - cur_rx = sc-xl_cdata.xl_rx_head; - sc-xl_cdata.xl_rx_head = cur_rx-xl_next; + while ((rxstat = letoh32(sc-xl_cdata.xl_rx_cons-xl_ptr-xl_status)) + != 0 sc-xl_cdata.xl_rx_cnt 0) { + cur_rx = sc-xl_cdata.xl_rx_cons; + m = cur_rx-xl_mbuf; + cur_rx-xl_mbuf = NULL; + sc-xl_cdata.xl_rx_cons = cur_rx-xl_next; + sc-xl_cdata.xl_rx_cnt--; total_len = rxstat XL_RXSTAT_LENMASK; - bus_dmamap_sync(sc-sc_dmat, sc-sc_listmap, ((caddr_t)cur_rx-xl_ptr - sc-sc_listkva), sizeof(struct xl_list), @@ -1224,6 +1213,7 @@ again: if (rxstat XL_RXSTAT_UP_ERROR) { ifp-if_ierrors++; cur_rx-xl_ptr-xl_status = htole32(0); + m_freem(m); continue; } @@ -1237,22 +1227,7 @@ again: packet dropped\n, sc-sc_dev.dv_xname); ifp-if_ierrors++; cur_rx-xl_ptr-xl_status = htole32(0); - continue; - } - - /* No errors; receive the packet. */ - m = cur_rx-xl_mbuf; -
MCLGETI support for xl(4)
Greetings, From bryan, fix tabs around while loop. Index: src/sys/dev/ic/xl.c === RCS file: /cvs/src/sys/dev/ic/xl.c,v retrieving revision 1.96 diff -u -p -r1.96 xl.c --- src/sys/dev/ic/xl.c 7 Sep 2010 16:21:43 - 1.96 +++ src/sys/dev/ic/xl.c 16 Sep 2010 19:12:18 - @@ -153,7 +153,6 @@ void xl_stats_update(void *); int xl_encap(struct xl_softc *, struct xl_chain *, struct mbuf * ); void xl_rxeof(struct xl_softc *); -int xl_rx_resync(struct xl_softc *); void xl_txeof(struct xl_softc *); void xl_txeof_90xB(struct xl_softc *); void xl_txeoc(struct xl_softc *); @@ -180,6 +179,7 @@ void xl_iff(struct xl_softc *); void xl_iff_90x(struct xl_softc *); void xl_iff_905b(struct xl_softc *); int xl_list_rx_init(struct xl_softc *); +void xl_fill_rx_ring(struct xl_softc *); int xl_list_tx_init(struct xl_softc *); int xl_list_tx_init_90xB(struct xl_softc *); void xl_wait(struct xl_softc *); @@ -1076,8 +1076,6 @@ xl_list_rx_init(struct xl_softc *sc) for (i = 0; i XL_RX_LIST_CNT; i++) { cd-xl_rx_chain[i].xl_ptr = (struct xl_list_onefrag *)ld-xl_rx_list[i]; - if (xl_newbuf(sc, cd-xl_rx_chain[i]) == ENOBUFS) - return(ENOBUFS); if (i == (XL_RX_LIST_CNT - 1)) n = 0; else @@ -1088,11 +1086,30 @@ xl_list_rx_init(struct xl_softc *sc) ld-xl_rx_list[i].xl_next = htole32(next); } - cd-xl_rx_head = cd-xl_rx_chain[0]; - + cd-xl_rx_prod = cd-xl_rx_cons = cd-xl_rx_chain[0]; + cd-xl_rx_cnt = 0; + xl_fill_rx_ring(sc); return (0); } +void +xl_fill_rx_ring(struct xl_softc *sc) +{ + struct xl_chain_data*cd; + struct xl_list_data *ld; + + cd = sc-xl_cdata; + ld = sc-xl_ldata; + + while (cd-xl_rx_cnt XL_RX_LIST_CNT) { + if (xl_newbuf(sc, cd-xl_rx_prod) == ENOBUFS) + break; + cd-xl_rx_prod = cd-xl_rx_prod-xl_next; + cd-xl_rx_cnt++; + } +} + + /* * Initialize an RX descriptor and attach an MBUF cluster. */ @@ -1102,13 +1119,9 @@ xl_newbuf(struct xl_softc *sc, struct xl struct mbuf *m_new = NULL; bus_dmamap_tmap; - MGETHDR(m_new, M_DONTWAIT, MT_DATA); - if (m_new == NULL) - return (ENOBUFS); - - MCLGET(m_new, M_DONTWAIT); - if (!(m_new-m_flags M_EXT)) { - m_freem(m_new); + m_new = MCLGETI(NULL, M_DONTWAIT, sc-sc_arpcom.ac_if, MCLBYTES); + + if (!m_new){ return (ENOBUFS); } @@ -1150,32 +1163,6 @@ xl_newbuf(struct xl_softc *sc, struct xl return (0); } -int -xl_rx_resync(struct xl_softc *sc) -{ - struct xl_chain_onefrag *pos; - int i; - - pos = sc-xl_cdata.xl_rx_head; - - for (i = 0; i XL_RX_LIST_CNT; i++) { - bus_dmamap_sync(sc-sc_dmat, sc-sc_listmap, - ((caddr_t)pos-xl_ptr - sc-sc_listkva), - sizeof(struct xl_list), - BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); - - if (pos-xl_ptr-xl_status) - break; - pos = pos-xl_next; - } - - if (i == XL_RX_LIST_CNT) - return (0); - - sc-xl_cdata.xl_rx_head = pos; - - return (EAGAIN); -} /* * A frame has been uploaded: pass the resulting mbuf chain up to @@ -1195,12 +1182,14 @@ xl_rxeof(struct xl_softc *sc) again: - while ((rxstat = letoh32(sc-xl_cdata.xl_rx_head-xl_ptr-xl_status)) - != 0) { - cur_rx = sc-xl_cdata.xl_rx_head; - sc-xl_cdata.xl_rx_head = cur_rx-xl_next; + while ((rxstat = letoh32(sc-xl_cdata.xl_rx_cons-xl_ptr-xl_status)) + != 0 sc-xl_cdata.xl_rx_cnt 0) { + cur_rx = sc-xl_cdata.xl_rx_cons; + m = cur_rx-xl_mbuf; + cur_rx-xl_mbuf = NULL; + sc-xl_cdata.xl_rx_cons = cur_rx-xl_next; + sc-xl_cdata.xl_rx_cnt--; total_len = rxstat XL_RXSTAT_LENMASK; - bus_dmamap_sync(sc-sc_dmat, sc-sc_listmap, ((caddr_t)cur_rx-xl_ptr - sc-sc_listkva), sizeof(struct xl_list), @@ -1224,6 +1213,7 @@ again: if (rxstat XL_RXSTAT_UP_ERROR) { ifp-if_ierrors++; cur_rx-xl_ptr-xl_status = htole32(0); + m_freem(m); continue; } @@ -1237,22 +1227,7 @@ again: packet dropped\n, sc-sc_dev.dv_xname); ifp-if_ierrors++; cur_rx-xl_ptr-xl_status = htole32(0); - continue; - } - - /* No errors; receive the packet. */ - m = cur_rx-xl_mbuf; - -
MCLGETI support for xl(4)
Greetings, From brad, remove superfluous braces. Index: src/sys/dev/ic/xl.c === RCS file: /cvs/src/sys/dev/ic/xl.c,v retrieving revision 1.96 diff -u -p -r1.96 xl.c --- src/sys/dev/ic/xl.c 7 Sep 2010 16:21:43 - 1.96 +++ src/sys/dev/ic/xl.c 16 Sep 2010 19:36:53 - @@ -153,7 +153,6 @@ void xl_stats_update(void *); int xl_encap(struct xl_softc *, struct xl_chain *, struct mbuf * ); void xl_rxeof(struct xl_softc *); -int xl_rx_resync(struct xl_softc *); void xl_txeof(struct xl_softc *); void xl_txeof_90xB(struct xl_softc *); void xl_txeoc(struct xl_softc *); @@ -180,6 +179,7 @@ void xl_iff(struct xl_softc *); void xl_iff_90x(struct xl_softc *); void xl_iff_905b(struct xl_softc *); int xl_list_rx_init(struct xl_softc *); +void xl_fill_rx_ring(struct xl_softc *); int xl_list_tx_init(struct xl_softc *); int xl_list_tx_init_90xB(struct xl_softc *); void xl_wait(struct xl_softc *); @@ -1076,8 +1076,6 @@ xl_list_rx_init(struct xl_softc *sc) for (i = 0; i XL_RX_LIST_CNT; i++) { cd-xl_rx_chain[i].xl_ptr = (struct xl_list_onefrag *)ld-xl_rx_list[i]; - if (xl_newbuf(sc, cd-xl_rx_chain[i]) == ENOBUFS) - return(ENOBUFS); if (i == (XL_RX_LIST_CNT - 1)) n = 0; else @@ -1088,11 +1086,30 @@ xl_list_rx_init(struct xl_softc *sc) ld-xl_rx_list[i].xl_next = htole32(next); } - cd-xl_rx_head = cd-xl_rx_chain[0]; - + cd-xl_rx_prod = cd-xl_rx_cons = cd-xl_rx_chain[0]; + cd-xl_rx_cnt = 0; + xl_fill_rx_ring(sc); return (0); } +void +xl_fill_rx_ring(struct xl_softc *sc) +{ + struct xl_chain_data*cd; + struct xl_list_data *ld; + + cd = sc-xl_cdata; + ld = sc-xl_ldata; + + while (cd-xl_rx_cnt XL_RX_LIST_CNT) { + if (xl_newbuf(sc, cd-xl_rx_prod) == ENOBUFS) + break; + cd-xl_rx_prod = cd-xl_rx_prod-xl_next; + cd-xl_rx_cnt++; + } +} + + /* * Initialize an RX descriptor and attach an MBUF cluster. */ @@ -1102,15 +1119,10 @@ xl_newbuf(struct xl_softc *sc, struct xl struct mbuf *m_new = NULL; bus_dmamap_tmap; - MGETHDR(m_new, M_DONTWAIT, MT_DATA); - if (m_new == NULL) - return (ENOBUFS); - - MCLGET(m_new, M_DONTWAIT); - if (!(m_new-m_flags M_EXT)) { - m_freem(m_new); + m_new = MCLGETI(NULL, M_DONTWAIT, sc-sc_arpcom.ac_if, MCLBYTES); + + if (!m_new) return (ENOBUFS); - } m_new-m_len = m_new-m_pkthdr.len = MCLBYTES; if (bus_dmamap_load(sc-sc_dmat, sc-sc_rx_sparemap, @@ -1150,32 +1162,6 @@ xl_newbuf(struct xl_softc *sc, struct xl return (0); } -int -xl_rx_resync(struct xl_softc *sc) -{ - struct xl_chain_onefrag *pos; - int i; - - pos = sc-xl_cdata.xl_rx_head; - - for (i = 0; i XL_RX_LIST_CNT; i++) { - bus_dmamap_sync(sc-sc_dmat, sc-sc_listmap, - ((caddr_t)pos-xl_ptr - sc-sc_listkva), - sizeof(struct xl_list), - BUS_DMASYNC_POSTREAD | BUS_DMASYNC_POSTWRITE); - - if (pos-xl_ptr-xl_status) - break; - pos = pos-xl_next; - } - - if (i == XL_RX_LIST_CNT) - return (0); - - sc-xl_cdata.xl_rx_head = pos; - - return (EAGAIN); -} /* * A frame has been uploaded: pass the resulting mbuf chain up to @@ -1195,12 +1181,14 @@ xl_rxeof(struct xl_softc *sc) again: - while ((rxstat = letoh32(sc-xl_cdata.xl_rx_head-xl_ptr-xl_status)) - != 0) { - cur_rx = sc-xl_cdata.xl_rx_head; - sc-xl_cdata.xl_rx_head = cur_rx-xl_next; + while ((rxstat = letoh32(sc-xl_cdata.xl_rx_cons-xl_ptr-xl_status)) + != 0 sc-xl_cdata.xl_rx_cnt 0) { + cur_rx = sc-xl_cdata.xl_rx_cons; + m = cur_rx-xl_mbuf; + cur_rx-xl_mbuf = NULL; + sc-xl_cdata.xl_rx_cons = cur_rx-xl_next; + sc-xl_cdata.xl_rx_cnt--; total_len = rxstat XL_RXSTAT_LENMASK; - bus_dmamap_sync(sc-sc_dmat, sc-sc_listmap, ((caddr_t)cur_rx-xl_ptr - sc-sc_listkva), sizeof(struct xl_list), @@ -1224,6 +1212,7 @@ again: if (rxstat XL_RXSTAT_UP_ERROR) { ifp-if_ierrors++; cur_rx-xl_ptr-xl_status = htole32(0); + m_freem(m); continue; } @@ -1237,22 +1226,7 @@ again: packet dropped\n, sc-sc_dev.dv_xname); ifp-if_ierrors++; cur_rx-xl_ptr-xl_status = htole32(0); - continue; -