diff options
Diffstat (limited to 'drivers')
-rw-r--r-- | drivers/mtd/nand/nandsim.c | 21 |
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; | |||
100 | static unsigned int bitflips = 0; | 100 | static unsigned int bitflips = 0; |
101 | static char *gravepages = NULL; | 101 | static char *gravepages = NULL; |
102 | static unsigned int rptwear = 0; | 102 | static unsigned int rptwear = 0; |
103 | static unsigned int overridesize = 0; | ||
103 | 104 | ||
104 | module_param(first_id_byte, uint, 0400); | 105 | module_param(first_id_byte, uint, 0400); |
105 | module_param(second_id_byte, uint, 0400); | 106 | module_param(second_id_byte, uint, 0400); |
@@ -121,8 +122,9 @@ module_param(weakpages, charp, 0400); | |||
121 | module_param(bitflips, uint, 0400); | 122 | module_param(bitflips, uint, 0400); |
122 | module_param(gravepages, charp, 0400); | 123 | module_param(gravepages, charp, 0400); |
123 | module_param(rptwear, uint, 0400); | 124 | module_param(rptwear, uint, 0400); |
125 | module_param(overridesize, uint, 0400); | ||
124 | 126 | ||
125 | MODULE_PARM_DESC(first_id_byte, "The fist byte returned by NAND Flash 'read ID' command (manufaturer ID)"); | 127 | MODULE_PARM_DESC(first_id_byte, "The first byte returned by NAND Flash 'read ID' command (manufacturer ID)"); |
126 | MODULE_PARM_DESC(second_id_byte, "The second byte returned by NAND Flash 'read ID' command (chip ID)"); | 128 | MODULE_PARM_DESC(second_id_byte, "The second byte returned by NAND Flash 'read ID' command (chip ID)"); |
127 | MODULE_PARM_DESC(third_id_byte, "The third byte returned by NAND Flash 'read ID' command"); | 129 | MODULE_PARM_DESC(third_id_byte, "The third byte returned by NAND Flash 'read ID' command"); |
128 | MODULE_PARM_DESC(fourth_id_byte, "The fourth byte returned by NAND Flash 'read ID' command"); | 130 | MODULE_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"); |
151 | MODULE_PARM_DESC(rptwear, "Number of erases inbetween reporting wear, if not zero"); | 153 | MODULE_PARM_DESC(rptwear, "Number of erases inbetween reporting wear, if not zero"); |
154 | MODULE_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 | ||