From cfe2430521ff1d62e99ecb6de7f09c6eeef281fb Mon Sep 17 00:00:00 2001 From: Brad Stein Date: Sat, 10 Jan 2026 13:26:54 -0300 Subject: [PATCH] uvc: clamp to configfs maxpacket --- server/src/bin/lesavka-uvc.rs | 22 ++++++++++++++++++++++ 1 file changed, 22 insertions(+) diff --git a/server/src/bin/lesavka-uvc.rs b/server/src/bin/lesavka-uvc.rs index 3eddecc..88b0420 100644 --- a/server/src/bin/lesavka-uvc.rs +++ b/server/src/bin/lesavka-uvc.rs @@ -301,6 +301,22 @@ impl UvcConfig { max_packet ); } + if let Some(cfg_max) = read_u32_file( + "/sys/kernel/config/usb_gadget/lesavka/functions/uvc.usb0/streaming_maxpacket", + ) { + if max_packet > cfg_max { + eprintln!( + "[lesavka-uvc] configfs maxpacket {}: clamp max_packet {} -> {}", + cfg_max, max_packet, cfg_max + ); + max_packet = cfg_max; + } else { + eprintln!( + "[lesavka-uvc] configfs maxpacket {}: max_packet {}", + cfg_max, max_packet + ); + } + } if env::var("LESAVKA_UVC_BULK").is_ok() { max_packet = max_packet.min(512); } else { @@ -773,6 +789,12 @@ fn env_u32_opt(name: &str) -> Option { env::var(name).ok().and_then(|v| v.parse::().ok()) } +fn read_u32_file(path: &str) -> Option { + std::fs::read_to_string(path) + .ok() + .and_then(|v| v.trim().parse::().ok()) +} + fn adjust_length(mut bytes: Vec, w_length: u16) -> Vec { let want = (w_length as usize).min(UVC_DATA_SIZE); if bytes.len() > want {