On Sun, 24 May 2009, David wrote: > Alan Stern wrote: > > It's not obvious what could be causing this, so let's start out easy. > > Try collecting two usbmon traces (instructions are in > > Documentation/usb/usbmon.txt), showing what happens with and without > > the reversion. Maybe some difference will stick ou > > > Traces attached. Took a while as my quad core hangs solid when 0u is > piped to a file (I had to compile on a laptop and take the logs there). 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; -- To unsubscribe from this list: send the line "unsubscribe linux-media" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html