Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 8f15fd55 authored by Andrew Victor's avatar Andrew Victor Committed by Thomas Gleixner
Browse files

[JFFS2] Add support for JFFS2-on-Dataflash devices.



For Dataflash, can_mark_obsolete = false and the NAND write buffering
code (wbuf.c) is used.

Since the DataFlash chip will automatically erase pages when writing,
the cleanmarkers are not needed - so cleanmarker_oob = false and
cleanmarker_size = 0

DataFlash page-sizes are not a power of two (they're multiples of 528
bytes).  The SECTOR_ADDR macro (added in the previous core patch) is
replaced with a (slower) div/mod version if CONFIG_JFFS2_FS_DATAFLASH is
selected.

Signed-off-by: default avatarAndrew Victor <andrew@sanpeople.com>
Signed-off-by: default avatarThomas Gleixner <tglx@linutronix.de>
parent 3be36675
Loading
Loading
Loading
Loading
+7 −0
Original line number Diff line number Diff line
@@ -1084,6 +1084,13 @@ config JFFS2_FS_NOR_ECC
          ECC for JFFS2. This type of flash chip is not common, however it is
          available from ST Microelectronics.

config JFFS2_FS_DATAFLASH
	bool "JFFS2 support for DataFlash (EXPERIMENTAL)"
	depends on JFFS2_FS && EXPERIMENTAL
	default n
	help
	  This enables the experimental support for JFFS2 on DataFlash devices.

config JFFS2_COMPRESSION_OPTIONS
	bool "Advanced compression options for JFFS2"
	depends on JFFS2_FS
+2 −1
Original line number Diff line number Diff line
#
# Makefile for the Linux Journalling Flash File System v2 (JFFS2)
#
# $Id: Makefile.common,v 1.7 2004/11/03 12:57:38 jwboyer Exp $
# $Id: Makefile.common,v 1.8 2005/02/09 09:17:40 pavlov Exp $
#

obj-$(CONFIG_JFFS2_FS) += jffs2.o
@@ -13,6 +13,7 @@ jffs2-y += super.o

jffs2-$(CONFIG_JFFS2_FS_NAND)	+= wbuf.o
jffs2-$(CONFIG_JFFS2_FS_NOR_ECC) += wbuf.o
jffs2-$(CONFIG_JFFS2_FS_DATAFLASH) += wbuf.o
jffs2-$(CONFIG_JFFS2_RUBIN)	+= compr_rubin.o
jffs2-$(CONFIG_JFFS2_RTIME)	+= compr_rtime.o
jffs2-$(CONFIG_JFFS2_ZLIB)	+= compr_zlib.o
+10 −3
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@
 *
 * For licensing information, see the file 'LICENCE' in this directory.
 *
 * $Id: erase.c,v 1.70 2005/02/09 09:09:01 pavlov Exp $
 * $Id: erase.c,v 1.71 2005/02/09 09:17:40 pavlov Exp $
 *
 */

