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 <viresh.kumar@linaro.org>
Reviewed-by: Alex Elder <elder@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
Viresh Kumar 2015-07-01 12:13:56 +05:30 committed by Greg Kroah-Hartman
parent b758d68618
commit c3a1617099
1 changed files with 5 additions and 3 deletions

View File

@ -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;
}