Source-Changes-HG archive

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]

[src/trunk]: src/sys/dev/pci - Properly count collisions



details:   https://anonhg.NetBSD.org/src/rev/e8ad620cec4e
branches:  trunk
changeset: 764609:e8ad620cec4e
user:      bouyer <bouyer%NetBSD.org@localhost>
date:      Thu Apr 28 17:32:48 2011 +0000

description:
- 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.

diffstat:

 sys/dev/pci/if_vte.c    |  25 ++++++++++++++-----------
 sys/dev/pci/if_vtereg.h |   4 ++--
 2 files changed, 16 insertions(+), 13 deletions(-)

diffs (114 lines):

diff -r 7ce32a963959 -r e8ad620cec4e sys/dev/pci/if_vte.c
--- a/sys/dev/pci/if_vte.c      Thu Apr 28 17:22:20 2011 +0000
+++ b/sys/dev/pci/if_vte.c      Thu Apr 28 17:32:48 2011 +0000
@@ -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 ||
diff -r 7ce32a963959 -r e8ad620cec4e sys/dev/pci/if_vtereg.h
--- a/sys/dev/pci/if_vtereg.h   Thu Apr 28 17:22:20 2011 +0000
+++ b/sys/dev/pci/if_vtereg.h   Thu Apr 28 17:32:48 2011 +0000
@@ -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 <yongari%FreeBSD.org@localhost>
@@ -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



Home | Main Index | Thread Index | Old Index