From: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
To: Hans de Goede <hansg@kernel.org>
Cc: ostashow@gmail.com, Mauro Carvalho Chehab <mchehab@kernel.org>,
linux-media@vger.kernel.org, linux-kernel@vger.kernel.org,
stable@vger.kernel.org
Subject: Re: [PATCH] media: uvcvideo: Add quirk to retry SET_INTERFACE for SVBONY SV105C
Date: Mon, 19 Oct 2026 14:27:26 +0300 [thread overview]
Message-ID: <20261019112726.GR595565@killaraus.ideasonboard.com> (raw)
In-Reply-To: <449eb143-37a8-4044-a071-63fe495c0213@kernel.org>
On Mon, Oct 19, 2026 at 01:21:49PM +0200, Hans de Goede wrote:
> On 19-Oct-26 1:17 PM, Laurent Pinchart wrote:
> > On Mon, Oct 19, 2026 at 02:07:28PM +0300, Ostashow Constantine via B4 Relay wrote:
> >> From: Ostashow Constantine <ostashow@gmail.com>
> >>
> >> The SVBONY SV105C (0c45:636b, Sonix based) fails most SET_INTERFACE
> >> requests that select a streaming alternate setting right after a
> >> VS_COMMIT control. The request completes with -EPROTO, so
> >> VIDIOC_STREAMON fails and capture applications see the camera
> >> randomly failing to start.
> >>
> >> A usbmon capture of a failing VIDIOC_STREAMON:
> >>
> >> S Co:1:003:0 s 21 01 0200 0001 001a 26 = 01000104 15160500 ...
> >> C Co:1:003:0 0 26 >
> >> S Co:1:003:0 s 01 0b 0004 0001 0000 0
> >> C Co:1:003:0 -71 0
> >> S Co:1:003:0 s 01 0b 0000 0001 0000 0
> >> C Co:1:003:0 0 0
> >>
> >> The failure rate is around 80% and does not depend on the alternate
> >> setting (alt 1, the smallest one with 128 bytes per microframe, fails
> >> as often as alt 6), on a delay between VS_COMMIT and SET_INTERFACE
> >> (0 to 100 ms tested), or on USB autosuspend. SET_INTERFACE without a
> >> preceding VS_COMMIT succeeded 15 out of 15 times, and an immediate
> >> retry after the -EPROTO failure succeeded 15 out of 15 times. Once
> >> streaming has started, the camera works reliably. It also works with
> >> the Windows UVC driver.
> >
> > What does Windows do differently then ?
>
> I guess Windows always has a short-delay of at least one USB frame-time
> between the VS_COMMIT and SET_INTERFACE. I think we should simply add
> a flseep(1000) before the set_interface instead of adding a quirk for
> this.
The commit message says it doesn't help, but I can't tell if that can be
trusted.
> >> Add a UVC_QUIRK_RETRY_SET_INTERFACE quirk that retries SET_INTERFACE
> >> up to three times when it fails with -EPROTO, and enable it for the
> >> SV105C. With the quirk, 35 out of 35 stream starts succeeded, 29 of
> >> them needed a retry, and no start needed more than one.
> >>
> >> lsusb -v:
> >>
> >> Bus 001 Device 003: ID 0c45:636b Microdia SVBONY SV105C
> >> Negotiated speed: High Speed (480Mbps)
> >> Device Descriptor:
> >> bLength 18
> >> bDescriptorType 1
> >> bcdUSB 2.01
> >> bDeviceClass 239 Miscellaneous Device
> >> bDeviceSubClass 2 [unknown]
> >> bDeviceProtocol 1 Interface Association
> >> bMaxPacketSize0 64
> >> idVendor 0x0c45 Microdia
> >> idProduct 0x636b SVBONY SV105C
> >> bcdDevice 1.00
> >> iManufacturer 2 Sonix Technology Co., Ltd.
> >> iProduct 1 SVBONY SV105C
> >> iSerial 3 SN0001
> >> bNumConfigurations 1
> >> Configuration Descriptor:
> >> bLength 9
> >> bDescriptorType 2
> >> wTotalLength 0x032e
> >> bNumInterfaces 2
> >> bConfigurationValue 1
> >> iConfiguration 0
> >> bmAttributes 0x80
> >> (Bus Powered)
> >> MaxPower 500mA
> >> Interface Association:
> >> bLength 8
> >> bDescriptorType 11
> >> bFirstInterface 0
> >> bInterfaceCount 2
> >> bFunctionClass 14 Video
> >> bFunctionSubClass 3 Video Interface Collection
> >> bFunctionProtocol 0
> >> iFunction 5
> >> Interface Descriptor:
> >> bLength 9
> >> bDescriptorType 4
> >> bInterfaceNumber 0
> >> bAlternateSetting 0
> >> bNumEndpoints 1
> >> bInterfaceClass 14 Video
> >> bInterfaceSubClass 1 Video Control
> >> bInterfaceProtocol 0
> >> iInterface 5
> >> VideoControl Interface Descriptor:
> >> bLength 13
> >> bDescriptorType 36
> >> bDescriptorSubtype 1 (HEADER)
> >> bcdUVC 1.00
> >> wTotalLength 0x0050
> >> dwClockFrequency 15.000000MHz
> >> bInCollection 1
> >> baInterfaceNr( 0) 1
> >> VideoControl Interface Descriptor:
> >> bLength 9
> >> bDescriptorType 36
> >> bDescriptorSubtype 3 (OUTPUT_TERMINAL)
> >> bTerminalID 4
> >> wTerminalType 0x0101 USB Streaming
> >> bAssocTerminal 0
> >> bSourceID 3
> >> iTerminal 0
> >> VideoControl Interface Descriptor:
> >> bLength 29
> >> bDescriptorType 36
> >> bDescriptorSubtype 6 (EXTENSION_UNIT)
> >> bUnitID 3
> >> guidExtensionCode {28f03370-6311-4a2e-ba2c-6890eb334016}
> >> bNumControls 32
> >> bNrInPins 1
> >> baSourceID( 0) 2
> >> bControlSize 4
> >> bmControls( 0) 0x9f
> >> bmControls( 1) 0x07
> >> bmControls( 2) 0x07
> >> bmControls( 3) 0x07
> >> iExtension 0
> >> VideoControl Interface Descriptor:
> >> bLength 18
> >> bDescriptorType 36
> >> bDescriptorSubtype 2 (INPUT_TERMINAL)
> >> bTerminalID 1
> >> wTerminalType 0x0201 Camera Sensor
> >> bAssocTerminal 0
> >> iTerminal 0
> >> wObjectiveFocalLengthMin 0
> >> wObjectiveFocalLengthMax 0
> >> wOcularFocalLength 0
> >> bControlSize 3
> >> bmControls 0x0000000e
> >> Auto-Exposure Mode
> >> Auto-Exposure Priority
> >> Exposure Time (Absolute)
> >> VideoControl Interface Descriptor:
> >> bLength 11
> >> bDescriptorType 36
> >> bDescriptorSubtype 5 (PROCESSING_UNIT)
> >> Warning: Descriptor too short
> >> bUnitID 2
> >> bSourceID 1
> >> wMaxMultiplier 0
> >> bControlSize 2
> >> bmControls 0x0000177f
> >> Brightness
> >> Contrast
> >> Hue
> >> Saturation
> >> Sharpness
> >> Gamma
> >> White Balance Temperature
> >> Backlight Compensation
> >> Gain
> >> Power Line Frequency
> >> White Balance Temperature, Auto
> >> iProcessing 0
> >> bmVideoStandards 0x31
> >> None
> >> NTSC - 625/50
> >> PAL - 525/60
> >> Endpoint Descriptor:
> >> bLength 7
> >> bDescriptorType 5
> >> bEndpointAddress 0x83 EP 3 IN
> >> bmAttributes 3
> >> Transfer Type Interrupt
> >> Synch Type None
> >> Usage Type Data
> >> wMaxPacketSize 0x0010 1x 16 bytes
> >> bInterval 6
> >> VideoControl Endpoint Descriptor:
> >> bLength 5
> >> bDescriptorType 37
> >> bDescriptorSubtype 3 (EP_INTERRUPT)
> >> wMaxTransferSize 128
> >> Interface Descriptor:
> >> bLength 9
> >> bDescriptorType 4
> >> bInterfaceNumber 1
> >> bAlternateSetting 0
> >> bNumEndpoints 0
> >> bInterfaceClass 14 Video
> >> bInterfaceSubClass 2 Video Streaming
> >> bInterfaceProtocol 0
> >> iInterface 0
> >> VideoStreaming Interface Descriptor:
> >> bLength 15
> >> bDescriptorType 36
> >> bDescriptorSubtype 1 (INPUT_HEADER)
> >> bNumFormats 2
> >> wTotalLength 0x024f
> >> bEndpointAddress 0x81 EP 1 IN
> >> bmInfo 0
> >> bTerminalLink 4
> >> bStillCaptureMethod 2
> >> bTriggerSupport 1
> >> bTriggerUsage 1
> >> bControlSize 1
> >> bmaControls( 0) 0
> >> bmaControls( 1) 0
> >> VideoStreaming Interface Descriptor:
> >> bLength 11
> >> bDescriptorType 36
> >> bDescriptorSubtype 6 (FORMAT_MJPEG)
> >> bFormatIndex 1
> >> bNumFrameDescriptors 8
> >> bFlags 0
> >> Fixed-size samples: No
> >> bDefaultFrameIndex 1
> >> bAspectRatioX 0
> >> bAspectRatioY 0
> >> bmInterlaceFlags 0x00
> >> Interlaced stream or variable: No
> >> Fields per frame: 1 fields
> >> Field 1 first: No
> >> Field pattern: Field 1 only
> >> bCopyProtect 0
> >> VideoStreaming Interface Descriptor:
> >> bLength 30
> >> bDescriptorType 36
> >> bDescriptorSubtype 7 (FRAME_MJPEG)
> >> bFrameIndex 1
> >> bmCapabilities 0x00
> >> Still image unsupported
> >> wWidth 1920
> >> wHeight 1080
> >> dwMinBitRate 995328000
> >> dwMaxBitRate 995328000
> >> dwMaxVideoFrameBufferSize 4147789
> >> dwDefaultFrameInterval 333333
> >> bFrameIntervalType 1
> >> dwFrameInterval( 0) 333333
> >> VideoStreaming Interface Descriptor:
> >> bLength 30
> >> bDescriptorType 36
> >> bDescriptorSubtype 7 (FRAME_MJPEG)
> >> bFrameIndex 2
> >> bmCapabilities 0x00
> >> Still image unsupported
> >> wWidth 1280
> >> wHeight 1024
> >> dwMinBitRate 629145600
> >> dwMaxBitRate 629145600
> >> dwMaxVideoFrameBufferSize 2622029
> >> dwDefaultFrameInterval 333333
> >> bFrameIntervalType 1
> >> dwFrameInterval( 0) 333333
> >> VideoStreaming Interface Descriptor:
> >> bLength 30
> >> bDescriptorType 36
> >> bDescriptorSubtype 7 (FRAME_MJPEG)
> >> bFrameIndex 3
> >> bmCapabilities 0x00
> >> Still image unsupported
> >> wWidth 1280
> >> wHeight 960
> >> dwMinBitRate 589824000
> >> dwMaxBitRate 589824000
> >> dwMaxVideoFrameBufferSize 2458189
> >> dwDefaultFrameInterval 333333
> >> bFrameIntervalType 1
> >> dwFrameInterval( 0) 333333
> >> VideoStreaming Interface Descriptor:
> >> bLength 30
> >> bDescriptorType 36
> >> bDescriptorSubtype 7 (FRAME_MJPEG)
> >> bFrameIndex 4
> >> bmCapabilities 0x00
> >> Still image unsupported
> >> wWidth 1280
> >> wHeight 720
> >> dwMinBitRate 442368000
> >> dwMaxBitRate 442368000
> >> dwMaxVideoFrameBufferSize 1843789
> >> dwDefaultFrameInterval 333333
> >> bFrameIntervalType 1
> >> dwFrameInterval( 0) 333333
> >> VideoStreaming Interface Descriptor:
> >> bLength 30
> >> bDescriptorType 36
> >> bDescriptorSubtype 7 (FRAME_MJPEG)
> >> bFrameIndex 5
> >> bmCapabilities 0x00
> >> Still image unsupported
> >> wWidth 800
> >> wHeight 600
> >> dwMinBitRate 230400000
> >> dwMaxBitRate 230400000
> >> dwMaxVideoFrameBufferSize 960589
> >> dwDefaultFrameInterval 333333
> >> bFrameIntervalType 1
> >> dwFrameInterval( 0) 333333
> >> VideoStreaming Interface Descriptor:
> >> bLength 30
> >> bDescriptorType 36
> >> bDescriptorSubtype 7 (FRAME_MJPEG)
> >> bFrameIndex 6
> >> bmCapabilities 0x00
> >> Still image unsupported
> >> wWidth 640
> >> wHeight 480
> >> dwMinBitRate 147456000
> >> dwMaxBitRate 147456000
> >> dwMaxVideoFrameBufferSize 614989
> >> dwDefaultFrameInterval 333333
> >> bFrameIntervalType 1
> >> dwFrameInterval( 0) 333333
> >> VideoStreaming Interface Descriptor:
> >> bLength 30
> >> bDescriptorType 36
> >> bDescriptorSubtype 7 (FRAME_MJPEG)
> >> bFrameIndex 7
> >> bmCapabilities 0x00
> >> Still image unsupported
> >> wWidth 480
> >> wHeight 640
> >> dwMinBitRate 147456000
> >> dwMaxBitRate 147456000
> >> dwMaxVideoFrameBufferSize 614989
> >> dwDefaultFrameInterval 333333
> >> bFrameIntervalType 1
> >> dwFrameInterval( 0) 333333
> >> VideoStreaming Interface Descriptor:
> >> bLength 30
> >> bDescriptorType 36
> >> bDescriptorSubtype 7 (FRAME_MJPEG)
> >> bFrameIndex 8
> >> bmCapabilities 0x00
> >> Still image unsupported
> >> wWidth 1920
> >> wHeight 1080
> >> dwMinBitRate 995328000
> >> dwMaxBitRate 995328000
> >> dwMaxVideoFrameBufferSize 4147789
> >> dwDefaultFrameInterval 333333
> >> bFrameIntervalType 1
> >> dwFrameInterval( 0) 333333
> >> VideoStreaming Interface Descriptor:
> >> bLength 34
> >> bDescriptorType 36
> >> bDescriptorSubtype 3 (STILL_IMAGE_FRAME)
> >> bEndpointAddress 0x00 EP 0 OUT
> >> bNumImageSizePatterns 7
> >> wWidth( 0) 1920
> >> wHeight( 0) 1080
> >> wWidth( 1) 1280
> >> wHeight( 1) 720
> >> wWidth( 2) 800
> >> wHeight( 2) 600
> >> wWidth( 3) 640
> >> wHeight( 3) 480
> >> wWidth( 4) 640
> >> wHeight( 4) 360
> >> wWidth( 5) 320
> >> wHeight( 5) 240
> >> wWidth( 6) 320
> >> wHeight( 6) 180
> >> bNumCompressionPatterns 0
> >> VideoStreaming Interface Descriptor:
> >> bLength 27
> >> bDescriptorType 36
> >> bDescriptorSubtype 4 (FORMAT_UNCOMPRESSED)
> >> bFormatIndex 2
> >> bNumFrameDescriptors 8
> >> guidFormat {32595559-0000-0010-8000-00aa00389b71}
> >> bBitsPerPixel 16
> >> bDefaultFrameIndex 1
> >> bAspectRatioX 0
> >> bAspectRatioY 0
> >> bmInterlaceFlags 0x00
> >> Interlaced stream or variable: No
> >> Fields per frame: 2 fields
> >> Field 1 first: No
> >> Field pattern: Field 1 only
> >> bCopyProtect 0
> >> VideoStreaming Interface Descriptor:
> >> bLength 30
> >> bDescriptorType 36
> >> bDescriptorSubtype 5 (FRAME_UNCOMPRESSED)
> >> bFrameIndex 1
> >> bmCapabilities 0x00
> >> Still image unsupported
> >> wWidth 1920
> >> wHeight 1080
> >> dwMinBitRate 165888000
> >> dwMaxBitRate 165888000
> >> dwMaxVideoFrameBufferSize 4147200
> >> dwDefaultFrameInterval 2000000
> >> bFrameIntervalType 1
> >> dwFrameInterval( 0) 2000000
> >> VideoStreaming Interface Descriptor:
> >> bLength 30
> >> bDescriptorType 36
> >> bDescriptorSubtype 5 (FRAME_UNCOMPRESSED)
> >> bFrameIndex 2
> >> bmCapabilities 0x00
> >> Still image unsupported
> >> wWidth 1280
> >> wHeight 1024
> >> dwMinBitRate 104857600
> >> dwMaxBitRate 104857600
> >> dwMaxVideoFrameBufferSize 2621440
> >> dwDefaultFrameInterval 2000000
> >> bFrameIntervalType 1
> >> dwFrameInterval( 0) 2000000
> >> VideoStreaming Interface Descriptor:
> >> bLength 30
> >> bDescriptorType 36
> >> bDescriptorSubtype 5 (FRAME_UNCOMPRESSED)
> >> bFrameIndex 3
> >> bmCapabilities 0x00
> >> Still image unsupported
> >> wWidth 1280
> >> wHeight 960
> >> dwMinBitRate 98304000
> >> dwMaxBitRate 98304000
> >> dwMaxVideoFrameBufferSize 2457600
> >> dwDefaultFrameInterval 2000000
> >> bFrameIntervalType 1
> >> dwFrameInterval( 0) 2000000
> >> VideoStreaming Interface Descriptor:
> >> bLength 30
> >> bDescriptorType 36
> >> bDescriptorSubtype 5 (FRAME_UNCOMPRESSED)
> >> bFrameIndex 4
> >> bmCapabilities 0x00
> >> Still image unsupported
> >> wWidth 1280
> >> wHeight 720
> >> dwMinBitRate 147456000
> >> dwMaxBitRate 147456000
> >> dwMaxVideoFrameBufferSize 1843200
> >> dwDefaultFrameInterval 1000000
> >> bFrameIntervalType 1
> >> dwFrameInterval( 0) 1000000
> >> VideoStreaming Interface Descriptor:
> >> bLength 30
> >> bDescriptorType 36
> >> bDescriptorSubtype 5 (FRAME_UNCOMPRESSED)
> >> bFrameIndex 5
> >> bmCapabilities 0x00
> >> Still image unsupported
> >> wWidth 800
> >> wHeight 600
> >> dwMinBitRate 153600000
> >> dwMaxBitRate 153600000
> >> dwMaxVideoFrameBufferSize 960000
> >> dwDefaultFrameInterval 500000
> >> bFrameIntervalType 1
> >> dwFrameInterval( 0) 500000
> >> VideoStreaming Interface Descriptor:
> >> bLength 30
> >> bDescriptorType 36
> >> bDescriptorSubtype 5 (FRAME_UNCOMPRESSED)
> >> bFrameIndex 6
> >> bmCapabilities 0x00
> >> Still image unsupported
> >> wWidth 640
> >> wHeight 480
> >> dwMinBitRate 147456000
> >> dwMaxBitRate 147456000
> >> dwMaxVideoFrameBufferSize 614400
> >> dwDefaultFrameInterval 333333
> >> bFrameIntervalType 1
> >> dwFrameInterval( 0) 333333
> >> VideoStreaming Interface Descriptor:
> >> bLength 30
> >> bDescriptorType 36
> >> bDescriptorSubtype 5 (FRAME_UNCOMPRESSED)
> >> bFrameIndex 7
> >> bmCapabilities 0x00
> >> Still image unsupported
> >> wWidth 480
> >> wHeight 640
> >> dwMinBitRate 147456000
> >> dwMaxBitRate 147456000
> >> dwMaxVideoFrameBufferSize 614400
> >> dwDefaultFrameInterval 333333
> >> bFrameIntervalType 1
> >> dwFrameInterval( 0) 333333
> >> VideoStreaming Interface Descriptor:
> >> bLength 30
> >> bDescriptorType 36
> >> bDescriptorSubtype 5 (FRAME_UNCOMPRESSED)
> >> bFrameIndex 8
> >> bmCapabilities 0x00
> >> Still image unsupported
> >> wWidth 1920
> >> wHeight 1080
> >> dwMinBitRate 165888000
> >> dwMaxBitRate 165888000
> >> dwMaxVideoFrameBufferSize 4147200
> >> dwDefaultFrameInterval 2000000
> >> bFrameIntervalType 1
> >> dwFrameInterval( 0) 2000000
> >> VideoStreaming Interface Descriptor:
> >> bLength 18
> >> bDescriptorType 36
> >> bDescriptorSubtype 3 (STILL_IMAGE_FRAME)
> >> bEndpointAddress 0x00 EP 0 OUT
> >> bNumImageSizePatterns 3
> >> wWidth( 0) 1920
> >> wHeight( 0) 1080
> >> wWidth( 1) 1280
> >> wHeight( 1) 720
> >> wWidth( 2) 640
> >> wHeight( 2) 480
> >> bNumCompressionPatterns 0
> >> VideoStreaming Interface Descriptor:
> >> bLength 6
> >> bDescriptorType 36
> >> bDescriptorSubtype 13 (COLORFORMAT)
> >> bColorPrimaries 1 (BT.709,sRGB)
> >> bTransferCharacteristics 1 (BT.709)
> >> bMatrixCoefficients 4 (SMPTE 170M (BT.601))
> >> Interface Descriptor:
> >> bLength 9
> >> bDescriptorType 4
> >> bInterfaceNumber 1
> >> bAlternateSetting 1
> >> bNumEndpoints 1
> >> bInterfaceClass 14 Video
> >> bInterfaceSubClass 2 Video Streaming
> >> bInterfaceProtocol 0
> >> iInterface 0
> >> Endpoint Descriptor:
> >> bLength 7
> >> bDescriptorType 5
> >> bEndpointAddress 0x81 EP 1 IN
> >> bmAttributes 5
> >> Transfer Type Isochronous
> >> Synch Type Asynchronous
> >> Usage Type Data
> >> wMaxPacketSize 0x0080 1x 128 bytes
> >> bInterval 1
> >> Interface Descriptor:
> >> bLength 9
> >> bDescriptorType 4
> >> bInterfaceNumber 1
> >> bAlternateSetting 2
> >> bNumEndpoints 1
> >> bInterfaceClass 14 Video
> >> bInterfaceSubClass 2 Video Streaming
> >> bInterfaceProtocol 0
> >> iInterface 0
> >> Endpoint Descriptor:
> >> bLength 7
> >> bDescriptorType 5
> >> bEndpointAddress 0x81 EP 1 IN
> >> bmAttributes 5
> >> Transfer Type Isochronous
> >> Synch Type Asynchronous
> >> Usage Type Data
> >> wMaxPacketSize 0x0100 1x 256 bytes
> >> bInterval 1
> >> Interface Descriptor:
> >> bLength 9
> >> bDescriptorType 4
> >> bInterfaceNumber 1
> >> bAlternateSetting 3
> >> bNumEndpoints 1
> >> bInterfaceClass 14 Video
> >> bInterfaceSubClass 2 Video Streaming
> >> bInterfaceProtocol 0
> >> iInterface 0
> >> Endpoint Descriptor:
> >> bLength 7
> >> bDescriptorType 5
> >> bEndpointAddress 0x81 EP 1 IN
> >> bmAttributes 5
> >> Transfer Type Isochronous
> >> Synch Type Asynchronous
> >> Usage Type Data
> >> wMaxPacketSize 0x0320 1x 800 bytes
> >> bInterval 1
> >> Interface Descriptor:
> >> bLength 9
> >> bDescriptorType 4
> >> bInterfaceNumber 1
> >> bAlternateSetting 4
> >> bNumEndpoints 1
> >> bInterfaceClass 14 Video
> >> bInterfaceSubClass 2 Video Streaming
> >> bInterfaceProtocol 0
> >> iInterface 0
> >> Endpoint Descriptor:
> >> bLength 7
> >> bDescriptorType 5
> >> bEndpointAddress 0x81 EP 1 IN
> >> bmAttributes 5
> >> Transfer Type Isochronous
> >> Synch Type Asynchronous
> >> Usage Type Data
> >> wMaxPacketSize 0x0b20 2x 800 bytes
> >> bInterval 1
> >> Interface Descriptor:
> >> bLength 9
> >> bDescriptorType 4
> >> bInterfaceNumber 1
> >> bAlternateSetting 5
> >> bNumEndpoints 1
> >> bInterfaceClass 14 Video
> >> bInterfaceSubClass 2 Video Streaming
> >> bInterfaceProtocol 0
> >> iInterface 0
> >> Endpoint Descriptor:
> >> bLength 7
> >> bDescriptorType 5
> >> bEndpointAddress 0x81 EP 1 IN
> >> bmAttributes 5
> >> Transfer Type Isochronous
> >> Synch Type Asynchronous
> >> Usage Type Data
> >> wMaxPacketSize 0x1320 3x 800 bytes
> >> bInterval 1
> >> Interface Descriptor:
> >> bLength 9
> >> bDescriptorType 4
> >> bInterfaceNumber 1
> >> bAlternateSetting 6
> >> bNumEndpoints 1
> >> bInterfaceClass 14 Video
> >> bInterfaceSubClass 2 Video Streaming
> >> bInterfaceProtocol 0
> >> iInterface 0
> >> Endpoint Descriptor:
> >> bLength 7
> >> bDescriptorType 5
> >> bEndpointAddress 0x81 EP 1 IN
> >> bmAttributes 5
> >> Transfer Type Isochronous
> >> Synch Type Asynchronous
> >> Usage Type Data
> >> wMaxPacketSize 0x1400 3x 1024 bytes
> >> bInterval 1
> >>
> >> Cc: stable@vger.kernel.org
> >> Assisted-by: claude-opus-5-5
> >> Signed-off-by: Ostashow Constantine <ostashow@gmail.com>
> >> ---
> >> Notes for reviewers (not part of the commit message):
> >>
> >> Testing:
> >> - Runtime-tested on a Raspberry Pi 4 (VL805 xHCI) running 6.18.57, with
> >> this patch applied to the 6.18.57 uvcvideo sources (it applies with
> >> line offsets only). Results are in the commit message. Before the
> >> patch, 3/20 and 5/20 stream starts succeeded.
> >> - Built with W=1 without new warnings: as part of the 6.18.57 module,
> >> and the patched media/next sources against 6.18 headers plus the
> >> media/next include/linux/usb/uvc.h.
> >> - Not runtime-tested on media/next itself, and not tested on other host
> >> controllers (e.g. x86 xHCI). I can't tell whether the failure depends
> >> on the host controller.
> >>
> >> Tool disclosure (Documentation/process/generated-content.rst):
> >> The root-cause analysis (usbmon capture, libusb experiments varying the
> >> alternate setting, the delay after VS_COMMIT and retries), the patch and
> >> this changelog were produced by an AI coding assistant (Claude Code,
> >> claude-opus-5-5) in an interactive session, at my request, on my
> >> hardware. I have reviewed the patch and take responsibility for it.
> >> ---
> >> drivers/media/usb/uvc/uvc_driver.c | 9 +++++++++
> >> drivers/media/usb/uvc/uvc_video.c | 14 ++++++++++++++
> >> drivers/media/usb/uvc/uvcvideo.h | 1 +
> >> 3 files changed, 24 insertions(+)
> >>
> >> diff --git a/drivers/media/usb/uvc/uvc_driver.c b/drivers/media/usb/uvc/uvc_driver.c
> >> index cbc145697..9e1f855cd 100644
> >> --- a/drivers/media/usb/uvc/uvc_driver.c
> >> +++ b/drivers/media/usb/uvc/uvc_driver.c
> >> @@ -2928,6 +2928,15 @@ static const struct usb_device_id uvc_ids[] = {
> >> .bInterfaceSubClass = 1,
> >> .bInterfaceProtocol = 0,
> >> .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_MJPEG_NO_EOF) },
> >> + /* SVBONY SV105C */
> >> + { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
> >> + | USB_DEVICE_ID_MATCH_INT_INFO,
> >> + .idVendor = 0x0c45,
> >> + .idProduct = 0x636b,
> >> + .bInterfaceClass = USB_CLASS_VIDEO,
> >> + .bInterfaceSubClass = 1,
> >> + .bInterfaceProtocol = 0,
> >> + .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_RETRY_SET_INTERFACE) },
> >> /* MT6227 */
> >> { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
> >> | USB_DEVICE_ID_MATCH_INT_INFO,
> >> diff --git a/drivers/media/usb/uvc/uvc_video.c b/drivers/media/usb/uvc/uvc_video.c
> >> index a92a986ab..3a3b1d1d7 100644
> >> --- a/drivers/media/usb/uvc/uvc_video.c
> >> +++ b/drivers/media/usb/uvc/uvc_video.c
> >> @@ -2100,6 +2100,20 @@ static int uvc_video_start_transfer(struct uvc_streaming *stream,
> >> }
> >>
> >> ret = usb_set_interface(stream->dev->udev, intfnum, altsetting);
> >> +
> >> + /*
> >> + * Some devices, namely the SVBONY SV105C, fail most of the
> >> + * SET_INTERFACE requests that follow a VS_COMMIT control with
> >> + * a protocol error. Retrying the request immediately succeeds.
> >> + */
> >> + for (i = 0; ret == -EPROTO && i < 3 &&
> >> + (stream->dev->quirks & UVC_QUIRK_RETRY_SET_INTERFACE); ++i) {
> >> + uvc_dbg(stream->dev, VIDEO,
> >> + "SET_INTERFACE failed (%d), retrying\n", ret);
> >> + ret = usb_set_interface(stream->dev->udev, intfnum,
> >> + altsetting);
> >> + }
> >> +
> >> if (ret < 0)
> >> return ret;
> >>
> >> diff --git a/drivers/media/usb/uvc/uvcvideo.h b/drivers/media/usb/uvc/uvcvideo.h
> >> index af8cef94f..19851c3d2 100644
> >> --- a/drivers/media/usb/uvc/uvcvideo.h
> >> +++ b/drivers/media/usb/uvc/uvcvideo.h
> >> @@ -81,6 +81,7 @@
> >> #define UVC_QUIRK_INVALID_DEVICE_SOF 0x00010000
> >> #define UVC_QUIRK_MJPEG_NO_EOF 0x00020000
> >> #define UVC_QUIRK_MSXU_META 0x00040000
> >> +#define UVC_QUIRK_RETRY_SET_INTERFACE 0x00080000
> >>
> >> /* Format flags */
> >> #define UVC_FMT_FLAG_COMPRESSED 0x00000001
> >>
> >> ---
> >> base-commit: d7e7bca7169873b46e857c025c10f3336c1258d8
> >> change-id: 20261019-sv105c-retry-set-interface-759a92a1e7b5
--
Regards,
Laurent Pinchart
next prev parent reply other threads:[~2026-10-19 11:27 UTC|newest]
Thread overview: 8+ messages / expand[flat|nested] mbox.gz Atom feed top
2026-10-19 11:07 [PATCH] media: uvcvideo: Add quirk to retry SET_INTERFACE for SVBONY SV105C Ostashow Constantine via B4 Relay
2026-10-19 11:17 ` Laurent Pinchart
2026-10-19 11:21 ` Hans de Goede
2026-10-19 11:27 ` Laurent Pinchart [this message]
2026-10-19 11:58 ` Константин Осташов
2026-10-19 12:33 ` Hans de Goede
2026-10-19 12:38 ` Laurent Pinchart
2026-10-19 12:20 ` Ostashow Constantine
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20261019112726.GR595565@killaraus.ideasonboard.com \
--to=laurent.pinchart@ideasonboard.com \
--cc=hansg@kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=linux-media@vger.kernel.org \
--cc=mchehab@kernel.org \
--cc=ostashow@gmail.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox