summaryrefslogtreecommitdiffstats
path: root/drivers/staging/greybus/operation.c
diff options
context:
space:
mode:
authorJohan Hovold <johan@hovoldconsulting.com>2015-07-14 15:43:36 +0200
committerGreg Kroah-Hartman <gregkh@google.com>2015-07-15 12:39:13 -0700
commit4f2c08aba792d4c778774e90e47865718eb1b7f8 (patch)
tree2914b6557e54819140cd4e8c4068b27f91dcc87a /drivers/staging/greybus/operation.c
parent5a3be769e92ea993f8a8c27b89571c276d874733 (diff)
greybus: operation: allow drivers to define custom timeouts
Add new interface gb_operation_request_send_sync_timeout, which allows drivers to define a custom operation timeout instead of the default one-second timeout. The timeout is expected to depend on protocol and operation and therefore needs to be configurable. Note that that a timeout of zero is used to wait indefinitely. Reviewed-by: Bryan O'Donoghue <bryan.odonoghue@linaro.org> Signed-off-by: Johan Hovold <johan@hovoldconsulting.com> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
Diffstat (limited to 'drivers/staging/greybus/operation.c')
-rw-r--r--drivers/staging/greybus/operation.c19
1 files changed, 11 insertions, 8 deletions
diff --git a/drivers/staging/greybus/operation.c b/drivers/staging/greybus/operation.c
index 17b07fb24006..63c4a5b8b0f1 100644
--- a/drivers/staging/greybus/operation.c
+++ b/drivers/staging/greybus/operation.c
@@ -16,9 +16,6 @@
#include "greybus.h"
-/* The default amount of time a request is given to complete */
-#define OPERATION_TIMEOUT_DEFAULT 1000 /* milliseconds */
-
static struct kmem_cache *gb_operation_cache;
static struct kmem_cache *gb_message_cache;
@@ -690,18 +687,24 @@ EXPORT_SYMBOL_GPL(gb_operation_request_send);
* error is detected. The return value is the result of the
* operation.
*/
-int gb_operation_request_send_sync(struct gb_operation *operation)
+int gb_operation_request_send_sync_timeout(struct gb_operation *operation,
+ unsigned int timeout)
{
int ret;
- unsigned long timeout;
+ unsigned long timeout_jiffies;
ret = gb_operation_request_send(operation, gb_operation_sync_callback,
GFP_KERNEL);
if (ret)
return ret;
- timeout = msecs_to_jiffies(OPERATION_TIMEOUT_DEFAULT);
- ret = wait_for_completion_interruptible_timeout(&operation->completion, timeout);
+ if (timeout)
+ timeout_jiffies = msecs_to_jiffies(timeout);
+ else
+ timeout_jiffies = MAX_SCHEDULE_TIMEOUT;
+
+ ret = wait_for_completion_interruptible_timeout(&operation->completion,
+ timeout_jiffies);
if (ret < 0) {
/* Cancel the operation if interrupted */
gb_operation_cancel(operation, -ECANCELED);
@@ -712,7 +715,7 @@ int gb_operation_request_send_sync(struct gb_operation *operation)
return gb_operation_result(operation);
}
-EXPORT_SYMBOL_GPL(gb_operation_request_send_sync);
+EXPORT_SYMBOL_GPL(gb_operation_request_send_sync_timeout);
/*
* Send a response for an incoming operation request. A non-zero