There was a bug logically in the order of nand_flash_detect_onfi
and checking nand_flash_ids. We should get NAND devices related
informations first by ONFI method instead of querying nand_flash_ids table,
if ONFI fails, then query nand_flash_ids table.

Signed-off-by: Shengzhou Liu <shengzhou....@freescale.com>
---
 drivers/mtd/nand/nand_base.c |   48 +++++++++++++++++++++--------------------
 1 files changed, 25 insertions(+), 23 deletions(-)

diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
index 6aac6a2..8d03f54 100644
--- a/drivers/mtd/nand/nand_base.c
+++ b/drivers/mtd/nand/nand_base.c
@@ -2585,36 +2585,38 @@ static const struct nand_flash_dev 
*nand_get_flash_type(struct mtd_info *mtd,
                return ERR_PTR(-ENODEV);
        }
 
-       if (!type)
-               type = nand_flash_ids;
+       ret = nand_flash_detect_onfi(mtd, chip, &busw);
+       if (!ret) {
+               if (!type)
+                       type = nand_flash_ids;
 
-       for (; type->name != NULL; type++)
-               if (*dev_id == type->id)
-                       break;
+               for (; type->name != NULL; type++)
+                       if (*dev_id == type->id)
+                               break;
 
-       if (!type->name) {
-               /* supress warning if there is no nand */
-               if (*maf_id != 0x00 && *maf_id != 0xff &&
-                   *dev_id  != 0x00 && *dev_id  != 0xff)
-                       printk(KERN_INFO "%s: unknown NAND device: "
-                               "Manufacturer ID: 0x%02x, Chip ID: 0x%02x\n",
-                               __func__, *maf_id, *dev_id);
-               return ERR_PTR(-ENODEV);
-       }
+               if (!type->name) {
+                       /* supress warning if there is no nand */
+                       if (*maf_id != 0x00 && *maf_id != 0xff &&
+                           *dev_id  != 0x00 && *dev_id  != 0xff) {
+                               printk(KERN_INFO "%s: unknown NAND device: "
+                                 "Manufacturer ID: 0x%02x, Chip ID: 0x%02x\n",
+                                 __func__, *maf_id, *dev_id);
+                       }
+                       return ERR_PTR(-ENODEV);
+               }
 
-       if (!mtd->name)
-               mtd->name = type->name;
+               if (!mtd->name)
+                       mtd->name = type->name;
 
-       chip->chipsize = (uint64_t)type->chipsize << 20;
-       chip->onfi_version = 0;
+               chip->chipsize = (uint64_t)type->chipsize << 20;
+               chip->onfi_version = 0;
 
-       ret = nand_flash_detect_onfi(mtd, chip, &busw);
-       if (!ret)
                nand_flash_detect_non_onfi(mtd, chip, type, &busw);
 
-       /* Get chip options, preserve non chip based options */
-       chip->options &= ~NAND_CHIPOPTIONS_MSK;
-       chip->options |= type->options & NAND_CHIPOPTIONS_MSK;
+               /* Get chip options, preserve non chip based options */
+               chip->options &= ~NAND_CHIPOPTIONS_MSK;
+               chip->options |= type->options & NAND_CHIPOPTIONS_MSK;
+       }
 
        /*
         * Set chip as a default. Board drivers can override it, if necessary
-- 
1.6.4


_______________________________________________
U-Boot mailing list
U-Boot@lists.denx.de
http://lists.denx.de/mailman/listinfo/u-boot

Reply via email to