crypto: omap-des - fix crypto engine initialization order
authorTero Kristo <t-kristo@ti.com>
Thu, 4 Aug 2016 10:28:46 +0000 (13:28 +0300)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 13 Sep 2016 12:27:20 +0000 (20:27 +0800)
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: f1b77aaca85a ("crypto: omap-des - Integrate with the crypto engine framework")
Signed-off-by: Tero Kristo <t-kristo@ti.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/omap-des.c

index c0a28b1c66e40e65f86ada8a4e85368fb5d307f2..2b20d960caa87065a391ada2b0036b6cf1bf7b30 100644 (file)
@@ -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);