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