Skip to content

Hub enumeration reliability improvements#3371

Merged
hathach merged 7 commits intomasterfrom
enum_catch
Dec 15, 2025
Merged

Hub enumeration reliability improvements#3371
hathach merged 7 commits intomasterfrom
enum_catch

Conversation

@HiFiPhile
Copy link
Collaborator

@HiFiPhile HiFiPhile commented Nov 26, 2025

Describe the PR
I've made 3 hub enumeration reliability improvements, they works well here but not sure if there are any edge case.

  • Stop enumeration gracefully if EP0 can't be open
    When configured endpoint is not enough, usbh_edpt_control_open() fails and the hub become stuck.

    With quick plug/unplug sometimes old endpoint release happens after new endpoint open. Normally my config only needs 15 EPs (3 for hub + 4 for keyboard + 4 for USB key + 4 for FTDI) but I hit assert(usbh_edpt_control_open()) with total 16 EPs.
    ---> Fixed by #3

  • Start hub status transfer before driver config
    At the end of enumeration driver config is launched by usbh_driver_set_config_complete(), if the device is bouncing and transfer failed, enum_full_complete() is not called (especially MSC needs some time to init) leaving hub in stuck.

    I've also made enum_full_complete(bool success) to avoid triggering a 2nd hub status in case of success, which cause some wieldiness stuff.

  • Detach existing device first if an attach event is received
    Previously old device is not removed until ENUM_SET_ADDR, remove the device before EP0 opening can lower endpoint peak usage.

Signed-off-by: HiFiPhile <admin@hifiphile.com>
Signed-off-by: HiFiPhile <admin@hifiphile.com>
Copilot AI review requested due to automatic review settings November 26, 2025 22:38
Copy link
Contributor

Copilot AI left a comment

Choose a reason for hiding this comment

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

Pull request overview

This PR improves hub enumeration reliability by addressing two edge cases that could cause the hub to become stuck during device enumeration:

  1. Graceful handling of EP0 open failures: When usbh_edpt_control_open() fails (e.g., when CFG_TUH_FSDEV_ENDPOINT_MAX is exhausted or during quick plug/unplug scenarios), enumeration now stops gracefully by calling enum_full_complete(false) and cleaning up device state, rather than triggering a hard assertion that leaves the hub stuck.

  2. Earlier hub status transfer initiation: Hub status transfers are now initiated immediately when a device is configured (before driver initialization), rather than waiting until after all drivers complete their set_config() callbacks. This prevents the hub from getting stuck when a driver's set_config() fails or stalls (e.g., MSC devices that take time to initialize).


💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@sonarqubecloud
Copy link

sonarqubecloud bot commented Dec 2, 2025

@github-actions
Copy link

github-actions bot commented Dec 15, 2025

Size Difference Report

Because TinyUSB code size varies by port and configuration, the metrics below represent the averaged totals across all example builds.

Note: If there is no change, only one value is shown.

Changes >1% in size

No entries.

Changes <1% in size

