crypto: qat - replace state machine calls
authorShashank Gupta <shashank.gupta@intel.com>
Mon, 27 Feb 2023 20:55:43 +0000 (15:55 -0500)
committerHerbert Xu <herbert@gondor.apana.org.au>
Tue, 14 Mar 2023 09:06:44 +0000 (17:06 +0800)
The device state machine functions are unsafe and interdependent on each
other. To perform a state transition, these shall be called in a
specific order:
  * device up:   adf_dev_init() -> adf_dev_start()
  * device down: adf_dev_stop() -> adf_dev_shutdown()

Replace all the state machine functions used in the QAT driver with the
safe wrappers adf_dev_up() and adf_dev_down().

Signed-off-by: Shashank Gupta <shashank.gupta@intel.com>
Reviewed-by: Giovanni Cabiddu <giovanni.cabiddu@intel.com>
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
drivers/crypto/qat/qat_4xxx/adf_drv.c
drivers/crypto/qat/qat_c3xxx/adf_drv.c
drivers/crypto/qat/qat_c3xxxvf/adf_drv.c
drivers/crypto/qat/qat_c62x/adf_drv.c
drivers/crypto/qat/qat_c62xvf/adf_drv.c
drivers/crypto/qat/qat_common/adf_ctl_drv.c
drivers/crypto/qat/qat_common/adf_sriov.c
drivers/crypto/qat/qat_common/adf_vf_isr.c
drivers/crypto/qat/qat_dh895xcc/adf_drv.c
drivers/crypto/qat/qat_dh895xccvf/adf_drv.c

index f7fdb43..6f862b5 100644 (file)
@@ -411,15 +411,7 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                goto out_err_disable_aer;
        }
 
-       ret = hw_data->dev_config(accel_dev);
-       if (ret)
-               goto out_err_disable_aer;
-
-       ret = adf_dev_init(accel_dev);
-       if (ret)
-               goto out_err_dev_shutdown;
-
-       ret = adf_dev_start(accel_dev);
+       ret = adf_dev_up(accel_dev, true);
        if (ret)
                goto out_err_dev_stop;
 
@@ -430,9 +422,7 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        return ret;
 
 out_err_dev_stop:
-       adf_dev_stop(accel_dev);
-out_err_dev_shutdown:
-       adf_dev_shutdown(accel_dev);
+       adf_dev_down(accel_dev, false);
 out_err_disable_aer:
        adf_disable_aer(accel_dev);
 out_err:
@@ -448,8 +438,7 @@ static void adf_remove(struct pci_dev *pdev)
                pr_err("QAT: Driver removal failed\n");
                return;
        }
-       adf_dev_stop(accel_dev);
-       adf_dev_shutdown(accel_dev);
+       adf_dev_down(accel_dev, false);
        adf_disable_aer(accel_dev);
        adf_cleanup_accel(accel_dev);
 }
index 1f4fbf4..4c00c49 100644 (file)
@@ -201,24 +201,14 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                goto out_err_disable_aer;
        }
 
-       ret = hw_data->dev_config(accel_dev);
-       if (ret)
-               goto out_err_disable_aer;
-
-       ret = adf_dev_init(accel_dev);
-       if (ret)
-               goto out_err_dev_shutdown;
-
-       ret = adf_dev_start(accel_dev);
+       ret = adf_dev_up(accel_dev, true);
        if (ret)
                goto out_err_dev_stop;
 
        return ret;
 
 out_err_dev_stop:
-       adf_dev_stop(accel_dev);
-out_err_dev_shutdown:
-       adf_dev_shutdown(accel_dev);
+       adf_dev_down(accel_dev, false);
 out_err_disable_aer:
        adf_disable_aer(accel_dev);
 out_err_free_reg:
@@ -239,8 +229,7 @@ static void adf_remove(struct pci_dev *pdev)
                pr_err("QAT: Driver removal failed\n");
                return;
        }
-       adf_dev_stop(accel_dev);
-       adf_dev_shutdown(accel_dev);
+       adf_dev_down(accel_dev, false);
        adf_disable_aer(accel_dev);
        adf_cleanup_accel(accel_dev);
        adf_cleanup_pci_dev(accel_dev);
index cf4ef83..e8cc10f 100644 (file)
@@ -173,20 +173,14 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        /* Completion for VF2PF request/response message exchange */
        init_completion(&accel_dev->vf.msg_received);
 
-       ret = adf_dev_init(accel_dev);
-       if (ret)
-               goto out_err_dev_shutdown;
-
-       ret = adf_dev_start(accel_dev);
+       ret = adf_dev_up(accel_dev, false);
        if (ret)
                goto out_err_dev_stop;
 
        return ret;
 
 out_err_dev_stop:
