aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/usb/host
diff options
context:
space:
mode:
authorAndiry Xu <andiry.xu@amd.com>2010-07-22 18:23:47 -0400
committerGreg Kroah-Hartman <gregkh@suse.de>2010-08-10 17:35:41 -0400
commita061a5a0b816de3b4711a2e96764bb3cd8df861e (patch)
treed8440fbedb5761c6a4058f1382ef6bdf46944a24 /drivers/usb/host
parent04e51901dd44f40a5a385ced897f6bca87d5f40a (diff)
USB: xHCI: allocate bigger ring for isochronous endpoint
Isochronous endpoint needs a bigger size of transfer ring. Isochronous URB consists of multiple packets, each packet needs a isoc td to carry, and there will be multiple trbs inserted to the ring at one time. One segment is too small for isochronous endpoints, and it will result in room_on_ring() check failure and the URB is failed to enqueue. Allocate bigger ring for isochronous endpoint. 8 segments should be enough. This will be replaced with dynamic ring expansion in the future. Signed-off-by: Andiry Xu <andiry.xu@amd.com> Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> Signed-off-by: Greg Kroah-Hartman <gregkh@suse.de>
Diffstat (limited to 'drivers/usb/host')
-rw-r--r--drivers/usb/host/xhci-mem.c14
1 files changed, 12 insertions, 2 deletions
diff --git a/drivers/usb/host/xhci-mem.c b/drivers/usb/host/xhci-mem.c
index 44eeaa016f1b..7d60d1f4debb 100644
--- a/drivers/usb/host/xhci-mem.c
+++ b/drivers/usb/host/xhci-mem.c
@@ -1112,8 +1112,18 @@ int xhci_endpoint_init(struct xhci_hcd *xhci,
1112 ep_ctx = xhci_get_ep_ctx(xhci, virt_dev->in_ctx, ep_index); 1112 ep_ctx = xhci_get_ep_ctx(xhci, virt_dev->in_ctx, ep_index);
1113 1113
1114 /* Set up the endpoint ring */ 1114 /* Set up the endpoint ring */
1115 virt_dev->eps[ep_index].new_ring = 1115 /*
1116 xhci_ring_alloc(xhci, 1, true, mem_flags); 1116 * Isochronous endpoint ring needs bigger size because one isoc URB
1117 * carries multiple packets and it will insert multiple tds to the
1118 * ring.
1119 * This should be replaced with dynamic ring resizing in the future.
1120 */
1121 if (usb_endpoint_xfer_isoc(&ep->desc))
1122 virt_dev->eps[ep_index].new_ring =
1123 xhci_ring_alloc(xhci, 8, true, mem_flags);
1124 else
1125 virt_dev->eps[ep_index].new_ring =
1126 xhci_ring_alloc(xhci, 1, true, mem_flags);
1117 if (!virt_dev->eps[ep_index].new_ring) { 1127 if (!virt_dev->eps[ep_index].new_ring) {
1118 /* Attempt to use the ring cache */ 1128 /* Attempt to use the ring cache */
1119 if (virt_dev->num_rings_cached == 0) 1129 if (virt_dev->num_rings_cached == 0)