Fedora kernel-2.6.17-1.2142_FC4 patched with stable patch-2.6.17.4-vs2.0.2-rc26.diff
[linux-2.6.git] / drivers / mtd / chips / gen_probe.c
index fc982c4..41bd59d 100644 (file)
@@ -2,7 +2,7 @@
  * Routines common to all CFI-type probes.
  * (C) 2001-2003 Red Hat, Inc.
  * GPL'd
- * $Id: gen_probe.c,v 1.21 2004/08/14 15:14:05 dwmw2 Exp $
+ * $Id: gen_probe.c,v 1.24 2005/11/07 11:14:23 gleixner Exp $
  */
 
 #include <linux/kernel.h>
@@ -26,7 +26,7 @@ struct mtd_info *mtd_do_chip_probe(struct map_info *map, struct chip_probe *cp)
 
        /* First probe the map to see if we have CFI stuff there. */
        cfi = genprobe_ident_chips(map, cp);
-       
+
        if (!cfi)
                return NULL;
 
@@ -36,12 +36,12 @@ struct mtd_info *mtd_do_chip_probe(struct map_info *map, struct chip_probe *cp)
        mtd = check_cmd_set(map, 1); /* First the primary cmdset */
        if (!mtd)
                mtd = check_cmd_set(map, 0); /* Then the secondary */
-       
+
        if (mtd)
                return mtd;
 
        printk(KERN_WARNING"gen_probe: No supported Vendor Command Set found\n");
-       
+
        kfree(cfi->cfiq);
        kfree(cfi);
        map->fldrv_priv = NULL;
@@ -60,14 +60,14 @@ static struct cfi_private *genprobe_ident_chips(struct map_info *map, struct chi
 
        memset(&cfi, 0, sizeof(cfi));
 
-       /* Call the probetype-specific code with all permutations of 
+       /* Call the probetype-specific code with all permutations of
           interleave and device type, etc. */
        if (!genprobe_new_chip(map, cp, &cfi)) {
                /* The probe didn't like it */
                printk(KERN_DEBUG "%s: Found no %s device at location zero\n",
                       cp->name, map->name);
                return NULL;
-       }               
+       }
 
 #if 0 /* Let the CFI probe routine do this sanity check. The Intel and AMD
         probe routines won't ever return a broken CFI structure anyway,
@@ -92,13 +92,13 @@ static struct cfi_private *genprobe_ident_chips(struct map_info *map, struct chi
        } else {
                BUG();
        }
-               
+
        cfi.numchips = 1;
 
-       /* 
-        * Allocate memory for bitmap of valid chips. 
-        * Align bitmap storage size to full byte. 
-        */ 
+       /*
+        * Allocate memory for bitmap of valid chips.
+        * Align bitmap storage size to full byte.
+        */
        max_chips = map->size >> cfi.chipshift;
        mapsize = (max_chips / 8) + ((max_chips % 8) ? 1 : 0);
        chip_map = kmalloc(mapsize, GFP_KERNEL);
@@ -122,7 +122,7 @@ static struct cfi_private *genprobe_ident_chips(struct map_info *map, struct chi
        }
 
        /*
-        * Now allocate the space for the structures we need to return to 
+        * Now allocate the space for the structures we need to return to
         * our caller, and copy the appropriate data into them.
         */
 
@@ -154,7 +154,7 @@ static struct cfi_private *genprobe_ident_chips(struct map_info *map, struct chi
        return retcfi;
 }
 
-       
+
 static int genprobe_new_chip(struct map_info *map, struct chip_probe *cp,
                             struct cfi_private *cfi)
 {
@@ -162,7 +162,7 @@ static int genprobe_new_chip(struct map_info *map, struct chip_probe *cp,
        int max_chips = map_bankwidth(map); /* And minimum 1 */
        int nr_chips, type;
 
-       for (nr_chips = min_chips; nr_chips <= max_chips; nr_chips <<= 1) {
+       for (nr_chips = max_chips; nr_chips >= min_chips; nr_chips >>= 1) {
 
                if (!cfi_interleave_supported(nr_chips))
                    continue;
@@ -189,7 +189,7 @@ extern cfi_cmdset_fn_t cfi_cmdset_0001;
 extern cfi_cmdset_fn_t cfi_cmdset_0002;
 extern cfi_cmdset_fn_t cfi_cmdset_0020;
 
-static inline struct mtd_info *cfi_cmdset_unknown(struct map_info *map, 
+static inline struct mtd_info *cfi_cmdset_unknown(struct map_info *map,
                                                  int primary)
 {
        struct cfi_private *cfi = map->fldrv_priv;
@@ -199,7 +199,7 @@ static inline struct mtd_info *cfi_cmdset_unknown(struct map_info *map,
        cfi_cmdset_fn_t *probe_function;
 
        sprintf(probename, "cfi_cmdset_%4.4X", type);
-               
+
        probe_function = inter_module_get_request(probename, probename);
 
        if (probe_function) {
@@ -221,7 +221,7 @@ static struct mtd_info *check_cmd_set(struct map_info *map, int primary)
 {
        struct cfi_private *cfi = map->fldrv_priv;
        __u16 type = primary?cfi->cfiq->P_ID:cfi->cfiq->A_ID;
-       
+
        if (type == P_ID_NONE || type == P_ID_RESERVED)
                return NULL;
 
@@ -235,6 +235,7 @@ static struct mtd_info *check_cmd_set(struct map_info *map, int primary)
 #ifdef CONFIG_MTD_CFI_INTELEXT
        case 0x0001:
        case 0x0003:
+       case 0x0200:
                return cfi_cmdset_0001(map, primary);
 #endif
 #ifdef CONFIG_MTD_CFI_AMDSTD