All of lore.kernel.org
 help / color / mirror / Atom feed
From: Gerd Hoffmann <kraxel@redhat.com>
To: qemu-devel@nongnu.org
Cc: Gerd Hoffmann <kraxel@redhat.com>
Subject: [Qemu-devel] [PATCH 49/54] xhci: add XHCIInterrupter
Date: Thu,  6 Sep 2012 09:12:50 +0200	[thread overview]
Message-ID: <1346915575-12369-50-git-send-email-kraxel@redhat.com> (raw)
In-Reply-To: <1346915575-12369-1-git-send-email-kraxel@redhat.com>

Move all state belonging to the (single) interrupter into a separate
struct.  First step in adding support for multiple interrupters.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
---
 hw/usb/hcd-xhci.c |  307 ++++++++++++++++++++++++++++-------------------------
 trace-events      |    2 +-
 2 files changed, 161 insertions(+), 148 deletions(-)

diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
index e39fe04..ddc3825 100644
--- a/hw/usb/hcd-xhci.c
+++ b/hw/usb/hcd-xhci.c
@@ -378,6 +378,27 @@ typedef struct XHCIEvent {
     uint8_t epid;
 } XHCIEvent;
 
+typedef struct XHCIInterrupter {
+    uint32_t iman;
+    uint32_t imod;
+    uint32_t erstsz;
+    uint32_t erstba_low;
+    uint32_t erstba_high;
+    uint32_t erdp_low;
+    uint32_t erdp_high;
+
+    bool msix_used, er_pcs, er_full;
+
+    dma_addr_t er_start;
+    uint32_t er_size;
+    unsigned int er_ep_idx;
+
+    XHCIEvent ev_buffer[EV_QUEUE];
+    unsigned int ev_buffer_put;
+    unsigned int ev_buffer_get;
+
+} XHCIInterrupter;
+
 struct XHCIState {
     PCIDevice pci_dev;
     USBBus bus;
@@ -407,27 +428,9 @@ struct XHCIState {
     uint32_t numports;
 
     /* Runtime Registers */
-    uint32_t iman;
-    uint32_t imod;
-    uint32_t erstsz;
-    uint32_t erstba_low;
-    uint32_t erstba_high;
-    uint32_t erdp_low;
-    uint32_t erdp_high;
-    bool     msix_used;
-
     int64_t mfindex_start;
     QEMUTimer *mfwrap_timer;
-
-    dma_addr_t er_start;
-    uint32_t er_size;
-    bool er_pcs;
-    unsigned int er_ep_idx;
-    bool er_full;
-
-    XHCIEvent ev_buffer[EV_QUEUE];
-    unsigned int ev_buffer_put;
-    unsigned int ev_buffer_get;
+    XHCIInterrupter intr[MAXINTRS];
 
     XHCIRing cmd_ring;
 };
@@ -446,8 +449,8 @@ enum xhci_flags {
 
 static void xhci_kick_ep(XHCIState *xhci, unsigned int slotid,
                          unsigned int epid);
-static void xhci_event(XHCIState *xhci, XHCIEvent *event);
-static void xhci_write_event(XHCIState *xhci, XHCIEvent *event);
+static void xhci_event(XHCIState *xhci, XHCIEvent *event, int v);
+static void xhci_write_event(XHCIState *xhci, XHCIEvent *event, int v);
 
 static const char *TRBType_names[] = {
     [TRB_RESERVED]                     = "TRB_RESERVED",
@@ -573,7 +576,7 @@ static void xhci_mfwrap_timer(void *opaque)
     XHCIState *xhci = opaque;
     XHCIEvent wrap = { ER_MFINDEX_WRAP, CC_SUCCESS };
 
-    xhci_event(xhci, &wrap);
+    xhci_event(xhci, &wrap, 0);
     xhci_mfwrap_update(xhci);
 }
 
@@ -626,8 +629,8 @@ static void xhci_intx_update(XHCIState *xhci)
         return;
     }
 
-    if (xhci->iman & IMAN_IP &&
-        xhci->iman & IMAN_IE &&
+    if (xhci->intr[0].iman & IMAN_IP &&
+        xhci->intr[0].iman & IMAN_IE &&
         xhci->usbcmd & USBCMD_INTE) {
         level = 1;
     }
@@ -636,7 +639,7 @@ static void xhci_intx_update(XHCIState *xhci)
     qemu_set_irq(xhci->irq, level);
 }
 
-static void xhci_msix_update(XHCIState *xhci)
+static void xhci_msix_update(XHCIState *xhci, int v)
 {
     bool enabled;
 
@@ -644,29 +647,29 @@ static void xhci_msix_update(XHCIState *xhci)
         return;
     }
 
-    enabled = xhci->iman & IMAN_IE;
-    if (enabled == xhci->msix_used) {
+    enabled = xhci->intr[v].iman & IMAN_IE;
+    if (enabled == xhci->intr[v].msix_used) {
         return;
     }
 
     if (enabled) {
-        trace_usb_xhci_irq_msix_use(0);
-        msix_vector_use(&xhci->pci_dev, 0);
-        xhci->msix_used = true;
+        trace_usb_xhci_irq_msix_use(v);
+        msix_vector_use(&xhci->pci_dev, v);
+        xhci->intr[v].msix_used = true;
     } else {
-        trace_usb_xhci_irq_msix_unuse(0);
-        msix_vector_unuse(&xhci->pci_dev, 0);
-        xhci->msix_used = false;
+        trace_usb_xhci_irq_msix_unuse(v);
+        msix_vector_unuse(&xhci->pci_dev, v);
+        xhci->intr[v].msix_used = false;
     }
 }
 
-static void xhci_intr_raise(XHCIState *xhci)
+static void xhci_intr_raise(XHCIState *xhci, int v)
 {
-    xhci->erdp_low |= ERDP_EHB;
-    xhci->iman |= IMAN_IP;
+    xhci->intr[v].erdp_low |= ERDP_EHB;
+    xhci->intr[v].iman |= IMAN_IP;
     xhci->usbsts |= USBSTS_EINT;
 
-    if (!(xhci->iman & IMAN_IE)) {
+    if (!(xhci->intr[v].iman & IMAN_IE)) {
         return;
     }
 
@@ -675,24 +678,26 @@ static void xhci_intr_raise(XHCIState *xhci)
     }
 
     if (msix_enabled(&xhci->pci_dev)) {
-        trace_usb_xhci_irq_msix(0);
-        msix_notify(&xhci->pci_dev, 0);
+        trace_usb_xhci_irq_msix(v);
+        msix_notify(&xhci->pci_dev, v);
         return;
     }
 
     if (msi_enabled(&xhci->pci_dev)) {
-        trace_usb_xhci_irq_msi(0);
-        msi_notify(&xhci->pci_dev, 0);
+        trace_usb_xhci_irq_msi(v);
+        msi_notify(&xhci->pci_dev, v);
         return;
     }
 
-    trace_usb_xhci_irq_intx(1);
-    qemu_set_irq(xhci->irq, 1);
+    if (v == 0) {
+        trace_usb_xhci_irq_intx(1);
+        qemu_set_irq(xhci->irq, 1);
+    }
 }
 
 static inline int xhci_running(XHCIState *xhci)
 {
-    return !(xhci->usbsts & USBSTS_HCH) && !xhci->er_full;
+    return !(xhci->usbsts & USBSTS_HCH) && !xhci->intr[0].er_full;
 }
 
 static void xhci_die(XHCIState *xhci)
@@ -701,8 +706,9 @@ static void xhci_die(XHCIState *xhci)
     fprintf(stderr, "xhci: asserted controller error\n");
 }
 
