[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 11/18] usb-linux: walk async urb list in cancel
From: |
Gerd Hoffmann |
Subject: |
[Qemu-devel] [PATCH 11/18] usb-linux: walk async urb list in cancel |
Date: |
Mon, 16 May 2011 21:56:15 +0200 |
Lookup async urbs which are to be canceled using the linked list
instead of the direct opaque pointer. There are two reasons we
are doing that: First, to avoid the opaque poiner to the callback,
which is needed for upcoming cleanups. Second, because we might
need multiple urbs per request for highspeed support, so a single
opaque pointer doesn't cut it any more anyway.
Signed-off-by: Gerd Hoffmann <address@hidden>
---
usb-linux.c | 28 +++++++++++++++++-----------
1 files changed, 17 insertions(+), 11 deletions(-)
diff --git a/usb-linux.c b/usb-linux.c
index 3c5a248..b8f7705 100644
--- a/usb-linux.c
+++ b/usb-linux.c
@@ -315,19 +315,25 @@ static void async_complete(void *opaque)
}
}
-static void async_cancel(USBPacket *unused, void *opaque)
+static void async_cancel(USBPacket *p, void *opaque)
{
- AsyncURB *aurb = opaque;
- USBHostDevice *s = aurb->hdev;
+ USBHostDevice *s = opaque;
+ AsyncURB *aurb;
- DPRINTF("husb: async cancel. aurb %p\n", aurb);
+ QLIST_FOREACH(aurb, &s->aurbs, next) {
+ if (p != aurb->packet) {
+ continue;
+ }
- /* Mark it as dead (see async_complete above) */
- aurb->packet = NULL;
+ DPRINTF("husb: async cancel: packet %p, aurb %p\n", p, aurb);
- int r = ioctl(s->fd, USBDEVFS_DISCARDURB, aurb);
- if (r < 0) {
- DPRINTF("husb: async. discard urb failed errno %d\n", errno);
+ /* Mark it as dead (see async_complete above) */
+ aurb->packet = NULL;
+
+ int r = ioctl(s->fd, USBDEVFS_DISCARDURB, aurb);
+ if (r < 0) {
+ DPRINTF("husb: async. discard urb failed errno %d\n", errno);
+ }
}
}
@@ -696,7 +702,7 @@ static int usb_host_handle_data(USBDevice *dev, USBPacket
*p)
}
}
- usb_defer_packet(p, async_cancel, aurb);
+ usb_defer_packet(p, async_cancel, s);
return USB_RET_ASYNC;
}
@@ -828,7 +834,7 @@ static int usb_host_handle_control(USBDevice *dev,
USBPacket *p,
}
}
- usb_defer_packet(p, async_cancel, aurb);
+ usb_defer_packet(p, async_cancel, s);
return USB_RET_ASYNC;
}
--
1.7.1
- [Qemu-devel] [PATCH 00/18] usb patch queue: add usb 2.0, Gerd Hoffmann, 2011/05/16
- [Qemu-devel] [PATCH 06/18] usb: Pass the packet to the device's handle_control callback, Gerd Hoffmann, 2011/05/16
- [Qemu-devel] [PATCH 01/18] usb: Add Interface Association Descriptor descriptor type, Gerd Hoffmann, 2011/05/16
- [Qemu-devel] [PATCH 13/18] usb-linux: fix max_packet_size for highspeed., Gerd Hoffmann, 2011/05/16
- [Qemu-devel] [PATCH 03/18] usb: remove fallback to bNumInterfaces if no .nif, Gerd Hoffmann, 2011/05/16
- [Qemu-devel] [PATCH 09/18] usb-linux: add hostport property, Gerd Hoffmann, 2011/05/16
- [Qemu-devel] [PATCH 05/18] Bug #757654: UHCI fails to signal stall response patch, Gerd Hoffmann, 2011/05/16
- [Qemu-devel] [PATCH 10/18] usb-linux: track aurbs in list, Gerd Hoffmann, 2011/05/16
- [Qemu-devel] [PATCH 11/18] usb-linux: walk async urb list in cancel,
Gerd Hoffmann <=
- [Qemu-devel] [PATCH 14/18] usb: add usb_handle_packet, Gerd Hoffmann, 2011/05/16
- [Qemu-devel] [PATCH 02/18] usb: update config descriptors to identify number of interfaces, Gerd Hoffmann, 2011/05/16
- [Qemu-devel] [PATCH 12/18] usb-linux: split large xfers, Gerd Hoffmann, 2011/05/16
- [Qemu-devel] [PATCH 08/18] usb-linux: fix device path aka physical port handling, Gerd Hoffmann, 2011/05/16
- [Qemu-devel] [PATCH 04/18] usb: add support for "grouped" interfaces and the Interface Association Descriptor, Gerd Hoffmann, 2011/05/16
- [Qemu-devel] [PATCH 17/18] usb-storage: don't call usb_packet_complete twice, Gerd Hoffmann, 2011/05/16
- [Qemu-devel] [PATCH 07/18] usb-linux: use usb_generic_handle_packet(), Gerd Hoffmann, 2011/05/16