Revision 95a59dc0 hw/usb/redirect.c

b/hw/usb/redirect.c
1071 1071
    udev->auto_attach = 0;
1072 1072

  
1073 1073
    /* Will be cleared during setup when we find conflicts */
1074
    dev->compatible_speedmask = USB_SPEED_MASK_FULL;
1074
    dev->compatible_speedmask = USB_SPEED_MASK_FULL | USB_SPEED_MASK_HIGH;
1075 1075

  
1076 1076
    /* Let the backend know we are ready */
1077 1077
    qemu_chr_fe_open(dev->cs);
......
1214 1214
        speed = "low speed";
1215 1215
        dev->dev.speed = USB_SPEED_LOW;
1216 1216
        dev->compatible_speedmask &= ~USB_SPEED_MASK_FULL;
1217
        dev->compatible_speedmask &= ~USB_SPEED_MASK_HIGH;
1217 1218
        break;
1218 1219
    case usb_redir_speed_full:
1219 1220
        speed = "full speed";
1220 1221
        dev->dev.speed = USB_SPEED_FULL;
1222
        dev->compatible_speedmask &= ~USB_SPEED_MASK_HIGH;
1221 1223
        break;
1222 1224
    case usb_redir_speed_high:
1223 1225
        speed = "high speed";
......
1287 1289
    dev->interface_info.interface_count = NO_INTERFACE_INFO;
1288 1290
    dev->dev.addr = 0;
1289 1291
    dev->dev.speed = 0;
1290
    dev->compatible_speedmask = USB_SPEED_MASK_FULL;
1292
    dev->compatible_speedmask = USB_SPEED_MASK_FULL | USB_SPEED_MASK_HIGH;
1291 1293
}
1292 1294

  
1293 1295
static void usbredir_interface_info(void *priv,
......
1364 1366
            break;
1365 1367
        case usb_redir_type_iso:
1366 1368
            usbredir_mark_speed_incompatible(dev, USB_SPEED_FULL);
1369
            usbredir_mark_speed_incompatible(dev, USB_SPEED_HIGH);
1367 1370
            /* Fall through */
1368 1371
        case usb_redir_type_interrupt:
1369 1372
            if (!usbredirparser_peer_has_cap(dev->parser,
......
1371 1374
                    ep_info->max_packet_size[i] > 64) {
1372 1375
                usbredir_mark_speed_incompatible(dev, USB_SPEED_FULL);
1373 1376
            }
1377
            if (!usbredirparser_peer_has_cap(dev->parser,
1378
                                     usb_redir_cap_ep_info_max_packet_size) ||
1379
                    ep_info->max_packet_size[i] > 1024) {
1380
                usbredir_mark_speed_incompatible(dev, USB_SPEED_HIGH);
1381
            }
1374 1382
            if (dev->endpoint[i].interval == 0) {
1375 1383
                ERROR("Received 0 interval for isoc or irq endpoint\n");
1376 1384
                usbredir_reject_device(dev);
......
1501 1509
    DPRINTF("ctrl-in status %d len %d id %"PRIu64"\n", control_packet->status,
1502 1510
            len, id);
1503 1511

  
1512
    /* Fix up USB-3 ep0 maxpacket size to allow superspeed connected devices
1513
     * to work redirected to a not superspeed capable hcd */
1514
    if (dev->dev.speed == USB_SPEED_SUPER &&
1515
            !((dev->dev.port->speedmask & USB_SPEED_MASK_SUPER)) &&
1516
            control_packet->requesttype == 0x80 &&
1517
            control_packet->request == 6 &&
1518
            control_packet->value == 0x100 && control_packet->index == 0 &&
1519
            data_len >= 18 && data[7] == 9) {
1520
        data[7] = 64;
1521
    }
1522

  
1504 1523
    p = usbredir_find_packet_by_id(dev, 0, id);
1505 1524
    if (p) {
1506 1525
        len = usbredir_handle_status(dev, control_packet->status, len);

Also available in: Unified diff