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