On Monday 30 April 2007, Mike Nuss wrote:
> Alan Stern wrote: 
> > > I think it's pretty clear there's an underlying hardware issue, but
> > > maybe there is a workaround. I added the additional debug code you
> > > suggested to get a better idea of what finish_unlinks() is doing (or
> not
> > > doing).
> > 
> > And the results are... ?
> 
> finish_unlinks is getting called in the 'sanitize' path of
> ohci_endpoint_disable(). The test "if (td->td-dma != head)" passes, and
> it jumps to the skip_ed path.

So, trying for some (bad) ASCII art here

  TDs 1-4 submitted to ED,
  HC completed a few (say, 1 & 2)
  
        ed.tail ---------------------------+
        ed.head ----------+                I
                          I                I
                          v                v
        td1 -->  td2 --> td3 --> td4 --> dummy

Where "td" is like td1, and clearly is not the first TD in
the queue.

One problem being that by now td1 and td2 should have shown up in
the donelist, through an IRQ.  That would explain the symprom of
data transfers seeming to stop.

It'd be interesting to see whether there's anything in that donelist;
if so, that might suggest that the driver somehow lost an IRQ.  Try
printing its value in that "sanitize" path.

If the value is nonzero, then try disabling that very first test in
ohci_irq ... just add a "&& 0" clause to keep it simple.  I know that
some older OHCI implementations have bugs in that area.

- Dave


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