[Patch 1/1] don't suspend erase for erase in cfi_cmdset_0002

Peter Wippich pewi at gw-instruments.de
Mon Aug 3 09:07:30 EDT 2009


Hi Jocke, 

On Mon, 3 Aug 2009, Joakim Tjernlund wrote:

> linux-mtd-bounces at lists.infradead.org wrote on 03/08/2009 12:50:44:
> 
> >
> >
> > Hi,
> >
> > came around this problem while stress testing jffs2. From time to time the
> > block erase failed and the file system overflows. I don't know if there
> > are any Nor chips out there which allow a new erase to start when in erase
> > suspend. However, the chips on my board dont't. And even when it doesn't
> > make much sense to suspend an erase operation for another erase.
> >
> > Patch below fixes the problem for me.
> >
> > Have fun and take care,
> >
> > Peter
> >
> > Signed-off-by: Peter Wippich <pewi at gw-instruments.de>
> > ---
> > diff -Naur a/drivers/mtd/chips/cfi_cmdset_0002.c
> > b/drivers/mtd/chips/cfi_cmdset_0002.c
> > --- a/drivers/mtd/chips/cfi_cmdset_0002.c   2007-07-10 20:56:30.000000000 +0200
> > +++ b/drivers/mtd/chips/cfi_cmdset_0002.c   2009-08-02 19:55:34.000000000 +0200
> > @@ -521,6 +521,10 @@
> >     case FL_ERASING:
> >        if (mode == FL_WRITING) /* FIXME: Erase-suspend-program appears broken. */
> >           goto sleep;
> > +      if (mode == FL_ERASING) {
> > +         printk(KERN_INFO "attempt erase suspend with mode FL_ERASING\n") ;
> > +         goto sleep;
> > +      }
> >
> >        if (!(   mode == FL_READY
> >              || mode == FL_POINT
> >
> 
> This change looks bogus. You are not supposed to need the extra test.
> I do think this test is faulty though:
> 
> 	if (!(   mode == FL_READY
> 		      || mode == FL_POINT
> 		      || !cfip
> 		      || (mode == FL_WRITING && (cfip->EraseSuspend & 0x2))
> 		      || (mode == FL_WRITING && (cfip->EraseSuspend & 0x1)
> 		    )))
> 
> What happens if cfip is NULL?

Checked this one. Because the Chip is jedec probed (not cfi) and there is 
no fixup cfip should be NULL. Then the above will evaluate to : 
	mode == FL_READY = FALSE 
	mode == FL_POINT = FALSE 
	!cfip		 = TRUE 
	(next two skipped, hopefully ...... ;-) 

End ! TRUE = FALSE -> we will not go to sleep ! Actually, it is not quite 
clear to me what the intention of this expression was. But if the original 
intention was to only allow erase suspend when requested mode is FL_READY 
or FL_POINT it is obviously wrong..... 

Ciao, 

Peter 


|       Peter Wippich                   Voice: +49 30 46776411          |
|       G&W Instruments GmbH            fax:   +49 30 46776419          |
|       Gustav-Meyer-Allee 25, Geb. 12  Email: pewi at gw-instruments.de   |
|       D-13355 Berlin  / Germany                                       |




More information about the linux-mtd mailing list