Index | Thread | Search

From:
Kirill A. Korinsky <kirill@korins.ky>
Subject:
sys/uvideo: support devices which reports bulk and isochronous endpoints
To:
OpenBSD tech <tech@openbsd.org>
Cc:
mglocker@openbsd.org
Date:
Sat, 21 Dec 2024 00:35:41 +0100

Download raw body.

Thread
tech@,

A user send a debug log for Elgato HD60 S+ which reports both UE_BULK
and UE_ISOCHRONOUS endpoints.

The code selected endpoint with largest bandwidth, but vs->bulk_endpoint
depends on order of endpoints, and the last one is used, not selected one.

Ok?

Index: sys/dev/usb/uvideo.c
===================================================================
RCS file: /home/cvs/src/sys/dev/usb/uvideo.c,v
diff -u -p -r1.228 uvideo.c
--- sys/dev/usb/uvideo.c	14 Dec 2024 09:58:04 -0000	1.228
+++ sys/dev/usb/uvideo.c	20 Dec 2024 23:26:07 -0000
@@ -1204,6 +1204,7 @@ uvideo_vs_parse_desc_alt(struct uvideo_s
 	usb_interface_descriptor_t *id;
 	usb_endpoint_descriptor_t *ed;
 	uint8_t ep_dir, ep_type;
+	int bulk_endpoint;
 
 	vs = &sc->sc_vs_coll[vs_nr];
 
@@ -1248,9 +1249,9 @@ uvideo_vs_parse_desc_alt(struct uvideo_s
 		ep_dir = UE_GET_DIR(ed->bEndpointAddress);
 		ep_type = UE_GET_XFERTYPE(ed->bmAttributes);
 		if (ep_dir == UE_DIR_IN && ep_type == UE_ISOCHRONOUS)
-			vs->bulk_endpoint = 0;
+			bulk_endpoint = 0;
 		else if (ep_dir == UE_DIR_IN && ep_type == UE_BULK)
-			vs->bulk_endpoint = 1;
+			bulk_endpoint = 1;
 		else
 			goto next;
 
@@ -1262,6 +1263,7 @@ uvideo_vs_parse_desc_alt(struct uvideo_s
 			vs->curalt = id->bAlternateSetting;
 			vs->psize = UGETW(ed->wMaxPacketSize);
 			vs->iface = iface;
+			vs->bulk_endpoint = bulk_endpoint;
 		}
 next:
 		desc = usbd_desc_iter_next(&iter);


-- 
wbr, Kirill