From fb9c7b9813e6d9e071750801e8e4067c89b3b1dc Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Tue, 28 Apr 2026 11:04:28 -0300 Subject: [PATCH] fix(sync): match uvc descriptors to gadget speed --- scripts/daemon/lesavka-core.sh | 23 ++++++++++++++---- testing/tests/server_core_script_contract.rs | 25 ++++++++++++++++++-- 2 files changed, 41 insertions(+), 7 deletions(-) diff --git a/scripts/daemon/lesavka-core.sh b/scripts/daemon/lesavka-core.sh index 386fb5d..b736d11 100755 --- a/scripts/daemon/lesavka-core.sh +++ b/scripts/daemon/lesavka-core.sh @@ -505,7 +505,19 @@ EOF fi popd >/dev/null - for s in fs hs ss; do + streaming_class_speeds=(fs) + control_class_speeds=(fs) + case "$MAX_SPEED" in + super-speed|super-speed-plus) + streaming_class_speeds+=(hs ss) + control_class_speeds+=(ss) + ;; + high-speed) + streaming_class_speeds+=(hs) + ;; + esac + + for s in "${streaming_class_speeds[@]}"; do mkdir -p "$F/streaming/class/$s" pushd "$F/streaming/class/$s" >/dev/null ln -s ../../header/h h @@ -514,11 +526,12 @@ EOF # ── 4. Video‑Control interface ───────────────────────────────────── mkdir -p "$F/control/header/h" - # The kernel UVC gadget docs require direct symlinks at control/class/fs and - # control/class/ss. High-speed control descriptors are not exposed here. + # The kernel UVC gadget docs make the control-speed links optional; only + # advertise the descriptor sets that match the configured gadget speed. pushd "$F/control" >/dev/null - ln -s header/h class/fs 2>/dev/null || true - ln -s header/h class/ss 2>/dev/null || true + for s in "${control_class_speeds[@]}"; do + ln -s header/h "class/$s" 2>/dev/null || true + done popd >/dev/null if [[ -n $UVC_DISABLE_IRQ ]]; then diff --git a/testing/tests/server_core_script_contract.rs b/testing/tests/server_core_script_contract.rs index 6e1de34..edf130f 100644 --- a/testing/tests/server_core_script_contract.rs +++ b/testing/tests/server_core_script_contract.rs @@ -43,8 +43,9 @@ fn core_script_skips_soft_connect_for_dwc2() { fn core_script_uses_kernel_doc_control_header_links() { for expected in [ "pushd \"$F/control\" >/dev/null", - "ln -s header/h class/fs", - "ln -s header/h class/ss", + "ln -s header/h \"class/$s\"", + "control_class_speeds=(fs)", + "for s in \"${control_class_speeds[@]}\"; do", ] { assert!( CORE_SCRIPT.contains(expected), @@ -56,3 +57,23 @@ fn core_script_uses_kernel_doc_control_header_links() { "lesavka-core should not build the UVC control class as nested directories" ); } + +#[test] +fn core_script_matches_uvc_descriptor_speeds_to_max_speed() { + for expected in [ + "streaming_class_speeds=(fs)", + "control_class_speeds=(fs)", + "case \"$MAX_SPEED\" in", + "super-speed|super-speed-plus)", + "streaming_class_speeds+=(hs ss)", + "control_class_speeds+=(ss)", + "high-speed)", + "streaming_class_speeds+=(hs)", + "for s in \"${streaming_class_speeds[@]}\"; do", + ] { + assert!( + CORE_SCRIPT.contains(expected), + "lesavka-core speed guard missing: {expected}" + ); + } +}