diff options
Diffstat (limited to 'drivers/crypto/atmel-sha.c')
| -rw-r--r-- | drivers/crypto/atmel-sha.c | 37 | 
1 files changed, 25 insertions, 12 deletions
diff --git a/drivers/crypto/atmel-sha.c b/drivers/crypto/atmel-sha.c index 34db04addc18..5b35433c5399 100644 --- a/drivers/crypto/atmel-sha.c +++ b/drivers/crypto/atmel-sha.c @@ -163,8 +163,20 @@ static size_t atmel_sha_append_sg(struct atmel_sha_reqctx *ctx)  		count = min(ctx->sg->length - ctx->offset, ctx->total);  		count = min(count, ctx->buflen - ctx->bufcnt); -		if (count <= 0) -			break; +		if (count <= 0) { +			/* +			* Check if count <= 0 because the buffer is full or +			* because the sg length is 0. In the latest case, +			* check if there is another sg in the list, a 0 length +			* sg doesn't necessarily mean the end of the sg list. +			*/ +			if ((ctx->sg->length == 0) && !sg_is_last(ctx->sg)) { +				ctx->sg = sg_next(ctx->sg); +				continue; +			} else { +				break; +			} +		}  		scatterwalk_map_and_copy(ctx->buffer + ctx->bufcnt, ctx->sg,  			ctx->offset, count, 0); @@ -420,14 +432,8 @@ static int atmel_sha_xmit_dma(struct atmel_sha_dev *dd, dma_addr_t dma_addr1,  	dev_dbg(dd->dev, "xmit_dma: digcnt: 0x%llx 0x%llx, length: %d, final: %d\n",  		ctx->digcnt[1], ctx->digcnt[0], length1, final); -	if (ctx->flags & (SHA_FLAGS_SHA1 | SHA_FLAGS_SHA224 | -			SHA_FLAGS_SHA256)) { -		dd->dma_lch_in.dma_conf.src_maxburst = 16; -		dd->dma_lch_in.dma_conf.dst_maxburst = 16; -	} else { -		dd->dma_lch_in.dma_conf.src_maxburst = 32; -		dd->dma_lch_in.dma_conf.dst_maxburst = 32; -	} +	dd->dma_lch_in.dma_conf.src_maxburst = 16; +	dd->dma_lch_in.dma_conf.dst_maxburst = 16;  	dmaengine_slave_config(dd->dma_lch_in.chan, &dd->dma_lch_in.dma_conf); @@ -529,7 +535,7 @@ static int atmel_sha_update_dma_slow(struct atmel_sha_dev *dd)  	if (final)  		atmel_sha_fill_padding(ctx, 0); -	if (final || (ctx->bufcnt == ctx->buflen && ctx->total)) { +	if (final || (ctx->bufcnt == ctx->buflen)) {  		count = ctx->bufcnt;  		ctx->bufcnt = 0;  		return atmel_sha_xmit_dma_map(dd, ctx, count, final); @@ -1266,6 +1272,12 @@ static void atmel_sha_get_cap(struct atmel_sha_dev *dd)  	/* keep only major version number */  	switch (dd->hw_version & 0xff0) { +	case 0x420: +		dd->caps.has_dma = 1; +		dd->caps.has_dualbuff = 1; +		dd->caps.has_sha224 = 1; +		dd->caps.has_sha_384_512 = 1; +		break;  	case 0x410:  		dd->caps.has_dma = 1;  		dd->caps.has_dualbuff = 1; @@ -1349,6 +1361,7 @@ static int atmel_sha_probe(struct platform_device *pdev)  	platform_set_drvdata(pdev, sha_dd);  	INIT_LIST_HEAD(&sha_dd->list); +	spin_lock_init(&sha_dd->lock);  	tasklet_init(&sha_dd->done_task, atmel_sha_done_task,  					(unsigned long)sha_dd); @@ -1385,7 +1398,7 @@ static int atmel_sha_probe(struct platform_device *pdev)  	/* Initializing the clock */  	sha_dd->iclk = clk_get(&pdev->dev, "sha_clk");  	if (IS_ERR(sha_dd->iclk)) { -		dev_err(dev, "clock intialization failed.\n"); +		dev_err(dev, "clock initialization failed.\n");  		err = PTR_ERR(sha_dd->iclk);  		goto clk_err;  	}  |