Dears, Excuse me! I am new in linux ehci, so I do not have a lot of ideas for ehci issues. After I trace ehci code, I found scan_periodic() take a lot of time for loops. When I goole the solution for watchdog reset issue. I found the patch from you. Then I apply that for my platform. But I do not get fully understand in scan_periodic(). Could you give me the hints about the meaning of your patch below? Even briefly for the flow such that I can trace in depth. I really appreciate your idea. BTW. I have test for 2 days(48 hours). No any issues for webcamtest if I ignore the line I mentioned. I do not understand why it will not work if the line is ignored as your comment. Thanks! Best Regards, Brad -----Original Message----- From: linux-usb-owner@xxxxxxxxxxxxxxx [mailto:linux-usb-owner@xxxxxxxxxxxxxxx] On Behalf Of Alan Stern Sent: Saturday, March 26, 2011 1:01 AM To: BradHuang Cc: USB list Subject: RE: ehci scan_periodic loop time On Fri, 25 Mar 2011, BradHuang wrote: > Dears, > > > the patch you provide: but the one line does not patch for mine: > do you have any idea about any side effect if I ignore the line? > ===================================================== > > > I have an experimental patch, below. It hasn't been tested. Let me > know what happens when you try it. > Alan Stern > Index: usb-2.6/drivers/usb/host/ehci.h > =================================================================== > --- usb-2.6.orig/drivers/usb/host/ehci.h > +++ usb-2.6/drivers/usb/host/ehci.h > @@ -117,6 +117,7 @@ struct ehci_hcd { /* one per controlle > struct timer_list watchdog; > unsigned long actions; > unsigned stamp; > + unsigned periodic_stamp; > unsigned random_frame; > unsigned long next_statechange; > ktime_t last_periodic_enable; > 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 > @@ -838,6 +838,7 @@ qh_make ( > is_input, 0, > hb_mult(maxp) * max_packet(maxp))); > qh->start = NO_FRAME; > + qh->stamp = ehci->periodic_stamp; > > if (urb->dev->speed == USB_SPEED_HIGH) { > qh->c_usecs = 0; > Index: usb-2.6/drivers/usb/host/ehci-sched.c > =================================================================== > --- usb-2.6.orig/drivers/usb/host/ehci-sched.c > +++ usb-2.6/drivers/usb/host/ehci-sched.c > @@ -2261,6 +2261,7 @@ scan_periodic (struct ehci_hcd *ehci) > } > clock &= mod - 1; > clock_frame = clock >> 3; > + ++ehci->periodic_stamp; > > for (;;) { > union ehci_shadow q, *q_p; > @@ -2289,10 +2290,14 @@ restart: > temp.qh = qh_get (q.qh); > type = Q_NEXT_TYPE(ehci, q.qh->hw->hw_next); > q = q.qh->qh_next; > - modified = qh_completions (ehci, temp.qh); > - if (unlikely(list_empty(&temp.qh->qtd_list) || > - temp.qh->needs_rescan)) > - intr_deschedule (ehci, temp.qh); > + if (temp.qh->stamp != ehci->periodic_stamp) { > + modified = qh_completions(ehci, temp.qh); > + if (!modified) > + temp.qh->stamp = ehci->periodic_stamp; > + if (unlikely(list_empty(&temp.qh->qtd_list) || > + temp.qh->needs_rescan)) > + intr_deschedule(ehci, temp.qh); > + } > qh_put (temp.qh); > break; > case Q_TYPE_FSTN: > @@ -2427,6 +2432,7 @@ restart: > free_cached_lists(ehci); > ehci->clock_frame = clock_frame; > } > + ++ehci->periodic_stamp; -------------------> this line does not applied > } else { > now_uframe++; > now_uframe &= mod - 1; The patch won't work without that line. However, you can always edit the file by hand and put the line in yourself. Alan Stern -- 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 -- 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