hc
2023-12-11 6778948f9de86c3cfaf36725a7c87dcff9ba247f
kernel/drivers/crypto/rockchip/rk_crypto_core.c
....@@ -272,9 +272,17 @@
272272 static void rk_crypto_irq_timer_handle(struct timer_list *t)
273273 {
274274 struct rk_crypto_dev *rk_dev = from_timer(rk_dev, t, timer);
275
+ unsigned long flags;
276
+
277
+ spin_lock_irqsave(&rk_dev->lock, flags);
275278
276279 rk_dev->err = -ETIMEDOUT;
277280 rk_dev->stat.timeout_cnt++;
281
+
282
+ rk_unload_data(rk_dev);
283
+
284
+ spin_unlock_irqrestore(&rk_dev->lock, flags);
285
+
278286 tasklet_schedule(&rk_dev->done_task);
279287 }
280288
....@@ -282,8 +290,12 @@
282290 {
283291 struct rk_crypto_dev *rk_dev = platform_get_drvdata(dev_id);
284292 struct rk_alg_ctx *alg_ctx;
293
+ unsigned long flags;
285294
286
- spin_lock(&rk_dev->lock);
295
+ spin_lock_irqsave(&rk_dev->lock, flags);
296
+
297
+ /* reset timeout timer */
298
+ start_irq_timer(rk_dev);
287299
288300 alg_ctx = rk_alg_ctx_cast(rk_dev->async_req);
289301
....@@ -292,9 +304,14 @@
292304 if (alg_ctx->ops.irq_handle)
293305 alg_ctx->ops.irq_handle(irq, dev_id);
294306
295
- tasklet_schedule(&rk_dev->done_task);
307
+ /* already trigger timeout */
308
+ if (rk_dev->err != -ETIMEDOUT) {
309
+ spin_unlock_irqrestore(&rk_dev->lock, flags);
310
+ tasklet_schedule(&rk_dev->done_task);
311
+ } else {
312
+ spin_unlock_irqrestore(&rk_dev->lock, flags);
313
+ }
296314
297
- spin_unlock(&rk_dev->lock);
298315 return IRQ_HANDLED;
299316 }
300317