Merge git://git.kernel.org/pub/scm/linux/kernel/git/herbert/crypto-2.6
[cascardo/linux.git] / drivers / crypto / qat / qat_common / adf_ctl_drv.c
index 3c3f948..db21b49 100644 (file)
@@ -275,18 +275,27 @@ static int adf_ctl_stop_devices(uint32_t id)
        struct adf_accel_dev *accel_dev;
        int ret = 0;
 
-       list_for_each_entry_reverse(accel_dev, adf_devmgr_get_head(), list) {
+       list_for_each_entry(accel_dev, adf_devmgr_get_head(), list) {
                if (id == accel_dev->accel_id || id == ADF_CFG_ALL_DEVICES) {
                        if (!adf_dev_started(accel_dev))
                                continue;
 
-                       if (adf_dev_stop(accel_dev)) {
-                               dev_err(&GET_DEV(accel_dev),
-                                       "Failed to stop qat_dev%d\n", id);
-                               ret = -EFAULT;
-                       } else {
-                               adf_dev_shutdown(accel_dev);
-                       }
+                       /* First stop all VFs */
+                       if (!accel_dev->is_vf)
+                               continue;
+
+                       adf_dev_stop(accel_dev);
+                       adf_dev_shutdown(accel_dev);
+               }
+       }
+
+       list_for_each_entry(accel_dev, adf_devmgr_get_head(), list) {
+               if (id == accel_dev->accel_id || id == ADF_CFG_ALL_DEVICES) {
+                       if (!adf_dev_started(accel_dev))
+                               continue;
+
+                       adf_dev_stop(accel_dev);
+                       adf_dev_shutdown(accel_dev);
                }
        }
        return ret;
@@ -465,12 +474,17 @@ static int __init adf_register_ctl_device_driver(void)
        if (adf_init_pf_wq())
                goto err_pf_wq;
 
+       if (adf_init_vf_wq())
+               goto err_vf_wq;
+
        if (qat_crypto_register())
                goto err_crypto_register;
 
        return 0;
 
 err_crypto_register:
+       adf_exit_vf_wq();
+err_vf_wq:
        adf_exit_pf_wq();
 err_pf_wq:
        adf_exit_aer();
@@ -485,6 +499,7 @@ static void __exit adf_unregister_ctl_device_driver(void)
 {
        adf_chr_drv_destroy();
        adf_exit_aer();
+       adf_exit_vf_wq();
        adf_exit_pf_wq();
        qat_crypto_unregister();
        adf_clean_vf_map(false);