@@ -310,7 +310,7 @@ static void jffs2_mark_erased_block(struct jffs2_sb_info *c, struct jffs2_eraseb
	int ret;
	uint32_t bad_offset;

	if (!jffs2_cleanmarker_oob(c)) {
	if ((!jffs2_cleanmarker_oob(c)) && (c->cleanmarker_size > 0)) {
		marker_ref = jffs2_alloc_raw_node_ref();
		if (!marker_ref) {
			printk(KERN_WARNING "Failed to allocate raw node ref for clean marker\n");
@@ -351,7 +351,7 @@ static void jffs2_mark_erased_block(struct jffs2_sb_info *c, struct jffs2_eraseb
					bad_offset += i;
					printk(KERN_WARNING "Newly-erased block contained word 0x%lx at offset 0x%08x\n", datum, bad_offset);
				bad: 
					if (!jffs2_cleanmarker_oob(c))
					if ((!jffs2_cleanmarker_oob(c)) && (c->cleanmarker_size > 0))
						jffs2_free_raw_node_ref(marker_ref);
					kfree(ebuf);
				bad2:
@@ -383,6 +383,13 @@ static void jffs2_mark_erased_block(struct jffs2_sb_info *c, struct jffs2_eraseb
			
		jeb->first_node = jeb->last_node = NULL;

		jeb->free_size = c->sector_size;
		jeb->used_size = 0;
		jeb->dirty_size = 0;
		jeb->wasted_size = 0;
	} else if (c->cleanmarker_size == 0) {
		jeb->first_node = jeb->last_node = NULL;

		jeb->free_size = c->sector_size;
		jeb->used_size = 0;
		jeb->dirty_size = 0;
+20 −1
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@
 *
 * For licensing information, see the file 'LICENCE' in this directory.
 *
 * $Id: fs.c,v 1.51 2004/11/28 12:19:37 dedekind Exp $
 * $Id: fs.c,v 1.52 2005/02/09 09:17:40 pavlov Exp $
 *
 */

@@ -456,6 +456,12 @@ int jffs2_do_fill_super(struct super_block *sb, void *data, int silent)
		return -EINVAL;
	}
#endif
#ifndef CONFIG_JFFS2_FS_DATAFLASH
	if (c->mtd->type == MTD_DATAFLASH) {
		printk(KERN_ERR "jffs2: Cannot operate on DataFlash unless jffs2 DataFlash support is compiled in.\n");
		return -EINVAL;
	}
#endif

	c->flash_size = c->mtd->size;

@@ -661,6 +667,14 @@ static int jffs2_flash_setup(struct jffs2_sb_info *c) {
		if (ret)
			return ret;
	}
	
	/* and Dataflash */
	if (jffs2_dataflash(c)) {
		ret = jffs2_dataflash_setup(c);
		if (ret)
			return ret;
	}
	
	return ret;
}

@@ -674,4 +688,9 @@ void jffs2_flash_cleanup(struct jffs2_sb_info *c) {
	if (jffs2_nor_ecc(c)) {
		jffs2_nor_ecc_flash_cleanup(c);
	}
	
	/* and DataFlash */
	if (jffs2_dataflash(c)) {
		jffs2_dataflash_cleanup(c);
	}
}
+16 −2
Original line number Diff line number Diff line
@@ -7,7 +7,7 @@
 *
 * For licensing information, see the file 'LICENCE' in this directory.
 *
 * $Id: os-linux.h,v 1.52 2005/02/09 09:09:01 pavlov Exp $
 * $Id: os-linux.h,v 1.53 2005/02/09 09:17:41 pavlov Exp $
 *
 */

@@ -97,12 +97,16 @@ static inline void jffs2_init_inode_info(struct jffs2_inode_info *f)
#endif
}

#ifdef CONFIG_JFFS2_FS_DATAFLASH
#define SECTOR_ADDR(x) ( ((unsigned long)(x) / (unsigned long)(c->sector_size)) * c->sector_size )
#else
#define SECTOR_ADDR(x) ( ((unsigned long)(x) & ~(c->sector_size-1)) )
#endif

#define jffs2_is_readonly(c) (OFNI_BS_2SFFJ(c)->s_flags & MS_RDONLY)
#define jffs2_is_writebuffered(c) (c->wbuf != NULL)

#if (!defined CONFIG_JFFS2_FS_NAND && !defined CONFIG_JFFS2_FS_NOR_ECC)
#if (!defined CONFIG_JFFS2_FS_NAND && !defined CONFIG_JFFS2_FS_NOR_ECC && !defined CONFIG_JFFS2_FS_DATAFLASH)
#define jffs2_can_mark_obsolete(c) (1)
#define jffs2_cleanmarker_oob(c) (0)
#define jffs2_write_nand_cleanmarker(c,jeb) (-EIO)
@@ -119,6 +123,7 @@ static inline void jffs2_init_inode_info(struct jffs2_inode_info *f)
#define jffs2_wbuf_timeout NULL
#define jffs2_wbuf_process NULL
#define jffs2_nor_ecc(c) (0)
#define jffs2_dataflash(c) (0)
#define jffs2_nor_ecc_flash_setup(c) (0)
#define jffs2_nor_ecc_flash_cleanup(c) do {} while (0)

@@ -154,6 +159,15 @@ void jffs2_nor_ecc_flash_cleanup(struct jffs2_sb_info *c);
#define jffs2_nor_ecc_flash_setup(c) (0)
#define jffs2_nor_ecc_flash_cleanup(c) do {} while (0)
#endif /* NOR ECC */
#ifdef CONFIG_JFFS2_FS_DATAFLASH
#define jffs2_dataflash(c) (c->mtd->type == MTD_DATAFLASH)
int jffs2_dataflash_setup(struct jffs2_sb_info *c);
void jffs2_dataflash_cleanup(struct jffs2_sb_info *c);
#else
#define jffs2_dataflash(c) (0)
#define jffs2_dataflash_setup(c) (0)
#define jffs2_dataflash_cleanup(c) do {} while (0)
#endif /* DATAFLASH */
#endif /* NAND */

/* erase.c */
Loading