Skip to contentSkip to conversation

usb_storage : scan all interfaces to find a storage device

PATCH Superseded franck.jullien at gmail.com 3 participants 6 messages Mar 4, 2015 – Apr 17, 2015

lore
Share & tools
lore
#0 lore raw

PATCH v3 1/1 usb_storage : scan all interfaces to find a storage device

From: Franck Jullien <[email protected]>

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

---

v2: create a new function to improve indentation

v3: more indentation improvement

 common/usb_storage.c |   45 ++++++++++++++++++++++++++++-----------------
 1 files changed, 28 insertions(+), 17 deletions(-)
common/usb_storage.c +28 -17
index 1411737..05c96a8 100644
@@ -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",
Signature · 1 line
1.7.1
#1 lore raw

PATCH v3 1/1 usb_storage : scan all interfaces to find a storage device

Quoted 6 lines · franck.jullien at gmail.com

From: Franck Jullien <[email protected]>

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

Thanks!

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

Best regards,
Marek Vasut

#2 lore raw

PATCH v3 1/1 usb_storage : scan all interfaces to find a storage device

2015-03-05 14:52 GMT+01:00 Marek Vasut <[email protected]>:

Quoted 8 lines · franck.jullien at gmail.com
Quoted 6 lines

From: Franck Jullien <[email protected]>

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

Quoted 8 lines

Thanks!

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.

#3 lore raw

PATCH v3 1/1 usb_storage : scan all interfaces to find a storage device

Quoted 11 lines · Franck Jullien

2015-03-05 14:52 GMT+01:00 Marek Vasut <[email protected]>:

Quoted 10 lines · franck.jullien at gmail.com
Quoted 6 lines

From: Franck Jullien <[email protected]>

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

Thanks!

Quoted 8 lines
Quoted 6 lines

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

#4 lore raw

PATCH v3 1/1 usb_storage : scan all interfaces to find a storage device

In reply to franck.jullien at gmail.com

+Tom

Hi Franck,

Quoted 31 lines · On 4 March 2015 at 13:07, <[email protected]> wrote:

From: Franck Jullien <[email protected]>

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

---

v2: create a new function to improve indentation

v3: more indentation improvement

 common/usb_storage.c |   45 ++++++++++++++++++++++++++++-----------------
 1 files changed, 28 insertions(+), 17 deletions(-)
common/usb_storage.c +8 -0
index 1411737..05c96a8 100644
@@ -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;
+

common/usb_storage.c static unsigned int usb_get_max_lun(struct us_data *us) · line 228

Quoted 10 lines
common/usb_storage.c +10 -0
+       /*
+        * 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?

Quoted 46 lines
common/usb_storage.c +10 -18
+               }
+       }
+
+       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",
--
Quoted 2 lines

1.7.1

Regards,
Simon

#5 lore raw

PATCH v3 1/1 usb_storage : scan all interfaces to find a storage device

Hi Simon,

2015-04-17 18:33 GMT+02:00 Simon Glass <[email protected]>:

Quoted 41 lines

+Tom

Hi Franck,

Quoted 36 lines · On 4 March 2015 at 13:07, <[email protected]> wrote:

From: Franck Jullien <[email protected]>

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

---

v2: create a new function to improve indentation

v3: more indentation improvement

 common/usb_storage.c |   45 ++++++++++++++++++++++++++++-----------------
 1 files changed, 28 insertions(+), 17 deletions(-)
common/usb_storage.c +13 -0
index 1411737..05c96a8 100644
@@ -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]);
Quoted 9 lines

common/usb_storage.c static unsigned int usb_get_max_lun(struct us_data *us) · line 228

Quoted 5 lines
common/usb_storage.c +5 -0
+       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.