Skip to content

Commit

Permalink
mei: speed up the power down flow
Browse files Browse the repository at this point in the history
When mei driver is powering down due to suspend or shutdown
it will iterate over the mei client bus and disconnect
each client device attached in turn.
The power down flow consist of the link rest, which causes all clients
get disconnected at once, hence the individual disconnection
can be omitted and significantly reduce power down flow.

Signed-off-by: Tomas Winkler <tomas.winkler@intel.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
  • Loading branch information
Tomas Winkler authored and Greg Kroah-Hartman committed Dec 13, 2017
1 parent 2fc1024 commit 8d52af6
Show file tree
Hide file tree
Showing 4 changed files with 17 additions and 5 deletions.
10 changes: 8 additions & 2 deletions drivers/misc/mei/bus.c
Original file line number Diff line number Diff line change
Expand Up @@ -543,14 +543,20 @@ int mei_cldev_disable(struct mei_cl_device *cldev)
mutex_lock(&bus->device_lock);

if (!mei_cl_is_connected(cl)) {
dev_dbg(bus->dev, "Already disconnected");
dev_dbg(bus->dev, "Already disconnected\n");
err = 0;
goto out;
}

if (bus->dev_state == MEI_DEV_POWER_DOWN) {
dev_dbg(bus->dev, "Device is powering down don't botther with disconnection\n");
err = 0;
goto out;
}

err = mei_cl_disconnect(cl);
if (err < 0)
dev_err(bus->dev, "Could not disconnect from the ME client");
dev_err(bus->dev, "Could not disconnect from the ME client\n");

out:
/* Flush queues and remove any pending read */
Expand Down
4 changes: 3 additions & 1 deletion drivers/misc/mei/hw-me.c
Original file line number Diff line number Diff line change
Expand Up @@ -1260,7 +1260,9 @@ irqreturn_t mei_me_irq_thread_handler(int irq, void *dev_id)
if (rets == -ENODATA)
break;

if (rets && dev->dev_state != MEI_DEV_RESETTING) {
if (rets &&
(dev->dev_state != MEI_DEV_RESETTING ||
dev->dev_state != MEI_DEV_POWER_DOWN)) {
dev_err(dev->dev, "mei_irq_read_handler ret = %d.\n",
rets);
schedule_work(&dev->reset_work);
Expand Down
4 changes: 3 additions & 1 deletion drivers/misc/mei/hw-txe.c
Original file line number Diff line number Diff line change
Expand Up @@ -1127,7 +1127,9 @@ irqreturn_t mei_txe_irq_thread_handler(int irq, void *dev_id)
if (test_and_clear_bit(TXE_INTR_OUT_DB_BIT, &hw->intr_cause)) {
/* Read from TXE */
rets = mei_irq_read_handler(dev, &cmpl_list, &slots);
if (rets && dev->dev_state != MEI_DEV_RESETTING) {
if (rets &&
(dev->dev_state != MEI_DEV_RESETTING ||
dev->dev_state != MEI_DEV_POWER_DOWN)) {
dev_err(dev->dev,
"mei_irq_read_handler ret = %d.\n", rets);

Expand Down
4 changes: 3 additions & 1 deletion drivers/misc/mei/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -310,6 +310,9 @@ void mei_stop(struct mei_device *dev)
{
dev_dbg(dev->dev, "stopping the device.\n");

mutex_lock(&dev->device_lock);
dev->dev_state = MEI_DEV_POWER_DOWN;
mutex_unlock(&dev->device_lock);
mei_cl_bus_remove_devices(dev);

mei_cancel_work(dev);
Expand All @@ -319,7 +322,6 @@ void mei_stop(struct mei_device *dev)

mutex_lock(&dev->device_lock);

dev->dev_state = MEI_DEV_POWER_DOWN;
mei_reset(dev);
/* move device to disabled state unconditionally */
dev->dev_state = MEI_DEV_DISABLED;
Expand Down

0 comments on commit 8d52af6

Please sign in to comment.