Bind protocol at connection init.
This is an intermediate step in separating connection creation and
enabling.
Note that the protocol is currently still unbound when the connection is
destroyed.
Signed-off-by: Johan Hovold <johan@hovoldconsulting.com>
Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
static int gb_connection_bind_protocol(struct gb_connection *connection);
static int gb_connection_bind_protocol(struct gb_connection *connection);
+static int gb_connection_init(struct gb_connection *connection);
static DEFINE_SPINLOCK(gb_connections_lock);
static DEFINE_SPINLOCK(gb_connections_lock);
spin_unlock_irq(&gb_connections_lock);
spin_unlock_irq(&gb_connections_lock);
- retval = gb_connection_bind_protocol(connection);
+ retval = gb_connection_init(connection);
- dev_err(&hd->dev, "%s: failed to bind protocol: %d\n",
+ dev_err(&hd->dev, "%s: failed to initialize connection: %d\n",
connection->name, retval);
gb_connection_destroy(connection);
return NULL;
connection->name, retval);
gb_connection_destroy(connection);
return NULL;
static int gb_connection_init(struct gb_connection *connection)
{
static int gb_connection_init(struct gb_connection *connection)
{
- struct gb_protocol *protocol = connection->protocol;
+ ret = gb_connection_bind_protocol(connection);
+ if (ret)
+ return ret;
+
ret = gb_connection_hd_cport_enable(connection);
if (ret)
return ret;
ret = gb_connection_hd_cport_enable(connection);
if (ret)
return ret;
if (ret)
goto err_disconnect;
if (ret)
goto err_disconnect;
- ret = protocol->connection_init(connection);
+ ret = connection->protocol->connection_init(connection);
if (ret)
goto err_disconnect;
if (ret)
goto err_disconnect;
static int gb_connection_bind_protocol(struct gb_connection *connection)
{
struct gb_protocol *protocol;
static int gb_connection_bind_protocol(struct gb_connection *connection)
{
struct gb_protocol *protocol;
/* If we already have a protocol bound here, just return */
if (connection->protocol)
/* If we already have a protocol bound here, just return */
if (connection->protocol)
}
connection->protocol = protocol;
}
connection->protocol = protocol;
- ret = gb_connection_init(connection);
- if (ret) {
- gb_protocol_put(protocol);
- connection->protocol = NULL;
- return ret;
- }
-