mei: split amthif client init from end of clients enumeration
authorAlexander Usyskin <alexander.usyskin@intel.com>
Sun, 7 Feb 2016 21:35:43 +0000 (23:35 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Sun, 7 Feb 2016 22:47:20 +0000 (14:47 -0800)
The amthif FW client can appear after the end of client enumeration.
Amthif host client initialization is done now at FW client discovery
time.

Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/mei/amthif.c
drivers/misc/mei/bus.c
drivers/misc/mei/client.c
drivers/misc/mei/client.h
drivers/misc/mei/hbm.c
drivers/misc/mei/init.c
drivers/misc/mei/mei_dev.h

index de194ef573ee6f1095cba316e8ababc263291c31..04525ada9eda449097cb6b9b0c85aa02a5c0e177 100644 (file)
@@ -67,6 +67,9 @@ int mei_amthif_host_init(struct mei_device *dev, struct mei_me_client *me_cl)
        struct mei_cl *cl = &dev->iamthif_cl;
        int ret;
 
+       if (mei_cl_is_connected(cl))
+               return 0;
+
        dev->iamthif_state = MEI_IAMTHIF_IDLE;
 
        mei_cl_init(cl, dev);
@@ -79,8 +82,6 @@ int mei_amthif_host_init(struct mei_device *dev, struct mei_me_client *me_cl)
 
        ret = mei_cl_connect(cl, me_cl, NULL);
 
-       dev->iamthif_state = MEI_IAMTHIF_IDLE;
-
        return ret;
 }
 
index 951d322650404cfe558673cf6f153da77531cba2..f4cf43b47c7a67e26a2c43ac5614ba7d65576f31 100644 (file)
@@ -981,6 +981,14 @@ void mei_cl_bus_rescan_work(struct work_struct *work)
 {
        struct mei_device *bus =
                container_of(work, struct mei_device, bus_rescan_work);
+       struct mei_me_client *me_cl;
+
+       mutex_lock(&bus->device_lock);
+       me_cl = mei_me_cl_by_uuid(bus, &mei_amthif_guid);
+       if (me_cl)
+               mei_amthif_host_init(bus, me_cl);
+       mei_me_cl_put(me_cl);
+       mutex_unlock(&bus->device_lock);
 
        mei_cl_bus_rescan(bus);
 }
index 2890669b81f940aba7d24dd6848529309d4d96bf..af6816bc268fe36ad1823fda1bcec3f12ce4e995 100644 (file)
@@ -666,25 +666,12 @@ int mei_cl_unlink(struct mei_cl *cl)
        return 0;
 }
 
-
-void mei_host_client_init(struct work_struct *work)
+void mei_host_client_init(struct mei_device *dev)
 {
-       struct mei_device *dev =
-               container_of(work, struct mei_device, init_work);
-       struct mei_me_client *me_cl;
-
-       mutex_lock(&dev->device_lock);
-
-       me_cl = mei_me_cl_by_uuid(dev, &mei_amthif_guid);
-       if (me_cl)
-               mei_amthif_host_init(dev, me_cl);
-       mei_me_cl_put(me_cl);
-
        dev->dev_state = MEI_DEV_ENABLED;
        dev->reset_count = 0;
-       mutex_unlock(&dev->device_lock);
 
-       mei_cl_bus_rescan(dev);
+       schedule_work(&dev->bus_rescan_work);
 
        pm_runtime_mark_last_busy(dev->dev);
        dev_dbg(dev->dev, "rpm: autosuspend\n");
index a912ea686d97ba00aa6277c0c65e961a74340cce..0d7a3a1fef7891ca19eb4d2bfb98d54abede69cc 100644 (file)
@@ -226,7 +226,7 @@ int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb,
 
 void mei_cl_complete(struct mei_cl *cl, struct mei_cl_cb *cb);
 
-void mei_host_client_init(struct work_struct *work);
+void mei_host_client_init(struct mei_device *dev);
 
 u8 mei_cl_notify_fop2req(enum mei_cb_file_ops fop);
 enum mei_cb_file_ops mei_cl_notify_req2fop(u8 request);
index d2798d5b0a9d2f1ef32e7a1370e37cb46f3e1a1c..5e305d2605f30079bcb6f7193b28c812683ee92f 100644 (file)
@@ -549,7 +549,7 @@ static int mei_hbm_prop_req(struct mei_device *dev)
        /* We got all client properties */
        if (next_client_index == MEI_CLIENTS_MAX) {
                dev->hbm_state = MEI_HBM_STARTED;
-               schedule_work(&dev->init_work);
+               mei_host_client_init(dev);
 
                return 0;
        }
index 52fde2b498ef642149bcf6ec0e7b98247922195b..f7c8dfdb6a1254996ac56eebdf8bc760a01dce81 100644 (file)
@@ -91,7 +91,6 @@ EXPORT_SYMBOL_GPL(mei_fw_status2str);
  */
 void mei_cancel_work(struct mei_device *dev)
 {
-       cancel_work_sync(&dev->init_work);
        cancel_work_sync(&dev->reset_work);
        cancel_work_sync(&dev->bus_rescan_work);
 
@@ -393,7 +392,6 @@ void mei_device_init(struct mei_device *dev,
        mei_io_list_init(&dev->ctrl_rd_list);
 
        INIT_DELAYED_WORK(&dev->timer_work, mei_timer);
-       INIT_WORK(&dev->init_work, mei_host_client_init);
        INIT_WORK(&dev->reset_work, mei_reset_work);
        INIT_WORK(&dev->bus_rescan_work, mei_cl_bus_rescan_work);
 
index 2b9160e506d716215bfb6de756249fc7b6e7e5ef..db78e6d994568e535902fa045a21c68091d4812f 100644 (file)
@@ -410,7 +410,6 @@ const char *mei_pg_state_str(enum mei_pg_state state);
  * @iamthif_state : amthif processor state
  * @iamthif_canceled : current amthif command is canceled
  *
- * @init_work   : work item for the device init
  * @reset_work  : work item for the device reset
  * @bus_rescan_work : work item for the bus rescan
  *
@@ -503,7 +502,6 @@ struct mei_device {
        enum iamthif_states iamthif_state;
        bool iamthif_canceled;
 
-       struct work_struct init_work;
        struct work_struct reset_work;
        struct work_struct bus_rescan_work;