aboutsummaryrefslogtreecommitdiff
path: root/src/jtag
diff options
context:
space:
mode:
authorParshintsev Anatoly <anatoly.parshintsev@syntacore.com>2023-07-10 16:30:07 +0300
committerAntonio Borneo <borneo.antonio@gmail.com>2024-02-11 23:04:48 +0000
commit50be4bd2672916f9262df31108d4611c2b0fbf44 (patch)
tree3609649d440ab440b3282066e4a3fed470b84570 /src/jtag
parent3b5ef1726a4e5da657080d640e16f1f4d9dc6071 (diff)
downloadriscv-openocd-50be4bd2672916f9262df31108d4611c2b0fbf44.zip
riscv-openocd-50be4bd2672916f9262df31108d4611c2b0fbf44.tar.gz
riscv-openocd-50be4bd2672916f9262df31108d4611c2b0fbf44.tar.bz2
jtag/mpsse: mpsse_flush should not treat LIBUSB_ERROR_INTERRUPTED as an error
LIBUSB_ERROR_INTERRUPTED can happen when (among other things) OpenOCD process receives a signal like SIGHUP or SIGINT during a call to libusb. Such situations are expected and should not be treated as an error - the affected request should just be restarted. Without this patch applied if a signal arrives during FTDI initialization procedure we can easily end up (if JTAG speed is low) in situations like https://review.openocd.org/c/openocd/+/4767. This happens because fpsse_flush fails due to LIBUSB_ERROR_INTERRUPTED . It should be noted that the current usage of mpsse_flush should be revised since it seems that we don't always process error codes returned by the function. Change-Id: Ifa063ce828068f8d0371e1c2a864bb6174649848 Signed-off-by: Parshintsev Anatoly <anatoly.parshintsev@syntacore.com> Reviewed-on: https://review.openocd.org/c/openocd/+/7769 Reviewed-by: Tim Newsome <tim@sifive.com> Reviewed-by: Antonio Borneo <borneo.antonio@gmail.com> Tested-by: jenkins
Diffstat (limited to 'src/jtag')
-rw-r--r--src/jtag/drivers/mpsse.c23
1 files changed, 9 insertions, 14 deletions
diff --git a/src/jtag/drivers/mpsse.c b/src/jtag/drivers/mpsse.c
index fad91dd..41a8b6e 100644
--- a/src/jtag/drivers/mpsse.c
+++ b/src/jtag/drivers/mpsse.c
@@ -880,20 +880,6 @@ int mpsse_flush(struct mpsse_ctx *ctx)
retval = libusb_handle_events_timeout_completed(ctx->usb_ctx, &timeout_usb, NULL);
keep_alive();
- if (retval == LIBUSB_ERROR_NO_DEVICE || retval == LIBUSB_ERROR_INTERRUPTED)
- break;
-
- if (retval != LIBUSB_SUCCESS) {
- libusb_cancel_transfer(write_transfer);
- if (read_transfer)
- libusb_cancel_transfer(read_transfer);
- while (!write_result.done || !read_result.done) {
- retval = libusb_handle_events_timeout_completed(ctx->usb_ctx,
- &timeout_usb, NULL);
- if (retval != LIBUSB_SUCCESS)
- break;
- }
- }
int64_t now = timeval_ms();
if (now - start > warn_after) {
@@ -901,6 +887,15 @@ int mpsse_flush(struct mpsse_ctx *ctx)
"ms.", now - start);
warn_after *= 2;
}
+
+ if (retval == LIBUSB_ERROR_INTERRUPTED)
+ continue;
+
+ if (retval != LIBUSB_SUCCESS) {
+ libusb_cancel_transfer(write_transfer);
+ if (read_transfer)
+ libusb_cancel_transfer(read_transfer);
+ }
}
error_check: