- the loaded firmware may not support crypto at all or
   only support DES and 3DES but not AES or
   support DES, 3DES and AES.

 - in case of no crypto support of the firmware, the module load will fail.
 - in case of missing AES support, the AES algorithms are not registered
   and a warning is printed during module load.

Signed-off-by: Christian Hohnstaedt <chohnsta...@innominate.com>
---
 drivers/crypto/ixp4xx_crypto.c |   33 ++++++++++++++++++++++++++++++++-
 1 files changed, 32 insertions(+), 1 deletions(-)

diff --git a/drivers/crypto/ixp4xx_crypto.c b/drivers/crypto/ixp4xx_crypto.c
index fdcd0ab..f72f414 100644
--- a/drivers/crypto/ixp4xx_crypto.c
+++ b/drivers/crypto/ixp4xx_crypto.c
@@ -415,6 +415,7 @@ static void crypto_done_action(unsigned long arg)
 static int init_ixp_crypto(void)
 {
        int ret = -ENODEV;
+       u32 msg[2] = { 0, 0 };
 
        if (! ( ~(*IXP4XX_EXP_CFG2) & (IXP4XX_FEATURE_HASH |
                                IXP4XX_FEATURE_AES | IXP4XX_FEATURE_DES))) {
@@ -426,9 +427,35 @@ static int init_ixp_crypto(void)
                return ret;
 
        if (!npe_running(npe_c)) {
-               npe_load_firmware(npe_c, npe_name(npe_c), dev);
+               ret = npe_load_firmware(npe_c, npe_name(npe_c), dev);
+               if (ret) {
+                       return ret;
+               }
+               if (npe_recv_message(npe_c, msg, "STATUS_MSG"))
+                       goto npe_error;
+       } else {
+               if (npe_send_message(npe_c, msg, "STATUS_MSG"))
+                       goto npe_error;
+
+               if (npe_recv_message(npe_c, msg, "STATUS_MSG"))
+                       goto npe_error;
        }
 
+       switch ((msg[1]>>16) & 0xff) {
+       case 3:
+               printk(KERN_WARNING "Firmware of %s lacks AES support\n",
+                               npe_name(npe_c));
+               support_aes = 0;
+               break;
+       case 4:
+       case 5:
+               support_aes = 1;
+               break;
+       default:
+               printk(KERN_ERR "Firmware of %s lacks crypto support\n",
+                       npe_name(npe_c));
+               return -ENODEV;
+       }
        /* buffer_pool will also be used to sometimes store the hmac,
         * so assure it is large enough
         */
@@ -457,6 +484,10 @@ static int init_ixp_crypto(void)
 
        qmgr_enable_irq(RECV_QID);
        return 0;
+
+npe_error:
+       printk(KERN_ERR "%s not responding\n", npe_name(npe_c));
+       ret = -EIO;
 err:
        if (ctx_pool)
                dma_pool_destroy(ctx_pool);
-- 
1.6.0.3

--
To unsubscribe from this list: send the line "unsubscribe linux-crypto" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to