Commit 5fdc027d authored by Johan Hovold's avatar Johan Hovold Committed by Greg Kroah-Hartman

greybus: operation: add helper functions for unidirectional operations

Add helper functions for initiating unidirectional operations and
waiting for them to have been acknowledged as sent by the host device.
Signed-off-by: default avatarJohan Hovold <johan@hovoldconsulting.com>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent 3e2ee2c1
...@@ -1090,6 +1090,53 @@ int gb_operation_sync_timeout(struct gb_connection *connection, int type, ...@@ -1090,6 +1090,53 @@ int gb_operation_sync_timeout(struct gb_connection *connection, int type,
} }
EXPORT_SYMBOL_GPL(gb_operation_sync_timeout); EXPORT_SYMBOL_GPL(gb_operation_sync_timeout);
/**
* gb_operation_unidirectional_timeout() - initiate a unidirectional operation
* @connection: connection to use
* @type: type of operation to send
* @request: memory buffer to copy the request from
* @request_size: size of @request
* @timeout: send timeout in milliseconds
*
* Initiate a unidirectional operation by sending a request message and
* waiting for it to be acknowledged as sent by the host device.
*
* Note that successful send of a unidirectional operation does not imply that
* the request as actually reached the remote end of the connection.
*/
int gb_operation_unidirectional_timeout(struct gb_connection *connection,
int type, void *request, int request_size,
unsigned int timeout)
{
struct gb_operation *operation;
int ret;
if (request_size && !request)
return -EINVAL;
operation = gb_operation_create_flags(connection, type,
request_size, 0,
GB_OPERATION_FLAG_UNIDIRECTIONAL,
GFP_KERNEL);
if (!operation)
return -ENOMEM;
if (request_size)
memcpy(operation->request->payload, request, request_size);
ret = gb_operation_request_send_sync_timeout(operation, timeout);
if (ret) {
dev_err(&connection->hd->dev,
"%s: unidirectional operation of type 0x%02x failed: %d\n",
connection->name, type, ret);
}
gb_operation_put(operation);
return ret;
}
EXPORT_SYMBOL_GPL(gb_operation_unidirectional_timeout);
int __init gb_operation_init(void) int __init gb_operation_init(void)
{ {
gb_message_cache = kmem_cache_create("gb_message_cache", gb_message_cache = kmem_cache_create("gb_message_cache",
......
...@@ -178,6 +178,9 @@ int gb_operation_sync_timeout(struct gb_connection *connection, int type, ...@@ -178,6 +178,9 @@ int gb_operation_sync_timeout(struct gb_connection *connection, int type,
void *request, int request_size, void *request, int request_size,
void *response, int response_size, void *response, int response_size,
unsigned int timeout); unsigned int timeout);
int gb_operation_unidirectional_timeout(struct gb_connection *connection,
int type, void *request, int request_size,
unsigned int timeout);
static inline int gb_operation_sync(struct gb_connection *connection, int type, static inline int gb_operation_sync(struct gb_connection *connection, int type,
void *request, int request_size, void *request, int request_size,
...@@ -188,6 +191,13 @@ static inline int gb_operation_sync(struct gb_connection *connection, int type, ...@@ -188,6 +191,13 @@ static inline int gb_operation_sync(struct gb_connection *connection, int type,
GB_OPERATION_TIMEOUT_DEFAULT); GB_OPERATION_TIMEOUT_DEFAULT);
} }
static inline int gb_operation_unidirectional(struct gb_connection *connection,
int type, void *request, int request_size)
{
return gb_operation_unidirectional_timeout(connection, type,
request, request_size, GB_OPERATION_TIMEOUT_DEFAULT);
}
int gb_operation_init(void); int gb_operation_init(void);
void gb_operation_exit(void); void gb_operation_exit(void);
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment