crypto: omap-aes - fix crypto engine initialization order
authorTero Kristo <t-kristo@ti.com>
Thu, 4 Aug 2016 10:28:45 +0000 (13:28 +0300)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 13 Sep 2016 12:26:17 +0000 (20:26 +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: 0529900a01cb ("crypto: omap-aes - Support 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-aes.c

index 975288d..2033769 100644 (file)
@@ -1213,6 +1213,17 @@ static int omap_aes_probe(struct platform_device *pdev)
        list_add_tail(&dd->list, &dev_list);
        spin_unlock(&list_lock);
 
+       /* Initialize crypto engine */
+       dd->engine = crypto_engine_alloc_init(dev, 1);
+       if (!dd->engine)
+               goto err_engine;
+
+       dd->engine->prepare_cipher_request = omap_aes_prepare_req;
+       dd->engine->cipher_one_request = omap_aes_crypt_req;
+       err = crypto_engine_start(dd->engine);
+       if (err)
+               goto err_engine;
+
        for (i = 0; i < dd->pdata->algs_info_size; i++) {
                if (!dd->pdata->algs_info[i].registered) {
                        for (j = 0; j < dd->pdata->algs_info[i].size; j++) {
@@ -1230,26 +1241,17 @@ static int omap_aes_probe(struct platform_device *pdev)
                }
        }
 
-       /* Initialize crypto engine */
-       dd->engine = crypto_engine_alloc_init(dev, 1);
-       if (!dd->engine)
-               goto err_algs;
-
-       dd->engine->prepare_cipher_request = omap_aes_prepare_req;
-       dd->engine->cipher_one_request = omap_aes_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_aes_dma_cleanup(dd);
 err_irq:
        tasklet_kill(&dd->done_task);