Re: [PATCH] Do not oops when configured flash size is less then chip size

David Woodhouse
2006-05-13T11:22:42Z

On Thu, 2006-05-11 at 16:52 +0100, David Vrabel wrote:
> This sounds like a valid, if unlikely, board configuration. e.g., a
> board with chips fitted that are larger than the chip-select memory
> window.
>
> It might be better to pretend such configuration is a single chip
> that's smaller than it physically is.

Yes, I agree.

> Maybe something as simple as:
>
> /* there's at least one chip present */
> max_chips = max(map->size >> cfi.chipshift, 1);
>
> ?

You also need to reduce mtd->size after you've done the probe.
And while we're at it, we'll slap Deepak around a little bit and stop
using byte arrays with the Linux bitops.

Please could you test this for me?

diff --git a/drivers/mtd/chips/gen_probe.c b/drivers/mtd/chips/gen_probe.c
index 9b252d2..9915ab8 100644
--- a/drivers/mtd/chips/gen_probe.c
+++ b/drivers/mtd/chips/gen_probe.c
@@ -37,8 +37,14 @@ struct mtd_info *mtd_do_chip_probe(struc
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 %dKiB chip to %dKiB\n",
+ mtd->size >> 10, map->size >> 10);
+ mtd->size = map->size;
+ }
return mtd;
+ }

printk(KERN_WARNING"gen_probe: No supported Vendor Command Set found\n");

@@ -100,7 +106,12 @@ #endif
* 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);

--
dwmw2