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 <nico.huber@secunet.com>
Reviewed-on: http://review.coreboot.org/1901
Reviewed-by: Patrick Georgi <patrick@georgi-clan.de>
Tested-by: build bot (Jenkins)
diff --git a/payloads/libpayload/drivers/usb/uhci.c b/payloads/libpayload/drivers/usb/uhci.c
index 386392b..bf611d2 100644
--- a/payloads/libpayload/drivers/usb/uhci.c
+++ b/payloads/libpayload/drivers/usb/uhci.c
@@ -572,7 +572,6 @@
 {
 	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 @@
 		}
 		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) {