| From 79ca484b613041ca223f74b34608bb6f5221724b Mon Sep 17 00:00:00 2001 |
| From: Tokunori Ikegami <ikegami@allied-telesis.co.jp> |
| Date: Wed, 30 May 2018 18:32:29 +0900 |
| Subject: mtd: cfi_cmdset_0002: Change erase functions to check chip good only |
| |
| From: Tokunori Ikegami <ikegami@allied-telesis.co.jp> |
| |
| commit 79ca484b613041ca223f74b34608bb6f5221724b upstream. |
| |
| Currently the functions use to check both chip ready and good. |
| But the chip ready is not enough to check the operation status. |
| So change this to check the chip good instead of this. |
| About the retry functions to make sure the error handling remain it. |
| |
| Signed-off-by: Tokunori Ikegami <ikegami@allied-telesis.co.jp> |
| Reviewed-by: Joakim Tjernlund <Joakim.Tjernlund@infinera.com> |
| Cc: Chris Packham <chris.packham@alliedtelesis.co.nz> |
| Cc: Brian Norris <computersforpeace@gmail.com> |
| Cc: David Woodhouse <dwmw2@infradead.org> |
| Cc: Boris Brezillon <boris.brezillon@free-electrons.com> |
| Cc: Marek Vasut <marek.vasut@gmail.com> |
| Cc: Richard Weinberger <richard@nod.at> |
| Cc: Cyrille Pitchen <cyrille.pitchen@wedev4u.fr> |
| Cc: linux-mtd@lists.infradead.org |
| Cc: stable@vger.kernel.org |
| Signed-off-by: Boris Brezillon <boris.brezillon@bootlin.com> |
| Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| |
| |
| --- |
| drivers/mtd/chips/cfi_cmdset_0002.c | 22 ++++++++++++---------- |
| 1 file changed, 12 insertions(+), 10 deletions(-) |
| |
| --- a/drivers/mtd/chips/cfi_cmdset_0002.c |
| +++ b/drivers/mtd/chips/cfi_cmdset_0002.c |
| @@ -2294,12 +2294,13 @@ static int __xipram do_erase_chip(struct |
| chip->erase_suspended = 0; |
| } |
| |
| - if (chip_ready(map, adr)) |
| + if (chip_good(map, adr, map_word_ff(map))) |
| break; |
| |
| if (time_after(jiffies, timeo)) { |
| printk(KERN_WARNING "MTD %s(): software timeout\n", |
| __func__ ); |
| + ret = -EIO; |
| break; |
| } |
| |
| @@ -2307,15 +2308,15 @@ static int __xipram do_erase_chip(struct |
| UDELAY(map, chip, adr, 1000000/HZ); |
| } |
| /* Did we succeed? */ |
| - if (!chip_good(map, adr, map_word_ff(map))) { |
| + if (ret) { |
| /* reset on all failures. */ |
| map_write( map, CMD(0xF0), chip->start ); |
| /* FIXME - should have reset delay before continuing */ |
| |
| - if (++retry_cnt <= MAX_RETRIES) |
| + if (++retry_cnt <= MAX_RETRIES) { |
| + ret = 0; |
| goto retry; |
| - |
| - ret = -EIO; |
| + } |
| } |
| |
| chip->state = FL_READY; |
| @@ -2389,7 +2390,7 @@ static int __xipram do_erase_oneblock(st |
| chip->erase_suspended = 0; |
| } |
| |
| - if (chip_ready(map, adr)) { |
| + if (chip_good(map, adr, map_word_ff(map))) { |
| xip_enable(map, chip, adr); |
| break; |
| } |
| @@ -2398,6 +2399,7 @@ static int __xipram do_erase_oneblock(st |
| xip_enable(map, chip, adr); |
| printk(KERN_WARNING "MTD %s(): software timeout\n", |
| __func__ ); |
| + ret = -EIO; |
| break; |
| } |
| |
| @@ -2405,15 +2407,15 @@ static int __xipram do_erase_oneblock(st |
| UDELAY(map, chip, adr, 1000000/HZ); |
| } |
| /* Did we succeed? */ |
| - if (!chip_good(map, adr, map_word_ff(map))) { |
| + if (ret) { |
| /* reset on all failures. */ |
| map_write( map, CMD(0xF0), chip->start ); |
| /* FIXME - should have reset delay before continuing */ |
| |
| - if (++retry_cnt <= MAX_RETRIES) |
| + if (++retry_cnt <= MAX_RETRIES) { |
| + ret = 0; |
| goto retry; |
| - |
| - ret = -EIO; |
| + } |
| } |
| |
| chip->state = FL_READY; |