From 7d6ddcd5d54e30e7437f0ba1aa4676224e68bf6a Mon Sep 17 00:00:00 2001 From: Benjamin Dobell Date: Sat, 31 May 2014 12:05:02 +1000 Subject: Give devices some leeway to handle empty bulk transfers. --- heimdall/source/BridgeManager.cpp | 16 ++++++++++------ heimdall/source/BridgeManager.h | 5 +++-- 2 files changed, 13 insertions(+), 8 deletions(-) (limited to 'heimdall') diff --git a/heimdall/source/BridgeManager.cpp b/heimdall/source/BridgeManager.cpp index a2cba80..96c22fb 100644 --- a/heimdall/source/BridgeManager.cpp +++ b/heimdall/source/BridgeManager.cpp @@ -624,12 +624,12 @@ bool BridgeManager::EndSession(bool reboot) const return (true); } -bool BridgeManager::SendBulkTransfer(unsigned char *data, int length, int timeout) const +bool BridgeManager::SendBulkTransfer(unsigned char *data, int length, int timeout, bool retry) const { int dataTransferred; int result = libusb_bulk_transfer(deviceHandle, outEndpoint, data, length, &dataTransferred, timeout); - if (result != LIBUSB_SUCCESS) + if (result != LIBUSB_SUCCESS && retry) { static const int retryDelay = 250; @@ -667,8 +667,10 @@ bool BridgeManager::SendPacket(OutboundPacket *packet, int timeout, int sendEmpt if (sendEmptyTransferFlags & kSendEmptyTransferBefore) { - if (!SendBulkTransfer(nullptr, 0, timeout)) - return (false); + if (!SendBulkTransfer(nullptr, 0, kDefaultTimeoutSendEmptyTransfer, false) && verbose) + { + Interface::PrintWarning("Empty bulk transfer before sending packet failed. Continuing anyway...\n"); + } } if (!SendBulkTransfer(packet->GetData(), packet->GetSize(), timeout)) @@ -676,8 +678,10 @@ bool BridgeManager::SendPacket(OutboundPacket *packet, int timeout, int sendEmpt if (sendEmptyTransferFlags & kSendEmptyTransferAfter) { - if (!SendBulkTransfer(nullptr, 0, timeout)) - return (false); + if (!SendBulkTransfer(nullptr, 0, kDefaultTimeoutSendEmptyTransfer, false) && verbose) + { + Interface::PrintWarning("Empty bulk transfer after sending packet failed. Continuing anyway...\n"); + } } return (true); diff --git a/heimdall/source/BridgeManager.h b/heimdall/source/BridgeManager.h index 7028003..e85dc87 100644 --- a/heimdall/source/BridgeManager.h +++ b/heimdall/source/BridgeManager.h @@ -81,7 +81,8 @@ namespace Heimdall enum { kDefaultTimeoutSend = 3000, - kDefaultTimeoutReceive = 3000 + kDefaultTimeoutReceive = 3000, + kDefaultTimeoutSendEmptyTransfer = 100 }; enum class UsbLogLevel @@ -139,7 +140,7 @@ namespace Heimdall bool InitialiseProtocol(void); - bool SendBulkTransfer(unsigned char *data, int length, int timeout) const; + bool SendBulkTransfer(unsigned char *data, int length, int timeout, bool retry = true) const; public: -- cgit v1.1