diff options
author | Peter Chiang <pchiang@nvidia.com> | 2016-07-04 18:52:33 +0800 |
---|---|---|
committer | Matthew Pedro <mapedro@nvidia.com> | 2016-08-18 22:58:45 -0700 |
commit | 17db3ff7afbc5a92638f7d1d7d1d82767623fcc7 (patch) | |
tree | 31f6b7e305e29d08cca7e8f493776f1e556cc2ba /drivers/usb | |
parent | 964ef1d4d2932f4d2dc1d97459f0d7026cdccffd (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.c | 16 | ||||
-rw-r--r-- | drivers/usb/gadget/tegra_udc.h | 4 |
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 |