summaryrefslogtreecommitdiffstats
path: root/drivers/misc/mei/client.c
diff options
context:
space:
mode:
authorTomas Winkler <tomas.winkler@intel.com>2018-02-14 14:03:29 +0200
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>2018-02-16 11:16:40 +0100
commit7ae079aca59f560d2a44b65d45dffdefed6bd17a (patch)
treeda52ccdb36fe46a16520357d6880d0adcab3e684 /drivers/misc/mei/client.c
parent5eeb2ca02a2f6084fc57ae5c244a38baab07033a (diff)
downloadlinux-7ae079aca59f560d2a44b65d45dffdefed6bd17a.tar.gz
linux-7ae079aca59f560d2a44b65d45dffdefed6bd17a.tar.bz2
linux-7ae079aca59f560d2a44b65d45dffdefed6bd17a.zip
mei: set device client to the disconnected state upon suspend.
This fixes regression introduced by commit 8d52af6795c0 ("mei: speed up the power down flow") In mei_cldev_disable during device power down flow, such as suspend or system power off, it jumps over disconnecting function to speed up the power down process, however, because the client is unlinked from the file_list (mei_cl_unlink) mei_cl_set_disconnected is not called from mei_cl_all_disconnect leaving resource leaking. The most visible is reference counter on underlying HW module is not decreased preventing to remove modules after suspend/resume cycles. Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> Fixes: 8d52af6795c0 ("mei: speed up the power down flow") Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
Diffstat (limited to 'drivers/misc/mei/client.c')
-rw-r--r--drivers/misc/mei/client.c6
1 files changed, 6 insertions, 0 deletions
diff --git a/drivers/misc/mei/client.c b/drivers/misc/mei/client.c
index be64969d986a..7e60c1817c31 100644
--- a/drivers/misc/mei/client.c
+++ b/drivers/misc/mei/client.c
@@ -945,6 +945,12 @@ int mei_cl_disconnect(struct mei_cl *cl)
return 0;
}
+ if (dev->dev_state == MEI_DEV_POWER_DOWN) {
+ cl_dbg(dev, cl, "Device is powering down, don't bother with disconnection\n");
+ mei_cl_set_disconnected(cl);
+ return 0;
+ }
+
rets = pm_runtime_get(dev->dev);
if (rets < 0 && rets != -EINPROGRESS) {
pm_runtime_put_noidle(dev->dev);