5.2-RC oerrs and collisions on dc0

Dejan Lesjak dejan.lesjak at ijs.si
Sun Jan 4 15:02:25 PST 2004


On Sunday 04 of January 2004 22:51, 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 tried this; although I'm now getting watchdog timeouts, I don't see any 
collisions and the few output errors probably come from timeouts. So I guess 
this is in the right direction. Could it be that we still need to do these 
lines:
sc->dc_cdata.dc_tx_cnt--;
DC_INC(idx, DC_TX_LIST_CNT);
unless DC_TXCTL_FIRSTFRAG is set? I'll try playing with this now and see how 
it goes...

Dejan


More information about the freebsd-current mailing list