|
@@ -691,6 +691,10 @@ static int ohci_service_iso_td(OHCIState *ohci, struct ohci_ed *ed,
|
|
the next ISO TD of the same ED */
|
|
the next ISO TD of the same ED */
|
|
trace_usb_ohci_iso_td_relative_frame_number_big(relative_frame_number,
|
|
trace_usb_ohci_iso_td_relative_frame_number_big(relative_frame_number,
|
|
frame_count);
|
|
frame_count);
|
|
|
|
+ if (OHCI_CC_DATAOVERRUN == OHCI_BM(iso_td.flags, TD_CC)) {
|
|
|
|
+ /* avoid infinite loop */
|
|
|
|
+ return 1;
|
|
|
|
+ }
|
|
OHCI_SET_BM(iso_td.flags, TD_CC, OHCI_CC_DATAOVERRUN);
|
|
OHCI_SET_BM(iso_td.flags, TD_CC, OHCI_CC_DATAOVERRUN);
|
|
ed->head &= ~OHCI_DPTR_MASK;
|
|
ed->head &= ~OHCI_DPTR_MASK;
|
|
ed->head |= (iso_td.next & OHCI_DPTR_MASK);
|
|
ed->head |= (iso_td.next & OHCI_DPTR_MASK);
|