android_kernel_motorola_sm6225/drivers/mtd
Brian Norris 60c6738245 mtd: nand: detect OOB size for Toshiba 24nm raw SLC
Toshiba NAND datasheets have not been very forthcoming on OOB size
information; they do not provide any bitfields in the ID string for
spare area. In their 24nm technology flash, however, Toshiba migrated
their NAND to have 32 bytes spare per 512 bytes of page area (up from
the traditional 16 bytes), as they now require 8-bit ECC or higher.

I have discussed this issue directly with Toshiba representatives, and
they acknowledge this problem. They recommend detecting these flash
based on their technology node as follows:

  For 24nm Toshiba SLC raw NAND (not BENAND -- Built-in Ecc NAND), there
  are 32 bytes of spare area for every 512 bytes of in-band data area.

We can implement this rule with the following snippet of a device ID
decode table, which applies to all their 43nm, 32nm, and 24nm SLC NAND
(this table is not fully in the NAND datasheets, but it was provided
directly by Toshiba representatives):

  - ID byte 5, bit[7]:
          1    -> BENAND
          0    -> raw SLC

  - ID byte 6, bits[2:0]:
          100b -> 43nm
          101b -> 32nm
          110b -> 24nm
          111b -> Reserved

I'm also working with Toshiba on including this bitfield description for
their 5th and 6th ID bytes in their public data sheets.

I will provide the 8-byte ID strings from the two 24nm Toshiba samples I
have; their first 6 bytes match the documentation I received from
Toshiba:

  24nm SLC 1Gbit TC58NVG0S3HTA00
  0x98 0xf1 0x80 0x15 0x72 0x16 0x08 0x00

  24nm SLC 2Gbit TC58NVG1S3HTA00
  0x98 0xda 0x90 0x15 0x76 0x16 0x08 0x00

I have also tested for regressions with:

  43nm SLC 4Gbit TC58NVG2S3ETA00
  0x98 0xdc 0x90 0x15 0x76 0x14 0x03 0x10

  32nm SLC 8Gbit TC58NVG3SOFA00
  0x98 0xd3 0x90 0x26 0x76 0x15 0x02 0x08

Signed-off-by: Brian Norris <computersforpeace@gmail.com>
Signed-off-by: Artem Bityutskiy <artem.bityutskiy@linux.intel.com>
Signed-off-by: David Woodhouse <David.Woodhouse@intel.com>
2013-08-05 21:05:10 +01:00
..
chips mtd: jedec_probe: fix LH28F640BF definition 2013-08-05 21:04:17 +01:00
devices mtd: diskonchip: remove unused entries in Kconfig 2013-08-05 21:01:55 +01:00
lpddr mtd: lpddr: replace open-coded ARRAY_SIZE with macro 2012-05-13 22:47:31 -05:00
maps mtd: remove obsolete JEDEC mapping drivers 2013-08-05 21:01:08 +01:00
nand mtd: nand: detect OOB size for Toshiba 24nm raw SLC 2013-08-05 21:05:10 +01:00
onenand mtd: onenand/samsung: Remove redundant platform_set_drvdata() 2013-08-05 20:50:08 +01:00
tests mtd: tests: don't print error messages when out-of-memory 2013-08-05 20:49:22 +01:00
ubi A couple of fixes and clean-ups, allow for assigning user-defined 2013-07-05 12:09:48 -07:00
afs.c mtd: introduce mtd_read interface 2012-01-09 18:25:19 +00:00
ar7part.c mtd: Allow removal of partitioning modules 2013-02-04 09:27:33 +02:00
bcm47xxpart.c mtd: bcm47xxpart: look for NVRAM at the end of device 2013-03-08 11:36:00 +00:00
bcm63xxpart.c mtd: bcm63xxpart: use nvram for PSI size 2013-08-05 18:59:34 +01:00
cmdlinepart.c mtd: Allow removal of partitioning modules 2013-02-04 09:27:33 +02:00
ftl.c mtd: do not use mtd->sync directly 2012-01-09 18:26:21 +00:00
inftlcore.c mtd: add leading underscore to all mtd functions 2012-03-27 00:20:01 +01:00
inftlmount.c mtd: introduce mtd_block_markbad interface 2012-01-09 18:25:48 +00:00
Kconfig mtd: merge mtdchar module with mtdcore 2013-04-05 13:16:54 +01:00
Makefile mtd: merge mtdchar module with mtdcore 2013-04-05 13:16:54 +01:00
mtd_blkdevs.c block_device_operations->release() should return void 2013-05-07 02:16:21 -04:00
mtdblock.c mtd_blktrans_ops->release() should return void 2013-05-05 21:31:22 -04:00
mtdblock_ro.c mtd: introduce mtd_write interface 2012-01-09 18:25:20 +00:00
mtdchar.c mtdchar: switch to fixed_size_llseek() 2013-06-29 12:57:27 +04:00
mtdconcat.c mtd: unify initialization of erase_info->fail_addr 2012-03-27 01:02:24 +01:00
mtdcore.c drivers: avoid format string in dev_set_name 2013-07-03 16:07:41 -07:00
mtdcore.h mtd: merge mtdchar module with mtdcore 2013-04-05 13:16:54 +01:00
mtdoops.c mtdoops: don't erase flash at each boot 2012-11-15 15:37:51 +02:00
mtdpart.c mtd: mtdcore: use const qualifier 2013-04-05 13:04:27 +01:00
mtdsuper.c VFS: Pass mount flags to sget() 2012-07-14 16:38:34 +04:00
mtdswap.c mtd: do not use mtd->block_markbad directly 2012-01-09 18:26:26 +00:00
nftlcore.c mtd: nftlcore: remove out-of-date and now irrelevant piece of code 2012-03-27 00:24:03 +01:00
nftlmount.c mtd: introduce mtd_block_markbad interface 2012-01-09 18:25:48 +00:00
ofpart.c mtd: ofpart: support partitions of 4 GiB and larger 2013-04-05 12:05:53 +01:00
redboot.c mtd: redboot: remove useless code 2012-03-27 00:24:14 +01:00
rfd_ftl.c mtd: do not use mtd->sync directly 2012-01-09 18:26:21 +00:00
sm_ftl.c mtd_blktrans_ops->release() should return void 2013-05-05 21:31:22 -04:00
sm_ftl.h mtd: sm_ftl: cosmetic, use bool when possible 2010-10-25 01:33:08 +01:00
ssfdc.c mtd: introduce mtd_block_isbad interface 2012-01-09 18:25:47 +00:00