From 36173112354a4f5993d464f95b04d41e1eec10a0 Mon Sep 17 00:00:00 2001 From: Johan Hovold Date: Mon, 7 Dec 2015 15:05:33 +0100 Subject: greybus: connection: unbind protocol at exit Unbind protocol at connection exit rather than when the connection is destroyed. Now a protocol is only bound while a connection is enabled. Signed-off-by: Johan Hovold Reviewed-by: Viresh Kumar Signed-off-by: Greg Kroah-Hartman --- drivers/staging/greybus/connection.c | 26 ++++++++++++++------------ 1 file changed, 14 insertions(+), 12 deletions(-) (limited to 'drivers/staging/greybus/connection.c') diff --git a/drivers/staging/greybus/connection.c b/drivers/staging/greybus/connection.c index 38803604e603..980244a873b8 100644 --- a/drivers/staging/greybus/connection.c +++ b/drivers/staging/greybus/connection.c @@ -13,6 +13,7 @@ static int gb_connection_bind_protocol(struct gb_connection *connection); +static void gb_connection_unbind_protocol(struct gb_connection *connection); static int gb_connection_init(struct gb_connection *connection); @@ -405,7 +406,7 @@ static int gb_connection_init(struct gb_connection *connection) ret = gb_connection_hd_cport_enable(connection); if (ret) - return ret; + goto err_unbind_protocol; ret = gb_connection_svc_connection_create(connection); if (ret) @@ -440,15 +441,14 @@ err_svc_destroy: gb_connection_svc_connection_destroy(connection); err_hd_cport_disable: gb_connection_hd_cport_disable(connection); +err_unbind_protocol: + gb_connection_unbind_protocol(connection); return ret; } static void gb_connection_exit(struct gb_connection *connection) { - if (!connection->protocol) - return; - spin_lock_irq(&connection->lock); if (connection->state != GB_CONNECTION_STATE_ENABLED) { spin_unlock_irq(&connection->lock); @@ -463,6 +463,7 @@ static void gb_connection_exit(struct gb_connection *connection) gb_connection_control_disconnected(connection); gb_connection_svc_connection_destroy(connection); gb_connection_hd_cport_disable(connection); + gb_connection_unbind_protocol(connection); } /* @@ -482,10 +483,6 @@ void gb_connection_destroy(struct gb_connection *connection) list_del(&connection->hd_links); spin_unlock_irq(&gb_connections_lock); - if (connection->protocol) - gb_protocol_put(connection->protocol); - connection->protocol = NULL; - id_map = &connection->hd->cport_id_map; ida_simple_remove(id_map, connection->hd_cport_id); connection->hd_cport_id = CPORT_ID_BAD; @@ -532,10 +529,6 @@ static int gb_connection_bind_protocol(struct gb_connection *connection) { struct gb_protocol *protocol; - /* If we already have a protocol bound here, just return */ - if (connection->protocol) - return 0; - protocol = gb_protocol_get(connection->protocol_id, connection->major, connection->minor); @@ -550,3 +543,12 @@ static int gb_connection_bind_protocol(struct gb_connection *connection) return 0; } + +static void gb_connection_unbind_protocol(struct gb_connection *connection) +{ + struct gb_protocol *protocol = connection->protocol; + + gb_protocol_put(protocol); + + connection->protocol = NULL; +} -- cgit v1.2.3