Module Name: src
Committed By: matt
Date: Wed Dec 19 02:44:39 UTC 2012
Modified Files:
src/sys/arch/arm/broadcom: bcm53xx_eth.c
Log Message:
Use max_linkhdr to determine what rcvoffset to program.
To generate a diff of this commit:
cvs rdiff -u -r1.18 -r1.19 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.18 src/sys/arch/arm/broadcom/bcm53xx_eth.c:1.19
--- src/sys/arch/arm/broadcom/bcm53xx_eth.c:1.18 Fri Dec 7 22:21:03 2012
+++ src/sys/arch/arm/broadcom/bcm53xx_eth.c Wed Dec 19 02:44:39 2012
@@ -35,7 +35,7 @@
#include <sys/cdefs.h>
-__KERNEL_RCSID(1, "$NetBSD: bcm53xx_eth.c,v 1.18 2012/12/07 22:21:03 matt Exp $");
+__KERNEL_RCSID(1, "$NetBSD: bcm53xx_eth.c,v 1.19 2012/12/19 02:44:39 matt Exp $");
#include <sys/param.h>
#include <sys/atomic.h>
@@ -71,7 +71,6 @@ __KERNEL_RCSID(1, "$NetBSD: bcm53xx_eth.
#endif
#define BCMETH_EVCNT_INCR(a) BCMETH_EVCNT_ADD((a), 1)
-#define BCMETH_RCVOFFSET 10
#define BCMETH_MAXTXMBUFS 128
#define BCMETH_NTXSEGS 30
#define BCMETH_MAXRXMBUFS 255
@@ -79,7 +78,7 @@ __KERNEL_RCSID(1, "$NetBSD: bcm53xx_eth.
#define BCMETH_NRXSEGS 1
#define BCMETH_RINGSIZE PAGE_SIZE
-#if 0
+#if 1
#define BCMETH_RCVMAGIC 0xfeedface
#endif
@@ -148,6 +147,7 @@ struct bcmeth_softc {
struct bcmeth_rxqueue sc_rxq;
struct bcmeth_txqueue sc_txq;
+ size_t sc_rcvoffset;
uint32_t sc_maxfrm;
uint32_t sc_cmdcfg;
uint32_t sc_intmask;
@@ -434,7 +434,7 @@ bcmeth_macaddr_create(const uint8_t *ena
return (enaddr[3] << 0) // UNIMAC_MAC_0
| (enaddr[2] << 8) // UNIMAC_MAC_0
| (enaddr[1] << 16) // UNIMAC_MAC_0
- | (enaddr[0] << 24) // UNIMAC_MAC_0
+ | ((uint64_t)enaddr[0] << 24) // UNIMAC_MAC_0
| ((uint64_t)enaddr[5] << 32) // UNIMAC_MAC_1
| ((uint64_t)enaddr[4] << 40); // UNIMAC_MAC_1
}
@@ -457,6 +457,21 @@ bcmeth_ifinit(struct ifnet *ifp)
bcmeth_ifstop(ifp, 0);
/*
+ * Reserve enough space at the front so that we can insert a maxsized
+ * link header and a VLAN tag. Also make sure we have enough room for
+ * the rcvsts field as well.
+ */
+ KASSERT(ALIGN(max_linkhdr) == max_linkhdr);
+ KASSERTMSG(max_linkhdr > sizeof(struct ether_header), "%u > %zu",
+ max_linkhdr, sizeof(struct ether_header));
+ sc->sc_rcvoffset = max_linkhdr + 4 - sizeof(struct ether_header);
+ if (sc->sc_rcvoffset <= 4)
+ sc->sc_rcvoffset += 4;
+ KASSERT((sc->sc_rcvoffset & 3) == 2);
+ KASSERT(sc->sc_rcvoffset <= __SHIFTOUT(RCVCTL_RCVOFFSET, RCVCTL_RCVOFFSET));
+ KASSERT(sc->sc_rcvoffset >= 6);
+
+ /*
* If our frame size has changed (or it's our first time through)
* destroy the existing transmit mapcache.
*/
@@ -492,7 +507,7 @@ bcmeth_ifinit(struct ifnet *ifp)
bcmeth_rxq_reset(sc, &sc->sc_rxq);
bcmeth_write_4(sc, sc->sc_rxq.rxq_reg_rcvctl,
- __SHIFTIN(BCMETH_RCVOFFSET, RCVCTL_RCVOFFSET)
+ __SHIFTIN(sc->sc_rcvoffset, RCVCTL_RCVOFFSET)
| RCVCTL_PARITY_DIS
| RCVCTL_OFLOW_CONTINUE
| __SHIFTIN(3, RCVCTL_BURSTLEN));
@@ -958,7 +973,7 @@ bcmeth_rx_input(
bcmeth_rx_map_unload(sc, m);
- m_adj(m, BCMETH_RCVOFFSET);
+ m_adj(m, sc->sc_rcvoffset);
switch (__SHIFTOUT(rxdb_flags, RXSTS_PKTTYPE)) {
case RXSTS_PKTTYPE_UC:
@@ -1091,7 +1106,7 @@ bcmeth_rxq_consume(
} while (m);
} else {
uint32_t framelen = __SHIFTOUT(rxsts, RXSTS_FRAMELEN);
- framelen += BCMETH_RCVOFFSET;
+ framelen += sc->sc_rcvoffset;
m->m_pkthdr.len = framelen;
if (desc_count == 1) {
KASSERT(framelen <= MCLBYTES);