if (fiq_fsm_enable && (hcd->fiq_state->channel[n].fsm != FIQ_PASSTHROUGH)) {
qh->channel->halt_status = DWC_OTG_HC_XFER_URB_DEQUEUE;
qh->channel->halt_pending = 1;
- hcd->fiq_state->channel[n].fsm = FIQ_DEQUEUE_ISSUED;
+ //hcd->fiq_state->channel[n].fsm = FIQ_DEQUEUE_ISSUED;
} else {
dwc_otg_hc_halt(hcd->core_if, qh->channel,
DWC_OTG_HC_XFER_URB_DEQUEUE);
hcd->core_if->dma_desc_enable?"DMA ":"");
if (!hcd->core_if->dma_desc_enable) {
uint8_t b = urb_qtd->in_process;
+ if (nak_holdoff && qh->do_split && dwc_qh_is_non_per(qh))
+ qh->nak_frame = 0xFFFF;
dwc_otg_hcd_qtd_remove_and_free(hcd, urb_qtd, qh);
if (b) {
dwc_otg_hcd_qh_deactivate(hcd, qh, 0);
fiq_print(FIQDBG_INT, hcd->fiq_state, "OUT %01d %01d ", num , st->fsm);
hostchannels = hcd->available_host_channels;
+ if (hc->halt_pending) {
+ /* Dequeue: The FIQ was allowed to complete the transfer but state has been cleared. */
+ release_channel(hcd, hc, NULL, hc->halt_status);
+ return;
+ }
switch (st->fsm) {
case FIQ_TEST:
break;
case FIQ_DEQUEUE_ISSUED:
- /* hc_halt was called. QTD no longer exists. */
- /* TODO: for a nonperiodic split transaction, need to issue a
- * CLEAR_TT_BUFFER hub command if we were in the start-split phase.
- */
+ /* Handled above, but keep for posterity */
release_channel(hcd, hc, NULL, hc->halt_status);
break;
/* Add back to inactive non-periodic schedule. */
dwc_otg_hcd_qh_add(hcd, qh);
//hcd->fiq_state->kick_np_queues = 1;
+ } else {
+ if(nak_holdoff && qh->do_split) {
+ qh->nak_frame = 0xFFFF;
+ }
}
} else {
uint16_t frame_number = dwc_otg_hcd_get_frame_number(hcd);