From: Alexandre Bailon <abailon-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
To: vinod.koul-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org
Cc: dmaengine-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
nsekhar-l0cyMroinI0@public.gmane.org,
khilman-rdvid1DuHRBWk0Htik3J/w@public.gmane.org,
ptitiano-rdvid1DuHRBWk0Htik3J/w@public.gmane.org,
tony-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org,
linux-omap-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org,
robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org,
b-liu-l0cyMroinI0@public.gmane.org,
Alexandre Bailon
<abailon-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
Subject: [PATCH 10/11] dmaengine: cppi41: Fix da8xx interrupt issue
Date: Mon, 9 Jan 2017 17:06:55 +0100 [thread overview]
Message-ID: <20170109160656.3470-11-abailon@baylibre.com> (raw)
In-Reply-To: <20170109160656.3470-1-abailon-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
Sometime, after a teardown, interrupts are not fired anymore.
This happen because the interrupt handler doesn't re-assert IRQ.
Once the teardown complete, the teardown descriptor is moved
to completion queue, which is causing an interrupt.
But cppi41_tear_down_chan() is called from atomic section,
and it polls the queue until it got the teardown descriptor.
Then, the interrupt handler is called but it is not able
detect the cause of the interrupt and assume the interrupt
has been fired by USB core. In that situation, the IRQ won't
be re-asserted and interrupts won't work anymore.
Add the td_complete variable to detect an interrupt fired by
DMA during a teardown, and then re-assert IRQ.
Signed-off-by: Alexandre Bailon <abailon-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
---
drivers/dma/cppi41.c | 30 +++++++++++++++++++++++++-----
1 file changed, 25 insertions(+), 5 deletions(-)
diff --git a/drivers/dma/cppi41.c b/drivers/dma/cppi41.c
index e8470b1..0060391 100644
--- a/drivers/dma/cppi41.c
+++ b/drivers/dma/cppi41.c
@@ -171,6 +171,8 @@ struct cppi41_dd {
/* da8xx clock */
struct clk *clk;
+
+ bool td_complete;
};
static struct chan_queues am335x_usb_queues_tx[] = {
@@ -398,19 +400,29 @@ static irqreturn_t da8xx_cppi41_irq(int irq, void *data)
struct cppi41_dd *cdd = data;
u32 status;
u32 usbss_status;
+ irqreturn_t ret = IRQ_NONE;
status = cppi_readl(cdd->qmgr_mem + QMGR_PEND(0));
if (status & DA8XX_QMGR_PENDING_MASK)
- cppi41_irq(cdd);
- else
- return IRQ_NONE;
+ ret = cppi41_irq(cdd);
+
+ if (cdd->td_complete) {
+ /*
+ * Spurious IRQ caused by teardown.
+ * DMA interrupts are not maskable, so there is now way
+ * to prevent it.
+ * Just ensure that the IRQ will be re-asserted.
+ */
+ cdd->td_complete = false;
+ ret = IRQ_HANDLED;
+ }
/* Re-assert IRQ if there no usb core interrupts pending */
usbss_status = cppi_readl(cdd->usbss_mem + DA8XX_INTR_SRC_MASKED);
- if (!usbss_status)
+ if (ret == IRQ_HANDLED && !usbss_status)
cppi_writel(0, cdd->usbss_mem + DA8XX_END_OF_INTR);
- return IRQ_HANDLED;
+ return ret;
}
static dma_cookie_t cppi41_tx_submit(struct dma_async_tx_descriptor *tx)
@@ -740,6 +752,14 @@ static int cppi41_tear_down_chan(struct cppi41_channel *c)
WARN_ON(!desc_phys);
}
+ /* On DA8xx, we are using the PEND0 register to determine if
+ * the interrupt is generated by DMA. But because the teardown has
+ * already been popped from completion queue, PEND0 is clear and
+ * the interrupt handler will assume the interrupt has been fired
+ * by the USB core.
+ */
+ cdd->td_complete = true;
+
c->td_queued = 0;
c->td_seen = 0;
c->td_desc_seen = 0;
--
2.10.2
--
To unsubscribe from this list: send the line "unsubscribe linux-usb" in
the body of a message to majordomo-u79uwXL29TY76Z2rM5mHXA@public.gmane.org
More majordomo info at http://vger.kernel.org/majordomo-info.html
next prev parent reply other threads:[~2017-01-09 16:06 UTC|newest]
Thread overview: 28+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-01-09 16:06 [PATCH 00/11] dmaengine: cppi41: Add dma support to da8xx Alexandre Bailon
[not found] ` <20170109160656.3470-1-abailon-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
2017-01-09 16:06 ` [PATCH 01/11] dmaengine: cppi41: rename platform variables Alexandre Bailon
[not found] ` <20170109160656.3470-2-abailon-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
2017-01-10 17:35 ` Sergei Shtylyov
2017-01-09 16:06 ` [PATCH 02/11] dmaengine: cppi41: Split out the interrupt handler Alexandre Bailon
[not found] ` <20170109160656.3470-3-abailon-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
2017-01-10 17:39 ` Sergei Shtylyov
2017-01-09 16:06 ` [PATCH 03/11] dmaengine: cppi41: Move some constants to glue layer Alexandre Bailon
2017-01-09 16:06 ` [PATCH 04/11] dmaengine: cppi41: init_sched(): Get number of channels from DT Alexandre Bailon
2017-01-09 16:06 ` [PATCH 05/11] dmaengine: cppi41: Add a way to test if the driver is running on am335x Alexandre Bailon
2017-01-09 16:06 ` [PATCH 06/11] dmaengine: cppi41: Only configure am335x's registers on amm335x platform Alexandre Bailon
2017-01-09 16:06 ` [PATCH 07/11] dt/bindings: da8xx-usb: Add binding for the cppi41 dma controller Alexandre Bailon
[not found] ` <20170109160656.3470-8-abailon-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
2017-01-09 18:41 ` Sergei Shtylyov
[not found] ` <6ae72fe4-ddb7-4dfc-8c8c-29b63636171b-M4DtvfQ/ZS1MRgGoP+s0PdBPR1lH4CV8@public.gmane.org>
2017-01-10 10:37 ` Alexandre Bailon
2017-01-09 16:06 ` [PATCH 08/11] dmaengine: cppi41: Implement the glue for da8xx Alexandre Bailon
[not found] ` <20170109160656.3470-9-abailon-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
2017-01-09 18:08 ` Grygorii Strashko
[not found] ` <fbc7f9f3-9b14-bc7f-0b40-15a6fedd48ea-l0cyMroinI0@public.gmane.org>
2017-01-10 9:38 ` Alexandre Bailon
[not found] ` <b3f902e0-ed08-dbee-52b8-e81afda082ac-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
2017-01-10 10:05 ` Sekhar Nori
[not found] ` <53a40635-2652-64fc-b20d-1cd6d813eacb-l0cyMroinI0@public.gmane.org>
2017-01-10 15:22 ` Alexandre Bailon
[not found] ` <43b9585d-a22f-a2ff-15d4-5d878bd1586a-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
2017-01-10 15:49 ` Tony Lindgren
[not found] ` <20170110154929.GU2630-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org>
2017-01-11 9:35 ` Sekhar Nori
2017-01-11 9:16 ` Alexandre Bailon
2017-01-10 17:53 ` Sergei Shtylyov
[not found] ` <2d8b3a2b-859d-bfda-74cf-f22471927fc4-M4DtvfQ/ZS1MRgGoP+s0PdBPR1lH4CV8@public.gmane.org>
2017-01-11 9:24 ` Alexandre Bailon
2017-01-09 16:06 ` [PATCH 09/11] dmaengine: cppi41: Fix a race between PM runtime and channel abort Alexandre Bailon
[not found] ` <20170109160656.3470-10-abailon-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
2017-01-10 17:55 ` Sergei Shtylyov
2017-01-09 16:06 ` Alexandre Bailon [this message]
2017-01-09 16:06 ` [PATCH 11/11] dmaengine: cppi41: Fix teardown warnings Alexandre Bailon
[not found] ` <20170109160656.3470-12-abailon-rdvid1DuHRBWk0Htik3J/w@public.gmane.org>
2017-01-09 18:46 ` Sergei Shtylyov
[not found] ` <72228045-8c2d-3ea4-3fbb-00477b47a80b-M4DtvfQ/ZS1MRgGoP+s0PdBPR1lH4CV8@public.gmane.org>
2017-01-10 11:11 ` Alexandre Bailon
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=20170109160656.3470-11-abailon@baylibre.com \
--to=abailon-rdvid1duhrbwk0htik3j/w@public.gmane.org \
--cc=b-liu-l0cyMroinI0@public.gmane.org \
--cc=devicetree-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=dmaengine-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=khilman-rdvid1DuHRBWk0Htik3J/w@public.gmane.org \
--cc=linux-omap-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=linux-usb-u79uwXL29TY76Z2rM5mHXA@public.gmane.org \
--cc=nsekhar-l0cyMroinI0@public.gmane.org \
--cc=ptitiano-rdvid1DuHRBWk0Htik3J/w@public.gmane.org \
--cc=robh+dt-DgEjT+Ai2ygdnm+yROfE0A@public.gmane.org \
--cc=tony-4v6yS6AI5VpBDgjK7y7TUQ@public.gmane.org \
--cc=vinod.koul-ral2JQCrhuEAvxtiuMwx3w@public.gmane.org \
/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 a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox