[SeaBIOS] [PATCH 2/4] ehci: Update usb command timeouts to use usb_xfer_time()

Kevin O'Connor kevin at koconnor.net
Sat Jun 14 20:08:51 CEST 2014


Signed-off-by: Kevin O'Connor <kevin at koconnor.net>
---
 src/hw/usb-ehci.c | 11 ++++++-----
 1 file changed, 6 insertions(+), 5 deletions(-)

diff --git a/src/hw/usb-ehci.c b/src/hw/usb-ehci.c
index 9d9427b..76c76e0 100644
--- a/src/hw/usb-ehci.c
+++ b/src/hw/usb-ehci.c
@@ -503,9 +503,8 @@ ehci_reset_pipe(struct ehci_pipe *pipe)
 }
 
 static int
-ehci_wait_td(struct ehci_pipe *pipe, struct ehci_qtd *td, int timeout)
+ehci_wait_td(struct ehci_pipe *pipe, struct ehci_qtd *td, u32 end)
 {
-    u32 end = timer_calc(timeout);
     u32 status;
     for (;;) {
         status = td->token;
@@ -604,12 +603,13 @@ ehci_control(struct usb_pipe *p, int dir, const void *cmd, int cmdsize
                  | (dir ? QTD_PID_OUT : QTD_PID_IN) | ehci_maxerr(3));
 
     // Transfer data
+    u32 end = timer_calc(usb_xfer_time(p, datasize));
     barrier();
     pipe->qh.qtd_next = (u32)tds;
     int i, ret=0;
     for (i=0; i<3; i++) {
         struct ehci_qtd *td = &tds[i];
-        ret = ehci_wait_td(pipe, td, 500);
+        ret = ehci_wait_td(pipe, td, end);
         if (ret)
             break;
     }
@@ -629,6 +629,7 @@ ehci_send_bulk(struct usb_pipe *p, int dir, void *data, int datasize)
             , &pipe->qh, dir, data, datasize);
 
     // Allocate 4 tds on stack (with required alignment)
+    u32 end = timer_calc(usb_xfer_time(p, datasize));
     u8 tdsbuf[sizeof(struct ehci_qtd) * STACKQTDS + EHCI_QTD_ALIGN - 1];
     struct ehci_qtd *tds = (void*)ALIGN((u32)tdsbuf, EHCI_QTD_ALIGN);
     memset(tds, 0, sizeof(*tds) * STACKQTDS);
@@ -639,7 +640,7 @@ ehci_send_bulk(struct usb_pipe *p, int dir, void *data, int datasize)
     int tdpos = 0;
     while (datasize) {
         struct ehci_qtd *td = &tds[tdpos++ % STACKQTDS];
-        int ret = ehci_wait_td(pipe, td, 5000);
+        int ret = ehci_wait_td(pipe, td, end);
         if (ret)
             return -1;
 
@@ -659,7 +660,7 @@ ehci_send_bulk(struct usb_pipe *p, int dir, void *data, int datasize)
     int i;
     for (i=0; i<STACKQTDS; i++) {
         struct ehci_qtd *td = &tds[tdpos++ % STACKQTDS];
-        int ret = ehci_wait_td(pipe, td, 5000);
+        int ret = ehci_wait_td(pipe, td, end);
         if (ret)
             return -1;
     }
-- 
1.9.3




More information about the SeaBIOS mailing list