|
@@ -37,8 +37,15 @@ struct mtd_info *mtd_do_chip_probe(struct map_info *map, struct chip_probe *cp)
|
|
|
if (!mtd)
|
|
|
mtd = check_cmd_set(map, 0); /* Then the secondary */
|
|
|
|
|
|
- if (mtd)
|
|
|
+ if (mtd) {
|
|
|
+ if (mtd->size > map->size) {
|
|
|
+ printk(KERN_WARNING "Reducing visibility of %lKiB chip to %lKiB\n",
|
|
|
+ (unsigned long)mtd->size >> 10,
|
|
|
+ (unsigned long)map->size >> 10);
|
|
|
+ mtd->size = map->size;
|
|
|
+ }
|
|
|
return mtd;
|
|
|
+ }
|
|
|
|
|
|
printk(KERN_WARNING"gen_probe: No supported Vendor Command Set found\n");
|
|
|
|
|
@@ -100,7 +107,12 @@ static struct cfi_private *genprobe_ident_chips(struct map_info *map, struct chi
|
|
|
* Align bitmap storage size to full byte.
|
|
|
*/
|
|
|
max_chips = map->size >> cfi.chipshift;
|
|
|
- mapsize = (max_chips / 8) + ((max_chips % 8) ? 1 : 0);
|
|
|
+ if (!max_chips) {
|
|
|
+ printk(KERN_WARNING "NOR chip too large to fit in mapping. Attempting to cope...\n");
|
|
|
+ max_chips = 1;
|
|
|
+ }
|
|
|
+
|
|
|
+ mapsize = (max_chips + BITS_PER_LONG-1) / BITS_PER_LONG;
|
|
|
chip_map = kmalloc(mapsize, GFP_KERNEL);
|
|
|
if (!chip_map) {
|
|
|
printk(KERN_WARNING "%s: kmalloc failed for CFI chip map\n", map->name);
|