From b2de4db941f5329f9f19e70feff5786b2d5acbb6 Mon Sep 17 00:00:00 2001 From: Dan Murphy Date: Tue, 18 Aug 2009 09:41:09 -0500 Subject: [PATCH] fastboot: Add retry to USB read call. If the USB connection to the device is reset but is still there the code should retry to re-connect the device and continue. This is a short term fix for a bootloader issue. We should revisit and look for a better solution. Signed-off-by: Dan Murphy Signed-off-by: Mike Lockwood --- fastboot/usb_linux.c | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/fastboot/usb_linux.c b/fastboot/usb_linux.c index 06c62b84c..3b40ba7f9 100644 --- a/fastboot/usb_linux.c +++ b/fastboot/usb_linux.c @@ -51,7 +51,9 @@ #include "usb.h" -#if TRACE_USB +#define MAX_RETRIES 5 + +#ifdef TRACE_USB #define DBG1(x...) fprintf(stderr, x) #define DBG(x...) fprintf(stderr, x) #else @@ -303,7 +305,7 @@ int usb_read(usb_handle *h, void *_data, int len) unsigned char *data = (unsigned char*) _data; unsigned count = 0; struct usbdevfs_bulktransfer bulk; - int n; + int n, retry; if(h->ep_in == 0) { return -1; @@ -316,16 +318,20 @@ int usb_read(usb_handle *h, void *_data, int len) bulk.len = xfer; bulk.data = data; bulk.timeout = 0; - - DBG("[ usb read %d fd = %d], fname=%s\n", xfer, h->desc, h->fname); - n = ioctl(h->desc, USBDEVFS_BULK, &bulk); - DBG("[ usb read %d ] = %d, fname=%s\n", xfer, n, h->fname); + retry = 0; - if(n < 0) { - DBG1("ERROR: n = %d, errno = %d (%s)\n", - n, errno, strerror(errno)); - return -1; + do{ + DBG("[ usb read %d fd = %d], fname=%s\n", xfer, h->desc, h->fname); + n = ioctl(h->desc, USBDEVFS_BULK, &bulk); + DBG("[ usb read %d ] = %d, fname=%s, Retry %d \n", xfer, n, h->fname, retry); + + if( n < 0 ) { + DBG1("ERROR: n = %d, errno = %d (%s)\n",n, errno, strerror(errno)); + if ( ++retry > MAX_RETRIES ) return -1; + sleep( 1 ); + } } + while( n < 0 ); count += n; len -= n;