Module Name: src
Committed By: bouyer
Date: Thu Apr 28 17:32:48 UTC 2011
Modified Files:
src/sys/dev/pci: if_vte.c if_vtereg.h
Log Message:
- Properly count collisions
- call vte_rxfilter() after starting transmit/receive; this seems to
fix some IPv6-related multicast issues for me
- when the MCR0_BROADCAST bit is set broadcast receive is disabled.
Rename it to MCR0_BROADCAST_DIS to reflect its function, and fix usage.
- Fix loop over multicast addresses to not set the same address in the
3 perfect filter slots.
To generate a diff of this commit:
cvs rdiff -u -r1.2 -r1.3 src/sys/dev/pci/if_vte.c
cvs rdiff -u -r1.1 -r1.2 src/sys/dev/pci/if_vtereg.h
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/pci/if_vte.c
diff -u src/sys/dev/pci/if_vte.c:1.2 src/sys/dev/pci/if_vte.c:1.3
--- src/sys/dev/pci/if_vte.c:1.2 Sat Apr 2 08:11:31 2011
+++ src/sys/dev/pci/if_vte.c Thu Apr 28 17:32:48 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: if_vte.c,v 1.2 2011/04/02 08:11:31 mbalmer Exp $ */
+/* $NetBSD: if_vte.c,v 1.3 2011/04/28 17:32:48 bouyer Exp $ */
/*
* Copyright (c) 2011 Manuel Bouyer. All rights reserved.
@@ -55,7 +55,7 @@
/* Driver for DM&P Electronics, Inc, Vortex86 RDC R6040 FastEthernet. */
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: if_vte.c,v 1.2 2011/04/02 08:11:31 mbalmer Exp $");
+__KERNEL_RCSID(0, "$NetBSD: if_vte.c,v 1.3 2011/04/28 17:32:48 bouyer Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -948,7 +948,6 @@
/* Update ifp counters. */
ifp->if_opackets = stat->tx_frames;
- ifp->if_collisions = stat->tx_late_colls;
ifp->if_oerrors = stat->tx_late_colls + stat->tx_underruns;
ifp->if_ipackets = stat->rx_frames;
ifp->if_ierrors = stat->rx_crcerrs + stat->rx_runts +
@@ -1024,6 +1023,8 @@
status = le16toh(txd->tx_desc->dtst);
if ((status & VTE_DTST_TX_OWN) != 0)
break;
+ if ((status & VTE_DTST_TX_OK) != 0)
+ ifp->if_collisions += (status & 0xf);
sc->vte_cdata.vte_tx_cnt--;
/* Reclaim transmitted mbufs. */
bus_dmamap_sync(sc->vte_dmatag, txd->tx_dmamap, 0,
@@ -1352,6 +1353,7 @@
ifp->if_flags |= IFF_RUNNING;
ifp->if_flags &= ~IFF_OACTIVE;
+ /* calling mii_mediachg will call back vte_start_mac() */
if ((error = mii_mediachg(&sc->vte_mii)) == ENXIO)
error = 0;
else if (error != 0) {
@@ -1456,6 +1458,7 @@
aprint_error_dev(sc->vte_dev,
"could not enable RX/TX MAC(0x%04x)!\n", mcr);
}
+ vte_rxfilter(sc);
}
static void
@@ -1577,7 +1580,7 @@
ifp = &sc->vte_if;
DPRINTF(("vte_rxfilter\n"));
- bzero(mchash, sizeof(mchash));
+ memset(mchash, 0, sizeof(mchash));
for (i = 0; i < VTE_RXFILT_PERFECT_CNT; i++) {
rxfilt_perf[i][0] = 0xFFFF;
rxfilt_perf[i][1] = 0xFFFF;
@@ -1586,9 +1589,9 @@
mcr = CSR_READ_2(sc, VTE_MCR0);
DPRINTF(("vte_rxfilter mcr 0x%x\n", mcr));
- mcr &= ~(MCR0_PROMISC | MCR0_BROADCAST | MCR0_MULTICAST);
- if ((ifp->if_flags & IFF_BROADCAST) != 0)
- mcr |= MCR0_BROADCAST;
+ mcr &= ~(MCR0_PROMISC | MCR0_BROADCAST_DIS | MCR0_MULTICAST);
+ if ((ifp->if_flags & IFF_BROADCAST) == 0)
+ mcr |= MCR0_BROADCAST_DIS;
if ((ifp->if_flags & (IFF_PROMISC | IFF_ALLMULTI)) != 0) {
if ((ifp->if_flags & IFF_PROMISC) != 0)
mcr |= MCR0_PROMISC;
@@ -1604,7 +1607,7 @@
ETHER_FIRST_MULTI(step, &sc->vte_ec, enm);
nperf = 0;
while (enm != NULL) {
- if (memcmp(enm->enm_addrlo, enm->enm_addrhi, 6) != 0) {
+ if (memcmp(enm->enm_addrlo, enm->enm_addrhi, ETHER_ADDR_LEN) != 0) {
sc->vte_if.if_flags |= IFF_ALLMULTI;
mcr |= MCR0_MULTICAST;
mchash[0] = 0xFFFF;
@@ -1624,10 +1627,10 @@
rxfilt_perf[nperf][1] = eaddr[3] << 8 | eaddr[2];
rxfilt_perf[nperf][2] = eaddr[5] << 8 | eaddr[4];
nperf++;
- continue;
+ } else {
+ crc = ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN);
+ mchash[crc >> 30] |= 1 << ((crc >> 26) & 0x0F);
}
- crc = ether_crc32_be(enm->enm_addrlo, ETHER_ADDR_LEN);
- mchash[crc >> 30] |= 1 << ((crc >> 26) & 0x0F);
ETHER_NEXT_MULTI(step, enm);
}
if (mchash[0] != 0 || mchash[1] != 0 || mchash[2] != 0 ||
Index: src/sys/dev/pci/if_vtereg.h
diff -u src/sys/dev/pci/if_vtereg.h:1.1 src/sys/dev/pci/if_vtereg.h:1.2
--- src/sys/dev/pci/if_vtereg.h:1.1 Wed Jan 26 18:48:13 2011
+++ src/sys/dev/pci/if_vtereg.h Thu Apr 28 17:32:48 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: if_vtereg.h,v 1.1 2011/01/26 18:48:13 bouyer Exp $ */
+/* $NetBSD: if_vtereg.h,v 1.2 2011/04/28 17:32:48 bouyer Exp $ */
/*-
* Copyright (c) 2010, Pyun YongHyeon <[email protected]>
@@ -44,7 +44,7 @@
#define MCR0_ACCPT_LONG_PKT 0x0008
#define MCR0_ACCPT_DRIBBLE 0x0010
#define MCR0_PROMISC 0x0020
-#define MCR0_BROADCAST 0x0040
+#define MCR0_BROADCAST_DIS 0x0040
#define MCR0_RX_EARLY_INTR 0x0080
#define MCR0_MULTICAST 0x0100
#define MCR0_FC_ENB 0x0200