Mike Nuss wrote:
> David Brownell wrote:
>> Hmm.  Here's a theory.  The way that the current code unlinks
>> an ED is to set the SKIP bit *AND* remove the ED from the relevant
>> part of the schedule.
>>
>> Maybe ... the hardware gets confused when the ED doesn't seem
>> to be on the relevant list.  Like maybe it expects it to stay
>> at the head of the ED list.  ISTR some silicon doesn't much
>> like to see null pointers written into the hardware registers,
>> and I know for a fact that the ed_deschedule logic was always
>> a bit racey.
>>
>> That suggests that the safest route would be setting SKIP for
>> one frame (so all pending TDs get properly retired), and
>> only *THEN* taking it out of the queue.

There are three time periods in question.

A = before there is any problem

B = a read seems to have completed, the HC has advanced HeadP, but
failed to put the completed TD on the donelist. At this point, something
is seriously wrong, but ohci-hcd has no way of knowing this.

C = the device is removed. Then ohci-hcd hangs while waiting to free the
outstanding TD, which will never happen since the HC thinks the TD is
already finished.

The only cases I have observed SKIP being set are after time C. So I
don't think that the descheduling code is responsible for the problem.

As sort-of good news, I ran some more tests today and now I know for
*sure* that the transfer really did complete, and I can even get
transfers going again. After time B, my device driver can detect that
there's a problem just by the fact that no new data has come in for 30
seconds. So, I added a new hook to ohci-q that "pretends" that the TD
really did come back through the donelist, and goes through the normal
TD completion routine. My driver calls this hook when it detects that
the 30 second timeout has expired. The URB completes normally, with all
the data intact. Then it's resubmitted for the next read, and everything
works normally again.

I'm at a loss. It really looks like the HC just "skipped" a step for no
reason. Is there any possibility the USB device itself could be causing
a problem? I haven't looked into that possibility yet.

Mike


-------------------------------------------------------------------------
This SF.net email is sponsored by DB2 Express
Download DB2 Express C - the FREE version of DB2 express and take
control of your XML. No limits. Just data. Click to get it now.
http://sourceforge.net/powerbar/db2/
_______________________________________________
linux-usb-devel@lists.sourceforge.net
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to