3/4: In uvideo_vs_set_alt(), according to the comment within
     while()-loop searches for an endpoint with requested
     bandwidth, or best match. An iterator index (int i) is used
     in the while()-loop, and eventually its value is used in
     usbd_set_interface().

     Is the "matched" interface's bAlternateSetting not the
     correct value to be used?

Index: uvideo.c
===================================================================
RCS file: /cvs/obsd/src/sys/dev/usb/uvideo.c,v
retrieving revision 1.185
diff -u -p -u -p -r1.185 uvideo.c
--- uvideo.c    17 May 2016 08:27:17 -0000      1.185
+++ uvideo.c    17 May 2016 22:55:34 -0000
@@ -1223,11 +1223,10 @@ uvideo_vs_set_alt(struct uvideo_softc *s
        const usb_descriptor_t *desc;
        usb_interface_descriptor_t *id;
        usb_endpoint_descriptor_t *ed;
-       int i, diff, best_diff = INT_MAX;
+       int diff, best_diff = INT_MAX;
        usbd_status error;
        uint32_t psize;
 
-       i = 0;
        usbd_desc_iter_init(sc->sc_udev, &iter);
        desc = usbd_desc_iter_next(&iter);
        while (desc) {
@@ -1245,7 +1244,6 @@ uvideo_vs_set_alt(struct uvideo_softc *s
                if (desc->bDescriptorType != UDESC_ENDPOINT)
                        goto next;
                ed = (usb_endpoint_descriptor_t *)(uint8_t *)desc;
-               i++;
 
                /* save endpoint with requested bandwidth */
                psize = UGETW(ed->wMaxPacketSize);
@@ -1271,10 +1269,10 @@ next:
            sc->sc_vs_cur->curalt, sc->sc_vs_cur->psize, max_packet_size);
 
        /* set alternate video stream interface */
-       error = usbd_set_interface(ifaceh, i);
+       error = usbd_set_interface(ifaceh, sc->sc_vs_cur->curalt);
        if (error) {
                printf("%s: could not set alternate interface %d!\n",
-                   DEVNAME(sc), i);
+                   DEVNAME(sc), sc->sc_vs_cur->curalt);
                return (USBD_INVAL);
        }
 

Reply via email to