[Yaffs] cvs YAFFS + MTD cvs + 2.4.27-vrs1 problems
Aras Vaichas
arasv@magellan-technology.com
Thu, 02 Dec 2004 16:19:51 +1100
Hello all,
I have managed to get the latest MTD code to compile with a 2.4.27-vrs1 kernel.
I compiled the latest YAFFS code (from CVS) into the kernel. I mounted a 16MB
block of Smartmedia NAND and tried to create some files, I got a load of errors
, I reset the machine because it was obviously going crazy. I then noticed that
my NAND suddenly had a load of "bad blocks"
Can someone help me out here, or tell me what sorts of debug information I have
to provide? I have provide some debug information:
* kernel boot messages:
...
SmartMedia card inserted.
NAND device: Manufacturer ID: 0x98, Chip ID: 0x75 (Toshiba NAND 32MiB 3,3V 8-bit)
Scanning device for bad blocks
Bad eraseblock 1 at 0x00004000
Bad eraseblock 2 at 0x00008000
... SNIP ...
Bad eraseblock 1022 at 0x00ff8000
Bad eraseblock 1023 at 0x00ffc000
Creating 2 MTD partitions on "NAND 32MiB 3,3V 8-bit":
0x00000000-0x01000000 : "NAND partition 1"
mtd: Giving out device 4 to NAND partition 1
0x01000000-0x02000000 : "NAND partition 2"
mtd: Giving out device 5 to NAND partition 2
* The kernel boot finishes and I mount the NAND
/root # mount -t yaffs /dev/mtdblock/5 /mnt/y2
mtdblock_open
ok
yaffs: dev is 7941 name is "1f:05"
nand_read_oob: from = 0x01004000, len = 16
nand_read_oob: from = 0x01004200, len = 16
nand_read_oob: from = 0x01004000, len = 16
nand_read_oob: from = 0x01008000, len = 16
nand_read_oob: from = 0x01008200, len = 16
nand_read_oob: from = 0x01008000, len = 16
... SNIP ...
nand_read_oob: from = 0x01ff8000, len = 16
nand_read_oob: from = 0x01ff8200, len = 16
nand_read_oob: from = 0x01ff8000, len = 16
nand_read_oob: from = 0x01ffc000, len = 16
nand_read_oob: from = 0x01ffc200, len = 16
nand_read_oob: from = 0x01ffc000, len = 16
* I check out the /proc entry
y2 # cat /proc/yaffs
YAFFS built:Dec 2 2004 15:20:31
$Id: yaffs_fs.c,v 1.35 2004/10/20 20:12:43 charles Exp $
$Id: yaffs_guts.c,v 1.37 2004/10/20 20:12:43 charles Exp $
Device yaffs
startBlock......... 1
endBlock........... 1023
chunkGroupBits..... 0
chunkGroupSize..... 1
nErasedBlocks...... 1023
nTnodesCreated..... 0
nFreeTnodes........ 0
nObjectsCreated.... 100
nFreeObjects....... 97
nFreeChunks........ 32736
nPageWrites........ 0
nPageReads......... 0
nBlockErasures..... 0
nGCCopies.......... 0
garbageCollections. 0
passiveGCs......... 0
nRetriedWrites..... 0
nRetireBlocks...... 0
eccFixed........... 0
eccUnfixed......... 0
tagsEccFixed....... 0
tagsEccUnfixed..... 1023
cacheHits.......... 0
nDeletedFiles...... 0
nUnlinkedFiles..... 0
nBackgroudDeletions 0
useNANDECC......... 0
* I cd to the /mnt/y2 directory and try to create a file (all hell breaks loose)
/root # cd /mnt/y2
y2 # touch 1
nand_read_ecc: from = 0x01004000, len = 512
nand_read_oob: from = 0x01004000, len = 16
nand_write_ecc: to = 0x01004000, len = 512
nand_write_oob: to = 0x01004000, len = 16
nand_read_ecc: from = 0x01004000, len = 512
nand_read_ecc: Failed ECC read, page 0x00008020
nand_read_ecc: Failed ECC read, page 0x00008020
nand_read_oob: from = 0x01004000, len = 16
nand_write_oob: to = 0x01004000, len = 16
nand_read_ecc: from = 0x01004200, len = 512
nand_read_oob: from = 0x01004200, len = 16
nand_write_ecc: to = 0x01004200, len = 512
nand_write_oob: to = 0x01004200, len = 16
nand_read_ecc: from = 0x01004200, len = 512
nand_read_ecc: Failed ECC read, page 0x00008021
nand_read_ecc: Failed ECC read, page 0x00008021
... SNIP ...
nand_read_ecc: from = 0x0101aa00, len = 512
nand_read_oob: from = 0x0101aa00, len = 16
nand_write_ecc: to = 0x0101aa00, len = 512
nand_write_oob: to = 0x0101aa00, len = 16
nand_read_ecc: from = 0x0101aa00, len = 512
nand_read_ecc: Failed ECC read, page 0x000080d5
... at which point it never ends, so I reset it
* After I reboot I get a load of bad blocks!
NAND device: Manufacturer ID: 0x98, Chip ID: 0x75 (Toshiba NAND 32MiB 3,3V 8-bit)
Scanning device for bad blocks
Bad eraseblock 1 at 0x00004000
Bad eraseblock 2 at 0x00008000
Bad eraseblock 3 at 0x0000c000
... SNIP
Bad eraseblock 1021 at 0x00ff4000
Bad eraseblock 1022 at 0x00ff8000
Bad eraseblock 1023 at 0x00ffc000
I know that these blocks aren't bad, this is a brand new Flash chip! Is there
software that will verify every block and correctly mark it bad or not?
I tried some operations on the YAFFS partition, but get loads of errors:
/ # cd /mnt/y1
y1 # ll
nand_read_ecc: from = 0x00203800, len = 512
nand_read_ecc: Failed ECC read, page 0x0000101c
nand_read_ecc: Failed ECC read, page 0x0000101c
nand_read_ecc: from = 0x00203200, len = 512
nand_read_ecc: Failed ECC read, page 0x00001019
nand_read_ecc: Failed ECC read, page 0x00001019
nand_read_ecc: from = 0x00203000, len = 512
nand_read_ecc: Failed ECC read, page 0x00001018
nand_read_ecc: Failed ECC read, page 0x00001018
drw-rw-rw- 1 root root 512 Dec 2 15:03 ./
drwxrwxr-x 9 root 100 4096 Nov 11 10:17 ../
-rw-rw-r-- 1 root root 0 Nov 19 12:47 c
-rw-rw-r-- 1 root root 0 Nov 18 10:39 d
-rw-rw-r-- 1 root root 0 Nov 18 10:39 e
drw-rw-rw- 1 root root 512 Dec 2 15:03 lost+found/
y1 # df
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/root 102901816 76756844 20917824 79% /
tmpfs 15428 360 15068 2% /var
/dev/mtdblock/4 16368 8884 7484 54% /mnt/y1
/dev/mtdblock/5 16368 180 16188 1% /mnt/y2
y1 # cd /mnt/y2
y2 # ll
nand_read_ecc: from = 0x0101aa00, len = 512
nand_read_ecc: Failed ECC read, page 0x000080d5
nand_read_ecc: Failed ECC read, page 0x000080d5
drw-rw-rw- 1 root root 512 Dec 2 15:08 ./
drwxrwxr-x 9 root 100 4096 Nov 11 10:17 ../
-rw-rw-r-- 1 root root 0 Dec 2 14:31 1
drw-rw-rw- 1 root root 512 Dec 2 15:08 lost+found/
y2 # df
Filesystem 1k-blocks Used Available Use% Mounted on
/dev/root 102901816 76756844 20917824 79% /
tmpfs 15428 364 15064 2% /var
/dev/mtdblock/4 16368 8884 7484 54% /mnt/y1
/dev/mtdblock/5 16368 180 16188 1% /mnt/y2
y2 #
You can see that there is loads of memory missing from /dev/mtdblock/4 !
* my linux/fs/yaffs directory
root@gentoo linux-2.4.27-vrs1-yaffs # ll fs/yaffs/
total 492
drwxrwxr-x 2 arasv users 4096 Dec 2 15:20 .
drwxrwxr-x 49 arasv users 4096 Dec 2 15:20 ..
-rw-rw-r-- 1 arasv users 7692 Dec 2 15:18 .depend
-rw-rw-r-- 1 root root 177 Dec 2 15:20 .yaffs.o.flags
-rw-rw-r-- 1 root root 610 Dec 2 15:20 .yaffs_ecc.o.flags
-rw-rw-r-- 1 root root 607 Dec 2 15:20 .yaffs_fs.o.flags
-rw-rw-r-- 1 root root 613 Dec 2 15:20 .yaffs_guts.o.flags
-rw-rw-r-- 1 root root 616 Dec 2 15:20 .yaffs_mtdif.o.flags
-rw-rw-r-- 1 root root 616 Dec 2 15:20 .yaffs_ramem.o.flags
-rw-rw-r-- 1 arasv users 4536 Dec 1 11:34 Makefile
-rw-rw-r-- 1 arasv users 4393 Dec 1 10:57 Makefile.old
-rw-r--r-- 1 arasv users 6139 Dec 1 14:35 devextras.h
-rw-rw-r-- 1 root root 62546 Dec 2 15:20 yaffs.o
-rw-r--r-- 1 arasv users 5537 Dec 1 11:15 yaffs_ecc.c
-rw-r--r-- 1 arasv users 970 Dec 1 11:15 yaffs_ecc.h
-rw-rw-r-- 1 root root 2132 Dec 2 15:20 yaffs_ecc.o
-rw-r--r-- 1 arasv users 42100 Dec 1 10:54 yaffs_fs.c
-rw-rw-r-- 1 root root 23080 Dec 2 15:20 yaffs_fs.o
-rw-r--r-- 1 arasv users 113357 Dec 1 10:54 yaffs_guts.c
-rw-r--r-- 1 arasv users 15691 Dec 1 14:35 yaffs_guts.h
-rw-rw-r-- 1 root root 38484 Dec 2 15:20 yaffs_guts.o
-rw-r--r-- 1 arasv users 4028 Dec 1 10:54 yaffs_mtdif.c
-rw-r--r-- 1 arasv users 1010 Dec 1 14:35 yaffs_mtdif.h
-rw-rw-r-- 1 root root 2000 Dec 2 15:20 yaffs_mtdif.o
-rw-r--r-- 1 arasv users 5173 Dec 1 11:20 yaffs_ramem.c
-rw-rw-r-- 1 root root 832 Dec 2 15:20 yaffs_ramem.o
-rw-r--r-- 1 arasv users 14604 Dec 1 11:15 yaffsdev.c
-rw-r--r-- 1 arasv users 53248 Dec 1 11:15 yaffsdev.proj
-rw-r--r-- 1 arasv users 659 Dec 1 10:54 yaffsinterface.h
-rw-r--r-- 1 arasv users 3032 Dec 1 14:35 yportenv.h
* This is the object list from the Makefile
obj-y := yaffs_fs.o yaffs_guts.o yaffs_ramem.o yaffs_mtdif.o yaffs_ecc.o
obj-m := $(O_TARGET)
I'm not entirely sure what options I should include in the Makefile either. I
want to use the latest MTD code with a NAND/Smartmedia device. Which options
should I include?
Thanks in advance!
regards,
Aras