Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 1d1f98d1 authored by Tero Kristo's avatar Tero Kristo Committed by Herbert Xu
Browse files

crypto: omap-des - fix crypto engine initialization order



The crypto engine must be initialized before registering algorithms,
otherwise the test manager will crash as it attempts to execute
tests for the algos while they are being registered.

Fixes: f1b77aac ("crypto: omap-des - Integrate with the crypto engine framework")
Signed-off-by: default avatarTero Kristo <t-kristo@ti.com>
Signed-off-by: default avatarHerbert Xu <herbert@gondor.apana.org.au>
parent 0d0cda93
Loading
Loading
Loading
Loading
+15 −13
Original line number Diff line number Diff line
@@ -1079,6 +1079,17 @@ static int omap_des_probe(struct platform_device *pdev)
	list_add_tail(&dd->list, &dev_list);
	spin_unlock(&list_lock);

	/* Initialize des crypto engine */
	dd->engine = crypto_engine_alloc_init(dev, 1);
	if (!dd->engine)
		goto err_engine;

	dd->engine->prepare_cipher_request = omap_des_prepare_req;
	dd->engine->cipher_one_request = omap_des_crypt_req;
	err = crypto_engine_start(dd->engine);
	if (err)
		goto err_engine;

	for (i = 0; i < dd->pdata->algs_info_size; i++) {
		for (j = 0; j < dd->pdata->algs_info[i].size; j++) {
			algp = &dd->pdata->algs_info[i].algs_list[j];
@@ -1094,27 +1105,18 @@ static int omap_des_probe(struct platform_device *pdev)
		}
	}

	/* Initialize des crypto engine */
	dd->engine = crypto_engine_alloc_init(dev, 1);
	if (!dd->engine)
		goto err_algs;

	dd->engine->prepare_cipher_request = omap_des_prepare_req;
	dd->engine->cipher_one_request = omap_des_crypt_req;
	err = crypto_engine_start(dd->engine);
	if (err)
		goto err_engine;

	return 0;

err_engine:
	crypto_engine_exit(dd->engine);
err_algs:
	for (i = dd->pdata->algs_info_size - 1; i >= 0; i--)
		for (j = dd->pdata->algs_info[i].registered - 1; j >= 0; j--)
			crypto_unregister_alg(
					&dd->pdata->algs_info[i].algs_list[j]);

err_engine:
	if (dd->engine)
		crypto_engine_exit(dd->engine);

	omap_des_dma_cleanup(dd);
err_irq:
	tasklet_kill(&dd->done_task);