[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH for-1.2 08/11] ehci: add ehci_cancel_queue()
From: |
Gerd Hoffmann |
Subject: |
[Qemu-devel] [PATCH for-1.2 08/11] ehci: add ehci_cancel_queue() |
Date: |
Fri, 31 Aug 2012 16:19:19 +0200 |
Factor out function to cancel all packets of a queue.
No behavior change.
Signed-off-by: Gerd Hoffmann <address@hidden>
---
hw/usb/hcd-ehci.c | 30 ++++++++++++++++++++----------
1 files changed, 20 insertions(+), 10 deletions(-)
diff --git a/hw/usb/hcd-ehci.c b/hw/usb/hcd-ehci.c
index b6169ce..30e5e8f 100644
--- a/hw/usb/hcd-ehci.c
+++ b/hw/usb/hcd-ehci.c
@@ -766,15 +766,27 @@ static EHCIQueue *ehci_alloc_queue(EHCIState *ehci,
uint32_t addr, int async)
return q;
}
+static void ehci_cancel_queue(EHCIQueue *q)
+{
+ EHCIPacket *p;
+
+ p = QTAILQ_FIRST(&q->packets);
+ if (p == NULL) {
+ return;
+ }
+
+ trace_usb_ehci_queue_action(q, "cancel");
+ do {
+ ehci_free_packet(p);
+ } while ((p = QTAILQ_FIRST(&q->packets)) != NULL);
+}
+
static void ehci_free_queue(EHCIQueue *q)
{
EHCIQueueHead *head = q->async ? &q->ehci->aqueues : &q->ehci->pqueues;
- EHCIPacket *p;
trace_usb_ehci_queue_action(q, "free");
- while ((p = QTAILQ_FIRST(&q->packets)) != NULL) {
- ehci_free_packet(p);
- }
+ ehci_cancel_queue(q);
QTAILQ_REMOVE(head, q, next);
g_free(q);
}
@@ -1796,9 +1808,7 @@ static EHCIQueue *ehci_state_fetchqh(EHCIState *ehci, int
async)
if (q->dev != NULL && q->dev->addr != devaddr) {
if (!QTAILQ_EMPTY(&q->packets)) {
/* should not happen (guest bug) */
- while ((p = QTAILQ_FIRST(&q->packets)) != NULL) {
- ehci_free_packet(p);
- }
+ ehci_cancel_queue(q);
}
q->dev = NULL;
}
@@ -1959,10 +1969,10 @@ static int ehci_state_fetchqtd(EHCIQueue *q)
ehci_trace_qtd(q, NLPTR_GET(q->qtdaddr), &qtd);
p = QTAILQ_FIRST(&q->packets);
- while (p != NULL && p->qtdaddr != q->qtdaddr) {
+ if (p != NULL && p->qtdaddr != q->qtdaddr) {
/* should not happen (guest bug) */
- ehci_free_packet(p);
- p = QTAILQ_FIRST(&q->packets);
+ ehci_cancel_queue(q);
+ p = NULL;
}
if (p != NULL) {
ehci_qh_do_overlay(q);
--
1.7.1
- [Qemu-devel] [PULL for-1.2 00/11] usb patch queue, Gerd Hoffmann, 2012/08/31
- [Qemu-devel] [PATCH for-1.2 10/11] ehci: Fix interrupt endpoints no longer working, Gerd Hoffmann, 2012/08/31
- [Qemu-devel] [PATCH for-1.2 03/11] usb: unique packet ids, Gerd Hoffmann, 2012/08/31
- [Qemu-devel] [PATCH for-1.2 07/11] ehci: simplify ehci_state_executing, Gerd Hoffmann, 2012/08/31
- [Qemu-devel] [PATCH for-1.2 04/11] ehci: Fix NULL ptr deref when unplugging an USB dev with an iso stream active, Gerd Hoffmann, 2012/08/31
- [Qemu-devel] [PATCH for-1.2 05/11] ehci: Schedule async-bh when IAAD bit gets set, Gerd Hoffmann, 2012/08/31
- [Qemu-devel] [PATCH for-1.2 09/11] ehci: handle TD deactivation of inflight packets, Gerd Hoffmann, 2012/08/31
- [Qemu-devel] [PATCH for-1.2 11/11] uas: move transfer kickoff, Gerd Hoffmann, 2012/08/31
- [Qemu-devel] [PATCH for-1.2 06/11] ehci: Remove unnecessary ehci_flush_qh call, Gerd Hoffmann, 2012/08/31
- [Qemu-devel] [PATCH for-1.2 08/11] ehci: add ehci_cancel_queue(),
Gerd Hoffmann <=
- [Qemu-devel] [PATCH for-1.2 02/11] usb: Halt ep queue en cancel pending packets on a packet error, Gerd Hoffmann, 2012/08/31
- [Qemu-devel] [PATCH for-1.2 01/11] fix info qtree indention, Gerd Hoffmann, 2012/08/31