diff options
Diffstat (limited to 'drivers/crypto')
-rw-r--r-- | drivers/crypto/hifn_795x.c | 42 |
1 files changed, 14 insertions, 28 deletions
diff --git a/drivers/crypto/hifn_795x.c b/drivers/crypto/hifn_795x.c index 4e89cd8f664f..4428e8e68a0d 100644 --- a/drivers/crypto/hifn_795x.c +++ b/drivers/crypto/hifn_795x.c | |||
@@ -369,6 +369,8 @@ static atomic_t hifn_dev_number; | |||
369 | #define HIFN_D_DST_RSIZE 80*4 | 369 | #define HIFN_D_DST_RSIZE 80*4 |
370 | #define HIFN_D_RES_RSIZE 24*4 | 370 | #define HIFN_D_RES_RSIZE 24*4 |
371 | 371 | ||
372 | #define HIFN_D_DST_DALIGN 4 | ||
373 | |||
372 | #define HIFN_QUEUE_LENGTH HIFN_D_CMD_RSIZE-5 | 374 | #define HIFN_QUEUE_LENGTH HIFN_D_CMD_RSIZE-5 |
373 | 375 | ||
374 | #define AES_MIN_KEY_SIZE 16 | 376 | #define AES_MIN_KEY_SIZE 16 |
@@ -1458,10 +1460,6 @@ static int ablkcipher_add(void *daddr, unsigned int *drestp, struct scatterlist | |||
1458 | static int ablkcipher_walk(struct ablkcipher_request *req, | 1460 | static int ablkcipher_walk(struct ablkcipher_request *req, |
1459 | struct ablkcipher_walk *w) | 1461 | struct ablkcipher_walk *w) |
1460 | { | 1462 | { |
1461 | unsigned blocksize = | ||
1462 | crypto_ablkcipher_blocksize(crypto_ablkcipher_reqtfm(req)); | ||
1463 | unsigned alignmask = | ||
1464 | crypto_ablkcipher_alignmask(crypto_ablkcipher_reqtfm(req)); | ||
1465 | struct scatterlist *src, *dst, *t; | 1463 | struct scatterlist *src, *dst, *t; |
1466 | void *daddr; | 1464 | void *daddr; |
1467 | unsigned int nbytes = req->nbytes, offset, copy, diff; | 1465 | unsigned int nbytes = req->nbytes, offset, copy, diff; |
@@ -1477,15 +1475,13 @@ static int ablkcipher_walk(struct ablkcipher_request *req, | |||
1477 | dst = &req->dst[idx]; | 1475 | dst = &req->dst[idx]; |
1478 | 1476 | ||
1479 | dprintk("\n%s: slen: %u, dlen: %u, soff: %u, doff: %u, offset: %u, " | 1477 | dprintk("\n%s: slen: %u, dlen: %u, soff: %u, doff: %u, offset: %u, " |
1480 | "blocksize: %u, nbytes: %u.\n", | 1478 | "nbytes: %u.\n", |
1481 | __func__, src->length, dst->length, src->offset, | 1479 | __func__, src->length, dst->length, src->offset, |
1482 | dst->offset, offset, blocksize, nbytes); | 1480 | dst->offset, offset, nbytes); |
1483 | 1481 | ||
1484 | if (src->length & (blocksize - 1) || | 1482 | if (!IS_ALIGNED(dst->offset, HIFN_D_DST_DALIGN) || |
1485 | src->offset & (alignmask - 1) || | 1483 | !IS_ALIGNED(dst->length, HIFN_D_DST_DALIGN) || |
1486 | dst->length & (blocksize - 1) || | 1484 | offset) { |
1487 | dst->offset & (alignmask - 1) || | ||
1488 | offset) { | ||
1489 | unsigned slen = src->length - offset; | 1485 | unsigned slen = src->length - offset; |
1490 | unsigned dlen = PAGE_SIZE; | 1486 | unsigned dlen = PAGE_SIZE; |
1491 | 1487 | ||
@@ -1498,8 +1494,8 @@ static int ablkcipher_walk(struct ablkcipher_request *req, | |||
1498 | 1494 | ||
1499 | idx += err; | 1495 | idx += err; |
1500 | 1496 | ||
1501 | copy = slen & ~(blocksize - 1); | 1497 | copy = slen & ~(HIFN_D_DST_DALIGN - 1); |
1502 | diff = slen & (blocksize - 1); | 1498 | diff = slen & (HIFN_D_DST_DALIGN - 1); |
1503 | 1499 | ||
1504 | if (dlen < nbytes) { | 1500 | if (dlen < nbytes) { |
1505 | /* | 1501 | /* |
@@ -1507,7 +1503,7 @@ static int ablkcipher_walk(struct ablkcipher_request *req, | |||
1507 | * to put there additional blocksized chunk, | 1503 | * to put there additional blocksized chunk, |
1508 | * so we mark that page as containing only | 1504 | * so we mark that page as containing only |
1509 | * blocksize aligned chunks: | 1505 | * blocksize aligned chunks: |
1510 | * t->length = (slen & ~(blocksize - 1)); | 1506 | * t->length = (slen & ~(HIFN_D_DST_DALIGN - 1)); |
1511 | * and increase number of bytes to be processed | 1507 | * and increase number of bytes to be processed |
1512 | * in next chunk: | 1508 | * in next chunk: |
1513 | * nbytes += diff; | 1509 | * nbytes += diff; |
@@ -1567,10 +1563,6 @@ static int hifn_setup_session(struct ablkcipher_request *req) | |||
1567 | unsigned int nbytes = req->nbytes, idx = 0, len; | 1563 | unsigned int nbytes = req->nbytes, idx = 0, len; |
1568 | int err = -EINVAL, sg_num; | 1564 | int err = -EINVAL, sg_num; |
1569 | struct scatterlist *src, *dst, *t; | 1565 | struct scatterlist *src, *dst, *t; |
1570 | unsigned blocksize = | ||
1571 | crypto_ablkcipher_blocksize(crypto_ablkcipher_reqtfm(req)); | ||
1572 | unsigned alignmask = | ||
1573 | crypto_ablkcipher_alignmask(crypto_ablkcipher_reqtfm(req)); | ||
1574 | 1566 | ||
1575 | if (ctx->iv && !ctx->ivsize && ctx->mode != ACRYPTO_MODE_ECB) | 1567 | if (ctx->iv && !ctx->ivsize && ctx->mode != ACRYPTO_MODE_ECB) |
1576 | goto err_out_exit; | 1568 | goto err_out_exit; |
@@ -1578,17 +1570,13 @@ static int hifn_setup_session(struct ablkcipher_request *req) | |||
1578 | ctx->walk.flags = 0; | 1570 | ctx->walk.flags = 0; |
1579 | 1571 | ||
1580 | while (nbytes) { | 1572 | while (nbytes) { |
1581 | src = &req->src[idx]; | ||
1582 | dst = &req->dst[idx]; | 1573 | dst = &req->dst[idx]; |
1583 | 1574 | ||
1584 | if (src->length & (blocksize - 1) || | 1575 | if (!IS_ALIGNED(dst->offset, HIFN_D_DST_DALIGN) || |
1585 | src->offset & (alignmask - 1) || | 1576 | !IS_ALIGNED(dst->length, HIFN_D_DST_DALIGN)) |
1586 | dst->length & (blocksize - 1) || | ||
1587 | dst->offset & (alignmask - 1)) { | ||
1588 | ctx->walk.flags |= ASYNC_FLAGS_MISALIGNED; | 1577 | ctx->walk.flags |= ASYNC_FLAGS_MISALIGNED; |
1589 | } | ||
1590 | 1578 | ||
1591 | nbytes -= src->length; | 1579 | nbytes -= dst->length; |
1592 | idx++; | 1580 | idx++; |
1593 | } | 1581 | } |
1594 | 1582 | ||
@@ -2523,9 +2511,7 @@ static int hifn_alg_alloc(struct hifn_device *dev, struct hifn_alg_template *t) | |||
2523 | alg->alg.cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC; | 2511 | alg->alg.cra_flags = CRYPTO_ALG_TYPE_ABLKCIPHER | CRYPTO_ALG_ASYNC; |
2524 | alg->alg.cra_blocksize = t->bsize; | 2512 | alg->alg.cra_blocksize = t->bsize; |
2525 | alg->alg.cra_ctxsize = sizeof(struct hifn_context); | 2513 | alg->alg.cra_ctxsize = sizeof(struct hifn_context); |
2526 | alg->alg.cra_alignmask = 15; | 2514 | alg->alg.cra_alignmask = 0; |
2527 | if (t->bsize == 8) | ||
2528 | alg->alg.cra_alignmask = 3; | ||
2529 | alg->alg.cra_type = &crypto_ablkcipher_type; | 2515 | alg->alg.cra_type = &crypto_ablkcipher_type; |
2530 | alg->alg.cra_module = THIS_MODULE; | 2516 | alg->alg.cra_module = THIS_MODULE; |
2531 | alg->alg.cra_u.ablkcipher = t->ablkcipher; | 2517 | alg->alg.cra_u.ablkcipher = t->ablkcipher; |