* [PATCH 2/3] hid: intel-ish-hid: ipc: change timed_wait_for_timeout() to be a function
@ 2016-11-11 1:40 Even Xu
2016-11-15 18:10 ` Pandruvada, Srinivas
0 siblings, 1 reply; 2+ messages in thread
From: Even Xu @ 2016-11-11 1:40 UTC (permalink / raw)
To: jikos; +Cc: linux-input, srinivas.pandruvada, Even Xu
The macro timed_wait_for_timeout() only be used in one function, so move
this marco from header file and change it to a function in ipc.c, where
it is used.
Signed-off-by: Even Xu <even.xu@intel.com>
---
drivers/hid/intel-ish-hid/ipc/ipc.c | 62 ++++++++++++++++++++++++++++++++---
drivers/hid/intel-ish-hid/ipc/utils.h | 43 ------------------------
2 files changed, 57 insertions(+), 48 deletions(-)
delete mode 100644 drivers/hid/intel-ish-hid/ipc/utils.h
diff --git a/drivers/hid/intel-ish-hid/ipc/ipc.c b/drivers/hid/intel-ish-hid/ipc/ipc.c
index 522c0e1..8194c35 100644
--- a/drivers/hid/intel-ish-hid/ipc/ipc.c
+++ b/drivers/hid/intel-ish-hid/ipc/ipc.c
@@ -19,7 +19,6 @@
#include <linux/jiffies.h>
#include "client.h"
#include "hw-ish.h"
-#include "utils.h"
#include "hbm.h"
/* For FW reset flow */
@@ -427,6 +426,59 @@ static int ipc_send_mng_msg(struct ishtp_device *dev, uint32_t msg_code,
sizeof(uint32_t) + size);
}
+#define WAIT_FOR_FW_RDY 0x1
+#define WAIT_FOR_INPUT_RDY 0x2
+
+/**
+ * timed_wait_for_timeout() - wait special event with timeout
+ * @dev: ISHTP device pointer
+ * @condition: indicate the condition for waiting
+ * @timeinc: time slice for every wait cycle, in ms
+ * @timeout: time in ms for timeout
+ *
+ * This function will check special event to be ready in a loop, the loop
+ * period is specificd in timeinc. Wait timeout will causes failure.
+ *
+ * Return: 0 for success else failure code
+ */
+static int timed_wait_for_timeout(struct ishtp_device *dev, int condition,
+ unsigned int timeinc, unsigned int timeout)
+{
+ bool complete = false;
+ int ret;
+
+ do {
+ if (condition == WAIT_FOR_FW_RDY) {
+ complete = ishtp_fw_is_ready(dev);
+ } else if (condition == WAIT_FOR_INPUT_RDY) {
+ complete = ish_is_input_ready(dev);
+ } else {
+ ret = -EINVAL;
+ goto out;
+ }
+
+ if (!complete) {
+ unsigned long left_time;
+
+ left_time = msleep_interruptible(timeinc);
+ timeout -= (timeinc - left_time);
+ }
+ } while (!complete && timeout > 0);
+
+ if (complete)
+ ret = 0;
+ else
+ ret = -EBUSY;
+
+out:
+ return ret;
+}
+
+#define TIME_SLICE_FOR_FW_RDY_MS 100
+#define TIME_SLICE_FOR_INPUT_RDY_MS 100
+#define TIMEOUT_FOR_FW_RDY_MS 2000
+#define TIMEOUT_FOR_INPUT_RDY_MS 2000
+
/**
* ish_fw_reset_handler() - FW reset handler
* @dev: ishtp device pointer
@@ -456,8 +508,8 @@ static int ish_fw_reset_handler(struct ishtp_device *dev)
ishtp_reset_handler(dev);
if (!ish_is_input_ready(dev))
- timed_wait_for_timeout(WAIT_FOR_SEND_SLICE,
- ish_is_input_ready(dev), (2 * HZ));
+ timed_wait_for_timeout(dev, WAIT_FOR_INPUT_RDY,
+ TIME_SLICE_FOR_INPUT_RDY_MS, TIMEOUT_FOR_INPUT_RDY_MS);
/* ISH FW is dead */
if (!ish_is_input_ready(dev))
@@ -472,8 +524,8 @@ static int ish_fw_reset_handler(struct ishtp_device *dev)
sizeof(uint32_t));
/* Wait for ISH FW'es ILUP and ISHTP_READY */
- timed_wait_for_timeout(WAIT_FOR_SEND_SLICE, ishtp_fw_is_ready(dev),
- (2 * HZ));
+ timed_wait_for_timeout(dev, WAIT_FOR_FW_RDY,
+ TIME_SLICE_FOR_FW_RDY_MS, TIMEOUT_FOR_FW_RDY_MS);
if (!ishtp_fw_is_ready(dev)) {
/* ISH FW is dead */
uint32_t ish_status;
diff --git a/drivers/hid/intel-ish-hid/ipc/utils.h b/drivers/hid/intel-ish-hid/ipc/utils.h
deleted file mode 100644
index dc39dfe..0000000
--- a/drivers/hid/intel-ish-hid/ipc/utils.h
+++ /dev/null
@@ -1,43 +0,0 @@
-/*
- * Utility macros of ISH
- *
- * Copyright (c) 2014-2016, Intel Corporation.
- *
- * This program is free software; you can redistribute it and/or modify it
- * under the terms and conditions of the GNU General Public License,
- * version 2, as published by the Free Software Foundation.
- *
- * This program is distributed in the hope it will be useful, but WITHOUT
- * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
- * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
- * more details.
- */
-#ifndef UTILS__H
-#define UTILS__H
-
-#define WAIT_FOR_SEND_SLICE (HZ / 10)
-#define WAIT_FOR_CONNECT_SLICE (HZ / 10)
-
-/*
- * Waits for specified event when a thread that triggers event
- * can't signal with timeout (use whenever we may hang)
- */
-#define timed_wait_for_timeout(timeinc, condition, timeout) \
- do { \
- int t = timeout; \
- do { \
- unsigned long j; \
- int done = 0; \
- \
- for (j = jiffies, done = 0; !done; ) { \
- schedule_timeout(timeinc); \
- if (time_is_before_eq_jiffies(j + timeinc)) \
- done = 1; \
- } \
- t -= timeinc; \
- if (t <= 0) \
- break; \
- } while (!(condition)); \
- } while (0)
-
-#endif /* UTILS__H */
--
2.7.4
^ permalink raw reply related [flat|nested] 2+ messages in thread
* Re: [PATCH 2/3] hid: intel-ish-hid: ipc: change timed_wait_for_timeout() to be a function
2016-11-11 1:40 [PATCH 2/3] hid: intel-ish-hid: ipc: change timed_wait_for_timeout() to be a function Even Xu
@ 2016-11-15 18:10 ` Pandruvada, Srinivas
0 siblings, 0 replies; 2+ messages in thread
From: Pandruvada, Srinivas @ 2016-11-15 18:10 UTC (permalink / raw)
To: jikos@kernel.org, Xu, Even; +Cc: linux-input@vger.kernel.org
On Fri, 2016-11-11 at 09:40 +0800, Even Xu wrote:
> The macro timed_wait_for_timeout() only be used in one function, so
> move
> this marco from header file and change it to a function in ipc.c,
> where
> it is used.
>
> Signed-off-by: Even Xu <even.xu@intel.com>
Acked-by: Srinivas Pandruvada <srinivas.pandruvada@linux.intel.com>
> ---
> drivers/hid/intel-ish-hid/ipc/ipc.c | 62
> ++++++++++++++++++++++++++++++++---
> drivers/hid/intel-ish-hid/ipc/utils.h | 43 ------------------------
> 2 files changed, 57 insertions(+), 48 deletions(-)
> delete mode 100644 drivers/hid/intel-ish-hid/ipc/utils.h
>
> diff --git a/drivers/hid/intel-ish-hid/ipc/ipc.c b/drivers/hid/intel-
> ish-hid/ipc/ipc.c
> index 522c0e1..8194c35 100644
> --- a/drivers/hid/intel-ish-hid/ipc/ipc.c
> +++ b/drivers/hid/intel-ish-hid/ipc/ipc.c
> @@ -19,7 +19,6 @@
> #include <linux/jiffies.h>
> #include "client.h"
> #include "hw-ish.h"
> -#include "utils.h"
> #include "hbm.h"
>
> /* For FW reset flow */
> @@ -427,6 +426,59 @@ static int ipc_send_mng_msg(struct ishtp_device
> *dev, uint32_t msg_code,
> sizeof(uint32_t) + size);
> }
>
> +#define WAIT_FOR_FW_RDY 0x1
> +#define WAIT_FOR_INPUT_RDY 0x2
> +
> +/**
> + * timed_wait_for_timeout() - wait special event with timeout
> + * @dev: ISHTP device pointer
> + * @condition: indicate the condition for waiting
> + * @timeinc: time slice for every wait cycle, in ms
> + * @timeout: time in ms for timeout
> + *
> + * This function will check special event to be ready in a loop, the
> loop
> + * period is specificd in timeinc. Wait timeout will causes failure.
> + *
> + * Return: 0 for success else failure code
> + */
> +static int timed_wait_for_timeout(struct ishtp_device *dev, int
> condition,
> + unsigned int timeinc, unsigned int
> timeout)
> +{
> + bool complete = false;
> + int ret;
> +
> + do {
> + if (condition == WAIT_FOR_FW_RDY) {
> + complete = ishtp_fw_is_ready(dev);
> + } else if (condition == WAIT_FOR_INPUT_RDY) {
> + complete = ish_is_input_ready(dev);
> + } else {
> + ret = -EINVAL;
> + goto out;
> + }
> +
> + if (!complete) {
> + unsigned long left_time;
> +
> + left_time = msleep_interruptible(timeinc);
> + timeout -= (timeinc - left_time);
> + }
> + } while (!complete && timeout > 0);
> +
> + if (complete)
> + ret = 0;
> + else
> + ret = -EBUSY;
> +
> +out:
> + return ret;
> +}
> +
> +#define TIME_SLICE_FOR_FW_RDY_MS 100
> +#define TIME_SLICE_FOR_INPUT_RDY_MS 100
> +#define TIMEOUT_FOR_FW_RDY_MS 2000
> +#define TIMEOUT_FOR_INPUT_RDY_MS 2000
> +
> /**
> * ish_fw_reset_handler() - FW reset handler
> * @dev: ishtp device pointer
> @@ -456,8 +508,8 @@ static int ish_fw_reset_handler(struct
> ishtp_device *dev)
> ishtp_reset_handler(dev);
>
> if (!ish_is_input_ready(dev))
> - timed_wait_for_timeout(WAIT_FOR_SEND_SLICE,
> - ish_is_input_ready(dev), (2 * HZ));
> + timed_wait_for_timeout(dev, WAIT_FOR_INPUT_RDY,
> + TIME_SLICE_FOR_INPUT_RDY_MS,
> TIMEOUT_FOR_INPUT_RDY_MS);
>
> /* ISH FW is dead */
> if (!ish_is_input_ready(dev))
> @@ -472,8 +524,8 @@ static int ish_fw_reset_handler(struct
> ishtp_device *dev)
> sizeof(uint32_t));
>
> /* Wait for ISH FW'es ILUP and ISHTP_READY */
> - timed_wait_for_timeout(WAIT_FOR_SEND_SLICE,
> ishtp_fw_is_ready(dev),
> - (2 * HZ));
> + timed_wait_for_timeout(dev, WAIT_FOR_FW_RDY,
> + TIME_SLICE_FOR_FW_RDY_MS,
> TIMEOUT_FOR_FW_RDY_MS);
> if (!ishtp_fw_is_ready(dev)) {
> /* ISH FW is dead */
> uint32_t ish_status;
> diff --git a/drivers/hid/intel-ish-hid/ipc/utils.h
> b/drivers/hid/intel-ish-hid/ipc/utils.h
> deleted file mode 100644
> index dc39dfe..0000000
> --- a/drivers/hid/intel-ish-hid/ipc/utils.h
> +++ /dev/null
> @@ -1,43 +0,0 @@
> -/*
> - * Utility macros of ISH
> - *
> - * Copyright (c) 2014-2016, Intel Corporation.
> - *
> - * This program is free software; you can redistribute it and/or
> modify it
> - * under the terms and conditions of the GNU General Public License,
> - * version 2, as published by the Free Software Foundation.
> - *
> - * This program is distributed in the hope it will be useful, but
> WITHOUT
> - * ANY WARRANTY; without even the implied warranty of
> MERCHANTABILITY or
> - * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public
> License for
> - * more details.
> - */
> -#ifndef UTILS__H
> -#define UTILS__H
> -
> -#define WAIT_FOR_SEND_SLICE (HZ / 10)
> -#define WAIT_FOR_CONNECT_SLICE (HZ / 10)
> -
> -/*
> - * Waits for specified event when a thread that triggers event
> - * can't signal with timeout (use whenever we may hang)
> - */
> -#define timed_wait_for_timeout(timeinc, condition, timeout)
> \
> - do {
> \
> - int t = timeout;
> \
> - do {
> \
> - unsigned long j;
> \
> - int done = 0;
> \
> - \
> - for (j = jiffies, done = 0; !done; ) {
> \
> - schedule_timeout(timeinc); \
> - if (time_is_before_eq_jiffies(j +
> timeinc)) \
> - done = 1; \
> - } \
> - t -= timeinc;
> \
> - if (t <= 0) \
> - break;
> \
> - } while (!(condition));
> \
> - } while (0)
> -
> -#endif /* UTILS__H */
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2016-11-15 18:10 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2016-11-11 1:40 [PATCH 2/3] hid: intel-ish-hid: ipc: change timed_wait_for_timeout() to be a function Even Xu
2016-11-15 18:10 ` Pandruvada, Srinivas
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).