Module Name: src
Committed By: matt
Date: Fri Oct 5 02:48:36 UTC 2012
Modified Files:
src/sys/arch/arm/broadcom: bcm53xx_eth.c
Log Message:
Make sure to set IC in receive descritors. Initial ET at end of ring.
Set INTRCVLAZY to collesce 10 packets or 1ms delay.
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 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.2 src/sys/arch/arm/broadcom/bcm53xx_eth.c:1.3
--- src/sys/arch/arm/broadcom/bcm53xx_eth.c:1.2 Thu Oct 4 00:14:24 2012
+++ src/sys/arch/arm/broadcom/bcm53xx_eth.c Fri Oct 5 02:48:36 2012
@@ -33,7 +33,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: bcm53xx_eth.c,v 1.2 2012/10/04 00:14:24 matt Exp $");
+__KERNEL_RCSID(1, "$NetBSD: bcm53xx_eth.c,v 1.3 2012/10/05 02:48:36 matt Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -430,7 +430,6 @@ bcmeth_ifinit(struct ifnet *ifp)
sc->sc_intmask = DESCPROTOERR|DATAERR|DESCERR;
-#if 1
/* 5. Load RCVADDR_LO with new pointer */
bcmeth_rxq_reset(sc, &sc->sc_rxq);
@@ -438,7 +437,6 @@ bcmeth_ifinit(struct ifnet *ifp)
| RCVCTL_PARITY_DIS
| RCVCTL_OFLOW_CONTINUE
| __SHIFTIN(4, RCVCTL_BURSTLEN));
-#endif
/* 6. Load XMTADDR_LO with new pointer */
bcmeth_txq_reset(sc, &sc->sc_txq);
@@ -461,19 +459,29 @@ bcmeth_ifinit(struct ifnet *ifp)
devctl &= ~CPU_FLOW_CTRL_ON;
bcmeth_write_4(sc, GMAC_DEVCONTROL, devctl);
+ /* Setup lazy receive (at most 1ms). */
+ bcmeth_write_4(sc, GMAC_INTRCVLAZY, __SHIFTIN(10, INTRCVLAZY_FRAMECOUNT)
+ | __SHIFTIN(125000000 / 1000, INTRCVLAZY_TIMEOUT));
+
/* 11. Enable transmit queues in TQUEUE, and ensure that the transmit scheduling mode is correctly set in TCTRL. */
sc->sc_intmask |= XMTINT_0|XMTUF;
bcmeth_write_4(sc, sc->sc_txq.txq_reg_xmtctl,
bcmeth_read_4(sc, sc->sc_txq.txq_reg_xmtctl) | XMTCTL_ENABLE);
-#if 1
/* 12. Enable receive queues in RQUEUE, */
sc->sc_intmask |= RCVINT|RCVDESCUF|RCVFIFOOF;
bcmeth_write_4(sc, sc->sc_rxq.rxq_reg_rcvctl,
bcmeth_read_4(sc, sc->sc_rxq.rxq_reg_rcvctl) | RCVCTL_ENABLE);
bcmeth_rxq_produce(sc, &sc->sc_rxq); /* fill with rx buffers */
+
+#if 0
+ aprint_normal_dev(sc->sc_dev,
+ "devctl=%#x ucmdcfg=%#x xmtctl=%#x rcvctl=%#x\n",
+ devctl, sc->sc_cmdcfg,
+ bcmeth_read_4(sc, sc->sc_txq.txq_reg_xmtctl),
+ bcmeth_read_4(sc, sc->sc_rxq.rxq_reg_rcvctl));
#endif
sc->sc_soft_flags = 0;
@@ -844,6 +852,7 @@ bcmeth_rxq_produce(
producer->rxdb_buflen = MCLBYTES;
producer->rxdb_addrlo = map->dm_segs[0].ds_addr;
+ producer->rxdb_flags |= RXDB_FLAG_IC;
producer->rxdb_flags &= RXDB_FLAG_ET;
*rxq->rxq_mtail = m;
rxq->rxq_mtail = &m->m_next;
@@ -967,7 +976,7 @@ bcmeth_rxq_consume(
rxq->rxq_mtail = &rxq->rxq_mhead;
m_last->m_next = NULL;
- if (rxsts & (/*RXSTS_CRC_ERROR|*/RXSTS_OVERSIZED|RXSTS_PKT_OVERFLOW)) {
+ if (rxsts & (RXSTS_CRC_ERROR|RXSTS_OVERSIZED|RXSTS_PKT_OVERFLOW)) {
aprint_error_dev(sc->sc_dev, "[%zu]: count=%zu rxsts=%#x\n",
consumer - rxq->rxq_first, desc_count, rxsts);
/*
@@ -1038,6 +1047,25 @@ bcmeth_rxq_reset(
struct bcmeth_rxqueue *rxq)
{
/*
+ * sync all the descriptors
+ */
+ bcmeth_rxq_desc_postsync(sc, rxq, rxq->rxq_first,
+ rxq->rxq_last - rxq->rxq_first);
+
+ /*
+ * Make sure we own all descriptors in the ring.
+ */
+ struct gmac_rxdb *rxdb;
+ for (rxdb = rxq->rxq_first; rxdb < rxq->rxq_last - 1; rxdb++) {
+ rxdb->rxdb_flags = 0;
+ }
+
+ /*
+ * Last descriptor has the wrap flag.
+ */
+ rxdb->rxdb_flags = RXDB_FLAG_ET;
+
+ /*
* Reset the producer consumer indexes.
*/
rxq->rxq_consumer = rxq->rxq_first;