| .. | .. | 
|---|
 | 1 | +// SPDX-License-Identifier: GPL-2.0-or-later  | 
|---|
| 1 | 2 |  /** | 
|---|
| 2 | 3 |   * AMCC SoC PPC4xx Crypto Driver | 
|---|
| 3 | 4 |   * | 
|---|
| 4 | 5 |   * Copyright (c) 2008 Applied Micro Circuits Corporation. | 
|---|
| 5 | 6 |   * All rights reserved. James Hsiao <jhsiao@amcc.com> | 
|---|
| 6 |  | - *  | 
|---|
| 7 |  | - * This program is free software; you can redistribute it and/or modify  | 
|---|
| 8 |  | - * it under the terms of the GNU General Public License as published by  | 
|---|
| 9 |  | - * the Free Software Foundation; either version 2 of the License, or  | 
|---|
| 10 |  | - * (at your option) any later version.  | 
|---|
| 11 |  | - *  | 
|---|
| 12 |  | - * This program is distributed in the hope that it will be useful,  | 
|---|
| 13 |  | - * but WITHOUT ANY WARRANTY; without even the implied warranty of  | 
|---|
| 14 |  | - * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the  | 
|---|
| 15 |  | - * GNU General Public License for more details.  | 
|---|
| 16 | 7 |   * | 
|---|
| 17 | 8 |   * This file implements AMCC crypto offload Linux device driver for use with | 
|---|
| 18 | 9 |   * Linux CryptoAPI. | 
|---|
| .. | .. | 
|---|
| 40 | 31 |  #include <crypto/ctr.h> | 
|---|
| 41 | 32 |  #include <crypto/gcm.h> | 
|---|
| 42 | 33 |  #include <crypto/sha.h> | 
|---|
 | 34 | +#include <crypto/rng.h>  | 
|---|
| 43 | 35 |  #include <crypto/scatterwalk.h> | 
|---|
| 44 | 36 |  #include <crypto/skcipher.h> | 
|---|
| 45 | 37 |  #include <crypto/internal/aead.h> | 
|---|
 | 38 | +#include <crypto/internal/rng.h>  | 
|---|
| 46 | 39 |  #include <crypto/internal/skcipher.h> | 
|---|
| 47 | 40 |  #include "crypto4xx_reg_def.h" | 
|---|
| 48 | 41 |  #include "crypto4xx_core.h" | 
|---|
| .. | .. | 
|---|
| 176 | 169 |  	int i; | 
|---|
| 177 | 170 |  	dev->pdr = dma_alloc_coherent(dev->core_dev->device, | 
|---|
| 178 | 171 |  				      sizeof(struct ce_pd) * PPC4XX_NUM_PD, | 
|---|
| 179 |  | -				      &dev->pdr_pa, GFP_ATOMIC);  | 
|---|
 | 172 | +				      &dev->pdr_pa, GFP_KERNEL);  | 
|---|
| 180 | 173 |  	if (!dev->pdr) | 
|---|
| 181 | 174 |  		return -ENOMEM; | 
|---|
| 182 | 175 |   | 
|---|
| .. | .. | 
|---|
| 189 | 182 |  				  dev->pdr_pa); | 
|---|
| 190 | 183 |  		return -ENOMEM; | 
|---|
| 191 | 184 |  	} | 
|---|
| 192 |  | -	memset(dev->pdr, 0, sizeof(struct ce_pd) * PPC4XX_NUM_PD);  | 
|---|
| 193 | 185 |  	dev->shadow_sa_pool = dma_alloc_coherent(dev->core_dev->device, | 
|---|
| 194 | 186 |  				   sizeof(union shadow_sa_buf) * PPC4XX_NUM_PD, | 
|---|
| 195 | 187 |  				   &dev->shadow_sa_pool_pa, | 
|---|
| 196 |  | -				   GFP_ATOMIC);  | 
|---|
 | 188 | +				   GFP_KERNEL);  | 
|---|
| 197 | 189 |  	if (!dev->shadow_sa_pool) | 
|---|
| 198 | 190 |  		return -ENOMEM; | 
|---|
| 199 | 191 |   | 
|---|
| 200 | 192 |  	dev->shadow_sr_pool = dma_alloc_coherent(dev->core_dev->device, | 
|---|
| 201 | 193 |  			 sizeof(struct sa_state_record) * PPC4XX_NUM_PD, | 
|---|
| 202 |  | -			 &dev->shadow_sr_pool_pa, GFP_ATOMIC);  | 
|---|
 | 194 | +			 &dev->shadow_sr_pool_pa, GFP_KERNEL);  | 
|---|
| 203 | 195 |  	if (!dev->shadow_sr_pool) | 
|---|
| 204 | 196 |  		return -ENOMEM; | 
|---|
| 205 | 197 |  	for (i = 0; i < PPC4XX_NUM_PD; i++) { | 
|---|
| .. | .. | 
|---|
| 283 | 275 |   */ | 
|---|
| 284 | 276 |  static u32 crypto4xx_build_gdr(struct crypto4xx_device *dev) | 
|---|
| 285 | 277 |  { | 
|---|
| 286 |  | -	dev->gdr = dma_zalloc_coherent(dev->core_dev->device,  | 
|---|
| 287 |  | -				       sizeof(struct ce_gd) * PPC4XX_NUM_GD,  | 
|---|
| 288 |  | -				       &dev->gdr_pa, GFP_ATOMIC);  | 
|---|
 | 278 | +	dev->gdr = dma_alloc_coherent(dev->core_dev->device,  | 
|---|
 | 279 | +				      sizeof(struct ce_gd) * PPC4XX_NUM_GD,  | 
|---|
 | 280 | +				      &dev->gdr_pa, GFP_KERNEL);  | 
|---|
| 289 | 281 |  	if (!dev->gdr) | 
|---|
| 290 | 282 |  		return -ENOMEM; | 
|---|
| 291 | 283 |   | 
|---|
| .. | .. | 
|---|
| 294 | 286 |   | 
|---|
| 295 | 287 |  static inline void crypto4xx_destroy_gdr(struct crypto4xx_device *dev) | 
|---|
| 296 | 288 |  { | 
|---|
| 297 |  | -	dma_free_coherent(dev->core_dev->device,  | 
|---|
 | 289 | +	if (dev->gdr)  | 
|---|
 | 290 | +		dma_free_coherent(dev->core_dev->device,  | 
|---|
| 298 | 291 |  			  sizeof(struct ce_gd) * PPC4XX_NUM_GD, | 
|---|
| 299 | 292 |  			  dev->gdr, dev->gdr_pa); | 
|---|
| 300 | 293 |  } | 
|---|
| .. | .. | 
|---|
| 362 | 355 |  { | 
|---|
| 363 | 356 |  	int i; | 
|---|
| 364 | 357 |   | 
|---|
| 365 |  | -	/* alloc memory for scatter descriptor ring */  | 
|---|
| 366 |  | -	dev->sdr = dma_alloc_coherent(dev->core_dev->device,  | 
|---|
| 367 |  | -				      sizeof(struct ce_sd) * PPC4XX_NUM_SD,  | 
|---|
| 368 |  | -				      &dev->sdr_pa, GFP_ATOMIC);  | 
|---|
| 369 |  | -	if (!dev->sdr)  | 
|---|
| 370 |  | -		return -ENOMEM;  | 
|---|
| 371 |  | -  | 
|---|
| 372 | 358 |  	dev->scatter_buffer_va = | 
|---|
| 373 | 359 |  		dma_alloc_coherent(dev->core_dev->device, | 
|---|
| 374 | 360 |  			PPC4XX_SD_BUFFER_SIZE * PPC4XX_NUM_SD, | 
|---|
| 375 |  | -			&dev->scatter_buffer_pa, GFP_ATOMIC);  | 
|---|
 | 361 | +			&dev->scatter_buffer_pa, GFP_KERNEL);  | 
|---|
| 376 | 362 |  	if (!dev->scatter_buffer_va) | 
|---|
 | 363 | +		return -ENOMEM;  | 
|---|
 | 364 | +  | 
|---|
 | 365 | +	/* alloc memory for scatter descriptor ring */  | 
|---|
 | 366 | +	dev->sdr = dma_alloc_coherent(dev->core_dev->device,  | 
|---|
 | 367 | +				      sizeof(struct ce_sd) * PPC4XX_NUM_SD,  | 
|---|
 | 368 | +				      &dev->sdr_pa, GFP_KERNEL);  | 
|---|
 | 369 | +	if (!dev->sdr)  | 
|---|
| 377 | 370 |  		return -ENOMEM; | 
|---|
| 378 | 371 |   | 
|---|
| 379 | 372 |  	for (i = 0; i < PPC4XX_NUM_SD; i++) { | 
|---|
| .. | .. | 
|---|
| 529 | 522 |  { | 
|---|
| 530 | 523 |  	struct skcipher_request *req; | 
|---|
| 531 | 524 |  	struct scatterlist *dst; | 
|---|
| 532 |  | -	dma_addr_t addr;  | 
|---|
| 533 | 525 |   | 
|---|
| 534 | 526 |  	req = skcipher_request_cast(pd_uinfo->async_req); | 
|---|
| 535 | 527 |   | 
|---|
| 536 |  | -	if (pd_uinfo->using_sd) {  | 
|---|
 | 528 | +	if (pd_uinfo->sa_va->sa_command_0.bf.scatter) {  | 
|---|
| 537 | 529 |  		crypto4xx_copy_pkt_to_dst(dev, pd, pd_uinfo, | 
|---|
| 538 | 530 |  					  req->cryptlen, req->dst); | 
|---|
| 539 | 531 |  	} else { | 
|---|
| 540 | 532 |  		dst = pd_uinfo->dest_va; | 
|---|
| 541 |  | -		addr = dma_map_page(dev->core_dev->device, sg_page(dst),  | 
|---|
| 542 |  | -				    dst->offset, dst->length, DMA_FROM_DEVICE);  | 
|---|
 | 533 | +		dma_unmap_page(dev->core_dev->device, pd->dest, dst->length,  | 
|---|
 | 534 | +			       DMA_FROM_DEVICE);  | 
|---|
| 543 | 535 |  	} | 
|---|
| 544 | 536 |   | 
|---|
| 545 | 537 |  	if (pd_uinfo->sa_va->sa_command_0.bf.save_iv == SA_SAVE_IV) { | 
|---|
| .. | .. | 
|---|
| 564 | 556 |  	struct ahash_request *ahash_req; | 
|---|
| 565 | 557 |   | 
|---|
| 566 | 558 |  	ahash_req = ahash_request_cast(pd_uinfo->async_req); | 
|---|
| 567 |  | -	ctx  = crypto_tfm_ctx(ahash_req->base.tfm);  | 
|---|
 | 559 | +	ctx = crypto_ahash_ctx(crypto_ahash_reqtfm(ahash_req));  | 
|---|
| 568 | 560 |   | 
|---|
| 569 |  | -	crypto4xx_copy_digest_to_dst(ahash_req->result, pd_uinfo,  | 
|---|
| 570 |  | -				     crypto_tfm_ctx(ahash_req->base.tfm));  | 
|---|
 | 561 | +	crypto4xx_copy_digest_to_dst(ahash_req->result, pd_uinfo, ctx);  | 
|---|
| 571 | 562 |  	crypto4xx_ret_sg_desc(dev, pd_uinfo); | 
|---|
| 572 | 563 |   | 
|---|
| 573 | 564 |  	if (pd_uinfo->state & PD_ENTRY_BUSY) | 
|---|
| .. | .. | 
|---|
| 587 | 578 |  	u32 icv[AES_BLOCK_SIZE]; | 
|---|
| 588 | 579 |  	int err = 0; | 
|---|
| 589 | 580 |   | 
|---|
| 590 |  | -	if (pd_uinfo->using_sd) {  | 
|---|
 | 581 | +	if (pd_uinfo->sa_va->sa_command_0.bf.scatter) {  | 
|---|
| 591 | 582 |  		crypto4xx_copy_pkt_to_dst(dev, pd, pd_uinfo, | 
|---|
| 592 | 583 |  					  pd->pd_ctl_len.bf.pkt_len, | 
|---|
| 593 | 584 |  					  dst); | 
|---|
| 594 | 585 |  	} else { | 
|---|
| 595 |  | -		__dma_sync_page(sg_page(dst), dst->offset, dst->length,  | 
|---|
 | 586 | +		dma_unmap_page(dev->core_dev->device, pd->dest, dst->length,  | 
|---|
| 596 | 587 |  				DMA_FROM_DEVICE); | 
|---|
| 597 | 588 |  	} | 
|---|
| 598 | 589 |   | 
|---|
| .. | .. | 
|---|
| 881 | 872 |  		 * we know application give us dst a whole piece of memory | 
|---|
| 882 | 873 |  		 * no need to use scatter ring. | 
|---|
| 883 | 874 |  		 */ | 
|---|
| 884 |  | -		pd_uinfo->using_sd = 0;  | 
|---|
| 885 | 875 |  		pd_uinfo->first_sd = 0xffffffff; | 
|---|
| 886 | 876 |  		sa->sa_command_0.bf.scatter = 0; | 
|---|
| 887 | 877 |  		pd->dest = (u32)dma_map_page(dev->core_dev->device, | 
|---|
| .. | .. | 
|---|
| 895 | 885 |  		u32 sd_idx = fst_sd; | 
|---|
| 896 | 886 |  		nbytes = datalen; | 
|---|
| 897 | 887 |  		sa->sa_command_0.bf.scatter = 1; | 
|---|
| 898 |  | -		pd_uinfo->using_sd = 1;  | 
|---|
| 899 | 888 |  		pd_uinfo->first_sd = fst_sd; | 
|---|
| 900 | 889 |  		sd = crypto4xx_get_sdp(dev, &sd_dma, sd_idx); | 
|---|
| 901 | 890 |  		pd->dest = sd_dma; | 
|---|
| .. | .. | 
|---|
| 959 | 948 |   | 
|---|
| 960 | 949 |  	if (alg->base.cra_flags & CRYPTO_ALG_NEED_FALLBACK) { | 
|---|
| 961 | 950 |  		ctx->sw_cipher.cipher = | 
|---|
| 962 |  | -			crypto_alloc_skcipher(alg->base.cra_name, 0,  | 
|---|
| 963 |  | -					      CRYPTO_ALG_NEED_FALLBACK |  | 
|---|
| 964 |  | -					      CRYPTO_ALG_ASYNC);  | 
|---|
 | 951 | +			crypto_alloc_sync_skcipher(alg->base.cra_name, 0,  | 
|---|
 | 952 | +					      CRYPTO_ALG_NEED_FALLBACK);  | 
|---|
| 965 | 953 |  		if (IS_ERR(ctx->sw_cipher.cipher)) | 
|---|
| 966 | 954 |  			return PTR_ERR(ctx->sw_cipher.cipher); | 
|---|
| 967 |  | -  | 
|---|
| 968 |  | -		crypto_skcipher_set_reqsize(sk,  | 
|---|
| 969 |  | -			sizeof(struct skcipher_request) + 32 +  | 
|---|
| 970 |  | -			crypto_skcipher_reqsize(ctx->sw_cipher.cipher));  | 
|---|
| 971 | 955 |  	} | 
|---|
| 972 | 956 |   | 
|---|
| 973 | 957 |  	amcc_alg = container_of(alg, struct crypto4xx_alg, alg.u.cipher); | 
|---|
| .. | .. | 
|---|
| 986 | 970 |   | 
|---|
| 987 | 971 |  	crypto4xx_common_exit(ctx); | 
|---|
| 988 | 972 |  	if (ctx->sw_cipher.cipher) | 
|---|
| 989 |  | -		crypto_free_skcipher(ctx->sw_cipher.cipher);  | 
|---|
 | 973 | +		crypto_free_sync_skcipher(ctx->sw_cipher.cipher);  | 
|---|
| 990 | 974 |  } | 
|---|
| 991 | 975 |   | 
|---|
| 992 | 976 |  static int crypto4xx_aead_init(struct crypto_aead *tfm) | 
|---|
| .. | .. | 
|---|
| 1042 | 1026 |  			rc = crypto_register_ahash(&alg->alg.u.hash); | 
|---|
| 1043 | 1027 |  			break; | 
|---|
| 1044 | 1028 |   | 
|---|
 | 1029 | +		case CRYPTO_ALG_TYPE_RNG:  | 
|---|
 | 1030 | +			rc = crypto_register_rng(&alg->alg.u.rng);  | 
|---|
 | 1031 | +			break;  | 
|---|
 | 1032 | +  | 
|---|
| 1045 | 1033 |  		default: | 
|---|
| 1046 | 1034 |  			rc = crypto_register_skcipher(&alg->alg.u.cipher); | 
|---|
| 1047 | 1035 |  			break; | 
|---|
| .. | .. | 
|---|
| 1069 | 1057 |   | 
|---|
| 1070 | 1058 |  		case CRYPTO_ALG_TYPE_AEAD: | 
|---|
| 1071 | 1059 |  			crypto_unregister_aead(&alg->alg.u.aead); | 
|---|
 | 1060 | +			break;  | 
|---|
 | 1061 | +  | 
|---|
 | 1062 | +		case CRYPTO_ALG_TYPE_RNG:  | 
|---|
 | 1063 | +			crypto_unregister_rng(&alg->alg.u.rng);  | 
|---|
| 1072 | 1064 |  			break; | 
|---|
| 1073 | 1065 |   | 
|---|
| 1074 | 1066 |  		default: | 
|---|
| .. | .. | 
|---|
| 1129 | 1121 |  		PPC4XX_TMO_ERR_INT); | 
|---|
| 1130 | 1122 |  } | 
|---|
| 1131 | 1123 |   | 
|---|
 | 1124 | +static int ppc4xx_prng_data_read(struct crypto4xx_device *dev,  | 
|---|
 | 1125 | +				 u8 *data, unsigned int max)  | 
|---|
 | 1126 | +{  | 
|---|
 | 1127 | +	unsigned int i, curr = 0;  | 
|---|
 | 1128 | +	u32 val[2];  | 
|---|
 | 1129 | +  | 
|---|
 | 1130 | +	do {  | 
|---|
 | 1131 | +		/* trigger PRN generation */  | 
|---|
 | 1132 | +		writel(PPC4XX_PRNG_CTRL_AUTO_EN,  | 
|---|
 | 1133 | +		       dev->ce_base + CRYPTO4XX_PRNG_CTRL);  | 
|---|
 | 1134 | +  | 
|---|
 | 1135 | +		for (i = 0; i < 1024; i++) {  | 
|---|
 | 1136 | +			/* usually 19 iterations are enough */  | 
|---|
 | 1137 | +			if ((readl(dev->ce_base + CRYPTO4XX_PRNG_STAT) &  | 
|---|
 | 1138 | +			     CRYPTO4XX_PRNG_STAT_BUSY))  | 
|---|
 | 1139 | +				continue;  | 
|---|
 | 1140 | +  | 
|---|
 | 1141 | +			val[0] = readl_be(dev->ce_base + CRYPTO4XX_PRNG_RES_0);  | 
|---|
 | 1142 | +			val[1] = readl_be(dev->ce_base + CRYPTO4XX_PRNG_RES_1);  | 
|---|
 | 1143 | +			break;  | 
|---|
 | 1144 | +		}  | 
|---|
 | 1145 | +		if (i == 1024)  | 
|---|
 | 1146 | +			return -ETIMEDOUT;  | 
|---|
 | 1147 | +  | 
|---|
 | 1148 | +		if ((max - curr) >= 8) {  | 
|---|
 | 1149 | +			memcpy(data, &val, 8);  | 
|---|
 | 1150 | +			data += 8;  | 
|---|
 | 1151 | +			curr += 8;  | 
|---|
 | 1152 | +		} else {  | 
|---|
 | 1153 | +			/* copy only remaining bytes */  | 
|---|
 | 1154 | +			memcpy(data, &val, max - curr);  | 
|---|
 | 1155 | +			break;  | 
|---|
 | 1156 | +		}  | 
|---|
 | 1157 | +	} while (curr < max);  | 
|---|
 | 1158 | +  | 
|---|
 | 1159 | +	return curr;  | 
|---|
 | 1160 | +}  | 
|---|
 | 1161 | +  | 
|---|
 | 1162 | +static int crypto4xx_prng_generate(struct crypto_rng *tfm,  | 
|---|
 | 1163 | +				   const u8 *src, unsigned int slen,  | 
|---|
 | 1164 | +				   u8 *dstn, unsigned int dlen)  | 
|---|
 | 1165 | +{  | 
|---|
 | 1166 | +	struct rng_alg *alg = crypto_rng_alg(tfm);  | 
|---|
 | 1167 | +	struct crypto4xx_alg *amcc_alg;  | 
|---|
 | 1168 | +	struct crypto4xx_device *dev;  | 
|---|
 | 1169 | +	int ret;  | 
|---|
 | 1170 | +  | 
|---|
 | 1171 | +	amcc_alg = container_of(alg, struct crypto4xx_alg, alg.u.rng);  | 
|---|
 | 1172 | +	dev = amcc_alg->dev;  | 
|---|
 | 1173 | +  | 
|---|
 | 1174 | +	mutex_lock(&dev->core_dev->rng_lock);  | 
|---|
 | 1175 | +	ret = ppc4xx_prng_data_read(dev, dstn, dlen);  | 
|---|
 | 1176 | +	mutex_unlock(&dev->core_dev->rng_lock);  | 
|---|
 | 1177 | +	return ret;  | 
|---|
 | 1178 | +}  | 
|---|
 | 1179 | +  | 
|---|
 | 1180 | +  | 
|---|
 | 1181 | +static int crypto4xx_prng_seed(struct crypto_rng *tfm, const u8 *seed,  | 
|---|
 | 1182 | +			unsigned int slen)  | 
|---|
 | 1183 | +{  | 
|---|
 | 1184 | +	return 0;  | 
|---|
 | 1185 | +}  | 
|---|
 | 1186 | +  | 
|---|
| 1132 | 1187 |  /** | 
|---|
| 1133 | 1188 |   * Supported Crypto Algorithms | 
|---|
| 1134 | 1189 |   */ | 
|---|
| .. | .. | 
|---|
| 1161 | 1216 |  			.cra_priority = CRYPTO4XX_CRYPTO_PRIORITY, | 
|---|
| 1162 | 1217 |  			.cra_flags = CRYPTO_ALG_ASYNC | | 
|---|
| 1163 | 1218 |  				CRYPTO_ALG_KERN_DRIVER_ONLY, | 
|---|
| 1164 |  | -			.cra_blocksize = AES_BLOCK_SIZE,  | 
|---|
 | 1219 | +			.cra_blocksize = 1,  | 
|---|
| 1165 | 1220 |  			.cra_ctxsize = sizeof(struct crypto4xx_ctx), | 
|---|
| 1166 | 1221 |  			.cra_module = THIS_MODULE, | 
|---|
| 1167 | 1222 |  		}, | 
|---|
| .. | .. | 
|---|
| 1222 | 1277 |  			.cra_priority = CRYPTO4XX_CRYPTO_PRIORITY, | 
|---|
| 1223 | 1278 |  			.cra_flags = CRYPTO_ALG_ASYNC | | 
|---|
| 1224 | 1279 |  				CRYPTO_ALG_KERN_DRIVER_ONLY, | 
|---|
| 1225 |  | -			.cra_blocksize = 1,  | 
|---|
 | 1280 | +			.cra_blocksize = AES_BLOCK_SIZE,  | 
|---|
| 1226 | 1281 |  			.cra_ctxsize = sizeof(struct crypto4xx_ctx), | 
|---|
| 1227 | 1282 |  			.cra_module = THIS_MODULE, | 
|---|
| 1228 | 1283 |  		}, | 
|---|
| .. | .. | 
|---|
| 1298 | 1353 |  			.cra_module	= THIS_MODULE, | 
|---|
| 1299 | 1354 |  		}, | 
|---|
| 1300 | 1355 |  	} }, | 
|---|
 | 1356 | +	{ .type = CRYPTO_ALG_TYPE_RNG, .u.rng = {  | 
|---|
 | 1357 | +		.base = {  | 
|---|
 | 1358 | +			.cra_name		= "stdrng",  | 
|---|
 | 1359 | +			.cra_driver_name        = "crypto4xx_rng",  | 
|---|
 | 1360 | +			.cra_priority		= 300,  | 
|---|
 | 1361 | +			.cra_ctxsize		= 0,  | 
|---|
 | 1362 | +			.cra_module		= THIS_MODULE,  | 
|---|
 | 1363 | +		},  | 
|---|
 | 1364 | +		.generate               = crypto4xx_prng_generate,  | 
|---|
 | 1365 | +		.seed                   = crypto4xx_prng_seed,  | 
|---|
 | 1366 | +		.seedsize               = 0,  | 
|---|
 | 1367 | +	} },  | 
|---|
| 1301 | 1368 |  }; | 
|---|
| 1302 | 1369 |   | 
|---|
| 1303 | 1370 |  /** | 
|---|
| .. | .. | 
|---|
| 1367 | 1434 |  	core_dev->dev->core_dev = core_dev; | 
|---|
| 1368 | 1435 |  	core_dev->dev->is_revb = is_revb; | 
|---|
| 1369 | 1436 |  	core_dev->device = dev; | 
|---|
 | 1437 | +	mutex_init(&core_dev->rng_lock);  | 
|---|
| 1370 | 1438 |  	spin_lock_init(&core_dev->lock); | 
|---|
| 1371 | 1439 |  	INIT_LIST_HEAD(&core_dev->dev->alg_list); | 
|---|
| 1372 | 1440 |  	ratelimit_default_init(&core_dev->dev->aead_ratelimit); | 
|---|
 | 1441 | +	rc = crypto4xx_build_sdr(core_dev->dev);  | 
|---|
 | 1442 | +	if (rc)  | 
|---|
 | 1443 | +		goto err_build_sdr;  | 
|---|
| 1373 | 1444 |  	rc = crypto4xx_build_pdr(core_dev->dev); | 
|---|
| 1374 | 1445 |  	if (rc) | 
|---|
| 1375 |  | -		goto err_build_pdr;  | 
|---|
 | 1446 | +		goto err_build_sdr;  | 
|---|
| 1376 | 1447 |   | 
|---|
| 1377 | 1448 |  	rc = crypto4xx_build_gdr(core_dev->dev); | 
|---|
| 1378 |  | -	if (rc)  | 
|---|
| 1379 |  | -		goto err_build_pdr;  | 
|---|
| 1380 |  | -  | 
|---|
| 1381 |  | -	rc = crypto4xx_build_sdr(core_dev->dev);  | 
|---|
| 1382 | 1449 |  	if (rc) | 
|---|
| 1383 | 1450 |  		goto err_build_sdr; | 
|---|
| 1384 | 1451 |   | 
|---|
| .. | .. | 
|---|
| 1424 | 1491 |  err_build_sdr: | 
|---|
| 1425 | 1492 |  	crypto4xx_destroy_sdr(core_dev->dev); | 
|---|
| 1426 | 1493 |  	crypto4xx_destroy_gdr(core_dev->dev); | 
|---|
| 1427 |  | -err_build_pdr:  | 
|---|
| 1428 | 1494 |  	crypto4xx_destroy_pdr(core_dev->dev); | 
|---|
| 1429 | 1495 |  	kfree(core_dev->dev); | 
|---|
| 1430 | 1496 |  err_alloc_dev: | 
|---|
| .. | .. | 
|---|
| 1446 | 1512 |  	tasklet_kill(&core_dev->tasklet); | 
|---|
| 1447 | 1513 |  	/* Un-register with Linux CryptoAPI */ | 
|---|
| 1448 | 1514 |  	crypto4xx_unregister_alg(core_dev->dev); | 
|---|
 | 1515 | +	mutex_destroy(&core_dev->rng_lock);  | 
|---|
| 1449 | 1516 |  	/* Free all allocated memory */ | 
|---|
| 1450 | 1517 |  	crypto4xx_stop_all(core_dev); | 
|---|
| 1451 | 1518 |   | 
|---|