RE: xHCI bandwidth error with USB webcam

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

 



> -----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

[Index of Archives]     [Linux Media]     [Linux Input]     [Linux Audio Users]     [Yosemite News]     [Linux Kernel]     [Linux SCSI]     [Old Linux USB Devel Archive]

  Powered by Linux