From be58fee28e9f0c4d8f196added0105a101512acc Mon Sep 17 00:00:00 2001 From: Nico Huber Date: Thu, 22 Nov 2012 11:12:13 +0100 Subject: libpayload: Handle errors in UHCI interrupt queues If somethings goes wrong during an interrupt transfer, drop the transfer. Change-Id: I450c08a7a0bf23fbee74237e0355d4a726ace114 Signed-off-by: Nico Huber Reviewed-on: http://review.coreboot.org/1901 Reviewed-by: Patrick Georgi Tested-by: build bot (Jenkins) --- payloads/libpayload/drivers/usb/uhci.c | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'payloads/libpayload/drivers') diff --git a/payloads/libpayload/drivers/usb/uhci.c b/payloads/libpayload/drivers/usb/uhci.c index 386392b53f..bf611d2613 100644 --- a/payloads/libpayload/drivers/usb/uhci.c +++ b/payloads/libpayload/drivers/usb/uhci.c @@ -572,7 +572,6 @@ uhci_poll_intr_queue (void *q_) { intr_q *q = (intr_q*)q_; if ((q->tds[q->lastread].ctrlsts & TD_STATUS_ACTIVE) == 0) { - /* FIXME: handle errors */ int current = q->lastread; int previous; if (q->lastread == 0) { @@ -588,7 +587,8 @@ uhci_poll_intr_queue (void *q_) } q->tds[previous].ctrlsts |= TD_STATUS_ACTIVE; q->lastread = (q->lastread + 1) % q->total; - return &q->data[current*q->reqsize]; + if (!(q->tds[current].ctrlsts & TD_STATUS_MASK)) + return &q->data[current*q->reqsize]; } /* reset queue if we fully processed it after underrun */ else if (q->qh->elementlinkptr & FLISTP_TERMINATE) { -- cgit v1.2.3