aboutsummaryrefslogtreecommitdiffstats
path: root/drivers/mtd/nand/nandsim.c
diff options
context:
space:
mode:
Diffstat (limited to 'drivers/mtd/nand/nandsim.c')
-rw-r--r--drivers/mtd/nand/nandsim.c21
1 files changed, 20 insertions, 1 deletions
diff --git a/drivers/mtd/nand/nandsim.c b/drivers/mtd/nand/nandsim.c
index 1a44ef63c8d1..205df0f771fe 100644
--- a/drivers/mtd/nand/nandsim.c
+++ b/drivers/mtd/nand/nandsim.c
@@ -100,6 +100,7 @@ static char *weakpages = NULL;
100static unsigned int bitflips = 0; 100static unsigned int bitflips = 0;
101static char *gravepages = NULL; 101static char *gravepages = NULL;
102static unsigned int rptwear = 0; 102static unsigned int rptwear = 0;
103static unsigned int overridesize = 0;
103 104
104module_param(first_id_byte, uint, 0400); 105module_param(first_id_byte, uint, 0400);
105module_param(second_id_byte, uint, 0400); 106module_param(second_id_byte, uint, 0400);
@@ -121,8 +122,9 @@ module_param(weakpages, charp, 0400);
121module_param(bitflips, uint, 0400); 122module_param(bitflips, uint, 0400);
122module_param(gravepages, charp, 0400); 123module_param(gravepages, charp, 0400);
123module_param(rptwear, uint, 0400); 124module_param(rptwear, uint, 0400);
125module_param(overridesize, uint, 0400);
124 126
125MODULE_PARM_DESC(first_id_byte, "The fist byte returned by NAND Flash 'read ID' command (manufaturer ID)"); 127MODULE_PARM_DESC(first_id_byte, "The first byte returned by NAND Flash 'read ID' command (manufacturer ID)");
126MODULE_PARM_DESC(second_id_byte, "The second byte returned by NAND Flash 'read ID' command (chip ID)"); 128MODULE_PARM_DESC(second_id_byte, "The second byte returned by NAND Flash 'read ID' command (chip ID)");
127MODULE_PARM_DESC(third_id_byte, "The third byte returned by NAND Flash 'read ID' command"); 129MODULE_PARM_DESC(third_id_byte, "The third byte returned by NAND Flash 'read ID' command");
128MODULE_PARM_DESC(fourth_id_byte, "The fourth byte returned by NAND Flash 'read ID' command"); 130MODULE_PARM_DESC(fourth_id_byte, "The fourth byte returned by NAND Flash 'read ID' command");
@@ -149,6 +151,9 @@ MODULE_PARM_DESC(gravepages, "Pages that lose data [: maximum reads (default
149 " separated by commas e.g. 1401:2 means page 1401" 151 " separated by commas e.g. 1401:2 means page 1401"
150 " can be read only twice before failing"); 152 " can be read only twice before failing");
151MODULE_PARM_DESC(rptwear, "Number of erases inbetween reporting wear, if not zero"); 153MODULE_PARM_DESC(rptwear, "Number of erases inbetween reporting wear, if not zero");
154MODULE_PARM_DESC(overridesize, "Specifies the NAND Flash size overriding the ID bytes. "
155 "The size is specified in erase blocks and as the exponent of a power of two"
156 " e.g. 5 means a size of 32 erase blocks");
152 157
153/* The largest possible page size */ 158/* The largest possible page size */
154#define NS_LARGEST_PAGE_SIZE 2048 159#define NS_LARGEST_PAGE_SIZE 2048
@@ -1959,6 +1964,8 @@ static int __init ns_init_module(void)
1959 chip->verify_buf = ns_nand_verify_buf; 1964 chip->verify_buf = ns_nand_verify_buf;
1960 chip->read_word = ns_nand_read_word; 1965 chip->read_word = ns_nand_read_word;
1961 chip->ecc.mode = NAND_ECC_SOFT; 1966 chip->ecc.mode = NAND_ECC_SOFT;
1967 /* The NAND_SKIP_BBTSCAN option is necessary for 'overridesize' */
1968 /* and 'badblocks' parameters to work */
1962 chip->options |= NAND_SKIP_BBTSCAN; 1969 chip->options |= NAND_SKIP_BBTSCAN;
1963 1970
1964 /* 1971 /*
@@ -1999,6 +2006,18 @@ static int __init ns_init_module(void)
1999 goto error; 2006 goto error;
2000 } 2007 }
2001 2008
2009 if (overridesize) {
2010 u_int32_t new_size = nsmtd->erasesize << overridesize;
2011 if (new_size >> overridesize != nsmtd->erasesize) {
2012 NS_ERR("overridesize is too big\n");
2013 goto err_exit;
2014 }
2015 /* N.B. This relies on nand_scan not doing anything with the size before we change it */
2016 nsmtd->size = new_size;
2017 chip->chipsize = new_size;
2018 chip->chip_shift = ffs(new_size) - 1;
2019 }
2020
2002 if ((retval = setup_wear_reporting(nsmtd)) != 0) 2021 if ((retval = setup_wear_reporting(nsmtd)) != 0)
2003 goto err_exit; 2022 goto err_exit;
2004 2023