crypto: caam - handle interrupt lines shared across rings
- add IRQF_SHARED to request_irq flags to support parts such as the p1023 that has one IRQ line per couple of rings. - resetting a job ring triggers an interrupt, so move request_irq prior to jr_reset to avoid 'got IRQ but nobody cared' messages. - disable IRQs in h/w to avoid contention between reset and interrupt status - delete invalid comment - if there were incomplete jobs, module would be in use, preventing an unload. Signed-off-by: Kim Phillips <kim.phillips@freescale.com> Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
This commit is contained in:
parent
bf36275903
commit
9620fd959f
|
@ -292,10 +292,10 @@ static int caam_reset_hw_jr(struct device *dev)
|
||||||
unsigned int timeout = 100000;
|
unsigned int timeout = 100000;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* FIXME: disabling IRQs here inhibits proper job completion
|
* mask interrupts since we are going to poll
|
||||||
* and error propagation
|
* for reset completion status
|
||||||
*/
|
*/
|
||||||
disable_irq(jrp->irq);
|
setbits32(&jrp->rregs->rconfig_lo, JRCFG_IMSK);
|
||||||
|
|
||||||
/* initiate flush (required prior to reset) */
|
/* initiate flush (required prior to reset) */
|
||||||
wr_reg32(&jrp->rregs->jrcommand, JRCR_RESET);
|
wr_reg32(&jrp->rregs->jrcommand, JRCR_RESET);
|
||||||
|
@ -320,7 +320,8 @@ static int caam_reset_hw_jr(struct device *dev)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
enable_irq(jrp->irq);
|
/* unmask interrupts */
|
||||||
|
clrbits32(&jrp->rregs->rconfig_lo, JRCFG_IMSK);
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -336,6 +337,21 @@ static int caam_jr_init(struct device *dev)
|
||||||
|
|
||||||
jrp = dev_get_drvdata(dev);
|
jrp = dev_get_drvdata(dev);
|
||||||
|
|
||||||
|
/* Connect job ring interrupt handler. */
|
||||||
|
for_each_possible_cpu(i)
|
||||||
|
tasklet_init(&jrp->irqtask[i], caam_jr_dequeue,
|
||||||
|
(unsigned long)dev);
|
||||||
|
|
||||||
|
error = request_irq(jrp->irq, caam_jr_interrupt, IRQF_SHARED,
|
||||||
|
"caam-jobr", dev);
|
||||||
|
if (error) {
|
||||||
|
dev_err(dev, "can't connect JobR %d interrupt (%d)\n",
|
||||||
|
jrp->ridx, jrp->irq);
|
||||||
|
irq_dispose_mapping(jrp->irq);
|
||||||
|
jrp->irq = 0;
|
||||||
|
return -EINVAL;
|
||||||
|
}
|
||||||
|
|
||||||
error = caam_reset_hw_jr(dev);
|
error = caam_reset_hw_jr(dev);
|
||||||
if (error)
|
if (error)
|
||||||
return error;
|
return error;
|
||||||
|
@ -404,28 +420,6 @@ static int caam_jr_init(struct device *dev)
|
||||||
(JOBR_INTC_COUNT_THLD << JRCFG_ICDCT_SHIFT) |
|
(JOBR_INTC_COUNT_THLD << JRCFG_ICDCT_SHIFT) |
|
||||||
(JOBR_INTC_TIME_THLD << JRCFG_ICTT_SHIFT));
|
(JOBR_INTC_TIME_THLD << JRCFG_ICTT_SHIFT));
|
||||||
|
|
||||||
/* Connect job ring interrupt handler. */
|
|
||||||
for_each_possible_cpu(i)
|
|
||||||
tasklet_init(&jrp->irqtask[i], caam_jr_dequeue,
|
|
||||||
(unsigned long)dev);
|
|
||||||
|
|
||||||
error = request_irq(jrp->irq, caam_jr_interrupt, 0,
|
|
||||||
"caam-jobr", dev);
|
|
||||||
if (error) {
|
|
||||||
dev_err(dev, "can't connect JobR %d interrupt (%d)\n",
|
|
||||||
jrp->ridx, jrp->irq);
|
|
||||||
irq_dispose_mapping(jrp->irq);
|
|
||||||
jrp->irq = 0;
|
|
||||||
dma_unmap_single(dev, inpbusaddr, sizeof(u32 *) * JOBR_DEPTH,
|
|
||||||
DMA_BIDIRECTIONAL);
|
|
||||||
dma_unmap_single(dev, outbusaddr, sizeof(u32 *) * JOBR_DEPTH,
|
|
||||||
DMA_BIDIRECTIONAL);
|
|
||||||
kfree(jrp->inpring);
|
|
||||||
kfree(jrp->outring);
|
|
||||||
kfree(jrp->entinfo);
|
|
||||||
return -EINVAL;
|
|
||||||
}
|
|
||||||
|
|
||||||
jrp->assign = JOBR_UNASSIGNED;
|
jrp->assign = JOBR_UNASSIGNED;
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue