From: Viresh Kumar Date: Wed, 1 Jul 2015 06:43:56 +0000 (+0530) Subject: greybus: connection: intf_cport_id is local to an interface X-Git-Url: https://git.stricted.de/?a=commitdiff_plain;h=c3a1617099cb57da038297cfc40abedb1fe7a287;p=GitHub%2FLineageOS%2Fandroid_kernel_motorola_exynos9610.git 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 --- diff --git a/drivers/staging/greybus/connection.c b/drivers/staging/greybus/connection.c index 6cd9fe2df034..85b2a3370744 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; }