USB: Add support for SuperSpeed isoc endpoints
authorPaul Zimmerman <Paul.Zimmerman@synopsys.com>
Tue, 1 Mar 2011 02:11:27 +0000 (18:11 -0800)
committerSarah Sharp <sarah.a.sharp@linux.intel.com>
Mon, 14 Mar 2011 01:23:57 +0000 (18:23 -0700)
Use the Mult and bMaxBurst values from the endpoint companion
descriptor to calculate the max length of an isoc transfer.

Add USB_SS_MULT macro to access Mult field of bmAttributes, at
Sarah's suggestion.

This patch should be queued for the 2.6.36 and 2.6.37 stable trees, since
those were the first kernels to have isochronous support for SuperSpeed
devices.

Signed-off-by: Paul Zimmerman <paulz@synopsys.com>
Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com>
Cc: stable@kernel.org
drivers/usb/core/urb.c
include/linux/usb/ch9.h

index c14fc082864f1c26ac71fb94538d7eeca9459f75..ae334b067c13e873a2105497cf38a673a5f65f57 100644 (file)
@@ -366,7 +366,16 @@ int usb_submit_urb(struct urb *urb, gfp_t mem_flags)
        if (xfertype == USB_ENDPOINT_XFER_ISOC) {
                int     n, len;
 
-               /* FIXME SuperSpeed isoc endpoints have up to 16 bursts */
+               /* SuperSpeed isoc endpoints have up to 16 bursts of up to
+                * 3 packets each
+                */
+               if (dev->speed == USB_SPEED_SUPER) {
+                       int     burst = 1 + ep->ss_ep_comp.bMaxBurst;
+                       int     mult = USB_SS_MULT(ep->ss_ep_comp.bmAttributes);
+                       max *= burst;
+                       max *= mult;
+               }
+
                /* "high bandwidth" mode, 1-3 packets/uframe? */
                if (dev->speed == USB_SPEED_HIGH) {
                        int     mult = 1 + ((max >> 11) & 0x03);
index 34316ba05f29a7e1bc8d10fece733c6f32c74484..b72f305ce6bd0986ae8ec07daec1f998277d9650 100644 (file)
@@ -585,6 +585,8 @@ struct usb_ss_ep_comp_descriptor {
 #define USB_DT_SS_EP_COMP_SIZE         6
 /* Bits 4:0 of bmAttributes if this is a bulk endpoint */
 #define USB_SS_MAX_STREAMS(p)          (1 << ((p) & 0x1f))
+/* Bits 1:0 of bmAttributes if this is an isoc endpoint */
+#define USB_SS_MULT(p)                 (1 + ((p) & 0x3))
 
 /*-------------------------------------------------------------------------*/