[RFC] [PATCH] usb: gadget: fix dtd dma confusion
Christoph Fritz
chf.fritz at googlemail.com
Wed May 9 10:02:22 EST 2012
On Wed, Apr 11, 2012 at 10:15:49AM -0300, Fabio Estevam wrote:
> On Wed, Apr 11, 2012 at 4:39 AM, Christoph Fritz
> <chf.fritz at googlemail.com> wrote:
>
> > Can you approve this behaviour of g_ether/usbnet when using iperf?
>
> I am not very familiar with iperf, so I will let others comment.
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.
And maybe someone can explain if this:
+ if (curr_td->next_td_ptr == EP_QUEUE_HEAD_NEXT_TERMINATE) {
is necessary and why (please see below).
Thanks,
-- Christoph
---
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 <chf.fritz at googlemail.com>
---
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
More information about the Linuxppc-dev
mailing list