]> asedeno.scripts.mit.edu Git - linux.git/commitdiff
mei: bus: unregister callbacks upon me client disable call
authorAlexander Usyskin <alexander.usyskin@intel.com>
Fri, 27 Jan 2017 14:32:40 +0000 (16:32 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 31 Jan 2017 10:07:43 +0000 (11:07 +0100)
Stop and unregister receive and notification callbacks
from the disable function, to allow its later re-enablement.

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/bus.c

index b67f15b5306749cf18656078fa3727672652a2d9..cb3e9e0ca0497d38b866af5c442dab2d3495e932 100644 (file)
@@ -498,6 +498,25 @@ int mei_cldev_enable(struct mei_cl_device *cldev)
 }
 EXPORT_SYMBOL_GPL(mei_cldev_enable);
 
+/**
+ * mei_cldev_unregister_callbacks - internal wrapper for unregistering
+ *  callbacks.
+ *
+ * @cldev: client device
+ */
+static void mei_cldev_unregister_callbacks(struct mei_cl_device *cldev)
+{
+       if (cldev->rx_cb) {
+               cancel_work_sync(&cldev->rx_work);
+               cldev->rx_cb = NULL;
+       }
+
+       if (cldev->notif_cb) {
+               cancel_work_sync(&cldev->notif_work);
+               cldev->notif_cb = NULL;
+       }
+}
+
 /**
  * mei_cldev_disable - disable me client device
  *     disconnect form the me client
@@ -519,6 +538,8 @@ int mei_cldev_disable(struct mei_cl_device *cldev)
 
        bus = cldev->bus;
 
+       mei_cldev_unregister_callbacks(cldev);
+
        mutex_lock(&bus->device_lock);
 
        if (!mei_cl_is_connected(cl)) {
@@ -700,14 +721,7 @@ static int mei_cl_device_remove(struct device *dev)
        if (cldrv->remove)
                ret = cldrv->remove(cldev);
 
-       if (cldev->rx_cb) {
-               cancel_work_sync(&cldev->rx_work);
-               cldev->rx_cb = NULL;
-       }
-       if (cldev->notif_cb) {
-               cancel_work_sync(&cldev->notif_work);
-               cldev->notif_cb = NULL;
-       }
+       mei_cldev_unregister_callbacks(cldev);
 
        module_put(THIS_MODULE);
        dev->driver = NULL;