From: Kirill A. Korinsky Subject: sys/uvideo: allow multiple frames per transfer To: OpenBSD tech Cc: Marcus Glocker Date: Tue, 04 Mar 2025 19:42:12 +0100 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__);