[coreboot-gerrit] New patch to review for coreboot: libpayload: usb: Retry get_descriptor() on failure

Patrick Georgi (pgeorgi@google.com) gerrit at coreboot.org
Fri Oct 23 13:25:39 CEST 2015


Patrick Georgi (pgeorgi at google.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/12133

-gerrit

commit 9efd93e6277537dfc76c2cba49425319d1f892a3
Author: Shawn Nematbakhsh <shawnn at chromium.org>
Date:   Thu Sep 24 14:45:10 2015 -0700

    libpayload: usb: Retry get_descriptor() on failure
    
    Certain Lexar USB disks may fail during the first calls to
    get_descriptor(..., DT_CFG, ...) for unknown reasons. Therefore, make
    several attempts before giving up.
    
    BUG=chromium:466758
    TEST=Manual on Samus. Go to recovery mode, verify that Lexar LJDS70 USB
    stick is bootable.
    BRANCH=None
    
    Change-Id: I476ac22f9c4f844c60ebc6e53af8c144d70bb9d4
    Signed-off-by: Patrick Georgi <pgeorgi at chromium.org>
    Original-Commit-Id: 93a0570b343479dd22506ad4d7961f0ea4251f8c
    Original-Signed-off-by: Shawn Nematbakhsh <shawnn at chromium.org>
    Original-Change-Id: Ie581c7c71c53816065c7f59202581888a79e445e
    Original-Reviewed-on: https://chromium-review.googlesource.com/302403
    Original-Commit-Ready: Shawn N <shawnn at chromium.org>
    Original-Tested-by: Shawn N <shawnn at chromium.org>
    Original-Reviewed-by: Julius Werner <jwerner at chromium.org>
---
 payloads/libpayload/drivers/usb/usb.c | 35 ++++++++++++++++++++++++++---------
 1 file changed, 26 insertions(+), 9 deletions(-)

diff --git a/payloads/libpayload/drivers/usb/usb.c b/payloads/libpayload/drivers/usb/usb.c
index ffbe005..e87e397 100644
--- a/payloads/libpayload/drivers/usb/usb.c
+++ b/payloads/libpayload/drivers/usb/usb.c
@@ -149,19 +149,36 @@ get_status (usbdev_t *dev, int intf, int rtype, int len, void *data)
 	return dev->controller->control (dev, IN, sizeof (dr), &dr, len, data);
 }
 
+/*
+ * Certain Lexar / Micron USB 2.0 disks will fail the get_descriptor(DT_CFG)
+ * call due to timing issues. Work around this by making extra attempts on
+ * failure.
+ */
+#define GET_DESCRIPTOR_TRIES 3
+
 int
-get_descriptor (usbdev_t *dev, int rtype, int descType, int descIdx,
+get_descriptor(usbdev_t *dev, int rtype, int desc_type, int desc_idx,
 		void *data, size_t len)
 {
 	dev_req_t dr;
-
-	dr.bmRequestType = rtype;
-	dr.bRequest = GET_DESCRIPTOR;
-	dr.wValue = descType << 8 | descIdx;
-	dr.wIndex = 0;
-	dr.wLength = len;
-
-	return dev->controller->control (dev, IN, sizeof (dr), &dr, len, data);
+	int fail_tries = 0;
+	int ret = 0;
+
+	while (fail_tries++ < GET_DESCRIPTOR_TRIES) {
+		dr.bmRequestType = rtype;
+		dr.bRequest = GET_DESCRIPTOR;
+		dr.wValue = desc_type << 8 | desc_idx;
+		dr.wIndex = 0;
+		dr.wLength = len;
+
+		ret = dev->controller->control(dev, IN,
+				sizeof(dr), &dr, len, data);
+		if (ret)
+			udelay(10);
+		else
+			return 0;
+	}
+	return ret;
 }
 
 int



More information about the coreboot-gerrit mailing list