greybus: firmware: Send AP-ready operation
authorViresh Kumar <viresh.kumar@linaro.org>
Wed, 9 Sep 2015 15:38:33 +0000 (21:08 +0530)
committerGreg Kroah-Hartman <gregkh@google.com>
Tue, 15 Sep 2015 04:52:16 +0000 (21:52 -0700)
Module's Bootrom needs a way to know (currently), when to start sending
requests to the AP. The version request is sent before connection_init()
routine is called, and if the module sends the request right after
receiving version request, the connection->private field will be NULL.

Fix this TEMPORARILY by sending an AP_READY request.

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

index fdd5e0c..5642bc3 100644 (file)
@@ -165,6 +165,7 @@ static int gb_firmware_request_recv(u8 type, struct gb_operation *op)
 static int gb_firmware_connection_init(struct gb_connection *connection)
 {
        struct gb_firmware *firmware;
+       int ret;
 
        firmware = kzalloc(sizeof(*firmware), GFP_KERNEL);
        if (!firmware)
@@ -173,6 +174,20 @@ static int gb_firmware_connection_init(struct gb_connection *connection)
        firmware->connection = connection;
        connection->private = firmware;
 
+       /*
+        * Module's Bootrom needs a way to know (currently), when to start
+        * sending requests to the AP. The version request is sent before this
+        * routine is called, and if the module sends the request right after
+        * receiving version request, the connection->private field will be
+        * NULL.
+        *
+        * Fix this TEMPORARILY by sending an AP_READY request.
+        */
+       ret = gb_operation_sync(connection, GB_FIRMWARE_TYPE_AP_READY, NULL, 0,
+                               NULL, 0);
+       if (ret)
+               dev_err(&connection->dev, "Failed to send AP READY (%d)\n", ret);
+
        return 0;
 }
 
index 6fd20bd..d77e039 100644 (file)
@@ -155,6 +155,7 @@ struct gb_control_disconnected_request {
 #define GB_FIRMWARE_TYPE_FIRMWARE_SIZE         0x02
 #define GB_FIRMWARE_TYPE_GET_FIRMWARE          0x03
 #define GB_FIRMWARE_TYPE_READY_TO_BOOT         0x04
+#define GB_FIRMWARE_TYPE_AP_READY              0x05    /* Request with no-payload */
 
 /* Greybus firmware boot stages */
 #define GB_FIRMWARE_BOOT_STAGE_ONE             0x01 /* Reserved for the boot ROM */