提交 d5c42857 编写于 作者: H Hans de Goede 提交者: Gerd Hoffmann

usb-redir: allocate buffers before waking up the host adapter

Needed to make sure usb redirection is prepared to actually handle the
callback from the usb host adapter.  Without this interrupt endpoints
don't work on xhci.

Note: On ehci the usb_wakeup() call only schedules a BH for the actual
work, which hides this bug because the allocation happens before ehci
calls back even without this patch.
Signed-off-by: NHans de Goede <hdegoede@redhat.com>
Message-id: 1476096313-7730-1-git-send-email-kraxel@redhat.com
Signed-off-by: NGerd Hoffmann <kraxel@redhat.com>
上级 6998b6c7
...@@ -2036,18 +2036,22 @@ static void usbredir_interrupt_packet(void *priv, uint64_t id, ...@@ -2036,18 +2036,22 @@ static void usbredir_interrupt_packet(void *priv, uint64_t id,
} }
if (ep & USB_DIR_IN) { if (ep & USB_DIR_IN) {
bool q_was_empty;
if (dev->endpoint[EP2I(ep)].interrupt_started == 0) { if (dev->endpoint[EP2I(ep)].interrupt_started == 0) {
DPRINTF("received int packet while not started ep %02X\n", ep); DPRINTF("received int packet while not started ep %02X\n", ep);
free(data); free(data);
return; return;
} }
if (QTAILQ_EMPTY(&dev->endpoint[EP2I(ep)].bufpq)) { q_was_empty = QTAILQ_EMPTY(&dev->endpoint[EP2I(ep)].bufpq);
usb_wakeup(usb_ep_get(&dev->dev, USB_TOKEN_IN, ep & 0x0f), 0);
}
/* bufp_alloc also adds the packet to the ep queue */ /* bufp_alloc also adds the packet to the ep queue */
bufp_alloc(dev, data, data_len, interrupt_packet->status, ep, data); bufp_alloc(dev, data, data_len, interrupt_packet->status, ep, data);
if (q_was_empty) {
usb_wakeup(usb_ep_get(&dev->dev, USB_TOKEN_IN, ep & 0x0f), 0);
}
} else { } else {
/* /*
* We report output interrupt packets as completed directly upon * We report output interrupt packets as completed directly upon
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册