usb_storage : scan all interfaces to find a storage device
authorFranck Jullien <franck.jullien@gmail.com>
Wed, 4 Mar 2015 20:07:00 +0000 (21:07 +0100)
committerMarek Vasut <marex@denx.de>
Tue, 14 Apr 2015 03:47:47 +0000 (05:47 +0200)
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>
common/usb_storage.c

index 1411737bed8912180810c0e9cb239f4602a52bfa..05c96a8defe441d937900a6fae39fbb366a9e652 100644 (file)
@@ -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",