On Fri, 6 Jul 2007, Mike Nuss wrote:

> Alan Stern wrote:
> > On Thu, 5 Jul 2007, Mike Nuss wrote:
> > 
> >> 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.
> > 
> > Are you really sure about that?  Isn't the HC allowed to delay updated 
> > the donelist pointers until the end of the frame?
> 
> All the other endpoints continue to function normally. Since NextED
> happens to be null in the cases I've seen, that means that it's on the
> end of its list and the other endpoints must be on other lists, which
> implies that at least one frame boundary must be crossed between
> handling the 'hung' endpoint and any others. Is that right?

AFAIK there are only two lists (apart from the "done" list): the
periodic list and the async list.  The HC is allowed and expected to
jump between them during the course of a single frame.

> > Now if you know for certain that at least one frame boundary has passed 
> > since the transfer completed and the TD still isn't on the donelist, 
> > then I'd say you've found a bug in the controller hardware.  Under such 
> > circumstances the driver would be justified in retiring the TD on its 
> > own initiative.
> 
> I have working code that does this now and seems to be harmless, but I
> don't think this chipset (ZF Micro "CS5540") is very common, so it would
> probably be difficult for anyone else to validate the fix. The bigger
> problem is that it requires the higher level device driver to kick
> ohci-hcd to let it know there's a problem. I'm not sure how else
> ohci-hcd would know that the TD was really done unless it monitored the
> contents of HeadP and HccaDoneHead periodically to look for the
> inconsistency, but I'm open to suggestions.

The only way it can know is by scanning through the data structures.  
But this doesn't have to be done in response to a kick from a
higher-level driver.  It could be done whenever a SOF or URB-completion
interrupt is received, for example.

> We're thinking about looking at this on a logic analyzer to try to see
> if the HC seems to have attempted to update HeadP, but unfortunately we
> didn't have room on the board for test points, so it's going to be messy.

Suppose it really does turn out to be a hardware bug in your particular 
brand of HC.  Then what would you like to do about it?

Alan Stern


-------------------------------------------------------------------------
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