Fix jlink usb_bulk_with_retries to return actual error codes.
authorzwelch <zwelch@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Wed, 29 Apr 2009 06:30:44 +0000 (06:30 +0000)
committerzwelch <zwelch@b42882b7-edfa-0310-969c-e2dbd0fdcd60>
Wed, 29 Apr 2009 06:30:44 +0000 (06:30 +0000)
git-svn-id: svn://svn.berlios.de/openocd/trunk@1564 b42882b7-edfa-0310-969c-e2dbd0fdcd60

src/jtag/jlink.c

index 98e3111..d2e8947 100644 (file)
@@ -31,6 +31,7 @@
 
 #include <usb.h>
 #include <string.h>
+#include <errno.h>
 
 #include "log.h"
 
@@ -867,21 +868,17 @@ static int usb_bulk_with_retries(
                usb_dev_handle *dev, int ep,
                char *bytes, int size, int timeout)
 {
-       int rc = 0, tries = 3, this_size;
+       int tries = 3, count = 0;
 
-       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 --;
+       while (tries && (count < size))
+       {
+               int result = f(dev, ep, bytes + count, size - count, timeout);
+               if (result > 0)
+                       count += result;
+               else if ((-ETIMEDOUT != result) || !--tries)
+                       return result;
        }
-       return rc;
+       return count;
 }
 
 static int wrap_usb_bulk_write(usb_dev_handle *dev, int ep,