On Mon, 27 May 2013, Oleksij Rempel wrote: > > Hmmm. Maybe we can narrow this down. What happens if you apply only > > parts of the commit? > > > > For example, on top of c97041a, try applying only the hunks that change > > ehci-sched.c. If that works, try applying also only the last hunk > > affecting ehci-q.c. If that works, try applying also the two previous > > hunks. > > > > after ehci-sched.c hank i have this problem again: > > +++ b/drivers/usb/host/ehci-sched.c > @@ -792,7 +792,6 @@ static int qh_schedule(struct ehci_hcd *ehci, struct > ehci_qh > unsigned frame; /* 0..(qh->period - 1), or > NO_FRAME */ > struct ehci_qh_hw *hw = qh->hw; > > - qh_refresh(ehci, qh); > hw->hw_next = EHCI_LIST_END(ehci); > frame = qh->start; > > @@ -844,8 +843,6 @@ static int qh_schedule(struct ehci_hcd *ehci, struct > ehci_qh > } else > ehci_dbg (ehci, "reused qh %p schedule\n", qh); > > - /* stuff into the periodic schedule */ > - qh_link_periodic(ehci, qh); > done: > return status; > } > @@ -891,6 +888,12 @@ static int intr_submit ( > qh = qh_append_tds(ehci, urb, qtd_list, epnum, &urb->ep->hcpriv); > BUG_ON (qh == NULL); > > + /* stuff into the periodic schedule */ > + if (qh->qh_state == QH_STATE_IDLE) { > + qh_refresh(ehci, qh); > + qh_link_periodic(ehci, qh); > + } > + > /* ... update usbfs periodic stats */ > ehci_to_hcd(ehci)->self.bandwidth_int_reqs++; Good grief, I can't believe I forgot to include this material in the original commit. I really am getting careless... Anyway, this should fix the problem. Alan Stern Index: usb-3.9/drivers/usb/host/ehci-sched.c =================================================================== --- usb-3.9.orig/drivers/usb/host/ehci-sched.c +++ usb-3.9/drivers/usb/host/ehci-sched.c @@ -646,6 +646,10 @@ static void end_unlink_intr(struct ehci_ /* reschedule QH iff another request is queued */ if (!list_empty(&qh->qtd_list) && ehci->rh_state == EHCI_RH_RUNNING) { rc = qh_schedule(ehci, qh); + if (rc == 0) { + qh_refresh(ehci, qh); + qh_link_periodic(ehci, qh); + } /* An error here likely indicates handshake failure * or no space left in the schedule. Neither fault @@ -653,9 +657,10 @@ static void end_unlink_intr(struct ehci_ * * FIXME kill the now-dysfunctional queued urbs */ - if (rc != 0) + else { ehci_err(ehci, "can't reschedule qh %p, err %d\n", qh, rc); + } } /* maybe turn off periodic schedule */ -- To unsubscribe from this list: send the line "unsubscribe linux-usb" in the body of a message to majordomo@xxxxxxxxxxxxxxx More majordomo info at http://vger.kernel.org/majordomo-info.html