aboutsummaryrefslogtreecommitdiff
path: root/drivers/usb
diff options
context:
space:
mode:
authorjayashree <jayashree.budihal@stericsson.com>2011-04-26 16:38:02 +0530
committerSrinidhi KASAGAR <srinidhi.kasagar@stericsson.com>2011-04-27 13:28:11 +0200
commita1994398e3b2b1a0e857615c86c0fbffb5094090 (patch)
tree3bcf1ed797090c88f080f975933374b7d9a8c4bf /drivers/usb
parent610369274a70529ed6f68a01a43dc94397080725 (diff)
usb: musb: complete request after data transfer
Complete the current request only if the data transfer is over. This patch is back ported from 2.6.38 kernel (http://git.kernel.org/?p=linux/kernel/git/next/linux-next.git;a=comm itdiff;h=bb27bc2c1133372b54d00f3077ea4acbbf459045;hp=1018b4e44f4f191c 6e3c631c4eee35d0a112d32b). ST-Ericsson Linux next:NA ST-Ericsson ID: 332935 ST-Ericsson FOSS-OUT ID:NA Signed-off-by: jayashree <jayashree.budihal@stericsson.com> Change-Id: Iece6a3a6e6f6a97221c7b91a0680ecb4eaa2f92e Reviewed-on: http://gerrit.lud.stericsson.com/gerrit/21359 Tested-by: Jayashree Shashidhar BUDIHAL <jayashree.budihal@stericsson.com> Reviewed-by: Srinidhi KASAGAR <srinidhi.kasagar@stericsson.com>
Diffstat (limited to 'drivers/usb')
-rw-r--r--drivers/usb/musb/musb_gadget.c41
1 files changed, 22 insertions, 19 deletions
diff --git a/drivers/usb/musb/musb_gadget.c b/drivers/usb/musb/musb_gadget.c
index bcabf84716c..9ac40c4bab9 100644
--- a/drivers/usb/musb/musb_gadget.c
+++ b/drivers/usb/musb/musb_gadget.c
@@ -585,30 +585,33 @@ void musb_g_tx(struct musb *musb, u8 epnum)
}
/* ... or if not, then complete it. */
- musb_g_giveback(musb_ep, request, 0);
+ if (request->actual == request->length) {
+ musb_g_giveback(musb_ep, request, 0);
- /*
- * Kickstart next transfer if appropriate;
- * the packet that just completed might not
- * be transmitted for hours or days.
- * REVISIT for double buffering...
- * FIXME revisit for stalls too...
- */
- musb_ep_select(mbase, epnum);
- csr = musb_readw(epio, MUSB_TXCSR);
+ /*
+ * Kickstart next transfer if appropriate;
+ * the packet that just completed might not
+ * be transmitted for hours or days.
+ * REVISIT for double buffering...
+ * FIXME revisit for stalls too...
+ */
+ musb_ep_select(mbase, epnum);
+ csr = musb_readw(epio, MUSB_TXCSR);
#ifdef CONFIG_ARCH_U8500
- if ((csr & MUSB_TXCSR_FIFONOTEMPTY) &&
- !(musb_ep->hw_ep->tx_double_buffered))
+ if ((csr & MUSB_TXCSR_FIFONOTEMPTY) &&
+ !(musb_ep->hw_ep->tx_double_buffered))
#else
- if (csr & MUSB_TXCSR_FIFONOTEMPTY)
+ if (csr & MUSB_TXCSR_FIFONOTEMPTY)
#endif
- return;
+ return;
- request = musb_ep->desc ? next_request(musb_ep) : NULL;
- if (!request) {
- DBG(4, "%s idle now\n",
- musb_ep->end_point.name);
- return;
+ request =
+ musb_ep->desc ? next_request(musb_ep) : NULL;
+ if (!request) {
+ DBG(4, "%s idle now\n",
+ musb_ep->end_point.name);
+ return;
+ }
}
}