[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[PULL 1/5] usb-host: remove 'remote wakeup' flag from configuration desc
From: |
Gerd Hoffmann |
Subject: |
[PULL 1/5] usb-host: remove 'remote wakeup' flag from configuration descriptor |
Date: |
Mon, 13 Jan 2020 14:06:42 +0100 |
From: Yuri Benditovich <address@hidden>
If the redirected device has this capability, Windows guest may
place the device into D2 and expect it to wake when the device
becomes active, but this will never happen. For example, when
internal Bluetooth adapter is redirected, keyboards and mice
connected to it do not work. Current commit removes this
capability (starting from machine 5.0)
Set 'usb-host.suppress-remote-wake' property to 'off' to keep
'remote wake' as is or to 'on' to remove 'remote wake' on
4.2 or earlier.
Signed-off-by: Yuri Benditovich <address@hidden>
Message-id: address@hidden
Signed-off-by: Gerd Hoffmann <address@hidden>
---
hw/core/machine.c | 1 +
hw/usb/host-libusb.c | 20 ++++++++++++++++++++
hw/usb/trace-events | 1 +
3 files changed, 22 insertions(+)
diff --git a/hw/core/machine.c b/hw/core/machine.c
index 4f30fb56463c..c5d32f56db93 100644
--- a/hw/core/machine.c
+++ b/hw/core/machine.c
@@ -32,6 +32,7 @@ GlobalProperty hw_compat_4_2[] = {
{ "virtio-blk-device", "seg-max-adjust", "off"},
{ "virtio-scsi-device", "seg_max_adjust", "off"},
{ "vhost-blk-device", "seg_max_adjust", "off"},
+ { "usb-host", "suppress-remote-wake", "off" },
};
const size_t hw_compat_4_2_len = G_N_ELEMENTS(hw_compat_4_2);
diff --git a/hw/usb/host-libusb.c b/hw/usb/host-libusb.c
index fcf48c019333..00e0e3636978 100644
--- a/hw/usb/host-libusb.c
+++ b/hw/usb/host-libusb.c
@@ -88,6 +88,7 @@ struct USBHostDevice {
bool needs_autoscan;
bool allow_one_guest_reset;
bool allow_all_guest_resets;
+ bool suppress_remote_wake;
/* state */
QTAILQ_ENTRY(USBHostDevice) next;
@@ -386,6 +387,8 @@ static void LIBUSB_CALL usb_host_req_complete_ctrl(struct
libusb_transfer *xfer)
r->p->status = status_map[xfer->status];
r->p->actual_length = xfer->actual_length;
if (r->in && xfer->actual_length) {
+ USBDevice *udev = USB_DEVICE(s);
+ struct libusb_config_descriptor *conf = (void *)r->cbuf;
memcpy(r->cbuf, r->buffer + 8, xfer->actual_length);
/* Fix up USB-3 ep0 maxpacket size to allow superspeed connected
devices
@@ -394,6 +397,21 @@ static void LIBUSB_CALL usb_host_req_complete_ctrl(struct
libusb_transfer *xfer)
r->cbuf[7] == 9) {
r->cbuf[7] = 64;
}
+ /*
+ *If this is GET_DESCRIPTOR request for configuration descriptor,
+ * remove 'remote wakeup' flag from it to prevent idle power down
+ * in Windows guest
+ */
+ if (s->suppress_remote_wake &&
+ udev->setup_buf[0] == USB_DIR_IN &&
+ udev->setup_buf[1] == USB_REQ_GET_DESCRIPTOR &&
+ udev->setup_buf[3] == USB_DT_CONFIG && udev->setup_buf[2] == 0 &&
+ xfer->actual_length >
+ offsetof(struct libusb_config_descriptor, bmAttributes) &&
+ (conf->bmAttributes & USB_CFG_ATT_WAKEUP)) {
+ trace_usb_host_remote_wakeup_removed(s->bus_num, s->addr);
+ conf->bmAttributes &= ~USB_CFG_ATT_WAKEUP;
+ }
}
trace_usb_host_req_complete(s->bus_num, s->addr, r->p,
r->p->status, r->p->actual_length);
@@ -1596,6 +1614,8 @@ static Property usb_host_dev_properties[] = {
LIBUSB_LOG_LEVEL_WARNING),
DEFINE_PROP_BIT("pipeline", USBHostDevice, options,
USB_HOST_OPT_PIPELINE, true),
+ DEFINE_PROP_BOOL("suppress-remote-wake", USBHostDevice,
+ suppress_remote_wake, true),
DEFINE_PROP_END_OF_LIST(),
};
diff --git a/hw/usb/trace-events b/hw/usb/trace-events
index 2d3713351c38..1c24d82c09c0 100644
--- a/hw/usb/trace-events
+++ b/hw/usb/trace-events
@@ -266,3 +266,4 @@ usb_host_parse_config(int bus, int addr, int value, int
active) "dev %d:%d, valu
usb_host_parse_interface(int bus, int addr, int num, int alt, int active) "dev
%d:%d, num %d, alt %d, active %d"
usb_host_parse_endpoint(int bus, int addr, int ep, const char *dir, const char
*type, int active) "dev %d:%d, ep %d, %s, %s, active %d"
usb_host_parse_error(int bus, int addr, const char *errmsg) "dev %d:%d, msg %s"
+usb_host_remote_wakeup_removed(int bus, int addr) "dev %d:%d"
--
2.18.1
- [PULL 0/5] Usb 20200113 patches, Gerd Hoffmann, 2020/01/13
- [PULL 1/5] usb-host: remove 'remote wakeup' flag from configuration descriptor,
Gerd Hoffmann <=
- [PULL 5/5] xhci: recheck slot status, Gerd Hoffmann, 2020/01/13
- [PULL 3/5] usbredir: Prevent recursion in usbredir_write, Gerd Hoffmann, 2020/01/13
- [PULL 2/5] usb-redir: remove 'remote wakeup' flag from configuration descriptor, Gerd Hoffmann, 2020/01/13
- [PULL 4/5] xhci: Fix memory leak in xhci_kick_epctx when poweroff GuestOS, Gerd Hoffmann, 2020/01/13
- Re: [PULL 0/5] Usb 20200113 patches, Peter Maydell, 2020/01/13