From c3a1617099cb57da038297cfc40abedb1fe7a287 Mon Sep 17 00:00:00 2001 From: Viresh Kumar Date: Wed, 1 Jul 2015 12:13:56 +0530 Subject: [PATCH] greybus: connection: intf_cport_id is local to an interface intf_cport_id is local to an interface and same intf_cport_id can be used for two separate interface blocks. For finding a connection for an interface, we are matching intf_cport_id of the connection with cport_id, passed as argument. This is wrong, as it can match for a connection on a different interface block. Fix it by also comparing interface block for which connection is requested. Signed-off-by: Viresh Kumar Reviewed-by: Alex Elder Signed-off-by: Greg Kroah-Hartman --- drivers/staging/greybus/connection.c | 8 +++++--- 1 file changed, 5 insertions(+), 3 deletions(-) diff --git a/drivers/staging/greybus/connection.c b/drivers/staging/greybus/connection.c index 6cd9fe2..85b2a33 100644 --- a/drivers/staging/greybus/connection.c +++ b/drivers/staging/greybus/connection.c @@ -13,12 +13,14 @@ static DEFINE_SPINLOCK(gb_connections_lock); /* This is only used at initialization time; no locking is required. */ static struct gb_connection * -gb_connection_intf_find(struct greybus_host_device *hd, u16 cport_id) +gb_connection_intf_find(struct gb_interface *intf, u16 cport_id) { + struct greybus_host_device *hd = intf->hd; struct gb_connection *connection; list_for_each_entry(connection, &hd->connections, hd_links) - if (connection->intf_cport_id == cport_id) + if (connection->bundle->intf == intf && + connection->intf_cport_id == cport_id) return connection; return NULL; } @@ -149,7 +151,7 @@ struct gb_connection *gb_connection_create(struct gb_bundle *bundle, * initialize connections serially so we don't need to worry * about holding the connection lock. */ - if (gb_connection_intf_find(hd, cport_id)) { + if (gb_connection_intf_find(bundle->intf, cport_id)) { pr_err("duplicate interface cport id 0x%04hx\n", cport_id); return NULL; } -- 2.7.4