Nico Huber ([email protected]) just uploaded a new patch set to gerrit, 
which you can find at http://review.coreboot.org/1898

-gerrit

commit 3c35827c65b42886da678eb7db219b0f153b51f9
Author: Nico Huber <[email protected]>
Date:   Tue Nov 20 17:49:00 2012 +0100

    libpayload: Handle underruns in UHCI interrupt queues
    
    If usb_poll() isn't called fast enough, the UHCI controller marks an
    underrun interrupt queue as done (terminating the queue at the head).
    We can recover from this situation, when usb_poll() gets called again,
    and the queue is processed.
    
    Change-Id: Id56c9df44d6dbd53cd30ad89dfb5bf5977799829
    Signed-off-by: Nico Huber <[email protected]>
---
 payloads/libpayload/drivers/usb/uhci.c | 5 +++++
 1 file changed, 5 insertions(+)

diff --git a/payloads/libpayload/drivers/usb/uhci.c 
b/payloads/libpayload/drivers/usb/uhci.c
index bfa53f6..386392b 100644
--- a/payloads/libpayload/drivers/usb/uhci.c
+++ b/payloads/libpayload/drivers/usb/uhci.c
@@ -590,6 +590,11 @@ uhci_poll_intr_queue (void *q_)
                q->lastread = (q->lastread + 1) % q->total;
                return &q->data[current*q->reqsize];
        }
+       /* reset queue if we fully processed it after underrun */
+       else if (q->qh->elementlinkptr & FLISTP_TERMINATE) {
+               usb_debug("resetting underrun uhci interrupt queue.\n");
+               q->qh->elementlinkptr = virt_to_phys(q->tds + q->lastread);
+       }
        return NULL;
 }
 

-- 
coreboot mailing list: [email protected]
http://www.coreboot.org/mailman/listinfo/coreboot

Reply via email to