uhci: Move emptying of the queue's asyncs' queue to uhci_queue_free

Cleanup: all callers of uhci_queue_free first unconditionally cancel
all remaining asyncs in the queue, so lets move this to uhci_queue_free().

Signed-off-by: Hans de Goede <hdegoede@redhat.com>
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
This commit is contained in:
Hans de Goede 2012-10-24 18:31:09 +02:00 committed by Gerd Hoffmann
parent 3c87c76d1a
commit 4050737726

View file

@ -160,6 +160,8 @@ typedef struct UHCI_QH {
uint32_t el_link; uint32_t el_link;
} UHCI_QH; } UHCI_QH;
static void uhci_async_cancel(UHCIAsync *async);
static inline int32_t uhci_queue_token(UHCI_TD *td) static inline int32_t uhci_queue_token(UHCI_TD *td)
{ {
/* covers ep, dev, pid -> identifies the endpoint */ /* covers ep, dev, pid -> identifies the endpoint */
@ -189,6 +191,12 @@ static UHCIQueue *uhci_queue_get(UHCIState *s, UHCI_TD *td)
static void uhci_queue_free(UHCIQueue *queue) static void uhci_queue_free(UHCIQueue *queue)
{ {
UHCIState *s = queue->uhci; UHCIState *s = queue->uhci;
UHCIAsync *async;
while (!QTAILQ_EMPTY(&queue->asyncs)) {
async = QTAILQ_FIRST(&queue->asyncs);
uhci_async_cancel(async);
}
trace_usb_uhci_queue_del(queue->token); trace_usb_uhci_queue_del(queue->token);
QTAILQ_REMOVE(&s->queues, queue, next); QTAILQ_REMOVE(&s->queues, queue, next);
@ -259,17 +267,11 @@ static void uhci_async_validate_begin(UHCIState *s)
static void uhci_async_validate_end(UHCIState *s) static void uhci_async_validate_end(UHCIState *s)
{ {
UHCIQueue *queue, *n; UHCIQueue *queue, *n;
UHCIAsync *async;
QTAILQ_FOREACH_SAFE(queue, &s->queues, next, n) { QTAILQ_FOREACH_SAFE(queue, &s->queues, next, n) {
if (queue->valid > 0) { if (!queue->valid) {
continue; uhci_queue_free(queue);
} }
while (!QTAILQ_EMPTY(&queue->asyncs)) {
async = QTAILQ_FIRST(&queue->asyncs);
uhci_async_cancel(async);
}
uhci_queue_free(queue);
} }
} }
@ -292,12 +294,8 @@ static void uhci_async_cancel_device(UHCIState *s, USBDevice *dev)
static void uhci_async_cancel_all(UHCIState *s) static void uhci_async_cancel_all(UHCIState *s)
{ {
UHCIQueue *queue, *nq; UHCIQueue *queue, *nq;
UHCIAsync *curr, *n;
QTAILQ_FOREACH_SAFE(queue, &s->queues, next, nq) { QTAILQ_FOREACH_SAFE(queue, &s->queues, next, nq) {
QTAILQ_FOREACH_SAFE(curr, &queue->asyncs, next, n) {
uhci_async_cancel(curr);
}
uhci_queue_free(queue); uhci_queue_free(queue);
} }
} }