Commit 758dbc75 authored by Ricardo Ribalda's avatar Ricardo Ribalda Committed by Hans Verkuil
Browse files

media: uvcvideo: Use heuristic to find stream entity



Some devices, like the Grandstream GUV3100 webcam, have an invalid UVC
descriptor where multiple entities share the same ID, this is invalid
and makes it impossible to make a proper entity tree without heuristics.

We have recently introduced a change in the way that we handle invalid
entities that has caused a regression on broken devices.

Implement a new heuristic to handle these devices properly.

Reported-by: default avatarAngel4005 <ooara1337@gmail.com>
Closes: https://lore.kernel.org/linux-media/CAOzBiVuS7ygUjjhCbyWg-KiNx+HFTYnqH5+GJhd6cYsNLT=DaA@mail.gmail.com/


Fixes: 0e2ee702 ("media: uvcvideo: Mark invalid entities with id UVC_INVALID_ENTITY_ID")
Cc: stable@vger.kernel.org
Signed-off-by: default avatarRicardo Ribalda <ribalda@chromium.org>
Reviewed-by: default avatarHans de Goede <hansg@kernel.org>
Signed-off-by: default avatarHans Verkuil <hverkuil+cisco@kernel.org>
parent 7df699c2
Loading
Loading
Loading
Loading
+14 −1
Original line number Diff line number Diff line
@@ -167,13 +167,26 @@ static struct uvc_entity *uvc_entity_by_reference(struct uvc_device *dev,

static struct uvc_streaming *uvc_stream_by_id(struct uvc_device *dev, int id)
{
	struct uvc_streaming *stream;
	struct uvc_streaming *stream, *last_stream;
	unsigned int count = 0;

	list_for_each_entry(stream, &dev->streams, list) {
		count += 1;
		last_stream = stream;
		if (stream->header.bTerminalLink == id)
			return stream;
	}

	/*
	 * If the streaming entity is referenced by an invalid ID, notify the
	 * user and use heuristics to guess the correct entity.
	 */
	if (count == 1 && id == UVC_INVALID_ENTITY_ID) {
		dev_warn(&dev->intf->dev,
			 "UVC non compliance: Invalid USB header. The streaming entity has an invalid ID, guessing the correct one.");
		return last_stream;
	}

	return NULL;
}