Commit ca38a814 authored by Lee Nipper's avatar Lee Nipper Committed by Herbert Xu

crypto: talitos - Ack done interrupt in isr instead of tasklet

Previous commit for interrupt mitigation moved the done interrupt
acknowlegement from the isr to the talitos_done tasklet.
This patch moves the done interrupt acknowledgement back
into the isr so that done interrupts will always be acknowledged.
This covers the case for acknowledging interrupts for channel done processing
that has actually already been completed by the tasklet prior to fielding
a pending interrupt.
Signed-off-by: default avatarLee Nipper <lee.nipper@freescale.com>
Signed-off-by: default avatarKim Phillips <kim.phillips@freescale.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent bcf84a38
...@@ -330,11 +330,9 @@ static void flush_channel(struct device *dev, int ch, int error, int reset_ch) ...@@ -330,11 +330,9 @@ static void flush_channel(struct device *dev, int ch, int error, int reset_ch)
/* descriptors with their done bits set don't get the error */ /* descriptors with their done bits set don't get the error */
rmb(); rmb();
if ((request->desc->hdr & DESC_HDR_DONE) == DESC_HDR_DONE) { if ((request->desc->hdr & DESC_HDR_DONE) == DESC_HDR_DONE)
status = 0; status = 0;
/* Ack each pkt completed on channel */ else
out_be32(priv->reg + TALITOS_ICR, (1 << (ch * 2)));
} else
if (!error) if (!error)
break; break;
else else
...@@ -575,17 +573,13 @@ static irqreturn_t talitos_interrupt(int irq, void *data) ...@@ -575,17 +573,13 @@ static irqreturn_t talitos_interrupt(int irq, void *data)
isr = in_be32(priv->reg + TALITOS_ISR); isr = in_be32(priv->reg + TALITOS_ISR);
isr_lo = in_be32(priv->reg + TALITOS_ISR_LO); isr_lo = in_be32(priv->reg + TALITOS_ISR_LO);
/* Acknowledge interrupt */
out_be32(priv->reg + TALITOS_ICR, isr);
out_be32(priv->reg + TALITOS_ICR_LO, isr_lo);
if (unlikely((isr & ~TALITOS_ISR_CHDONE) || isr_lo)) { if (unlikely((isr & ~TALITOS_ISR_CHDONE) || isr_lo))
/*
* Acknowledge error interrupts here.
* Done interrupts are ack'ed as part of done_task.
*/
out_be32(priv->reg + TALITOS_ICR, isr);
out_be32(priv->reg + TALITOS_ICR_LO, isr_lo);
talitos_error((unsigned long)data, isr, isr_lo); talitos_error((unsigned long)data, isr, isr_lo);
} else else
if (likely(isr & TALITOS_ISR_CHDONE)) { if (likely(isr & TALITOS_ISR_CHDONE)) {
/* mask further done interrupts. */ /* mask further done interrupts. */
clrbits32(priv->reg + TALITOS_IMR, TALITOS_IMR_DONE); clrbits32(priv->reg + TALITOS_IMR, TALITOS_IMR_DONE);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment