[openfirmware] [commit] r3726 - dev/usb2/device/storage

repository service svn at openfirmware.info
Sat May 10 05:44:06 CEST 2014


Author: quozl
Date: Sat May 10 05:44:05 2014
New Revision: 3726
URL: http://tracker.coreboot.org/trac/openfirmware/changeset/3726

Log:
scsidisk - retry TEST UNIT READY once

Some USB flash drives violate section 3.4 of the USB Mass Storage
Specification For Bootability 1.0, October 25, 2004, by responding to
TEST UNIT READY with CHECK CONDITION status with a sense key of NOT
READY, and an additional sense code of MEDIUM NOT PRESENT.

Section 3.4 says "If the Device cannot become operational or in a
state such that a Host Computer action is required to make the Device
ready, the Device returns CHECK CONDITION status with a sense key of
NOT READY."

So the device either cannot become operational, or requires action of
the host.

However, a second TEST UNIT READY is successful, without any other
action of the host other than trying again.

READ CAPACITY and READ commands also fail if they are done first,
before the device admits to being ready.

Section 3.4 also says "Devices are expected to respond promptly to
indicate the current status of the Device."

Section 6.1 of the USB Mass Storage Class - Compliance Test
Specification 0.9a, June 30, 2006, says "Issue a Test Unit Ready
command.  Repeat until the device indicates a ready state."

Modified:
   dev/usb2/device/storage/scsidisk.fth

Modified: dev/usb2/device/storage/scsidisk.fth
==============================================================================
--- dev/usb2/device/storage/scsidisk.fth	Tue Apr 29 23:06:32 2014	(r3725)
+++ dev/usb2/device/storage/scsidisk.fth	Sat May 10 05:44:05 2014	(r3726)
@@ -43,6 +43,14 @@
    " "(00 00 00 00 00 00)" drop  no-data-command  0=
 ;
 
+\ Some devices require a second TEST UNIT READY, despite returning
+\ CHECK CONDITION, with sense NOT READY and MEDIUM NOT PRESENT.
+
+: retry-unit-ready?  ( -- ready? )
+   unit-ready?  ?dup  if  exit  then
+   unit-ready?
+;
+
 \ Ensures that the disk is spinning, but doesn't wait forever
 
 create sstart-cmd  h# 1b c, 0 c, 0 c, 0 c, 1 c, 0 c,
@@ -206,7 +214,7 @@
       \ up to 30 secs to spin up.
       d# 45 d# 1000 *  set-timeout
 
-      unit-ready?  0=  if  false  exit  then
+      retry-unit-ready?  0=  if  false  exit  then
 
       \ It might be a good idea to do an inquiry here to determine the
       \ device configuration, checking the result to see if the device



More information about the openfirmware mailing list