OpenCloudOS-Kernel/drivers/mtd/devices
Robert Jarzmik 52c2d9aad4 mtd: docg3 fix in-middle of blocks reads
Corner case reads do not work, and return false data and
ECC. This case is typically seen in a ubifs usage, with a
read of type:
 - docg3 docg3: doc_read_oob(from=14882415, mode=1,
 data=(c30eca40:12), oob=(  (null):0))

This results in the following reads:
 - docg3 docg3: doc_read_data_area(buf=  (null), len=111)
 - docg3 docg3: doc_read_data_area(buf=c30eca40, len=12)
 - docg3 docg3: doc_read_data_area(buf=  (null), len=389)
 - docg3 docg3: doc_read_data_area(buf=  (null), len=0)
 - docg3 docg3: doc_read_data_area(buf=  (null), len=16)

If we suppose that the pages content is :
 - bytes 0 .. 111   : 0x0a
 - bytes 112 .. 255 : 0x0f
Then the returned bytes will be :
 - 111 times 0x0a (correct)
 - 0x0a 2 times and 0x0f 10 times (incorrect, should be
 0x0a,0x0f)
 - 0x0f 389 times (correct)
 - nothing
 - correct OOB

The reason seams that the first 111 bytes read ends between
the 2 docg3 planes, and that the first following read (in
the 12 bytes sequence, read of 16 bit word) returns the byte
of the rightmost plane duplicated in high and lower byte of
the word.

Fix this behaviour by ensuring that if the previous read
ended up in-between the 2 planes, there will be a first 1
byte read to get back to the beginning of leftmost plane.

Signed-off-by: Robert Jarzmik <robert.jarzmik@free.fr>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
2012-05-29 11:14:51 +03:00
..
Kconfig MTD merge for 3.4 2012-03-30 17:31:56 -07:00
Makefile mtd: ST SPEAr: Add SMI driver for serial NOR flash 2012-03-27 00:14:16 +01:00
block2mtd.c mtd: block2mtd: page_read() never returns NULL 2012-05-13 22:56:52 -05:00
doc2000.c mtd: flash drivers set ecc strength 2012-03-27 00:56:46 +01:00
doc2001.c mtd: flash drivers set ecc strength 2012-03-27 00:56:46 +01:00
doc2001plus.c mtd: flash drivers set ecc strength 2012-03-27 00:56:46 +01:00
docecc.c mtd: spelling, capitalization, uniformity 2011-09-11 15:02:13 +03:00
docg3.c mtd: docg3 fix in-middle of blocks reads 2012-05-29 11:14:51 +03:00
docg3.h mtd: docg3 add protection against concurrency 2012-03-27 01:03:27 +01:00
docprobe.c mtd: docprobe: use kzalloc instead 2012-01-09 18:25:51 +00:00
lart.c mtd: move zero length verification to MTD API functions 2012-03-27 00:32:19 +01:00
m25p80.c mtd: m25p80: Add support for Winbond W25Q80BW 2012-05-13 23:24:26 -05:00
ms02-nv.c mtd: do not duplicate length and offset checks in drivers 2012-03-27 00:28:18 +01:00
ms02-nv.h MTD/JFFS2: remove CVS keywords 2008-06-04 17:50:17 +01:00
mtd_dataflash.c mtd: move zero length verification to MTD API functions 2012-03-27 00:32:19 +01:00
mtdram.c mtd: harmonize mtd_point interface implementation 2012-03-27 00:32:11 +01:00
phram.c mtd: phram: fix section mismatch for phram_setup 2012-03-27 01:02:29 +01:00
pmc551.c MTD merge for 3.4 2012-03-30 17:31:56 -07:00
slram.c MTD merge for 3.4 2012-03-30 17:31:56 -07:00
spear_smi.c mtd: spear_smi: Add clk_{un}prepare() support 2012-05-13 22:53:24 -05:00
sst25l.c mtd: do not use plain 0 as NULL 2012-03-27 00:53:20 +01:00