Some USB devices (like hard disks) can take a long time to initially
respond to read/write requests. Explicitly specify a much longer timeout
than normal.

Signed-off-by: Hector Martin <mar...@marcan.st>
---
 common/usb_storage.c | 10 ++++++++--
 1 file changed, 8 insertions(+), 2 deletions(-)

diff --git a/common/usb_storage.c b/common/usb_storage.c
index c9e2d7343ce2..729ddbc75a48 100644
--- a/common/usb_storage.c
+++ b/common/usb_storage.c
@@ -53,6 +53,12 @@
 #undef BBB_COMDAT_TRACE
 #undef BBB_XPORT_TRACE
 
+/*
+ * Timeout for read/write transfers. This needs to be able to handle very slow
+ * devices, such as hard disks that are spinning up.
+ */
+#define US_XFER_TIMEOUT 15000
+
 #include <scsi.h>
 /* direction table -- this indicates the direction of the data
  * transfer for each command code -- a 1 indicates input
@@ -394,7 +400,7 @@ static int us_one_transfer(struct us_data *us, int pipe, 
char *buf, int length)
                              11 - maxtry);
                        result = usb_bulk_msg(us->pusb_dev, pipe, buf,
                                              this_xfer, &partial,
-                                             USB_CNTL_TIMEOUT * 5);
+                                             US_XFER_TIMEOUT);
                        debug("bulk_msg returned %d xferred %d/%d\n",
                              result, partial, this_xfer);
                        if (us->pusb_dev->status != 0) {
@@ -743,7 +749,7 @@ static int usb_stor_BBB_transport(struct scsi_cmd *srb, 
struct us_data *us)
                pipe = pipeout;
 
        result = usb_bulk_msg(us->pusb_dev, pipe, srb->pdata, srb->datalen,
-                             &data_actlen, USB_CNTL_TIMEOUT * 5);
+                             &data_actlen, US_XFER_TIMEOUT);
        /* special handling of STALL in DATA phase */
        if ((result < 0) && (us->pusb_dev->status & USB_ST_STALLED)) {
                debug("DATA:stall\n");

-- 
2.41.0

Reply via email to