diff options
Diffstat (limited to 'reset-device.patch')
-rw-r--r-- | reset-device.patch | 50 |
1 files changed, 50 insertions, 0 deletions
diff --git a/reset-device.patch b/reset-device.patch new file mode 100644 index 000000000000..6ca2e620cad4 --- /dev/null +++ b/reset-device.patch @@ -0,0 +1,50 @@ +From 745dbb46004a328f0db04cc75b6d4124562591a2 Mon Sep 17 00:00:00 2001 +From: Jesse Chan <jc@linux.com> +Date: Tue, 5 May 2020 16:14:46 +0800 +Subject: [PATCH] InitialiseProtocol: reset device before handshake + +Heimdall fails to handshake with device on my Linux installation: +Initialising protocol... +ERROR: libusb error -7 whilst sending bulk transfer. Retrying... +ERROR: libusb error -7 whilst sending bulk transfer. Retrying... +ERROR: libusb error -7 whilst sending bulk transfer. Retrying... +ERROR: libusb error -7 whilst sending bulk transfer. Retrying... +ERROR: libusb error -7 whilst sending bulk transfer. Retrying... +ERROR: libusb error -7 whilst sending bulk transfer. +ERROR: Failed to send handshake! +ERROR: Failed to receive handshake response. Result: -7 +ERROR: Protocol initialisation failed! + +However, with the same USB cable, port and device, Heimdall +successfully handshake with the device on Windows via WinUSB. +This indicates handling of USB devices of host (AMD X570) on +Linux might lead to undesired results. Though, without further +testing, the interference from userspace (Ubuntu 20.04, KDE) can +not be ruled out. + +Thus, this patch calls libusb_reset_device to ensure +the USB port is in a clean state before we send the data. + +Fixes issues with newer devices and hosts. + +Signed-off-by: Jesse Chan <jc@linux.com> +--- + heimdall/source/BridgeManager.cpp | 5 +++++ + 1 file changed, 5 insertions(+) + +diff --git a/heimdall/source/BridgeManager.cpp b/heimdall/source/BridgeManager.cpp +index 1b658c8..1ad217c 100644 +--- a/heimdall/source/BridgeManager.cpp ++++ b/heimdall/source/BridgeManager.cpp +@@ -303,6 +303,11 @@ bool BridgeManager::InitialiseProtocol(void) + memcpy(dataBuffer, "ODIN", 4); + memset(dataBuffer + 4, 0, 1); + ++ if (libusb_reset_device(deviceHandle)) ++ { ++ Interface::PrintError("Failed to reset device!"); ++ } ++ + if (!SendBulkTransfer(dataBuffer, 4, 1000)) + { + Interface::PrintError("Failed to send handshake!"); |