summaryrefslogtreecommitdiffstats
path: root/drivers/staging/greybus/connection.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/staging/greybus/connection.c')
-rw-r--r--drivers/staging/greybus/connection.c21
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);