Module Name: src Committed By: matt Date: Sat Oct 6 01:30:46 UTC 2012
Modified Files: src/sys/arch/arm/broadcom: bcm53xx_eth.c Log Message: Always set IC for each receive descriptor. Make sure to produce rx descriptors even if you stop at the end of the ring. To generate a diff of this commit: cvs rdiff -u -r1.6 -r1.7 src/sys/arch/arm/broadcom/bcm53xx_eth.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/arch/arm/broadcom/bcm53xx_eth.c diff -u src/sys/arch/arm/broadcom/bcm53xx_eth.c:1.6 src/sys/arch/arm/broadcom/bcm53xx_eth.c:1.7 --- src/sys/arch/arm/broadcom/bcm53xx_eth.c:1.6 Fri Oct 5 04:05:53 2012 +++ src/sys/arch/arm/broadcom/bcm53xx_eth.c Sat Oct 6 01:30:46 2012 @@ -33,7 +33,7 @@ #include <sys/cdefs.h> -__KERNEL_RCSID(1, "$NetBSD: bcm53xx_eth.c,v 1.6 2012/10/05 04:05:53 matt Exp $"); +__KERNEL_RCSID(1, "$NetBSD: bcm53xx_eth.c,v 1.7 2012/10/06 01:30:46 matt Exp $"); #include <sys/param.h> #include <sys/atomic.h> @@ -835,9 +835,8 @@ bcmeth_rxq_produce( struct bcmeth_rxqueue *rxq) { struct gmac_rxdb *producer = rxq->rxq_producer; -#if 0 - size_t inuse = rxq->rxq_inuse; -#endif + bool produced = false; + while (rxq->rxq_inuse < rxq->rxq_threshold) { struct mbuf *m; IF_DEQUEUE(&sc->sc_rx_bufcache, m); @@ -854,7 +853,6 @@ bcmeth_rxq_produce( producer->rxdb_buflen = MCLBYTES; producer->rxdb_addrlo = map->dm_segs[0].ds_addr; producer->rxdb_flags &= RXDB_FLAG_ET; - producer->rxdb_flags |= RXDB_FLAG_IC; *rxq->rxq_mtail = m; rxq->rxq_mtail = &m->m_next; m->m_len = MCLBYTES; @@ -866,15 +864,18 @@ bcmeth_rxq_produce( rxq->rxq_last - rxq->rxq_producer); producer = rxq->rxq_producer = rxq->rxq_first; } + produced = true; } - if (producer != rxq->rxq_producer) { + if (produced) { membar_producer(); - bcmeth_rxq_desc_presync(sc, rxq, rxq->rxq_producer, - producer - rxq->rxq_producer); - rxq->rxq_producer = producer; + if (producer != rxq->rxq_producer) { + bcmeth_rxq_desc_presync(sc, rxq, rxq->rxq_producer, + producer - rxq->rxq_producer); + rxq->rxq_producer = producer; + } bcmeth_write_4(sc, rxq->rxq_reg_rcvptr, rxq->rxq_descmap->dm_segs[0].ds_addr - + ((uintptr_t)rxq->rxq_producer & RCVPTR)); + + ((uintptr_t)producer & RCVPTR)); } return true; } @@ -1059,13 +1060,13 @@ bcmeth_rxq_reset( */ struct gmac_rxdb *rxdb; for (rxdb = rxq->rxq_first; rxdb < rxq->rxq_last - 1; rxdb++) { - rxdb->rxdb_flags = 0; + rxdb->rxdb_flags = RXDB_FLAG_IC; } /* * Last descriptor has the wrap flag. */ - rxdb->rxdb_flags = RXDB_FLAG_ET; + rxdb->rxdb_flags = RXDB_FLAG_ET|RXDB_FLAG_IC; /* * Reset the producer consumer indexes.