Commit 50bb9cca authored by Fabien Parent's avatar Fabien Parent Committed by Johan Hovold

greybus: connection: fail to bind if connection init fails

gb_connection_init() can fail and will return proper error code in that
case, but the caller is ignoring it currently.

Fix that by properly handling errors returned from gb_connection_init()
and propagating them to callers of gb_connection_bind_protocol().
Signed-off-by: default avatarFabien Parent <fparent@baylibre.com>
Signed-off-by: default avatarViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: default avatarJohan Hovold <johan@hovoldconsulting.com>
parent fda2381b
...@@ -451,19 +451,20 @@ void gb_hd_connections_exit(struct greybus_host_device *hd) ...@@ -451,19 +451,20 @@ void gb_hd_connections_exit(struct greybus_host_device *hd)
gb_connection_destroy(connection); gb_connection_destroy(connection);
} }
void gb_connection_bind_protocol(struct gb_connection *connection) int gb_connection_bind_protocol(struct gb_connection *connection)
{ {
struct gb_protocol *protocol; struct gb_protocol *protocol;
int ret;
/* If we already have a protocol bound here, just return */ /* If we already have a protocol bound here, just return */
if (connection->protocol) if (connection->protocol)
return; return 0;
protocol = gb_protocol_get(connection->protocol_id, protocol = gb_protocol_get(connection->protocol_id,
connection->major, connection->major,
connection->minor); connection->minor);
if (!protocol) if (!protocol)
return; return 0;
connection->protocol = protocol; connection->protocol = protocol;
/* /*
...@@ -472,6 +473,14 @@ void gb_connection_bind_protocol(struct gb_connection *connection) ...@@ -472,6 +473,14 @@ void gb_connection_bind_protocol(struct gb_connection *connection)
*/ */
if ((!connection->bundle && if ((!connection->bundle &&
connection->hd_cport_id == GB_SVC_CPORT_ID) || connection->hd_cport_id == GB_SVC_CPORT_ID) ||
connection->bundle->intf->device_id != GB_DEVICE_ID_BAD) connection->bundle->intf->device_id != GB_DEVICE_ID_BAD) {
gb_connection_init(connection); ret = gb_connection_init(connection);
if (ret) {
gb_protocol_put(protocol);
connection->protocol = NULL;
return ret;
}
}
return 0;
} }
...@@ -68,6 +68,6 @@ void gb_connection_push_timestamp(struct gb_connection *connection); ...@@ -68,6 +68,6 @@ void gb_connection_push_timestamp(struct gb_connection *connection);
int gb_connection_pop_timestamp(struct gb_connection *connection, int gb_connection_pop_timestamp(struct gb_connection *connection,
struct timeval *tv); struct timeval *tv);
void gb_connection_bind_protocol(struct gb_connection *connection); int gb_connection_bind_protocol(struct gb_connection *connection);
#endif /* __CONNECTION_H */ #endif /* __CONNECTION_H */
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment