On Wed, May 09, 2012 at 02:02:22AM +0200, Christoph Fritz wrote:
quoted hunk ↗ jump to hunk
Hi to All,
after a while of testing and searching I can come up with a patch
that fixes g_ether <-> iperf for fsl_udc on ARM i.MX35.
The sad part is that this kind of fix is already implemented for
marvell mv_udc driver since last year but still _not_ in the ~15
other *udc.c drivers.
See here:
daec765da767e4a6a30e1298862b28f2cae9a73f
usb: gadget: mv_udc: fix dtd dma confusion
So hereby I'm CC-ing all *udc.c maintainers to point out that this
issue maybe affects you too.
---
Subject: [PATCH] usb: gadget: fsl_udc: fix dtd dma confusion
The controller will hang when doing testings with g_ether and iperf
(tool for measuring maximum TCP and UDP bandwidth). This patch adds a
delay to wait for controller to release dtd dma before freeing it.
Signed-off-by: Christoph Fritz <redacted>
---
drivers/usb/gadget/fsl_udc_core.c | 9 +++++++++
1 files changed, 9 insertions(+), 0 deletions(-)
diff --git a/drivers/usb/gadget/fsl_udc_core.c b/drivers/usb/gadget/fsl_udc_core.c
index 55abfb6..fc86108 100644
--- a/drivers/usb/gadget/fsl_udc_core.c
+++ b/drivers/usb/gadget/fsl_udc_core.c
@@ -1638,6 +1638,15 @@ static int process_ep_req(struct fsl_udc *udc, int pipe,
status = REQ_UNCOMPLETE;
return status;
} else if (remaining_length) {
+ /* wait controller release dtd dma */
+ while ((curr_qh->curr_dtd_ptr == curr_td->td_dma)) {
+ if (curr_td->next_td_ptr ==
+ EP_QUEUE_HEAD_NEXT_TERMINATE) {
+ udelay(100);
+ break;
+ }
+ udelay(1);
+ }
if (direction) {
VDBG("Transmit dTD remaining length not zero");
status = -EPROTO;--
1.7.2.5
ping - what about this patch? Will it be applied?
Thanks,
-- Christoph