From 1ebcd6c19ae8f3ee808850dde77073fcb6a7612d Mon Sep 17 00:00:00 2001 From: keeramis Date: Wed, 31 Jul 2024 15:19:03 -0700 Subject: [PATCH 1/2] Expect device to be ready to run a control request after CLI op finishes Check for Device Protection for only Gen3+ --- src/cmd/usb-util.js | 53 +++++++++++++++++++++++---------------------- 1 file changed, 27 insertions(+), 26 deletions(-) diff --git a/src/cmd/usb-util.js b/src/cmd/usb-util.js index 9f6cf78f5..4ca9711da 100644 --- a/src/cmd/usb-util.js +++ b/src/cmd/usb-util.js @@ -97,24 +97,29 @@ class UsbPermissionsError extends Error { async function executeWithUsbDevice({ args, func, dfuMode = false } = {}) { let device = await getOneUsbDevice(args, { dfuMode }); let deviceIsProtected = false; - try { - const s = await deviceProtectionHelper.getProtectionStatus(device); - deviceIsProtected = s.protected && !s.overrridden; - } catch (err) { - if (err.message === 'Not supported') { - // Device Protection is not supported on certain platforms and versions. - // It means that the device is not protected. - } - throw err; - } - if (deviceIsProtected) { - const deviceWasInDfuMode = device.isInDfuMode; - if (deviceWasInDfuMode) { - device = await _putDeviceInSafeMode(device); + + const platform = platformForId(device.platformId); + if (platform.generation > 2) { // Skipping device protection check for Gen2 platforms + try { + const s = await deviceProtectionHelper.getProtectionStatus(device); + deviceIsProtected = s.protected && !s.overrridden; + } catch (err) { + if (err.message === 'Not supported') { + // Device Protection is not supported on certain platforms and versions. + // It means that the device is not protected. + } else { + throw err; + } } - await deviceProtectionHelper.disableDeviceProtection(device); - if (deviceWasInDfuMode) { - device = await reopenInDfuMode(device); + if (deviceIsProtected) { + const deviceWasInDfuMode = device.isInDfuMode; + if (deviceWasInDfuMode) { + device = await _putDeviceInSafeMode(device); + } + await deviceProtectionHelper.disableDeviceProtection(device); + if (deviceWasInDfuMode) { + device = await reopenInDfuMode(device); + } } } @@ -123,15 +128,11 @@ async function executeWithUsbDevice({ args, func, dfuMode = false } = {}) { res = await func(device); } finally { if (deviceIsProtected) { - device = await reopenDevice(device); - if (!device.isInDfuMode) { - device = await waitForDeviceToReboot(device); - } try { - // Only works for 6.1.2 and later + // 'device' has finished the CLI command and is now ready to run this command await deviceProtectionHelper.turnOffServiceMode(device); } catch (error) { - // FIXME: ignore errors + // Ignore error. At most, device is left in Service Mode } } if (device && device.isOpen) { @@ -147,9 +148,9 @@ async function executeWithUsbDevice({ args, func, dfuMode = false } = {}) { * @param {*} deviceId * @returns */ -async function waitForDeviceToReboot(device) { +async function waitForDeviceToRespond(device) { const deviceId = device.id; - const REBOOT_TIME_MSEC = 60000; + const REBOOT_TIME_MSEC = 20000; const REBOOT_INTERVAL_MSEC = 1000; const start = Date.now(); if (device.isOpen) { @@ -550,5 +551,5 @@ module.exports = { forEachUsbDevice, openUsbDevices, executeWithUsbDevice, - waitForDeviceToReboot + waitForDeviceToRespond }; From e5da90eb5f6fca505fad2fecef35f6691256e3bb Mon Sep 17 00:00:00 2001 From: keeramis Date: Wed, 31 Jul 2024 15:20:44 -0700 Subject: [PATCH 2/2] lint fix --- src/cmd/usb-util.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/cmd/usb-util.js b/src/cmd/usb-util.js index 4ca9711da..8869abd86 100644 --- a/src/cmd/usb-util.js +++ b/src/cmd/usb-util.js @@ -97,7 +97,7 @@ class UsbPermissionsError extends Error { async function executeWithUsbDevice({ args, func, dfuMode = false } = {}) { let device = await getOneUsbDevice(args, { dfuMode }); let deviceIsProtected = false; - + const platform = platformForId(device.platformId); if (platform.generation > 2) { // Skipping device protection check for Gen2 platforms try {