summaryrefslogtreecommitdiffstats
path: root/drivers/usb
diff options
context:
space:
mode:
authorPaul Zimmerman2011-03-01 03:11:27 +0100
committerSarah Sharp2011-03-14 02:23:57 +0100
commit500132a0f26ad7d9916102193cbc6c1b1becb373 (patch)
treec5b55f5afa88fb5b7820237a9de4c897b0c830e9 /drivers/usb
parentxhci: Clean up cycle bit math used during stalls. (diff)
downloadkernel-qcow2-linux-500132a0f26ad7d9916102193cbc6c1b1becb373.tar.gz
kernel-qcow2-linux-500132a0f26ad7d9916102193cbc6c1b1becb373.tar.xz
kernel-qcow2-linux-500132a0f26ad7d9916102193cbc6c1b1becb373.zip
USB: Add support for SuperSpeed isoc endpoints
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
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/core/urb.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/drivers/usb/core/urb.c b/drivers/usb/core/urb.c
index c14fc082864f..ae334b067c13 100644
--- a/drivers/usb/core/urb.c
+++ b/drivers/usb/core/urb.c
@@ -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);