| From fe292283c23329218e384bffc6cb4bfa3fd92277 Mon Sep 17 00:00:00 2001 |
| From: Tomas Winkler <tomas.winkler@intel.com> |
| Date: Tue, 14 Apr 2015 10:27:26 +0300 |
| Subject: mei: txe: reduce suspend/resume time |
| |
| From: Tomas Winkler <tomas.winkler@intel.com> |
| |
| commit fe292283c23329218e384bffc6cb4bfa3fd92277 upstream. |
| |
| HW has to be in known state before the initialisation |
| sequence is started. The polling step for settling aliveness |
| was set to 200ms while in practise this can be done in up to 30msecs. |
| |
| Signed-off-by: Tomas Winkler <tomas.winkler@intel.com> |
| Signed-off-by: Barak Yoresh <barak.yoresh@intel.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| --- |
| drivers/misc/mei/hw-txe.c | 20 ++++++++++---------- |
| 1 file changed, 10 insertions(+), 10 deletions(-) |
| |
| --- a/drivers/misc/mei/hw-txe.c |
| +++ b/drivers/misc/mei/hw-txe.c |
| @@ -16,6 +16,7 @@ |
| |
| #include <linux/pci.h> |
| #include <linux/jiffies.h> |
| +#include <linux/ktime.h> |
| #include <linux/delay.h> |
| #include <linux/kthread.h> |
| #include <linux/irqreturn.h> |
| @@ -218,26 +219,25 @@ static u32 mei_txe_aliveness_get(struct |
| * |
| * Polls for HICR_HOST_ALIVENESS_RESP.ALIVENESS_RESP to be set |
| * |
| - * Return: > 0 if the expected value was received, -ETIME otherwise |
| + * Return: 0 if the expected value was received, -ETIME otherwise |
| */ |
| static int mei_txe_aliveness_poll(struct mei_device *dev, u32 expected) |
| { |
| struct mei_txe_hw *hw = to_txe_hw(dev); |
| - int t = 0; |
| + ktime_t stop, start; |
| |
| + start = ktime_get(); |
| + stop = ktime_add(start, ms_to_ktime(SEC_ALIVENESS_WAIT_TIMEOUT)); |
| do { |
| hw->aliveness = mei_txe_aliveness_get(dev); |
| if (hw->aliveness == expected) { |
| dev->pg_event = MEI_PG_EVENT_IDLE; |
| - dev_dbg(dev->dev, |
| - "aliveness settled after %d msecs\n", t); |
| - return t; |
| + dev_dbg(dev->dev, "aliveness settled after %lld usecs\n", |
| + ktime_to_us(ktime_sub(ktime_get(), start))); |
| + return 0; |
| } |
| - mutex_unlock(&dev->device_lock); |
| - msleep(MSEC_PER_SEC / 5); |
| - mutex_lock(&dev->device_lock); |
| - t += MSEC_PER_SEC / 5; |
| - } while (t < SEC_ALIVENESS_WAIT_TIMEOUT); |
| + usleep_range(20, 50); |
| + } while (ktime_before(ktime_get(), stop)); |
| |
| dev->pg_event = MEI_PG_EVENT_IDLE; |
| dev_err(dev->dev, "aliveness timed out\n"); |