aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorAlexander Usyskin <alexander.usyskin@intel.com>2016-02-07 16:35:43 -0500
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2016-02-07 17:47:20 -0500
commit025fb792bac33632c19fe12265ba1f6108921300 (patch)
tree0e0a83498bf3a76e71e1bfabba03b3a541d314d0
parent27f476ea98ed495839662db4e3a76357bbeb1bb3 (diff)
mei: split amthif client init from end of clients enumeration
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>
-rw-r--r--drivers/misc/mei/amthif.c5
-rw-r--r--drivers/misc/mei/bus.c8
-rw-r--r--drivers/misc/mei/client.c17
-rw-r--r--drivers/misc/mei/client.h2
-rw-r--r--drivers/misc/mei/hbm.c2
-rw-r--r--drivers/misc/mei/init.c2
-rw-r--r--drivers/misc/mei/mei_dev.h2
7 files changed, 15 insertions, 23 deletions
diff --git a/drivers/misc/mei/amthif.c b/drivers/misc/mei/amthif.c
index de194ef573ee..04525ada9eda 100644
--- a/drivers/misc/mei/amthif.c
+++ b/drivers/misc/mei/amthif.c
@@ -67,6 +67,9 @@ int mei_amthif_host_init(struct mei_device *dev, struct mei_me_client *me_cl)
67 struct mei_cl *cl = &dev->iamthif_cl; 67 struct mei_cl *cl = &dev->iamthif_cl;
68 int ret; 68 int ret;
69 69
70 if (mei_cl_is_connected(cl))
71 return 0;
72
70 dev->iamthif_state = MEI_IAMTHIF_IDLE; 73 dev->iamthif_state = MEI_IAMTHIF_IDLE;
71 74
72 mei_cl_init(cl, dev); 75 mei_cl_init(cl, dev);
@@ -79,8 +82,6 @@ int mei_amthif_host_init(struct mei_device *dev, struct mei_me_client *me_cl)
79 82
80 ret = mei_cl_connect(cl, me_cl, NULL); 83 ret = mei_cl_connect(cl, me_cl, NULL);
81 84
82 dev->iamthif_state = MEI_IAMTHIF_IDLE;
83
84 return ret; 85 return ret;
85} 86}
86 87
diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c
index 951d32265040..f4cf43b47c7a 100644
--- a/drivers/misc/mei/bus.c
+++ b/drivers/misc/mei/bus.c
@@ -981,6 +981,14 @@ void mei_cl_bus_rescan_work(struct work_struct *work)
981{ 981{
982 struct mei_device *bus = 982 struct mei_device *bus =
983 container_of(work, struct mei_device, bus_rescan_work); 983 container_of(work, struct mei_device, bus_rescan_work);
984 struct mei_me_client *me_cl;
985
986 mutex_lock(&bus->device_lock);
987 me_cl = mei_me_cl_by_uuid(bus, &mei_amthif_guid);
988 if (me_cl)
989 mei_amthif_host_init(bus, me_cl);
990 mei_me_cl_put(me_cl);
991 mutex_unlock(&bus->device_lock);
984 992
985 mei_cl_bus_rescan(bus); 993 mei_cl_bus_rescan(bus);
986} 994}
diff --git a/drivers/misc/mei/client.c b/drivers/misc/mei/client.c
index 2890669b81f9..af6816bc268f 100644
--- a/drivers/misc/mei/client.c
+++ b/drivers/misc/mei/client.c
@@ -666,25 +666,12 @@ int mei_cl_unlink(struct mei_cl *cl)
666 return 0; 666 return 0;
667} 667}
668 668
669 669void mei_host_client_init(struct mei_device *dev)
670void mei_host_client_init(struct work_struct *work)
671{ 670{
672 struct mei_device *dev =
673 container_of(work, struct mei_device, init_work);
674 struct mei_me_client *me_cl;
675
676 mutex_lock(&dev->device_lock);
677
678 me_cl = mei_me_cl_by_uuid(dev, &mei_amthif_guid);
679 if (me_cl)
680 mei_amthif_host_init(dev, me_cl);
681 mei_me_cl_put(me_cl);
682
683 dev->dev_state = MEI_DEV_ENABLED; 671 dev->dev_state = MEI_DEV_ENABLED;
684 dev->reset_count = 0; 672 dev->reset_count = 0;
685 mutex_unlock(&dev->device_lock);
686 673
687 mei_cl_bus_rescan(dev); 674 schedule_work(&dev->bus_rescan_work);
688 675
689 pm_runtime_mark_last_busy(dev->dev); 676 pm_runtime_mark_last_busy(dev->dev);
690 dev_dbg(dev->dev, "rpm: autosuspend\n"); 677 dev_dbg(dev->dev, "rpm: autosuspend\n");
diff --git a/drivers/misc/mei/client.h b/drivers/misc/mei/client.h
index a912ea686d97..0d7a3a1fef78 100644
--- a/drivers/misc/mei/client.h
+++ b/drivers/misc/mei/client.h
@@ -226,7 +226,7 @@ int mei_cl_irq_write(struct mei_cl *cl, struct mei_cl_cb *cb,
226 226
227void mei_cl_complete(struct mei_cl *cl, struct mei_cl_cb *cb); 227void mei_cl_complete(struct mei_cl *cl, struct mei_cl_cb *cb);
228 228
229void mei_host_client_init(struct work_struct *work); 229void mei_host_client_init(struct mei_device *dev);
230 230
231u8 mei_cl_notify_fop2req(enum mei_cb_file_ops fop); 231u8 mei_cl_notify_fop2req(enum mei_cb_file_ops fop);
232enum mei_cb_file_ops mei_cl_notify_req2fop(u8 request); 232enum mei_cb_file_ops mei_cl_notify_req2fop(u8 request);
diff --git a/drivers/misc/mei/hbm.c b/drivers/misc/mei/hbm.c
index d2798d5b0a9d..5e305d2605f3 100644
--- a/drivers/misc/mei/hbm.c
+++ b/drivers/misc/mei/hbm.c
@@ -549,7 +549,7 @@ static int mei_hbm_prop_req(struct mei_device *dev)
549 /* We got all client properties */ 549 /* We got all client properties */
550 if (next_client_index == MEI_CLIENTS_MAX) { 550 if (next_client_index == MEI_CLIENTS_MAX) {
551 dev->hbm_state = MEI_HBM_STARTED; 551 dev->hbm_state = MEI_HBM_STARTED;
552 schedule_work(&dev->init_work); 552 mei_host_client_init(dev);
553 553
554 return 0; 554 return 0;
555 } 555 }
diff --git a/drivers/misc/mei/init.c b/drivers/misc/mei/init.c
index 52fde2b498ef..f7c8dfdb6a12 100644
--- a/drivers/misc/mei/init.c
+++ b/drivers/misc/mei/init.c
@@ -91,7 +91,6 @@ EXPORT_SYMBOL_GPL(mei_fw_status2str);
91 */ 91 */
92void mei_cancel_work(struct mei_device *dev) 92void mei_cancel_work(struct mei_device *dev)
93{ 93{
94 cancel_work_sync(&dev->init_work);
95 cancel_work_sync(&dev->reset_work); 94 cancel_work_sync(&dev->reset_work);
96 cancel_work_sync(&dev->bus_rescan_work); 95 cancel_work_sync(&dev->bus_rescan_work);
97 96
@@ -393,7 +392,6 @@ void mei_device_init(struct mei_device *dev,
393 mei_io_list_init(&dev->ctrl_rd_list); 392 mei_io_list_init(&dev->ctrl_rd_list);
394 393
395 INIT_DELAYED_WORK(&dev->timer_work, mei_timer); 394 INIT_DELAYED_WORK(&dev->timer_work, mei_timer);
396 INIT_WORK(&dev->init_work, mei_host_client_init);
397 INIT_WORK(&dev->reset_work, mei_reset_work); 395 INIT_WORK(&dev->reset_work, mei_reset_work);
398 INIT_WORK(&dev->bus_rescan_work, mei_cl_bus_rescan_work); 396 INIT_WORK(&dev->bus_rescan_work, mei_cl_bus_rescan_work);
399 397
diff --git a/drivers/misc/mei/mei_dev.h b/drivers/misc/mei/mei_dev.h
index 2b9160e506d7..db78e6d99456 100644
--- a/drivers/misc/mei/mei_dev.h
+++ b/drivers/misc/mei/mei_dev.h
@@ -410,7 +410,6 @@ const char *mei_pg_state_str(enum mei_pg_state state);
410 * @iamthif_state : amthif processor state 410 * @iamthif_state : amthif processor state
411 * @iamthif_canceled : current amthif command is canceled 411 * @iamthif_canceled : current amthif command is canceled
412 * 412 *
413 * @init_work : work item for the device init
414 * @reset_work : work item for the device reset 413 * @reset_work : work item for the device reset
415 * @bus_rescan_work : work item for the bus rescan 414 * @bus_rescan_work : work item for the bus rescan
416 * 415 *
@@ -503,7 +502,6 @@ struct mei_device {
503 enum iamthif_states iamthif_state; 502 enum iamthif_states iamthif_state;
504 bool iamthif_canceled; 503 bool iamthif_canceled;
505 504
506 struct work_struct init_work;
507 struct work_struct reset_work; 505 struct work_struct reset_work;
508 struct work_struct bus_rescan_work; 506 struct work_struct bus_rescan_work;
509 507