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