diff options
Diffstat (limited to 'drivers/crypto/ixp4xx_crypto.c')
| -rw-r--r-- | 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 f9f05d7a707d..6c6656d3b1e2 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) | |||
| 415 | static int init_ixp_crypto(void) | 415 | static int init_ixp_crypto(void) | 
| 416 | { | 416 | { | 
| 417 | int ret = -ENODEV; | 417 | int ret = -ENODEV; | 
| 418 | u32 msg[2] = { 0, 0 }; | ||
| 418 | 419 | ||
| 419 | if (! ( ~(*IXP4XX_EXP_CFG2) & (IXP4XX_FEATURE_HASH | | 420 | if (! ( ~(*IXP4XX_EXP_CFG2) & (IXP4XX_FEATURE_HASH | | 
| 420 | IXP4XX_FEATURE_AES | IXP4XX_FEATURE_DES))) { | 421 | IXP4XX_FEATURE_AES | IXP4XX_FEATURE_DES))) { | 
| @@ -426,9 +427,35 @@ static int init_ixp_crypto(void) | |||
| 426 | return ret; | 427 | return ret; | 
| 427 | 428 | ||
| 428 | if (!npe_running(npe_c)) { | 429 | if (!npe_running(npe_c)) { | 
| 429 | npe_load_firmware(npe_c, npe_name(npe_c), dev); | 430 | ret = npe_load_firmware(npe_c, npe_name(npe_c), dev); | 
| 431 | if (ret) { | ||
| 432 | return ret; | ||
| 433 | } | ||
| 434 | if (npe_recv_message(npe_c, msg, "STATUS_MSG")) | ||
| 435 | goto npe_error; | ||
| 436 | } else { | ||
| 437 | if (npe_send_message(npe_c, msg, "STATUS_MSG")) | ||
| 438 | goto npe_error; | ||
| 439 | |||
| 440 | if (npe_recv_message(npe_c, msg, "STATUS_MSG")) | ||
| 441 | goto npe_error; | ||
| 430 | } | 442 | } | 
| 431 | 443 | ||
| 444 | switch ((msg[1]>>16) & 0xff) { | ||
| 445 | case 3: | ||
| 446 | printk(KERN_WARNING "Firmware of %s lacks AES support\n", | ||
| 447 | npe_name(npe_c)); | ||
| 448 | support_aes = 0; | ||
| 449 | break; | ||
| 450 | case 4: | ||
| 451 | case 5: | ||
| 452 | support_aes = 1; | ||
| 453 | break; | ||
| 454 | default: | ||
| 455 | printk(KERN_ERR "Firmware of %s lacks crypto support\n", | ||
| 456 | npe_name(npe_c)); | ||
| 457 | return -ENODEV; | ||
| 458 | } | ||
| 432 | /* buffer_pool will also be used to sometimes store the hmac, | 459 | /* buffer_pool will also be used to sometimes store the hmac, | 
| 433 | * so assure it is large enough | 460 | * so assure it is large enough | 
| 434 | */ | 461 | */ | 
| @@ -459,6 +486,10 @@ static int init_ixp_crypto(void) | |||
| 459 | 486 | ||
| 460 | qmgr_enable_irq(RECV_QID); | 487 | qmgr_enable_irq(RECV_QID); | 
| 461 | return 0; | 488 | return 0; | 
| 489 | |||
| 490 | npe_error: | ||
| 491 | printk(KERN_ERR "%s not responding\n", npe_name(npe_c)); | ||
| 492 | ret = -EIO; | ||
| 462 | err: | 493 | err: | 
| 463 | if (ctx_pool) | 494 | if (ctx_pool) | 
| 464 | dma_pool_destroy(ctx_pool); | 495 | dma_pool_destroy(ctx_pool); | 
