summary refs log tree commit diff
path: root/devices/src/usb
diff options
context:
space:
mode:
authorAlyssa Ross <hi@alyssa.is>2020-03-26 12:26:18 +0000
committerAlyssa Ross <hi@alyssa.is>2020-03-26 12:26:18 +0000
commitdbd5f925b6b2f4cb1bf87563be4d24c8ed35689a (patch)
tree5a51c0af87b6a8bb3dfe43d599cabf96523a7f6f /devices/src/usb
parent88b7821302043b7ad871fcc0c7748573d0f140e2 (diff)
parent22964eab8874d41cf0eadf03dfeb1ffb653283e5 (diff)
downloadcrosvm-dbd5f925b6b2f4cb1bf87563be4d24c8ed35689a.tar
crosvm-dbd5f925b6b2f4cb1bf87563be4d24c8ed35689a.tar.gz
crosvm-dbd5f925b6b2f4cb1bf87563be4d24c8ed35689a.tar.bz2
crosvm-dbd5f925b6b2f4cb1bf87563be4d24c8ed35689a.tar.lz
crosvm-dbd5f925b6b2f4cb1bf87563be4d24c8ed35689a.tar.xz
crosvm-dbd5f925b6b2f4cb1bf87563be4d24c8ed35689a.tar.zst
crosvm-dbd5f925b6b2f4cb1bf87563be4d24c8ed35689a.zip
Merge remote-tracking branch 'origin/master'
Diffstat (limited to 'devices/src/usb')
-rw-r--r--devices/src/usb/host_backend/host_device.rs40
1 files changed, 27 insertions, 13 deletions
diff --git a/devices/src/usb/host_backend/host_device.rs b/devices/src/usb/host_backend/host_device.rs
index 3b85ea2..196fa50 100644
--- a/devices/src/usb/host_backend/host_device.rs
+++ b/devices/src/usb/host_backend/host_device.rs
@@ -305,22 +305,31 @@ impl HostDevice {
             config
         );
         self.release_interfaces();
-        let cur_config = self
-            .device
-            .lock()
-            .get_active_configuration()
-            .map_err(Error::GetActiveConfig)?;
-        usb_debug!("current config is: {}", cur_config);
-        if config != cur_config {
-            self.device
-                .lock()
-                .set_active_configuration(config)
-                .map_err(Error::SetActiveConfig)?;
+        if self.device.lock().get_num_configurations() > 1 {
+            let cur_config = match self.device.lock().get_active_configuration() {
+                Ok(c) => Some(c),
+                Err(e) => {
+                    // The device may be in the default state, in which case
+                    // GET_CONFIGURATION may fail.  Assume the device needs to be
+                    // reconfigured.
+                    usb_debug!("Failed to get active configuration: {}", e);
+                    error!("Failed to get active configuration: {}", e);
+                    None
+                }
+            };
+            if Some(config) != cur_config {
+                self.device
+                    .lock()
+                    .set_active_configuration(config)
+                    .map_err(Error::SetActiveConfig)?;
+            }
+        } else {
+            usb_debug!("Only one configuration - not calling set_active_configuration");
         }
         let config_descriptor = self
             .device
             .lock()
-            .get_active_config_descriptor()
+            .get_config_descriptor(config)
             .map_err(Error::GetActiveConfig)?;
         self.claim_interfaces(&config_descriptor);
         self.create_endpoints(&config_descriptor)?;
@@ -337,10 +346,15 @@ impl HostDevice {
             .set_interface_alt_setting(interface, alt_setting)
             .map_err(Error::SetInterfaceAltSetting)?;
         self.alt_settings.insert(interface, alt_setting);
+        let config = self
+            .device
+            .lock()
+            .get_active_configuration()
+            .map_err(Error::GetActiveConfig)?;
         let config_descriptor = self
             .device
             .lock()
-            .get_active_config_descriptor()
+            .get_config_descriptor(config)
             .map_err(Error::GetActiveConfig)?;
         self.create_endpoints(&config_descriptor)?;
         Ok(TransferStatus::Completed)