fastboot: Move fastboot response functions to fastboot core
authorMaxime Ripard <maxime.ripard@free-electrons.com>
Thu, 15 Oct 2015 12:34:13 +0000 (14:34 +0200)
committerTom Rini <trini@konsulko.com>
Thu, 12 Nov 2015 18:17:31 +0000 (13:17 -0500)
The functions and a few define to generate a fastboot message to be sent
back to the host were so far duplicated among the users.

Move them all to a common place.

Signed-off-by: Maxime Ripard <maxime.ripard@free-electrons.com>
Reviewed-by: Tom Rini <trini@konsulko.com>
common/aboot.c
common/fb_mmc.c
drivers/usb/gadget/f_fastboot.c
include/aboot.h
include/fastboot.h [new file with mode: 0644]

index 2775254c742e1dbf4fb16d55815dcabcc85afd2f..5f5fb6b62bfa3fa23a19055c0ae2af46fe0ddf07 100644 (file)
@@ -257,9 +257,9 @@ static void sparse_put_data_buffer(sparse_buffer_t *buffer)
        free(buffer);
 }
 
-void write_sparse_image(block_dev_desc_t *dev_desc,
-               disk_partition_t *info, const char *part_name,
-               void *data, unsigned sz)
+int write_sparse_image(block_dev_desc_t *dev_desc,
+                      disk_partition_t *info, const char *part_name,
+                      void *data, unsigned sz)
 {
        lbaint_t start;
        lbaint_t blkcnt;
@@ -273,8 +273,8 @@ void write_sparse_image(block_dev_desc_t *dev_desc,
 
        sparse_header = sparse_parse_header(&data);
        if (!sparse_header) {
-               fastboot_fail("sparse header issue\n");
-               return;
+               printf("sparse header issue\n");
+               return -EINVAL;
        }
 
        /*
@@ -285,8 +285,7 @@ void write_sparse_image(block_dev_desc_t *dev_desc,
        if (offset) {
                printf("%s: Sparse image block size issue [%u]\n",
                       __func__, sparse_header->blk_sz);
-               fastboot_fail("sparse image block size issue");
-               return;
+               return -EINVAL;
        }
 
        puts("Flashing Sparse Image\n");
@@ -296,8 +295,8 @@ void write_sparse_image(block_dev_desc_t *dev_desc,
        for (chunk = 0; chunk < sparse_header->total_chunks; chunk++) {
                chunk_header = sparse_parse_chunk(sparse_header, &data);
                if (!chunk_header) {
-                       fastboot_fail("Unknown chunk type");
-                       return;
+                       printf("Unknown chunk type");
+                       return -EINVAL;
                }
 
                /*
@@ -321,8 +320,7 @@ void write_sparse_image(block_dev_desc_t *dev_desc,
                    (info->start + info->size)) {
                        printf("%s: Request would exceed partition size!\n",
                               __func__);
-                       fastboot_fail("Request would exceed partition size!");
-                       return;
+                       return -EINVAL;
                }
 
                for (i = 0; i < buffer->repeat; i++) {
@@ -337,8 +335,7 @@ void write_sparse_image(block_dev_desc_t *dev_desc,
                        if (buffer_blks != buffer_blk_cnt) {
                                printf("%s: Write %d failed " LBAFU "\n",
                                       __func__, i, buffer_blks);
-                               fastboot_fail("flash write failure");
-                               return;
+                               return -EIO;
                        }
 
                        total_blocks += buffer_blk_cnt;
@@ -351,9 +348,10 @@ void write_sparse_image(block_dev_desc_t *dev_desc,
              total_blocks, skipped, sparse_header->total_blks);
        printf("........ wrote %d blocks to '%s'\n", total_blocks, part_name);
 
-       if (total_blocks != sparse_header->total_blks)
-               fastboot_fail("sparse image write failure");
+       if (total_blocks != sparse_header->total_blks) {
+               printf("sparse image write failure\n");
+               return -EIO;
+       }
 
-       fastboot_okay("");
-       return;
+       return 0;
 }
index 0c48cf929f8fd568d4d06095ede231ab81a97a6a..b31a9fb929c53d40ff354e598d7658caacf42ddb 100644 (file)
@@ -6,6 +6,7 @@
 
 #include <config.h>
 #include <common.h>
+#include <fastboot.h>
 #include <fb_mmc.h>
 #include <part.h>
 #include <aboot.h>
 #define CONFIG_FASTBOOT_GPT_NAME GPT_ENTRY_NAME
 #endif
 
-/* The 64 defined bytes plus the '\0' */
-#define RESPONSE_LEN   (64 + 1)
-
 static char *response_str;
 
-void fastboot_fail(const char *s)
-{
-       strncpy(response_str, "FAIL\0", 5);
-       strncat(response_str, s, RESPONSE_LEN - 4 - 1);
-}
-
-void fastboot_okay(const char *s)
-{
-       strncpy(response_str, "OKAY\0", 5);
-       strncat(response_str, s, RESPONSE_LEN - 4 - 1);
-}
-
 static int get_partition_info_efi_by_name_or_alias(block_dev_desc_t *dev_desc,
                const char *name, disk_partition_t *info)
 {
@@ -68,7 +54,7 @@ static void write_raw_image(block_dev_desc_t *dev_desc, disk_partition_t *info,
 
        if (blkcnt > info->size) {
                error("too large for partition: '%s'\n", part_name);
-               fastboot_fail("too large for partition");
+               fastboot_fail(response_str, "too large for partition");
                return;
        }
 
@@ -78,13 +64,13 @@ static void write_raw_image(block_dev_desc_t *dev_desc, disk_partition_t *info,
                                     buffer);
        if (blks != blkcnt) {
                error("failed writing to device %d\n", dev_desc->dev);
-               fastboot_fail("failed writing to device");
+               fastboot_fail(response_str, "failed writing to device");
                return;
        }
 
        printf("........ wrote " LBAFU " bytes to '%s'\n", blkcnt * info->blksz,
               part_name);
-       fastboot_okay("");
+       fastboot_okay(response_str, "");
 }
 
 void fb_mmc_flash_write(const char *cmd, void *download_buffer,
@@ -99,7 +85,7 @@ void fb_mmc_flash_write(const char *cmd, void *download_buffer,
        dev_desc = get_dev("mmc", CONFIG_FASTBOOT_FLASH_MMC_DEV);
        if (!dev_desc || dev_desc->type == DEV_TYPE_UNKNOWN) {
                error("invalid mmc device\n");
-               fastboot_fail("invalid mmc device");
+               fastboot_fail(response_str, "invalid mmc device");
                return;
        }
 
@@ -109,20 +95,21 @@ void fb_mmc_flash_write(const char *cmd, void *download_buffer,
                if (is_valid_gpt_buf(dev_desc, download_buffer)) {
                        printf("%s: invalid GPT - refusing to write to flash\n",
                               __func__);
-                       fastboot_fail("invalid GPT partition");
+                       fastboot_fail(response_str, "invalid GPT partition");
                        return;
                }
                if (write_mbr_and_gpt_partitions(dev_desc, download_buffer)) {
                        printf("%s: writing GPT partitions failed\n", __func__);
-                       fastboot_fail("writing GPT partitions failed");
+                       fastboot_fail(response_str,
+                                     "writing GPT partitions failed");
                        return;
                }
                printf("........ success\n");
-               fastboot_okay("");
+               fastboot_okay(response_str, "");
                return;
        } else if (get_partition_info_efi_by_name_or_alias(dev_desc, cmd, &info)) {
                error("cannot find partition: '%s'\n", cmd);
-               fastboot_fail("cannot find partition");
+               fastboot_fail(response_str, "cannot find partition");
                return;
        }
 
@@ -132,6 +119,8 @@ void fb_mmc_flash_write(const char *cmd, void *download_buffer,
        else
                write_raw_image(dev_desc, &info, cmd, download_buffer,
                                download_bytes);
+
+       fastboot_okay(response_str, "");
 }
 
 void fb_mmc_erase(const char *cmd, char *response)
@@ -144,7 +133,7 @@ void fb_mmc_erase(const char *cmd, char *response)
 
        if (mmc == NULL) {
                error("invalid mmc device");
-               fastboot_fail("invalid mmc device");
+               fastboot_fail(response_str, "invalid mmc device");
                return;
        }
 
@@ -154,14 +143,14 @@ void fb_mmc_erase(const char *cmd, char *response)
        dev_desc = get_dev("mmc", CONFIG_FASTBOOT_FLASH_MMC_DEV);
        if (!dev_desc || dev_desc->type == DEV_TYPE_UNKNOWN) {
                error("invalid mmc device");
-               fastboot_fail("invalid mmc device");
+               fastboot_fail(response_str, "invalid mmc device");
                return;
        }
 
        ret = get_partition_info_efi_by_name_or_alias(dev_desc, cmd, &info);
        if (ret) {
                error("cannot find partition: '%s'", cmd);
-               fastboot_fail("cannot find partition");
+               fastboot_fail(response_str, "cannot find partition");
                return;
        }
 
@@ -180,11 +169,11 @@ void fb_mmc_erase(const char *cmd, char *response)
        blks = dev_desc->block_erase(dev_desc->dev, blks_start, blks_size);
        if (blks != blks_size) {
                error("failed erasing from device %d", dev_desc->dev);
-               fastboot_fail("failed erasing from device");
+               fastboot_fail(response_str, "failed erasing from device");
                return;
        }
 
        printf("........ erased " LBAFU " bytes from '%s'\n",
               blks_size * info.blksz, cmd);
-       fastboot_okay("");
+       fastboot_okay(response_str, "");
 }
index ece48e668c966081fefe1b03716f30efe7d8dd62..05fb77302b3e10b04aa06082747f32d44708369f 100644 (file)
@@ -13,6 +13,7 @@
 #include <config.h>
 #include <common.h>
 #include <errno.h>
+#include <fastboot.h>
 #include <malloc.h>
 #include <linux/usb/ch9.h>
 #include <linux/usb/gadget.h>
@@ -34,9 +35,6 @@
 #define RX_ENDPOINT_MAXIMUM_PACKET_SIZE_1_1  (0x0040)
 #define TX_ENDPOINT_MAXIMUM_PACKET_SIZE      (0x0040)
 
-/* The 64 defined bytes plus \0 */
-#define RESPONSE_LEN   (64 + 1)
-
 #define EP_BUFFER_SIZE                 4096
 
 struct f_fastboot {
@@ -125,6 +123,19 @@ static struct usb_gadget_strings *fastboot_strings[] = {
 static void rx_handler_command(struct usb_ep *ep, struct usb_request *req);
 static int strcmp_l1(const char *s1, const char *s2);
 
+
+void fastboot_fail(char *response, const char *reason)
+{
+       strncpy(response, "FAIL\0", 5);
+       strncat(response, reason, FASTBOOT_RESPONSE_LEN - 4 - 1);
+}
+
+void fastboot_okay(char *response, const char *reason)
+{
+       strncpy(response, "OKAY\0", 5);
+       strncat(response, reason, FASTBOOT_RESPONSE_LEN - 4 - 1);
+}
+
 static void fastboot_complete(struct usb_ep *ep, struct usb_request *req)
 {
        int status = req->status;
@@ -358,7 +369,7 @@ static int strcmp_l1(const char *s1, const char *s2)
 static void cb_getvar(struct usb_ep *ep, struct usb_request *req)
 {
        char *cmd = req->buf;
-       char response[RESPONSE_LEN];
+       char response[FASTBOOT_RESPONSE_LEN];
        const char *s;
        size_t chars_left;
 
@@ -415,7 +426,7 @@ static unsigned int rx_bytes_expected(unsigned int maxpacket)
 #define BYTES_PER_DOT  0x20000
 static void rx_handler_dl_image(struct usb_ep *ep, struct usb_request *req)
 {
-       char response[RESPONSE_LEN];
+       char response[FASTBOOT_RESPONSE_LEN];
        unsigned int transfer_size = download_size - download_bytes;
        const unsigned char *buffer = req->buf;
        unsigned int buffer_size = req->actual;
@@ -472,7 +483,7 @@ static void rx_handler_dl_image(struct usb_ep *ep, struct usb_request *req)
 static void cb_download(struct usb_ep *ep, struct usb_request *req)
 {
        char *cmd = req->buf;
-       char response[RESPONSE_LEN];
+       char response[FASTBOOT_RESPONSE_LEN];
        unsigned int max;
 
        strsep(&cmd, ":");
@@ -533,7 +544,7 @@ static void cb_continue(struct usb_ep *ep, struct usb_request *req)
 static void cb_flash(struct usb_ep *ep, struct usb_request *req)
 {
        char *cmd = req->buf;
-       char response[RESPONSE_LEN];
+       char response[FASTBOOT_RESPONSE_LEN];
 
        strsep(&cmd, ":");
        if (!cmd) {
@@ -577,7 +588,7 @@ static void cb_oem(struct usb_ep *ep, struct usb_request *req)
 static void cb_erase(struct usb_ep *ep, struct usb_request *req)
 {
        char *cmd = req->buf;
-       char response[RESPONSE_LEN];
+       char response[FASTBOOT_RESPONSE_LEN];
 
        strsep(&cmd, ":");
        if (!cmd) {
index 30e4d36df8baf1e5b545bde99bbd8d85ae67c5e7..18ff07a5dc233a4ef2e8224d61b1ec8aed30e0f3 100644 (file)
@@ -9,9 +9,6 @@
 
 #define ROUNDUP(x, y)  (((x) + ((y) - 1)) & ~((y) - 1))
 
-void fastboot_fail(const char *s);
-void fastboot_okay(const char *s);
-
 static inline int is_sparse_image(void *buf)
 {
        sparse_header_t *s_header = (sparse_header_t *)buf;
@@ -23,6 +20,6 @@ static inline int is_sparse_image(void *buf)
        return 0;
 }
 
-void write_sparse_image(block_dev_desc_t *dev_desc,
-               disk_partition_t *info, const char *part_name,
-               void *data, unsigned sz);
+int write_sparse_image(block_dev_desc_t *dev_desc,
+                      disk_partition_t *info, const char *part_name,
+                      void *data, unsigned sz);
diff --git a/include/fastboot.h b/include/fastboot.h
new file mode 100644 (file)
index 0000000..db826d2
--- /dev/null
@@ -0,0 +1,22 @@
+/*
+ * (C) Copyright 2008 - 2009
+ * Windriver, <www.windriver.com>
+ * Tom Rix <Tom.Rix@windriver.com>
+ *
+ * Copyright 2011 Sebastian Andrzej Siewior <bigeasy@linutronix.de>
+ *
+ * Copyright 2014 Linaro, Ltd.
+ * Rob Herring <robh@kernel.org>
+ *
+ * SPDX-License-Identifier:    GPL-2.0+
+ */
+#ifndef _FASTBOOT_H_
+#define _FASTBOOT_H_
+
+/* The 64 defined bytes plus \0 */
+#define FASTBOOT_RESPONSE_LEN  (64 + 1)
+
+void fastboot_fail(char *response, const char *reason);
+void fastboot_okay(char *response, const char *reason);
+
+#endif /* _FASTBOOT_H_ */