When stopping devices it is not enought to loop backwards.
We need to explicitly stop all VFs first.

Signed-off-by: Tadeusz Struk <tadeusz.st...@intel.com>
---
 drivers/crypto/qat/qat_common/adf_ctl_drv.c |   21 ++++++++++++++++++++-
 1 file changed, 20 insertions(+), 1 deletion(-)

diff --git a/drivers/crypto/qat/qat_common/adf_ctl_drv.c 
b/drivers/crypto/qat/qat_common/adf_ctl_drv.c
index 5c897e6..7403356 100644
--- a/drivers/crypto/qat/qat_common/adf_ctl_drv.c
+++ b/drivers/crypto/qat/qat_common/adf_ctl_drv.c
@@ -275,7 +275,26 @@ 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;
+
+                       /* First stop all VFs */
+                       if (!accel_dev->is_vf)
+                               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);
+                       }
+               }
+       }
+
+       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;

--
To unsubscribe from this list: send the line "unsubscribe linux-crypto" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to