summaryrefslogtreecommitdiff
path: root/drivers/usb
diff options
context:
space:
mode:
authorPeter Chiang <pchiang@nvidia.com>2016-07-04 18:52:33 +0800
committerMatthew Pedro <mapedro@nvidia.com>2016-08-18 22:58:45 -0700
commit17db3ff7afbc5a92638f7d1d7d1d82767623fcc7 (patch)
tree31f6b7e305e29d08cca7e8f493776f1e556cc2ba /drivers/usb
parent964ef1d4d2932f4d2dc1d97459f0d7026cdccffd (diff)
usb: gadget: tegra: Fix short packet issue
Fix Tranaction Error due to short packet with ISO mult-transaction. Set new value in Override Mult field to support short packet Bug 1745903 Change-Id: I7409ba8943c2490afe714a0da9f7c05a63c949b4 Signed-off-by: Peter Chiang <pchiang@nvidia.com> Reviewed-on: http://git-master/r/1175184 GVS: Gerrit_Virtual_Submit Reviewed-by: Laxman Dewangan <ldewangan@nvidia.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/gadget/tegra_udc.c16
-rw-r--r--drivers/usb/gadget/tegra_udc.h4
2 files changed, 18 insertions, 2 deletions
diff --git a/drivers/usb/gadget/tegra_udc.c b/drivers/usb/gadget/tegra_udc.c
index d8efe20d5bb8..89ed8be52d16 100644
--- a/drivers/usb/gadget/tegra_udc.c
+++ b/drivers/usb/gadget/tegra_udc.c
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2014, NVIDIA CORPORATION. All rights reserved.
+ * Copyright (c) 2012-2016, NVIDIA CORPORATION. All rights reserved.
*
* Description:
* High-speed USB device controller driver.
@@ -911,6 +911,20 @@ static struct ep_td_struct *tegra_build_dtd(struct tegra_req *req,
dtd->size_ioc_sts = cpu_to_le32(swap_temp);
+ /* The short packet happened with ISO multi-transaction */
+ if (req->ep->ep.mult && ((req->ep->desc->bmAttributes &
+ 0x3) == USB_ENDPOINT_XFER_ISOC)) {
+ if (*length <= req->ep->ep.maxpacket) {
+ swap_temp = cpu_to_le32(dtd->size_ioc_sts);
+ swap_temp |= DTD_MULTO_MULTIPLIER_1;
+ dtd->size_ioc_sts = cpu_to_le32(swap_temp);
+ } else if (*length <= (req->ep->ep.maxpacket *
+ req->ep->ep.mult)) {
+ swap_temp = cpu_to_le32(dtd->size_ioc_sts);
+ swap_temp |= DTD_MULTO_MULTIPLIER_2;
+ dtd->size_ioc_sts = cpu_to_le32(swap_temp);
+ }
+ }
mb();
VDBG("length = %d address= 0x%x", *length, (int)*dma);
diff --git a/drivers/usb/gadget/tegra_udc.h b/drivers/usb/gadget/tegra_udc.h
index a7fe163785ff..67484720bc31 100644
--- a/drivers/usb/gadget/tegra_udc.h
+++ b/drivers/usb/gadget/tegra_udc.h
@@ -1,5 +1,5 @@
/*
- * Copyright (c) 2012-2014, NVIDIA CORPORATION. All rights reserved.
+ * Copyright (c) 2012-2016, NVIDIA CORPORATION. All rights reserved.
*
* Description:
* High-speed USB device controller driver.
@@ -321,6 +321,8 @@
/* Endpoint Transfer Descriptor bit Masks */
#define DTD_NEXT_TERMINATE 0x00000001
+#define DTD_MULTO_MULTIPLIER_1 0x00000400
+#define DTD_MULTO_MULTIPLIER_2 0x00000800
#define DTD_IOC 0x00008000
#define DTD_STATUS_ACTIVE 0x00000080
#define DTD_STATUS_HALTED 0x00000040