Skip site navigation (1)Skip section navigation (2)
Date:      Thu, 20 Aug 2009 17:21:35 -0700
From:      Jack Vogel <jfvogel@gmail.com>
To:        Manish Vachharajani <manishv@lineratesystems.com>
Cc:        Barney Cordoba <barney_cordoba@yahoo.com>, freebsd-net@freebsd.org
Subject:   Re: Dropped vs. missed packets in the ixgbe driver
Message-ID:  <2a41acea0908201721o33372c89q25e33b8cde8edf06@mail.gmail.com>
In-Reply-To: <5bc218350908201039q574f92e3mabe73d01c35f662c@mail.gmail.com>
References:  <5bc218350908191146j2a22f8dcrdecb0b67eedce5c2@mail.gmail.com> <435336.24858.qm@web63908.mail.re1.yahoo.com> <5bc218350908200953p630d99c6u1538999b308c55f9@mail.gmail.com> <2a41acea0908201008y6e8f160dx27b406db7d3081b7@mail.gmail.com> <5bc218350908201023q14c51cer6effadd49cc4c604@mail.gmail.com> <5bc218350908201032l44859117obc3203ad91fc5706@mail.gmail.com> <5bc218350908201034u553df7feiaead037432279360@mail.gmail.com> <2a41acea0908201037n10505b04le924f29efd5398a7@mail.gmail.com> <5bc218350908201039q574f92e3mabe73d01c35f662c@mail.gmail.com>

next in thread | previous in thread | raw e-mail | index | archive | help
Manish,

   This is a diff on my changes, note some differences:  first, I don't know
what vintage your
code was, but you do NOT want to read RNBC(i) into stats.mpc. also that is
an 82598-only
thing. This means that missed_rx is going to accumulate just as it should,
except it should
be 64 bit.

This diff also contains a fix to the flow control stats on 82598, there were
differences between
that and 82599 that somehow got stripped from my code along the way, this
corrects that.

Try these changes and let me know if it works for you.

Jack


Index: ixgbe.c
===================================================================
--- ixgbe.c    (revision 195857)
+++ ixgbe.c    (working copy)
@@ -4456,7 +4456,8 @@
 {
     struct ifnet   *ifp = adapter->ifp;;
     struct ixgbe_hw *hw = &adapter->hw;
-    u32  missed_rx = 0, bprc, lxon, lxoff, total;
+    u32  bprc, lxon, lxoff, total;
+    u64  missed_rx = 0;

     adapter->stats.crcerrs += IXGBE_READ_REG(hw, IXGBE_CRCERRS);

@@ -4465,16 +4466,31 @@
         mp = IXGBE_READ_REG(hw, IXGBE_MPC(i));
         missed_rx += mp;
             adapter->stats.mpc[i] += mp;
-        adapter->stats.rnbc[i] += IXGBE_READ_REG(hw, IXGBE_RNBC(i));
+        if (hw->mac.type == ixgbe_mac_82598EB)
+            adapter->stats.rnbc[i] += IXGBE_READ_REG(hw, IXGBE_RNBC(i));
     }

     /* Hardware workaround, gprc counts missed packets */
     adapter->stats.gprc += IXGBE_READ_REG(hw, IXGBE_GPRC);
     adapter->stats.gprc -= missed_rx;

-    adapter->stats.gorc += IXGBE_READ_REG(hw, IXGBE_GORCH);
-    adapter->stats.gotc += IXGBE_READ_REG(hw, IXGBE_GOTCH);
-    adapter->stats.tor += IXGBE_READ_REG(hw, IXGBE_TORH);
+    if (hw->mac.type == ixgbe_mac_82599EB) {
+        adapter->stats.gorc += IXGBE_READ_REG(hw, IXGBE_GORCL);
+        IXGBE_READ_REG(hw, IXGBE_GORCH); /* clears register */
+        adapter->stats.gotc += IXGBE_READ_REG(hw, IXGBE_GOTCL);
+        IXGBE_READ_REG(hw, IXGBE_GOTCH); /* clears register */
+        adapter->stats.tor += IXGBE_READ_REG(hw, IXGBE_TORL);
+        IXGBE_READ_REG(hw, IXGBE_TORH); /* clears register */
+        adapter->stats.lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXCNT);
+        adapter->stats.lxoffrxc += IXGBE_READ_REG(hw, IXGBE_LXOFFRXCNT);
+    } else {
+        adapter->stats.lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXC);
+        adapter->stats.lxoffrxc += IXGBE_READ_REG(hw, IXGBE_LXOFFRXC);
+        /* 82598 only has a counter in the high register */
+        adapter->stats.gorc += IXGBE_READ_REG(hw, IXGBE_GORCH);
+        adapter->stats.gorc += IXGBE_READ_REG(hw, IXGBE_GOTCH);
+        adapter->stats.tor += IXGBE_READ_REG(hw, IXGBE_TORH);
+    }

     /*
      * Workaround: mprc hardware is incorrectly counting
@@ -4494,9 +4510,6 @@
     adapter->stats.prc1522 += IXGBE_READ_REG(hw, IXGBE_PRC1522);
     adapter->stats.rlec += IXGBE_READ_REG(hw, IXGBE_RLEC);

-    adapter->stats.lxonrxc += IXGBE_READ_REG(hw, IXGBE_LXONRXCNT);
-    adapter->stats.lxoffrxc += IXGBE_READ_REG(hw, IXGBE_LXOFFRXCNT);
-
     lxon = IXGBE_READ_REG(hw, IXGBE_LXONTXC);
     adapter->stats.lxontxc += lxon;
     lxoff = IXGBE_READ_REG(hw, IXGBE_LXOFFTXC);



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?2a41acea0908201721o33372c89q25e33b8cde8edf06>