From: Christoph Fritz <chf.fritz@googlemail.com>
To: Li Yang <leoli@freescale.com>, Felipe Balbi <balbi@ti.com>,
Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
Chen Peter-B29397 <B29397@freescale.com>
Cc: Oliver Neukum <oneukum@suse.de>,
Kukjin Kim <kgene.kim@samsung.com>,
Eric Miao <eric.y.miao@gmail.com>,
Ben Dooks <ben-linux@fluff.org>,
Fabio Estevam <festevam@gmail.com>,
Sascha Hauer <s.hauer@pengutronix.de>,
linux-usb@vger.kernel.org,
Nicolas Ferre <nicolas.ferre@atmel.com>,
Haojian Zhuang <haojian.zhuang@gmail.com>,
Ido Shayevitz <idos@codeaurora.org>,
Thomas Dahlmann <dahlmann.thomas@arcor.de>,
Estevam Fabio-R49496 <r49496@freescale.com>,
"Hans J. Koch" <hjk@hansjkoch.de>, Daniel Mack <daniel@caiaq.de>,
Christian Hemp <c.hemp@phytec.de>,
Russell King <linux@arm.linux.org.uk>,
Neil Zhang <zhangwm@marvell.com>,
linuxppc-dev@lists.ozlabs.org
Subject: [PATCH] usb: fsl_udc: errata - postpone freeing current dTD
Date: Mon, 21 May 2012 01:17:24 +0200 [thread overview]
Message-ID: <20120520231724.GA7941@mars> (raw)
In-Reply-To: <20120514042142.GD9750@kroah.com>
USB controller may access a wrong address for the dTD (endpoint transfer
descriptor) and then hang. This happens a lot when doing tests with
g_ether module and iperf, a tool for measuring maximum TCP and UDP
bandwidth.
This hardware bug is explained in detail by errata number 2858 for i.MX23:
http://cache.freescale.com/files/dsp/doc/errata/IMX23CE.pdf
mv_udc_core fixes this bug by commit daec765. There still may be unfixed
drivers.
Signed-off-by: Christoph Fritz <chf.fritz@googlemail.com>
Signed-off-by: Christian Hemp <c.hemp@phytec.de>
---
drivers/usb/gadget/fsl_udc_core.c | 22 ++++++++++++++++++++++
drivers/usb/gadget/fsl_usb2_udc.h | 6 ++++++
2 files changed, 28 insertions(+), 0 deletions(-)
diff --git a/drivers/usb/gadget/fsl_udc_core.c b/drivers/usb/gadget/fsl_udc_core.c
index 55abfb6..f9bfafd 100644
--- a/drivers/usb/gadget/fsl_udc_core.c
+++ b/drivers/usb/gadget/fsl_udc_core.c
@@ -65,6 +65,9 @@ static struct usb_sys_interface *usb_sys_regs;
/* it is initialized in probe() */
static struct fsl_udc *udc_controller = NULL;
+#ifdef POSTPONE_FREE_LAST_DTD
+static struct ep_td_struct *last_free_td;
+#endif
static const struct usb_endpoint_descriptor
fsl_ep0_desc = {
.bLength = USB_DT_ENDPOINT_SIZE,
@@ -180,8 +183,18 @@ static void done(struct fsl_ep *ep, struct fsl_req *req, int status)
curr_td = next_td;
if (j != req->dtd_count - 1) {
next_td = curr_td->next_td_virt;
+#ifdef POSTPONE_FREE_LAST_DTD
+ dma_pool_free(udc->td_pool, curr_td, curr_td->td_dma);
+ } else {
+ if (last_free_td != NULL)
+ dma_pool_free(udc->td_pool, last_free_td,
+ last_free_td->td_dma);
+ last_free_td = curr_td;
+ }
+#else
}
dma_pool_free(udc->td_pool, curr_td, curr_td->td_dma);
+#endif
}
if (req->mapped) {
@@ -2579,6 +2592,10 @@ static int __init fsl_udc_probe(struct platform_device *pdev)
goto err_unregister;
}
+#ifdef POSTPONE_FREE_LAST_DTD
+ last_free_td = NULL;
+#endif
+
ret = usb_add_gadget_udc(&pdev->dev, &udc_controller->gadget);
if (ret)
goto err_del_udc;
@@ -2633,6 +2650,11 @@ static int __exit fsl_udc_remove(struct platform_device *pdev)
kfree(udc_controller->status_req);
kfree(udc_controller->eps);
+#ifdef POSTPONE_FREE_LAST_DTD
+ if (last_free_td != NULL)
+ dma_pool_free(udc_controller->td_pool, last_free_td,
+ last_free_td->td_dma);
+#endif
dma_pool_destroy(udc_controller->td_pool);
free_irq(udc_controller->irq, udc_controller);
iounmap(dr_regs);
diff --git a/drivers/usb/gadget/fsl_usb2_udc.h b/drivers/usb/gadget/fsl_usb2_udc.h
index e651469..03ae07f 100644
--- a/drivers/usb/gadget/fsl_usb2_udc.h
+++ b/drivers/usb/gadget/fsl_usb2_udc.h
@@ -4,6 +4,12 @@
#ifndef __FSL_USB2_UDC_H
#define __FSL_USB2_UDC_H
+#if defined CONFIG_ARCH_MX51 || defined CONFIG_SOC_IMX35
+#define POSTPONE_FREE_LAST_DTD
+#else
+#undef POSTPONE_FREE_LAST_DTD
+#endif
+
/* ### define USB registers here
*/
#define USB_MAX_CTRL_PAYLOAD 64
--
1.7.2.5
next prev parent reply other threads:[~2012-05-20 23:17 UTC|newest]
Thread overview: 49+ messages / expand[flat|nested] mbox.gz Atom feed top
[not found] <1333796272.3450.92.camel@lovely>
[not found] ` <F281D0F91ED19E4D8E63A7504E8A64980AFFE3@039-SN2MPN1-022.039d.mgd.msft.net>
[not found] ` <CAOMZO5AjQsNw7_4ETkB38mmuBXj4pnCwJwAsi4zC4b_83=Enfw@mail.gmail.com>
[not found] ` <20120409200656.GD2640@local>
[not found] ` <CAOMZO5BTrA8G6wwQZ3e6bydJX7UtG7jj2c29Ln7u_3_jyUGB+w@mail.gmail.com>
[not found] ` <20120410001017.GF2640@local>
[not found] ` <CAOMZO5A=sHeyoQ0PCd=09qGGKb0NjXi-kF5qyG+3U-GhD7rhzg@mail.gmail.com>
[not found] ` <20120410021151.GB23044@lovely.krouter>
[not found] ` <20120411073918.GA9180@lovely.krouter>
[not found] ` <CAOMZO5C729Ki0Bequ+s1nnrgt4NZWvwg3Wnjk4kHp=d9BtkeXw@mail.gmail.com>
2012-05-09 0:02 ` [RFC] [PATCH] usb: gadget: fix dtd dma confusion Christoph Fritz
2012-05-09 1:50 ` Neil Zhang
2012-05-09 2:11 ` Chen Peter-B29397
2012-05-09 5:38 ` Christoph Fritz
2012-05-09 5:43 ` Chen Peter-B29397
2012-05-09 5:56 ` Christoph Fritz
2012-05-09 5:45 ` Neil Zhang
2012-05-09 6:04 ` Christoph Fritz
2012-05-13 22:51 ` Christoph Fritz
2012-05-14 1:11 ` Chen Peter-B29397
2012-05-14 4:21 ` Greg Kroah-Hartman
2012-05-20 23:17 ` Christoph Fritz [this message]
2012-05-21 1:05 ` [PATCH] usb: fsl_udc: errata - postpone freeing current dTD Chen Peter-B29397
2012-05-21 6:53 ` Christoph Fritz
2012-05-21 6:57 ` [PATCH v2] " Christoph Fritz
2012-05-21 7:25 ` Chen Peter-B29397
2012-05-21 19:04 ` Felipe Balbi
2012-06-04 11:30 ` Christoph Fritz
2012-06-04 11:30 ` Christoph Fritz
2012-06-04 11:37 ` Christoph Fritz
2012-06-04 11:37 ` Christoph Fritz
2012-06-10 18:41 ` Fabio Estevam
2012-06-10 18:41 ` Fabio Estevam
2012-06-12 19:40 ` Christoph Fritz
2012-06-12 19:40 ` Christoph Fritz
2012-06-13 1:17 ` Fabio Estevam
2012-06-13 1:17 ` Fabio Estevam
2012-06-04 14:59 ` Felipe Balbi
2012-06-04 14:59 ` Felipe Balbi
2012-06-04 15:24 ` [PATCH] usb: gadget: regression fix - useage of usb_ep Christoph Fritz
2012-06-04 15:24 ` Christoph Fritz
2012-10-19 10:22 ` [PATCH 0/7] update USB gadget driver fsl-usb2-udc Christoph Fritz
2012-10-19 10:24 ` [PATCH 1/7] usb: gadget: fsl_udc: simplify driver init Christoph Fritz
2012-10-19 10:24 ` Felipe Balbi
2012-10-19 10:24 ` [PATCH 2/7] usb: gadget: fsl_udc: protect fsl_pullup() with spin_lock Christoph Fritz
2012-10-19 10:25 ` Felipe Balbi
2012-10-19 10:24 ` [PATCH 3/7] usb: gadget: fsl_udc: convert to new ulc style Christoph Fritz
2012-10-19 10:27 ` Felipe Balbi
2012-10-19 10:24 ` [PATCH 4/7] usb: gadget: fsl_udc: drop ARCH dependency Christoph Fritz
2012-10-19 10:29 ` Felipe Balbi
2012-10-19 10:24 ` [PATCH 5/7] usb: gadget: fsl_udc: postpone freeing current dTD Christoph Fritz
2012-10-19 10:30 ` Felipe Balbi
2012-10-19 10:46 ` Christoph Fritz
2012-10-19 10:44 ` Felipe Balbi
2012-10-20 19:12 ` Christoph Fritz
2012-10-22 7:54 ` Felipe Balbi
2012-10-19 10:24 ` [PATCH 6/7] usb: gadget: fsl_udc: purge global pointer usb_sys_regs Christoph Fritz
2012-10-19 10:24 ` [PATCH 7/7] usb: gadget: fsl_udc: purge global pointer dr_regs Christoph Fritz
2012-10-19 15:36 ` [PATCH 0/7] update USB gadget driver fsl-usb2-udc Sascha Hauer
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20120520231724.GA7941@mars \
--to=chf.fritz@googlemail.com \
--cc=B29397@freescale.com \
--cc=balbi@ti.com \
--cc=ben-linux@fluff.org \
--cc=c.hemp@phytec.de \
--cc=dahlmann.thomas@arcor.de \
--cc=daniel@caiaq.de \
--cc=eric.y.miao@gmail.com \
--cc=festevam@gmail.com \
--cc=gregkh@linuxfoundation.org \
--cc=haojian.zhuang@gmail.com \
--cc=hjk@hansjkoch.de \
--cc=idos@codeaurora.org \
--cc=kgene.kim@samsung.com \
--cc=leoli@freescale.com \
--cc=linux-usb@vger.kernel.org \
--cc=linux@arm.linux.org.uk \
--cc=linuxppc-dev@lists.ozlabs.org \
--cc=nicolas.ferre@atmel.com \
--cc=oneukum@suse.de \
--cc=r49496@freescale.com \
--cc=s.hauer@pengutronix.de \
--cc=zhangwm@marvell.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.