[Top][All Lists]
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[Qemu-devel] [PATCH 09/14] uhci: switch to QTAILQ
From: |
Gerd Hoffmann |
Subject: |
[Qemu-devel] [PATCH 09/14] uhci: switch to QTAILQ |
Date: |
Wed, 4 May 2011 17:41:43 +0200 |
Signed-off-by: Gerd Hoffmann <address@hidden>
---
hw/usb-uhci.c | 63 +++++++++++++-------------------------------------------
1 files changed, 15 insertions(+), 48 deletions(-)
diff --git a/hw/usb-uhci.c b/hw/usb-uhci.c
index 346db3e..2de0cf2 100644
--- a/hw/usb-uhci.c
+++ b/hw/usb-uhci.c
@@ -113,7 +113,7 @@ static void dump_data(const uint8_t *data, int len) {}
*/
typedef struct UHCIAsync {
USBPacket packet;
- struct UHCIAsync *next;
+ QTAILQ_ENTRY(UHCIAsync) next;
uint32_t td;
uint32_t token;
int8_t valid;
@@ -145,8 +145,7 @@ typedef struct UHCIState {
uint32_t pending_int_mask;
/* Active packets */
- UHCIAsync *async_pending;
- UHCIAsync *async_pool;
+ QTAILQ_HEAD(,UHCIAsync) async_pending;
uint8_t num_ports_vmstate;
} UHCIState;
@@ -172,7 +171,6 @@ static UHCIAsync *uhci_async_alloc(UHCIState *s)
async->token = 0;
async->done = 0;
async->isoc = 0;
- async->next = NULL;
return async;
}
@@ -184,24 +182,12 @@ static void uhci_async_free(UHCIState *s, UHCIAsync
*async)
static void uhci_async_link(UHCIState *s, UHCIAsync *async)
{
- async->next = s->async_pending;
- s->async_pending = async;
+ QTAILQ_INSERT_HEAD(&s->async_pending, async, next);
}
static void uhci_async_unlink(UHCIState *s, UHCIAsync *async)
{
- UHCIAsync *curr = s->async_pending;
- UHCIAsync **prev = &s->async_pending;
-
- while (curr) {
- if (curr == async) {
- *prev = curr->next;
- return;
- }
-
- prev = &curr->next;
- curr = curr->next;
- }
+ QTAILQ_REMOVE(&s->async_pending, async, next);
}
static void uhci_async_cancel(UHCIState *s, UHCIAsync *async)
@@ -220,11 +206,10 @@ static void uhci_async_cancel(UHCIState *s, UHCIAsync
*async)
*/
static UHCIAsync *uhci_async_validate_begin(UHCIState *s)
{
- UHCIAsync *async = s->async_pending;
+ UHCIAsync *async;
- while (async) {
+ QTAILQ_FOREACH(async, &s->async_pending, next) {
async->valid--;
- async = async->next;
}
return NULL;
}
@@ -234,47 +219,30 @@ static UHCIAsync *uhci_async_validate_begin(UHCIState *s)
*/
static void uhci_async_validate_end(UHCIState *s)
{
- UHCIAsync *curr = s->async_pending;
- UHCIAsync **prev = &s->async_pending;
- UHCIAsync *next;
+ UHCIAsync *curr, *n;
- while (curr) {
+ QTAILQ_FOREACH_SAFE(curr, &s->async_pending, next, n) {
if (curr->valid > 0) {
- prev = &curr->next;
- curr = curr->next;
continue;
}
-
- next = curr->next;
-
- /* Unlink */
- *prev = next;
-
+ uhci_async_unlink(s, curr);
uhci_async_cancel(s, curr);
-
- curr = next;
}
}
static void uhci_async_cancel_all(UHCIState *s)
{
- UHCIAsync *curr = s->async_pending;
- UHCIAsync *next;
-
- while (curr) {
- next = curr->next;
+ UHCIAsync *curr, *n;
+ QTAILQ_FOREACH_SAFE(curr, &s->async_pending, next, n) {
+ uhci_async_unlink(s, curr);
uhci_async_cancel(s, curr);
-
- curr = next;
}
-
- s->async_pending = NULL;
}
static UHCIAsync *uhci_async_find_td(UHCIState *s, uint32_t addr, uint32_t
token)
{
- UHCIAsync *async = s->async_pending;
+ UHCIAsync *async;
UHCIAsync *match = NULL;
int count = 0;
@@ -291,7 +259,7 @@ static UHCIAsync *uhci_async_find_td(UHCIState *s, uint32_t
addr, uint32_t token
* If we ever do we'd want to optimize this algorithm.
*/
- while (async) {
+ QTAILQ_FOREACH(async, &s->async_pending, next) {
if (async->token == token) {
/* Good match */
match = async;
@@ -301,8 +269,6 @@ static UHCIAsync *uhci_async_find_td(UHCIState *s, uint32_t
addr, uint32_t token
break;
}
}
-
- async = async->next;
count++;
}
@@ -1137,6 +1103,7 @@ static int usb_uhci_common_initfn(UHCIState *s)
s->expire_time = qemu_get_clock_ns(vm_clock) +
(get_ticks_per_sec() / FRAME_TIMER_FREQ);
s->num_ports_vmstate = NB_PORTS;
+ QTAILQ_INIT(&s->async_pending);
qemu_register_reset(uhci_reset, s);
--
1.7.1
- [Qemu-devel] [PATCH 03/14] usb-linux: Add support for buffering iso usb packets, (continued)
- [Qemu-devel] [PATCH 03/14] usb-linux: Add support for buffering iso usb packets, Gerd Hoffmann, 2011/05/04
- [Qemu-devel] [PATCH 11/14] ohci: get ohci state via container_of(), Gerd Hoffmann, 2011/05/04
- [Qemu-devel] [PATCH 06/14] usb-linux: We only need to keep track of 15 endpoints, Gerd Hoffmann, 2011/05/04
- [Qemu-devel] [PATCH 04/14] usb-linux: Refuse packets for endpoints which are not in the usb descriptor, Gerd Hoffmann, 2011/05/04
- [Qemu-devel] [PATCH 05/14] usb-linux: Refuse iso packets when max packet size is 0 (alt setting 0), Gerd Hoffmann, 2011/05/04
- [Qemu-devel] [PATCH 10/14] uhci: keep uhci state pointer in async packet struct., Gerd Hoffmann, 2011/05/04
- [Qemu-devel] [PATCH 08/14] usb: control buffer fixes, Gerd Hoffmann, 2011/05/04
- [Qemu-devel] [PATCH 12/14] musb: get musb state via container_of(), Gerd Hoffmann, 2011/05/04
- [Qemu-devel] [PATCH 14/14] usb: mass storage fix, Gerd Hoffmann, 2011/05/04
- [Qemu-devel] [PATCH 13/14] usb: move complete callback to port ops, Gerd Hoffmann, 2011/05/04
- [Qemu-devel] [PATCH 09/14] uhci: switch to QTAILQ,
Gerd Hoffmann <=
- Re: [Qemu-devel] [PULL] usb patch queue, Anthony Liguori, 2011/05/05