Commit f0054636 authored by Linus Torvalds's avatar Linus Torvalds

Merge git://git.infradead.org/mtd-2.6

* git://git.infradead.org/mtd-2.6: (46 commits)
  [MTD] [MAPS] drivers/mtd/maps/ck804xrom.c: convert pci_module_init()
  [MTD] [NAND] CM-x270 MTD driver
  [MTD] [NAND] Wrong calculation of page number in nand_block_bad()
  [MTD] [MAPS] fix plat-ram printk format
  [JFFS2] Fix compr_rubin.c build after include file elimination.
  [JFFS2] Handle inodes with only a single metadata node with non-zero isize
  [JFFS2] Tidy up licensing/copyright boilerplate.
  [MTD] [OneNAND] Exit loop only when column start with 0
  [MTD] [OneNAND] Fix access the past of the real oobfree array
  [MTD] [OneNAND] Update Samsung OneNAND official URL
  [JFFS2] Better fix for all-zero node headers
  [JFFS2] Improve read_inode memory usage, v2.
  [JFFS2] Improve failure mode if inode checking leaves unchecked space.
  [JFFS2] Fix cross-endian build.
  [MTD] Finish conversion mtd_blkdevs to use the kthread API
  [JFFS2] Obsolete dirent nodes immediately on unlink, where possible.
  Use menuconfig objects: MTD
  [MTD] mtd_blkdevs: Convert to use the kthread API
  [MTD] Fix fwh_lock locking
  [JFFS2] Speed up mount for directly-mapped NOR flash
  ...
