aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorTim Newsome <tim@sifive.com>2018-11-14 11:55:09 -0800
committerSpencer Oliver <spen@spen-soft.co.uk>2019-10-15 08:58:56 +0100
commitd214cadfef7ba75c7c52849c7946d32f0ad8b668 (patch)
tree1871abbe5648d5ea9f0c57c8b6a2f9e5fe0d3318 /src
parent0a13ca1a8a83119a4e1ffba13a6a8d1977591bc5 (diff)
Add wall clock timeout warning to mpsse_flush()
I think that libusb_handle_events_timeout_completed is supposed to make progress or time out, but sometimes we hit a case where it makes no progress, and mpsse_flush() loops forever. This wall clock timeout notifies the user that this is going on. When I wrote this code, this bug would reproduce every hour or two, but right now it's not happening for me. Change-Id: I7eb66f43462298e263a48048aa0c8769095661eb Signed-off-by: Tim Newsome <tim@sifive.com> Reviewed-on: http://openocd.zylin.com/4767 Tested-by: jenkins Reviewed-by: Andreas Fritiofson <andreas.fritiofson@gmail.com>
Diffstat (limited to 'src')
-rw-r--r--src/jtag/drivers/mpsse.c10
1 files changed, 10 insertions, 0 deletions
diff --git a/src/jtag/drivers/mpsse.c b/src/jtag/drivers/mpsse.c
index a881803a..7488d9dd 100644
--- a/src/jtag/drivers/mpsse.c
+++ b/src/jtag/drivers/mpsse.c
@@ -22,6 +22,7 @@
#include "mpsse.h"
#include "helper/log.h"
+#include "helper/time_support.h"
#include <libusb.h>
/* Compatibility define for older libusb-1.0 */
@@ -888,6 +889,8 @@ int mpsse_flush(struct mpsse_ctx *ctx)
}
/* Polling loop, more or less taken from libftdi */
+ int64_t start = timeval_ms();
+ int64_t warn_after = 2000;
while (!write_result.done || !read_result.done) {
struct timeval timeout_usb;
@@ -910,6 +913,13 @@ int mpsse_flush(struct mpsse_ctx *ctx)
break;
}
}
+
+ int64_t now = timeval_ms();
+ if (now - start > warn_after) {
+ LOG_WARNING("Haven't made progress in mpsse_flush() for %" PRId64
+ "ms.", now - start);
+ warn_after *= 2;
+ }
}
error_check: