Don Lewis wrote: > I just took a closer look at the busdma diff, and this change to > dc_txeof() looks very suspicious: > > _at__at_ -2663,7 +2809,7 _at__at_ > 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, MaximeReceived on Mon Jan 05 2004 - 09:34:47 UTC
This archive was generated by hypermail 2.4.0 : Wed May 19 2021 - 11:37:36 UTC