Hi Alan, thanks for thinking about this. > You must have had debug set to 1, because your listing did not include the > skeleton QH's. That's what's confusing you; the QH at dee6e210 is the > Terminating QH.
Yup. > It might be worthwhile examining a dump made immediately after you queue > the problem-causing URB. Comparing that with the values after the HC has > halted might possibly (?) point to the source of the error. 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: /* 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. Ciao, Duncan. (*) I moved the code from uhci_free_pending_qhs(uhci); onwards in uhci_irq into a tasklet, so as to run it with interrupts on. Otherwise, putting delay statements in wouldn't help much in tracking down where in this lot the interrupt occurs! ------------------------------------------------------- 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