[SeaBIOS] [PATCH 2/3] usb-ehci: Convert ehci_wait_qh to ehci_wait_pipe.

Kevin O'Connor kevin at koconnor.net
Fri Nov 18 04:23:56 CET 2011


Convert ehci_wait_qh to ehci_wait_pipe to mirror the similar change
made to the uhci code.

Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
 src/usb-ehci.c |   61 +++++++++++++++++++++++++++----------------------------
 1 files changed, 30 insertions(+), 31 deletions(-)

diff --git a/src/usb-ehci.c b/src/usb-ehci.c
index a60c607..8ce68ba 100644
--- a/src/usb-ehci.c
+++ b/src/usb-ehci.c
@@ -303,22 +303,12 @@ ehci_init(struct pci_device *pci, int busid, struct pci_device *comppci)
  * End point communication
  ****************************************************************/
 
-static int
-ehci_wait_qh(struct usb_ehci_s *cntl, struct ehci_qh *qh)
-{
-    // XXX - 500ms just a guess
-    u64 end = calc_future_tsc(500);
-    for (;;) {
-        if (qh->qtd_next & EHCI_PTR_TERM)
-            // XXX - confirm
-            return 0;
-        if (check_tsc(end)) {
-            warn_timeout();
-            return -1;
-        }
-        yield();
-    }
-}
+struct ehci_pipe {
+    struct ehci_qh qh;
+    struct ehci_qtd *next_td, *tds;
+    void *data;
+    struct usb_pipe pipe;
+};
 
 // Wait for next USB async frame to start - for ensuring safe memory release.
 static void
@@ -362,12 +352,29 @@ ehci_waittick(struct usb_ehci_s *cntl)
     writel(&cntl->regs->usbsts, STS_IAA);
 }
 
-struct ehci_pipe {
-    struct ehci_qh qh;
-    struct ehci_qtd *next_td, *tds;
-    void *data;
-    struct usb_pipe pipe;
-};
+static int
+ehci_wait_pipe(struct ehci_pipe *pipe, int timeout)
+{
+    u64 end = calc_future_tsc(timeout);
+    for (;;) {
+        u32 el_link = GET_FLATPTR(pipe->qh.qtd_next);
+        if (el_link & EHCI_PTR_TERM)
+            // XXX - confirm
+            return 0;
+        if (check_tsc(end)) {
+            warn_timeout();
+            SET_FLATPTR(pipe->qh.token, QTD_STS_HALT);
+            SET_FLATPTR(pipe->qh.qtd_next, EHCI_PTR_TERM);
+            SET_FLATPTR(pipe->qh.alt_next, EHCI_PTR_TERM);
+            // XXX - halt qh?
+            struct usb_ehci_s *cntl = container_of(
+                GET_FLATPTR(pipe->pipe.cntl), struct usb_ehci_s, usb);
+            ehci_waittick(cntl);
+            return -1;
+        }
+        yield();
+    }
+}
 
 void
 ehci_free_pipe(struct usb_pipe *p)
@@ -462,8 +469,6 @@ ehci_control(struct usb_pipe *p, int dir, const void *cmd, int cmdsize
         return -1;
     }
     struct ehci_pipe *pipe = container_of(p, struct ehci_pipe, pipe);
-    struct usb_ehci_s *cntl = container_of(
-        pipe->pipe.cntl, struct usb_ehci_s, usb);
 
     u16 maxpacket = pipe->pipe.maxpacket;
     int speed = pipe->pipe.speed;
@@ -515,13 +520,7 @@ ehci_control(struct usb_pipe *p, int dir, const void *cmd, int cmdsize
     pipe->qh.qtd_next = (u32)tds;
     barrier();
     pipe->qh.token = 0;
-    int ret = ehci_wait_qh(cntl, &pipe->qh);
-    pipe->qh.token = QTD_STS_HALT;
-    if (ret) {
-        pipe->qh.qtd_next = pipe->qh.alt_next = EHCI_PTR_TERM;
-        // XXX - halt qh?
-        ehci_waittick(cntl);
-    }
+    int ret = ehci_wait_pipe(pipe, 500);
     free(tds);
     return ret;
 }
-- 
1.7.6.4




More information about the SeaBIOS mailing list