summary refs log tree commit diff
path: root/usb_util
diff options
context:
space:
mode:
authorDaniel Verkamp <dverkamp@chromium.org>2020-03-18 13:10:49 -0700
committerCommit Bot <commit-bot@chromium.org>2020-03-24 11:29:57 +0000
commit0dcbfa1176386d1e2f8f52947fe93004db195abe (patch)
tree2b76da7fbf56d6cdb6ef55021fcecfdc8e408a69 /usb_util
parent83fc5c49ba930a62ef1f4d93bc2004d779b6d16f (diff)
downloadcrosvm-0dcbfa1176386d1e2f8f52947fe93004db195abe.tar
crosvm-0dcbfa1176386d1e2f8f52947fe93004db195abe.tar.gz
crosvm-0dcbfa1176386d1e2f8f52947fe93004db195abe.tar.bz2
crosvm-0dcbfa1176386d1e2f8f52947fe93004db195abe.tar.lz
crosvm-0dcbfa1176386d1e2f8f52947fe93004db195abe.tar.xz
crosvm-0dcbfa1176386d1e2f8f52947fe93004db195abe.tar.zst
crosvm-0dcbfa1176386d1e2f8f52947fe93004db195abe.zip
usb: avoid setting configuration when unnecessary
On devices with only one configuration, skip the code that attempts to
change the device's active configuration, since it must always be the
single available configuration.

This works around an issue observed with some USB devices (e.g. Servo
Micro) where the initial Get Configuration control request fails with
-EPIPE.

BUG=chromium:1061382
BUG=b:151408644
TEST=Attach servo micro, see /dev/ttyUSB[012], screen /dev/ttyUSB0

Change-Id: Ic3333e1d70a0c57b090de64e4d3b7932ce2cf81d
Reviewed-on: https://chromium-review.googlesource.com/c/chromiumos/platform/crosvm/+/2108871
Reviewed-by: Stephen Barber <smbarber@chromium.org>
Tested-by: kokoro <noreply+kokoro@google.com>
Tested-by: George Engelbrecht <engeg@google.com>
Commit-Queue: George Engelbrecht <engeg@google.com>
Diffstat (limited to 'usb_util')
-rw-r--r--usb_util/src/device.rs13
1 files changed, 7 insertions, 6 deletions
diff --git a/usb_util/src/device.rs b/usb_util/src/device.rs
index aad77db..3ac1403 100644
--- a/usb_util/src/device.rs
+++ b/usb_util/src/device.rs
@@ -261,12 +261,8 @@ impl Device {
     }
 
     /// Get active config descriptor of this device.
-    pub fn get_active_config_descriptor(&self) -> Result<ConfigDescriptorTree> {
-        let active_config = self.get_active_configuration()?;
-        match self
-            .device_descriptor_tree
-            .get_config_descriptor(active_config)
-        {
+    pub fn get_config_descriptor(&self, config: u8) -> Result<ConfigDescriptorTree> {
+        match self.device_descriptor_tree.get_config_descriptor(config) {
             Some(config_descriptor) => Ok(config_descriptor.clone()),
             None => Err(Error::NoSuchDescriptor),
         }
@@ -297,6 +293,11 @@ impl Device {
         Ok(active_config)
     }
 
+    /// Get the total number of configurations for this device.
+    pub fn get_num_configurations(&self) -> u8 {
+        self.device_descriptor_tree.bNumConfigurations
+    }
+
     /// Clear the halt/stall condition for an endpoint.
     pub fn clear_halt(&self, ep_addr: u8) -> Result<()> {
         let endpoint: c_uint = ep_addr.into();