From: Hans de Goede <hdegoede@redhat.com>
To: Gerd Hoffmann <kraxel@redhat.com>
Cc: Hans de Goede <hdegoede@redhat.com>, qemu-devel@nongnu.org
Subject: [Qemu-devel] [PATCH 10/17] uhci: Store ep in UHCIQueue
Date: Wed, 24 Oct 2012 18:31:13 +0200 [thread overview]
Message-ID: <1351096280-9518-11-git-send-email-hdegoede@redhat.com> (raw)
In-Reply-To: <1351096280-9518-1-git-send-email-hdegoede@redhat.com>
This avoids the need to repeatedly lookup the device, and ep.
Signed-off-by: Hans de Goede <hdegoede@redhat.com>
---
hw/usb/hcd-uhci.c | 30 ++++++++++++++----------------
1 file changed, 14 insertions(+), 16 deletions(-)
diff --git a/hw/usb/hcd-uhci.c b/hw/usb/hcd-uhci.c
index 2bbc6fb..8214a21 100644
--- a/hw/usb/hcd-uhci.c
+++ b/hw/usb/hcd-uhci.c
@@ -107,6 +107,7 @@ struct UHCIAsync {
struct UHCIQueue {
uint32_t token;
UHCIState *uhci;
+ USBEndpoint *ep;
QTAILQ_ENTRY(UHCIQueue) next;
QTAILQ_HEAD(, UHCIAsync) asyncs;
int8_t valid;
@@ -161,7 +162,7 @@ typedef struct UHCI_QH {
} UHCI_QH;
static void uhci_async_cancel(UHCIAsync *async);
-static void uhci_queue_fill(UHCIQueue *q, UHCI_TD *td, struct USBEndpoint *ep);
+static void uhci_queue_fill(UHCIQueue *q, UHCI_TD *td);
static inline int32_t uhci_queue_token(UHCI_TD *td)
{
@@ -169,7 +170,7 @@ static inline int32_t uhci_queue_token(UHCI_TD *td)
return td->token & 0x7ffff;
}
-static UHCIQueue *uhci_queue_get(UHCIState *s, UHCI_TD *td)
+static UHCIQueue *uhci_queue_get(UHCIState *s, UHCI_TD *td, USBEndpoint *ep)
{
uint32_t token = uhci_queue_token(td);
UHCIQueue *queue;
@@ -183,6 +184,7 @@ static UHCIQueue *uhci_queue_get(UHCIState *s, UHCI_TD *td)
queue = g_new0(UHCIQueue, 1);
queue->uhci = s;
queue->token = token;
+ queue->ep = ep;
QTAILQ_INIT(&queue->asyncs);
QTAILQ_INSERT_HEAD(&s->queues, queue, next);
trace_usb_uhci_queue_add(queue->token);
@@ -790,11 +792,9 @@ static int uhci_handle_td(UHCIState *s, UHCIQueue *q,
{
UHCIAsync *async;
int len = 0, max_len;
- uint8_t pid;
bool spd;
- USBDevice *dev;
- USBEndpoint *ep;
bool queuing = (q != NULL);
+ uint8_t pid = td->token & 0xff;
/* Is active ? */
if (!(td->ctrl & TD_CTRL_ACTIVE)) {
@@ -828,7 +828,9 @@ static int uhci_handle_td(UHCIState *s, UHCIQueue *q,
/* Allocate new packet */
if (q == NULL) {
- q = uhci_queue_get(s, td);
+ USBDevice *dev = uhci_find_device(s, (td->token >> 8) & 0x7f);
+ USBEndpoint *ep = usb_ep_get(dev, pid, (td->token >> 15) & 0xf);
+ q = uhci_queue_get(s, td, ep);
}
async = uhci_async_alloc(q, td_addr);
@@ -838,12 +840,8 @@ static int uhci_handle_td(UHCIState *s, UHCIQueue *q,
async->queue->valid = 32;
max_len = ((td->token >> 21) + 1) & 0x7ff;
- pid = td->token & 0xff;
spd = (pid == USB_TOKEN_IN && (td->ctrl & TD_CTRL_SPD) != 0);
-
- dev = uhci_find_device(s, (td->token >> 8) & 0x7f);
- ep = usb_ep_get(dev, pid, (td->token >> 15) & 0xf);
- usb_packet_setup(&async->packet, pid, ep, td_addr, spd,
+ usb_packet_setup(&async->packet, pid, q->ep, td_addr, spd,
(td->ctrl & TD_CTRL_IOC) != 0);
qemu_sglist_add(&async->sgl, td->buffer, max_len);
usb_packet_map(&async->packet, &async->sgl);
@@ -851,13 +849,13 @@ static int uhci_handle_td(UHCIState *s, UHCIQueue *q,
switch(pid) {
case USB_TOKEN_OUT:
case USB_TOKEN_SETUP:
- len = usb_handle_packet(dev, &async->packet);
+ len = usb_handle_packet(q->ep->dev, &async->packet);
if (len >= 0)
len = max_len;
break;
case USB_TOKEN_IN:
- len = usb_handle_packet(dev, &async->packet);
+ len = usb_handle_packet(q->ep->dev, &async->packet);
break;
default:
@@ -872,7 +870,7 @@ static int uhci_handle_td(UHCIState *s, UHCIQueue *q,
if (len == USB_RET_ASYNC) {
uhci_async_link(async);
if (!queuing) {
- uhci_queue_fill(q, td, ep);
+ uhci_queue_fill(q, td);
}
return TD_RESULT_ASYNC_START;
}
@@ -945,7 +943,7 @@ static int qhdb_insert(QhDb *db, uint32_t addr)
return 0;
}
-static void uhci_queue_fill(UHCIQueue *q, UHCI_TD *td, struct USBEndpoint *ep)
+static void uhci_queue_fill(UHCIQueue *q, UHCI_TD *td)
{
uint32_t int_mask = 0;
uint32_t plink = td->link;
@@ -969,7 +967,7 @@ static void uhci_queue_fill(UHCIQueue *q, UHCI_TD *td, struct USBEndpoint *ep)
assert(int_mask == 0);
plink = ptd.link;
}
- usb_device_flush_ep_queue(ep->dev, ep);
+ usb_device_flush_ep_queue(q->ep->dev, q->ep);
}
static void uhci_process_frame(UHCIState *s)
--
1.7.12.1
next prev parent reply other threads:[~2012-10-24 16:30 UTC|newest]
Thread overview: 19+ messages / expand[flat|nested] mbox.gz Atom feed top
2012-10-24 16:31 [Qemu-devel] uhci: Cleanups, fixes and improvements Hans de Goede
2012-10-24 16:31 ` [Qemu-devel] [PATCH 01/17] usb: Enforce iso endpoints never returing USB_RET_ASYNC Hans de Goede
2012-10-24 16:31 ` [Qemu-devel] [PATCH 02/17] uhci: No need to handle async completion of isoc packets Hans de Goede
2012-10-24 16:31 ` [Qemu-devel] [PATCH 03/17] uhci: cleanup: Add an unlink call to uhci_async_cancel() Hans de Goede
2012-10-24 16:31 ` [Qemu-devel] [PATCH 04/17] uhci: Don't retry on error Hans de Goede
2012-10-24 16:31 ` [Qemu-devel] [PATCH 05/17] uhci: Drop unnecessary forward declaration of some static functions Hans de Goede
2012-10-24 16:31 ` [Qemu-devel] [PATCH 06/17] uhci: Move emptying of the queue's asyncs' queue to uhci_queue_free Hans de Goede
2012-10-24 16:31 ` [Qemu-devel] [PATCH 07/17] uhci: Rename UHCIAsync->td to UHCIAsync->td_addr Hans de Goede
2012-10-24 16:31 ` [Qemu-devel] [PATCH 08/17] uhci: Add uhci_read_td() helper function Hans de Goede
2012-10-24 16:31 ` [Qemu-devel] [PATCH 09/17] uhci: Make uhci_fill_queue() actually operate on an UHCIQueue Hans de Goede
2012-10-24 16:31 ` Hans de Goede [this message]
2012-10-24 16:31 ` [Qemu-devel] [PATCH 11/17] uhci: Immediately free queues on device disconnect Hans de Goede
2012-10-24 16:31 ` [Qemu-devel] [PATCH 12/17] uhci: Verify queue has not been changed by guest Hans de Goede
2012-10-24 16:31 ` [Qemu-devel] [PATCH 13/17] uhci: Detect guest td re-use Hans de Goede
2012-10-24 16:31 ` [Qemu-devel] [PATCH 14/17] uhci: When the guest marks a pending td non-active, cancel the queue Hans de Goede
2012-10-24 16:31 ` [Qemu-devel] [PATCH 15/17] uhci: Always mark a queue valid when we encounter it Hans de Goede
2012-10-24 16:31 ` [Qemu-devel] [PATCH 16/17] uhci: Retry to fill the queue while waiting for td completion Hans de Goede
2012-10-24 16:31 ` [Qemu-devel] [PATCH 17/17] uhci: Use only one queue for ctrl endpoints Hans de Goede
2012-10-25 7:14 ` [Qemu-devel] uhci: Cleanups, fixes and improvements Gerd Hoffmann
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=1351096280-9518-11-git-send-email-hdegoede@redhat.com \
--to=hdegoede@redhat.com \
--cc=kraxel@redhat.com \
--cc=qemu-devel@nongnu.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).