From faae5dd726178d4470fea677fdc3ca7e2cea5261 Mon Sep 17 00:00:00 2001 From: Augustin Cavalier Date: Mon, 20 Sep 2021 11:14:31 -0400 Subject: [PATCH] USB: Put the default pipe's USB ID and cancel its transfers earlier during teardown. This way, any endpoints or interfaces which are currently using the default pipe for SetFeature/.../etc. will return immediately and become unbusy. Should fix the remaining KDLs in #16794 and #16969. Change-Id: I6615fc03394a0c50eae1ca7da2fb43f243841613 Reviewed-on: https://review.haiku-os.org/c/haiku/+/4490 Reviewed-by: waddlesplash --- src/add-ons/kernel/bus_managers/usb/Device.cpp | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/src/add-ons/kernel/bus_managers/usb/Device.cpp b/src/add-ons/kernel/bus_managers/usb/Device.cpp index b2d2a8d4ad..e80ecd0e47 100644 --- a/src/add-ons/kernel/bus_managers/usb/Device.cpp +++ b/src/add-ons/kernel/bus_managers/usb/Device.cpp @@ -326,6 +326,13 @@ Device::Device(Object* parent, int8 hubAddress, uint8 hubPort, Device::~Device() { + // Cancel transfers on the default pipe and put its USBID to prevent + // further transfers from being queued. + if (fDefaultPipe != NULL) { + fDefaultPipe->PutUSBID(); + fDefaultPipe->CancelQueuedTransfers(true); + } + // Destroy open endpoints. Do not send a device request to unconfigure // though, since we may be deleted because the device was unplugged already. Unconfigure(false); @@ -355,8 +362,6 @@ Device::~Device() } // Remove ourselves from the stack before deleting public structures. - if (fDefaultPipe != NULL) - fDefaultPipe->PutUSBID(); PutUSBID(); delete fDefaultPipe;