On Wed, Nov 14, 2018 at 12:04:27PM +0100, Marc Kleine-Budde wrote: > From: White Ding <bpqw@xxxxxxxxxx> > > Do nand reset before write protect check. > > If we want to check the WP# low or high through STATUS READ and check bit 7, > we must reset the device, other operation (eg.erase/program a locked block) can > also clear the bit 7 of status register. > > As we know the status register can be refreshed, if we do some operation to trigger it, > for example if we do erase/program operation to one block that is locked, then READ STATUS, > the bit 7 of READ STATUS will be 0 indicate the device in write protect, then if we do > erase/program operation to another block that is unlocked, the bit 7 of READ STATUS will > be 1 indicate the device is not write protect. > Suppose we checked the bit 7 of READ STATUS is 0 then judge the WP# is low (write protect), > but in this case the WP# maybe high if we do erase/program operation to a locked block, > so we must reset the device if we want to check the WP# low or high through STATUS READ and > check bit 7. > > Signed-off-by: White Ding <bpqw@xxxxxxxxxx> > Signed-off-by: Brian Norris <computersforpeace@xxxxxxxxx> > [Cherry-picked from linux: 57d3a9a89a06 mtd: nand: fix nand_lock/unlock() function] > Signed-off-by: Marc Kleine-Budde <mkl@xxxxxxxxxxxxxx> > --- > drivers/mtd/nand/nand_base.c | 18 ++++++++++++++++++ > 1 file changed, 18 insertions(+) Applied, thanks Sascha > > diff --git a/drivers/mtd/nand/nand_base.c b/drivers/mtd/nand/nand_base.c > index ccf96150429a..128802fa5c20 100644 > --- a/drivers/mtd/nand/nand_base.c > +++ b/drivers/mtd/nand/nand_base.c > @@ -852,6 +852,15 @@ int nand_unlock(struct mtd_info *mtd, loff_t ofs, uint64_t len) > > chip->select_chip(mtd, chipnr); > > + /* > + * Reset the chip. > + * If we want to check the WP through READ STATUS and check the bit 7 > + * we must reset the chip > + * some operation can also clear the bit 7 of status register > + * eg. erase/program a locked block > + */ > + chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1); > + > /* Check, if it is write protected */ > if (nand_check_wp(mtd)) { > pr_debug("%s: device is write protected!\n", > @@ -902,6 +911,15 @@ int nand_lock(struct mtd_info *mtd, loff_t ofs, uint64_t len) > > chip->select_chip(mtd, chipnr); > > + /* > + * Reset the chip. > + * If we want to check the WP through READ STATUS and check the bit 7 > + * we must reset the chip > + * some operation can also clear the bit 7 of status register > + * eg. erase/program a locked block > + */ > + chip->cmdfunc(mtd, NAND_CMD_RESET, -1, -1); > + > /* Check, if it is write protected */ > if (nand_check_wp(mtd)) { > pr_debug("%s: device is write protected!\n", > -- > 2.19.1 > > > _______________________________________________ > barebox mailing list > barebox@xxxxxxxxxxxxxxxxxxx > http://lists.infradead.org/mailman/listinfo/barebox > -- Pengutronix e.K. | | Industrial Linux Solutions | http://www.pengutronix.de/ | Peiner Str. 6-8, 31137 Hildesheim, Germany | Phone: +49-5121-206917-0 | Amtsgericht Hildesheim, HRA 2686 | Fax: +49-5121-206917-5555 | _______________________________________________ barebox mailing list barebox@xxxxxxxxxxxxxxxxxxx http://lists.infradead.org/mailman/listinfo/barebox