[coreboot-gerrit] New patch to review for coreboot: ab22ac4 libpayload: usb mass storage detect empty media

Stefan Reinauer (stefan.reinauer@coreboot.org) gerrit at coreboot.org
Wed Nov 20 01:33:15 CET 2013

Stefan Reinauer (stefan.reinauer at coreboot.org) just uploaded a new patch set to gerrit, which you can find at http://review.coreboot.org/4225


commit ab22ac4852a408e81654d6f90df354899f78f53a
Author: Aaron Durbin <adurbin at chromium.org>
Date:   Thu Jun 6 16:14:21 2013 -0500

    libpayload: usb mass storage detect empty media
    There is currently a hard-coded 30 sec delay in the mass storage
    driver while waiting for each device to become ready. However, mass
    storage card readers that are empty return an error code on the
    TEST UNIT READY command. A REQUEST SENSE command then needs to be
    issued and interrogate the data to determine if no media is present.
    If no media determination is found to be true the USB device is no
    longer considered a candidate to be a disk.
    This code does lead to the fact that the media card reader needs to be
    populated at enumeration time. I suspect this is not an issue as it
    appears the storage stack in libpayload can't handle removable media
    coming online later.
    Booted recovery and dev modes. Noted that removable mass storage
    devices with no media were ignored without any boot delay.
    Change-Id: Ida7a45614d97c6e6fbfc9bb099765aad4df550fd
    Signed-off-by: Aaron Durbin <adurbin at chromium.org>
    Reviewed-on: https://gerrit.chromium.org/gerrit/57828
    Reviewed-by: Duncan Laurie <dlaurie at chromium.org>
 payloads/libpayload/drivers/usb/usbmsc.c | 35 ++++++++++++++++++++++++++++++++
 1 file changed, 35 insertions(+)

diff --git a/payloads/libpayload/drivers/usb/usbmsc.c b/payloads/libpayload/drivers/usb/usbmsc.c
index ad7e82f..ffb1c93 100644
--- a/payloads/libpayload/drivers/usb/usbmsc.c
+++ b/payloads/libpayload/drivers/usb/usbmsc.c
@@ -123,6 +123,8 @@ enum {
 static int
 request_sense (usbdev_t *dev);
+static int
+request_sense_no_media (usbdev_t *dev);
 static int
 reset_transport (usbdev_t *dev)
@@ -256,6 +258,11 @@ execute_command (usbdev_t *dev, cbw_direction dir, const u8 *cb, int cblen,
 		if (cb[0] == 0x03)
 			/* requesting sense failed, that's bad */
 			return MSC_COMMAND_FAIL;
+		else if (cb[0] == 0)
+			/* If command was TEST UNIT READY determine if the
+			 * device is of removable type indicating no media
+			 * found. */
+			return request_sense_no_media (dev);
 		/* error "check condition" or reserved error */
 		ret = request_sense (dev);
 		/* return fail or the status of request_sense if it's worse */
@@ -350,6 +357,34 @@ request_sense (usbdev_t *dev)
 				sizeof (cb), buf, 19, 1);
+static int request_sense_no_media(usbdev_t *dev)
+	u8 buf[19];
+	int ret;
+	cmdblock6_t cb;
+	memset (&cb, 0, sizeof (cb));
+	cb.command = 0x3;
+	ret = execute_command (dev, cbw_direction_data_in, (u8 *) &cb,
+				sizeof (cb), buf, 19, 1);
+	if (ret)
+		return ret;
+	/* Check if sense key is set to NOT READY. */
+	if ((buf[2] & 0xf) != 2)
+	/* Check if additional sense code is 0x3a. */
+	if (buf[12] != 0x3a)
+	/* No media is present. Return MSC_COMMAND_DETACHED so as not to use
+	 * this device any longer. */
+	usb_debug("Empty media found.\n");
 static int
 test_unit_ready (usbdev_t *dev)

More information about the coreboot-gerrit mailing list