diff --git a/drivers/staging/greybus/connection.c b/drivers/staging/greybus/connection.c index d1508e21b378..1d7c21e03bfa 100644 --- a/drivers/staging/greybus/connection.c +++ b/drivers/staging/greybus/connection.c @@ -73,7 +73,7 @@ static void gb_connection_kref_release(struct kref *kref) struct gb_connection *connection; connection = container_of(kref, struct gb_connection, kref); - destroy_workqueue(connection->wq); + kfree(connection); mutex_unlock(&connection_mutex); } @@ -500,9 +500,7 @@ void gb_connection_disable(struct gb_connection *connection) } EXPORT_SYMBOL_GPL(gb_connection_disable); -/* - * Tear down a previously set up connection. - */ +/* Caller must have disabled the connection before destroying it. */ void gb_connection_destroy(struct gb_connection *connection) { struct ida *id_map; @@ -515,6 +513,8 @@ void gb_connection_destroy(struct gb_connection *connection) list_del(&connection->hd_links); spin_unlock_irq(&gb_connections_lock); + destroy_workqueue(connection->wq); + id_map = &connection->hd->cport_id_map; ida_simple_remove(id_map, connection->hd_cport_id); connection->hd_cport_id = CPORT_ID_BAD;