diff options
author | Gerd Hoffmann <kraxel@redhat.com> | 2011-05-16 09:13:05 +0200 |
---|---|---|
committer | Gerd Hoffmann <kraxel@redhat.com> | 2011-05-26 11:55:02 +0200 |
commit | 7a8fc83f3469188ef03ea0c1ac9d2ff0dcc36637 (patch) | |
tree | 26b3d50032c204db2a3ad0b8d5e80e3f19af1be3 | |
parent | 9056a2972a9e935198e518c37365513a199ae3d0 (diff) |
usb-linux: track aurbs in list
This patch adds code to track all async urbs in a linked list,
so we can find them without having to pass around a opaque
pointer to them. Prerequisite for the cleanups.
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
-rw-r--r-- | usb-linux.c | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/usb-linux.c b/usb-linux.c index 55d914d391..3213215eec 100644 --- a/usb-linux.c +++ b/usb-linux.c @@ -121,6 +121,7 @@ typedef struct USBHostDevice { Notifier exit; struct endp_data endp_table[MAX_ENDPOINTS]; + QLIST_HEAD(, AsyncURB) aurbs; /* Host side address */ int bus_num; @@ -223,22 +224,27 @@ struct AsyncURB { struct usbdevfs_urb urb; struct usbdevfs_iso_packet_desc isocpd[ISO_FRAME_DESC_PER_URB]; + USBHostDevice *hdev; + QLIST_ENTRY(AsyncURB) next; /* For regular async urbs */ USBPacket *packet; - USBHostDevice *hdev; /* For buffered iso handling */ int iso_frame_idx; /* -1 means in flight */ }; -static AsyncURB *async_alloc(void) +static AsyncURB *async_alloc(USBHostDevice *s) { - return (AsyncURB *) qemu_mallocz(sizeof(AsyncURB)); + AsyncURB *aurb = qemu_mallocz(sizeof(AsyncURB)); + aurb->hdev = s; + QLIST_INSERT_HEAD(&s->aurbs, aurb, next); + return aurb; } static void async_free(AsyncURB *aurb) { + QLIST_REMOVE(aurb, next); qemu_free(aurb); } @@ -661,8 +667,7 @@ static int usb_host_handle_data(USBDevice *dev, USBPacket *p) return usb_host_handle_iso_data(s, p, p->pid == USB_TOKEN_IN); } - aurb = async_alloc(); - aurb->hdev = s; + aurb = async_alloc(s); aurb->packet = p; urb = &aurb->urb; @@ -787,8 +792,7 @@ static int usb_host_handle_control(USBDevice *dev, USBPacket *p, return USB_RET_STALL; } - aurb = async_alloc(); - aurb->hdev = s; + aurb = async_alloc(s); aurb->packet = p; /* |