Skip to content

Commit

Permalink
crypto: caam - check if RNG job failed
Browse files Browse the repository at this point in the history
We shouldn't stay silent if RNG job fails. Add appropriate code to
check for that case and propagate error code up appropriately.

Signed-off-by: Andrey Smirnov <andrew.smirnov@gmail.com>
Reviewed-by: Horia Geantă <horia.geanta@nxp.com>
Cc: Chris Healy <cphealy@gmail.com>
Cc: Lucas Stach <l.stach@pengutronix.de>
Cc: Horia Geantă <horia.geanta@nxp.com>
Cc: Herbert Xu <herbert@gondor.apana.org.au>
Cc: Iuliana Prodan <iuliana.prodan@nxp.com>
Cc: linux-crypto@vger.kernel.org
Cc: linux-kernel@vger.kernel.org
Cc: linux-imx@nxp.com
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
  • Loading branch information
Andrey Smirnov authored and Herbert Xu committed Mar 30, 2020
1 parent 2c5e88d commit 32107e4
Showing 1 changed file with 15 additions and 6 deletions.
21 changes: 15 additions & 6 deletions drivers/crypto/caam/caamrng.c
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,11 @@ struct caam_rng_ctx {
struct kfifo fifo;
};

struct caam_rng_job_ctx {
struct completion *done;
int *err;
};

static struct caam_rng_ctx *to_caam_rng_ctx(struct hwrng *r)
{
return (struct caam_rng_ctx *)r->priv;
Expand All @@ -52,12 +57,12 @@ static struct caam_rng_ctx *to_caam_rng_ctx(struct hwrng *r)
static void caam_rng_done(struct device *jrdev, u32 *desc, u32 err,
void *context)
{
struct completion *done = context;
struct caam_rng_job_ctx *jctx = context;

if (err)
caam_jr_strstatus(jrdev, err);
*jctx->err = caam_jr_strstatus(jrdev, err);

complete(done);
complete(jctx->done);
}

static u32 *caam_init_desc(u32 *desc, dma_addr_t dst_dma, int len)
Expand All @@ -80,7 +85,11 @@ static int caam_rng_read_one(struct device *jrdev,
struct completion *done)
{
dma_addr_t dst_dma;
int err;
int err, ret = 0;
struct caam_rng_job_ctx jctx = {
.done = done,
.err = &ret,
};

len = min_t(int, len, CAAM_RNG_MAX_FIFO_STORE_SIZE);

Expand All @@ -93,15 +102,15 @@ static int caam_rng_read_one(struct device *jrdev,
init_completion(done);
err = caam_jr_enqueue(jrdev,
caam_init_desc(desc, dst_dma, len),
caam_rng_done, done);
caam_rng_done, &jctx);
if (err == -EINPROGRESS) {
wait_for_completion(done);
err = 0;
}

dma_unmap_single(jrdev, dst_dma, len, DMA_FROM_DEVICE);

return err ?: len;
return err ?: (ret ?: len);
}

static void caam_rng_fill_async(struct caam_rng_ctx *ctx)
Expand Down

0 comments on commit 32107e4

Please sign in to comment.