@@ -3188,6 +3188,15 @@ static const struct usb_device_id uvc_ids[] = {
.bInterfaceSubClass = 1,
.bInterfaceProtocol = 0,
.driver_info = UVC_INFO_META(V4L2_META_FMT_D4XX) },
+ /* Alcor Corp. Slave camera */
+ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE
+ | USB_DEVICE_ID_MATCH_INT_INFO,
+ .idVendor = 0x1b17,
+ .idProduct = 0x6684,
+ .bInterfaceClass = USB_CLASS_VIDEO,
+ .bInterfaceSubClass = 1,
+ .bInterfaceProtocol = 0,
+ .driver_info = UVC_INFO_QUIRK(UVC_QUIRK_OVERFLOW_BANDWIDTH) },
/* Generic USB Video Class */
{ USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, UVC_PC_PROTOCOL_UNDEFINED) },
{ USB_INTERFACE_INFO(USB_CLASS_VIDEO, 1, UVC_PC_PROTOCOL_15) },
@@ -262,6 +262,17 @@ static void uvc_fixup_video_ctrl(struct uvc_streaming *stream,
ctrl->dwMaxPayloadTransferSize = bandwidth;
}
+
+ if (format->flags & UVC_FMT_FLAG_COMPRESSED &&
+ stream->dev->quirks & UVC_QUIRK_OVERFLOW_BANDWIDTH &&
+ ctrl->dwMaxPayloadTransferSize > stream->maxpsize) {
+ dev_warn(&stream->intf->dev,
+ "the max payload transmission size (%d)"
+ "exceededs the size of the ep max packet (%d)."
+ "use the default value of 1024 bytes.\n",
+ ctrl->dwMaxPayloadTransferSize, stream->maxpsize);
+ ctrl->dwMaxPayloadTransferSize = 1024;
+ }
}
static size_t uvc_video_ctrl_size(struct uvc_streaming *stream)
@@ -77,6 +77,7 @@
#define UVC_QUIRK_DISABLE_AUTOSUSPEND 0x00008000
#define UVC_QUIRK_INVALID_DEVICE_SOF 0x00010000
#define UVC_QUIRK_MJPEG_NO_EOF 0x00020000
+#define UVC_QUIRK_OVERFLOW_BANDWIDTH 0x00040000
/* Format flags */
#define UVC_FMT_FLAG_COMPRESSED 0x00000001