diff options
Diffstat (limited to 'drivers/crypto/inside-secure/safexcel.c')
| -rw-r--r-- | drivers/crypto/inside-secure/safexcel.c | 39 | 
1 files changed, 28 insertions, 11 deletions
diff --git a/drivers/crypto/inside-secure/safexcel.c b/drivers/crypto/inside-secure/safexcel.c index 6858753af6b3..9ff02b5abc4a 100644 --- a/drivers/crypto/inside-secure/safexcel.c +++ b/drivers/crypto/inside-secure/safexcel.c @@ -474,7 +474,7 @@ release_fw:  		goto retry_fw;  	} -	dev_dbg(priv->dev, "Firmware load failed.\n"); +	dev_err(priv->dev, "Firmware load failed.\n");  	return ret;  } @@ -1628,19 +1628,23 @@ static int safexcel_probe_generic(void *pdev,  						     &priv->ring[i].rdr);  		if (ret) {  			dev_err(dev, "Failed to initialize rings\n"); -			return ret; +			goto err_cleanup_rings;  		}  		priv->ring[i].rdr_req = devm_kcalloc(dev,  			EIP197_DEFAULT_RING_SIZE,  			sizeof(*priv->ring[i].rdr_req),  			GFP_KERNEL); -		if (!priv->ring[i].rdr_req) -			return -ENOMEM; +		if (!priv->ring[i].rdr_req) { +			ret = -ENOMEM; +			goto err_cleanup_rings; +		}  		ring_irq = devm_kzalloc(dev, sizeof(*ring_irq), GFP_KERNEL); -		if (!ring_irq) -			return -ENOMEM; +		if (!ring_irq) { +			ret = -ENOMEM; +			goto err_cleanup_rings; +		}  		ring_irq->priv = priv;  		ring_irq->ring = i; @@ -1654,7 +1658,8 @@ static int safexcel_probe_generic(void *pdev,  						ring_irq);  		if (irq < 0) {  			dev_err(dev, "Failed to get IRQ ID for ring %d\n", i); -			return irq; +			ret = irq; +			goto err_cleanup_rings;  		}  		priv->ring[i].irq = irq; @@ -1666,8 +1671,10 @@ static int safexcel_probe_generic(void *pdev,  		snprintf(wq_name, 9, "wq_ring%d", i);  		priv->ring[i].workqueue =  			create_singlethread_workqueue(wq_name); -		if (!priv->ring[i].workqueue) -			return -ENOMEM; +		if (!priv->ring[i].workqueue) { +			ret = -ENOMEM; +			goto err_cleanup_rings; +		}  		priv->ring[i].requests = 0;  		priv->ring[i].busy = false; @@ -1684,16 +1691,26 @@ static int safexcel_probe_generic(void *pdev,  	ret = safexcel_hw_init(priv);  	if (ret) {  		dev_err(dev, "HW init failed (%d)\n", ret); -		return ret; +		goto err_cleanup_rings;  	}  	ret = safexcel_register_algorithms(priv);  	if (ret) {  		dev_err(dev, "Failed to register algorithms (%d)\n", ret); -		return ret; +		goto err_cleanup_rings;  	}  	return 0; + +err_cleanup_rings: +	for (i = 0; i < priv->config.rings; i++) { +		if (priv->ring[i].irq) +			irq_set_affinity_hint(priv->ring[i].irq, NULL); +		if (priv->ring[i].workqueue) +			destroy_workqueue(priv->ring[i].workqueue); +	} + +	return ret;  }  static void safexcel_hw_reset_rings(struct safexcel_crypto_priv *priv)  |