mei: bus: cancel and disable callback after release call
authorAlexander Usyskin <alexander.usyskin@intel.com>
Fri, 27 Jan 2017 14:32:38 +0000 (16:32 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 31 Jan 2017 10:07:43 +0000 (11:07 +0100)
A driver on the mei bus may rely on the availability
of the receive callback during driver remove() call, e.g. mei_wdt.
Move callbacks dismantling after the remove() call to unblock that scenario.

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 2d9c5dd06e423266680294e4d806e2e736d32156..3bb1f1500f6be3b76b2c70e1a7a76c74c07e2131 100644 (file)
@@ -665,6 +665,10 @@ static int mei_cl_device_remove(struct device *dev)
        if (!cldev || !dev->driver)
                return 0;
 
+       cldrv = to_mei_cl_driver(dev->driver);
+       if (cldrv->remove)
+               ret = cldrv->remove(cldev);
+
        if (cldev->rx_cb) {
                cancel_work_sync(&cldev->rx_work);
                cldev->rx_cb = NULL;
@@ -674,10 +678,6 @@ static int mei_cl_device_remove(struct device *dev)
                cldev->notif_cb = NULL;
        }
 
-       cldrv = to_mei_cl_driver(dev->driver);
-       if (cldrv->remove)
-               ret = cldrv->remove(cldev);
-
        module_put(THIS_MODULE);
        dev->driver = NULL;
        return ret;