greybus: connection: add per-connection request handlers
authorJohan Hovold <johan@hovoldconsulting.com>
Tue, 19 Jan 2016 11:51:02 +0000 (12:51 +0100)
committerGreg Kroah-Hartman <gregkh@google.com>
Tue, 19 Jan 2016 20:12:40 +0000 (12:12 -0800)
Add a connection request-handler field to struct gb_connection that is
set when the connection is enabled.

This is a step towards removing the legacy protocol abstraction from
core, and will also be used to implement unidirectional connection
states (e.g. only outgoing operations are allowed).

Reviewed-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Johan Hovold <johan@hovoldconsulting.com>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/connection.c
drivers/staging/greybus/connection.h
drivers/staging/greybus/operation.c

index 29a8193..3d7a9ca 100644 (file)
@@ -387,7 +387,8 @@ static int gb_connection_protocol_get_version(struct gb_connection *connection)
        return 0;
 }
 
-int gb_connection_enable(struct gb_connection *connection)
+int gb_connection_enable(struct gb_connection *connection,
+                               gb_request_handler_t handler)
 {
        int ret;
 
@@ -400,6 +401,7 @@ int gb_connection_enable(struct gb_connection *connection)
                goto err_hd_cport_disable;
 
        spin_lock_irq(&connection->lock);
+       connection->handler = handler;
        connection->state = GB_CONNECTION_STATE_ENABLED;
        spin_unlock_irq(&connection->lock);
 
@@ -435,15 +437,28 @@ void gb_connection_disable(struct gb_connection *connection)
 }
 EXPORT_SYMBOL_GPL(gb_connection_disable);
 
+static int gb_legacy_request_handler(struct gb_operation *operation)
+{
+       struct gb_protocol *protocol = operation->connection->protocol;
+
+       return protocol->request_recv(operation->type, operation);
+}
+
 int gb_connection_legacy_init(struct gb_connection *connection)
 {
+       gb_request_handler_t handler;
        int ret;
 
        ret = gb_connection_bind_protocol(connection);
        if (ret)
                return ret;
 
-       ret = gb_connection_enable(connection);
+       if (connection->protocol->request_recv)
+               handler = gb_legacy_request_handler;
+       else
+               handler = NULL;
+
+       ret = gb_connection_enable(connection, handler);
        if (ret)
                goto err_unbind_protocol;
 
index b0a67f2..ec0e469 100644 (file)
@@ -20,6 +20,10 @@ enum gb_connection_state {
        GB_CONNECTION_STATE_DESTROYING  = 3,
 };
 
+struct gb_operation;
+
+typedef int (*gb_request_handler_t)(struct gb_operation *);
+
 struct gb_connection {
        struct gb_host_device           *hd;
        struct gb_interface             *intf;
@@ -31,6 +35,8 @@ struct gb_connection {
        struct list_head                hd_links;
        struct list_head                bundle_links;
 
+       gb_request_handler_t            handler;
+
        struct gb_protocol              *protocol;
        u8                              protocol_id;
        u8                              major;
@@ -62,7 +68,8 @@ static inline bool gb_connection_is_static(struct gb_connection *connection)
        return !connection->intf;
 }
 
-int gb_connection_enable(struct gb_connection *connection);
+int gb_connection_enable(struct gb_connection *connection,
+                                       gb_request_handler_t handler);
 void gb_connection_disable(struct gb_connection *connection);
 
 int gb_connection_legacy_init(struct gb_connection *connection);
index ae3ada0..4dc79cb 100644 (file)
@@ -218,15 +218,11 @@ static void gb_message_cancel(struct gb_message *message)
 static void gb_operation_request_handle(struct gb_operation *operation)
 {
        struct gb_connection *connection = operation->connection;
-       struct gb_protocol *protocol = connection->protocol;
        int status;
        int ret;
 
-       if (!protocol)
-               return;
-
-       if (protocol->request_recv) {
-               status = protocol->request_recv(operation->type, operation);
+       if (connection->handler) {
+               status = connection->handler(operation);
        } else {
                dev_err(&connection->hd->dev,
                        "%s: unexpected incoming request of type 0x%02x\n",