diff mbox

[U-Boot,v3] usb_storage : scan all interfaces to find a storage device

Message ID 1425499620-6319-1-git-send-email-franck.jullien@gmail.com
State Awaiting Upstream
Delegated to: Ɓukasz Majewski
Headers show

Commit Message

Franck Jullien March 4, 2015, 8:07 p.m. UTC
From: Franck Jullien <franck.jullien@gmail.com>

Mass storage is not necessary present on interface 0. This
patch allow usb_stor_scan to look in every available interface.

Signed-off-by: Franck Jullien <franck.jullien@gmail.com>
---

v2: create a new function to improve indentation

v3: more indentation improvement

 common/usb_storage.c |   45 ++++++++++++++++++++++++++++-----------------
 1 files changed, 28 insertions(+), 17 deletions(-)

Comments

Marek Vasut March 5, 2015, 1:52 p.m. UTC | #1
On Wednesday, March 04, 2015 at 09:07:00 PM, franck.jullien@gmail.com wrote:
> From: Franck Jullien <franck.jullien@gmail.com>
> 
> Mass storage is not necessary present on interface 0. This
> patch allow usb_stor_scan to look in every available interface.
> 
> Signed-off-by: Franck Jullien <franck.jullien@gmail.com>

Thanks!

Acked-by: Marek Vasut <marex@denx.de>

Are you OK if I apply this for -next (that is, after 2015.04 is out) ?

Best regards,
Marek Vasut
Franck Jullien March 5, 2015, 2:11 p.m. UTC | #2
2015-03-05 14:52 GMT+01:00 Marek Vasut <marex@denx.de>:
> On Wednesday, March 04, 2015 at 09:07:00 PM, franck.jullien@gmail.com wrote:
>> From: Franck Jullien <franck.jullien@gmail.com>
>>
>> Mass storage is not necessary present on interface 0. This
>> patch allow usb_stor_scan to look in every available interface.
>>
>> Signed-off-by: Franck Jullien <franck.jullien@gmail.com>
>
> Thanks!
>
> Acked-by: Marek Vasut <marex@denx.de>
>
> Are you OK if I apply this for -next (that is, after 2015.04 is out) ?
>
> Best regards,
> Marek Vasut

Sure, there is no hurry.

Franck.
Marek Vasut March 5, 2015, 3:19 p.m. UTC | #3
On Thursday, March 05, 2015 at 03:11:25 PM, Franck Jullien wrote:
> 2015-03-05 14:52 GMT+01:00 Marek Vasut <marex@denx.de>:
> > On Wednesday, March 04, 2015 at 09:07:00 PM, franck.jullien@gmail.com wrote:
> >> From: Franck Jullien <franck.jullien@gmail.com>
> >> 
> >> Mass storage is not necessary present on interface 0. This
> >> patch allow usb_stor_scan to look in every available interface.
> >> 
> >> Signed-off-by: Franck Jullien <franck.jullien@gmail.com>
> > 
> > Thanks!
> > 
> > Acked-by: Marek Vasut <marex@denx.de>
> > 
> > Are you OK if I apply this for -next (that is, after 2015.04 is out) ?
> > 
> > Best regards,
> > Marek Vasut
> 
> Sure, there is no hurry.

Applied for -next , thanks!

Best regards,
Marek Vasut
Simon Glass April 17, 2015, 4:33 p.m. UTC | #4
+Tom

Hi Franck,

