hc
2024-05-10 37f49e37ab4cb5d0bc4c60eb5c6d4dd57db767bb
kernel/drivers/crypto/inside-secure/safexcel.c
....@@ -1634,19 +1634,23 @@
16341634 &priv->ring[i].rdr);
16351635 if (ret) {
16361636 dev_err(dev, "Failed to initialize rings\n");
1637
- return ret;
1637
+ goto err_cleanup_rings;
16381638 }
16391639
16401640 priv->ring[i].rdr_req = devm_kcalloc(dev,
16411641 EIP197_DEFAULT_RING_SIZE,
16421642 sizeof(*priv->ring[i].rdr_req),
16431643 GFP_KERNEL);
1644
- if (!priv->ring[i].rdr_req)
1645
- return -ENOMEM;
1644
+ if (!priv->ring[i].rdr_req) {
1645
+ ret = -ENOMEM;
1646
+ goto err_cleanup_rings;
1647
+ }
16461648
16471649 ring_irq = devm_kzalloc(dev, sizeof(*ring_irq), GFP_KERNEL);
1648
- if (!ring_irq)
1649
- return -ENOMEM;
1650
+ if (!ring_irq) {
1651
+ ret = -ENOMEM;
1652
+ goto err_cleanup_rings;
1653
+ }
16501654
16511655 ring_irq->priv = priv;
16521656 ring_irq->ring = i;
....@@ -1660,7 +1664,8 @@
16601664 ring_irq);
16611665 if (irq < 0) {
16621666 dev_err(dev, "Failed to get IRQ ID for ring %d\n", i);
1663
- return irq;
1667
+ ret = irq;
1668
+ goto err_cleanup_rings;
16641669 }
16651670
16661671 priv->ring[i].irq = irq;
....@@ -1672,8 +1677,10 @@
16721677 snprintf(wq_name, 9, "wq_ring%d", i);
16731678 priv->ring[i].workqueue =
16741679 create_singlethread_workqueue(wq_name);
1675
- if (!priv->ring[i].workqueue)
1676
- return -ENOMEM;
1680
+ if (!priv->ring[i].workqueue) {
1681
+ ret = -ENOMEM;
1682
+ goto err_cleanup_rings;
1683
+ }
16771684
16781685 priv->ring[i].requests = 0;
16791686 priv->ring[i].busy = false;
....@@ -1690,16 +1697,26 @@
16901697 ret = safexcel_hw_init(priv);
16911698 if (ret) {
16921699 dev_err(dev, "HW init failed (%d)\n", ret);
1693
- return ret;
1700
+ goto err_cleanup_rings;
16941701 }
16951702
16961703 ret = safexcel_register_algorithms(priv);
16971704 if (ret) {
16981705 dev_err(dev, "Failed to register algorithms (%d)\n", ret);
1699
- return ret;
1706
+ goto err_cleanup_rings;
17001707 }
17011708
17021709 return 0;
1710
+
1711
+err_cleanup_rings:
1712
+ for (i = 0; i < priv->config.rings; i++) {
1713
+ if (priv->ring[i].irq)
1714
+ irq_set_affinity_hint(priv->ring[i].irq, NULL);
1715
+ if (priv->ring[i].workqueue)
1716
+ destroy_workqueue(priv->ring[i].workqueue);
1717
+ }
1718
+
1719
+ return ret;
17031720 }
17041721
17051722 static void safexcel_hw_reset_rings(struct safexcel_crypto_priv *priv)