diff options
author | Jason Andryuk <jandryuk@gmail.com> | 2020-03-06 09:09:17 -0500 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2020-03-09 11:06:36 +0100 |
commit | 5843b6b35250139d91220ac3b75d467703e345b3 (patch) | |
tree | 4126abeda924df6191c5911fbcfe6977f36b304b /hw/usb | |
parent | 67f17e23baca5dd545fe98b01169cc351a70fe35 (diff) | |
download | qemu-5843b6b35250139d91220ac3b75d467703e345b3.zip qemu-5843b6b35250139d91220ac3b75d467703e345b3.tar.gz qemu-5843b6b35250139d91220ac3b75d467703e345b3.tar.bz2 |
usb-serial: wakeup device on input
Currently usb-serial devices are unable to send data into guests with
the xhci controller. Data is copied into the usb-serial's buffer, but
it is not sent into the guest. Data coming out of the guest works
properly. usb-serial devices work properly with ehci.
Have usb-serial call usb_wakeup() when receiving data from the chardev.
This seems to notify the xhci controller and fix inbound data flow.
Also add USB_CFG_ATT_WAKEUP to the device's bmAttributes. This matches
a real FTDI serial adapter's bmAttributes.
Signed-off-by: Jason Andryuk <jandryuk@gmail.com>
Message-id: 20200306140917.26726-1-jandryuk@gmail.com
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Diffstat (limited to 'hw/usb')
-rw-r--r-- | hw/usb/dev-serial.c | 6 |
1 files changed, 5 insertions, 1 deletions
diff --git a/hw/usb/dev-serial.c b/hw/usb/dev-serial.c index 9846599..daac75b 100644 --- a/hw/usb/dev-serial.c +++ b/hw/usb/dev-serial.c @@ -98,6 +98,7 @@ do { printf("usb-serial: " fmt , ## __VA_ARGS__); } while (0) typedef struct { USBDevice dev; + USBEndpoint *intr; uint8_t recv_buf[RECV_BUF]; uint16_t recv_ptr; uint16_t recv_used; @@ -153,7 +154,7 @@ static const USBDescDevice desc_device = { { .bNumInterfaces = 1, .bConfigurationValue = 1, - .bmAttributes = USB_CFG_ATT_ONE, + .bmAttributes = USB_CFG_ATT_ONE | USB_CFG_ATT_WAKEUP, .bMaxPower = 50, .nif = 1, .ifs = &desc_iface0, @@ -459,6 +460,8 @@ static void usb_serial_read(void *opaque, const uint8_t *buf, int size) memcpy(s->recv_buf + start, buf, size); } s->recv_used += size; + + usb_wakeup(s->intr, 0); } static void usb_serial_event(void *opaque, QEMUChrEvent event) @@ -513,6 +516,7 @@ static void usb_serial_realize(USBDevice *dev, Error **errp) if (qemu_chr_fe_backend_open(&s->cs) && !dev->attached) { usb_device_attach(dev, &error_abort); } + s->intr = usb_ep_get(dev, USB_TOKEN_IN, 1); } static USBDevice *usb_braille_init(USBBus *bus, const char *unused) |