-       adf_dev_stop(accel_dev);
-out_err_dev_shutdown:
-       adf_dev_shutdown(accel_dev);
+       adf_dev_down(accel_dev, false);
 out_err_free_reg:
        pci_release_regions(accel_pci_dev->pci_dev);
 out_err_disable:
@@ -206,8 +200,7 @@ static void adf_remove(struct pci_dev *pdev)
                return;
        }
        adf_flush_vf_wq(accel_dev);
-       adf_dev_stop(accel_dev);
-       adf_dev_shutdown(accel_dev);
+       adf_dev_down(accel_dev, false);
        adf_cleanup_accel(accel_dev);
        adf_cleanup_pci_dev(accel_dev);
        kfree(accel_dev);
index 4ccaf29..fcb2f5b 100644 (file)
@@ -201,24 +201,14 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                goto out_err_disable_aer;
        }
 
-       ret = hw_data->dev_config(accel_dev);
-       if (ret)
-               goto out_err_disable_aer;
-
-       ret = adf_dev_init(accel_dev);
-       if (ret)
-               goto out_err_dev_shutdown;
-
-       ret = adf_dev_start(accel_dev);
+       ret = adf_dev_up(accel_dev, true);
        if (ret)
                goto out_err_dev_stop;
 
        return ret;
 
 out_err_dev_stop:
-       adf_dev_stop(accel_dev);
-out_err_dev_shutdown:
-       adf_dev_shutdown(accel_dev);
+       adf_dev_down(accel_dev, false);
 out_err_disable_aer:
        adf_disable_aer(accel_dev);
 out_err_free_reg:
@@ -239,8 +229,7 @@ static void adf_remove(struct pci_dev *pdev)
                pr_err("QAT: Driver removal failed\n");
                return;
        }
-       adf_dev_stop(accel_dev);
-       adf_dev_shutdown(accel_dev);
+       adf_dev_down(accel_dev, false);
        adf_disable_aer(accel_dev);
        adf_cleanup_accel(accel_dev);
        adf_cleanup_pci_dev(accel_dev);
index 0e642c9..3756630 100644 (file)
@@ -173,20 +173,14 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        /* Completion for VF2PF request/response message exchange */
        init_completion(&accel_dev->vf.msg_received);
 
-       ret = adf_dev_init(accel_dev);
-       if (ret)
-               goto out_err_dev_shutdown;
-
-       ret = adf_dev_start(accel_dev);
+       ret = adf_dev_up(accel_dev, false);
        if (ret)
                goto out_err_dev_stop;
 
        return ret;
 
 out_err_dev_stop:
-       adf_dev_stop(accel_dev);
-out_err_dev_shutdown:
-       adf_dev_shutdown(accel_dev);
+       adf_dev_down(accel_dev, false);
 out_err_free_reg:
        pci_release_regions(accel_pci_dev->pci_dev);
 out_err_disable:
@@ -206,8 +200,7 @@ static void adf_remove(struct pci_dev *pdev)
                return;
        }
        adf_flush_vf_wq(accel_dev);
-       adf_dev_stop(accel_dev);
-       adf_dev_shutdown(accel_dev);
+       adf_dev_down(accel_dev, false);
        adf_cleanup_accel(accel_dev);
        adf_cleanup_pci_dev(accel_dev);
        kfree(accel_dev);
index f030d8a..88c41d6 100644 (file)
@@ -244,8 +244,7 @@ static void adf_ctl_stop_devices(u32 id)
                        if (!accel_dev->is_vf)
                                continue;
 
-                       adf_dev_stop(accel_dev);
-                       adf_dev_shutdown(accel_dev);
+                       adf_dev_down(accel_dev, false);
                }
        }
 
@@ -254,8 +253,7 @@ static void adf_ctl_stop_devices(u32 id)
                        if (!adf_dev_started(accel_dev))
                                continue;
 
-                       adf_dev_stop(accel_dev);
-                       adf_dev_shutdown(accel_dev);
+                       adf_dev_down(accel_dev, false);
                }
        }
 }
@@ -309,23 +307,16 @@ static int adf_ctl_ioctl_dev_start(struct file *fp, unsigned int cmd,
        if (!accel_dev)
                goto out;
 
-       if (!adf_dev_started(accel_dev)) {
-               dev_info(&GET_DEV(accel_dev),
-                        "Starting acceleration device qat_dev%d.\n",
-                        ctl_data->device_id);
-               ret = adf_dev_init(accel_dev);
-               if (!ret)
-                       ret = adf_dev_start(accel_dev);
-       } else {
-               dev_info(&GET_DEV(accel_dev),
-                        "Acceleration device qat_dev%d already started.\n",
-                        ctl_data->device_id);
-       }
+       dev_info(&GET_DEV(accel_dev),
+                "Starting acceleration device qat_dev%d.\n",
+                ctl_data->device_id);
+
+       ret = adf_dev_up(accel_dev, false);
+
        if (ret) {
                dev_err(&GET_DEV(accel_dev), "Failed to start qat_dev%d\n",
                        ctl_data->device_id);
-               adf_dev_stop(accel_dev);
-               adf_dev_shutdown(accel_dev);
+               adf_dev_down(accel_dev, false);
        }
 out:
        kfree(ctl_data);
index d85a90c..f44025b 100644 (file)
@@ -159,7 +159,7 @@ int adf_sriov_configure(struct pci_dev *pdev, int numvfs)
                        return -EBUSY;
                }
 
