FAQ: [#6852] Flash (m25p80) block erase failure(2011)

Document created by Aaronwu Employee on Sep 12, 2013
Version 1Show Document
  • View in full screen mode

[#6852] Flash (m25p80) block erase failure

Submitted By: Zoltan Ger

Open Date

2011-10-27 08:28:23     Close Date

2011-11-09 21:32:36

Priority:

Medium     Assignee:

Aaron Wu

Status:

Closed     Fixed In Release:

N/A

Found In Release:

2010R1-RC5     Release:

2010R1-RC4

Category:

Drivers     Board:

N/A

Processor:

BF537     Silicon Revision:

0.3

Is this bug repeatable?:

Yes     Resolution:

Rejected

Uboot version or rev.:

2009R1     Toolchain version or rev.:

gcc version 4.3.5 (ADI-2010R1-

App binary format:

N/A     

Summary: Flash (m25p80) block erase failure

Details:

 

This is an issue which worked in release 2009R1.1-RC4 but does not work any more in release 2010R1-RC4.

 

Setup: A  BF537 DSP and a M25P80 NOR flash connected via SPI

 

User-Application: See flash.c

 

Driver-Code: see mtdchar.c and m25p80.c (both contian additional debug output)

 

Problem:

 

1. Application output:

 

erase /dev/mtd4 0x0 8 0

open /dev/mtd4.

fd after open() = 4

erase

Erase Total 8 Units

Performing Flash Erase of length 32768 at offset 0x0

non_region_erase: Fd = 4, start = 0, numSec = 8, unlock = 0

Performing Flash Erase of length 32768 at offset 0x8000

non_region_erase: Fd = 4, start = 0, numSec = 8, unlock = 0

Performing Flash Erase of length 32768 at offset 0x10000

non_region_erase: Fd = 4, start = 0, numSec = 8, unlock = 0

 

MTD Erase failure: Invalid argument

lseek 0.

write 65536 bytes at 0x0...-1 bytes written.

write 65536 bytes at 0x10000...-1 bytes written.

....

 

2. Driver output:

 

MTD_open

MTD_ioctl

MTD_ioctl

MTD_ioctl

MEMERASE

1

2

4

5

spi0.3: m25p80_erase at 0x0, len 32768

Sanity check

Sanity check passed

Mutex lock

spi0.3: erase_sector 32KiB at 0x00000000

after wait_till_ready()

after write_enable()

SPI_write spi0.3

...finished

OK, Done

6

7

8

9

10

MTD_ioctl

MEMERASE

1

2

4

5

spi0.3: m25p80_erase at 0x8000, len 32768

Sanity check

Sanity check passed

Mutex lock

spi0.3: erase_sector 32KiB at 0x00008000

after wait_till_ready()

after write_enable()

SPI_write spi0.3

...finished

OK, Done

6

7

8

9

10

MTD_ioctl

MEMERASE

1

2

4

5

MTD_close

spi_release: close() return

mtdblock: write on "ROMfs" at 0x7800, size 0x200

mtdblock: write on "ROMfs" at 0x7a00, size 0x200

mtdblock: write on "ROMfs" at 0x7000, size 0x200

mtdblock: write on "ROMfs" at 0x7200, size 0x200

mtdblock: write on "ROMfs" at 0x4800, size 0x200

 

As you can see, erasing the third sector fails, cause the erase() function in line 572 in mtdchar.c does not call m25p80_erase() in m25p80.c any more. It seems that another thread interrupts the erase procedure and demages the mtd_info object.

 

Is this probabaly a knon issue? I could not find any related bugs.

 

Thanks in advance.

 

Follow-ups

 

--- Zoltan Ger                                               2011-10-27 08:53:04

The FIXME statement in mtdchar.c says:

 

/*

FIXME: Allow INTERRUPTIBLE. Which means

not having the wait_queue head on the stack.

If the wq_head is on the stack, and we

leave because we got interrupted, then the

wq_head is no longer there when the

callback routine tries to wake us up.

*/

 

This statement is present in release 2009R1.1-RC4 as well. Could this be the

reason for the problem if there is a thread in release 2010R1-RC4 which

interrupts the erase procedure ?

 

--- Zoltan Ger                                               2011-10-27 09:23:28

root:/> version

kernel:    Linux release 2.6.34.7-ADI-2010R1-g7583325, build #1 Thu Jun 23

11:20:50 CEST 2011

toolchain: bfin-uclinux-gcc release gcc version 4.3.5 (ADI-2010R1-RC4)

user-dist: release 2010R1, build #1 Thu Jun 23 11:32:57 CEST 2011

 

--- Aaron Wu                                                 2011-11-01 04:10:55

I don't have a SPI Flash on bf537 board. With a BF548 board with SPI Flash on it

I can erase it with mtd-utils:

 

flash_eraseall /dev/mtd4

Erasing 64 Kibyte @ 180000 -- 100 % complete.

 

For Parallel Flash on this 548 board erase also works:

flash_eraseall /dev/mtd2

Erasing 128 Kibyte @ b80000 -- 100 % complete.

 

Note mtd2 is the last partition for Parallel Flash and mtd4 is the last one for

SPI Flash.

 

--- Zoltan Ger                                               2011-11-01 06:29:50

Does your test call the m25p80 driver from mtdchar.c ? If yes, please attach the

MTD debug messages. OR if you can, take my attached mtdchar & m25p80 files

an build the kernel with these files and make the test again.

 

Thanks in advance.

 

--- Zoltan Ger                                               2011-11-01 09:06:16

Attached the output of our use-case (flash_erase 0 8) and the result: see

flash_erase.txt

 

--- Zoltan Ger                                               2011-11-01 09:24:35

The error occured always after trying to erase the third sector at 0x10000. I

tried to erase beginning at 0x10000 (flash_erase /dev/mtd4 0x10000 6) -->

failed, same for 0x20000, 0x30000, 0x40000 and so on... . It means, only the two

first sectors can be erased successfully with 2010R1-RC4. With 2009R1.1-RC4, all

sectors can be erased successfully.

 

--- Zoltan Ger                                               2011-11-01 11:46:33

OK, I tried flash_eraseall as well and it deletes only 2 sectors and returns

successfull --> the device probe procedure seems not to work correctly, de

sector counter contains a wrong value. It seems, that the device will not be

detected correctly. Can you reproduce such an issue as well? Do you have any

suggestions how to debug device probing?

 

Thanks in advance.

 

--- Aaron Wu                                                 2011-11-02 03:43:56

Your output says "Invalid argument", have you checked this? Do you

really have up to 8 unit for your mtd4 partition?

 

--- Zoltan Ger                                               2011-11-02 04:43:41

Yes, that's what I wrote im my comment above: "sector counter contains a

wrong value". I checked the output during bootup:

 

m25p80 spi0.3: found m25p05-nonjedec, expected m25p80

m25p80 spi0.3: m25p05-nonjedec (64 Kbytes)

 

This means, the device will not be detected correctly. I'll analyze this in

details today.

 

--- Aaron Wu                                                 2011-11-02 04:58:49

Right I think you should check that, You detected a m25p05, which is actally 64K

by the datasheet. Please check the chip you mount on your board. On my bf548

board with m25p80 on it I get it detected correctly:

 

m25p80 spi0.1: m25p16 (2048 Kbytes)

Creating 2 MTD partitions on "m25p80":

0x000000000000-0x000000080000 : "bootloader(spi)"

0x000000080000-0x000000200000 : "linux kernel(spi)"

 

--- Zoltan Ger                                               2011-11-09 10:30:10

I think we can close this issue, we checked the devices and we figured out that

we received some boards with non-jedec flash devices, therefore the m25p80 will

not be detected correctly during bootup.

 

Thanks for your help !

 

 

 

    Files

    Changes

    Commits

    Dependencies

    Duplicates

    Associations

    Tags

 

File Name     File Type     File Size     Posted By

flash_erase.txt    text/plain    9132    Zoltan Ger

flash.c    text/plain    1382    Zoltan Ger

config.vendor-2.6.x    application/octet-stream    48450    Zoltan Ger

config.linux-2.6.x    application/octet-stream    30726    Zoltan Ger

m25p80.c    text/plain    27101    Zoltan Ger

mtdchar.c    text/plain    20919    Zoltan Ger

Outcomes