-static void xhci_write_event(XHCIState *xhci, XHCIEvent *event)
+static void xhci_write_event(XHCIState *xhci, XHCIEvent *event, int v)
 {
+    XHCIInterrupter *intr = &xhci->intr[v];
     XHCITRB ev_trb;
     dma_addr_t addr;
 
@@ -710,27 +716,28 @@ static void xhci_write_event(XHCIState *xhci, XHCIEvent *event)
     ev_trb.status = cpu_to_le32(event->length | (event->ccode << 24));
     ev_trb.control = (event->slotid << 24) | (event->epid << 16) |
                      event->flags | (event->type << TRB_TYPE_SHIFT);
-    if (xhci->er_pcs) {
+    if (intr->er_pcs) {
         ev_trb.control |= TRB_C;
     }
     ev_trb.control = cpu_to_le32(ev_trb.control);
 
-    trace_usb_xhci_queue_event(xhci->er_ep_idx, trb_name(&ev_trb),
+    trace_usb_xhci_queue_event(v, intr->er_ep_idx, trb_name(&ev_trb),
                                event_name(event), ev_trb.parameter,
                                ev_trb.status, ev_trb.control);
 
-    addr = xhci->er_start + TRB_SIZE*xhci->er_ep_idx;
+    addr = intr->er_start + TRB_SIZE*intr->er_ep_idx;
     pci_dma_write(&xhci->pci_dev, addr, &ev_trb, TRB_SIZE);
 
-    xhci->er_ep_idx++;
-    if (xhci->er_ep_idx >= xhci->er_size) {
-        xhci->er_ep_idx = 0;
-        xhci->er_pcs = !xhci->er_pcs;
+    intr->er_ep_idx++;
+    if (intr->er_ep_idx >= intr->er_size) {
+        intr->er_ep_idx = 0;
+        intr->er_pcs = !intr->er_pcs;
     }
 }
 
-static void xhci_events_update(XHCIState *xhci)
+static void xhci_events_update(XHCIState *xhci, int v)
 {
+    XHCIInterrupter *intr = &xhci->intr[v];
     dma_addr_t erdp;
     unsigned int dp_idx;
     bool do_irq = 0;
@@ -739,115 +746,116 @@ static void xhci_events_update(XHCIState *xhci)
         return;
     }
 
-    erdp = xhci_addr64(xhci->erdp_low, xhci->erdp_high);
-    if (erdp < xhci->er_start ||
-        erdp >= (xhci->er_start + TRB_SIZE*xhci->er_size)) {
+    erdp = xhci_addr64(intr->erdp_low, intr->erdp_high);
+    if (erdp < intr->er_start ||
+        erdp >= (intr->er_start + TRB_SIZE*intr->er_size)) {
         fprintf(stderr, "xhci: ERDP out of bounds: "DMA_ADDR_FMT"\n", erdp);
-        fprintf(stderr, "xhci: ER at "DMA_ADDR_FMT" len %d\n",
-                xhci->er_start, xhci->er_size);
+        fprintf(stderr, "xhci: ER[%d] at "DMA_ADDR_FMT" len %d\n",
+                v, intr->er_start, intr->er_size);
         xhci_die(xhci);
         return;
     }
-    dp_idx = (erdp - xhci->er_start) / TRB_SIZE;
-    assert(dp_idx < xhci->er_size);
+    dp_idx = (erdp - intr->er_start) / TRB_SIZE;
+    assert(dp_idx < intr->er_size);
 
     /* NEC didn't read section 4.9.4 of the spec (v1.0 p139 top Note) and thus
      * deadlocks when the ER is full. Hack it by holding off events until
      * the driver decides to free at least half of the ring */
-    if (xhci->er_full) {
-        int er_free = dp_idx - xhci->er_ep_idx;
+    if (intr->er_full) {
+        int er_free = dp_idx - intr->er_ep_idx;
         if (er_free <= 0) {
-            er_free += xhci->er_size;
+            er_free += intr->er_size;
         }
-        if (er_free < (xhci->er_size/2)) {
+        if (er_free < (intr->er_size/2)) {
             DPRINTF("xhci_events_update(): event ring still "
                     "more than half full (hack)\n");
             return;
         }
     }
 
-    while (xhci->ev_buffer_put != xhci->ev_buffer_get) {
-        assert(xhci->er_full);
-        if (((xhci->er_ep_idx+1) % xhci->er_size) == dp_idx) {
+    while (intr->ev_buffer_put != intr->ev_buffer_get) {
+        assert(intr->er_full);
+        if (((intr->er_ep_idx+1) % intr->er_size) == dp_idx) {
             DPRINTF("xhci_events_update(): event ring full again\n");
 #ifndef ER_FULL_HACK
             XHCIEvent full = {ER_HOST_CONTROLLER, CC_EVENT_RING_FULL_ERROR};
-            xhci_write_event(xhci, &full);
+            xhci_write_event(xhci, &full, v);
 #endif
             do_irq = 1;
             break;
         }
-        XHCIEvent *event = &xhci->ev_buffer[xhci->ev_buffer_get];
-        xhci_write_event(xhci, event);
-        xhci->ev_buffer_get++;
+        XHCIEvent *event = &intr->ev_buffer[intr->ev_buffer_get];
+        xhci_write_event(xhci, event, v);
+        intr->ev_buffer_get++;
         do_irq = 1;
-        if (xhci->ev_buffer_get == EV_QUEUE) {
-            xhci->ev_buffer_get = 0;
+        if (intr->ev_buffer_get == EV_QUEUE) {
+            intr->ev_buffer_get = 0;
         }
     }
 
     if (do_irq) {
-        xhci_intr_raise(xhci);
+        xhci_intr_raise(xhci, v);
     }
 
-    if (xhci->er_full && xhci->ev_buffer_put == xhci->ev_buffer_get) {
+    if (intr->er_full && intr->ev_buffer_put == intr->ev_buffer_get) {
         DPRINTF("xhci_events_update(): event ring no longer full\n");
-        xhci->er_full = 0;
+        intr->er_full = 0;
     }
     return;
 }
 
-static void xhci_event(XHCIState *xhci, XHCIEvent *event)
+static void xhci_event(XHCIState *xhci, XHCIEvent *event, int v)
 {
+    XHCIInterrupter *intr = &xhci->intr[v];
     dma_addr_t erdp;
     unsigned int dp_idx;
 
-    if (xhci->er_full) {
+    if (intr->er_full) {
         DPRINTF("xhci_event(): ER full, queueing\n");
-        if (((xhci->ev_buffer_put+1) % EV_QUEUE) == xhci->ev_buffer_get) {
+        if (((intr->ev_buffer_put+1) % EV_QUEUE) == intr->ev_buffer_get) {
             fprintf(stderr, "xhci: event queue full, dropping event!\n");
             return;
         }
-        xhci->ev_buffer[xhci->ev_buffer_put++] = *event;
-        if (xhci->ev_buffer_put == EV_QUEUE) {
-            xhci->ev_buffer_put = 0;
+        intr->ev_buffer[intr->ev_buffer_put++] = *event;
+        if (intr->ev_buffer_put == EV_QUEUE) {
+            intr->ev_buffer_put = 0;
         }
         return;
     }
 
-    erdp = xhci_addr64(xhci->erdp_low, xhci->erdp_high);
-    if (erdp < xhci->er_start ||
-        erdp >= (xhci->er_start + TRB_SIZE*xhci->er_size)) {
+    erdp = xhci_addr64(intr->erdp_low, intr->erdp_high);
+    if (erdp < intr->er_start ||
+        erdp >= (intr->er_start + TRB_SIZE*intr->er_size)) {
         fprintf(stderr, "xhci: ERDP out of bounds: "DMA_ADDR_FMT"\n", erdp);
-        fprintf(stderr, "xhci: ER at "DMA_ADDR_FMT" len %d\n",
-                xhci->er_start, xhci->er_size);
+        fprintf(stderr, "xhci: ER[%d] at "DMA_ADDR_FMT" len %d\n",
+                v, intr->er_start, intr->er_size);
         xhci_die(xhci);
         return;
     }
 
-    dp_idx = (erdp - xhci->er_start) / TRB_SIZE;
-    assert(dp_idx < xhci->er_size);
+    dp_idx = (erdp - intr->er_start) / TRB_SIZE;
+    assert(dp_idx < intr->er_size);
 
-    if ((xhci->er_ep_idx+1) % xhci->er_size == dp_idx) {
+    if ((intr->er_ep_idx+1) % intr->er_size == dp_idx) {
         DPRINTF("xhci_event(): ER full, queueing\n");
 #ifndef ER_FULL_HACK
         XHCIEvent full = {ER_HOST_CONTROLLER, CC_EVENT_RING_FULL_ERROR};
         xhci_write_event(xhci, &full);
 #endif
-        xhci->er_full = 1;
-        if (((xhci->ev_buffer_put+1) % EV_QUEUE) == xhci->ev_buffer_get) {
+        intr->er_full = 1;
+        if (((intr->ev_buffer_put+1) % EV_QUEUE) == intr->ev_buffer_get) {
             fprintf(stderr, "xhci: event queue full, dropping event!\n");
             return;
         }
-        xhci->ev_buffer[xhci->ev_buffer_put++] = *event;
-        if (xhci->ev_buffer_put == EV_QUEUE) {
-            xhci->ev_buffer_put = 0;
+        intr->ev_buffer[intr->ev_buffer_put++] = *event;
+        if (intr->ev_buffer_put == EV_QUEUE) {
+            intr->ev_buffer_put = 0;
         }
     } else {
-        xhci_write_event(xhci, event);
+        xhci_write_event(xhci, event, v);
     }
 
-    xhci_intr_raise(xhci);
+    xhci_intr_raise(xhci, v);
 }
 
 static void xhci_ring_init(XHCIState *xhci, XHCIRing *ring,
@@ -939,17 +947,18 @@ static int xhci_ring_chain_length(XHCIState *xhci, const XHCIRing *ring)
     }
 }
 
-static void xhci_er_reset(XHCIState *xhci)
+static void xhci_er_reset(XHCIState *xhci, int v)
 {
+    XHCIInterrupter *intr = &xhci->intr[v];
     XHCIEvRingSeg seg;
 
     /* cache the (sole) event ring segment location */
-    if (xhci->erstsz != 1) {
-        fprintf(stderr, "xhci: invalid value for ERSTSZ: %d\n", xhci->erstsz);
+    if (intr->erstsz != 1) {
+        fprintf(stderr, "xhci: invalid value for ERSTSZ: %d\n", intr->erstsz);
         xhci_die(xhci);
         return;
     }
-    dma_addr_t erstba = xhci_addr64(xhci->erstba_low, xhci->erstba_high);
+    dma_addr_t erstba = xhci_addr64(intr->erstba_low, intr->erstba_high);
     pci_dma_read(&xhci->pci_dev, erstba, &seg, sizeof(seg));
     le32_to_cpus(&seg.addr_low);
     le32_to_cpus(&seg.addr_high);
@@ -959,15 +968,15 @@ static void xhci_er_reset(XHCIState *xhci)
         xhci_die(xhci);
         return;
     }
-    xhci->er_start = xhci_addr64(seg.addr_low, seg.addr_high);
-    xhci->er_size = seg.size;
+    intr->er_start = xhci_addr64(seg.addr_low, seg.addr_high);
+    intr->er_size = seg.size;
 
-    xhci->er_ep_idx = 0;
-    xhci->er_pcs = 1;
-    xhci->er_full = 0;
+    intr->er_ep_idx = 0;
+    intr->er_pcs = 1;
+    intr->er_full = 0;
 
-    DPRINTF("xhci: event ring:" DMA_ADDR_FMT " [%d]\n",
-            xhci->er_start, xhci->er_size);
+    DPRINTF("xhci: event ring[%d]:" DMA_ADDR_FMT " [%d]\n",
+            v, intr->er_start, intr->er_size);
 }
 
 static void xhci_run(XHCIState *xhci)
@@ -1368,7 +1377,7 @@ static void xhci_xfer_report(XHCITransfer *xfer)
                 DPRINTF("xhci_xfer_data: EDTLA=%d\n", event.length);
                 edtla = 0;
             }
-            xhci_event(xhci, &event);
+            xhci_event(xhci, &event, 0 /* FIXME */);
             reported = 1;
             if (xfer->status != CC_SUCCESS) {
                 return;
@@ -2246,7 +2255,7 @@ static void xhci_process_commands(XHCIState *xhci)
             break;
         }
         event.slotid = slotid;
-        xhci_event(xhci, &event);
+        xhci_event(xhci, &event, 0 /* FIXME */);
     }
 }
 
@@ -2276,7 +2285,7 @@ static void xhci_update_port(XHCIState *xhci, XHCIPort *port, int is_detach)
         port->portsc |= PORTSC_CSC;
         XHCIEvent ev = { ER_PORT_STATUS_CHANGE, CC_SUCCESS,
                          port->portnr << 24};
-        xhci_event(xhci, &ev);
+        xhci_event(xhci, &ev, 0 /* FIXME */);
         DPRINTF("xhci: port change event for port %d\n", port->portnr);
     }
 }
@@ -2309,20 +2318,22 @@ static void xhci_reset(DeviceState *dev)
         xhci_update_port(xhci, xhci->ports + i, 0);
     }
 
-    xhci->iman = 0;
-    xhci->imod = 0;
-    xhci->erstsz = 0;
-    xhci->erstba_low = 0;
-    xhci->erstba_high = 0;
-    xhci->erdp_low = 0;
-    xhci->erdp_high = 0;
-    xhci->msix_used = 0;
+    for (i = 0; i < MAXINTRS; i++) {
+        xhci->intr[i].iman = 0;
+        xhci->intr[i].imod = 0;
+        xhci->intr[i].erstsz = 0;
+        xhci->intr[i].erstba_low = 0;
+        xhci->intr[i].erstba_high = 0;
+        xhci->intr[i].erdp_low = 0;
+        xhci->intr[i].erdp_high = 0;
+        xhci->intr[i].msix_used = 0;
 
-    xhci->er_ep_idx = 0;
-    xhci->er_pcs = 1;
-    xhci->er_full = 0;
-    xhci->ev_buffer_put = 0;
-    xhci->ev_buffer_get = 0;
+        xhci->intr[i].er_ep_idx = 0;
+        xhci->intr[i].er_pcs = 1;
+        xhci->intr[i].er_full = 0;
+        xhci->intr[i].ev_buffer_put = 0;
+        xhci->intr[i].ev_buffer_get = 0;
+    }
 
     xhci->mfindex_start = qemu_get_clock_ns(vm_clock);
     xhci_mfwrap_update(xhci);
@@ -2553,7 +2564,7 @@ static void xhci_oper_write(XHCIState *xhci, uint32_t reg, uint32_t val)
         if (xhci->crcr_low & (CRCR_CA|CRCR_CS) && (xhci->crcr_low & CRCR_CRR)) {
             XHCIEvent event = {ER_COMMAND_COMPLETE, CC_COMMAND_RING_STOPPED};
             xhci->crcr_low &= ~CRCR_CRR;
-            xhci_event(xhci, &event);
+            xhci_event(xhci, &event, 0 /* FIXME */);
             DPRINTF("xhci: command ring stopped (CRCR=%08x)\n", xhci->crcr_low);
         } else {
             dma_addr_t base = xhci_addr64(xhci->crcr_low & ~0x3f, val);
@@ -2577,6 +2588,7 @@ static void xhci_oper_write(XHCIState *xhci, uint32_t reg, uint32_t val)
 
 static uint32_t xhci_runtime_read(XHCIState *xhci, uint32_t reg)
 {
+    XHCIInterrupter *intr = &xhci->intr[0];
     uint32_t ret;
 
     switch (reg) {
@@ -2584,25 +2596,25 @@ static uint32_t xhci_runtime_read(XHCIState *xhci, uint32_t reg)
         ret = xhci_mfindex_get(xhci) & 0x3fff;
         break;
     case 0x20: /* IMAN */
-        ret = xhci->iman;
+        ret = intr->iman;
         break;
     case 0x24: /* IMOD */
-        ret = xhci->imod;
+        ret = intr->imod;
         break;
     case 0x28: /* ERSTSZ */
-        ret = xhci->erstsz;
+        ret = intr->erstsz;
         break;
     case 0x30: /* ERSTBA low */
-        ret = xhci->erstba_low;
+        ret = intr->erstba_low;
         break;
     case 0x34: /* ERSTBA high */
-        ret = xhci->erstba_high;
+        ret = intr->erstba_high;
         break;
     case 0x38: /* ERDP low */
-        ret = xhci->erdp_low;
+        ret = intr->erdp_low;
         break;
     case 0x3c: /* ERDP high */
-        ret = xhci->erdp_high;
+        ret = intr->erdp_high;
         break;
     default:
         fprintf(stderr, "xhci_runtime_read: reg 0x%x unimplemented\n", reg);
@@ -2615,42 +2627,43 @@ static uint32_t xhci_runtime_read(XHCIState *xhci, uint32_t reg)
 
 static void xhci_runtime_write(XHCIState *xhci, uint32_t reg, uint32_t val)
 {
+    XHCIInterrupter *intr = &xhci->intr[0];
     trace_usb_xhci_runtime_write(reg, val);
 
     switch (reg) {
     case 0x20: /* IMAN */
         if (val & IMAN_IP) {
-            xhci->iman &= ~IMAN_IP;
+            intr->iman &= ~IMAN_IP;
         }
-        xhci->iman &= ~IMAN_IE;
-        xhci->iman |= val & IMAN_IE;
+        intr->iman &= ~IMAN_IE;
+        intr->iman |= val & IMAN_IE;
         xhci_intx_update(xhci);
-        xhci_msix_update(xhci);
+        xhci_msix_update(xhci, 0);
         break;
     case 0x24: /* IMOD */
-        xhci->imod = val;
+        intr->imod = val;
         break;
     case 0x28: /* ERSTSZ */
-        xhci->erstsz = val & 0xffff;
+        intr->erstsz = val & 0xffff;
         break;
     case 0x30: /* ERSTBA low */
         /* XXX NEC driver bug: it doesn't align this to 64 bytes
-        xhci->erstba_low = val & 0xffffffc0; */
-        xhci->erstba_low = val & 0xfffffff0;
+        intr->erstba_low = val & 0xffffffc0; */
+        intr->erstba_low = val & 0xfffffff0;
         break;
     case 0x34: /* ERSTBA high */
-        xhci->erstba_high = val;
-        xhci_er_reset(xhci);
+        intr->erstba_high = val;
+        xhci_er_reset(xhci, 0);
         break;
     case 0x38: /* ERDP low */
         if (val & ERDP_EHB) {
-            xhci->erdp_low &= ~ERDP_EHB;
+            intr->erdp_low &= ~ERDP_EHB;
         }
-        xhci->erdp_low = (val & ~ERDP_EHB) | (xhci->erdp_low & ERDP_EHB);
+        intr->erdp_low = (val & ~ERDP_EHB) | (intr->erdp_low & ERDP_EHB);
         break;
     case 0x3c: /* ERDP high */
-        xhci->erdp_high = val;
-        xhci_events_update(xhci);
+        intr->erdp_high = val;
+        xhci_events_update(xhci, 0);
         break;
     default:
         fprintf(stderr, "xhci_oper_write: reg 0x%x unimplemented\n", reg);
@@ -2780,7 +2793,7 @@ static void xhci_wakeup(USBPort *usbport)
         return;
     }
     port->portsc |= PORTSC_PLC;
-    xhci_event(xhci, &ev);
+    xhci_event(xhci, &ev, 0 /* FIXME */);
 }
 
 static void xhci_complete(USBPort *port, USBPacket *packet)
diff --git a/trace-events b/trace-events
index f03745c..1abaa5f 100644
--- a/trace-events
+++ b/trace-events
@@ -316,7 +316,7 @@ usb_xhci_irq_msi(uint32_t nr) "nr %d"
 usb_xhci_irq_msix(uint32_t nr) "nr %d"
 usb_xhci_irq_msix_use(uint32_t nr) "nr %d"
 usb_xhci_irq_msix_unuse(uint32_t nr) "nr %d"
-usb_xhci_queue_event(uint32_t idx, const char *trb, const char *evt, uint64_t param, uint32_t status, uint32_t control) "idx %d, %s, %s, p %016" PRIx64 ", s %08x, c 0x%08x"
+usb_xhci_queue_event(uint32_t vector, uint32_t idx, const char *trb, const char *evt, uint64_t param, uint32_t status, uint32_t control) "v %d, idx %d, %s, %s, p %016" PRIx64 ", s %08x, c 0x%08x"
 usb_xhci_fetch_trb(uint64_t addr, const char *name, uint64_t param, uint32_t status, uint32_t control) "addr %016" PRIx64 ", %s, p %016" PRIx64 ", s %08x, c 0x%08x"
 usb_xhci_slot_enable(uint32_t slotid) "slotid %d"
 usb_xhci_slot_disable(uint32_t slotid) "slotid %d"
-- 
1.7.1

  parent reply	other threads:[~2012-09-06  7:13 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2012-09-06  7:12 [Qemu-devel] [PULL 00/54] usb patch queue Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 01/54] usb: controllers do not need to check for babble themselves Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 02/54] usb-core: Don't set packet state to complete on a nak Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 03/54] usb-core: Add a usb_ep_find_packet_by_id() helper function Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 04/54] usb-core: Allow the first packet of a pipelined ep to complete immediately Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 05/54] Revert "ehci: don't flush cache on doorbell rings." Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 06/54] ehci: Validate qh is not changed unexpectedly by the guest Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 07/54] ehci: Update copyright headers to reflect recent work Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 08/54] ehci: Properly cleanup packets on cancel Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 09/54] ehci: Properly report completed but not yet processed packets to the guest Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 10/54] ehci: check for EHCI_ASYNC_FINISHED first in ehci_free_packet Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 11/54] ehci: trace guest bugs Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 12/54] ehci: add doorbell trace events Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 13/54] ehci: Add some additional ehci_trace_guest_bug() calls Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 14/54] ehci: Fix memory leak in handling of NAK-ed packets Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 15/54] ehci: Handle USB_RET_PROCERR in ehci_fill_queue Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 16/54] ehci: Correct a comment in fetchqtd packet processing Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 17/54] usb-redir: Never return USB_RET_NAK for async handled packets Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 18/54] usb-redir: Don't delay handling of open events to a bottom half Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 19/54] usb-redir: Get rid of async-struct get member Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 20/54] usb-redir: Get rid of local shadow copy of packet headers Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 21/54] usb-redir: Get rid of unused async-struct dev member Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 22/54] usb-redir: Move to core packet id and queue handling Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 23/54] usb-redir: Return babble when getting more bulk data then requested Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 24/54] usb-redir: Convert to new libusbredirparser 0.5 API Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 25/54] usb-redir: Set ep max_packet_size if available Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 26/54] usb-redir: Add a usbredir_reject_device helper function Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 27/54] usb-redir: Ensure our peer has the necessary caps when redirecting to XHCI Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 28/54] usb-redir: Enable pipelining for bulk endpoints Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 29/54] Better name usb braille device Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 30/54] usb-audio: fix usb version Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 31/54] xhci: rip out background transfer code Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 32/54] xhci: drop buffering Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 33/54] xhci: move device lookup into xhci_setup_packet Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 34/54] xhci: implement mfindex Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 35/54] xhci: iso xfer support Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 36/54] xhci: trace cc codes in cleartext Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 37/54] xhci: add trace_usb_xhci_ep_set_dequeue Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 38/54] xhci: fix runtime write tracepoint Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 39/54] xhci: update register layout Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 40/54] xhci: update port handling Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 41/54] usb3: superspeed descriptors Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 42/54] usb3: superspeed endpoint companion Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 43/54] usb3: bos decriptor Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 44/54] usb-storage: usb3 support Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 45/54] xhci: fix & cleanup msi Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 46/54] xhci: rework interrupt handling Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 47/54] xhci: add msix support Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 48/54] xhci: move register update into xhci_intr_raise Gerd Hoffmann
2012-09-06  7:12 ` Gerd Hoffmann [this message]
2012-09-06  7:12 ` [Qemu-devel] [PATCH 50/54] xhci: prepare xhci_runtime_{read, write} for multiple interrupters Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 51/54] xhci: pick target interrupter Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 52/54] xhci: support multiple interrupters Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 53/54] xhci: kill xhci_mem_{read, write} dispatcher functions Gerd Hoffmann
2012-09-06  7:12 ` [Qemu-devel] [PATCH 54/54] xhci: allow bytewise capability register reads Gerd Hoffmann
2012-09-10 13:23 ` [Qemu-devel] [PULL 00/54] usb patch queue Aurelien Jarno
2012-09-10 13:37   ` Gerd Hoffmann
2012-09-10 15:08     ` Andreas Färber
2012-09-10 17:49       ` Anthony Liguori
2012-09-11  5:46         ` Gerd Hoffmann
2012-09-11 17:22           ` Aurelien Jarno

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=1346915575-12369-50-git-send-email-kraxel@redhat.com \
    --to=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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.