Date: Sat, 3 Jan 2004 22:50:40 -0800 (PST) From: Don Lewis <truckman@FreeBSD.org> To: dejan.lesjak@ijs.si, wpaul@FreeBSD.org Cc: freebsd-current@FreeBSD.org Subject: Re: 5.2-RC oerrs and collisions on dc0 Message-ID: <200401040650.i046oe7E008358@gw.catspoiler.org> In-Reply-To: <200401040533.i045XU7E008256@gw.catspoiler.org>
next in thread | previous in thread | raw e-mail | index | archive | help
On 3 Jan, Don Lewis wrote: > On 4 Jan, Dejan Lesjak wrote: > >> Hello again, >> With this line commented out, I still get both errors and collisions, twice as >> much collisions as errors. On another occasion, I also added two printf lines >> in here: >> if (txstat & DC_TXSTAT_EXCESSCOLL) >> ifp->if_collisions++; >> printf("EXCESSCOLL\n"); >> if (txstat & DC_TXSTAT_LATECOLL) >> ifp->if_collisions++; >> printf("LATECOLL\n"); >> and I constantly get both of those, so this would be where counters go up if >> this helps in any way. > > I'm not familiar with this hardware, but I suspect that these two flags > should probably not increment the collision counter. These are errors > that result in the packet being dropped, so they should count as output > errors. The hardware collision counter is probably incremented in these > cases, so incrementing if_collisions probably results in these types of > collisions being double counted. Hmn, it seems that I lied. I actually have studied this hardware in the past. I don't think the following code fragment in dc_txeof() is quite correct. if (txstat & DC_TXSTAT_ERRSUM) { ifp->if_oerrors++; if (txstat & DC_TXSTAT_EXCESSCOLL) ifp->if_collisions++; if (txstat & DC_TXSTAT_LATECOLL) ifp->if_collisions++; if (!(txstat & DC_TXSTAT_UNDERRUN)) { dc_init(sc); return; } } ifp->if_collisions += (txstat & DC_TXSTAT_COLLCNT) >> 3; I don't happen to have a copy of the 21143 documentation, but my crufty old 21140A documentation says that the collision count field is valid if the late collision bit is set, but not if the excess collision count bit is set. The documentation can't make up its mind as to whether the late collision bit is valid if the underrun bit is set. It looks like the code should be: if (txstat & DC_TXSTAT_ERRSUM) { ifp->if_oerrors++; if (!(txstat & DC_TXSTAT_UNDERRUN)) { dc_init(sc); return; } } ifp->if_collisions += (txstat & DC_TXSTAT_EXCESSCOLL) ? 16 : (txstat & DC_TXSTAT_COLLCNT) >> 3); This still doesn't explain why you are seeing output errors in full duplex mode. If the chip is really in full duplex mode, the circuitry that sets the collision counter and the late and excess collision bits should be disabled. It looks like the code to put the chip in full duplex mode is correct and I didn't see anything obvious in the busdma modifications to the driver.
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200401040650.i046oe7E008358>