diff options
| -rw-r--r-- | drivers/crypto/caam/key_gen.c | 29 |
1 files changed, 14 insertions, 15 deletions
diff --git a/drivers/crypto/caam/key_gen.c b/drivers/crypto/caam/key_gen.c index 871703c49d2c..e1eaf4ff9762 100644 --- a/drivers/crypto/caam/key_gen.c +++ b/drivers/crypto/caam/key_gen.c | |||
| @@ -48,23 +48,29 @@ int gen_split_key(struct device *jrdev, u8 *key_out, int split_key_len, | |||
| 48 | u32 *desc; | 48 | u32 *desc; |
| 49 | struct split_key_result result; | 49 | struct split_key_result result; |
| 50 | dma_addr_t dma_addr_in, dma_addr_out; | 50 | dma_addr_t dma_addr_in, dma_addr_out; |
| 51 | int ret = 0; | 51 | int ret = -ENOMEM; |
| 52 | 52 | ||
| 53 | desc = kmalloc(CAAM_CMD_SZ * 6 + CAAM_PTR_SZ * 2, GFP_KERNEL | GFP_DMA); | 53 | desc = kmalloc(CAAM_CMD_SZ * 6 + CAAM_PTR_SZ * 2, GFP_KERNEL | GFP_DMA); |
| 54 | if (!desc) { | 54 | if (!desc) { |
| 55 | dev_err(jrdev, "unable to allocate key input memory\n"); | 55 | dev_err(jrdev, "unable to allocate key input memory\n"); |
| 56 | return -ENOMEM; | 56 | return ret; |
| 57 | } | 57 | } |
| 58 | 58 | ||
| 59 | init_job_desc(desc, 0); | ||
| 60 | |||
| 61 | dma_addr_in = dma_map_single(jrdev, (void *)key_in, keylen, | 59 | dma_addr_in = dma_map_single(jrdev, (void *)key_in, keylen, |
| 62 | DMA_TO_DEVICE); | 60 | DMA_TO_DEVICE); |
| 63 | if (dma_mapping_error(jrdev, dma_addr_in)) { | 61 | if (dma_mapping_error(jrdev, dma_addr_in)) { |
| 64 | dev_err(jrdev, "unable to map key input memory\n"); | 62 | dev_err(jrdev, "unable to map key input memory\n"); |
| 65 | kfree(desc); | 63 | goto out_free; |
| 66 | return -ENOMEM; | ||
| 67 | } | 64 | } |
| 65 | |||
| 66 | dma_addr_out = dma_map_single(jrdev, key_out, split_key_pad_len, | ||
| 67 | DMA_FROM_DEVICE); | ||
| 68 | if (dma_mapping_error(jrdev, dma_addr_out)) { | ||
| 69 | dev_err(jrdev, "unable to map key output memory\n"); | ||
| 70 | goto out_unmap_in; | ||
| 71 | } | ||
| 72 | |||
| 73 | init_job_desc(desc, 0); | ||
| 68 | append_key(desc, dma_addr_in, keylen, CLASS_2 | KEY_DEST_CLASS_REG); | 74 | append_key(desc, dma_addr_in, keylen, CLASS_2 | KEY_DEST_CLASS_REG); |
| 69 | 75 | ||
| 70 | /* Sets MDHA up into an HMAC-INIT */ | 76 | /* Sets MDHA up into an HMAC-INIT */ |
| @@ -81,13 +87,6 @@ int gen_split_key(struct device *jrdev, u8 *key_out, int split_key_len, | |||
| 81 | * FIFO_STORE with the explicit split-key content store | 87 | * FIFO_STORE with the explicit split-key content store |
| 82 | * (0x26 output type) | 88 | * (0x26 output type) |
| 83 | */ | 89 | */ |
| 84 | dma_addr_out = dma_map_single(jrdev, key_out, split_key_pad_len, | ||
| 85 | DMA_FROM_DEVICE); | ||
| 86 | if (dma_mapping_error(jrdev, dma_addr_out)) { | ||
| 87 | dev_err(jrdev, "unable to map key output memory\n"); | ||
| 88 | kfree(desc); | ||
| 89 | return -ENOMEM; | ||
| 90 | } | ||
| 91 | append_fifo_store(desc, dma_addr_out, split_key_len, | 90 | append_fifo_store(desc, dma_addr_out, split_key_len, |
| 92 | LDST_CLASS_2_CCB | FIFOST_TYPE_SPLIT_KEK); | 91 | LDST_CLASS_2_CCB | FIFOST_TYPE_SPLIT_KEK); |
| 93 | 92 | ||
| @@ -115,10 +114,10 @@ int gen_split_key(struct device *jrdev, u8 *key_out, int split_key_len, | |||
| 115 | 114 | ||
| 116 | dma_unmap_single(jrdev, dma_addr_out, split_key_pad_len, | 115 | dma_unmap_single(jrdev, dma_addr_out, split_key_pad_len, |
| 117 | DMA_FROM_DEVICE); | 116 | DMA_FROM_DEVICE); |
| 117 | out_unmap_in: | ||
| 118 | dma_unmap_single(jrdev, dma_addr_in, keylen, DMA_TO_DEVICE); | 118 | dma_unmap_single(jrdev, dma_addr_in, keylen, DMA_TO_DEVICE); |
| 119 | 119 | out_free: | |
| 120 | kfree(desc); | 120 | kfree(desc); |
| 121 | |||
| 122 | return ret; | 121 | return ret; |
| 123 | } | 122 | } |
| 124 | EXPORT_SYMBOL(gen_split_key); | 123 | EXPORT_SYMBOL(gen_split_key); |
