diff --git a/drivers/staging/greybus/connection.c b/drivers/staging/greybus/connection.c index 7fbfcdc22307..e59a7778c02a 100644 --- a/drivers/staging/greybus/connection.c +++ b/drivers/staging/greybus/connection.c @@ -191,6 +191,7 @@ struct gb_connection *gb_connection_create(struct gb_interface *interface, list_add_tail(&connection->interface_links, &interface->connections); spin_unlock_irq(&gb_connections_lock); + atomic_set(&connection->op_cycle, 0); INIT_LIST_HEAD(&connection->operations); return connection; diff --git a/drivers/staging/greybus/connection.h b/drivers/staging/greybus/connection.h index 035fced12edc..7568161e5dcb 100644 --- a/drivers/staging/greybus/connection.h +++ b/drivers/staging/greybus/connection.h @@ -35,7 +35,7 @@ struct gb_connection { enum gb_connection_state state; - u16 op_cycle; + atomic_t op_cycle; struct list_head operations; void *private; diff --git a/drivers/staging/greybus/operation.c b/drivers/staging/greybus/operation.c index 6ed1d479b117..15a6e3b24a7c 100644 --- a/drivers/staging/greybus/operation.c +++ b/drivers/staging/greybus/operation.c @@ -640,6 +640,7 @@ int gb_operation_request_send(struct gb_operation *operation, struct gb_connection *connection = operation->connection; struct gb_operation_msg_hdr *header; unsigned long timeout; + unsigned int cycle; int ret; if (connection->state != GB_CONNECTION_STATE_ENABLED) @@ -661,9 +662,8 @@ int gb_operation_request_send(struct gb_operation *operation, * Assign the operation's id, and store it in the request header. * Zero is a reserved operation id. */ - spin_lock_irq(&gb_operations_lock); - operation->id = ++connection->op_cycle % U16_MAX + 1; - spin_unlock_irq(&gb_operations_lock); + cycle = (unsigned int)atomic_inc_return(&connection->op_cycle); + operation->id = (u16)(cycle % U16_MAX + 1); header = operation->request->header; header->operation_id = cpu_to_le16(operation->id);