]> git.ipfire.org Git - thirdparty/u-boot.git/blobdiff - net/fastboot_udp.c
fastboot: multiresponse support
[thirdparty/u-boot.git] / net / fastboot_udp.c
index d6907874787e3482e463066de170fe3d8c354712..6fee441ab3b6e6476911a210bf28edc64bdc55da 100644 (file)
@@ -42,16 +42,15 @@ static int fastboot_remote_port;
 static int fastboot_our_port;
 
 /**
- * fastboot_udp_send_info() - Send an INFO packet during long commands.
+ * fastboot_udp_send_response() - Send an response into UDP
  *
- * @msg: String describing the reason for waiting
+ * @response: Response to send
  */
-static void fastboot_udp_send_info(const char *msg)
+static void fastboot_udp_send_response(const char *response)
 {
        uchar *packet;
        uchar *packet_base;
        int len = 0;
-       char response[FASTBOOT_RESPONSE_LEN] = {0};
 
        struct fastboot_header response_header = {
                .id = FASTBOOT_FASTBOOT,
@@ -66,7 +65,6 @@ static void fastboot_udp_send_info(const char *msg)
        memcpy(packet, &response_header, sizeof(response_header));
        packet += sizeof(response_header);
        /* Write response */
-       fastboot_response("INFO", response, "%s", msg);
        memcpy(packet, response, strlen(response));
        packet += strlen(response);
 
@@ -91,6 +89,7 @@ static void fastboot_udp_send_info(const char *msg)
 static void fastboot_timed_send_info(const char *msg)
 {
        static ulong start;
+       char response[FASTBOOT_RESPONSE_LEN] = {0};
 
        /* Initialize timer */
        if (start == 0)
@@ -99,7 +98,8 @@ static void fastboot_timed_send_info(const char *msg)
        /* Send INFO packet to host every 30 seconds */
        if (time >= 30000) {
                start = get_timer(0);
-               fastboot_udp_send_info(msg);
+               fastboot_response("INFO", response, "%s", msg);
+               fastboot_udp_send_response(response);
        }
 }
 
@@ -180,6 +180,23 @@ static void fastboot_send(struct fastboot_header header, char *fastboot_data,
                } else {
                        cmd = fastboot_handle_command(command, response);
                        pending_command = false;
+
+                       if (!strncmp(FASTBOOT_MULTIRESPONSE_START, response, 4)) {
+                               while (1) {
+                                       /* Call handler to obtain next response */
+                                       fastboot_multiresponse(cmd, response);
+
+                                       /*
+                                        * Send more responses or break to send
+                                        * final OKAY/FAIL response
+                                        */
+                                       if (strncmp("OKAY", response, 4) &&
+                                           strncmp("FAIL", response, 4))
+                                               fastboot_udp_send_response(response);
+                                       else
+                                               break;
+                               }
+                       }
                }
                /*
                 * Sent some INFO packets, need to update sequence number in