Patchwork [U-Boot,09/11] usb: properly detect empty mass storage media reader

login
register
mail settings
Submitter Simon Glass
Date Dec. 13, 2012, 1:55 a.m.
Message ID <1355363731-10103-10-git-send-email-sjg@chromium.org>
Download mbox | patch
Permalink /patch/205706/
State Superseded, archived
Delegated to: Marek Vasut
Headers show

Comments

Simon Glass - Dec. 13, 2012, 1:55 a.m.
From: Vincent Palatin <vpalatin@chromium.org>

When a USB card reader is empty, it will return "Not Ready - medium not
present" as Key Code Qualifier. In that situation, it's useless waiting
for the full timeout since the result won't change until the user
inserts a card.

Signed-off-by: Vincent Palatin <vpalatin@chromium.org>
Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
Signed-off-by: Simon Glass <sjg@chromium.org>
---
 common/usb_storage.c |   10 ++++++++++
 1 files changed, 10 insertions(+), 0 deletions(-)
Marek Vasut - Dec. 13, 2012, 5:37 p.m.
Dear Simon Glass,

> From: Vincent Palatin <vpalatin@chromium.org>
> 
> When a USB card reader is empty, it will return "Not Ready - medium not
> present" as Key Code Qualifier. In that situation, it's useless waiting
> for the full timeout since the result won't change until the user
> inserts a card.

Applied, thanks!

> Signed-off-by: Vincent Palatin <vpalatin@chromium.org>
> Signed-off-by: Vadim Bendebury <vbendeb@chromium.org>
> Signed-off-by: Simon Glass <sjg@chromium.org>
> ---
>  common/usb_storage.c |   10 ++++++++++
>  1 files changed, 10 insertions(+), 0 deletions(-)
> 
> diff --git a/common/usb_storage.c b/common/usb_storage.c
> index 2d92ee1..fb322b4 100644
> --- a/common/usb_storage.c
> +++ b/common/usb_storage.c
> @@ -970,6 +970,16 @@ static int usb_test_unit_ready(ccb *srb, struct
> us_data *ss) return 0;
>  		}
>  		usb_request_sense(srb, ss);
> +		/*
> +		 * Check the Key Code Qualifier, if it matches
> +		 * "Not Ready - medium not present"
> +		 * (the sense Key equals 0x2 and the ASC is 0x3a)
> +		 * return immediately as the medium being absent won't change
> +		 * unless there is a user action.
> +		 */
> +		if ((srb->sense_buf[2] == 0x02) &&
> +		    (srb->sense_buf[12] == 0x3a))
> +			return -1;
>  		mdelay(100);
>  	} while (retries--);

Best regards,
Marek Vasut

Patch

diff --git a/common/usb_storage.c b/common/usb_storage.c
index 2d92ee1..fb322b4 100644
--- a/common/usb_storage.c
+++ b/common/usb_storage.c
@@ -970,6 +970,16 @@  static int usb_test_unit_ready(ccb *srb, struct us_data *ss)
 			return 0;
 		}
 		usb_request_sense(srb, ss);
+		/*
+		 * Check the Key Code Qualifier, if it matches
+		 * "Not Ready - medium not present"
+		 * (the sense Key equals 0x2 and the ASC is 0x3a)
+		 * return immediately as the medium being absent won't change
+		 * unless there is a user action.
+		 */
+		if ((srb->sense_buf[2] == 0x02) &&
+		    (srb->sense_buf[12] == 0x3a))
+			return -1;
 		mdelay(100);
 	} while (retries--);