1 From b5958faa34e2f99f3475ad89c52d98dfea079d33 Mon Sep 17 00:00:00 2001
2 From: Alexander Usyskin <alexander.usyskin@intel.com>
3 Date: Mon, 25 Feb 2019 11:09:28 +0200
4 Subject: mei: bus: move hw module get/put to probe/release
6 From: Alexander Usyskin <alexander.usyskin@intel.com>
8 commit b5958faa34e2f99f3475ad89c52d98dfea079d33 upstream.
10 Fix unbalanced module reference counting during internal reset, which
11 prevents the drivers unloading.
12 Tracking mei_me/txe modules on mei client bus via
13 mei_cldev_enable/disable is error prone due to possible internal
14 reset flow, where clients are disconnected underneath.
15 Moving reference counting to probe and release of mei bus client
16 driver solves this issue in simplest way, as each client provides only
17 a single connection to a client bus driver.
19 Cc: <stable@vger.kernel.org>
20 Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
21 Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
22 Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
25 drivers/misc/mei/bus.c | 21 ++++++++++-----------
26 1 file changed, 10 insertions(+), 11 deletions(-)
28 --- a/drivers/misc/mei/bus.c
29 +++ b/drivers/misc/mei/bus.c
30 @@ -541,17 +541,9 @@ int mei_cldev_enable(struct mei_cl_devic
34 - if (!mei_cl_bus_module_get(cldev)) {
35 - dev_err(&cldev->dev, "get hw module failed");
40 ret = mei_cl_connect(cl, cldev->me_cl, NULL);
43 dev_err(&cldev->dev, "cannot connect\n");
44 - mei_cl_bus_module_put(cldev);
48 mutex_unlock(&bus->device_lock);
49 @@ -614,7 +606,6 @@ int mei_cldev_disable(struct mei_cl_devi
51 dev_err(bus->dev, "Could not disconnect from the ME client\n");
53 - mei_cl_bus_module_put(cldev);
55 /* Flush queues and remove any pending read */
56 mei_cl_flush_queues(cl, NULL);
57 @@ -725,9 +716,16 @@ static int mei_cl_device_probe(struct de
61 + if (!mei_cl_bus_module_get(cldev)) {
62 + dev_err(&cldev->dev, "get hw module failed");
66 ret = cldrv->probe(cldev, id);
69 + mei_cl_bus_module_put(cldev);
73 __module_get(THIS_MODULE);
75 @@ -755,6 +753,7 @@ static int mei_cl_device_remove(struct d
77 mei_cldev_unregister_callbacks(cldev);
79 + mei_cl_bus_module_put(cldev);
80 module_put(THIS_MODULE);