Index | Thread | Search

From:
Kirill A. Korinsky <kirill@korins.ky>
Subject:
sys/uvideo: allow multiple frames per transfer
To:
OpenBSD tech <tech@openbsd.org>
Cc:
Marcus Glocker <mglocker@openbsd.org>
Date:
Tue, 04 Mar 2025 19:42:12 +0100

Download raw body.

Thread
tech@,

Section 2.4.3.2 of UVC Specification explicitly allows multiple frames
per one transfer and multiple transfers per one frame.

Ok?

Index: sys/dev/usb/uvideo.c
===================================================================
RCS file: /home/cvs/src/sys/dev/usb/uvideo.c,v
diff -u -p -r1.248 uvideo.c
--- sys/dev/usb/uvideo.c	1 Mar 2025 14:44:09 -0000	1.248
+++ sys/dev/usb/uvideo.c	4 Mar 2025 18:39:09 -0000
@@ -2331,12 +2331,6 @@ uvideo_vs_cb(struct usbd_xfer *xfer, voi
 	if (len == 0)
 		goto skip;

-	if (sc->sc_mmap_flag) {
-		if ((buf = uvideo_mmap_getbuf(sc)) == NULL)
-			goto skip;
-	} else
-		buf = sc->sc_frame_buffer.buf;
-
 	for (i = 0; i < sc->sc_nframes; i++) {
 		frame = ixfer->buf + (i * sc->sc_vs_cur->psize);
 		frame_size = ixfer->size[i];
@@ -2345,6 +2339,12 @@ uvideo_vs_cb(struct usbd_xfer *xfer, voi
 			/* frame is empty */
 			continue;

+		if (sc->sc_mmap_flag) {
+			if ((buf = uvideo_mmap_getbuf(sc)) == NULL)
+				goto skip;
+		} else
+			buf = sc->sc_frame_buffer.buf;
+
 		sc->sc_decode_stream_header(sc, frame, frame_size, buf);
 	}

@@ -2514,6 +2514,13 @@ uint8_t *
 uvideo_mmap_getbuf(struct uvideo_softc *sc)
 {
 	int i;
+
+	/*
+	 * Section 2.4.3.2 explicitly allows multiple frames per one
+	 * transfer and multiple transfers per one frame.
+	 */
+	if (sc->sc_mmap_cur != NULL)
+		return sc->sc_mmap_cur->buf;

 	if (sc->sc_mmap_count == 0 || sc->sc_mmap_buffer == NULL)
 		panic("%s: mmap buffers not allocated", __func__);