Skip to content

Commit

Permalink
crypto: caam - add missing put_device() call
Browse files Browse the repository at this point in the history
The of_find_device_by_node() takes a reference to the underlying device
structure, we should release that reference.

Fixes: 35af640 ("crypto: caam - Check for CAAM block presence before registering with crypto layer")
Fixes: b189817 ("crypto: caam/qi - add ablkcipher and authenc algorithms")
Reviewed-by: Horia Geantă <horia.geanta@nxp.com>
Signed-off-by: Wen Yang <yellowriver2010@hotmail.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
  • Loading branch information
Wen Yang authored and Herbert Xu committed Mar 7, 2019
1 parent aa1abbe commit 00e8744
Show file tree
Hide file tree
Showing 5 changed files with 50 additions and 27 deletions.
12 changes: 7 additions & 5 deletions drivers/crypto/caam/caamalg.c
Original file line number Diff line number Diff line change
Expand Up @@ -3455,7 +3455,6 @@ static int __init caam_algapi_init(void)
{
struct device_node *dev_node;
struct platform_device *pdev;
struct device *ctrldev;
struct caam_drv_private *priv;
int i = 0, err = 0;
u32 aes_vid, aes_inst, des_inst, md_vid, md_inst, ccha_inst, ptha_inst;
Expand All @@ -3476,16 +3475,17 @@ static int __init caam_algapi_init(void)
return -ENODEV;
}

ctrldev = &pdev->dev;
priv = dev_get_drvdata(ctrldev);
priv = dev_get_drvdata(&pdev->dev);
of_node_put(dev_node);

/*
* If priv is NULL, it's probably because the caam driver wasn't
* properly initialized (e.g. RNG4 init failed). Thus, bail out here.
*/
if (!priv)
return -ENODEV;
if (!priv) {
err = -ENODEV;
goto out_put_dev;
}


/*
Expand Down Expand Up @@ -3626,6 +3626,8 @@ static int __init caam_algapi_init(void)
if (registered)
pr_info("caam algorithms registered in /proc/crypto\n");

out_put_dev:
put_device(&pdev->dev);
return err;
}

Expand Down
11 changes: 8 additions & 3 deletions drivers/crypto/caam/caamalg_qi.c
Original file line number Diff line number Diff line change
Expand Up @@ -2492,12 +2492,15 @@ static int __init caam_qi_algapi_init(void)
* If priv is NULL, it's probably because the caam driver wasn't
* properly initialized (e.g. RNG4 init failed). Thus, bail out here.
*/
if (!priv || !priv->qi_present)
return -ENODEV;
if (!priv || !priv->qi_present) {
err = -ENODEV;
goto out_put_dev;
}

if (caam_dpaa2) {
dev_info(ctrldev, "caam/qi frontend driver not suitable for DPAA 2.x, aborting...\n");
return -ENODEV;
err = -ENODEV;
goto out_put_dev;
}

/*
Expand Down Expand Up @@ -2610,6 +2613,8 @@ static int __init caam_qi_algapi_init(void)
if (registered)
dev_info(priv->qidev, "algorithms registered in /proc/crypto\n");

out_put_dev:
put_device(ctrldev);
return err;
}

Expand Down
18 changes: 11 additions & 7 deletions drivers/crypto/caam/caamhash.c
Original file line number Diff line number Diff line change
Expand Up @@ -1993,7 +1993,6 @@ static int __init caam_algapi_hash_init(void)
{
struct device_node *dev_node;
struct platform_device *pdev;
struct device *ctrldev;
int i = 0, err = 0;
struct caam_drv_private *priv;
unsigned int md_limit = SHA512_DIGEST_SIZE;
Expand All @@ -2012,16 +2011,17 @@ static int __init caam_algapi_hash_init(void)
return -ENODEV;
}

ctrldev = &pdev->dev;
priv = dev_get_drvdata(ctrldev);
priv = dev_get_drvdata(&pdev->dev);
of_node_put(dev_node);

/*
* If priv is NULL, it's probably because the caam driver wasn't
* properly initialized (e.g. RNG4 init failed). Thus, bail out here.
*/
if (!priv)
return -ENODEV;
if (!priv) {
err = -ENODEV;
goto out_put_dev;
}

