[PATCH] enable erase-suspend-program for CFI cmdset_0002
Nicolas Pitre
nico at fluxnic.net
Sun Nov 22 12:45:10 EST 2009
On Thu, 19 Nov 2009, Norbert van Bolhuis wrote:
>
> erase-suspend for writing is required to avoid blocking applications that wish
> to write some data (to a NOR block other than the one being erased).
> Particularly, it solves some huge delays that an application (which writes to a
> UBIFS) will experience if UBI attaches to empty NOR flash. In this case the
> UBI background thread will erase a lot of blocks and the application can be blocked
> for minutes because of the "MTD/CFI chip lock".
> This feature has been disabled for years. Maybe this was because the old code
> turned it on for erase-suspend read-only chips also (cfip->EraseSuspend & 0x1).
> This is wrong and corrected now.
> I tested this patch and it seems to work fine.
>
> Signed-off-by: Norbert van Bolhuis <nvbolhuis at aimvalley.nl>
FYI: I have no experience with non-Intel parts and no good knowledge of
the cmdset_0002 code. So I can't review this.
> ---
> drivers/mtd/chips/cfi_cmdset_0002.c | 16 +++-------------
> 1 files changed, 3 insertions(+), 13 deletions(-)
>
> diff --git a/drivers/mtd/chips/cfi_cmdset_0002.c b/drivers/mtd/chips/cfi_cmdset_0002.c
> index 94bb61e..1d49e18 100644
> --- a/drivers/mtd/chips/cfi_cmdset_0002.c
> +++ b/drivers/mtd/chips/cfi_cmdset_0002.c
> @@ -490,10 +490,6 @@ static struct mtd_info *cfi_amdstd_setup(struct mtd_info *mtd)
> }
> #endif
>
> - /* FIXME: erase-suspend-program is broken. See
> - http://lists.infradead.org/pipermail/linux-mtd/2003-December/009001.html */
> - printk(KERN_NOTICE "cfi_cmdset_0002: Disabling erase-suspend-program due to code brokenness.\n");
> -
> __module_get(THIS_MODULE);
> return mtd;
>
> @@ -589,15 +585,9 @@ static int get_chip(struct map_info *map, struct flchip *chip, unsigned long adr
> return 0;
>
> case FL_ERASING:
> - if (mode == FL_WRITING) /* FIXME: Erase-suspend-program appears broken. */
> - goto sleep;
> -
> - if (!( mode == FL_READY
> - || mode == FL_POINT
> - || !cfip
> - || (mode == FL_WRITING && (cfip->EraseSuspend & 0x2))
> - || (mode == FL_WRITING && (cfip->EraseSuspend & 0x1)
> - )))
> + if (!cfip || !(cfip->EraseSuspend & (0x1|0x2)) ||
> + !(mode == FL_READY || mode == FL_POINT ||
> + (mode == FL_WRITING && (cfip->EraseSuspend & 0x2))))
> goto sleep;
>
> /* We could check to see if we're trying to access the sector
> --
> 1.5.2.2
>
More information about the linux-mtd
mailing list