mirror of https://github.com/hak5/openwrt.git
72 lines
2.4 KiB
Diff
72 lines
2.4 KiB
Diff
From 4baa099377d73ea99c7802a9685815b32e8bf119 Mon Sep 17 00:00:00 2001
|
|
From: Christian Lamparter <chunkeey@gmail.com>
|
|
Date: Thu, 21 Dec 2017 15:08:18 +0100
|
|
Subject: [PATCH 1/6] crypto: crypto4xx - shuffle iomap in front of request_irq
|
|
|
|
It is possible to avoid the ce_base null pointer check in the
|
|
drivers' interrupt handler routine "crypto4xx_ce_interrupt_handler()"
|
|
by simply doing the iomap in front of the IRQ registration.
|
|
|
|
This way, the ce_base will always be valid in the handler and
|
|
a branch in an critical path can be avoided.
|
|
|
|
Signed-off-by: Christian Lamparter <chunkeey@gmail.com>
|
|
---
|
|
drivers/crypto/amcc/crypto4xx_core.c | 21 +++++++++------------
|
|
1 file changed, 9 insertions(+), 12 deletions(-)
|
|
|
|
--- a/drivers/crypto/amcc/crypto4xx_core.c
|
|
+++ b/drivers/crypto/amcc/crypto4xx_core.c
|
|
@@ -1075,9 +1075,6 @@ static irqreturn_t crypto4xx_ce_interrup
|
|
struct device *dev = (struct device *)data;
|
|
struct crypto4xx_core_device *core_dev = dev_get_drvdata(dev);
|
|
|
|
- if (!core_dev->dev->ce_base)
|
|
- return 0;
|
|
-
|
|
writel(PPC4XX_INTERRUPT_CLR,
|
|
core_dev->dev->ce_base + CRYPTO4XX_INT_CLR);
|
|
tasklet_schedule(&core_dev->tasklet);
|
|
@@ -1325,13 +1322,6 @@ static int crypto4xx_probe(struct platfo
|
|
tasklet_init(&core_dev->tasklet, crypto4xx_bh_tasklet_cb,
|
|
(unsigned long) dev);
|
|
|
|
- /* Register for Crypto isr, Crypto Engine IRQ */
|
|
- core_dev->irq = irq_of_parse_and_map(ofdev->dev.of_node, 0);
|
|
- rc = request_irq(core_dev->irq, crypto4xx_ce_interrupt_handler, 0,
|
|
- core_dev->dev->name, dev);
|
|
- if (rc)
|
|
- goto err_request_irq;
|
|
-
|
|
core_dev->dev->ce_base = of_iomap(ofdev->dev.of_node, 0);
|
|
if (!core_dev->dev->ce_base) {
|
|
dev_err(dev, "failed to of_iomap\n");
|
|
@@ -1339,6 +1329,13 @@ static int crypto4xx_probe(struct platfo
|
|
goto err_iomap;
|
|
}
|
|
|
|
+ /* Register for Crypto isr, Crypto Engine IRQ */
|
|
+ core_dev->irq = irq_of_parse_and_map(ofdev->dev.of_node, 0);
|
|
+ rc = request_irq(core_dev->irq, crypto4xx_ce_interrupt_handler, 0,
|
|
+ core_dev->dev->name, dev);
|
|
+ if (rc)
|
|
+ goto err_request_irq;
|
|
+
|
|
/* need to setup pdr, rdr, gdr and sdr before this */
|
|
crypto4xx_hw_init(core_dev->dev);
|
|
|
|
@@ -1352,11 +1349,11 @@ static int crypto4xx_probe(struct platfo
|
|
return 0;
|
|
|
|
err_start_dev:
|
|
- iounmap(core_dev->dev->ce_base);
|
|
-err_iomap:
|
|
free_irq(core_dev->irq, dev);
|
|
err_request_irq:
|
|
irq_dispose_mapping(core_dev->irq);
|
|
+ iounmap(core_dev->dev->ce_base);
|
|
+err_iomap:
|
|
tasklet_kill(&core_dev->tasklet);
|
|
err_build_sdr:
|
|
crypto4xx_destroy_sdr(core_dev->dev);
|