hc
2023-11-06 e3e12f52b214121840b44c91de5b3e5af5d3eb84
kernel/drivers/crypto/rockchip/rk_crypto_core.c
....@@ -281,9 +281,11 @@
281281 static irqreturn_t rk_crypto_irq_handle(int irq, void *dev_id)
282282 {
283283 struct rk_crypto_dev *rk_dev = platform_get_drvdata(dev_id);
284
- struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev->async_req);
284
+ struct rk_alg_ctx *alg_ctx;
285285
286286 spin_lock(&rk_dev->lock);
287
+
288
+ alg_ctx = rk_alg_ctx_cast(rk_dev->async_req);
287289
288290 rk_dev->stat.irq_cnt++;
289291
....@@ -390,23 +392,22 @@
390392 struct crypto_async_request *async_req, *backlog;
391393 unsigned long flags;
392394
395
+ spin_lock_irqsave(&rk_dev->lock, flags);
393396 if (rk_dev->async_req) {
394397 dev_err(rk_dev->dev, "%s: Unexpected crypto paths.\n", __func__);
395
- return;
398
+ goto exit;
396399 }
397400
398401 rk_dev->err = 0;
399
- spin_lock_irqsave(&rk_dev->lock, flags);
402
+
400403 backlog = crypto_get_backlog(&rk_dev->queue);
401404 async_req = crypto_dequeue_request(&rk_dev->queue);
402405
403406 if (!async_req) {
404407 rk_dev->busy = false;
405
- spin_unlock_irqrestore(&rk_dev->lock, flags);
406
- return;
408
+ goto exit;
407409 }
408410 rk_dev->stat.dequeue_cnt++;
409
- spin_unlock_irqrestore(&rk_dev->lock, flags);
410411
411412 if (backlog) {
412413 backlog->complete(backlog, -EINPROGRESS);
....@@ -417,12 +418,26 @@
417418 rk_dev->err = rk_start_op(rk_dev);
418419 if (rk_dev->err)
419420 rk_complete_op(rk_dev, rk_dev->err);
421
+
422
+exit:
423
+ spin_unlock_irqrestore(&rk_dev->lock, flags);
420424 }
421425
422426 static void rk_crypto_done_task_cb(unsigned long data)
423427 {
424428 struct rk_crypto_dev *rk_dev = (struct rk_crypto_dev *)data;
425
- struct rk_alg_ctx *alg_ctx = rk_alg_ctx_cast(rk_dev->async_req);
429
+ struct rk_alg_ctx *alg_ctx;
430
+ unsigned long flags;
431
+
432
+ spin_lock_irqsave(&rk_dev->lock, flags);
433
+
434
+ if (!rk_dev->async_req) {
435
+ dev_err(rk_dev->dev, "done task receive invalid async_req\n");
436
+ spin_unlock_irqrestore(&rk_dev->lock, flags);
437
+ return;
438
+ }
439
+
440
+ alg_ctx = rk_alg_ctx_cast(rk_dev->async_req);
426441
427442 rk_dev->stat.done_cnt++;
428443
....@@ -440,9 +455,12 @@
440455 if (rk_dev->err)
441456 goto exit;
442457
458
+ spin_unlock_irqrestore(&rk_dev->lock, flags);
459
+
443460 return;
444461 exit:
445462 rk_complete_op(rk_dev, rk_dev->err);
463
+ spin_unlock_irqrestore(&rk_dev->lock, flags);
446464 }
447465
448466 static struct rk_crypto_algt *rk_crypto_find_algs(struct rk_crypto_dev *rk_dev,
....@@ -663,6 +681,12 @@
663681 static const struct of_device_id crypto_of_id_table[] = {
664682
665683 #if IS_ENABLED(CONFIG_CRYPTO_DEV_ROCKCHIP_V3)
684
+ /* crypto v4 in belows same with crypto-v3*/
685
+ {
686
+ .compatible = "rockchip,crypto-v4",
687
+ .data = (void *)&cryto_v3_soc_data,
688
+ },
689
+
666690 /* crypto v3 in belows */
667691 {
668692 .compatible = "rockchip,crypto-v3",