218e99
From e955b37a28ff1f10035dc9c96a083bf93e8ca895 Mon Sep 17 00:00:00 2001
218e99
From: Gerd Hoffmann <kraxel@redhat.com>
218e99
Date: Wed, 7 Aug 2013 09:22:46 +0200
218e99
Subject: [PATCH 15/28] xhci: add xhci_alloc_epctx
218e99
218e99
RH-Author: Gerd Hoffmann <kraxel@redhat.com>
218e99
Message-id: <1375867368-18979-4-git-send-email-kraxel@redhat.com>
218e99
Patchwork-id: 53036
218e99
O-Subject: [RHEL-7 qemu-kvm PATCH 3/5] xhci: add xhci_alloc_epctx
218e99
Bugzilla: 838170
218e99
RH-Acked-by: Hans de Goede <hdegoede@redhat.com>
218e99
RH-Acked-by: Laszlo Ersek <lersek@redhat.com>
218e99
RH-Acked-by: Orit Wasserman <owasserm@redhat.com>
218e99
218e99
Factor out endpoint context allocation to a separate function.
218e99
xhci live migration will need that too, in post_load.
218e99
218e99
Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
218e99
(cherry picked from commit 492b21f63fa655e0271abef4784cc337dd1d3fe7)
218e99
---
218e99
 hw/usb/hcd-xhci.c |   32 +++++++++++++++++++++-----------
218e99
 1 file changed, 21 insertions(+), 11 deletions(-)
218e99
218e99
Signed-off-by: Miroslav Rezanina <mrezanin@redhat.com>
218e99
---
218e99
 hw/usb/hcd-xhci.c |   32 +++++++++++++++++++++-----------
218e99
 1 files changed, 21 insertions(+), 11 deletions(-)
218e99
218e99
diff --git a/hw/usb/hcd-xhci.c b/hw/usb/hcd-xhci.c
218e99
index 4111e68..7f46ccc 100644
218e99
--- a/hw/usb/hcd-xhci.c
218e99
+++ b/hw/usb/hcd-xhci.c
218e99
@@ -1198,6 +1198,26 @@ static void xhci_ep_kick_timer(void *opaque)
218e99
     xhci_kick_ep(epctx->xhci, epctx->slotid, epctx->epid, 0);
218e99
 }
218e99
 
218e99
+static XHCIEPContext *xhci_alloc_epctx(XHCIState *xhci,
218e99
+                                       unsigned int slotid,
218e99
+                                       unsigned int epid)
218e99
+{
218e99
+    XHCIEPContext *epctx;
218e99
+    int i;
218e99
+
218e99
+    epctx = g_new0(XHCIEPContext, 1);
218e99
+    epctx->xhci = xhci;
218e99
+    epctx->slotid = slotid;
218e99
+    epctx->epid = epid;
218e99
+
218e99
+    for (i = 0; i < ARRAY_SIZE(epctx->transfers); i++) {
218e99
+        usb_packet_init(&epctx->transfers[i].packet);
218e99
+    }
218e99
+    epctx->kick_timer = qemu_new_timer_ns(vm_clock, xhci_ep_kick_timer, epctx);
218e99
+
218e99
+    return epctx;
218e99
+}
218e99
+
218e99
 static TRBCCode xhci_enable_ep(XHCIState *xhci, unsigned int slotid,
218e99
                                unsigned int epid, dma_addr_t pctx,
218e99
                                uint32_t *ctx)
218e99
@@ -1205,7 +1225,6 @@ static TRBCCode xhci_enable_ep(XHCIState *xhci, unsigned int slotid,
218e99
     XHCISlot *slot;
218e99
     XHCIEPContext *epctx;
218e99
     dma_addr_t dequeue;
218e99
-    int i;
218e99
 
218e99
     trace_usb_xhci_ep_enable(slotid, epid);
218e99
     assert(slotid >= 1 && slotid <= xhci->numslots);
218e99
@@ -1216,12 +1235,7 @@ static TRBCCode xhci_enable_ep(XHCIState *xhci, unsigned int slotid,
218e99
         xhci_disable_ep(xhci, slotid, epid);
218e99
     }
218e99
 
218e99
-    epctx = g_malloc(sizeof(XHCIEPContext));
218e99
-    memset(epctx, 0, sizeof(XHCIEPContext));
218e99
-    epctx->xhci = xhci;
218e99
-    epctx->slotid = slotid;
218e99
-    epctx->epid = epid;
218e99
-
218e99
+    epctx = xhci_alloc_epctx(xhci, slotid, epid);
218e99
     slot->eps[epid-1] = epctx;
218e99
 
218e99
     dequeue = xhci_addr64(ctx[2] & ~0xf, ctx[3]);
218e99
@@ -1241,13 +1255,9 @@ static TRBCCode xhci_enable_ep(XHCIState *xhci, unsigned int slotid,
218e99
         xhci_ring_init(xhci, &epctx->ring, dequeue);
218e99
         epctx->ring.ccs = ctx[2] & 1;
218e99
     }
218e99
-    for (i = 0; i < ARRAY_SIZE(epctx->transfers); i++) {
218e99
-        usb_packet_init(&epctx->transfers[i].packet);
218e99
-    }
218e99
 
218e99
     epctx->interval = 1 << (ctx[0] >> 16) & 0xff;
218e99
     epctx->mfindex_last = 0;
218e99
-    epctx->kick_timer = qemu_new_timer_ns(vm_clock, xhci_ep_kick_timer, epctx);
218e99
 
218e99
     epctx->state = EP_RUNNING;
218e99
     ctx[0] &= ~EP_STATE_MASK;
218e99
-- 
218e99
1.7.1
218e99