[coreboot-gerrit] New patch to review for coreboot: 1daeead libpayload: Increase accuracy of timeout period for media init.

Isaac Christensen (isaac.christensen@se-eng.com) gerrit at coreboot.org
Wed Aug 13 20:33:51 CEST 2014


Isaac Christensen (isaac.christensen at se-eng.com) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/6646

-gerrit

commit 1daeead73363cc7f3eb9768fe4e6389690b09775
Author: Shawn Nematbakhsh <shawnn at chromium.org>
Date:   Thu Sep 12 18:09:39 2013 -0700

    libpayload: Increase accuracy of timeout period for media init.
    
    When bringing up media, we claim to wait for up to 30 seconds for a
    device to respond to our TEST_UNIT_READY command. Actually, we can wait
    far longer because we do not take into account execution delay.
    
    To improve timeout accuracy, make use of gettimeofday(), which calculates
    time based upon a CPU counter. This improves the user experience
    slightly when certain non-working USB devices are used.
    
    Change-Id: Id9605ecfc0a522d7a0b039fd8eac541232605082
    Signed-off-by: Shawn Nematbakhsh <shawnn at chromium.org>
    Reviewed-on: https://chromium-review.googlesource.com/169208
    Reviewed-by: Julius Werner <jwerner at chromium.org>
    (cherry picked from commit 1d3d535db83ff478c512e37f37015b43927b3efc)
    Signed-off-by: Isaac Christensen <isaac.christensen at se-eng.com>
---
 payloads/libpayload/drivers/usb/usbmsc.c | 14 +++++++++-----
 1 file changed, 9 insertions(+), 5 deletions(-)

diff --git a/payloads/libpayload/drivers/usb/usbmsc.c b/payloads/libpayload/drivers/usb/usbmsc.c
index 0259b8d..f68bee5 100644
--- a/payloads/libpayload/drivers/usb/usbmsc.c
+++ b/payloads/libpayload/drivers/usb/usbmsc.c
@@ -537,22 +537,26 @@ static void
 usb_msc_test_unit_ready (usbdev_t *dev)
 {
 	int i;
+	time_t start_time_secs;
+	struct timeval tv;
 	/* SCSI/ATA specs say we have to wait up to 30s. Ugh */
-	const int timeout = 30 * 10;
+	const int timeout_secs = 30;
 
 	usb_debug ("  Waiting for device to become ready...");
 
 	/* Initially mark the device ready. */
 	usb_msc_mark_ready (dev);
+	gettimeofday (&tv, NULL);
+	start_time_secs = tv.tv_sec;
 
-	for (i = 0; i < timeout; i++) {
+	while (tv.tv_sec - start_time_secs < timeout_secs) {
 		switch (test_unit_ready (dev)) {
 		case MSC_COMMAND_OK:
 			break;
 		case MSC_COMMAND_FAIL:
 			mdelay (100);
-			if (!(timeout % 10))
-				usb_debug (".");
+			usb_debug (".");
+			gettimeofday (&tv, NULL);
 			continue;
 		default:
 			usb_debug ("detached. Device not ready.\n");
@@ -561,7 +565,7 @@ usb_msc_test_unit_ready (usbdev_t *dev)
 		}
 		break;
 	}
-	if (i >= timeout) {
+	if (!(tv.tv_sec - start_time_secs < timeout_secs)) {
 		usb_debug ("timeout. Device not ready.\n");
 		usb_msc_mark_not_ready (dev);
 	}



More information about the coreboot-gerrit mailing list