Index: uvc_video.c =================================================================== --- uvc_video.c (revision 163) +++ uvc_video.c (working copy) @@ -298,11 +298,17 @@ * toggled when the the buffer state is not UVC_BUF_STATE_ACTIVE. * queue->last_fid is initialized to -1, so the first isochronous * frame will always be in sync. + * + * If the device doesn't toggle the FID bit, invert video->last_fid + * when the EOF bit is set to force synchronisation on the next packet. */ if (buf->state != UVC_BUF_STATE_ACTIVE) { if (fid == video->last_fid) { uvc_trace(UVC_TRACE_FRAME, "Dropping payload (out of " "sync).\n"); + if ((video->dev->quirks & UVC_QUIRK_STREAM_NO_FID) && + (data[1] & UVC_STREAM_EOF)) + video->last_fid ^= UVC_STREAM_FID; return -ENODATA; } @@ -370,6 +376,8 @@ if (data[0] == len) uvc_trace(UVC_TRACE_FRAME, "EOF in empty payload.\n"); buf->state = UVC_BUF_STATE_DONE; + if (video->dev->quirks & UVC_QUIRK_STREAM_NO_FID) + video->last_fid ^= UVC_STREAM_FID; } } Index: uvc_driver.c =================================================================== --- uvc_driver.c (revision 165) +++ uvc_driver.c (working copy) @@ -1752,6 +1752,16 @@ .bInterfaceProtocol = 0, .driver_info = UVC_QUIRK_PROBE_MINMAX }, + /* Syntek (HP Spartan) */ + { .match_flags = USB_DEVICE_ID_MATCH_DEVICE + | USB_DEVICE_ID_MATCH_INT_INFO, + .idVendor = 0x174f, + .idProduct = 0x5212, + .bInterfaceClass = USB_CLASS_VIDEO, + .bInterfaceSubClass = 1, + .bInterfaceProtocol = 0, + .driver_info = UVC_QUIRK_STREAM_NO_FID + }, /* Ecamm Pico iMage */ { .match_flags = USB_DEVICE_ID_MATCH_DEVICE | USB_DEVICE_ID_MATCH_INT_INFO, Index: uvcvideo.h =================================================================== --- uvcvideo.h (revision 162) +++ uvcvideo.h (working copy) @@ -313,6 +313,7 @@ #define UVC_QUIRK_PROBE_MINMAX 0x00000002 #define UVC_QUIRK_PROBE_EXTRAFIELDS 0x00000004 #define UVC_QUIRK_BUILTIN_ISIGHT 0x00000008 +#define UVC_QUIRK_STREAM_NO_FID 0x00000010 /* Format flags */ #define UVC_FMT_FLAG_COMPRESSED 0x00000001