.. | .. |
---|
1634 | 1634 | &priv->ring[i].rdr); |
---|
1635 | 1635 | if (ret) { |
---|
1636 | 1636 | dev_err(dev, "Failed to initialize rings\n"); |
---|
1637 | | - return ret; |
---|
| 1637 | + goto err_cleanup_rings; |
---|
1638 | 1638 | } |
---|
1639 | 1639 | |
---|
1640 | 1640 | priv->ring[i].rdr_req = devm_kcalloc(dev, |
---|
1641 | 1641 | EIP197_DEFAULT_RING_SIZE, |
---|
1642 | 1642 | sizeof(*priv->ring[i].rdr_req), |
---|
1643 | 1643 | 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 | + } |
---|
1646 | 1648 | |
---|
1647 | 1649 | 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 | + } |
---|
1650 | 1654 | |
---|
1651 | 1655 | ring_irq->priv = priv; |
---|
1652 | 1656 | ring_irq->ring = i; |
---|
.. | .. |
---|
1660 | 1664 | ring_irq); |
---|
1661 | 1665 | if (irq < 0) { |
---|
1662 | 1666 | dev_err(dev, "Failed to get IRQ ID for ring %d\n", i); |
---|
1663 | | - return irq; |
---|
| 1667 | + ret = irq; |
---|
| 1668 | + goto err_cleanup_rings; |
---|
1664 | 1669 | } |
---|
1665 | 1670 | |
---|
1666 | 1671 | priv->ring[i].irq = irq; |
---|
.. | .. |
---|
1672 | 1677 | snprintf(wq_name, 9, "wq_ring%d", i); |
---|
1673 | 1678 | priv->ring[i].workqueue = |
---|
1674 | 1679 | 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 | + } |
---|
1677 | 1684 | |
---|
1678 | 1685 | priv->ring[i].requests = 0; |
---|
1679 | 1686 | priv->ring[i].busy = false; |
---|
.. | .. |
---|
1690 | 1697 | ret = safexcel_hw_init(priv); |
---|
1691 | 1698 | if (ret) { |
---|
1692 | 1699 | dev_err(dev, "HW init failed (%d)\n", ret); |
---|
1693 | | - return ret; |
---|
| 1700 | + goto err_cleanup_rings; |
---|
1694 | 1701 | } |
---|
1695 | 1702 | |
---|
1696 | 1703 | ret = safexcel_register_algorithms(priv); |
---|
1697 | 1704 | if (ret) { |
---|
1698 | 1705 | dev_err(dev, "Failed to register algorithms (%d)\n", ret); |
---|
1699 | | - return ret; |
---|
| 1706 | + goto err_cleanup_rings; |
---|
1700 | 1707 | } |
---|
1701 | 1708 | |
---|
1702 | 1709 | 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; |
---|
1703 | 1720 | } |
---|
1704 | 1721 | |
---|
1705 | 1722 | static void safexcel_hw_reset_rings(struct safexcel_crypto_priv *priv) |
---|