Commit 360a8779 authored by Alex Elder's avatar Alex Elder Committed by Greg Kroah-Hartman

greybus: op_cycle doesn't need to be atomic

We can update a connection's operation id counter under spinlock,
and thereby avoid the need to maintain it in an atomic variable.
Signed-off-by: default avatarAlex Elder <elder@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
parent b8616da8
......@@ -210,7 +210,6 @@ struct gb_connection *gb_connection_create(struct gb_interface *interface,
INIT_LIST_HEAD(&connection->operations);
INIT_LIST_HEAD(&connection->pending);
atomic_set(&connection->op_cycle, 0);
return connection;
}
......@@ -244,11 +243,6 @@ void gb_connection_destroy(struct gb_connection *connection)
device_del(&connection->dev);
}
u16 gb_connection_operation_id(struct gb_connection *connection)
{
return (u16)(atomic_inc_return(&connection->op_cycle) & (int)U16_MAX);
}
void gb_connection_err(struct gb_connection *connection, const char *fmt, ...)
{
struct va_format vaf;
......
......@@ -35,9 +35,9 @@ struct gb_connection {
enum gb_connection_state state;
u16 op_cycle;
struct list_head operations;
struct list_head pending; /* awaiting reponse */
atomic_t op_cycle;
void *private;
};
......@@ -53,8 +53,6 @@ void gb_connection_exit(struct gb_connection *connection);
struct gb_connection *gb_hd_connection_find(struct greybus_host_device *hd,
u16 cport_id);
u16 gb_connection_operation_id(struct gb_connection *connection);
__printf(2, 3)
void gb_connection_err(struct gb_connection *connection, const char *fmt, ...);
......
......@@ -61,17 +61,18 @@ static void gb_pending_operation_insert(struct gb_operation *operation)
struct gb_connection *connection = operation->connection;
struct gb_operation_msg_hdr *header;
/* Assign the operation's id, and store it in the header of
* the request message header.
/*
* Assign the operation's id and move it into its
* connection's pending list.
*/
operation->id = gb_connection_operation_id(connection);
header = operation->request->transfer_buffer;
header->id = cpu_to_le16(operation->id);
/* Insert the operation into its connection's pending list */
spin_lock_irq(&gb_operations_lock);
operation->id = ++connection->op_cycle;
list_move_tail(&operation->links, &connection->pending);
spin_unlock_irq(&gb_operations_lock);
/* Store the operation id in the request header */
header = operation->request->transfer_buffer;
header->id = cpu_to_le16(operation->id);
}
static void gb_pending_operation_remove(struct gb_operation *operation)
......
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