greybus: connection: request protocol version before initializing connection
authorViresh Kumar <viresh.kumar@linaro.org>
Tue, 11 Aug 2015 02:05:59 +0000 (07:35 +0530)
committerGreg Kroah-Hartman <gregkh@google.com>
Wed, 12 Aug 2015 00:53:43 +0000 (17:53 -0700)
This can (should) be done from a common place as its required for most
of the protocols. Do it.

Signed-off-by: Viresh Kumar <viresh.kumar@linaro.org>
Signed-off-by: Greg Kroah-Hartman <gregkh@google.com>
drivers/staging/greybus/connection.c

index 7a5840bb8473b05be1cb43844a69fa44333a2e05..b1f1df81be50512ebc7dea71530860c7c5ce32e6 100644 (file)
@@ -382,17 +382,34 @@ int gb_connection_init(struct gb_connection *connection)
        connection->state = GB_CONNECTION_STATE_ENABLED;
        spin_unlock_irq(&connection->lock);
 
-       ret = connection->protocol->connection_init(connection);
-       if (ret) {
-               spin_lock_irq(&connection->lock);
-               connection->state = GB_CONNECTION_STATE_ERROR;
-               spin_unlock_irq(&connection->lock);
-               goto disconnect;
+       /*
+        * Request protocol version supported by the module. We don't need to do
+        * this for SVC as that is initiated by the SVC.
+        */
+       if (connection->hd_cport_id != GB_SVC_CPORT_ID) {
+               struct gb_protocol_version_response response;
+
+               ret = gb_protocol_get_version(connection,
+                                             GB_REQUEST_TYPE_PROTOCOL_VERSION,
+                                             NULL, 0, &response,
+                                             connection->protocol->major);
+               if (ret) {
+                       dev_err(&connection->dev,
+                               "Failed to get version CPort-%d (%d)\n",
+                               cport_id, ret);
+                       goto disconnect;
+               }
        }
 
-       return 0;
+       ret = connection->protocol->connection_init(connection);
+       if (!ret)
+               return 0;
 
 disconnect:
+       spin_lock_irq(&connection->lock);
+       connection->state = GB_CONNECTION_STATE_ERROR;
+       spin_unlock_irq(&connection->lock);
+
        gb_connection_disconnected(connection);
        return ret;
 }