Skip to content

Commit 46ec89e

Browse files
committed
dwc2/host: fix all retry intervals
Signed-off-by: Maxime Vincent <[email protected]>
1 parent 3150144 commit 46ec89e

File tree

1 file changed

+14
-15
lines changed

1 file changed

+14
-15
lines changed

src/portable/synopsys/dwc2/hcd_dwc2.c

+14-15
Original file line numberDiff line numberDiff line change
@@ -719,22 +719,21 @@ static void channel_xfer_in_retry(dwc2_regs_t* dwc2, uint8_t ch_id, uint32_t hci
719719
}
720720
}
721721

722-
// immediately retry if bInterval is 1 - otherwise we'd waste a microframe before retrying
723-
if ((hcint & HCINT_HALTED) && (edpt->uframe_interval == 1)) {
724-
edpt->hcchar_bm.odd_frame = 1 - (dwc2->hfnum & 1); // transfer on next frame
725-
channel->hcchar = (edpt->hcchar & ~HCCHAR_CHENA);
726-
channel_send_in_token(dwc2, channel);
727-
return;
728-
}
729-
730-
// for periodic, de-allocate channel, enable SOF set frame counter for later transfer
731-
edpt->next_pid = channel->hctsiz_bm.pid; // save PID
732-
edpt->uframe_countdown = edpt->uframe_interval;
733-
dwc2->gintmsk |= GINTSTS_SOF;
734-
735722
if (hcint & HCINT_HALTED) {
736-
// already halted, de-allocate channel (called from DMA isr)
737-
channel_dealloc(dwc2, ch_id);
723+
const uint32_t ucount = (hprt_speed_get(dwc2) == TUSB_SPEED_HIGH ? 1 : 8);
724+
if (edpt->uframe_interval == ucount) {
725+
// immediately retry if bInterval is 1
726+
edpt->hcchar_bm.odd_frame = 1 - (dwc2->hfnum & 1); // transfer on next frame
727+
channel->hcchar = (edpt->hcchar & ~HCCHAR_CHENA);
728+
channel_send_in_token(dwc2, channel);
729+
} else {
730+
// otherwise, de-allocate channel, enable SOF set frame counter for later transfer
731+
edpt->next_pid = channel->hctsiz_bm.pid; // save PID
732+
edpt->uframe_countdown = edpt->uframe_interval - ucount;
733+
dwc2->gintmsk |= GINTSTS_SOF;
734+
// already halted, de-allocate channel (called from DMA isr)
735+
channel_dealloc(dwc2, ch_id);
736+
}
738737
} else {
739738
// disable channel first if not halted (called slave isr)
740739
xfer->halted_sof_schedule = 1;

0 commit comments

Comments
 (0)