From patchwork Tue Jul 3 08:21:04 2012 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Gerd Hoffmann X-Patchwork-Id: 168730 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from lists.gnu.org (lists.gnu.org [208.118.235.17]) (using TLSv1 with cipher AES256-SHA (256/256 bits)) (Client did not present a certificate) by ozlabs.org (Postfix) with ESMTPS id 978D42C00FA for ; Tue, 3 Jul 2012 18:21:30 +1000 (EST) Received: from localhost ([::1]:41098 helo=lists.gnu.org) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SlyMP-0003sw-Rd for incoming@patchwork.ozlabs.org; Tue, 03 Jul 2012 04:21:25 -0400 Received: from eggs.gnu.org ([208.118.235.92]:47528) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SlyMD-0003sg-B4 for qemu-devel@nongnu.org; Tue, 03 Jul 2012 04:21:19 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1SlyM9-0002TO-AP for qemu-devel@nongnu.org; Tue, 03 Jul 2012 04:21:12 -0400 Received: from mx1.redhat.com ([209.132.183.28]:3073) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1SlyM9-0002Sw-2o for qemu-devel@nongnu.org; Tue, 03 Jul 2012 04:21:09 -0400 Received: from int-mx01.intmail.prod.int.phx2.redhat.com (int-mx01.intmail.prod.int.phx2.redhat.com [10.5.11.11]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id q638L8n4010352 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK); Tue, 3 Jul 2012 04:21:08 -0400 Received: from rincewind.home.kraxel.org (ovpn-116-31.ams2.redhat.com [10.36.116.31]) by int-mx01.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id q638L6DO028584; Tue, 3 Jul 2012 04:21:06 -0400 Message-ID: <4FF2AB70.5080307@redhat.com> Date: Tue, 03 Jul 2012 10:21:04 +0200 From: Gerd Hoffmann User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:10.0.5) Gecko/20120601 Thunderbird/10.0.5 MIME-Version: 1.0 To: Jan Kiszka References: <1341245761-30942-1-git-send-email-kraxel@redhat.com> <4FF2A379.7040403@siemens.com> In-Reply-To: <4FF2A379.7040403@siemens.com> X-Enigmail-Version: 1.4 X-Scanned-By: MIMEDefang 2.67 on 10.5.11.11 X-detected-operating-system: by eggs.gnu.org: Genre and OS details not recognized. X-Received-From: 209.132.183.28 Cc: "erik.rull@rdsoftware.de" , "qemu-devel@nongnu.org" Subject: Re: [Qemu-devel] [PATCH] usb: selective endpoint initialization 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 On 07/03/12 09:47, Jan Kiszka wrote: > On 2012-07-02 18:16, Gerd Hoffmann wrote: >> Add support for (re-)initializing endpoints which belong to a specific >> interface only. Use this in usb-host when changing altsetting for an >> interface, so other interfaces are not disturbed. >> > > qemu-system-x86_64: /data/qemu/hw/usb/host-linux.c:1220: > usb_linux_update_endp_table: Assertion `usb_ep_get_type(&s->dev, pid, > ep) == 255' failed. > > Do you need a trace again? Don't think so. Alternative fix attached. > Interface Descriptor: > bInterfaceNumber 3 > bInterfaceClass 3 Human Interface Device This interface is the one the packet comes from, guess the headset has some button(s) which this HID interface is intended for. cheers, Gerd From 7d00f8996f7981bb118b6986813ce407b31f2b70 Mon Sep 17 00:00:00 2001 From: Gerd Hoffmann Date: Tue, 3 Jul 2012 10:11:21 +0200 Subject: [PATCH] usb: split endpoint init and reset Create a new usb_ep_reset() function to reset endpoint state, without re-initialiting the queues, so we don't unlink in-flight packets just because usb-host has to re-parse the descriptor tables. Signed-off-by: Gerd Hoffmann --- hw/usb.h | 1 + hw/usb/core.c | 13 +++++++++++-- hw/usb/host-linux.c | 5 +++-- 3 files changed, 15 insertions(+), 4 deletions(-) diff --git a/hw/usb.h b/hw/usb.h index a5623d3..9cd2f89 100644 --- a/hw/usb.h +++ b/hw/usb.h @@ -363,6 +363,7 @@ void usb_packet_complete(USBDevice *dev, USBPacket *p); void usb_cancel_packet(USBPacket * p); void usb_ep_init(USBDevice *dev); +void usb_ep_reset(USBDevice *dev); void usb_ep_dump(USBDevice *dev); struct USBEndpoint *usb_ep_get(USBDevice *dev, int pid, int ep); uint8_t usb_ep_get_type(USBDevice *dev, int pid, int ep); diff --git a/hw/usb/core.c b/hw/usb/core.c index 0e02da7..fe15be0 100644 --- a/hw/usb/core.c +++ b/hw/usb/core.c @@ -550,7 +550,7 @@ void usb_packet_cleanup(USBPacket *p) qemu_iovec_destroy(&p->iov); } -void usb_ep_init(USBDevice *dev) +void usb_ep_reset(USBDevice *dev) { int ep; @@ -559,7 +559,6 @@ void usb_ep_init(USBDevice *dev) dev->ep_ctl.ifnum = 0; dev->ep_ctl.dev = dev; dev->ep_ctl.pipeline = false; - QTAILQ_INIT(&dev->ep_ctl.queue); for (ep = 0; ep < USB_MAX_ENDPOINTS; ep++) { dev->ep_in[ep].nr = ep + 1; dev->ep_out[ep].nr = ep + 1; @@ -573,6 +572,16 @@ void usb_ep_init(USBDevice *dev) dev->ep_out[ep].dev = dev; dev->ep_in[ep].pipeline = false; dev->ep_out[ep].pipeline = false; + } +} + +void usb_ep_init(USBDevice *dev) +{ + int ep; + + usb_ep_reset(dev); + QTAILQ_INIT(&dev->ep_ctl.queue); + for (ep = 0; ep < USB_MAX_ENDPOINTS; ep++) { QTAILQ_INIT(&dev->ep_in[ep].queue); QTAILQ_INIT(&dev->ep_out[ep].queue); } diff --git a/hw/usb/host-linux.c b/hw/usb/host-linux.c index 5479fb5..9ba8925 100644 --- a/hw/usb/host-linux.c +++ b/hw/usb/host-linux.c @@ -1136,7 +1136,7 @@ static int usb_linux_update_endp_table(USBHostDevice *s) USBDescriptor *d; bool active = false; - usb_ep_init(&s->dev); + usb_ep_reset(&s->dev); for (i = 0;; i += d->bLength) { if (i+2 >= s->descr_len) { @@ -1239,7 +1239,7 @@ static int usb_linux_update_endp_table(USBHostDevice *s) return 0; error: - usb_ep_init(&s->dev); + usb_ep_reset(&s->dev); return 1; } @@ -1326,6 +1326,7 @@ static int usb_host_open(USBHostDevice *dev, int bus_num, goto fail; } + usb_ep_init(&dev->dev); ret = usb_linux_update_endp_table(dev); if (ret) { goto fail;