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>
This commit is contained in:
parent
67f17e23ba
commit
5843b6b352
|
@ -98,6 +98,7 @@ do { printf("usb-serial: " fmt , ## __VA_ARGS__); } while (0)
|
||||||
|
|
||||||
typedef struct {
|
typedef struct {
|
||||||
USBDevice dev;
|
USBDevice dev;
|
||||||
|
USBEndpoint *intr;
|
||||||
uint8_t recv_buf[RECV_BUF];
|
uint8_t recv_buf[RECV_BUF];
|
||||||
uint16_t recv_ptr;
|
uint16_t recv_ptr;
|
||||||
uint16_t recv_used;
|
uint16_t recv_used;
|
||||||
|
@ -153,7 +154,7 @@ static const USBDescDevice desc_device = {
|
||||||
{
|
{
|
||||||
.bNumInterfaces = 1,
|
.bNumInterfaces = 1,
|
||||||
.bConfigurationValue = 1,
|
.bConfigurationValue = 1,
|
||||||
.bmAttributes = USB_CFG_ATT_ONE,
|
.bmAttributes = USB_CFG_ATT_ONE | USB_CFG_ATT_WAKEUP,
|
||||||
.bMaxPower = 50,
|
.bMaxPower = 50,
|
||||||
.nif = 1,
|
.nif = 1,
|
||||||
.ifs = &desc_iface0,
|
.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);
|
memcpy(s->recv_buf + start, buf, size);
|
||||||
}
|
}
|
||||||
s->recv_used += size;
|
s->recv_used += size;
|
||||||
|
|
||||||
|
usb_wakeup(s->intr, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
static void usb_serial_event(void *opaque, QEMUChrEvent event)
|
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) {
|
if (qemu_chr_fe_backend_open(&s->cs) && !dev->attached) {
|
||||||
usb_device_attach(dev, &error_abort);
|
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)
|
static USBDevice *usb_braille_init(USBBus *bus, const char *unused)
|
||||||
|
|
Loading…
Reference in a new issue