/*
* Register crypto algorithms the device supports. First, identify
Expand All @@ -2043,8 +2043,10 @@ static int __init caam_algapi_hash_init(void)
* Skip registration of any hashing algorithms if MD block
* is not present.
*/
if (!md_inst)
return -ENODEV;
if (!md_inst) {
err = -ENODEV;
goto out_put_dev;
}

/* Limit digest size based on LP256 */
if (md_vid == CHA_VER_VID_MD_LP256)
Expand Down Expand Up @@ -2101,6 +2103,8 @@ static int __init caam_algapi_hash_init(void)
list_add_tail(&t_alg->entry, &hash_list);
}

out_put_dev:
put_device(&pdev->dev);
return err;
}

Expand Down
14 changes: 10 additions & 4 deletions drivers/crypto/caam/caampkc.c
Original file line number Diff line number Diff line change
Expand Up @@ -1042,8 +1042,10 @@ static int __init caam_pkc_init(void)
* If priv is NULL, it's probably because the caam driver wasn't
* properly initialized (e.g. RNG4 init failed). Thus, bail out here.
*/
if (!priv)
return -ENODEV;
if (!priv) {
err = -ENODEV;
goto out_put_dev;
}

/* Determine public key hardware accelerator presence. */
if (priv->era < 10)
Expand All @@ -1053,8 +1055,10 @@ static int __init caam_pkc_init(void)
pk_inst = rd_reg32(&priv->ctrl->vreg.pkha) & CHA_VER_NUM_MASK;

/* Do not register algorithms if PKHA is not present. */
if (!pk_inst)
return -ENODEV;
if (!pk_inst) {
err = -ENODEV;
goto out_put_dev;
}

err = crypto_register_akcipher(&caam_rsa);
if (err)
Expand All @@ -1063,6 +1067,8 @@ static int __init caam_pkc_init(void)
else
dev_info(ctrldev, "caam pkc algorithms registered in /proc/crypto\n");

out_put_dev:
put_device(ctrldev);
return err;
}

Expand Down
22 changes: 14 additions & 8 deletions drivers/crypto/caam/caamrng.c
Original file line number Diff line number Diff line change
Expand Up @@ -308,7 +308,6 @@ static int __init caam_rng_init(void)
struct device *dev;
struct device_node *dev_node;
struct platform_device *pdev;
struct device *ctrldev;
struct caam_drv_private *priv;
u32 rng_inst;
int err;
Expand All @@ -326,16 +325,17 @@ static int __init caam_rng_init(void)
return -ENODEV;
}

ctrldev = &pdev->dev;
priv = dev_get_drvdata(ctrldev);
priv = dev_get_drvdata(&pdev->dev);
of_node_put(dev_node);

/*
* If priv is NULL, it's probably because the caam driver wasn't
* properly initialized (e.g. RNG4 init failed). Thus, bail out here.
*/
if (!priv)
return -ENODEV;
if (!priv) {
err = -ENODEV;
goto out_put_dev;
}

/* Check for an instantiated RNG before registration */
if (priv->era < 10)
Expand All @@ -344,13 +344,16 @@ static int __init caam_rng_init(void)
else
rng_inst = rd_reg32(&priv->ctrl->vreg.rng) & CHA_VER_NUM_MASK;

if (!rng_inst)
return -ENODEV;
if (!rng_inst) {
err = -ENODEV;
goto out_put_dev;
}

dev = caam_jr_alloc();
if (IS_ERR(dev)) {
pr_err("Job Ring Device allocation for transform failed\n");
return PTR_ERR(dev);
err = PTR_ERR(dev);
goto out_put_dev;
}
rng_ctx = kmalloc(sizeof(*rng_ctx), GFP_DMA | GFP_KERNEL);
if (!rng_ctx) {
Expand All @@ -361,13 +364,16 @@ static int __init caam_rng_init(void)
if (err)
goto free_rng_ctx;

put_device(&pdev->dev);
dev_info(dev, "registering rng-caam\n");
return hwrng_register(&caam_rng);

free_rng_ctx:
kfree(rng_ctx);
free_caam_alloc:
caam_jr_free(dev);
out_put_dev:
put_device(&pdev->dev);
return err;
}

Expand Down

0 comments on commit 00e8744

Please sign in to comment.