aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTarek BOCHKATI <tarek.bouchkati@gmail.com>2021-11-03 16:22:22 +0100
committerAntonio Borneo <borneo.antonio@gmail.com>2021-11-13 10:52:25 +0000
commit3f778c7c63cbd293c30144a88c041f845f1eb46d (patch)
treea9415fd844876ded2406a2f7f690dfdda2e9306b
parenta4f8bf7a9041eb37cf5b8df441935664809f13ac (diff)
downloadriscv-openocd-3f778c7c63cbd293c30144a88c041f845f1eb46d.zip
riscv-openocd-3f778c7c63cbd293c30144a88c041f845f1eb46d.tar.gz
riscv-openocd-3f778c7c63cbd293c30144a88c041f845f1eb46d.tar.bz2
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 <tarek.bouchkati@gmail.com> Reviewed-on: https://review.openocd.org/c/openocd/+/6671 Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com> Tested-by: jenkins
-rw-r--r--src/jtag/drivers/stlink_usb.c37
1 files changed, 28 insertions, 9 deletions
diff --git a/src/jtag/drivers/stlink_usb.c b/src/jtag/drivers/stlink_usb.c
index b51a0c2..87e6ddc 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) {