greybus: connection: fix connection-state handling
authorJohan Hovold <johan@hovoldconsulting.com>
Fri, 8 Jan 2016 19:13:45 +0000 (20:13 +0100)
committerGreg Kroah-Hartman <gregkh@google.com>
Wed, 13 Jan 2016 02:17:35 +0000 (18:17 -0800)
Set connection state to ENABLE before sending the control connected
message, and set state DISABLE after sending the control disconnected
event.

Remove the now unused ERROR connection state.

Signed-off-by: Johan Hovold <johan@hovoldconsulting.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/connection.c
drivers/staging/greybus/connection.h

index b356ee0575e204551acf333d8bc1d06131eddb34..1cb33147aa004d9511248aaeb5207bd863e97cc9 100644 (file)
@@ -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);
index b795b44c1859c5b6f8de5c7a86fe8911013a8ad9..ef31c8d6dfe0d1b0f819c66bb163f4164b69244e 100644 (file)
@@ -17,8 +17,7 @@ enum gb_connection_state {
        GB_CONNECTION_STATE_INVALID     = 0,
        GB_CONNECTION_STATE_DISABLED    = 1,
        GB_CONNECTION_STATE_ENABLED     = 2,
-       GB_CONNECTION_STATE_ERROR       = 3,
-       GB_CONNECTION_STATE_DESTROYING  = 4,
+       GB_CONNECTION_STATE_DESTROYING  = 3,
 };
 
 struct gb_connection {