5.2-RC oerrs and collisions on dc0

Don Lewis truckman at FreeBSD.org
Sun Jan 4 13:51:16 PST 2004

I just took a closer look at the busdma diff, and this change to
dc_txeof() looks very suspicious:

@@ -2663,7 +2809,7 @@
                if (txstat & DC_TXSTAT_OWN)
-               if (!(cur_tx->dc_ctl & DC_TXCTL_LASTFRAG) ||
+               if (!(cur_tx->dc_ctl & DC_TXCTL_FIRSTFRAG) ||
                    cur_tx->dc_ctl & DC_TXCTL_SETUP) {
                        if (cur_tx->dc_ctl & DC_TXCTL_SETUP) {

The code in the "if" block ends with a "continue" which will cause the
error handling code to be skipped if the "if" condition is true.  I'm
pretty sure that the error status bits are only set in the last
descriptor for the frame, so we want to execute the "continue" unless
the DC_TXCTL_LASTFRAG bit is set.

Try reverting this part of the busdma change.

More information about the freebsd-current mailing list