+
+ if (result2)
+ {
+ LOG_ERROR("jlink_usb_message failed with result=%d)", result2);
+ return ERROR_JTAG_DEVICE_ERROR;
+ }
+
+ return result;
+}
+
+/* calls the given usb_bulk_* function, allowing for the data to trickle in with some timeouts */
+static int usb_bulk_with_retries(
+ int (*f)(usb_dev_handle *, int, char *, int, int),
+ usb_dev_handle *dev, int ep,
+ char *bytes, int size, int timeout)
+{
+ int rc = 0, tries = 3, this_size;
+
+ while (tries && size) {
+
+ this_size = f(dev, ep, bytes, size, timeout);
+ if (this_size > 0) {
+
+ size -= this_size;
+ rc += this_size;
+ bytes += this_size;
+
+ } else
+ tries --;
+ }
+ return rc;
+}
+static inline int usb_bulk_write_ex(usb_dev_handle *dev, int ep,
+ char *bytes, int size, int timeout)
+{
+ return usb_bulk_with_retries(&usb_bulk_write,
+ dev, ep, bytes, size, timeout);
+}
+static inline int usb_bulk_read_ex(usb_dev_handle *dev, int ep,
+ char *bytes, int size, int timeout)
+{
+ return usb_bulk_with_retries(&usb_bulk_read,
+ dev, ep, bytes, size, timeout);