diff options
author | Joern Engel <joern@wh.fh-wedel.de> | 2006-05-22 17:18:12 -0400 |
---|---|---|
committer | Joern Engel <joern@wh.fh-wedel.de> | 2006-05-22 17:18:12 -0400 |
commit | c8b229de2b05c2b3e8d282ce260935a88ac030ca (patch) | |
tree | 09391866a6a9740df2a178c7894557025c9dc2c8 /fs/jffs2/wbuf.c | |
parent | 28318776a80bc3261f9af91ef79e6e38bb9f5bec (diff) |
[MTD] Merge STMicro NOR_ECC code with Intel Sibley code
In 2002, STMicro started producing NOR flashes with internal ECC protection
for small blocks (8 or 16 bytes). Support for those flashes was added by me.
In 2005, Intel Sibley flashes copied this strategy and Nico added support for
those. Merge the code for both.
Signed-off-by: Joern Engel <joern@wh.fh-wedel.de>
Diffstat (limited to 'fs/jffs2/wbuf.c')
-rw-r--r-- | fs/jffs2/wbuf.c | 36 |
1 files changed, 3 insertions, 33 deletions
diff --git a/fs/jffs2/wbuf.c b/fs/jffs2/wbuf.c index 355226d8ce29..087c2e438a6d 100644 --- a/fs/jffs2/wbuf.c +++ b/fs/jffs2/wbuf.c | |||
@@ -637,17 +637,6 @@ int jffs2_flash_writev(struct jffs2_sb_info *c, const struct kvec *invecs, unsig | |||
637 | memset(c->wbuf,0xff,c->wbuf_pagesize); | 637 | memset(c->wbuf,0xff,c->wbuf_pagesize); |
638 | } | 638 | } |
639 | 639 | ||
640 | /* Fixup the wbuf if we are moving to a new eraseblock. The checks below | ||
641 | fail for ECC'd NOR because cleanmarker == 16, so a block starts at | ||
642 | xxx0010. */ | ||
643 | if (jffs2_nor_ecc(c)) { | ||
644 | if (((c->wbuf_ofs % c->sector_size) == 0) && !c->wbuf_len) { | ||
645 | c->wbuf_ofs = PAGE_DIV(to); | ||
646 | c->wbuf_len = PAGE_MOD(to); | ||
647 | memset(c->wbuf,0xff,c->wbuf_pagesize); | ||
648 | } | ||
649 | } | ||
650 | |||
651 | /* Sanity checks on target address. | 640 | /* Sanity checks on target address. |
652 | It's permitted to write at PAD(c->wbuf_len+c->wbuf_ofs), | 641 | It's permitted to write at PAD(c->wbuf_len+c->wbuf_ofs), |
653 | and it's permitted to write at the beginning of a new | 642 | and it's permitted to write at the beginning of a new |
@@ -1244,29 +1233,10 @@ void jffs2_dataflash_cleanup(struct jffs2_sb_info *c) { | |||
1244 | kfree(c->wbuf); | 1233 | kfree(c->wbuf); |
1245 | } | 1234 | } |
1246 | 1235 | ||
1247 | int jffs2_nor_ecc_flash_setup(struct jffs2_sb_info *c) { | ||
1248 | /* Cleanmarker is actually larger on the flashes */ | ||
1249 | c->cleanmarker_size = 16; | ||
1250 | |||
1251 | /* Initialize write buffer */ | ||
1252 | init_rwsem(&c->wbuf_sem); | ||
1253 | c->wbuf_pagesize = c->mtd->eccsize; | ||
1254 | c->wbuf_ofs = 0xFFFFFFFF; | ||
1255 | |||
1256 | c->wbuf = kmalloc(c->wbuf_pagesize, GFP_KERNEL); | ||
1257 | if (!c->wbuf) | ||
1258 | return -ENOMEM; | ||
1259 | |||
1260 | return 0; | ||
1261 | } | ||
1262 | |||
1263 | void jffs2_nor_ecc_flash_cleanup(struct jffs2_sb_info *c) { | ||
1264 | kfree(c->wbuf); | ||
1265 | } | ||
1266 | |||
1267 | int jffs2_nor_wbuf_flash_setup(struct jffs2_sb_info *c) { | 1236 | int jffs2_nor_wbuf_flash_setup(struct jffs2_sb_info *c) { |
1268 | /* Cleanmarker currently occupies a whole programming region */ | 1237 | /* Cleanmarker currently occupies whole programming regions, |
1269 | c->cleanmarker_size = c->mtd->writesize; | 1238 | * either one or 2 for 8Byte STMicro flashes. */ |
1239 | c->cleanmarker_size = max(16u, c->mtd->writesize); | ||
1270 | 1240 | ||
1271 | /* Initialize write buffer */ | 1241 | /* Initialize write buffer */ |
1272 | init_rwsem(&c->wbuf_sem); | 1242 | init_rwsem(&c->wbuf_sem); |