On Tuesday 10 June 2003 19:18, Alan Stern wrote:
> On Tue, 10 Jun 2003, Duncan Sands wrote:
> > I've tracked it down to the following: the first of two queued urbs
> > completes, and the HC detects a problem in the following stretch of code
> > in uhci_irq:
>
> What do you mean?  The HC detects a problem only after
> uhci_transfer_result() runs?  Or does the next HC interrupt (with error
> status) occur while this piece of code for the first interrupt is
> executing?

If I put a delay statement immediately before the first line of the block of code I 
pasted,
and another immediately after the last line, then the HC raises an interrupt with 
process
error during the second delay statement.  If I put an additional delay statement 
immediately
before uhci_finish_completion(hcd, regs);, then the HC no longer signals an error!

> >         /* Walk the list of pending URB's to see which ones completed */
> >         spin_lock(&uhci->urb_list_lock);
> >         head = &uhci->urb_list;
> >         tmp = head->next;
> >         while (tmp != head) {
> >                 struct urb_priv *urbp = list_entry(tmp, struct urb_priv,
> > urb_list); struct urb *urb = urbp->urb;
> >
> >                 tmp = tmp->next;
> >
> >                 /* Checks the status and does all of the magic necessary
> > */ uhci_transfer_result(uhci, urb);
> >         }
> >         spin_unlock(&uhci->urb_list_lock);
> >
> >         uhci_finish_completion(hcd, regs);
> >
> > Interestingly enough, if I put a delay statement before
> > uhci_finish_completion(hcd, regs); then the HC no longer barfs (*).  I
> > guessing that, in this stretch of code, links are modified in the wrong
> > order so that the schedule is momentarily inconsistent; the HC spots it
> > and flags the error.
>
> Notice that for bulk URBs, uhci_finish_completion() doesn't touch the
> schedule at all, or at least, it doesn't touch any of the parts that the
> HC looks at.  Only for an isochronous transfer would it do that.  You can
> test this by putting a printk in uhci_remove_td() after the "goto out;"
> statement -- only a TD for an iso. URB should fail to take that goto.  So
> I don't see how adding a delay before uhci_finish_completion() could fix
> things up.  It seems like that would only prolong the period during which
> the schedule was inconsistent.

OK, I will test that (not before Friday though).

> Furthermore, everything in uhci_transfer_result() that touches the
> schedule occurs in uhci_delete_queued_urb() and uhci_remove_qh().  (In
> fact, it looks like those two routines have a lot of code in common.)  But
> there's nothing that looks like it would make the schedule inconsistent.
>
> It's a puzzling problem.

Yes, but completely reproducible, so it's only a matter of time before it is solved.

Ciao,

Duncan.


-------------------------------------------------------
This SF.net email is sponsored by:  Etnus, makers of TotalView, The best
thread debugger on the planet. Designed with thread debugging features
you've never dreamed of, try TotalView 6 free at www.etnus.com.
_______________________________________________
[EMAIL PROTECTED]
To unsubscribe, use the last form field at:
https://lists.sourceforge.net/lists/listinfo/linux-usb-devel

Reply via email to