summary refs log tree commit diff
path: root/devices/src/usb
diff options
context:
space:
mode:
authorDaniel Verkamp <dverkamp@chromium.org>2019-07-22 13:52:19 -0700
committerCommit Bot <commit-bot@chromium.org>2019-09-09 18:20:40 +0000
commit13eea9f02870a05253f86e4fc9ba4e35367950de (patch)
tree2416bc631cf4dc3aee594a1d2f78380a849892e7 /devices/src/usb
parentf5a52516b1496533ef75ef181575faf891f8dc1a (diff)
downloadcrosvm-13eea9f02870a05253f86e4fc9ba4e35367950de.tar
crosvm-13eea9f02870a05253f86e4fc9ba4e35367950de.tar.gz
crosvm-13eea9f02870a05253f86e4fc9ba4e35367950de.tar.bz2
crosvm-13eea9f02870a05253f86e4fc9ba4e35367950de.tar.lz
crosvm-13eea9f02870a05253f86e4fc9ba4e35367950de.tar.xz
crosvm-13eea9f02870a05253f86e4fc9ba4e35367950de.tar.zst
crosvm-13eea9f02870a05253f86e4fc9ba4e35367950de.zip
usb: clarify transfer cancellation API
Rather than having a get_canceller() function on UsbTransfer, make the
submit function return the canceller.  This makes it clear that the
transfer can't be cancelled before it is submitted.

BUG=None
TEST=None

Change-Id: Ice36c3096a1f8a5aafe93b5d5e27eb371183c19f
Signed-off-by: Daniel Verkamp <dverkamp@chromium.org>
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/1783599
Reviewed-by: Zach Reizner <zachr@chromium.org>
Tested-by: kokoro <noreply+kokoro@google.com>
Diffstat (limited to 'devices/src/usb')
-rw-r--r--devices/src/usb/host_backend/utils.rs25
1 files changed, 13 insertions, 12 deletions
diff --git a/devices/src/usb/host_backend/utils.rs b/devices/src/usb/host_backend/utils.rs
index 7d23bd4..bcbec20 100644
--- a/devices/src/usb/host_backend/utils.rs
+++ b/devices/src/usb/host_backend/utils.rs
@@ -58,17 +58,6 @@ pub fn submit_transfer<T: UsbTransferBuffer>(
         let mut state = xhci_transfer.state().lock();
         match mem::replace(&mut *state, XhciTransferState::Cancelled) {
             XhciTransferState::Created => {
-                let canceller = usb_transfer.get_canceller();
-                // TODO(jkwang) refactor canceller to return Cancel::Ok or Cancel::Err.
-                let cancel_callback = Box::new(move || match canceller.try_cancel() {
-                    true => {
-                        usb_debug!("cancel issued to libusb backend");
-                    }
-                    false => {
-                        usb_debug!("fail to cancel");
-                    }
-                });
-                *state = XhciTransferState::Submitted { cancel_callback };
                 match device_handle.lock().submit_async_transfer(usb_transfer) {
                     Err(e) => {
                         error!("fail to submit transfer {:?}", e);
@@ -76,7 +65,19 @@ pub fn submit_transfer<T: UsbTransferBuffer>(
                         TransferStatus::NoDevice
                     }
                     // If it's submitted, we don't need to send on_transfer_complete now.
-                    Ok(_) => return Ok(()),
+                    Ok(canceller) => {
+                        // TODO(jkwang) refactor canceller to return Cancel::Ok or Cancel::Err.
+                        let cancel_callback = Box::new(move || match canceller.try_cancel() {
+                            true => {
+                                usb_debug!("cancel issued to libusb backend");
+                            }
+                            false => {
+                                usb_debug!("fail to cancel");
+                            }
+                        });
+                        *state = XhciTransferState::Submitted { cancel_callback };
+                        return Ok(());
+                    }
                 }
             }
             XhciTransferState::Cancelled => {