aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSarah Sharp <sarah.a.sharp@linux.intel.com>2013-01-11 14:19:07 -0500
committerSarah Sharp <sarah.a.sharp@linux.intel.com>2013-01-24 12:53:36 -0500
commit760973d2a74b93eb1697981f7448f0e62767cfc4 (patch)
tree4adec8398c6cf7fdb97c518b79f170f519339160
parentdba63b2f733ebfd89bbb15e8fe8ca10fd3871a7f (diff)
xhci: Fix isoc TD encoding.
An isochronous TD is comprised of one isochronous TRB chained to zero or more normal TRBs. Only the isoc TRB has the TBC and TLBPC fields. The normal TRBs must set those fields to zeroes. The code was setting the TBC and TLBPC fields for both isoc and normal TRBs. Fix this. This should be backported to stable kernels as old as 3.0, that contain the commit b61d378f2da41c748aba6ca19d77e1e1c02bcea5 " xhci 1.0: Set transfer burst last packet count field." Signed-off-by: Sarah Sharp <sarah.a.sharp@linux.intel.com> Cc: stable@vger.kernel.org
-rw-r--r--drivers/usb/host/xhci-ring.c4
1 files changed, 3 insertions, 1 deletions
diff --git a/drivers/usb/host/xhci-ring.c b/drivers/usb/host/xhci-ring.c
index 59fb5c677dbe..d1ff13370d33 100644
--- a/drivers/usb/host/xhci-ring.c
+++ b/drivers/usb/host/xhci-ring.c
@@ -3664,9 +3664,11 @@ static int xhci_queue_isoc_tx(struct xhci_hcd *xhci, gfp_t mem_flags,
3664 td = urb_priv->td[i]; 3664 td = urb_priv->td[i];
3665 for (j = 0; j < trbs_per_td; j++) { 3665 for (j = 0; j < trbs_per_td; j++) {
3666 u32 remainder = 0; 3666 u32 remainder = 0;
3667 field = TRB_TBC(burst_count) | TRB_TLBPC(residue); 3667 field = 0;
3668 3668
3669 if (first_trb) { 3669 if (first_trb) {
3670 field = TRB_TBC(burst_count) |
3671 TRB_TLBPC(residue);
3670 /* Queue the isoc TRB */ 3672 /* Queue the isoc TRB */
3671 field |= TRB_TYPE(TRB_ISOC); 3673 field |= TRB_TYPE(TRB_ISOC);
3672 /* Assume URB_ISO_ASAP is set */ 3674 /* Assume URB_ISO_ASAP is set */