Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 82264
b: refs/heads/master
c: 79592b7
h: refs/heads/master
v: v3
  • Loading branch information
David Brownell authored and Greg Kroah-Hartman committed Feb 1, 2008
1 parent 3ce6037 commit 86b933a
Show file tree
Hide file tree
Showing 2 changed files with 28 additions and 15 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: aa16ca307ee2da304d3a5fc0fc5e50ef8047c9e9
refs/heads/master: 79592b722e7a8476680197d97352d2cc0f1bffd2
41 changes: 27 additions & 14 deletions trunk/drivers/usb/host/ehci-sched.c
Original file line number Diff line number Diff line change
Expand Up @@ -2123,17 +2123,9 @@ scan_periodic (struct ehci_hcd *ehci)
for (;;) {
union ehci_shadow q, *q_p;
__hc32 type, *hw_p;
unsigned uframes;
unsigned incomplete = false;

/* don't scan past the live uframe */
frame = now_uframe >> 3;
if (frame == (clock >> 3))
uframes = now_uframe & 0x07;
else {
/* safe to scan the whole frame at once */
now_uframe |= 0x07;
uframes = 8;
}

restart:
/* scan each element in frame's queue for completions */
Expand Down Expand Up @@ -2171,23 +2163,28 @@ scan_periodic (struct ehci_hcd *ehci)
q = q.fstn->fstn_next;
break;
case Q_TYPE_ITD:
/* skip itds for later in the frame */
/* If this ITD is still active, leave it for
* later processing ... check the next entry.
*/
rmb ();
for (uf = live ? uframes : 8; uf < 8; uf++) {
for (uf = 0; uf < 8 && live; uf++) {
if (0 == (q.itd->hw_transaction [uf]
& ITD_ACTIVE(ehci)))
continue;
incomplete = true;
q_p = &q.itd->itd_next;
hw_p = &q.itd->hw_next;
type = Q_NEXT_TYPE(ehci,
q.itd->hw_next);
q = *q_p;
break;
}
if (uf != 8)
if (uf < 8 && live)
break;

/* this one's ready ... HC won't cache the
/* Take finished ITDs out of the schedule
* and process them: recycle, maybe report
* URB completion. HC won't cache the
* pointer for much longer, if at all.
*/
*q_p = q.itd->itd_next;
Expand All @@ -2198,15 +2195,24 @@ scan_periodic (struct ehci_hcd *ehci)
q = *q_p;
break;
case Q_TYPE_SITD:
/* If this SITD is still active, leave it for
* later processing ... check the next entry.
*/
if ((q.sitd->hw_results & SITD_ACTIVE(ehci))
&& live) {
incomplete = true;
q_p = &q.sitd->sitd_next;
hw_p = &q.sitd->hw_next;
type = Q_NEXT_TYPE(ehci,
q.sitd->hw_next);
q = *q_p;
break;
}

/* Take finished SITDs out of the schedule
* and process them: recycle, maybe report
* URB completion.
*/
*q_p = q.sitd->sitd_next;
*hw_p = q.sitd->hw_next;
type = Q_NEXT_TYPE(ehci, q.sitd->hw_next);
Expand All @@ -2232,7 +2238,14 @@ scan_periodic (struct ehci_hcd *ehci)
}
}

/* stop when we catch up to the HC */
/* If we can tell we caught up to the hardware, stop now.
* We can't advance our scan without collecting the ISO
* transfers that are still pending in this frame.
*/
if (incomplete && HC_IS_RUNNING(ehci_to_hcd(ehci)->state)) {
ehci->next_uframe = now_uframe;
break;
}

// FIXME: this assumes we won't get lapped when
// latencies climb; that should be rare, but...
Expand Down

0 comments on commit 86b933a

Please sign in to comment.