mirror of https://gitee.com/openkylin/linux.git
greybus: connection: disconnect connection on failures during initialization
Its possible for connection_init() to fail, in such cases the disconnected event must be sent to the module. It is missing currently, fix it. Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org> Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
This commit is contained in:
parent
0c32d2a5b2
commit
1869065902
|
@ -330,6 +330,27 @@ void gb_connection_destroy(struct gb_connection *connection)
|
|||
device_unregister(&connection->dev);
|
||||
}
|
||||
|
||||
static void gb_connection_disconnected(struct gb_connection *connection)
|
||||
{
|
||||
struct gb_control *control;
|
||||
int cport_id = connection->intf_cport_id;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* Inform Interface about In-active CPorts. We don't need to do this
|
||||
* operation for control cport.
|
||||
*/
|
||||
if (cport_id == GB_CONTROL_CPORT_ID)
|
||||
return;
|
||||
|
||||
control = connection->bundle->intf->control;
|
||||
|
||||
ret = gb_control_disconnected_operation(control, cport_id);
|
||||
if (ret)
|
||||
dev_warn(&connection->dev,
|
||||
"Failed to disconnect CPort-%d (%d)\n", cport_id, ret);
|
||||
}
|
||||
|
||||
int gb_connection_init(struct gb_connection *connection)
|
||||
{
|
||||
int cport_id = connection->intf_cport_id;
|
||||
|
@ -366,15 +387,18 @@ int gb_connection_init(struct gb_connection *connection)
|
|||
spin_lock_irq(&connection->lock);
|
||||
connection->state = GB_CONNECTION_STATE_ERROR;
|
||||
spin_unlock_irq(&connection->lock);
|
||||
goto disconnect;
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
disconnect:
|
||||
gb_connection_disconnected(connection);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void gb_connection_exit(struct gb_connection *connection)
|
||||
{
|
||||
int cport_id = connection->intf_cport_id;
|
||||
|
||||
if (!connection->protocol) {
|
||||
dev_warn(&connection->dev, "exit without protocol.\n");
|
||||
return;
|
||||
|
@ -391,21 +415,7 @@ void gb_connection_exit(struct gb_connection *connection)
|
|||
gb_connection_cancel_operations(connection, -ESHUTDOWN);
|
||||
|
||||
connection->protocol->connection_exit(connection);
|
||||
|
||||
/*
|
||||
* Inform Interface about In-active CPorts. We don't need to do this
|
||||
* operation for control cport.
|
||||
*/
|
||||
if (cport_id != GB_CONTROL_CPORT_ID) {
|
||||
struct gb_control *control = connection->bundle->intf->control;
|
||||
int ret;
|
||||
|
||||
ret = gb_control_disconnected_operation(control, cport_id);
|
||||
if (ret)
|
||||
dev_warn(&connection->dev,
|
||||
"Failed to disconnect CPort-%d (%d)\n",
|
||||
cport_id, ret);
|
||||
}
|
||||
gb_connection_disconnected(connection);
|
||||
}
|
||||
|
||||
void gb_hd_connections_exit(struct greybus_host_device *hd)
|
||||
|
|
Loading…
Reference in New Issue