From: Jan Kiszka <jan.kis...@siemens.com> 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 <jan.kis...@siemens.com> --- 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