From a1b54ce9b58fa5cbf8f1b0487e35bb3b66b2f283 Mon Sep 17 00:00:00 2001 From: Tomasz Jeznach Date: Mon, 5 Aug 2019 16:01:42 -0700 Subject: usb: handle transfer errors after port is detached When USB device is detached from kernel driver there might be multiple pending USB transfers enqued, each completing with TransferStatus::NoDevice. Once backend device is detached from system it's ok to ignore subsequent detach request errors in transfer completion handler. BUG=chromium:987500 TEST=ADB USB device attach/detach cycles with active adb service. Change-Id: I4026e68df860c483973f51f9787bf3d48d2716b3 Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1737471 Tested-by: Tomasz Jeznach Tested-by: kokoro Commit-Queue: Tomasz Jeznach Reviewed-by: Daniel Verkamp Reviewed-by: Zach Reizner --- devices/src/usb/xhci/xhci_transfer.rs | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/devices/src/usb/xhci/xhci_transfer.rs b/devices/src/usb/xhci/xhci_transfer.rs index e166c1a..400cbbc 100644 --- a/devices/src/usb/xhci/xhci_transfer.rs +++ b/devices/src/usb/xhci/xhci_transfer.rs @@ -290,8 +290,13 @@ impl XhciTransfer { usb_debug!("device disconnected, detaching from port"); // If the device is gone, we don't need to send transfer completion event, cause we // are going to destroy everything related to this device anyway. - self.port.detach().map_err(Error::DetachPort)?; - return Ok(()); + return match self.port.detach() { + Ok(v) => Ok(v), + // It's acceptable for the port to be already disconnected + // as asynchronous transfer completions are processed. + Err(HubError::AlreadyDetached(_e)) => Ok(()), + Err(e) => Err(Error::DetachPort(e)), + }; } TransferStatus::Cancelled => { // TODO(jkwang) According to the spec, we should send a stopped event here. But -- cgit 1.4.1