On 4 March 2015 at 13:07,  <franck.jullien@gmail.com> wrote:
> From: Franck Jullien <franck.jullien@gmail.com>
>
> Mass storage is not necessary present on interface 0. This
> patch allow usb_stor_scan to look in every available interface.
>
> Signed-off-by: Franck Jullien <franck.jullien@gmail.com>
> ---
>
> v2: create a new function to improve indentation
>
> v3: more indentation improvement
>
>  common/usb_storage.c |   45 ++++++++++++++++++++++++++++-----------------
>  1 files changed, 28 insertions(+), 17 deletions(-)
>
> diff --git a/common/usb_storage.c b/common/usb_storage.c
> index 1411737..05c96a8 100644
> --- a/common/usb_storage.c
> +++ b/common/usb_storage.c
> @@ -208,6 +208,30 @@ static unsigned int usb_get_max_lun(struct us_data *us)
>         return (len > 0) ? *result : 0;
>  }
>
> +static int usb_storage_register(struct usb_device *dev, unsigned char iface)
> +{
> +       int lun, max_lun, start = usb_max_devs;
> +       int nb_dev = 0;
> +
> +       if (!usb_storage_probe(dev, iface, &usb_stor[usb_max_devs]))
> +               return nb_dev;
> +
> +       /*
> +        * OK, it's a storage device.  Iterate over its LUNs
> +        * and populate `usb_dev_desc'.
> +        */
> +       max_lun = usb_get_max_lun(&usb_stor[usb_max_devs]);
> +       for (lun = 0; lun <= max_lun && usb_max_devs < USB_MAX_STOR_DEV; lun++) {
> +               usb_dev_desc[usb_max_devs].lun = lun;
> +               if (usb_stor_get_info(dev, &usb_stor[start],
> +                   &usb_dev_desc[usb_max_devs]) == 1) {
> +                       nb_dev++;

Should start or usb_max_devs increase here? This will use the same
block_dev_desc_t for each device, won't it?

> +               }
> +       }
> +
> +       return nb_dev;
> +}
> +
>  /*******************************************************************************
>   * scan the usb and reports device info
>   * to the user if mode = 1
> @@ -215,7 +239,7 @@ static unsigned int usb_get_max_lun(struct us_data *us)
>   */
>  int usb_stor_scan(int mode)
>  {
> -       unsigned char i;
> +       unsigned char i, iface;
>         struct usb_device *dev;
>
>         if (mode == 1)
> @@ -241,23 +265,10 @@ int usb_stor_scan(int mode)
>                 if (dev == NULL)
>                         break; /* no more devices available */
>
> -               if (usb_storage_probe(dev, 0, &usb_stor[usb_max_devs])) {
> -                       /* OK, it's a storage device.  Iterate over its LUNs
> -                        * and populate `usb_dev_desc'.
> -                        */
> -                       int lun, max_lun, start = usb_max_devs;
> -
> -                       max_lun = usb_get_max_lun(&usb_stor[usb_max_devs]);
> -                       for (lun = 0;
> -                            lun <= max_lun && usb_max_devs < USB_MAX_STOR_DEV;
> -                            lun++) {
> -                               usb_dev_desc[usb_max_devs].lun = lun;
> -                               if (usb_stor_get_info(dev, &usb_stor[start],
> -                                   &usb_dev_desc[usb_max_devs]) == 1) {
> -                                       usb_max_devs++;
> -                               }
> -                       }
> +               for (iface = 0; iface < dev->config.no_of_if; iface++) {
> +                       usb_max_devs += usb_storage_register(dev, iface);
>                 }
> +
>                 /* if storage device */
>                 if (usb_max_devs == USB_MAX_STOR_DEV) {
>                         printf("max USB Storage Device reached: %d stopping\n",
> --
> 1.7.1
>

Regards,
Simon
Franck Jullien April 17, 2015, 9:09 p.m. UTC | #5
Hi Simon,

2015-04-17 18:33 GMT+02:00 Simon Glass <sjg@chromium.org>:
> +Tom
>
> Hi Franck,
>
> On 4 March 2015 at 13:07,  <franck.jullien@gmail.com> wrote:
>> From: Franck Jullien <franck.jullien@gmail.com>
>>
>> Mass storage is not necessary present on interface 0. This
>> patch allow usb_stor_scan to look in every available interface.
>>
>> Signed-off-by: Franck Jullien <franck.jullien@gmail.com>
>> ---
>>
>> v2: create a new function to improve indentation
>>
>> v3: more indentation improvement
>>
>>  common/usb_storage.c |   45 ++++++++++++++++++++++++++++-----------------
>>  1 files changed, 28 insertions(+), 17 deletions(-)
>>
>> diff --git a/common/usb_storage.c b/common/usb_storage.c
>> index 1411737..05c96a8 100644
>> --- a/common/usb_storage.c
>> +++ b/common/usb_storage.c
>> @@ -208,6 +208,30 @@ static unsigned int usb_get_max_lun(struct us_data *us)
>>         return (len > 0) ? *result : 0;
>>  }
>>
>> +static int usb_storage_register(struct usb_device *dev, unsigned char iface)
>> +{
>> +       int lun, max_lun, start = usb_max_devs;
>> +       int nb_dev = 0;
>> +
>> +       if (!usb_storage_probe(dev, iface, &usb_stor[usb_max_devs]))
>> +               return nb_dev;
>> +
>> +       /*
>> +        * OK, it's a storage device.  Iterate over its LUNs
>> +        * and populate `usb_dev_desc'.
>> +        */
>> +       max_lun = usb_get_max_lun(&usb_stor[usb_max_devs]);
>> +       for (lun = 0; lun <= max_lun && usb_max_devs < USB_MAX_STOR_DEV; lun++) {
>> +               usb_dev_desc[usb_max_devs].lun = lun;
>> +               if (usb_stor_get_info(dev, &usb_stor[start],
>> +                   &usb_dev_desc[usb_max_devs]) == 1) {
>> +                       nb_dev++;
>
> Should start or usb_max_devs increase here? This will use the same
> block_dev_desc_t for each device, won't it?
>

Good catch. I'll write a patch when I have some time (or someone can do that).
However, I won't be able to test it on hardware because I don't have
access to it anymore.

We could also revert this patch. Sorry for my mistake.

Franck.
diff mbox

Patch

diff --git a/common/usb_storage.c b/common/usb_storage.c
index 1411737..05c96a8 100644
--- a/common/usb_storage.c
+++ b/common/usb_storage.c
@@ -208,6 +208,30 @@  static unsigned int usb_get_max_lun(struct us_data *us)
 	return (len > 0) ? *result : 0;
 }
 
+static int usb_storage_register(struct usb_device *dev, unsigned char iface)
+{
+	int lun, max_lun, start = usb_max_devs;
+	int nb_dev = 0;
+
+	if (!usb_storage_probe(dev, iface, &usb_stor[usb_max_devs]))
+		return nb_dev;
+
+	/*
+	 * OK, it's a storage device.  Iterate over its LUNs
+	 * and populate `usb_dev_desc'.
+	 */
+	max_lun = usb_get_max_lun(&usb_stor[usb_max_devs]);
+	for (lun = 0; lun <= max_lun && usb_max_devs < USB_MAX_STOR_DEV; lun++) {
+		usb_dev_desc[usb_max_devs].lun = lun;
+		if (usb_stor_get_info(dev, &usb_stor[start],
+		    &usb_dev_desc[usb_max_devs]) == 1) {
+			nb_dev++;
+		}
+	}
+
+	return nb_dev;
+}
+
 /*******************************************************************************
  * scan the usb and reports device info
  * to the user if mode = 1
@@ -215,7 +239,7 @@  static unsigned int usb_get_max_lun(struct us_data *us)
  */
 int usb_stor_scan(int mode)
 {
-	unsigned char i;
+	unsigned char i, iface;
 	struct usb_device *dev;
 
 	if (mode == 1)
@@ -241,23 +265,10 @@  int usb_stor_scan(int mode)
 		if (dev == NULL)
 			break; /* no more devices available */
 
-		if (usb_storage_probe(dev, 0, &usb_stor[usb_max_devs])) {
-			/* OK, it's a storage device.  Iterate over its LUNs
-			 * and populate `usb_dev_desc'.
-			 */
-			int lun, max_lun, start = usb_max_devs;
-
-			max_lun = usb_get_max_lun(&usb_stor[usb_max_devs]);
-			for (lun = 0;
-			     lun <= max_lun && usb_max_devs < USB_MAX_STOR_DEV;
-			     lun++) {
-				usb_dev_desc[usb_max_devs].lun = lun;
-				if (usb_stor_get_info(dev, &usb_stor[start],
-				    &usb_dev_desc[usb_max_devs]) == 1) {
-					usb_max_devs++;
-				}
-			}
+		for (iface = 0; iface < dev->config.no_of_if; iface++) {
+			usb_max_devs += usb_storage_register(dev, iface);
 		}
+
 		/* if storage device */
 		if (usb_max_devs == USB_MAX_STOR_DEV) {
 			printf("max USB Storage Device reached: %d stopping\n",