aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorBoris Brezillon <boris.brezillon@bootlin.com>2018-02-12 16:03:11 -0500
committerBoris Brezillon <boris.brezillon@bootlin.com>2018-03-21 04:50:56 -0400
commite7bfb3fdbde3bfeeeb64e2d73ac6babe59519c9e (patch)
treef8aaed7657f3b7af86cdf2b5eade135e0f9f740b
parent8f347c4232d5fc097599b711a3385722a6834005 (diff)
mtd: Stop updating erase_info->state and calling mtd_erase_callback()
MTD users are no longer checking erase_info->state to determine if the erase operation failed or succeeded. Moreover, mtd_erase_callback() is now a NOP. We can safely get rid of all mtd_erase_callback() calls and all erase_info->state assignments. While at it, get rid of the erase_info->state field, all MTD_ERASE_XXX definitions and the mtd_erase_callback() function. Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com> Reviewed-by: Richard Weinberger <richard@nod.at> Reviewed-by: Miquel Raynal <miquel.raynal@bootlin.com> Acked-by: Bert Kenward <bkenward@solarflare.com> --- Changes in v2: - Address a few coding style issues (reported by Miquel) - Remove comments that are no longer valid (reported by Miquel)
-rw-r--r--drivers/mtd/chips/cfi_cmdset_0001.c16
-rw-r--r--drivers/mtd/chips/cfi_cmdset_0002.c26
-rw-r--r--drivers/mtd/chips/cfi_cmdset_0020.c3
-rw-r--r--drivers/mtd/chips/map_ram.c2
-rw-r--r--drivers/mtd/devices/bcm47xxsflash.c9
-rw-r--r--drivers/mtd/devices/block2mtd.c7
-rw-r--r--drivers/mtd/devices/docg3.c16
-rw-r--r--drivers/mtd/devices/lart.c6
-rw-r--r--drivers/mtd/devices/mtd_dataflash.c4
-rw-r--r--drivers/mtd/devices/mtdram.c3
-rw-r--r--drivers/mtd/devices/phram.c7
-rw-r--r--drivers/mtd/devices/pmc551.c2
-rw-r--r--drivers/mtd/devices/powernv_flash.c12
-rw-r--r--drivers/mtd/devices/slram.c7
-rw-r--r--drivers/mtd/devices/spear_smi.c3
-rw-r--r--drivers/mtd/devices/sst25l.c3
-rw-r--r--drivers/mtd/devices/st_spi_fsm.c4
-rw-r--r--drivers/mtd/lpddr/lpddr2_nvm.c10
-rw-r--r--drivers/mtd/lpddr/lpddr_cmds.c2
-rw-r--r--drivers/mtd/mtdconcat.c1
-rw-r--r--drivers/mtd/mtdcore.c6
-rw-r--r--drivers/mtd/mtdpart.c5
-rw-r--r--drivers/mtd/nand/nand_base.c16
-rw-r--r--drivers/mtd/onenand/onenand_base.c17
-rw-r--r--drivers/mtd/spi-nor/spi-nor.c3
-rw-r--r--drivers/mtd/ubi/gluebi.c3
-rw-r--r--drivers/net/ethernet/sfc/falcon/mtd.c11
-rw-r--r--drivers/net/ethernet/sfc/mtd.c11
-rw-r--r--drivers/staging/goldfish/goldfish_nand.c3
-rw-r--r--include/linux/mtd/mtd.h9
30 files changed, 23 insertions, 204 deletions
diff --git a/drivers/mtd/chips/cfi_cmdset_0001.c b/drivers/mtd/chips/cfi_cmdset_0001.c
index 5e1b68cbcd0a..d4c07b85f18e 100644
--- a/drivers/mtd/chips/cfi_cmdset_0001.c
+++ b/drivers/mtd/chips/cfi_cmdset_0001.c
@@ -1993,20 +1993,8 @@ static int __xipram do_erase_oneblock(struct map_info *map, struct flchip *chip,
1993 1993
1994static int cfi_intelext_erase_varsize(struct mtd_info *mtd, struct erase_info *instr) 1994static int cfi_intelext_erase_varsize(struct mtd_info *mtd, struct erase_info *instr)
1995{ 1995{
1996 unsigned long ofs, len; 1996 return cfi_varsize_frob(mtd, do_erase_oneblock, instr->addr,
1997 int ret; 1997 instr->len, NULL);
1998
1999 ofs = instr->addr;
2000 len = instr->len;
2001
2002 ret = cfi_varsize_frob(mtd, do_erase_oneblock, ofs, len, NULL);
2003 if (ret)
2004 return ret;
2005
2006 instr->state = MTD_ERASE_DONE;
2007 mtd_erase_callback(instr);
2008
2009 return 0;
2010} 1998}
2011 1999
2012static void cfi_intelext_sync (struct mtd_info *mtd) 2000static void cfi_intelext_sync (struct mtd_info *mtd)
diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c
index 56aa6b75213d..668e2cbc155b 100644
--- a/drivers/mtd/chips/cfi_cmdset_0002.c
+++ b/drivers/mtd/chips/cfi_cmdset_0002.c
@@ -2415,20 +2415,8 @@ static int __xipram do_erase_oneblock(struct map_info *map, struct flchip *chip,
2415 2415
2416static int cfi_amdstd_erase_varsize(struct mtd_info *mtd, struct erase_info *instr) 2416static int cfi_amdstd_erase_varsize(struct mtd_info *mtd, struct erase_info *instr)
2417{ 2417{
2418 unsigned long ofs, len; 2418 return cfi_varsize_frob(mtd, do_erase_oneblock, instr->addr,
2419 int ret; 2419 instr->len, NULL);
2420
2421 ofs = instr->addr;
2422 len = instr->len;
2423
2424 ret = cfi_varsize_frob(mtd, do_erase_oneblock, ofs, len, NULL);
2425 if (ret)
2426 return ret;
2427
2428 instr->state = MTD_ERASE_DONE;
2429 mtd_erase_callback(instr);
2430
2431 return 0;
2432} 2420}
2433 2421
2434 2422
@@ -2436,7 +2424,6 @@ static int cfi_amdstd_erase_chip(struct mtd_info *mtd, struct erase_info *instr)
2436{ 2424{
2437 struct map_info *map = mtd->priv; 2425 struct map_info *map = mtd->priv;
2438 struct cfi_private *cfi = map->fldrv_priv; 2426 struct cfi_private *cfi = map->fldrv_priv;
2439 int ret = 0;
2440 2427
2441 if (instr->addr != 0) 2428 if (instr->addr != 0)
2442 return -EINVAL; 2429 return -EINVAL;
@@ -2444,14 +2431,7 @@ static int cfi_amdstd_erase_chip(struct mtd_info *mtd, struct erase_info *instr)
2444 if (instr->len != mtd->size) 2431 if (instr->len != mtd->size)
2445 return -EINVAL; 2432 return -EINVAL;
2446 2433
2447 ret = do_erase_chip(map, &cfi->chips[0]); 2434 return do_erase_chip(map, &cfi->chips[0]);
2448 if (ret)
2449 return ret;
2450
2451 instr->state = MTD_ERASE_DONE;
2452 mtd_erase_callback(instr);
2453
2454 return 0;
2455} 2435}
2456 2436
2457static int do_atmel_lock(struct map_info *map, struct flchip *chip, 2437static int do_atmel_lock(struct map_info *map, struct flchip *chip,
diff --git a/drivers/mtd/chips/cfi_cmdset_0020.c b/drivers/mtd/chips/cfi_cmdset_0020.c
index 7d342965f392..7b7658a05036 100644
--- a/drivers/mtd/chips/cfi_cmdset_0020.c
+++ b/drivers/mtd/chips/cfi_cmdset_0020.c
@@ -965,9 +965,6 @@ static int cfi_staa_erase_varsize(struct mtd_info *mtd,
965 } 965 }
966 } 966 }
967 967
968 instr->state = MTD_ERASE_DONE;
969 mtd_erase_callback(instr);
970
971 return 0; 968 return 0;
972} 969}
973 970
diff --git a/drivers/mtd/chips/map_ram.c b/drivers/mtd/chips/map_ram.c
index 1cd0fff0e940..c37fce926864 100644
--- a/drivers/mtd/chips/map_ram.c
+++ b/drivers/mtd/chips/map_ram.c
@@ -131,8 +131,6 @@ static int mapram_erase (struct mtd_info *mtd, struct erase_info *instr)
131 allff = map_word_ff(map); 131 allff = map_word_ff(map);
132 for (i=0; i<instr->len; i += map_bankwidth(map)) 132 for (i=0; i<instr->len; i += map_bankwidth(map))
133 map_write(map, allff, instr->addr + i); 133 map_write(map, allff, instr->addr + i);
134 instr->state = MTD_ERASE_DONE;
135 mtd_erase_callback(instr);
136 return 0; 134 return 0;
137} 135}
138 136
diff --git a/drivers/mtd/devices/bcm47xxsflash.c b/drivers/mtd/devices/bcm47xxsflash.c
index 6b84947cfbea..9baa81b8780c 100644
--- a/drivers/mtd/devices/bcm47xxsflash.c
+++ b/drivers/mtd/devices/bcm47xxsflash.c
@@ -68,7 +68,6 @@ static int bcm47xxsflash_poll(struct bcm47xxsflash *b47s, int timeout)
68static int bcm47xxsflash_erase(struct mtd_info *mtd, struct erase_info *erase) 68static int bcm47xxsflash_erase(struct mtd_info *mtd, struct erase_info *erase)
69{ 69{
70 struct bcm47xxsflash *b47s = mtd->priv; 70 struct bcm47xxsflash *b47s = mtd->priv;
71 int err;
72 71
73 switch (b47s->type) { 72 switch (b47s->type) {
74 case BCM47XXSFLASH_TYPE_ST: 73 case BCM47XXSFLASH_TYPE_ST:
@@ -89,13 +88,7 @@ static int bcm47xxsflash_erase(struct mtd_info *mtd, struct erase_info *erase)
89 break; 88 break;
90 } 89 }
91 90
92 err = bcm47xxsflash_poll(b47s, HZ); 91 return bcm47xxsflash_poll(b47s, HZ);
93 if (err)
94 erase->state = MTD_ERASE_FAILED;
95 else
96 erase->state = MTD_ERASE_DONE;
97
98 return err;
99} 92}
100 93
101static int bcm47xxsflash_read(struct mtd_info *mtd, loff_t from, size_t len, 94static int bcm47xxsflash_read(struct mtd_info *mtd, loff_t from, size_t len,
diff --git a/drivers/mtd/devices/block2mtd.c b/drivers/mtd/devices/block2mtd.c
index bb0734600a07..c9e424993e37 100644
--- a/drivers/mtd/devices/block2mtd.c
+++ b/drivers/mtd/devices/block2mtd.c
@@ -88,17 +88,12 @@ static int block2mtd_erase(struct mtd_info *mtd, struct erase_info *instr)
88 size_t len = instr->len; 88 size_t len = instr->len;
89 int err; 89 int err;
90 90
91 instr->state = MTD_ERASING;
92 mutex_lock(&dev->write_mutex); 91 mutex_lock(&dev->write_mutex);
93 err = _block2mtd_erase(dev, from, len); 92 err = _block2mtd_erase(dev, from, len);
94 mutex_unlock(&dev->write_mutex); 93 mutex_unlock(&dev->write_mutex);
95 if (err) { 94 if (err)
96 pr_err("erase failed err = %d\n", err); 95 pr_err("erase failed err = %d\n", err);
97 instr->state = MTD_ERASE_FAILED;
98 } else
99 instr->state = MTD_ERASE_DONE;
100 96
101 mtd_erase_callback(instr);
102 return err; 97 return err;
103} 98}
104 99
diff --git a/drivers/mtd/devices/docg3.c b/drivers/mtd/devices/docg3.c
index a85af236b44d..c594fe5eac08 100644
--- a/drivers/mtd/devices/docg3.c
+++ b/drivers/mtd/devices/docg3.c
@@ -1191,39 +1191,27 @@ static int doc_erase(struct mtd_info *mtd, struct erase_info *info)
1191{ 1191{
1192 struct docg3 *docg3 = mtd->priv; 1192 struct docg3 *docg3 = mtd->priv;
1193 uint64_t len; 1193 uint64_t len;
1194 int block0, block1, page, ret, ofs = 0; 1194 int block0, block1, page, ret = 0, ofs = 0;
1195 1195
1196 doc_dbg("doc_erase(from=%lld, len=%lld\n", info->addr, info->len); 1196 doc_dbg("doc_erase(from=%lld, len=%lld\n", info->addr, info->len);
1197 1197
1198 info->state = MTD_ERASE_PENDING;
1199 calc_block_sector(info->addr + info->len, &block0, &block1, &page, 1198 calc_block_sector(info->addr + info->len, &block0, &block1, &page,
1200 &ofs, docg3->reliable); 1199 &ofs, docg3->reliable);
1201 ret = -EINVAL;
1202 if (info->addr + info->len > mtd->size || page || ofs) 1200 if (info->addr + info->len > mtd->size || page || ofs)
1203 goto reset_err; 1201 return -EINVAL;
1204 1202
1205 ret = 0;
1206 calc_block_sector(info->addr, &block0, &block1, &page, &ofs, 1203 calc_block_sector(info->addr, &block0, &block1, &page, &ofs,
1207 docg3->reliable); 1204 docg3->reliable);
1208 mutex_lock(&docg3->cascade->lock); 1205 mutex_lock(&docg3->cascade->lock);
1209 doc_set_device_id(docg3, docg3->device_id); 1206 doc_set_device_id(docg3, docg3->device_id);
1210 doc_set_reliable_mode(docg3); 1207 doc_set_reliable_mode(docg3);
1211 for (len = info->len; !ret && len > 0; len -= mtd->erasesize) { 1208 for (len = info->len; !ret && len > 0; len -= mtd->erasesize) {
1212 info->state = MTD_ERASING;
1213 ret = doc_erase_block(docg3, block0, block1); 1209 ret = doc_erase_block(docg3, block0, block1);
1214 block0 += 2; 1210 block0 += 2;
1215 block1 += 2; 1211 block1 += 2;
1216 } 1212 }
1217 mutex_unlock(&docg3->cascade->lock); 1213 mutex_unlock(&docg3->cascade->lock);
1218 1214
1219 if (ret)
1220 goto reset_err;
1221
1222 info->state = MTD_ERASE_DONE;
1223 return 0;
1224
1225reset_err:
1226 info->state = MTD_ERASE_FAILED;
1227 return ret; 1215 return ret;
1228} 1216}
1229 1217
diff --git a/drivers/mtd/devices/lart.c b/drivers/mtd/devices/lart.c
index 555b94406e0b..f67b653c17d7 100644
--- a/drivers/mtd/devices/lart.c
+++ b/drivers/mtd/devices/lart.c
@@ -414,10 +414,7 @@ static int flash_erase (struct mtd_info *mtd,struct erase_info *instr)
414 while (len) 414 while (len)
415 { 415 {
416 if (!erase_block (addr)) 416 if (!erase_block (addr))
417 {
418 instr->state = MTD_ERASE_FAILED;
419 return (-EIO); 417 return (-EIO);
420 }
421 418
422 addr += mtd->eraseregions[i].erasesize; 419 addr += mtd->eraseregions[i].erasesize;
423 len -= mtd->eraseregions[i].erasesize; 420 len -= mtd->eraseregions[i].erasesize;
@@ -425,9 +422,6 @@ static int flash_erase (struct mtd_info *mtd,struct erase_info *instr)
425 if (addr == mtd->eraseregions[i].offset + (mtd->eraseregions[i].erasesize * mtd->eraseregions[i].numblocks)) i++; 422 if (addr == mtd->eraseregions[i].offset + (mtd->eraseregions[i].erasesize * mtd->eraseregions[i].numblocks)) i++;
426 } 423 }
427 424
428 instr->state = MTD_ERASE_DONE;
429 mtd_erase_callback(instr);
430
431 return (0); 425 return (0);
432} 426}
433 427
diff --git a/drivers/mtd/devices/mtd_dataflash.c b/drivers/mtd/devices/mtd_dataflash.c
index 5dc8bd042cc5..aaaeaae01e1d 100644
--- a/drivers/mtd/devices/mtd_dataflash.c
+++ b/drivers/mtd/devices/mtd_dataflash.c
@@ -220,10 +220,6 @@ static int dataflash_erase(struct mtd_info *mtd, struct erase_info *instr)
220 } 220 }
221 mutex_unlock(&priv->lock); 221 mutex_unlock(&priv->lock);
222 222
223 /* Inform MTD subsystem that erase is complete */
224 instr->state = MTD_ERASE_DONE;
225 mtd_erase_callback(instr);
226
227 return 0; 223 return 0;
228} 224}
229 225
diff --git a/drivers/mtd/devices/mtdram.c b/drivers/mtd/devices/mtdram.c
index 0bf4aeaf0cb8..46238796145f 100644
--- a/drivers/mtd/devices/mtdram.c
+++ b/drivers/mtd/devices/mtdram.c
@@ -60,8 +60,7 @@ static int ram_erase(struct mtd_info *mtd, struct erase_info *instr)
60 if (check_offs_len(mtd, instr->addr, instr->len)) 60 if (check_offs_len(mtd, instr->addr, instr->len))
61 return -EINVAL; 61 return -EINVAL;
62 memset((char *)mtd->priv + instr->addr, 0xff, instr->len); 62 memset((char *)mtd->priv + instr->addr, 0xff, instr->len);
63 instr->state = MTD_ERASE_DONE; 63
64 mtd_erase_callback(instr);
65 return 0; 64 return 0;
66} 65}
67 66
diff --git a/drivers/mtd/devices/phram.c b/drivers/mtd/devices/phram.c
index 7287696a21f9..9ee04b5f9311 100644
--- a/drivers/mtd/devices/phram.c
+++ b/drivers/mtd/devices/phram.c
@@ -39,13 +39,6 @@ static int phram_erase(struct mtd_info *mtd, struct erase_info *instr)
39 39
40 memset(start + instr->addr, 0xff, instr->len); 40 memset(start + instr->addr, 0xff, instr->len);
41 41
42 /*
43 * This'll catch a few races. Free the thing before returning :)
44 * I don't feel at all ashamed. This kind of thing is possible anyway
45 * with flash, but unlikely.
46 */
47 instr->state = MTD_ERASE_DONE;
48 mtd_erase_callback(instr);
49 return 0; 42 return 0;
50} 43}
51 44
diff --git a/drivers/mtd/devices/pmc551.c b/drivers/mtd/devices/pmc551.c
index cadea0620cd0..5d842cbca3de 100644
--- a/drivers/mtd/devices/pmc551.c
+++ b/drivers/mtd/devices/pmc551.c
@@ -184,12 +184,10 @@ static int pmc551_erase(struct mtd_info *mtd, struct erase_info *instr)
184 } 184 }
185 185
186 out: 186 out:
187 instr->state = MTD_ERASE_DONE;
188#ifdef CONFIG_MTD_PMC551_DEBUG 187#ifdef CONFIG_MTD_PMC551_DEBUG
189 printk(KERN_DEBUG "pmc551_erase() done\n"); 188 printk(KERN_DEBUG "pmc551_erase() done\n");
190#endif 189#endif
191 190
192 mtd_erase_callback(instr);
193 return 0; 191 return 0;
194} 192}
195 193
diff --git a/drivers/mtd/devices/powernv_flash.c b/drivers/mtd/devices/powernv_flash.c
index 26f9feaa5d17..c1312b141ae0 100644
--- a/drivers/mtd/devices/powernv_flash.c
+++ b/drivers/mtd/devices/powernv_flash.c
@@ -175,19 +175,11 @@ static int powernv_flash_erase(struct mtd_info *mtd, struct erase_info *erase)
175{ 175{
176 int rc; 176 int rc;
177 177
178 erase->state = MTD_ERASING;
179
180 /* todo: register our own notifier to do a true async implementation */
181 rc = powernv_flash_async_op(mtd, FLASH_OP_ERASE, erase->addr, 178 rc = powernv_flash_async_op(mtd, FLASH_OP_ERASE, erase->addr,
182 erase->len, NULL, NULL); 179 erase->len, NULL, NULL);
183 180 if (rc)
184 if (rc) {
185 erase->fail_addr = erase->addr; 181 erase->fail_addr = erase->addr;
186 erase->state = MTD_ERASE_FAILED; 182
187 } else {
188 erase->state = MTD_ERASE_DONE;
189 }
190 mtd_erase_callback(erase);
191 return rc; 183 return rc;
192} 184}
193 185
diff --git a/drivers/mtd/devices/slram.c b/drivers/mtd/devices/slram.c
index 0ec85f316d24..10183ee4e12b 100644
--- a/drivers/mtd/devices/slram.c
+++ b/drivers/mtd/devices/slram.c
@@ -84,12 +84,7 @@ static int slram_erase(struct mtd_info *mtd, struct erase_info *instr)
84 slram_priv_t *priv = mtd->priv; 84 slram_priv_t *priv = mtd->priv;
85 85
86 memset(priv->start + instr->addr, 0xff, instr->len); 86 memset(priv->start + instr->addr, 0xff, instr->len);
87 /* This'll catch a few races. Free the thing before returning :) 87
88 * I don't feel at all ashamed. This kind of thing is possible anyway
89 * with flash, but unlikely.
90 */
91 instr->state = MTD_ERASE_DONE;
92 mtd_erase_callback(instr);
93 return(0); 88 return(0);
94} 89}
95 90
diff --git a/drivers/mtd/devices/spear_smi.c b/drivers/mtd/devices/spear_smi.c
index ddf478976013..986f81d2f93e 100644
--- a/drivers/mtd/devices/spear_smi.c
+++ b/drivers/mtd/devices/spear_smi.c
@@ -518,7 +518,6 @@ static int spear_mtd_erase(struct mtd_info *mtd, struct erase_info *e_info)
518 /* preparing the command for flash */ 518 /* preparing the command for flash */
519 ret = spear_smi_erase_sector(dev, bank, command, 4); 519 ret = spear_smi_erase_sector(dev, bank, command, 4);
520 if (ret) { 520 if (ret) {
521 e_info->state = MTD_ERASE_FAILED;
522 mutex_unlock(&flash->lock); 521 mutex_unlock(&flash->lock);
523 return ret; 522 return ret;
524 } 523 }
@@ -527,8 +526,6 @@ static int spear_mtd_erase(struct mtd_info *mtd, struct erase_info *e_info)
527 } 526 }
528 527
529 mutex_unlock(&flash->lock); 528 mutex_unlock(&flash->lock);
530 e_info->state = MTD_ERASE_DONE;
531 mtd_erase_callback(e_info);
532 529
533 return 0; 530 return 0;
534} 531}
diff --git a/drivers/mtd/devices/sst25l.c b/drivers/mtd/devices/sst25l.c
index 5b84d71efb36..1897f33fe3e7 100644
--- a/drivers/mtd/devices/sst25l.c
+++ b/drivers/mtd/devices/sst25l.c
@@ -195,7 +195,6 @@ static int sst25l_erase(struct mtd_info *mtd, struct erase_info *instr)
195 err = sst25l_erase_sector(flash, addr); 195 err = sst25l_erase_sector(flash, addr);
196 if (err) { 196 if (err) {
197 mutex_unlock(&flash->lock); 197 mutex_unlock(&flash->lock);
198 instr->state = MTD_ERASE_FAILED;
199 dev_err(&flash->spi->dev, "Erase failed\n"); 198 dev_err(&flash->spi->dev, "Erase failed\n");
200 return err; 199 return err;
201 } 200 }
@@ -205,8 +204,6 @@ static int sst25l_erase(struct mtd_info *mtd, struct erase_info *instr)
205 204
206 mutex_unlock(&flash->lock); 205 mutex_unlock(&flash->lock);
207 206
208 instr->state = MTD_ERASE_DONE;
209 mtd_erase_callback(instr);
210 return 0; 207 return 0;
211} 208}
212 209
diff --git a/drivers/mtd/devices/st_spi_fsm.c b/drivers/mtd/devices/st_spi_fsm.c
index a33f5fd6818c..55d4a77f3b7f 100644
--- a/drivers/mtd/devices/st_spi_fsm.c
+++ b/drivers/mtd/devices/st_spi_fsm.c
@@ -1825,13 +1825,9 @@ static int stfsm_mtd_erase(struct mtd_info *mtd, struct erase_info *instr)
1825 1825
1826 mutex_unlock(&fsm->lock); 1826 mutex_unlock(&fsm->lock);
1827 1827
1828 instr->state = MTD_ERASE_DONE;
1829 mtd_erase_callback(instr);
1830
1831 return 0; 1828 return 0;
1832 1829
1833out1: 1830out1:
1834 instr->state = MTD_ERASE_FAILED;
1835 mutex_unlock(&fsm->lock); 1831 mutex_unlock(&fsm->lock);
1836 1832
1837 return ret; 1833 return ret;
diff --git a/drivers/mtd/lpddr/lpddr2_nvm.c b/drivers/mtd/lpddr/lpddr2_nvm.c
index 2342277c9bcb..5d73db2a496d 100644
--- a/drivers/mtd/lpddr/lpddr2_nvm.c
+++ b/drivers/mtd/lpddr/lpddr2_nvm.c
@@ -380,14 +380,8 @@ out:
380 */ 380 */
381static int lpddr2_nvm_erase(struct mtd_info *mtd, struct erase_info *instr) 381static int lpddr2_nvm_erase(struct mtd_info *mtd, struct erase_info *instr)
382{ 382{
383 int ret = lpddr2_nvm_do_block_op(mtd, instr->addr, instr->len, 383 return lpddr2_nvm_do_block_op(mtd, instr->addr, instr->len,
384 LPDDR2_NVM_ERASE); 384 LPDDR2_NVM_ERASE);
385 if (!ret) {
386 instr->state = MTD_ERASE_DONE;
387 mtd_erase_callback(instr);
388 }
389
390 return ret;
391} 385}
392 386
393/* 387/*
diff --git a/drivers/mtd/lpddr/lpddr_cmds.c b/drivers/mtd/lpddr/lpddr_cmds.c
index 018c75faadb3..5c5ba3c7c79d 100644
--- a/drivers/mtd/lpddr/lpddr_cmds.c
+++ b/drivers/mtd/lpddr/lpddr_cmds.c
@@ -693,8 +693,6 @@ static int lpddr_erase(struct mtd_info *mtd, struct erase_info *instr)
693 ofs += size; 693 ofs += size;
694 len -= size; 694 len -= size;
695 } 695 }
696 instr->state = MTD_ERASE_DONE;
697 mtd_erase_callback(instr);
698 696
699 return 0; 697 return 0;
700} 698}
diff --git a/drivers/mtd/mtdconcat.c b/drivers/mtd/mtdconcat.c
index 93c47e56d9d8..6b86d1a73cf2 100644
--- a/drivers/mtd/mtdconcat.c
+++ b/drivers/mtd/mtdconcat.c
@@ -446,7 +446,6 @@ static int concat_erase(struct mtd_info *mtd, struct erase_info *instr)
446 erase->addr = 0; 446 erase->addr = 0;
447 offset += subdev->size; 447 offset += subdev->size;
448 } 448 }
449 instr->state = erase->state;
450 kfree(erase); 449 kfree(erase);
451 450
452 return err; 451 return err;
diff --git a/drivers/mtd/mtdcore.c b/drivers/mtd/mtdcore.c
index f92ad02959eb..f25d65ea7149 100644
--- a/drivers/mtd/mtdcore.c
+++ b/drivers/mtd/mtdcore.c
@@ -961,11 +961,9 @@ int mtd_erase(struct mtd_info *mtd, struct erase_info *instr)
961 if (!(mtd->flags & MTD_WRITEABLE)) 961 if (!(mtd->flags & MTD_WRITEABLE))
962 return -EROFS; 962 return -EROFS;
963 963
964 if (!instr->len) { 964 if (!instr->len)
965 instr->state = MTD_ERASE_DONE;
966 mtd_erase_callback(instr);
967 return 0; 965 return 0;
968 } 966
969 ledtrig_mtd_activity(); 967 ledtrig_mtd_activity();
970 return mtd->_erase(mtd, instr); 968 return mtd->_erase(mtd, instr);
971} 969}
diff --git a/drivers/mtd/mtdpart.c b/drivers/mtd/mtdpart.c
index 1c07a6f0dfe5..85fea8ea3423 100644
--- a/drivers/mtd/mtdpart.c
+++ b/drivers/mtd/mtdpart.c
@@ -212,11 +212,6 @@ static int part_erase(struct mtd_info *mtd, struct erase_info *instr)
212 return ret; 212 return ret;
213} 213}
214 214
215void mtd_erase_callback(struct erase_info *instr)
216{
217}
218EXPORT_SYMBOL_GPL(mtd_erase_callback);
219
220static int part_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len) 215static int part_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len)
221{ 216{
222 struct mtd_part *part = mtd_to_part(mtd); 217 struct mtd_part *part = mtd_to_part(mtd);
diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c
index 16c8bc06975d..87b72bf626ae 100644
--- a/drivers/mtd/nand/nand_base.c
+++ b/drivers/mtd/nand/nand_base.c
@@ -4604,22 +4604,20 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
4604 if (nand_check_wp(mtd)) { 4604 if (nand_check_wp(mtd)) {
4605 pr_debug("%s: device is write protected!\n", 4605 pr_debug("%s: device is write protected!\n",
4606 __func__); 4606 __func__);
4607 instr->state = MTD_ERASE_FAILED; 4607 ret = -EIO;
4608 goto erase_exit; 4608 goto erase_exit;
4609 } 4609 }
4610 4610
4611 /* Loop through the pages */ 4611 /* Loop through the pages */
4612 len = instr->len; 4612 len = instr->len;
4613 4613
4614 instr->state = MTD_ERASING;
4615
4616 while (len) { 4614 while (len) {
4617 /* Check if we have a bad block, we do not erase bad blocks! */ 4615 /* Check if we have a bad block, we do not erase bad blocks! */
4618 if (nand_block_checkbad(mtd, ((loff_t) page) << 4616 if (nand_block_checkbad(mtd, ((loff_t) page) <<
4619 chip->page_shift, allowbbt)) { 4617 chip->page_shift, allowbbt)) {
4620 pr_warn("%s: attempt to erase a bad block at page 0x%08x\n", 4618 pr_warn("%s: attempt to erase a bad block at page 0x%08x\n",
4621 __func__, page); 4619 __func__, page);
4622 instr->state = MTD_ERASE_FAILED; 4620 ret = -EIO;
4623 goto erase_exit; 4621 goto erase_exit;
4624 } 4622 }
4625 4623
@@ -4637,7 +4635,7 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
4637 if (status) { 4635 if (status) {
4638 pr_debug("%s: failed erase, page 0x%08x\n", 4636 pr_debug("%s: failed erase, page 0x%08x\n",
4639 __func__, page); 4637 __func__, page);
4640 instr->state = MTD_ERASE_FAILED; 4638 ret = -EIO;
4641 instr->fail_addr = 4639 instr->fail_addr =
4642 ((loff_t)page << chip->page_shift); 4640 ((loff_t)page << chip->page_shift);
4643 goto erase_exit; 4641 goto erase_exit;
@@ -4654,20 +4652,14 @@ int nand_erase_nand(struct mtd_info *mtd, struct erase_info *instr,
4654 chip->select_chip(mtd, chipnr); 4652 chip->select_chip(mtd, chipnr);
4655 } 4653 }
4656 } 4654 }
4657 instr->state = MTD_ERASE_DONE;
4658 4655
4656 ret = 0;
4659erase_exit: 4657erase_exit:
4660 4658
4661 ret = instr->state == MTD_ERASE_DONE ? 0 : -EIO;
4662
4663 /* Deselect and wake up anyone waiting on the device */ 4659 /* Deselect and wake up anyone waiting on the device */
4664 chip->select_chip(mtd, -1); 4660 chip->select_chip(mtd, -1);
4665 nand_release_device(mtd); 4661 nand_release_device(mtd);
4666 4662
4667 /* Do call back function */
4668 if (!ret)
4669 mtd_erase_callback(instr);
4670
4671 /* Return more or less happy */ 4663 /* Return more or less happy */
4672 return ret; 4664 return ret;
4673} 4665}
diff --git a/drivers/mtd/onenand/onenand_base.c b/drivers/mtd/onenand/onenand_base.c
index 979f4031f23c..8d19b78777b5 100644
--- a/drivers/mtd/onenand/onenand_base.c
+++ b/drivers/mtd/onenand/onenand_base.c
@@ -2143,7 +2143,6 @@ static int onenand_multiblock_erase_verify(struct mtd_info *mtd,
2143 if (ret) { 2143 if (ret) {
2144 printk(KERN_ERR "%s: Failed verify, block %d\n", 2144 printk(KERN_ERR "%s: Failed verify, block %d\n",
2145 __func__, onenand_block(this, addr)); 2145 __func__, onenand_block(this, addr));
2146 instr->state = MTD_ERASE_FAILED;
2147 instr->fail_addr = addr; 2146 instr->fail_addr = addr;
2148 return -1; 2147 return -1;
2149 } 2148 }
@@ -2172,8 +2171,6 @@ static int onenand_multiblock_erase(struct mtd_info *mtd,
2172 int ret = 0; 2171 int ret = 0;
2173 int bdry_block = 0; 2172 int bdry_block = 0;
2174 2173
2175 instr->state = MTD_ERASING;
2176
2177 if (ONENAND_IS_DDP(this)) { 2174 if (ONENAND_IS_DDP(this)) {
2178 loff_t bdry_addr = this->chipsize >> 1; 2175 loff_t bdry_addr = this->chipsize >> 1;
2179 if (addr < bdry_addr && (addr + len) > bdry_addr) 2176 if (addr < bdry_addr && (addr + len) > bdry_addr)
@@ -2187,7 +2184,6 @@ static int onenand_multiblock_erase(struct mtd_info *mtd,
2187 printk(KERN_WARNING "%s: attempt to erase a bad block " 2184 printk(KERN_WARNING "%s: attempt to erase a bad block "
2188 "at addr 0x%012llx\n", 2185 "at addr 0x%012llx\n",
2189 __func__, (unsigned long long) addr); 2186 __func__, (unsigned long long) addr);
2190 instr->state = MTD_ERASE_FAILED;
2191 return -EIO; 2187 return -EIO;
2192 } 2188 }
2193 len -= block_size; 2189 len -= block_size;
@@ -2227,7 +2223,6 @@ static int onenand_multiblock_erase(struct mtd_info *mtd,
2227 printk(KERN_ERR "%s: Failed multiblock erase, " 2223 printk(KERN_ERR "%s: Failed multiblock erase, "
2228 "block %d\n", __func__, 2224 "block %d\n", __func__,
2229 onenand_block(this, addr)); 2225 onenand_block(this, addr));
2230 instr->state = MTD_ERASE_FAILED;
2231 instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN; 2226 instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
2232 return -EIO; 2227 return -EIO;
2233 } 2228 }
@@ -2247,7 +2242,6 @@ static int onenand_multiblock_erase(struct mtd_info *mtd,
2247 if (ret) { 2242 if (ret) {
2248 printk(KERN_ERR "%s: Failed erase, block %d\n", 2243 printk(KERN_ERR "%s: Failed erase, block %d\n",
2249 __func__, onenand_block(this, addr)); 2244 __func__, onenand_block(this, addr));
2250 instr->state = MTD_ERASE_FAILED;
2251 instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN; 2245 instr->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
2252 return -EIO; 2246 return -EIO;
2253 } 2247 }
@@ -2259,7 +2253,6 @@ static int onenand_multiblock_erase(struct mtd_info *mtd,
2259 /* verify */ 2253 /* verify */
2260 verify_instr.len = eb_count * block_size; 2254 verify_instr.len = eb_count * block_size;
2261 if (onenand_multiblock_erase_verify(mtd, &verify_instr)) { 2255 if (onenand_multiblock_erase_verify(mtd, &verify_instr)) {
2262 instr->state = verify_instr.state;
2263 instr->fail_addr = verify_instr.fail_addr; 2256 instr->fail_addr = verify_instr.fail_addr;
2264 return -EIO; 2257 return -EIO;
2265 } 2258 }
@@ -2294,8 +2287,6 @@ static int onenand_block_by_block_erase(struct mtd_info *mtd,
2294 region_end = region->offset + region->erasesize * region->numblocks; 2287 region_end = region->offset + region->erasesize * region->numblocks;
2295 } 2288 }
2296 2289
2297 instr->state = MTD_ERASING;
2298
2299 /* Loop through the blocks */ 2290 /* Loop through the blocks */
2300 while (len) { 2291 while (len) {
2301 cond_resched(); 2292 cond_resched();
@@ -2305,7 +2296,6 @@ static int onenand_block_by_block_erase(struct mtd_info *mtd,
2305 printk(KERN_WARNING "%s: attempt to erase a bad block " 2296 printk(KERN_WARNING "%s: attempt to erase a bad block "
2306 "at addr 0x%012llx\n", 2297 "at addr 0x%012llx\n",
2307 __func__, (unsigned long long) addr); 2298 __func__, (unsigned long long) addr);
2308 instr->state = MTD_ERASE_FAILED;
2309 return -EIO; 2299 return -EIO;
2310 } 2300 }
2311 2301
@@ -2318,7 +2308,6 @@ static int onenand_block_by_block_erase(struct mtd_info *mtd,
2318 if (ret) { 2308 if (ret) {
2319 printk(KERN_ERR "%s: Failed erase, block %d\n", 2309 printk(KERN_ERR "%s: Failed erase, block %d\n",
2320 __func__, onenand_block(this, addr)); 2310 __func__, onenand_block(this, addr));
2321 instr->state = MTD_ERASE_FAILED;
2322 instr->fail_addr = addr; 2311 instr->fail_addr = addr;
2323 return -EIO; 2312 return -EIO;
2324 } 2313 }
@@ -2407,12 +2396,6 @@ static int onenand_erase(struct mtd_info *mtd, struct erase_info *instr)
2407 /* Deselect and wake up anyone waiting on the device */ 2396 /* Deselect and wake up anyone waiting on the device */
2408 onenand_release_device(mtd); 2397 onenand_release_device(mtd);
2409 2398
2410 /* Do call back function */
2411 if (!ret) {
2412 instr->state = MTD_ERASE_DONE;
2413 mtd_erase_callback(instr);
2414 }
2415
2416 return ret; 2399 return ret;
2417} 2400}
2418 2401
diff --git a/drivers/mtd/spi-nor/spi-nor.c b/drivers/mtd/spi-nor/spi-nor.c
index d445a4d3b770..5bfa36e95f35 100644
--- a/drivers/mtd/spi-nor/spi-nor.c
+++ b/drivers/mtd/spi-nor/spi-nor.c
@@ -560,9 +560,6 @@ static int spi_nor_erase(struct mtd_info *mtd, struct erase_info *instr)
560erase_err: 560erase_err:
561 spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_ERASE); 561 spi_nor_unlock_and_unprep(nor, SPI_NOR_OPS_ERASE);
562 562
563 instr->state = ret ? MTD_ERASE_FAILED : MTD_ERASE_DONE;
564 mtd_erase_callback(instr);
565
566 return ret; 563 return ret;
567} 564}
568 565
diff --git a/drivers/mtd/ubi/gluebi.c b/drivers/mtd/ubi/gluebi.c
index 1cb287ec32ad..6b655a53113b 100644
--- a/drivers/mtd/ubi/gluebi.c
+++ b/drivers/mtd/ubi/gluebi.c
@@ -272,12 +272,9 @@ static int gluebi_erase(struct mtd_info *mtd, struct erase_info *instr)
272 if (err) 272 if (err)
273 goto out_err; 273 goto out_err;
274 274
275 instr->state = MTD_ERASE_DONE;
276 mtd_erase_callback(instr);
277 return 0; 275 return 0;
278 276
279out_err: 277out_err:
280 instr->state = MTD_ERASE_FAILED;
281 instr->fail_addr = (long long)lnum * mtd->erasesize; 278 instr->fail_addr = (long long)lnum * mtd->erasesize;
282 return err; 279 return err;
283} 280}
diff --git a/drivers/net/ethernet/sfc/falcon/mtd.c b/drivers/net/ethernet/sfc/falcon/mtd.c
index cde593cb1052..2d67e4621a3d 100644
--- a/drivers/net/ethernet/sfc/falcon/mtd.c
+++ b/drivers/net/ethernet/sfc/falcon/mtd.c
@@ -24,17 +24,8 @@
24static int ef4_mtd_erase(struct mtd_info *mtd, struct erase_info *erase) 24static int ef4_mtd_erase(struct mtd_info *mtd, struct erase_info *erase)
25{ 25{
26 struct ef4_nic *efx = mtd->priv; 26 struct ef4_nic *efx = mtd->priv;
27 int rc;
28 27
29 rc = efx->type->mtd_erase(mtd, erase->addr, erase->len); 28 return efx->type->mtd_erase(mtd, erase->addr, erase->len);
30 if (rc == 0) {
31 erase->state = MTD_ERASE_DONE;
32 } else {
33 erase->state = MTD_ERASE_FAILED;
34 erase->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
35 }
36 mtd_erase_callback(erase);
37 return rc;
38} 29}
39 30
40static void ef4_mtd_sync(struct mtd_info *mtd) 31static void ef4_mtd_sync(struct mtd_info *mtd)
diff --git a/drivers/net/ethernet/sfc/mtd.c b/drivers/net/ethernet/sfc/mtd.c
index a77a8bd2dd70..4ac30b6e5dab 100644
--- a/drivers/net/ethernet/sfc/mtd.c
+++ b/drivers/net/ethernet/sfc/mtd.c
@@ -24,17 +24,8 @@
24static int efx_mtd_erase(struct mtd_info *mtd, struct erase_info *erase) 24static int efx_mtd_erase(struct mtd_info *mtd, struct erase_info *erase)
25{ 25{
26 struct efx_nic *efx = mtd->priv; 26 struct efx_nic *efx = mtd->priv;
27 int rc;
28 27
29 rc = efx->type->mtd_erase(mtd, erase->addr, erase->len); 28 return efx->type->mtd_erase(mtd, erase->addr, erase->len);
30 if (rc == 0) {
31 erase->state = MTD_ERASE_DONE;
32 } else {
33 erase->state = MTD_ERASE_FAILED;
34 erase->fail_addr = MTD_FAIL_ADDR_UNKNOWN;
35 }
36 mtd_erase_callback(erase);
37 return rc;
38} 29}
39 30
40static void efx_mtd_sync(struct mtd_info *mtd) 31static void efx_mtd_sync(struct mtd_info *mtd)
diff --git a/drivers/staging/goldfish/goldfish_nand.c b/drivers/staging/goldfish/goldfish_nand.c
index 52cc1363993e..f5e002ecba75 100644
--- a/drivers/staging/goldfish/goldfish_nand.c
+++ b/drivers/staging/goldfish/goldfish_nand.c
@@ -119,9 +119,6 @@ static int goldfish_nand_erase(struct mtd_info *mtd, struct erase_info *instr)
119 return -EIO; 119 return -EIO;
120 } 120 }
121 121
122 instr->state = MTD_ERASE_DONE;
123 mtd_erase_callback(instr);
124
125 return 0; 122 return 0;
126 123
127invalid_arg: 124invalid_arg:
diff --git a/include/linux/mtd/mtd.h b/include/linux/mtd/mtd.h
index 4cbb7f555244..a86c4fa93115 100644
--- a/include/linux/mtd/mtd.h
+++ b/include/linux/mtd/mtd.h
@@ -30,12 +30,6 @@
30 30
31#include <asm/div64.h> 31#include <asm/div64.h>
32 32
33#define MTD_ERASE_PENDING 0x01
34#define MTD_ERASING 0x02
35#define MTD_ERASE_SUSPEND 0x04
36#define MTD_ERASE_DONE 0x08
37#define MTD_ERASE_FAILED 0x10
38
39#define MTD_FAIL_ADDR_UNKNOWN -1LL 33#define MTD_FAIL_ADDR_UNKNOWN -1LL
40 34
41struct mtd_info; 35struct mtd_info;
@@ -49,7 +43,6 @@ struct erase_info {
49 uint64_t addr; 43 uint64_t addr;
50 uint64_t len; 44 uint64_t len;
51 uint64_t fail_addr; 45 uint64_t fail_addr;
52 u_char state;
53}; 46};
54 47
55struct mtd_erase_region_info { 48struct mtd_erase_region_info {
@@ -589,8 +582,6 @@ extern void register_mtd_user (struct mtd_notifier *new);
589extern int unregister_mtd_user (struct mtd_notifier *old); 582extern int unregister_mtd_user (struct mtd_notifier *old);
590void *mtd_kmalloc_up_to(const struct mtd_info *mtd, size_t *size); 583void *mtd_kmalloc_up_to(const struct mtd_info *mtd, size_t *size);
591 584
592void mtd_erase_callback(struct erase_info *instr);
593
594static inline int mtd_is_bitflip(int err) { 585static inline int mtd_is_bitflip(int err) {
595 return err == -EUCLEAN; 586 return err == -EUCLEAN;
596} 587}