This is an automated email from Gerrit.

"Tarek BOCHKATI <[email protected]>" just uploaded a new patch set to 
Gerrit, which you can find at https://review.openocd.org/c/openocd/+/6671

-- gerrit

commit 586e2e1faa9a74d88e7ec83744057138c97a1c53
Author: Tarek BOCHKATI <[email protected]>
Date:   Wed Nov 3 16:22:22 2021 +0100

    stlink (tcp): manage scattered stlink-server responses
    
    detected in ubuntu 20.04
    sometimes, the stlink-server response could be segmented on multiple
    packets.
    
    this causes stlink_tcp_send_cmd to fail with the following msg:
    Error: failed to receive USB CMD response
    because the received_size < expected size
    
    to fix the issue, do recv in a loop till all data is received
    or timeout is reached.
    
    Change-Id: I46cc60c231b4cc52f150ead268f843bc60c41149
    Signed-off-by: Tarek BOCHKATI <[email protected]>

diff --git a/src/jtag/drivers/stlink_usb.c b/src/jtag/drivers/stlink_usb.c
index 843be79bf..d3cce3bf0 100644
--- a/src/jtag/drivers/stlink_usb.c
+++ b/src/jtag/drivers/stlink_usb.c
@@ -37,6 +37,7 @@
 #include <helper/binarybuffer.h>
 #include <helper/bits.h>
 #include <helper/system.h>
+#include <helper/time_support.h>
 #include <jtag/interface.h>
 #include <jtag/hla/hla_layout.h>
 #include <jtag/hla/hla_transport.h>
@@ -926,17 +927,35 @@ static int stlink_tcp_send_cmd(void *handle, int 
send_size, int recv_size, bool
                return ERROR_FAIL;
        }
 
-       keep_alive();
-
        /* read the TCP response */
-       int received_size = recv(h->tcp_backend_priv.fd, (void 
*)h->tcp_backend_priv.recv_buf, recv_size, 0);
-       if (received_size != recv_size) {
-               LOG_ERROR("failed to receive USB CMD response");
-               if (received_size == -1)
+       int retval = ERROR_OK;
+       int remaining_bytes = recv_size;
+       uint8_t *recv_buf = h->tcp_backend_priv.recv_buf;
+       const int64_t timeout = timeval_ms() + 1000; /* 1 second */
+
+       while (remaining_bytes > 0) {
+               if (timeval_ms() > timeout) {
+                       LOG_DEBUG("received size %d (expected %d)", recv_size - 
remaining_bytes, recv_size);
+                       retval = ERROR_TIMEOUT_REACHED;
+                       break;
+               }
+
+               keep_alive();
+               int received = recv(h->tcp_backend_priv.fd, (void *)recv_buf, 
remaining_bytes, 0);
+
+               if (received == -1) {
                        LOG_DEBUG("socket recv error: %s (errno %d)", 
strerror(errno), errno);
-               else
-                       LOG_DEBUG("received size %d (expected %d)", 
received_size, recv_size);
-               return ERROR_FAIL;
+                       retval = ERROR_FAIL;
+                       break;
+               }
+
+               recv_buf += received;
+               remaining_bytes -= received;
+       }
+
+       if (retval != ERROR_OK) {
+               LOG_ERROR("failed to receive USB CMD response");
+               return retval;
        }
 
        if (check_tcp_status) {

-- 

Reply via email to