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); }