Re: [regression] USB: EHCI: changes related to qh_refresh()

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



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




[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux