Skip to contentSkip to conversation

mtd_dataflash bug

PATCH Tobias Simon 2 participants 2 messages May 13, 2009 Memory technology devices (MTD)

lore
Share & tools
lore
#0 lore raw

Hello List,

i have figured out a bug in mtd_datflash.c of kernel 2.6.29, which causes my ARM bootloader to be killed with every "erase" operation on arbitrary adresses. The fix is:

drivers/mtd/devices/mtd_dataflash.c 2009-05-13 03:13:30.000000000 +0200 renamed from drivers/mtd/devices/mtd_dataflash.c 2009-05-13 03:11:16.000000000 +0200 +0 -0
@@ -184,7 +184,7 @@
               /* Calculate flash page address; use block erase (for 

speed) if
* we're at a block boundary and need to erase the whole
block.

                */
-               pageaddr = div_u64(instr->len, priv->page_size);
+               pageaddr = div_u64(instr->addr, priv->page_size);
               do_block = (pageaddr & 0x7) == 0 && instr->len >= blocksize;
               pageaddr = pageaddr << priv->page_offset;

Regards,
Tobias

#1 lore raw
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line
Quoted 1 line

"Tobias" == Tobias Simon <[email protected]> writes:

Tobias> Hello List,
Tobias> i have figured out a bug in mtd_datflash.c of kernel 2.6.29, which Tobias> causes my ARM bootloader to be killed with every "erase" operation on Tobias> arbitrary adresses. The fix is:

Ahh yes, I just sent a patch for the same thing a bit earlier.

This (or my patch) should go to 2.6.29-stable as well.

Tobias> --- linux-2.6.29.2-a/drivers/mtd/devices/mtd_dataflash.c 2009-05-13 Tobias> 03:11:16.000000000 +0200
Tobias> +++ linux-2.6.29.2-b/drivers/mtd/devices/mtd_dataflash.c Tobias> 2009-05-13 03:13:30.000000000 +0200
Tobias> @@ -184,7 +184,7 @@
Tobias> /* Calculate flash page address; use block erase (for
Tobias> speed) if
Tobias> * we're at a block boundary and need to erase the
Tobias> whole block.

 Tobias>                 */
 Tobias> -               pageaddr = div_u64(instr->len, priv->page_size);
 Tobias> +               pageaddr = div_u64(instr->addr, priv->page_size);

Tobias> do_block = (pageaddr & 0x7) == 0 && instr->len >= blocksize;
Tobias> pageaddr = pageaddr << priv->page_offset;

Signature · 1 line
Bye, Peter Korsgaard