diff options
author | Parshintsev Anatoly <anatoly.parshintsev@syntacore.com> | 2023-07-10 16:30:07 +0300 |
---|---|---|
committer | Antonio Borneo <borneo.antonio@gmail.com> | 2024-02-11 23:04:48 +0000 |
commit | 50be4bd2672916f9262df31108d4611c2b0fbf44 (patch) | |
tree | 3609649d440ab440b3282066e4a3fed470b84570 /src/jtag | |
parent | 3b5ef1726a4e5da657080d640e16f1f4d9dc6071 (diff) | |
download | riscv-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.c | 23 |
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: |