file .text .rodata .data .bss size % diff
usbh.c 4286 ➙ 4329 (+43) 60 60 966 5339 ➙ 5382 (+43) +0.8%
TOTAL 4286 ➙ 4329 (+43) 60 60 966 5339 ➙ 5382 (+43) +0.8%
No changes
file .text .rodata .data .bss size % diff
audio_device.c 2859 0 1250 1687 4540 +0.0%
cdc_device.c 1332 16 20 656 1986 +0.0%
cdc_host.c 6511 487 15 1418 8173 +0.0%
dcd_ch32_usbfs.c 1472 0 0 2444 3916 +0.0%
dcd_ch32_usbhs.c 1648 0 0 448 2096 +0.0%
dcd_ci_fs.c 1925 0 0 1290 3215 +0.0%
dcd_ci_hs.c 1725 0 0 1152 2493 +0.0%
dcd_da146xx.c 3067 0 0 144 3211 +0.0%
dcd_dwc2.c 4188 25 0 263 4474 +0.0%
dcd_eptri.c 2270 0 0 259 2529 +0.0%
dcd_khci.c 1953 0 0 1290 3243 +0.0%
dcd_lpc17_40.c 1470 0 0 648 1794 +0.0%
dcd_lpc_ip3511.c 1463 0 0 264 1639 +0.0%
dcd_mm32f327x_otg.c 1478 0 0 1290 2768 +0.0%
dcd_msp430x5xx.c 1796 0 0 176 1972 +0.0%
dcd_musb.c 2228 0 0 160 2388 +0.0%
dcd_nrf5x.c 2919 0 0 292 3211 +0.0%
dcd_nuc120.c 1093 0 0 78 1171 +0.0%
dcd_nuc121.c 1167 0 0 101 1268 +0.0%
dcd_nuc505.c 0 0 1529 157 1686 +0.0%
dcd_rp2040.c 736 20 580 1029 2365 +0.0%
dcd_rusb2.c 3076 0 0 156 3232 +0.0%
dcd_samd.c 1032 0 0 266 1298 +0.0%
dcd_samg.c 1319 0 0 72 1391 +0.0%
dcd_stm32_fsdev.c 2494 0 0 291 2785 +0.0%
dfu_device.c 741 28 712 174 915 +0.0%
dfu_rt_device.c 157 0 134 0 156 +0.0%
dwc2_common.c 781 29 0 0 797 +0.0%
ecm_rndis_device.c 1037 0 1 2272 3310 +0.0%
ehci.c 2651 0 0 5970 8622 +0.0%
fsdev_common.c 622 0 0 0 622 +0.0%
hcd_ch32_usbfs.c 2484 0 0 498 2982 +0.0%
hcd_ci_hs.c 229 0 0 0 229 +0.0%
hcd_dwc2.c 4880 30 0 512 5422 +0.0%
hcd_khci.c 2442 0 0 449 2891 +0.0%
hcd_musb.c 3073 0 0 157 3230 +0.0%
hcd_pio_usb.c 262 0 240 0 502 +0.0%
hcd_rp2040.c 936 73 420 512 1941 +0.0%
hcd_rusb2.c 2965 0 0 246 3211 +0.0%
hcd_samd.c 2220 0 0 324 2544 +0.0%
hcd_stm32_fsdev.c 3258 0 1 420 3679 +0.0%
hid_device.c 1119 44 997 117 1235 +0.0%
hid_host.c 1190 0 0 1306 2495 +0.0%
hub.c 1227 8 8 30 1262 +0.0%
midi_device.c 1129 0 991 584 1711 +0.0%
midi_host.c 1335 7 7 3471 4810 +0.0%
msc_device.c 2508 108 2274 544 3052 +0.0%
msc_host.c 1571 0 0 403 1974 +0.0%
mtp_device.c 1622 22 1385 585 2215 +0.0%
ncm_device.c 1503 28 1408 5961 7478 +0.0%
ohci.c 1942 0 0 2414 4356 +0.0%
rp2040_usb.c 124 70 574 4 772 +0.0%
rusb2_common.c 0 0 16 0 16 +0.0%
tusb.c 419 0 361 3 421 +0.0%
tusb_fifo.c 898 0 525 0 892 +0.0%
typec_stm32.c 820 8 2 12 842 +0.0%
usbc.c 408 2 16 166 592 +0.0%
usbd.c 3167 57 88 276 3505 +0.0%
usbd_control.c 523 0 474 79 601 +0.0%
usbtmc_device.c 2169 24 71 287 2488 +0.0%
vendor_device.c 609 0 514 456 1064 +0.0%
video_device.c 4399 6 1851 476 4866 +0.0%
TOTAL 108641 1092 16464 44739 156544 +0.0%

Copy link
Owner

@hathach hathach left a comment

Choose a reason for hiding this comment

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

prefect, thank you, every changes make sense.

@hathach hathach merged commit 77fcf62 into master Dec 15, 2025
156 checks passed
@hathach hathach deleted the enum_catch branch December 15, 2025 10:55
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants