api: storage: Test all block device in dev_stor_get
authorEmmanuel Vadot <manu@bidouilliste.com>
Thu, 5 Jan 2017 05:40:21 +0000 (06:40 +0100)
committerTom Rini <trini@konsulko.com>
Fri, 20 Jan 2017 20:37:58 +0000 (15:37 -0500)
In a config with one MMC at device id '1' and no MMC at device id '0'
(a BeagleBone Black with no sd inserted for example), the current code
will first test to access the MMC 0 (sd port), seeing that no device is
present it will simply return that no more device are present for this
class.
This patch fixes this by testing all devices for each class.

Signed-off-by: Emmanuel Vadot <manu@bidouilliste.com>
api/api_storage.c

index bd4314472130c1e1fdb616aef177464b4a58df0a..e80818df1c426ed6942c8b1da266c81c691b0b9e 100644 (file)
@@ -88,90 +88,60 @@ void dev_stor_init(void)
  *
  * type:       storage group type - ENUM_IDE, ENUM_SCSI etc.
  *
- * first:      if 1 the first device in the storage group is returned (if
- *              exists), if 0 the next available device is searched
- *
  * more:       returns 0/1 depending if there are more devices in this group
  *             available (for future iterations)
  *
  * returns:    0/1 depending if device found in this iteration
  */
-static int dev_stor_get(int type, int first, int *more, struct device_info *di)
+static int dev_stor_get(int type, int *more, struct device_info *di)
 {
-       int found = 0;
-       *more = 0;
-
-       int i;
-
        struct blk_desc *dd;
+       int found = 0;
+       int i = 0;
 
        /* Wasn't configured for this type, return 0 directly */
        if (specs[type].name == NULL)
                return 0;
 
-       if (first) {
-               di->cookie = (void *)blk_get_dev(specs[type].name, 0);
-               if (di->cookie == NULL)
-                       return 0;
-               else
-                       found = 1;
-
-               /*
-                * provide hint if there are more devices in
-                * this group to enumerate
-                */
-               if (1 < specs[type].max_dev)
-                       *more = 1;
-
-       } else {
-               for (i = 0; i < specs[type].max_dev; i++)
+       if (di->cookie != NULL) {
+               /* Find the last device we've returned  */
+               for (i = 0; i < specs[type].max_dev; i++) {
                        if (di->cookie ==
                            (void *)blk_get_dev(specs[type].name, i)) {
-                               /*
-                                * previous cookie found -- advance to the
-                                * next device, if possible
-                                */
-
-                               if (++i >= specs[type].max_dev) {
-                                       /* out of range, no more to enum */
-                                       di->cookie = NULL;
-                                       break;
-                               }
-
-                               di->cookie = (void *)blk_get_dev(
-                                                       specs[type].name, i);
-                               if (di->cookie == NULL)
-                                       return 0;
-                               else
-                                       found = 1;
-
-                               /*
-                                * provide hint if there are more devices in
-                                * this group to enumerate
-                                */
-                               if ((i + 1) < specs[type].max_dev)
-                                       *more = 1;
-
+                               i += 1;
                                break;
                        }
+               }
        }
 
-       if (found) {
-               di->type = specs[type].type;
+       for (; i < specs[type].max_dev; i++) {
+               di->cookie = (void *)blk_get_dev(specs[type].name, i);
 
                if (di->cookie != NULL) {
-                       dd = (struct blk_desc *)di->cookie;
-                       if (dd->type == DEV_TYPE_UNKNOWN) {
-                               debugf("device instance exists, but is not active..");
-                               found = 0;
-                       } else {
-                               di->di_stor.block_count = dd->lba;
-                               di->di_stor.block_size = dd->blksz;
-                       }
+                       found = 1;
+                       break;
                }
+       }
+
+       if (i == specs[type].max_dev)
+               *more = 0;
+       else
+               *more = 1;
 
-       } else
+       if (found) {
+               di->type = specs[type].type;
+
+               dd = (struct blk_desc *)di->cookie;
+               if (dd->type == DEV_TYPE_UNKNOWN) {
+                       debugf("device instance exists, but is not active..");
+                       found = 0;
+               } else {
+                       di->di_stor.block_count = dd->lba;
+                       di->di_stor.block_size = dd->blksz;
+               }
+       } else {
                di->cookie = NULL;
+       }
 
        return found;
 }
@@ -230,7 +200,7 @@ static int dev_enum_stor(int type, struct device_info *di)
                 * 1. Enumeration (re-)started: take the first available
                 * device, if exists
                 */
-               found = dev_stor_get(type, 1, &more, di);
+               found = dev_stor_get(type, &more, di);
                specs[type].enum_started = 1;
 
        } else if (dev_is_stor(type, di)) {
@@ -242,7 +212,7 @@ static int dev_enum_stor(int type, struct device_info *di)
                }
 
                /* 2a. Attempt to take a next available device in the group */
-               found = dev_stor_get(type, 0, &more, di);
+               found = dev_stor_get(type, &more, di);
 
        } else {
                if (specs[type].enum_ended) {
@@ -266,7 +236,7 @@ static int dev_enum_stor(int type, struct device_info *di)
                         * Attempt to take the first device in this group:
                         *'first element' flag is set
                         */
-                       found = dev_stor_get(type, 1, &more, di);
+                       found = dev_stor_get(type, &more, di);
 
                } else {
                        errf("group%d - out of order iteration\n", type);