@@ -1631,19 +1631,23 @@ static int safexcel_probe_generic(void *pdev,
16311631 & priv -> ring [i ].rdr );
16321632 if (ret ) {
16331633 dev_err (dev , "Failed to initialize rings\n" );
1634- return ret ;
1634+ goto err_cleanup_rings ;
16351635 }
16361636
16371637 priv -> ring [i ].rdr_req = devm_kcalloc (dev ,
16381638 EIP197_DEFAULT_RING_SIZE ,
16391639 sizeof (* priv -> ring [i ].rdr_req ),
16401640 GFP_KERNEL );
1641- if (!priv -> ring [i ].rdr_req )
1642- return - ENOMEM ;
1641+ if (!priv -> ring [i ].rdr_req ) {
1642+ ret = - ENOMEM ;
1643+ goto err_cleanup_rings ;
1644+ }
16431645
16441646 ring_irq = devm_kzalloc (dev , sizeof (* ring_irq ), GFP_KERNEL );
1645- if (!ring_irq )
1646- return - ENOMEM ;
1647+ if (!ring_irq ) {
1648+ ret = - ENOMEM ;
1649+ goto err_cleanup_rings ;
1650+ }
16471651
16481652 ring_irq -> priv = priv ;
16491653 ring_irq -> ring = i ;
@@ -1657,7 +1661,8 @@ static int safexcel_probe_generic(void *pdev,
16571661 ring_irq );
16581662 if (irq < 0 ) {
16591663 dev_err (dev , "Failed to get IRQ ID for ring %d\n" , i );
1660- return irq ;
1664+ ret = irq ;
1665+ goto err_cleanup_rings ;
16611666 }
16621667
16631668 priv -> ring [i ].irq = irq ;
@@ -1669,8 +1674,10 @@ static int safexcel_probe_generic(void *pdev,
16691674 snprintf (wq_name , 9 , "wq_ring%d" , i );
16701675 priv -> ring [i ].workqueue =
16711676 create_singlethread_workqueue (wq_name );
1672- if (!priv -> ring [i ].workqueue )
1673- return - ENOMEM ;
1677+ if (!priv -> ring [i ].workqueue ) {
1678+ ret = - ENOMEM ;
1679+ goto err_cleanup_rings ;
1680+ }
16741681
16751682 priv -> ring [i ].requests = 0 ;
16761683 priv -> ring [i ].busy = false;
@@ -1687,16 +1694,26 @@ static int safexcel_probe_generic(void *pdev,
16871694 ret = safexcel_hw_init (priv );
16881695 if (ret ) {
16891696 dev_err (dev , "HW init failed (%d)\n" , ret );
1690- return ret ;
1697+ goto err_cleanup_rings ;
16911698 }
16921699
16931700 ret = safexcel_register_algorithms (priv );
16941701 if (ret ) {
16951702 dev_err (dev , "Failed to register algorithms (%d)\n" , ret );
1696- return ret ;
1703+ goto err_cleanup_rings ;
16971704 }
16981705
16991706 return 0 ;
1707+
1708+ err_cleanup_rings :
1709+ for (i = 0 ; i < priv -> config .rings ; i ++ ) {
1710+ if (priv -> ring [i ].irq )
1711+ irq_set_affinity_hint (priv -> ring [i ].irq , NULL );
1712+ if (priv -> ring [i ].workqueue )
1713+ destroy_workqueue (priv -> ring [i ].workqueue );
1714+ }
1715+
1716+ return ret ;
17001717}
17011718
17021719static void safexcel_hw_reset_rings (struct safexcel_crypto_priv * priv )
0 commit comments