mirror of
https://github.com/izzy2lost/xemu.git
synced 2026-07-06 00:20:22 -07:00
Merge remote-tracking branch 'kraxel/usb.90' into staging
# By Hans de Goede (6) and Gerd Hoffmann (1) # Via Gerd Hoffmann * kraxel/usb.90: usb: Fix iovec memleak on combined-packet free usb: Also reset max_packet_size on ep_reset xhci: Fix memory leak on xhci_disable_ep xhci: Add xhci_epid_to_usbep helper function xhci: Init a transfers xhci, slotid and epid member on epctx alloc xhci: Fix number of streams allocated when using streams usb: remove old usb-host code Message-id: 1379583298-7524-1-git-send-email-kraxel@redhat.com
This commit is contained in:
@@ -562,7 +562,6 @@ Haiku)
|
||||
audio_possible_drivers="oss alsa sdl esd pa"
|
||||
linux="yes"
|
||||
linux_user="yes"
|
||||
usb="linux"
|
||||
kvm="yes"
|
||||
vhost_net="yes"
|
||||
vhost_scsi="yes"
|
||||
@@ -575,9 +574,6 @@ esac
|
||||
|
||||
if [ "$bsd" = "yes" ] ; then
|
||||
if [ "$darwin" != "yes" ] ; then
|
||||
if [ "$targetos" != "FreeBSD" ]; then
|
||||
usb="bsd"
|
||||
fi
|
||||
bsd_user="yes"
|
||||
fi
|
||||
fi
|
||||
@@ -3126,7 +3122,6 @@ fi
|
||||
if test "$libusb" != "no" ; then
|
||||
if $pkg_config --atleast-version=1.0.13 libusb-1.0; then
|
||||
libusb="yes"
|
||||
usb="libusb"
|
||||
libusb_cflags=$($pkg_config --cflags libusb-1.0)
|
||||
libusb_libs=$($pkg_config --libs libusb-1.0)
|
||||
QEMU_CFLAGS="$QEMU_CFLAGS $libusb_cflags"
|
||||
@@ -4166,24 +4161,11 @@ if test "$virtio_blk_data_plane" = "yes" ; then
|
||||
fi
|
||||
|
||||
# USB host support
|
||||
case "$usb" in
|
||||
linux)
|
||||
echo "HOST_USB=linux legacy" >> $config_host_mak
|
||||
;;
|
||||
bsd)
|
||||
echo "HOST_USB=bsd" >> $config_host_mak
|
||||
;;
|
||||
libusb)
|
||||
if test "$linux" = "yes"; then
|
||||
echo "HOST_USB=libusb linux legacy" >> $config_host_mak
|
||||
else
|
||||
echo "HOST_USB=libusb legacy" >> $config_host_mak
|
||||
fi
|
||||
;;
|
||||
*)
|
||||
if test "$libusb" = "yes"; then
|
||||
echo "HOST_USB=libusb legacy" >> $config_host_mak
|
||||
else
|
||||
echo "HOST_USB=stub" >> $config_host_mak
|
||||
;;
|
||||
esac
|
||||
fi
|
||||
|
||||
# TPM passthrough support?
|
||||
if test "$tpm" = "yes"; then
|
||||
|
||||
@@ -39,6 +39,7 @@ static void usb_combined_packet_remove(USBCombinedPacket *combined,
|
||||
p->combined = NULL;
|
||||
QTAILQ_REMOVE(&combined->packets, p, combined_entry);
|
||||
if (QTAILQ_EMPTY(&combined->packets)) {
|
||||
qemu_iovec_destroy(&combined->iov);
|
||||
g_free(combined);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -622,6 +622,7 @@ void usb_ep_reset(USBDevice *dev)
|
||||
dev->ep_ctl.nr = 0;
|
||||
dev->ep_ctl.type = USB_ENDPOINT_XFER_CONTROL;
|
||||
dev->ep_ctl.ifnum = 0;
|
||||
dev->ep_ctl.max_packet_size = 64;
|
||||
dev->ep_ctl.dev = dev;
|
||||
dev->ep_ctl.pipeline = false;
|
||||
for (ep = 0; ep < USB_MAX_ENDPOINTS; ep++) {
|
||||
@@ -633,6 +634,8 @@ void usb_ep_reset(USBDevice *dev)
|
||||
dev->ep_out[ep].type = USB_ENDPOINT_XFER_INVALID;
|
||||
dev->ep_in[ep].ifnum = USB_INTERFACE_INVALID;
|
||||
dev->ep_out[ep].ifnum = USB_INTERFACE_INVALID;
|
||||
dev->ep_in[ep].max_packet_size = 0;
|
||||
dev->ep_out[ep].max_packet_size = 0;
|
||||
dev->ep_in[ep].dev = dev;
|
||||
dev->ep_out[ep].dev = dev;
|
||||
dev->ep_in[ep].pipeline = false;
|
||||
|
||||
+31
-14
@@ -509,6 +509,8 @@ static TRBCCode xhci_disable_ep(XHCIState *xhci, unsigned int slotid,
|
||||
unsigned int epid);
|
||||
static void xhci_event(XHCIState *xhci, XHCIEvent *event, int v);
|
||||
static void xhci_write_event(XHCIState *xhci, XHCIEvent *event, int v);
|
||||
static USBEndpoint *xhci_epid_to_usbep(XHCIState *xhci,
|
||||
unsigned int slotid, unsigned int epid);
|
||||
|
||||
static const char *TRBType_names[] = {
|
||||
[TRB_RESERVED] = "TRB_RESERVED",
|
||||
@@ -1138,7 +1140,7 @@ static void xhci_reset_streams(XHCIEPContext *epctx)
|
||||
static void xhci_alloc_streams(XHCIEPContext *epctx, dma_addr_t base)
|
||||
{
|
||||
assert(epctx->pstreams == NULL);
|
||||
epctx->nr_pstreams = 2 << epctx->max_pstreams;
|
||||
epctx->nr_pstreams = 2 << (epctx->max_pstreams + 1);
|
||||
epctx->pstreams = xhci_alloc_stream_contexts(epctx->nr_pstreams, base);
|
||||
}
|
||||
|
||||
@@ -1245,6 +1247,9 @@ static XHCIEPContext *xhci_alloc_epctx(XHCIState *xhci,
|
||||
epctx->epid = epid;
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(epctx->transfers); i++) {
|
||||
epctx->transfers[i].xhci = xhci;
|
||||
epctx->transfers[i].slotid = slotid;
|
||||
epctx->transfers[i].epid = epid;
|
||||
usb_packet_init(&epctx->transfers[i].packet);
|
||||
}
|
||||
epctx->kick_timer = timer_new_ns(QEMU_CLOCK_VIRTUAL, xhci_ep_kick_timer, epctx);
|
||||
@@ -1358,13 +1363,12 @@ static int xhci_ep_nuke_xfers(XHCIState *xhci, unsigned int slotid,
|
||||
|
||||
xferi = epctx->next_xfer;
|
||||
for (i = 0; i < TD_QUEUE; i++) {
|
||||
if (epctx->transfers[xferi].packet.ep) {
|
||||
ep = epctx->transfers[xferi].packet.ep;
|
||||
}
|
||||
killed += xhci_ep_nuke_one_xfer(&epctx->transfers[xferi]);
|
||||
epctx->transfers[xferi].packet.ep = NULL;
|
||||
xferi = (xferi + 1) % TD_QUEUE;
|
||||
}
|
||||
|
||||
ep = xhci_epid_to_usbep(xhci, slotid, epid);
|
||||
if (ep) {
|
||||
usb_device_ep_stopped(ep->dev, ep);
|
||||
}
|
||||
@@ -1376,6 +1380,7 @@ static TRBCCode xhci_disable_ep(XHCIState *xhci, unsigned int slotid,
|
||||
{
|
||||
XHCISlot *slot;
|
||||
XHCIEPContext *epctx;
|
||||
int i;
|
||||
|
||||
trace_usb_xhci_ep_disable(slotid, epid);
|
||||
assert(slotid >= 1 && slotid <= xhci->numslots);
|
||||
@@ -1396,6 +1401,10 @@ static TRBCCode xhci_disable_ep(XHCIState *xhci, unsigned int slotid,
|
||||
xhci_free_streams(epctx);
|
||||
}
|
||||
|
||||
for (i = 0; i < ARRAY_SIZE(epctx->transfers); i++) {
|
||||
usb_packet_cleanup(&epctx->transfers[i].packet);
|
||||
}
|
||||
|
||||
xhci_set_ep_state(xhci, epctx, NULL, EP_DISABLED);
|
||||
|
||||
timer_free(epctx->kick_timer);
|
||||
@@ -1696,7 +1705,6 @@ static int xhci_submit(XHCIState *xhci, XHCITransfer *xfer,
|
||||
static int xhci_setup_packet(XHCITransfer *xfer)
|
||||
{
|
||||
XHCIState *xhci = xfer->xhci;
|
||||
USBDevice *dev;
|
||||
USBEndpoint *ep;
|
||||
int dir;
|
||||
|
||||
@@ -1704,15 +1712,13 @@ static int xhci_setup_packet(XHCITransfer *xfer)
|
||||
|
||||
if (xfer->packet.ep) {
|
||||
ep = xfer->packet.ep;
|
||||
dev = ep->dev;
|
||||
} else {
|
||||
if (!xhci->slots[xfer->slotid-1].uport) {
|
||||
ep = xhci_epid_to_usbep(xhci, xfer->slotid, xfer->epid);
|
||||
if (!ep) {
|
||||
fprintf(stderr, "xhci: slot %d has no device\n",
|
||||
xfer->slotid);
|
||||
return -1;
|
||||
}
|
||||
dev = xhci->slots[xfer->slotid-1].uport->dev;
|
||||
ep = usb_ep_get(dev, dir, xfer->epid >> 1);
|
||||
}
|
||||
|
||||
xhci_xfer_create_sgl(xfer, dir == USB_TOKEN_IN); /* Also sets int_req */
|
||||
@@ -1720,7 +1726,7 @@ static int xhci_setup_packet(XHCITransfer *xfer)
|
||||
xfer->trbs[0].addr, false, xfer->int_req);
|
||||
usb_packet_map(&xfer->packet, &xfer->sgl);
|
||||
DPRINTF("xhci: setup packet pid 0x%x addr %d ep %d\n",
|
||||
xfer->packet.pid, dev->addr, ep->nr);
|
||||
xfer->packet.pid, ep->dev->addr, ep->nr);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@@ -2060,9 +2066,6 @@ static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid,
|
||||
for (i = 0; i < length; i++) {
|
||||
assert(xhci_ring_fetch(xhci, ring, &xfer->trbs[i], NULL));
|
||||
}
|
||||
xfer->xhci = xhci;
|
||||
xfer->epid = epid;
|
||||
xfer->slotid = slotid;
|
||||
xfer->streamid = streamid;
|
||||
|
||||
if (epid == 1) {
|
||||
@@ -2075,7 +2078,6 @@ static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid,
|
||||
} else {
|
||||
if (xhci_fire_transfer(xhci, xfer, epctx) >= 0) {
|
||||
epctx->next_xfer = (epctx->next_xfer + 1) % TD_QUEUE;
|
||||
ep = xfer->packet.ep;
|
||||
} else {
|
||||
if (!xfer->timed_xfer) {
|
||||
fprintf(stderr, "xhci: error firing data transfer\n");
|
||||
@@ -2092,6 +2094,8 @@ static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid,
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
ep = xhci_epid_to_usbep(xhci, slotid, epid);
|
||||
if (ep) {
|
||||
usb_device_flush_ep_queue(ep->dev, ep);
|
||||
}
|
||||
@@ -3321,6 +3325,19 @@ static int xhci_find_epid(USBEndpoint *ep)
|
||||
}
|
||||
}
|
||||
|
||||
static USBEndpoint *xhci_epid_to_usbep(XHCIState *xhci,
|
||||
unsigned int slotid, unsigned int epid)
|
||||
{
|
||||
assert(slotid >= 1 && slotid <= xhci->numslots);
|
||||
|
||||
if (!xhci->slots[slotid - 1].uport) {
|
||||
return NULL;
|
||||
}
|
||||
|
||||
return usb_ep_get(xhci->slots[slotid - 1].uport->dev,
|
||||
(epid & 1) ? USB_TOKEN_IN : USB_TOKEN_OUT, epid >> 1);
|
||||
}
|
||||
|
||||
static void xhci_wakeup_endpoint(USBBus *bus, USBEndpoint *ep,
|
||||
unsigned int stream)
|
||||
{
|
||||
|
||||
File diff suppressed because it is too large
Load Diff
-1911
File diff suppressed because it is too large
Load Diff
Reference in New Issue
Block a user