1
0
Fork 0

greybus: operation: add helper for creating core operations

Add a new core operation flag and a helper that core can use to create
core operations.

This will be used to implement the ping operations that core sends as
part of connection tear down.

Note that a new trace point is also added.

Signed-off-by: Johan Hovold <johan@hovoldconsulting.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
hifive-unleashed-5.1
Johan Hovold 2016-05-27 17:26:35 +02:00 committed by Greg Kroah-Hartman
parent 77bbbcf6d3
commit 18079ece81
3 changed files with 37 additions and 0 deletions

View File

@ -130,6 +130,11 @@ DECLARE_EVENT_CLASS(gb_operation,
*/
DEFINE_OPERATION_EVENT(gb_operation_create);
/*
* Occurs after a new core operation has been created.
*/
DEFINE_OPERATION_EVENT(gb_operation_create_core);
/*
* Occurs after a new operation has been created for an incoming
* request has been successfully created and initialized.

View File

@ -571,6 +571,26 @@ gb_operation_create_flags(struct gb_connection *connection,
}
EXPORT_SYMBOL_GPL(gb_operation_create_flags);
struct gb_operation *
gb_operation_create_core(struct gb_connection *connection,
u8 type, size_t request_size,
size_t response_size, unsigned long flags,
gfp_t gfp)
{
struct gb_operation *operation;
flags |= GB_OPERATION_FLAG_CORE;
operation = gb_operation_create_common(connection, type,
request_size, response_size,
flags, gfp);
if (operation)
trace_gb_operation_create_core(operation);
return operation;
}
/* Do not export this function. */
size_t gb_operation_get_payload_size_max(struct gb_connection *connection)
{
struct gb_host_device *hd = connection->hd;

View File

@ -60,6 +60,7 @@ struct gb_message {
#define GB_OPERATION_FLAG_INCOMING BIT(0)
#define GB_OPERATION_FLAG_UNIDIRECTIONAL BIT(1)
#define GB_OPERATION_FLAG_SHORT_RESPONSE BIT(2)
#define GB_OPERATION_FLAG_CORE BIT(3)
#define GB_OPERATION_FLAG_USER_MASK (GB_OPERATION_FLAG_SHORT_RESPONSE | \
GB_OPERATION_FLAG_UNIDIRECTIONAL)
@ -123,6 +124,11 @@ gb_operation_short_response_allowed(struct gb_operation *operation)
return operation->flags & GB_OPERATION_FLAG_SHORT_RESPONSE;
}
static inline bool gb_operation_is_core(struct gb_operation *operation)
{
return operation->flags & GB_OPERATION_FLAG_CORE;
}
void gb_connection_recv(struct gb_connection *connection,
void *data, size_t size);
@ -144,6 +150,12 @@ gb_operation_create(struct gb_connection *connection,
response_size, 0, gfp);
}
struct gb_operation *
gb_operation_create_core(struct gb_connection *connection,
u8 type, size_t request_size,
size_t response_size, unsigned long flags,
gfp_t gfp);
void gb_operation_get(struct gb_operation *operation);
void gb_operation_put(struct gb_operation *operation);