From 05e59e5fb0064c97a1c10921ecd549f2d4a58565 Mon Sep 17 00:00:00 2001
From: hc <hc@nodka.com>
Date: Wed, 09 Oct 2024 06:14:40 +0000
Subject: [PATCH] add REDIRECT
---
kernel/drivers/crypto/rockchip/rk_crypto_core.c | 23 ++++++++++++++++++++---
1 files changed, 20 insertions(+), 3 deletions(-)
diff --git a/kernel/drivers/crypto/rockchip/rk_crypto_core.c b/kernel/drivers/crypto/rockchip/rk_crypto_core.c
index 56a50d5..2a9cf2d 100644
--- a/kernel/drivers/crypto/rockchip/rk_crypto_core.c
+++ b/kernel/drivers/crypto/rockchip/rk_crypto_core.c
@@ -272,9 +272,17 @@
static void rk_crypto_irq_timer_handle(struct timer_list *t)
{
struct rk_crypto_dev *rk_dev = from_timer(rk_dev, t, timer);
+ unsigned long flags;
+
+ spin_lock_irqsave(&rk_dev->lock, flags);
rk_dev->err = -ETIMEDOUT;
rk_dev->stat.timeout_cnt++;
+
+ rk_unload_data(rk_dev);
+
+ spin_unlock_irqrestore(&rk_dev->lock, flags);
+
tasklet_schedule(&rk_dev->done_task);
}
@@ -282,8 +290,12 @@
{
struct rk_crypto_dev *rk_dev = platform_get_drvdata(dev_id);
struct rk_alg_ctx *alg_ctx;
+ unsigned long flags;
- spin_lock(&rk_dev->lock);
+ spin_lock_irqsave(&rk_dev->lock, flags);
+
+ /* reset timeout timer */
+ start_irq_timer(rk_dev);
alg_ctx = rk_alg_ctx_cast(rk_dev->async_req);
@@ -292,9 +304,14 @@
if (alg_ctx->ops.irq_handle)
alg_ctx->ops.irq_handle(irq, dev_id);
- tasklet_schedule(&rk_dev->done_task);
+ /* already trigger timeout */
+ if (rk_dev->err != -ETIMEDOUT) {
+ spin_unlock_irqrestore(&rk_dev->lock, flags);
+ tasklet_schedule(&rk_dev->done_task);
+ } else {
+ spin_unlock_irqrestore(&rk_dev->lock, flags);
+ }
- spin_unlock(&rk_dev->lock);
return IRQ_HANDLED;
}
--
Gitblit v1.6.2