Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 18690659 authored by Viresh Kumar's avatar Viresh Kumar Committed by Greg Kroah-Hartman
Browse files

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: default avatarViresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: default avatarGreg Kroah-Hartman <gregkh@google.com>
parent 0c32d2a5
Loading
Loading
Loading
Loading
+27 −17
Original line number Original line Diff line number Diff line
@@ -330,6 +330,27 @@ void gb_connection_destroy(struct gb_connection *connection)
	device_unregister(&connection->dev);
	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 gb_connection_init(struct gb_connection *connection)
{
{
	int cport_id = connection->intf_cport_id;
	int cport_id = connection->intf_cport_id;
@@ -366,15 +387,18 @@ int gb_connection_init(struct gb_connection *connection)
		spin_lock_irq(&connection->lock);
		spin_lock_irq(&connection->lock);
		connection->state = GB_CONNECTION_STATE_ERROR;
		connection->state = GB_CONNECTION_STATE_ERROR;
		spin_unlock_irq(&connection->lock);
		spin_unlock_irq(&connection->lock);
		goto disconnect;
	}
	}


	return 0;

disconnect:
	gb_connection_disconnected(connection);
	return ret;
	return ret;
}
}


void gb_connection_exit(struct gb_connection *connection)
void gb_connection_exit(struct gb_connection *connection)
{
{
	int cport_id = connection->intf_cport_id;

	if (!connection->protocol) {
	if (!connection->protocol) {
		dev_warn(&connection->dev, "exit without protocol.\n");
		dev_warn(&connection->dev, "exit without protocol.\n");
		return;
		return;
@@ -391,21 +415,7 @@ void gb_connection_exit(struct gb_connection *connection)
	gb_connection_cancel_operations(connection, -ESHUTDOWN);
	gb_connection_cancel_operations(connection, -ESHUTDOWN);


	connection->protocol->connection_exit(connection);
	connection->protocol->connection_exit(connection);

	gb_connection_disconnected(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);
	}
}
}


void gb_hd_connections_exit(struct greybus_host_device *hd)
void gb_hd_connections_exit(struct greybus_host_device *hd)