From mboxrd@z Thu Jan 1 00:00:00 1970 Received: from eggs.gnu.org ([208.118.235.92]:60546) by lists.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TCvD1-0001Be-Uo for qemu-devel@nongnu.org; Sat, 15 Sep 2012 12:27:08 -0400 Received: from Debian-exim by eggs.gnu.org with spam-scanned (Exim 4.71) (envelope-from ) id 1TCvD0-0004n4-OA for qemu-devel@nongnu.org; Sat, 15 Sep 2012 12:27:07 -0400 Received: from mout.web.de ([212.227.15.4]:65293) by eggs.gnu.org with esmtp (Exim 4.71) (envelope-from ) id 1TCvD0-0004mv-Er for qemu-devel@nongnu.org; Sat, 15 Sep 2012 12:27:06 -0400 Message-ID: <5054AC57.205@web.de> Date: Sat, 15 Sep 2012 18:27:03 +0200 From: Jan Kiszka MIME-Version: 1.0 Content-Type: text/plain; charset=ISO-8859-1 Content-Transfer-Encoding: 7bit Subject: [Qemu-devel] [PATCH] usb-redir: Allow to attach USB 2.0 devices to 1.1 host controller List-Id: List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , To: qemu-devel Cc: Hans de Goede , Gerd Hoffmann From: Jan Kiszka This follows the logic of host-linux: If a 2.0 device has no ISO endpoint and no interrupt endpoint with a packet size > 64, we can attach it also to an 1.1 host controller. In case the redir server does not report endpoint sizes, play safe and remove the 1.1 compatibility as well. Signed-off-by: Jan Kiszka --- hw/usb/redirect.c | 10 ++++++++++ 1 files changed, 10 insertions(+), 0 deletions(-) diff --git a/hw/usb/redirect.c b/hw/usb/redirect.c index 5301a69..bc36e53 100644 --- a/hw/usb/redirect.c +++ b/hw/usb/redirect.c @@ -1098,6 +1098,9 @@ static void usbredir_device_connect(void *priv, } dev->dev.speedmask = (1 << dev->dev.speed); + if (dev->dev.speed == USB_SPEED_HIGH) { + dev->dev.speedmask |= USB_SPEED_MASK_FULL; + } dev->device_info = *device_connect; if (usbredir_check_filter(dev)) { @@ -1172,7 +1175,14 @@ static void usbredir_ep_info(void *priv, case usb_redir_type_invalid: break; case usb_redir_type_iso: + dev->dev.speedmask &= ~USB_SPEED_MASK_FULL; + /* Fall through */ case usb_redir_type_interrupt: + if (!usbredirparser_peer_has_cap(dev->parser, + usb_redir_cap_ep_info_max_packet_size) || + ep_info->max_packet_size[i] > 64) { + dev->dev.speedmask &= ~USB_SPEED_MASK_FULL; + } if (dev->endpoint[i].interval == 0) { ERROR("Received 0 interval for isoc or irq endpoint\n"); usbredir_device_disconnect(dev); -- 1.7.3.4