From patchwork Wed May 4 15:41:36 2011 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerd Hoffmann X-Patchwork-Id: 94061 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [140.186.70.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 3EDB61007D1 for ; Thu, 5 May 2011 01:42:25 +1000 (EST) Received: from localhost ([::1]:49565 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QHeDW-00088Q-Hv for incoming@patchwork.ozlabs.org; Wed, 04 May 2011 11:42:22 -0400 Received: from eggs.gnu.org ([140.186.70.92]:33965) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QHeD5-00084a-4D for qemu-devel@nongnu.org; Wed, 04 May 2011 11:41:55 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1QHeD3-0007HT-AG for qemu-devel@nongnu.org; Wed, 04 May 2011 11:41:55 -0400 Received: from mx1.redhat.com ([209.132.183.28]:64517) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1QHeD3-0007HA-1t for qemu-devel@nongnu.org; Wed, 04 May 2011 11:41:53 -0400 Received: from int-mx10.intmail.prod.int.phx2.redhat.com (int-mx10.intmail.prod.int.phx2.redhat.com [10.5.11.23]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id p44FfpbI010892 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Wed, 4 May 2011 11:41:51 -0400 Received: from rincewind.home.kraxel.org (vpn2-9-245.ams2.redhat.com [10.36.9.245]) by int-mx10.intmail.prod.int.phx2.redhat.com (8.14.4/8.14.4) with ESMTP id p44FfnG0028876; Wed, 4 May 2011 11:41:50 -0400 Received: by rincewind.home.kraxel.org (Postfix, from userid 500) id AF0B042563; Wed, 4 May 2011 17:41:48 +0200 (CEST) From: Gerd Hoffmann To: qemu-devel@nongnu.org Date: Wed, 4 May 2011 17:41:36 +0200 Message-Id: <1304523708-9556-3-git-send-email-kraxel@redhat.com> In-Reply-To: <1304523708-9556-1-git-send-email-kraxel@redhat.com> References: <1304523708-9556-1-git-send-email-kraxel@redhat.com> X-Scanned-By: MIMEDefang 2.68 on 10.5.11.23 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.132.183.28 Cc: Hans de Goede , Gerd Hoffmann Subject: [Qemu-devel] [PATCH 02/14] usb-linux: Get the alt. setting from sysfs rather then asking the dev X-BeenThere: qemu-devel@nongnu.org X-Mailman-Version: 2.1.14 Precedence: list List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , Errors-To: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org Sender: qemu-devel-bounces+incoming=patchwork.ozlabs.org@nongnu.org From: Hans de Goede 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 Signed-off-by: Gerd Hoffmann --- usb-linux.c | 18 ++++++++++++++++++ 1 files changed, 18 insertions(+), 0 deletions(-) diff --git a/usb-linux.c b/usb-linux.c index 353e1b1..f4601e6 100644 --- a/usb-linux.c +++ b/usb-linux.c @@ -830,6 +830,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;