-               ret = adf_dev_shutdown_cache_cfg(accel_dev);
+               ret = adf_dev_down(accel_dev, true);
                if (ret)
                        return ret;
        }
@@ -184,13 +184,7 @@ int adf_sriov_configure(struct pci_dev *pdev, int numvfs)
        if (!accel_dev->pf.vf_info)
                return -ENOMEM;
 
-       if (adf_dev_init(accel_dev)) {
-               dev_err(&GET_DEV(accel_dev), "Failed to init qat_dev%d\n",
-                       accel_dev->accel_id);
-               return -EFAULT;
-       }
-
-       if (adf_dev_start(accel_dev)) {
+       if (adf_dev_up(accel_dev, false)) {
                dev_err(&GET_DEV(accel_dev), "Failed to start qat_dev%d\n",
                        accel_dev->accel_id);
                return -EFAULT;
index 8c95fcd..b05c395 100644 (file)
@@ -71,8 +71,7 @@ static void adf_dev_stop_async(struct work_struct *work)
        struct adf_accel_dev *accel_dev = stop_data->accel_dev;
 
        adf_dev_restarting_notify(accel_dev);
-       adf_dev_stop(accel_dev);
-       adf_dev_shutdown(accel_dev);
+       adf_dev_down(accel_dev, false);
 
        /* Re-enable PF2VF interrupts */
        adf_enable_pf2vf_interrupts(accel_dev);
index ebeb17b..4d27e4e 100644 (file)
@@ -201,24 +201,14 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
                goto out_err_disable_aer;
        }
 
-       ret = hw_data->dev_config(accel_dev);
-       if (ret)
-               goto out_err_disable_aer;
-
-       ret = adf_dev_init(accel_dev);
-       if (ret)
-               goto out_err_dev_shutdown;
-
-       ret = adf_dev_start(accel_dev);
+       ret = adf_dev_up(accel_dev, true);
        if (ret)
                goto out_err_dev_stop;
 
        return ret;
 
 out_err_dev_stop:
-       adf_dev_stop(accel_dev);
-out_err_dev_shutdown:
-       adf_dev_shutdown(accel_dev);
+       adf_dev_down(accel_dev, false);
 out_err_disable_aer:
        adf_disable_aer(accel_dev);
 out_err_free_reg:
@@ -239,8 +229,7 @@ static void adf_remove(struct pci_dev *pdev)
                pr_err("QAT: Driver removal failed\n");
                return;
        }
-       adf_dev_stop(accel_dev);
-       adf_dev_shutdown(accel_dev);
+       adf_dev_down(accel_dev, false);
        adf_disable_aer(accel_dev);
        adf_cleanup_accel(accel_dev);
        adf_cleanup_pci_dev(accel_dev);
index c1485e7..96854a1 100644 (file)
@@ -173,20 +173,14 @@ static int adf_probe(struct pci_dev *pdev, const struct pci_device_id *ent)
        /* Completion for VF2PF request/response message exchange */
        init_completion(&accel_dev->vf.msg_received);
 
-       ret = adf_dev_init(accel_dev);
-       if (ret)
-               goto out_err_dev_shutdown;
-
-       ret = adf_dev_start(accel_dev);
+       ret = adf_dev_up(accel_dev, false);
        if (ret)
                goto out_err_dev_stop;
 
        return ret;
 
 out_err_dev_stop:
-       adf_dev_stop(accel_dev);
-out_err_dev_shutdown:
-       adf_dev_shutdown(accel_dev);
+       adf_dev_down(accel_dev, false);
 out_err_free_reg:
        pci_release_regions(accel_pci_dev->pci_dev);
 out_err_disable:
@@ -206,8 +200,7 @@ static void adf_remove(struct pci_dev *pdev)
                return;
        }
        adf_flush_vf_wq(accel_dev);
-       adf_dev_stop(accel_dev);
-       adf_dev_shutdown(accel_dev);
+       adf_dev_down(accel_dev, false);
        adf_cleanup_accel(accel_dev);
        adf_cleanup_pci_dev(accel_dev);
        kfree(accel_dev);