5.2-RC oerrs and collisions on dc0
Maxime Henrion
mux at freebsd.org
Mon Jan 5 10:34:47 PST 2004
Don Lewis wrote:
> 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)
> break;
>
> - 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.
I think you actually found the culprit, though fixing this is not as
simple as reverting this line. I changed the check to
DC_TXCTL_FIRSTFRAG because that's the descriptor which will have a link
to the mbuf, while it was previously done for the LASTFRAG descriptor.
However, I didn't think about the code flow enough it seems. If you
don't have a fix for this soon, I should be able to do it pretty easily,
assuming I find the time.
Thanks,
Maxime
More information about the freebsd-current
mailing list