From: Hans de Goede <hansg@kernel.org>
To: Laurent Pinchart <laurent.pinchart@ideasonboard.com>, ostashow@gmail.com
Cc: 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 13:21:49 +0200 [thread overview]
Message-ID: <449eb143-37a8-4044-a071-63fe495c0213@kernel.org> (raw)
In-Reply-To: <20261019111712.GP595565@killaraus.ideasonboard.com>
Hi,
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.
Regards,
Hans
>
>> 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
>
next prev parent reply other threads:[~2026-10-19 11:21 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 [this message]
2026-10-19 11:27 ` Laurent Pinchart
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=449eb143-37a8-4044-a071-63fe495c0213@kernel.org \
--to=hansg@kernel.org \
--cc=laurent.pinchart@ideasonboard.com \
--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