diff options
| author | Jonathan Bell <[email protected]> | 2023-01-05 13:36:51 +0000 |
|---|---|---|
| committer | Jonathan Bell <[email protected]> | 2023-01-24 11:53:28 +0000 |
| commit | 73b0047efc4cc657a92b356dd9b5046a44277b33 (patch) | |
| tree | 14ed2fd02c6be4bcd79f6524c125d1dc6892289c /docs/reference | |
| parent | c3e47c31ccd42b144a8a770ed56b8cdc4c2932cc (diff) | |
rp2040: avoid device-mode state machine hang
Don't mark IN buffers as available during the last 200us of a full-speed
frame. This avoids a situation seen with the USB2.0 hub on a Raspberry
Pi 4 where a late IN token before the next full-speed SOF can cause port
babble and a corrupt ACK packet. The nature of the data corruption has a
chance to cause device lockup.
Use the next SOF to mark delayed buffers as available. This reduces
available Bulk IN bandwidth by approximately 20%, and requires that the
SOF interrupt is enabled while these transfers are ongoing.
Inherit the top-level enable from the corresponding Pico-SDK flag.
Applications that will not use the device in a situation where it could
be plugged into a Pi 4 or Pi 400 (for example, when directly connected
to a commodity hub or other host) can turn off the flag in the SDK.
v2: use a field in hw_endpoint to mark pending.
v3: Partial rewrite following review comments
- Stub functions out if the workaround is not required
- Only force-enable SOF while any vulnerable endpoints are active
- Respect dcd_sof_enable() functionality
- Get rid of all but necessary ifdef hackery
- Fix a bug where the "endpoint lock" was used with an uninitialised pointer.
Diffstat (limited to 'docs/reference')
0 files changed, 0 insertions, 0 deletions
