Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Fix livelock on IN or OUT transactions #13

Merged
merged 1 commit into from
Dec 9, 2024
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 7 additions & 1 deletion src/portable/synopsys/dwc2/dcd_dwc2.c
Original file line number Diff line number Diff line change
Expand Up @@ -1175,6 +1175,9 @@ static void handle_epout_irq (uint8_t rhport)
dcd_event_xfer_complete(rhport, n, xfer->total_len, XFER_RESULT_SUCCESS, true);
}
}

// Failsafe, clear all pending interrupts if set
epout[n].doepint = epout[n].doepint;
}
}
}
Expand Down Expand Up @@ -1252,6 +1255,9 @@ static void handle_epin_irq (uint8_t rhport)
dwc2->diepempmsk &= ~(1 << n);
}
}

// Failsafe, clear all pending interrupts if set
epin[n].diepint = epin[n].diepint;
}
}
}
Expand Down Expand Up @@ -1348,7 +1354,7 @@ void dcd_int_handler(uint8_t rhport)
do
{
handle_rxflvl_irq(rhport);
} while(dwc2->gotgint & GINTSTS_RXFLVL);
} while(dwc2->gintsts & GINTSTS_RXFLVL);
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

This change is kinda confusing, howcome it was like this before? Is this change valid for gd32 & stm32?

Copy link
Author

@RockyZeroFour RockyZeroFour Dec 9, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

That was a bug, likely because of a typo. The goal here is to remain in the FIFO handler until the FIFO is empty and the interrupt is then automatically cleared again. Before the handler would be triggered again until the FIFO is empty instead of staying there until done as intended.

During a code check I noticed that this was off so I looked closer. Checking the global OTG interrupt flag register (gotgint) isn't related to the FIFO so using that don't make sense, the naming of the bit also indicate that it's not supposed to be used with that register and a quick check on the current TinyUSB branch revealed that they also changed it.


// Manage RX FIFO size
if (_out_ep_closed)
Expand Down
Loading