summarylogtreecommitdiffstats
path: root/reset-device.patch
diff options
context:
space:
mode:
authorTim Schumacher2021-03-23 01:19:30 +0100
committerTim Schumacher2021-03-23 01:19:30 +0100
commit6d89df5458ae52b9f03316c17a11b6c592a9a102 (patch)
tree910cc1cfddd2d0d7fefbbb5a4d7edafc4f2c6e48 /reset-device.patch
parente156af5d078caa15729822c2534626def230756a (diff)
downloadaur-heimdall-git.tar.gz
Add a patch to reset the device before flashing
Diffstat (limited to 'reset-device.patch')
-rw-r--r--reset-device.patch50
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!");