net: share fastboot boot handle logic between transports
Introduce reboot, boot and continue commands support to
TCP fastboot by moving existing UDP logic into the common module.
Signed-off-by: Dmitrii Merkurev <dimorinny@google.com>
Cc: Ying-Chun Liu (PaulLiu) <paul.liu@linaro.org>
Cc: Simon Glass <sjg@chromium.org>
Сс: Joe Hershberger <joe.hershberger@ni.com>
Сс: Ramon Fried <rfried.dev@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
Reviewed-by: Ramon Fried <rfried.dev@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
diff --git a/drivers/fastboot/fb_common.c b/drivers/fastboot/fb_common.c
index dde3cda..621146b 100644
--- a/drivers/fastboot/fb_common.c
+++ b/drivers/fastboot/fb_common.c
@@ -15,6 +15,7 @@
#include <command.h>
#include <env.h>
#include <fastboot.h>
+#include <net.h>
/**
* fastboot_buf_addr - base address of the fastboot download buffer
@@ -156,6 +157,37 @@
}
/**
+ * fastboot_handle_boot() - Shared implementation of system reaction to
+ * fastboot commands
+ *
+ * Making desceisions about device boot state (stay in fastboot, reboot
+ * to bootloader, reboot to OS, etc).
+ */
+void fastboot_handle_boot(int command, bool success)
+{
+ if (!success)
+ return;
+
+ switch (command) {
+ case FASTBOOT_COMMAND_BOOT:
+ fastboot_boot();
+ net_set_state(NETLOOP_SUCCESS);
+ break;
+
+ case FASTBOOT_COMMAND_CONTINUE:
+ net_set_state(NETLOOP_SUCCESS);
+ break;
+
+ case FASTBOOT_COMMAND_REBOOT:
+ case FASTBOOT_COMMAND_REBOOT_BOOTLOADER:
+ case FASTBOOT_COMMAND_REBOOT_FASTBOOTD:
+ case FASTBOOT_COMMAND_REBOOT_RECOVERY:
+ do_reset(NULL, 0, 0, NULL);
+ break;
+ }
+}
+
+/**
* fastboot_set_progress_callback() - set progress callback
*
* @progress: Pointer to progress callback
diff --git a/include/fastboot.h b/include/fastboot.h
index 07f4c8f..296451f 100644
--- a/include/fastboot.h
+++ b/include/fastboot.h
@@ -124,6 +124,15 @@
void fastboot_boot(void);
/**
+ * fastboot_handle_boot() - Shared implementation of system reaction to
+ * fastboot commands
+ *
+ * Making desceisions about device boot state (stay in fastboot, reboot
+ * to bootloader, reboot to OS, etc).
+ */
+void fastboot_handle_boot(int command, bool success);
+
+/**
* fastboot_handle_command() - Handle fastboot command
*
* @cmd_string: Pointer to command string
diff --git a/net/fastboot_tcp.c b/net/fastboot_tcp.c
index b5613b6..2eb52ea 100644
--- a/net/fastboot_tcp.c
+++ b/net/fastboot_tcp.c
@@ -73,6 +73,7 @@
u32 tcp_seq_num, u32 tcp_ack_num,
u8 action, unsigned int len)
{
+ int fastboot_command_id;
u64 command_size;
u8 tcp_fin = action & TCP_FIN;
u8 tcp_push = action & TCP_PUSH;
@@ -115,8 +116,10 @@
break;
}
strlcpy(command, pkt, len + 1);
- fastboot_handle_command(command, response);
+ fastboot_command_id = fastboot_handle_command(command, response);
fastboot_tcp_send_message(response, strlen(response));
+ fastboot_handle_boot(fastboot_command_id,
+ strncmp("OKAY", response, 4) == 0);
}
break;
case FASTBOOT_DISCONNECTING:
diff --git a/net/fastboot_udp.c b/net/fastboot_udp.c
index 27e779d..d706928 100644
--- a/net/fastboot_udp.c
+++ b/net/fastboot_udp.c
@@ -40,8 +40,6 @@
/* The UDP port at our end */
static int fastboot_our_port;
-static void boot_downloaded_image(void);
-
/**
* fastboot_udp_send_info() - Send an INFO packet during long commands.
*
@@ -209,40 +207,13 @@
net_send_udp_packet(net_server_ethaddr, fastboot_remote_ip,
fastboot_remote_port, fastboot_our_port, len);
- /* Continue boot process after sending response */
- if (!strncmp("OKAY", response, 4)) {
- switch (cmd) {
- case FASTBOOT_COMMAND_BOOT:
- boot_downloaded_image();
- break;
-
- case FASTBOOT_COMMAND_CONTINUE:
- net_set_state(NETLOOP_SUCCESS);
- break;
-
- case FASTBOOT_COMMAND_REBOOT:
- case FASTBOOT_COMMAND_REBOOT_BOOTLOADER:
- case FASTBOOT_COMMAND_REBOOT_FASTBOOTD:
- case FASTBOOT_COMMAND_REBOOT_RECOVERY:
- do_reset(NULL, 0, 0, NULL);
- break;
- }
- }
+ fastboot_handle_boot(cmd, strncmp("OKAY", response, 4) == 0);
if (!strncmp("OKAY", response, 4) || !strncmp("FAIL", response, 4))
cmd = -1;
}
/**
- * boot_downloaded_image() - Boots into downloaded image.
- */
-static void boot_downloaded_image(void)
-{
- fastboot_boot();
- net_set_state(NETLOOP_SUCCESS);
-}
-
-/**
* fastboot_handler() - Incoming UDP packet handler.
*
* @packet: Pointer to incoming UDP packet