David wrote: > Alan Stern wrote: > >> Okay, here's a patch for you to try. It refreshes the toggle setting >> in a linked but otherwise idle QH when a new URB is queued. >> >> Alan Stern >> >> >> Index: usb-2.6/drivers/usb/host/ehci-q.c >> =================================================================== >> --- usb-2.6.orig/drivers/usb/host/ehci-q.c >> +++ usb-2.6/drivers/usb/host/ehci-q.c >> @@ -88,7 +88,7 @@ static inline void >> qh_update (struct ehci_hcd *ehci, struct ehci_qh *qh, struct ehci_qtd *qtd) >> { >> /* writes to an active overlay are unsafe */ >> - BUG_ON(qh->qh_state != QH_STATE_IDLE); >> + BUG_ON(qh->qh_state != QH_STATE_IDLE && !list_empty(&qh->qtd_list)); >> >> qh->hw_qtd_next = QTD_NEXT(ehci, qtd->qtd_dma); >> qh->hw_alt_next = EHCI_LIST_END(ehci); >> @@ -971,7 +971,13 @@ static struct ehci_qh *qh_append_tds ( >> /* can't sleep here, we have ehci->lock... */ >> qh = qh_make (ehci, urb, GFP_ATOMIC); >> *ptr = qh; >> + } else if (list_empty(&qh->qtd_list)) { >> + /* There might have been a Clear-Halt while the QH >> + * was linked but empty. >> + */ >> + qh_refresh(ehci, qh); >> } >> + >> if (likely (qh != NULL)) { >> struct ehci_qtd *qtd; >> >> >> >> > No luck I'm afraid (although there now appear to be 2 timeouts, not > one). I'm going to follow up on the laptop and get a USB log. > USB log post-patch attached. Thanks for all the effort so far! David
Attachment:
postpatch.log.bz2
Description: application/bzip