greybus: connection: always cancel operations on connection disable
authorJohan Hovold <johan@hovoldconsulting.com>
Tue, 19 Jan 2016 11:51:03 +0000 (12:51 +0100)
committerGreg Kroah-Hartman <gregkh@google.com>
Tue, 19 Jan 2016 20:12:40 +0000 (12:12 -0800)
Always cancel all operations on connection disable and remove the now
unused DESTROYING state.

Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org>
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 3d7a9ca9ce2b58c10976bf36623293f300e10230..0fd7c051c2d34d591b370cc83e26489b4b8b0b78 100644 (file)
@@ -426,12 +426,17 @@ EXPORT_SYMBOL_GPL(gb_connection_enable);
 
 void gb_connection_disable(struct gb_connection *connection)
 {
+       if (connection->state == GB_CONNECTION_STATE_DISABLED)
+               return;
+
        gb_connection_control_disconnected(connection);
 
        spin_lock_irq(&connection->lock);
        connection->state = GB_CONNECTION_STATE_DISABLED;
        spin_unlock_irq(&connection->lock);
 
+       gb_connection_cancel_operations(connection, -ESHUTDOWN);
+
        gb_connection_svc_connection_destroy(connection);
        gb_connection_hd_cport_disable(connection);
 }
@@ -483,19 +488,13 @@ EXPORT_SYMBOL_GPL(gb_connection_legacy_init);
 
 void gb_connection_legacy_exit(struct gb_connection *connection)
 {
-       spin_lock_irq(&connection->lock);
-       if (connection->state != GB_CONNECTION_STATE_ENABLED) {
-               spin_unlock_irq(&connection->lock);
+       if (connection->state == GB_CONNECTION_STATE_DISABLED)
                return;
-       }
-       connection->state = GB_CONNECTION_STATE_DESTROYING;
-       spin_unlock_irq(&connection->lock);
-
-       gb_connection_cancel_operations(connection, -ESHUTDOWN);
-       connection->protocol->connection_exit(connection);
 
        gb_connection_disable(connection);
 
+       connection->protocol->connection_exit(connection);
+
        gb_connection_unbind_protocol(connection);
 }
 EXPORT_SYMBOL_GPL(gb_connection_legacy_exit);
index ec0e46903819c4a29fb087bf30abfabadd11b12c..b774b9c56744eded8b5869ee4c67461ef428fa1e 100644 (file)
@@ -17,7 +17,6 @@ enum gb_connection_state {
        GB_CONNECTION_STATE_INVALID     = 0,
        GB_CONNECTION_STATE_DISABLED    = 1,
        GB_CONNECTION_STATE_ENABLED     = 2,
-       GB_CONNECTION_STATE_DESTROYING  = 3,
 };
 
 struct gb_operation;