> -----Original Message----- > From: Sarah Sharp [mailto:sarah.a.sharp@xxxxxxxxx] > > I've been trying out the patches to enable isochronous transfers under > xHCI, and they work fine on my USB speaker. However, I've been having > trouble getting my high speed USB webcam to work. The NEC Express Card > I have rejects the first alternate setting that the uvcvideo driver > tries to install (altsetting 11), saying that it takes too much > bandwidth. This happens even when I plug the device directly into the > roothub with no other devices plugged in. > > I would like to know if this is correct behavior for the host, as I > can't believe a device would advertise an alternate setting that took up > too much bandwidth by itself. Device descriptors and a log snippet are > attached. I'm also verifying usb webcam these days. The host controller also rejects alternate setting, indicating not enough bandwidth. Fortunately the webcam I used is using gspca and the patch for gspca below does work. After several times of failure, it will set the alt setting successfully. See the log and descriptors. But I don't think it's normal behavior. The xHC should accept the alt setting request at the first time. I'm also using the NEC chips, perhaps it's a HW or FW issue but I can't make sure. Another problem of the isoc transfer is the size of the transfer ring. Currently in xhci_endpoint_init() of xhci-mem.c, the ring allocated for each endpoint just contains one segment, which can hold 64 - 1 = 63 trbs. But the gspca will submit 3 urbs at one time, each consists of 32 packets. Each packet needs an isoc TD to carry, and the driver will insert 96 trbs to the ring at one time. It will cause the room_on_ring check failure since the xHC cannot process the trbs in time. After I modify the parameter of xhci_ring_alloc() in xhci_endpoint_init() to allocate 2 segments, the webcam works smoothly. It looks like dynamic ring allocation is necessary for isoc endpoint since it will put multiple trbs on the ring and the fixed size is too small. > The other problem is that uvcvideo then gives up on the device when > installing the alt setting fails, rather than trying the next less > resource-intensive alternate setting. The past, submit_urb() might fail > if there wasn't enough bandwidth for the isochronous transfers, but > under an xHCI host controller, it will fail sooner, when > usb_set_interface() is called. That needs to be fixed in all the USB > video drivers. > > I figured out how to patch the gspca driver, but not uvcvideo. The > patch looks a bit hackish; can with experience with that driver look it > over? Can anyone tell me where to look for the usb_set_interface() in > uvcvideo? > > Sarah Sharp > > 8<---------------------- > > From 0e6bc81b178364ee9771c64a06ab006588c73ae6 Mon Sep 17 00:00:00 2001 > From: Sarah Sharp <sarah.a.sharp@xxxxxxxxxxxxxxx> > Date: Mon, 12 Apr 2010 11:23:46 -0700 > > Subject: [PATCH] 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 <sarah.a.sharp@xxxxxxxxxxxxxxx> > --- > drivers/media/video/gspca/gspca.c | 10 ++++++---- > 1 files changed, 6 insertions(+), 4 deletions(-) > > diff --git a/drivers/media/video/gspca/gspca.c > b/drivers/media/video/gspca/gspca.c > index 222af47..6de3117 100644 > --- a/drivers/media/video/gspca/gspca.c > +++ b/drivers/media/video/gspca/gspca.c > @@ -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; > -- > 1.6.3.3
Bus 008 Device 002: ID 04fc:0561 Sunplus Technology Co., Ltd Flexcam 100 Device Descriptor: bLength 18 bDescriptorType 1 bcdUSB 1.10 bDeviceClass 255 Vendor Specific Class bDeviceSubClass 255 Vendor Specific Subclass bDeviceProtocol 0 bMaxPacketSize0 8 idVendor 0x04fc Sunplus Technology Co., Ltd idProduct 0x0561 Flexcam 100 bcdDevice 0.00 iManufacturer 1 Sunplus Technology Co., Ltd. iProduct 2 Generic Digital camera iSerial 0 bNumConfigurations 1 Configuration Descriptor: bLength 9 bDescriptorType 2 wTotalLength 233 bNumInterfaces 1 bConfigurationValue 1 iConfiguration 0 bmAttributes 0x80 (Bus Powered) MaxPower 100mA Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 0 bNumEndpoints 1 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x0000 1x 0 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 1 bNumEndpoints 1 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x0080 1x 128 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 2 bNumEndpoints 1 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x0370 1x 880 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 3 bNumEndpoints 1 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x0200 1x 512 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 4 bNumEndpoints 1 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x0280 1x 640 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 5 bNumEndpoints 1 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x0300 1x 768 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 6 bNumEndpoints 1 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x0380 1x 896 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 7 bNumEndpoints 1 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x03ff 1x 1023 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 8 bNumEndpoints 1 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x0220 1x 544 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 9 bNumEndpoints 1 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x0290 1x 656 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 10 bNumEndpoints 1 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x02c0 1x 704 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 11 bNumEndpoints 1 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x0360 1x 864 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 12 bNumEndpoints 1 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x03c0 1x 960 bytes bInterval 1 Interface Descriptor: bLength 9 bDescriptorType 4 bInterfaceNumber 0 bAlternateSetting 13 bNumEndpoints 1 bInterfaceClass 255 Vendor Specific Class bInterfaceSubClass 0 bInterfaceProtocol 0 iInterface 0 Endpoint Descriptor: bLength 7 bDescriptorType 5 bEndpointAddress 0x81 EP 1 IN bmAttributes 1 Transfer Type Isochronous Synch Type None Usage Type Data wMaxPacketSize 0x034d 1x 845 bytes bInterval 1 Device Status: 0x0000 (Bus Powered)
[ 613.660157] xhci_hcd 0000:02:00.0: Can't reset device (slot ID 1) in enabled/disabled state [ 613.660165] xhci_hcd 0000:02:00.0: Not freeing device rings. [ 613.660188] usb 8-4: new full speed USB device using xhci_hcd and address 0 [ 613.728243] xhci_hcd 0000:02:00.0: WARN: short transfer on control ep [ 613.736243] xhci_hcd 0000:02:00.0: WARN: short transfer on control ep [ 613.746239] xhci_hcd 0000:02:00.0: WARN: short transfer on control ep [ 613.747450] usb 8-4: configuration #1 chosen from 1 choice [ 613.897124] Linux video capture interface: v2.00 [ 613.939447] gspca: main v2.7.0 registered [ 613.961659] gspca: probing 04fc:0561 [ 614.429514] gspca: probe ok [ 614.429557] usbcore: registered new interface driver spca561 [ 614.430108] spca561: registered [ 617.122122] usb 8-4: Not enough bandwidth for new device state. [ 617.122140] usb 8-4: Not enough bandwidth for altsetting 7 [ 617.122146] gspca: set alt 7 err -28 [ 617.122378] usb 8-4: Not enough bandwidth for new device state. [ 617.122392] usb 8-4: Not enough bandwidth for altsetting 6 [ 617.122397] gspca: set alt 6 err -28 [ 619.093780] usb 8-4: Not enough bandwidth for new device state. [ 619.093788] usb 8-4: Not enough bandwidth for altsetting 7 [ 619.093791] gspca: set alt 7 err -28 [ 619.094016] usb 8-4: Not enough bandwidth for new device state. [ 619.094024] usb 8-4: Not enough bandwidth for altsetting 6 [ 619.094026] gspca: set alt 6 err -28