gspca: Try a less bandwidth-intensive alt setting.
PATCH 1/1 gspca: Try a less bandwidth-intensive alt setting.
Under OHCI, UHCI, and EHCI, if an alternate interface setting took too much of the bus bandwidth, then submit_urb() would fail. The xHCI host controller does bandwidth checking when the alternate interface setting is installed, so usb_set_interface() can fail. If it does, try the next alternate interface setting.
Signed-off-by Sarah Sharp <[email protected]>
Tested-by Andiry Xu <[email protected]>
--- drivers/media/video/gspca/gspca.c | 10 ++++++---- 1 files changed, 6 insertions(+), 4 deletions(-)
drivers/media/video/gspca/gspca.c +6 -4
@@ -643,6 +643,7 @@ static struct usb_host_endpoint *get_ep(struct gspca_dev *gspca_dev) xfer = gspca_dev->cam.bulk ?USB_ENDPOINT_XFER_BULK :USB_ENDPOINT_XFER_ISOC ; i = gspca_dev->alt;/* previous alt setting */ +find_alt:if (gspca_dev->cam.reverse_alts) {while (++i < gspca_dev->nbalt) { ep =alt_xfer (&intf->altsetting[i], xfer);
@@ -666,10 +667,11 @@ static struct usb_host_endpoint *get_ep(struct gspca_dev *gspca_dev)if (gspca_dev->nbalt >1 ) {gspca_input_destroy_urb (gspca_dev); ret =usb_set_interface (gspca_dev->dev, gspca_dev->iface, i); -if (ret <0 ) { -err ("set alt %d err %d" , i, ret); - ep =NULL ; - } +/* xHCI hosts will reject set interface requests +* if they take too much bandwidth, so try again. +*/ +if (ret <0 ) + goto find_alt;gspca_input_create_urb (gspca_dev); }return ep;
Signature · 1 line
1.6.3.3