mei: do not overwrite state on hw start
authorAlexander Usyskin <alexander.usyskin@intel.com>
Tue, 15 Feb 2022 08:04:38 +0000 (10:04 +0200)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Fri, 25 Feb 2022 11:14:01 +0000 (12:14 +0100)
During the hardware start sequence, do not overwrite the driver state
and do not proceed with the initialization sequence if the state
was changed while the driver was waiting for the start interrupt.

This can happen if the driver's removal/stop procedure was triggered
from the parent level while the driver is waiting for the start
interrupt. This may lead to stray the reset work or the timer
after driver were removed.

Signed-off-by: Alexander Usyskin <alexander.usyskin@intel.com>
Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Link: https://lore.kernel.org/r/20220215080438.264876-4-tomas.winkler@intel.com
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/misc/mei/init.c

index f79076c67256e32f82ff9b73732b61acc08d4f5c..eb052005ca86d89dccac83f00dd223ee1a4fc5b0 100644 (file)
@@ -161,6 +161,11 @@ int mei_reset(struct mei_device *dev)
                return ret;
        }
 
+       if (dev->dev_state != MEI_DEV_RESETTING) {
+               dev_dbg(dev->dev, "wrong state = %d on link start\n", dev->dev_state);
+               return 0;
+       }
+
        dev_dbg(dev->dev, "link is established start sending messages.\n");
 
        mei_set_devstate(dev, MEI_DEV_INIT_CLIENTS);