Merge branch '2020-06-15-misc-bugfixes'
[oweals/u-boot.git] / cmd / fastboot.c
index 557257aef8437bcb79d60824a62574645740b931..ad5c06491183a4ac30a5b4bc4a49bca8384651ec 100644 (file)
@@ -13,6 +13,8 @@
 #include <fastboot.h>
 #include <net.h>
 #include <usb.h>
+#include <watchdog.h>
+#include <linux/stringify.h>
 
 static int do_fastboot_udp(int argc, char *const argv[],
                           uintptr_t buf_addr, size_t buf_size)
@@ -38,17 +40,22 @@ static int do_fastboot_usb(int argc, char *const argv[],
 #if CONFIG_IS_ENABLED(USB_FUNCTION_FASTBOOT)
        int controller_index;
        char *usb_controller;
+       char *endp;
        int ret;
 
        if (argc < 2)
                return CMD_RET_USAGE;
 
        usb_controller = argv[1];
-       controller_index = simple_strtoul(usb_controller, NULL, 0);
+       controller_index = simple_strtoul(usb_controller, &endp, 0);
+       if (*endp != '\0') {
+               pr_err("Error: Wrong USB controller index format\n");
+               return CMD_RET_FAILURE;
+       }
 
-       ret = board_usb_init(controller_index, USB_INIT_DEVICE);
+       ret = usb_gadget_initialize(controller_index);
        if (ret) {
-               pr_err("USB init failed: %d", ret);
+               pr_err("USB init failed: %d\n", ret);
                return CMD_RET_FAILURE;
        }
 
@@ -69,6 +76,7 @@ static int do_fastboot_usb(int argc, char *const argv[],
                        break;
                if (ctrlc())
                        break;
+               WATCHDOG_RESET();
                usb_gadget_handle_interrupts(controller_index);
        }
 
@@ -77,7 +85,7 @@ static int do_fastboot_usb(int argc, char *const argv[],
 exit:
        g_dnl_unregister();
        g_dnl_clear_detach();
-       board_usb_cleanup(controller_index, USB_INIT_DEVICE);
+       usb_gadget_release(controller_index);
 
        return ret;
 #else
@@ -86,7 +94,8 @@ exit:
 #endif
 }
 
-static int do_fastboot(cmd_tbl_t *cmdtp, int flag, int argc, char *const argv[])
+static int do_fastboot(struct cmd_tbl *cmdtp, int flag, int argc,
+                      char *const argv[])
 {
        uintptr_t buf_addr = (uintptr_t)NULL;
        size_t buf_size = 0;
@@ -120,6 +129,12 @@ NXTARG:
                ;
        }
 
+       /* Handle case when USB controller param is just '-' */
+       if (argc == 1) {
+               pr_err("Error: Incorrect USB controller index\n");
+               return CMD_RET_USAGE;
+       }
+
        fastboot_init((void *)buf_addr, buf_size);
 
        if (!strcmp(argv[1], "udp"))