Skip site navigation (1)Skip section navigation (2)
Date:      Mon, 5 Jan 2004 19:34:45 +0100
From:      Maxime Henrion <mux@freebsd.org>
To:        Don Lewis <truckman@FreeBSD.org>
Cc:        current@FreeBSD.org
Subject:   Re: 5.2-RC oerrs and collisions on dc0
Message-ID:  <20040105183445.GK2060@elvis.mu.org>
In-Reply-To: <200401042151.i04Lp27E009737@gw.catspoiler.org>
References:  <200401041115.29188.dejan.lesjak@ijs.si> <200401042151.i04Lp27E009737@gw.catspoiler.org>

next in thread | previous in thread | raw e-mail | index | archive | help
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



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