|
@@ -163,14 +163,27 @@ static void uvc_fixup_video_ctrl(struct uvc_streaming *stream,
|
|
|
}
|
|
|
}
|
|
|
|
|
|
+static size_t uvc_video_ctrl_size(struct uvc_streaming *stream)
|
|
|
+{
|
|
|
+ /*
|
|
|
+ * Return the size of the video probe and commit controls, which depends
|
|
|
+ * on the protocol version.
|
|
|
+ */
|
|
|
+ if (stream->dev->uvc_version < 0x0110)
|
|
|
+ return 26;
|
|
|
+ else if (stream->dev->uvc_version < 0x0150)
|
|
|
+ return 34;
|
|
|
+ else
|
|
|
+ return 48;
|
|
|
+}
|
|
|
+
|
|
|
static int uvc_get_video_ctrl(struct uvc_streaming *stream,
|
|
|
struct uvc_streaming_control *ctrl, int probe, u8 query)
|
|
|
{
|
|
|
+ u16 size = uvc_video_ctrl_size(stream);
|
|
|
u8 *data;
|
|
|
- u16 size;
|
|
|
int ret;
|
|
|
|
|
|
- size = stream->dev->uvc_version >= 0x0110 ? 34 : 26;
|
|
|
if ((stream->dev->quirks & UVC_QUIRK_PROBE_DEF) &&
|
|
|
query == UVC_GET_DEF)
|
|
|
return -EIO;
|
|
@@ -225,7 +238,7 @@ static int uvc_get_video_ctrl(struct uvc_streaming *stream,
|
|
|
ctrl->dwMaxVideoFrameSize = get_unaligned_le32(&data[18]);
|
|
|
ctrl->dwMaxPayloadTransferSize = get_unaligned_le32(&data[22]);
|
|
|
|
|
|
- if (size == 34) {
|
|
|
+ if (size >= 34) {
|
|
|
ctrl->dwClockFrequency = get_unaligned_le32(&data[26]);
|
|
|
ctrl->bmFramingInfo = data[30];
|
|
|
ctrl->bPreferedVersion = data[31];
|
|
@@ -254,11 +267,10 @@ out:
|
|
|
static int uvc_set_video_ctrl(struct uvc_streaming *stream,
|
|
|
struct uvc_streaming_control *ctrl, int probe)
|
|
|
{
|
|
|
+ u16 size = uvc_video_ctrl_size(stream);
|
|
|
u8 *data;
|
|
|
- u16 size;
|
|
|
int ret;
|
|
|
|
|
|
- size = stream->dev->uvc_version >= 0x0110 ? 34 : 26;
|
|
|
data = kzalloc(size, GFP_KERNEL);
|
|
|
if (data == NULL)
|
|
|
return -ENOMEM;
|
|
@@ -275,7 +287,7 @@ static int uvc_set_video_ctrl(struct uvc_streaming *stream,
|
|
|
put_unaligned_le32(ctrl->dwMaxVideoFrameSize, &data[18]);
|
|
|
put_unaligned_le32(ctrl->dwMaxPayloadTransferSize, &data[22]);
|
|
|
|
|
|
- if (size == 34) {
|
|
|
+ if (size >= 34) {
|
|
|
put_unaligned_le32(ctrl->dwClockFrequency, &data[26]);
|
|
|
data[30] = ctrl->bmFramingInfo;
|
|
|
data[31] = ctrl->bPreferedVersion;
|