From 745dbb46004a328f0db04cc75b6d4124562591a2 Mon Sep 17 00:00:00 2001 From: Jesse Chan 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 --- 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!");