[coreboot-gerrit] New patch to review for coreboot: a7f9ea3 libpayload: usb: xhci: Fix TD size if it overflows 5 bits

Marc Jones (marc.jones@se-eng.com) gerrit at coreboot.org
Mon Dec 22 23:03:15 CET 2014


Marc Jones (marc.jones at se-eng.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/7913

-gerrit

commit a7f9ea3032cb323fd36d20736ad893ce85ea5473
Author: Rajmohan Mani <rajmohan.mani at intel.com>
Date:   Fri May 30 13:06:01 2014 -0700

    libpayload: usb: xhci: Fix TD size if it overflows 5 bits
    
    xHCI Spec says TD Size (5 bits) field shall be forced to 31,
    if the number of packets to be scheduled is greater than 31.
    
    BUG=chrome-os-partner:27837
    BRANCH=rambi,nyan
    TEST=Manual: Ensure recovery boot with USB 2.0 media on Squawks
    works fine without any babble errors.
    
    Original-Change-Id: Iff14000e2a0ca1b28c49d0da921dbb2a350a1bbd
    Original-Signed-off-by: Rajmohan Mani <rajmohan.mani at intel.com>
    Original-Originally-Reviewed-on: https://chromium-review.googlesource.com/202297
    Original-Reviewed-on: https://chromium-review.googlesource.com/202330
    Original-Reviewed-by: Shawn Nematbakhsh <shawnn at chromium.org>
    Original-Commit-Queue: Julius Werner <jwerner at chromium.org>
    Tested-by: Julius Werner <jwerner at chromium.org>
    (cherry picked from commit ae58b99370df3a86bf15d84b97db858a968b1dbd)
    Signed-off-by: Marc Jones <marc.jones at se-eng.com>
    
    Change-Id: I9668b947f676c109fad9297e5efde91bf7f796fd
---
 payloads/libpayload/drivers/usb/xhci.c         | 2 +-
 payloads/libpayload/drivers/usb/xhci_private.h | 2 ++
 2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/payloads/libpayload/drivers/usb/xhci.c b/payloads/libpayload/drivers/usb/xhci.c
index 9807858..f9f7cfc 100644
--- a/payloads/libpayload/drivers/usb/xhci.c
+++ b/payloads/libpayload/drivers/usb/xhci.c
@@ -539,7 +539,7 @@ xhci_enqueue_td(transfer_ring_t *const tr, const int ep, const size_t mps,
 		xhci_clear_trb(trb, tr->pcs);
 		trb->ptr_low = virt_to_phys(cur_start);
 		TRB_SET(TL, trb, cur_length);
-		TRB_SET(TDS, trb, packets);
+		TRB_SET(TDS, trb,((packets > TRB_MAX_TD_SIZE) ? TRB_MAX_TD_SIZE : packets));
 		TRB_SET(CH, trb, 1);
 
 		/* Check for first, data stage TRB */
diff --git a/payloads/libpayload/drivers/usb/xhci_private.h b/payloads/libpayload/drivers/usb/xhci_private.h
index 09312ba..43800d8 100644
--- a/payloads/libpayload/drivers/usb/xhci_private.h
+++ b/payloads/libpayload/drivers/usb/xhci_private.h
@@ -139,6 +139,8 @@ typedef volatile struct trb {
 	u32 control;
 } trb_t;
 
+#define TRB_MAX_TD_SIZE	0x1F			/* bits 21:17 of TD Size in TRB */
+
 #define EVENT_RING_SIZE 64
 typedef struct {
 	trb_t *ring;



More information about the coreboot-gerrit mailing list