[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 2/7] usb-linux: Get the alt. setting from sysfs rath
From: |
Hans de Goede |
Subject: |
[Qemu-devel] [PATCH 2/7] usb-linux: Get the alt. setting from sysfs rather then asking the dev |
Date: |
Fri, 26 Nov 2010 19:13:18 +0100 |
At least one device I have lies when receiving a USB_REQ_GET_INTERFACE,
always returning 0 even if the alternate setting is different. This is
likely caused because in practice this control message is never used as
the operating system's usb stack knows which alternate setting it has
told the device to get into, and thus this ctrl message does not get
tested by device manufacturers.
When usb_fs_type == USB_FS_SYS, the active alt. setting can be read directly
from sysfs, which allows using this device through qemu's usb redirection.
More in general it seems a good idea to not send needless control msg's to
devices, esp. as the code in question is called every time a set_interface
is done. Which happens multiple times during virtual machine startup, and
when device drivers are activating the usb device.
Signed-off-by: Hans de Goede <address@hidden>
---
usb-linux.c | 18 ++++++++++++++++++
1 files changed, 18 insertions(+), 0 deletions(-)
diff --git a/usb-linux.c b/usb-linux.c
index a93f0e5..ddd7c67 100644
--- a/usb-linux.c
+++ b/usb-linux.c
@@ -829,6 +829,24 @@ static uint8_t usb_linux_get_alt_setting(USBHostDevice *s,
struct usb_ctrltransfer ct;
int ret;
+ if (usb_fs_type == USB_FS_SYS) {
+ char device_name[64], line[1024];
+ int alt_setting;
+
+ sprintf(device_name, "%d-%d:%d.%d", s->bus_num, s->devpath,
+ (int)configuration, (int)interface);
+
+ if (!usb_host_read_file(line, sizeof(line), "bAlternateSetting",
+ device_name)) {
+ goto usbdevfs;
+ }
+ if (sscanf(line, "%d", &alt_setting) != 1) {
+ goto usbdevfs;
+ }
+ return alt_setting;
+ }
+
+usbdevfs:
ct.bRequestType = USB_DIR_IN | USB_RECIP_INTERFACE;
ct.bRequest = USB_REQ_GET_INTERFACE;
ct.wValue = 0;
--
1.7.3.2
- [Qemu-devel] [PATCH 1/7] usb-linux: introduce a usb_linux_alt_setting function, Hans de Goede, 2010/11/26
- [Qemu-devel] [PATCH 2/7] usb-linux: Get the alt. setting from sysfs rather then asking the dev,
Hans de Goede <=
- [Qemu-devel] [PATCH 3/7] usb-linux: Add support for buffering iso usb packets, Hans de Goede, 2010/11/26
- [Qemu-devel] [PATCH 4/7] usb-linux: Refuse packets for endpoints which are not in the usb descriptor, Hans de Goede, 2010/11/26
- [Qemu-devel] [PATCH 5/7] usb-linux: Refuse iso packets when max packet size is 0 (alt setting 0), Hans de Goede, 2010/11/26
- [Qemu-devel] [PATCH 6/7] usb-linux: We only need to keep track of 15 endpoints, Hans de Goede, 2010/11/26
- [Qemu-devel] [PATCH 7/7] usb-linux: Add support for buffering iso out usb packets, Hans de Goede, 2010/11/26