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);
}
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);
GB_CONNECTION_STATE_INVALID = 0,
GB_CONNECTION_STATE_DISABLED = 1,
GB_CONNECTION_STATE_ENABLED = 2,
- GB_CONNECTION_STATE_DESTROYING = 3,
};
struct gb_operation;