[U-Boot] [PATCH] api: storage: Test all block device in dev_stor_get

Emmanuel Vadot manu at bidouilliste.com
Thu Jan 5 06:40:21 CET 2017


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 at bidouilliste.com>
---
 api/api_storage.c | 98 +++++++++++++++++++------------------------------------
 1 file changed, 34 insertions(+), 64 deletions(-)

diff --git a/api/api_storage.c b/api/api_storage.c
index bd43144721..e80818df1c 100644
--- a/api/api_storage.c
+++ b/api/api_storage.c
@@ -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);
-- 
2.11.0



More information about the U-Boot mailing list