parents 50f732ee 28b57cdd
# $Id: Kconfig,v 1.11 2005/11/07 11:14:19 gleixner Exp $ # $Id: Kconfig,v 1.11 2005/11/07 11:14:19 gleixner Exp $
menu "Memory Technology Devices (MTD)" menuconfig MTD
config MTD
tristate "Memory Technology Device (MTD) support" tristate "Memory Technology Device (MTD) support"
help help
Memory Technology Devices are flash, RAM and similar chips, often Memory Technology Devices are flash, RAM and similar chips, often
...@@ -13,9 +11,10 @@ config MTD ...@@ -13,9 +11,10 @@ config MTD
them. It will also allow you to select individual drivers for them. It will also allow you to select individual drivers for
particular hardware and users of MTD devices. If unsure, say N. particular hardware and users of MTD devices. If unsure, say N.
if MTD
config MTD_DEBUG config MTD_DEBUG
bool "Debugging" bool "Debugging"
depends on MTD
help help
This turns on low-level debugging for the entire MTD sub-system. This turns on low-level debugging for the entire MTD sub-system.
Normally, you should say 'N'. Normally, you should say 'N'.
...@@ -29,7 +28,6 @@ config MTD_DEBUG_VERBOSE ...@@ -29,7 +28,6 @@ config MTD_DEBUG_VERBOSE
config MTD_CONCAT config MTD_CONCAT
tristate "MTD concatenating support" tristate "MTD concatenating support"
depends on MTD
help help
Support for concatenating several MTD devices into a single Support for concatenating several MTD devices into a single
(virtual) one. This allows you to have -for example- a JFFS(2) (virtual) one. This allows you to have -for example- a JFFS(2)
...@@ -38,7 +36,6 @@ config MTD_CONCAT ...@@ -38,7 +36,6 @@ config MTD_CONCAT
config MTD_PARTITIONS config MTD_PARTITIONS
bool "MTD partitioning support" bool "MTD partitioning support"
depends on MTD
help help
If you have a device which needs to divide its flash chip(s) up If you have a device which needs to divide its flash chip(s) up
into multiple 'partitions', each of which appears to the user as into multiple 'partitions', each of which appears to the user as
...@@ -153,11 +150,9 @@ config MTD_AFS_PARTS ...@@ -153,11 +150,9 @@ config MTD_AFS_PARTS
'armflash' map driver (CONFIG_MTD_ARMFLASH) does this, for example. 'armflash' map driver (CONFIG_MTD_ARMFLASH) does this, for example.
comment "User Modules And Translation Layers" comment "User Modules And Translation Layers"
depends on MTD
config MTD_CHAR config MTD_CHAR
tristate "Direct char device access to MTD devices" tristate "Direct char device access to MTD devices"
depends on MTD
help help
This provides a character device for each MTD device present in This provides a character device for each MTD device present in
the system, allowing the user to read and write directly to the the system, allowing the user to read and write directly to the
...@@ -166,12 +161,12 @@ config MTD_CHAR ...@@ -166,12 +161,12 @@ config MTD_CHAR
config MTD_BLKDEVS config MTD_BLKDEVS
tristate "Common interface to block layer for MTD 'translation layers'" tristate "Common interface to block layer for MTD 'translation layers'"
depends on MTD && BLOCK depends on BLOCK
default n default n
config MTD_BLOCK config MTD_BLOCK
tristate "Caching block device access to MTD devices" tristate "Caching block device access to MTD devices"
depends on MTD && BLOCK depends on BLOCK
select MTD_BLKDEVS select MTD_BLKDEVS
---help--- ---help---
Although most flash chips have an erase size too large to be useful Although most flash chips have an erase size too large to be useful
...@@ -194,7 +189,7 @@ config MTD_BLOCK ...@@ -194,7 +189,7 @@ config MTD_BLOCK
config MTD_BLOCK_RO config MTD_BLOCK_RO
tristate "Readonly block device access to MTD devices" tristate "Readonly block device access to MTD devices"
depends on MTD_BLOCK!=y && MTD && BLOCK depends on MTD_BLOCK!=y && BLOCK
select MTD_BLKDEVS select MTD_BLKDEVS
help help
This allows you to mount read-only file systems (such as cramfs) This allows you to mount read-only file systems (such as cramfs)
...@@ -206,7 +201,7 @@ config MTD_BLOCK_RO ...@@ -206,7 +201,7 @@ config MTD_BLOCK_RO
config FTL config FTL
tristate "FTL (Flash Translation Layer) support" tristate "FTL (Flash Translation Layer) support"
depends on MTD && BLOCK depends on BLOCK
select MTD_BLKDEVS select MTD_BLKDEVS
---help--- ---help---
This provides support for the original Flash Translation Layer which This provides support for the original Flash Translation Layer which
...@@ -223,7 +218,7 @@ config FTL ...@@ -223,7 +218,7 @@ config FTL
config NFTL config NFTL
tristate "NFTL (NAND Flash Translation Layer) support" tristate "NFTL (NAND Flash Translation Layer) support"
depends on MTD && BLOCK depends on BLOCK
select MTD_BLKDEVS select MTD_BLKDEVS
---help--- ---help---
This provides support for the NAND Flash Translation Layer which is This provides support for the NAND Flash Translation Layer which is
...@@ -247,7 +242,7 @@ config NFTL_RW ...@@ -247,7 +242,7 @@ config NFTL_RW
config INFTL config INFTL
tristate "INFTL (Inverse NAND Flash Translation Layer) support" tristate "INFTL (Inverse NAND Flash Translation Layer) support"
depends on MTD && BLOCK depends on BLOCK
select MTD_BLKDEVS select MTD_BLKDEVS
---help--- ---help---
This provides support for the Inverse NAND Flash Translation This provides support for the Inverse NAND Flash Translation
...@@ -265,7 +260,7 @@ config INFTL ...@@ -265,7 +260,7 @@ config INFTL
config RFD_FTL config RFD_FTL
tristate "Resident Flash Disk (Flash Translation Layer) support" tristate "Resident Flash Disk (Flash Translation Layer) support"
depends on MTD && BLOCK depends on BLOCK
select MTD_BLKDEVS select MTD_BLKDEVS
---help--- ---help---
This provides support for the flash translation layer known This provides support for the flash translation layer known
...@@ -276,7 +271,7 @@ config RFD_FTL ...@@ -276,7 +271,7 @@ config RFD_FTL
config SSFDC config SSFDC
tristate "NAND SSFDC (SmartMedia) read only translation layer" tristate "NAND SSFDC (SmartMedia) read only translation layer"
depends on MTD && BLOCK depends on BLOCK
select MTD_BLKDEVS select MTD_BLKDEVS
help help
This enables read only access to SmartMedia formatted NAND This enables read only access to SmartMedia formatted NAND
...@@ -294,5 +289,4 @@ source "drivers/mtd/onenand/Kconfig" ...@@ -294,5 +289,4 @@ source "drivers/mtd/onenand/Kconfig"
source "drivers/mtd/ubi/Kconfig" source "drivers/mtd/ubi/Kconfig"
endmenu endif # MTD
...@@ -6,7 +6,6 @@ menu "RAM/ROM/Flash chip drivers" ...@@ -6,7 +6,6 @@ menu "RAM/ROM/Flash chip drivers"
config MTD_CFI config MTD_CFI
tristate "Detect flash chips by Common Flash Interface (CFI) probe" tristate "Detect flash chips by Common Flash Interface (CFI) probe"
depends on MTD
select MTD_GEN_PROBE select MTD_GEN_PROBE
help help
The Common Flash Interface specification was developed by Intel, The Common Flash Interface specification was developed by Intel,
...@@ -18,7 +17,6 @@ config MTD_CFI ...@@ -18,7 +17,6 @@ config MTD_CFI
config MTD_JEDECPROBE config MTD_JEDECPROBE
tristate "Detect non-CFI AMD/JEDEC-compatible flash chips" tristate "Detect non-CFI AMD/JEDEC-compatible flash chips"
depends on MTD
select MTD_GEN_PROBE select MTD_GEN_PROBE
help help
This option enables JEDEC-style probing of flash chips which are not This option enables JEDEC-style probing of flash chips which are not
...@@ -213,21 +211,18 @@ config MTD_CFI_UTIL ...@@ -213,21 +211,18 @@ config MTD_CFI_UTIL
config MTD_RAM config MTD_RAM
tristate "Support for RAM chips in bus mapping" tristate "Support for RAM chips in bus mapping"
depends on MTD
help help
This option enables basic support for RAM chips accessed through This option enables basic support for RAM chips accessed through
a bus mapping driver. a bus mapping driver.
config MTD_ROM config MTD_ROM
tristate "Support for ROM chips in bus mapping" tristate "Support for ROM chips in bus mapping"
depends on MTD
help help
This option enables basic support for ROM chips accessed through This option enables basic support for ROM chips accessed through
a bus mapping driver. a bus mapping driver.
config MTD_ABSENT config MTD_ABSENT
tristate "Support for absent chips in bus mapping" tristate "Support for absent chips in bus mapping"
depends on MTD
help help
This option enables support for a dummy probing driver used to This option enables support for a dummy probing driver used to
allocated placeholder MTD devices on systems that have socketed allocated placeholder MTD devices on systems that have socketed
...@@ -237,7 +232,6 @@ config MTD_ABSENT ...@@ -237,7 +232,6 @@ config MTD_ABSENT
with this driver will return -ENODEV upon access. with this driver will return -ENODEV upon access.
config MTD_OBSOLETE_CHIPS config MTD_OBSOLETE_CHIPS
depends on MTD
bool "Older (theoretically obsoleted now) drivers for non-CFI chips" bool "Older (theoretically obsoleted now) drivers for non-CFI chips"
help help
This option does not enable any code directly, but will allow you to This option does not enable any code directly, but will allow you to
...@@ -250,7 +244,7 @@ config MTD_OBSOLETE_CHIPS ...@@ -250,7 +244,7 @@ config MTD_OBSOLETE_CHIPS
config MTD_AMDSTD config MTD_AMDSTD
tristate "AMD compatible flash chip support (non-CFI)" tristate "AMD compatible flash chip support (non-CFI)"
depends on MTD && MTD_OBSOLETE_CHIPS && BROKEN depends on MTD_OBSOLETE_CHIPS && BROKEN
help help
This option enables support for flash chips using AMD-compatible This option enables support for flash chips using AMD-compatible
commands, including some which are not CFI-compatible and hence commands, including some which are not CFI-compatible and hence
...@@ -260,7 +254,7 @@ config MTD_AMDSTD ...@@ -260,7 +254,7 @@ config MTD_AMDSTD
config MTD_SHARP config MTD_SHARP
tristate "pre-CFI Sharp chip support" tristate "pre-CFI Sharp chip support"
depends on MTD && MTD_OBSOLETE_CHIPS depends on MTD_OBSOLETE_CHIPS
help help
This option enables support for flash chips using Sharp-compatible This option enables support for flash chips using Sharp-compatible
commands, including some which are not CFI-compatible and hence commands, including some which are not CFI-compatible and hence
...@@ -268,7 +262,7 @@ config MTD_SHARP ...@@ -268,7 +262,7 @@ config MTD_SHARP
config MTD_JEDEC config MTD_JEDEC
tristate "JEDEC device support" tristate "JEDEC device support"
depends on MTD && MTD_OBSOLETE_CHIPS && BROKEN depends on MTD_OBSOLETE_CHIPS && BROKEN
help help
Enable older JEDEC flash interface devices for self Enable older JEDEC flash interface devices for self
programming flash. It is commonly used in older AMD chips. It is programming flash. It is commonly used in older AMD chips. It is
......
...@@ -15,6 +15,8 @@ ...@@ -15,6 +15,8 @@
* - optimized write buffer method * - optimized write buffer method
* 02/05/2002 Christopher Hoover <ch@hpl.hp.com>/<ch@murgatroid.com> * 02/05/2002 Christopher Hoover <ch@hpl.hp.com>/<ch@murgatroid.com>
* - reworked lock/unlock/erase support for var size flash * - reworked lock/unlock/erase support for var size flash
* 21/03/2007 Rodolfo Giometti <giometti@linux.it>
* - auto unlock sectors on resume for auto locking flash on power up
*/ */
#include <linux/module.h> #include <linux/module.h>
...@@ -30,6 +32,7 @@ ...@@ -30,6 +32,7 @@
#include <linux/delay.h> #include <linux/delay.h>
#include <linux/interrupt.h> #include <linux/interrupt.h>
#include <linux/reboot.h> #include <linux/reboot.h>
#include <linux/bitmap.h>
#include <linux/mtd/xip.h> #include <linux/mtd/xip.h>
#include <linux/mtd/map.h> #include <linux/mtd/map.h>
#include <linux/mtd/mtd.h> #include <linux/mtd/mtd.h>
...@@ -220,6 +223,15 @@ static void fixup_use_write_buffers(struct mtd_info *mtd, void *param) ...@@ -220,6 +223,15 @@ static void fixup_use_write_buffers(struct mtd_info *mtd, void *param)
} }
} }
/*
* Some chips power-up with all sectors locked by default.
*/
static void fixup_use_powerup_lock(struct mtd_info *mtd, void *param)
{
printk(KERN_INFO "Using auto-unlock on power-up/resume\n" );
mtd->flags |= MTD_STUPID_LOCK;
}
static struct cfi_fixup cfi_fixup_table[] = { static struct cfi_fixup cfi_fixup_table[] = {
#ifdef CMDSET0001_DISABLE_ERASE_SUSPEND_ON_WRITE #ifdef CMDSET0001_DISABLE_ERASE_SUSPEND_ON_WRITE
{ CFI_MFR_ANY, CFI_ID_ANY, fixup_intel_strataflash, NULL }, { CFI_MFR_ANY, CFI_ID_ANY, fixup_intel_strataflash, NULL },
...@@ -232,6 +244,7 @@ static struct cfi_fixup cfi_fixup_table[] = { ...@@ -232,6 +244,7 @@ static struct cfi_fixup cfi_fixup_table[] = {
#endif #endif
{ CFI_MFR_ST, 0x00ba, /* M28W320CT */ fixup_st_m28w320ct, NULL }, { CFI_MFR_ST, 0x00ba, /* M28W320CT */ fixup_st_m28w320ct, NULL },
{ CFI_MFR_ST, 0x00bb, /* M28W320CB */ fixup_st_m28w320cb, NULL }, { CFI_MFR_ST, 0x00bb, /* M28W320CB */ fixup_st_m28w320cb, NULL },
{ MANUFACTURER_INTEL, 0x891c, fixup_use_powerup_lock, NULL, },
{ 0, 0, NULL, NULL } { 0, 0, NULL, NULL }
}; };
...@@ -460,6 +473,7 @@ static struct mtd_info *cfi_intelext_setup(struct mtd_info *mtd) ...@@ -460,6 +473,7 @@ static struct mtd_info *cfi_intelext_setup(struct mtd_info *mtd)
mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].offset = (j*devsize)+offset; mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].offset = (j*devsize)+offset;
mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].erasesize = ersize; mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].erasesize = ersize;
mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].numblocks = ernum; mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].numblocks = ernum;
mtd->eraseregions[(j*cfi->cfiq->NumEraseRegions)+i].lockmap = kmalloc(ernum / 8 + 1, GFP_KERNEL);
} }
offset += (ersize * ernum); offset += (ersize * ernum);
} }
...@@ -1825,8 +1839,7 @@ static void cfi_intelext_sync (struct mtd_info *mtd) ...@@ -1825,8 +1839,7 @@ static void cfi_intelext_sync (struct mtd_info *mtd)
} }
} }
#ifdef DEBUG_LOCK_BITS static int __xipram do_getlockstatus_oneblock(struct map_info *map,
static int __xipram do_printlockstatus_oneblock(struct map_info *map,
struct flchip *chip, struct flchip *chip,
unsigned long adr, unsigned long adr,
int len, void *thunk) int len, void *thunk)
...@@ -1840,8 +1853,17 @@ static int __xipram do_printlockstatus_oneblock(struct map_info *map, ...@@ -1840,8 +1853,17 @@ static int __xipram do_printlockstatus_oneblock(struct map_info *map,
chip->state = FL_JEDEC_QUERY; chip->state = FL_JEDEC_QUERY;
status = cfi_read_query(map, adr+(2*ofs_factor)); status = cfi_read_query(map, adr+(2*ofs_factor));
xip_enable(map, chip, 0); xip_enable(map, chip, 0);
return status;
}
#ifdef DEBUG_LOCK_BITS
static int __xipram do_printlockstatus_oneblock(struct map_info *map,
struct flchip *chip,
unsigned long adr,
int len, void *thunk)
{
printk(KERN_DEBUG "block status register for 0x%08lx is %x\n", printk(KERN_DEBUG "block status register for 0x%08lx is %x\n",
adr, status); adr, do_getlockstatus_oneblock(map, chip, adr, len, thunk));
return 0; return 0;
} }
#endif #endif
...@@ -2216,14 +2238,45 @@ static int cfi_intelext_get_user_prot_info(struct mtd_info *mtd, ...@@ -2216,14 +2238,45 @@ static int cfi_intelext_get_user_prot_info(struct mtd_info *mtd,
#endif #endif
static void cfi_intelext_save_locks(struct mtd_info *mtd)
{
struct mtd_erase_region_info *region;
int block, status, i;
unsigned long adr;
size_t len;
for (i = 0; i < mtd->numeraseregions; i++) {
region = &mtd->eraseregions[i];
if (!region->lockmap)
continue;
for (block = 0; block < region->numblocks; block++){
len = region->erasesize;
adr = region->offset + block * len;
status = cfi_varsize_frob(mtd,
do_getlockstatus_oneblock, adr, len, 0);
if (status)
set_bit(block, region->lockmap);
else
clear_bit(block, region->lockmap);
}
}
}
static int cfi_intelext_suspend(struct mtd_info *mtd) static int cfi_intelext_suspend(struct mtd_info *mtd)
{ {
struct map_info *map = mtd->priv; struct map_info *map = mtd->priv;
struct cfi_private *cfi = map->fldrv_priv; struct cfi_private *cfi = map->fldrv_priv;
struct cfi_pri_intelext *extp = cfi->cmdset_priv;
int i; int i;
struct flchip *chip; struct flchip *chip;
int ret = 0; int ret = 0;
if ((mtd->flags & MTD_STUPID_LOCK)
&& extp && (extp->FeatureSupport & (1 << 5)))
cfi_intelext_save_locks(mtd);
for (i=0; !ret && i<cfi->numchips; i++) { for (i=0; !ret && i<cfi->numchips; i++) {
chip = &cfi->chips[i]; chip = &cfi->chips[i];
...@@ -2285,10 +2338,33 @@ static int cfi_intelext_suspend(struct mtd_info *mtd) ...@@ -2285,10 +2338,33 @@ static int cfi_intelext_suspend(struct mtd_info *mtd)
return ret; return ret;
} }
static void cfi_intelext_restore_locks(struct mtd_info *mtd)
{
struct mtd_erase_region_info *region;
int block, i;
unsigned long adr;
size_t len;
for (i = 0; i < mtd->numeraseregions; i++) {
region = &mtd->eraseregions[i];
if (!region->lockmap)
continue;
for (block = 0; block < region->numblocks; block++) {
len = region->erasesize;
adr = region->offset + block * len;
if (!test_bit(block, region->lockmap))
cfi_intelext_unlock(mtd, adr, len);
}
}
}
static void cfi_intelext_resume(struct mtd_info *mtd) static void cfi_intelext_resume(struct mtd_info *mtd)
{ {
struct map_info *map = mtd->priv; struct map_info *map = mtd->priv;
struct cfi_private *cfi = map->fldrv_priv; struct cfi_private *cfi = map->fldrv_priv;
struct cfi_pri_intelext *extp = cfi->cmdset_priv;
int i; int i;
struct flchip *chip; struct flchip *chip;
...@@ -2307,6 +2383,10 @@ static void cfi_intelext_resume(struct mtd_info *mtd) ...@@ -2307,6 +2383,10 @@ static void cfi_intelext_resume(struct mtd_info *mtd)
spin_unlock(chip->mutex); spin_unlock(chip->mutex);
} }
if ((mtd->flags & MTD_STUPID_LOCK)
&& extp && (extp->FeatureSupport & (1 << 5)))
cfi_intelext_restore_locks(mtd);
} }
static int cfi_intelext_reset(struct mtd_info *mtd) static int cfi_intelext_reset(struct mtd_info *mtd)
...@@ -2347,12 +2427,19 @@ static void cfi_intelext_destroy(struct mtd_info *mtd) ...@@ -2347,12 +2427,19 @@ static void cfi_intelext_destroy(struct mtd_info *mtd)
{ {
struct map_info *map = mtd->priv; struct map_info *map = mtd->priv;
struct cfi_private *cfi = map->fldrv_priv; struct cfi_private *cfi = map->fldrv_priv;
struct mtd_erase_region_info *region;
int i;
cfi_intelext_reset(mtd); cfi_intelext_reset(mtd);
unregister_reboot_notifier(&mtd->reboot_notifier); unregister_reboot_notifier(&mtd->reboot_notifier);
kfree(cfi->cmdset_priv); kfree(cfi->cmdset_priv);
kfree(cfi->cfiq); kfree(cfi->cfiq);
kfree(cfi->chips[0].priv); kfree(cfi->chips[0].priv);
kfree(cfi); kfree(cfi);
for (i = 0; i < mtd->numeraseregions; i++) {
region = &mtd->eraseregions[i];
if (region->lockmap)
kfree(region->lockmap);
}
kfree(mtd->eraseregions); kfree(mtd->eraseregions);
} }
......
...@@ -65,11 +65,12 @@ static int fwh_xxlock_oneblock(struct map_info *map, struct flchip *chip, ...@@ -65,11 +65,12 @@ static int fwh_xxlock_oneblock(struct map_info *map, struct flchip *chip,
return ret; return ret;
} }
chip->oldstate = chip->state;
chip->state = xxlt->state; chip->state = xxlt->state;
map_write(map, CMD(xxlt->val), adr); map_write(map, CMD(xxlt->val), adr);
/* Done and happy. */ /* Done and happy. */
chip->state = FL_READY; chip->state = chip->oldstate;
put_chip(map, chip, adr); put_chip(map, chip, adr);
spin_unlock(chip->mutex); spin_unlock(chip->mutex);
return 0; return 0;
......
...@@ -6,7 +6,7 @@ menu "Self-contained MTD device drivers" ...@@ -6,7 +6,7 @@ menu "Self-contained MTD device drivers"
config MTD_PMC551 config MTD_PMC551
tristate "Ramix PMC551 PCI Mezzanine RAM card support" tristate "Ramix PMC551 PCI Mezzanine RAM card support"
depends on MTD && PCI depends on PCI
---help--- ---help---
This provides a MTD device driver for the Ramix PMC551 RAM PCI card This provides a MTD device driver for the Ramix PMC551 RAM PCI card
from Ramix Inc. <http://www.ramix.com/products/memory/pmc551.html>. from Ramix Inc. <http://www.ramix.com/products/memory/pmc551.html>.
...@@ -40,7 +40,7 @@ config MTD_PMC551_DEBUG ...@@ -40,7 +40,7 @@ config MTD_PMC551_DEBUG
config MTD_MS02NV config MTD_MS02NV
tristate "DEC MS02-NV NVRAM module support" tristate "DEC MS02-NV NVRAM module support"
depends on MTD && MACH_DECSTATION depends on MACH_DECSTATION
help help
This is an MTD driver for the DEC's MS02-NV (54-20948-01) battery This is an MTD driver for the DEC's MS02-NV (54-20948-01) battery
backed-up NVRAM module. The module was originally meant as an NFS backed-up NVRAM module. The module was originally meant as an NFS
...@@ -54,15 +54,23 @@ config MTD_MS02NV ...@@ -54,15 +54,23 @@ config MTD_MS02NV
config MTD_DATAFLASH config MTD_DATAFLASH
tristate "Support for AT45xxx DataFlash" tristate "Support for AT45xxx DataFlash"
depends on MTD && SPI_MASTER && EXPERIMENTAL depends on SPI_MASTER && EXPERIMENTAL
help help
This enables access to AT45xxx DataFlash chips, using SPI. This enables access to AT45xxx DataFlash chips, using SPI.
Sometimes DataFlash chips are packaged inside MMC-format Sometimes DataFlash chips are packaged inside MMC-format
cards; at this writing, the MMC stack won't handle those. cards; at this writing, the MMC stack won't handle those.
config MTD_DATAFLASH26
tristate "AT91RM9200 DataFlash AT26xxx"
depends on MTD && ARCH_AT91RM9200 && AT91_SPI
help
This enables access to the DataFlash chip (AT26xxx) on an
AT91RM9200-based board.
If you have such a board and such a DataFlash, say 'Y'.
config MTD_M25P80 config MTD_M25P80
tristate "Support for M25 SPI Flash" tristate "Support for M25 SPI Flash"
depends on MTD && SPI_MASTER && EXPERIMENTAL depends on SPI_MASTER && EXPERIMENTAL
help help
This enables access to ST M25P80 and similar SPI flash chips, This enables access to ST M25P80 and similar SPI flash chips,
used for program and data storage. Set up your spi devices used for program and data storage. Set up your spi devices
...@@ -70,7 +78,6 @@ config MTD_M25P80 ...@@ -70,7 +78,6 @@ config MTD_M25P80
config MTD_SLRAM config MTD_SLRAM
tristate "Uncached system RAM" tristate "Uncached system RAM"
depends on MTD
help help
If your CPU cannot cache all of the physical memory in your machine, If your CPU cannot cache all of the physical memory in your machine,
you can still use it for storage or swap by using this driver to you can still use it for storage or swap by using this driver to
...@@ -78,7 +85,6 @@ config MTD_SLRAM ...@@ -78,7 +85,6 @@ config MTD_SLRAM
config MTD_PHRAM config MTD_PHRAM
tristate "Physical system RAM" tristate "Physical system RAM"
depends on MTD
help help
This is a re-implementation of the slram driver above. This is a re-implementation of the slram driver above.
...@@ -88,7 +94,7 @@ config MTD_PHRAM ...@@ -88,7 +94,7 @@ config MTD_PHRAM
config MTD_LART config MTD_LART
tristate "28F160xx flash driver for LART" tristate "28F160xx flash driver for LART"
depends on SA1100_LART && MTD depends on SA1100_LART
help help
This enables the flash driver for LART. Please note that you do This enables the flash driver for LART. Please note that you do
not need any mapping/chip driver for LART. This one does it all not need any mapping/chip driver for LART. This one does it all
...@@ -96,7 +102,6 @@ config MTD_LART ...@@ -96,7 +102,6 @@ config MTD_LART
config MTD_MTDRAM config MTD_MTDRAM
tristate "Test driver using RAM" tristate "Test driver using RAM"
depends on MTD
help help
This enables a test MTD device driver which uses vmalloc() to This enables a test MTD device driver which uses vmalloc() to
provide storage. You probably want to say 'N' unless you're provide storage. You probably want to say 'N' unless you're
...@@ -136,7 +141,7 @@ config MTDRAM_ABS_POS ...@@ -136,7 +141,7 @@ config MTDRAM_ABS_POS
config MTD_BLOCK2MTD config MTD_BLOCK2MTD
tristate "MTD using block device" tristate "MTD using block device"
depends on MTD && BLOCK depends on BLOCK
help help
This driver allows a block device to appear as an MTD. It would This driver allows a block device to appear as an MTD. It would
generally be used in the following cases: generally be used in the following cases:
...@@ -150,7 +155,6 @@ comment "Disk-On-Chip Device Drivers" ...@@ -150,7 +155,6 @@ comment "Disk-On-Chip Device Drivers"
config MTD_DOC2000 config MTD_DOC2000
tristate "M-Systems Disk-On-Chip 2000 and Millennium (DEPRECATED)" tristate "M-Systems Disk-On-Chip 2000 and Millennium (DEPRECATED)"
depends on MTD
select MTD_DOCPROBE select MTD_DOCPROBE
select MTD_NAND_IDS select MTD_NAND_IDS
---help--- ---help---
...@@ -173,7 +177,6 @@ config MTD_DOC2000 ...@@ -173,7 +177,6 @@ config MTD_DOC2000
config MTD_DOC2001 config MTD_DOC2001
tristate "M-Systems Disk-On-Chip Millennium-only alternative driver (DEPRECATED)" tristate "M-Systems Disk-On-Chip Millennium-only alternative driver (DEPRECATED)"
depends on MTD
select MTD_DOCPROBE select MTD_DOCPROBE
select MTD_NAND_IDS select MTD_NAND_IDS
---help--- ---help---
...@@ -195,7 +198,6 @@ config MTD_DOC2001 ...@@ -195,7 +198,6 @@ config MTD_DOC2001
config MTD_DOC2001PLUS config MTD_DOC2001PLUS
tristate "M-Systems Disk-On-Chip Millennium Plus" tristate "M-Systems Disk-On-Chip Millennium Plus"
depends on MTD
select MTD_DOCPROBE select MTD_DOCPROBE
select MTD_NAND_IDS select MTD_NAND_IDS
---help--- ---help---
......
...@@ -16,4 +16,5 @@ obj-$(CONFIG_MTD_MTDRAM) += mtdram.o ...@@ -16,4 +16,5 @@ obj-$(CONFIG_MTD_MTDRAM) += mtdram.o
obj-$(CONFIG_MTD_LART) += lart.o obj-$(CONFIG_MTD_LART) += lart.o
obj-$(CONFIG_MTD_BLOCK2MTD) += block2mtd.o obj-$(CONFIG_MTD_BLOCK2MTD) += block2mtd.o
obj-$(CONFIG_MTD_DATAFLASH) += mtd_dataflash.o obj-$(CONFIG_MTD_DATAFLASH) += mtd_dataflash.o
obj-$(CONFIG_MTD_DATAFLASH26) += at91_dataflash26.o
obj-$(CONFIG_MTD_M25P80) += m25p80.o obj-$(CONFIG_MTD_M25P80) += m25p80.o
This diff is collapsed.
...@@ -40,56 +40,9 @@ struct block2mtd_dev { ...@@ -40,56 +40,9 @@ struct block2mtd_dev {
static LIST_HEAD(blkmtd_device_list); static LIST_HEAD(blkmtd_device_list);
#define PAGE_READAHEAD 64 static struct page* page_read(struct address_space *mapping, int index)
static void cache_readahead(struct address_space *mapping, int index)
{ {
filler_t *filler = (filler_t*)mapping->a_ops->readpage; filler_t *filler = (filler_t*)mapping->a_ops->readpage;
int i, pagei;
unsigned ret = 0;
unsigned long end_index;
struct page *page;
LIST_HEAD(page_pool);
struct inode *inode = mapping->host;
loff_t isize = i_size_read(inode);
if (!isize) {
INFO("iSize=0 in cache_readahead\n");
return;
}
end_index = ((isize - 1) >> PAGE_CACHE_SHIFT);
read_lock_irq(&mapping->tree_lock);
for (i = 0; i < PAGE_READAHEAD; i++) {
pagei = index + i;
if (pagei > end_index) {
INFO("Overrun end of disk in cache readahead\n");
break;
}
page = radix_tree_lookup(&mapping->page_tree, pagei);
if (page && (!i))
break;
if (page)
continue;
read_unlock_irq(&mapping->tree_lock);
page = page_cache_alloc_cold(mapping);
read_lock_irq(&mapping->tree_lock);
if (!page)
break;
page->index = pagei;
list_add(&page->lru, &page_pool);
ret++;
}
read_unlock_irq(&mapping->tree_lock);
if (ret)
read_cache_pages(mapping, &page_pool, filler, NULL);
}
static struct page* page_readahead(struct address_space *mapping, int index)
{
filler_t *filler = (filler_t*)mapping->a_ops->readpage;
cache_readahead(mapping, index);
return read_cache_page(mapping, index, filler, NULL); return read_cache_page(mapping, index, filler, NULL);
} }
...@@ -105,14 +58,14 @@ static int _block2mtd_erase(struct block2mtd_dev *dev, loff_t to, size_t len) ...@@ -105,14 +58,14 @@ static int _block2mtd_erase(struct block2mtd_dev *dev, loff_t to, size_t len)
u_long *max; u_long *max;
while (pages) { while (pages) {
page = page_readahead(mapping, index); page = page_read(mapping, index);
if (!page) if (!page)
return -ENOMEM; return -ENOMEM;
if (IS_ERR(page)) if (IS_ERR(page))
return PTR_ERR(page); return PTR_ERR(page);
max = (u_long*)page_address(page) + PAGE_SIZE; max = page_address(page) + PAGE_SIZE;
for (p=(u_long*)page_address(page); p<max; p++) for (p=page_address(page); p<max; p++)
if (*p != -1UL) { if (*p != -1UL) {
lock_page(page); lock_page(page);
memset(page_address(page), 0xff, PAGE_SIZE); memset(page_address(page), 0xff, PAGE_SIZE);
...@@ -174,8 +127,7 @@ static int block2mtd_read(struct mtd_info *mtd, loff_t from, size_t len, ...@@ -174,8 +127,7 @@ static int block2mtd_read(struct mtd_info *mtd, loff_t from, size_t len,
cpylen = len; // this page cpylen = len; // this page
len = len - cpylen; len = len - cpylen;
// Get page page = page_read(dev->blkdev->bd_inode->i_mapping, index);
page = page_readahead(dev->blkdev->bd_inode->i_mapping, index);
if (!page) if (!page)
return -ENOMEM; return -ENOMEM;
if (IS_ERR(page)) if (IS_ERR(page))
...@@ -213,8 +165,7 @@ static int _block2mtd_write(struct block2mtd_dev *dev, const u_char *buf, ...@@ -213,8 +165,7 @@ static int _block2mtd_write(struct block2mtd_dev *dev, const u_char *buf,
cpylen = len; // this page cpylen = len; // this page
len = len - cpylen; len = len - cpylen;
// Get page page = page_read(mapping, index);
page = page_readahead(mapping, index);
if (!page) if (!page)
return -ENOMEM; return -ENOMEM;
if (IS_ERR(page)) if (IS_ERR(page))
...@@ -308,9 +259,9 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size) ...@@ -308,9 +259,9 @@ static struct block2mtd_dev *add_device(char *devname, int erase_size)
/* We might not have rootfs mounted at this point. Try /* We might not have rootfs mounted at this point. Try
to resolve the device name by other means. */ to resolve the device name by other means. */
dev_t dev = name_to_dev_t(devname); dev_t devt = name_to_dev_t(devname);
if (dev != 0) { if (devt) {
bdev = open_by_devnum(dev, FMODE_WRITE | FMODE_READ); bdev = open_by_devnum(devt, FMODE_WRITE | FMODE_READ);
} }
} }
#endif #endif
......
...@@ -6,7 +6,6 @@ menu "Mapping drivers for chip access" ...@@ -6,7 +6,6 @@ menu "Mapping drivers for chip access"
config MTD_COMPLEX_MAPPINGS config MTD_COMPLEX_MAPPINGS
bool "Support non-linear mappings of flash chips" bool "Support non-linear mappings of flash chips"
depends on MTD
help help
This causes the chip drivers to allow for complicated This causes the chip drivers to allow for complicated
paged mappings of flash chips. paged mappings of flash chips.
...@@ -69,6 +68,39 @@ config MTD_PHYSMAP_OF ...@@ -69,6 +68,39 @@ config MTD_PHYSMAP_OF
physically into the CPU's memory. The mapping description here is physically into the CPU's memory. The mapping description here is
taken from OF device tree. taken from OF device tree.
config MTD_PMC_MSP_EVM
tristate "CFI Flash device mapped on PMC-Sierra MSP"
depends on PMC_MSP && MTD_CFI
select MTD_PARTITIONS
help
This provides a 'mapping' driver which support the way
in which user-programmable flash chips are connected on the
PMC-Sierra MSP eval/demo boards
choice
prompt "Maximum mappable memory avialable for flash IO"
depends on MTD_PMC_MSP_EVM
default MSP_FLASH_MAP_LIMIT_32M
config MSP_FLASH_MAP_LIMIT_32M
bool "32M"
endchoice
config MSP_FLASH_MAP_LIMIT
hex
default "0x02000000"
depends on MSP_FLASH_MAP_LIMIT_32M
config MTD_PMC_MSP_RAMROOT
tristate "Embedded RAM block device for root on PMC-Sierra MSP"
depends on PMC_MSP_EMBEDDED_ROOTFS && \
(MTD_BLOCK || MTD_BLOCK_RO) && \
MTD_RAM
help
This provides support for the embedded root file system
on PMC MSP devices. This memory is mapped as a MTD block device.
config MTD_SUN_UFLASH config MTD_SUN_UFLASH
tristate "Sun Microsystems userflash support" tristate "Sun Microsystems userflash support"
depends on SPARC && MTD_CFI depends on SPARC && MTD_CFI
...@@ -240,13 +272,13 @@ config MTD_NETtel ...@@ -240,13 +272,13 @@ config MTD_NETtel
config MTD_ALCHEMY config MTD_ALCHEMY
tristate "AMD Alchemy Pb1xxx/Db1xxx/RDK MTD support" tristate "AMD Alchemy Pb1xxx/Db1xxx/RDK MTD support"
depends on SOC_AU1X00 depends on SOC_AU1X00 && MTD_PARTITIONS && MTD_CFI
help help
Flash memory access on AMD Alchemy Pb/Db/RDK Reference Boards Flash memory access on AMD Alchemy Pb/Db/RDK Reference Boards
config MTD_MTX1 config MTD_MTX1
tristate "4G Systems MTX-1 Flash device" tristate "4G Systems MTX-1 Flash device"
depends on MIPS && MIPS_MTX1 depends on MIPS_MTX1 && MTD_CFI
help help
Flash memory access on 4G Systems MTX-1 Board. If you have one of Flash memory access on 4G Systems MTX-1 Board. If you have one of
these boards and would like to use the flash chips on it, say 'Y'. these boards and would like to use the flash chips on it, say 'Y'.
...@@ -384,7 +416,7 @@ config MTD_TQM834x ...@@ -384,7 +416,7 @@ config MTD_TQM834x
config MTD_OCELOT config MTD_OCELOT
tristate "Momenco Ocelot boot flash device" tristate "Momenco Ocelot boot flash device"
depends on MIPS && MOMENCO_OCELOT depends on MOMENCO_OCELOT
help help
This enables access routines for the boot flash device and for the This enables access routines for the boot flash device and for the
NVRAM on the Momenco Ocelot board. If you have one of these boards NVRAM on the Momenco Ocelot board. If you have one of these boards
...@@ -517,7 +549,7 @@ config MTD_OMAP_NOR ...@@ -517,7 +549,7 @@ config MTD_OMAP_NOR
# This needs CFI or JEDEC, depending on the cards found. # This needs CFI or JEDEC, depending on the cards found.
config MTD_PCI config MTD_PCI
tristate "PCI MTD driver" tristate "PCI MTD driver"
depends on MTD && PCI && MTD_COMPLEX_MAPPINGS depends on PCI && MTD_COMPLEX_MAPPINGS
help help
Mapping for accessing flash devices on add-in cards like the Intel XScale Mapping for accessing flash devices on add-in cards like the Intel XScale
IQ80310 card, and the Intel EBSA285 card in blank ROM programming mode IQ80310 card, and the Intel EBSA285 card in blank ROM programming mode
...@@ -527,7 +559,7 @@ config MTD_PCI ...@@ -527,7 +559,7 @@ config MTD_PCI
config MTD_PCMCIA config MTD_PCMCIA
tristate "PCMCIA MTD driver" tristate "PCMCIA MTD driver"
depends on MTD && PCMCIA && MTD_COMPLEX_MAPPINGS && BROKEN depends on PCMCIA && MTD_COMPLEX_MAPPINGS && BROKEN
help help
Map driver for accessing PCMCIA linear flash memory cards. These Map driver for accessing PCMCIA linear flash memory cards. These
cards are usually around 4-16MiB in size. This does not include cards are usually around 4-16MiB in size. This does not include
...@@ -591,13 +623,12 @@ config MTD_BAST_MAXSIZE ...@@ -591,13 +623,12 @@ config MTD_BAST_MAXSIZE
config MTD_SHARP_SL config MTD_SHARP_SL
bool "ROM mapped on Sharp SL Series" bool "ROM mapped on Sharp SL Series"
depends on MTD && ARCH_PXA depends on ARCH_PXA
help help
This enables access to the flash chip on the Sharp SL Series of PDAs. This enables access to the flash chip on the Sharp SL Series of PDAs.
config MTD_PLATRAM config MTD_PLATRAM
tristate "Map driver for platform device RAM (mtd-ram)" tristate "Map driver for platform device RAM (mtd-ram)"
depends on MTD
select MTD_RAM select MTD_RAM
help help
Map driver for RAM areas described via the platform device Map driver for RAM areas described via the platform device
......
...@@ -27,6 +27,8 @@ obj-$(CONFIG_MTD_CEIVA) += ceiva.o ...@@ -27,6 +27,8 @@ obj-$(CONFIG_MTD_CEIVA) += ceiva.o
obj-$(CONFIG_MTD_OCTAGON) += octagon-5066.o obj-$(CONFIG_MTD_OCTAGON) += octagon-5066.o
obj-$(CONFIG_MTD_PHYSMAP) += physmap.o obj-$(CONFIG_MTD_PHYSMAP) += physmap.o
obj-$(CONFIG_MTD_PHYSMAP_OF) += physmap_of.o obj-$(CONFIG_MTD_PHYSMAP_OF) += physmap_of.o
obj-$(CONFIG_MTD_PMC_MSP_EVM) += pmcmsp-flash.o
obj-$(CONFIG_MTD_PMC_MSP_RAMROOT)+= pmcmsp-ramroot.o
obj-$(CONFIG_MTD_PNC2000) += pnc2000.o obj-$(CONFIG_MTD_PNC2000) += pnc2000.o
obj-$(CONFIG_MTD_PCMCIA) += pcmciamtd.o obj-$(CONFIG_MTD_PCMCIA) += pcmciamtd.o
obj-$(CONFIG_MTD_RPXLITE) += rpxlite.o obj-$(CONFIG_MTD_RPXLITE) += rpxlite.o
......
/* /*
* Flash memory access on AMD Alchemy evaluation boards * Flash memory access on AMD Alchemy evaluation boards
* *
* $Id: alchemy-flash.c,v 1.2 2005/11/07 11:14:26 gleixner Exp $
*
* (C) 2003, 2004 Pete Popov <ppopov@embeddedalley.com> * (C) 2003, 2004 Pete Popov <ppopov@embeddedalley.com>
*
*/ */
#include <linux/init.h> #include <linux/init.h>
...@@ -18,12 +15,6 @@ ...@@ -18,12 +15,6 @@
#include <asm/io.h> #include <asm/io.h>
#ifdef DEBUG_RW
#define DBG(x...) printk(x)
#else
#define DBG(x...)
#endif
#ifdef CONFIG_MIPS_PB1000 #ifdef CONFIG_MIPS_PB1000
#define BOARD_MAP_NAME "Pb1000 Flash" #define BOARD_MAP_NAME "Pb1000 Flash"
#define BOARD_FLASH_SIZE 0x00800000 /* 8MB */ #define BOARD_FLASH_SIZE 0x00800000 /* 8MB */
......
...@@ -338,7 +338,7 @@ static int __init init_ck804xrom(void) ...@@ -338,7 +338,7 @@ static int __init init_ck804xrom(void)
} }
return -ENXIO; return -ENXIO;
#if 0 #if 0
return pci_module_init(&ck804xrom_driver); return pci_register_driver(&ck804xrom_driver);
#endif #endif
} }
......
...@@ -169,7 +169,8 @@ static int platram_probe(struct platform_device *pdev) ...@@ -169,7 +169,8 @@ static int platram_probe(struct platform_device *pdev)
goto exit_free; goto exit_free;
} }
dev_dbg(&pdev->dev, "got platform resource %p (0x%lx)\n", res, res->start); dev_dbg(&pdev->dev, "got platform resource %p (0x%llx)\n", res,
(unsigned long long)res->start);
/* setup map parameters */ /* setup map parameters */
......
/*
* Mapping of a custom board with both AMD CFI and JEDEC flash in partitions.
* Config with both CFI and JEDEC device support.
*
* Basically physmap.c with the addition of partitions and
* an array of mapping info to accomodate more than one flash type per board.
*
* Copyright 2005-2007 PMC-Sierra, Inc.
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/map.h>
#include <linux/mtd/partitions.h>
#include <asm/io.h>
#include <msp_prom.h>
#include <msp_regs.h>
static struct mtd_info **msp_flash;
static struct mtd_partition **msp_parts;
static struct map_info *msp_maps;
static int fcnt;
#define DEBUG_MARKER printk(KERN_NOTICE "%s[%d]\n",__FUNCTION__,__LINE__)
int __init init_msp_flash(void)
{
int i, j;
int offset, coff;
char *env;
int pcnt;
char flash_name[] = "flash0";
char part_name[] = "flash0_0";
unsigned addr, size;
/* If ELB is disabled by "ful-mux" mode, we can't get at flash */
if ((*DEV_ID_REG & DEV_ID_SINGLE_PC) &&
(*ELB_1PC_EN_REG & SINGLE_PCCARD)) {
printk(KERN_NOTICE "Single PC Card mode: no flash access\n");
return -ENXIO;
}
/* examine the prom environment for flash devices */
for (fcnt = 0; (env = prom_getenv(flash_name)); fcnt++)
flash_name[5] = '0' + fcnt + 1;
if (fcnt < 1)
return -ENXIO;
printk(KERN_NOTICE "Found %d PMC flash devices\n", fcnt);
msp_flash = (struct mtd_info **)kmalloc(
fcnt * sizeof(struct map_info *), GFP_KERNEL);
msp_parts = (struct mtd_partition **)kmalloc(
fcnt * sizeof(struct mtd_partition *), GFP_KERNEL);
msp_maps = (struct map_info *)kmalloc(
fcnt * sizeof(struct mtd_info), GFP_KERNEL);
memset(msp_maps, 0, fcnt * sizeof(struct mtd_info));
/* loop over the flash devices, initializing each */
for (i = 0; i < fcnt; i++) {
/* examine the prom environment for flash partititions */
part_name[5] = '0' + i;
part_name[7] = '0';
for (pcnt = 0; (env = prom_getenv(part_name)); pcnt++)
part_name[7] = '0' + pcnt + 1;
if (pcnt == 0) {
printk(KERN_NOTICE "Skipping flash device %d "
"(no partitions defined)\n", i);
continue;
}
msp_parts[i] = (struct mtd_partition *)kmalloc(
pcnt * sizeof(struct mtd_partition), GFP_KERNEL);
memset(msp_parts[i], 0, pcnt * sizeof(struct mtd_partition));
/* now initialize the devices proper */
flash_name[5] = '0' + i;
env = prom_getenv(flash_name);
if (sscanf(env, "%x:%x", &addr, &size) < 2)
return -ENXIO;
addr = CPHYSADDR(addr);
printk(KERN_NOTICE
"MSP flash device \"%s\": 0x%08x at 0x%08x\n",
flash_name, size, addr);
/* This must matchs the actual size of the flash chip */
msp_maps[i].size = size;
msp_maps[i].phys = addr;
/*
* Platforms have a specific limit of the size of memory
* which may be mapped for flash:
*/
if (size > CONFIG_MSP_FLASH_MAP_LIMIT)
size = CONFIG_MSP_FLASH_MAP_LIMIT;
msp_maps[i].virt = ioremap(addr, size);
msp_maps[i].bankwidth = 1;
msp_maps[i].name = strncpy(kmalloc(7, GFP_KERNEL),
flash_name, 7);
if (msp_maps[i].virt == NULL)
return -ENXIO;
for (j = 0; j < pcnt; j++) {
part_name[5] = '0' + i;
part_name[7] = '0' + j;
env = prom_getenv(part_name);
if (sscanf(env, "%x:%x:%n", &offset, &size, &coff) < 2)
return -ENXIO;
msp_parts[i][j].size = size;
msp_parts[i][j].offset = offset;
msp_parts[i][j].name = env + coff;
}
/* now probe and add the device */
simple_map_init(&msp_maps[i]);
msp_flash[i] = do_map_probe("cfi_probe", &msp_maps[i]);
if (msp_flash[i]) {
msp_flash[i]->owner = THIS_MODULE;
add_mtd_partitions(msp_flash[i], msp_parts[i], pcnt);
} else {
printk(KERN_ERR "map probe failed for flash\n");
return -ENXIO;
}
}
return 0;
}
static void __exit cleanup_msp_flash(void)
{
int i;
for (i = 0; i < sizeof(msp_flash) / sizeof(struct mtd_info **); i++) {
del_mtd_partitions(msp_flash[i]);
map_destroy(msp_flash[i]);
iounmap((void *)msp_maps[i].virt);
/* free the memory */
kfree(msp_maps[i].name);
kfree(msp_parts[i]);
}
kfree(msp_flash);
kfree(msp_parts);
kfree(msp_maps);
}
MODULE_AUTHOR("PMC-Sierra, Inc");
MODULE_DESCRIPTION("MTD map driver for PMC-Sierra MSP boards");
MODULE_LICENSE("GPL");
module_init(init_msp_flash);
module_exit(cleanup_msp_flash);
/*
* Mapping of the rootfs in a physical region of memory
*
* Copyright (C) 2005-2007 PMC-Sierra Inc.
* Author: Andrew Hughes, Andrew_Hughes@pmc-sierra.com
*
* This program is free software; you can redistribute it and/or modify it
* under the terms of the GNU General Public License as published by the
* Free Software Foundation; either version 2 of the License, or (at your
* option) any later version.
*
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
* MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN
* NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
* NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF
* USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
* THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* You should have received a copy of the GNU General Public License along
* with this program; if not, write to the Free Software Foundation, Inc.,
* 675 Mass Ave, Cambridge, MA 02139, USA.
*/
#include <linux/module.h>
#include <linux/types.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/slab.h>
#include <linux/fs.h>
#include <linux/root_dev.h>
#include <linux/mtd/mtd.h>
#include <linux/mtd/map.h>
#include <asm/io.h>
#include <msp_prom.h>
static struct mtd_info *rr_mtd;
struct map_info rr_map = {
.name = "ramroot",
.bankwidth = 4,
};
static int __init init_rrmap(void)
{
void *ramroot_start;
unsigned long ramroot_size;
/* Check for supported rootfs types */
if (get_ramroot(&ramroot_start, &ramroot_size)) {
rr_map.phys = CPHYSADDR(ramroot_start);
rr_map.size = ramroot_size;
printk(KERN_NOTICE
"PMC embedded root device: 0x%08lx @ 0x%08lx\n",
rr_map.size, (unsigned long)rr_map.phys);
} else {
printk(KERN_ERR
"init_rrmap: no supported embedded rootfs detected!\n");
return -ENXIO;
}
/* Map rootfs to I/O space for block device driver */
rr_map.virt = ioremap(rr_map.phys, rr_map.size);
if (!rr_map.virt) {
printk(KERN_ERR "Failed to ioremap\n");
return -EIO;
}
simple_map_init(&rr_map);
rr_mtd = do_map_probe("map_ram", &rr_map);
if (rr_mtd) {
rr_mtd->owner = THIS_MODULE;
add_mtd_device(rr_mtd);
ROOT_DEV = MKDEV(MTD_BLOCK_MAJOR, rr_mtd->index);
return 0;
}
iounmap(rr_map.virt);
return -ENXIO;
}
static void __exit cleanup_rrmap(void)
{
del_mtd_device(rr_mtd);
map_destroy(rr_mtd);
iounmap(rr_map.virt);
rr_map.virt = NULL;
}
MODULE_AUTHOR("PMC-Sierra, Inc");
MODULE_DESCRIPTION("MTD map driver for embedded PMC-Sierra MSP filesystem");
MODULE_LICENSE("GPL");
module_init(init_rrmap);
module_exit(cleanup_rrmap);
...@@ -20,6 +20,7 @@ ...@@ -20,6 +20,7 @@
#include <linux/hdreg.h> #include <linux/hdreg.h>
#include <linux/init.h> #include <linux/init.h>
#include <linux/mutex.h> #include <linux/mutex.h>
#include <linux/kthread.h>
#include <asm/uaccess.h> #include <asm/uaccess.h>
static LIST_HEAD(blktrans_majors); static LIST_HEAD(blktrans_majors);
...@@ -28,9 +29,7 @@ extern struct mutex mtd_table_mutex; ...@@ -28,9 +29,7 @@ extern struct mutex mtd_table_mutex;
extern struct mtd_info *mtd_table[]; extern struct mtd_info *mtd_table[];
struct mtd_blkcore_priv { struct mtd_blkcore_priv {
struct completion thread_dead; struct task_struct *thread;
int exiting;
wait_queue_head_t thread_wq;
struct request_queue *rq; struct request_queue *rq;
spinlock_t queue_lock; spinlock_t queue_lock;
}; };
...@@ -83,38 +82,19 @@ static int mtd_blktrans_thread(void *arg) ...@@ -83,38 +82,19 @@ static int mtd_blktrans_thread(void *arg)
/* we might get involved when memory gets low, so use PF_MEMALLOC */ /* we might get involved when memory gets low, so use PF_MEMALLOC */
current->flags |= PF_MEMALLOC | PF_NOFREEZE; current->flags |= PF_MEMALLOC | PF_NOFREEZE;
daemonize("%sd", tr->name);
/* daemonize() doesn't do this for us since some kernel threads
actually want to deal with signals. We can't just call
exit_sighand() since that'll cause an oops when we finally
do exit. */
spin_lock_irq(&current->sighand->siglock);
sigfillset(&current->blocked);
recalc_sigpending();
spin_unlock_irq(&current->sighand->siglock);
spin_lock_irq(rq->queue_lock); spin_lock_irq(rq->queue_lock);
while (!kthread_should_stop()) {
while (!tr->blkcore_priv->exiting) {
struct request *req; struct request *req;
struct mtd_blktrans_dev *dev; struct mtd_blktrans_dev *dev;
int res = 0; int res = 0;
DECLARE_WAITQUEUE(wait, current);
req = elv_next_request(rq); req = elv_next_request(rq);
if (!req) { if (!req) {
add_wait_queue(&tr->blkcore_priv->thread_wq, &wait);
set_current_state(TASK_INTERRUPTIBLE); set_current_state(TASK_INTERRUPTIBLE);
spin_unlock_irq(rq->queue_lock); spin_unlock_irq(rq->queue_lock);
schedule(); schedule();
remove_wait_queue(&tr->blkcore_priv->thread_wq, &wait);
spin_lock_irq(rq->queue_lock); spin_lock_irq(rq->queue_lock);
continue; continue;
} }
...@@ -133,13 +113,13 @@ static int mtd_blktrans_thread(void *arg) ...@@ -133,13 +113,13 @@ static int mtd_blktrans_thread(void *arg)
} }
spin_unlock_irq(rq->queue_lock); spin_unlock_irq(rq->queue_lock);
complete_and_exit(&tr->blkcore_priv->thread_dead, 0); return 0;
} }
static void mtd_blktrans_request(struct request_queue *rq) static void mtd_blktrans_request(struct request_queue *rq)
{ {
struct mtd_blktrans_ops *tr = rq->queuedata; struct mtd_blktrans_ops *tr = rq->queuedata;
wake_up(&tr->blkcore_priv->thread_wq); wake_up_process(tr->blkcore_priv->thread);
} }
...@@ -388,8 +368,6 @@ int register_mtd_blktrans(struct mtd_blktrans_ops *tr) ...@@ -388,8 +368,6 @@ int register_mtd_blktrans(struct mtd_blktrans_ops *tr)
return ret; return ret;
} }
spin_lock_init(&tr->blkcore_priv->queue_lock); spin_lock_init(&tr->blkcore_priv->queue_lock);
init_completion(&tr->blkcore_priv->thread_dead);
init_waitqueue_head(&tr->blkcore_priv->thread_wq);
tr->blkcore_priv->rq = blk_init_queue(mtd_blktrans_request, &tr->blkcore_priv->queue_lock); tr->blkcore_priv->rq = blk_init_queue(mtd_blktrans_request, &tr->blkcore_priv->queue_lock);
if (!tr->blkcore_priv->rq) { if (!tr->blkcore_priv->rq) {
...@@ -403,13 +381,14 @@ int register_mtd_blktrans(struct mtd_blktrans_ops *tr) ...@@ -403,13 +381,14 @@ int register_mtd_blktrans(struct mtd_blktrans_ops *tr)
blk_queue_hardsect_size(tr->blkcore_priv->rq, tr->blksize); blk_queue_hardsect_size(tr->blkcore_priv->rq, tr->blksize);
tr->blkshift = ffs(tr->blksize) - 1; tr->blkshift = ffs(tr->blksize) - 1;
ret = kernel_thread(mtd_blktrans_thread, tr, CLONE_KERNEL); tr->blkcore_priv->thread = kthread_run(mtd_blktrans_thread, tr,
if (ret < 0) { "%sd", tr->name);
if (IS_ERR(tr->blkcore_priv->thread)) {
blk_cleanup_queue(tr->blkcore_priv->rq); blk_cleanup_queue(tr->blkcore_priv->rq);
unregister_blkdev(tr->major, tr->name); unregister_blkdev(tr->major, tr->name);
kfree(tr->blkcore_priv); kfree(tr->blkcore_priv);
mutex_unlock(&mtd_table_mutex); mutex_unlock(&mtd_table_mutex);
return ret; return PTR_ERR(tr->blkcore_priv->thread);
} }
INIT_LIST_HEAD(&tr->devs); INIT_LIST_HEAD(&tr->devs);
...@@ -432,9 +411,7 @@ int deregister_mtd_blktrans(struct mtd_blktrans_ops *tr) ...@@ -432,9 +411,7 @@ int deregister_mtd_blktrans(struct mtd_blktrans_ops *tr)
mutex_lock(&mtd_table_mutex); mutex_lock(&mtd_table_mutex);
/* Clean up the kernel thread */ /* Clean up the kernel thread */
tr->blkcore_priv->exiting = 1; kthread_stop(tr->blkcore_priv->thread);
wake_up(&tr->blkcore_priv->thread_wq);
wait_for_completion(&tr->blkcore_priv->thread_dead);
/* Remove it from the list of active majors */ /* Remove it from the list of active majors */
list_del(&tr->list); list_del(&tr->list);
......
...@@ -553,7 +553,7 @@ static int mtd_ioctl(struct inode *inode, struct file *file, ...@@ -553,7 +553,7 @@ static int mtd_ioctl(struct inode *inode, struct file *file,
ops.datbuf = NULL; ops.datbuf = NULL;
ops.mode = MTD_OOB_PLACE; ops.mode = MTD_OOB_PLACE;
if (ops.ooboffs && ops.len > (mtd->oobsize - ops.ooboffs)) if (ops.ooboffs && ops.ooblen > (mtd->oobsize - ops.ooboffs))
return -EINVAL; return -EINVAL;
ops.oobbuf = kmalloc(buf.length, GFP_KERNEL); ops.oobbuf = kmalloc(buf.length, GFP_KERNEL);
......
# drivers/mtd/nand/Kconfig # drivers/mtd/nand/Kconfig
# $Id: Kconfig,v 1.35 2005/11/07 11:14:30 gleixner Exp $ # $Id: Kconfig,v 1.35 2005/11/07 11:14:30 gleixner Exp $
menu "NAND Flash Device Drivers" menuconfig MTD_NAND
depends on MTD!=n
config MTD_NAND
tristate "NAND Device Support" tristate "NAND Device Support"
depends on MTD depends on MTD
select MTD_NAND_IDS select MTD_NAND_IDS
...@@ -13,9 +10,10 @@ config MTD_NAND ...@@ -13,9 +10,10 @@ config MTD_NAND
devices. For further information see devices. For further information see
<http://www.linux-mtd.infradead.org/doc/nand.html>. <http://www.linux-mtd.infradead.org/doc/nand.html>.
if MTD_NAND
config MTD_NAND_VERIFY_WRITE config MTD_NAND_VERIFY_WRITE
bool "Verify NAND page writes" bool "Verify NAND page writes"
depends on MTD_NAND
help help
This adds an extra check when data is written to the flash. The This adds an extra check when data is written to the flash. The
NAND flash device internally checks only bits transitioning NAND flash device internally checks only bits transitioning
...@@ -25,53 +23,61 @@ config MTD_NAND_VERIFY_WRITE ...@@ -25,53 +23,61 @@ config MTD_NAND_VERIFY_WRITE
config MTD_NAND_ECC_SMC config MTD_NAND_ECC_SMC
bool "NAND ECC Smart Media byte order" bool "NAND ECC Smart Media byte order"
depends on MTD_NAND
default n default n
help help
Software ECC according to the Smart Media Specification. Software ECC according to the Smart Media Specification.
The original Linux implementation had byte 0 and 1 swapped. The original Linux implementation had byte 0 and 1 swapped.
config MTD_NAND_MUSEUM_IDS
bool "Enable chip ids for obsolete ancient NAND devices"
depends on MTD_NAND
default n
help
Enable this option only when your board has first generation
NAND chips (page size 256 byte, erase size 4-8KiB). The IDs
of these chips were reused by later, larger chips.
config MTD_NAND_AUTCPU12 config MTD_NAND_AUTCPU12
tristate "SmartMediaCard on autronix autcpu12 board" tristate "SmartMediaCard on autronix autcpu12 board"
depends on MTD_NAND && ARCH_AUTCPU12 depends on ARCH_AUTCPU12
help help
This enables the driver for the autronix autcpu12 board to This enables the driver for the autronix autcpu12 board to
access the SmartMediaCard. access the SmartMediaCard.
config MTD_NAND_EDB7312 config MTD_NAND_EDB7312
tristate "Support for Cirrus Logic EBD7312 evaluation board" tristate "Support for Cirrus Logic EBD7312 evaluation board"
depends on MTD_NAND && ARCH_EDB7312 depends on ARCH_EDB7312
help help
This enables the driver for the Cirrus Logic EBD7312 evaluation This enables the driver for the Cirrus Logic EBD7312 evaluation
board to access the onboard NAND Flash. board to access the onboard NAND Flash.
config MTD_NAND_H1900 config MTD_NAND_H1900
tristate "iPAQ H1900 flash" tristate "iPAQ H1900 flash"
depends on MTD_NAND && ARCH_PXA && MTD_PARTITIONS depends on ARCH_PXA && MTD_PARTITIONS
help help
This enables the driver for the iPAQ h1900 flash. This enables the driver for the iPAQ h1900 flash.
config MTD_NAND_SPIA config MTD_NAND_SPIA
tristate "NAND Flash device on SPIA board" tristate "NAND Flash device on SPIA board"
depends on ARCH_P720T && MTD_NAND depends on ARCH_P720T
help help
If you had to ask, you don't have one. Say 'N'. If you had to ask, you don't have one. Say 'N'.
config MTD_NAND_AMS_DELTA config MTD_NAND_AMS_DELTA
tristate "NAND Flash device on Amstrad E3" tristate "NAND Flash device on Amstrad E3"
depends on MACH_AMS_DELTA && MTD_NAND depends on MACH_AMS_DELTA
help help
Support for NAND flash on Amstrad E3 (Delta). Support for NAND flash on Amstrad E3 (Delta).
config MTD_NAND_TOTO config MTD_NAND_TOTO
tristate "NAND Flash device on TOTO board" tristate "NAND Flash device on TOTO board"
depends on ARCH_OMAP && MTD_NAND && BROKEN depends on ARCH_OMAP && BROKEN
help help
Support for NAND flash on Texas Instruments Toto platform. Support for NAND flash on Texas Instruments Toto platform.
config MTD_NAND_TS7250 config MTD_NAND_TS7250
tristate "NAND Flash device on TS-7250 board" tristate "NAND Flash device on TS-7250 board"
depends on MACH_TS72XX && MTD_NAND depends on MACH_TS72XX
help help
Support for NAND flash on Technologic Systems TS-7250 platform. Support for NAND flash on Technologic Systems TS-7250 platform.
...@@ -80,14 +86,14 @@ config MTD_NAND_IDS ...@@ -80,14 +86,14 @@ config MTD_NAND_IDS
config MTD_NAND_AU1550 config MTD_NAND_AU1550
tristate "Au1550/1200 NAND support" tristate "Au1550/1200 NAND support"
depends on (SOC_AU1200 || SOC_AU1550) && MTD_NAND depends on SOC_AU1200 || SOC_AU1550
help help
This enables the driver for the NAND flash controller on the This enables the driver for the NAND flash controller on the
AMD/Alchemy 1550 SOC. AMD/Alchemy 1550 SOC.
config MTD_NAND_RTC_FROM4 config MTD_NAND_RTC_FROM4
tristate "Renesas Flash ROM 4-slot interface board (FROM_BOARD4)" tristate "Renesas Flash ROM 4-slot interface board (FROM_BOARD4)"
depends on MTD_NAND && SH_SOLUTION_ENGINE depends on SH_SOLUTION_ENGINE
select REED_SOLOMON select REED_SOLOMON
select REED_SOLOMON_DEC8 select REED_SOLOMON_DEC8
select BITREVERSE select BITREVERSE
...@@ -97,13 +103,13 @@ config MTD_NAND_RTC_FROM4 ...@@ -97,13 +103,13 @@ config MTD_NAND_RTC_FROM4
config MTD_NAND_PPCHAMELEONEVB config MTD_NAND_PPCHAMELEONEVB
tristate "NAND Flash device on PPChameleonEVB board" tristate "NAND Flash device on PPChameleonEVB board"
depends on PPCHAMELEONEVB && MTD_NAND && BROKEN depends on PPCHAMELEONEVB && BROKEN
help help
This enables the NAND flash driver on the PPChameleon EVB Board. This enables the NAND flash driver on the PPChameleon EVB Board.
config MTD_NAND_S3C2410 config MTD_NAND_S3C2410
tristate "NAND Flash support for S3C2410/S3C2440 SoC" tristate "NAND Flash support for S3C2410/S3C2440 SoC"
depends on ARCH_S3C2410 && MTD_NAND depends on ARCH_S3C2410
help help
This enables the NAND flash controller on the S3C2410 and S3C2440 This enables the NAND flash controller on the S3C2410 and S3C2440
SoCs SoCs
...@@ -128,7 +134,7 @@ config MTD_NAND_S3C2410_HWECC ...@@ -128,7 +134,7 @@ config MTD_NAND_S3C2410_HWECC
config MTD_NAND_NDFC config MTD_NAND_NDFC
tristate "NDFC NanD Flash Controller" tristate "NDFC NanD Flash Controller"
depends on MTD_NAND && 44x depends on 44x
select MTD_NAND_ECC_SMC select MTD_NAND_ECC_SMC
help help
NDFC Nand Flash Controllers are integrated in EP44x SoCs NDFC Nand Flash Controllers are integrated in EP44x SoCs
...@@ -145,7 +151,7 @@ config MTD_NAND_S3C2410_CLKSTOP ...@@ -145,7 +151,7 @@ config MTD_NAND_S3C2410_CLKSTOP
config MTD_NAND_DISKONCHIP config MTD_NAND_DISKONCHIP
tristate "DiskOnChip 2000, Millennium and Millennium Plus (NAND reimplementation) (EXPERIMENTAL)" tristate "DiskOnChip 2000, Millennium and Millennium Plus (NAND reimplementation) (EXPERIMENTAL)"
depends on MTD_NAND && EXPERIMENTAL depends on EXPERIMENTAL
select REED_SOLOMON select REED_SOLOMON
select REED_SOLOMON_DEC16 select REED_SOLOMON_DEC16
help help
...@@ -215,11 +221,11 @@ config MTD_NAND_DISKONCHIP_BBTWRITE ...@@ -215,11 +221,11 @@ config MTD_NAND_DISKONCHIP_BBTWRITE
config MTD_NAND_SHARPSL config MTD_NAND_SHARPSL
tristate "Support for NAND Flash on Sharp SL Series (C7xx + others)" tristate "Support for NAND Flash on Sharp SL Series (C7xx + others)"
depends on MTD_NAND && ARCH_PXA depends on ARCH_PXA
config MTD_NAND_BASLER_EXCITE config MTD_NAND_BASLER_EXCITE
tristate "Support for NAND Flash on Basler eXcite" tristate "Support for NAND Flash on Basler eXcite"
depends on MTD_NAND && BASLER_EXCITE depends on BASLER_EXCITE
help help
This enables the driver for the NAND flash device found on the This enables the driver for the NAND flash device found on the
Basler eXcite Smart Camera. If built as a module, the driver Basler eXcite Smart Camera. If built as a module, the driver
...@@ -227,14 +233,14 @@ config MTD_NAND_BASLER_EXCITE ...@@ -227,14 +233,14 @@ config MTD_NAND_BASLER_EXCITE
config MTD_NAND_CAFE config MTD_NAND_CAFE
tristate "NAND support for OLPC CAFÉ chip" tristate "NAND support for OLPC CAFÉ chip"
depends on MTD_NAND && PCI depends on PCI
help help
Use NAND flash attached to the CAFÉ chip designed for the $100 Use NAND flash attached to the CAFÉ chip designed for the $100
laptop. laptop.
config MTD_NAND_CS553X config MTD_NAND_CS553X
tristate "NAND support for CS5535/CS5536 (AMD Geode companion chip)" tristate "NAND support for CS5535/CS5536 (AMD Geode companion chip)"
depends on MTD_NAND && X86_32 && (X86_PC || X86_GENERICARCH) depends on X86_32 && (X86_PC || X86_GENERICARCH)
help help
The CS553x companion chips for the AMD Geode processor The CS553x companion chips for the AMD Geode processor
include NAND flash controllers with built-in hardware ECC include NAND flash controllers with built-in hardware ECC
...@@ -247,16 +253,21 @@ config MTD_NAND_CS553X ...@@ -247,16 +253,21 @@ config MTD_NAND_CS553X
config MTD_NAND_AT91 config MTD_NAND_AT91
bool "Support for NAND Flash / SmartMedia on AT91" bool "Support for NAND Flash / SmartMedia on AT91"
depends on MTD_NAND && ARCH_AT91 depends on ARCH_AT91
help help
Enables support for NAND Flash / Smart Media Card interface Enables support for NAND Flash / Smart Media Card interface
on Atmel AT91 processors. on Atmel AT91 processors.
config MTD_NAND_CM_X270
tristate "Support for NAND Flash on CM-X270 modules"
depends on MTD_NAND && MACH_ARMCORE
config MTD_NAND_NANDSIM config MTD_NAND_NANDSIM
tristate "Support for NAND Flash Simulator" tristate "Support for NAND Flash Simulator"
depends on MTD_NAND && MTD_PARTITIONS depends on MTD_PARTITIONS
help help
The simulator may simulate various NAND flash chips for the The simulator may simulate various NAND flash chips for the
MTD nand layer. MTD nand layer.
endmenu endif # MTD_NAND
...@@ -24,6 +24,7 @@ obj-$(CONFIG_MTD_NAND_NANDSIM) += nandsim.o ...@@ -24,6 +24,7 @@ obj-$(CONFIG_MTD_NAND_NANDSIM) += nandsim.o
obj-$(CONFIG_MTD_NAND_CS553X) += cs553x_nand.o obj-$(CONFIG_MTD_NAND_CS553X) += cs553x_nand.o
obj-$(CONFIG_MTD_NAND_NDFC) += ndfc.o obj-$(CONFIG_MTD_NAND_NDFC) += ndfc.o
obj-$(CONFIG_MTD_NAND_AT91) += at91_nand.o obj-$(CONFIG_MTD_NAND_AT91) += at91_nand.o
obj-$(CONFIG_MTD_NAND_CM_X270) += cmx270_nand.o
obj-$(CONFIG_MTD_NAND_BASLER_EXCITE) += excite_nandflash.o obj-$(CONFIG_MTD_NAND_BASLER_EXCITE) += excite_nandflash.o
nand-objs := nand_base.o nand_bbt.o nand-objs := nand_base.o nand_bbt.o
......
...@@ -530,7 +530,6 @@ static int __devinit cafe_nand_probe(struct pci_dev *pdev, ...@@ -530,7 +530,6 @@ static int __devinit cafe_nand_probe(struct pci_dev *pdev,
{ {
struct mtd_info *mtd; struct mtd_info *mtd;
struct cafe_priv *cafe; struct cafe_priv *cafe;
uint32_t timing1, timing2, timing3;
uint32_t ctrl; uint32_t ctrl;
int err = 0; int err = 0;
...@@ -587,21 +586,19 @@ static int __devinit cafe_nand_probe(struct pci_dev *pdev, ...@@ -587,21 +586,19 @@ static int __devinit cafe_nand_probe(struct pci_dev *pdev,
} }
if (numtimings == 3) { if (numtimings == 3) {
timing1 = timing[0];
timing2 = timing[1];
timing3 = timing[2];
cafe_dev_dbg(&cafe->pdev->dev, "Using provided timings (%08x %08x %08x)\n", cafe_dev_dbg(&cafe->pdev->dev, "Using provided timings (%08x %08x %08x)\n",
timing1, timing2, timing3); timing[0], timing[1], timing[2]);
} else { } else {
timing1 = cafe_readl(cafe, NAND_TIMING1); timing[0] = cafe_readl(cafe, NAND_TIMING1);
timing2 = cafe_readl(cafe, NAND_TIMING2); timing[1] = cafe_readl(cafe, NAND_TIMING2);
timing3 = cafe_readl(cafe, NAND_TIMING3); timing[2] = cafe_readl(cafe, NAND_TIMING3);
if (timing1 | timing2 | timing3) { if (timing[0] | timing[1] | timing[2]) {
cafe_dev_dbg(&cafe->pdev->dev, "Timing registers already set (%08x %08x %08x)\n", timing1, timing2, timing3); cafe_dev_dbg(&cafe->pdev->dev, "Timing registers already set (%08x %08x %08x)\n",
timing[0], timing[1], timing[2]);
} else { } else {
dev_warn(&cafe->pdev->dev, "Timing registers unset; using most conservative defaults\n"); dev_warn(&cafe->pdev->dev, "Timing registers unset; using most conservative defaults\n");
timing1 = timing2 = timing3 = 0xffffffff; timing[0] = timing[1] = timing[2] = 0xffffffff;
} }
} }
...@@ -609,9 +606,9 @@ static int __devinit cafe_nand_probe(struct pci_dev *pdev, ...@@ -609,9 +606,9 @@ static int __devinit cafe_nand_probe(struct pci_dev *pdev,
cafe_writel(cafe, 1, NAND_RESET); cafe_writel(cafe, 1, NAND_RESET);
cafe_writel(cafe, 0, NAND_RESET); cafe_writel(cafe, 0, NAND_RESET);
cafe_writel(cafe, timing1, NAND_TIMING1); cafe_writel(cafe, timing[0], NAND_TIMING1);
cafe_writel(cafe, timing2, NAND_TIMING2); cafe_writel(cafe, timing[1], NAND_TIMING2);
cafe_writel(cafe, timing3, NAND_TIMING3); cafe_writel(cafe, timing[2], NAND_TIMING3);
cafe_writel(cafe, 0xffffffff, NAND_IRQ_MASK); cafe_writel(cafe, 0xffffffff, NAND_IRQ_MASK);
err = request_irq(pdev->irq, &cafe_nand_interrupt, IRQF_SHARED, err = request_irq(pdev->irq, &cafe_nand_interrupt, IRQF_SHARED,
......
/*
* linux/drivers/mtd/nand/cmx270-nand.c
*
* Copyright (C) 2006 Compulab, Ltd.
* Mike Rapoport <mike@compulab.co.il>
*
* Derived from drivers/mtd/nand/h1910.c
* Copyright (C) 2002 Marius Gröger (mag@sysgo.de)
* Copyright (c) 2001 Thomas Gleixner (gleixner@autronix.de)
*
*
* This program is free software; you can redistribute it and/or modify
* it under the terms of the GNU General Public License version 2 as
* published by the Free Software Foundation.
*
* Overview:
* This is a device driver for the NAND flash device found on the
* CM-X270 board.
*/
#include <linux/mtd/nand.h>
#include <linux/mtd/partitions.h>
#include <asm/io.h>
#include <asm/irq.h>
#include <asm/arch/hardware.h>
#include <asm/arch/pxa-regs.h>
#define GPIO_NAND_CS (11)
#define GPIO_NAND_RB (89)
/* This macro needed to ensure in-order operation of GPIO and local
* bus. Without both asm command and dummy uncached read there're
* states when NAND access is broken. I've looked for such macro(s) in
* include/asm-arm but found nothing approptiate.
* dmac_clean_range is close, but is makes cache invalidation
* unnecessary here and it cannot be used in module
*/
#define DRAIN_WB() \
do { \
unsigned char dummy; \
asm volatile ("mcr p15, 0, r0, c7, c10, 4":::"r0"); \
dummy=*((unsigned char*)UNCACHED_ADDR); \
} while(0)
/* MTD structure for CM-X270 board */
static struct mtd_info *cmx270_nand_mtd;
/* remaped IO address of the device */
static void __iomem *cmx270_nand_io;
/*
* Define static partitions for flash device
*/
static struct mtd_partition partition_info[] = {
[0] = {
.name = "cmx270-0",
.offset = 0,
.size = MTDPART_SIZ_FULL
}
};
#define NUM_PARTITIONS (ARRAY_SIZE(partition_info))
const char *part_probes[] = { "cmdlinepart", NULL };
static u_char cmx270_read_byte(struct mtd_info *mtd)
{
struct nand_chip *this = mtd->priv;
return (readl(this->IO_ADDR_R) >> 16);
}
static void cmx270_write_buf(struct mtd_info *mtd, const u_char *buf, int len)
{
int i;
struct nand_chip *this = mtd->priv;
for (i=0; i<len; i++)
writel((*buf++ << 16), this->IO_ADDR_W);
}
static void cmx270_read_buf(struct mtd_info *mtd, u_char *buf, int len)
{
int i;
struct nand_chip *this = mtd->priv;
for (i=0; i<len; i++)
*buf++ = readl(this->IO_ADDR_R) >> 16;
}
static int cmx270_verify_buf(struct mtd_info *mtd, const u_char *buf, int len)
{
int i;
struct nand_chip *this = mtd->priv;
for (i=0; i<len; i++)
if (buf[i] != (u_char)(readl(this->IO_ADDR_R) >> 16))
return -EFAULT;
return 0;
}
static inline void nand_cs_on(void)
{
GPCR(GPIO_NAND_CS) = GPIO_bit(GPIO_NAND_CS);
}
static void nand_cs_off(void)
{
DRAIN_WB();
GPSR(GPIO_NAND_CS) = GPIO_bit(GPIO_NAND_CS);
}
/*
* hardware specific access to control-lines
*/
static void cmx270_hwcontrol(struct mtd_info *mtd, int dat,
unsigned int ctrl)
{
struct nand_chip* this = mtd->priv;
unsigned int nandaddr = (unsigned int)this->IO_ADDR_W;
DRAIN_WB();
if (ctrl & NAND_CTRL_CHANGE) {
if ( ctrl & NAND_ALE )
nandaddr |= (1 << 3);
else
nandaddr &= ~(1 << 3);
if ( ctrl & NAND_CLE )
nandaddr |= (1 << 2);
else
nandaddr &= ~(1 << 2);
if ( ctrl & NAND_NCE )
nand_cs_on();
else
nand_cs_off();
}
DRAIN_WB();
this->IO_ADDR_W = (void __iomem*)nandaddr;
if (dat != NAND_CMD_NONE)
writel((dat << 16), this->IO_ADDR_W);
DRAIN_WB();
}
/*
* read device ready pin
*/
static int cmx270_device_ready(struct mtd_info *mtd)
{
DRAIN_WB();
return (GPLR(GPIO_NAND_RB) & GPIO_bit(GPIO_NAND_RB));
}
/*
* Main initialization routine
*/
static int cmx270_init(void)
{
struct nand_chip *this;
const char *part_type;
struct mtd_partition *mtd_parts;
int mtd_parts_nb = 0;
int ret;
/* Allocate memory for MTD device structure and private data */
cmx270_nand_mtd = kzalloc(sizeof(struct mtd_info) +
sizeof(struct nand_chip),
GFP_KERNEL);
if (!cmx270_nand_mtd) {
printk("Unable to allocate CM-X270 NAND MTD device structure.\n");
return -ENOMEM;
}
cmx270_nand_io = ioremap(PXA_CS1_PHYS, 12);
if (!cmx270_nand_io) {
printk("Unable to ioremap NAND device\n");
ret = -EINVAL;
goto err1;
}
/* Get pointer to private data */
this = (struct nand_chip *)(&cmx270_nand_mtd[1]);
/* Link the private data with the MTD structure */
cmx270_nand_mtd->owner = THIS_MODULE;
cmx270_nand_mtd->priv = this;
/* insert callbacks */
this->IO_ADDR_R = cmx270_nand_io;
this->IO_ADDR_W = cmx270_nand_io;
this->cmd_ctrl = cmx270_hwcontrol;
this->dev_ready = cmx270_device_ready;
/* 15 us command delay time */
this->chip_delay = 20;
this->ecc.mode = NAND_ECC_SOFT;
/* read/write functions */
this->read_byte = cmx270_read_byte;
this->read_buf = cmx270_read_buf;
this->write_buf = cmx270_write_buf;
this->verify_buf = cmx270_verify_buf;
/* Scan to find existence of the device */
if (nand_scan (cmx270_nand_mtd, 1)) {
printk(KERN_NOTICE "No NAND device\n");
ret = -ENXIO;
goto err2;
}
#ifdef CONFIG_MTD_CMDLINE_PARTS
mtd_parts_nb = parse_mtd_partitions(cmx270_nand_mtd, part_probes,
&mtd_parts, 0);
if (mtd_parts_nb > 0)
part_type = "command line";
else
mtd_parts_nb = 0;
#endif
if (!mtd_parts_nb) {
mtd_parts = partition_info;
mtd_parts_nb = NUM_PARTITIONS;
part_type = "static";
}
/* Register the partitions */
printk(KERN_NOTICE "Using %s partition definition\n", part_type);
ret = add_mtd_partitions(cmx270_nand_mtd, mtd_parts, mtd_parts_nb);
if (ret)
goto err2;
/* Return happy */
return 0;
err2:
iounmap(cmx270_nand_io);
err1:
kfree(cmx270_nand_mtd);
return ret;
}
module_init(cmx270_init);
/*
* Clean up routine
*/
static void cmx270_cleanup(void)
{
/* Release resources, unregister device */
nand_release(cmx270_nand_mtd);
iounmap(cmx270_nand_io);
/* Free the MTD device structure */
kfree (cmx270_nand_mtd);
}
module_exit(cmx270_cleanup);
MODULE_LICENSE("GPL");
MODULE_AUTHOR("Mike Rapoport <mike@compulab.co.il>");
MODULE_DESCRIPTION("NAND flash driver for Compulab CM-X270 Module");
...@@ -312,7 +312,7 @@ static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip) ...@@ -312,7 +312,7 @@ static int nand_block_bad(struct mtd_info *mtd, loff_t ofs, int getchip)
/* Select the NAND device */ /* Select the NAND device */
chip->select_chip(mtd, chipnr); chip->select_chip(mtd, chipnr);
} else } else
page = (int)ofs; page = (int)(ofs >> chip->page_shift);
if (chip->options & NAND_BUSWIDTH_16) { if (chip->options & NAND_BUSWIDTH_16) {
chip->cmdfunc(mtd, NAND_CMD_READOOB, chip->badblockpos & 0xFE, chip->cmdfunc(mtd, NAND_CMD_READOOB, chip->badblockpos & 0xFE,
...@@ -350,7 +350,7 @@ static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs) ...@@ -350,7 +350,7 @@ static int nand_default_block_markbad(struct mtd_info *mtd, loff_t ofs)
int block, ret; int block, ret;
/* Get block number */ /* Get block number */
block = ((int)ofs) >> chip->bbt_erase_shift; block = (int)(ofs >> chip->bbt_erase_shift);
if (chip->bbt) if (chip->bbt)
chip->bbt[block >> 2] |= 0x01 << ((block & 0x03) << 1); chip->bbt[block >> 2] |= 0x01 << ((block & 0x03) << 1);
...@@ -771,7 +771,7 @@ static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip, ...@@ -771,7 +771,7 @@ static int nand_read_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
uint8_t *ecc_code = chip->buffers->ecccode; uint8_t *ecc_code = chip->buffers->ecccode;
int *eccpos = chip->ecc.layout->eccpos; int *eccpos = chip->ecc.layout->eccpos;
nand_read_page_raw(mtd, chip, buf); chip->ecc.read_page_raw(mtd, chip, buf);
for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize) for (i = 0; eccsteps; eccsteps--, i += eccbytes, p += eccsize)
chip->ecc.calculate(mtd, p, &ecc_calc[i]); chip->ecc.calculate(mtd, p, &ecc_calc[i]);
...@@ -1426,7 +1426,7 @@ static void nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip, ...@@ -1426,7 +1426,7 @@ static void nand_write_page_swecc(struct mtd_info *mtd, struct nand_chip *chip,
for (i = 0; i < chip->ecc.total; i++) for (i = 0; i < chip->ecc.total; i++)
chip->oob_poi[eccpos[i]] = ecc_calc[i]; chip->oob_poi[eccpos[i]] = ecc_calc[i];
nand_write_page_raw(mtd, chip, buf); chip->ecc.write_page_raw(mtd, chip, buf);
} }
/** /**
......
...@@ -24,6 +24,8 @@ ...@@ -24,6 +24,8 @@
* 512 512 Byte page size * 512 512 Byte page size
*/ */
struct nand_flash_dev nand_flash_ids[] = { struct nand_flash_dev nand_flash_ids[] = {
#ifdef CONFIG_MTD_NAND_MUSEUM_IDS
{"NAND 1MiB 5V 8-bit", 0x6e, 256, 1, 0x1000, 0}, {"NAND 1MiB 5V 8-bit", 0x6e, 256, 1, 0x1000, 0},
{"NAND 2MiB 5V 8-bit", 0x64, 256, 2, 0x1000, 0}, {"NAND 2MiB 5V 8-bit", 0x64, 256, 2, 0x1000, 0},
{"NAND 4MiB 5V 8-bit", 0x6b, 512, 4, 0x2000, 0}, {"NAND 4MiB 5V 8-bit", 0x6b, 512, 4, 0x2000, 0},
...@@ -39,6 +41,7 @@ struct nand_flash_dev nand_flash_ids[] = { ...@@ -39,6 +41,7 @@ struct nand_flash_dev nand_flash_ids[] = {
{"NAND 8MiB 3,3V 8-bit", 0xe6, 512, 8, 0x2000, 0}, {"NAND 8MiB 3,3V 8-bit", 0xe6, 512, 8, 0x2000, 0},
{"NAND 8MiB 1,8V 16-bit", 0x49, 512, 8, 0x2000, NAND_BUSWIDTH_16}, {"NAND 8MiB 1,8V 16-bit", 0x49, 512, 8, 0x2000, NAND_BUSWIDTH_16},
{"NAND 8MiB 3,3V 16-bit", 0x59, 512, 8, 0x2000, NAND_BUSWIDTH_16}, {"NAND 8MiB 3,3V 16-bit", 0x59, 512, 8, 0x2000, NAND_BUSWIDTH_16},
#endif
{"NAND 16MiB 1,8V 8-bit", 0x33, 512, 16, 0x4000, 0}, {"NAND 16MiB 1,8V 8-bit", 0x33, 512, 16, 0x4000, 0},
{"NAND 16MiB 3,3V 8-bit", 0x73, 512, 16, 0x4000, 0}, {"NAND 16MiB 3,3V 8-bit", 0x73, 512, 16, 0x4000, 0},
...@@ -137,6 +140,7 @@ struct nand_manufacturers nand_manuf_ids[] = { ...@@ -137,6 +140,7 @@ struct nand_manufacturers nand_manuf_ids[] = {
{NAND_MFR_RENESAS, "Renesas"}, {NAND_MFR_RENESAS, "Renesas"},
{NAND_MFR_STMICRO, "ST Micro"}, {NAND_MFR_STMICRO, "ST Micro"},
{NAND_MFR_HYNIX, "Hynix"}, {NAND_MFR_HYNIX, "Hynix"},
{NAND_MFR_MICRON, "Micron"},
{0x0, "Unknown"} {0x0, "Unknown"}
}; };
......
This diff is collapsed.
...@@ -2,20 +2,18 @@ ...@@ -2,20 +2,18 @@
# linux/drivers/mtd/onenand/Kconfig # linux/drivers/mtd/onenand/Kconfig
# #
menu "OneNAND Flash Device Drivers" menuconfig MTD_ONENAND
depends on MTD != n
config MTD_ONENAND
tristate "OneNAND Device Support" tristate "OneNAND Device Support"
depends on MTD depends on MTD
help help
This enables support for accessing all type of OneNAND flash This enables support for accessing all type of OneNAND flash
devices. For further information see devices. For further information see
<http://www.samsung.com/Products/Semiconductor/Flash/OneNAND_TM/index.htm>. <http://www.samsung.com/Products/Semiconductor/OneNAND/index.htm>
if MTD_ONENAND
config MTD_ONENAND_VERIFY_WRITE config MTD_ONENAND_VERIFY_WRITE
bool "Verify OneNAND page writes" bool "Verify OneNAND page writes"
depends on MTD_ONENAND
help help
This adds an extra check when data is written to the flash. The This adds an extra check when data is written to the flash. The
OneNAND flash device internally checks only bits transitioning OneNAND flash device internally checks only bits transitioning
...@@ -25,13 +23,12 @@ config MTD_ONENAND_VERIFY_WRITE ...@@ -25,13 +23,12 @@ config MTD_ONENAND_VERIFY_WRITE
config MTD_ONENAND_GENERIC config MTD_ONENAND_GENERIC
tristate "OneNAND Flash device via platform device driver" tristate "OneNAND Flash device via platform device driver"
depends on MTD_ONENAND && ARM depends on ARM
help help
Support for OneNAND flash via platform device driver. Support for OneNAND flash via platform device driver.
config MTD_ONENAND_OTP config MTD_ONENAND_OTP
bool "OneNAND OTP Support" bool "OneNAND OTP Support"
depends on MTD_ONENAND
help help
One Block of the NAND Flash Array memory is reserved as One Block of the NAND Flash Array memory is reserved as
a One-Time Programmable Block memory area. a One-Time Programmable Block memory area.
...@@ -43,4 +40,4 @@ config MTD_ONENAND_OTP ...@@ -43,4 +40,4 @@ config MTD_ONENAND_OTP
OTP block is fully-guaranteed to be a valid block. OTP block is fully-guaranteed to be a valid block.
endmenu endif # MTD_ONENAND
...@@ -836,9 +836,11 @@ static int onenand_transfer_auto_oob(struct mtd_info *mtd, uint8_t *buf, int col ...@@ -836,9 +836,11 @@ static int onenand_transfer_auto_oob(struct mtd_info *mtd, uint8_t *buf, int col
int readcol = column; int readcol = column;
int readend = column + thislen; int readend = column + thislen;
int lastgap = 0; int lastgap = 0;
unsigned int i;
uint8_t *oob_buf = this->oob_buf; uint8_t *oob_buf = this->oob_buf;
for (free = this->ecclayout->oobfree; free->length; ++free) { free = this->ecclayout->oobfree;
for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
if (readcol >= lastgap) if (readcol >= lastgap)
readcol += free->offset - lastgap; readcol += free->offset - lastgap;
if (readend >= lastgap) if (readend >= lastgap)
...@@ -846,7 +848,8 @@ static int onenand_transfer_auto_oob(struct mtd_info *mtd, uint8_t *buf, int col ...@@ -846,7 +848,8 @@ static int onenand_transfer_auto_oob(struct mtd_info *mtd, uint8_t *buf, int col
lastgap = free->offset + free->length; lastgap = free->offset + free->length;
} }
this->read_bufferram(mtd, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize); this->read_bufferram(mtd, ONENAND_SPARERAM, oob_buf, 0, mtd->oobsize);
for (free = this->ecclayout->oobfree; free->length; ++free) { free = this->ecclayout->oobfree;
for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
int free_end = free->offset + free->length; int free_end = free->offset + free->length;
if (free->offset < readend && free_end > readcol) { if (free->offset < readend && free_end > readcol) {
int st = max_t(int,free->offset,readcol); int st = max_t(int,free->offset,readcol);
...@@ -854,7 +857,7 @@ static int onenand_transfer_auto_oob(struct mtd_info *mtd, uint8_t *buf, int col ...@@ -854,7 +857,7 @@ static int onenand_transfer_auto_oob(struct mtd_info *mtd, uint8_t *buf, int col
int n = ed - st; int n = ed - st;
memcpy(buf, oob_buf + st, n); memcpy(buf, oob_buf + st, n);
buf += n; buf += n;
} else } else if (column == 0)
break; break;
} }
return 0; return 0;
...@@ -1280,15 +1283,18 @@ static int onenand_fill_auto_oob(struct mtd_info *mtd, u_char *oob_buf, ...@@ -1280,15 +1283,18 @@ static int onenand_fill_auto_oob(struct mtd_info *mtd, u_char *oob_buf,
int writecol = column; int writecol = column;
int writeend = column + thislen; int writeend = column + thislen;
int lastgap = 0; int lastgap = 0;
unsigned int i;
for (free = this->ecclayout->oobfree; free->length; ++free) { free = this->ecclayout->oobfree;
for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
if (writecol >= lastgap) if (writecol >= lastgap)
writecol += free->offset - lastgap; writecol += free->offset - lastgap;
if (writeend >= lastgap) if (writeend >= lastgap)
writeend += free->offset - lastgap; writeend += free->offset - lastgap;
lastgap = free->offset + free->length; lastgap = free->offset + free->length;
} }
for (free = this->ecclayout->oobfree; free->length; ++free) { free = this->ecclayout->oobfree;
for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES && free->length; i++, free++) {
int free_end = free->offset + free->length; int free_end = free->offset + free->length;
if (free->offset < writeend && free_end > writecol) { if (free->offset < writeend && free_end > writecol) {
int st = max_t(int,free->offset,writecol); int st = max_t(int,free->offset,writecol);
...@@ -1296,7 +1302,7 @@ static int onenand_fill_auto_oob(struct mtd_info *mtd, u_char *oob_buf, ...@@ -1296,7 +1302,7 @@ static int onenand_fill_auto_oob(struct mtd_info *mtd, u_char *oob_buf,
int n = ed - st; int n = ed - st;
memcpy(oob_buf + st, buf, n); memcpy(oob_buf + st, buf, n);
buf += n; buf += n;
} else } else if (column == 0)
break; break;
} }
return 0; return 0;
...@@ -2386,7 +2392,8 @@ int onenand_scan(struct mtd_info *mtd, int maxchips) ...@@ -2386,7 +2392,8 @@ int onenand_scan(struct mtd_info *mtd, int maxchips)
* the out of band area * the out of band area
*/ */
this->ecclayout->oobavail = 0; this->ecclayout->oobavail = 0;
for (i = 0; this->ecclayout->oobfree[i].length; i++) for (i = 0; i < MTD_MAX_OOBFREE_ENTRIES &&
this->ecclayout->oobfree[i].length; i++)
this->ecclayout->oobavail += this->ecclayout->oobavail +=
this->ecclayout->oobfree[i].length; this->ecclayout->oobfree[i].length;
mtd->oobavail = this->ecclayout->oobavail; mtd->oobavail = this->ecclayout->oobavail;
......
The files in this directory and elsewhere which refer to this LICENCE The files in this directory and elsewhere which refer to this LICENCE
file are part of JFFS2, the Journalling Flash File System v2. file are part of JFFS2, the Journalling Flash File System v2.
Copyright (C) 2001, 2002 Red Hat, Inc. Copyright © 2001-2007 Red Hat, Inc. and others
JFFS2 is free software; you can redistribute it and/or modify it under JFFS2 is free software; you can redistribute it and/or modify it under
the terms of the GNU General Public License as published by the Free the terms of the GNU General Public License as published by the Free
...@@ -28,8 +28,3 @@ of the GNU General Public License. ...@@ -28,8 +28,3 @@ of the GNU General Public License.
This exception does not invalidate any other reasons why a work based on This exception does not invalidate any other reasons why a work based on
this file might be covered by the GNU General Public License. this file might be covered by the GNU General Public License.
For information on obtaining alternative licences for JFFS2, see
http://sources.redhat.com/jffs2/jffs2-licence.html
$Id: LICENCE,v 1.1 2002/05/20 14:56:37 dwmw2 Exp $
# #
# Makefile for the Linux Journalling Flash File System v2 (JFFS2) # Makefile for the Linux Journalling Flash File System v2 (JFFS2)
# #
# $Id: Makefile.common,v 1.11 2005/09/07 08:34:53 havasi Exp $
# #
obj-$(CONFIG_JFFS2_FS) += jffs2.o obj-$(CONFIG_JFFS2_FS) += jffs2.o
......
$Id: README.Locking,v 1.12 2005/04/13 13:22:35 dwmw2 Exp $
JFFS2 LOCKING DOCUMENTATION JFFS2 LOCKING DOCUMENTATION
--------------------------- ---------------------------
......
$Id: TODO,v 1.18 2005/09/22 11:24:56 dedekind Exp $
- support asynchronous operation -- add a per-fs 'reserved_space' count, - support asynchronous operation -- add a per-fs 'reserved_space' count,
let each outstanding write reserve the _maximum_ amount of physical let each outstanding write reserve the _maximum_ amount of physical
...@@ -30,8 +29,6 @@ $Id: TODO,v 1.18 2005/09/22 11:24:56 dedekind Exp $ ...@@ -30,8 +29,6 @@ $Id: TODO,v 1.18 2005/09/22 11:24:56 dedekind Exp $
the full dirent, we only need to go to the flash in lookup() when we think we've the full dirent, we only need to go to the flash in lookup() when we think we've
got a match, and in readdir(). got a match, and in readdir().
- Doubly-linked next_in_ino list to allow us to free obsoleted raw_node_refs immediately? - Doubly-linked next_in_ino list to allow us to free obsoleted raw_node_refs immediately?
- Remove totlen from jffs2_raw_node_ref? Need to have totlen passed into
jffs2_mark_node_obsolete(). Can all callers work it out?
- Remove size from jffs2_raw_node_frag. - Remove size from jffs2_raw_node_frag.
dedekind: dedekind:
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2006 NEC Corporation * Copyright © 2006 NEC Corporation
* *
* Created by KaiGai Kohei <kaigai@ak.jp.nec.com> * Created by KaiGai Kohei <kaigai@ak.jp.nec.com>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/fs.h> #include <linux/fs.h>
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2006 NEC Corporation * Copyright © 2006 NEC Corporation
* *
* Created by KaiGai Kohei <kaigai@ak.jp.nec.com> * Created by KaiGai Kohei <kaigai@ak.jp.nec.com>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
*/ */
struct jffs2_acl_entry { struct jffs2_acl_entry {
jint16_t e_tag; jint16_t e_tag;
jint16_t e_perm; jint16_t e_perm;
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001-2003 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* *
* Created by David Woodhouse <dwmw2@infradead.org> * Created by David Woodhouse <dwmw2@infradead.org>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: background.c,v 1.54 2005/05/20 21:37:12 gleixner Exp $
*
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001-2003 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* *
* Created by David Woodhouse <dwmw2@infradead.org> * Created by David Woodhouse <dwmw2@infradead.org>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: build.c,v 1.85 2005/11/07 11:14:38 gleixner Exp $
*
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001-2003 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* Created by Arjan van de Ven <arjanv@redhat.com> * Created by Arjan van de Ven <arjanv@redhat.com>
* *
* Copyright (C) 2004 Ferenc Havasi <havasi@inf.u-szeged.hu>, * Copyright © 2004 Ferenc Havasi <havasi@inf.u-szeged.hu>,
* University of Szeged, Hungary * University of Szeged, Hungary
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: compr.c,v 1.46 2005/11/07 11:14:38 gleixner Exp $
*
*/ */
#include "compr.h" #include "compr.h"
...@@ -268,144 +266,6 @@ int jffs2_unregister_compressor(struct jffs2_compressor *comp) ...@@ -268,144 +266,6 @@ int jffs2_unregister_compressor(struct jffs2_compressor *comp)
return 0; return 0;
} }
#ifdef CONFIG_JFFS2_PROC
#define JFFS2_STAT_BUF_SIZE 16000
char *jffs2_list_compressors(void)
{
struct jffs2_compressor *this;
char *buf, *act_buf;
act_buf = buf = kmalloc(JFFS2_STAT_BUF_SIZE,GFP_KERNEL);
list_for_each_entry(this, &jffs2_compressor_list, list) {
act_buf += sprintf(act_buf, "%10s priority:%d ", this->name, this->priority);
if ((this->disabled)||(!this->compress))
act_buf += sprintf(act_buf,"disabled");
else
act_buf += sprintf(act_buf,"enabled");
act_buf += sprintf(act_buf,"\n");
}
return buf;
}
char *jffs2_stats(void)
{
struct jffs2_compressor *this;
char *buf, *act_buf;
act_buf = buf = kmalloc(JFFS2_STAT_BUF_SIZE,GFP_KERNEL);
act_buf += sprintf(act_buf,"JFFS2 compressor statistics:\n");
act_buf += sprintf(act_buf,"%10s ","none");
act_buf += sprintf(act_buf,"compr: %d blocks (%d) decompr: %d blocks\n", none_stat_compr_blocks,
none_stat_compr_size, none_stat_decompr_blocks);
spin_lock(&jffs2_compressor_list_lock);
list_for_each_entry(this, &jffs2_compressor_list, list) {
act_buf += sprintf(act_buf,"%10s ",this->name);
if ((this->disabled)||(!this->compress))
act_buf += sprintf(act_buf,"- ");
else
act_buf += sprintf(act_buf,"+ ");
act_buf += sprintf(act_buf,"compr: %d blocks (%d/%d) decompr: %d blocks ", this->stat_compr_blocks,
this->stat_compr_new_size, this->stat_compr_orig_size,
this->stat_decompr_blocks);
act_buf += sprintf(act_buf,"\n");
}
spin_unlock(&jffs2_compressor_list_lock);
return buf;
}
char *jffs2_get_compression_mode_name(void)
{
switch (jffs2_compression_mode) {
case JFFS2_COMPR_MODE_NONE:
return "none";
case JFFS2_COMPR_MODE_PRIORITY:
return "priority";
case JFFS2_COMPR_MODE_SIZE:
return "size";
}
return "unkown";
}
int jffs2_set_compression_mode_name(const char *name)
{
if (!strcmp("none",name)) {
jffs2_compression_mode = JFFS2_COMPR_MODE_NONE;
return 0;
}
if (!strcmp("priority",name)) {
jffs2_compression_mode = JFFS2_COMPR_MODE_PRIORITY;
return 0;
}
if (!strcmp("size",name)) {
jffs2_compression_mode = JFFS2_COMPR_MODE_SIZE;
return 0;
}
return 1;
}
static int jffs2_compressor_Xable(const char *name, int disabled)
{
struct jffs2_compressor *this;
spin_lock(&jffs2_compressor_list_lock);
list_for_each_entry(this, &jffs2_compressor_list, list) {
if (!strcmp(this->name, name)) {
this->disabled = disabled;
spin_unlock(&jffs2_compressor_list_lock);
return 0;
}
}
spin_unlock(&jffs2_compressor_list_lock);
printk(KERN_WARNING "JFFS2: compressor %s not found.\n",name);
return 1;
}
int jffs2_enable_compressor_name(const char *name)
{
return jffs2_compressor_Xable(name, 0);
}
int jffs2_disable_compressor_name(const char *name)
{
return jffs2_compressor_Xable(name, 1);
}
int jffs2_set_compressor_priority(const char *name, int priority)
{
struct jffs2_compressor *this,*comp;
spin_lock(&jffs2_compressor_list_lock);
list_for_each_entry(this, &jffs2_compressor_list, list) {
if (!strcmp(this->name, name)) {
this->priority = priority;
comp = this;
goto reinsert;
}
}
spin_unlock(&jffs2_compressor_list_lock);
printk(KERN_WARNING "JFFS2: compressor %s not found.\n",name);
return 1;
reinsert:
/* list is sorted in the order of priority, so if
we change it we have to reinsert it into the
good place */
list_del(&comp->list);
list_for_each_entry(this, &jffs2_compressor_list, list) {
if (this->priority < comp->priority) {
list_add(&comp->list, this->list.prev);
spin_unlock(&jffs2_compressor_list_lock);
return 0;
}
}
list_add_tail(&comp->list, &jffs2_compressor_list);
spin_unlock(&jffs2_compressor_list_lock);
return 0;
}
#endif
void jffs2_free_comprbuf(unsigned char *comprbuf, unsigned char *orig) void jffs2_free_comprbuf(unsigned char *comprbuf, unsigned char *orig)
{ {
if (orig != comprbuf) if (orig != comprbuf)
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2004 Ferenc Havasi <havasi@inf.u-szeged.hu>, * Copyright © 2004 Ferenc Havasi <havasi@inf.u-szeged.hu>,
* University of Szeged, Hungary * University of Szeged, Hungary
* *
* For licensing information, see the file 'LICENCE' in the * For licensing information, see the file 'LICENCE' in this directory.
* jffs2 directory.
*
* $Id: compr.h,v 1.9 2005/11/07 11:14:38 gleixner Exp $
* *
*/ */
...@@ -76,16 +73,6 @@ int jffs2_decompress(struct jffs2_sb_info *c, struct jffs2_inode_info *f, ...@@ -76,16 +73,6 @@ int jffs2_decompress(struct jffs2_sb_info *c, struct jffs2_inode_info *f,
void jffs2_free_comprbuf(unsigned char *comprbuf, unsigned char *orig); void jffs2_free_comprbuf(unsigned char *comprbuf, unsigned char *orig);
#ifdef CONFIG_JFFS2_PROC
int jffs2_enable_compressor_name(const char *name);
int jffs2_disable_compressor_name(const char *name);
int jffs2_set_compression_mode_name(const char *mode_name);
char *jffs2_get_compression_mode_name(void);
int jffs2_set_compressor_priority(const char *mode_name, int priority);
char *jffs2_list_compressors(void);
char *jffs2_stats(void);
#endif
/* Compressor modules */ /* Compressor modules */
/* These functions will be called by jffs2_compressors_init/exit */ /* These functions will be called by jffs2_compressors_init/exit */
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001-2003 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* *
* Created by Arjan van de Ven <arjanv@redhat.com> * Created by Arjan van de Ven <arjanv@redhat.com>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: compr_rtime.c,v 1.14 2004/06/23 16:34:40 havasi Exp $
* *
* *
* Very simple lz77-ish encoder. * Very simple lz77-ish encoder.
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001, 2002 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* *
* Created by Arjan van de Ven <arjanv@redhat.com> * Created by Arjan van de Ven <arjanv@redhat.com>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: compr_rubin.c,v 1.20 2004/06/23 16:34:40 havasi Exp $
*
*/ */
#include <linux/string.h> #include <linux/string.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/jffs2.h> #include <linux/jffs2.h>
#include "compr_rubin.h" #include <linux/errno.h>
#include "histo_mips.h"
#include "compr.h" #include "compr.h"
#define RUBIN_REG_SIZE 16
#define UPPER_BIT_RUBIN (((long) 1)<<(RUBIN_REG_SIZE-1))
#define LOWER_BITS_RUBIN ((((long) 1)<<(RUBIN_REG_SIZE-1))-1)
#define BIT_DIVIDER_MIPS 1043
static int bits_mips[8] = { 277,249,290,267,229,341,212,241}; /* mips32 */
#include <linux/errno.h>
struct pushpull {
unsigned char *buf;
unsigned int buflen;
unsigned int ofs;
unsigned int reserve;
};
struct rubin_state {
unsigned long p;
unsigned long q;
unsigned long rec_q;
long bit_number;
struct pushpull pp;
int bit_divider;
int bits[8];
};
static inline void init_pushpull(struct pushpull *pp, char *buf, unsigned buflen, unsigned ofs, unsigned reserve)
{
pp->buf = buf;
pp->buflen = buflen;
pp->ofs = ofs;
pp->reserve = reserve;
}
static inline int pushbit(struct pushpull *pp, int bit, int use_reserved)
{
if (pp->ofs >= pp->buflen - (use_reserved?0:pp->reserve)) {
return -ENOSPC;
}
if (bit) {
pp->buf[pp->ofs >> 3] |= (1<<(7-(pp->ofs &7)));
}
else {
pp->buf[pp->ofs >> 3] &= ~(1<<(7-(pp->ofs &7)));
}
pp->ofs++;
return 0;
}
static inline int pushedbits(struct pushpull *pp)
{
return pp->ofs;
}
static inline int pullbit(struct pushpull *pp)
{
int bit;
bit = (pp->buf[pp->ofs >> 3] >> (7-(pp->ofs & 7))) & 1;
pp->ofs++;
return bit;
}
static inline int pulledbits(struct pushpull *pp)
{
return pp->ofs;
}
static void init_rubin(struct rubin_state *rs, int div, int *bits) static void init_rubin(struct rubin_state *rs, int div, int *bits)
{ {
int c; int c;
......
/* Rubin encoder/decoder header */
/* work started at : aug 3, 1994 */
/* last modification : aug 15, 1994 */
/* $Id: compr_rubin.h,v 1.7 2005/11/07 11:14:38 gleixner Exp $ */
#include "pushpull.h"
#define RUBIN_REG_SIZE 16
#define UPPER_BIT_RUBIN (((long) 1)<<(RUBIN_REG_SIZE-1))
#define LOWER_BITS_RUBIN ((((long) 1)<<(RUBIN_REG_SIZE-1))-1)
struct rubin_state {
unsigned long p;
unsigned long q;
unsigned long rec_q;
long bit_number;
struct pushpull pp;
int bit_divider;
int bits[8];
};
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001-2003 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* *
* Created by David Woodhouse <dwmw2@infradead.org> * Created by David Woodhouse <dwmw2@infradead.org>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: compr_zlib.c,v 1.32 2005/11/07 11:14:38 gleixner Exp $
*
*/ */
#if !defined(__KERNEL__) && !defined(__ECOS) #if !defined(__KERNEL__) && !defined(__ECOS)
......
This diff is collapsed.
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001-2003 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* *
* Created by David Woodhouse <dwmw2@infradead.org> * Created by David Woodhouse <dwmw2@infradead.org>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: debug.c,v 1.12 2005/11/07 11:14:39 gleixner Exp $
*
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/types.h> #include <linux/types.h>
#include <linux/pagemap.h> #include <linux/pagemap.h>
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001-2003 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* *
* Created by David Woodhouse <dwmw2@infradead.org> * Created by David Woodhouse <dwmw2@infradead.org>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: debug.h,v 1.21 2005/11/07 11:14:39 gleixner Exp $
*
*/ */
#ifndef _JFFS2_DEBUG_H_ #ifndef _JFFS2_DEBUG_H_
#define _JFFS2_DEBUG_H_ #define _JFFS2_DEBUG_H_
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001-2003 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* *
* Created by David Woodhouse <dwmw2@infradead.org> * Created by David Woodhouse <dwmw2@infradead.org>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: dir.c,v 1.90 2005/11/07 11:14:39 gleixner Exp $
*
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001-2003 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* *
* Created by David Woodhouse <dwmw2@infradead.org> * Created by David Woodhouse <dwmw2@infradead.org>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: erase.c,v 1.85 2005/09/20 14:53:15 dedekind Exp $
*
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -333,7 +331,7 @@ static int jffs2_block_check_erase(struct jffs2_sb_info *c, struct jffs2_erasebl ...@@ -333,7 +331,7 @@ static int jffs2_block_check_erase(struct jffs2_sb_info *c, struct jffs2_erasebl
*bad_offset = ofs; *bad_offset = ofs;
ret = jffs2_flash_read(c, ofs, readlen, &retlen, ebuf); ret = c->mtd->read(c->mtd, ofs, readlen, &retlen, ebuf);
if (ret) { if (ret) {
printk(KERN_WARNING "Read of newly-erased block at 0x%08x failed: %d. Putting on bad_list\n", ofs, ret); printk(KERN_WARNING "Read of newly-erased block at 0x%08x failed: %d. Putting on bad_list\n", ofs, ret);
goto fail; goto fail;
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001-2003 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* *
* Created by David Woodhouse <dwmw2@infradead.org> * Created by David Woodhouse <dwmw2@infradead.org>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: file.c,v 1.104 2005/10/18 23:29:35 tpoynor Exp $
*
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001-2003 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* *
* Created by David Woodhouse <dwmw2@infradead.org> * Created by David Woodhouse <dwmw2@infradead.org>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: fs.c,v 1.66 2005/09/27 13:17:29 dedekind Exp $
*
*/ */
#include <linux/capability.h> #include <linux/capability.h>
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001-2003 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* *
* Created by David Woodhouse <dwmw2@infradead.org> * Created by David Woodhouse <dwmw2@infradead.org>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: gc.c,v 1.155 2005/11/07 11:14:39 gleixner Exp $
*
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -144,7 +142,8 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c) ...@@ -144,7 +142,8 @@ int jffs2_garbage_collect_pass(struct jffs2_sb_info *c)
c->unchecked_size); c->unchecked_size);
jffs2_dbg_dump_block_lists_nolock(c); jffs2_dbg_dump_block_lists_nolock(c);
spin_unlock(&c->erase_completion_lock); spin_unlock(&c->erase_completion_lock);
BUG(); up(&c->alloc_sem);
return -ENOSPC;
} }
spin_unlock(&c->erase_completion_lock); spin_unlock(&c->erase_completion_lock);
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001-2003 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* *
* Created by David Woodhouse <dwmw2@infradead.org> * Created by David Woodhouse <dwmw2@infradead.org>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: ioctl.c,v 1.10 2005/11/07 11:14:40 gleixner Exp $
*
*/ */
#include <linux/fs.h> #include <linux/fs.h>
......
/* $Id: jffs2_fs_i.h,v 1.19 2005/11/07 11:14:52 gleixner Exp $ */ /*
* JFFS2 -- Journalling Flash File System, Version 2.
*
* Copyright © 2001-2007 Red Hat, Inc.
*
* Created by David Woodhouse <dwmw2@infradead.org>
*
* For licensing information, see the file 'LICENCE' in this directory.
*
*/
#ifndef _JFFS2_FS_I #ifndef _JFFS2_FS_I
#define _JFFS2_FS_I #define _JFFS2_FS_I
......
/* $Id: jffs2_fs_sb.h,v 1.54 2005/09/21 13:37:34 dedekind Exp $ */ /*
* JFFS2 -- Journalling Flash File System, Version 2.
*
* Copyright © 2001-2007 Red Hat, Inc.
*
* Created by David Woodhouse <dwmw2@infradead.org>
*
* For licensing information, see the file 'LICENCE' in this directory.
*
*/
#ifndef _JFFS2_FS_SB #ifndef _JFFS2_FS_SB
#define _JFFS2_FS_SB #define _JFFS2_FS_SB
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001-2003 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* *
* Created by David Woodhouse <dwmw2@infradead.org> * Created by David Woodhouse <dwmw2@infradead.org>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: malloc.c,v 1.31 2005/11/07 11:14:40 gleixner Exp $
*
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
......
This diff is collapsed.
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001-2003 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* *
* Created by David Woodhouse <dwmw2@infradead.org> * Created by David Woodhouse <dwmw2@infradead.org>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: nodelist.h,v 1.140 2005/09/07 08:34:54 havasi Exp $
*
*/ */
#ifndef __JFFS2_NODELIST_H__ #ifndef __JFFS2_NODELIST_H__
...@@ -40,6 +38,9 @@ ...@@ -40,6 +38,9 @@
#define cpu_to_je32(x) ((jint32_t){x}) #define cpu_to_je32(x) ((jint32_t){x})
#define cpu_to_jemode(x) ((jmode_t){os_to_jffs2_mode(x)}) #define cpu_to_jemode(x) ((jmode_t){os_to_jffs2_mode(x)})
#define constant_cpu_to_je16(x) ((jint16_t){x})
#define constant_cpu_to_je32(x) ((jint32_t){x})
#define je16_to_cpu(x) ((x).v16) #define je16_to_cpu(x) ((x).v16)
#define je32_to_cpu(x) ((x).v32) #define je32_to_cpu(x) ((x).v32)
#define jemode_to_cpu(x) (jffs2_to_os_mode((x).m)) #define jemode_to_cpu(x) (jffs2_to_os_mode((x).m))
...@@ -48,6 +49,9 @@ ...@@ -48,6 +49,9 @@
#define cpu_to_je32(x) ((jint32_t){cpu_to_be32(x)}) #define cpu_to_je32(x) ((jint32_t){cpu_to_be32(x)})
#define cpu_to_jemode(x) ((jmode_t){cpu_to_be32(os_to_jffs2_mode(x))}) #define cpu_to_jemode(x) ((jmode_t){cpu_to_be32(os_to_jffs2_mode(x))})
#define constant_cpu_to_je16(x) ((jint16_t){__constant_cpu_to_be16(x)})
#define constant_cpu_to_je32(x) ((jint32_t){__constant_cpu_to_be32(x)})
#define je16_to_cpu(x) (be16_to_cpu(x.v16)) #define je16_to_cpu(x) (be16_to_cpu(x.v16))
#define je32_to_cpu(x) (be32_to_cpu(x.v32)) #define je32_to_cpu(x) (be32_to_cpu(x.v32))
#define jemode_to_cpu(x) (be32_to_cpu(jffs2_to_os_mode((x).m))) #define jemode_to_cpu(x) (be32_to_cpu(jffs2_to_os_mode((x).m)))
...@@ -56,6 +60,9 @@ ...@@ -56,6 +60,9 @@
#define cpu_to_je32(x) ((jint32_t){cpu_to_le32(x)}) #define cpu_to_je32(x) ((jint32_t){cpu_to_le32(x)})
#define cpu_to_jemode(x) ((jmode_t){cpu_to_le32(os_to_jffs2_mode(x))}) #define cpu_to_jemode(x) ((jmode_t){cpu_to_le32(os_to_jffs2_mode(x))})
#define constant_cpu_to_je16(x) ((jint16_t){__constant_cpu_to_le16(x)})
#define constant_cpu_to_je32(x) ((jint32_t){__constant_cpu_to_le32(x)})
#define je16_to_cpu(x) (le16_to_cpu(x.v16)) #define je16_to_cpu(x) (le16_to_cpu(x.v16))
#define je32_to_cpu(x) (le32_to_cpu(x.v32)) #define je32_to_cpu(x) (le32_to_cpu(x.v32))
#define jemode_to_cpu(x) (le32_to_cpu(jffs2_to_os_mode((x).m))) #define jemode_to_cpu(x) (le32_to_cpu(jffs2_to_os_mode((x).m)))
...@@ -216,7 +223,20 @@ struct jffs2_tmp_dnode_info ...@@ -216,7 +223,20 @@ struct jffs2_tmp_dnode_info
uint32_t version; uint32_t version;
uint32_t data_crc; uint32_t data_crc;
uint32_t partial_crc; uint32_t partial_crc;
uint32_t csize; uint16_t csize;
uint16_t overlapped;
};
/* Temporary data structure used during readinode. */
struct jffs2_readinode_info
{
struct rb_root tn_root;
struct jffs2_tmp_dnode_info *mdata_tn;
uint32_t highest_version;
uint32_t latest_mctime;
uint32_t mctime_ver;
struct jffs2_full_dirent *fds;
struct jffs2_raw_node_ref *latest_ref;
}; };
struct jffs2_full_dirent struct jffs2_full_dirent
...@@ -319,6 +339,15 @@ static inline struct jffs2_node_frag *frag_last(struct rb_root *root) ...@@ -319,6 +339,15 @@ static inline struct jffs2_node_frag *frag_last(struct rb_root *root)
#define frag_right(frag) rb_entry((frag)->rb.rb_right, struct jffs2_node_frag, rb) #define frag_right(frag) rb_entry((frag)->rb.rb_right, struct jffs2_node_frag, rb)
#define frag_erase(frag, list) rb_erase(&frag->rb, list); #define frag_erase(frag, list) rb_erase(&frag->rb, list);
#define tn_next(tn) rb_entry(rb_next(&(tn)->rb), struct jffs2_tmp_dnode_info, rb)
#define tn_prev(tn) rb_entry(rb_prev(&(tn)->rb), struct jffs2_tmp_dnode_info, rb)
#define tn_parent(tn) rb_entry(rb_parent(&(tn)->rb), struct jffs2_tmp_dnode_info, rb)
#define tn_left(tn) rb_entry((tn)->rb.rb_left, struct jffs2_tmp_dnode_info, rb)
#define tn_right(tn) rb_entry((tn)->rb.rb_right, struct jffs2_tmp_dnode_info, rb)
#define tn_erase(tn, list) rb_erase(&tn->rb, list);
#define tn_last(list) rb_entry(rb_last(list), struct jffs2_tmp_dnode_info, rb)
#define tn_first(list) rb_entry(rb_first(list), struct jffs2_tmp_dnode_info, rb)
/* nodelist.c */ /* nodelist.c */
void jffs2_add_fd_to_list(struct jffs2_sb_info *c, struct jffs2_full_dirent *new, struct jffs2_full_dirent **list); void jffs2_add_fd_to_list(struct jffs2_sb_info *c, struct jffs2_full_dirent *new, struct jffs2_full_dirent **list);
void jffs2_set_inocache_state(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic, int state); void jffs2_set_inocache_state(struct jffs2_sb_info *c, struct jffs2_inode_cache *ic, int state);
...@@ -333,8 +362,7 @@ struct rb_node *rb_next(struct rb_node *); ...@@ -333,8 +362,7 @@ struct rb_node *rb_next(struct rb_node *);
struct rb_node *rb_prev(struct rb_node *); struct rb_node *rb_prev(struct rb_node *);
void rb_replace_node(struct rb_node *victim, struct rb_node *new, struct rb_root *root); void rb_replace_node(struct rb_node *victim, struct rb_node *new, struct rb_root *root);
int jffs2_add_full_dnode_to_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_full_dnode *fn); int jffs2_add_full_dnode_to_inode(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_full_dnode *fn);
void jffs2_truncate_fragtree (struct jffs2_sb_info *c, struct rb_root *list, uint32_t size); uint32_t jffs2_truncate_fragtree (struct jffs2_sb_info *c, struct rb_root *list, uint32_t size);
int jffs2_add_older_frag_to_fragtree(struct jffs2_sb_info *c, struct jffs2_inode_info *f, struct jffs2_tmp_dnode_info *tn);
struct jffs2_raw_node_ref *jffs2_link_node_ref(struct jffs2_sb_info *c, struct jffs2_raw_node_ref *jffs2_link_node_ref(struct jffs2_sb_info *c,
struct jffs2_eraseblock *jeb, struct jffs2_eraseblock *jeb,
uint32_t ofs, uint32_t len, uint32_t ofs, uint32_t len,
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001-2003 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* *
* Created by David Woodhouse <dwmw2@infradead.org> * Created by David Woodhouse <dwmw2@infradead.org>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: nodemgmt.c,v 1.127 2005/09/20 15:49:12 dedekind Exp $
*
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -172,6 +170,11 @@ int jffs2_reserve_space_gc(struct jffs2_sb_info *c, uint32_t minsize, ...@@ -172,6 +170,11 @@ int jffs2_reserve_space_gc(struct jffs2_sb_info *c, uint32_t minsize,
static void jffs2_close_nextblock(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb) static void jffs2_close_nextblock(struct jffs2_sb_info *c, struct jffs2_eraseblock *jeb)
{ {
if (c->nextblock == NULL) {
D1(printk(KERN_DEBUG "jffs2_close_nextblock: Erase block at 0x%08x has already been placed in a list\n",
jeb->offset));
return;
}
/* Check, if we have a dirty block now, or if it was dirty already */ /* Check, if we have a dirty block now, or if it was dirty already */
if (ISDIRTY (jeb->wasted_size + jeb->dirty_size)) { if (ISDIRTY (jeb->wasted_size + jeb->dirty_size)) {
c->dirty_size += jeb->wasted_size; c->dirty_size += jeb->wasted_size;
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2002-2003 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* *
* Created by David Woodhouse <dwmw2@infradead.org> * Created by David Woodhouse <dwmw2@infradead.org>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: os-linux.h,v 1.64 2005/09/30 13:59:13 dedekind Exp $
*
*/ */
#ifndef __JFFS2_OS_LINUX_H__ #ifndef __JFFS2_OS_LINUX_H__
......
/*
* JFFS2 -- Journalling Flash File System, Version 2.
*
* Copyright (C) 2001, 2002 Red Hat, Inc.
*
* Created by David Woodhouse <dwmw2@infradead.org>
*
* For licensing information, see the file 'LICENCE' in this directory.
*
* $Id: pushpull.h,v 1.10 2004/11/16 20:36:11 dwmw2 Exp $
*
*/
#ifndef __PUSHPULL_H__
#define __PUSHPULL_H__
#include <linux/errno.h>
struct pushpull {
unsigned char *buf;
unsigned int buflen;
unsigned int ofs;
unsigned int reserve;
};
static inline void init_pushpull(struct pushpull *pp, char *buf, unsigned buflen, unsigned ofs, unsigned reserve)
{
pp->buf = buf;
pp->buflen = buflen;
pp->ofs = ofs;
pp->reserve = reserve;
}
static inline int pushbit(struct pushpull *pp, int bit, int use_reserved)
{
if (pp->ofs >= pp->buflen - (use_reserved?0:pp->reserve)) {
return -ENOSPC;
}
if (bit) {
pp->buf[pp->ofs >> 3] |= (1<<(7-(pp->ofs &7)));
}
else {
pp->buf[pp->ofs >> 3] &= ~(1<<(7-(pp->ofs &7)));
}
pp->ofs++;
return 0;
}
static inline int pushedbits(struct pushpull *pp)
{
return pp->ofs;
}
static inline int pullbit(struct pushpull *pp)
{
int bit;
bit = (pp->buf[pp->ofs >> 3] >> (7-(pp->ofs & 7))) & 1;
pp->ofs++;
return bit;
}
static inline int pulledbits(struct pushpull *pp)
{
return pp->ofs;
}
#endif /* __PUSHPULL_H__ */
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001-2003 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* *
* Created by David Woodhouse <dwmw2@infradead.org> * Created by David Woodhouse <dwmw2@infradead.org>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: read.c,v 1.42 2005/11/07 11:14:41 gleixner Exp $
*
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
......
This diff is collapsed.
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001-2003 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* *
* Created by David Woodhouse <dwmw2@infradead.org> * Created by David Woodhouse <dwmw2@infradead.org>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: scan.c,v 1.125 2005/09/30 13:59:13 dedekind Exp $
*
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/sched.h> #include <linux/sched.h>
#include <linux/slab.h> #include <linux/slab.h>
...@@ -636,16 +635,17 @@ static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblo ...@@ -636,16 +635,17 @@ static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblo
if (*(uint32_t *)(&buf[ofs-buf_ofs]) == 0xffffffff) { if (*(uint32_t *)(&buf[ofs-buf_ofs]) == 0xffffffff) {
uint32_t inbuf_ofs; uint32_t inbuf_ofs;
uint32_t empty_start; uint32_t empty_start, scan_end;
empty_start = ofs; empty_start = ofs;
ofs += 4; ofs += 4;
scan_end = min_t(uint32_t, EMPTY_SCAN_SIZE(c->sector_size)/8, buf_len);
D1(printk(KERN_DEBUG "Found empty flash at 0x%08x\n", ofs)); D1(printk(KERN_DEBUG "Found empty flash at 0x%08x\n", ofs));
more_empty: more_empty:
inbuf_ofs = ofs - buf_ofs; inbuf_ofs = ofs - buf_ofs;
while (inbuf_ofs < buf_len) { while (inbuf_ofs < scan_end) {
if (*(uint32_t *)(&buf[inbuf_ofs]) != 0xffffffff) { if (unlikely(*(uint32_t *)(&buf[inbuf_ofs]) != 0xffffffff)) {
printk(KERN_WARNING "Empty flash at 0x%08x ends at 0x%08x\n", printk(KERN_WARNING "Empty flash at 0x%08x ends at 0x%08x\n",
empty_start, ofs); empty_start, ofs);
if ((err = jffs2_scan_dirty_space(c, jeb, ofs-empty_start))) if ((err = jffs2_scan_dirty_space(c, jeb, ofs-empty_start)))
...@@ -666,6 +666,10 @@ static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblo ...@@ -666,6 +666,10 @@ static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblo
D1(printk(KERN_DEBUG "%d bytes at start of block seems clean... assuming all clean\n", EMPTY_SCAN_SIZE(c->sector_size))); D1(printk(KERN_DEBUG "%d bytes at start of block seems clean... assuming all clean\n", EMPTY_SCAN_SIZE(c->sector_size)));
return BLK_STATE_CLEANMARKER; return BLK_STATE_CLEANMARKER;
} }
if (!buf_size && (scan_end != buf_len)) {/* XIP/point case */
scan_end = buf_len;
goto more_empty;
}
/* See how much more there is to read in this eraseblock... */ /* See how much more there is to read in this eraseblock... */
buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs); buf_len = min_t(uint32_t, buf_size, jeb->offset + c->sector_size - ofs);
...@@ -676,6 +680,8 @@ static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblo ...@@ -676,6 +680,8 @@ static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblo
empty_start)); empty_start));
break; break;
} }
/* point never reaches here */
scan_end = buf_len;
D1(printk(KERN_DEBUG "Reading another 0x%x at 0x%08x\n", buf_len, ofs)); D1(printk(KERN_DEBUG "Reading another 0x%x at 0x%08x\n", buf_len, ofs));
err = jffs2_fill_scan_buf(c, buf, ofs, buf_len); err = jffs2_fill_scan_buf(c, buf, ofs, buf_len);
if (err) if (err)
...@@ -734,18 +740,8 @@ static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblo ...@@ -734,18 +740,8 @@ static int jffs2_scan_eraseblock (struct jffs2_sb_info *c, struct jffs2_eraseblo
ofs += 4; ofs += 4;
continue; continue;
} }
/* Due to poor choice of crc32 seed, an all-zero node will have a correct CRC */
if (!je32_to_cpu(node->hdr_crc) && !je16_to_cpu(node->nodetype) &&
!je16_to_cpu(node->magic) && !je32_to_cpu(node->totlen)) {
noisy_printk(&noise, "jffs2_scan_eraseblock(): All zero node header at 0x%08x.\n", ofs);
if ((err = jffs2_scan_dirty_space(c, jeb, 4)))
return err;
ofs += 4;
continue;
}
if (ofs + je32_to_cpu(node->totlen) > if (ofs + je32_to_cpu(node->totlen) > jeb->offset + c->sector_size) {
jeb->offset + c->sector_size) {
/* Eep. Node goes over the end of the erase block. */ /* Eep. Node goes over the end of the erase block. */
printk(KERN_WARNING "Node at 0x%08x with length 0x%08x would run over the end of the erase block\n", printk(KERN_WARNING "Node at 0x%08x with length 0x%08x would run over the end of the erase block\n",
ofs, je32_to_cpu(node->totlen)); ofs, je32_to_cpu(node->totlen));
...@@ -952,8 +948,7 @@ static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_erasebloc ...@@ -952,8 +948,7 @@ static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_erasebloc
struct jffs2_raw_inode *ri, uint32_t ofs, struct jffs2_summary *s) struct jffs2_raw_inode *ri, uint32_t ofs, struct jffs2_summary *s)
{ {
struct jffs2_inode_cache *ic; struct jffs2_inode_cache *ic;
uint32_t ino = je32_to_cpu(ri->ino); uint32_t crc, ino = je32_to_cpu(ri->ino);
int err;
D1(printk(KERN_DEBUG "jffs2_scan_inode_node(): Node at 0x%08x\n", ofs)); D1(printk(KERN_DEBUG "jffs2_scan_inode_node(): Node at 0x%08x\n", ofs));
...@@ -966,21 +961,22 @@ static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_erasebloc ...@@ -966,21 +961,22 @@ static int jffs2_scan_inode_node(struct jffs2_sb_info *c, struct jffs2_erasebloc
Which means that the _full_ amount of time to get to proper write mode with GC Which means that the _full_ amount of time to get to proper write mode with GC
operational may actually be _longer_ than before. Sucks to be me. */ operational may actually be _longer_ than before. Sucks to be me. */
ic = jffs2_get_ino_cache(c, ino); /* Check the node CRC in any case. */
if (!ic) { crc = crc32(0, ri, sizeof(*ri)-8);
/* Inocache get failed. Either we read a bogus ino# or it's just genuinely the
first node we found for this inode. Do a CRC check to protect against the former
case */
uint32_t crc = crc32(0, ri, sizeof(*ri)-8);
if (crc != je32_to_cpu(ri->node_crc)) { if (crc != je32_to_cpu(ri->node_crc)) {
printk(KERN_NOTICE "jffs2_scan_inode_node(): CRC failed on node at 0x%08x: Read 0x%08x, calculated 0x%08x\n", printk(KERN_NOTICE "jffs2_scan_inode_node(): CRC failed on "
"node at 0x%08x: Read 0x%08x, calculated 0x%08x\n",
ofs, je32_to_cpu(ri->node_crc), crc); ofs, je32_to_cpu(ri->node_crc), crc);
/* We believe totlen because the CRC on the node _header_ was OK, just the node itself failed. */ /*
if ((err = jffs2_scan_dirty_space(c, jeb, PAD(je32_to_cpu(ri->totlen))))) * We believe totlen because the CRC on the node
return err; * _header_ was OK, just the node itself failed.
return 0; */
return jffs2_scan_dirty_space(c, jeb,
PAD(je32_to_cpu(ri->totlen)));
} }
ic = jffs2_get_ino_cache(c, ino);
if (!ic) {
ic = jffs2_scan_make_ino_cache(c, ino); ic = jffs2_scan_make_ino_cache(c, ino);
if (!ic) if (!ic)
return -ENOMEM; return -ENOMEM;
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2006 NEC Corporation * Copyright © 2006 NEC Corporation
* *
* Created by KaiGai Kohei <kaigai@ak.jp.nec.com> * Created by KaiGai Kohei <kaigai@ak.jp.nec.com>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/fs.h> #include <linux/fs.h>
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2004 Ferenc Havasi <havasi@inf.u-szeged.hu>, * Copyright © 2004 Ferenc Havasi <havasi@inf.u-szeged.hu>,
* Zoltan Sogor <weth@inf.u-szeged.hu>, * Zoltan Sogor <weth@inf.u-szeged.hu>,
* Patrik Kluba <pajko@halom.u-szeged.hu>, * Patrik Kluba <pajko@halom.u-szeged.hu>,
* University of Szeged, Hungary * University of Szeged, Hungary
...@@ -9,8 +9,6 @@ ...@@ -9,8 +9,6 @@
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: summary.c,v 1.4 2005/09/26 11:37:21 havasi Exp $
*
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2004 Ferenc Havasi <havasi@inf.u-szeged.hu>, * Copyright © 2004 Ferenc Havasi <havasi@inf.u-szeged.hu>,
* Zoltan Sogor <weth@inf.u-szeged.hu>, * Zoltan Sogor <weth@inf.u-szeged.hu>,
* Patrik Kluba <pajko@halom.u-szeged.hu>, * Patrik Kluba <pajko@halom.u-szeged.hu>,
* University of Szeged, Hungary * University of Szeged, Hungary
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: summary.h,v 1.2 2005/09/26 11:37:21 havasi Exp $
*
*/ */
#ifndef JFFS2_SUMMARY_H #ifndef JFFS2_SUMMARY_H
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001-2003 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* *
* Created by David Woodhouse <dwmw2@infradead.org> * Created by David Woodhouse <dwmw2@infradead.org>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: super.c,v 1.110 2005/11/07 11:14:42 gleixner Exp $
*
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -347,7 +345,7 @@ static int __init init_jffs2_fs(void) ...@@ -347,7 +345,7 @@ static int __init init_jffs2_fs(void)
#ifdef CONFIG_JFFS2_SUMMARY #ifdef CONFIG_JFFS2_SUMMARY
" (SUMMARY) " " (SUMMARY) "
#endif #endif
" (C) 2001-2006 Red Hat, Inc.\n"); " © 2001-2006 Red Hat, Inc.\n");
jffs2_inode_cachep = kmem_cache_create("jffs2_i", jffs2_inode_cachep = kmem_cache_create("jffs2_i",
sizeof(struct jffs2_inode_info), sizeof(struct jffs2_inode_info),
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001, 2002 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* *
* Created by David Woodhouse <dwmw2@infradead.org> * Created by David Woodhouse <dwmw2@infradead.org>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: symlink.c,v 1.19 2005/11/07 11:14:42 gleixner Exp $
*
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/fs.h> #include <linux/fs.h>
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001-2003 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* Copyright (C) 2004 Thomas Gleixner <tglx@linutronix.de> * Copyright © 2004 Thomas Gleixner <tglx@linutronix.de>
* *
* Created by David Woodhouse <dwmw2@infradead.org> * Created by David Woodhouse <dwmw2@infradead.org>
* Modified debugged and enhanced by Thomas Gleixner <tglx@linutronix.de> * Modified debugged and enhanced by Thomas Gleixner <tglx@linutronix.de>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: wbuf.c,v 1.100 2005/09/30 13:59:13 dedekind Exp $
*
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -345,6 +343,9 @@ static void jffs2_wbuf_recover(struct jffs2_sb_info *c) ...@@ -345,6 +343,9 @@ static void jffs2_wbuf_recover(struct jffs2_sb_info *c)
return; return;
} }
/* The summary is not recovered, so it must be disabled for this erase block */
jffs2_sum_disable_collecting(c->summary);
ret = jffs2_prealloc_raw_node_refs(c, c->nextblock, nr_refile); ret = jffs2_prealloc_raw_node_refs(c, c->nextblock, nr_refile);
if (ret) { if (ret) {
printk(KERN_WARNING "Failed to allocate node refs for wbuf recovery. Data loss ensues.\n"); printk(KERN_WARNING "Failed to allocate node refs for wbuf recovery. Data loss ensues.\n");
...@@ -967,9 +968,9 @@ int jffs2_flash_read(struct jffs2_sb_info *c, loff_t ofs, size_t len, size_t *re ...@@ -967,9 +968,9 @@ int jffs2_flash_read(struct jffs2_sb_info *c, loff_t ofs, size_t len, size_t *re
static const struct jffs2_unknown_node oob_cleanmarker = static const struct jffs2_unknown_node oob_cleanmarker =
{ {
.magic = cpu_to_je16(JFFS2_MAGIC_BITMASK), .magic = constant_cpu_to_je16(JFFS2_MAGIC_BITMASK),
.nodetype = cpu_to_je16(JFFS2_NODETYPE_CLEANMARKER), .nodetype = constant_cpu_to_je16(JFFS2_NODETYPE_CLEANMARKER),
.totlen = cpu_to_je32(8) .totlen = constant_cpu_to_je32(8)
}; };
/* /*
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001-2003 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* *
* Created by David Woodhouse <dwmw2@infradead.org> * Created by David Woodhouse <dwmw2@infradead.org>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: write.c,v 1.97 2005/11/07 11:14:42 gleixner Exp $
*
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
...@@ -507,8 +505,7 @@ int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f, ...@@ -507,8 +505,7 @@ int jffs2_do_unlink(struct jffs2_sb_info *c, struct jffs2_inode_info *dir_f,
uint32_t alloclen; uint32_t alloclen;
int ret; int ret;
if (1 /* alternative branch needs testing */ || if (!jffs2_can_mark_obsolete(c)) {
!jffs2_can_mark_obsolete(c)) {
/* We can't mark stuff obsolete on the medium. We need to write a deletion dirent */ /* We can't mark stuff obsolete on the medium. We need to write a deletion dirent */
rd = jffs2_alloc_raw_dirent(); rd = jffs2_alloc_raw_dirent();
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2001, 2002 Red Hat, Inc. * Copyright © 2001-2007 Red Hat, Inc.
* *
* Created by David Woodhouse <dwmw2@infradead.org> * Created by David Woodhouse <dwmw2@infradead.org>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
* $Id: writev.c,v 1.8 2005/09/09 15:11:58 havasi Exp $
*
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2006 NEC Corporation * Copyright © 2006 NEC Corporation
* *
* Created by KaiGai Kohei <kaigai@ak.jp.nec.com> * Created by KaiGai Kohei <kaigai@ak.jp.nec.com>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/slab.h> #include <linux/slab.h>
#include <linux/fs.h> #include <linux/fs.h>
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2006 NEC Corporation * Copyright © 2006 NEC Corporation
* *
* Created by KaiGai Kohei <kaigai@ak.jp.nec.com> * Created by KaiGai Kohei <kaigai@ak.jp.nec.com>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
*/ */
#ifndef _JFFS2_FS_XATTR_H_ #ifndef _JFFS2_FS_XATTR_H_
#define _JFFS2_FS_XATTR_H_ #define _JFFS2_FS_XATTR_H_
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2006 NEC Corporation * Copyright © 2006 NEC Corporation
* *
* Created by KaiGai Kohei <kaigai@ak.jp.nec.com> * Created by KaiGai Kohei <kaigai@ak.jp.nec.com>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/jffs2.h> #include <linux/jffs2.h>
......
/* /*
* JFFS2 -- Journalling Flash File System, Version 2. * JFFS2 -- Journalling Flash File System, Version 2.
* *
* Copyright (C) 2006 NEC Corporation * Copyright © 2006 NEC Corporation
* *
* Created by KaiGai Kohei <kaigai@ak.jp.nec.com> * Created by KaiGai Kohei <kaigai@ak.jp.nec.com>
* *
* For licensing information, see the file 'LICENCE' in this directory. * For licensing information, see the file 'LICENCE' in this directory.
* *
*/ */
#include <linux/kernel.h> #include <linux/kernel.h>
#include <linux/fs.h> #include <linux/fs.h>
#include <linux/jffs2.h> #include <linux/jffs2.h>
......
This diff is collapsed.
...@@ -53,6 +53,7 @@ struct mtd_erase_region_info { ...@@ -53,6 +53,7 @@ struct mtd_erase_region_info {
u_int32_t offset; /* At which this region starts, from the beginning of the MTD */ u_int32_t offset; /* At which this region starts, from the beginning of the MTD */
u_int32_t erasesize; /* For this region */ u_int32_t erasesize; /* For this region */
u_int32_t numblocks; /* Number of blocks of erasesize in this region */ u_int32_t numblocks; /* Number of blocks of erasesize in this region */
unsigned long *lockmap; /* If keeping bitmap of locks */
}; };
/* /*
......
...@@ -431,6 +431,7 @@ struct nand_chip { ...@@ -431,6 +431,7 @@ struct nand_chip {
#define NAND_MFR_RENESAS 0x07 #define NAND_MFR_RENESAS 0x07
#define NAND_MFR_STMICRO 0x20 #define NAND_MFR_STMICRO 0x20
#define NAND_MFR_HYNIX 0xad #define NAND_MFR_HYNIX 0xad
#define NAND_MFR_MICRON 0x2c
/** /**
* struct nand_flash_dev - NAND Flash Device ID Structure * struct nand_flash_dev - NAND Flash Device ID Structure
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment