|
@@ -27,16 +27,28 @@
|
|
|
DECLARE_GLOBAL_DATA_PTR;
|
|
|
|
|
|
#ifdef CONFIG_HAVE_BLOCK_DEVICE
|
|
|
-static struct part_driver *part_driver_lookup_type(int part_type)
|
|
|
+static struct part_driver *part_driver_lookup_type(struct blk_desc *dev_desc)
|
|
|
{
|
|
|
struct part_driver *drv =
|
|
|
ll_entry_start(struct part_driver, part_driver);
|
|
|
const int n_ents = ll_entry_count(struct part_driver, part_driver);
|
|
|
struct part_driver *entry;
|
|
|
|
|
|
- for (entry = drv; entry != drv + n_ents; entry++) {
|
|
|
- if (part_type == entry->part_type)
|
|
|
- return entry;
|
|
|
+ if (dev_desc->part_type == PART_TYPE_UNKNOWN) {
|
|
|
+ for (entry = drv; entry != drv + n_ents; entry++) {
|
|
|
+ int ret;
|
|
|
+
|
|
|
+ ret = entry->test(dev_desc);
|
|
|
+ if (!ret) {
|
|
|
+ dev_desc->part_type = entry->part_type;
|
|
|
+ return entry;
|
|
|
+ }
|
|
|
+ }
|
|
|
+ } else {
|
|
|
+ for (entry = drv; entry != drv + n_ents; entry++) {
|
|
|
+ if (dev_desc->part_type == entry->part_type)
|
|
|
+ return entry;
|
|
|
+ }
|
|
|
}
|
|
|
|
|
|
/* Not found */
|
|
@@ -285,7 +297,7 @@ void part_print(struct blk_desc *dev_desc)
|
|
|
{
|
|
|
struct part_driver *drv;
|
|
|
|
|
|
- drv = part_driver_lookup_type(dev_desc->part_type);
|
|
|
+ drv = part_driver_lookup_type(dev_desc);
|
|
|
if (!drv) {
|
|
|
printf("## Unknown partition table type %x\n",
|
|
|
dev_desc->part_type);
|
|
@@ -314,7 +326,7 @@ int part_get_info(struct blk_desc *dev_desc, int part,
|
|
|
info->type_guid[0] = 0;
|
|
|
#endif
|
|
|
|
|
|
- drv = part_driver_lookup_type(dev_desc->part_type);
|
|
|
+ drv = part_driver_lookup_type(dev_desc);
|
|
|
if (!drv) {
|
|
|
debug("## Unknown partition table type %x\n",
|
|
|
dev_desc->part_type);
|