|
@@ -98,7 +98,14 @@ static void periodic_unlink (struct ehci_hcd *ehci, unsigned frame, void *ptr)
|
|
|
*/
|
|
|
*prev_p = *periodic_next_shadow(ehci, &here,
|
|
|
Q_NEXT_TYPE(ehci, *hw_p));
|
|
|
- *hw_p = *shadow_next_periodic(ehci, &here, Q_NEXT_TYPE(ehci, *hw_p));
|
|
|
+
|
|
|
+ if (!ehci->use_dummy_qh ||
|
|
|
+ *shadow_next_periodic(ehci, &here, Q_NEXT_TYPE(ehci, *hw_p))
|
|
|
+ != EHCI_LIST_END(ehci))
|
|
|
+ *hw_p = *shadow_next_periodic(ehci, &here,
|
|
|
+ Q_NEXT_TYPE(ehci, *hw_p));
|
|
|
+ else
|
|
|
+ *hw_p = ehci->dummy->qh_dma;
|
|
|
}
|
|
|
|
|
|
/* how many of the uframe's 125 usecs are allocated? */
|
|
@@ -2335,7 +2342,11 @@ restart:
|
|
|
* pointer for much longer, if at all.
|
|
|
*/
|
|
|
*q_p = q.itd->itd_next;
|
|
|
- *hw_p = q.itd->hw_next;
|
|
|
+ if (!ehci->use_dummy_qh ||
|
|
|
+ q.itd->hw_next != EHCI_LIST_END(ehci))
|
|
|
+ *hw_p = q.itd->hw_next;
|
|
|
+ else
|
|
|
+ *hw_p = ehci->dummy->qh_dma;
|
|
|
type = Q_NEXT_TYPE(ehci, q.itd->hw_next);
|
|
|
wmb();
|
|
|
modified = itd_complete (ehci, q.itd);
|
|
@@ -2368,7 +2379,11 @@ restart:
|
|
|
* URB completion.
|
|
|
*/
|
|
|
*q_p = q.sitd->sitd_next;
|
|
|
- *hw_p = q.sitd->hw_next;
|
|
|
+ if (!ehci->use_dummy_qh ||
|
|
|
+ q.sitd->hw_next != EHCI_LIST_END(ehci))
|
|
|
+ *hw_p = q.sitd->hw_next;
|
|
|
+ else
|
|
|
+ *hw_p = ehci->dummy->qh_dma;
|
|
|
type = Q_NEXT_TYPE(ehci, q.sitd->hw_next);
|
|
|
wmb();
|
|
|
modified = sitd_complete (ehci, q.sitd);
|