]> git.dujemihanovic.xyz Git - u-boot.git/commitdiff
net: share fastboot boot handle logic between transports
authorDmitrii Merkurev <dimorinny@google.com>
Wed, 12 Apr 2023 18:49:31 +0000 (19:49 +0100)
committerTom Rini <trini@konsulko.com>
Fri, 5 May 2023 21:48:44 +0000 (17:48 -0400)
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>
drivers/fastboot/fb_common.c
include/fastboot.h
net/fastboot_tcp.c
net/fastboot_udp.c

index dde3cda78f6e625d8a7e0942b3552ed6755c3f14..621146bc6b0800fec48567454e1b912f194d8cb9 100644 (file)
@@ -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
@@ -155,6 +156,37 @@ 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)
+{
+       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
  *
index 07f4c8fa711ca1aa4fe55f521ec5a57546ab2329..296451f89d44dc25ac8ecdb8a3446681f93e14f0 100644 (file)
@@ -123,6 +123,15 @@ void fastboot_init(void *buf_addr, u32 buf_size);
  */
 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
  *
index b5613b6aa20006259279cc9bcff80011483a2bf0..2eb52ea256796d217854afed3aab6a4ba62801bc 100644 (file)
@@ -73,6 +73,7 @@ static void fastboot_tcp_handler_ipv4(uchar *pkt, u16 dport,
                                      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 @@ static void fastboot_tcp_handler_ipv4(uchar *pkt, u16 dport,
                                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:
index 27e779d8e09143095aa68dfd35f0a0a861cb4a12..d706928d1687e1202063950829e26b792d89a11c 100644 (file)
@@ -40,8 +40,6 @@ static int fastboot_remote_port;
 /* 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,39 +207,12 @@ static void fastboot_send(struct fastboot_header header, char *fastboot_data,
        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.
  *