summaryrefslogtreecommitdiff
path: root/api
diff options
context:
space:
mode:
authorEmmanuel Vadot <manu@bidouilliste.com>2017-01-05 06:40:21 +0100
committerTom Rini <trini@konsulko.com>2017-01-20 15:37:58 -0500
commitd3e8f63026fa37dc09dcfd803df81e5452f87df9 (patch)
tree809b6a2f91f30e8d1b54d8a156c3aaf7baabffd5 /api
parent6215bd4c1fd6bce95072ad123cf1e4af94ab44e2 (diff)
downloadu-boot-d3e8f63026fa37dc09dcfd803df81e5452f87df9.tar.gz
u-boot-d3e8f63026fa37dc09dcfd803df81e5452f87df9.tar.bz2
u-boot-d3e8f63026fa37dc09dcfd803df81e5452f87df9.zip
api: storage: Test all block device in dev_stor_get
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>
Diffstat (limited to 'api')
-rw-r--r--api/api_storage.c98
1 files 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);