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.

Reply via email to