diff options
Diffstat (limited to 'drivers/staging/greybus/connection.c')
-rw-r--r-- | drivers/staging/greybus/connection.c | 21 |
1 files changed, 13 insertions, 8 deletions
diff --git a/drivers/staging/greybus/connection.c b/drivers/staging/greybus/connection.c index b356ee0575e2..1cb33147aa00 100644 --- a/drivers/staging/greybus/connection.c +++ b/drivers/staging/greybus/connection.c @@ -403,15 +403,14 @@ int gb_connection_init(struct gb_connection *connection) if (ret) goto err_hd_cport_disable; - ret = gb_connection_control_connected(connection); - if (ret) - goto err_svc_destroy; - - /* Need to enable the connection to initialize it */ spin_lock_irq(&connection->lock); connection->state = GB_CONNECTION_STATE_ENABLED; spin_unlock_irq(&connection->lock); + ret = gb_connection_control_connected(connection); + if (ret) + goto err_svc_destroy; + ret = gb_connection_protocol_get_version(connection); if (ret) goto err_disconnect; @@ -423,11 +422,11 @@ int gb_connection_init(struct gb_connection *connection) return 0; err_disconnect: + gb_connection_control_disconnected(connection); + spin_lock_irq(&connection->lock); - connection->state = GB_CONNECTION_STATE_ERROR; + connection->state = GB_CONNECTION_STATE_DISABLED; spin_unlock_irq(&connection->lock); - - gb_connection_control_disconnected(connection); err_svc_destroy: gb_connection_svc_connection_destroy(connection); err_hd_cport_disable: @@ -451,7 +450,13 @@ void gb_connection_exit(struct gb_connection *connection) gb_connection_cancel_operations(connection, -ESHUTDOWN); connection->protocol->connection_exit(connection); + gb_connection_control_disconnected(connection); + + spin_lock_irq(&connection->lock); + connection->state = GB_CONNECTION_STATE_DISABLED; + spin_unlock_irq(&connection->lock); + gb_connection_svc_connection_destroy(connection); gb_connection_hd_cport_disable(connection); gb_connection_unbind_protocol(connection); |