aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorCristian Ciocaltea <cristian.ciocaltea@gmail.com>2018-12-18 20:03:49 +0200
committerTom Rini <trini@konsulko.com>2018-12-26 21:21:07 -0500
commit8efae021db1166ea07be0b2eda7f074d767843ea (patch)
tree215aa56505d6c94cc6ca5768664206a78ffca756
parenta7f4b4b344396590845e6552c82829ef68ef9f89 (diff)
downloadu-boot-8efae021db1166ea07be0b2eda7f074d767843ea.zip
u-boot-8efae021db1166ea07be0b2eda7f074d767843ea.tar.gz
u-boot-8efae021db1166ea07be0b2eda7f074d767843ea.tar.bz2
api: storage: Fix enumeration of storage devices
dev_stor_get() is not able to find the next available device in the current storage group when the previous enumerated device belongs to a different group or class (e.g. network). The root cause is the device group iterator not being reset after an unsuccessful search for the last returned device so that the following search for the next available device will start from beginning. The issue has been identified by loading and booting GRUB in a QEMU vexpress-a9 environment. Signed-off-by: Cristian Ciocaltea <cristian.ciocaltea@iquestgroup.com>
-rw-r--r--api/api_storage.c5
1 files changed, 5 insertions, 0 deletions
diff --git a/api/api_storage.c b/api/api_storage.c
index 8aeeda2..2b90c18 100644
--- a/api/api_storage.c
+++ b/api/api_storage.c
@@ -99,6 +99,7 @@ static int dev_stor_get(int type, int *more, struct device_info *di)
{
struct blk_desc *dd;
int found = 0;
+ int found_last = 0;
int i = 0;
/* Wasn't configured for this type, return 0 directly */
@@ -111,9 +112,13 @@ static int dev_stor_get(int type, int *more, struct device_info *di)
if (di->cookie ==
(void *)blk_get_dev(specs[type].name, i)) {
i += 1;
+ found_last = 1;
break;
}
}
+
+ if (!found_last)
+ i = 0;
}
for (; i < specs[type].max_dev; i++) {