These changes are the raw update to linux-4.4.6-rt14. Kernel sources
[kvmfornfv.git] / kernel / drivers / crypto / qat / qat_common / adf_init.c
index 245f432..d873eee 100644 (file)
@@ -69,7 +69,7 @@ static void adf_service_add(struct service_hndl *service)
  * Function adds the acceleration service to the acceleration framework.
  * To be used by QAT device specific drivers.
  *
- * Return: 0 on success, error code othewise.
+ * Return: 0 on success, error code otherwise.
  */
 int adf_service_register(struct service_hndl *service)
 {
@@ -94,7 +94,7 @@ static void adf_service_remove(struct service_hndl *service)
  * Function remove the acceleration service from the acceleration framework.
  * To be used by QAT device specific drivers.
  *
- * Return: 0 on success, error code othewise.
+ * Return: 0 on success, error code otherwise.
  */
 int adf_service_unregister(struct service_hndl *service)
 {
@@ -114,7 +114,7 @@ EXPORT_SYMBOL_GPL(adf_service_unregister);
  * Initialize the ring data structures and the admin comms and arbitration
  * services.
  *
- * Return: 0 on success, error code othewise.
+ * Return: 0 on success, error code otherwise.
  */
 int adf_dev_init(struct adf_accel_dev *accel_dev)
 {
@@ -177,20 +177,6 @@ int adf_dev_init(struct adf_accel_dev *accel_dev)
         */
        list_for_each(list_itr, &service_table) {
                service = list_entry(list_itr, struct service_hndl, list);
-               if (!service->admin)
-                       continue;
-               if (service->event_hld(accel_dev, ADF_EVENT_INIT)) {
-                       dev_err(&GET_DEV(accel_dev),
-                               "Failed to initialise service %s\n",
-                               service->name);
-                       return -EFAULT;
-               }
-               set_bit(accel_dev->accel_id, &service->init_status);
-       }
-       list_for_each(list_itr, &service_table) {
-               service = list_entry(list_itr, struct service_hndl, list);
-               if (service->admin)
-                       continue;
                if (service->event_hld(accel_dev, ADF_EVENT_INIT)) {
                        dev_err(&GET_DEV(accel_dev),
                                "Failed to initialise service %s\n",
@@ -201,6 +187,7 @@ int adf_dev_init(struct adf_accel_dev *accel_dev)
        }
 
        hw_data->enable_error_correction(accel_dev);
+       hw_data->enable_vf2pf_comms(accel_dev);
 
        return 0;
 }
@@ -214,10 +201,11 @@ EXPORT_SYMBOL_GPL(adf_dev_init);
  * is ready to be used.
  * To be used by QAT device specific drivers.
  *
- * Return: 0 on success, error code othewise.
+ * Return: 0 on success, error code otherwise.
  */
 int adf_dev_start(struct adf_accel_dev *accel_dev)
 {
+       struct adf_hw_device_data *hw_data = accel_dev->hw_device;
        struct service_hndl *service;
        struct list_head *list_itr;
 
@@ -229,22 +217,13 @@ int adf_dev_start(struct adf_accel_dev *accel_dev)
        }
        set_bit(ADF_STATUS_AE_STARTED, &accel_dev->status);
 
-       list_for_each(list_itr, &service_table) {
-               service = list_entry(list_itr, struct service_hndl, list);
-               if (!service->admin)
-                       continue;
-               if (service->event_hld(accel_dev, ADF_EVENT_START)) {
-                       dev_err(&GET_DEV(accel_dev),
-                               "Failed to start service %s\n",
-                               service->name);
-                       return -EFAULT;
-               }
-               set_bit(accel_dev->accel_id, &service->start_status);
+       if (hw_data->send_admin_init(accel_dev)) {
+               dev_err(&GET_DEV(accel_dev), "Failed to send init message\n");
+               return -EFAULT;
        }
+
        list_for_each(list_itr, &service_table) {
                service = list_entry(list_itr, struct service_hndl, list);
-               if (service->admin)
-                       continue;
                if (service->event_hld(accel_dev, ADF_EVENT_START)) {
                        dev_err(&GET_DEV(accel_dev),
                                "Failed to start service %s\n",
@@ -257,7 +236,8 @@ int adf_dev_start(struct adf_accel_dev *accel_dev)
        clear_bit(ADF_STATUS_STARTING, &accel_dev->status);
        set_bit(ADF_STATUS_STARTED, &accel_dev->status);
 
-       if (qat_algs_register()) {
+       if (!list_empty(&accel_dev->crypto_list) &&
+           (qat_algs_register() || qat_asym_algs_register())) {
                dev_err(&GET_DEV(accel_dev),
                        "Failed to register crypto algs\n");
                set_bit(ADF_STATUS_STARTING, &accel_dev->status);
@@ -276,7 +256,7 @@ EXPORT_SYMBOL_GPL(adf_dev_start);
  * is shuting down.
  * To be used by QAT device specific drivers.
  *
- * Return: 0 on success, error code othewise.
+ * Return: 0 on success, error code otherwise.
  */
 int adf_dev_stop(struct adf_accel_dev *accel_dev)
 {
@@ -292,14 +272,13 @@ int adf_dev_stop(struct adf_accel_dev *accel_dev)
        clear_bit(ADF_STATUS_STARTING, &accel_dev->status);
        clear_bit(ADF_STATUS_STARTED, &accel_dev->status);
 
-       if (qat_algs_unregister())
-               dev_err(&GET_DEV(accel_dev),
-                       "Failed to unregister crypto algs\n");
+       if (!list_empty(&accel_dev->crypto_list)) {
+               qat_algs_unregister();
+               qat_asym_algs_unregister();
+       }
 
        list_for_each(list_itr, &service_table) {
                service = list_entry(list_itr, struct service_hndl, list);
-               if (service->admin)
-                       continue;
                if (!test_bit(accel_dev->accel_id, &service->start_status))
                        continue;
                ret = service->event_hld(accel_dev, ADF_EVENT_STOP);
@@ -310,19 +289,6 @@ int adf_dev_stop(struct adf_accel_dev *accel_dev)
                        clear_bit(accel_dev->accel_id, &service->start_status);
                }
        }
-       list_for_each(list_itr, &service_table) {
-               service = list_entry(list_itr, struct service_hndl, list);
-               if (!service->admin)
-                       continue;
-               if (!test_bit(accel_dev->accel_id, &service->start_status))
-                       continue;
-               if (service->event_hld(accel_dev, ADF_EVENT_STOP))
-                       dev_err(&GET_DEV(accel_dev),
-                               "Failed to shutdown service %s\n",
-                               service->name);
-               else
-                       clear_bit(accel_dev->accel_id, &service->start_status);
-       }
 
        if (wait)
                msleep(100);
@@ -373,21 +339,6 @@ void adf_dev_shutdown(struct adf_accel_dev *accel_dev)
 
        list_for_each(list_itr, &service_table) {
                service = list_entry(list_itr, struct service_hndl, list);
-               if (service->admin)
-                       continue;
-               if (!test_bit(accel_dev->accel_id, &service->init_status))
-                       continue;
-               if (service->event_hld(accel_dev, ADF_EVENT_SHUTDOWN))
-                       dev_err(&GET_DEV(accel_dev),
-                               "Failed to shutdown service %s\n",
-                               service->name);
-               else
-                       clear_bit(accel_dev->accel_id, &service->init_status);
-       }
-       list_for_each(list_itr, &service_table) {
-               service = list_entry(list_itr, struct service_hndl, list);
-               if (!service->admin)
-                       continue;
                if (!test_bit(accel_dev->accel_id, &service->init_status))
                        continue;
                if (service->event_hld(accel_dev, ADF_EVENT_SHUTDOWN))
@@ -413,6 +364,7 @@ void adf_dev_shutdown(struct adf_accel_dev *accel_dev)
        if (hw_data->exit_admin_comms)
                hw_data->exit_admin_comms(accel_dev);
 
+       hw_data->disable_iov(accel_dev);
        adf_cleanup_etr_data(accel_dev);
 }
 EXPORT_SYMBOL_GPL(adf_dev_shutdown);
@@ -424,17 +376,6 @@ int adf_dev_restarting_notify(struct adf_accel_dev *accel_dev)
 
        list_for_each(list_itr, &service_table) {
                service = list_entry(list_itr, struct service_hndl, list);
-               if (service->admin)
-                       continue;
-               if (service->event_hld(accel_dev, ADF_EVENT_RESTARTING))
-                       dev_err(&GET_DEV(accel_dev),
-                               "Failed to restart service %s.\n",
-                               service->name);
-       }
-       list_for_each(list_itr, &service_table) {
-               service = list_entry(list_itr, struct service_hndl, list);
-               if (!service->admin)
-                       continue;
                if (service->event_hld(accel_dev, ADF_EVENT_RESTARTING))
                        dev_err(&GET_DEV(accel_dev),
                                "Failed to restart service %s.\n",
@@ -450,17 +391,6 @@ int adf_dev_restarted_notify(struct adf_accel_dev *accel_dev)
 
        list_for_each(list_itr, &service_table) {
                service = list_entry(list_itr, struct service_hndl, list);
-               if (service->admin)
-                       continue;
-               if (service->event_hld(accel_dev, ADF_EVENT_RESTARTED))
-                       dev_err(&GET_DEV(accel_dev),
-                               "Failed to restart service %s.\n",
-                               service->name);
-       }
-       list_for_each(list_itr, &service_table) {
-               service = list_entry(list_itr, struct service_hndl, list);
-               if (!service->admin)
-                       continue;
                if (service->event_hld(accel_dev, ADF_EVENT_RESTARTED))
                        dev_err(&GET_DEV(accel_dev),
                                "Failed to restart service %s.\n",