Following yesterday feedback, I wrote a patch merging
usb_video_header_desc and usb_video_header_desc_all in uvideo.c .
Current kernel compile fine with it on amd64 and video display image.

At the moment, I can't test the patch on other platform. So I'm looking
for feedback, on the pattern used and if it change anything on
non-amd64. If those are positive, there is a couple of structure I would
alter in the same way.
Index: sys/dev/usb//uvideo.c
===================================================================
RCS file: /cvs/src/sys/dev/usb/uvideo.c,v
retrieving revision 1.181
diff -u -p -r1.181 uvideo.c
--- sys/dev/usb//uvideo.c       9 Jul 2015 14:58:32 -0000       1.181
+++ sys/dev/usb//uvideo.c       17 Jul 2015 11:03:48 -0000
@@ -84,7 +84,7 @@ struct uvideo_softc {
 
        int                                      sc_nframes;
        struct usb_video_probe_commit            sc_desc_probe;
-       struct usb_video_header_desc_all         sc_desc_vc_header;
+       struct usb_video_header_desc            *sc_desc_vc_header;
        struct usb_video_input_header_desc_all   sc_desc_vs_input_header;
 
 #define UVIDEO_MAX_PU                           8
@@ -694,16 +694,15 @@ uvideo_vc_parse_desc_header(struct uvide
 {
        struct usb_video_header_desc *d;
 
-       d = (struct usb_video_header_desc *)(uint8_t *)desc;
+       d = (struct usb_video_header_desc *)desc;
 
        if (d->bInCollection == 0) {
                printf("%s: no VS interface found!\n",
                    DEVNAME(sc));
                return (USBD_INVAL);
        }
-       
-       sc->sc_desc_vc_header.fix = d;
-       sc->sc_desc_vc_header.baInterfaceNr = (uByte *)(d + 1);
+
+       sc->sc_desc_vc_header = d;
 
        return (USBD_NORMAL_COMPLETION);
 }
@@ -838,7 +837,7 @@ uvideo_vs_parse_desc(struct uvideo_softc
        DPRINTF(1, "%s: number of total interfaces=%d\n",
            DEVNAME(sc), sc->sc_nifaces);
        DPRINTF(1, "%s: number of VS interfaces=%d\n",
-           DEVNAME(sc), sc->sc_desc_vc_header.fix->bInCollection);
+           DEVNAME(sc), sc->sc_desc_vc_header->bInCollection);
 
        usbd_desc_iter_init(sc->sc_udev, &iter);
        desc = usbd_desc_iter_next(&iter);
@@ -874,8 +873,8 @@ uvideo_vs_parse_desc(struct uvideo_softc
                return (error);
 
        /* parse interface collection */
-       for (i = 0; i < sc->sc_desc_vc_header.fix->bInCollection; i++) {
-               iface = sc->sc_desc_vc_header.baInterfaceNr[i];
+       for (i = 0; i < sc->sc_desc_vc_header->bInCollection; i++) {
+               iface = sc->sc_desc_vc_header->baInterfaceNr[i];
 
                id = usbd_get_interface_descriptor(&sc->sc_udev->ifaces[iface]);
                if (id == NULL) {
@@ -1500,12 +1499,12 @@ uvideo_vs_negotiation(struct uvideo_soft
                 * Some UVC 1.00 devices return dwMaxVideoFrameSize = 0.
                 * If so, fix it by format/frame descriptors.
                 */
-               hd = sc->sc_desc_vc_header.fix;
+               hd = sc->sc_desc_vc_header;
                if (UGETDW(pc->dwMaxVideoFrameSize) == 0 &&
                    UGETW(hd->bcdUVC) < 0x0110 ) {
                        DPRINTF(1, "%s: dwMaxVideoFrameSize == 0, fixed\n",
                            DEVNAME(sc));
-                       USETDW(pc->dwMaxVideoFrameSize, 
+                       USETDW(pc->dwMaxVideoFrameSize,
                            UGETDW(frame->dwMaxVideoFrameBufferSize));
                }
        }
Index: sys/dev/usb//uvideo.h
===================================================================
RCS file: /cvs/src/sys/dev/usb/uvideo.h,v
retrieving revision 1.57
diff -u -p -r1.57 uvideo.h
--- sys/dev/usb//uvideo.h       9 Jul 2015 14:58:32 -0000       1.57
+++ sys/dev/usb//uvideo.h       17 Jul 2015 11:03:48 -0000
@@ -162,13 +162,9 @@ struct usb_video_header_desc {
        uWord   wTotalLength;
        uDWord  dwClockFrequency;
        uByte   bInCollection;
+       uByte   baInterfaceNr[1];
 } __packed;
 
-struct usb_video_header_desc_all {
-       struct usb_video_header_desc    *fix;
-       uByte                           *baInterfaceNr;
-};
-
 /* Table 3-4: Input Terminal Descriptor */
 struct usb_video_input_terminal_desc {
        uByte   bLength;

Reply via email to