From: Alexander Usyskin <[email protected]>

Stop and unregister receive and notification callbacks
from the disable function, to allow its later re-enablement.

Signed-off-by: Alexander Usyskin <[email protected]>
Signed-off-by: Tomas Winkler <[email protected]>
---
 drivers/misc/mei/bus.c | 30 ++++++++++++++++++++++--------
 1 file changed, 22 insertions(+), 8 deletions(-)

diff --git a/drivers/misc/mei/bus.c b/drivers/misc/mei/bus.c
index b67f15b53067..cb3e9e0ca049 100644
--- a/drivers/misc/mei/bus.c
+++ b/drivers/misc/mei/bus.c
@@ -499,6 +499,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;
-- 
2.7.4

Reply via email to